commit 0d186246d2112d9f5a828b1c3927ef8bade52d2e Author: unknown Date: Fri Oct 23 15:21:55 2015 -0400 ESXi-4.1-U3 diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/8253pit.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/8253pit.h new file mode 100644 index 0000000..285f784 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/8253pit.h @@ -0,0 +1,10 @@ +/* + * 8253/8254 Programmable Interval Timer + */ + +#ifndef _8253PIT_H +#define _8253PIT_H + +#define PIT_TICK_RATE 1193182UL + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/a.out.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/a.out.h new file mode 100644 index 0000000..7255cde --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/a.out.h @@ -0,0 +1,27 @@ +#ifndef __X8664_A_OUT_H__ +#define __X8664_A_OUT_H__ + +/* 32bit a.out */ + +struct exec +{ + unsigned int a_info; /* Use macros N_MAGIC, etc for access */ + unsigned a_text; /* length of text, in bytes */ + unsigned a_data; /* length of data, in bytes */ + unsigned a_bss; /* length of uninitialized data area for file, in bytes */ + unsigned a_syms; /* length of symbol table data in file, in bytes */ + unsigned a_entry; /* start address */ + unsigned a_trsize; /* length of relocation info for text, in bytes */ + unsigned a_drsize; /* length of relocation info for data, in bytes */ +}; + +#define N_TRSIZE(a) ((a).a_trsize) +#define N_DRSIZE(a) ((a).a_drsize) +#define N_SYMSIZE(a) ((a).a_syms) + +#ifdef __KERNEL__ +#include +#define STACK_TOP TASK_SIZE +#endif + +#endif /* __A_OUT_GNU_H__ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/acpi.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/acpi.h new file mode 100644 index 0000000..2c95a31 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/acpi.h @@ -0,0 +1,171 @@ +/* + * asm-x86_64/acpi.h + * + * Copyright (C) 2001 Paul Diefenbaugh + * Copyright (C) 2001 Patrick Mochel + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + */ + +#ifndef _ASM_ACPI_H +#define _ASM_ACPI_H + +#ifdef __KERNEL__ + +#include + +#define COMPILER_DEPENDENT_INT64 long long +#define COMPILER_DEPENDENT_UINT64 unsigned long long + +/* + * Calling conventions: + * + * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads) + * ACPI_EXTERNAL_XFACE - External ACPI interfaces + * ACPI_INTERNAL_XFACE - Internal ACPI interfaces + * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces + */ +#define ACPI_SYSTEM_XFACE +#define ACPI_EXTERNAL_XFACE +#define ACPI_INTERNAL_XFACE +#define ACPI_INTERNAL_VAR_XFACE + +/* Asm macros */ + +#define ACPI_ASM_MACROS +#define BREAKPOINT3 +#define ACPI_DISABLE_IRQS() local_irq_disable() +#define ACPI_ENABLE_IRQS() local_irq_enable() +#define ACPI_FLUSH_CPU_CACHE() wbinvd() + + +static inline int +__acpi_acquire_global_lock (unsigned int *lock) +{ + unsigned int old, new, val; + do { + old = *lock; + new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); + val = cmpxchg(lock, old, new); + } while (unlikely (val != old)); + return (new < 3) ? -1 : 0; +} + +static inline int +__acpi_release_global_lock (unsigned int *lock) +{ + unsigned int old, new, val; + do { + old = *lock; + new = old & ~0x3; + val = cmpxchg(lock, old, new); + } while (unlikely (val != old)); + return old & 0x1; +} + +#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ + ((Acq) = __acpi_acquire_global_lock((unsigned int *) GLptr)) + +#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ + ((Acq) = __acpi_release_global_lock((unsigned int *) GLptr)) + +/* + * Math helper asm macros + */ +#define ACPI_DIV_64_BY_32(n_hi, n_lo, d32, q32, r32) \ + asm("divl %2;" \ + :"=a"(q32), "=d"(r32) \ + :"r"(d32), \ + "0"(n_lo), "1"(n_hi)) + + +#define ACPI_SHIFT_RIGHT_64(n_hi, n_lo) \ + asm("shrl $1,%2;" \ + "rcrl $1,%3;" \ + :"=r"(n_hi), "=r"(n_lo) \ + :"0"(n_hi), "1"(n_lo)) + +#ifdef CONFIG_ACPI +extern int acpi_lapic; +extern int acpi_ioapic; +extern int acpi_noirq; +extern int acpi_strict; +extern int acpi_disabled; +extern int acpi_pci_disabled; +extern int acpi_ht; +static inline void disable_acpi(void) +{ + acpi_disabled = 1; + acpi_ht = 0; + acpi_pci_disabled = 1; + acpi_noirq = 1; +} + +/* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ +#define FIX_ACPI_PAGES 4 + +extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); +static inline void acpi_noirq_set(void) { acpi_noirq = 1; } +static inline void acpi_disable_pci(void) +{ + acpi_pci_disabled = 1; + acpi_noirq_set(); +} +extern int acpi_irq_balance_set(char *str); + +#else /* !CONFIG_ACPI */ + +#define acpi_lapic 0 +#define acpi_ioapic 0 +static inline void acpi_noirq_set(void) { } +static inline void acpi_disable_pci(void) { } + +#endif /* !CONFIG_ACPI */ + +extern int acpi_numa; +extern int acpi_scan_nodes(unsigned long start, unsigned long end); +#define NR_NODE_MEMBLKS (MAX_NUMNODES*2) + +#ifdef CONFIG_ACPI_SLEEP + +/* routines for saving/restoring kernel state */ +extern int acpi_save_state_mem(void); +extern void acpi_restore_state_mem(void); + +extern unsigned long acpi_wakeup_address; + +/* early initialization routine */ +extern void acpi_reserve_bootmem(void); + +#endif /*CONFIG_ACPI_SLEEP*/ + +#define boot_cpu_physical_apicid boot_cpu_id + +extern int acpi_disabled; +extern int acpi_pci_disabled; + +extern u8 x86_acpiid_to_apicid[]; + +#define ARCH_HAS_POWER_INIT 1 + +extern int acpi_skip_timer_override; + +#endif /*__KERNEL__*/ + +#endif /*_ASM_ACPI_H*/ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/agp.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/agp.h new file mode 100644 index 0000000..06c52ee --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/agp.h @@ -0,0 +1,32 @@ +#ifndef AGP_H +#define AGP_H 1 + +#include + +/* + * Functions to keep the agpgart mappings coherent. + * The GART gives the CPU a physical alias of memory. The alias is + * mapped uncacheable. Make sure there are no conflicting mappings + * with different cachability attributes for the same page. + */ + +int map_page_into_agp(struct page *page); +int unmap_page_from_agp(struct page *page); +#define flush_agp_mappings() global_flush_tlb() + +/* Could use CLFLUSH here if the cpu supports it. But then it would + need to be called for each cacheline of the whole page so it may not be + worth it. Would need a page for it. */ +#define flush_agp_cache() asm volatile("wbinvd":::"memory") + +/* Convert a physical address to an address suitable for the GART. */ +#define phys_to_gart(x) (x) +#define gart_to_phys(x) (x) + +/* GATT allocation. Returns/accepts GATT kernel virtual address. */ +#define alloc_gatt_pages(order) \ + ((char *)__get_free_pages(GFP_KERNEL, (order))) +#define free_gatt_pages(table, order) \ + free_pages((unsigned long)(table), (order)) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/alternative.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/alternative.h new file mode 100644 index 0000000..a584826 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/alternative.h @@ -0,0 +1,136 @@ +#ifndef _X86_64_ALTERNATIVE_H +#define _X86_64_ALTERNATIVE_H + +#ifdef __KERNEL__ + +#include +#include + +struct alt_instr { + u8 *instr; /* original instruction */ + u8 *replacement; + u8 cpuid; /* cpuid bit set for replacement */ + u8 instrlen; /* length of original instruction */ + u8 replacementlen; /* length of new instruction, <= instrlen */ + u8 pad[5]; +}; + +extern void apply_alternatives(struct alt_instr *start, struct alt_instr *end); + +struct module; + +#ifdef CONFIG_SMP +extern void alternatives_smp_module_add(struct module *mod, char *name, + void *locks, void *locks_end, + void *text, void *text_end); +extern void alternatives_smp_module_del(struct module *mod); +extern void alternatives_smp_switch(int smp); +#else +static inline void alternatives_smp_module_add(struct module *mod, char *name, + void *locks, void *locks_end, + void *text, void *text_end) {} +static inline void alternatives_smp_module_del(struct module *mod) {} +static inline void alternatives_smp_switch(int smp) {} +#endif + +#endif + +/* + * Alternative instructions for different CPU types or capabilities. + * + * This allows to use optimized instructions even on generic binary + * kernels. + * + * length of oldinstr must be longer or equal the length of newinstr + * It can be padded with nops as needed. + * + * For non barrier like inlines please define new variants + * without volatile and memory clobber. + */ +#define alternative(oldinstr, newinstr, feature) \ + asm volatile ("661:\n\t" oldinstr "\n662:\n" \ + ".section .altinstructions,\"a\"\n" \ + " .align 8\n" \ + " .quad 661b\n" /* label */ \ + " .quad 663f\n" /* new instruction */ \ + " .byte %c0\n" /* feature bit */ \ + " .byte 662b-661b\n" /* sourcelen */ \ + " .byte 664f-663f\n" /* replacementlen */ \ + ".previous\n" \ + ".section .altinstr_replacement,\"ax\"\n" \ + "663:\n\t" newinstr "\n664:\n" /* replacement */ \ + ".previous" :: "i" (feature) : "memory") + +/* + * Alternative inline assembly with input. + * + * Pecularities: + * No memory clobber here. + * Argument numbers start with 1. + * Best is to use constraints that are fixed size (like (%1) ... "r") + * If you use variable sized constraints like "m" or "g" in the + * replacement make sure to pad to the worst case length. + */ +#define alternative_input(oldinstr, newinstr, feature, input...) \ + asm volatile ("661:\n\t" oldinstr "\n662:\n" \ + ".section .altinstructions,\"a\"\n" \ + " .align 8\n" \ + " .quad 661b\n" /* label */ \ + " .quad 663f\n" /* new instruction */ \ + " .byte %c0\n" /* feature bit */ \ + " .byte 662b-661b\n" /* sourcelen */ \ + " .byte 664f-663f\n" /* replacementlen */ \ + ".previous\n" \ + ".section .altinstr_replacement,\"ax\"\n" \ + "663:\n\t" newinstr "\n664:\n" /* replacement */ \ + ".previous" :: "i" (feature), ##input) + +/* Like alternative_input, but with a single output argument */ +#define alternative_io(oldinstr, newinstr, feature, output, input...) \ + asm volatile ("661:\n\t" oldinstr "\n662:\n" \ + ".section .altinstructions,\"a\"\n" \ + " .align 8\n" \ + " .quad 661b\n" /* label */ \ + " .quad 663f\n" /* new instruction */ \ + " .byte %c[feat]\n" /* feature bit */ \ + " .byte 662b-661b\n" /* sourcelen */ \ + " .byte 664f-663f\n" /* replacementlen */ \ + ".previous\n" \ + ".section .altinstr_replacement,\"ax\"\n" \ + "663:\n\t" newinstr "\n664:\n" /* replacement */ \ + ".previous" : output : [feat] "i" (feature), ##input) + +/* + * Alternative inline assembly for SMP. + * + * The LOCK_PREFIX macro defined here replaces the LOCK and + * LOCK_PREFIX macros used everywhere in the source tree. + * + * SMP alternatives use the same data structures as the other + * alternatives and the X86_FEATURE_UP flag to indicate the case of a + * UP system running a SMP kernel. The existing apply_alternatives() + * works fine for patching a SMP kernel for UP. + * + * The SMP alternative tables can be kept after boot and contain both + * UP and SMP versions of the instructions to allow switching back to + * SMP at runtime, when hotplugging in a new CPU, which is especially + * useful in virtualized environments. + * + * The very common lock prefix is handled as special case in a + * separate table which is a pure address list without replacement ptr + * and size information. That keeps the table sizes small. + */ + +#ifdef CONFIG_SMP +#define LOCK_PREFIX \ + ".section .smp_locks,\"a\"\n" \ + " .align 8\n" \ + " .quad 661f\n" /* address */ \ + ".previous\n" \ + "661:\n\tlock; " + +#else /* ! CONFIG_SMP */ +#define LOCK_PREFIX "" +#endif + +#endif /* _X86_64_ALTERNATIVE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apic.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apic.h new file mode 100644 index 0000000..309cee9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apic.h @@ -0,0 +1,113 @@ +#ifndef __ASM_APIC_H +#define __ASM_APIC_H + +#include +#include +#include +#include + +#define Dprintk(x...) + +/* + * Debugging macros + */ +#define APIC_QUIET 0 +#define APIC_VERBOSE 1 +#define APIC_DEBUG 2 + +extern int apic_verbosity; +extern int apic_runs_main_timer; + +/* + * Define the default level of output to be very little + * This can be turned up by using apic=verbose for more + * information and apic=debug for _lots_ of information. + * apic_verbosity is defined in apic.c + */ +#define apic_printk(v, s, a...) do { \ + if ((v) <= apic_verbosity) \ + printk(s, ##a); \ + } while (0) + +#ifdef CONFIG_X86_LOCAL_APIC + +struct pt_regs; + +/* + * Basic functions accessing APICs. + */ + +static __inline void apic_write(unsigned long reg, unsigned int v) +{ + *((volatile unsigned int *)(APIC_BASE+reg)) = v; +} + +static __inline unsigned int apic_read(unsigned long reg) +{ + return *((volatile unsigned int *)(APIC_BASE+reg)); +} + +static __inline__ void apic_wait_icr_idle(void) +{ + while (apic_read( APIC_ICR ) & APIC_ICR_BUSY) + cpu_relax(); +} + +static inline void ack_APIC_irq(void) +{ + /* + * ack_APIC_irq() actually gets compiled as a single instruction: + * - a single rmw on Pentium/82489DX + * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC) + * ... yummie. + */ + + /* Docs say use 0 for future compatibility */ + apic_write(APIC_EOI, 0); +} + +extern int get_maxlvt (void); +extern void clear_local_APIC (void); +extern void connect_bsp_APIC (void); +extern void disconnect_bsp_APIC (int virt_wire_setup); +extern void disable_local_APIC (void); +extern int verify_local_APIC (void); +extern void cache_APIC_registers (void); +extern void sync_Arb_IDs (void); +extern void init_bsp_APIC (void); +extern void setup_local_APIC (void); +extern void init_apic_mappings (void); +extern void smp_local_timer_interrupt (struct pt_regs * regs); +extern void setup_boot_APIC_clock (void); +extern void setup_secondary_APIC_clock (void); +extern int APIC_init_uniprocessor (void); +extern void disable_APIC_timer(void); +extern void enable_APIC_timer(void); +extern void clustered_apic_check(void); + +extern void setup_APIC_extened_lvt(unsigned char lvt_off, unsigned char vector, + unsigned char msg_type, unsigned char mask); + +#define K8_APIC_EXT_LVT_BASE 0x500 +#define K8_APIC_EXT_INT_MSG_FIX 0x0 +#define K8_APIC_EXT_INT_MSG_SMI 0x2 +#define K8_APIC_EXT_INT_MSG_NMI 0x4 +#define K8_APIC_EXT_INT_MSG_EXT 0x7 +#define K8_APIC_EXT_LVT_ENTRY_THRESHOLD 0 + +extern int disable_timer_pin_1; + + +#ifndef CONFIG_XEN +void smp_send_timer_broadcast_ipi(void); +void switch_APIC_timer_to_ipi(void *cpumask); +void switch_ipi_to_APIC_timer(void *cpumask); + +#define ARCH_APICTIMER_STOPS_ON_C3 1 +#endif + +#endif /* CONFIG_X86_LOCAL_APIC */ + +extern unsigned boot_cpu_id; + +#endif /* __ASM_APIC_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apicdef.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apicdef.h new file mode 100644 index 0000000..1dd4006 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/apicdef.h @@ -0,0 +1,392 @@ +#ifndef __ASM_APICDEF_H +#define __ASM_APICDEF_H + +/* + * Constants for various Intel APICs. (local APIC, IOAPIC, etc.) + * + * Alan Cox , 1995. + * Ingo Molnar , 1999, 2000 + */ + +#define APIC_DEFAULT_PHYS_BASE 0xfee00000 + +#define APIC_ID 0x20 +#define APIC_ID_MASK (0xFFu<<24) +#define GET_APIC_ID(x) (((x)>>24)&0xFFu) +#define SET_APIC_ID(x) (((x)<<24)) +#define APIC_LVR 0x30 +#define APIC_LVR_MASK 0xFF00FF +#define GET_APIC_VERSION(x) ((x)&0xFFu) +#define GET_APIC_MAXLVT(x) (((x)>>16)&0xFFu) +#define APIC_INTEGRATED(x) ((x)&0xF0u) +#define APIC_TASKPRI 0x80 +#define APIC_TPRI_MASK 0xFFu +#define APIC_ARBPRI 0x90 +#define APIC_ARBPRI_MASK 0xFFu +#define APIC_PROCPRI 0xA0 +#define APIC_EOI 0xB0 +#define APIC_EIO_ACK 0x0 /* Write this to the EOI register */ +#define APIC_RRR 0xC0 +#define APIC_LDR 0xD0 +#define APIC_LDR_MASK (0xFFu<<24) +#define GET_APIC_LOGICAL_ID(x) (((x)>>24)&0xFFu) +#define SET_APIC_LOGICAL_ID(x) (((x)<<24)) +#define APIC_ALL_CPUS 0xFFu +#define APIC_DFR 0xE0 +#define APIC_DFR_CLUSTER 0x0FFFFFFFul +#define APIC_DFR_FLAT 0xFFFFFFFFul +#define APIC_SPIV 0xF0 +#define APIC_SPIV_FOCUS_DISABLED (1<<9) +#define APIC_SPIV_APIC_ENABLED (1<<8) +#define APIC_ISR 0x100 +#define APIC_ISR_NR 0x8 /* Number of 32 bit ISR registers. */ +#define APIC_TMR 0x180 +#define APIC_IRR 0x200 +#define APIC_ESR 0x280 +#define APIC_ESR_SEND_CS 0x00001 +#define APIC_ESR_RECV_CS 0x00002 +#define APIC_ESR_SEND_ACC 0x00004 +#define APIC_ESR_RECV_ACC 0x00008 +#define APIC_ESR_SENDILL 0x00020 +#define APIC_ESR_RECVILL 0x00040 +#define APIC_ESR_ILLREGA 0x00080 +#define APIC_ICR 0x300 +#define APIC_DEST_SELF 0x40000 +#define APIC_DEST_ALLINC 0x80000 +#define APIC_DEST_ALLBUT 0xC0000 +#define APIC_ICR_RR_MASK 0x30000 +#define APIC_ICR_RR_INVALID 0x00000 +#define APIC_ICR_RR_INPROG 0x10000 +#define APIC_ICR_RR_VALID 0x20000 +#define APIC_INT_LEVELTRIG 0x08000 +#define APIC_INT_ASSERT 0x04000 +#define APIC_ICR_BUSY 0x01000 +#define APIC_DEST_LOGICAL 0x00800 +#define APIC_DEST_PHYSICAL 0x00000 +#define APIC_DM_FIXED 0x00000 +#define APIC_DM_LOWEST 0x00100 +#define APIC_DM_SMI 0x00200 +#define APIC_DM_REMRD 0x00300 +#define APIC_DM_NMI 0x00400 +#define APIC_DM_INIT 0x00500 +#define APIC_DM_STARTUP 0x00600 +#define APIC_DM_EXTINT 0x00700 +#define APIC_VECTOR_MASK 0x000FF +#define APIC_ICR2 0x310 +#define GET_APIC_DEST_FIELD(x) (((x)>>24)&0xFF) +#define SET_APIC_DEST_FIELD(x) ((x)<<24) +#define APIC_LVTT 0x320 +#define APIC_LVTTHMR 0x330 +#define APIC_LVTPC 0x340 +#define APIC_LVT0 0x350 +#define APIC_LVT_TIMER_BASE_MASK (0x3<<18) +#define GET_APIC_TIMER_BASE(x) (((x)>>18)&0x3) +#define SET_APIC_TIMER_BASE(x) (((x)<<18)) +#define APIC_TIMER_BASE_CLKIN 0x0 +#define APIC_TIMER_BASE_TMBASE 0x1 +#define APIC_TIMER_BASE_DIV 0x2 +#define APIC_LVT_TIMER_PERIODIC (1<<17) +#define APIC_LVT_MASKED (1<<16) +#define APIC_LVT_LEVEL_TRIGGER (1<<15) +#define APIC_LVT_REMOTE_IRR (1<<14) +#define APIC_INPUT_POLARITY (1<<13) +#define APIC_SEND_PENDING (1<<12) +#define APIC_MODE_MASK 0x700 +#define GET_APIC_DELIVERY_MODE(x) (((x)>>8)&0x7) +#define SET_APIC_DELIVERY_MODE(x,y) (((x)&~0x700)|((y)<<8)) +#define APIC_MODE_FIXED 0x0 +#define APIC_MODE_NMI 0x4 +#define APIC_MODE_EXTINT 0x7 +#define APIC_LVT1 0x360 +#define APIC_LVTERR 0x370 +#define APIC_TMICT 0x380 +#define APIC_TMCCT 0x390 +#define APIC_TDCR 0x3E0 +#define APIC_TDR_DIV_TMBASE (1<<2) +#define APIC_TDR_DIV_1 0xB +#define APIC_TDR_DIV_2 0x0 +#define APIC_TDR_DIV_4 0x1 +#define APIC_TDR_DIV_8 0x2 +#define APIC_TDR_DIV_16 0x3 +#define APIC_TDR_DIV_32 0x8 +#define APIC_TDR_DIV_64 0x9 +#define APIC_TDR_DIV_128 0xA + +#define APIC_BASE (fix_to_virt(FIX_APIC_BASE)) + +#define MAX_IO_APICS 128 +#define MAX_LOCAL_APIC 256 + +/* + * All x86-64 systems are xAPIC compatible. + * In the following, "apicid" is a physical APIC ID. + */ +#define XAPIC_DEST_CPUS_SHIFT 4 +#define XAPIC_DEST_CPUS_MASK ((1u << XAPIC_DEST_CPUS_SHIFT) - 1) +#define XAPIC_DEST_CLUSTER_MASK (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT) +#define APIC_CLUSTER(apicid) ((apicid) & XAPIC_DEST_CLUSTER_MASK) +#define APIC_CLUSTERID(apicid) (APIC_CLUSTER(apicid) >> XAPIC_DEST_CPUS_SHIFT) +#define APIC_CPUID(apicid) ((apicid) & XAPIC_DEST_CPUS_MASK) +#define NUM_APIC_CLUSTERS ((BAD_APICID + 1) >> XAPIC_DEST_CPUS_SHIFT) + +/* + * the local APIC register structure, memory mapped. Not terribly well + * tested, but we might eventually use this one in the future - the + * problem why we cannot use it right now is the P5 APIC, it has an + * errata which cannot take 8-bit reads and writes, only 32-bit ones ... + */ +#define u32 unsigned int + +struct local_apic { + +/*000*/ struct { u32 __reserved[4]; } __reserved_01; + +/*010*/ struct { u32 __reserved[4]; } __reserved_02; + +/*020*/ struct { /* APIC ID Register */ + u32 __reserved_1 : 24, + phys_apic_id : 4, + __reserved_2 : 4; + u32 __reserved[3]; + } id; + +/*030*/ const + struct { /* APIC Version Register */ + u32 version : 8, + __reserved_1 : 8, + max_lvt : 8, + __reserved_2 : 8; + u32 __reserved[3]; + } version; + +/*040*/ struct { u32 __reserved[4]; } __reserved_03; + +/*050*/ struct { u32 __reserved[4]; } __reserved_04; + +/*060*/ struct { u32 __reserved[4]; } __reserved_05; + +/*070*/ struct { u32 __reserved[4]; } __reserved_06; + +/*080*/ struct { /* Task Priority Register */ + u32 priority : 8, + __reserved_1 : 24; + u32 __reserved_2[3]; + } tpr; + +/*090*/ const + struct { /* Arbitration Priority Register */ + u32 priority : 8, + __reserved_1 : 24; + u32 __reserved_2[3]; + } apr; + +/*0A0*/ const + struct { /* Processor Priority Register */ + u32 priority : 8, + __reserved_1 : 24; + u32 __reserved_2[3]; + } ppr; + +/*0B0*/ struct { /* End Of Interrupt Register */ + u32 eoi; + u32 __reserved[3]; + } eoi; + +/*0C0*/ struct { u32 __reserved[4]; } __reserved_07; + +/*0D0*/ struct { /* Logical Destination Register */ + u32 __reserved_1 : 24, + logical_dest : 8; + u32 __reserved_2[3]; + } ldr; + +/*0E0*/ struct { /* Destination Format Register */ + u32 __reserved_1 : 28, + model : 4; + u32 __reserved_2[3]; + } dfr; + +/*0F0*/ struct { /* Spurious Interrupt Vector Register */ + u32 spurious_vector : 8, + apic_enabled : 1, + focus_cpu : 1, + __reserved_2 : 22; + u32 __reserved_3[3]; + } svr; + +/*100*/ struct { /* In Service Register */ +/*170*/ u32 bitfield; + u32 __reserved[3]; + } isr [8]; + +/*180*/ struct { /* Trigger Mode Register */ +/*1F0*/ u32 bitfield; + u32 __reserved[3]; + } tmr [8]; + +/*200*/ struct { /* Interrupt Request Register */ +/*270*/ u32 bitfield; + u32 __reserved[3]; + } irr [8]; + +/*280*/ union { /* Error Status Register */ + struct { + u32 send_cs_error : 1, + receive_cs_error : 1, + send_accept_error : 1, + receive_accept_error : 1, + __reserved_1 : 1, + send_illegal_vector : 1, + receive_illegal_vector : 1, + illegal_register_address : 1, + __reserved_2 : 24; + u32 __reserved_3[3]; + } error_bits; + struct { + u32 errors; + u32 __reserved_3[3]; + } all_errors; + } esr; + +/*290*/ struct { u32 __reserved[4]; } __reserved_08; + +/*2A0*/ struct { u32 __reserved[4]; } __reserved_09; + +/*2B0*/ struct { u32 __reserved[4]; } __reserved_10; + +/*2C0*/ struct { u32 __reserved[4]; } __reserved_11; + +/*2D0*/ struct { u32 __reserved[4]; } __reserved_12; + +/*2E0*/ struct { u32 __reserved[4]; } __reserved_13; + +/*2F0*/ struct { u32 __reserved[4]; } __reserved_14; + +/*300*/ struct { /* Interrupt Command Register 1 */ + u32 vector : 8, + delivery_mode : 3, + destination_mode : 1, + delivery_status : 1, + __reserved_1 : 1, + level : 1, + trigger : 1, + __reserved_2 : 2, + shorthand : 2, + __reserved_3 : 12; + u32 __reserved_4[3]; + } icr1; + +/*310*/ struct { /* Interrupt Command Register 2 */ + union { + u32 __reserved_1 : 24, + phys_dest : 4, + __reserved_2 : 4; + u32 __reserved_3 : 24, + logical_dest : 8; + } dest; + u32 __reserved_4[3]; + } icr2; + +/*320*/ struct { /* LVT - Timer */ + u32 vector : 8, + __reserved_1 : 4, + delivery_status : 1, + __reserved_2 : 3, + mask : 1, + timer_mode : 1, + __reserved_3 : 14; + u32 __reserved_4[3]; + } lvt_timer; + +/*330*/ struct { /* LVT - Thermal Sensor */ + u32 vector : 8, + delivery_mode : 3, + __reserved_1 : 1, + delivery_status : 1, + __reserved_2 : 3, + mask : 1, + __reserved_3 : 15; + u32 __reserved_4[3]; + } lvt_thermal; + +/*340*/ struct { /* LVT - Performance Counter */ + u32 vector : 8, + delivery_mode : 3, + __reserved_1 : 1, + delivery_status : 1, + __reserved_2 : 3, + mask : 1, + __reserved_3 : 15; + u32 __reserved_4[3]; + } lvt_pc; + +/*350*/ struct { /* LVT - LINT0 */ + u32 vector : 8, + delivery_mode : 3, + __reserved_1 : 1, + delivery_status : 1, + polarity : 1, + remote_irr : 1, + trigger : 1, + mask : 1, + __reserved_2 : 15; + u32 __reserved_3[3]; + } lvt_lint0; + +/*360*/ struct { /* LVT - LINT1 */ + u32 vector : 8, + delivery_mode : 3, + __reserved_1 : 1, + delivery_status : 1, + polarity : 1, + remote_irr : 1, + trigger : 1, + mask : 1, + __reserved_2 : 15; + u32 __reserved_3[3]; + } lvt_lint1; + +/*370*/ struct { /* LVT - Error */ + u32 vector : 8, + __reserved_1 : 4, + delivery_status : 1, + __reserved_2 : 3, + mask : 1, + __reserved_3 : 15; + u32 __reserved_4[3]; + } lvt_error; + +/*380*/ struct { /* Timer Initial Count Register */ + u32 initial_count; + u32 __reserved_2[3]; + } timer_icr; + +/*390*/ const + struct { /* Timer Current Count Register */ + u32 curr_count; + u32 __reserved_2[3]; + } timer_ccr; + +/*3A0*/ struct { u32 __reserved[4]; } __reserved_16; + +/*3B0*/ struct { u32 __reserved[4]; } __reserved_17; + +/*3C0*/ struct { u32 __reserved[4]; } __reserved_18; + +/*3D0*/ struct { u32 __reserved[4]; } __reserved_19; + +/*3E0*/ struct { /* Timer Divide Configuration Register */ + u32 divisor : 4, + __reserved_1 : 28; + u32 __reserved_2[3]; + } timer_dcr; + +/*3F0*/ struct { u32 __reserved[4]; } __reserved_20; + +} __attribute__ ((packed)); + +#undef u32 + +#define BAD_APICID 0xFFu + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/atomic.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/atomic.h new file mode 100644 index 0000000..5efc5f1 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/atomic.h @@ -0,0 +1,608 @@ +/* + * Portions Copyright 2008, 2010 VMware, Inc. + */ +#ifndef __ARCH_X86_64_ATOMIC__ +#define __ARCH_X86_64_ATOMIC__ + +#include +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif /* defined(__VMKLNX__) */ + +/* atomic_t should be 32 bit signed type */ + +/* + * Atomic operations that C can't guarantee us. Useful for + * resource counting etc.. + */ + +#ifdef CONFIG_SMP +#define LOCK "lock ; " +#else +#define LOCK "" +#endif + +/* + * Make sure gcc doesn't try to be clever and move things around + * on us. We need to use _exactly_ the address the user gave us, + * not some alias that contains the same information. + */ +typedef struct { volatile int counter; } atomic_t; + +#define ATOMIC_INIT(i) { (i) } + +/** + * atomic_read - read atomic variable + * @v: pointer of type atomic_t + * + * Atomically reads the value of @v. + */ +#define atomic_read(v) ((v)->counter) + +/** + * atomic_set - set atomic variable + * @v: pointer of type atomic_t + * @i: required value + * + * Atomically sets the value of @v to @i. + */ +#define atomic_set(v,i) (((v)->counter) = (i)) + +/** + * atomic_add - add integer to atomic variable + * @i: integer value to add + * @v: pointer of type atomic_t + * + * Atomically adds @i to @v. + */ +/* _VMKLNX_CODECHECK_: atomic_add */ +static __inline__ void atomic_add(int i, atomic_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "addl %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic_sub - subtract the atomic variable + * @i: integer value to subtract + * @v: pointer of type atomic_t + * + * Atomically subtracts @i from @v. + */ +/* _VMKLNX_CODECHECK_: atomic_sub */ +static __inline__ void atomic_sub(int i, atomic_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "subl %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic_sub_and_test - subtract value from variable and test result + * @i: integer value to subtract + * @v: pointer of type atomic_t + * + * Atomically subtracts @i from @v and returns + * true if the result is zero, or false for all + * other cases. + */ +static __inline__ int atomic_sub_and_test(int i, atomic_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "subl %2,%0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"ir" (i), "m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c; +} + +/** + * atomic_inc - increment atomic variable + * @v: pointer of type atomic_t + * + * Atomically increments @v by 1. + */ +/* _VMKLNX_CODECHECK_: atomic_inc */ +static __inline__ void atomic_inc(atomic_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "incl %0" + :"=m" (v->counter) + :"m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic_dec - decrement atomic variable + * @v: pointer of type atomic_t + * + * Atomically decrements @v by 1. + */ +/* _VMKLNX_CODECHECK_: atomic_dec */ +static __inline__ void atomic_dec(atomic_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "decl %0" + :"=m" (v->counter) + :"m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic_dec_and_test - decrement and test + * @v: pointer of type atomic_t + * + * Atomically decrements @v by 1 and + * returns true if the result is 0, or false for all other + * cases. + */ +/* _VMKLNX_CODECHECK_: atomic_dec_and_test */ +static __inline__ int atomic_dec_and_test(atomic_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "decl %0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c != 0; +} + +/** + * atomic_inc_and_test - increment and test + * @v: pointer of type atomic_t + * + * Atomically increments @v by 1 + * and returns true if the result is zero, or false for all + * other cases. + */ +static __inline__ int atomic_inc_and_test(atomic_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "incl %0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c != 0; +} + +/** + * atomic_add_negative - add and test if negative + * @i: integer value to add + * @v: pointer of type atomic_t + * + * Atomically adds @i to @v and returns true + * if the result is negative, or false when + * result is greater than or equal to zero. + */ +static __inline__ int atomic_add_negative(int i, atomic_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "addl %2,%0; sets %1" + :"=m" (v->counter), "=qm" (c) + :"ir" (i), "m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c; +} + +/** + * atomic_add_return - add and return + * @i: integer value to add + * @v: pointer of type atomic_t + * + * Atomically adds @i to @v and returns @i + @v + */ +/* _VMKLNX_CODECHECK_: atomic_add_return */ +static __inline__ int atomic_add_return(int i, atomic_t *v) +{ + int __i = i; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "xaddl %0, %1;" + :"=r"(i) + :"m"(v->counter), "0"(i)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return i + __i; +} + +static __inline__ int atomic_sub_return(int i, atomic_t *v) +{ + return atomic_add_return(-i,v); +} + +/** + * atomic_inc_return - increment by 1 and return + * @v: integer value to increment + * + * Atomically increments @v by 1 returns @v + 1 + * + * SYNOPSIS: + * #define atomic_inc_return(v) + * + * RETURN VALUE: + * Returns @v + 1 + */ +/* _VMKLNX_CODECHECK_: atomic_inc_return */ +#define atomic_inc_return(v) (atomic_add_return(1,v)) +#define atomic_dec_return(v) (atomic_sub_return(1,v)) + +/* An 64bit atomic type */ + +typedef struct { volatile long counter; } atomic64_t; + +#define ATOMIC64_INIT(i) { (i) } + +/** + * atomic64_read - read atomic64 variable + * @v: pointer of type atomic64_t + * + * Atomically reads the value of @v. + * Doesn't imply a read memory barrier. + */ +#define atomic64_read(v) ((v)->counter) + +/** + * atomic64_set - set atomic64 variable + * @v: pointer to type atomic64_t + * @i: required value + * + * Atomically sets the value of @v to @i. + */ +#if defined(__VMKLNX__) +static __inline__ void atomic64_set(atomic64_t *v, long i) +{ + /* + * Ensure that we do a single movq. Without this, the compiler + * may do write with a constant as two movl operations. + */ + __asm__ __volatile__( + "movq %1, %0" + : "+m" (v->counter) + : "r" (i) + ); +} +#else /* !defined(__VMKLNX__) */ +#define atomic64_set(v,i) (((v)->counter) = (i)) +#endif /* defined(__VMKLNX__) */ + + +/** + * atomic64_add - add integer to atomic64 variable + * @i: integer value to add + * @v: pointer to type atomic64_t + * + * Atomically adds @i to @v. + */ +static __inline__ void atomic64_add(long i, atomic64_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "addq %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic64_sub - subtract the atomic64 variable + * @i: integer value to subtract + * @v: pointer to type atomic64_t + * + * Atomically subtracts @i from @v. + */ +static __inline__ void atomic64_sub(long i, atomic64_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "subq %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic64_sub_and_test - subtract value from variable and test result + * @i: integer value to subtract + * @v: pointer to type atomic64_t + * + * Atomically subtracts @i from @v and returns + * true if the result is zero, or false for all + * other cases. + */ +static __inline__ int atomic64_sub_and_test(long i, atomic64_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "subq %2,%0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"ir" (i), "m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c; +} + +/** + * atomic64_inc - increment atomic64 variable + * @v: pointer to type atomic64_t + * + * Atomically increments @v by 1. + */ +static __inline__ void atomic64_inc(atomic64_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "incq %0" + :"=m" (v->counter) + :"m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic64_dec - decrement atomic64 variable + * @v: pointer to type atomic64_t + * + * Atomically decrements @v by 1. + */ +static __inline__ void atomic64_dec(atomic64_t *v) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "decq %0" + :"=m" (v->counter) + :"m" (v->counter)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +/** + * atomic64_dec_and_test - decrement and test + * @v: pointer to type atomic64_t + * + * Atomically decrements @v by 1 and + * returns true if the result is 0, or false for all other + * cases. + */ +static __inline__ int atomic64_dec_and_test(atomic64_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "decq %0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c != 0; +} + +/** + * atomic64_inc_and_test - increment and test + * @v: pointer to type atomic64_t + * + * Atomically increments @v by 1 + * and returns true if the result is zero, or false for all + * other cases. + */ +static __inline__ int atomic64_inc_and_test(atomic64_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "incq %0; sete %1" + :"=m" (v->counter), "=qm" (c) + :"m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c != 0; +} + +/** + * atomic64_add_negative - add and test if negative + * @i: integer value to add + * @v: pointer to type atomic64_t + * + * Atomically adds @i to @v and returns true + * if the result is negative, or false when + * result is greater than or equal to zero. + */ +static __inline__ int atomic64_add_negative(long i, atomic64_t *v) +{ + unsigned char c; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "addq %2,%0; sets %1" + :"=m" (v->counter), "=qm" (c) + :"ir" (i), "m" (v->counter) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return c; +} + +/** + * atomic64_add_return - add and return + * @i: integer value to add + * @v: pointer to type atomic64_t + * + * Atomically adds @i to @v and returns @i + @v + */ +static __inline__ long atomic64_add_return(long i, atomic64_t *v) +{ + long __i = i; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + LOCK_PREFIX "xaddq %0, %1;" + :"=r"(i) + :"m"(v->counter), "0"(i)); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + return i + __i; +} + +static __inline__ long atomic64_sub_return(long i, atomic64_t *v) +{ + return atomic64_add_return(-i,v); +} + +#define atomic64_inc_return(v) (atomic64_add_return(1,v)) +#define atomic64_dec_return(v) (atomic64_sub_return(1,v)) + +#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new)) +#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) + +/** + * atomic_add_unless - add unless the number is a given value + * @v: pointer of type atomic_t + * @a: the amount to add to v... + * @u: ...unless v is equal to u. + * + * Atomically adds @a to @v, so long as it was not @u. + * Returns non-zero if @v was not @u, and zero otherwise. + */ +#define atomic_add_unless(v, a, u) \ +({ \ + int c, old; \ + c = atomic_read(v); \ + for (;;) { \ + if (unlikely(c == (u))) \ + break; \ + old = atomic_cmpxchg((v), c, c + (a)); \ + if (likely(old == c)) \ + break; \ + c = old; \ + } \ + c != (u); \ +}) +#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) + +/* These are x86-specific, used by some header files */ +#if defined(__VMKLNX__) + +#define atomic_clear_mask(mask, addr) \ +do { \ + vmk_AtomicPrologue(); \ + __asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \ + : : "r" (~(mask)),"m" (*addr) : "memory") ; \ + vmk_AtomicEpilogue(); \ +} while (0) + +#define atomic_set_mask(mask, addr) \ +do { \ + vmk_AtomicPrologue(); \ + __asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \ + : : "r" ((unsigned)mask),"m" (*(addr)) : "memory"); \ + vmk_AtomicEpilogue(); \ +} while (0) + +#else /* !defined(__VMKLNX__) */ + +#define atomic_clear_mask(mask, addr) \ +__asm__ __volatile__(LOCK_PREFIX "andl %0,%1" \ +: : "r" (~(mask)),"m" (*addr) : "memory") + +#define atomic_set_mask(mask, addr) \ +__asm__ __volatile__(LOCK_PREFIX "orl %0,%1" \ +: : "r" ((unsigned)mask),"m" (*(addr)) : "memory") + +#endif /* defined(__VMKLNX__) */ + +/* Atomic operations are already serializing on x86 */ +#define smp_mb__before_atomic_dec() barrier() +#define smp_mb__after_atomic_dec() barrier() +#define smp_mb__before_atomic_inc() barrier() +#define smp_mb__after_atomic_inc() barrier() + +#include +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/auxvec.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/auxvec.h new file mode 100644 index 0000000..2403c4c --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/auxvec.h @@ -0,0 +1,4 @@ +#ifndef __ASM_X86_64_AUXVEC_H +#define __ASM_X86_64_AUXVEC_H + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bitops.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bitops.h new file mode 100644 index 0000000..5e1ec35 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bitops.h @@ -0,0 +1,729 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +#ifndef _X86_64_BITOPS_H +#define _X86_64_BITOPS_H + +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif /* defined(__VMKLNX__) */ + +/* + * Copyright 1992, Linus Torvalds. + */ + +#include + +#define ADDR (*(volatile long *) addr) + +/** + * set_bit - Atomically set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + * + * This function is atomic and may not be reordered. See __set_bit() + * if you do not require the atomic guarantees. + * Note that @nr may be almost arbitrarily large; this function is not + * restricted to acting on a single-word quantity. + * + * RETURN VALUE: + * NONE + * + */ +/* _VMKLNX_CODECHECK_: set_bit */ +static __inline__ void set_bit(int nr, volatile void * addr) +{ + __asm__ __volatile__( LOCK_PREFIX + "btsl %1,%0" + :"+m" (ADDR) + :"dIr" (nr) : "memory"); +} + +/** + * __set_bit - Set a bit in memory + * @nr: the bit to set + * @addr: the address to start counting from + * + * Unlike set_bit(), this function is non-atomic and may be reordered. + * If it's called on the same region of memory simultaneously, the effect + * may be that only one operation succeeds. + */ +static __inline__ void __set_bit(int nr, volatile void * addr) +{ + __asm__ volatile( + "btsl %1,%0" + :"+m" (ADDR) + :"dIr" (nr) : "memory"); +} + +/** + * clear_bit - Clears a bit in memory + * @nr: Bit to clear + * @addr: Address to start counting from + * + * Clears a bit in memory. + * clear_bit() is atomic and may not be reordered. However, it does + * not contain a memory barrier, so if it is used for locking purposes, + * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() + * in order to ensure changes are visible on other processors. + * + * RETURN VALUE: + * None + * + */ +/* _VMKLNX_CODECHECK_: clear_bit */ +static __inline__ void clear_bit(int nr, volatile void * addr) +{ + __asm__ __volatile__( LOCK_PREFIX + "btrl %1,%0" + :"+m" (ADDR) + :"dIr" (nr)); +} + +static __inline__ void __clear_bit(int nr, volatile void * addr) +{ + __asm__ __volatile__( + "btrl %1,%0" + :"+m" (ADDR) + :"dIr" (nr)); +} + +#define smp_mb__before_clear_bit() barrier() +#define smp_mb__after_clear_bit() barrier() + +/** + * __change_bit - Toggle a bit in memory + * @nr: the bit to change + * @addr: the address to start counting from + * + * Unlike change_bit(), this function is non-atomic and may be reordered. + * If it's called on the same region of memory simultaneously, the effect + * may be that only one operation succeeds. + */ +static __inline__ void __change_bit(int nr, volatile void * addr) +{ + __asm__ __volatile__( + "btcl %1,%0" + :"+m" (ADDR) + :"dIr" (nr)); +} + +/** + * change_bit - Toggle a bit in memory + * @nr: Bit to change + * @addr: Address to start counting from + * + * change_bit() is atomic and may not be reordered. + * Note that @nr may be almost arbitrarily large; this function is not + * restricted to acting on a single-word quantity. + */ +static __inline__ void change_bit(int nr, volatile void * addr) +{ + __asm__ __volatile__( LOCK_PREFIX + "btcl %1,%0" + :"+m" (ADDR) + :"dIr" (nr)); +} + +/** + * test_and_set_bit - Set a bit and return its old state + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + * It tests if the bit at position nr in *addr is 0 or not and sets it to 1. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: test_and_set_bit */ +static __inline__ int test_and_set_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__ __volatile__( LOCK_PREFIX + "btsl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr) : "memory"); + return oldbit; +} + +/** + * __test_and_set_bit - Set a bit and return its old state + * @nr: Bit to set + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * If two examples of this operation race, one can appear to succeed + * but actually fail. You must protect multiple accesses with a lock. + * It tests if the bit at position nr in *addr is 0 or not and sets it to 1. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + * + * SEE ALSO: + * test_and_set_bit + */ +static __inline__ int __test_and_set_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__( + "btsl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr)); + return oldbit; +} + +/** + * test_and_clear_bit - Clear a bit and return its old state + * @nr: Bit to clear + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + * It tests if the bit at position nr in *addr is 0 or not and sets it to 0. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: test_and_clear_bit */ +static __inline__ int test_and_clear_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__ __volatile__( LOCK_PREFIX + "btrl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr) : "memory"); + return oldbit; +} + +/** + * __test_and_clear_bit - Clear a bit and return its old state + * @nr: Bit to clear + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * If two examples of this operation race, one can appear to succeed + * but actually fail. You must protect multiple accesses with a lock. + * It tests if the bit at position nr in *addr is 0 or not and sets it to 0. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + * + * SEE ALSO: + * test_and_clear_bit + */ +static __inline__ int __test_and_clear_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__( + "btrl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr)); + return oldbit; +} + +/** + * __test_and_change_bit - Toggle a bit and return its old state + * @nr: Bit to toggle + * @addr: Address to count from + * + * This operation is non-atomic and can be reordered. + * It also implies a memory barrier. + * It tests if the bit at position nr in *addr is 0 or not and toggles it. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + * + * SEE ALSO: + * test_and_change_bit + */ +static __inline__ int __test_and_change_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__ __volatile__( + "btcl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr) : "memory"); + return oldbit; +} + +/** + * test_and_change_bit - Toggle a bit and return its old state + * @nr: Bit to toggle + * @addr: Address to count from + * + * This operation is atomic and cannot be reordered. + * It also implies a memory barrier. + * It tests if the bit at position nr in *addr is 0 or not and toggles it. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * RETURN VALUE: + * 0 if original bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: test_and_change_bit */ +static __inline__ int test_and_change_bit(int nr, volatile void * addr) +{ + int oldbit; + + __asm__ __volatile__( LOCK_PREFIX + "btcl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit),"+m" (ADDR) + :"dIr" (nr) : "memory"); + return oldbit; +} + +/** + * constant_test_bit - determine whether a bit is set + * @nr: bit number to test + * @addr: addr to test + * + * Determines the state of the specified bit. + * This is used when @nr is known to be constant at compile-time. + * Use test_bit() instead of using this directly. + * + * RETURN VALUE: + * 0 if the bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: constant_test_bit */ +static __inline__ int constant_test_bit(int nr, const volatile void * addr) +{ + return ((1UL << (nr & 31)) & (((const volatile unsigned int *) addr)[nr >> 5])) != 0; +} + +/** + * variable_test_bit - determine whether a bit is set + * @nr: bit number to test + * @addr: addr to test + * + * Determines the state of the specified bit. + * This is used when @nr is a variable. + * Use test_bit() instead of using this directly. + * + * RETURN VALUE: + * 0 if the bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: variable_test_bit */ +static __inline__ int variable_test_bit(int nr, volatile const void * addr) +{ + int oldbit; + + __asm__ __volatile__( + "btl %2,%1\n\tsbbl %0,%0" + :"=r" (oldbit) + :"m" (ADDR),"dIr" (nr)); + return oldbit; +} +/** + * test_bit - Determine if bit at given position is set + * @nr: number of bit to be tested + * @addr: pointer to byte to test + * + * It tests if the bit at position nr in *addr is 0 or not. + * If the bit number is a constant an optimized bit extract is done. + * Note that the return value need not be 1 (just non-zero) if the bit was 1. + * + * SYNOPSIS: + * #define test_bit(nr,addr) + * + * RETURN VALUE: + * 0 if the bit was 0 and NON-ZERO otherwise + */ +/* _VMKLNX_CODECHECK_: test_bit */ +#define test_bit(nr,addr) \ +(__builtin_constant_p(nr) ? \ + constant_test_bit((nr),(addr)) : \ + variable_test_bit((nr),(addr))) + +#undef ADDR +#if defined(__VMKLNX__) +/** + * find_first_zero_bit - find the first zero bit in a memory region + * @addr: The address to start the search at + * @size: The maximum bitnumber to search + * + * Finds the first zero bit in a specified memory region + * + * RETURN VALUE: + * Returns the bit-number of the first zero bit, not the number of the byte + * containing a bit. + * If result is equal to or greater than size means no zero bit is found + */ +/* _VMKLNX_CODECHECK_: find_first_zero_bit */ +static __inline__ long +find_first_zero_bit(const unsigned long * addr, unsigned long size) +{ + long d0, d1, d2; + long res; + + /* + * We must test the size in words, not in bits, because + * otherwise incoming sizes in the range -63..-1 will not run + * any scasq instructions, and then the flags used by the je + * instruction will have whatever random value was in place + * before. Nobody should call us like that, but + * find_next_zero_bit() does when offset and size are at the + * same word and it fails to find a zero itself. + */ + size += 63; + size >>= 6; + if (!size) + return 0; + + vmk_CPUEnsureClearDF(); + asm volatile( + " repe; scasq\n" + " je 1f\n" + " xorq -8(%%rdi),%%rax\n" + " subq $8,%%rdi\n" + " bsfq %%rax,%%rdx\n" + "1: subq %[addr],%%rdi\n" + " shlq $3,%%rdi\n" + " addq %%rdi,%%rdx" + :"=d" (res), "=&c" (d0), "=&D" (d1), "=&a" (d2) + :"0" (0ULL), "1" (size), "2" (addr), "3" (-1ULL), + [addr] "S" (addr) : "memory"); + /* + * Any register would do for [addr] above, but GCC tends to + * prefer rbx over rsi, even though rsi is readily available + * and doesn't have to be saved. + */ + + return res; +} + +/** + * find_next_zero_bit - find the first zero bit in a memory region + * @addr: The address to base the search on + * @offset: The bitnumber to start searching at + * @size: The maximum size to search + * + * Finds the first zero bit in a specified memory region + * + * RETURN VALUE: + * Returns the bit-number of the first zero bit in a memory region after the + * specified offset + * If result is equal to or greater than size means no zero bit is found + */ +/* _VMKLNX_CODECHECK_: find_next_zero_bit */ +static __inline__ long +find_next_zero_bit (const unsigned long * addr, long size, long offset) +{ + const unsigned long * p = addr + (offset >> 6); + unsigned long set = 0; + unsigned long res, bit = offset&63; + + if (bit) { + + /* + * Look for zero in first word + */ + asm("bsfq %1,%0\n\t" + "cmoveq %2,%0" + : "=r" (set) + : "r" (~(*p >> bit)), "r"(64L)); + if (set < (64 - bit)) + return set + offset; + set = 64 - bit; + p++; + } + + /* + * No zero yet, search remaining full words for a zero + */ + res = find_first_zero_bit (p, size - 64 * (p - addr)); + + return (offset + set + res); +} + +/** + * find_first_bit - find the first set bit in a memory region + * @addr: The address to start the search at + * @size: The maximum size to search + * + * Finds the first set bit in a specified memory region + * + * RETURN VALUE: + * Returns the bit-number of the first set bit, not the number of the byte + * containing a bit. + * + */ +/* _VMKLNX_CODECHECK_: find_first_bit */ +static __inline__ long find_first_bit(const unsigned long * addr, unsigned long size) +{ + long d0, d1; + long res; + + /* + * We must test the size in words, not in bits, because + * otherwise incoming sizes in the range -63..-1 will not run + * any scasq instructions, and then the flags used by the jz + * instruction will have whatever random value was in place + * before. Nobody should call us like that, but + * find_next_bit() does when offset and size are at the same + * word and it fails to find a one itself. + */ + size += 63; + size >>= 6; + if (!size) + return 0; + + vmk_CPUEnsureClearDF(); + asm volatile( + " repe; scasq\n" + " jz 1f\n" + " subq $8,%%rdi\n" + " bsfq (%%rdi),%%rax\n" + "1: subq %[addr],%%rdi\n" + " shlq $3,%%rdi\n" + " addq %%rdi,%%rax" + :"=a" (res), "=&c" (d0), "=&D" (d1) + :"0" (0ULL), "1" (size), "2" (addr), + [addr] "r" (addr) : "memory"); + return res; +} + +/** + * find_next_bit - find the first set bit in a memory region + * @addr: The address to base the search on + * @size: The maximum size to search + * @offset: The bitnumber to start searching at + * + * Finds the first set bit in a specified memory region + * + * RETURN VALUE: + * Position of the first set bit in the specified memory, starting from offset. + * If none is found, the full word, starting from addr, is searched. + */ +/* _VMKLNX_CODECHECK_: find_next_bit */ +static __inline__ long find_next_bit(const unsigned long * addr, long size, long offset) +{ + const unsigned long * p = addr + (offset >> 6); + unsigned long set = 0, bit = offset & 63, res; + + if (bit) { + /* + * Look for nonzero in the first 64 bits: + */ + asm("bsfq %1,%0\n\t" + "cmoveq %2,%0\n\t" + : "=r" (set) + : "r" (*p >> bit), "r" (64L)); + if (set < (64 - bit)) + return set + offset; + set = 64 - bit; + p++; + } + /* + * No set bit yet, search remaining full words for a bit + */ + res = find_first_bit (p, size - 64 * (p - addr)); + return (offset + set + res); +} + + +#else /* !defined(__VMKLNX__) */ +extern long find_first_zero_bit(const unsigned long * addr, unsigned long size); +extern long find_next_zero_bit (const unsigned long * addr, long size, long offset); +extern long find_first_bit(const unsigned long * addr, unsigned long size); +extern long find_next_bit(const unsigned long * addr, long size, long offset); +#endif /* defined(__VMKLNX__) */ + +/** + * __scanbit - searches unsigned long value for the least significant set bit + * @val: The unsigned long value to scan for the set bit + * @max: The value to return if no set bit found + * + * Finds the least significant set bit in specified unsigned long value + * + * RETURN VALUE: + * Index of first bit set in val or max when no bit is set + */ +/* _VMKLNX_CODECHECK_: __scanbit */ +static inline unsigned long __scanbit(unsigned long val, unsigned long max) +{ + asm("bsfq %1,%0 ; cmovz %2,%0" : "=&r" (val) : "r" (val), "r" (max)); + return val; +} + +#define find_first_bit(addr,size) \ +((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \ + (__scanbit(*(unsigned long *)addr,(size))) : \ + find_first_bit(addr,size))) + +#define find_next_bit(addr,size,off) \ +((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \ + ((off) + (__scanbit((*(unsigned long *)addr) >> (off),(size)-(off)))) : \ + find_next_bit(addr,size,off))) + +#define find_first_zero_bit(addr,size) \ +((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \ + (__scanbit(~*(unsigned long *)addr,(size))) : \ + find_first_zero_bit(addr,size))) + +#define find_next_zero_bit(addr,size,off) \ +((__builtin_constant_p(size) && (size) <= BITS_PER_LONG ? \ + ((off)+(__scanbit(~(((*(unsigned long *)addr)) >> (off)),(size)-(off)))) : \ + find_next_zero_bit(addr,size,off))) + +/* + * Find string of zero bits in a bitmap. -1 when not found. + */ +extern unsigned long +find_next_zero_string(unsigned long *bitmap, long start, long nbits, int len); + +static inline void set_bit_string(unsigned long *bitmap, unsigned long i, + int len) +{ + unsigned long end = i + len; + while (i < end) { + __set_bit(i, bitmap); + i++; + } +} + +static inline void __clear_bit_string(unsigned long *bitmap, unsigned long i, + int len) +{ + unsigned long end = i + len; + while (i < end) { + __clear_bit(i, bitmap); + i++; + } +} + +/** + * ffz - find first zero in word. + * @word: The word to search + * + * Undefined if no zero exists, so code should check against ~0UL first. + * + * RETURN VALUE: + * Position of the first zero in the word + */ +/* _VMKLNX_CODECHECK_: ffz */ +static __inline__ unsigned long ffz(unsigned long word) +{ + __asm__("bsfq %1,%0" + :"=r" (word) + :"r" (~word)); + return word; +} + +/** + * __ffs - find first set bit in word + * @word: The word to search + * + * Undefined if no bit is set, so code should check against 0 first. + * + * RETURN VALUE: + * Position of the first set bit in the word + */ +/* _VMKLNX_CODECHECK_: __ffs */ +static __inline__ unsigned long __ffs(unsigned long word) +{ + __asm__("bsfq %1,%0" + :"=r" (word) + :"rm" (word)); + return word; +} + +/* + * __fls: find last bit set. + * @word: The word to search + * + * Undefined if no zero exists, so code should check against ~0UL first. + */ +static __inline__ unsigned long __fls(unsigned long word) +{ + __asm__("bsrq %1,%0" + :"=r" (word) + :"rm" (word)); + return word; +} + +#ifdef __KERNEL__ + +#include + +/** + * ffs - find first bit set + * @x: the word to search + * + * Finds the first bit set in the referenced word + * + * RETURN VALUE: + * Position of the first set bit + */ +/* _VMKLNX_CODECHECK_: ffs */ +static __inline__ int ffs(int x) +{ + int r; + + __asm__("bsfl %1,%0\n\t" + "cmovzl %2,%0" + : "=r" (r) : "rm" (x), "r" (-1)); + return r+1; +} + +/** + * fls64 - find last bit set in 64 bit word + * @x: the word to search + * + * This is defined the same way as fls. + */ +static __inline__ int fls64(__u64 x) +{ + if (x == 0) + return 0; + return __fls(x) + 1; +} + +/** + * fls - find last bit set + * @x: the word to search + * + * Finds last bit set in the specified word + * + * RETURN VALUE: + * The last set bit in specified word + */ +/* _VMKLNX_CODECHECK_: fls */ +static __inline__ int fls(int x) +{ + int r; + + __asm__("bsrl %1,%0\n\t" + "cmovzl %2,%0" + : "=&r" (r) : "rm" (x), "rm" (-1)); + return r+1; +} + +#include + +#endif /* __KERNEL__ */ + +#ifdef __KERNEL__ + +#include + +#define ext2_set_bit_atomic(lock,nr,addr) \ + test_and_set_bit((nr),(unsigned long*)addr) +#define ext2_clear_bit_atomic(lock,nr,addr) \ + test_and_clear_bit((nr),(unsigned long*)addr) + +#include + +#endif /* __KERNEL__ */ + +#endif /* _X86_64_BITOPS_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/boot.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/boot.h new file mode 100644 index 0000000..96b228e --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/boot.h @@ -0,0 +1,15 @@ +#ifndef _LINUX_BOOT_H +#define _LINUX_BOOT_H + +/* Don't touch these, unless you really know what you're doing. */ +#define DEF_INITSEG 0x9000 +#define DEF_SYSSEG 0x1000 +#define DEF_SETUPSEG 0x9020 +#define DEF_SYSSIZE 0x7F00 + +/* Internal svga startup constants */ +#define NORMAL_VGA 0xffff /* 80x25 mode */ +#define EXTENDED_VGA 0xfffe /* 80x50 mode */ +#define ASK_VGA 0xfffd /* ask for it at bootup */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bootsetup.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bootsetup.h new file mode 100644 index 0000000..b829f7b --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bootsetup.h @@ -0,0 +1,40 @@ + +#ifndef _X86_64_BOOTSETUP_H +#define _X86_64_BOOTSETUP_H 1 + +#define BOOT_PARAM_SIZE 4096 +extern char x86_boot_params[BOOT_PARAM_SIZE]; + +/* + * This is set up by the setup-routine at boot-time + */ +#define PARAM ((unsigned char *)x86_boot_params) +#define SCREEN_INFO (*(struct screen_info *) (PARAM+0)) +#define EXT_MEM_K (*(unsigned short *) (PARAM+2)) +#define ALT_MEM_K (*(unsigned int *) (PARAM+0x1e0)) +#define E820_MAP_NR (*(char*) (PARAM+E820NR)) +#define E820_MAP ((struct e820entry *) (PARAM+E820MAP)) +#define APM_BIOS_INFO (*(struct apm_bios_info *) (PARAM+0x40)) +#define DRIVE_INFO (*(struct drive_info_struct *) (PARAM+0x80)) +#define SYS_DESC_TABLE (*(struct sys_desc_table_struct*)(PARAM+0xa0)) +#define MOUNT_ROOT_RDONLY (*(unsigned short *) (PARAM+0x1F2)) +#define RAMDISK_FLAGS (*(unsigned short *) (PARAM+0x1F8)) +#define SAVED_VIDEO_MODE (*(unsigned short *) (PARAM+0x1FA)) +#define ORIG_ROOT_DEV (*(unsigned short *) (PARAM+0x1FC)) +#define AUX_DEVICE_INFO (*(unsigned char *) (PARAM+0x1FF)) +#define LOADER_TYPE (*(unsigned char *) (PARAM+0x210)) +#define KERNEL_START (*(unsigned int *) (PARAM+0x214)) +#define INITRD_START (*(unsigned int *) (PARAM+0x218)) +#define INITRD_SIZE (*(unsigned int *) (PARAM+0x21c)) +#define EDID_INFO (*(struct edid_info *) (PARAM+0x140)) +#define EDD_NR (*(unsigned char *) (PARAM+EDDNR)) +#define EDD_MBR_SIG_NR (*(unsigned char *) (PARAM+EDD_MBR_SIG_NR_BUF)) +#define EDD_MBR_SIGNATURE ((unsigned int *) (PARAM+EDD_MBR_SIG_BUF)) +#define EDD_BUF ((struct edd_info *) (PARAM+EDDBUF)) +#define COMMAND_LINE saved_command_line + +#define RAMDISK_IMAGE_START_MASK 0x07FF +#define RAMDISK_PROMPT_FLAG 0x8000 +#define RAMDISK_LOAD_FLAG 0x4000 + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bug.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bug.h new file mode 100644 index 0000000..c1cccb8 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bug.h @@ -0,0 +1,51 @@ +#ifndef __ASM_X8664_BUG_H +#define __ASM_X8664_BUG_H 1 + +#include + +/* + * Tell the user there is some problem. The exception handler decodes + * this frame. + */ +struct bug_frame { + unsigned char ud2[2]; + unsigned char push; + signed int filename; + unsigned char ret; + unsigned short line; +} __attribute__((packed)); + +#ifdef CONFIG_BUG +#define HAVE_ARCH_BUG +/* We turn the bug frame into valid instructions to not confuse + the disassembler. Thanks to Jan Beulich & Suresh Siddha + for nice instruction selection. + The magic numbers generate mov $64bitimm,%eax ; ret $offset. */ +/** + * BUG - Prints a message + * + * Prints a log message + * + * SYNOPSIS: + * #define BUG() + * + * ESX Deviation Notes: + * As in x86_64 most variants of Linux, generates a + * system stop (panic). + * + * RETURN VALUE: + * None + * + */ +/* _VMKLNX_CODECHECK_: BUG */ +#define BUG() \ + asm volatile( \ + "ud2 ; pushq $%c1 ; ret $%c0" :: \ + "i"(__LINE__), "i" (__FILE__)) +void out_of_line_bug(void); +#else +static inline void out_of_line_bug(void) { } +#endif + +#include +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bugs.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bugs.h new file mode 100644 index 0000000..d86c5dd --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/bugs.h @@ -0,0 +1,28 @@ +/* + * include/asm-x86_64/bugs.h + * + * Copyright (C) 1994 Linus Torvalds + * Copyright (C) 2000 SuSE + * + * This is included by init/main.c to check for architecture-dependent bugs. + * + * Needs: + * void check_bugs(void); + */ + +#include +#include +#include +#include + +extern void alternative_instructions(void); + +static void __init check_bugs(void) +{ + identify_cpu(&boot_cpu_data); +#if !defined(CONFIG_SMP) + printk("CPU: "); + print_cpu_info(&boot_cpu_data); +#endif + alternative_instructions(); +} diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/byteorder.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/byteorder.h new file mode 100644 index 0000000..5e86c86 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/byteorder.h @@ -0,0 +1,33 @@ +#ifndef _X86_64_BYTEORDER_H +#define _X86_64_BYTEORDER_H + +#include +#include + +#ifdef __GNUC__ + +static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x) +{ + __asm__("bswapq %0" : "=r" (x) : "0" (x)); + return x; +} + +static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x) +{ + __asm__("bswapl %0" : "=r" (x) : "0" (x)); + return x; +} + +/* Do not define swab16. Gcc is smart enough to recognize "C" version and + convert it into rotation or exhange. */ + +#define __arch__swab32(x) ___arch__swab32(x) +#define __arch__swab64(x) ___arch__swab64(x) + +#endif /* __GNUC__ */ + +#define __BYTEORDER_HAS_U64__ + +#include + +#endif /* _X86_64_BYTEORDER_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cache.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cache.h new file mode 100644 index 0000000..ed8a9d2 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cache.h @@ -0,0 +1,26 @@ +/* + * include/asm-x8664/cache.h + */ +#ifndef __ARCH_X8664_CACHE_H +#define __ARCH_X8664_CACHE_H + + +/* L1 cache line size */ +#define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) +#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) + +#ifdef CONFIG_X86_VSMP + +/* vSMP Internode cacheline shift */ +#define INTERNODE_CACHE_SHIFT (12) +#ifdef CONFIG_SMP +#define __cacheline_aligned_in_smp \ + __attribute__((__aligned__(1 << (INTERNODE_CACHE_SHIFT)))) \ + __attribute__((__section__(".data.page_aligned"))) +#endif + +#endif + +#define __read_mostly __attribute__((__section__(".data.read_mostly"))) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cacheflush.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cacheflush.h new file mode 100644 index 0000000..d32f7f5 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cacheflush.h @@ -0,0 +1,34 @@ +#ifndef _X8664_CACHEFLUSH_H +#define _X8664_CACHEFLUSH_H + +/* Keep includes the same across arches. */ +#include + +/* Caches aren't brain-dead on the intel. */ +#define flush_cache_all() do { } while (0) +#define flush_cache_mm(mm) do { } while (0) +#define flush_cache_range(vma, start, end) do { } while (0) +#define flush_cache_page(vma, vmaddr, pfn) do { } while (0) +#define flush_dcache_page(page) do { } while (0) +#define flush_dcache_mmap_lock(mapping) do { } while (0) +#define flush_dcache_mmap_unlock(mapping) do { } while (0) +#define flush_icache_range(start, end) do { } while (0) +#define flush_icache_page(vma,pg) do { } while (0) +#define flush_icache_user_range(vma,pg,adr,len) do { } while (0) +#define flush_cache_vmap(start, end) do { } while (0) +#define flush_cache_vunmap(start, end) do { } while (0) + +#define copy_to_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) +#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ + memcpy(dst, src, len) + +void global_flush_tlb(void); +int change_page_attr(struct page *page, int numpages, pgprot_t prot); +int change_page_attr_addr(unsigned long addr, int numpages, pgprot_t prot); + +#ifdef CONFIG_DEBUG_RODATA +void mark_rodata_ro(void); +#endif + +#endif /* _X8664_CACHEFLUSH_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calgary.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calgary.h new file mode 100644 index 0000000..03b93e0 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calgary.h @@ -0,0 +1,64 @@ +/* + * Derived from include/asm-powerpc/iommu.h + * + * Copyright (C) IBM Corporation, 2006 + * + * Author: Jon Mason + * Author: Muli Ben-Yehuda + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_X86_64_CALGARY_H +#define _ASM_X86_64_CALGARY_H + +#include +#include +#include +#include + +struct iommu_table { + unsigned long it_base; /* mapped address of tce table */ + unsigned long it_hint; /* Hint for next alloc */ + unsigned long *it_map; /* A simple allocation bitmap for now */ + spinlock_t it_lock; /* Protects it_map */ + unsigned int it_size; /* Size of iommu table in entries */ + unsigned char it_busno; /* Bus number this table belongs to */ + void __iomem *bbar; + u64 tar_val; + struct timer_list watchdog_timer; +}; + +#define TCE_TABLE_SIZE_UNSPECIFIED ~0 +#define TCE_TABLE_SIZE_64K 0 +#define TCE_TABLE_SIZE_128K 1 +#define TCE_TABLE_SIZE_256K 2 +#define TCE_TABLE_SIZE_512K 3 +#define TCE_TABLE_SIZE_1M 4 +#define TCE_TABLE_SIZE_2M 5 +#define TCE_TABLE_SIZE_4M 6 +#define TCE_TABLE_SIZE_8M 7 + +extern int use_calgary; + +#ifdef CONFIG_CALGARY_IOMMU +extern int calgary_iommu_init(void); +extern void detect_calgary(void); +#else +static inline int calgary_iommu_init(void) { return 1; } +static inline void detect_calgary(void) { return; } +#endif + +#endif /* _ASM_X86_64_CALGARY_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calling.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calling.h new file mode 100644 index 0000000..6f4f63a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/calling.h @@ -0,0 +1,162 @@ +/* + * Some macros to handle stack frames in assembly. + */ + + +#define R15 0 +#define R14 8 +#define R13 16 +#define R12 24 +#define RBP 32 +#define RBX 40 +/* arguments: interrupts/non tracing syscalls only save upto here*/ +#define R11 48 +#define R10 56 +#define R9 64 +#define R8 72 +#define RAX 80 +#define RCX 88 +#define RDX 96 +#define RSI 104 +#define RDI 112 +#define ORIG_RAX 120 /* + error_code */ +/* end of arguments */ +/* cpu exception frame or undefined in case of fast syscall. */ +#define RIP 128 +#define CS 136 +#define EFLAGS 144 +#define RSP 152 +#define SS 160 +#define ARGOFFSET R11 +#define SWFRAME ORIG_RAX + + .macro SAVE_ARGS addskip=0,norcx=0,nor891011=0 + subq $9*8+\addskip,%rsp + CFI_ADJUST_CFA_OFFSET 9*8+\addskip + movq %rdi,8*8(%rsp) + CFI_REL_OFFSET rdi,8*8 + movq %rsi,7*8(%rsp) + CFI_REL_OFFSET rsi,7*8 + movq %rdx,6*8(%rsp) + CFI_REL_OFFSET rdx,6*8 + .if \norcx + .else + movq %rcx,5*8(%rsp) + CFI_REL_OFFSET rcx,5*8 + .endif + movq %rax,4*8(%rsp) + CFI_REL_OFFSET rax,4*8 + .if \nor891011 + .else + movq %r8,3*8(%rsp) + CFI_REL_OFFSET r8,3*8 + movq %r9,2*8(%rsp) + CFI_REL_OFFSET r9,2*8 + movq %r10,1*8(%rsp) + CFI_REL_OFFSET r10,1*8 + movq %r11,(%rsp) + CFI_REL_OFFSET r11,0*8 + .endif + .endm + +#define ARG_SKIP 9*8 + .macro RESTORE_ARGS skiprax=0,addskip=0,skiprcx=0,skipr11=0,skipr8910=0,skiprdx=0 + .if \skipr11 + .else + movq (%rsp),%r11 + CFI_RESTORE r11 + .endif + .if \skipr8910 + .else + movq 1*8(%rsp),%r10 + CFI_RESTORE r10 + movq 2*8(%rsp),%r9 + CFI_RESTORE r9 + movq 3*8(%rsp),%r8 + CFI_RESTORE r8 + .endif + .if \skiprax + .else + movq 4*8(%rsp),%rax + CFI_RESTORE rax + .endif + .if \skiprcx + .else + movq 5*8(%rsp),%rcx + CFI_RESTORE rcx + .endif + .if \skiprdx + .else + movq 6*8(%rsp),%rdx + CFI_RESTORE rdx + .endif + movq 7*8(%rsp),%rsi + CFI_RESTORE rsi + movq 8*8(%rsp),%rdi + CFI_RESTORE rdi + .if ARG_SKIP+\addskip > 0 + addq $ARG_SKIP+\addskip,%rsp + CFI_ADJUST_CFA_OFFSET -(ARG_SKIP+\addskip) + .endif + .endm + + .macro LOAD_ARGS offset + movq \offset(%rsp),%r11 + movq \offset+8(%rsp),%r10 + movq \offset+16(%rsp),%r9 + movq \offset+24(%rsp),%r8 + movq \offset+40(%rsp),%rcx + movq \offset+48(%rsp),%rdx + movq \offset+56(%rsp),%rsi + movq \offset+64(%rsp),%rdi + movq \offset+72(%rsp),%rax + .endm + +#define REST_SKIP 6*8 + .macro SAVE_REST + subq $REST_SKIP,%rsp + CFI_ADJUST_CFA_OFFSET REST_SKIP + movq %rbx,5*8(%rsp) + CFI_REL_OFFSET rbx,5*8 + movq %rbp,4*8(%rsp) + CFI_REL_OFFSET rbp,4*8 + movq %r12,3*8(%rsp) + CFI_REL_OFFSET r12,3*8 + movq %r13,2*8(%rsp) + CFI_REL_OFFSET r13,2*8 + movq %r14,1*8(%rsp) + CFI_REL_OFFSET r14,1*8 + movq %r15,(%rsp) + CFI_REL_OFFSET r15,0*8 + .endm + + .macro RESTORE_REST + movq (%rsp),%r15 + CFI_RESTORE r15 + movq 1*8(%rsp),%r14 + CFI_RESTORE r14 + movq 2*8(%rsp),%r13 + CFI_RESTORE r13 + movq 3*8(%rsp),%r12 + CFI_RESTORE r12 + movq 4*8(%rsp),%rbp + CFI_RESTORE rbp + movq 5*8(%rsp),%rbx + CFI_RESTORE rbx + addq $REST_SKIP,%rsp + CFI_ADJUST_CFA_OFFSET -(REST_SKIP) + .endm + + .macro SAVE_ALL + SAVE_ARGS + SAVE_REST + .endm + + .macro RESTORE_ALL addskip=0 + RESTORE_REST + RESTORE_ARGS 0,\addskip + .endm + + .macro icebp + .byte 0xf1 + .endm diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/checksum.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/checksum.h new file mode 100644 index 0000000..dca058c --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/checksum.h @@ -0,0 +1,206 @@ +#ifndef _X86_64_CHECKSUM_H +#define _X86_64_CHECKSUM_H + +/* + * Checksums for x86-64 + * Copyright 2002 by Andi Kleen, SuSE Labs + * with some code from asm-i386/checksum.h + */ + +#include +#include +#include + +/** + * csum_fold - Fold and invert a 32bit checksum. + * @sum: 32bit unfolded sum + * + * Fold a 32bit running checksum to 16bit and invert it. This is usually + * the last step before putting a checksum into a packet. + * Make sure not to mix with 64bit checksums. + * + * RETURN VALUE: + * Returns a 32-bit unsigned value + */ +/* _VMKLNX_CODECHECK_: csum_fold */ +static inline unsigned int csum_fold(unsigned int sum) +{ + __asm__( + " addl %1,%0\n" + " adcl $0xffff,%0" + : "=r" (sum) + : "r" (sum << 16), "0" (sum & 0xffff0000) + ); + return (~sum) >> 16; +} + +/* + * This is a version of ip_compute_csum() optimized for IP headers, + * which always checksum on 4 octet boundaries. + * + * By Jorge Cwik , adapted for linux by + * Arnt Gulbrandsen. + */ + +#if !defined(__VMKLNX_NO_IP_FAST_CSUM__) +/** + * ip_fast_csum - Compute the IPv4 header checksum efficiently. + * @iph: ipv4 header + * @ihl: length of header / 4 + * + * Calculates the 16 bit IPv4 header cheksum for the given IPv4 header. + * + * RETURN VALUE: + * IPv4 header checksum + */ +/* _VMKLNX_CODECHECK_: ip_fast_csum */ +static inline unsigned short ip_fast_csum(unsigned char *iph, unsigned int ihl) +{ + unsigned int sum; + + asm( " movl (%1), %0\n" + " subl $4, %2\n" + " jbe 2f\n" + " addl 4(%1), %0\n" + " adcl 8(%1), %0\n" + " adcl 12(%1), %0\n" + "1: adcl 16(%1), %0\n" + " lea 4(%1), %1\n" + " decl %2\n" + " jne 1b\n" + " adcl $0, %0\n" + " movl %0, %2\n" + " shrl $16, %0\n" + " addw %w2, %w0\n" + " adcl $0, %0\n" + " notl %0\n" + "2:" + /* Since the input registers which are loaded with iph and ihl + are modified, we must also specify them as outputs, or gcc + will assume they contain their original values. */ + : "=r" (sum), "=r" (iph), "=r" (ihl) + : "1" (iph), "2" (ihl) + : "memory"); + return(sum); +} +#endif /* !defined(__VMKLNX_NO_IP_FAST_CSUM__) */ + +/** + * csum_tcpup_nofold - Compute an IPv4 pseudo header checksum. + * @saddr: source address + * @daddr: destination address + * @len: length of packet + * @proto: ip protocol of packet + * @sum: initial sum to be added in (32bit unfolded) + * + * Returns the pseudo header checksum the input data. Result is + * 32bit unfolded. + */ +static inline unsigned long +csum_tcpudp_nofold(unsigned saddr, unsigned daddr, unsigned short len, + unsigned short proto, unsigned int sum) +{ + asm(" addl %1, %0\n" + " adcl %2, %0\n" + " adcl %3, %0\n" + " adcl $0, %0\n" + : "=r" (sum) + : "g" (daddr), "g" (saddr), "g" ((ntohs(len)<<16)+proto*256), "0" (sum)); + return sum; +} + + +/** + * csum_tcpup_magic - Compute an IPv4 pseudo header checksum. + * @saddr: source address + * @daddr: destination address + * @len: length of packet + * @proto: ip protocol of packet + * @sum: initial sum to be added in (32bit unfolded) + * + * Returns the 16bit pseudo header checksum the input data already + * complemented and ready to be filled in. + */ +/* _VMKLNX_CODECHECK_: csum_tcpudp_magic */ +static inline unsigned short int +csum_tcpudp_magic(unsigned long saddr, unsigned long daddr, + unsigned short len, unsigned short proto, unsigned int sum) +{ + return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); +} + +/** + * csum_partial - Compute an internet checksum. + * @buff: buffer to be checksummed + * @len: length of buffer. + * @sum: initial sum to be added in (32bit unfolded) + * + * Returns the 32bit unfolded internet checksum of the buffer. + * Before filling it in it needs to be csum_fold()'ed. + * buff should be aligned to a 64bit boundary if possible. + */ +extern unsigned int csum_partial(const unsigned char *buff, unsigned len, unsigned int sum); + +#define _HAVE_ARCH_COPY_AND_CSUM_FROM_USER 1 +#define HAVE_CSUM_COPY_USER 1 + + +/* Do not call this directly. Use the wrappers below */ +extern unsigned long csum_partial_copy_generic(const unsigned char *src, const unsigned char *dst, + unsigned len, + unsigned sum, + int *src_err_ptr, int *dst_err_ptr); + + +extern unsigned int csum_partial_copy_from_user(const unsigned char __user *src, unsigned char *dst, + int len, unsigned int isum, int *errp); +extern unsigned int csum_partial_copy_to_user(const unsigned char *src, unsigned char __user *dst, + int len, unsigned int isum, int *errp); +extern unsigned int csum_partial_copy_nocheck(const unsigned char *src, unsigned char *dst, int len, + unsigned int sum); + +/* Old names. To be removed. */ +#define csum_and_copy_to_user csum_partial_copy_to_user +#define csum_and_copy_from_user csum_partial_copy_from_user + +/** + * ip_compute_csum - Compute an 16bit IP checksum. + * @buff: buffer address. + * @len: length of buffer. + * + * Returns the 16bit folded/inverted checksum of the passed buffer. + * Ready to fill in. + */ +extern unsigned short ip_compute_csum(unsigned char * buff, int len); + +/** + * csum_ipv6_magic - Compute checksum of an IPv6 pseudo header. + * @saddr: source address + * @daddr: destination address + * @len: length of packet + * @proto: protocol of packet + * @sum: initial sum (32bit unfolded) to be added in + * + * Computes an IPv6 pseudo header checksum. This sum is added the checksum + * into UDP/TCP packets and contains some link layer information. + * Returns the unfolded 32bit checksum. + */ + +struct in6_addr; + +#define _HAVE_ARCH_IPV6_CSUM 1 +extern unsigned short +csum_ipv6_magic(struct in6_addr *saddr, struct in6_addr *daddr, + __u32 len, unsigned short proto, unsigned int sum); + +static inline unsigned add32_with_carry(unsigned a, unsigned b) +{ + asm("addl %2,%0\n\t" + "adcl $0,%0" + : "=r" (a) + : "0" (a), "r" (b)); + return a; +} + +#endif + diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/compat.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/compat.h new file mode 100644 index 0000000..82492ce --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/compat.h @@ -0,0 +1,241 @@ +#ifndef _ASM_X86_64_COMPAT_H +#define _ASM_X86_64_COMPAT_H + +/* + * Architecture specific compatibility types + */ +#include +#include + +#define COMPAT_USER_HZ 100 + +typedef u32 compat_size_t; +typedef s32 compat_ssize_t; +typedef s32 compat_time_t; +typedef s32 compat_clock_t; +typedef s32 compat_pid_t; +typedef u16 __compat_uid_t; +typedef u16 __compat_gid_t; +typedef u32 __compat_uid32_t; +typedef u32 __compat_gid32_t; +typedef u16 compat_mode_t; +typedef u32 compat_ino_t; +typedef u16 compat_dev_t; +typedef s32 compat_off_t; +typedef s64 compat_loff_t; +typedef u16 compat_nlink_t; +typedef u16 compat_ipc_pid_t; +typedef s32 compat_daddr_t; +typedef u32 compat_caddr_t; +typedef __kernel_fsid_t compat_fsid_t; +typedef s32 compat_timer_t; +typedef s32 compat_key_t; + +typedef s32 compat_int_t; +typedef s32 compat_long_t; +typedef u32 compat_uint_t; +typedef u32 compat_ulong_t; + +struct compat_timespec { + compat_time_t tv_sec; + s32 tv_nsec; +}; + +struct compat_timeval { + compat_time_t tv_sec; + s32 tv_usec; +}; + +struct compat_stat { + compat_dev_t st_dev; + u16 __pad1; + compat_ino_t st_ino; + compat_mode_t st_mode; + compat_nlink_t st_nlink; + __compat_uid_t st_uid; + __compat_gid_t st_gid; + compat_dev_t st_rdev; + u16 __pad2; + u32 st_size; + u32 st_blksize; + u32 st_blocks; + u32 st_atime; + u32 st_atime_nsec; + u32 st_mtime; + u32 st_mtime_nsec; + u32 st_ctime; + u32 st_ctime_nsec; + u32 __unused4; + u32 __unused5; +}; + +struct compat_flock { + short l_type; + short l_whence; + compat_off_t l_start; + compat_off_t l_len; + compat_pid_t l_pid; +}; + +#define F_GETLK64 12 /* using 'struct flock64' */ +#define F_SETLK64 13 +#define F_SETLKW64 14 + +/* + * IA32 uses 4 byte alignment for 64 bit quantities, + * so we need to pack this structure. + */ +struct compat_flock64 { + short l_type; + short l_whence; + compat_loff_t l_start; + compat_loff_t l_len; + compat_pid_t l_pid; +} __attribute__((packed)); + +struct compat_statfs { + int f_type; + int f_bsize; + int f_blocks; + int f_bfree; + int f_bavail; + int f_files; + int f_ffree; + compat_fsid_t f_fsid; + int f_namelen; /* SunOS ignores this field. */ + int f_frsize; + int f_spare[5]; +}; + +#define COMPAT_RLIM_OLD_INFINITY 0x7fffffff +#define COMPAT_RLIM_INFINITY 0xffffffff + +typedef u32 compat_old_sigset_t; /* at least 32 bits */ + +#define _COMPAT_NSIG 64 +#define _COMPAT_NSIG_BPW 32 + +typedef u32 compat_sigset_word; + +#define COMPAT_OFF_T_MAX 0x7fffffff +#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL + +struct compat_ipc64_perm { + compat_key_t key; + __compat_uid32_t uid; + __compat_gid32_t gid; + __compat_uid32_t cuid; + __compat_gid32_t cgid; + unsigned short mode; + unsigned short __pad1; + unsigned short seq; + unsigned short __pad2; + compat_ulong_t unused1; + compat_ulong_t unused2; +}; + +struct compat_semid64_ds { + struct compat_ipc64_perm sem_perm; + compat_time_t sem_otime; + compat_ulong_t __unused1; + compat_time_t sem_ctime; + compat_ulong_t __unused2; + compat_ulong_t sem_nsems; + compat_ulong_t __unused3; + compat_ulong_t __unused4; +}; + +struct compat_msqid64_ds { + struct compat_ipc64_perm msg_perm; + compat_time_t msg_stime; + compat_ulong_t __unused1; + compat_time_t msg_rtime; + compat_ulong_t __unused2; + compat_time_t msg_ctime; + compat_ulong_t __unused3; + compat_ulong_t msg_cbytes; + compat_ulong_t msg_qnum; + compat_ulong_t msg_qbytes; + compat_pid_t msg_lspid; + compat_pid_t msg_lrpid; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +struct compat_shmid64_ds { + struct compat_ipc64_perm shm_perm; + compat_size_t shm_segsz; + compat_time_t shm_atime; + compat_ulong_t __unused1; + compat_time_t shm_dtime; + compat_ulong_t __unused2; + compat_time_t shm_ctime; + compat_ulong_t __unused3; + compat_pid_t shm_cpid; + compat_pid_t shm_lpid; + compat_ulong_t shm_nattch; + compat_ulong_t __unused4; + compat_ulong_t __unused5; +}; + +/* + * A pointer passed in from user mode. This should not + * be used for syscall parameters, just declare them + * as pointers because the syscall entry code will have + * appropriately comverted them already. + */ +typedef u32 compat_uptr_t; + +/** + * compat_ptr - Convert a user provided pointer to a pointer suitable for user access functions + * @uptr: Pointer in user mode + * + * Convert a user provided pointer to a pointer suitable + * for use with user access functions (e.g. copy_from_user, + * copy_to_user, etc.). + * + * RETURN VALUE: + * A (void * ) pointer in user space. + * + */ +/* _VMKLNX_CODECHECK_: compat_ptr */ +static inline void __user *compat_ptr(compat_uptr_t uptr) +{ + return (void __user *)(unsigned long)uptr; +} + +static inline compat_uptr_t ptr_to_compat(void __user *uptr) +{ + return (u32)(unsigned long)uptr; +} + +/** + * compat_alloc_user_space - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: compat_alloc_user_space */ +#if !defined(__VMKLNX__) +static __inline__ void __user *compat_alloc_user_space(long len) +{ + struct pt_regs *regs = task_pt_regs(current); + return (void __user *)regs->rsp - len; +} +#else +extern void *compat_alloc_user_space(long len); +#endif + +#if !defined(__VMKLNX__) +static inline int is_compat_task(void) +{ + return current_thread_info()->status & TS_COMPAT; +} +#endif /* !defined(__VMKLNX__) */ + +#endif /* _ASM_X86_64_COMPAT_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/const.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/const.h new file mode 100644 index 0000000..54fb08f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/const.h @@ -0,0 +1,20 @@ +/* const.h: Macros for dealing with constants. */ + +#ifndef _X86_64_CONST_H +#define _X86_64_CONST_H + +/* Some constant macros are used in both assembler and + * C code. Therefore we cannot annotate them always with + * 'UL' and other type specificers unilaterally. We + * use the following macros to deal with this. + */ + +#ifdef __ASSEMBLY__ +#define _AC(X,Y) X +#else +#define __AC(X,Y) (X##Y) +#define _AC(X,Y) __AC(X,Y) +#endif + + +#endif /* !(_X86_64_CONST_H) */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpu.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpu.h new file mode 100644 index 0000000..8eea076 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpu.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpufeature.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpufeature.h new file mode 100644 index 0000000..ee792fa --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cpufeature.h @@ -0,0 +1,116 @@ +/* + * cpufeature.h + * + * Defines x86 CPU feature bits + */ + +#ifndef __ASM_X8664_CPUFEATURE_H +#define __ASM_X8664_CPUFEATURE_H + +#define NCAPINTS 7 /* N 32-bit words worth of info */ + +/* Intel-defined CPU features, CPUID level 0x00000001, word 0 */ +#define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */ +#define X86_FEATURE_VME (0*32+ 1) /* Virtual Mode Extensions */ +#define X86_FEATURE_DE (0*32+ 2) /* Debugging Extensions */ +#define X86_FEATURE_PSE (0*32+ 3) /* Page Size Extensions */ +#define X86_FEATURE_TSC (0*32+ 4) /* Time Stamp Counter */ +#define X86_FEATURE_MSR (0*32+ 5) /* Model-Specific Registers, RDMSR, WRMSR */ +#define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */ +#define X86_FEATURE_MCE (0*32+ 7) /* Machine Check Architecture */ +#define X86_FEATURE_CX8 (0*32+ 8) /* CMPXCHG8 instruction */ +#define X86_FEATURE_APIC (0*32+ 9) /* Onboard APIC */ +#define X86_FEATURE_SEP (0*32+11) /* SYSENTER/SYSEXIT */ +#define X86_FEATURE_MTRR (0*32+12) /* Memory Type Range Registers */ +#define X86_FEATURE_PGE (0*32+13) /* Page Global Enable */ +#define X86_FEATURE_MCA (0*32+14) /* Machine Check Architecture */ +#define X86_FEATURE_CMOV (0*32+15) /* CMOV instruction (FCMOVCC and FCOMI too if FPU present) */ +#define X86_FEATURE_PAT (0*32+16) /* Page Attribute Table */ +#define X86_FEATURE_PSE36 (0*32+17) /* 36-bit PSEs */ +#define X86_FEATURE_PN (0*32+18) /* Processor serial number */ +#define X86_FEATURE_CLFLSH (0*32+19) /* Supports the CLFLUSH instruction */ +#define X86_FEATURE_DTES (0*32+21) /* Debug Trace Store */ +#define X86_FEATURE_ACPI (0*32+22) /* ACPI via MSR */ +#define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ +#define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions (fast save and restore */ + /* of FPU context), and CR4.OSFXSR available */ +#define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ +#define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ +#define X86_FEATURE_SELFSNOOP (0*32+27) /* CPU self snoop */ +#define X86_FEATURE_HT (0*32+28) /* Hyper-Threading */ +#define X86_FEATURE_ACC (0*32+29) /* Automatic clock control */ +#define X86_FEATURE_IA64 (0*32+30) /* IA-64 processor */ + +/* AMD-defined CPU features, CPUID level 0x80000001, word 1 */ +/* Don't duplicate feature flags which are redundant with Intel! */ +#define X86_FEATURE_SYSCALL (1*32+11) /* SYSCALL/SYSRET */ +#define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ +#define X86_FEATURE_FXSR_OPT (1*32+25) /* FXSR optimizations */ +#define X86_FEATURE_RDTSCP (1*32+27) /* RDTSCP */ +#define X86_FEATURE_LM (1*32+29) /* Long Mode (x86-64) */ +#define X86_FEATURE_3DNOWEXT (1*32+30) /* AMD 3DNow! extensions */ +#define X86_FEATURE_3DNOW (1*32+31) /* 3DNow! */ + +/* Transmeta-defined CPU features, CPUID level 0x80860001, word 2 */ +#define X86_FEATURE_RECOVERY (2*32+ 0) /* CPU in recovery mode */ +#define X86_FEATURE_LONGRUN (2*32+ 1) /* Longrun power control */ +#define X86_FEATURE_LRTI (2*32+ 3) /* LongRun table interface */ + +/* Other features, Linux-defined mapping, word 3 */ +/* This range is used for feature bits which conflict or are synthesized */ +#define X86_FEATURE_CXMMX (3*32+ 0) /* Cyrix MMX extensions */ +#define X86_FEATURE_K6_MTRR (3*32+ 1) /* AMD K6 nonstandard MTRRs */ +#define X86_FEATURE_CYRIX_ARR (3*32+ 2) /* Cyrix ARRs (= MTRRs) */ +#define X86_FEATURE_CENTAUR_MCR (3*32+ 3) /* Centaur MCRs (= MTRRs) */ +#define X86_FEATURE_REP_GOOD (3*32+ 4) /* rep microcode works well on this CPU */ +#define X86_FEATURE_CONSTANT_TSC (3*32+5) /* TSC runs at constant rate */ +#define X86_FEATURE_SYNC_RDTSC (3*32+6) /* RDTSC syncs CPU core */ +#define X86_FEATURE_FXSAVE_LEAK (3*32+7) /* FIP/FOP/FDP leaks through FXSAVE */ +#define X86_FEATURE_UP (3*32+8) /* SMP kernel running on UP */ +#define X86_FEATURE_ARCH_PERFMON (3*32+9) /* Intel Architectural PerfMon */ + +/* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */ +#define X86_FEATURE_XMM3 (4*32+ 0) /* Streaming SIMD Extensions-3 */ +#define X86_FEATURE_MWAIT (4*32+ 3) /* Monitor/Mwait support */ +#define X86_FEATURE_DSCPL (4*32+ 4) /* CPL Qualified Debug Store */ +#define X86_FEATURE_EST (4*32+ 7) /* Enhanced SpeedStep */ +#define X86_FEATURE_TM2 (4*32+ 8) /* Thermal Monitor 2 */ +#define X86_FEATURE_CID (4*32+10) /* Context ID */ +#define X86_FEATURE_CX16 (4*32+13) /* CMPXCHG16B */ +#define X86_FEATURE_XTPR (4*32+14) /* Send Task Priority Messages */ + +/* VIA/Cyrix/Centaur-defined CPU features, CPUID level 0xC0000001, word 5 */ +#define X86_FEATURE_XSTORE (5*32+ 2) /* on-CPU RNG present (xstore insn) */ +#define X86_FEATURE_XSTORE_EN (5*32+ 3) /* on-CPU RNG enabled */ +#define X86_FEATURE_XCRYPT (5*32+ 6) /* on-CPU crypto (xcrypt insn) */ +#define X86_FEATURE_XCRYPT_EN (5*32+ 7) /* on-CPU crypto enabled */ + +/* More extended AMD flags: CPUID level 0x80000001, ecx, word 6 */ +#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */ +#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */ + +#define cpu_has(c, bit) test_bit(bit, (c)->x86_capability) +#define boot_cpu_has(bit) test_bit(bit, boot_cpu_data.x86_capability) + +#define cpu_has_fpu 1 +#define cpu_has_vme 0 +#define cpu_has_de 1 +#define cpu_has_pse 1 +#define cpu_has_tsc 1 +#define cpu_has_pae ___BUG___ +#define cpu_has_pge 1 +#define cpu_has_apic boot_cpu_has(X86_FEATURE_APIC) +#define cpu_has_mtrr 1 +#define cpu_has_mmx 1 +#define cpu_has_fxsr 1 +#define cpu_has_xmm 1 +#define cpu_has_xmm2 1 +#define cpu_has_xmm3 boot_cpu_has(X86_FEATURE_XMM3) +#define cpu_has_ht boot_cpu_has(X86_FEATURE_HT) +#define cpu_has_mp 1 /* XXX */ +#define cpu_has_k6_mtrr 0 +#define cpu_has_cyrix_arr 0 +#define cpu_has_centaur_mcr 0 +#define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH) + +#endif /* __ASM_X8664_CPUFEATURE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cputime.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cputime.h new file mode 100644 index 0000000..a07012d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/cputime.h @@ -0,0 +1,6 @@ +#ifndef __X86_64_CPUTIME_H +#define __X86_64_CPUTIME_H + +#include + +#endif /* __X86_64_CPUTIME_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crash.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crash.h new file mode 100644 index 0000000..f80cb95 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crash.h @@ -0,0 +1,75 @@ +#ifndef _ASM_X86_64_CRASH_H +#define _ASM_X86_64_CRASH_H + +/* + * linux/include/asm-x86_64/crash.h + * + * Copyright (c) 2004 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifdef __KERNEL__ + +#include +#include +#include + +extern int page_is_ram(unsigned long); + +static inline void * +map_virtual(u64 offset, struct page **pp) +{ + struct page *page; + unsigned long pfn; + void *vaddr; + + pfn = (unsigned long)(offset >> PAGE_SHIFT); + + if (!page_is_ram(pfn)) { + printk(KERN_INFO + "crash memory driver: !page_is_ram(pfn: %lx)\n", pfn); + return NULL; + } + + if (!pfn_valid(pfn)) { + printk(KERN_INFO + "crash memory driver: invalid pfn: %lx )\n", pfn); + return NULL; + } + + page = pfn_to_page(pfn); + + vaddr = kmap(page); + if (!vaddr) { + printk(KERN_INFO + "crash memory driver: pfn: %lx kmap(page: %lx) failed\n", + pfn, (unsigned long)page); + return NULL; + } + + *pp = page; + return (vaddr + (offset & (PAGE_SIZE-1))); +} + +static inline void unmap_virtual(struct page *page) +{ + kunmap(page); +} + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_CRASH_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crashdump.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crashdump.h new file mode 100644 index 0000000..16859b2 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/crashdump.h @@ -0,0 +1,86 @@ +/* + * include/asm-x86_64/crashdump.h + * + * Copyright (C) Hitachi, Ltd. 2004 + * Written by Satoshi Oshima (oshima@sdl.hitachi.co.jp) + * + * Derived from include/asm-i386/diskdump.h + * Copyright (c) 2004 FUJITSU LIMITED + * Copyright (c) 2003 Red Hat, Inc. All rights reserved. + * + */ + +#ifndef _ASM_X86_64_CRASHDUMP_H +#define _ASM_X86_64_CRASHDUMP_H + +#ifdef __KERNEL__ + +#include + +extern int page_is_ram(unsigned long); +extern unsigned long next_ram_page(unsigned long); + +#define platform_fix_regs() \ +{ \ + unsigned long rsp; \ + unsigned short ss; \ + rsp = (unsigned long) ((char *)regs + sizeof (struct pt_regs)); \ + ss = __KERNEL_DS; \ + if (regs->cs & 3) { \ + rsp = regs->rsp; \ + ss = regs->ss & 0xffff; \ + } \ + myregs = *regs; \ + myregs.rsp = rsp; \ + myregs.ss = (myregs.ss & (~0xffff)) | ss; \ +} + +#define platform_timestamp(x) rdtscll(x) + +#define platform_freeze_cpu() \ +{ \ + for (;;) local_irq_disable(); \ +} + +static inline void platform_init_stack(void **stackptr) +{ + struct page *page; + + if ((page = alloc_page(GFP_KERNEL))) + *stackptr = (void *)page_address(page); + + if (*stackptr) + memset(*stackptr, 0, PAGE_SIZE); + else + printk(KERN_WARNING + "crashdump: unable to allocate separate stack\n"); +} + +#define platform_cleanup_stack(stackptr) \ +do { \ + if (stackptr) \ + free_page((unsigned long)stackptr); \ +} while (0) + +typedef asmlinkage void (*crashdump_func_t)(struct pt_regs *, void *); + +static inline void platform_start_crashdump(void *stackptr, + crashdump_func_t dumpfunc, + struct pt_regs *regs) +{ + static unsigned long old_rsp; + unsigned long new_rsp; + + if (stackptr) { + asm volatile("movq %%rsp,%0" : "=r" (old_rsp)); + new_rsp = (unsigned long)stackptr + PAGE_SIZE; + asm volatile("movq %0,%%rsp" :: "r" (new_rsp)); + dumpfunc(regs, NULL); + asm volatile("movq %0,%%rsp" :: "r" (old_rsp)); + } else + dumpfunc(regs, NULL); +} + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_CRASHDUMP_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/current.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/current.h new file mode 100644 index 0000000..3df8a6d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/current.h @@ -0,0 +1,57 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +#ifndef _X86_64_CURRENT_H +#define _X86_64_CURRENT_H + +#if !defined(__ASSEMBLY__) +struct task_struct; + +#include + +/** + * get_current - Gets current task pointer for the current world. + * + * Gets current task pointer for the current world. + * + * RETURN VALUE: + * Pointer to the task struct of the running process. + */ +/* _VMKLNX_CODECHECK_: get_current */ +static inline struct task_struct *get_current(void) +{ +#if defined(__VMKLNX__) + extern struct task_struct *vmklnx_GetCurrent(void); + return vmklnx_GetCurrent(); +#else /* !defined(__VMKLNX__) */ + struct task_struct *t = read_pda(pcurrent); + return t; +#endif /* defined(__VMKLNX__) */ +} + +/** + * current - Get current task pointer of current task + * + * Returns a pointer to the task struct of the running task + * + * SYNOPSIS: + * #define current + * + * RETURN VALUE: + * Pointer to current task of type task_struct + * + */ +/* _VMKLNX_CODECHECK_: current */ +#define current get_current() + +#else + +#ifndef ASM_OFFSET_H +#include +#endif + +#define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg + +#endif + +#endif /* !(_X86_64_CURRENT_H) */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/debugreg.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/debugreg.h new file mode 100644 index 0000000..bd1aab1 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/debugreg.h @@ -0,0 +1,65 @@ +#ifndef _X86_64_DEBUGREG_H +#define _X86_64_DEBUGREG_H + + +/* Indicate the register numbers for a number of the specific + debug registers. Registers 0-3 contain the addresses we wish to trap on */ +#define DR_FIRSTADDR 0 /* u_debugreg[DR_FIRSTADDR] */ +#define DR_LASTADDR 3 /* u_debugreg[DR_LASTADDR] */ + +#define DR_STATUS 6 /* u_debugreg[DR_STATUS] */ +#define DR_CONTROL 7 /* u_debugreg[DR_CONTROL] */ + +/* Define a few things for the status register. We can use this to determine + which debugging register was responsible for the trap. The other bits + are either reserved or not of interest to us. */ + +#define DR_TRAP0 (0x1) /* db0 */ +#define DR_TRAP1 (0x2) /* db1 */ +#define DR_TRAP2 (0x4) /* db2 */ +#define DR_TRAP3 (0x8) /* db3 */ + +#define DR_STEP (0x4000) /* single-step */ +#define DR_SWITCH (0x8000) /* task switch */ + +/* Now define a bunch of things for manipulating the control register. + The top two bytes of the control register consist of 4 fields of 4 + bits - each field corresponds to one of the four debug registers, + and indicates what types of access we trap on, and how large the data + field is that we are looking at */ + +#define DR_CONTROL_SHIFT 16 /* Skip this many bits in ctl register */ +#define DR_CONTROL_SIZE 4 /* 4 control bits per register */ + +#define DR_RW_EXECUTE (0x0) /* Settings for the access types to trap on */ +#define DR_RW_WRITE (0x1) +#define DR_RW_READ (0x3) + +#define DR_LEN_1 (0x0) /* Settings for data length to trap on */ +#define DR_LEN_2 (0x4) +#define DR_LEN_4 (0xC) +#define DR_LEN_8 (0x8) + +/* The low byte to the control register determine which registers are + enabled. There are 4 fields of two bits. One bit is "local", meaning + that the processor will reset the bit after a task switch and the other + is global meaning that we have to explicitly reset the bit. With linux, + you can use either one, since we explicitly zero the register when we enter + kernel mode. */ + +#define DR_LOCAL_ENABLE_SHIFT 0 /* Extra shift to the local enable bit */ +#define DR_GLOBAL_ENABLE_SHIFT 1 /* Extra shift to the global enable bit */ +#define DR_ENABLE_SIZE 2 /* 2 enable bits per register */ + +#define DR_LOCAL_ENABLE_MASK (0x55) /* Set local bits for all 4 regs */ +#define DR_GLOBAL_ENABLE_MASK (0xAA) /* Set global bits for all 4 regs */ + +/* The second byte to the control register has a few special things. + We can slow the instruction pipeline for instructions coming via the + gdt or the ldt if we want to. I am not sure why this is an advantage */ + +#define DR_CONTROL_RESERVED (0xFFFFFFFF0000FC00UL) /* Reserved */ +#define DR_LOCAL_SLOWDOWN (0x100) /* Local slow the pipeline */ +#define DR_GLOBAL_SLOWDOWN (0x200) /* Global slow the pipeline */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/delay.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/delay.h new file mode 100644 index 0000000..d235e6d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/delay.h @@ -0,0 +1,49 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef _X8664_DELAY_H +#define _X8664_DELAY_H + +/* + * Copyright (C) 1993 Linus Torvalds + * + * Delay routines calling functions in arch/x86_64/lib/delay.c + */ +#if defined(__VMKLNX__) +#include "vmkapi.h" + +#define udelay(n) vmk_DelayUsecs((vmk_uint32) (n)) + +#else /* !defined(__VMKLNX__) */ + +extern void __bad_udelay(void); +extern void __bad_ndelay(void); + +extern void __udelay(unsigned long usecs); +extern void __ndelay(unsigned long usecs); +extern void __const_udelay(unsigned long usecs); +extern void __delay(unsigned long loops); + +/** + * udelay - delay for n microseconds + * @n: number of microseconds to delay + * + * SYNOPSIS: + * #define udelay(n) + * + * RETURN VALUE: + * none + * + */ +/* _VMKLNX_CODECHECK_: udelay */ +#define udelay(n) (__builtin_constant_p(n) ? \ + ((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c6ul)) : \ + __udelay(n)) + +#define ndelay(n) (__builtin_constant_p(n) ? \ + ((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \ + __ndelay(n)) + +#endif /* defined(__VMKLNX__) */ + +#endif /* defined(_X8664_DELAY_H) */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/desc.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/desc.h new file mode 100644 index 0000000..eb7723a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/desc.h @@ -0,0 +1,238 @@ +/* Written 2000 by Andi Kleen */ +#ifndef __ARCH_DESC_H +#define __ARCH_DESC_H + +#include +#include + +#ifndef __ASSEMBLY__ + +#include +#include + +#include +#include + +// 8 byte segment descriptor +struct desc_struct { + u16 limit0; + u16 base0; + unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1; + unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8; +} __attribute__((packed)); + +struct n_desc_struct { + unsigned int a,b; +}; + +extern struct desc_struct cpu_gdt_table[GDT_ENTRIES]; + +enum { + GATE_INTERRUPT = 0xE, + GATE_TRAP = 0xF, + GATE_CALL = 0xC, +}; + +// 16byte gate +struct gate_struct { + u16 offset_low; + u16 segment; + unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1; + u16 offset_middle; + u32 offset_high; + u32 zero1; +} __attribute__((packed)); + +#define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) +#define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF) +#define PTR_HIGH(x) ((unsigned long)(x) >> 32) + +enum { + DESC_TSS = 0x9, + DESC_LDT = 0x2, +}; + +// LDT or TSS descriptor in the GDT. 16 bytes. +struct ldttss_desc { + u16 limit0; + u16 base0; + unsigned base1 : 8, type : 5, dpl : 2, p : 1; + unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8; + u32 base3; + u32 zero1; +} __attribute__((packed)); + +struct desc_ptr { + unsigned short size; + unsigned long address; +} __attribute__((packed)) ; + +#define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8)) +#define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8)) +#define clear_LDT() asm volatile("lldt %w0"::"r" (0)) + +/* + * This is the ldt that every process will get unless we need + * something other than this. + */ +extern struct desc_struct default_ldt[]; +extern struct gate_struct idt_table[]; +extern struct desc_ptr cpu_gdt_descr[]; + +/* the cpu gdt accessor */ +#define cpu_gdt(_cpu) ((struct desc_struct *)cpu_gdt_descr[_cpu].address) + +static inline void _set_gate(void *adr, unsigned type, unsigned long func, unsigned dpl, unsigned ist) +{ + struct gate_struct s; + s.offset_low = PTR_LOW(func); + s.segment = __KERNEL_CS; + s.ist = ist; + s.p = 1; + s.dpl = dpl; + s.zero0 = 0; + s.zero1 = 0; + s.type = type; + s.offset_middle = PTR_MIDDLE(func); + s.offset_high = PTR_HIGH(func); + /* does not need to be atomic because it is only done once at setup time */ + memcpy(adr, &s, 16); +} + +static inline void set_intr_gate(int nr, void *func) +{ + BUG_ON((unsigned)nr > 0xFF); + _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, 0); +} + +static inline void set_intr_gate_ist(int nr, void *func, unsigned ist) +{ + BUG_ON((unsigned)nr > 0xFF); + _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, ist); +} + +static inline void set_system_gate(int nr, void *func) +{ + BUG_ON((unsigned)nr > 0xFF); + _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, 0); +} + +static inline void set_system_gate_ist(int nr, void *func, unsigned ist) +{ + _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, ist); +} + +static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned type, + unsigned size) +{ + struct ldttss_desc d; + memset(&d,0,sizeof(d)); + d.limit0 = size & 0xFFFF; + d.base0 = PTR_LOW(tss); + d.base1 = PTR_MIDDLE(tss) & 0xFF; + d.type = type; + d.p = 1; + d.limit1 = (size >> 16) & 0xF; + d.base2 = (PTR_MIDDLE(tss) >> 8) & 0xFF; + d.base3 = PTR_HIGH(tss); + memcpy(ptr, &d, 16); +} + +static inline void set_tss_desc(unsigned cpu, void *addr) +{ + /* + * sizeof(unsigned long) coming from an extra "long" at the end + * of the iobitmap. See tss_struct definition in processor.h + * + * -1? seg base+limit should be pointing to the address of the + * last valid byte + */ + set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_TSS], + (unsigned long)addr, DESC_TSS, + IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1); +} + +static inline void set_ldt_desc(unsigned cpu, void *addr, int size) +{ + set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_LDT], (unsigned long)addr, + DESC_LDT, size * 8 - 1); +} + +static inline void set_seg_base(unsigned cpu, int entry, void *base) +{ + struct desc_struct *d = &cpu_gdt(cpu)[entry]; + u32 addr = (u32)(u64)base; + BUG_ON((u64)base >> 32); + d->base0 = addr & 0xffff; + d->base1 = (addr >> 16) & 0xff; + d->base2 = (addr >> 24) & 0xff; +} + +#define LDT_entry_a(info) \ + ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff)) +/* Don't allow setting of the lm bit. It is useless anyways because + 64bit system calls require __USER_CS. */ +#define LDT_entry_b(info) \ + (((info)->base_addr & 0xff000000) | \ + (((info)->base_addr & 0x00ff0000) >> 16) | \ + ((info)->limit & 0xf0000) | \ + (((info)->read_exec_only ^ 1) << 9) | \ + ((info)->contents << 10) | \ + (((info)->seg_not_present ^ 1) << 15) | \ + ((info)->seg_32bit << 22) | \ + ((info)->limit_in_pages << 23) | \ + ((info)->useable << 20) | \ + /* ((info)->lm << 21) | */ \ + 0x7000) + +#define LDT_empty(info) (\ + (info)->base_addr == 0 && \ + (info)->limit == 0 && \ + (info)->contents == 0 && \ + (info)->read_exec_only == 1 && \ + (info)->seg_32bit == 0 && \ + (info)->limit_in_pages == 0 && \ + (info)->seg_not_present == 1 && \ + (info)->useable == 0 && \ + (info)->lm == 0) + +#if TLS_SIZE != 24 +# error update this code. +#endif + +static inline void load_TLS(struct thread_struct *t, unsigned int cpu) +{ + u64 *gdt = (u64 *)(cpu_gdt(cpu) + GDT_ENTRY_TLS_MIN); + gdt[0] = t->tls_array[0]; + gdt[1] = t->tls_array[1]; + gdt[2] = t->tls_array[2]; +} + +/* + * load one particular LDT into the current CPU + */ +static inline void load_LDT_nolock (mm_context_t *pc, int cpu) +{ + int count = pc->size; + + if (likely(!count)) { + clear_LDT(); + return; + } + + set_ldt_desc(cpu, pc->ldt, count); + load_LDT_desc(); +} + +static inline void load_LDT(mm_context_t *pc) +{ + int cpu = get_cpu(); + load_LDT_nolock(pc, cpu); + put_cpu(); +} + +extern struct desc_ptr idt_descr; + +#endif /* !__ASSEMBLY__ */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/device.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/device.h new file mode 100644 index 0000000..87a7153 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/device.h @@ -0,0 +1,13 @@ +#ifndef _ASM_X86_DEVICE_H +#define _ASM_X86_DEVICE_H + +struct dev_archdata { +#ifdef CONFIG_ACPI + void *acpi_handle; +#endif +#ifdef CONFIG_DMAR + void *iommu; /* hook for IOMMU specific extension */ +#endif +}; + +#endif /* _ASM_X86_DEVICE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/diskdump.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/diskdump.h new file mode 100644 index 0000000..494e801 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/diskdump.h @@ -0,0 +1,44 @@ +/* + * include/asm-x86_64/diskdump.h + * + * Copyright (C) Hitachi, Ltd. 2004 + * Written by Satoshi Oshima (oshima@sdl.hitachi.co.jp) + * + * Derived from include/asm-i386/diskdump.h + * Copyright (c) 2004 FUJITSU LIMITED + * Copyright (c) 2003 Red Hat, Inc. All rights reserved. + * + */ + +#ifndef _ASM_X86_64_DISKDUMP_H +#define _ASM_X86_64_DISKDUMP_H + +#ifdef __KERNEL__ + +#include +#include + +const static int platform_supports_diskdump = 1; + +struct disk_dump_sub_header { + elf_gregset_t elf_regs; +}; + +#define size_of_sub_header() ((sizeof(struct disk_dump_sub_header) + PAGE_SIZE - 1) / DUMP_BLOCK_SIZE) + +#define write_sub_header() \ +({ \ + int ret; \ + \ + ELF_CORE_COPY_REGS(dump_sub_header.elf_regs, (&myregs)); \ + clear_page(scratch); \ + memcpy(scratch, &dump_sub_header, sizeof(dump_sub_header)); \ + \ + if ((ret = write_blocks(dump_part, 2, scratch, 1)) >= 0) \ + ret = 1; /* size of sub header in page */; \ + ret; \ +}) + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_DISKDUMP_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/div64.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/div64.h new file mode 100644 index 0000000..6cd978c --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/div64.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma-mapping.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma-mapping.h new file mode 100644 index 0000000..75c91e9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma-mapping.h @@ -0,0 +1,428 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef _X8664_DMA_MAPPING_H +#define _X8664_DMA_MAPPING_H 1 + +/* + * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for + * documentation. + */ + + +#include +#include +#include + +struct dma_mapping_ops { + int (*mapping_error)(dma_addr_t dma_addr); + void* (*alloc_coherent)(struct device *dev, size_t size, + dma_addr_t *dma_handle, gfp_t gfp); + void (*free_coherent)(struct device *dev, size_t size, + void *vaddr, dma_addr_t dma_handle); + dma_addr_t (*map_single)(struct device *hwdev, void *ptr, + size_t size, int direction); + /* like map_single, but doesn't check the device mask */ + dma_addr_t (*map_simple)(struct device *hwdev, char *ptr, + size_t size, int direction); + void (*unmap_single)(struct device *dev, dma_addr_t addr, + size_t size, int direction); + void (*sync_single_for_cpu)(struct device *hwdev, + dma_addr_t dma_handle, size_t size, + int direction); + void (*sync_single_for_device)(struct device *hwdev, + dma_addr_t dma_handle, size_t size, + int direction); + void (*sync_single_range_for_cpu)(struct device *hwdev, + dma_addr_t dma_handle, unsigned long offset, + size_t size, int direction); + void (*sync_single_range_for_device)(struct device *hwdev, + dma_addr_t dma_handle, unsigned long offset, + size_t size, int direction); + void (*sync_sg_for_cpu)(struct device *hwdev, + struct scatterlist *sg, int nelems, + int direction); + void (*sync_sg_for_device)(struct device *hwdev, + struct scatterlist *sg, int nelems, + int direction); + int (*map_sg)(struct device *hwdev, struct scatterlist *sg, + int nents, int direction); + void (*unmap_sg)(struct device *hwdev, + struct scatterlist *sg, int nents, + int direction); + int (*dma_supported)(struct device *hwdev, u64 mask); + int is_phys; +}; + +extern dma_addr_t bad_dma_address; +extern struct dma_mapping_ops* dma_ops; +extern int iommu_merge; + +static inline int valid_dma_direction(int dma_direction) +{ + return ((dma_direction == DMA_BIDIRECTIONAL) || + (dma_direction == DMA_TO_DEVICE) || + (dma_direction == DMA_FROM_DEVICE)); +} + +extern void *dma_alloc_coherent(struct device *dev, size_t size, + dma_addr_t *dma_handle, gfp_t gfp); +extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr, + dma_addr_t dma_handle); + + + +#if !defined(__VMKLNX__) +/** + * dma_mapping_error - Check a bus address for a mapping error + * @dma_addr: bus address previously returned by dma_map_single or dma_map_page + * + * Performs a platform-specific check to determine if the + * mapped bus address is valid for use with DMA + * + * RETURN VALUE: + * TRUE if the bus address incurred a mapping error, FALSE otherwise + * + * SEE ALSO: + * dma_map_single + * + */ +static inline int dma_mapping_error(dma_addr_t dma_addr) +{ + if (dma_ops->mapping_error) + return dma_ops->mapping_error(dma_addr); + + return (dma_addr == bad_dma_address); +} + +/** + * dma_map_single - Map a buffer for streaming DMA use with a given device + * @hwdev: device to be used in the DMA operation + * @ptr: virtual address of the buffer + * @size: length of the buffer, in bytes + * @direction: direction of the DMA to set up + * + * Sets up any platform-specific bus connectivity required to + * make a buffer usable for a DMA operation and returns a mapped bus address + * for the buffer. The mapped address should be checked for an error using + * dma_mapping_error. When the buffer will no longer be used for DMA, the + * buffer should be unmapped using dma_unmap_single. + * 'direction' can be any one of + * DMA_BIDIRECTIONAL (the device either reads or writes the buffer), + * DMA_TO_DEVICE (the device reads the buffer), + * DMA_FROM_DEVICE (the device writes the buffer), or + * DMA_NONE (neither reads nor writes should be allowed - may not be supported + * on all platforms) + * + * RETURN VALUE: + * A bus address accessible by the device + * + * SEE ALSO: + * dma_unmap_single, dma_mapping_error + * + */ +static inline dma_addr_t +dma_map_single(struct device *hwdev, void *ptr, size_t size, + int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + return dma_ops->map_single(hwdev, ptr, size, direction); +} + +#define dma_map_page(dev,page,offset,size,dir) \ + dma_map_single((dev), page_address(page)+(offset), (size), (dir)) + +#define dma_unmap_page dma_unmap_single + +/** + * dma_unmap_single - Tear down a streaming DMA mapping for a buffer + * @dev: device that had been used in the DMA operation + * @addr: mapped bus address for the buffer, previously returned by dma_map_single + * @size: length of the buffer, in bytes + * @direction: direction of the DMA that was set up by dma_map_single + * + * Tears down the platform-specific bus connectivity that was needed to make a + * buffer usable for DMA. + * 'direction' can be any one of + * DMA_BIDIRECTIONAL (the device either reads or writes the buffer), + * DMA_TO_DEVICE (the device reads the buffer), + * DMA_FROM_DEVICE (the device writes the buffer), or + * DMA_NONE (neither reads nor writes should be allowed) + * + * RETURN VALUE: + * Does not return any value + * + * SEE ALSO: + * dma_map_single + * + */ +static inline void +dma_unmap_single(struct device *dev, dma_addr_t addr,size_t size, + int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + dma_ops->unmap_single(dev, addr, size, direction); +} + +/** + * dma_sync_single_for_cpu - Allow the CPU to access a buffer that is currently DMA-mapped + * @hwdev: device to which the buffer is mapped + * @dma_handle: bus address of the buffer + * @size: length of the buffer, in bytes + * @direction: direction of the existing DMA mapping + * + * Transfers access ownership for a buffer that has been set up for DMA back to + * the CPU and synchronizes any changes that have been made by the device with + * the CPU. The bus mapping that was created with dma_map_single is not + * destroyed. Afterward, the CPU can safely read and write the buffer. The + * device should not access the buffer until access rights have been + * transferred back to the device using dma_sync_single_for_device. + * + * RETURN VALUE: + * Does not return any value + * + * SEE ALSO: + * dma_sync_single_for_device, dma_map_single + * + */ +static inline void +dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle, + size_t size, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_single_for_cpu) + dma_ops->sync_single_for_cpu(hwdev, dma_handle, size, + direction); + flush_write_buffers(); +} + +/** + * dma_sync_single_for_device - Re-enable device access to a DMA-mapped buffer + * @hwdev: device to which the buffer is mapped + * @dma_handle: bus address of the buffer + * @size: length of the buffer, in bytes + * @direction: direction of the existing DMA mapping + * + * Transfers access ownership back to a device from the CPU and synchronizes + * any changes that the CPU has made so that they will be visible by the device. + * + * RETURN VALUE: + * Does not return any value + * + * SEE ALSO: + * dma_sync_single_for_cpu, dma_map_single + * + */ +static inline void +dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle, + size_t size, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_single_for_device) + dma_ops->sync_single_for_device(hwdev, dma_handle, size, + direction); + flush_write_buffers(); +} + +static inline void +dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_single_range_for_cpu) { + dma_ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, size, direction); + } + + flush_write_buffers(); +} + +static inline void +dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_single_range_for_device) + dma_ops->sync_single_range_for_device(hwdev, dma_handle, + offset, size, direction); + + flush_write_buffers(); +} + +static inline void +dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, + int nelems, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_sg_for_cpu) + dma_ops->sync_sg_for_cpu(hwdev, sg, nelems, direction); + flush_write_buffers(); +} + +static inline void +dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, + int nelems, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + if (dma_ops->sync_sg_for_device) { + dma_ops->sync_sg_for_device(hwdev, sg, nelems, direction); + } + + flush_write_buffers(); +} + +/** + * dma_map_sg - Map scatter/gather buffers for DMA use with a hardware device + * @hwdev: device to be used in the DMA operations + * @sg: start of the scatter/gather list of entries to be mapped + * @nents: number of elements in the list to be mapped + * @direction: direction of the DMA, with values as in dma_map_single + * + * Sets up the platform-specific bus connectivity for each of the buffers in a + * scatterlist so that they may be used in DMA with the given hardware device. + * dma_unmap_sg should be used on these scatterlist elements when they will no + * longer be used with DMA. + * + * RETURN VALUE: + * 0 if a failure was encountered, nents if the mappings succeeded + * + * SEE ALSO: + * dma_map_single, dma_unmap_sg + * + */ +static inline int +dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + return dma_ops->map_sg(hwdev, sg, nents, direction); +} + +/** + * dma_unmap_sg - Unmap scatter/gather buffers that were previously mapped for DMA + * @hwdev: device to which these buffers have been mapped + * @sg: start of the scatter/gather list of entries to be unmapped + * @nents: number of elements in the list to be unmapped + * @direction: direction of the existing DMA mapping + * + * Tears down the platform-specific bus connectivity for each of the buffers in + * a scatterlist that had been previously set up for DMA using + * dma_map_sg. + * + * RETURN VALUE: + * Does not return any value + * + * SEE ALSO: + * dma_map_sg, dma_map_single + * + */ +static inline void +dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, + int direction) +{ + BUG_ON(!valid_dma_direction(direction)); + /* take out this ifdef block when we have iommu support */ + dma_ops->unmap_sg(hwdev, sg, nents, direction); +} + +extern int dma_supported(struct device *hwdev, u64 mask); + +#else /* defined(__VMKLNX__) */ + +extern int dma_mapping_error(dma_addr_t dma_addr); + +/* In vmklinux, virt_to_phys & phys_to_virt are real function calls, so + * until support for IOMMU is added, it's good to avoid call to + * dma_map_single() here since nommu_map_single() calls virt_to_phys(). + */ +#define dma_map_page(dev,page,offset,size,dir) \ + (((dma_addr_t) page_to_phys(page)) + (offset)) +#define dma_unmap_page(dev,dma_address,size,dir) do { } while(0) + +extern dma_addr_t +dma_map_single(struct device *hwdev, void *ptr, size_t size, + int direction); +extern void +dma_unmap_single(struct device *dev, dma_addr_t addr,size_t size, + int direction); +extern void +dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle, + size_t size, int direction); +extern void +dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle, + size_t size, int direction); +extern void +dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction); +extern void +dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction); +extern void +dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg, + int nelems, int direction); +extern void +dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg, + int nelems, int direction); +extern int +dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction); +extern void +dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents, + int direction); + +struct vmklnx_codma; +extern struct vmklnx_codma vmklnx_codma; +extern int vmklnx_dma_supported(struct vmklnx_codma *codma, + struct device *hwdev, u64 mask); + +static inline int dma_supported(struct device *hwdev, u64 mask) +{ + return vmklnx_dma_supported(&vmklnx_codma, hwdev, mask); +} +#endif /* defined(__VMKLNX__) */ + +/* same for gart, swiotlb, and nommu */ +static inline int dma_get_cache_alignment(void) +{ + return boot_cpu_data.x86_clflush_size; +} + +#define dma_is_consistent(h) 1 + +#if !defined(__VMKLNX__) +extern int dma_set_mask(struct device *dev, u64 mask); +#else /* defined(__VMKLNX__) */ +/** + * dma_set_mask - Set a device's allowable DMA mask + * @dev: device whose mask is being set + * @mask: address bitmask + * + * Sets the range in which the device can perform DMA operations. + * The mask, when bitwise-ANDed with an arbitrary machine address, expresses + * the DMA addressability of the device. This mask is used by dma_mapping + * functions (ie, dma_alloc_coherent, dma_pool_alloc) to guarantee that the + * memory allocated is usable by the device. + * + * RETURN VALUE: + * 0 on success + * -EIO if the given mask cannot be used for DMA on the system, or if the + * dma_mask has not been previously initialized. + * + */ +/* _VMKLNX_CODECHECK_: dma_set_mask */ +static inline int dma_set_mask(struct device *dev, u64 mask) +{ + if (!dev->dma_mask || !dma_supported(dev, mask)) + return -EIO; + *dev->dma_mask = mask; + return 0; +} +#endif /* !defined(__VMKLNX__) */ + +static inline void +dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction dir) +{ + flush_write_buffers(); +} + +extern struct device fallback_dev; +extern int panic_on_overflow; + +#endif /* _X8664_DMA_MAPPING_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma.h new file mode 100644 index 0000000..a37c16f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dma.h @@ -0,0 +1,304 @@ +/* + * linux/include/asm/dma.h: Defines for using and allocating dma channels. + * Written by Hennus Bergman, 1992. + * High DMA channel support & info by Hannu Savolainen + * and John Boyd, Nov. 1992. + */ + +#ifndef _ASM_DMA_H +#define _ASM_DMA_H + +#include /* And spinlocks */ +#include /* need byte IO */ +#include + + +#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER +#define dma_outb outb_p +#else +#define dma_outb outb +#endif + +#define dma_inb inb + +/* + * NOTES about DMA transfers: + * + * controller 1: channels 0-3, byte operations, ports 00-1F + * controller 2: channels 4-7, word operations, ports C0-DF + * + * - ALL registers are 8 bits only, regardless of transfer size + * - channel 4 is not used - cascades 1 into 2. + * - channels 0-3 are byte - addresses/counts are for physical bytes + * - channels 5-7 are word - addresses/counts are for physical words + * - transfers must not cross physical 64K (0-3) or 128K (5-7) boundaries + * - transfer count loaded to registers is 1 less than actual count + * - controller 2 offsets are all even (2x offsets for controller 1) + * - page registers for 5-7 don't use data bit 0, represent 128K pages + * - page registers for 0-3 use bit 0, represent 64K pages + * + * DMA transfers are limited to the lower 16MB of _physical_ memory. + * Note that addresses loaded into registers must be _physical_ addresses, + * not logical addresses (which may differ if paging is active). + * + * Address mapping for channels 0-3: + * + * A23 ... A16 A15 ... A8 A7 ... A0 (Physical addresses) + * | ... | | ... | | ... | + * | ... | | ... | | ... | + * | ... | | ... | | ... | + * P7 ... P0 A7 ... A0 A7 ... A0 + * | Page | Addr MSB | Addr LSB | (DMA registers) + * + * Address mapping for channels 5-7: + * + * A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0 (Physical addresses) + * | ... | \ \ ... \ \ \ ... \ \ + * | ... | \ \ ... \ \ \ ... \ (not used) + * | ... | \ \ ... \ \ \ ... \ + * P7 ... P1 (0) A7 A6 ... A0 A7 A6 ... A0 + * | Page | Addr MSB | Addr LSB | (DMA registers) + * + * Again, channels 5-7 transfer _physical_ words (16 bits), so addresses + * and counts _must_ be word-aligned (the lowest address bit is _ignored_ at + * the hardware level, so odd-byte transfers aren't possible). + * + * Transfer count (_not # bytes_) is limited to 64K, represented as actual + * count - 1 : 64K => 0xFFFF, 1 => 0x0000. Thus, count is always 1 or more, + * and up to 128K bytes may be transferred on channels 5-7 in one operation. + * + */ + +#define MAX_DMA_CHANNELS 8 + + +/* 16MB ISA DMA zone */ +#define MAX_DMA_PFN ((16*1024*1024) >> PAGE_SHIFT) + +/* 4GB broken PCI/AGP hardware bus master zone */ +#define MAX_DMA32_PFN ((4UL*1024*1024*1024) >> PAGE_SHIFT) + +/* Compat define for old dma zone */ +#define MAX_DMA_ADDRESS ((unsigned long)__va(MAX_DMA_PFN << PAGE_SHIFT)) + +/* 8237 DMA controllers */ +#define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */ +#define IO_DMA2_BASE 0xC0 /* 16 bit master DMA, ch 4(=slave input)..7 */ + +/* DMA controller registers */ +#define DMA1_CMD_REG 0x08 /* command register (w) */ +#define DMA1_STAT_REG 0x08 /* status register (r) */ +#define DMA1_REQ_REG 0x09 /* request register (w) */ +#define DMA1_MASK_REG 0x0A /* single-channel mask (w) */ +#define DMA1_MODE_REG 0x0B /* mode register (w) */ +#define DMA1_CLEAR_FF_REG 0x0C /* clear pointer flip-flop (w) */ +#define DMA1_TEMP_REG 0x0D /* Temporary Register (r) */ +#define DMA1_RESET_REG 0x0D /* Master Clear (w) */ +#define DMA1_CLR_MASK_REG 0x0E /* Clear Mask */ +#define DMA1_MASK_ALL_REG 0x0F /* all-channels mask (w) */ + +#define DMA2_CMD_REG 0xD0 /* command register (w) */ +#define DMA2_STAT_REG 0xD0 /* status register (r) */ +#define DMA2_REQ_REG 0xD2 /* request register (w) */ +#define DMA2_MASK_REG 0xD4 /* single-channel mask (w) */ +#define DMA2_MODE_REG 0xD6 /* mode register (w) */ +#define DMA2_CLEAR_FF_REG 0xD8 /* clear pointer flip-flop (w) */ +#define DMA2_TEMP_REG 0xDA /* Temporary Register (r) */ +#define DMA2_RESET_REG 0xDA /* Master Clear (w) */ +#define DMA2_CLR_MASK_REG 0xDC /* Clear Mask */ +#define DMA2_MASK_ALL_REG 0xDE /* all-channels mask (w) */ + +#define DMA_ADDR_0 0x00 /* DMA address registers */ +#define DMA_ADDR_1 0x02 +#define DMA_ADDR_2 0x04 +#define DMA_ADDR_3 0x06 +#define DMA_ADDR_4 0xC0 +#define DMA_ADDR_5 0xC4 +#define DMA_ADDR_6 0xC8 +#define DMA_ADDR_7 0xCC + +#define DMA_CNT_0 0x01 /* DMA count registers */ +#define DMA_CNT_1 0x03 +#define DMA_CNT_2 0x05 +#define DMA_CNT_3 0x07 +#define DMA_CNT_4 0xC2 +#define DMA_CNT_5 0xC6 +#define DMA_CNT_6 0xCA +#define DMA_CNT_7 0xCE + +#define DMA_PAGE_0 0x87 /* DMA page registers */ +#define DMA_PAGE_1 0x83 +#define DMA_PAGE_2 0x81 +#define DMA_PAGE_3 0x82 +#define DMA_PAGE_5 0x8B +#define DMA_PAGE_6 0x89 +#define DMA_PAGE_7 0x8A + +#define DMA_MODE_READ 0x44 /* I/O to memory, no autoinit, increment, single mode */ +#define DMA_MODE_WRITE 0x48 /* memory to I/O, no autoinit, increment, single mode */ +#define DMA_MODE_CASCADE 0xC0 /* pass thru DREQ->HRQ, DACK<-HLDA only */ + +#define DMA_AUTOINIT 0x10 + + +extern spinlock_t dma_spin_lock; + +static __inline__ unsigned long claim_dma_lock(void) +{ + unsigned long flags; + spin_lock_irqsave(&dma_spin_lock, flags); + return flags; +} + +static __inline__ void release_dma_lock(unsigned long flags) +{ + spin_unlock_irqrestore(&dma_spin_lock, flags); +} + +/* enable/disable a specific DMA channel */ +static __inline__ void enable_dma(unsigned int dmanr) +{ + if (dmanr<=3) + dma_outb(dmanr, DMA1_MASK_REG); + else + dma_outb(dmanr & 3, DMA2_MASK_REG); +} + +static __inline__ void disable_dma(unsigned int dmanr) +{ + if (dmanr<=3) + dma_outb(dmanr | 4, DMA1_MASK_REG); + else + dma_outb((dmanr & 3) | 4, DMA2_MASK_REG); +} + +/* Clear the 'DMA Pointer Flip Flop'. + * Write 0 for LSB/MSB, 1 for MSB/LSB access. + * Use this once to initialize the FF to a known state. + * After that, keep track of it. :-) + * --- In order to do that, the DMA routines below should --- + * --- only be used while holding the DMA lock ! --- + */ +static __inline__ void clear_dma_ff(unsigned int dmanr) +{ + if (dmanr<=3) + dma_outb(0, DMA1_CLEAR_FF_REG); + else + dma_outb(0, DMA2_CLEAR_FF_REG); +} + +/* set mode (above) for a specific DMA channel */ +static __inline__ void set_dma_mode(unsigned int dmanr, char mode) +{ + if (dmanr<=3) + dma_outb(mode | dmanr, DMA1_MODE_REG); + else + dma_outb(mode | (dmanr&3), DMA2_MODE_REG); +} + +/* Set only the page register bits of the transfer address. + * This is used for successive transfers when we know the contents of + * the lower 16 bits of the DMA current address register, but a 64k boundary + * may have been crossed. + */ +static __inline__ void set_dma_page(unsigned int dmanr, char pagenr) +{ + switch(dmanr) { + case 0: + dma_outb(pagenr, DMA_PAGE_0); + break; + case 1: + dma_outb(pagenr, DMA_PAGE_1); + break; + case 2: + dma_outb(pagenr, DMA_PAGE_2); + break; + case 3: + dma_outb(pagenr, DMA_PAGE_3); + break; + case 5: + dma_outb(pagenr & 0xfe, DMA_PAGE_5); + break; + case 6: + dma_outb(pagenr & 0xfe, DMA_PAGE_6); + break; + case 7: + dma_outb(pagenr & 0xfe, DMA_PAGE_7); + break; + } +} + + +/* Set transfer address & page bits for specific DMA channel. + * Assumes dma flipflop is clear. + */ +static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a) +{ + set_dma_page(dmanr, a>>16); + if (dmanr <= 3) { + dma_outb( a & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE ); + dma_outb( (a>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE ); + } else { + dma_outb( (a>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE ); + dma_outb( (a>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE ); + } +} + + +/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for + * a specific DMA channel. + * You must ensure the parameters are valid. + * NOTE: from a manual: "the number of transfers is one more + * than the initial word count"! This is taken into account. + * Assumes dma flip-flop is clear. + * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7. + */ +static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count) +{ + count--; + if (dmanr <= 3) { + dma_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE ); + dma_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE ); + } else { + dma_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE ); + dma_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE ); + } +} + + +/* Get DMA residue count. After a DMA transfer, this + * should return zero. Reading this while a DMA transfer is + * still in progress will return unpredictable results. + * If called before the channel has been used, it may return 1. + * Otherwise, it returns the number of _bytes_ left to transfer. + * + * Assumes DMA flip-flop is clear. + */ +static __inline__ int get_dma_residue(unsigned int dmanr) +{ + unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE + : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE; + + /* using short to get 16-bit wrap around */ + unsigned short count; + + count = 1 + dma_inb(io_port); + count += dma_inb(io_port) << 8; + + return (dmanr<=3)? count : (count<<1); +} + + +/* These are in kernel/dma.c: */ +extern int request_dma(unsigned int dmanr, const char * device_id); /* reserve a DMA channel */ +extern void free_dma(unsigned int dmanr); /* release it again */ + +/* From PCI */ + +#ifdef CONFIG_PCI +extern int isa_dma_bridge_buggy; +#else +#define isa_dma_bridge_buggy (0) +#endif + +#endif /* _ASM_DMA_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dmi.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dmi.h new file mode 100644 index 0000000..d5d9f70 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dmi.h @@ -0,0 +1,34 @@ +#ifndef _ASM_DMI_H +#define _ASM_DMI_H 1 + +#include + +#if !defined(__VMKLNX__) +extern void *dmi_ioremap(unsigned long addr, unsigned long size); +extern void dmi_iounmap(void *addr, unsigned long size); +#endif + +#define DMI_MAX_DATA 2048 + +extern int dmi_alloc_index; +extern char dmi_alloc_data[DMI_MAX_DATA]; + +/* This is so early that there is no good way to allocate dynamic memory. + Allocate data in an BSS array. */ +static inline void *dmi_alloc(unsigned len) +{ + int idx = dmi_alloc_index; + if ((dmi_alloc_index += len) > DMI_MAX_DATA) + return NULL; + return dmi_alloc_data + idx; +} + +#if defined(__VMKLNX__) +#define dmi_ioremap(addr, size) ioremap(addr, size) +#define dmi_iounmap(addr, size) iounmap(addr) +#else +#define dmi_ioremap early_ioremap +#define dmi_iounmap early_iounmap +#endif /* #if defined(__VMKLNX__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dwarf2.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dwarf2.h new file mode 100644 index 0000000..0744db7 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/dwarf2.h @@ -0,0 +1,51 @@ +#ifndef _DWARF2_H +#define _DWARF2_H 1 + + +#ifndef __ASSEMBLY__ +#warning "asm/dwarf2.h should be only included in pure assembly files" +#endif + +/* + Macros for dwarf2 CFI unwind table entries. + See "as.info" for details on these pseudo ops. Unfortunately + they are only supported in very new binutils, so define them + away for older version. + */ + +#ifdef CONFIG_UNWIND_INFO + +#define CFI_STARTPROC .cfi_startproc +#define CFI_ENDPROC .cfi_endproc +#define CFI_DEF_CFA .cfi_def_cfa +#define CFI_DEF_CFA_REGISTER .cfi_def_cfa_register +#define CFI_DEF_CFA_OFFSET .cfi_def_cfa_offset +#define CFI_ADJUST_CFA_OFFSET .cfi_adjust_cfa_offset +#define CFI_OFFSET .cfi_offset +#define CFI_REL_OFFSET .cfi_rel_offset +#define CFI_REGISTER .cfi_register +#define CFI_RESTORE .cfi_restore +#define CFI_REMEMBER_STATE .cfi_remember_state +#define CFI_RESTORE_STATE .cfi_restore_state +#define CFI_UNDEFINED .cfi_undefined + +#else + +/* use assembler line comment character # to ignore the arguments. */ +#define CFI_STARTPROC # +#define CFI_ENDPROC # +#define CFI_DEF_CFA # +#define CFI_DEF_CFA_REGISTER # +#define CFI_DEF_CFA_OFFSET # +#define CFI_ADJUST_CFA_OFFSET # +#define CFI_OFFSET # +#define CFI_REL_OFFSET # +#define CFI_REGISTER # +#define CFI_RESTORE # +#define CFI_REMEMBER_STATE # +#define CFI_RESTORE_STATE # +#define CFI_UNDEFINED # + +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/e820.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/e820.h new file mode 100644 index 0000000..f656748 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/e820.h @@ -0,0 +1,67 @@ +/* + * structures and definitions for the int 15, ax=e820 memory map + * scheme. + * + * In a nutshell, setup.S populates a scratch table in the + * empty_zero_block that contains a list of usable address/size + * duples. setup.c, this information is transferred into the e820map, + * and in init.c/numa.c, that new information is used to mark pages + * reserved or not. + */ +#ifndef __E820_HEADER +#define __E820_HEADER + +#include + +#define E820MAP 0x2d0 /* our map */ +#define E820MAX 128 /* number of entries in E820MAP */ +#define E820NR 0x1e8 /* # entries in E820MAP */ + +#define E820_RAM 1 +#define E820_RESERVED 2 +#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */ +#define E820_NVS 4 + +#define HIGH_MEMORY (1024*1024) + +#define LOWMEMSIZE() (0x9f000) + +#ifndef __ASSEMBLY__ +struct e820entry { + u64 addr; /* start of memory segment */ + u64 size; /* size of memory segment */ + u32 type; /* type of memory segment */ +} __attribute__((packed)); + +struct e820map { + int nr_map; + struct e820entry map[E820MAX]; +}; + +extern unsigned long find_e820_area(unsigned long start, unsigned long end, + unsigned size); +extern void add_memory_region(unsigned long start, unsigned long size, + int type); +extern void setup_memory_region(void); +extern void contig_e820_setup(void); +extern unsigned long e820_end_of_ram(void); +extern void e820_reserve_resources(void); +extern void e820_mark_nosave_regions(void); +extern void e820_print_map(char *who); +extern int e820_any_mapped(unsigned long start, unsigned long end, unsigned type); +extern int e820_all_mapped(unsigned long start, unsigned long end, unsigned type); + +extern void e820_bootmem_free(pg_data_t *pgdat, unsigned long start,unsigned long end); +extern void e820_setup_gap(void); +extern unsigned long e820_hole_size(unsigned long start_pfn, + unsigned long end_pfn); + +extern void __init parse_memopt(char *p, char **end); +extern void __init parse_memmapopt(char *p, char **end); + +extern struct e820map e820; + +extern unsigned ebda_addr, ebda_size; +#endif/*!__ASSEMBLY__*/ + +#endif/*__E820_HEADER*/ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/edac.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/edac.h new file mode 100644 index 0000000..cad1cd4 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/edac.h @@ -0,0 +1,18 @@ +#ifndef ASM_EDAC_H +#define ASM_EDAC_H + +/* ECC atomic, DMA, SMP and interrupt safe scrub function */ + +static __inline__ void atomic_scrub(void *va, u32 size) +{ + unsigned int *virt_addr = va; + u32 i; + + for (i = 0; i < size / 4; i++, virt_addr++) + /* Very carefully read and write to memory atomically + * so we are interrupt, DMA and SMP safe. + */ + __asm__ __volatile__("lock; addl $0, %0"::"m"(*virt_addr)); +} + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/elf.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/elf.h new file mode 100644 index 0000000..67eff98 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/elf.h @@ -0,0 +1,171 @@ +#ifndef __ASM_X86_64_ELF_H +#define __ASM_X86_64_ELF_H + +/* + * ELF register definitions.. + */ + +#include +#include + +/* x86-64 relocation types */ +#define R_X86_64_NONE 0 /* No reloc */ +#define R_X86_64_64 1 /* Direct 64 bit */ +#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ +#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ +#define R_X86_64_PLT32 4 /* 32 bit PLT address */ +#define R_X86_64_COPY 5 /* Copy symbol at runtime */ +#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ +#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ +#define R_X86_64_RELATIVE 8 /* Adjust by program base */ +#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative + offset to GOT */ +#define R_X86_64_32 10 /* Direct 32 bit zero extended */ +#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ +#define R_X86_64_16 12 /* Direct 16 bit zero extended */ +#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ +#define R_X86_64_8 14 /* Direct 8 bit sign extended */ +#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ + +#define R_X86_64_NUM 16 + +typedef unsigned long elf_greg_t; + +#define ELF_NGREG (sizeof (struct user_regs_struct) / sizeof(elf_greg_t)) +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +typedef struct user_i387_struct elf_fpregset_t; + +/* + * These are used to set parameters in the core dumps. + */ +#define ELF_CLASS ELFCLASS64 +#define ELF_DATA ELFDATA2LSB +#define ELF_ARCH EM_X86_64 + +#ifdef __KERNEL__ +#include +#include + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x) \ + ((x)->e_machine == EM_X86_64) + + +/* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program starts %edx + contains a pointer to a function which might be registered using `atexit'. + This provides a mean for the dynamic linker to call DT_FINI functions for + shared libraries that have been loaded before the code runs. + + A value of 0 tells we have no such handler. + + We might as well make sure everything else is cleared too (except for %esp), + just to make things more deterministic. + */ +#define ELF_PLAT_INIT(_r, load_addr) do { \ + struct task_struct *cur = current; \ + (_r)->rbx = 0; (_r)->rcx = 0; (_r)->rdx = 0; \ + (_r)->rsi = 0; (_r)->rdi = 0; (_r)->rbp = 0; \ + (_r)->rax = 0; \ + (_r)->r8 = 0; \ + (_r)->r9 = 0; \ + (_r)->r10 = 0; \ + (_r)->r11 = 0; \ + (_r)->r12 = 0; \ + (_r)->r13 = 0; \ + (_r)->r14 = 0; \ + (_r)->r15 = 0; \ + cur->thread.fs = 0; cur->thread.gs = 0; \ + cur->thread.fsindex = 0; cur->thread.gsindex = 0; \ + cur->thread.ds = 0; cur->thread.es = 0; \ + clear_thread_flag(TIF_IA32); \ +} while (0) + +#define USE_ELF_CORE_DUMP +#define ELF_EXEC_PAGESIZE 4096 + +/* This is the location that an ET_DYN program is loaded if exec'ed. Typical + use of this is to invoke "./ld.so someprog" to test out a new version of + the loader. We need to make sure that it is out of the way of the program + that it will "exec", and that there is sufficient room for the brk. */ + +#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) + +/* regs is struct pt_regs, pr_reg is elf_gregset_t (which is + now struct_user_regs, they are different). Assumes current is the process + getting dumped. */ + +#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \ + unsigned v; \ + (pr_reg)[0] = (regs)->r15; \ + (pr_reg)[1] = (regs)->r14; \ + (pr_reg)[2] = (regs)->r13; \ + (pr_reg)[3] = (regs)->r12; \ + (pr_reg)[4] = (regs)->rbp; \ + (pr_reg)[5] = (regs)->rbx; \ + (pr_reg)[6] = (regs)->r11; \ + (pr_reg)[7] = (regs)->r10; \ + (pr_reg)[8] = (regs)->r9; \ + (pr_reg)[9] = (regs)->r8; \ + (pr_reg)[10] = (regs)->rax; \ + (pr_reg)[11] = (regs)->rcx; \ + (pr_reg)[12] = (regs)->rdx; \ + (pr_reg)[13] = (regs)->rsi; \ + (pr_reg)[14] = (regs)->rdi; \ + (pr_reg)[15] = (regs)->orig_rax; \ + (pr_reg)[16] = (regs)->rip; \ + (pr_reg)[17] = (regs)->cs; \ + (pr_reg)[18] = (regs)->eflags; \ + (pr_reg)[19] = (regs)->rsp; \ + (pr_reg)[20] = (regs)->ss; \ + (pr_reg)[21] = current->thread.fs; \ + (pr_reg)[22] = current->thread.gs; \ + asm("movl %%ds,%0" : "=r" (v)); (pr_reg)[23] = v; \ + asm("movl %%es,%0" : "=r" (v)); (pr_reg)[24] = v; \ + asm("movl %%fs,%0" : "=r" (v)); (pr_reg)[25] = v; \ + asm("movl %%gs,%0" : "=r" (v)); (pr_reg)[26] = v; \ +} while(0); + +/* This yields a mask that user programs can use to figure out what + instruction set this CPU supports. This could be done in user space, + but it's not easy, and we've already done it here. */ + +#define ELF_HWCAP (boot_cpu_data.x86_capability[0]) + +/* This yields a string that ld.so will use to load implementation + specific libraries for optimization. This is more specific in + intent than poking at uname or /proc/cpuinfo. + + For the moment, we have only optimizations for the Intel generations, + but that could change... */ + +/* I'm not sure if we can use '-' here */ +#define ELF_PLATFORM ("x86_64") + +extern void set_personality_64bit(void); +#define SET_PERSONALITY(ex, ibcs2) set_personality_64bit() +/* + * An executable for which elf_read_implies_exec() returns TRUE will + * have the READ_IMPLIES_EXEC personality flag set automatically. + */ +#define elf_read_implies_exec(ex, executable_stack) (executable_stack != EXSTACK_DISABLE_X) + +struct task_struct; + +extern int dump_task_regs (struct task_struct *, elf_gregset_t *); +extern int dump_task_fpu (struct task_struct *, elf_fpregset_t *); + +#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) +#define ELF_CORE_COPY_FPREGS(tsk, elf_fpregs) dump_task_fpu(tsk, elf_fpregs) + +/* 1GB for 64bit, 8MB for 32bit */ +#define STACK_RND_MASK (test_thread_flag(TIF_IA32) ? 0x7ff : 0x3fffff) + +#endif + +#define __HAVE_ARCH_RANDOMIZE_BRK +extern void randomize_brk(unsigned long old_brk); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/emergency-restart.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/emergency-restart.h new file mode 100644 index 0000000..680c395 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/emergency-restart.h @@ -0,0 +1,6 @@ +#ifndef _ASM_EMERGENCY_RESTART_H +#define _ASM_EMERGENCY_RESTART_H + +extern void machine_emergency_restart(void); + +#endif /* _ASM_EMERGENCY_RESTART_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/errno.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/errno.h new file mode 100644 index 0000000..3111821 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/errno.h @@ -0,0 +1,6 @@ +#ifndef _X8664_ERRNO_H +#define _X8664_ERRNO_H + +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fcntl.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fcntl.h new file mode 100644 index 0000000..46ab12d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fcntl.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fixmap.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fixmap.h new file mode 100644 index 0000000..0b4ffbd --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fixmap.h @@ -0,0 +1,95 @@ +/* + * fixmap.h: compile-time virtual memory allocation + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1998 Ingo Molnar + */ + +#ifndef _ASM_FIXMAP_H +#define _ASM_FIXMAP_H + +#include +#include +#include +#include +#include + +/* + * Here we define all the compile-time 'special' virtual + * addresses. The point is to have a constant address at + * compile time, but to set the physical address only + * in the boot process. + * + * these 'compile-time allocated' memory buffers are + * fixed-size 4k pages. (or larger if used with an increment + * highger than 1) use fixmap_set(idx,phys) to associate + * physical memory with fixmap indices. + * + * TLB entries of such buffers will not be flushed across + * task switches. + */ + +enum fixed_addresses { + VSYSCALL_LAST_PAGE, + VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1, + VSYSCALL_HPET, + FIX_HPET_BASE, +#ifdef CONFIG_X86_LOCAL_APIC + FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ +#endif +#ifdef CONFIG_X86_IO_APIC + FIX_IO_APIC_BASE_0, + FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1, +#endif + __end_of_fixed_addresses +}; + +extern void __set_fixmap (enum fixed_addresses idx, + unsigned long phys, pgprot_t flags); + +#define set_fixmap(idx, phys) \ + __set_fixmap(idx, phys, PAGE_KERNEL) +/* + * Some hardware wants to get fixmapped without caching. + */ +#define set_fixmap_nocache(idx, phys) \ + __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE) + +#define FIXADDR_TOP (VSYSCALL_END-PAGE_SIZE) +#define FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) +#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) + +/* Only covers 32bit vsyscalls currently. Need another set for 64bit. */ +#define FIXADDR_USER_START ((unsigned long)VSYSCALL32_VSYSCALL) +#define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE) + +#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) + +extern void __this_fixmap_does_not_exist(void); + +/* + * 'index to address' translation. If anyone tries to use the idx + * directly without translation, we catch the bug with a NULL-deference + * kernel oops. Illegal ranges of incoming indices are caught too. + */ +static __always_inline unsigned long fix_to_virt(const unsigned int idx) +{ + /* + * this branch gets completely eliminated after inlining, + * except when someone tries to use fixaddr indices in an + * illegal way. (such as mixing up address types or using + * out-of-range indices). + * + * If it doesn't get removed, the linker will complain + * loudly with a reasonably clear error message.. + */ + if (idx >= __end_of_fixed_addresses) + __this_fixmap_does_not_exist(); + + return __fix_to_virt(idx); +} + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/floppy.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/floppy.h new file mode 100644 index 0000000..32ff5d1 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/floppy.h @@ -0,0 +1,283 @@ +/* + * Architecture specific parts of the Floppy driver + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1995 + */ +#ifndef __ASM_X86_64_FLOPPY_H +#define __ASM_X86_64_FLOPPY_H + +#include + + +/* + * The DMA channel used by the floppy controller cannot access data at + * addresses >= 16MB + * + * Went back to the 1MB limit, as some people had problems with the floppy + * driver otherwise. It doesn't matter much for performance anyway, as most + * floppy accesses go through the track buffer. + */ +#define _CROSS_64KB(a,s,vdma) \ +(!(vdma) && ((unsigned long)(a)/K_64 != ((unsigned long)(a) + (s) - 1) / K_64)) + +#define CROSS_64KB(a,s) _CROSS_64KB(a,s,use_virtual_dma & 1) + + +#define SW fd_routine[use_virtual_dma&1] +#define CSW fd_routine[can_use_virtual_dma & 1] + + +#define fd_inb(port) inb_p(port) +#define fd_outb(value,port) outb_p(value,port) + +#define fd_request_dma() CSW._request_dma(FLOPPY_DMA,"floppy") +#define fd_free_dma() CSW._free_dma(FLOPPY_DMA) +#define fd_enable_irq() enable_irq(FLOPPY_IRQ) +#define fd_disable_irq() disable_irq(FLOPPY_IRQ) +#define fd_free_irq() free_irq(FLOPPY_IRQ, NULL) +#define fd_get_dma_residue() SW._get_dma_residue(FLOPPY_DMA) +#define fd_dma_mem_alloc(size) SW._dma_mem_alloc(size) +#define fd_dma_setup(addr, size, mode, io) SW._dma_setup(addr, size, mode, io) + +#define FLOPPY_CAN_FALLBACK_ON_NODMA + +static int virtual_dma_count; +static int virtual_dma_residue; +static char *virtual_dma_addr; +static int virtual_dma_mode; +static int doing_pdma; + +static irqreturn_t floppy_hardint(int irq, void *dev_id, struct pt_regs * regs) +{ + register unsigned char st; + +#undef TRACE_FLPY_INT + +#ifdef TRACE_FLPY_INT + static int calls=0; + static int bytes=0; + static int dma_wait=0; +#endif + if (!doing_pdma) + return floppy_interrupt(irq, dev_id, regs); + +#ifdef TRACE_FLPY_INT + if(!calls) + bytes = virtual_dma_count; +#endif + + { + register int lcount; + register char *lptr; + + st = 1; + for(lcount=virtual_dma_count, lptr=virtual_dma_addr; + lcount; lcount--, lptr++) { + st=inb(virtual_dma_port+4) & 0xa0 ; + if(st != 0xa0) + break; + if(virtual_dma_mode) + outb_p(*lptr, virtual_dma_port+5); + else + *lptr = inb_p(virtual_dma_port+5); + } + virtual_dma_count = lcount; + virtual_dma_addr = lptr; + st = inb(virtual_dma_port+4); + } + +#ifdef TRACE_FLPY_INT + calls++; +#endif + if(st == 0x20) + return IRQ_HANDLED; + if(!(st & 0x20)) { + virtual_dma_residue += virtual_dma_count; + virtual_dma_count=0; +#ifdef TRACE_FLPY_INT + printk("count=%x, residue=%x calls=%d bytes=%d dma_wait=%d\n", + virtual_dma_count, virtual_dma_residue, calls, bytes, + dma_wait); + calls = 0; + dma_wait=0; +#endif + doing_pdma = 0; + floppy_interrupt(irq, dev_id, regs); + return IRQ_HANDLED; + } +#ifdef TRACE_FLPY_INT + if(!virtual_dma_count) + dma_wait++; +#endif + return IRQ_HANDLED; +} + +static void fd_disable_dma(void) +{ + if(! (can_use_virtual_dma & 1)) + disable_dma(FLOPPY_DMA); + doing_pdma = 0; + virtual_dma_residue += virtual_dma_count; + virtual_dma_count=0; +} + +static int vdma_request_dma(unsigned int dmanr, const char * device_id) +{ + return 0; +} + +static void vdma_nop(unsigned int dummy) +{ +} + + +static int vdma_get_dma_residue(unsigned int dummy) +{ + return virtual_dma_count + virtual_dma_residue; +} + + +static int fd_request_irq(void) +{ + if(can_use_virtual_dma) + return request_irq(FLOPPY_IRQ, floppy_hardint, + IRQF_DISABLED, "floppy", NULL); + else + return request_irq(FLOPPY_IRQ, floppy_interrupt, + IRQF_DISABLED, "floppy", NULL); +} + +static unsigned long dma_mem_alloc(unsigned long size) +{ + return __get_dma_pages(GFP_KERNEL|__GFP_NORETRY,get_order(size)); +} + + +static unsigned long vdma_mem_alloc(unsigned long size) +{ + return (unsigned long) vmalloc(size); + +} + +#define nodma_mem_alloc(size) vdma_mem_alloc(size) + +static void _fd_dma_mem_free(unsigned long addr, unsigned long size) +{ + if((unsigned long) addr >= (unsigned long) high_memory) + vfree((void *)addr); + else + free_pages(addr, get_order(size)); +} + +#define fd_dma_mem_free(addr, size) _fd_dma_mem_free(addr, size) + +static void _fd_chose_dma_mode(char *addr, unsigned long size) +{ + if(can_use_virtual_dma == 2) { + if((unsigned long) addr >= (unsigned long) high_memory || + isa_virt_to_bus(addr) >= 0x1000000 || + _CROSS_64KB(addr, size, 0)) + use_virtual_dma = 1; + else + use_virtual_dma = 0; + } else { + use_virtual_dma = can_use_virtual_dma & 1; + } +} + +#define fd_chose_dma_mode(addr, size) _fd_chose_dma_mode(addr, size) + + +static int vdma_dma_setup(char *addr, unsigned long size, int mode, int io) +{ + doing_pdma = 1; + virtual_dma_port = io; + virtual_dma_mode = (mode == DMA_MODE_WRITE); + virtual_dma_addr = addr; + virtual_dma_count = size; + virtual_dma_residue = 0; + return 0; +} + +static int hard_dma_setup(char *addr, unsigned long size, int mode, int io) +{ +#ifdef FLOPPY_SANITY_CHECK + if (CROSS_64KB(addr, size)) { + printk("DMA crossing 64-K boundary %p-%p\n", addr, addr+size); + return -1; + } +#endif + /* actual, physical DMA */ + doing_pdma = 0; + clear_dma_ff(FLOPPY_DMA); + set_dma_mode(FLOPPY_DMA,mode); + set_dma_addr(FLOPPY_DMA,isa_virt_to_bus(addr)); + set_dma_count(FLOPPY_DMA,size); + enable_dma(FLOPPY_DMA); + return 0; +} + +static struct fd_routine_l { + int (*_request_dma)(unsigned int dmanr, const char * device_id); + void (*_free_dma)(unsigned int dmanr); + int (*_get_dma_residue)(unsigned int dummy); + unsigned long (*_dma_mem_alloc) (unsigned long size); + int (*_dma_setup)(char *addr, unsigned long size, int mode, int io); +} fd_routine[] = { + { + request_dma, + free_dma, + get_dma_residue, + dma_mem_alloc, + hard_dma_setup + }, + { + vdma_request_dma, + vdma_nop, + vdma_get_dma_residue, + vdma_mem_alloc, + vdma_dma_setup + } +}; + + +static int FDC1 = 0x3f0; +static int FDC2 = -1; + +/* + * Floppy types are stored in the rtc's CMOS RAM and so rtc_lock + * is needed to prevent corrupted CMOS RAM in case "insmod floppy" + * coincides with another rtc CMOS user. Paul G. + */ +#define FLOPPY0_TYPE ({ \ + unsigned long flags; \ + unsigned char val; \ + spin_lock_irqsave(&rtc_lock, flags); \ + val = (CMOS_READ(0x10) >> 4) & 15; \ + spin_unlock_irqrestore(&rtc_lock, flags); \ + val; \ +}) + +#define FLOPPY1_TYPE ({ \ + unsigned long flags; \ + unsigned char val; \ + spin_lock_irqsave(&rtc_lock, flags); \ + val = CMOS_READ(0x10) & 15; \ + spin_unlock_irqrestore(&rtc_lock, flags); \ + val; \ +}) + +#define N_FDC 2 +#define N_DRIVE 8 + +#define FLOPPY_MOTOR_MASK 0xf0 + +#define AUTO_DMA + +#define EXTRA_FLOPPY_PARAMS + +#endif /* __ASM_X86_64_FLOPPY_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fpu32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fpu32.h new file mode 100644 index 0000000..dce9f6f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/fpu32.h @@ -0,0 +1,13 @@ +#ifndef _FPU32_H +#define _FPU32_H 1 + +struct _fpstate_ia32; + +int restore_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 __user *buf, int fsave); +int save_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 __user *buf, + struct pt_regs *regs, int fsave); + +int get_fpregs32(struct user_i387_ia32_struct *, struct task_struct *); +int set_fpregs32(struct task_struct *, const struct user_i387_ia32_struct *); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/futex.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/futex.h new file mode 100644 index 0000000..9804bf0 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/futex.h @@ -0,0 +1,125 @@ +#ifndef _ASM_FUTEX_H +#define _ASM_FUTEX_H + +#ifdef __KERNEL__ + +#include +#include +#include +#include + +#define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \ + __asm__ __volatile ( \ +"1: " insn "\n" \ +"2: .section .fixup,\"ax\"\n\ +3: mov %3, %1\n\ + jmp 2b\n\ + .previous\n\ + .section __ex_table,\"a\"\n\ + .align 8\n\ + .quad 1b,3b\n\ + .previous" \ + : "=r" (oldval), "=r" (ret), "=m" (*uaddr) \ + : "i" (-EFAULT), "m" (*uaddr), "0" (oparg), "1" (0)) + +#define __futex_atomic_op2(insn, ret, oldval, uaddr, oparg) \ + __asm__ __volatile ( \ +"1: movl %2, %0\n\ + movl %0, %3\n" \ + insn "\n" \ +"2: " LOCK_PREFIX "cmpxchgl %3, %2\n\ + jnz 1b\n\ +3: .section .fixup,\"ax\"\n\ +4: mov %5, %1\n\ + jmp 3b\n\ + .previous\n\ + .section __ex_table,\"a\"\n\ + .align 8\n\ + .quad 1b,4b,2b,4b\n\ + .previous" \ + : "=&a" (oldval), "=&r" (ret), "=m" (*uaddr), \ + "=&r" (tem) \ + : "r" (oparg), "i" (-EFAULT), "m" (*uaddr), "1" (0)) + +static inline int +futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +{ + int op = (encoded_op >> 28) & 7; + int cmp = (encoded_op >> 24) & 15; + int oparg = (encoded_op << 8) >> 20; + int cmparg = (encoded_op << 20) >> 20; + int oldval = 0, ret, tem; + if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) + oparg = 1 << oparg; + + if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) + return -EFAULT; + + inc_preempt_count(); + + switch (op) { + case FUTEX_OP_SET: + __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_ADD: + __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval, + uaddr, oparg); + break; + case FUTEX_OP_OR: + __futex_atomic_op2("orl %4, %3", ret, oldval, uaddr, oparg); + break; + case FUTEX_OP_ANDN: + __futex_atomic_op2("andl %4, %3", ret, oldval, uaddr, ~oparg); + break; + case FUTEX_OP_XOR: + __futex_atomic_op2("xorl %4, %3", ret, oldval, uaddr, oparg); + break; + default: + ret = -ENOSYS; + } + + dec_preempt_count(); + + if (!ret) { + switch (cmp) { + case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; + case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; + case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; + case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; + case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; + case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; + default: ret = -ENOSYS; + } + } + return ret; +} + +static inline int +futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +{ + if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) + return -EFAULT; + + __asm__ __volatile__( + "1: " LOCK_PREFIX "cmpxchgl %3, %1 \n" + + "2: .section .fixup, \"ax\" \n" + "3: mov %2, %0 \n" + " jmp 2b \n" + " .previous \n" + + " .section __ex_table, \"a\" \n" + " .align 8 \n" + " .quad 1b,3b \n" + " .previous \n" + + : "=a" (oldval), "=m" (*uaddr) + : "i" (-EFAULT), "r" (newval), "0" (oldval) + : "memory" + ); + + return oldval; +} + +#endif +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/genapic.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/genapic.h new file mode 100644 index 0000000..50b38e7 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/genapic.h @@ -0,0 +1,35 @@ +#ifndef _ASM_GENAPIC_H +#define _ASM_GENAPIC_H 1 + +/* + * Copyright 2004 James Cleverdon, IBM. + * Subject to the GNU Public License, v.2 + * + * Generic APIC sub-arch data struct. + * + * Hacked for x86-64 by James Cleverdon from i386 architecture code by + * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and + * James Cleverdon. + */ + +struct genapic { + char *name; + u32 int_delivery_mode; + u32 int_dest_mode; + u32 int_delivery_dest; /* for quick IPIs */ + int (*apic_id_registered)(void); + cpumask_t (*target_cpus)(void); + void (*init_apic_ldr)(void); + /* ipi */ + void (*send_IPI_mask)(cpumask_t mask, int vector); + void (*send_IPI_allbutself)(int vector); + void (*send_IPI_all)(int vector); + /* */ + unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask); + unsigned int (*phys_pkg_id)(int index_msb); +}; + + +extern struct genapic *genapic; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hardirq.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hardirq.h new file mode 100644 index 0000000..64a65ce --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hardirq.h @@ -0,0 +1,20 @@ +#ifndef __ASM_HARDIRQ_H +#define __ASM_HARDIRQ_H + +#include +#include +#include +#include + +#define __ARCH_IRQ_STAT 1 + +#define local_softirq_pending() read_pda(__softirq_pending) + +#define __ARCH_SET_SOFTIRQ_PENDING 1 + +#define set_softirq_pending(x) write_pda(__softirq_pending, (x)) +#define or_softirq_pending(x) or_pda(__softirq_pending, (x)) + +extern void ack_bad_irq(unsigned int irq); + +#endif /* __ASM_HARDIRQ_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hdreg.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hdreg.h new file mode 100644 index 0000000..5989bbc --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hdreg.h @@ -0,0 +1 @@ +#warning this file is obsolete, please do not use it diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hpet.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hpet.h new file mode 100644 index 0000000..b390984 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hpet.h @@ -0,0 +1,71 @@ +#ifndef _ASM_X8664_HPET_H +#define _ASM_X8664_HPET_H 1 + +/* + * Documentation on HPET can be found at: + * http://www.intel.com/ial/home/sp/pcmmspec.htm + * ftp://download.intel.com/ial/home/sp/mmts098.pdf + */ + +#define HPET_MMAP_SIZE 1024 + +#define HPET_ID 0x000 +#define HPET_PERIOD 0x004 +#define HPET_CFG 0x010 +#define HPET_STATUS 0x020 +#define HPET_COUNTER 0x0f0 +#define HPET_Tn_OFFSET 0x20 +#define HPET_Tn_CFG(n) (0x100 + (n) * HPET_Tn_OFFSET) +#define HPET_Tn_ROUTE(n) (0x104 + (n) * HPET_Tn_OFFSET) +#define HPET_Tn_CMP(n) (0x108 + (n) * HPET_Tn_OFFSET) +#define HPET_T0_CFG HPET_Tn_CFG(0) +#define HPET_T0_CMP HPET_Tn_CMP(0) +#define HPET_T1_CFG HPET_Tn_CFG(1) +#define HPET_T1_CMP HPET_Tn_CMP(1) + +#define HPET_ID_VENDOR 0xffff0000 +#define HPET_ID_LEGSUP 0x00008000 +#define HPET_ID_64BIT 0x00002000 +#define HPET_ID_NUMBER 0x00001f00 +#define HPET_ID_REV 0x000000ff +#define HPET_ID_NUMBER_SHIFT 8 + +#define HPET_ID_VENDOR_SHIFT 16 +#define HPET_ID_VENDOR_8086 0x8086 + +#define HPET_CFG_ENABLE 0x001 +#define HPET_CFG_LEGACY 0x002 +#define HPET_LEGACY_8254 2 +#define HPET_LEGACY_RTC 8 + +#define HPET_TN_LEVEL 0x0002 +#define HPET_TN_ENABLE 0x0004 +#define HPET_TN_PERIODIC 0x0008 +#define HPET_TN_PERIODIC_CAP 0x0010 +#define HPET_TN_64BIT_CAP 0x0020 +#define HPET_TN_SETVAL 0x0040 +#define HPET_TN_32BIT 0x0100 +#define HPET_TN_ROUTE 0x3e00 +#define HPET_TN_FSB 0x4000 +#define HPET_TN_FSB_CAP 0x8000 + +#define HPET_TN_ROUTE_SHIFT 9 + +#define HPET_TICK_RATE (HZ * 100000UL) + +extern int is_hpet_enabled(void); +extern int hpet_rtc_timer_init(void); +extern int apic_is_clustered_box(void); + +extern int hpet_use_timer; + +#ifdef CONFIG_HPET_EMULATE_RTC +extern int hpet_mask_rtc_irq_bit(unsigned long bit_mask); +extern int hpet_set_rtc_irq_bit(unsigned long bit_mask); +extern int hpet_set_alarm_time(unsigned char hrs, unsigned char min, unsigned char sec); +extern int hpet_set_periodic_freq(unsigned long freq); +extern int hpet_rtc_dropped_irq(void); +extern int hpet_rtc_timer_init(void); +#endif /* CONFIG_HPET_EMULATE_RTC */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hw_irq.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hw_irq.h new file mode 100644 index 0000000..5ff1ee3 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/hw_irq.h @@ -0,0 +1,135 @@ +#ifndef _ASM_HW_IRQ_H +#define _ASM_HW_IRQ_H + +/* + * linux/include/asm/hw_irq.h + * + * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar + * + * moved some of the old arch/i386/kernel/irq.h to here. VY + * + * IRQ/IPI changes taken from work by Thomas Radke + * + * + * hacked by Andi Kleen for x86-64. + */ + +#ifndef __ASSEMBLY__ +#include +#include +#include +#include + +struct hw_interrupt_type; +#endif + +#define NMI_VECTOR 0x02 +/* + * IDT vectors usable for external interrupt sources start + * at 0x20: + */ +#define FIRST_EXTERNAL_VECTOR 0x20 + +#define IA32_SYSCALL_VECTOR 0x80 + + +/* + * Vectors 0x20-0x2f are used for ISA interrupts. + */ + +/* + * Special IRQ vectors used by the SMP architecture, 0xf0-0xff + * + * some of the following vectors are 'rare', they are merged + * into a single vector (CALL_FUNCTION_VECTOR) to save vector space. + * TLB, reschedule and local APIC vectors are performance-critical. + */ +#define SPURIOUS_APIC_VECTOR 0xff +#define ERROR_APIC_VECTOR 0xfe +#define RESCHEDULE_VECTOR 0xfd +#define CALL_FUNCTION_VECTOR 0xfc +/* fb free - please don't readd KDB here because it's useless + (hint - think what a NMI bit does to a vector) */ +#define THERMAL_APIC_VECTOR 0xfa +#define THRESHOLD_APIC_VECTOR 0xf9 +/* f8 free */ +#define INVALIDATE_TLB_VECTOR_END 0xf7 +#define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ + +#define NUM_INVALIDATE_TLB_VECTORS 8 + +/* + * Local APIC timer IRQ vector is on a different priority level, + * to work around the 'lost local interrupt if more than 2 IRQ + * sources per level' errata. + */ +#define LOCAL_TIMER_VECTOR 0xef + +/* + * First APIC vector available to drivers: (vectors 0x30-0xee) + * we start at 0x31 to spread out vectors evenly between priority + * levels. (0x80 is the syscall vector) + */ +#define FIRST_DEVICE_VECTOR 0x31 +/* duplicated in irq.h */ +#define FIRST_SYSTEM_VECTOR 0xef + + +#ifndef __ASSEMBLY__ +extern u8 irq_vector[NR_IRQ_VECTORS]; +#define IO_APIC_VECTOR(irq) (irq_vector[irq]) +#define AUTO_ASSIGN -1 + +/* + * Various low-level irq details needed by irq.c, process.c, + * time.c, io_apic.c and smp.c + * + * Interrupt entry/exit code at both C and assembly level + */ + +extern void disable_8259A_irq(unsigned int irq); +extern void enable_8259A_irq(unsigned int irq); +extern int i8259A_irq_pending(unsigned int irq); +extern void make_8259A_irq(unsigned int irq); +extern void init_8259A(int aeoi); +extern void FASTCALL(send_IPI_self(int vector)); +extern void init_VISWS_APIC_irqs(void); +extern void setup_IO_APIC(void); +extern void disable_IO_APIC(void); +extern void print_IO_APIC(void); +extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); +extern void send_IPI(int dest, int vector); +extern void setup_ioapic_dest(void); + +extern unsigned long io_apic_irqs; + +extern atomic_t irq_err_count; +extern atomic_t irq_mis_count; + +#define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) + +#define __STR(x) #x +#define STR(x) __STR(x) + +#include + +#define IRQ_NAME2(nr) nr##_interrupt(void) +#define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) + +/* + * SMP has a few special interrupts for IPI messages + */ + +#define BUILD_IRQ(nr) \ +asmlinkage void IRQ_NAME(nr); \ +__asm__( \ +"\n.p2align\n" \ +"IRQ" #nr "_interrupt:\n\t" \ + "push $~(" #nr ") ; " \ + "jmp common_interrupt"); + +#define platform_legacy_irq(irq) ((irq) < 16) + +#endif + +#endif /* _ASM_HW_IRQ_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/i387.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/i387.h new file mode 100644 index 0000000..592c261 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/i387.h @@ -0,0 +1,210 @@ +/* + * include/asm-x86_64/i387.h + * + * Copyright (C) 1994 Linus Torvalds + * + * Pentium III FXSR, SSE support + * General FPU state handling cleanups + * Gareth Hughes , May 2000 + * x86-64 work by Andi Kleen 2002 + */ + +#ifndef __ASM_X86_64_I387_H +#define __ASM_X86_64_I387_H + +#include +#include +#include +#include +#include +#include + +#if !defined(__VMKLNX__) + +extern void fpu_init(void); +extern unsigned int mxcsr_feature_mask; +extern void mxcsr_feature_mask_init(void); +extern void init_fpu(struct task_struct *child); +extern int save_i387(struct _fpstate __user *buf); + +/* + * FPU lazy state save handling... + */ + +#define unlazy_fpu(tsk) do { \ + if (task_thread_info(tsk)->status & TS_USEDFPU) \ + save_init_fpu(tsk); \ +} while (0) + +/* Ignore delayed exceptions from user space */ +static inline void tolerant_fwait(void) +{ + asm volatile("1: fwait\n" + "2:\n" + " .section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 1b,2b\n" + " .previous\n"); +} + +#define clear_fpu(tsk) do { \ + if (task_thread_info(tsk)->status & TS_USEDFPU) { \ + tolerant_fwait(); \ + task_thread_info(tsk)->status &= ~TS_USEDFPU; \ + stts(); \ + } \ +} while (0) + +/* + * ptrace request handers... + */ +extern int get_fpregs(struct user_i387_struct __user *buf, + struct task_struct *tsk); +extern int set_fpregs(struct task_struct *tsk, + struct user_i387_struct __user *buf); + +/* + * i387 state interaction + */ +#define get_fpu_mxcsr(t) ((t)->thread.i387.fxsave.mxcsr) +#define get_fpu_cwd(t) ((t)->thread.i387.fxsave.cwd) +#define get_fpu_fxsr_twd(t) ((t)->thread.i387.fxsave.twd) +#define get_fpu_swd(t) ((t)->thread.i387.fxsave.swd) +#define set_fpu_cwd(t,val) ((t)->thread.i387.fxsave.cwd = (val)) +#define set_fpu_swd(t,val) ((t)->thread.i387.fxsave.swd = (val)) +#define set_fpu_fxsr_twd(t,val) ((t)->thread.i387.fxsave.twd = (val)) + +#define X87_FSW_ES (1 << 7) /* Exception Summary */ + +/* AMD CPUs don't save/restore FDP/FIP/FOP unless an exception + is pending. Clear the x87 state here by setting it to fixed + values. The kernel data segment can be sometimes 0 and sometimes + new user value. Both should be ok. + Use the PDA as safe address because it should be already in L1. */ +static inline void clear_fpu_state(struct i387_fxsave_struct *fx) +{ + if (unlikely(fx->swd & X87_FSW_ES)) + asm volatile("fnclex"); + alternative_input(ASM_NOP8 ASM_NOP2, + " emms\n" /* clear stack tags */ + " fildl %%gs:0", /* load to clear state */ + X86_FEATURE_FXSAVE_LEAK); +} + +static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) +{ + int err; + + asm volatile("1: rex64/fxrstor (%[fx])\n\t" + "2:\n" + ".section .fixup,\"ax\"\n" + "3: movl $-1,%[err]\n" + " jmp 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 1b,3b\n" + ".previous" + : [err] "=r" (err) +#if 0 /* See comment in __fxsave_clear() below. */ + : [fx] "r" (fx), "m" (*fx), "0" (0)); +#else + : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); +#endif + if (unlikely(err)) + init_fpu(current); + return err; +} + +static inline int save_i387_checking(struct i387_fxsave_struct __user *fx) +{ + int err; + + asm volatile("1: rex64/fxsave (%[fx])\n\t" + "2:\n" + ".section .fixup,\"ax\"\n" + "3: movl $-1,%[err]\n" + " jmp 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 1b,3b\n" + ".previous" + : [err] "=r" (err), "=m" (*fx) +#if 0 /* See comment in __fxsave_clear() below. */ + : [fx] "r" (fx), "0" (0)); +#else + : [fx] "cdaSDb" (fx), "0" (0)); +#endif + if (unlikely(err)) + __clear_user(fx, sizeof(struct i387_fxsave_struct)); + /* No need to clear here because the caller clears USED_MATH */ + return err; +} + +static inline void __fxsave_clear(struct task_struct *tsk) +{ + /* Using "rex64; fxsave %0" is broken because, if the memory operand + uses any extended registers for addressing, a second REX prefix + will be generated (to the assembler, rex64 followed by semicolon + is a separate instruction), and hence the 64-bitness is lost. */ +#if 0 + /* Using "fxsaveq %0" would be the ideal choice, but is only supported + starting with gas 2.16. */ + __asm__ __volatile__("fxsaveq %0" + : "=m" (tsk->thread.i387.fxsave)); +#elif 0 + /* Using, as a workaround, the properly prefixed form below isn't + accepted by any binutils version so far released, complaining that + the same type of prefix is used twice if an extended register is + needed for addressing (fix submitted to mainline 2005-11-21). */ + __asm__ __volatile__("rex64/fxsave %0" + : "=m" (tsk->thread.i387.fxsave)); +#else + /* This, however, we can work around by forcing the compiler to select + an addressing mode that doesn't require extended registers. */ + __asm__ __volatile__("rex64/fxsave %P2(%1)" + : "=m" (tsk->thread.i387.fxsave) + : "cdaSDb" (tsk), + "i" (offsetof(__typeof__(*tsk), + thread.i387.fxsave))); +#endif + clear_fpu_state(&tsk->thread.i387.fxsave); +} + +static inline void kernel_fpu_begin(void) +{ + struct thread_info *me = current_thread_info(); + preempt_disable(); + if (me->status & TS_USEDFPU) { + __fxsave_clear(me->task); + me->status &= ~TS_USEDFPU; + return; + } + clts(); +} + +static inline void kernel_fpu_end(void) +{ + stts(); + preempt_enable(); +} + +static inline void save_init_fpu(struct task_struct *tsk) +{ + __fxsave_clear(tsk); + task_thread_info(tsk)->status &= ~TS_USEDFPU; + stts(); +} + +/* + * This restores directly out of user space. Exceptions are handled. + */ +static inline int restore_i387(struct _fpstate __user *buf) +{ + return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); +} + +#endif /* !defined(_VMKLNX__) */ + +#endif /* __ASM_X86_64_I387_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32.h new file mode 100644 index 0000000..0190b7c --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32.h @@ -0,0 +1,178 @@ +#ifndef _ASM_X86_64_IA32_H +#define _ASM_X86_64_IA32_H + + +#ifdef CONFIG_IA32_EMULATION + +#include + +/* + * 32 bit structures for IA32 support. + */ + +#include + +/* signal.h */ +struct sigaction32 { + unsigned int sa_handler; /* Really a pointer, but need to deal + with 32 bits */ + unsigned int sa_flags; + unsigned int sa_restorer; /* Another 32 bit pointer */ + compat_sigset_t sa_mask; /* A 32 bit mask */ +}; + +struct old_sigaction32 { + unsigned int sa_handler; /* Really a pointer, but need to deal + with 32 bits */ + compat_old_sigset_t sa_mask; /* A 32 bit mask */ + unsigned int sa_flags; + unsigned int sa_restorer; /* Another 32 bit pointer */ +}; + +typedef struct sigaltstack_ia32 { + unsigned int ss_sp; + int ss_flags; + unsigned int ss_size; +} stack_ia32_t; + +struct ucontext_ia32 { + unsigned int uc_flags; + unsigned int uc_link; + stack_ia32_t uc_stack; + struct sigcontext_ia32 uc_mcontext; + compat_sigset_t uc_sigmask; /* mask last for extensibility */ +}; + +/* This matches struct stat64 in glibc2.2, hence the absolutely + * insane amounts of padding around dev_t's. + */ +struct stat64 { + unsigned long long st_dev; + unsigned char __pad0[4]; + +#define STAT64_HAS_BROKEN_ST_INO 1 + unsigned int __st_ino; + + unsigned int st_mode; + unsigned int st_nlink; + + unsigned int st_uid; + unsigned int st_gid; + + unsigned long long st_rdev; + unsigned char __pad3[4]; + + long long st_size; + unsigned int st_blksize; + + long long st_blocks;/* Number 512-byte blocks allocated. */ + + unsigned st_atime; + unsigned st_atime_nsec; + unsigned st_mtime; + unsigned st_mtime_nsec; + unsigned st_ctime; + unsigned st_ctime_nsec; + + unsigned long long st_ino; +} __attribute__((packed)); + +typedef struct compat_siginfo{ + int si_signo; + int si_errno; + int si_code; + + union { + int _pad[((128/sizeof(int)) - 3)]; + + /* kill() */ + struct { + unsigned int _pid; /* sender's pid */ + unsigned int _uid; /* sender's uid */ + } _kill; + + /* POSIX.1b timers */ + struct { + compat_timer_t _tid; /* timer id */ + int _overrun; /* overrun count */ + compat_sigval_t _sigval; /* same as below */ + int _sys_private; /* not to be passed to user */ + int _overrun_incr; /* amount to add to overrun */ + } _timer; + + /* POSIX.1b signals */ + struct { + unsigned int _pid; /* sender's pid */ + unsigned int _uid; /* sender's uid */ + compat_sigval_t _sigval; + } _rt; + + /* SIGCHLD */ + struct { + unsigned int _pid; /* which child */ + unsigned int _uid; /* sender's uid */ + int _status; /* exit code */ + compat_clock_t _utime; + compat_clock_t _stime; + } _sigchld; + + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ + struct { + unsigned int _addr; /* faulting insn/memory ref. */ + } _sigfault; + + /* SIGPOLL */ + struct { + int _band; /* POLL_IN, POLL_OUT, POLL_MSG */ + int _fd; + } _sigpoll; + } _sifields; +} compat_siginfo_t; + +struct sigframe32 +{ + u32 pretcode; + int sig; + struct sigcontext_ia32 sc; + struct _fpstate_ia32 fpstate; + unsigned int extramask[_COMPAT_NSIG_WORDS-1]; +}; + +struct rt_sigframe32 +{ + u32 pretcode; + int sig; + u32 pinfo; + u32 puc; + compat_siginfo_t info; + struct ucontext_ia32 uc; + struct _fpstate_ia32 fpstate; +}; + +struct ustat32 { + __u32 f_tfree; + compat_ino_t f_tinode; + char f_fname[6]; + char f_fpack[6]; +}; + +#define IA32_STACK_TOP IA32_PAGE_OFFSET + +#ifdef __KERNEL__ +struct user_desc; +struct siginfo_t; +int do_get_thread_area(struct thread_struct *t, struct user_desc __user *info); +int do_set_thread_area(struct thread_struct *t, struct user_desc __user *info); +int ia32_child_tls(struct task_struct *p, struct pt_regs *childregs); + +struct linux_binprm; +extern int ia32_setup_arg_pages(struct linux_binprm *bprm, + unsigned long stack_top, int exec_stack); +struct mm_struct; +extern void ia32_pick_mmap_layout(struct mm_struct *mm); + +#endif + +#endif /* !CONFIG_IA32_SUPPORT */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32_unistd.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32_unistd.h new file mode 100644 index 0000000..5b52ce5 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ia32_unistd.h @@ -0,0 +1,18 @@ +#ifndef _ASM_X86_64_IA32_UNISTD_H_ +#define _ASM_X86_64_IA32_UNISTD_H_ + +/* + * This file contains the system call numbers of the ia32 port, + * this is for the kernel only. + * Only add syscalls here where some part of the kernel needs to know + * the number. This should be otherwise in sync with asm-i386/unistd.h. -AK + */ + +#define __NR_ia32_restart_syscall 0 +#define __NR_ia32_exit 1 +#define __NR_ia32_read 3 +#define __NR_ia32_write 4 +#define __NR_ia32_sigreturn 119 +#define __NR_ia32_rt_sigreturn 173 + +#endif /* _ASM_X86_64_IA32_UNISTD_H_ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ide.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ide.h new file mode 100644 index 0000000..4cef0ef --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ide.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/idle.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/idle.h new file mode 100644 index 0000000..6bd47dc --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/idle.h @@ -0,0 +1,14 @@ +#ifndef _ASM_X86_64_IDLE_H +#define _ASM_X86_64_IDLE_H 1 + +#define IDLE_START 1 +#define IDLE_END 2 + +struct notifier_block; +void idle_notifier_register(struct notifier_block *n); +void idle_notifier_unregister(struct notifier_block *n); + +void enter_idle(void); +void exit_idle(void); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/intel_arch_perfmon.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/intel_arch_perfmon.h new file mode 100644 index 0000000..59c3964 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/intel_arch_perfmon.h @@ -0,0 +1,19 @@ +#ifndef X86_64_INTEL_ARCH_PERFMON_H +#define X86_64_INTEL_ARCH_PERFMON_H 1 + +#define MSR_ARCH_PERFMON_PERFCTR0 0xc1 +#define MSR_ARCH_PERFMON_PERFCTR1 0xc2 + +#define MSR_ARCH_PERFMON_EVENTSEL0 0x186 +#define MSR_ARCH_PERFMON_EVENTSEL1 0x187 + +#define ARCH_PERFMON_EVENTSEL0_ENABLE (1 << 22) +#define ARCH_PERFMON_EVENTSEL_INT (1 << 20) +#define ARCH_PERFMON_EVENTSEL_OS (1 << 17) +#define ARCH_PERFMON_EVENTSEL_USR (1 << 16) + +#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_SEL (0x3c) +#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_UMASK (0x00 << 8) +#define ARCH_PERFMON_UNHALTED_CORE_CYCLES_PRESENT (1 << 0) + +#endif /* X86_64_INTEL_ARCH_PERFMON_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io.h new file mode 100644 index 0000000..4156385 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io.h @@ -0,0 +1,693 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +#ifndef _ASM_IO_H +#define _ASM_IO_H + + +/* + * This file contains the definitions for the x86 IO instructions + * inb/inw/inl/outb/outw/outl and the "string versions" of the same + * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing" + * versions of the single-IO instructions (inb_p/inw_p/..). + * + * This file is not meant to be obfuscating: it's just complicated + * to (a) handle it all in a way that makes gcc able to optimize it + * as well as possible and (b) trying to avoid writing the same thing + * over and over again with slight variations and possibly making a + * mistake somewhere. + */ + +/* + * Thanks to James van Artsdalen for a better timing-fix than + * the two short jumps: using outb's to a nonexistent port seems + * to guarantee better timings even on fast machines. + * + * On the other hand, I'd like to be sure of a non-existent port: + * I feel a bit unsafe about using 0x80 (should be safe, though) + * + * Linus + */ + + /* + * Bit simplified and optimized by Jan Hubicka + * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999. + * + * isa_memset_io, isa_memcpy_fromio, isa_memcpy_toio added, + * isa_read[wl] and isa_write[wl] fixed + * - Arnaldo Carvalho de Melo + */ + +#define __SLOW_DOWN_IO "\noutb %%al,$0x80" + +#ifdef REALLY_SLOW_IO +#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO +#else +#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO +#endif + +/* + * In case of any code change below, make sure you + * go and update the corresponding documentation. + * The documentation file can be found at + * vmkdrivers/src26/doc/dummyDefs.doc + * + * outb + * outb_p + * outw + * outl + * outsw + */ + +/* + * Talk about misusing macros.. + */ +#define __OUT1(s,x) \ +static inline void out##s(unsigned x value, unsigned short port) { + +#if defined(__VMKLNX__) +#define __OUT2(s,s1,s2) \ +vmk_CPUEnsureClearDF(); \ +__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" +#else /* !defined(__VMKLNX__) */ +#define __OUT2(s,s1,s2) \ +__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1" +#endif /* defined(__VMKLNX__) */ + +#define __OUT(s,s1,x) \ +__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \ +__OUT1(s##_p,x) __OUT2(s,s1,"w") __FULL_SLOW_DOWN_IO : : "a" (value), "Nd" (port));} \ + +#define __IN1(s) \ +static inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v; + +#if defined(__VMKLNX__) +#define __IN2(s,s1,s2) \ +vmk_CPUEnsureClearDF(); \ +__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" +#else /* !defined(__VMKLNX__) */ +#define __IN2(s,s1,s2) \ +__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0" +#endif /* defined(__VMKLNX__) */ + +#define __IN(s,s1,i...) \ +__IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \ +__IN1(s##_p) __IN2(s,s1,"w") __FULL_SLOW_DOWN_IO : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \ + +#if defined(__VMKLNX__) +#define __INS(s) \ +static inline void ins##s(unsigned short port, void * addr, unsigned long count) \ +{ \ + vmk_CPUEnsureClearDF(); \ + __asm__ __volatile__ ("rep ; ins" #s \ +: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } +#else /* !defined(__VMKLNX__) */ +#define __INS(s) \ +static inline void ins##s(unsigned short port, void * addr, unsigned long count) \ +{ __asm__ __volatile__ ("rep ; ins" #s \ +: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } +#endif /* defined(__VMKLNX__) */ + +#if defined(__VMKLNX__) +#define __OUTS(s) \ +static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ +{ \ + vmk_CPUEnsureClearDF(); \ + __asm__ __volatile__ ("rep ; outs" #s \ +: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } +#else /* !defined(__VMKLNX__) */ +#define __OUTS(s) \ +static inline void outs##s(unsigned short port, const void * addr, unsigned long count) \ +{ __asm__ __volatile__ ("rep ; outs" #s \ +: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); } +#endif /* defined(__VMKLNX__) */ + +#define RETURN_TYPE unsigned char +__IN(b,"") +#undef RETURN_TYPE +#define RETURN_TYPE unsigned short +__IN(w,"") +#undef RETURN_TYPE +#define RETURN_TYPE unsigned int +__IN(l,"") +#undef RETURN_TYPE + +__OUT(b,"b",char) +__OUT(w,"w",short) +__OUT(l,,int) + +__INS(b) +__INS(w) +__INS(l) + +__OUTS(b) +__OUTS(w) +__OUTS(l) + +#define IO_SPACE_LIMIT 0xffff + +#if defined(__KERNEL__) && __x86_64__ + +#include + +#ifndef __i386__ +/* + * Change virtual addresses to physical addresses and vv. + * These are pretty trivial + */ +static inline unsigned long virt_to_phys(volatile void * address) +{ + return __pa(address); +} + +static inline void * phys_to_virt(unsigned long address) +{ + return __va(address); +} +#endif + +/* + * Change "struct page" to page number. + */ +#if defined(__VMKLNX__) +/** + * phys_to_page - machine address to a page handle + * @maddr : machine address + * + * Converts machine address @maddr to a page handle + * + * SYNOPSIS: + * #define phys_to_page(maddr) + * + * ESX Deviation Notes: + * The resulting page handle cannot be derefenced. + * This page handle needs to be handled through the page api only. + * + */ +/* _VMKLNX_CODECHECK_: phys_to_page */ +#define phys_to_page(maddr) ((struct page *)pfn_to_page(maddr >> PAGE_SHIFT)) + +/** + * page_to_phys - page handle to machine address + * @page: pointer to page handle + * + * Converts page handle @page to a machine address. + * + * SYNOPSIS: + * #define page_to_phys(page) + * + * RETURN VALUE: + * Machine address of the page of type dma_addr_t + * + */ +/* _VMKLNX_CODECHECK_: page_to_phys */ +#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) +#else /* !defined(__VMKLNX__) */ +#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) +#endif /* defined(__VMKLNX__) */ + +#include + +extern void __iomem *__ioremap(unsigned long offset, unsigned long size, unsigned long flags); + +/** + * ioremap - perform a cachable mapping of a physically contiguous range + * @offset: physical address to map + * @size: number of bytes to map + * + * Map in a physically contiguous range into kernel virtual memory and + * get a pointer to the mapped region. The region is mapped cacheable. + * + * RETURN VALUE: + * None. + * + */ +/* _VMKLNX_CODECHECK_: ioremap */ +static inline void __iomem * ioremap (unsigned long offset, unsigned long size) +{ + return __ioremap(offset, size, 0); +} + +extern void *early_ioremap(unsigned long addr, unsigned long size); +extern void early_iounmap(void *addr, unsigned long size); + +/* + * This one maps high address device memory and turns off caching for that area. + * it's useful if some control registers are in such an area and write combining + * or read caching is not desirable: + */ +extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size); +extern void iounmap(volatile void __iomem *addr); + +/* + * ISA I/O bus memory addresses are 1:1 with the physical address. + */ +#define isa_virt_to_bus virt_to_phys +#define isa_page_to_bus page_to_phys +#define isa_bus_to_virt phys_to_virt + +/* + * However PCI ones are not necessarily 1:1 and therefore these interfaces + * are forbidden in portable PCI drivers. + * + * Allow them on x86 for legacy drivers, though. + */ +#define virt_to_bus virt_to_phys +#define bus_to_virt phys_to_virt + +/* + * readX/writeX() are used to access memory mapped devices. On some + * architectures the memory mapped IO stuff needs to be accessed + * differently. On the x86 architecture, we just read/write the + * memory location directly. + */ + +/** + * __readb - Read a byte from specified address + * @addr: memory address to read from + * + * Reads a byte from a memory location that is mapped to a + * device. + * + * RETURN VALUE: + * An 8-bit unsigned byte value + * + * SEE ALSO: + * readb + */ +/* _VMKLNX_CODECHECK_: __readb */ +static inline __u8 __readb(const volatile void __iomem *addr) +{ + return *(__force volatile __u8 *)addr; +} + +/** + * __readw - Read a word (16 bits) from specified address + * @addr: memory address to read from + * + * Reads a word (16 bits) from a memory location + * that is mapped to a device + * + * RETURN VALUE: + * A 16-bit unsigned short word value + * + * SEE ALSO: + * readw + */ +/* _VMKLNX_CODECHECK_: __readw */ +static inline __u16 __readw(const volatile void __iomem *addr) +{ + return *(__force volatile __u16 *)addr; +} + +/** + * __readl - Read a long (32 bits) from specified address + * @addr: memory address to read from + * + * Reads a long (32 bits) from a memory location that is + * mapped to a device + * + * RETURN VALUE: + * A 32-bit unsigned long word value + * + * SEE ALSO: + * readl + */ +/* _VMKLNX_CODECHECK_: __readl */ +static __always_inline __u32 __readl(const volatile void __iomem *addr) +{ + return *(__force volatile __u32 *)addr; +} + +/** + * __readq - Read a quad word (64 bits) from specified address + * @addr: memory address to read from + * + * Reads a quad word (64 bits) from a memory location + * that is mapped to a device + * + * RETURN VALUE: + * A 64-bit unsigned quard word value + * + * SEE ALSO: + * readq + */ +/* _VMKLNX_CODECHECK_: __readq */ +static inline __u64 __readq(const volatile void __iomem *addr) +{ + return *(__force volatile __u64 *)addr; +} + +/** + * readb - Read a byte from specified address + * @x: memory address to read from + * + * Reads a byte from a memory location that is mapped to a device. + * readb is an alias to __readb. + * + * RETURN VALUE: + * An 8-bit unsigned byte value + * + * SEE ALSO: + * __readb + */ +/* _VMKLNX_CODECHECK_: readb */ +#define readb(x) __readb(x) + +/** + * readw - Read a word (16 bits) from specified address + * @x: memory address to read from + * + * Reads a word (16 bits) from a memory location that is mapped to a device. + * readw is an alias to __readw. + * + * RETURN VALUE: + * A 16-bit unsigned short word value + * + * SEE ALSO: + * __readw + */ +/* _VMKLNX_CODECHECK_: readw */ +#define readw(x) __readw(x) + +/** + * readl - Read a long (32 bits) from specified address + * @x: memory address to read from + * + * Reads a long (32 bits) from a memory location that is mapped to a device. + * readl is an alias to __readl. + * + * RETURN VALUE: + * A 32-bit unsigned long word value + * + * SEE ALSO: + * __readl + */ +/* _VMKLNX_CODECHECK_: readl */ +#define readl(x) __readl(x) + +/** + * readq - Read a quad word (64 bits) from specified address + * @x: memory address to read from + * + * Reads a quad word (64 bits) from a memory location that is mapped to a device. + * readq is an alias to __readq. + * + * RETURN VALUE: + * A 64-bit unsigned quard word value + * + * SEE ALSO: + * __readq + */ +/* _VMKLNX_CODECHECK_: readq */ +#define readq(x) __readq(x) + +#define readb_relaxed(a) readb(a) + +/** + * readw_relaxed - Read a word (16 bits) from specified address + * @a: memory address to read from + * + * Reads a word (16 bits) from a memory location that is mapped to a device. + * readw_relaxed is an alias to __readw. + * + * RETURN VALUE: + * A 16-bit unsigned short word value + * + * SEE ALSO: + * __readw readw + */ +/* _VMKLNX_CODECHECK_: readw_relaxed */ +#define readw_relaxed(a) readw(a) + +/** + * readl_relaxed - Read a long (32 bits) from specified address + * @a: memory address to read from + * + * Reads a long (32 bits) from a memory location that is mapped to a device. + * readw_relaxed is an alias to __readl. + * + * RETURN VALUE: + * A 32-bit unsigned long word value + * + * SEE ALSO: + * __readl readl + */ +/* _VMKLNX_CODECHECK_: readl_relaxed */ +#define readl_relaxed(a) readl(a) +#define readq_relaxed(a) readq(a) +#define __raw_readb readb +#define __raw_readw readw +#define __raw_readl readl +#define __raw_readq readq + +#define mmiowb() + +/** + * __writel - write an u32 value to I/O device memory + * @b: the u32 value to be written + * @addr: the iomapped memory address that is obtained from ioremap() or from ioremap_nocache() + * + * This is an internal function. Please call writel instead. + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: __writel */ +static inline void __writel(__u32 b, volatile void __iomem *addr) +{ + *(__force volatile __u32 *)addr = b; +} +static inline void __writeq(__u64 b, volatile void __iomem *addr) +{ + *(__force volatile __u64 *)addr = b; +} + +/** + * __writeb - write an u8 value to I/O device memory + * @b: the u8 value to be written + * @addr: the iomapped memory address that is obtained from ioremap() or from ioremap_nocache() + * + * This is an internal function. Please call writeb instead. + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: __writeb */ +static inline void __writeb(__u8 b, volatile void __iomem *addr) +{ + *(__force volatile __u8 *)addr = b; +} + +/** + * __writew - write an u16 value to I/O device memory + * @b: the u16 value to be written + * @addr: the iomapped memory address that is obtained from ioremap() or from ioremap_nocache() + * + * This is an internal function. Please call writew instead. + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: __writew */ +static inline void __writew(__u16 b, volatile void __iomem *addr) +{ + *(__force volatile __u16 *)addr = b; +} +#define writeq(val,addr) __writeq((val),(addr)) +/** + * writel - write an u32 value to I/O device memory + * @val: the u32 value to be written + * @addr: the iomapped memory address that is generated by ioremap() or ioremap_nocache() + * + * Write an u32 value to I/O device memory. + * + * SYNOPSIS: + * #define writel(val,addr) + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: writel */ +#define writel(val,addr) __writel((val),(addr)) + +/** + * writew - write an u16 value to I/O device memory + * @val: the u16 value to be written + * @addr: the iomapped memory address that is obtained from ioremap() or from ioremap_nocache() + * + * Write an u16 value to I/O device memory. + * + * SYNOPSIS: + * #define writew(val,addr) + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: writew */ +#define writew(val,addr) __writew((val),(addr)) + +/** + * writeb - write an u8 value to I/O device memory + * @val: the u8 value to be written + * @addr: the iomapped memory address that is generated by ioremap() or ioremap_nocache() + * + * Write an u8 value to I/O device memory. + * + * SYNOPSIS: + * #define writeb(val,addr) + * + * RETURN VALUE: + * This function does not return a value. + * + * SEE ALSO: + * ioremap(), ioremap_nocache() + * + */ +/* _VMKLNX_CODECHECK_: writeb */ +#define writeb(val,addr) __writeb((val),(addr)) +#define __raw_writeb writeb +#define __raw_writew writew +#define __raw_writel writel +#define __raw_writeq writeq + +#if defined(__VMKLNX__) +/** + * memcpy_fromio - copy from an IO device space to main memory space + * @from: the address for the IO Device in PCI space + * @to: the address to where the copy is to happen + * @len: the number of bytes to be copied + * + * Copy @len bytes from @from address of an IO device in the PCI space to + * @to address in main memory space + * + * RETURN VALUE: + * None + */ +/* _VMKLNX_CODECHECK_: memcpy_fromio */ +static inline void memcpy_fromio(void *to, const volatile void __iomem *from, unsigned len) +{ + vmk_Memcpy(to, (void *)from, len); +} + +/** + * memcpy_toio - copy from main memory space to IO device space + * @to: the address for the IO Device in PCI space + * @from: the address from where the copy is to happen + * @len: the number of bytes to be copied + * + * Copy @len bytes from @from address to @to address of a IO Device in the PCI + * space. + * + * RETURN VALUE + * None + */ +/* _VMKLNX_CODECHECK_: memcpy_toio */ +static inline void memcpy_toio(volatile void __iomem *to, const void *from, unsigned len) +{ + vmk_Memcpy((void *)to, from, len); +} +#else /* !defined(__VMKLNX__) */ +void __memcpy_fromio(void*,unsigned long,unsigned); +void __memcpy_toio(unsigned long,const void*,unsigned); + +static inline void memcpy_fromio(void *to, const volatile void __iomem *from, unsigned len) +{ + __memcpy_fromio(to,(unsigned long)from,len); +} +static inline void memcpy_toio(volatile void __iomem *to, const void *from, unsigned len) +{ + __memcpy_toio((unsigned long)to,from,len); +} +#endif /* defined(__VMKLNX__) */ + +void memset_io(volatile void __iomem *a, int b, size_t c); + +/* + * ISA space is 'always mapped' on a typical x86 system, no need to + * explicitly ioremap() it. The fact that the ISA IO space is mapped + * to PAGE_OFFSET is pure coincidence - it does not mean ISA values + * are physical addresses. The following constant pointer can be + * used as the IO-area pointer (it can be iounmapped as well, so the + * analogy with PCI is quite large): + */ +#define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET)) + +/* + * Again, x86-64 does not require mem IO specific function. + */ + +#define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void *)(b),(c),(d)) + +/** + * check_signature - find BIOS signatures + * @io_addr: mmio address to check + * @signature: signature block + * @length: length of signature + * + * Perform a signature comparison with the mmio address io_addr. This + * address should have been obtained by ioremap. + * Returns 1 on a match. + */ + +static inline int check_signature(void __iomem *io_addr, + const unsigned char *signature, int length) +{ + int retval = 0; + do { + if (readb(io_addr) != *signature) + goto out; + io_addr++; + signature++; + length--; + } while (length); + retval = 1; +out: + return retval; +} + +/* Nothing to do */ + +#define dma_cache_inv(_start,_size) do { } while (0) +#define dma_cache_wback(_start,_size) do { } while (0) +#define dma_cache_wback_inv(_start,_size) do { } while (0) + +#define flush_write_buffers() + +extern int iommu_bio_merge; +#define BIO_VMERGE_BOUNDARY iommu_bio_merge + +/* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem + * access + */ +#define xlate_dev_mem_ptr(p) __va(p) + +/* + * Convert a virtual cached pointer to an uncached pointer + */ +#define xlate_dev_kmem_ptr(p) p + +#endif /* __KERNEL__ */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io_apic.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io_apic.h new file mode 100644 index 0000000..fb7a090 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/io_apic.h @@ -0,0 +1,222 @@ +#ifndef __ASM_IO_APIC_H +#define __ASM_IO_APIC_H + +#include +#include + +/* + * Intel IO-APIC support for SMP and UP systems. + * + * Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar + */ + +#ifdef CONFIG_X86_IO_APIC + +#ifdef CONFIG_PCI_MSI +static inline int use_pci_vector(void) {return 1;} +static inline void disable_edge_ioapic_vector(unsigned int vector) { } +static inline void mask_and_ack_level_ioapic_vector(unsigned int vector) { } +static inline void end_edge_ioapic_vector (unsigned int vector) { } +#define startup_level_ioapic startup_level_ioapic_vector +#define shutdown_level_ioapic mask_IO_APIC_vector +#define enable_level_ioapic unmask_IO_APIC_vector +#define disable_level_ioapic mask_IO_APIC_vector +#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_vector +#define end_level_ioapic end_level_ioapic_vector +#define set_ioapic_affinity set_ioapic_affinity_vector + +#define startup_edge_ioapic startup_edge_ioapic_vector +#define shutdown_edge_ioapic disable_edge_ioapic_vector +#define enable_edge_ioapic unmask_IO_APIC_vector +#define disable_edge_ioapic disable_edge_ioapic_vector +#define ack_edge_ioapic ack_edge_ioapic_vector +#define end_edge_ioapic end_edge_ioapic_vector +#else +static inline int use_pci_vector(void) {return 0;} +static inline void disable_edge_ioapic_irq(unsigned int irq) { } +static inline void mask_and_ack_level_ioapic_irq(unsigned int irq) { } +static inline void end_edge_ioapic_irq (unsigned int irq) { } +#define startup_level_ioapic startup_level_ioapic_irq +#define shutdown_level_ioapic mask_IO_APIC_irq +#define enable_level_ioapic unmask_IO_APIC_irq +#define disable_level_ioapic mask_IO_APIC_irq +#define mask_and_ack_level_ioapic mask_and_ack_level_ioapic_irq +#define end_level_ioapic end_level_ioapic_irq +#define set_ioapic_affinity set_ioapic_affinity_irq + +#define startup_edge_ioapic startup_edge_ioapic_irq +#define shutdown_edge_ioapic disable_edge_ioapic_irq +#define enable_edge_ioapic unmask_IO_APIC_irq +#define disable_edge_ioapic disable_edge_ioapic_irq +#define ack_edge_ioapic ack_edge_ioapic_irq +#define end_edge_ioapic end_edge_ioapic_irq +#endif + +#define APIC_MISMATCH_DEBUG + +#define IO_APIC_BASE(idx) \ + ((volatile int *)(__fix_to_virt(FIX_IO_APIC_BASE_0 + idx) \ + + (mp_ioapics[idx].mpc_apicaddr & ~PAGE_MASK))) + +/* + * The structure of the IO-APIC: + */ +union IO_APIC_reg_00 { + u32 raw; + struct { + u32 __reserved_2 : 14, + LTS : 1, + delivery_type : 1, + __reserved_1 : 8, + ID : 8; + } __attribute__ ((packed)) bits; +}; + +union IO_APIC_reg_01 { + u32 raw; + struct { + u32 version : 8, + __reserved_2 : 7, + PRQ : 1, + entries : 8, + __reserved_1 : 8; + } __attribute__ ((packed)) bits; +}; + +union IO_APIC_reg_02 { + u32 raw; + struct { + u32 __reserved_2 : 24, + arbitration : 4, + __reserved_1 : 4; + } __attribute__ ((packed)) bits; +}; + +union IO_APIC_reg_03 { + u32 raw; + struct { + u32 boot_DT : 1, + __reserved_1 : 31; + } __attribute__ ((packed)) bits; +}; + +/* + * # of IO-APICs and # of IRQ routing registers + */ +extern int nr_ioapics; +extern int nr_ioapic_registers[MAX_IO_APICS]; + +enum ioapic_irq_destination_types { + dest_Fixed = 0, + dest_LowestPrio = 1, + dest_SMI = 2, + dest__reserved_1 = 3, + dest_NMI = 4, + dest_INIT = 5, + dest__reserved_2 = 6, + dest_ExtINT = 7 +}; + +struct IO_APIC_route_entry { + __u32 vector : 8, + delivery_mode : 3, /* 000: FIXED + * 001: lowest prio + * 111: ExtINT + */ + dest_mode : 1, /* 0: physical, 1: logical */ + delivery_status : 1, + polarity : 1, + irr : 1, + trigger : 1, /* 0: edge, 1: level */ + mask : 1, /* 0: enabled, 1: disabled */ + __reserved_2 : 15; + + union { struct { __u32 + __reserved_1 : 24, + physical_dest : 4, + __reserved_2 : 4; + } physical; + + struct { __u32 + __reserved_1 : 24, + logical_dest : 8; + } logical; + } dest; + +} __attribute__ ((packed)); + +/* + * MP-BIOS irq configuration table structures: + */ + +/* I/O APIC entries */ +extern struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS]; + +/* # of MP IRQ source entries */ +extern int mp_irq_entries; + +/* MP IRQ source entries */ +extern struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; + +/* non-0 if default (table-less) MP configuration */ +extern int mpc_default_type; + +static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) +{ + *IO_APIC_BASE(apic) = reg; + return *(IO_APIC_BASE(apic)+4); +} + +static inline void io_apic_write(unsigned int apic, unsigned int reg, unsigned int value) +{ + *IO_APIC_BASE(apic) = reg; + *(IO_APIC_BASE(apic)+4) = value; +} + +/* + * Re-write a value: to be used for read-modify-write + * cycles where the read already set up the index register. + */ +static inline void io_apic_modify(unsigned int apic, unsigned int value) +{ + *(IO_APIC_BASE(apic)+4) = value; +} + +/* + * Synchronize the IO-APIC and the CPU by doing + * a dummy read from the IO-APIC + */ +static inline void io_apic_sync(unsigned int apic) +{ + (void) *(IO_APIC_BASE(apic)+4); +} + +/* 1 if "noapic" boot option passed */ +extern int skip_ioapic_setup; + +/* + * If we use the IO-APIC for IRQ routing, disable automatic + * assignment of PCI IRQ's. + */ +#define io_apic_assign_pci_irqs (mp_irq_entries && !skip_ioapic_setup && io_apic_irqs) + +#ifdef CONFIG_ACPI +extern int io_apic_get_version (int ioapic); +extern int io_apic_get_redir_entries (int ioapic); +extern int io_apic_set_pci_routing (int ioapic, int pin, int irq, int, int); +extern int timer_uses_ioapic_pin_0; +#endif + +extern int sis_apic_bug; /* dummy */ + +#else /* !CONFIG_X86_IO_APIC */ +#define io_apic_assign_pci_irqs 0 +#endif + +extern int assign_irq_vector(int irq); + +void enable_NMI_through_LVT0 (void * dummy); + +extern spinlock_t i8259A_lock; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl.h new file mode 100644 index 0000000..b279fe0 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl32.h new file mode 100644 index 0000000..d0d227f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctl32.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctls.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctls.h new file mode 100644 index 0000000..62caf8b --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ioctls.h @@ -0,0 +1,82 @@ +#ifndef __ARCH_X8664_IOCTLS_H__ +#define __ARCH_X8664_IOCTLS_H__ + +#include + +/* 0x54 is just a magic number to make these relatively unique ('T') */ + +#define TCGETS 0x5401 +#define TCSETS 0x5402 +#define TCSETSW 0x5403 +#define TCSETSF 0x5404 +#define TCGETA 0x5405 +#define TCSETA 0x5406 +#define TCSETAW 0x5407 +#define TCSETAF 0x5408 +#define TCSBRK 0x5409 +#define TCXONC 0x540A +#define TCFLSH 0x540B +#define TIOCEXCL 0x540C +#define TIOCNXCL 0x540D +#define TIOCSCTTY 0x540E +#define TIOCGPGRP 0x540F +#define TIOCSPGRP 0x5410 +#define TIOCOUTQ 0x5411 +#define TIOCSTI 0x5412 +#define TIOCGWINSZ 0x5413 +#define TIOCSWINSZ 0x5414 +#define TIOCMGET 0x5415 +#define TIOCMBIS 0x5416 +#define TIOCMBIC 0x5417 +#define TIOCMSET 0x5418 +#define TIOCGSOFTCAR 0x5419 +#define TIOCSSOFTCAR 0x541A +#define FIONREAD 0x541B +#define TIOCINQ FIONREAD +#define TIOCLINUX 0x541C +#define TIOCCONS 0x541D +#define TIOCGSERIAL 0x541E +#define TIOCSSERIAL 0x541F +#define TIOCPKT 0x5420 +#define FIONBIO 0x5421 +#define TIOCNOTTY 0x5422 +#define TIOCSETD 0x5423 +#define TIOCGETD 0x5424 +#define TCSBRKP 0x5425 /* Needed for POSIX tcsendbreak() */ +#define TIOCSBRK 0x5427 /* BSD compatibility */ +#define TIOCCBRK 0x5428 /* BSD compatibility */ +#define TIOCGSID 0x5429 /* Return the session ID of FD */ +#define TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */ +#define TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */ + +#define FIONCLEX 0x5450 /* these numbers need to be adjusted. */ +#define FIOCLEX 0x5451 +#define FIOASYNC 0x5452 +#define TIOCSERCONFIG 0x5453 +#define TIOCSERGWILD 0x5454 +#define TIOCSERSWILD 0x5455 +#define TIOCGLCKTRMIOS 0x5456 +#define TIOCSLCKTRMIOS 0x5457 +#define TIOCSERGSTRUCT 0x5458 /* For debugging only */ +#define TIOCSERGETLSR 0x5459 /* Get line status register */ +#define TIOCSERGETMULTI 0x545A /* Get multiport config */ +#define TIOCSERSETMULTI 0x545B /* Set multiport config */ + +#define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ +#define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ +#define TIOCGHAYESESP 0x545E /* Get Hayes ESP configuration */ +#define TIOCSHAYESESP 0x545F /* Set Hayes ESP configuration */ +#define FIOQSIZE 0x5460 + +/* Used for packet mode */ +#define TIOCPKT_DATA 0 +#define TIOCPKT_FLUSHREAD 1 +#define TIOCPKT_FLUSHWRITE 2 +#define TIOCPKT_STOP 4 +#define TIOCPKT_START 8 +#define TIOCPKT_NOSTOP 16 +#define TIOCPKT_DOSTOP 32 + +#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipc.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipc.h new file mode 100644 index 0000000..8736ba6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipc.h @@ -0,0 +1,6 @@ +#ifndef __x8664_IPC_H__ +#define __x8664_IPC_H__ + +/* dummy */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipcbuf.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipcbuf.h new file mode 100644 index 0000000..470cf85 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipcbuf.h @@ -0,0 +1,29 @@ +#ifndef __x86_64_IPCBUF_H__ +#define __x86_64_IPCBUF_H__ + +/* + * The ipc64_perm structure for x86_64 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 32-bit mode_t and seq + * - 2 miscellaneous 32-bit values + */ + +struct ipc64_perm +{ + __kernel_key_t key; + __kernel_uid32_t uid; + __kernel_gid32_t gid; + __kernel_uid32_t cuid; + __kernel_gid32_t cgid; + __kernel_mode_t mode; + unsigned short __pad1; + unsigned short seq; + unsigned short __pad2; + unsigned long __unused1; + unsigned long __unused2; +}; + +#endif /* __x86_64_IPCBUF_H__ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipi.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipi.h new file mode 100644 index 0000000..be4bc76 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ipi.h @@ -0,0 +1,119 @@ +#ifndef __ASM_IPI_H +#define __ASM_IPI_H + +/* + * Copyright 2004 James Cleverdon, IBM. + * Subject to the GNU Public License, v.2 + * + * Generic APIC InterProcessor Interrupt code. + * + * Moved to include file by James Cleverdon from + * arch/x86-64/kernel/smp.c + * + * Copyrights from kernel/smp.c: + * + * (c) 1995 Alan Cox, Building #3 + * (c) 1998-99, 2000 Ingo Molnar + * (c) 2002,2003 Andi Kleen, SuSE Labs. + * Subject to the GNU Public License, v.2 + */ + +#include +#include +#include +#include + +/* + * the following functions deal with sending IPIs between CPUs. + * + * We use 'broadcast', CPU->CPU IPIs and self-IPIs too. + */ + +static inline unsigned int __prepare_ICR (unsigned int shortcut, int vector, unsigned int dest) +{ + unsigned int icr = shortcut | dest; + + switch (vector) { + default: + icr |= APIC_DM_FIXED | vector; + break; + case NMI_VECTOR: + icr |= APIC_DM_NMI; + break; + } + return icr; +} + +static inline int __prepare_ICR2 (unsigned int mask) +{ + return SET_APIC_DEST_FIELD(mask); +} + +#ifndef CONFIG_XEN_UNPRIVILEGED_GUEST +static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest) +{ + /* + * Subtle. In the case of the 'never do double writes' workaround + * we have to lock out interrupts to be safe. As we don't care + * of the value read we use an atomic rmw access to avoid costly + * cli/sti. Otherwise we use an even cheaper single atomic write + * to the APIC. + */ + unsigned int cfg; + + /* + * Wait for idle. + */ + apic_wait_icr_idle(); + + /* + * No need to touch the target chip field + */ + cfg = __prepare_ICR(shortcut, vector, dest); + + /* + * Send the IPI. The write to APIC_ICR fires this off. + */ + apic_write(APIC_ICR, cfg); +} + + +static inline void send_IPI_mask_sequence(cpumask_t mask, int vector) +{ + unsigned long cfg, flags; + unsigned long query_cpu; + + /* + * Hack. The clustered APIC addressing mode doesn't allow us to send + * to an arbitrary mask, so I do a unicast to each CPU instead. + * - mbligh + */ + local_irq_save(flags); + + for_each_cpu_mask(query_cpu, mask) { + /* + * Wait for idle. + */ + apic_wait_icr_idle(); + + /* + * prepare target chip field + */ + cfg = __prepare_ICR2(x86_cpu_to_apicid[query_cpu]); + apic_write(APIC_ICR2, cfg); + + /* + * program the ICR + */ + cfg = __prepare_ICR(0, vector, APIC_DEST_PHYSICAL); + + /* + * Send the IPI. The write to APIC_ICR fires this off. + */ + apic_write(APIC_ICR, cfg); + } + local_irq_restore(flags); +} +#endif /* CONFIG_XEN_UNPRIVILEGED_GUEST */ + +#endif /* __ASM_IPI_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irq.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irq.h new file mode 100644 index 0000000..c615e24 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irq.h @@ -0,0 +1,59 @@ +#ifndef _ASM_IRQ_H +#define _ASM_IRQ_H + +/* + * linux/include/asm/irq.h + * + * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar + * + * IRQ/IPI changes taken from work by Thomas Radke + * + */ + +#define TIMER_IRQ 0 + +/* + * 16 8259A IRQ's, 208 potential APIC interrupt sources. + * Right now the APIC is mostly only used for SMP. + * 256 vectors is an architectural limit. (we can have + * more than 256 devices theoretically, but they will + * have to use shared interrupts) + * Since vectors 0x00-0x1f are used/reserved for the CPU, + * the usable vector space is 0x20-0xff (224 vectors) + */ + +/* + * The maximum number of vectors supported by x86_64 processors + * is limited to 256. For processors other than x86_64, NR_VECTORS + * should be changed accordingly. + */ +#define NR_VECTORS 256 + +/* duplicated in hw_irq.h */ +#define FIRST_SYSTEM_VECTOR 0xef + +#ifdef CONFIG_PCI_MSI +#define NR_IRQS FIRST_SYSTEM_VECTOR +#define NR_IRQ_VECTORS NR_IRQS +#else +#define NR_IRQS 224 +#define NR_IRQ_VECTORS (32 * NR_CPUS) +#endif + +static __inline__ int irq_canonicalize(int irq) +{ + return ((irq == 2) ? 9 : irq); +} + +#ifdef CONFIG_X86_LOCAL_APIC +#define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ +#endif + +#ifdef CONFIG_HOTPLUG_CPU +#include +extern void fixup_irqs(cpumask_t map); +#endif + +#define __ARCH_HAS_DO_SOFTIRQ 1 + +#endif /* _ASM_IRQ_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irqflags.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irqflags.h new file mode 100644 index 0000000..fde76bb --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/irqflags.h @@ -0,0 +1,153 @@ +/* + * include/asm-x86_64/irqflags.h + * + * IRQ flags handling + * + * This file gets included from lowlevel asm headers too, to provide + * wrapped versions of the local_irq_*() APIs, based on the + * raw_local_irq_*() functions from the lowlevel headers. + */ +#ifndef _ASM_IRQFLAGS_H +#define _ASM_IRQFLAGS_H + +#ifndef __ASSEMBLY__ +/* + * Interrupt control: + */ + +static inline unsigned long __raw_local_save_flags(void) +{ + unsigned long flags; + + __asm__ __volatile__( + "# __raw_save_flags\n\t" + "pushfq ; popq %q0" + : "=g" (flags) + : /* no input */ + : "memory" + ); + + return flags; +} + +#define raw_local_save_flags(flags) \ + do { (flags) = __raw_local_save_flags(); } while (0) + +static inline void raw_local_irq_restore(unsigned long flags) +{ + __asm__ __volatile__( + "pushq %0 ; popfq" + : /* no output */ + :"g" (flags) + :"memory", "cc" + ); +} + +#ifdef CONFIG_X86_VSMP + +/* + * Interrupt control for the VSMP architecture: + */ + +static inline void raw_local_irq_disable(void) +{ + unsigned long flags = __raw_local_save_flags(); + + raw_local_irq_restore((flags & ~(1 << 9)) | (1 << 18)); +} + +static inline void raw_local_irq_enable(void) +{ + unsigned long flags = __raw_local_save_flags(); + + raw_local_irq_restore((flags | (1 << 9)) & ~(1 << 18)); +} + +/** + * raw_irqs_disabled_flags - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: raw_irqs_disabled_flags */ +static inline int raw_irqs_disabled_flags(unsigned long flags) +{ + return !(flags & (1<<9)) || (flags & (1 << 18)); +} + +#else /* CONFIG_X86_VSMP */ + +static inline void raw_local_irq_disable(void) +{ + __asm__ __volatile__("cli" : : : "memory"); +} + +static inline void raw_local_irq_enable(void) +{ + __asm__ __volatile__("sti" : : : "memory"); +} + +static inline int raw_irqs_disabled_flags(unsigned long flags) +{ + return !(flags & (1 << 9)); +} + +#endif + +/* + * For spinlocks, etc.: + */ + +static inline unsigned long __raw_local_irq_save(void) +{ + unsigned long flags = __raw_local_save_flags(); + + raw_local_irq_disable(); + + return flags; +} + +#define raw_local_irq_save(flags) \ + do { (flags) = __raw_local_irq_save(); } while (0) + +static inline int raw_irqs_disabled(void) +{ + unsigned long flags = __raw_local_save_flags(); + + return raw_irqs_disabled_flags(flags); +} + +/* + * Used in the idle loop; sti takes one instruction cycle + * to complete: + */ +static inline void raw_safe_halt(void) +{ + __asm__ __volatile__("sti; hlt" : : : "memory"); +} + +/* + * Used when interrupts are already enabled or to + * shutdown the processor: + */ +static inline void halt(void) +{ + __asm__ __volatile__("hlt": : :"memory"); +} + +#else /* __ASSEMBLY__: */ +# ifdef CONFIG_TRACE_IRQFLAGS +# define TRACE_IRQS_ON call trace_hardirqs_on_thunk +# define TRACE_IRQS_OFF call trace_hardirqs_off_thunk +# else +# define TRACE_IRQS_ON +# define TRACE_IRQS_OFF +# endif +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/k8.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/k8.h new file mode 100644 index 0000000..699dd69 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/k8.h @@ -0,0 +1,14 @@ +#ifndef _ASM_K8_H +#define _ASM_K8_H 1 + +#include + +extern struct pci_device_id k8_nb_ids[]; + +extern int early_is_k8_nb(u32 value); +extern struct pci_dev **k8_northbridges; +extern int num_k8_northbridges; +extern int cache_k8_northbridges(void); +extern void k8_flush_garts(void); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kdebug.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kdebug.h new file mode 100644 index 0000000..2b0c088 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kdebug.h @@ -0,0 +1,60 @@ +#ifndef _X86_64_KDEBUG_H +#define _X86_64_KDEBUG_H 1 + +#include + +struct pt_regs; + +struct die_args { + struct pt_regs *regs; + const char *str; + long err; + int trapnr; + int signr; +}; + +extern int register_die_notifier(struct notifier_block *); +extern int unregister_die_notifier(struct notifier_block *); +extern int register_page_fault_notifier(struct notifier_block *); +extern int unregister_page_fault_notifier(struct notifier_block *); +extern struct atomic_notifier_head die_chain; + +/* Grossly misnamed. */ +enum die_val { + DIE_OOPS = 1, + DIE_INT3, + DIE_DEBUG, + DIE_PANIC, + DIE_NMI, + DIE_DIE, + DIE_NMIWATCHDOG, + DIE_KERNELDEBUG, + DIE_TRAP, + DIE_GPF, + DIE_CALL, + DIE_NMI_IPI, + DIE_PAGE_FAULT, +}; + +static inline int notify_die(enum die_val val, const char *str, + struct pt_regs *regs, long err, int trap, int sig) +{ + struct die_args args = { + .regs = regs, + .str = str, + .err = err, + .trapnr = trap, + .signr = sig + }; + return atomic_notifier_call_chain(&die_chain, val, &args); +} + +extern void printk_address(unsigned long address); +extern void die(const char *,struct pt_regs *,long); +extern void __die(const char *,struct pt_regs *,long); +extern void show_registers(struct pt_regs *regs); +extern void dump_pagetable(unsigned long); +extern unsigned long oops_begin(void); +extern void oops_end(unsigned long); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kexec.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kexec.h new file mode 100644 index 0000000..c564bae --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kexec.h @@ -0,0 +1,67 @@ +#ifndef _X86_64_KEXEC_H +#define _X86_64_KEXEC_H + +#include + +#include +#include + +/* + * KEXEC_SOURCE_MEMORY_LIMIT maximum page get_free_page can return. + * I.e. Maximum page that is mapped directly into kernel memory, + * and kmap is not required. + * + * So far x86_64 is limited to 40 physical address bits. + */ + +/* Maximum physical address we can use pages from */ +#define KEXEC_SOURCE_MEMORY_LIMIT (0xFFFFFFFFFFUL) +/* Maximum address we can reach in physical address mode */ +#define KEXEC_DESTINATION_MEMORY_LIMIT (0xFFFFFFFFFFUL) +/* Maximum address we can use for the control pages */ +#define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) + +/* Allocate one page for the pdp and the second for the code */ +#define KEXEC_CONTROL_CODE_SIZE (4096UL + 4096UL) + +/* The native architecture */ +#define KEXEC_ARCH KEXEC_ARCH_X86_64 + +#define MAX_NOTE_BYTES 1024 + +/* + * Saving the registers of the cpu on which panic occured in + * crash_kexec to save a valid sp. The registers of other cpus + * will be saved in machine_crash_shutdown while shooting down them. + */ + +static inline void crash_setup_regs(struct pt_regs *newregs, + struct pt_regs *oldregs) +{ + if (oldregs) + memcpy(newregs, oldregs, sizeof(*newregs)); + else { + __asm__ __volatile__("movq %%rbx,%0" : "=m"(newregs->rbx)); + __asm__ __volatile__("movq %%rcx,%0" : "=m"(newregs->rcx)); + __asm__ __volatile__("movq %%rdx,%0" : "=m"(newregs->rdx)); + __asm__ __volatile__("movq %%rsi,%0" : "=m"(newregs->rsi)); + __asm__ __volatile__("movq %%rdi,%0" : "=m"(newregs->rdi)); + __asm__ __volatile__("movq %%rbp,%0" : "=m"(newregs->rbp)); + __asm__ __volatile__("movq %%rax,%0" : "=m"(newregs->rax)); + __asm__ __volatile__("movq %%rsp,%0" : "=m"(newregs->rsp)); + __asm__ __volatile__("movq %%r8,%0" : "=m"(newregs->r8)); + __asm__ __volatile__("movq %%r9,%0" : "=m"(newregs->r9)); + __asm__ __volatile__("movq %%r10,%0" : "=m"(newregs->r10)); + __asm__ __volatile__("movq %%r11,%0" : "=m"(newregs->r11)); + __asm__ __volatile__("movq %%r12,%0" : "=m"(newregs->r12)); + __asm__ __volatile__("movq %%r13,%0" : "=m"(newregs->r13)); + __asm__ __volatile__("movq %%r14,%0" : "=m"(newregs->r14)); + __asm__ __volatile__("movq %%r15,%0" : "=m"(newregs->r15)); + __asm__ __volatile__("movl %%ss, %%eax;" :"=a"(newregs->ss)); + __asm__ __volatile__("movl %%cs, %%eax;" :"=a"(newregs->cs)); + __asm__ __volatile__("pushfq; popq %0" :"=m"(newregs->eflags)); + + newregs->rip = (unsigned long)current_text_addr(); + } +} +#endif /* _X86_64_KEXEC_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kmap_types.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kmap_types.h new file mode 100644 index 0000000..7486338 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kmap_types.h @@ -0,0 +1,19 @@ +#ifndef _ASM_KMAP_TYPES_H +#define _ASM_KMAP_TYPES_H + +enum km_type { + KM_BOUNCE_READ, + KM_SKB_SUNRPC_DATA, + KM_SKB_DATA_SOFTIRQ, + KM_USER0, + KM_USER1, + KM_BIO_SRC_IRQ, + KM_BIO_DST_IRQ, + KM_IRQ0, + KM_IRQ1, + KM_SOFTIRQ0, + KM_SOFTIRQ1, + KM_TYPE_NR +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kprobes.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kprobes.h new file mode 100644 index 0000000..cf53178 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/kprobes.h @@ -0,0 +1,91 @@ +#ifndef _ASM_KPROBES_H +#define _ASM_KPROBES_H +/* + * Kernel Probes (KProbes) + * include/asm-x86_64/kprobes.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) IBM Corporation, 2002, 2004 + * + * 2004-Oct Prasanna S Panchamukhi and Jim Keniston + * kenistoj@us.ibm.com adopted from i386. + */ +#include +#include +#include + +#define __ARCH_WANT_KPROBES_INSN_SLOT + +struct pt_regs; +struct kprobe; + +typedef u8 kprobe_opcode_t; +#define BREAKPOINT_INSTRUCTION 0xcc +#define MAX_INSN_SIZE 15 +#define MAX_STACK_SIZE 64 +#define MIN_STACK_SIZE(ADDR) (((MAX_STACK_SIZE) < \ + (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) \ + ? (MAX_STACK_SIZE) \ + : (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR))) + +#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)pentry +#define ARCH_SUPPORTS_KRETPROBES +#define ARCH_INACTIVE_KPROBE_COUNT 1 + +void kretprobe_trampoline(void); +extern void arch_remove_kprobe(struct kprobe *p); +#define flush_insn_slot(p) do { } while (0) + +/* Architecture specific copy of original instruction*/ +struct arch_specific_insn { + /* copy of the original instruction */ + kprobe_opcode_t *insn; +}; + +struct prev_kprobe { + struct kprobe *kp; + unsigned long status; + unsigned long old_rflags; + unsigned long saved_rflags; +}; + +/* per-cpu kprobe control block */ +struct kprobe_ctlblk { + unsigned long kprobe_status; + unsigned long kprobe_old_rflags; + unsigned long kprobe_saved_rflags; + long *jprobe_saved_rsp; + struct pt_regs jprobe_saved_regs; + kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE]; + struct prev_kprobe prev_kprobe; +}; + +/* trap3/1 are intr gates for kprobes. So, restore the status of IF, + * if necessary, before executing the original int3/1 (trap) handler. + */ +static inline void restore_interrupts(struct pt_regs *regs) +{ + if (regs->eflags & IF_MASK) + local_irq_enable(); +} + +extern int post_kprobe_handler(struct pt_regs *regs); +extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); +extern int kprobe_handler(struct pt_regs *regs); + +extern int kprobe_exceptions_notify(struct notifier_block *self, + unsigned long val, void *data); +#endif /* _ASM_KPROBES_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ldt.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ldt.h new file mode 100644 index 0000000..9ef647b --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ldt.h @@ -0,0 +1,36 @@ +/* + * ldt.h + * + * Definitions of structures used with the modify_ldt system call. + */ +#ifndef _LINUX_LDT_H +#define _LINUX_LDT_H + +/* Maximum number of LDT entries supported. */ +#define LDT_ENTRIES 8192 +/* The size of each LDT entry. */ +#define LDT_ENTRY_SIZE 8 + +#ifndef __ASSEMBLY__ +/* Note on 64bit base and limit is ignored and you cannot set + DS/ES/CS not to the default values if you still want to do syscalls. This + call is more for 32bit mode therefore. */ +struct user_desc { + unsigned int entry_number; + unsigned int base_addr; + unsigned int limit; + unsigned int seg_32bit:1; + unsigned int contents:2; + unsigned int read_exec_only:1; + unsigned int limit_in_pages:1; + unsigned int seg_not_present:1; + unsigned int useable:1; + unsigned int lm:1; +}; + +#define MODIFY_LDT_CONTENTS_DATA 0 +#define MODIFY_LDT_CONTENTS_STACK 1 +#define MODIFY_LDT_CONTENTS_CODE 2 + +#endif /* !__ASSEMBLY__ */ +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/linkage.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/linkage.h new file mode 100644 index 0000000..291c2d0 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/linkage.h @@ -0,0 +1,6 @@ +#ifndef __ASM_LINKAGE_H +#define __ASM_LINKAGE_H + +/* Nothing to see here... */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/local.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/local.h new file mode 100644 index 0000000..e769e62 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/local.h @@ -0,0 +1,88 @@ +#ifndef _ARCH_X8664_LOCAL_H +#define _ARCH_X8664_LOCAL_H + +#include + +typedef struct +{ + volatile long counter; +} local_t; + +#define LOCAL_INIT(i) { (i) } + +#define local_read(v) ((v)->counter) +#define local_set(v,i) (((v)->counter) = (i)) + +static inline void local_inc(local_t *v) +{ + __asm__ __volatile__( + "incq %0" + :"=m" (v->counter) + :"m" (v->counter)); +} + +static inline void local_dec(local_t *v) +{ + __asm__ __volatile__( + "decq %0" + :"=m" (v->counter) + :"m" (v->counter)); +} + +static inline void local_add(long i, local_t *v) +{ + __asm__ __volatile__( + "addq %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +} + +static inline void local_sub(long i, local_t *v) +{ + __asm__ __volatile__( + "subq %1,%0" + :"=m" (v->counter) + :"ir" (i), "m" (v->counter)); +} + +/* On x86-64 these are better than the atomic variants on SMP kernels + because they dont use a lock prefix. */ +#define __local_inc(l) local_inc(l) +#define __local_dec(l) local_dec(l) +#define __local_add(i,l) local_add((i),(l)) +#define __local_sub(i,l) local_sub((i),(l)) + +/* Use these for per-cpu local_t variables: on some archs they are + * much more efficient than these naive implementations. Note they take + * a variable, not an address. + * + * This could be done better if we moved the per cpu data directly + * after GS. + */ + +/* Need to disable preemption for the cpu local counters otherwise we could + still access a variable of a previous CPU in a non atomic way. */ +#define cpu_local_wrap_v(v) \ + ({ local_t res__; \ + preempt_disable(); \ + res__ = (v); \ + preempt_enable(); \ + res__; }) +#define cpu_local_wrap(v) \ + ({ preempt_disable(); \ + v; \ + preempt_enable(); }) \ + +#define cpu_local_read(v) cpu_local_wrap_v(local_read(&__get_cpu_var(v))) +#define cpu_local_set(v, i) cpu_local_wrap(local_set(&__get_cpu_var(v), (i))) +#define cpu_local_inc(v) cpu_local_wrap(local_inc(&__get_cpu_var(v))) +#define cpu_local_dec(v) cpu_local_wrap(local_dec(&__get_cpu_var(v))) +#define cpu_local_add(i, v) cpu_local_wrap(local_add((i), &__get_cpu_var(v))) +#define cpu_local_sub(i, v) cpu_local_wrap(local_sub((i), &__get_cpu_var(v))) + +#define __cpu_local_inc(v) cpu_local_inc(v) +#define __cpu_local_dec(v) cpu_local_dec(v) +#define __cpu_local_add(i, v) cpu_local_add((i), (v)) +#define __cpu_local_sub(i, v) cpu_local_sub((i), (v)) + +#endif /* _ARCH_I386_LOCAL_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mach_apic.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mach_apic.h new file mode 100644 index 0000000..0acea44 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mach_apic.h @@ -0,0 +1,29 @@ +#ifndef __ASM_MACH_APIC_H +#define __ASM_MACH_APIC_H + +/* + * Copyright 2004 James Cleverdon, IBM. + * Subject to the GNU Public License, v.2 + * + * Generic APIC sub-arch defines. + * + * Hacked for x86-64 by James Cleverdon from i386 architecture code by + * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and + * James Cleverdon. + */ + +#include + +#define INT_DELIVERY_MODE (genapic->int_delivery_mode) +#define INT_DEST_MODE (genapic->int_dest_mode) +#define INT_DELIVERY_DEST (genapic->int_delivery_dest) +#define TARGET_CPUS (genapic->target_cpus()) +#define apic_id_registered (genapic->apic_id_registered) +#define init_apic_ldr (genapic->init_apic_ldr) +#define send_IPI_mask (genapic->send_IPI_mask) +#define send_IPI_allbutself (genapic->send_IPI_allbutself) +#define send_IPI_all (genapic->send_IPI_all) +#define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid) +#define phys_pkg_id (genapic->phys_pkg_id) + +#endif /* __ASM_MACH_APIC_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mc146818rtc.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mc146818rtc.h new file mode 100644 index 0000000..d6e3009 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mc146818rtc.h @@ -0,0 +1,29 @@ +/* + * Machine dependent access functions for RTC registers. + */ +#ifndef _ASM_MC146818RTC_H +#define _ASM_MC146818RTC_H + +#include + +#ifndef RTC_PORT +#define RTC_PORT(x) (0x70 + (x)) +#define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ +#endif + +/* + * The yet supported machines all access the RTC index register via + * an ISA port access but the way to access the date register differs ... + */ +#define CMOS_READ(addr) ({ \ +outb_p((addr),RTC_PORT(0)); \ +inb_p(RTC_PORT(1)); \ +}) +#define CMOS_WRITE(val, addr) ({ \ +outb_p((addr),RTC_PORT(0)); \ +outb_p((val),RTC_PORT(1)); \ +}) + +#define RTC_IRQ 8 + +#endif /* _ASM_MC146818RTC_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mce.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mce.h new file mode 100644 index 0000000..d13687d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mce.h @@ -0,0 +1,106 @@ +#ifndef _ASM_MCE_H +#define _ASM_MCE_H 1 + +#include +#include + +/* + * Machine Check support for x86 + */ + +#define MCG_CTL_P (1UL<<8) /* MCG_CAP register available */ + +#define MCG_STATUS_RIPV (1UL<<0) /* restart ip valid */ +#define MCG_STATUS_EIPV (1UL<<1) /* eip points to correct instruction */ +#define MCG_STATUS_MCIP (1UL<<2) /* machine check in progress */ + +#define MCI_STATUS_VAL (1UL<<63) /* valid error */ +#define MCI_STATUS_OVER (1UL<<62) /* previous errors lost */ +#define MCI_STATUS_UC (1UL<<61) /* uncorrected error */ +#define MCI_STATUS_EN (1UL<<60) /* error enabled */ +#define MCI_STATUS_MISCV (1UL<<59) /* misc error reg. valid */ +#define MCI_STATUS_ADDRV (1UL<<58) /* addr reg. valid */ +#define MCI_STATUS_PCC (1UL<<57) /* processor context corrupt */ + +/* Fields are zero when not available */ +struct mce { + __u64 status; + __u64 misc; + __u64 addr; + __u64 mcgstatus; + __u64 rip; + __u64 tsc; /* cpu time stamp counter */ + __u64 res1; /* for future extension */ + __u64 res2; /* dito. */ + __u8 cs; /* code segment */ + __u8 bank; /* machine check bank */ + __u8 cpu; /* cpu that raised the error */ + __u8 finished; /* entry is valid */ + __u32 pad; +}; + +/* + * This structure contains all data related to the MCE log. + * Also carries a signature to make it easier to find from external debugging tools. + * Each entry is only valid when its finished flag is set. + */ + +#define MCE_LOG_LEN 32 + +struct mce_log { + char signature[12]; /* "MACHINECHECK" */ + unsigned len; /* = MCE_LOG_LEN */ + unsigned next; + unsigned flags; + unsigned pad0; + struct mce entry[MCE_LOG_LEN]; +}; + +#define MCE_OVERFLOW 0 /* bit 0 in flags means overflow */ + +#define MCE_LOG_SIGNATURE "MACHINECHECK" + +#define MCE_GET_RECORD_LEN _IOR('M', 1, int) +#define MCE_GET_LOG_LEN _IOR('M', 2, int) +#define MCE_GETCLEAR_FLAGS _IOR('M', 3, int) + +/* Software defined banks */ +#define MCE_EXTENDED_BANK 128 +#define MCE_THERMAL_BANK MCE_EXTENDED_BANK + 0 + +#define K8_MCE_THRESHOLD_BASE (MCE_EXTENDED_BANK + 1) /* MCE_AMD */ +#define K8_MCE_THRESHOLD_BANK_0 (MCE_THRESHOLD_BASE + 0 * 9) +#define K8_MCE_THRESHOLD_BANK_1 (MCE_THRESHOLD_BASE + 1 * 9) +#define K8_MCE_THRESHOLD_BANK_2 (MCE_THRESHOLD_BASE + 2 * 9) +#define K8_MCE_THRESHOLD_BANK_3 (MCE_THRESHOLD_BASE + 3 * 9) +#define K8_MCE_THRESHOLD_BANK_4 (MCE_THRESHOLD_BASE + 4 * 9) +#define K8_MCE_THRESHOLD_BANK_5 (MCE_THRESHOLD_BASE + 5 * 9) +#define K8_MCE_THRESHOLD_DRAM_ECC (MCE_THRESHOLD_BANK_4 + 0) + +#ifdef __KERNEL__ +#include + +void mce_log(struct mce *m); +DECLARE_PER_CPU(struct sys_device, device_mce); + +#ifdef CONFIG_X86_MCE_INTEL +void mce_intel_feature_init(struct cpuinfo_x86 *c); +#else +static inline void mce_intel_feature_init(struct cpuinfo_x86 *c) +{ +} +#endif + +#ifdef CONFIG_X86_MCE_AMD +void mce_amd_feature_init(struct cpuinfo_x86 *c); +#else +static inline void mce_amd_feature_init(struct cpuinfo_x86 *c) +{ +} +#endif + +extern atomic_t mce_entry; + +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mm_track.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mm_track.h new file mode 100644 index 0000000..7e26470 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mm_track.h @@ -0,0 +1,98 @@ +/* + * Routines and structures for building a bitmap of + * dirty pages in a live system. For use in memory mirroring + * or migration applications. + * + * Copyright (C) 2006 Stratus Technologies Bermuda Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __X86_64_MMTRACK_H__ +#define __X86_64_MMTRACK_H__ + +#ifndef CONFIG_TRACK_DIRTY_PAGES + +static inline void mm_track_pte(pte_t *ptep) {} +static inline void mm_track_pmd(pmd_t *pmdp) {} +static inline void mm_track_pud(pud_t *pudp) {} +static inline void mm_track_pgd(pgd_t *pgdp) {} +static inline void mm_track_phys(void *physp) {} + +#else + +#include +#include + /* + * For memory-tracking purposes, if active is true (non-zero), the other + * elements of the structure are available for use. Each time mm_track_pte + * is called, it increments count and sets a bit in the bitvector table. + * Each bit in the bitvector represents a physical page in memory. + * + * This is declared in arch/x86_64/mm/track.c. + * + * The in_use element is used in the code which drives the memory tracking + * environment. When tracking is complete, the vector may be freed, but + * only after the active flag is set to zero and the in_use count goes to + * zero. + * + * The count element indicates how many pages have been stored in the + * bitvector. This is an optimization to avoid counting the bits in the + * vector between harvest operations. + */ +struct mm_tracker { + int active; // non-zero if this structure in use + atomic_t count; // number of pages tracked by mm_track() + unsigned long * vector; // bit vector of modified pages + unsigned long bitcnt; // number of bits in vector +}; +extern struct mm_tracker mm_tracking_struct; + +extern void do_mm_track_pte(void *); +extern void do_mm_track_pmd(void *); +extern void do_mm_track_pud(void *); +extern void do_mm_track_pgd(void *); +extern void do_mm_track_phys(void *); + +/* + * The mm_track routine is needed by macros in pgtable.h + */ +static __inline__ void mm_track_pte(pte_t *ptep) +{ + if (unlikely(mm_tracking_struct.active)) + do_mm_track_pte(ptep); +} +static __inline__ void mm_track_pmd(pmd_t *pmdp) +{ + if (unlikely(mm_tracking_struct.active)) + do_mm_track_pmd(pmdp); +} +static __inline__ void mm_track_pud(pud_t *pudp) +{ + if (unlikely(mm_tracking_struct.active)) + do_mm_track_pud(pudp); +} +static __inline__ void mm_track_pgd(pgd_t *pgdp) +{ + if (unlikely(mm_tracking_struct.active)) + do_mm_track_pgd(pgdp); +} +static __inline__ void mm_track_phys(void *physp) +{ + if (unlikely(mm_tracking_struct.active)) + do_mm_track_phys(physp); +} +#endif /* CONFIG_TRACK_DIRTY_PAGES */ + +#endif /* __X86_64_MMTRACK_H__ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mman.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mman.h new file mode 100644 index 0000000..dd5cb05 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mman.h @@ -0,0 +1,19 @@ +#ifndef __X8664_MMAN_H__ +#define __X8664_MMAN_H__ + +#include + +#define MAP_32BIT 0x40 /* only give out 32bit addresses */ + +#define MAP_GROWSDOWN 0x0100 /* stack-like segment */ +#define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ +#define MAP_LOCKED 0x2000 /* pages are locked */ +#define MAP_NORESERVE 0x4000 /* don't check for reservations */ +#define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ +#define MAP_NONBLOCK 0x10000 /* do not block on IO */ + +#define MCL_CURRENT 1 /* lock all current mappings */ +#define MCL_FUTURE 2 /* lock all future mappings */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmsegment.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmsegment.h new file mode 100644 index 0000000..d3f80c9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmsegment.h @@ -0,0 +1,8 @@ +#ifndef _ASM_MMSEGMENT_H +#define _ASM_MMSEGMENT_H 1 + +typedef struct { + unsigned long seg; +} mm_segment_t; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu.h new file mode 100644 index 0000000..5dc6ed7 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu.h @@ -0,0 +1,20 @@ +#ifndef __x86_64_MMU_H +#define __x86_64_MMU_H + +#include +#include + +/* + * The x86_64 doesn't have a mmu context, but + * we put the segment information here. + * + * cpu_vm_mask is used to optimize ldt flushing. + */ +typedef struct { + void *ldt; + rwlock_t ldtlock; + int size; + struct semaphore sem; +} mm_context_t; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu_context.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu_context.h new file mode 100644 index 0000000..af03b9f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmu_context.h @@ -0,0 +1,73 @@ +#ifndef __X86_64_MMU_CONTEXT_H +#define __X86_64_MMU_CONTEXT_H + +#include +#include +#include +#include +#include +#include + +/* + * possibly do the LDT unload here? + */ +int init_new_context(struct task_struct *tsk, struct mm_struct *mm); +void destroy_context(struct mm_struct *mm); + +static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) +{ +#ifdef CONFIG_SMP + if (read_pda(mmu_state) == TLBSTATE_OK) + write_pda(mmu_state, TLBSTATE_LAZY); +#endif +} + +static inline void load_cr3(pgd_t *pgd) +{ + asm volatile("movq %0,%%cr3" :: "r" (__pa(pgd)) : "memory"); +} + +static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, + struct task_struct *tsk) +{ + unsigned cpu = smp_processor_id(); + if (likely(prev != next)) { + /* stop flush ipis for the previous mm */ + cpu_clear(cpu, prev->cpu_vm_mask); +#ifdef CONFIG_SMP + write_pda(mmu_state, TLBSTATE_OK); + write_pda(active_mm, next); +#endif + cpu_set(cpu, next->cpu_vm_mask); + load_cr3(next->pgd); + + if (unlikely(next->context.ldt != prev->context.ldt)) + load_LDT_nolock(&next->context, cpu); + } +#ifdef CONFIG_SMP + else { + write_pda(mmu_state, TLBSTATE_OK); + if (read_pda(active_mm) != next) + out_of_line_bug(); + if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) { + /* We were in lazy tlb mode and leave_mm disabled + * tlb flush IPI delivery. We must reload CR3 + * to make sure to use no freed page tables. + */ + load_cr3(next->pgd); + load_LDT_nolock(&next->context, cpu); + } + } +#endif +} + +#define deactivate_mm(tsk,mm) do { \ + load_gs_index(0); \ + asm volatile("movl %0,%%fs"::"r"(0)); \ +} while(0) + +#define activate_mm(prev, next) \ + switch_mm((prev),(next),NULL) + + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmx.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmx.h new file mode 100644 index 0000000..46b71da --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmx.h @@ -0,0 +1,14 @@ +#ifndef _ASM_MMX_H +#define _ASM_MMX_H + +/* + * MMX 3Dnow! helper operations + */ + +#include + +extern void *_mmx_memcpy(void *to, const void *from, size_t size); +extern void mmx_clear_page(void *page); +extern void mmx_copy_page(void *to, void *from); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmzone.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmzone.h new file mode 100644 index 0000000..c38ebdf --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mmzone.h @@ -0,0 +1,50 @@ +/* K8 NUMA support */ +/* Copyright 2002,2003 by Andi Kleen, SuSE Labs */ +/* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */ +#ifndef _ASM_X86_64_MMZONE_H +#define _ASM_X86_64_MMZONE_H 1 + + +#ifdef CONFIG_NUMA + +#define VIRTUAL_BUG_ON(x) + +#include + +/* Should really switch to dynamic allocation at some point */ +#define NODEMAPSIZE 0x4fff + +/* Simple perfect hash to map physical addresses to node numbers */ +struct memnode { + int shift; + u8 map[NODEMAPSIZE]; +} ____cacheline_aligned; +extern struct memnode memnode; +#define memnode_shift memnode.shift +#define memnodemap memnode.map + +extern struct pglist_data *node_data[]; + +static inline __attribute__((pure)) int phys_to_nid(unsigned long addr) +{ + unsigned nid; + VIRTUAL_BUG_ON((addr >> memnode_shift) >= NODEMAPSIZE); + nid = memnodemap[addr >> memnode_shift]; + VIRTUAL_BUG_ON(nid >= MAX_NUMNODES || !node_data[nid]); + return nid; +} + +#define NODE_DATA(nid) (node_data[nid]) + +#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn) +#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \ + NODE_DATA(nid)->node_spanned_pages) + +#ifdef CONFIG_DISCONTIGMEM +#define pfn_to_nid(pfn) phys_to_nid((unsigned long)(pfn) << PAGE_SHIFT) + +extern int pfn_valid(unsigned long pfn); +#endif + +#endif +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/module.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/module.h new file mode 100644 index 0000000..3a7373a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/module.h @@ -0,0 +1,15 @@ +#ifndef _ASM_X8664_MODULE_H +#define _ASM_X8664_MODULE_H + +struct mod_arch_specific {}; + +#define MODULES_ARE_ELF64 +#define Elf_Shdr Elf64_Shdr +#define Elf_Sym Elf64_Sym +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Rel Elf64_Rel +#define Elf_Rela Elf64_Rela +#define ELF_R_TYPE(X) ELF64_R_TYPE(X) +#define ELF_R_SYM(X) ELF64_R_SYM(X) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mpspec.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mpspec.h new file mode 100644 index 0000000..14fc3dd --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mpspec.h @@ -0,0 +1,242 @@ +#ifndef __ASM_MPSPEC_H +#define __ASM_MPSPEC_H + +/* + * Structure definitions for SMP machines following the + * Intel Multiprocessing Specification 1.1 and 1.4. + */ + +/* + * This tag identifies where the SMP configuration + * information is. + */ + +#define SMP_MAGIC_IDENT (('_'<<24)|('P'<<16)|('M'<<8)|'_') + +/* + * A maximum of 255 APICs with the current APIC ID architecture. + */ +#define MAX_APICS 255 + +struct intel_mp_floating +{ + char mpf_signature[4]; /* "_MP_" */ + unsigned int mpf_physptr; /* Configuration table address */ + unsigned char mpf_length; /* Our length (paragraphs) */ + unsigned char mpf_specification;/* Specification version */ + unsigned char mpf_checksum; /* Checksum (makes sum 0) */ + unsigned char mpf_feature1; /* Standard or configuration ? */ + unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */ + unsigned char mpf_feature3; /* Unused (0) */ + unsigned char mpf_feature4; /* Unused (0) */ + unsigned char mpf_feature5; /* Unused (0) */ +}; + +struct mp_config_table +{ + char mpc_signature[4]; +#define MPC_SIGNATURE "PCMP" + unsigned short mpc_length; /* Size of table */ + char mpc_spec; /* 0x01 */ + char mpc_checksum; + char mpc_oem[8]; + char mpc_productid[12]; + unsigned int mpc_oemptr; /* 0 if not present */ + unsigned short mpc_oemsize; /* 0 if not present */ + unsigned short mpc_oemcount; + unsigned int mpc_lapic; /* APIC address */ + unsigned int reserved; +}; + +/* Followed by entries */ + +#define MP_PROCESSOR 0 +#define MP_BUS 1 +#define MP_IOAPIC 2 +#define MP_INTSRC 3 +#define MP_LINTSRC 4 + +struct mpc_config_processor +{ + unsigned char mpc_type; + unsigned char mpc_apicid; /* Local APIC number */ + unsigned char mpc_apicver; /* Its versions */ + unsigned char mpc_cpuflag; +#define CPU_ENABLED 1 /* Processor is available */ +#define CPU_BOOTPROCESSOR 2 /* Processor is the BP */ + unsigned int mpc_cpufeature; +#define CPU_STEPPING_MASK 0x0F +#define CPU_MODEL_MASK 0xF0 +#define CPU_FAMILY_MASK 0xF00 + unsigned int mpc_featureflag; /* CPUID feature value */ + unsigned int mpc_reserved[2]; +}; + +struct mpc_config_bus +{ + unsigned char mpc_type; + unsigned char mpc_busid; + unsigned char mpc_bustype[6]; +}; + +/* List of Bus Type string values, Intel MP Spec. */ +#define BUSTYPE_EISA "EISA" +#define BUSTYPE_ISA "ISA" +#define BUSTYPE_INTERN "INTERN" /* Internal BUS */ +#define BUSTYPE_MCA "MCA" +#define BUSTYPE_VL "VL" /* Local bus */ +#define BUSTYPE_PCI "PCI" +#define BUSTYPE_PCMCIA "PCMCIA" +#define BUSTYPE_CBUS "CBUS" +#define BUSTYPE_CBUSII "CBUSII" +#define BUSTYPE_FUTURE "FUTURE" +#define BUSTYPE_MBI "MBI" +#define BUSTYPE_MBII "MBII" +#define BUSTYPE_MPI "MPI" +#define BUSTYPE_MPSA "MPSA" +#define BUSTYPE_NUBUS "NUBUS" +#define BUSTYPE_TC "TC" +#define BUSTYPE_VME "VME" +#define BUSTYPE_XPRESS "XPRESS" + +struct mpc_config_ioapic +{ + unsigned char mpc_type; + unsigned char mpc_apicid; + unsigned char mpc_apicver; + unsigned char mpc_flags; +#define MPC_APIC_USABLE 0x01 + unsigned int mpc_apicaddr; +}; + +struct mpc_config_intsrc +{ + unsigned char mpc_type; + unsigned char mpc_irqtype; + unsigned short mpc_irqflag; + unsigned char mpc_srcbus; + unsigned char mpc_srcbusirq; + unsigned char mpc_dstapic; + unsigned char mpc_dstirq; +}; + +enum mp_irq_source_types { + mp_INT = 0, + mp_NMI = 1, + mp_SMI = 2, + mp_ExtINT = 3 +}; + +#define MP_IRQDIR_DEFAULT 0 +#define MP_IRQDIR_HIGH 1 +#define MP_IRQDIR_LOW 3 + + +struct mpc_config_lintsrc +{ + unsigned char mpc_type; + unsigned char mpc_irqtype; + unsigned short mpc_irqflag; + unsigned char mpc_srcbusid; + unsigned char mpc_srcbusirq; + unsigned char mpc_destapic; +#define MP_APIC_ALL 0xFF + unsigned char mpc_destapiclint; +}; + +/* + * Default configurations + * + * 1 2 CPU ISA 82489DX + * 2 2 CPU EISA 82489DX neither IRQ 0 timer nor IRQ 13 DMA chaining + * 3 2 CPU EISA 82489DX + * 4 2 CPU MCA 82489DX + * 5 2 CPU ISA+PCI + * 6 2 CPU EISA+PCI + * 7 2 CPU MCA+PCI + */ + +#define MAX_MP_BUSSES 256 +/* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */ +#define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4) +enum mp_bustype { + MP_BUS_ISA = 1, + MP_BUS_EISA, + MP_BUS_PCI, + MP_BUS_MCA +}; +extern unsigned char mp_bus_id_to_type [MAX_MP_BUSSES]; +extern int mp_bus_id_to_pci_bus [MAX_MP_BUSSES]; + +extern unsigned int boot_cpu_physical_apicid; +extern int smp_found_config; +extern void find_smp_config (void); +extern void get_smp_config (void); +extern int nr_ioapics; +extern unsigned char apic_version [MAX_APICS]; +extern int mp_irq_entries; +extern struct mpc_config_intsrc mp_irqs [MAX_IRQ_SOURCES]; +extern int mpc_default_type; +extern unsigned long mp_lapic_addr; +extern int pic_mode; + +#ifdef CONFIG_ACPI +extern void mp_register_lapic (u8 id, u8 enabled); +extern void mp_register_lapic_address (u64 address); + +#ifdef CONFIG_X86_IO_APIC +extern void mp_register_ioapic (u8 id, u32 address, u32 gsi_base); +extern void mp_override_legacy_irq (u8 bus_irq, u8 polarity, u8 trigger, u32 gsi); +extern void mp_config_acpi_legacy_irqs (void); +extern int mp_register_gsi (u32 gsi, int triggering, int polarity); +#endif /*CONFIG_X86_IO_APIC*/ +#endif + +extern int using_apic_timer; + +#define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS) + +struct physid_mask +{ + unsigned long mask[PHYSID_ARRAY_SIZE]; +}; + +typedef struct physid_mask physid_mask_t; + +#define physid_set(physid, map) set_bit(physid, (map).mask) +#define physid_clear(physid, map) clear_bit(physid, (map).mask) +#define physid_isset(physid, map) test_bit(physid, (map).mask) +#define physid_test_and_set(physid, map) test_and_set_bit(physid, (map).mask) + +#define physids_and(dst, src1, src2) bitmap_and((dst).mask, (src1).mask, (src2).mask, MAX_APICS) +#define physids_or(dst, src1, src2) bitmap_or((dst).mask, (src1).mask, (src2).mask, MAX_APICS) +#define physids_clear(map) bitmap_zero((map).mask, MAX_APICS) +#define physids_complement(dst, src) bitmap_complement((dst).mask, (src).mask, MAX_APICS) +#define physids_empty(map) bitmap_empty((map).mask, MAX_APICS) +#define physids_equal(map1, map2) bitmap_equal((map1).mask, (map2).mask, MAX_APICS) +#define physids_weight(map) bitmap_weight((map).mask, MAX_APICS) +#define physids_shift_right(d, s, n) bitmap_shift_right((d).mask, (s).mask, n, MAX_APICS) +#define physids_shift_left(d, s, n) bitmap_shift_left((d).mask, (s).mask, n, MAX_APICS) +#define physids_coerce(map) ((map).mask[0]) + +#define physids_promote(physids) \ + ({ \ + physid_mask_t __physid_mask = PHYSID_MASK_NONE; \ + __physid_mask.mask[0] = physids; \ + __physid_mask; \ + }) + +#define physid_mask_of_physid(physid) \ + ({ \ + physid_mask_t __physid_mask = PHYSID_MASK_NONE; \ + physid_set(physid, __physid_mask); \ + __physid_mask; \ + }) + +#define PHYSID_MASK_ALL { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} } +#define PHYSID_MASK_NONE { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} } + +extern physid_mask_t phys_cpu_present_map; + +#endif + diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msgbuf.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msgbuf.h new file mode 100644 index 0000000..cd6f95d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msgbuf.h @@ -0,0 +1,27 @@ +#ifndef _X8664_MSGBUF_H +#define _X8664_MSGBUF_H + +/* + * The msqid64_ds structure for x86-64 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 2 miscellaneous 64-bit values + */ + +struct msqid64_ds { + struct ipc64_perm msg_perm; + __kernel_time_t msg_stime; /* last msgsnd time */ + __kernel_time_t msg_rtime; /* last msgrcv time */ + __kernel_time_t msg_ctime; /* last change time */ + unsigned long msg_cbytes; /* current number of bytes on queue */ + unsigned long msg_qnum; /* number of messages in queue */ + unsigned long msg_qbytes; /* max number of bytes on queue */ + __kernel_pid_t msg_lspid; /* pid of last msgsnd */ + __kernel_pid_t msg_lrpid; /* last receive pid */ + unsigned long __unused4; + unsigned long __unused5; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msi.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msi.h new file mode 100644 index 0000000..3ad2346 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msi.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2003-2004 Intel + * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) + */ + +#ifndef ASM_MSI_H +#define ASM_MSI_H + +#include +#include +#include + +#define LAST_DEVICE_VECTOR (FIRST_SYSTEM_VECTOR - 1) +#define MSI_TARGET_CPU_SHIFT 12 + +extern struct msi_ops msi_apic_ops; + +static inline int msi_arch_init(void) +{ + msi_register(&msi_apic_ops); + return 0; +} + +#endif /* ASM_MSI_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msr.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msr.h new file mode 100644 index 0000000..cdc629e --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/msr.h @@ -0,0 +1,410 @@ +#ifndef X86_64_MSR_H +#define X86_64_MSR_H 1 + +#ifndef __ASSEMBLY__ +/* + * Access to machine-specific registers (available on 586 and better only) + * Note: the rd* operations modify the parameters directly (without using + * pointer indirection), this allows gcc to optimize better + */ + +#define rdmsr(msr,val1,val2) \ + __asm__ __volatile__("rdmsr" \ + : "=a" (val1), "=d" (val2) \ + : "c" (msr)) + + +#define rdmsrl(msr,val) do { unsigned long a__,b__; \ + __asm__ __volatile__("rdmsr" \ + : "=a" (a__), "=d" (b__) \ + : "c" (msr)); \ + val = a__ | (b__<<32); \ +} while(0) + +#define wrmsr(msr,val1,val2) \ + __asm__ __volatile__("wrmsr" \ + : /* no outputs */ \ + : "c" (msr), "a" (val1), "d" (val2)) + +#define wrmsrl(msr,val) wrmsr(msr,(__u32)((__u64)(val)),((__u64)(val))>>32) + +/* wrmsr with exception handling */ +#define wrmsr_safe(msr,a,b) ({ int ret__; \ + asm volatile("2: wrmsr ; xorl %0,%0\n" \ + "1:\n\t" \ + ".section .fixup,\"ax\"\n\t" \ + "3: movl %4,%0 ; jmp 1b\n\t" \ + ".previous\n\t" \ + ".section __ex_table,\"a\"\n" \ + " .align 8\n\t" \ + " .quad 2b,3b\n\t" \ + ".previous" \ + : "=a" (ret__) \ + : "c" (msr), "0" (a), "d" (b), "i" (-EFAULT)); \ + ret__; }) + +#define checking_wrmsrl(msr,val) wrmsr_safe(msr,(u32)(val),(u32)((val)>>32)) + +#define rdmsr_safe(msr,a,b) \ + ({ int ret__; \ + asm volatile ("1: rdmsr\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: movl %4,%0\n" \ + " jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .align 8\n" \ + " .quad 1b,3b\n" \ + ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b))\ + :"c"(msr), "i"(-EIO), "0"(0)); \ + ret__; }) + +#define rdtsc(low,high) \ + __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) + +#define rdtscl(low) \ + __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") + +#define rdtscp(low,high,aux) \ + asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (low), "=d" (high), "=c" (aux)) + +#define rdtscll(val) do { \ + unsigned int __a,__d; \ + asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \ + (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ +} while(0) + +#define rdtscpll(val, aux) do { \ + unsigned long __a, __d; \ + asm volatile (".byte 0x0f,0x01,0xf9" : "=a" (__a), "=d" (__d), "=c" (aux)); \ + (val) = (__d << 32) | __a; \ +} while (0) + +#define write_tsc(val1,val2) wrmsr(0x10, val1, val2) + +#define write_rdtscp_aux(val) wrmsr(0xc0000103, val, 0) + +#define rdpmc(counter,low,high) \ + __asm__ __volatile__("rdpmc" \ + : "=a" (low), "=d" (high) \ + : "c" (counter)) + +static inline void cpuid(int op, unsigned int *eax, unsigned int *ebx, + unsigned int *ecx, unsigned int *edx) +{ + __asm__("cpuid" + : "=a" (*eax), + "=b" (*ebx), + "=c" (*ecx), + "=d" (*edx) + : "0" (op)); +} + +/* Some CPUID calls want 'count' to be placed in ecx */ +static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx, + int *edx) +{ + __asm__("cpuid" + : "=a" (*eax), + "=b" (*ebx), + "=c" (*ecx), + "=d" (*edx) + : "0" (op), "c" (count)); +} + +/* + * CPUID functions returning a single datum + */ +static inline unsigned int cpuid_eax(unsigned int op) +{ + unsigned int eax; + + __asm__("cpuid" + : "=a" (eax) + : "0" (op) + : "bx", "cx", "dx"); + return eax; +} +static inline unsigned int cpuid_ebx(unsigned int op) +{ + unsigned int eax, ebx; + + __asm__("cpuid" + : "=a" (eax), "=b" (ebx) + : "0" (op) + : "cx", "dx" ); + return ebx; +} +static inline unsigned int cpuid_ecx(unsigned int op) +{ + unsigned int eax, ecx; + + __asm__("cpuid" + : "=a" (eax), "=c" (ecx) + : "0" (op) + : "bx", "dx" ); + return ecx; +} +static inline unsigned int cpuid_edx(unsigned int op) +{ + unsigned int eax, edx; + + __asm__("cpuid" + : "=a" (eax), "=d" (edx) + : "0" (op) + : "bx", "cx"); + return edx; +} + +#define MSR_IA32_UCODE_WRITE 0x79 +#define MSR_IA32_UCODE_REV 0x8b + + +#endif + +/* AMD/K8 specific MSRs */ +#define MSR_EFER 0xc0000080 /* extended feature register */ +#define MSR_STAR 0xc0000081 /* legacy mode SYSCALL target */ +#define MSR_LSTAR 0xc0000082 /* long mode SYSCALL target */ +#define MSR_CSTAR 0xc0000083 /* compatibility mode SYSCALL target */ +#define MSR_SYSCALL_MASK 0xc0000084 /* EFLAGS mask for syscall */ +#define MSR_FS_BASE 0xc0000100 /* 64bit GS base */ +#define MSR_GS_BASE 0xc0000101 /* 64bit FS base */ +#define MSR_KERNEL_GS_BASE 0xc0000102 /* SwapGS GS shadow (or USER_GS from kernel) */ +/* EFER bits: */ +#define _EFER_SCE 0 /* SYSCALL/SYSRET */ +#define _EFER_LME 8 /* Long mode enable */ +#define _EFER_LMA 10 /* Long mode active (read-only) */ +#define _EFER_NX 11 /* No execute enable */ + +#define EFER_SCE (1<<_EFER_SCE) +#define EFER_LME (1<<_EFER_LME) +#define EFER_LMA (1<<_EFER_LMA) +#define EFER_NX (1<<_EFER_NX) + +/* Intel MSRs. Some also available on other CPUs */ +#define MSR_IA32_TSC 0x10 +#define MSR_IA32_PLATFORM_ID 0x17 + +#define MSR_IA32_PERFCTR0 0xc1 +#define MSR_IA32_PERFCTR1 0xc2 + +#define MSR_MTRRcap 0x0fe +#define MSR_IA32_BBL_CR_CTL 0x119 + +#define MSR_IA32_SYSENTER_CS 0x174 +#define MSR_IA32_SYSENTER_ESP 0x175 +#define MSR_IA32_SYSENTER_EIP 0x176 + +#define MSR_IA32_MCG_CAP 0x179 +#define MSR_IA32_MCG_STATUS 0x17a +#define MSR_IA32_MCG_CTL 0x17b + +#define MSR_IA32_EVNTSEL0 0x186 +#define MSR_IA32_EVNTSEL1 0x187 + +#define MSR_IA32_DEBUGCTLMSR 0x1d9 +#define MSR_IA32_LASTBRANCHFROMIP 0x1db +#define MSR_IA32_LASTBRANCHTOIP 0x1dc +#define MSR_IA32_LASTINTFROMIP 0x1dd +#define MSR_IA32_LASTINTTOIP 0x1de + +#define MSR_MTRRfix64K_00000 0x250 +#define MSR_MTRRfix16K_80000 0x258 +#define MSR_MTRRfix16K_A0000 0x259 +#define MSR_MTRRfix4K_C0000 0x268 +#define MSR_MTRRfix4K_C8000 0x269 +#define MSR_MTRRfix4K_D0000 0x26a +#define MSR_MTRRfix4K_D8000 0x26b +#define MSR_MTRRfix4K_E0000 0x26c +#define MSR_MTRRfix4K_E8000 0x26d +#define MSR_MTRRfix4K_F0000 0x26e +#define MSR_MTRRfix4K_F8000 0x26f +#define MSR_MTRRdefType 0x2ff + +#define MSR_IA32_MC0_CTL 0x400 +#define MSR_IA32_MC0_STATUS 0x401 +#define MSR_IA32_MC0_ADDR 0x402 +#define MSR_IA32_MC0_MISC 0x403 + +#define MSR_P6_PERFCTR0 0xc1 +#define MSR_P6_PERFCTR1 0xc2 +#define MSR_P6_EVNTSEL0 0x186 +#define MSR_P6_EVNTSEL1 0x187 + +/* K7/K8 MSRs. Not complete. See the architecture manual for a more complete list. */ +#define MSR_K7_EVNTSEL0 0xC0010000 +#define MSR_K7_PERFCTR0 0xC0010004 +#define MSR_K7_EVNTSEL1 0xC0010001 +#define MSR_K7_PERFCTR1 0xC0010005 +#define MSR_K7_EVNTSEL2 0xC0010002 +#define MSR_K7_PERFCTR2 0xC0010006 +#define MSR_K7_EVNTSEL3 0xC0010003 +#define MSR_K7_PERFCTR3 0xC0010007 +#define MSR_K8_TOP_MEM1 0xC001001A +#define MSR_K8_TOP_MEM2 0xC001001D +#define MSR_K8_SYSCFG 0xC0010010 +#define MSR_K8_HWCR 0xC0010015 + +/* K6 MSRs */ +#define MSR_K6_EFER 0xC0000080 +#define MSR_K6_STAR 0xC0000081 +#define MSR_K6_WHCR 0xC0000082 +#define MSR_K6_UWCCR 0xC0000085 +#define MSR_K6_PSOR 0xC0000087 +#define MSR_K6_PFIR 0xC0000088 + +/* Centaur-Hauls/IDT defined MSRs. */ +#define MSR_IDT_FCR1 0x107 +#define MSR_IDT_FCR2 0x108 +#define MSR_IDT_FCR3 0x109 +#define MSR_IDT_FCR4 0x10a + +#define MSR_IDT_MCR0 0x110 +#define MSR_IDT_MCR1 0x111 +#define MSR_IDT_MCR2 0x112 +#define MSR_IDT_MCR3 0x113 +#define MSR_IDT_MCR4 0x114 +#define MSR_IDT_MCR5 0x115 +#define MSR_IDT_MCR6 0x116 +#define MSR_IDT_MCR7 0x117 +#define MSR_IDT_MCR_CTRL 0x120 + +/* VIA Cyrix defined MSRs*/ +#define MSR_VIA_FCR 0x1107 +#define MSR_VIA_LONGHAUL 0x110a +#define MSR_VIA_RNG 0x110b +#define MSR_VIA_BCR2 0x1147 + +/* Intel defined MSRs. */ +#define MSR_IA32_P5_MC_ADDR 0 +#define MSR_IA32_P5_MC_TYPE 1 +#define MSR_IA32_PLATFORM_ID 0x17 +#define MSR_IA32_EBL_CR_POWERON 0x2a + +#define MSR_IA32_APICBASE 0x1b +#define MSR_IA32_APICBASE_BSP (1<<8) +#define MSR_IA32_APICBASE_ENABLE (1<<11) +#define MSR_IA32_APICBASE_BASE (0xfffff<<12) + +/* P4/Xeon+ specific */ +#define MSR_IA32_MCG_EAX 0x180 +#define MSR_IA32_MCG_EBX 0x181 +#define MSR_IA32_MCG_ECX 0x182 +#define MSR_IA32_MCG_EDX 0x183 +#define MSR_IA32_MCG_ESI 0x184 +#define MSR_IA32_MCG_EDI 0x185 +#define MSR_IA32_MCG_EBP 0x186 +#define MSR_IA32_MCG_ESP 0x187 +#define MSR_IA32_MCG_EFLAGS 0x188 +#define MSR_IA32_MCG_EIP 0x189 +#define MSR_IA32_MCG_RESERVED 0x18A + +#define MSR_P6_EVNTSEL0 0x186 +#define MSR_P6_EVNTSEL1 0x187 + +#define MSR_IA32_PERF_STATUS 0x198 +#define MSR_IA32_PERF_CTL 0x199 + +#define MSR_IA32_THERM_CONTROL 0x19a +#define MSR_IA32_THERM_INTERRUPT 0x19b +#define MSR_IA32_THERM_STATUS 0x19c +#define MSR_IA32_MISC_ENABLE 0x1a0 + +#define MSR_IA32_DEBUGCTLMSR 0x1d9 +#define MSR_IA32_LASTBRANCHFROMIP 0x1db +#define MSR_IA32_LASTBRANCHTOIP 0x1dc +#define MSR_IA32_LASTINTFROMIP 0x1dd +#define MSR_IA32_LASTINTTOIP 0x1de + +#define MSR_IA32_MC0_CTL 0x400 +#define MSR_IA32_MC0_STATUS 0x401 +#define MSR_IA32_MC0_ADDR 0x402 +#define MSR_IA32_MC0_MISC 0x403 + +/* Pentium IV performance counter MSRs */ +#define MSR_P4_BPU_PERFCTR0 0x300 +#define MSR_P4_BPU_PERFCTR1 0x301 +#define MSR_P4_BPU_PERFCTR2 0x302 +#define MSR_P4_BPU_PERFCTR3 0x303 +#define MSR_P4_MS_PERFCTR0 0x304 +#define MSR_P4_MS_PERFCTR1 0x305 +#define MSR_P4_MS_PERFCTR2 0x306 +#define MSR_P4_MS_PERFCTR3 0x307 +#define MSR_P4_FLAME_PERFCTR0 0x308 +#define MSR_P4_FLAME_PERFCTR1 0x309 +#define MSR_P4_FLAME_PERFCTR2 0x30a +#define MSR_P4_FLAME_PERFCTR3 0x30b +#define MSR_P4_IQ_PERFCTR0 0x30c +#define MSR_P4_IQ_PERFCTR1 0x30d +#define MSR_P4_IQ_PERFCTR2 0x30e +#define MSR_P4_IQ_PERFCTR3 0x30f +#define MSR_P4_IQ_PERFCTR4 0x310 +#define MSR_P4_IQ_PERFCTR5 0x311 +#define MSR_P4_BPU_CCCR0 0x360 +#define MSR_P4_BPU_CCCR1 0x361 +#define MSR_P4_BPU_CCCR2 0x362 +#define MSR_P4_BPU_CCCR3 0x363 +#define MSR_P4_MS_CCCR0 0x364 +#define MSR_P4_MS_CCCR1 0x365 +#define MSR_P4_MS_CCCR2 0x366 +#define MSR_P4_MS_CCCR3 0x367 +#define MSR_P4_FLAME_CCCR0 0x368 +#define MSR_P4_FLAME_CCCR1 0x369 +#define MSR_P4_FLAME_CCCR2 0x36a +#define MSR_P4_FLAME_CCCR3 0x36b +#define MSR_P4_IQ_CCCR0 0x36c +#define MSR_P4_IQ_CCCR1 0x36d +#define MSR_P4_IQ_CCCR2 0x36e +#define MSR_P4_IQ_CCCR3 0x36f +#define MSR_P4_IQ_CCCR4 0x370 +#define MSR_P4_IQ_CCCR5 0x371 +#define MSR_P4_ALF_ESCR0 0x3ca +#define MSR_P4_ALF_ESCR1 0x3cb +#define MSR_P4_BPU_ESCR0 0x3b2 +#define MSR_P4_BPU_ESCR1 0x3b3 +#define MSR_P4_BSU_ESCR0 0x3a0 +#define MSR_P4_BSU_ESCR1 0x3a1 +#define MSR_P4_CRU_ESCR0 0x3b8 +#define MSR_P4_CRU_ESCR1 0x3b9 +#define MSR_P4_CRU_ESCR2 0x3cc +#define MSR_P4_CRU_ESCR3 0x3cd +#define MSR_P4_CRU_ESCR4 0x3e0 +#define MSR_P4_CRU_ESCR5 0x3e1 +#define MSR_P4_DAC_ESCR0 0x3a8 +#define MSR_P4_DAC_ESCR1 0x3a9 +#define MSR_P4_FIRM_ESCR0 0x3a4 +#define MSR_P4_FIRM_ESCR1 0x3a5 +#define MSR_P4_FLAME_ESCR0 0x3a6 +#define MSR_P4_FLAME_ESCR1 0x3a7 +#define MSR_P4_FSB_ESCR0 0x3a2 +#define MSR_P4_FSB_ESCR1 0x3a3 +#define MSR_P4_IQ_ESCR0 0x3ba +#define MSR_P4_IQ_ESCR1 0x3bb +#define MSR_P4_IS_ESCR0 0x3b4 +#define MSR_P4_IS_ESCR1 0x3b5 +#define MSR_P4_ITLB_ESCR0 0x3b6 +#define MSR_P4_ITLB_ESCR1 0x3b7 +#define MSR_P4_IX_ESCR0 0x3c8 +#define MSR_P4_IX_ESCR1 0x3c9 +#define MSR_P4_MOB_ESCR0 0x3aa +#define MSR_P4_MOB_ESCR1 0x3ab +#define MSR_P4_MS_ESCR0 0x3c0 +#define MSR_P4_MS_ESCR1 0x3c1 +#define MSR_P4_PMH_ESCR0 0x3ac +#define MSR_P4_PMH_ESCR1 0x3ad +#define MSR_P4_RAT_ESCR0 0x3bc +#define MSR_P4_RAT_ESCR1 0x3bd +#define MSR_P4_SAAT_ESCR0 0x3ae +#define MSR_P4_SAAT_ESCR1 0x3af +#define MSR_P4_SSU_ESCR0 0x3be +#define MSR_P4_SSU_ESCR1 0x3bf /* guess: not defined in manual */ +#define MSR_P4_TBPU_ESCR0 0x3c2 +#define MSR_P4_TBPU_ESCR1 0x3c3 +#define MSR_P4_TC_ESCR0 0x3c4 +#define MSR_P4_TC_ESCR1 0x3c5 +#define MSR_P4_U2L_ESCR0 0x3b0 +#define MSR_P4_U2L_ESCR1 0x3b1 + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mtrr.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mtrr.h new file mode 100644 index 0000000..d6135b2 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mtrr.h @@ -0,0 +1,140 @@ +/* Generic MTRR (Memory Type Range Register) ioctls. + + Copyright (C) 1997-1999 Richard Gooch + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + Richard Gooch may be reached by email at rgooch@atnf.csiro.au + The postal address is: + Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. +*/ +#ifndef _LINUX_MTRR_H +#define _LINUX_MTRR_H + +#include + +#define MTRR_IOCTL_BASE 'M' + +struct mtrr_sentry +{ + unsigned long base; /* Base address */ + unsigned int size; /* Size of region */ + unsigned int type; /* Type of region */ +}; + +/* Warning: this structure has a different order from i386 + on x86-64. The 32bit emulation code takes care of that. + But you need to use this for 64bit, otherwise your X server + will break. */ +struct mtrr_gentry +{ + unsigned long base; /* Base address */ + unsigned int size; /* Size of region */ + unsigned int regnum; /* Register number */ + unsigned int type; /* Type of region */ +}; + +/* These are the various ioctls */ +#define MTRRIOC_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry) +#define MTRRIOC_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry) +#define MTRRIOC_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry) +#define MTRRIOC_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry) +#define MTRRIOC_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry) +#define MTRRIOC_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry) +#define MTRRIOC_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry) +#define MTRRIOC_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry) +#define MTRRIOC_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry) +#define MTRRIOC_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry) + +/* These are the region types */ +#define MTRR_TYPE_UNCACHABLE 0 +#define MTRR_TYPE_WRCOMB 1 +/*#define MTRR_TYPE_ 2*/ +/*#define MTRR_TYPE_ 3*/ +#define MTRR_TYPE_WRTHROUGH 4 +#define MTRR_TYPE_WRPROT 5 +#define MTRR_TYPE_WRBACK 6 +#define MTRR_NUM_TYPES 7 + +#ifdef __KERNEL__ + +/* The following functions are for use by other drivers */ +# ifdef CONFIG_MTRR +extern int mtrr_add (unsigned long base, unsigned long size, + unsigned int type, char increment); +extern int mtrr_add_page (unsigned long base, unsigned long size, + unsigned int type, char increment); +extern int mtrr_del (int reg, unsigned long base, unsigned long size); +extern int mtrr_del_page (int reg, unsigned long base, unsigned long size); +# else +static __inline__ int mtrr_add (unsigned long base, unsigned long size, + unsigned int type, char increment) +{ + return -ENODEV; +} +static __inline__ int mtrr_add_page (unsigned long base, unsigned long size, + unsigned int type, char increment) +{ + return -ENODEV; +} +static __inline__ int mtrr_del (int reg, unsigned long base, + unsigned long size) +{ + return -ENODEV; +} +static __inline__ int mtrr_del_page (int reg, unsigned long base, + unsigned long size) +{ + return -ENODEV; +} + +#endif /* CONFIG_MTRR */ + +#ifdef CONFIG_COMPAT +#include + +struct mtrr_sentry32 +{ + compat_ulong_t base; /* Base address */ + compat_uint_t size; /* Size of region */ + compat_uint_t type; /* Type of region */ +}; + +struct mtrr_gentry32 +{ + compat_ulong_t regnum; /* Register number */ + compat_uint_t base; /* Base address */ + compat_uint_t size; /* Size of region */ + compat_uint_t type; /* Type of region */ +}; + +#define MTRR_IOCTL_BASE 'M' + +#define MTRRIOC32_ADD_ENTRY _IOW(MTRR_IOCTL_BASE, 0, struct mtrr_sentry32) +#define MTRRIOC32_SET_ENTRY _IOW(MTRR_IOCTL_BASE, 1, struct mtrr_sentry32) +#define MTRRIOC32_DEL_ENTRY _IOW(MTRR_IOCTL_BASE, 2, struct mtrr_sentry32) +#define MTRRIOC32_GET_ENTRY _IOWR(MTRR_IOCTL_BASE, 3, struct mtrr_gentry32) +#define MTRRIOC32_KILL_ENTRY _IOW(MTRR_IOCTL_BASE, 4, struct mtrr_sentry32) +#define MTRRIOC32_ADD_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 5, struct mtrr_sentry32) +#define MTRRIOC32_SET_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 6, struct mtrr_sentry32) +#define MTRRIOC32_DEL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 7, struct mtrr_sentry32) +#define MTRRIOC32_GET_PAGE_ENTRY _IOWR(MTRR_IOCTL_BASE, 8, struct mtrr_gentry32) +#define MTRRIOC32_KILL_PAGE_ENTRY _IOW(MTRR_IOCTL_BASE, 9, struct mtrr_sentry32) + +#endif /* CONFIG_COMPAT */ + +#endif /* __KERNEL__ */ + +#endif /* _LINUX_MTRR_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mutex.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mutex.h new file mode 100644 index 0000000..06fab6d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/mutex.h @@ -0,0 +1,113 @@ +/* + * Assembly implementation of the mutex fastpath, based on atomic + * decrement/increment. + * + * started by Ingo Molnar: + * + * Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar + */ +#ifndef _ASM_MUTEX_H +#define _ASM_MUTEX_H + +/** + * __mutex_fastpath_lock - decrement and call function if negative + * @v: pointer of type atomic_t + * @fail_fn: function to call if the result is negative + * + * Atomically decrements @v and calls if the result is negative. + */ +#define __mutex_fastpath_lock(v, fail_fn) \ +do { \ + unsigned long dummy; \ + \ + typecheck(atomic_t *, v); \ + typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \ + \ + __asm__ __volatile__( \ + LOCK_PREFIX " decl (%%rdi) \n" \ + " js 2f \n" \ + "1: \n" \ + \ + LOCK_SECTION_START("") \ + "2: call "#fail_fn" \n" \ + " jmp 1b \n" \ + LOCK_SECTION_END \ + \ + :"=D" (dummy) \ + : "D" (v) \ + : "rax", "rsi", "rdx", "rcx", \ + "r8", "r9", "r10", "r11", "memory"); \ +} while (0) + +/** + * __mutex_fastpath_lock_retval - try to take the lock by moving the count + * from 1 to a 0 value + * @count: pointer of type atomic_t + * @fail_fn: function to call if the original value was not 1 + * + * Change the count from 1 to a value lower than 1, and call if + * it wasn't 1 originally. This function returns 0 if the fastpath succeeds, + * or anything the slow path function returns + */ +static inline int +__mutex_fastpath_lock_retval(atomic_t *count, + int fastcall (*fail_fn)(atomic_t *)) +{ + if (unlikely(atomic_dec_return(count) < 0)) + return fail_fn(count); + else + return 0; +} + +/** + * __mutex_fastpath_unlock - increment and call function if nonpositive + * @v: pointer of type atomic_t + * @fail_fn: function to call if the result is nonpositive + * + * Atomically increments @v and calls if the result is nonpositive. + */ +#define __mutex_fastpath_unlock(v, fail_fn) \ +do { \ + unsigned long dummy; \ + \ + typecheck(atomic_t *, v); \ + typecheck_fn(fastcall void (*)(atomic_t *), fail_fn); \ + \ + __asm__ __volatile__( \ + LOCK_PREFIX " incl (%%rdi) \n" \ + " jle 2f \n" \ + "1: \n" \ + \ + LOCK_SECTION_START("") \ + "2: call "#fail_fn" \n" \ + " jmp 1b \n" \ + LOCK_SECTION_END \ + \ + :"=D" (dummy) \ + : "D" (v) \ + : "rax", "rsi", "rdx", "rcx", \ + "r8", "r9", "r10", "r11", "memory"); \ +} while (0) + +#define __mutex_slowpath_needs_to_unlock() 1 + +/** + * __mutex_fastpath_trylock - try to acquire the mutex, without waiting + * + * @count: pointer of type atomic_t + * @fail_fn: fallback function + * + * Change the count from 1 to 0 and return 1 (success), or return 0 (failure) + * if it wasn't 1 originally. [the fallback function is never used on + * x86_64, because all x86_64 CPUs have a CMPXCHG instruction.] + */ +static inline int +__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) +{ + if (likely(atomic_cmpxchg(count, 1, 0) == 1)) + return 1; + else + return 0; +} + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/namei.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/namei.h new file mode 100644 index 0000000..bef239f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/namei.h @@ -0,0 +1,11 @@ +#ifndef __X8664_NAMEI_H +#define __X8664_NAMEI_H + +/* This dummy routine maybe changed to something useful + * for /usr/gnemul/ emulation stuff. + * Look at asm-sparc/namei.h for details. + */ + +#define __emul_prefix() NULL + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/netdump.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/netdump.h new file mode 100644 index 0000000..9f9d31e --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/netdump.h @@ -0,0 +1,79 @@ +#ifndef _ASM_X86_64_NETDUMP_H_ +#define _ASM_X86_64_NETDUMP_H_ + +/* + * linux/include/asm-x86_64/netdump.h + * + * Copyright (c) 2003, 2004 Red Hat, Inc. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifdef __KERNEL__ + +#include + +const static int platform_supports_netdump = 1; + +#define platform_machine_type() (EM_X86_64) + +#define platform_page_is_ram(x) (page_is_ram(x) && \ + kern_addr_valid((unsigned long)pfn_to_kaddr(x))) + +static inline unsigned char platform_effective_version(req_t *req) +{ + if (req->from > 0) + return min_t(unsigned char, req->from, NETDUMP_VERSION_MAX); + else + return 0; +} + +#define platform_max_pfn() (num_physpages) + +static inline u32 platform_next_available(unsigned long pfn) +{ + unsigned long pgnum = next_ram_page(pfn); + + if (pgnum < platform_max_pfn()) { + return (u32)pgnum; + } + return 0; +} + +static inline void platform_jiffy_cycles(unsigned long long *jcp) +{ + unsigned long long t0, t1; + + platform_timestamp(t0); + netdump_mdelay(1); + platform_timestamp(t1); + if (t1 > t0) + *jcp = t1 - t0; +} + +static inline unsigned int platform_get_regs(char *tmp, struct pt_regs *myregs) +{ + elf_gregset_t elf_regs; + char *tmp2; + + tmp2 = tmp + sprintf(tmp, "Sending register info.\n"); + ELF_CORE_COPY_REGS(elf_regs, myregs); + memcpy(tmp2, &elf_regs, sizeof(elf_regs)); + + return(strlen(tmp) + sizeof(elf_regs)); +} +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_NETDUMP_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/nmi.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/nmi.h new file mode 100644 index 0000000..efb45c8 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/nmi.h @@ -0,0 +1,77 @@ +/* + * linux/include/asm-i386/nmi.h + */ +#ifndef ASM_NMI_H +#define ASM_NMI_H + +#include +#include + +struct pt_regs; + +typedef int (*nmi_callback_t)(struct pt_regs * regs, int cpu); + +/** + * set_nmi_callback + * + * Set a handler for an NMI. Only one handler may be + * set. Return 1 if the NMI was handled. + */ +void set_nmi_callback(nmi_callback_t callback); + +/** + * unset_nmi_callback + * + * Remove the handler previously set. + */ +void unset_nmi_callback(void); + +#ifdef CONFIG_PM + +/** Replace the PM callback routine for NMI. */ +struct pm_dev * set_nmi_pm_callback(pm_callback callback); + +/** Unset the PM callback routine back to the default. */ +void unset_nmi_pm_callback(struct pm_dev * dev); + +#else + +static inline struct pm_dev * set_nmi_pm_callback(pm_callback callback) +{ + return 0; +} + +static inline void unset_nmi_pm_callback(struct pm_dev * dev) +{ +} + +#endif /* CONFIG_PM */ + +extern void default_do_nmi(struct pt_regs *); +extern void die_nmi(char *str, struct pt_regs *regs); + +#define get_nmi_reason() inb(0x61) + +extern int panic_on_timeout; +extern int unknown_nmi_panic; + +extern int check_nmi_watchdog(void); + +extern void setup_apic_nmi_watchdog (void); +extern int reserve_lapic_nmi(void); +extern void release_lapic_nmi(void); +extern void disable_timer_nmi_watchdog(void); +extern void enable_timer_nmi_watchdog(void); +extern void nmi_watchdog_tick (struct pt_regs * regs, unsigned reason); + +extern void nmi_watchdog_default(void); +extern int setup_nmi_watchdog(char *); + +extern unsigned int nmi_watchdog; +#define NMI_DEFAULT -1 +#define NMI_NONE 0 +#define NMI_IO_APIC 1 +#define NMI_LOCAL_APIC 2 +#define NMI_INVALID 3 + +#endif /* ASM_NMI_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/node.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/node.h new file mode 100644 index 0000000..0ee6f88 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/node.h @@ -0,0 +1 @@ +#include diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numa.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numa.h new file mode 100644 index 0000000..933ff11 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numa.h @@ -0,0 +1,38 @@ +#ifndef _ASM_X8664_NUMA_H +#define _ASM_X8664_NUMA_H 1 + +#include + +struct bootnode { + u64 start,end; +}; + +extern int compute_hash_shift(struct bootnode *nodes, int numnodes); + +#define ZONE_ALIGN (1UL << (MAX_ORDER+PAGE_SHIFT)) + +extern void numa_add_cpu(int cpu); +extern void numa_init_array(void); +extern int numa_off; + +extern void numa_set_node(int cpu, int node); +extern void srat_reserve_add_area(int nodeid); +extern int hotadd_percent; + +extern unsigned char apicid_to_node[256]; +#ifdef CONFIG_NUMA +extern void __init init_cpu_to_node(void); + +static inline void clear_node_cpumask(int cpu) +{ + clear_bit(cpu, &node_to_cpumask[cpu_to_node(cpu)]); +} + +#else +#define init_cpu_to_node() do {} while (0) +#define clear_node_cpumask(cpu) do {} while (0) +#endif + +#define NUMA_NO_NODE 0xff + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numnodes.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numnodes.h new file mode 100644 index 0000000..c16bb14 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/numnodes.h @@ -0,0 +1,13 @@ +#ifndef _ASM_X8664_NUMNODES_H +#define _ASM_X8664_NUMNODES_H 1 + +#include + +/* Implement this change only for large-SMP configuration */ +#if NR_CPUS > 8 +#define NODES_SHIFT 6 +#else +#define NODES_SHIFT 3 +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/page.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/page.h new file mode 100644 index 0000000..3ebbe0a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/page.h @@ -0,0 +1,237 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef _X86_64_PAGE_H +#define _X86_64_PAGE_H + +#ifdef __KERNEL__ +#include + +/* PAGE_SHIFT determines the page size */ +#if defined(__VMKLNX__) +#include "vmkapi.h" +#define PAGE_SHIFT (VMK_PAGE_SHIFT) +#else /* !defined(__VMKLNX__) */ +#define PAGE_SHIFT 12 +#endif /* defined(__VMKLNX__) */ +#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) +#define PAGE_MASK (~(PAGE_SIZE-1)) +#define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK) + +#define THREAD_ORDER 1 +#define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) +#define CURRENT_MASK (~(THREAD_SIZE-1)) + +#define EXCEPTION_STACK_ORDER 0 +#define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) + +#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) +#define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) + +#define IRQSTACK_ORDER 2 +#define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER) + +#define STACKFAULT_STACK 1 +#define DOUBLEFAULT_STACK 2 +#define NMI_STACK 3 +#define DEBUG_STACK 4 +#define MCE_STACK 5 +#define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ + +#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) +#define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT) + +#define HPAGE_SHIFT PMD_SHIFT +#define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) +#define HPAGE_MASK (~(HPAGE_SIZE - 1)) +#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) + +#ifndef __ASSEMBLY__ + +extern unsigned long end_pfn; + +void clear_page(void *); +void copy_page(void *, void *); + +#define clear_user_page(page, vaddr, pg) clear_page(page) +#define copy_user_page(to, from, vaddr, pg) copy_page(to, from) + +#define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr) +#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE +/* + * These are used to make use of C type-checking.. + */ +typedef struct { unsigned long pte; } pte_t; +typedef struct { unsigned long pmd; } pmd_t; +typedef struct { unsigned long pud; } pud_t; +typedef struct { unsigned long pgd; } pgd_t; +#define PTE_MASK PHYSICAL_PAGE_MASK + +typedef struct { unsigned long pgprot; } pgprot_t; + +extern unsigned long phys_base; + +#define pte_val(x) ((x).pte) +#define pmd_val(x) ((x).pmd) +#define pud_val(x) ((x).pud) +#define pgd_val(x) ((x).pgd) +#define pgprot_val(x) ((x).pgprot) + +#define __pte(x) ((pte_t) { (x) } ) +#define __pmd(x) ((pmd_t) { (x) } ) +#define __pud(x) ((pud_t) { (x) } ) +#define __pgd(x) ((pgd_t) { (x) } ) +#define __pgprot(x) ((pgprot_t) { (x) } ) + +#endif /* !__ASSEMBLY__ */ + +#define __START_KERNEL_map _AC(0xffffffff80000000,UL) +#define __PAGE_OFFSET _AC(0xffff810000000000,UL) + +/** + * PAGE_ALIGN - Align address to the next page boundary + * @addr: Address to align + * + * Aligns address @addr to the next page boundary + * + * SYNOPSIS: + * #define PAGE_ALIGN(addr) + * + * RETURN VALUE: + * The page aligned address + * + */ + /* _VMKLNX_CODECHECK_: PAGE_ALIGN */ +#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) + +/* See Documentation/x86_64/mm.txt for a description of the memory map. */ +#define __PHYSICAL_MASK_SHIFT 46 +#define __PHYSICAL_MASK ((_AC(1,UL) << __PHYSICAL_MASK_SHIFT) - 1) +#define __VIRTUAL_MASK_SHIFT 48 +#define __VIRTUAL_MASK ((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1) + +#define KERNEL_TEXT_SIZE (_AC(40,UL)*1024*1024) +#define KERNEL_TEXT_START _AC(0xffffffff80000000,UL) + +#ifndef __ASSEMBLY__ + +#include + +#endif /* __ASSEMBLY__ */ + +#define PAGE_OFFSET __PAGE_OFFSET + +/* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol. + Otherwise you risk miscompilation. */ +#if defined(__VMKLNX__) +/** + * __pa - virtual address to machine address + * @vaddr: virtual address to convert + * + * Returns the machine address of the physical page that maps to @vaddr. + * + * SYNOPOSIS: + * #define __pa(vaddr) + * + * RETURN VALUE: + * Machine address + */ +/* _VMKLNX_CODECHECK_: __pa */ +#define __pa(vaddr) \ +({ \ + vmk_MachAddr maddr; \ + vmk_VirtAddrToMachAddr((vmk_VirtAddr)(vaddr), &maddr); \ + (unsigned long)maddr; \ +}) + +/** + * __va - machine address to virtual address + * @maddr: machine address to convert + * + * Returns the virtual address of that maps to machine address @maddr. + * + * SYNOPOSIS: + * #define __va(maddr) + * + * RETURN VALUE: + * Virtual address + */ +/* _VMKLNX_CODECHECK_: __va */ +#define __va(maddr) \ +({ \ + vmk_VirtAddr vaddr; \ + vmk_MachAddrToVirtAddr((vmk_MachAddr)(maddr), &vaddr); \ + (void *)vaddr; \ +}) + +/** + * page_to_virt - page handle to virtual address + * @page: page handle + * + * Returns the virtual address that @page maps to. + * + * SYNOPSIS: + * #define page_to_virt(page) + * + * RETURN VALUE: + * virtual address + */ +/* _VMKLNX_CODECHECK_: page_to_virt */ +#define page_to_virt(page) (__va(page_to_pfn(page) << PAGE_SHIFT)) + +/** + * virt_to_page - virtual address to page handle + * @vaddr: virtual address + * + * Returns the handle of the page maps to address @vaddr. + * + * SYNOPSIS: + * #define virt_to_page(vaddr) + * + * ESX Deviation Notes: + * The resulting page handle cannot be derefenced. The returned value + * doesn't correspond to an address of page structure but to the actual page + * number. This page handle needs to be handled through the page api only. + * + * RETURN VALUE: + * page handle + * + */ +/* _VMKLNX_CODECHECK_: virt_to_page */ +#define virt_to_page(vaddr) (pfn_to_page(__pa(vaddr) >> PAGE_SHIFT)) +#else /* !defined(__VMKLNX__) */ +#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET) +/* __pa_symbol should be used for C visible symbols. + This seems to be the official gcc blessed way to do such arithmetic. */ +#define __pa_symbol(x) \ + ({unsigned long v; \ + asm("" : "=r" (v) : "0" (x)); \ + ((v - __START_KERNEL_map) + phys_base); }) +#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) +#ifdef CONFIG_FLATMEM +#define pfn_valid(pfn) ((pfn) < end_pfn) +#endif + +#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) +#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) +#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) + +#define VM_DATA_DEFAULT_FLAGS \ + (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ + VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + +#define __HAVE_ARCH_GATE_AREA 1 +#endif /* defined(__VMKLNX__) */ + +#include +#include + +#if !defined(__VMKLNX__) +#ifndef __ASSEMBLY__ +extern int devmem_is_allowed(unsigned long pagenr); +#endif +#endif /* !defined(__VMKLNX__) */ + +#endif /* __KERNEL__ */ + +#endif /* _X86_64_PAGE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/param.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/param.h new file mode 100644 index 0000000..a728786 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/param.h @@ -0,0 +1,22 @@ +#ifndef _ASMx86_64_PARAM_H +#define _ASMx86_64_PARAM_H + +#ifdef __KERNEL__ +# define HZ CONFIG_HZ /* Internal kernel timer frequency */ +# define USER_HZ 100 /* .. some user interfaces are in "ticks */ +#define CLOCKS_PER_SEC (USER_HZ) /* like times() */ +#endif + +#ifndef HZ +#define HZ 100 +#endif + +#define EXEC_PAGESIZE 4096 + +#ifndef NOGROUP +#define NOGROUP (-1) +#endif + +#define MAXHOSTNAMELEN 64 /* max length of hostname */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/parport.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/parport.h new file mode 100644 index 0000000..7135ef9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/parport.h @@ -0,0 +1,18 @@ +/* + * parport.h: ia32-specific parport initialisation + * + * Copyright (C) 1999, 2000 Tim Waugh + * + * This file should only be included by drivers/parport/parport_pc.c. + */ + +#ifndef _ASM_X8664_PARPORT_H +#define _ASM_X8664_PARPORT_H 1 + +static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); +static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma) +{ + return parport_pc_find_isa_ports (autoirq, autodma); +} + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci-direct.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci-direct.h new file mode 100644 index 0000000..036b6ca --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci-direct.h @@ -0,0 +1,48 @@ +#ifndef ASM_PCI_DIRECT_H +#define ASM_PCI_DIRECT_H 1 + +#include +#include + +/* Direct PCI access. This is used for PCI accesses in early boot before + the PCI subsystem works. */ + +#define PDprintk(x...) + +static inline u32 read_pci_config(u8 bus, u8 slot, u8 func, u8 offset) +{ + u32 v; + outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); + v = inl(0xcfc); + if (v != 0xffffffff) + PDprintk("%x reading 4 from %x: %x\n", slot, offset, v); + return v; +} + +static inline u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset) +{ + u8 v; + outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); + v = inb(0xcfc + (offset&3)); + PDprintk("%x reading 1 from %x: %x\n", slot, offset, v); + return v; +} + +static inline u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset) +{ + u16 v; + outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); + v = inw(0xcfc + (offset&2)); + PDprintk("%x reading 2 from %x: %x\n", slot, offset, v); + return v; +} + +static inline void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset, + u32 val) +{ + PDprintk("%x writing to %x: %x\n", slot, offset, val); + outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); + outl(val, 0xcfc); +} + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci.h new file mode 100644 index 0000000..fc4e574 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pci.h @@ -0,0 +1,202 @@ +#ifndef __x8664_PCI_H +#define __x8664_PCI_H + +#include + +#ifdef __KERNEL__ + +#include /* for struct page */ + +/* Can be used to override the logic in pci_scan_bus for skipping + already-configured bus numbers - to be used for buggy BIOSes + or architectures with incomplete PCI setup by the loader */ + +#ifdef CONFIG_PCI +extern unsigned int pcibios_assign_all_busses(void); +#else +#define pcibios_assign_all_busses() 0 +#endif +#define pcibios_scan_all_fns(a, b) 0 + +extern unsigned long pci_mem_start; +#define PCIBIOS_MIN_IO 0x1000 +#define PCIBIOS_MIN_MEM (pci_mem_start) + +#define PCIBIOS_MIN_CARDBUS_IO 0x4000 + +void pcibios_config_init(void); +struct pci_bus * pcibios_scan_root(int bus); +extern int (*pci_config_read)(int seg, int bus, int dev, int fn, int reg, int len, u32 *value); +extern int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int len, u32 value); + +void pcibios_set_master(struct pci_dev *dev); +void pcibios_penalize_isa_irq(int irq, int active); +struct irq_routing_table *pcibios_get_irq_routing_table(void); +int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); + +#include +#include +#include +#include +#include + +extern void pci_iommu_alloc(void); +extern int iommu_setup(char *opt); + +/* The PCI address space does equal the physical memory + * address space. The networking and block device layers use + * this boolean for bounce buffer decisions + * + * On AMD64 it mostly equals, but we set it to zero if a hardware + * IOMMU (gart) of sotware IOMMU (swiotlb) is available. + */ +#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) + +#if defined(CONFIG_IOMMU) || defined(CONFIG_CALGARY_IOMMU) + +/* + * x86-64 always supports DAC, but sometimes it is useful to force + * devices through the IOMMU to get automatic sg list merging. + * Optional right now. + */ +extern int iommu_sac_force; +#define pci_dac_dma_supported(pci_dev, mask) (!iommu_sac_force) + +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ + dma_addr_t ADDR_NAME; +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) \ + __u32 LEN_NAME; +#define pci_unmap_addr(PTR, ADDR_NAME) \ + ((PTR)->ADDR_NAME) +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) \ + (((PTR)->ADDR_NAME) = (VAL)) +#define pci_unmap_len(PTR, LEN_NAME) \ + ((PTR)->LEN_NAME) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ + (((PTR)->LEN_NAME) = (VAL)) + +#else +/* No IOMMU */ + +#define pci_dac_dma_supported(pci_dev, mask) 1 + +/** + * DECLARE_PCI_UNMAP_ADDR - non-operational macro + * @ADDR_NAME: Ignored + * + * A non-operational macro provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * ESX Deviation Notes: + * A non-operational macro provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * RETURN VALUE: + * Does not return any value + * + */ +/* _VMKLNX_CODECHECK_: DECLARE_PCI_UNMAP_ADDR */ +#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) +#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) + +/** + * pci_unmap_addr - non-operational function + * @PTR: Ignored + * @ADDR_NAME: Ignored + * + * A non-operational function provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * ESX Deviation Notes: + * A non-operational function provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * RETURN VALUE: + * Does not return any value + * + */ +/* _VMKLNX_CODECHECK_: pci_unmap_addr */ +#define pci_unmap_addr(PTR, ADDR_NAME) (0) + +/** + * pci_unmap_addr_set - non-operational function + * @PTR: Ignored + * @ADDR_NAME: Ignored + * @VAL: Ignored + * + * A non-operational function provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * ESX Deviation Notes: + * A non-operational function provided to help reduce + * kernel ifdefs. It is not supported in this release of ESX. + * + * RETURN VALUE: + * Does not return any value + * + */ +/* _VMKLNX_CODECHECK_: pci_unmap_addr_set */ +#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) +#define pci_unmap_len(PTR, LEN_NAME) (0) +#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) + +#endif + +#include + +static inline dma64_addr_t +pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction) +{ + return ((dma64_addr_t) page_to_phys(page) + + (dma64_addr_t) offset); +} + +static inline struct page * +pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr) +{ + return virt_to_page(__va(dma_addr)); +} + +static inline unsigned long +pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr) +{ + return (dma_addr & ~PAGE_MASK); +} + +static inline void +pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction) +{ +} + +static inline void +pci_dac_dma_sync_single_for_device(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction) +{ + flush_write_buffers(); +} + +#ifdef CONFIG_PCI +static inline void pci_dma_burst_advice(struct pci_dev *pdev, + enum pci_dma_burst_strategy *strat, + unsigned long *strategy_parameter) +{ + *strat = PCI_DMA_BURST_INFINITY; + *strategy_parameter = ~0UL; +} +#endif + +#define HAVE_PCI_MMAP +extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, + enum pci_mmap_state mmap_state, int write_combine); + +static inline void pcibios_add_platform_entries(struct pci_dev *dev) +{ +} + +#endif /* __KERNEL__ */ + +/* generic pci stuff */ +#ifdef CONFIG_PCI +#include +#endif + +#endif /* __x8664_PCI_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pda.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pda.h new file mode 100644 index 0000000..52f17ee --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pda.h @@ -0,0 +1,91 @@ +#ifndef X86_64_PDA_H +#define X86_64_PDA_H + +#ifndef __ASSEMBLY__ +#include +#include +#include +#include + +#if !defined(__VMKLNX__) + +/* Per processor datastructure. %gs points to it while the kernel runs */ +struct x8664_pda { + struct task_struct *pcurrent; /* Current process */ + unsigned long data_offset; /* Per cpu data offset from linker address */ + unsigned long kernelstack; /* top of kernel stack for current */ + unsigned long oldrsp; /* user rsp for system call */ +#if DEBUG_STKSZ > EXCEPTION_STKSZ + unsigned long debugstack; /* #DB/#BP stack. */ +#endif + int irqcount; /* Irq nesting counter. Starts with -1 */ + int cpunumber; /* Logical CPU number */ + char *irqstackptr; /* top of irqstack */ + int nodenumber; /* number of current node */ + unsigned int __softirq_pending; + unsigned int __nmi_count; /* number of NMI on this CPUs */ + int mmu_state; + struct mm_struct *active_mm; + unsigned apic_timer_irqs; +} ____cacheline_aligned_in_smp; + +extern struct x8664_pda *_cpu_pda[]; +extern struct x8664_pda boot_cpu_pda[]; + +#define cpu_pda(i) (_cpu_pda[i]) + +/* + * There is no fast way to get the base address of the PDA, all the accesses + * have to mention %fs/%gs. So it needs to be done this Torvaldian way. + */ +#define sizeof_field(type,field) (sizeof(((type *)0)->field)) +#define typeof_field(type,field) typeof(((type *)0)->field) + +extern void __bad_pda_field(void); + +#define pda_offset(field) offsetof(struct x8664_pda, field) + +#define pda_to_op(op,field,val) do { \ + typedef typeof_field(struct x8664_pda, field) T__; \ + switch (sizeof_field(struct x8664_pda, field)) { \ +case 2: \ +asm volatile(op "w %0,%%gs:%P1"::"ri" ((T__)val),"i"(pda_offset(field)):"memory"); break; \ +case 4: \ +asm volatile(op "l %0,%%gs:%P1"::"ri" ((T__)val),"i"(pda_offset(field)):"memory"); break; \ +case 8: \ +asm volatile(op "q %0,%%gs:%P1"::"ri" ((T__)val),"i"(pda_offset(field)):"memory"); break; \ + default: __bad_pda_field(); \ + } \ + } while (0) + +/* + * AK: PDA read accesses should be neither volatile nor have an memory clobber. + * Unfortunately removing them causes all hell to break lose currently. + */ +#define pda_from_op(op,field) ({ \ + typeof_field(struct x8664_pda, field) ret__; \ + switch (sizeof_field(struct x8664_pda, field)) { \ +case 2: \ +asm volatile(op "w %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ +case 4: \ +asm volatile(op "l %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ +case 8: \ +asm volatile(op "q %%gs:%P1,%0":"=r" (ret__):"i"(pda_offset(field)):"memory"); break;\ + default: __bad_pda_field(); \ + } \ + ret__; }) + + +#define read_pda(field) pda_from_op("mov",field) +#define write_pda(field,val) pda_to_op("mov",field,val) +#define add_pda(field,val) pda_to_op("add",field,val) +#define sub_pda(field,val) pda_to_op("sub",field,val) +#define or_pda(field,val) pda_to_op("or",field,val) + +#endif + +#define PDA_STACKOFFSET (5*8) + +#endif /* !defined(__VMKLNX__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/percpu.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/percpu.h new file mode 100644 index 0000000..08dd9f9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/percpu.h @@ -0,0 +1,55 @@ +#ifndef _ASM_X8664_PERCPU_H_ +#define _ASM_X8664_PERCPU_H_ +#include + +/* Same as asm-generic/percpu.h, except that we store the per cpu offset + in the PDA. Longer term the PDA and every per cpu variable + should be just put into a single section and referenced directly + from %gs */ + +#ifdef CONFIG_SMP + +#include + +#define __per_cpu_offset(cpu) (cpu_pda(cpu)->data_offset) +#define __my_cpu_offset() read_pda(data_offset) + +#define per_cpu_offset(x) (__per_cpu_offset(x)) + +/* Separate out the type, so (int[3], foo) works. */ +#define DEFINE_PER_CPU(type, name) \ + __attribute__((__section__(".data.percpu"))) __typeof__(type) per_cpu__##name + +/* var is in discarded region: offset to particular copy we want */ +#define per_cpu(var, cpu) (*RELOC_HIDE(&per_cpu__##var, __per_cpu_offset(cpu))) +#define __get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) +#define __raw_get_cpu_var(var) (*RELOC_HIDE(&per_cpu__##var, __my_cpu_offset())) + +/* A macro to avoid #include hell... */ +#define percpu_modcopy(pcpudst, src, size) \ +do { \ + unsigned int __i; \ + for_each_possible_cpu(__i) \ + memcpy((pcpudst)+__per_cpu_offset(__i), \ + (src), (size)); \ +} while (0) + +extern void setup_per_cpu_areas(void); + +#else /* ! SMP */ + +#define DEFINE_PER_CPU(type, name) \ + __typeof__(type) per_cpu__##name + +#define per_cpu(var, cpu) (*((void)(cpu), &per_cpu__##var)) +#define __get_cpu_var(var) per_cpu__##var +#define __raw_get_cpu_var(var) per_cpu__##var + +#endif /* SMP */ + +#define DECLARE_PER_CPU(type, name) extern __typeof__(type) per_cpu__##name + +#define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) +#define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var) + +#endif /* _ASM_X8664_PERCPU_H_ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgalloc.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgalloc.h new file mode 100644 index 0000000..21b7f3f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgalloc.h @@ -0,0 +1,140 @@ +#ifndef _X86_64_PGALLOC_H +#define _X86_64_PGALLOC_H + +#include +#include +#include +#include + +#define arch_add_exec_range(mm, limit) \ + do { (void)(mm), (void)(limit); } while (0) +#define arch_flush_exec_range(mm) \ + do { (void)(mm); } while (0) +#define arch_remove_exec_range(mm, limit) \ + do { (void)(mm), (void)(limit); } while (0) + +#define pmd_populate_kernel(mm, pmd, pte) \ + set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte))) +#define pud_populate(mm, pud, pmd) \ + set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd))) +#define pgd_populate(mm, pgd, pud) \ + set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud))) + +static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte) +{ + set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT))); +} + +static inline pmd_t *get_pmd(void) +{ + return (pmd_t *)get_zeroed_page(GFP_KERNEL); +} + +static inline void pmd_free(pmd_t *pmd) +{ + BUG_ON((unsigned long)pmd & (PAGE_SIZE-1)); + free_page((unsigned long)pmd); +} + +static inline pmd_t *pmd_alloc_one (struct mm_struct *mm, unsigned long addr) +{ + return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); +} + +static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr) +{ + return (pud_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); +} + +static inline void pud_free (pud_t *pud) +{ + BUG_ON((unsigned long)pud & (PAGE_SIZE-1)); + free_page((unsigned long)pud); +} + +static inline void pgd_list_add(pgd_t *pgd) +{ + struct page *page = virt_to_page(pgd); + + spin_lock(&pgd_lock); + page->index = (pgoff_t)pgd_list; + if (pgd_list) + pgd_list->private = (unsigned long)&page->index; + pgd_list = page; + page->private = (unsigned long)&pgd_list; + spin_unlock(&pgd_lock); +} + +static inline void pgd_list_del(pgd_t *pgd) +{ + struct page *next, **pprev, *page = virt_to_page(pgd); + + spin_lock(&pgd_lock); + next = (struct page *)page->index; + pprev = (struct page **)page->private; + *pprev = next; + if (next) + next->private = (unsigned long)pprev; + spin_unlock(&pgd_lock); +} + +static inline pgd_t *pgd_alloc(struct mm_struct *mm) +{ + unsigned boundary; + pgd_t *pgd = (pgd_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT); + if (!pgd) + return NULL; + pgd_list_add(pgd); + /* + * Copy kernel pointers in from init. + * Could keep a freelist or slab cache of those because the kernel + * part never changes. + */ + boundary = pgd_index(__PAGE_OFFSET); + memset(pgd, 0, boundary * sizeof(pgd_t)); + memcpy(pgd + boundary, + init_level4_pgt + boundary, + (PTRS_PER_PGD - boundary) * sizeof(pgd_t)); + return pgd; +} + +static inline void pgd_free(pgd_t *pgd) +{ + BUG_ON((unsigned long)pgd & (PAGE_SIZE-1)); + pgd_list_del(pgd); + free_page((unsigned long)pgd); +} + +static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) +{ + return (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); +} + +static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address) +{ + void *p = (void *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); + if (!p) + return NULL; + return virt_to_page(p); +} + +/* Should really implement gc for free page table pages. This could be + done with a reference count in struct page. */ + +static inline void pte_free_kernel(pte_t *pte) +{ + BUG_ON((unsigned long)pte & (PAGE_SIZE-1)); + free_page((unsigned long)pte); +} + +static inline void pte_free(struct page *pte) +{ + __free_page(pte); +} + +#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte)) + +#define __pmd_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) +#define __pud_free_tlb(tlb,x) tlb_remove_page((tlb),virt_to_page(x)) + +#endif /* _X86_64_PGALLOC_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgtable.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgtable.h new file mode 100644 index 0000000..e26a005 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/pgtable.h @@ -0,0 +1,474 @@ +#ifndef _X86_64_PGTABLE_H +#define _X86_64_PGTABLE_H + +#include +#ifndef __ASSEMBLY__ + +/* + * This file contains the functions and defines necessary to modify and use + * the x86-64 page table tree. + */ +#include +#include +#include +#include +#include +#include + +extern pud_t level3_kernel_pgt[512]; +extern pud_t level3_ident_pgt[512]; +extern pmd_t level2_kernel_pgt[512]; +extern pgd_t init_level4_pgt[]; +extern unsigned long __supported_pte_mask; + +#define swapper_pg_dir ((pgd_t *)NULL) + +extern void nonx_setup(const char *str); +extern void paging_init(void); +extern void clear_kernel_mapping(unsigned long addr, unsigned long size); + +extern unsigned long pgkern_mask; + +/* + * ZERO_PAGE is a global shared page that is always zero: used + * for zero-mapped memory areas etc.. + */ +extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; +#define ZERO_PAGE(vaddr) (pfn_to_page(__pa_symbol(&empty_zero_page) >> PAGE_SHIFT)) + +#endif /* !__ASSEMBLY__ */ + +/* + * PGDIR_SHIFT determines what a top-level page table entry can map + */ +#define PGDIR_SHIFT 39 +#define PTRS_PER_PGD 512 + +/* + * 3rd level page + */ +#define PUD_SHIFT 30 +#define PTRS_PER_PUD 512 + +/* + * PMD_SHIFT determines the size of the area a middle-level + * page table can map + */ +#define PMD_SHIFT 21 +#define PTRS_PER_PMD 512 + +/* + * entries per page directory level + */ +#define PTRS_PER_PTE 512 + +#ifndef __ASSEMBLY__ + +#define pte_ERROR(e) \ + printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e)) +#define pmd_ERROR(e) \ + printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), pmd_val(e)) +#define pud_ERROR(e) \ + printk("%s:%d: bad pud %p(%016lx).\n", __FILE__, __LINE__, &(e), pud_val(e)) +#define pgd_ERROR(e) \ + printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), pgd_val(e)) + +#define pgd_none(x) (!pgd_val(x)) +#define pud_none(x) (!pud_val(x)) + +static inline void set_pte(pte_t *dst, pte_t val) +{ + mm_track_pte(dst); + pte_val(*dst) = pte_val(val); +} +#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) + +static inline void set_pmd(pmd_t *dst, pmd_t val) +{ + mm_track_pmd(dst); + pmd_val(*dst) = pmd_val(val); +} + +static inline void set_pud(pud_t *dst, pud_t val) +{ + mm_track_pud(dst); + pud_val(*dst) = pud_val(val); +} + +static inline void pud_clear (pud_t *pud) +{ + set_pud(pud, __pud(0)); +} + +static inline void set_pgd(pgd_t *dst, pgd_t val) +{ + mm_track_pgd(dst); + pgd_val(*dst) = pgd_val(val); +} + +static inline void pgd_clear (pgd_t * pgd) +{ + set_pgd(pgd, __pgd(0)); +} + +#define pud_page(pud) \ +((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK)) + +static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *xp) +{ + mm_track_pte(xp); + return __pte(xchg(&(xp)->pte, 0)); +} + +struct mm_struct; + +static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full) +{ + pte_t pte; + if (full) { + pte = *ptep; + mm_track_pte(ptep); + *ptep = __pte(0); + } else { + pte = ptep_get_and_clear(mm, addr, ptep); + } + return pte; +} + +#define pte_same(a, b) ((a).pte == (b).pte) + +#define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK)) + +#endif /* !__ASSEMBLY__ */ + +#define PMD_SIZE (_AC(1,UL) << PMD_SHIFT) +#define PMD_MASK (~(PMD_SIZE-1)) +#define PUD_SIZE (_AC(1,UL) << PUD_SHIFT) +#define PUD_MASK (~(PUD_SIZE-1)) +#define PGDIR_SIZE (_AC(1,UL) << PGDIR_SHIFT) +#define PGDIR_MASK (~(PGDIR_SIZE-1)) + +#define USER_PTRS_PER_PGD ((TASK_SIZE-1)/PGDIR_SIZE+1) +#define FIRST_USER_ADDRESS 0 + +#define MAXMEM _AC(0x3fffffffffff,UL) +#define VMALLOC_START _AC(0xffffc20000000000,UL) +#define VMALLOC_END _AC(0xffffe1ffffffffff,UL) +#define MODULES_VADDR _AC(0xffffffff88000000,UL) +#define MODULES_END _AC(0xfffffffffff00000,UL) +#define MODULES_LEN (MODULES_END - MODULES_VADDR) + +#define _PAGE_BIT_PRESENT 0 +#define _PAGE_BIT_RW 1 +#define _PAGE_BIT_USER 2 +#define _PAGE_BIT_PWT 3 +#define _PAGE_BIT_PCD 4 +#define _PAGE_BIT_ACCESSED 5 +#define _PAGE_BIT_DIRTY 6 +#define _PAGE_BIT_PSE 7 /* 4 MB (or 2MB) page */ +#define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ +#define _PAGE_BIT_SOFTDIRTY 9 /* save dirty state when hdw dirty bit cleared */ +#define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */ + +#define _PAGE_PRESENT 0x001 +#define _PAGE_RW 0x002 +#define _PAGE_USER 0x004 +#define _PAGE_PWT 0x008 +#define _PAGE_PCD 0x010 +#define _PAGE_ACCESSED 0x020 +#define _PAGE_DIRTY 0x040 +#define _PAGE_PSE 0x080 /* 2MB page */ +#define _PAGE_FILE 0x040 /* nonlinear file mapping, saved PTE; unset:swap */ +#define _PAGE_GLOBAL 0x100 /* Global TLB entry */ +#define _PAGE_SOFTDIRTY 0x200 + +#define _PAGE_PROTNONE 0x080 /* If not present */ +#define _PAGE_NX (_AC(1,UL)<<_PAGE_BIT_NX) + +#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) +#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) + +#define _PAGE_CHG_MASK (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_SOFTDIRTY) + +#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) +#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX) +#define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED) +#define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX) +#define PAGE_COPY PAGE_COPY_NOEXEC +#define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED) +#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX) +#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED) +#define __PAGE_KERNEL \ + (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX) +#define __PAGE_KERNEL_EXEC \ + (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED) +#define __PAGE_KERNEL_NOCACHE \ + (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX) +#define __PAGE_KERNEL_RO \ + (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX) +#define __PAGE_KERNEL_VSYSCALL \ + (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED) +#define __PAGE_KERNEL_VSYSCALL_NOCACHE \ + (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD) +#define __PAGE_KERNEL_LARGE \ + (__PAGE_KERNEL | _PAGE_PSE) +#define __PAGE_KERNEL_LARGE_EXEC \ + (__PAGE_KERNEL_EXEC | _PAGE_PSE) + +#define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL) + +#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL) +#define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC) +#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO) +#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) +#define PAGE_KERNEL_VSYSCALL32 __pgprot(__PAGE_KERNEL_VSYSCALL) +#define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL) +#define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE) +#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE) + +/* xwr */ +#define __P000 PAGE_NONE +#define __P001 PAGE_READONLY +#define __P010 PAGE_COPY +#define __P011 PAGE_COPY +#define __P100 PAGE_READONLY_EXEC +#define __P101 PAGE_READONLY_EXEC +#define __P110 PAGE_COPY_EXEC +#define __P111 PAGE_COPY_EXEC + +#define __S000 PAGE_NONE +#define __S001 PAGE_READONLY +#define __S010 PAGE_SHARED +#define __S011 PAGE_SHARED +#define __S100 PAGE_READONLY_EXEC +#define __S101 PAGE_READONLY_EXEC +#define __S110 PAGE_SHARED_EXEC +#define __S111 PAGE_SHARED_EXEC + +#ifndef __ASSEMBLY__ + +static inline unsigned long pgd_bad(pgd_t pgd) +{ + unsigned long val = pgd_val(pgd); + val &= ~PTE_MASK; + val &= ~(_PAGE_USER | _PAGE_DIRTY); + return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED); +} + +static inline unsigned long pud_bad(pud_t pud) +{ + unsigned long val = pud_val(pud); + val &= ~PTE_MASK; + val &= ~(_PAGE_USER | _PAGE_DIRTY); + return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED); +} + +#define pte_none(x) (!pte_val(x)) +#define pte_present(x) (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE)) +#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) + +#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) /* FIXME: is this + right? */ +#define pte_page(x) pfn_to_page(pte_pfn(x)) +#define pte_pfn(x) ((pte_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT) + +static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) +{ + pte_t pte; + pte_val(pte) = (page_nr << PAGE_SHIFT); + pte_val(pte) |= pgprot_val(pgprot); + pte_val(pte) &= __supported_pte_mask; + return pte; +} + +/* + * The following only work if pte_present() is true. + * Undefined behaviour if not.. + */ +#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT) +static inline int pte_user(pte_t pte) { return pte_val(pte) & _PAGE_USER; } +static inline int pte_read(pte_t pte) { return pte_val(pte) & _PAGE_USER; } +static inline int pte_exec(pte_t pte) { return pte_val(pte) & _PAGE_USER; } +static inline int pte_dirty(pte_t pte) { return pte_val(pte) & (_PAGE_DIRTY | _PAGE_SOFTDIRTY); } +static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } +static inline int pte_write(pte_t pte) { return pte_val(pte) & _PAGE_RW; } +static inline int pte_file(pte_t pte) { return pte_val(pte) & _PAGE_FILE; } +static inline int pte_huge(pte_t pte) { return pte_val(pte) & _PAGE_PSE; } + +static inline pte_t pte_rdprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } +static inline pte_t pte_exprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; } +static inline pte_t pte_mkclean(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~(_PAGE_SOFTDIRTY|_PAGE_DIRTY))); return pte; } +static inline pte_t pte_mkold(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; } +static inline pte_t pte_wrprotect(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; } +static inline pte_t pte_mkread(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; } +static inline pte_t pte_mkexec(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; } +static inline pte_t pte_mkdirty(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; } +static inline pte_t pte_mkyoung(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; } +static inline pte_t pte_mkwrite(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; } +static inline pte_t pte_mkhuge(pte_t pte) { set_pte(&pte, __pte(pte_val(pte) | _PAGE_PSE)); return pte; } + +struct vm_area_struct; + +static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) +{ + if (!pte_dirty(*ptep)) + return 0; + mm_track_pte(ptep); + return test_and_clear_bit(_PAGE_BIT_DIRTY, ptep) | + test_and_clear_bit(_PAGE_BIT_SOFTDIRTY, ptep); +} + +static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep) +{ + if (!pte_young(*ptep)) + return 0; + return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte); +} + +static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep) +{ + clear_bit(_PAGE_BIT_RW, &ptep->pte); +} + +/* + * Macro to mark a page protection value as "uncacheable". + */ +#define pgprot_noncached(prot) (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT)) + +static inline int pmd_large(pmd_t pte) { + return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE; +} + + +/* + * Conversion functions: convert a page and protection to a page entry, + * and a page entry and page directory to the page they refer to. + */ + +/* + * Level 4 access. + */ +#define pgd_page(pgd) ((unsigned long) __va((unsigned long)pgd_val(pgd) & PTE_MASK)) +#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) +#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr)) +#define pgd_offset_k(address) (init_level4_pgt + pgd_index(address)) +#define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT) +#define mk_kernel_pgd(address) ((pgd_t){ (address) | _KERNPG_TABLE }) + +/* PUD - Level3 access */ +/* to find an entry in a page-table-directory. */ +#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1)) +#define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + pud_index(address)) +#define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT) + +/* PMD - Level 2 access */ +#define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK)) +#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) + +#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) +#define pmd_offset(dir, address) ((pmd_t *) pud_page(*(dir)) + \ + pmd_index(address)) +#define pmd_none(x) (!pmd_val(x)) +#define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) +#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) +#define pmd_bad(x) ((pmd_val(x) & (~PTE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE ) +#define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot))) +#define pmd_pfn(x) ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT) + +#define pte_to_pgoff(pte) ((pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT) +#define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE }) +#define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT + +/* PTE - Level 1 access. */ + +/* page, protection -> pte */ +#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) +#define mk_pte_huge(entry) (pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE) + +/* physical address -> PTE */ +static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot) +{ + pte_t pte; + pte_val(pte) = physpage | pgprot_val(pgprot); + return pte; +} + +/* Change flags of a PTE */ +static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) +{ + pte_val(pte) &= _PAGE_CHG_MASK; + pte_val(pte) |= pgprot_val(newprot); + pte_val(pte) &= __supported_pte_mask; + return pte; +} + +#define pte_index(address) \ + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) +#define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_kernel(*(dir)) + \ + pte_index(address)) + +/* x86-64 always has all page tables mapped. */ +#define pte_offset_map(dir,address) pte_offset_kernel(dir,address) +#define pte_offset_map_nested(dir,address) pte_offset_kernel(dir,address) +#define pte_unmap(pte) /* NOP */ +#define pte_unmap_nested(pte) /* NOP */ + +#define update_mmu_cache(vma,address,pte) do { } while (0) + +/* We only update the dirty/accessed state if we set + * the dirty bit by hand in the kernel, since the hardware + * will do the accessed bit for us, and we don't want to + * race with other CPU's that might be updating the dirty + * bit at the same time. */ +#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS +#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \ + do { \ + if (__dirty) { \ + set_pte(__ptep, __entry); \ + flush_tlb_page(__vma, __address); \ + } \ + } while (0) + +/* Encode and de-code a swap entry */ +#define __swp_type(x) (((x).val >> 1) & 0x3f) +#define __swp_offset(x) ((x).val >> 8) +#define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) }) +#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) +#define __swp_entry_to_pte(x) ((pte_t) { (x).val }) + +extern spinlock_t pgd_lock; +extern struct page *pgd_list; +void vmalloc_sync_all(void); + +extern int kern_addr_valid(unsigned long addr); + +#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ + remap_pfn_range(vma, vaddr, pfn, size, prot) + +#define MK_IOSPACE_PFN(space, pfn) (pfn) +#define GET_IOSPACE(pfn) 0 +#define GET_PFN(pfn) (pfn) + +#define HAVE_ARCH_UNMAPPED_AREA + +#define pgtable_cache_init() do { } while (0) +#define check_pgt_cache() do { } while (0) + +#define PAGE_AGP PAGE_KERNEL_NOCACHE +#define HAVE_PAGE_AGP 1 + +/* fs/proc/kcore.c */ +#define kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK) +#define kc_offset_to_vaddr(o) \ + (((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o)) + +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG +#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR +#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL +#define __HAVE_ARCH_PTEP_SET_WRPROTECT +#define __HAVE_ARCH_PTE_SAME +#include +#endif /* !__ASSEMBLY__ */ + +#endif /* _X86_64_PGTABLE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/poll.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/poll.h new file mode 100644 index 0000000..c0475a9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/poll.h @@ -0,0 +1,27 @@ +#ifndef __x86_64_POLL_H +#define __x86_64_POLL_H + +/* These are specified by iBCS2 */ +#define POLLIN 0x0001 +#define POLLPRI 0x0002 +#define POLLOUT 0x0004 +#define POLLERR 0x0008 +#define POLLHUP 0x0010 +#define POLLNVAL 0x0020 + +/* The rest seem to be more-or-less nonstandard. Check them! */ +#define POLLRDNORM 0x0040 +#define POLLRDBAND 0x0080 +#define POLLWRNORM 0x0100 +#define POLLWRBAND 0x0200 +#define POLLMSG 0x0400 +#define POLLREMOVE 0x1000 +#define POLLRDHUP 0x2000 + +struct pollfd { + int fd; + short events; + short revents; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/posix_types.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/posix_types.h new file mode 100644 index 0000000..9926aa4 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/posix_types.h @@ -0,0 +1,119 @@ +#ifndef _ASM_X86_64_POSIX_TYPES_H +#define _ASM_X86_64_POSIX_TYPES_H + +/* + * This file is generally used by user-level software, so you need to + * be a little careful about namespace pollution etc. Also, we cannot + * assume GCC is being used. + */ + +typedef unsigned long __kernel_ino_t; +typedef unsigned int __kernel_mode_t; +typedef unsigned long __kernel_nlink_t; +typedef long __kernel_off_t; +typedef int __kernel_pid_t; +typedef int __kernel_ipc_pid_t; +typedef unsigned int __kernel_uid_t; +typedef unsigned int __kernel_gid_t; +typedef unsigned long __kernel_size_t; +typedef long __kernel_ssize_t; +typedef long __kernel_ptrdiff_t; +typedef long __kernel_time_t; +typedef long __kernel_suseconds_t; +typedef long __kernel_clock_t; +typedef int __kernel_timer_t; +typedef int __kernel_clockid_t; +typedef int __kernel_daddr_t; +typedef char * __kernel_caddr_t; +typedef unsigned short __kernel_uid16_t; +typedef unsigned short __kernel_gid16_t; + +#ifdef __GNUC__ +typedef long long __kernel_loff_t; +#endif + +typedef struct { + int val[2]; +} __kernel_fsid_t; + +typedef unsigned short __kernel_old_uid_t; +typedef unsigned short __kernel_old_gid_t; +typedef __kernel_uid_t __kernel_uid32_t; +typedef __kernel_gid_t __kernel_gid32_t; + +typedef unsigned long __kernel_old_dev_t; + +#ifdef __KERNEL__ + +#undef __FD_SET +static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + fdsetp->fds_bits[_tmp] |= (1UL<<_rem); +} + +#undef __FD_CLR +static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); +} + +#undef __FD_ISSET +static __inline__ int __FD_ISSET(unsigned long fd, __const__ __kernel_fd_set *p) +{ + unsigned long _tmp = fd / __NFDBITS; + unsigned long _rem = fd % __NFDBITS; + return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; +} + +/* + * This will unroll the loop for the normal constant cases (8 or 32 longs, + * for 256 and 1024-bit fd_sets respectively) + */ +#undef __FD_ZERO +static __inline__ void __FD_ZERO(__kernel_fd_set *p) +{ + unsigned long *tmp = p->fds_bits; + int i; + + if (__builtin_constant_p(__FDSET_LONGS)) { + switch (__FDSET_LONGS) { + case 32: + tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; + tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; + tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; + tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; + tmp[16] = 0; tmp[17] = 0; tmp[18] = 0; tmp[19] = 0; + tmp[20] = 0; tmp[21] = 0; tmp[22] = 0; tmp[23] = 0; + tmp[24] = 0; tmp[25] = 0; tmp[26] = 0; tmp[27] = 0; + tmp[28] = 0; tmp[29] = 0; tmp[30] = 0; tmp[31] = 0; + return; + case 16: + tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; + tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; + tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; + tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; + return; + case 8: + tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; + tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; + return; + case 4: + tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; + return; + } + } + i = __FDSET_LONGS; + while (i) { + i--; + *tmp = 0; + tmp++; + } +} + +#endif /* defined(__KERNEL__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/prctl.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/prctl.h new file mode 100644 index 0000000..52952ad --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/prctl.h @@ -0,0 +1,10 @@ +#ifndef X86_64_PRCTL_H +#define X86_64_PRCTL_H 1 + +#define ARCH_SET_GS 0x1001 +#define ARCH_SET_FS 0x1002 +#define ARCH_GET_FS 0x1003 +#define ARCH_GET_GS 0x1004 + + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/processor.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/processor.h new file mode 100644 index 0000000..c43e37a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/processor.h @@ -0,0 +1,545 @@ +/* + * include/asm-x86_64/processor.h + * + * Copyright (C) 1994 Linus Torvalds + */ + +#ifndef __ASM_X86_64_PROCESSOR_H +#define __ASM_X86_64_PROCESSOR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif + +#define TF_MASK 0x00000100 +#define IF_MASK 0x00000200 +#define IOPL_MASK 0x00003000 +#define NT_MASK 0x00004000 +#define VM_MASK 0x00020000 +#define AC_MASK 0x00040000 +#define VIF_MASK 0x00080000 /* virtual interrupt flag */ +#define VIP_MASK 0x00100000 /* virtual interrupt pending */ +#define ID_MASK 0x00200000 + +#define desc_empty(desc) \ + (!((desc)->a | (desc)->b)) + +#define desc_equal(desc1, desc2) \ + (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b)) + +/* + * Default implementation of macro that returns current + * instruction pointer ("program counter"). + */ +#define current_text_addr() ({ void *pc; asm volatile("leaq 1f(%%rip),%0\n1:":"=r"(pc)); pc; }) + +/* + * CPU type and hardware bug flags. Kept separately for each CPU. + */ + +struct cpuinfo_x86 { + __u8 x86; /* CPU family */ + __u8 x86_vendor; /* CPU vendor */ + __u8 x86_model; + __u8 x86_mask; + int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */ + __u32 x86_capability[NCAPINTS]; + char x86_vendor_id[16]; + char x86_model_id[64]; + int x86_cache_size; /* in KB */ + int x86_clflush_size; + int x86_cache_alignment; + int x86_tlbsize; /* number of 4K pages in DTLB/ITLB combined(in pages)*/ + __u8 x86_virt_bits, x86_phys_bits; + __u8 x86_max_cores; /* cpuid returned max cores value */ + __u32 x86_power; + __u32 extended_cpuid_level; /* Max extended CPUID function supported */ + unsigned long loops_per_jiffy; +#ifdef CONFIG_SMP + cpumask_t llc_shared_map; /* cpus sharing the last level cache */ +#endif + __u8 apicid; +#ifdef CONFIG_SMP + __u8 booted_cores; /* number of cores as seen by OS */ + __u8 phys_proc_id; /* Physical Processor id. */ + __u8 cpu_core_id; /* Core id. */ +#endif +} ____cacheline_aligned; + +#define X86_VENDOR_INTEL 0 +#define X86_VENDOR_CYRIX 1 +#define X86_VENDOR_AMD 2 +#define X86_VENDOR_UMC 3 +#define X86_VENDOR_NEXGEN 4 +#define X86_VENDOR_CENTAUR 5 +#define X86_VENDOR_RISE 6 +#define X86_VENDOR_TRANSMETA 7 +#define X86_VENDOR_NUM 8 +#define X86_VENDOR_UNKNOWN 0xff + +#ifdef CONFIG_SMP +extern struct cpuinfo_x86 cpu_data[]; +#define current_cpu_data cpu_data[smp_processor_id()] +#else +#define cpu_data (&boot_cpu_data) +#define current_cpu_data boot_cpu_data +#endif + +extern char ignore_irq13; + +extern void identify_cpu(struct cpuinfo_x86 *); +extern void print_cpu_info(struct cpuinfo_x86 *); +extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c); +extern unsigned short num_cache_leaves; + +/* + * EFLAGS bits + */ +#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */ +#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */ +#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */ +#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */ +#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */ +#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */ +#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */ +#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */ +#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */ +#define X86_EFLAGS_IOPL 0x00003000 /* IOPL mask */ +#define X86_EFLAGS_NT 0x00004000 /* Nested Task */ +#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */ +#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */ +#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */ +#define X86_EFLAGS_VIF 0x00080000 /* Virtual Interrupt Flag */ +#define X86_EFLAGS_VIP 0x00100000 /* Virtual Interrupt Pending */ +#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */ + +/* + * Intel CPU features in CR4 + */ +#define X86_CR4_VME 0x0001 /* enable vm86 extensions */ +#define X86_CR4_PVI 0x0002 /* virtual interrupts flag enable */ +#define X86_CR4_TSD 0x0004 /* disable time stamp at ipl 3 */ +#define X86_CR4_DE 0x0008 /* enable debugging extensions */ +#define X86_CR4_PSE 0x0010 /* enable page size extensions */ +#define X86_CR4_PAE 0x0020 /* enable physical address extensions */ +#define X86_CR4_MCE 0x0040 /* Machine check enable */ +#define X86_CR4_PGE 0x0080 /* enable global pages */ +#define X86_CR4_PCE 0x0100 /* enable performance counters at ipl 3 */ +#define X86_CR4_OSFXSR 0x0200 /* enable fast FPU save and restore */ +#define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */ + +/* + * Save the cr4 feature set we're using (ie + * Pentium 4MB enable and PPro Global page + * enable), so that any CPU's that boot up + * after us can get the correct flags. + */ +extern unsigned long mmu_cr4_features; + +static inline void set_in_cr4 (unsigned long mask) +{ + mmu_cr4_features |= mask; + __asm__("movq %%cr4,%%rax\n\t" + "orq %0,%%rax\n\t" + "movq %%rax,%%cr4\n" + : : "irg" (mask) + :"ax"); +} + +static inline void clear_in_cr4 (unsigned long mask) +{ + mmu_cr4_features &= ~mask; + __asm__("movq %%cr4,%%rax\n\t" + "andq %0,%%rax\n\t" + "movq %%rax,%%cr4\n" + : : "irg" (~mask) + :"ax"); +} + + +/* + * User space process size. 47bits minus one guard page. + */ +#define TASK_SIZE64 (0x800000000000UL - 4096) + +/* This decides where the kernel will search for a free chunk of vm + * space during mmap's. + */ +#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000) + +#define TASK_SIZE (test_thread_flag(TIF_IA32) ? IA32_PAGE_OFFSET : TASK_SIZE64) +#define TASK_SIZE_OF(child) ((test_tsk_thread_flag(child, TIF_IA32)) ? IA32_PAGE_OFFSET : TASK_SIZE64) + +#define TASK_UNMAPPED_BASE PAGE_ALIGN(TASK_SIZE/3) + +/* + * Size of io_bitmap. + */ +#define IO_BITMAP_BITS 65536 +#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) +#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) +#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) +#define INVALID_IO_BITMAP_OFFSET 0x8000 + +struct i387_fxsave_struct { + u16 cwd; + u16 swd; + u16 twd; + u16 fop; + u64 rip; + u64 rdp; + u32 mxcsr; + u32 mxcsr_mask; + u32 st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ + u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg = 128 bytes */ + u32 padding[24]; +} __attribute__ ((aligned (16))); + +union i387_union { + struct i387_fxsave_struct fxsave; +}; + +struct tss_struct { +#ifdef __VMK_GCC_BUG_ALIGNMENT_PADDING__ + VMK_PADDED_STRUCT(SMP_CACHE_BYTES, + { +#endif + u32 reserved1; + u64 rsp0; + u64 rsp1; + u64 rsp2; + u64 reserved2; + u64 ist[7]; + u32 reserved3; + u32 reserved4; + u16 reserved5; + u16 io_bitmap_base; + /* + * The extra 1 is there because the CPU will access an + * additional byte beyond the end of the IO permission + * bitmap. The extra byte must be all 1 bits, and must + * be within the limit. Thus we have: + * + * 128 bytes, the bitmap itself, for ports 0..0x3ff + * 8 bytes, for an extra "long" of ~0UL + */ + unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; +#ifdef __VMK_GCC_BUG_ALIGNMENT_PADDING__ + }) +#endif +} __attribute__((packed)) ____cacheline_aligned; + + +extern struct cpuinfo_x86 boot_cpu_data; +DECLARE_PER_CPU(struct tss_struct,init_tss); +/* Save the original ist values for checking stack pointers during debugging */ +struct orig_ist { + unsigned long ist[7]; +}; +DECLARE_PER_CPU(struct orig_ist, orig_ist); + +#ifdef CONFIG_X86_VSMP +#define ARCH_MIN_TASKALIGN (1 << INTERNODE_CACHE_SHIFT) +#define ARCH_MIN_MMSTRUCT_ALIGN (1 << INTERNODE_CACHE_SHIFT) +#else +#define ARCH_MIN_TASKALIGN 16 +#define ARCH_MIN_MMSTRUCT_ALIGN 0 +#endif + +struct thread_struct { + unsigned long rsp0; + unsigned long rsp; + unsigned long userrsp; /* Copy from PDA */ + unsigned long fs; + unsigned long gs; + unsigned short es, ds, fsindex, gsindex; +/* Hardware debugging registers */ + unsigned long debugreg0; + unsigned long debugreg1; + unsigned long debugreg2; + unsigned long debugreg3; + unsigned long debugreg6; + unsigned long debugreg7; +/* fault info */ + unsigned long cr2, trap_no, error_code; +/* floating point info */ + union i387_union i387 __attribute__((aligned(16))); +/* IO permissions. the bitmap could be moved into the GDT, that would make + switch faster for a limited number of ioperm using tasks. -AK */ + int ioperm; + unsigned long *io_bitmap_ptr; + unsigned io_bitmap_max; +/* cached TLS descriptors. */ + u64 tls_array[GDT_ENTRY_TLS_ENTRIES]; +} __attribute__((aligned(16))); + +#define INIT_THREAD { \ + .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \ +} + +#define INIT_TSS { \ + .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \ +} + +#define INIT_MMAP \ +{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL } + +#define start_thread(regs,new_rip,new_rsp) do { \ + asm volatile("movl %0,%%fs; movl %0,%%es; movl %0,%%ds": :"r" (0)); \ + load_gs_index(0); \ + (regs)->rip = (new_rip); \ + (regs)->rsp = (new_rsp); \ + write_pda(oldrsp, (new_rsp)); \ + (regs)->cs = __USER_CS; \ + (regs)->ss = __USER_DS; \ + (regs)->eflags = 0x200; \ + set_fs(USER_DS); \ +} while(0) + +#define get_debugreg(var, register) \ + __asm__("movq %%db" #register ", %0" \ + :"=r" (var)) +#define set_debugreg(value, register) \ + __asm__("movq %0,%%db" #register \ + : /* no output */ \ + :"r" (value)) + +struct task_struct; +struct mm_struct; + +/* Free all resources held by a thread. */ +extern void release_thread(struct task_struct *); + +/* Prepare to copy thread state - unlazy all lazy status */ +extern void prepare_to_copy(struct task_struct *tsk); + +/* + * create a kernel thread without removing it from tasklists + */ +#if defined(__VMKLNX__) +extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); +#else /* !defined(__VMKLNX__) */ +extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); +#endif /* defined(__VMKLNX__) */ + +/* + * Return saved PC of a blocked thread. + * What is this good for? it will be always the scheduler or ret_from_fork. + */ +#define thread_saved_pc(t) (*(unsigned long *)((t)->thread.rsp - 8)) + +extern unsigned long get_wchan(struct task_struct *p); +#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.rsp0 - 1) +#define KSTK_EIP(tsk) (task_pt_regs(tsk)->rip) +#define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */ + + +struct microcode_header { + unsigned int hdrver; + unsigned int rev; + unsigned int date; + unsigned int sig; + unsigned int cksum; + unsigned int ldrver; + unsigned int pf; + unsigned int datasize; + unsigned int totalsize; + unsigned int reserved[3]; +}; + +struct microcode { + struct microcode_header hdr; + unsigned int bits[0]; +}; + +typedef struct microcode microcode_t; +typedef struct microcode_header microcode_header_t; + +/* microcode format is extended from prescott processors */ +struct extended_signature { + unsigned int sig; + unsigned int pf; + unsigned int cksum; +}; + +struct extended_sigtable { + unsigned int count; + unsigned int cksum; + unsigned int reserved[3]; + struct extended_signature sigs[0]; +}; + +#ifdef __VMK_GCC_BUG_ALIGNMENT_PADDING__ +VMK_ASSERT_LIST(PROCESSOR_STRUCT_ALIGN, + VMK_ASSERT_ON_COMPILE(sizeof(struct tss_struct)%SMP_CACHE_BYTES == 0); +) +#endif + +#define ASM_NOP1 K8_NOP1 +#define ASM_NOP2 K8_NOP2 +#define ASM_NOP3 K8_NOP3 +#define ASM_NOP4 K8_NOP4 +#define ASM_NOP5 K8_NOP5 +#define ASM_NOP6 K8_NOP6 +#define ASM_NOP7 K8_NOP7 +#define ASM_NOP8 K8_NOP8 + +/* Opteron nops */ +#define K8_NOP1 ".byte 0x90\n" +#define K8_NOP2 ".byte 0x66,0x90\n" +#define K8_NOP3 ".byte 0x66,0x66,0x90\n" +#define K8_NOP4 ".byte 0x66,0x66,0x66,0x90\n" +#define K8_NOP5 K8_NOP3 K8_NOP2 +#define K8_NOP6 K8_NOP3 K8_NOP3 +#define K8_NOP7 K8_NOP4 K8_NOP3 +#define K8_NOP8 K8_NOP4 K8_NOP4 + +#define ASM_NOP_MAX 8 + +/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */ +/** + * rep_nop - executes rep; nop assembly instructions + * + * Processor specific, but typically executes a low-powered pause on Intel and + * is good for use in busy-wait loops. + * + */ +/* _VMKLNX_CODECHECK_: rep_nop */ +static inline void rep_nop(void) +{ + __asm__ __volatile__("rep;nop": : :"memory"); +} + +/* Stop speculative execution */ +static inline void sync_core(void) +{ + int tmp; + asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory"); +} + +#define cpu_has_fpu 1 + +#define ARCH_HAS_PREFETCH +/** + * prefetch - Prefetch the value at address x + * @x: Address to prefetch + * + * Architecture specific call to prefetch the value at address x + * + * RETURN VALUE: + * None + */ +/* _VMKLNX_CODECHECK_: prefetch */ +static inline void prefetch(void *x) +{ + asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x)); +} + +#define ARCH_HAS_PREFETCHW 1 +static inline void prefetchw(void *x) +{ + alternative_input("prefetcht0 (%1)", + "prefetchw (%1)", + X86_FEATURE_3DNOW, + "r" (x)); +} + +#define ARCH_HAS_SPINLOCK_PREFETCH 1 + +#define spin_lock_prefetch(x) prefetchw(x) + +/** + * cpu_relax - executes rep; nop assembly instructions + * + * Processor specific function that is good for use in busy-wait loops. + * On Intel, it comes out at "Rep nop" which mostly tells hyperthreading CPUs + * to give the other CPU threads a go. + * + * SYNOPSIS: + * #define cpu_relax() + * + * RETURN VALUE: + * None + */ +/* _VMKLNX_CODECHECK_: cpu_relax */ +#define cpu_relax() rep_nop() + +/* + * NSC/Cyrix CPU configuration register indexes + */ +#define CX86_CCR0 0xc0 +#define CX86_CCR1 0xc1 +#define CX86_CCR2 0xc2 +#define CX86_CCR3 0xc3 +#define CX86_CCR4 0xe8 +#define CX86_CCR5 0xe9 +#define CX86_CCR6 0xea +#define CX86_CCR7 0xeb +#define CX86_DIR0 0xfe +#define CX86_DIR1 0xff +#define CX86_ARR_BASE 0xc4 +#define CX86_RCR_BASE 0xdc + +/* + * NSC/Cyrix CPU indexed register access macros + */ + +#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); }) + +#define setCx86(reg, data) do { \ + outb((reg), 0x22); \ + outb((data), 0x23); \ +} while (0) + +static inline void serialize_cpu(void) +{ + __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx"); +} + +static inline void __monitor(const void *eax, unsigned long ecx, + unsigned long edx) +{ + /* "monitor %eax,%ecx,%edx;" */ + asm volatile( + ".byte 0x0f,0x01,0xc8;" + : :"a" (eax), "c" (ecx), "d"(edx)); +} + +static inline void __mwait(unsigned long eax, unsigned long ecx) +{ + /* "mwait %eax,%ecx;" */ + asm volatile( + ".byte 0x0f,0x01,0xc9;" + : :"a" (eax), "c" (ecx)); +} + +#define stack_current() \ +({ \ + struct thread_info *ti; \ + asm("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ + ti->task; \ +}) + +#define cache_line_size() (boot_cpu_data.x86_cache_alignment) + +extern unsigned long boot_option_idle_override; +/* Boot loader type from the setup header */ +extern int bootloader_type; + +#define HAVE_ARCH_PICK_MMAP_LAYOUT 1 + +#endif /* __ASM_X86_64_PROCESSOR_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/proto.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/proto.h new file mode 100644 index 0000000..c6a2e52 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/proto.h @@ -0,0 +1,142 @@ +#ifndef _ASM_X8664_PROTO_H +#define _ASM_X8664_PROTO_H 1 + +#include + +/* misc architecture specific prototypes */ + +struct cpuinfo_x86; +struct pt_regs; + +extern void start_kernel(void); +extern void pda_init(int); + +extern void early_idt_handler(void); + +extern void mcheck_init(struct cpuinfo_x86 *c); +#ifdef CONFIG_MTRR +extern void mtrr_ap_init(void); +extern void mtrr_bp_init(void); +#else +#define mtrr_ap_init() do {} while (0) +#define mtrr_bp_init() do {} while (0) +#endif +extern void init_memory_mapping(unsigned long start, unsigned long end); +extern void size_zones(unsigned long *z, unsigned long *h, + unsigned long start_pfn, unsigned long end_pfn); + +extern void system_call(void); +extern int kernel_syscall(void); +extern void syscall_init(void); + +extern void ia32_syscall(void); +extern void ia32_cstar_target(void); +extern void ia32_sysenter_target(void); + +extern void config_acpi_tables(void); +extern void ia32_syscall(void); + +extern int pmtimer_mark_offset(void); +extern void pmtimer_resume(void); +extern void pmtimer_wait(unsigned); +extern unsigned int do_gettimeoffset_pm(void); +#ifdef CONFIG_X86_PM_TIMER +extern u32 pmtmr_ioport; +#else +#define pmtmr_ioport 0 +#endif +extern unsigned long long monotonic_base; +extern int sysctl_vsyscall; +extern int nohpet; +extern unsigned long vxtime_hz; +extern void time_init_gtod(void); + +extern int numa_setup(char *opt); + +extern int setup_early_printk(char *); +extern void early_printk(const char *fmt, ...) __attribute__((format(printf,1,2))); + +extern void early_identify_cpu(struct cpuinfo_x86 *c); + +extern int k8_scan_nodes(unsigned long start, unsigned long end); + +extern void numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn); +extern unsigned long numa_free_all_bootmem(void); + +extern void reserve_bootmem_generic(unsigned long phys, unsigned len); +extern void free_bootmem_generic(unsigned long phys, unsigned len); + +extern void load_gs_index(unsigned gs); + +extern void stop_timer_interrupt(void); +extern void main_timer_handler(struct pt_regs *regs); + +extern unsigned long end_pfn_map; + +extern void show_trace(struct task_struct *, struct pt_regs *, unsigned long * rsp); +extern void show_registers(struct pt_regs *regs); + +extern void exception_table_check(void); + +extern void acpi_reserve_bootmem(void); + +extern void swap_low_mappings(void); + +extern void __show_regs(struct pt_regs * regs); +extern void show_regs(struct pt_regs * regs); + +extern char *syscall32_page; +extern void syscall32_cpu_init(void); + +extern void setup_node_bootmem(int nodeid, unsigned long start, unsigned long end); + +extern void check_ioapic(void); +extern void check_efer(void); + +extern int unhandled_signal(struct task_struct *tsk, int sig); + +extern int unsynchronized_tsc(void); + +extern void select_idle_routine(const struct cpuinfo_x86 *c); + +extern unsigned long table_start, table_end; + +extern int exception_trace; +extern int using_apic_timer; +extern int disable_apic; +extern unsigned cpu_khz; +extern int ioapic_force; +extern int skip_ioapic_setup; +extern int acpi_ht; +extern int acpi_disabled; + +extern void no_iommu_init(void); +extern int force_iommu, no_iommu; +extern int iommu_detected; +#ifdef CONFIG_IOMMU +extern void gart_iommu_init(void); +extern void gart_parse_options(char *); +extern void iommu_hole_init(void); +extern int fallback_aper_order; +extern int fallback_aper_force; +extern int iommu_aperture; +extern int iommu_aperture_allowed; +extern int iommu_aperture_disabled; +extern int fix_aperture; +#else +#define iommu_aperture 0 +#define iommu_aperture_allowed 0 +#endif + +extern int reboot_force; +extern int notsc_setup(char *); +extern int setup_additional_cpus(char *); + +extern void smp_local_timer_interrupt(struct pt_regs * regs); + +long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); + +#define round_up(x,y) (((x) + (y) - 1) & ~((y)-1)) +#define round_down(x,y) ((x) & ~((y)-1)) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ptrace.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ptrace.h new file mode 100644 index 0000000..3080cb4 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ptrace.h @@ -0,0 +1,122 @@ +#ifndef _X86_64_PTRACE_H +#define _X86_64_PTRACE_H + +#if defined(__ASSEMBLY__) || defined(__FRAME_OFFSETS) +#define R15 0 +#define R14 8 +#define R13 16 +#define R12 24 +#define RBP 32 +#define RBX 40 +/* arguments: interrupts/non tracing syscalls only save upto here*/ +#define R11 48 +#define R10 56 +#define R9 64 +#define R8 72 +#define RAX 80 +#define RCX 88 +#define RDX 96 +#define RSI 104 +#define RDI 112 +#define ORIG_RAX 120 /* = ERROR */ +/* end of arguments */ +/* cpu exception frame or undefined in case of fast syscall. */ +#define RIP 128 +#define CS 136 +#define EFLAGS 144 +#define RSP 152 +#define SS 160 +#define ARGOFFSET R11 +#endif /* __ASSEMBLY__ */ + +/* top of stack page */ +#define FRAME_SIZE 168 + +#define PTRACE_OLDSETOPTIONS 21 + +#ifndef __ASSEMBLY__ + +struct pt_regs { + unsigned long r15; + unsigned long r14; + unsigned long r13; + unsigned long r12; + unsigned long rbp; + unsigned long rbx; +/* arguments: non interrupts/non tracing syscalls only save upto here*/ + unsigned long r11; + unsigned long r10; + unsigned long r9; + unsigned long r8; + unsigned long rax; + unsigned long rcx; + unsigned long rdx; + unsigned long rsi; + unsigned long rdi; + unsigned long orig_rax; +/* end of arguments */ +/* cpu exception frame or undefined */ + unsigned long rip; + unsigned long cs; + unsigned long eflags; + unsigned long rsp; + unsigned long ss; +/* top of stack page */ +}; + +#endif + +/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ +#define PTRACE_GETREGS 12 +#define PTRACE_SETREGS 13 +#define PTRACE_GETFPREGS 14 +#define PTRACE_SETFPREGS 15 +#define PTRACE_GETFPXREGS 18 +#define PTRACE_SETFPXREGS 19 + +/* only useful for access 32bit programs */ +#define PTRACE_GET_THREAD_AREA 25 +#define PTRACE_SET_THREAD_AREA 26 + +#define PTRACE_ARCH_PRCTL 30 /* arch_prctl for child */ + +#if defined(__KERNEL__) && !defined(__ASSEMBLY__) +#define user_mode(regs) (!!((regs)->cs & 3)) +#define user_mode_vm(regs) user_mode(regs) +#define instruction_pointer(regs) ((regs)->rip) +#define regs_return_value(regs) ((regs)->rax) + +extern unsigned long profile_pc(struct pt_regs *regs); +void signal_fault(struct pt_regs *regs, void __user *frame, char *where); + +struct task_struct; + +extern unsigned long +convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs); + +enum { + EF_CF = 0x00000001, + EF_PF = 0x00000004, + EF_AF = 0x00000010, + EF_ZF = 0x00000040, + EF_SF = 0x00000080, + EF_TF = 0x00000100, + EF_IE = 0x00000200, + EF_DF = 0x00000400, + EF_OF = 0x00000800, + EF_IOPL = 0x00003000, + EF_IOPL_RING0 = 0x00000000, + EF_IOPL_RING1 = 0x00001000, + EF_IOPL_RING2 = 0x00002000, + EF_NT = 0x00004000, /* nested task */ + EF_RF = 0x00010000, /* resume */ + EF_VM = 0x00020000, /* virtual mode */ + EF_AC = 0x00040000, /* alignment */ + EF_VIF = 0x00080000, /* virtual interrupt */ + EF_VIP = 0x00100000, /* virtual interrupt pending */ + EF_ID = 0x00200000, /* id */ +}; + +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/resource.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/resource.h new file mode 100644 index 0000000..f40b406 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/resource.h @@ -0,0 +1,6 @@ +#ifndef _X8664_RESOURCE_H +#define _X8664_RESOURCE_H + +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rtc.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rtc.h new file mode 100644 index 0000000..18ed713 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rtc.h @@ -0,0 +1,10 @@ +#ifndef _X86_64_RTC_H +#define _X86_64_RTC_H + +/* + * x86 uses the default access methods for the RTC. + */ + +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwlock.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwlock.h new file mode 100644 index 0000000..9b01e04 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwlock.h @@ -0,0 +1,81 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +/* include/asm-x86_64/rwlock.h + * + * Helpers used by both rw spinlocks and rw semaphores. + * + * Based in part on code from semaphore.h and + * spinlock.h Copyright 1996 Linus Torvalds. + * + * Copyright 1999 Red Hat, Inc. + * Copyright 2001,2002 SuSE labs + * + * Written by Benjamin LaHaise. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#ifndef _ASM_X86_64_RWLOCK_H +#define _ASM_X86_64_RWLOCK_H + +#define RW_LOCK_BIAS 0x01000000 +#define RW_LOCK_BIAS_STR "0x01000000" + +#if defined(__VMKLNX__) + +#define __build_read_lock(rw) \ + asm volatile(LOCK_PREFIX "subl $1,(%0)\n\t" \ + "js 2f\n" \ + "cmpb $0, vmk_AtomicUseFence(%%rip)\n" \ + "jne 4f\n" \ + "1:\n" \ + LOCK_SECTION_START("") \ + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n" \ + "je 3f\n" \ + "lfence\n" \ + "3:\tcall __read_lock_failed\n\t" \ + "jmp 1b\n" \ + "4:\tlfence\n" \ + "jmp 1b\n" \ + LOCK_SECTION_END \ + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") + +#define __build_write_lock(rw) \ + asm volatile(LOCK_PREFIX "subl %1,(%0)\n\t" \ + "jnz 2f\n" \ + "cmpb $0, vmk_AtomicUseFence(%%rip)\n" \ + "jne 4f\n" \ + "1:\n" \ + LOCK_SECTION_START("") \ + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n" \ + "je 3f\n" \ + "lfence\n" \ + "3:\tcall __write_lock_failed\n\t" \ + "jmp 1b\n" \ + "4:\tlfence\n" \ + "jmp 1b\n" \ + LOCK_SECTION_END \ + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") + +#else /* !defined(__VMKLNX__) */ + +#define __build_read_lock(rw) \ + asm volatile(LOCK_PREFIX "subl $1,(%0)\n\t" \ + "jns 1f\n" \ + "call __read_lock_failed\n" \ + "1:\n" \ + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") + +#define __build_write_lock(rw) \ + asm volatile(LOCK_PREFIX "subl %1,(%0)\n\t" \ + "jz 1f\n" \ + "\tcall __write_lock_failed\n\t" \ + "1:\n" \ + ::"D" (rw), "i" (RW_LOCK_BIAS) : "memory") + +#endif /* defined(__VMKLNX__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwsem.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwsem.h new file mode 100644 index 0000000..c002175 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/rwsem.h @@ -0,0 +1,278 @@ +/* rwsem.h: R/W semaphores implemented using XADD/CMPXCHG for x86_64+ + * + * Written by David Howells (dhowells@redhat.com). + * Ported by Andi Kleen to x86-64. + * + * Derived from asm-i386/semaphore.h and asm-i386/rwsem.h + * + * + * The MSW of the count is the negated number of active writers and waiting + * lockers, and the LSW is the total number of active locks + * + * The lock count is initialized to 0 (no active and no waiting lockers). + * + * When a writer subtracts WRITE_BIAS, it'll get 0xffff0001 for the case of an + * uncontended lock. This can be determined because XADD returns the old value. + * Readers increment by 1 and see a positive value when uncontended, negative + * if there are writers (and maybe) readers waiting (in which case it goes to + * sleep). + * + * The value of WAITING_BIAS supports up to 32766 waiting processes. This can + * be extended to 65534 by manually checking the whole MSW rather than relying + * on the S flag. + * + * The value of ACTIVE_BIAS supports up to 65535 active processes. + * + * This should be totally fair - if anything is waiting, a process that wants a + * lock will go to the back of the queue. When the currently active lock is + * released, if there's a writer at the front of the queue, then that and only + * that will be woken up; if there's a bunch of consecutive readers at the + * front, then they'll all be woken up, but no other readers will be. + */ + +#ifndef _X8664_RWSEM_H +#define _X8664_RWSEM_H + +#ifndef _LINUX_RWSEM_H +#error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead" +#endif + +#ifdef __KERNEL__ + +#include +#include + +struct rwsem_waiter; + +extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); +extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); +extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *); +extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); + +/* + * the semaphore definition + */ +struct rw_semaphore { + signed int count; +#define RWSEM_UNLOCKED_VALUE 0x00000000 +#define RWSEM_ACTIVE_BIAS 0x00000001 +#define RWSEM_ACTIVE_MASK 0x0000ffff +#define RWSEM_WAITING_BIAS (-0x00010000) +#define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS +#define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) + spinlock_t wait_lock; + struct list_head wait_list; +#if RWSEM_DEBUG + int debug; +#endif +}; + +/* + * initialisation + */ +#if RWSEM_DEBUG +#define __RWSEM_DEBUG_INIT , 0 +#else +#define __RWSEM_DEBUG_INIT /* */ +#endif + +#define __RWSEM_INITIALIZER(name) \ +{ RWSEM_UNLOCKED_VALUE, SPIN_LOCK_UNLOCKED, LIST_HEAD_INIT((name).wait_list) \ + __RWSEM_DEBUG_INIT } + +#define DECLARE_RWSEM(name) \ + struct rw_semaphore name = __RWSEM_INITIALIZER(name) + +static inline void init_rwsem(struct rw_semaphore *sem) +{ + sem->count = RWSEM_UNLOCKED_VALUE; + spin_lock_init(&sem->wait_lock); + INIT_LIST_HEAD(&sem->wait_list); +#if RWSEM_DEBUG + sem->debug = 0; +#endif +} + +/* + * lock for reading + */ +static inline void __down_read(struct rw_semaphore *sem) +{ + __asm__ __volatile__( + "# beginning down_read\n\t" +LOCK_PREFIX " incl (%%rdi)\n\t" /* adds 0x00000001, returns the old value */ + " js 2f\n\t" /* jump if we weren't granted the lock */ + "1:\n\t" + LOCK_SECTION_START("") \ + "2:\n\t" + " call rwsem_down_read_failed_thunk\n\t" + " jmp 1b\n" + LOCK_SECTION_END \ + "# ending down_read\n\t" + : "+m"(sem->count) + : "D"(sem) + : "memory", "cc"); +} + + +/* + * trylock for reading -- returns 1 if successful, 0 if contention + */ +static inline int __down_read_trylock(struct rw_semaphore *sem) +{ + __s32 result, tmp; + __asm__ __volatile__( + "# beginning __down_read_trylock\n\t" + " movl %0,%1\n\t" + "1:\n\t" + " movl %1,%2\n\t" + " addl %3,%2\n\t" + " jle 2f\n\t" +LOCK_PREFIX " cmpxchgl %2,%0\n\t" + " jnz 1b\n\t" + "2:\n\t" + "# ending __down_read_trylock\n\t" + : "+m"(sem->count), "=&a"(result), "=&r"(tmp) + : "i"(RWSEM_ACTIVE_READ_BIAS) + : "memory", "cc"); + return result>=0 ? 1 : 0; +} + + +/* + * lock for writing + */ +static inline void __down_write(struct rw_semaphore *sem) +{ + int tmp; + + tmp = RWSEM_ACTIVE_WRITE_BIAS; + __asm__ __volatile__( + "# beginning down_write\n\t" +LOCK_PREFIX " xaddl %0,(%%rdi)\n\t" /* subtract 0x0000ffff, returns the old value */ + " testl %0,%0\n\t" /* was the count 0 before? */ + " jnz 2f\n\t" /* jump if we weren't granted the lock */ + "1:\n\t" + LOCK_SECTION_START("") + "2:\n\t" + " call rwsem_down_write_failed_thunk\n\t" + " jmp 1b\n" + LOCK_SECTION_END + "# ending down_write" + : "=&r" (tmp) + : "0"(tmp), "D"(sem) + : "memory", "cc"); +} + +/* + * trylock for writing -- returns 1 if successful, 0 if contention + */ +static inline int __down_write_trylock(struct rw_semaphore *sem) +{ + signed long ret = cmpxchg(&sem->count, + RWSEM_UNLOCKED_VALUE, + RWSEM_ACTIVE_WRITE_BIAS); + if (ret == RWSEM_UNLOCKED_VALUE) + return 1; + return 0; +} + +/* + * unlock after reading + */ +static inline void __up_read(struct rw_semaphore *sem) +{ + __s32 tmp = -RWSEM_ACTIVE_READ_BIAS; + __asm__ __volatile__( + "# beginning __up_read\n\t" +LOCK_PREFIX " xaddl %[tmp],(%%rdi)\n\t" /* subtracts 1, returns the old value */ + " js 2f\n\t" /* jump if the lock is being waited upon */ + "1:\n\t" + LOCK_SECTION_START("") + "2:\n\t" + " decw %w[tmp]\n\t" /* do nothing if still outstanding active readers */ + " jnz 1b\n\t" + " call rwsem_wake_thunk\n\t" + " jmp 1b\n" + LOCK_SECTION_END + "# ending __up_read\n" + : "+m"(sem->count), [tmp] "+r" (tmp) + : "D"(sem) + : "memory", "cc"); +} + +/* + * unlock after writing + */ +static inline void __up_write(struct rw_semaphore *sem) +{ + unsigned tmp; + __asm__ __volatile__( + "# beginning __up_write\n\t" + " movl %[bias],%[tmp]\n\t" +LOCK_PREFIX " xaddl %[tmp],(%%rdi)\n\t" /* tries to transition 0xffff0001 -> 0x00000000 */ + " jnz 2f\n\t" /* jump if the lock is being waited upon */ + "1:\n\t" + LOCK_SECTION_START("") + "2:\n\t" + " decw %w[tmp]\n\t" /* did the active count reduce to 0? */ + " jnz 1b\n\t" /* jump back if not */ + " call rwsem_wake_thunk\n\t" + " jmp 1b\n" + LOCK_SECTION_END + "# ending __up_write\n" + : "+m"(sem->count), [tmp] "=r" (tmp) + : "D"(sem), [bias] "i"(-RWSEM_ACTIVE_WRITE_BIAS) + : "memory", "cc"); +} + +/* + * downgrade write lock to read lock + */ +static inline void __downgrade_write(struct rw_semaphore *sem) +{ + __asm__ __volatile__( + "# beginning __downgrade_write\n\t" +LOCK_PREFIX " addl %[bias],(%%rdi)\n\t" /* transitions 0xZZZZ0001 -> 0xYYYY0001 */ + " js 2f\n\t" /* jump if the lock is being waited upon */ + "1:\n\t" + LOCK_SECTION_START("") + "2:\n\t" + " call rwsem_downgrade_thunk\n" + " jmp 1b\n" + LOCK_SECTION_END + "# ending __downgrade_write\n" + : "=m"(sem->count) + : "D"(sem), [bias] "i"(-RWSEM_WAITING_BIAS), "m"(sem->count) + : "memory", "cc"); +} + +/* + * implement atomic add functionality + */ +static inline void rwsem_atomic_add(int delta, struct rw_semaphore *sem) +{ + __asm__ __volatile__( +LOCK_PREFIX "addl %1,%0" + :"=m"(sem->count) + :"ir"(delta), "m"(sem->count)); +} + +/* + * implement exchange and add functionality + */ +static inline int rwsem_atomic_update(int delta, struct rw_semaphore *sem) +{ + int tmp = delta; + + __asm__ __volatile__( +LOCK_PREFIX "xaddl %0,(%2)" + : "=r"(tmp), "=m"(sem->count) + : "r"(sem), "m"(sem->count), "0" (tmp) + : "memory"); + + return tmp+delta; +} + +#endif /* __KERNEL__ */ +#endif /* _X8664_RWSEM_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/scatterlist.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/scatterlist.h new file mode 100644 index 0000000..854cf7b --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/scatterlist.h @@ -0,0 +1,202 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +#ifndef _X8664_SCATTERLIST_H +#define _X8664_SCATTERLIST_H + +#if defined(__VMKLNX__) +#include "vmkapi.h" +enum sg_type { SG_LINUX = 0, SG_VMK = 1, }; + +struct scatterlist { + union { + /* linux sg type */ + struct { + struct page *page; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; + }; + /* vmkapi sg type */ + struct { + vmk_SgElem *vmksgel; /* always points to the first vmk sgel */ + vmk_SgElem *cursgel; /* points to the currently used vmk sgel */ + }; + }; + enum sg_type sg_type; /* tracks type of sg */ +}; + +static inline int valid_sg_type(enum sg_type sg_type) +{ + return ((sg_type == SG_LINUX) || (sg_type == SG_VMK)); +} + +#else /* !defined(__VMKLNX__) */ +struct scatterlist { + struct page *page; + unsigned int offset; + unsigned int length; + dma_addr_t dma_address; + unsigned int dma_length; +}; +#endif /* defined(__VMKLNX__) */ + +#define ISA_DMA_THRESHOLD (0x00ffffff) + +/* These macros should be used after a pci_map_sg call has been done + * to get bus addresses of each of the SG entries and their lengths. + * You should only work with the number of sg entries pci_map_sg + * returns. + */ +#if defined(__VMKLNX__) + +/** + * sg_next - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: sg_next */ +static inline struct scatterlist * +sg_next(struct scatterlist *sg) +{ + if(sg->sg_type == SG_LINUX) { + sg++; + } else { + vmk_SgElem *__vmksgel = sg->cursgel; + __vmksgel++; + sg->cursgel = __vmksgel; + } + return sg; +} + +/** + * nth_sg - get address of the n'th element in sg array + * @sg: scatterlist + * @n: the index of sg element to look for + * + * Get the address of specified sg element from the scatterlist + * provided as input + * + * RETURN VALUE: + * Pointer to the specified sg entry in the list + */ +/* _VMKLNX_CODECHECK_: nth_sg */ +static inline struct scatterlist * +nth_sg(struct scatterlist *sg, unsigned int n) +{ + if(sg->sg_type == SG_LINUX) { + sg += n; + } else { + vmk_SgElem *__vmksgel = sg->cursgel; + sg->cursgel = __vmksgel + n; + } + return sg; +} + +/** + * sg_reset - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: sg_reset */ +static inline void +sg_reset(struct scatterlist *sg) +{ + if(sg->sg_type == SG_VMK) { + sg->cursgel = sg->vmksgel; + } +} + +/** + * sg_set_dma - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: sg_set_dma */ +static inline void +sg_set_dma(struct scatterlist *sg, dma_addr_t dma_address, unsigned int dma_length) +{ + BUG_ON(!valid_sg_type(sg->sg_type)); + + if(sg->sg_type == SG_LINUX) { + sg->dma_address = dma_address; + sg->dma_length = dma_length; + } else { + /* vmklinux or drivers are just consumers of vmksg list and usually + * doesn't need to modify vmkSgElem. But if a case arises we can do + * something here... + */ + } +} + +/* + * Instead of deciding the type of sg at run-time as above, here we emit macros + * at compile-time based on directive VMKLNX_VMKSGARRAY_SUPPORTED. + * This way we can avoid modifications to drivers where these macros + * are used as lvalues. + */ +#if defined(VMKLNX_VMKSGARRAY_SUPPORTED) +#define sg_dma_address(sg) ((sg)->cursgel->addr) +#define sg_dma_len(sg) ((sg)->cursgel->length) +#else /* !defined(VMKLNX_VMKSGARRAY_SUPPORTED) */ + +/** + * sg_dma_address - Return the dma_address element of the scatterlist + * @sg: the scatterlist + * + * Return the dma_address element of the scatterlist. + * + * SYNOPSIS: + * # define sg_dma_address(sg) + * + * RETURN VALUE: + * dma_address of the scatterlist + * + */ + /* _VMKLNX_CODECHECK_: sg_dma_address */ + +#define sg_dma_address(sg) ((sg)->dma_address) + +/** + * sg_dma_len - Return the dma_len element of the scatterlist + * @sg: the scatterlist + * + * Return the dma_len element of the scatterlist. + * + * SYNOPSIS: + * # define sg_dma_len(sg) + * + * RETURN VALUE: + * dma_length of the scatterlist + * + */ + /* _VMKLNX_CODECHECK_: sg_dma_len */ + +#define sg_dma_len(sg) ((sg)->dma_length) +#endif /* defined(VMKLNX_VMKSGARRAY_SUPPORTED) */ + +#else /* !defined(__VMKLNX__) */ +#define sg_dma_address(sg) ((sg)->dma_address) +#define sg_dma_len(sg) ((sg)->dma_length) +#endif /* defined(__VMKLNX__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/seccomp.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/seccomp.h new file mode 100644 index 0000000..553af65 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/seccomp.h @@ -0,0 +1,24 @@ +#ifndef _ASM_SECCOMP_H + +#include + +#ifdef TIF_32BIT +#error "unexpected TIF_32BIT on x86_64" +#else +#define TIF_32BIT TIF_IA32 +#endif + +#include +#include + +#define __NR_seccomp_read __NR_read +#define __NR_seccomp_write __NR_write +#define __NR_seccomp_exit __NR_exit +#define __NR_seccomp_sigreturn __NR_rt_sigreturn + +#define __NR_seccomp_read_32 __NR_ia32_read +#define __NR_seccomp_write_32 __NR_ia32_write +#define __NR_seccomp_exit_32 __NR_ia32_exit +#define __NR_seccomp_sigreturn_32 __NR_ia32_sigreturn + +#endif /* _ASM_SECCOMP_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sections.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sections.h new file mode 100644 index 0000000..c746d9f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sections.h @@ -0,0 +1,7 @@ +#ifndef _X8664_SECTIONS_H +#define _X8664_SECTIONS_H + +/* nothing to see, move along */ +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/segment.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/segment.h new file mode 100644 index 0000000..58d6715 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/segment.h @@ -0,0 +1,44 @@ +#ifndef _ASM_SEGMENT_H +#define _ASM_SEGMENT_H + +#include + +#define __KERNEL_CS 0x10 +#define __KERNEL_DS 0x18 + +#define __KERNEL32_CS 0x08 + +/* + * we cannot use the same code segment descriptor for user and kernel + * -- not even in the long flat mode, because of different DPL /kkeil + * The segment offset needs to contain a RPL. Grr. -AK + * GDT layout to get 64bit syscall right (sysret hardcodes gdt offsets) + */ + +#define __USER32_CS 0x23 /* 4*8+3 */ +#define __USER_DS 0x2b /* 5*8+3 */ +#define __USER_CS 0x33 /* 6*8+3 */ +#define __USER32_DS __USER_DS + +#define GDT_ENTRY_TLS 7 +#define GDT_ENTRY_TSS 8 /* needs two entries */ +#define GDT_ENTRY_LDT 10 /* needs two entries */ +#define GDT_ENTRY_TLS_MIN 12 +#define GDT_ENTRY_TLS_MAX 14 +/* 15 free */ + +#define GDT_ENTRY_TLS_ENTRIES 3 + +/* TLS indexes for 64bit - hardcoded in arch_prctl */ +#define FS_TLS 0 +#define GS_TLS 1 + +#define GS_TLS_SEL ((GDT_ENTRY_TLS_MIN+GS_TLS)*8 + 3) +#define FS_TLS_SEL ((GDT_ENTRY_TLS_MIN+FS_TLS)*8 + 3) + +#define IDT_ENTRIES 256 +#define GDT_ENTRIES 16 +#define GDT_SIZE (GDT_ENTRIES * 8) +#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/semaphore.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/semaphore.h new file mode 100644 index 0000000..3ef4c46 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/semaphore.h @@ -0,0 +1,391 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef _X86_64_SEMAPHORE_H +#define _X86_64_SEMAPHORE_H + +#include + +#ifdef __KERNEL__ + +/* + * SMP- and interrupt-safe semaphores.. + * + * (C) Copyright 1996 Linus Torvalds + * + * Modified 1996-12-23 by Dave Grothe to fix bugs in + * the original code and to make semaphore waits + * interruptible so that processes waiting on + * semaphores can be killed. + * Modified 1999-02-14 by Andrea Arcangeli, split the sched.c helper + * functions in asm/sempahore-helper.h while fixing a + * potential and subtle race discovered by Ulrich Schmid + * in down_interruptible(). Since I started to play here I + * also implemented the `trylock' semaphore operation. + * 1999-07-02 Artur Skawina + * Optimized "0(ecx)" -> "(ecx)" (the assembler does not + * do this). Changed calling sequences from push/jmp to + * traditional call/ret. + * Modified 2001-01-01 Andreas Franck + * Some hacks to ensure compatibility with recent + * GCC snapshots, to avoid stack corruption when compiling + * with -fomit-frame-pointer. It's not sure if this will + * be fixed in GCC, as our previous implementation was a + * bit dubious. + * + * If you would like to see an analysis of this implementation, please + * ftp to gcom.com and download the file + * /pub/linux/src/semaphore/semaphore-2.0.24.tar.gz. + * + */ + +#include +#include +#include +#include +#include +#include + +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif /* defined(__VMKLNX__) */ + +struct semaphore { + atomic_t count; + int sleepers; + wait_queue_head_t wait; +}; + +/** + * __SEMAPHORE_INITIALIZER - initialize the semaphore + * @name: name of the semaphore + * @n: count for the semaphore + * + * Initialize the semaphore and set its count to @n, the number of sleepers to + * 0 and initialize its wait queue. + * + * RETURN VALUE: + * This function does not return a value. + */ +/* _VMKLNX_CODECHECK_: __SEMAPHORE_INITIALIZER */ +#define __SEMAPHORE_INITIALIZER(name, n) \ +{ \ + .count = ATOMIC_INIT(n), \ + .sleepers = 0, \ + .wait = __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \ +} + +#define __DECLARE_SEMAPHORE_GENERIC(name,count) \ + struct semaphore name = __SEMAPHORE_INITIALIZER(name,count) + +#define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) +#define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) + +/** + * sema_init - Initializes semaphore value + * @sem: semaphore + * @val: value + * + * Initilizes semaphore value + * + * RETURN VALUE: + * NONE + * + */ +/* _VMKLNX_CODECHECK_: sema_init */ +static inline void sema_init (struct semaphore *sem, int val) +{ +/* + * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); + * + * i'd rather use the more flexible initialization above, but sadly + * GCC 2.7.2.3 emits a bogus warning. EGCS doesn't. Oh well. + */ + atomic_set(&sem->count, val); + sem->sleepers = 0; + init_waitqueue_head(&sem->wait); +} + +/** + * init_MUTEX - Initializes the semaphore as free resource with exclusive access. + * @sem: Pointer to semaphore + * + * The given semaphore is initialized as a free resource with exclusive + * access. + * + * RETURN VALUE: + * NONE + * + */ +/* _VMKLNX_CODECHECK_: init_MUTEX */ +static inline void init_MUTEX (struct semaphore *sem) +{ + sema_init(sem, 1); +} + +/** + * init_MUTEX_LOCKED - Initializes the semaphore as busy resource with exclusive access. + * @sem: Pointer to semaphore. + * + * The given semaphore is initialized as a busy resource with exclusive access + * given to the caller of the initialization function. + * + * RETURN VALUE: + * NONE + */ +/* _VMKLNX_CODECHECK_: init_MUTEX_LOCKED */ +static inline void init_MUTEX_LOCKED (struct semaphore *sem) +{ + sema_init(sem, 0); +} + +asmlinkage void __down_failed(void /* special register calling convention */); +asmlinkage int __down_failed_interruptible(void /* params in registers */); +asmlinkage int __down_failed_trylock(void /* params in registers */); +asmlinkage void __up_wakeup(void /* special register calling convention */); + +asmlinkage void __down(struct semaphore * sem); +asmlinkage int __down_interruptible(struct semaphore * sem); +asmlinkage int __down_trylock(struct semaphore * sem); +asmlinkage void __up(struct semaphore * sem); + +/* + * This is ugly, but we want the default case to fall through. + * "__down_failed" is a special asm handler that calls the C + * routine that actually waits. See arch/x86_64/kernel/semaphore.c + */ +/** + * down - acquire a semaphore + * @sem: Pointer to the semaphore to be acquired + * + * Acquires the specified semaphore. If the semaphore's count of available + * acquisitions is exhausted, then the calling function will block. + * + * RETURN VALUE: + * None + */ +/* _VMKLNX_CODECHECK_: down */ +static inline void down(struct semaphore * sem) +{ + might_sleep(); + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); + __asm__ __volatile__( + "# atomic down operation\n\t" + LOCK_PREFIX "decl %0\n\t" /* --sem->count */ + "js 2f\n" + "cmpb $0, vmk_AtomicUseFence(%%rip)\n" + "jne 4f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n" + "jne 3f\n" + "call __down_failed\n\t" + "jmp 1b\n" + "3:\tlfence\n" + "call __down_failed\n\t" + "jmp 1b\n" + "4:\tlfence\n" + "jmp 1b\n" + LOCK_SECTION_END + :"=m" (sem->count) + :"D" (sem) + :"memory"); +#else /* !defined(__VMKLNX__) */ + __asm__ __volatile__( + "# atomic down operation\n\t" + LOCK_PREFIX "decl %0\n\t" /* --sem->count */ + "js 2f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcall __down_failed\n\t" + "jmp 1b\n" + LOCK_SECTION_END + :"=m" (sem->count) + :"D" (sem) + :"memory"); +#endif /* !defined(__VMKLNX__) */ +} + +/* + * Interruptible try to acquire a semaphore. If we obtained + * it, return zero. If we were interrupted, returns -EINTR + */ +/** + * down_interruptible - Acquire a semaphore with an interruptible wait + * @sem: Pointer to the semaphore to be acquired + * + * Attempt to acquire the specified semaphore. If the semaphore's count of available + * acquisitions is exhausted, then the calling function will block. If a + * signal is received by the blocking thread, then this function aborts. + * + * RETURN VALUE: + * 0 on successful acquisition, or -EINTR if interrupted by a signal + */ +/* _VMKLNX_CODECHECK_: down_interruptible */ +static inline int down_interruptible(struct semaphore * sem) +{ + int result; + + might_sleep(); + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); + __asm__ __volatile__( + "# atomic interruptible down operation\n\t" + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ + "js 2f\n\t" + "xorl %0,%0\n" + "cmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 4f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 3f\n" + "call __down_failed_interruptible\n\t" + "jmp 1b\n" + "3:\tlfence\n" + "call __down_failed_interruptible\n\t" + "jmp 1b\n" + "4:\tlfence\n" + "jmp 1b\n" + LOCK_SECTION_END + :"=a" (result), "=m" (sem->count) + :"D" (sem) + :"memory"); +#else /* !defined(__VMKLNX__) */ + __asm__ __volatile__( + "# atomic interruptible down operation\n\t" + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ + "js 2f\n\t" + "xorl %0,%0\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcall __down_failed_interruptible\n\t" + "jmp 1b\n" + LOCK_SECTION_END + :"=a" (result), "=m" (sem->count) + :"D" (sem) + :"memory"); +#endif /* !defined(__VMKLNX__) */ + return result; +} + +/* + * Non-blockingly attempt to down() a semaphore. + * Returns zero if we acquired it + */ +/** + * down_trylock - attempt to acquire a semaphore + * @sem: Pointer to the semaphore to be acquired + * + * Attempt to acquire the specified semaphore. If the semaphore's count of available + * acquisitions is exhausted, then return immediately. + * + * RETURN VALUE: + * 0 on successful acquisition, or 1 if the semaphore is not immediately available + */ +/* _VMKLNX_CODECHECK_: down_trylock */ +static inline int down_trylock(struct semaphore * sem) +{ + int result; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); + __asm__ __volatile__( + "# atomic interruptible down operation\n\t" + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ + "js 2f\n\t" + "xorl %0,%0\n" + "cmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 4f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 3f\n" + "call __down_failed_trylock\n\t" + "jmp 1b\n" + "3:\tlfence\n" + "call __down_failed_trylock\n\t" + "jmp 1b\n" + "4:\tlfence\n" + "jmp 1b\n" + LOCK_SECTION_END + :"=a" (result), "=m" (sem->count) + :"D" (sem) + :"memory","cc"); +#else /* !defined(__VMKLNX__) */ + __asm__ __volatile__( + "# atomic interruptible down operation\n\t" + LOCK_PREFIX "decl %1\n\t" /* --sem->count */ + "js 2f\n\t" + "xorl %0,%0\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcall __down_failed_trylock\n\t" + "jmp 1b\n" + LOCK_SECTION_END + :"=a" (result), "=m" (sem->count) + :"D" (sem) + :"memory","cc"); +#endif /* !defined(__VMKLNX__) */ + return result; +} + +/* + * Note! This is subtle. We jump to wake people up only if + * the semaphore was negative (== somebody was waiting on it). + * The default case (no contention) will result in NO + * jumps for both down() and up(). + */ +/** + * up - release semaphore + * @sem: pointer to initialized and acquired semaphore + * + * RETURN VALUE: + * none + */ + /* _VMKLNX_CODECHECK_: up */ +static inline void up(struct semaphore * sem) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); + __asm__ __volatile__( + "# atomic up operation\n\t" + LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ + "jle 2f\n" + "cmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 4f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcmpb $0, vmk_AtomicUseFence(%%rip)\n\t" + "jne 3f\n" + "call __up_wakeup\n\t" + "jmp 1b\n" + "3:\tlfence\n" + "call __up_wakeup\n\t" + "jmp 1b\n" + "4:\tlfence\n" + "jmp 1b\n" + LOCK_SECTION_END + :"=m" (sem->count) + :"D" (sem) + :"memory"); +#else /* !defined(__VMKLNX__) */ + __asm__ __volatile__( + "# atomic up operation\n\t" + LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ + "jle 2f\n" + "1:\n" + LOCK_SECTION_START("") + "2:\tcall __up_wakeup\n\t" + "jmp 1b\n" + LOCK_SECTION_END + :"=m" (sem->count) + :"D" (sem) + :"memory"); +#endif /* !defined(__VMKLNX__) */ +} +#endif /* __KERNEL__ */ +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sembuf.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sembuf.h new file mode 100644 index 0000000..63b5292 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sembuf.h @@ -0,0 +1,25 @@ +#ifndef _X86_64_SEMBUF_H +#define _X86_64_SEMBUF_H + +/* + * The semid64_ds structure for x86_64 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 64-bit time_t to solve y2038 problem + * - 2 miscellaneous 32-bit values + */ + +struct semid64_ds { + struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ + __kernel_time_t sem_otime; /* last semop time */ + unsigned long __unused1; + __kernel_time_t sem_ctime; /* last change time */ + unsigned long __unused2; + unsigned long sem_nsems; /* no. of semaphores in array */ + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif /* _X86_64_SEMBUF_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/serial.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/serial.h new file mode 100644 index 0000000..b0496e0 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/serial.h @@ -0,0 +1,29 @@ +/* + * include/asm-x86_64/serial.h + */ + + +/* + * This assumes you have a 1.8432 MHz clock for your UART. + * + * It'd be nice if someone built a serial card with a 24.576 MHz + * clock, since the 16550A is capable of handling a top speed of 1.5 + * megabits/second; but this requires the faster clock. + */ +#define BASE_BAUD ( 1843200 / 16 ) + +/* Standard COM flags (except for COM4, because of the 8514 problem) */ +#ifdef CONFIG_SERIAL_DETECT_IRQ +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ) +#define STD_COM4_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_AUTO_IRQ) +#else +#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) +#define STD_COM4_FLAGS ASYNC_BOOT_AUTOCONF +#endif + +#define SERIAL_PORT_DFNS \ + /* UART CLK PORT IRQ FLAGS */ \ + { 0, BASE_BAUD, 0x3F8, 4, STD_COM_FLAGS }, /* ttyS0 */ \ + { 0, BASE_BAUD, 0x2F8, 3, STD_COM_FLAGS }, /* ttyS1 */ \ + { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ + { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/setup.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/setup.h new file mode 100644 index 0000000..985d4e3 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/setup.h @@ -0,0 +1,6 @@ +#ifndef _x8664_SETUP_H +#define _x8664_SETUP_H + +#define COMMAND_LINE_SIZE 256 + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmbuf.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmbuf.h new file mode 100644 index 0000000..5a6d6dd --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmbuf.h @@ -0,0 +1,38 @@ +#ifndef _X8664_SHMBUF_H +#define _X8664_SHMBUF_H + +/* + * The shmid64_ds structure for x8664 architecture. + * Note extra padding because this structure is passed back and forth + * between kernel and user space. + * + * Pad space is left for: + * - 2 miscellaneous 64-bit values + */ + +struct shmid64_ds { + struct ipc64_perm shm_perm; /* operation perms */ + size_t shm_segsz; /* size of segment (bytes) */ + __kernel_time_t shm_atime; /* last attach time */ + __kernel_time_t shm_dtime; /* last detach time */ + __kernel_time_t shm_ctime; /* last change time */ + __kernel_pid_t shm_cpid; /* pid of creator */ + __kernel_pid_t shm_lpid; /* pid of last operator */ + unsigned long shm_nattch; /* no. of current attaches */ + unsigned long __unused4; + unsigned long __unused5; +}; + +struct shminfo64 { + unsigned long shmmax; + unsigned long shmmin; + unsigned long shmmni; + unsigned long shmseg; + unsigned long shmall; + unsigned long __unused1; + unsigned long __unused2; + unsigned long __unused3; + unsigned long __unused4; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmparam.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmparam.h new file mode 100644 index 0000000..d702162 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/shmparam.h @@ -0,0 +1,6 @@ +#ifndef _ASMX8664_SHMPARAM_H +#define _ASMX8664_SHMPARAM_H + +#define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ + +#endif /* _ASMX8664_SHMPARAM_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext.h new file mode 100644 index 0000000..b4e4023 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext.h @@ -0,0 +1,55 @@ +#ifndef _ASM_X86_64_SIGCONTEXT_H +#define _ASM_X86_64_SIGCONTEXT_H + +#include +#include + +/* FXSAVE frame */ +/* Note: reserved1/2 may someday contain valuable data. Always save/restore + them when you change signal frames. */ +struct _fpstate { + __u16 cwd; + __u16 swd; + __u16 twd; /* Note this is not the same as the 32bit/x87/FSAVE twd */ + __u16 fop; + __u64 rip; + __u64 rdp; + __u32 mxcsr; + __u32 mxcsr_mask; + __u32 st_space[32]; /* 8*16 bytes for each FP-reg */ + __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */ + __u32 reserved2[24]; +}; + +struct sigcontext { + unsigned long r8; + unsigned long r9; + unsigned long r10; + unsigned long r11; + unsigned long r12; + unsigned long r13; + unsigned long r14; + unsigned long r15; + unsigned long rdi; + unsigned long rsi; + unsigned long rbp; + unsigned long rbx; + unsigned long rdx; + unsigned long rax; + unsigned long rcx; + unsigned long rsp; + unsigned long rip; + unsigned long eflags; /* RFLAGS */ + unsigned short cs; + unsigned short gs; + unsigned short fs; + unsigned short __pad0; + unsigned long err; + unsigned long trapno; + unsigned long oldmask; + unsigned long cr2; + struct _fpstate __user *fpstate; /* zero when no FPU context */ + unsigned long reserved1[8]; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext32.h new file mode 100644 index 0000000..3d65703 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sigcontext32.h @@ -0,0 +1,71 @@ +#ifndef _SIGCONTEXT32_H +#define _SIGCONTEXT32_H 1 + +/* signal context for 32bit programs. */ + +#define X86_FXSR_MAGIC 0x0000 + +struct _fpreg { + unsigned short significand[4]; + unsigned short exponent; +}; + +struct _fpxreg { + unsigned short significand[4]; + unsigned short exponent; + unsigned short padding[3]; +}; + +struct _xmmreg { + __u32 element[4]; +}; + +/* FSAVE frame with extensions */ +struct _fpstate_ia32 { + /* Regular FPU environment */ + __u32 cw; + __u32 sw; + __u32 tag; /* not compatible to 64bit twd */ + __u32 ipoff; + __u32 cssel; + __u32 dataoff; + __u32 datasel; + struct _fpreg _st[8]; + unsigned short status; + unsigned short magic; /* 0xffff = regular FPU data only */ + + /* FXSR FPU environment */ + __u32 _fxsr_env[6]; + __u32 mxcsr; + __u32 reserved; + struct _fpxreg _fxsr_st[8]; + struct _xmmreg _xmm[8]; /* It's actually 16 */ + __u32 padding[56]; +}; + +struct sigcontext_ia32 { + unsigned short gs, __gsh; + unsigned short fs, __fsh; + unsigned short es, __esh; + unsigned short ds, __dsh; + unsigned int edi; + unsigned int esi; + unsigned int ebp; + unsigned int esp; + unsigned int ebx; + unsigned int edx; + unsigned int ecx; + unsigned int eax; + unsigned int trapno; + unsigned int err; + unsigned int eip; + unsigned short cs, __csh; + unsigned int eflags; + unsigned int esp_at_signal; + unsigned short ss, __ssh; + unsigned int fpstate; /* really (struct _fpstate_ia32 *) */ + unsigned int oldmask; + unsigned int cr2; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/siginfo.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/siginfo.h new file mode 100644 index 0000000..d09a1e6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/siginfo.h @@ -0,0 +1,8 @@ +#ifndef _X8664_SIGINFO_H +#define _X8664_SIGINFO_H + +#define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) + +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/signal.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/signal.h new file mode 100644 index 0000000..1465e36 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/signal.h @@ -0,0 +1,187 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef _ASMx8664_SIGNAL_H +#define _ASMx8664_SIGNAL_H + +#ifndef __ASSEMBLY__ +#include +#include + +/* Avoid too many header ordering problems. */ +struct siginfo; + +#ifdef __KERNEL__ +#include +/* Most things should be clean enough to redefine this at will, if care + is taken to make libc match. */ + +#define _NSIG 64 +#define _NSIG_BPW 64 +#define _NSIG_WORDS (_NSIG / _NSIG_BPW) + +typedef unsigned long old_sigset_t; /* at least 32 bits */ + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + + +#else +/* Here we must cater to libcs that poke about in kernel headers. */ + +#define NSIG 32 +typedef unsigned long sigset_t; + +#endif /* __KERNEL__ */ +#endif + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +/* +#define SIGLOST 29 +*/ +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +/* These should not be considered constants from userland. */ +#define SIGRTMIN 32 +#define SIGRTMAX _NSIG + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 +#define SA_SIGINFO 0x00000004 +#if defined(__VMKLNX__) +#define SA_VMKISA 0x00000008 +#endif /* defined(__VMKLNX__) */ +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +#define SA_RESTORER 0x04000000 + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +#include + +#ifndef __ASSEMBLY__ + +struct sigaction { + __sighandler_t sa_handler; + unsigned long sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; /* mask last for extensibility */ +}; + +struct k_sigaction { + struct sigaction sa; +}; + +typedef struct sigaltstack { + void __user *ss_sp; + int ss_flags; + size_t ss_size; +} stack_t; + +#ifdef __KERNEL__ +#include + +#undef __HAVE_ARCH_SIG_BITOPS +#if 0 + +static inline void sigaddset(sigset_t *set, int _sig) +{ + __asm__("btsq %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc"); +} + +static inline void sigdelset(sigset_t *set, int _sig) +{ + __asm__("btrq %1,%0" : "=m"(*set) : "Ir"(_sig - 1) : "cc"); +} + +static inline int __const_sigismember(sigset_t *set, int _sig) +{ + unsigned long sig = _sig - 1; + return 1 & (set->sig[sig / _NSIG_BPW] >> (sig & ~(_NSIG_BPW-1))); +} + +static inline int __gen_sigismember(sigset_t *set, int _sig) +{ + int ret; + __asm__("btq %2,%1\n\tsbbq %0,%0" + : "=r"(ret) : "m"(*set), "Ir"(_sig-1) : "cc"); + return ret; +} + +#define sigismember(set,sig) \ + (__builtin_constant_p(sig) ? \ + __const_sigismember((set),(sig)) : \ + __gen_sigismember((set),(sig))) + +static inline int sigfindinword(unsigned long word) +{ + __asm__("bsfq %1,%0" : "=r"(word) : "rm"(word) : "cc"); + return word; +} +#endif +#endif + +#define ptrace_signal_deliver(regs, cookie) do { } while (0) + +#endif /* __KERNEL__ */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/smp.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/smp.h new file mode 100644 index 0000000..0c3da85 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/smp.h @@ -0,0 +1,153 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef __ASM_SMP_H +#define __ASM_SMP_H + +/* + * We need the APIC definitions automatically as part of 'smp.h' + */ +#ifndef __ASSEMBLY__ +#include +#include +#include +extern int disable_apic; +#endif + +#ifdef CONFIG_X86_LOCAL_APIC +#ifndef __ASSEMBLY__ +#include +#include +#ifdef CONFIG_X86_IO_APIC +#include +#endif +#include +#include +#endif +#endif + +#ifdef CONFIG_SMP +#ifndef ASSEMBLY + +#include +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif /* defined(__VMKLNX__) */ + +struct pt_regs; + +extern cpumask_t cpu_present_mask; +extern cpumask_t cpu_possible_map; +extern cpumask_t cpu_online_map; +extern cpumask_t cpu_callout_map; +extern cpumask_t cpu_initialized; + +/* + * Private routines/data + */ + +extern void smp_alloc_memory(void); +extern volatile unsigned long smp_invalidate_needed; +extern int pic_mode; +extern void lock_ipi_call_lock(void); +extern void unlock_ipi_call_lock(void); +extern int smp_num_siblings; +extern void smp_send_reschedule(int cpu); +void smp_stop_cpu(void); +extern int smp_call_function_single(int cpuid, void (*func) (void *info), + void *info, int retry, int wait); + +extern cpumask_t cpu_sibling_map[NR_CPUS]; +extern cpumask_t cpu_core_map[NR_CPUS]; +extern u8 cpu_llc_id[NR_CPUS]; + +#define SMP_TRAMPOLINE_BASE 0x6000 + +/* + * On x86 all CPUs are mapped 1:1 to the APIC space. + * This simplifies scheduling and IPI sending and + * compresses data structures. + */ + +static inline int num_booting_cpus(void) +{ + return cpus_weight(cpu_callout_map); +} + +#if defined(__VMKLNX__) +extern uint32_t raw_smp_processor_id(void); +#else /* !defined(__VMKLNX__) */ +#define raw_smp_processor_id() read_pda(cpunumber) +#endif /* defined(__VMKLNX__) */ + +static inline int hard_smp_processor_id(void) +{ + /* we don't want to mark this access volatile - bad code generation */ + return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID)); +} + +extern int __cpu_disable(void); +extern void __cpu_die(unsigned int cpu); +extern void prefill_possible_map(void); +extern unsigned num_processors; +extern unsigned disabled_cpus; + +#endif /* !ASSEMBLY */ + +#define NO_PROC_ID 0xFF /* No processor magic marker */ + +#endif + +#ifndef ASSEMBLY +/* + * Some lowlevel functions might want to know about + * the real APIC ID <-> CPU # mapping. + */ +extern u8 x86_cpu_to_apicid[NR_CPUS]; /* physical ID */ +extern u8 x86_cpu_to_log_apicid[NR_CPUS]; +extern u8 bios_cpu_apicid[]; + +static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask) +{ + return cpus_addr(cpumask)[0]; +} + +static inline int cpu_present_to_apicid(int mps_cpu) +{ + if (mps_cpu < NR_CPUS) + return (int)bios_cpu_apicid[mps_cpu]; + else + return BAD_APICID; +} + +#endif /* !ASSEMBLY */ + +#ifndef CONFIG_SMP +#define stack_smp_processor_id() 0 +#define cpu_logical_map(x) (x) +#else +#include +#define stack_smp_processor_id() \ +({ \ + struct thread_info *ti; \ + __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK)); \ + ti->cpu; \ +}) +#endif + +#ifndef __ASSEMBLY__ +static __inline int logical_smp_processor_id(void) +{ + /* we don't want to mark this access volatile - bad code generation */ + return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR)); +} +#endif + +#ifdef CONFIG_SMP +#define cpu_physical_id(cpu) x86_cpu_to_apicid[cpu] +#else +#define cpu_physical_id(cpu) boot_cpu_id +#endif + +#endif + diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/socket.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/socket.h new file mode 100644 index 0000000..b467026 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/socket.h @@ -0,0 +1,53 @@ +#ifndef _ASM_SOCKET_H +#define _ASM_SOCKET_H + +#include + +/* For setsockopt(2) */ +#define SOL_SOCKET 1 + +#define SO_DEBUG 1 +#define SO_REUSEADDR 2 +#define SO_TYPE 3 +#define SO_ERROR 4 +#define SO_DONTROUTE 5 +#define SO_BROADCAST 6 +#define SO_SNDBUF 7 +#define SO_RCVBUF 8 +#define SO_SNDBUFFORCE 32 +#define SO_RCVBUFFORCE 33 +#define SO_KEEPALIVE 9 +#define SO_OOBINLINE 10 +#define SO_NO_CHECK 11 +#define SO_PRIORITY 12 +#define SO_LINGER 13 +#define SO_BSDCOMPAT 14 +/* To add :#define SO_REUSEPORT 15 */ +#define SO_PASSCRED 16 +#define SO_PEERCRED 17 +#define SO_RCVLOWAT 18 +#define SO_SNDLOWAT 19 +#define SO_RCVTIMEO 20 +#define SO_SNDTIMEO 21 + +/* Security levels - as per NRL IPv6 - don't actually do anything */ +#define SO_SECURITY_AUTHENTICATION 22 +#define SO_SECURITY_ENCRYPTION_TRANSPORT 23 +#define SO_SECURITY_ENCRYPTION_NETWORK 24 + +#define SO_BINDTODEVICE 25 + +/* Socket filtering */ +#define SO_ATTACH_FILTER 26 +#define SO_DETACH_FILTER 27 + +#define SO_PEERNAME 28 +#define SO_TIMESTAMP 29 +#define SCM_TIMESTAMP SO_TIMESTAMP + +#define SO_ACCEPTCONN 30 + +#define SO_PEERSEC 31 +#define SO_PASSSEC 34 + +#endif /* _ASM_SOCKET_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sockios.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sockios.h new file mode 100644 index 0000000..2eefd10 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sockios.h @@ -0,0 +1,12 @@ +#ifndef __ARCH_X8664_SOCKIOS__ +#define __ARCH_X8664_SOCKIOS__ + +/* Socket-level I/O control calls. */ +#define FIOSETOWN 0x8901 +#define SIOCSPGRP 0x8902 +#define FIOGETOWN 0x8903 +#define SIOCGPGRP 0x8904 +#define SIOCATMARK 0x8905 +#define SIOCGSTAMP 0x8906 /* Get stamp */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sparsemem.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sparsemem.h new file mode 100644 index 0000000..dabb167 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/sparsemem.h @@ -0,0 +1,26 @@ +#ifndef _ASM_X86_64_SPARSEMEM_H +#define _ASM_X86_64_SPARSEMEM_H 1 + +#ifdef CONFIG_SPARSEMEM + +/* + * generic non-linear memory support: + * + * 1) we will not split memory into more chunks than will fit into the flags + * field of the struct page + * + * SECTION_SIZE_BITS 2^n: size of each section + * MAX_PHYSADDR_BITS 2^n: max size of physical address space + * MAX_PHYSMEM_BITS 2^n: how much memory we can have in that space + * + */ + +#define SECTION_SIZE_BITS 27 /* matt - 128 is convenient right now */ +#define MAX_PHYSADDR_BITS 40 +#define MAX_PHYSMEM_BITS 40 + +extern int early_pfn_to_nid(unsigned long pfn); + +#endif /* CONFIG_SPARSEMEM */ + +#endif /* _ASM_X86_64_SPARSEMEM_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock.h new file mode 100644 index 0000000..845bd66 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock.h @@ -0,0 +1,167 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef __ASM_SPINLOCK_H +#define __ASM_SPINLOCK_H + +#include +#include +#include + +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif /* defined(__VMKLNX__) */ + +/* + * Your basic SMP spinlocks, allowing only a single CPU anywhere + * + * Simple spin lock operations. There are two variants, one clears IRQ's + * on the local processor, one does not. + * + * We make no fairness assumptions. They have a cost. + * + * (the type definitions are in asm/spinlock_types.h) + */ + +#define __raw_spin_is_locked(x) \ + (*(volatile signed int *)(&(x)->slock) <= 0) + +#define __raw_spin_lock_string \ + "\n1:\t" \ + LOCK_PREFIX " ; decl %0\n\t" \ + "js 2f\n" \ + LOCK_SECTION_START("") \ + "2:\t" \ + "rep;nop\n\t" \ + "cmpl $0,%0\n\t" \ + "jle 2b\n\t" \ + "jmp 1b\n" \ + LOCK_SECTION_END + +#define __raw_spin_lock_string_up \ + "\n\tdecl %0" + +#define __raw_spin_unlock_string \ + "movl $1,%0" \ + :"=m" (lock->slock) : : "memory" + +static inline void __raw_spin_lock(raw_spinlock_t *lock) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + asm volatile(__raw_spin_lock_string : "=m" (lock->slock) : : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); + lock->cpu = vmk_GetPCPUNum(); + lock->ra = (unsigned long) __builtin_return_address(0); +#endif /* defined(__VMKLNX__) */ +} + +#define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) + +static inline int __raw_spin_trylock(raw_spinlock_t *lock) +{ + int oldval; + +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + "xchgl %0,%1" + :"=q" (oldval), "=m" (lock->slock) + :"0" (0) : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); + if (oldval > 0) { + lock->cpu = vmk_GetPCPUNum(); + lock->ra = (unsigned long) __builtin_return_address(0); + } +#endif /* defined(__VMKLNX__) */ + + return oldval > 0; +} + +static inline void __raw_spin_unlock(raw_spinlock_t *lock) +{ +#if defined(__VMKLNX__) + lock->cpu = SPINLOCK_VMKERNEL_CPU_INVALID; +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__( + __raw_spin_unlock_string + ); +} + +#define __raw_spin_unlock_wait(lock) \ + do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0) + +/* + * Read-write spinlocks, allowing multiple readers + * but only one writer. + * + * NOTE! it is quite common to have readers in interrupts + * but no interrupt writers. For those circumstances we + * can "mix" irq-safe locks - any writer needs to get a + * irq-safe write-lock, but readers can get non-irqsafe + * read-locks. + * + * On x86, we implement read-write locks as a 32-bit counter + * with the high bit (sign) being the "contended" bit. + */ + +#define __raw_read_can_lock(x) ((int)(x)->lock > 0) +#define __raw_write_can_lock(x) ((x)->lock == RW_LOCK_BIAS) + +static inline void __raw_read_lock(raw_rwlock_t *rw) +{ + __build_read_lock(rw); +} + +static inline void __raw_write_lock(raw_rwlock_t *rw) +{ + __build_write_lock(rw); +} + +static inline int __raw_read_trylock(raw_rwlock_t *lock) +{ + atomic_t *count = (atomic_t *)lock; + atomic_dec(count); + if (atomic_read(count) >= 0) + return 1; + atomic_inc(count); + return 0; +} + +static inline int __raw_write_trylock(raw_rwlock_t *lock) +{ + atomic_t *count = (atomic_t *)lock; + if (atomic_sub_and_test(RW_LOCK_BIAS, count)) + return 1; + atomic_add(RW_LOCK_BIAS, count); + return 0; +} + +static inline void __raw_read_unlock(raw_rwlock_t *rw) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + asm volatile(LOCK_PREFIX " ; incl %0" :"=m" (rw->lock) : : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +static inline void __raw_write_unlock(raw_rwlock_t *rw) +{ +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + asm volatile(LOCK_PREFIX " ; addl $" RW_LOCK_BIAS_STR ",%0" + : "=m" (rw->lock) : : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ +} + +#endif /* __ASM_SPINLOCK_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock_types.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock_types.h new file mode 100644 index 0000000..2902429 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/spinlock_types.h @@ -0,0 +1,49 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef __ASM_SPINLOCK_TYPES_H +#define __ASM_SPINLOCK_TYPES_H + +#ifndef __LINUX_SPINLOCK_TYPES_H +# error "please don't include this file directly" +#endif + +#if defined(__VMKLNX__) +#define SPINLOCK_VMKERNEL_CPU_INVALID 0xbadc0ded +#define SPINLOCK_VMKERNEL_INIT , SPINLOCK_VMKERNEL_CPU_INVALID, 0, 0 + +typedef struct { + volatile unsigned int slock; + unsigned long cpu; + unsigned long ra; + unsigned long flags; +} raw_spinlock_t; + +typedef struct { + volatile unsigned int lock; + unsigned long cpu; + unsigned long ra; + unsigned long flags; +} raw_rwlock_t; + +#define __RAW_SPIN_LOCK_UNLOCKED { 1 SPINLOCK_VMKERNEL_INIT } +#define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS SPINLOCK_VMKERNEL_INIT } + +#else /* !defined(__VMKLNX__) */ + + +typedef struct { + volatile unsigned int slock; +} raw_spinlock_t; + +#define __RAW_SPIN_LOCK_UNLOCKED { 1 } + +typedef struct { + volatile unsigned int lock; +} raw_rwlock_t; + +#define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS } + +#endif /* defined(__VMKLNX__) */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stacktrace.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stacktrace.h new file mode 100644 index 0000000..5eb9799 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stacktrace.h @@ -0,0 +1,18 @@ +#ifndef _ASM_STACKTRACE_H +#define _ASM_STACKTRACE_H 1 + +/* Generic stack tracer with callbacks */ + +struct stacktrace_ops { + void (*warning)(void *data, char *msg); + /* msg must contain %s for the symbol */ + void (*warning_symbol)(void *data, char *msg, unsigned long symbol); + void (*address)(void *data, unsigned long address); + /* On negative return stop dumping */ + int (*stack)(void *data, char *name); +}; + +void dump_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long *stack, + struct stacktrace_ops *ops, void *data); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stat.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stat.h new file mode 100644 index 0000000..fd9f00d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/stat.h @@ -0,0 +1,44 @@ +#ifndef _ASM_X86_64_STAT_H +#define _ASM_X86_64_STAT_H + +#define STAT_HAVE_NSEC 1 + +struct stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned long st_nlink; + + unsigned int st_mode; + unsigned int st_uid; + unsigned int st_gid; + unsigned int __pad0; + unsigned long st_rdev; + long st_size; + long st_blksize; + long st_blocks; /* Number 512-byte blocks allocated. */ + + unsigned long st_atime; + unsigned long st_atime_nsec; + unsigned long st_mtime; + unsigned long st_mtime_nsec; + unsigned long st_ctime; + unsigned long st_ctime_nsec; + long __unused[3]; +}; + +/* For 32bit emulation */ +struct __old_kernel_stat { + unsigned short st_dev; + unsigned short st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + unsigned int st_size; + unsigned int st_atime; + unsigned int st_mtime; + unsigned int st_ctime; +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/statfs.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/statfs.h new file mode 100644 index 0000000..b3f4718 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/statfs.h @@ -0,0 +1,58 @@ +#ifndef _X86_64_STATFS_H +#define _X86_64_STATFS_H + +#ifndef __KERNEL_STRICT_NAMES + +#include + +typedef __kernel_fsid_t fsid_t; + +#endif + +/* + * This is ugly -- we're already 64-bit clean, so just duplicate the + * definitions. + */ +struct statfs { + long f_type; + long f_bsize; + long f_blocks; + long f_bfree; + long f_bavail; + long f_files; + long f_ffree; + __kernel_fsid_t f_fsid; + long f_namelen; + long f_frsize; + long f_spare[5]; +}; + +struct statfs64 { + long f_type; + long f_bsize; + long f_blocks; + long f_bfree; + long f_bavail; + long f_files; + long f_ffree; + __kernel_fsid_t f_fsid; + long f_namelen; + long f_frsize; + long f_spare[5]; +}; + +struct compat_statfs64 { + __u32 f_type; + __u32 f_bsize; + __u64 f_blocks; + __u64 f_bfree; + __u64 f_bavail; + __u64 f_files; + __u64 f_ffree; + __kernel_fsid_t f_fsid; + __u32 f_namelen; + __u32 f_frsize; + __u32 f_spare[5]; +} __attribute__((packed)); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/string.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/string.h new file mode 100644 index 0000000..a3c1001 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/string.h @@ -0,0 +1,129 @@ +#ifndef _X86_64_STRING_H_ +#define _X86_64_STRING_H_ + +#ifdef __KERNEL__ + +#if defined(__VMKLNX__) +extern inline char * +#else /* !defined(__VMKLNX__) */ +#define __HAVE_ARCH_STRCPY +static inline char * +#endif /* defined(__VMKLNX__) */ +strcpy(char *dst, __const char *src) +{ + char *retval = dst; + while((*dst++ = *src++)) { + ; + } + return retval; +} + +#if !defined(__VMKLNX__) +#define __HAVE_ARCH_STRNCMP +static inline int +strncmp(const char *s1, const char *s2, size_t count) +{ + int res = 0; + + while (count > 0) { + res = *s1 - *s2; + if (res != 0 || *s1 == 0) { + break; + } + count--; + s1++; + s2++; + } + + return res; +} + +#define __HAVE_ARCH_STRCAT +static inline char * +strcat(char *dst, __const char *src) +{ + char *ptr=dst; + + for (ptr=dst;*ptr != '\0'; ptr++) { + continue; + } + for ( ; *src!='\0'; ptr++,src++) { + *ptr = *src; + } + *ptr = '\0'; + return dst; +} + +#define __HAVE_ARCH_STRLEN +static inline size_t strlen(const char * s) +{ +int d0; +register int __res; +__asm__ __volatile__( + "repne\n\t" + "scasb\n\t" + "notl %0\n\t" + "decl %0" + :"=c" (__res), "=&D" (d0) :"1" (s),"a" (0), "0" (0xffffffffffffffff)); +return __res; +} + +#define __HAVE_ARCH_STRSTR +extern char *strstr(const char *cs, const char *ct); + +/* Written 2002 by Andi Kleen */ + +/* Only used for special circumstances. Stolen from i386/string.h */ +static __always_inline void * +__inline_memcpy(void * to, const void * from, size_t n) +{ +unsigned long d0, d1, d2; +__asm__ __volatile__( + "rep ; movsl\n\t" + "testb $2,%b4\n\t" + "je 1f\n\t" + "movsw\n" + "1:\ttestb $1,%b4\n\t" + "je 2f\n\t" + "movsb\n" + "2:" + : "=&c" (d0), "=&D" (d1), "=&S" (d2) + :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from) + : "memory"); +return (to); +} + +/* Even with __builtin_ the compiler may decide to use the out of line + function. */ + +#define __HAVE_ARCH_MEMCPY 1 +extern void *__memcpy(void *to, const void *from, size_t len); +#define memcpy(dst,src,len) \ + ({ size_t __len = (len); \ + void *__ret; \ + if (__builtin_constant_p(len) && __len >= 64) \ + __ret = __memcpy((dst),(src),__len); \ + else \ + __ret = __builtin_memcpy((dst),(src),__len); \ + __ret; }) + + +#define __HAVE_ARCH_MEMSET +void *memset(void *s, int c, size_t n); +#endif /* !defined(__VMKLNX__) */ + +#define __HAVE_ARCH_MEMMOVE +void * memmove(void * dest,const void *src,size_t count); + +#if !defined(__VMKLNX__) +int memcmp(const void * cs,const void * ct,size_t count); +#endif /* !defined(__VMKLNX__) */ +size_t strlen(const char * s); +char *strcpy(char * dest,const char *src); +char *strcat(char * dest, const char * src); +#if !defined(__VMKLNX__) +int strcmp(const char * cs,const char * ct); +#endif /* !defined(__VMKLNX__) */ +#endif /* __KERNEL__ */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/suspend.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/suspend.h new file mode 100644 index 0000000..9c3f8de --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/suspend.h @@ -0,0 +1,57 @@ +/* + * Copyright 2001-2003 Pavel Machek + * Based on code + * Copyright 2001 Patrick Mochel + */ +#include +#include + +static inline int +arch_prepare_suspend(void) +{ + return 0; +} + +/* Image of the saved processor state. If you touch this, fix acpi_wakeup.S. */ +struct saved_context { + u16 ds, es, fs, gs, ss; + unsigned long gs_base, gs_kernel_base, fs_base; + unsigned long cr0, cr2, cr3, cr4, cr8; + unsigned long efer; + u16 gdt_pad; + u16 gdt_limit; + unsigned long gdt_base; + u16 idt_pad; + u16 idt_limit; + unsigned long idt_base; + u16 ldt; + u16 tss; + unsigned long tr; + unsigned long safety; + unsigned long return_address; + unsigned long eflags; +} __attribute__((packed)); + +/* We'll access these from assembly, so we'd better have them outside struct */ +extern unsigned long saved_context_eax, saved_context_ebx, saved_context_ecx, saved_context_edx; +extern unsigned long saved_context_esp, saved_context_ebp, saved_context_esi, saved_context_edi; +extern unsigned long saved_context_r08, saved_context_r09, saved_context_r10, saved_context_r11; +extern unsigned long saved_context_r12, saved_context_r13, saved_context_r14, saved_context_r15; +extern unsigned long saved_context_eflags; + +#define loaddebug(thread,register) \ + set_debugreg((thread)->debugreg##register, register) + +extern void fix_processor_context(void); + +#ifdef CONFIG_ACPI_SLEEP +extern unsigned long saved_rip; +extern unsigned long saved_rsp; +extern unsigned long saved_rbp; +extern unsigned long saved_rbx; +extern unsigned long saved_rsi; +extern unsigned long saved_rdi; + +/* routines for saving/restoring kernel state */ +extern int acpi_save_state_mem(void); +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/swiotlb.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/swiotlb.h new file mode 100644 index 0000000..ba94ab3 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/swiotlb.h @@ -0,0 +1,55 @@ +#ifndef _ASM_SWIOTLB_H +#define _ASM_SWTIOLB_H 1 + + +#include + +/* SWIOTLB interface */ + +extern dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, + size_t size, int dir); +extern void *swiotlb_alloc_coherent(struct device *hwdev, size_t size, + dma_addr_t *dma_handle, gfp_t flags); +extern void swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_single_for_cpu(struct device *hwdev, + dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_single_for_device(struct device *hwdev, + dma_addr_t dev_addr, + size_t size, int dir); +extern void swiotlb_sync_single_range_for_cpu(struct device *hwdev, + dma_addr_t dev_addr, + unsigned long offset, + size_t size, int dir); +extern void swiotlb_sync_single_range_for_device(struct device *hwdev, + dma_addr_t dev_addr, + unsigned long offset, + size_t size, int dir); +extern void swiotlb_sync_sg_for_cpu(struct device *hwdev, + struct scatterlist *sg, int nelems, + int dir); +extern void swiotlb_sync_sg_for_device(struct device *hwdev, + struct scatterlist *sg, int nelems, + int dir); +extern int swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, + int nents, int direction); +extern void swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, + int nents, int direction); +extern int swiotlb_dma_mapping_error(dma_addr_t dma_addr); +extern void swiotlb_free_coherent (struct device *hwdev, size_t size, + void *vaddr, dma_addr_t dma_handle); +extern int swiotlb_dma_supported(struct device *hwdev, u64 mask); +extern void swiotlb_init(void); + +extern int swiotlb_force; + +#ifdef CONFIG_SWIOTLB +extern int swiotlb; +#else +#define swiotlb 0 +#endif + +extern void pci_swiotlb_init(void); + +#endif /* _ASM_SWTIOLB_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/system.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/system.h new file mode 100644 index 0000000..e9380af --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/system.h @@ -0,0 +1,398 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +#ifndef __ASM_SYSTEM_H +#define __ASM_SYSTEM_H + +#include +#include +#include +#if defined(__VMKLNX__) +#include "vmkapi.h" +#endif + +#ifdef __KERNEL__ + +#define __STR(x) #x +#define STR(x) __STR(x) + +#define __SAVE(reg,offset) "movq %%" #reg ",(14-" #offset ")*8(%%rsp)\n\t" +#define __RESTORE(reg,offset) "movq (14-" #offset ")*8(%%rsp),%%" #reg "\n\t" + +/* frame pointer must be last for get_wchan */ +#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t" +#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\n\t" + +#define __EXTRA_CLOBBER \ + ,"rcx","rbx","rdx","r8","r9","r10","r11","r12","r13","r14","r15" + +#define switch_to(prev,next,last) \ + asm volatile(SAVE_CONTEXT \ + "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ + "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */ \ + "call __switch_to\n\t" \ + ".globl thread_return\n" \ + "thread_return:\n\t" \ + "movq %%gs:%P[pda_pcurrent],%%rsi\n\t" \ + "movq %P[thread_info](%%rsi),%%r8\n\t" \ + LOCK_PREFIX "btr %[tif_fork],%P[ti_flags](%%r8)\n\t" \ + "movq %%rax,%%rdi\n\t" \ + "jc ret_from_fork\n\t" \ + RESTORE_CONTEXT \ + : "=a" (last) \ + : [next] "S" (next), [prev] "D" (prev), \ + [threadrsp] "i" (offsetof(struct task_struct, thread.rsp)), \ + [ti_flags] "i" (offsetof(struct thread_info, flags)),\ + [tif_fork] "i" (TIF_FORK), \ + [thread_info] "i" (offsetof(struct task_struct, thread_info)), \ + [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent)) \ + : "memory", "cc" __EXTRA_CLOBBER) + +extern void load_gs_index(unsigned); + +/* + * Load a segment. Fall back on loading the zero + * segment if something goes wrong.. + */ +#define loadsegment(seg,value) \ + asm volatile("\n" \ + "1:\t" \ + "movl %k0,%%" #seg "\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3:\t" \ + "movl %1,%%" #seg "\n\t" \ + "jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n\t" \ + ".align 8\n\t" \ + ".quad 1b,3b\n" \ + ".previous" \ + : :"r" (value), "r" (0)) + +/* + * Clear and set 'TS' bit respectively + */ +#define clts() __asm__ __volatile__ ("clts") + +static inline unsigned long read_cr0(void) +{ + unsigned long cr0; + asm volatile("movq %%cr0,%0" : "=r" (cr0)); + return cr0; +} + +static inline void write_cr0(unsigned long val) +{ + asm volatile("movq %0,%%cr0" :: "r" (val)); +} + +static inline unsigned long read_cr3(void) +{ + unsigned long cr3; + asm("movq %%cr3,%0" : "=r" (cr3)); + return cr3; +} + +static inline unsigned long read_cr4(void) +{ + unsigned long cr4; + asm("movq %%cr4,%0" : "=r" (cr4)); + return cr4; +} + +static inline void write_cr4(unsigned long val) +{ + asm volatile("movq %0,%%cr4" :: "r" (val)); +} + +#define stts() write_cr0(8 | read_cr0()) + +#define wbinvd() \ + __asm__ __volatile__ ("wbinvd": : :"memory"); + +/* + * On SMP systems, when the scheduler does migration-cost autodetection, + * it needs a way to flush as much of the CPU's caches as possible. + */ +static inline void sched_cacheflush(void) +{ + wbinvd(); +} + +#endif /* __KERNEL__ */ + +#define nop() __asm__ __volatile__ ("nop") + +/** + * xchg - exchange data between v and the value in memory pointed by ptr in an atomic operation + * @ptr: a pointer to a memory to be exchanged + * @v: a vlaue to be exchanged + * + * Exchange v and the value in memory pointed by ptr in an atomic operation. + * + * SYNOPSIS: + * #define xchg(ptr,v) + * + * RETURN VALUE: + * It returns the original value of (*ptr). + */ +/* _VMKLNX_CODECHECK_: xchg */ +#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr)))) + +#define tas(ptr) (xchg((ptr),1)) + +#define __xg(x) ((volatile long *)(x)) + +static inline void set_64bit(volatile unsigned long *ptr, unsigned long val) +{ + *ptr = val; +} + +#define _set_64bit set_64bit + +/* + * Note: no "lock" prefix even on SMP: xchg always implies lock anyway + * Note 2: xchg has side effect, so that attribute volatile is necessary, + * but generally the primitive is invalid, *ptr is output argument. --ANK + */ +/** + * __xchg - <1 Line Description> + * @: + * @: + * + * + * + * ESX Deviation Notes: + * + * + */ +/* _VMKLNX_CODECHECK_: __xchg */ +static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) +{ + switch (size) { + case 1: + __asm__ __volatile__("xchgb %b0,%1" + :"=q" (x) + :"m" (*__xg(ptr)), "0" (x) + :"memory"); + break; + case 2: + __asm__ __volatile__("xchgw %w0,%1" + :"=r" (x) + :"m" (*__xg(ptr)), "0" (x) + :"memory"); + break; + case 4: + __asm__ __volatile__("xchgl %k0,%1" + :"=r" (x) + :"m" (*__xg(ptr)), "0" (x) + :"memory"); + break; + case 8: + __asm__ __volatile__("xchgq %0,%1" + :"=r" (x) + :"m" (*__xg(ptr)), "0" (x) + :"memory"); + break; + } + return x; +} + +/* + * Atomic compare and exchange. Compare OLD with MEM, if identical, + * store NEW in MEM. Return the initial value in MEM. Success is + * indicated by comparing RETURN with OLD. + */ + +#define __HAVE_ARCH_CMPXCHG 1 + +static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, + unsigned long new, int size) +{ + unsigned long prev; + switch (size) { + case 1: +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" + : "=a"(prev) + : "q"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + + return prev; + case 2: +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" + : "=a"(prev) + : "r"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + + return prev; + case 4: +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %k1,%2" + : "=a"(prev) + : "r"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + + return prev; + case 8: +#if defined(__VMKLNX__) + vmk_AtomicPrologue(); +#endif /* defined(__VMKLNX__) */ + __asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2" + : "=a"(prev) + : "r"(new), "m"(*__xg(ptr)), "0"(old) + : "memory"); +#if defined(__VMKLNX__) + vmk_AtomicEpilogue(); +#endif /* defined(__VMKLNX__) */ + + return prev; + } + return old; +} + +#define cmpxchg(ptr,o,n)\ + ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ + (unsigned long)(n),sizeof(*(ptr)))) + +#ifdef CONFIG_SMP + +/** + * smp_mb - memory barrier for SMP + * + * Invokes memory barrier for SMP. + * + * SYNOPSIS: + * #define smp_mb(void) + * + * RETURN VALUE: + * None + */ + /* _VMKLNX_CODECHECK_: smp_mb */ + +#define smp_mb() mb() + +/** + * smp_rmb - read memory barrier for SMP + * + * Invokes read memory barrier for SMP. + * + * SYNOPSIS: + * #define smp_rmb(void) + * + * RETURN VALUE: + * None + */ + /* _VMKLNX_CODECHECK_: smp_rmb */ + +#define smp_rmb() rmb() + +/** + * smp_wmb - write memory barrier for SMP + * + * Invokes write memory barrier for SMP. + * + * SYNOPSIS: + * #define smp_wmb(void) + * + * RETURN VALUE: + * None + */ + /* _VMKLNX_CODECHECK_: smp_wmb */ + +#define smp_wmb() wmb() +#define smp_read_barrier_depends() do {} while(0) +#else +#define smp_mb() barrier() +#define smp_rmb() barrier() +#define smp_wmb() barrier() +#define smp_read_barrier_depends() do {} while(0) +#endif + + +/* + * Force strict CPU ordering. + * And yes, this is required on UP too when we're talking + * to devices. + */ +#define mb() asm volatile("mfence":::"memory") + +/** + * rmb - read memory barrier + * + * Read Memory Barriers make a guarantee that all the memory reads specified + * before the barrier will happen before all memory reads specified after the + * barrier. + * + * SYNOPSIS: + * #define rmb(void) + * + * RETURN VALUE: + * This function does not return a value. + * + */ +/* _VMKLNX_CODECHECK_: rmb */ +#define rmb() asm volatile("lfence":::"memory") + +#ifdef CONFIG_UNORDERED_IO +#define wmb() asm volatile("sfence" ::: "memory") +#else +/** + * wmb - write memory barrier + * + * A write memory barrier guarantees that all write operations specified + * before the barrier will happen before all the write operations specified + * after the barrier. + * + * SYNOPSIS: + * #define wmb() + * + * RETURN VALUE: + * NONE + */ +/* _VMKLNX_CODECHECK_: wmb */ +#define wmb() asm volatile("" ::: "memory") +#endif +#define read_barrier_depends() do {} while(0) +#define set_mb(var, value) do { (void) xchg(&var, value); } while (0) + +/** + * warn_if_not_ulong - warn if the type is not unsigned long + * @x: variable to be tested + * + * Trigger a compiler warning if the type of a given argument is not unsigned long + * + * SYNOPSIS: + * #define warn_if_not_ulong(x) + * + * RETURN VALUE: + * NONE + */ +/* _VMKLNX_CODECHECK_: warn_if_not_ulong */ +#define warn_if_not_ulong(x) do { unsigned long foo; (void) (&(x) == &foo); } while (0) + +#include + +void cpu_idle_wait(void); + +extern unsigned long arch_align_stack(unsigned long sp); +extern void free_init_pages(char *what, unsigned long begin, unsigned long end); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tce.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tce.h new file mode 100644 index 0000000..53e9a68 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tce.h @@ -0,0 +1,49 @@ +/* + * This file is derived from asm-powerpc/tce.h. + * + * Copyright (C) IBM Corporation, 2006 + * + * Author: Muli Ben-Yehuda + * Author: Jon Mason + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _ASM_X86_64_TCE_H +#define _ASM_X86_64_TCE_H + +extern void* tce_table_kva[]; +extern unsigned int specified_table_size; +struct iommu_table; + +#define TCE_ENTRY_SIZE 8 /* in bytes */ + +#define TCE_READ_SHIFT 0 +#define TCE_WRITE_SHIFT 1 +#define TCE_HUBID_SHIFT 2 /* unused */ +#define TCE_RSVD_SHIFT 8 /* unused */ +#define TCE_RPN_SHIFT 12 +#define TCE_UNUSED_SHIFT 48 /* unused */ + +#define TCE_RPN_MASK 0x0000fffffffff000ULL + +extern void tce_build(struct iommu_table *tbl, unsigned long index, + unsigned int npages, unsigned long uaddr, int direction); +extern void tce_free(struct iommu_table *tbl, long index, unsigned int npages); +extern void* alloc_tce_table(void); +extern void free_tce_table(void *tbl); +extern int build_tce_table(struct pci_dev *dev, void __iomem *bbar); + +#endif /* _ASM_X86_64_TCE_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termbits.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termbits.h new file mode 100644 index 0000000..bd95094 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termbits.h @@ -0,0 +1,173 @@ +#ifndef __ARCH_X8664_TERMBITS_H__ +#define __ARCH_X8664_TERMBITS_H__ + +#include + +typedef unsigned char cc_t; +typedef unsigned int speed_t; +typedef unsigned int tcflag_t; + +#define NCCS 19 +struct termios { + tcflag_t c_iflag; /* input mode flags */ + tcflag_t c_oflag; /* output mode flags */ + tcflag_t c_cflag; /* control mode flags */ + tcflag_t c_lflag; /* local mode flags */ + cc_t c_line; /* line discipline */ + cc_t c_cc[NCCS]; /* control characters */ +}; + +/* c_cc characters */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VTIME 5 +#define VMIN 6 +#define VSWTC 7 +#define VSTART 8 +#define VSTOP 9 +#define VSUSP 10 +#define VEOL 11 +#define VREPRINT 12 +#define VDISCARD 13 +#define VWERASE 14 +#define VLNEXT 15 +#define VEOL2 16 + +/* c_iflag bits */ +#define IGNBRK 0000001 +#define BRKINT 0000002 +#define IGNPAR 0000004 +#define PARMRK 0000010 +#define INPCK 0000020 +#define ISTRIP 0000040 +#define INLCR 0000100 +#define IGNCR 0000200 +#define ICRNL 0000400 +#define IUCLC 0001000 +#define IXON 0002000 +#define IXANY 0004000 +#define IXOFF 0010000 +#define IMAXBEL 0020000 +#define IUTF8 0040000 + +/* c_oflag bits */ +#define OPOST 0000001 +#define OLCUC 0000002 +#define ONLCR 0000004 +#define OCRNL 0000010 +#define ONOCR 0000020 +#define ONLRET 0000040 +#define OFILL 0000100 +#define OFDEL 0000200 +#define NLDLY 0000400 +#define NL0 0000000 +#define NL1 0000400 +#define CRDLY 0003000 +#define CR0 0000000 +#define CR1 0001000 +#define CR2 0002000 +#define CR3 0003000 +#define TABDLY 0014000 +#define TAB0 0000000 +#define TAB1 0004000 +#define TAB2 0010000 +#define TAB3 0014000 +#define XTABS 0014000 +#define BSDLY 0020000 +#define BS0 0000000 +#define BS1 0020000 +#define VTDLY 0040000 +#define VT0 0000000 +#define VT1 0040000 +#define FFDLY 0100000 +#define FF0 0000000 +#define FF1 0100000 + +/* c_cflag bit meaning */ +#define CBAUD 0010017 +#define B0 0000000 /* hang up */ +#define B50 0000001 +#define B75 0000002 +#define B110 0000003 +#define B134 0000004 +#define B150 0000005 +#define B200 0000006 +#define B300 0000007 +#define B600 0000010 +#define B1200 0000011 +#define B1800 0000012 +#define B2400 0000013 +#define B4800 0000014 +#define B9600 0000015 +#define B19200 0000016 +#define B38400 0000017 +#define EXTA B19200 +#define EXTB B38400 +#define CSIZE 0000060 +#define CS5 0000000 +#define CS6 0000020 +#define CS7 0000040 +#define CS8 0000060 +#define CSTOPB 0000100 +#define CREAD 0000200 +#define PARENB 0000400 +#define PARODD 0001000 +#define HUPCL 0002000 +#define CLOCAL 0004000 +#define CBAUDEX 0010000 +#define B57600 0010001 +#define B115200 0010002 +#define B230400 0010003 +#define B460800 0010004 +#define B500000 0010005 +#define B576000 0010006 +#define B921600 0010007 +#define B1000000 0010010 +#define B1152000 0010011 +#define B1500000 0010012 +#define B2000000 0010013 +#define B2500000 0010014 +#define B3000000 0010015 +#define B3500000 0010016 +#define B4000000 0010017 +#define CIBAUD 002003600000 /* input baud rate (not used) */ +#define CMSPAR 010000000000 /* mark or space (stick) parity */ +#define CRTSCTS 020000000000 /* flow control */ + +/* c_lflag bits */ +#define ISIG 0000001 +#define ICANON 0000002 +#define XCASE 0000004 +#define ECHO 0000010 +#define ECHOE 0000020 +#define ECHOK 0000040 +#define ECHONL 0000100 +#define NOFLSH 0000200 +#define TOSTOP 0000400 +#define ECHOCTL 0001000 +#define ECHOPRT 0002000 +#define ECHOKE 0004000 +#define FLUSHO 0010000 +#define PENDIN 0040000 +#define IEXTEN 0100000 + +/* tcflow() and TCXONC use these */ +#define TCOOFF 0 +#define TCOON 1 +#define TCIOFF 2 +#define TCION 3 + +/* tcflush() and TCFLSH use these */ +#define TCIFLUSH 0 +#define TCOFLUSH 1 +#define TCIOFLUSH 2 + +/* tcsetattr uses these */ +#define TCSANOW 0 +#define TCSADRAIN 1 +#define TCSAFLUSH 2 + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termios.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termios.h new file mode 100644 index 0000000..041a91f --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/termios.h @@ -0,0 +1,106 @@ +#ifndef _X8664_TERMIOS_H +#define _X8664_TERMIOS_H + +#include +#include + +struct winsize { + unsigned short ws_row; + unsigned short ws_col; + unsigned short ws_xpixel; + unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { + unsigned short c_iflag; /* input mode flags */ + unsigned short c_oflag; /* output mode flags */ + unsigned short c_cflag; /* control mode flags */ + unsigned short c_lflag; /* local mode flags */ + unsigned char c_line; /* line discipline */ + unsigned char c_cc[NCC]; /* control characters */ +}; + +/* modem lines */ +#define TIOCM_LE 0x001 +#define TIOCM_DTR 0x002 +#define TIOCM_RTS 0x004 +#define TIOCM_ST 0x008 +#define TIOCM_SR 0x010 +#define TIOCM_CTS 0x020 +#define TIOCM_CAR 0x040 +#define TIOCM_RNG 0x080 +#define TIOCM_DSR 0x100 +#define TIOCM_CD TIOCM_CAR +#define TIOCM_RI TIOCM_RNG +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 + +/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ + +/* line disciplines */ +#define N_TTY 0 +#define N_SLIP 1 +#define N_MOUSE 2 +#define N_PPP 3 +#define N_STRIP 4 +#define N_AX25 5 +#define N_X25 6 /* X.25 async */ +#define N_6PACK 7 +#define N_MASC 8 /* Reserved for Mobitex module */ +#define N_R3964 9 /* Reserved for Simatic R3964 module */ +#define N_PROFIBUS_FDL 10 /* Reserved for Profibus */ +#define N_IRDA 11 /* Linux IR - http://irda.sourceforge.net/ */ +#define N_SMSBLOCK 12 /* SMS block mode - for talking to GSM data cards about SMS messages */ +#define N_HDLC 13 /* synchronous HDLC */ +#define N_SYNC_PPP 14 /* synchronous PPP */ +#define N_HCI 15 /* Bluetooth HCI UART */ + +#ifdef __KERNEL__ + +/* intr=^C quit=^\ erase=del kill=^U + eof=^D vtime=\0 vmin=\1 sxtc=\0 + start=^Q stop=^S susp=^Z eol=\0 + reprint=^R discard=^U werase=^W lnext=^V + eol2=\0 +*/ +#define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" + +/* + * Translate a "termio" structure into a "termios". Ugh. + */ +#define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ + unsigned short __tmp; \ + get_user(__tmp,&(termio)->x); \ + *(unsigned short *) &(termios)->x = __tmp; \ +} + +#define user_termio_to_kernel_termios(termios, termio) \ +({ \ + SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ + SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ + copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ +}) + +/* + * Translate a "termios" structure into a "termio". Ugh. + */ +#define kernel_termios_to_user_termio(termio, termios) \ +({ \ + put_user((termios)->c_iflag, &(termio)->c_iflag); \ + put_user((termios)->c_oflag, &(termio)->c_oflag); \ + put_user((termios)->c_cflag, &(termio)->c_cflag); \ + put_user((termios)->c_lflag, &(termio)->c_lflag); \ + put_user((termios)->c_line, &(termio)->c_line); \ + copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ +}) + +#define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios)) +#define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios)) + +#endif /* __KERNEL__ */ + +#endif /* _X8664_TERMIOS_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/thread_info.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/thread_info.h new file mode 100644 index 0000000..00b2cfc --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/thread_info.h @@ -0,0 +1,165 @@ +/* thread_info.h: x86_64 low-level thread information + * + * Copyright (C) 2002 David Howells (dhowells@redhat.com) + * - Incorporating suggestions made by Linus Torvalds and Dave Miller + */ + +#ifndef _ASM_THREAD_INFO_H +#define _ASM_THREAD_INFO_H + +#ifdef __KERNEL__ + +#include +#include +#include + +/* + * low level task data that entry.S needs immediate access to + * - this struct should fit entirely inside of one cache line + * - this struct shares the supervisor stack pages + */ +#ifndef __ASSEMBLY__ +struct task_struct; +struct exec_domain; +#include + +struct thread_info { + struct task_struct *task; /* main task structure */ + struct exec_domain *exec_domain; /* execution domain */ + __u32 flags; /* low level flags */ + __u32 status; /* thread synchronous flags */ + __u32 cpu; /* current CPU */ + int preempt_count; /* 0 => preemptable, <0 => BUG */ + + mm_segment_t addr_limit; + struct restart_block restart_block; +}; +#endif + +/* + * macros/functions for gaining access to the thread information structure + * preempt_count needs to be 1 initially, until the scheduler is functional. + */ +#ifndef __ASSEMBLY__ +#define INIT_THREAD_INFO(tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .addr_limit = KERNEL_DS, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ +} + +#define init_thread_info (init_thread_union.thread_info) +#define init_stack (init_thread_union.stack) + +#if !defined(__VMKLNX__) +static inline struct thread_info *current_thread_info(void) +{ + struct thread_info *ti; + ti = (void *)(read_pda(kernelstack) + PDA_STACKOFFSET - THREAD_SIZE); + return ti; +} + +/* do not use in interrupt context */ +static inline struct thread_info *stack_thread_info(void) +{ + struct thread_info *ti; + __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (~(THREAD_SIZE - 1))); + return ti; +} + +/* thread information allocation */ +#ifdef CONFIG_DEBUG_STACK_USAGE +#define alloc_thread_info(tsk) \ + ({ \ + struct thread_info *ret; \ + \ + ret = ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)); \ + if (ret) \ + memset(ret, 0, THREAD_SIZE); \ + ret; \ + }) +#else +#define alloc_thread_info(tsk) \ + ((struct thread_info *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) +#endif + +#define free_thread_info(ti) free_pages((unsigned long) (ti), THREAD_ORDER) + +#else /* !__ASSEMBLY__ */ + +/* how to get the thread information struct from ASM */ +#define GET_THREAD_INFO(reg) \ + movq %gs:pda_kernelstack,reg ; \ + subq $(THREAD_SIZE-PDA_STACKOFFSET),reg + +#endif + +/* + * thread information flags + * - these are process state flags that various assembly files may need to access + * - pending work-to-be-done flags are in LSW + * - other flags in MSW + * Warning: layout of LSW is hardcoded in entry.S + */ +#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ +#define TIF_NOTIFY_RESUME 1 /* resumption notification requested */ +#define TIF_SIGPENDING 2 /* signal pending */ +#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ +#define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/ +#define TIF_IRET 5 /* force IRET */ +#define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ +#define TIF_SECCOMP 8 /* secure computing */ +#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal */ +/* 16 free */ +#define TIF_IA32 17 /* 32bit process */ +#define TIF_FORK 18 /* ret_from_fork */ +#define TIF_ABI_PENDING 19 +#define TIF_MEMDIE 20 +#define TIF_FORCED_TF 21 /* true if TF in eflags artificially */ + +#define _TIF_SYSCALL_TRACE (1<thread_info->status & TS_POLLING) + +#endif /* __KERNEL__ */ + +#endif /* !defined(__VMKLNX__) */ + +#endif /* _ASM_THREAD_INFO_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/timex.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/timex.h new file mode 100644 index 0000000..802fa73 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/timex.h @@ -0,0 +1,58 @@ +/* + * linux/include/asm-x86_64/timex.h + * + * x86-64 architecture timex specifications + */ +#ifndef _ASMx8664_TIMEX_H +#define _ASMx8664_TIMEX_H + +#include +#include +#include +#include +#include +#include +#include + +#define CLOCK_TICK_RATE PIT_TICK_RATE /* Underlying HZ */ + +typedef unsigned long long cycles_t; + +/** + * get_cycles - Determines the number of ticks since reset + * + * Determines the number of clock ticks since system reset. + * + * RETURN VALUE: + * Returns the clock ticks since system reset + */ +/* _VMKLNX_CODECHECK_: get_cycles */ +static inline cycles_t get_cycles (void) +{ + unsigned long long ret; + + rdtscll(ret); + return ret; +} + +/* Like get_cycles, but make sure the CPU is synchronized. */ +static __always_inline cycles_t get_cycles_sync(void) +{ + unsigned long long ret; + unsigned eax; + /* Don't do an additional sync on CPUs where we know + RDTSC is already synchronous. */ + alternative_io("cpuid", ASM_NOP2, X86_FEATURE_SYNC_RDTSC, + "=a" (eax), "0" (1) : "ebx","ecx","edx","memory"); + rdtscll(ret); + return ret; +} + +extern unsigned int cpu_khz; + +extern int read_current_timer(unsigned long *timer_value); +#define ARCH_HAS_READ_CURRENT_TIMER 1 + +extern struct vxtime_data vxtime; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlb.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlb.h new file mode 100644 index 0000000..cd4c3c5 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlb.h @@ -0,0 +1,13 @@ +#ifndef TLB_H +#define TLB_H 1 + + +#define tlb_start_vma(tlb, vma) do { } while (0) +#define tlb_end_vma(tlb, vma) do { } while (0) +#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0) + +#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm) + +#include + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlbflush.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlbflush.h new file mode 100644 index 0000000..d16d5b6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tlbflush.h @@ -0,0 +1,127 @@ +#ifndef _X8664_TLBFLUSH_H +#define _X8664_TLBFLUSH_H + +#include +#include + +#define __flush_tlb() \ + do { \ + unsigned long tmpreg; \ + \ + __asm__ __volatile__( \ + "movq %%cr3, %0; # flush TLB \n" \ + "movq %0, %%cr3; \n" \ + : "=r" (tmpreg) \ + :: "memory"); \ + } while (0) + +/* + * Global pages have to be flushed a bit differently. Not a real + * performance problem because this does not happen often. + */ +#define __flush_tlb_global() \ + do { \ + unsigned long tmpreg, cr4, cr4_orig; \ + \ + __asm__ __volatile__( \ + "movq %%cr4, %2; # turn off PGE \n" \ + "movq %2, %1; \n" \ + "andq %3, %1; \n" \ + "movq %1, %%cr4; \n" \ + "movq %%cr3, %0; # flush TLB \n" \ + "movq %0, %%cr3; \n" \ + "movq %2, %%cr4; # turn PGE back on \n" \ + : "=&r" (tmpreg), "=&r" (cr4), "=&r" (cr4_orig) \ + : "i" (~X86_CR4_PGE) \ + : "memory"); \ + } while (0) + +extern unsigned long pgkern_mask; + +#define __flush_tlb_all() __flush_tlb_global() + +#define __flush_tlb_one(addr) \ + __asm__ __volatile__("invlpg %0": :"m" (*(char *) addr)) + + +/* + * TLB flushing: + * + * - flush_tlb() flushes the current mm struct TLBs + * - flush_tlb_all() flushes all processes TLBs + * - flush_tlb_mm(mm) flushes the specified mm context TLB's + * - flush_tlb_page(vma, vmaddr) flushes one page + * - flush_tlb_range(vma, start, end) flushes a range of pages + * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages + * - flush_tlb_pgtables(mm, start, end) flushes a range of page tables + * + * x86-64 can only flush individual pages or full VMs. For a range flush + * we always do the full VM. Might be worth trying if for a small + * range a few INVLPGs in a row are a win. + */ + +#ifndef CONFIG_SMP + +#define flush_tlb() __flush_tlb() +#define flush_tlb_all() __flush_tlb_all() +#define local_flush_tlb() __flush_tlb() + +static inline void flush_tlb_mm(struct mm_struct *mm) +{ + if (mm == current->active_mm) + __flush_tlb(); +} + +static inline void flush_tlb_page(struct vm_area_struct *vma, + unsigned long addr) +{ + if (vma->vm_mm == current->active_mm) + __flush_tlb_one(addr); +} + +static inline void flush_tlb_range(struct vm_area_struct *vma, + unsigned long start, unsigned long end) +{ + if (vma->vm_mm == current->active_mm) + __flush_tlb(); +} + +#else + +#include + +#define local_flush_tlb() \ + __flush_tlb() + +extern void flush_tlb_all(void); +extern void flush_tlb_current_task(void); +extern void flush_tlb_mm(struct mm_struct *); +extern void flush_tlb_page(struct vm_area_struct *, unsigned long); + +#define flush_tlb() flush_tlb_current_task() + +static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end) +{ + flush_tlb_mm(vma->vm_mm); +} + +#define TLBSTATE_OK 1 +#define TLBSTATE_LAZY 2 + +/* Roughly an IPI every 20MB with 4k pages for freeing page table + ranges. Cost is about 42k of memory for each CPU. */ +#define ARCH_FREE_PTE_NR 5350 + +#endif + +#define flush_tlb_kernel_range(start, end) flush_tlb_all() + +static inline void flush_tlb_pgtables(struct mm_struct *mm, + unsigned long start, unsigned long end) +{ + /* x86_64 does not keep any page table caches in a software TLB. + The CPUs do in their hardware TLBs, but they are handled + by the normal TLB flushing algorithms. */ +} + +#endif /* _X8664_TLBFLUSH_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/topology.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/topology.h new file mode 100644 index 0000000..6e7a2e9 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/topology.h @@ -0,0 +1,70 @@ +#ifndef _ASM_X86_64_TOPOLOGY_H +#define _ASM_X86_64_TOPOLOGY_H + + +#ifdef CONFIG_NUMA + +#include +#include + +extern cpumask_t cpu_online_map; + +extern unsigned char cpu_to_node[]; +extern cpumask_t node_to_cpumask[]; + +#ifdef CONFIG_ACPI_NUMA +extern int __node_distance(int, int); +#define node_distance(a,b) __node_distance(a,b) +/* #else fallback version */ +#endif + +#define cpu_to_node(cpu) (cpu_to_node[cpu]) +#define parent_node(node) (node) +#define node_to_first_cpu(node) (first_cpu(node_to_cpumask[node])) +#define node_to_cpumask(node) (node_to_cpumask[node]) +#define pcibus_to_node(bus) ((long)(bus->sysdata)) +#define pcibus_to_cpumask(bus) node_to_cpumask(pcibus_to_node(bus)); + +#define numa_node_id() read_pda(nodenumber) + +/* sched_domains SD_NODE_INIT for x86_64 machines */ +#define SD_NODE_INIT (struct sched_domain) { \ + .span = CPU_MASK_NONE, \ + .parent = NULL, \ + .groups = NULL, \ + .min_interval = 8, \ + .max_interval = 32, \ + .busy_factor = 32, \ + .imbalance_pct = 125, \ + .cache_nice_tries = 2, \ + .busy_idx = 3, \ + .idle_idx = 2, \ + .newidle_idx = 0, \ + .wake_idx = 1, \ + .forkexec_idx = 1, \ + .per_cpu_gain = 100, \ + .flags = SD_LOAD_BALANCE \ + | SD_BALANCE_FORK \ + | SD_BALANCE_EXEC \ + | SD_WAKE_BALANCE, \ + .last_balance = jiffies, \ + .balance_interval = 1, \ + .nr_balance_failed = 0, \ +} + +#endif + +#ifdef CONFIG_SMP +#define topology_physical_package_id(cpu) (cpu_data[cpu].phys_proc_id) +#define topology_core_id(cpu) (cpu_data[cpu].cpu_core_id) +#define topology_core_siblings(cpu) (cpu_core_map[cpu]) +#define topology_thread_siblings(cpu) (cpu_sibling_map[cpu]) +#define mc_capable() (boot_cpu_data.x86_max_cores > 1) +#define smt_capable() (smp_num_siblings > 1) +#endif + +#include + +extern cpumask_t cpu_coregroup_map(int cpu); + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tracehook.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tracehook.h new file mode 100644 index 0000000..d7588bf --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/tracehook.h @@ -0,0 +1,54 @@ +/* + * Tracing hooks, x86-64 CPU support + */ + +#ifndef _ASM_TRACEHOOK_H +#define _ASM_TRACEHOOK_H 1 + +#include +#include +#include + +/* + * See linux/tracehook.h for the descriptions of what these need to do. + */ + +#define ARCH_HAS_SINGLE_STEP (1) + +/* These two are defined in arch/x86_64/kernel/ptrace.c. */ +void tracehook_enable_single_step(struct task_struct *tsk); +void tracehook_disable_single_step(struct task_struct *tsk); + +static inline int tracehook_single_step_enabled(struct task_struct *tsk) +{ + return test_tsk_thread_flag(tsk, TIF_SINGLESTEP); +} + +static inline void tracehook_enable_syscall_trace(struct task_struct *tsk) +{ + set_tsk_thread_flag(tsk, TIF_SYSCALL_TRACE); +} + +static inline void tracehook_disable_syscall_trace(struct task_struct *tsk) +{ + clear_tsk_thread_flag(tsk, TIF_SYSCALL_TRACE); +} + +static inline void tracehook_abort_syscall(struct pt_regs *regs) +{ + regs->orig_rax = -1L; +} + +extern const struct utrace_regset_view utrace_x86_64_native, utrace_ia32_view; +static inline const struct utrace_regset_view * +utrace_native_view(struct task_struct *tsk) +{ +#ifdef CONFIG_IA32_EMULATION + if (test_tsk_thread_flag(tsk, TIF_IA32)) + return &utrace_ia32_view; +#endif + return &utrace_x86_64_native; +} + + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/types.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/types.h new file mode 100644 index 0000000..c86c2e6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/types.h @@ -0,0 +1,58 @@ +#ifndef _X86_64_TYPES_H +#define _X86_64_TYPES_H + +#ifndef __ASSEMBLY__ + +typedef unsigned short umode_t; + +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ + +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +typedef __signed__ int __s32; +typedef unsigned int __u32; + +typedef __signed__ long long __s64; +typedef unsigned long long __u64; + +#endif /* __ASSEMBLY__ */ + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +#define BITS_PER_LONG 64 + +#ifndef __ASSEMBLY__ + +typedef signed char s8; +typedef unsigned char u8; + +typedef signed short s16; +typedef unsigned short u16; + +typedef signed int s32; +typedef unsigned int u32; + +typedef signed long long s64; +typedef unsigned long long u64; + +typedef u64 dma64_addr_t; +typedef u64 dma_addr_t; + +typedef u64 sector_t; +#define HAVE_SECTOR_T + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL__ */ + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/uaccess.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/uaccess.h new file mode 100644 index 0000000..cd0146b --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/uaccess.h @@ -0,0 +1,446 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +#ifndef __X86_64_UACCESS_H +#define __X86_64_UACCESS_H + +/* + * User space memory access functions + */ +#include +#include +#include +#include +#include + +#define VERIFY_READ 0 +#define VERIFY_WRITE 1 + +/* + * The fs value determines whether argument validity checking should be + * performed or not. If get_fs() == USER_DS, checking is performed, with + * get_fs() == KERNEL_DS, checking is bypassed. + * + * For historical reasons, these macros are grossly misnamed. + */ + +#define MAKE_MM_SEG(s) ((mm_segment_t) { (s) }) + +#define KERNEL_DS MAKE_MM_SEG(0xFFFFFFFFFFFFFFFFUL) +#define USER_DS MAKE_MM_SEG(PAGE_OFFSET) + +#define get_ds() (KERNEL_DS) +#define get_fs() (current_thread_info()->addr_limit) +#define set_fs(x) (current_thread_info()->addr_limit = (x)) + +#define segment_eq(a,b) ((a).seg == (b).seg) + +#define __addr_ok(addr) (!((unsigned long)(addr) & (current_thread_info()->addr_limit.seg))) + +/* + * Uhhuh, this needs 65-bit arithmetic. We have a carry.. + */ +#define __range_not_ok(addr,size) ({ \ + unsigned long flag,sum; \ + __chk_user_ptr(addr); \ + asm("# range_ok\n\r" \ + "addq %3,%1 ; sbbq %0,%0 ; cmpq %1,%4 ; sbbq $0,%0" \ + :"=&r" (flag), "=r" (sum) \ + :"1" (addr),"g" ((long)(size)),"g" (current_thread_info()->addr_limit.seg)); \ + flag; }) + +#if defined(__VMKLNX__) +/** + * access_ok - A non-operational macro that always returns 1 + * @type: Ignored + * @addr: Ignored + * @size: Ignored + * + * A non-operational macro that always returns 1 + * + * SYNOPSIS: + * #define access_ok(type, addr, size) + * + * ESX Deviation Notes: + * Always returns 1 + * + * RETURN VALUE: + * 1 + * + */ + /* _VMKLNX_CODECHECK_: access_ok */ +#define access_ok(type, addr, size) 1 +#else /* #if !defined(__VMKLNX__) */ +#define access_ok(type, addr, size) (__range_not_ok(addr,size) == 0) +#endif /* #if defined(__VMKLNX__) */ + +/* + * The exception table consists of pairs of addresses: the first is the + * address of an instruction that is allowed to fault, and the second is + * the address at which the program should continue. No registers are + * modified, so it is entirely up to the continuation code to figure out + * what to do. + * + * All the routines below use bits of fixup code that are out of line + * with the main instruction path. This means when everything is well, + * we don't even have to jump over them. Further, they do not intrude + * on our cache or tlb entries. + */ + +struct exception_table_entry +{ + unsigned long insn, fixup; +}; + +#define ARCH_HAS_SEARCH_EXTABLE + +/* + * These are the main single-value transfer routines. They automatically + * use the right size if we just have the right pointer type. + * + * This gets kind of ugly. We want to return _two_ values in "get_user()" + * and yet we don't want to do any pointers, because that is too much + * of a performance impact. Thus we have a few rather ugly macros here, + * and hide all the ugliness from the user. + * + * The "__xxx" versions of the user access functions are versions that + * do not verify the address space, that must have been done previously + * with a separate "access_ok()" call (this is used when we do multiple + * accesses to the same area of user memory). + */ + +#if defined(__VMKLNX__) +/** + * get_user - Get a variable from user space + * @dst: variable to store result + * @srcPtr: source address in user space + * + * This macro copies a variable from user space to kernel space. It supports + * simple variables and structures but not arrays. Note that sizeof(dst) can be > + * sizeof(*srcPtr). + * + * SYNOPSIS: + * #define get_user(dst, srcPtr) + * + * RETURN VALUE: + * Returns 0 on success and 1 for failure + */ +/* _VMKLNX_CODECHECK_: get_user */ +#define get_user(dst, srcPtr) \ +({ \ + __typeof__(*srcPtr) _x; \ + dst = 0; \ + copy_from_user((void *)&dst, srcPtr, sizeof(_x)); \ +}) + +/* src can be an rvalue. */ +/** + * put_user - write data to a memory location in user space + * @src: address of the data source + * @dstPtr: destination address in the user space + * + * Writes the bytes from @src to @dstPtr. The number of bytes to + * be written is the size of the type of @src. + * + * SYNOPSIS: + * #define put_user(src, dstPtr) + * + * RETURN VALUE: + * None + * + * SEE ALSO: + * __put_user + */ +/* _VMKLNX_CODECHECK_: put_user */ +#define put_user(src, dstPtr) \ +({ \ + __typeof__(*dstPtr) _x = src; \ + copy_to_user(dstPtr, &_x, sizeof(_x)); \ +}) + +#define __get_user get_user +#define __put_user put_user +#else /* !defined(__VMKLNX__) */ +#define __get_user_x(size,ret,x,ptr) \ + __asm__ __volatile__("call __get_user_" #size \ + :"=a" (ret),"=d" (x) \ + :"c" (ptr) \ + :"r8") + +/* Careful: we have to cast the result to the type of the pointer for sign reasons */ +#define get_user(x,ptr) \ +({ unsigned long __val_gu; \ + int __ret_gu; \ + __chk_user_ptr(ptr); \ + switch(sizeof (*(ptr))) { \ + case 1: __get_user_x(1,__ret_gu,__val_gu,ptr); break; \ + case 2: __get_user_x(2,__ret_gu,__val_gu,ptr); break; \ + case 4: __get_user_x(4,__ret_gu,__val_gu,ptr); break; \ + case 8: __get_user_x(8,__ret_gu,__val_gu,ptr); break; \ + default: __get_user_bad(); break; \ + } \ + (x) = (__typeof__(*(ptr)))__val_gu; \ + __ret_gu; \ +}) + +extern void __put_user_1(void); +extern void __put_user_2(void); +extern void __put_user_4(void); +extern void __put_user_8(void); +extern void __put_user_bad(void); + +#define __put_user_x(size,ret,x,ptr) \ + __asm__ __volatile__("call __put_user_" #size \ + :"=a" (ret) \ + :"c" (ptr),"d" (x) \ + :"r8") + +#define put_user(x,ptr) \ + __put_user_check((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) + +#define __get_user(x,ptr) \ + __get_user_nocheck((x),(ptr),sizeof(*(ptr))) +#define __put_user(x,ptr) \ + __put_user_nocheck((__typeof__(*(ptr)))(x),(ptr),sizeof(*(ptr))) + +#define __get_user_unaligned __get_user +#define __put_user_unaligned __put_user + +#define __put_user_nocheck(x,ptr,size) \ +({ \ + int __pu_err; \ + __put_user_size((x),(ptr),(size),__pu_err); \ + __pu_err; \ +}) + + +#define __put_user_check(x,ptr,size) \ +({ \ + int __pu_err; \ + __typeof__(*(ptr)) __user *__pu_addr = (ptr); \ + switch (size) { \ + case 1: __put_user_x(1,__pu_err,x,__pu_addr); break; \ + case 2: __put_user_x(2,__pu_err,x,__pu_addr); break; \ + case 4: __put_user_x(4,__pu_err,x,__pu_addr); break; \ + case 8: __put_user_x(8,__pu_err,x,__pu_addr); break; \ + default: __put_user_bad(); \ + } \ + __pu_err; \ +}) + +#define __put_user_size(x,ptr,size,retval) \ +do { \ + retval = 0; \ + __chk_user_ptr(ptr); \ + switch (size) { \ + case 1: __put_user_asm(x,ptr,retval,"b","b","iq",-EFAULT); break;\ + case 2: __put_user_asm(x,ptr,retval,"w","w","ir",-EFAULT); break;\ + case 4: __put_user_asm(x,ptr,retval,"l","k","ir",-EFAULT); break;\ + case 8: __put_user_asm(x,ptr,retval,"q","","ir",-EFAULT); break;\ + default: __put_user_bad(); \ + } \ +} while (0) + +/* FIXME: this hack is definitely wrong -AK */ +struct __large_struct { unsigned long buf[100]; }; +#define __m(x) (*(struct __large_struct __user *)(x)) + +/* + * Tell gcc we read from memory instead of writing: this is because + * we do not write to any memory gcc knows about, so there are no + * aliasing issues. + */ +#define __put_user_asm(x, addr, err, itype, rtype, ltype, errno) \ + __asm__ __volatile__( \ + "1: mov"itype" %"rtype"1,%2\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ + " jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .align 8\n" \ + " .quad 1b,3b\n" \ + ".previous" \ + : "=r"(err) \ + : ltype (x), "m"(__m(addr)), "i"(errno), "0"(err)) + + +#define __get_user_nocheck(x,ptr,size) \ +({ \ + int __gu_err; \ + unsigned long __gu_val; \ + __get_user_size(__gu_val,(ptr),(size),__gu_err); \ + (x) = (__typeof__(*(ptr)))__gu_val; \ + __gu_err; \ +}) + +extern int __get_user_1(void); +extern int __get_user_2(void); +extern int __get_user_4(void); +extern int __get_user_8(void); +extern int __get_user_bad(void); + +#define __get_user_size(x,ptr,size,retval) \ +do { \ + retval = 0; \ + __chk_user_ptr(ptr); \ + switch (size) { \ + case 1: __get_user_asm(x,ptr,retval,"b","b","=q",-EFAULT); break;\ + case 2: __get_user_asm(x,ptr,retval,"w","w","=r",-EFAULT); break;\ + case 4: __get_user_asm(x,ptr,retval,"l","k","=r",-EFAULT); break;\ + case 8: __get_user_asm(x,ptr,retval,"q","","=r",-EFAULT); break;\ + default: (x) = __get_user_bad(); \ + } \ +} while (0) + +#define __get_user_asm(x, addr, err, itype, rtype, ltype, errno) \ + __asm__ __volatile__( \ + "1: mov"itype" %2,%"rtype"1\n" \ + "2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: mov %3,%0\n" \ + " xor"itype" %"rtype"1,%"rtype"1\n" \ + " jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " .align 8\n" \ + " .quad 1b,3b\n" \ + ".previous" \ + : "=r"(err), ltype (x) \ + : "m"(__m(addr)), "i"(errno), "0"(err)) +#endif /* defined(__VMKLNX__) */ + +/* + * Copy To/From Userspace + */ + +/* Handles exceptions in both to and from, but doesn't do access_ok */ +extern unsigned long copy_user_generic(void *to, const void *from, unsigned len); + +#if defined(__VMKLNX__) +extern unsigned long copy_to_user(void __user *to, const void *from, unsigned long len); +extern unsigned long copy_from_user(void *to, const void __user *from, unsigned long len); +extern unsigned long copy_in_user(void __user *to, const void __user *from, unsigned long len); + +#define __copy_to_user copy_to_user +#define __copy_from_user copy_from_user +#else /* !defined(__VMKLNX__) */ +extern unsigned long copy_to_user(void __user *to, const void *from, unsigned len); +extern unsigned long copy_from_user(void *to, const void __user *from, unsigned len); +extern unsigned long copy_in_user(void __user *to, const void __user *from, unsigned len); + +static __always_inline int __copy_from_user(void *dst, const void __user *src, unsigned size) +{ + int ret = 0; + if (!__builtin_constant_p(size)) + return copy_user_generic(dst,(__force void *)src,size); + switch (size) { + case 1:__get_user_asm(*(u8*)dst,(u8 __user *)src,ret,"b","b","=q",1); + return ret; + case 2:__get_user_asm(*(u16*)dst,(u16 __user *)src,ret,"w","w","=r",2); + return ret; + case 4:__get_user_asm(*(u32*)dst,(u32 __user *)src,ret,"l","k","=r",4); + return ret; + case 8:__get_user_asm(*(u64*)dst,(u64 __user *)src,ret,"q","","=r",8); + return ret; + case 10: + __get_user_asm(*(u64*)dst,(u64 __user *)src,ret,"q","","=r",16); + if (unlikely(ret)) return ret; + __get_user_asm(*(u16*)(8+(char*)dst),(u16 __user *)(8+(char __user *)src),ret,"w","w","=r",2); + return ret; + case 16: + __get_user_asm(*(u64*)dst,(u64 __user *)src,ret,"q","","=r",16); + if (unlikely(ret)) return ret; + __get_user_asm(*(u64*)(8+(char*)dst),(u64 __user *)(8+(char __user *)src),ret,"q","","=r",8); + return ret; + default: + return copy_user_generic(dst,(__force void *)src,size); + } +} + +static __always_inline int __copy_to_user(void __user *dst, const void *src, unsigned size) +{ + int ret = 0; + if (!__builtin_constant_p(size)) + return copy_user_generic((__force void *)dst,src,size); + switch (size) { + case 1:__put_user_asm(*(u8*)src,(u8 __user *)dst,ret,"b","b","iq",1); + return ret; + case 2:__put_user_asm(*(u16*)src,(u16 __user *)dst,ret,"w","w","ir",2); + return ret; + case 4:__put_user_asm(*(u32*)src,(u32 __user *)dst,ret,"l","k","ir",4); + return ret; + case 8:__put_user_asm(*(u64*)src,(u64 __user *)dst,ret,"q","","ir",8); + return ret; + case 10: + __put_user_asm(*(u64*)src,(u64 __user *)dst,ret,"q","","ir",10); + if (unlikely(ret)) return ret; + asm("":::"memory"); + __put_user_asm(4[(u16*)src],4+(u16 __user *)dst,ret,"w","w","ir",2); + return ret; + case 16: + __put_user_asm(*(u64*)src,(u64 __user *)dst,ret,"q","","ir",16); + if (unlikely(ret)) return ret; + asm("":::"memory"); + __put_user_asm(1[(u64*)src],1+(u64 __user *)dst,ret,"q","","ir",8); + return ret; + default: + return copy_user_generic((__force void *)dst,src,size); + } +} + + +static __always_inline int __copy_in_user(void __user *dst, const void __user *src, unsigned size) +{ + int ret = 0; + if (!__builtin_constant_p(size)) + return copy_user_generic((__force void *)dst,(__force void *)src,size); + switch (size) { + case 1: { + u8 tmp; + __get_user_asm(tmp,(u8 __user *)src,ret,"b","b","=q",1); + if (likely(!ret)) + __put_user_asm(tmp,(u8 __user *)dst,ret,"b","b","iq",1); + return ret; + } + case 2: { + u16 tmp; + __get_user_asm(tmp,(u16 __user *)src,ret,"w","w","=r",2); + if (likely(!ret)) + __put_user_asm(tmp,(u16 __user *)dst,ret,"w","w","ir",2); + return ret; + } + + case 4: { + u32 tmp; + __get_user_asm(tmp,(u32 __user *)src,ret,"l","k","=r",4); + if (likely(!ret)) + __put_user_asm(tmp,(u32 __user *)dst,ret,"l","k","ir",4); + return ret; + } + case 8: { + u64 tmp; + __get_user_asm(tmp,(u64 __user *)src,ret,"q","","=r",8); + if (likely(!ret)) + __put_user_asm(tmp,(u64 __user *)dst,ret,"q","","ir",8); + return ret; + } + default: + return copy_user_generic((__force void *)dst,(__force void *)src,size); + } +} +#endif + +long strncpy_from_user(char *dst, const char __user *src, long count); +long __strncpy_from_user(char *dst, const char __user *src, long count); +long strnlen_user(const char __user *str, long n); +long __strnlen_user(const char __user *str, long n); +long strlen_user(const char __user *str); +unsigned long clear_user(void __user *mem, unsigned long len); +unsigned long __clear_user(void __user *mem, unsigned long len); + +#define __copy_to_user_inatomic __copy_to_user +#define __copy_from_user_inatomic __copy_from_user + +#endif /* __X86_64_UACCESS_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ucontext.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ucontext.h new file mode 100644 index 0000000..159a3da --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/ucontext.h @@ -0,0 +1,12 @@ +#ifndef _ASMX8664_UCONTEXT_H +#define _ASMX8664_UCONTEXT_H + +struct ucontext { + unsigned long uc_flags; + struct ucontext *uc_link; + stack_t uc_stack; + struct sigcontext uc_mcontext; + sigset_t uc_sigmask; /* mask last for extensibility */ +}; + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unaligned.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unaligned.h new file mode 100644 index 0000000..d4bf78d --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unaligned.h @@ -0,0 +1,37 @@ +#ifndef __X8664_UNALIGNED_H +#define __X8664_UNALIGNED_H + +/* + * The x86-64 can do unaligned accesses itself. + * + * The strange macros are there to make sure these can't + * be misused in a way that makes them not work on other + * architectures where unaligned accesses aren't as simple. + */ + +/** + * get_unaligned - get value from possibly mis-aligned location + * @ptr: pointer to value + * + * This macro should be used for accessing values larger in size than + * single bytes at locations that are expected to be improperly aligned, + * e.g. retrieving a u16 value from a location not u16-aligned. + * + * Note that unaligned accesses can be very expensive on some architectures. + */ +#define get_unaligned(ptr) (*(ptr)) + +/** + * put_unaligned - put value to a possibly mis-aligned location + * @val: value to place + * @ptr: pointer to location + * + * This macro should be used for placing values larger in size than + * single bytes at locations that are expected to be improperly aligned, + * e.g. writing a u16 value to a location not u16-aligned. + * + * Note that unaligned accesses can be very expensive on some architectures. + */ +#define put_unaligned(val, ptr) ((void)( *(ptr) = (val) )) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unistd.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unistd.h new file mode 100644 index 0000000..9523e40 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unistd.h @@ -0,0 +1,864 @@ +#ifndef _ASM_X86_64_UNISTD_H_ +#define _ASM_X86_64_UNISTD_H_ + +#ifndef __SYSCALL +#define __SYSCALL(a,b) +#endif + +/* + * This file contains the system call numbers. + * + * Note: holes are not allowed. + */ + +/* at least 8 syscall per cacheline */ +#define __NR_read 0 +__SYSCALL(__NR_read, sys_read) +#define __NR_write 1 +__SYSCALL(__NR_write, sys_write) +#define __NR_open 2 +__SYSCALL(__NR_open, sys_open) +#define __NR_close 3 +__SYSCALL(__NR_close, sys_close) +#define __NR_stat 4 +__SYSCALL(__NR_stat, sys_newstat) +#define __NR_fstat 5 +__SYSCALL(__NR_fstat, sys_newfstat) +#define __NR_lstat 6 +__SYSCALL(__NR_lstat, sys_newlstat) +#define __NR_poll 7 +__SYSCALL(__NR_poll, sys_poll) + +#define __NR_lseek 8 +__SYSCALL(__NR_lseek, sys_lseek) +#define __NR_mmap 9 +__SYSCALL(__NR_mmap, sys_mmap) +#define __NR_mprotect 10 +__SYSCALL(__NR_mprotect, sys_mprotect) +#define __NR_munmap 11 +__SYSCALL(__NR_munmap, sys_munmap) +#define __NR_brk 12 +__SYSCALL(__NR_brk, sys_brk) +#define __NR_rt_sigaction 13 +__SYSCALL(__NR_rt_sigaction, sys_rt_sigaction) +#define __NR_rt_sigprocmask 14 +__SYSCALL(__NR_rt_sigprocmask, sys_rt_sigprocmask) +#define __NR_rt_sigreturn 15 +__SYSCALL(__NR_rt_sigreturn, stub_rt_sigreturn) + +#define __NR_ioctl 16 +__SYSCALL(__NR_ioctl, sys_ioctl) +#define __NR_pread64 17 +__SYSCALL(__NR_pread64, sys_pread64) +#define __NR_pwrite64 18 +__SYSCALL(__NR_pwrite64, sys_pwrite64) +#define __NR_readv 19 +__SYSCALL(__NR_readv, sys_readv) +#define __NR_writev 20 +__SYSCALL(__NR_writev, sys_writev) +#define __NR_access 21 +__SYSCALL(__NR_access, sys_access) +#define __NR_pipe 22 +__SYSCALL(__NR_pipe, sys_pipe) +#define __NR_select 23 +__SYSCALL(__NR_select, sys_select) + +#define __NR_sched_yield 24 +__SYSCALL(__NR_sched_yield, sys_sched_yield) +#define __NR_mremap 25 +__SYSCALL(__NR_mremap, sys_mremap) +#define __NR_msync 26 +__SYSCALL(__NR_msync, sys_msync) +#define __NR_mincore 27 +__SYSCALL(__NR_mincore, sys_mincore) +#define __NR_madvise 28 +__SYSCALL(__NR_madvise, sys_madvise) +#define __NR_shmget 29 +__SYSCALL(__NR_shmget, sys_shmget) +#define __NR_shmat 30 +__SYSCALL(__NR_shmat, sys_shmat) +#define __NR_shmctl 31 +__SYSCALL(__NR_shmctl, sys_shmctl) + +#define __NR_dup 32 +__SYSCALL(__NR_dup, sys_dup) +#define __NR_dup2 33 +__SYSCALL(__NR_dup2, sys_dup2) +#define __NR_pause 34 +__SYSCALL(__NR_pause, sys_pause) +#define __NR_nanosleep 35 +__SYSCALL(__NR_nanosleep, sys_nanosleep) +#define __NR_getitimer 36 +__SYSCALL(__NR_getitimer, sys_getitimer) +#define __NR_alarm 37 +__SYSCALL(__NR_alarm, sys_alarm) +#define __NR_setitimer 38 +__SYSCALL(__NR_setitimer, sys_setitimer) +#define __NR_getpid 39 +__SYSCALL(__NR_getpid, sys_getpid) + +#define __NR_sendfile 40 +__SYSCALL(__NR_sendfile, sys_sendfile64) +#define __NR_socket 41 +__SYSCALL(__NR_socket, sys_socket) +#define __NR_connect 42 +__SYSCALL(__NR_connect, sys_connect) +#define __NR_accept 43 +__SYSCALL(__NR_accept, sys_accept) +#define __NR_sendto 44 +__SYSCALL(__NR_sendto, sys_sendto) +#define __NR_recvfrom 45 +__SYSCALL(__NR_recvfrom, sys_recvfrom) +#define __NR_sendmsg 46 +__SYSCALL(__NR_sendmsg, sys_sendmsg) +#define __NR_recvmsg 47 +__SYSCALL(__NR_recvmsg, sys_recvmsg) + +#define __NR_shutdown 48 +__SYSCALL(__NR_shutdown, sys_shutdown) +#define __NR_bind 49 +__SYSCALL(__NR_bind, sys_bind) +#define __NR_listen 50 +__SYSCALL(__NR_listen, sys_listen) +#define __NR_getsockname 51 +__SYSCALL(__NR_getsockname, sys_getsockname) +#define __NR_getpeername 52 +__SYSCALL(__NR_getpeername, sys_getpeername) +#define __NR_socketpair 53 +__SYSCALL(__NR_socketpair, sys_socketpair) +#define __NR_setsockopt 54 +__SYSCALL(__NR_setsockopt, sys_setsockopt) +#define __NR_getsockopt 55 +__SYSCALL(__NR_getsockopt, sys_getsockopt) + +#define __NR_clone 56 +__SYSCALL(__NR_clone, stub_clone) +#define __NR_fork 57 +__SYSCALL(__NR_fork, stub_fork) +#define __NR_vfork 58 +__SYSCALL(__NR_vfork, stub_vfork) +#define __NR_execve 59 +__SYSCALL(__NR_execve, stub_execve) +#define __NR_exit 60 +__SYSCALL(__NR_exit, sys_exit) +#define __NR_wait4 61 +__SYSCALL(__NR_wait4, sys_wait4) +#define __NR_kill 62 +__SYSCALL(__NR_kill, sys_kill) +#define __NR_uname 63 +__SYSCALL(__NR_uname, sys_uname) + +#define __NR_semget 64 +__SYSCALL(__NR_semget, sys_semget) +#define __NR_semop 65 +__SYSCALL(__NR_semop, sys_semop) +#define __NR_semctl 66 +__SYSCALL(__NR_semctl, sys_semctl) +#define __NR_shmdt 67 +__SYSCALL(__NR_shmdt, sys_shmdt) +#define __NR_msgget 68 +__SYSCALL(__NR_msgget, sys_msgget) +#define __NR_msgsnd 69 +__SYSCALL(__NR_msgsnd, sys_msgsnd) +#define __NR_msgrcv 70 +__SYSCALL(__NR_msgrcv, sys_msgrcv) +#define __NR_msgctl 71 +__SYSCALL(__NR_msgctl, sys_msgctl) + +#define __NR_fcntl 72 +__SYSCALL(__NR_fcntl, sys_fcntl) +#define __NR_flock 73 +__SYSCALL(__NR_flock, sys_flock) +#define __NR_fsync 74 +__SYSCALL(__NR_fsync, sys_fsync) +#define __NR_fdatasync 75 +__SYSCALL(__NR_fdatasync, sys_fdatasync) +#define __NR_truncate 76 +__SYSCALL(__NR_truncate, sys_truncate) +#define __NR_ftruncate 77 +__SYSCALL(__NR_ftruncate, sys_ftruncate) +#define __NR_getdents 78 +__SYSCALL(__NR_getdents, sys_getdents) +#define __NR_getcwd 79 +__SYSCALL(__NR_getcwd, sys_getcwd) + +#define __NR_chdir 80 +__SYSCALL(__NR_chdir, sys_chdir) +#define __NR_fchdir 81 +__SYSCALL(__NR_fchdir, sys_fchdir) +#define __NR_rename 82 +__SYSCALL(__NR_rename, sys_rename) +#define __NR_mkdir 83 +__SYSCALL(__NR_mkdir, sys_mkdir) +#define __NR_rmdir 84 +__SYSCALL(__NR_rmdir, sys_rmdir) +#define __NR_creat 85 +__SYSCALL(__NR_creat, sys_creat) +#define __NR_link 86 +__SYSCALL(__NR_link, sys_link) +#define __NR_unlink 87 +__SYSCALL(__NR_unlink, sys_unlink) + +#define __NR_symlink 88 +__SYSCALL(__NR_symlink, sys_symlink) +#define __NR_readlink 89 +__SYSCALL(__NR_readlink, sys_readlink) +#define __NR_chmod 90 +__SYSCALL(__NR_chmod, sys_chmod) +#define __NR_fchmod 91 +__SYSCALL(__NR_fchmod, sys_fchmod) +#define __NR_chown 92 +__SYSCALL(__NR_chown, sys_chown) +#define __NR_fchown 93 +__SYSCALL(__NR_fchown, sys_fchown) +#define __NR_lchown 94 +__SYSCALL(__NR_lchown, sys_lchown) +#define __NR_umask 95 +__SYSCALL(__NR_umask, sys_umask) + +#define __NR_gettimeofday 96 +__SYSCALL(__NR_gettimeofday, sys_gettimeofday) +#define __NR_getrlimit 97 +__SYSCALL(__NR_getrlimit, sys_getrlimit) +#define __NR_getrusage 98 +__SYSCALL(__NR_getrusage, sys_getrusage) +#define __NR_sysinfo 99 +__SYSCALL(__NR_sysinfo, sys_sysinfo) +#define __NR_times 100 +__SYSCALL(__NR_times, sys_times) +#define __NR_ptrace 101 +__SYSCALL(__NR_ptrace, sys_ptrace) +#define __NR_getuid 102 +__SYSCALL(__NR_getuid, sys_getuid) +#define __NR_syslog 103 +__SYSCALL(__NR_syslog, sys_syslog) + +/* at the very end the stuff that never runs during the benchmarks */ +#define __NR_getgid 104 +__SYSCALL(__NR_getgid, sys_getgid) +#define __NR_setuid 105 +__SYSCALL(__NR_setuid, sys_setuid) +#define __NR_setgid 106 +__SYSCALL(__NR_setgid, sys_setgid) +#define __NR_geteuid 107 +__SYSCALL(__NR_geteuid, sys_geteuid) +#define __NR_getegid 108 +__SYSCALL(__NR_getegid, sys_getegid) +#define __NR_setpgid 109 +__SYSCALL(__NR_setpgid, sys_setpgid) +#define __NR_getppid 110 +__SYSCALL(__NR_getppid, sys_getppid) +#define __NR_getpgrp 111 +__SYSCALL(__NR_getpgrp, sys_getpgrp) + +#define __NR_setsid 112 +__SYSCALL(__NR_setsid, sys_setsid) +#define __NR_setreuid 113 +__SYSCALL(__NR_setreuid, sys_setreuid) +#define __NR_setregid 114 +__SYSCALL(__NR_setregid, sys_setregid) +#define __NR_getgroups 115 +__SYSCALL(__NR_getgroups, sys_getgroups) +#define __NR_setgroups 116 +__SYSCALL(__NR_setgroups, sys_setgroups) +#define __NR_setresuid 117 +__SYSCALL(__NR_setresuid, sys_setresuid) +#define __NR_getresuid 118 +__SYSCALL(__NR_getresuid, sys_getresuid) +#define __NR_setresgid 119 +__SYSCALL(__NR_setresgid, sys_setresgid) + +#define __NR_getresgid 120 +__SYSCALL(__NR_getresgid, sys_getresgid) +#define __NR_getpgid 121 +__SYSCALL(__NR_getpgid, sys_getpgid) +#define __NR_setfsuid 122 +__SYSCALL(__NR_setfsuid, sys_setfsuid) +#define __NR_setfsgid 123 +__SYSCALL(__NR_setfsgid, sys_setfsgid) +#define __NR_getsid 124 +__SYSCALL(__NR_getsid, sys_getsid) +#define __NR_capget 125 +__SYSCALL(__NR_capget, sys_capget) +#define __NR_capset 126 +__SYSCALL(__NR_capset, sys_capset) + +#define __NR_rt_sigpending 127 +__SYSCALL(__NR_rt_sigpending, sys_rt_sigpending) +#define __NR_rt_sigtimedwait 128 +__SYSCALL(__NR_rt_sigtimedwait, sys_rt_sigtimedwait) +#define __NR_rt_sigqueueinfo 129 +__SYSCALL(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo) +#define __NR_rt_sigsuspend 130 +__SYSCALL(__NR_rt_sigsuspend, stub_rt_sigsuspend) +#define __NR_sigaltstack 131 +__SYSCALL(__NR_sigaltstack, stub_sigaltstack) +#define __NR_utime 132 +__SYSCALL(__NR_utime, sys_utime) +#define __NR_mknod 133 +__SYSCALL(__NR_mknod, sys_mknod) + +/* Only needed for a.out */ +#define __NR_uselib 134 +__SYSCALL(__NR_uselib, sys_ni_syscall) +#define __NR_personality 135 +__SYSCALL(__NR_personality, sys_personality) + +#define __NR_ustat 136 +__SYSCALL(__NR_ustat, sys_ustat) +#define __NR_statfs 137 +__SYSCALL(__NR_statfs, sys_statfs) +#define __NR_fstatfs 138 +__SYSCALL(__NR_fstatfs, sys_fstatfs) +#define __NR_sysfs 139 +__SYSCALL(__NR_sysfs, sys_sysfs) + +#define __NR_getpriority 140 +__SYSCALL(__NR_getpriority, sys_getpriority) +#define __NR_setpriority 141 +__SYSCALL(__NR_setpriority, sys_setpriority) +#define __NR_sched_setparam 142 +__SYSCALL(__NR_sched_setparam, sys_sched_setparam) +#define __NR_sched_getparam 143 +__SYSCALL(__NR_sched_getparam, sys_sched_getparam) +#define __NR_sched_setscheduler 144 +__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler) +#define __NR_sched_getscheduler 145 +__SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler) +#define __NR_sched_get_priority_max 146 +__SYSCALL(__NR_sched_get_priority_max, sys_sched_get_priority_max) +#define __NR_sched_get_priority_min 147 +__SYSCALL(__NR_sched_get_priority_min, sys_sched_get_priority_min) +#define __NR_sched_rr_get_interval 148 +__SYSCALL(__NR_sched_rr_get_interval, sys_sched_rr_get_interval) + +#define __NR_mlock 149 +__SYSCALL(__NR_mlock, sys_mlock) +#define __NR_munlock 150 +__SYSCALL(__NR_munlock, sys_munlock) +#define __NR_mlockall 151 +__SYSCALL(__NR_mlockall, sys_mlockall) +#define __NR_munlockall 152 +__SYSCALL(__NR_munlockall, sys_munlockall) + +#define __NR_vhangup 153 +__SYSCALL(__NR_vhangup, sys_vhangup) + +#define __NR_modify_ldt 154 +__SYSCALL(__NR_modify_ldt, sys_modify_ldt) + +#define __NR_pivot_root 155 +__SYSCALL(__NR_pivot_root, sys_pivot_root) + +#define __NR__sysctl 156 +__SYSCALL(__NR__sysctl, sys_sysctl) + +#define __NR_prctl 157 +__SYSCALL(__NR_prctl, sys_prctl) +#define __NR_arch_prctl 158 +__SYSCALL(__NR_arch_prctl, sys_arch_prctl) + +#define __NR_adjtimex 159 +__SYSCALL(__NR_adjtimex, sys_adjtimex) + +#define __NR_setrlimit 160 +__SYSCALL(__NR_setrlimit, sys_setrlimit) + +#define __NR_chroot 161 +__SYSCALL(__NR_chroot, sys_chroot) + +#define __NR_sync 162 +__SYSCALL(__NR_sync, sys_sync) + +#define __NR_acct 163 +__SYSCALL(__NR_acct, sys_acct) + +#define __NR_settimeofday 164 +__SYSCALL(__NR_settimeofday, sys_settimeofday) + +#define __NR_mount 165 +__SYSCALL(__NR_mount, sys_mount) +#define __NR_umount2 166 +__SYSCALL(__NR_umount2, sys_umount) + +#define __NR_swapon 167 +__SYSCALL(__NR_swapon, sys_swapon) +#define __NR_swapoff 168 +__SYSCALL(__NR_swapoff, sys_swapoff) + +#define __NR_reboot 169 +__SYSCALL(__NR_reboot, sys_reboot) + +#define __NR_sethostname 170 +__SYSCALL(__NR_sethostname, sys_sethostname) +#define __NR_setdomainname 171 +__SYSCALL(__NR_setdomainname, sys_setdomainname) + +#define __NR_iopl 172 +__SYSCALL(__NR_iopl, stub_iopl) +#define __NR_ioperm 173 +__SYSCALL(__NR_ioperm, sys_ioperm) + +#define __NR_create_module 174 +__SYSCALL(__NR_create_module, sys_ni_syscall) +#define __NR_init_module 175 +__SYSCALL(__NR_init_module, sys_init_module) +#define __NR_delete_module 176 +__SYSCALL(__NR_delete_module, sys_delete_module) +#define __NR_get_kernel_syms 177 +__SYSCALL(__NR_get_kernel_syms, sys_ni_syscall) +#define __NR_query_module 178 +__SYSCALL(__NR_query_module, sys_ni_syscall) + +#define __NR_quotactl 179 +__SYSCALL(__NR_quotactl, sys_quotactl) + +#define __NR_nfsservctl 180 +__SYSCALL(__NR_nfsservctl, sys_nfsservctl) + +#define __NR_getpmsg 181 /* reserved for LiS/STREAMS */ +__SYSCALL(__NR_getpmsg, sys_ni_syscall) +#define __NR_putpmsg 182 /* reserved for LiS/STREAMS */ +__SYSCALL(__NR_putpmsg, sys_ni_syscall) + +#define __NR_afs_syscall 183 /* reserved for AFS */ +__SYSCALL(__NR_afs_syscall, sys_ni_syscall) + +#define __NR_tuxcall 184 /* reserved for tux */ +#ifdef CONFIG_TUX + __SYSCALL(__NR_tuxcall, __sys_tux) +#else +# ifdef CONFIG_TUX_MODULE + __SYSCALL(__NR_tuxcall, sys_tux) +# else + __SYSCALL(__NR_tuxcall, sys_ni_syscall) +# endif +#endif + +#define __NR_security 185 +__SYSCALL(__NR_security, sys_ni_syscall) + +#define __NR_gettid 186 +__SYSCALL(__NR_gettid, sys_gettid) + +#define __NR_readahead 187 +__SYSCALL(__NR_readahead, sys_readahead) +#define __NR_setxattr 188 +__SYSCALL(__NR_setxattr, sys_setxattr) +#define __NR_lsetxattr 189 +__SYSCALL(__NR_lsetxattr, sys_lsetxattr) +#define __NR_fsetxattr 190 +__SYSCALL(__NR_fsetxattr, sys_fsetxattr) +#define __NR_getxattr 191 +__SYSCALL(__NR_getxattr, sys_getxattr) +#define __NR_lgetxattr 192 +__SYSCALL(__NR_lgetxattr, sys_lgetxattr) +#define __NR_fgetxattr 193 +__SYSCALL(__NR_fgetxattr, sys_fgetxattr) +#define __NR_listxattr 194 +__SYSCALL(__NR_listxattr, sys_listxattr) +#define __NR_llistxattr 195 +__SYSCALL(__NR_llistxattr, sys_llistxattr) +#define __NR_flistxattr 196 +__SYSCALL(__NR_flistxattr, sys_flistxattr) +#define __NR_removexattr 197 +__SYSCALL(__NR_removexattr, sys_removexattr) +#define __NR_lremovexattr 198 +__SYSCALL(__NR_lremovexattr, sys_lremovexattr) +#define __NR_fremovexattr 199 +__SYSCALL(__NR_fremovexattr, sys_fremovexattr) +#define __NR_tkill 200 +__SYSCALL(__NR_tkill, sys_tkill) +#define __NR_time 201 +__SYSCALL(__NR_time, sys_time) +#define __NR_futex 202 +__SYSCALL(__NR_futex, sys_futex) +#define __NR_sched_setaffinity 203 +__SYSCALL(__NR_sched_setaffinity, sys_sched_setaffinity) +#define __NR_sched_getaffinity 204 +__SYSCALL(__NR_sched_getaffinity, sys_sched_getaffinity) +#define __NR_set_thread_area 205 +__SYSCALL(__NR_set_thread_area, sys_ni_syscall) /* use arch_prctl */ +#define __NR_io_setup 206 +__SYSCALL(__NR_io_setup, sys_io_setup) +#define __NR_io_destroy 207 +__SYSCALL(__NR_io_destroy, sys_io_destroy) +#define __NR_io_getevents 208 +__SYSCALL(__NR_io_getevents, sys_io_getevents) +#define __NR_io_submit 209 +__SYSCALL(__NR_io_submit, sys_io_submit) +#define __NR_io_cancel 210 +__SYSCALL(__NR_io_cancel, sys_io_cancel) +#define __NR_get_thread_area 211 +__SYSCALL(__NR_get_thread_area, sys_ni_syscall) /* use arch_prctl */ +#define __NR_lookup_dcookie 212 +__SYSCALL(__NR_lookup_dcookie, sys_lookup_dcookie) +#define __NR_epoll_create 213 +__SYSCALL(__NR_epoll_create, sys_epoll_create) +#define __NR_epoll_ctl_old 214 +__SYSCALL(__NR_epoll_ctl_old, sys_ni_syscall) +#define __NR_epoll_wait_old 215 +__SYSCALL(__NR_epoll_wait_old, sys_ni_syscall) +#define __NR_remap_file_pages 216 +__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages) +#define __NR_getdents64 217 +__SYSCALL(__NR_getdents64, sys_getdents64) +#define __NR_set_tid_address 218 +__SYSCALL(__NR_set_tid_address, sys_set_tid_address) +#define __NR_restart_syscall 219 +__SYSCALL(__NR_restart_syscall, sys_restart_syscall) +#define __NR_semtimedop 220 +__SYSCALL(__NR_semtimedop, sys_semtimedop) +#define __NR_fadvise64 221 +__SYSCALL(__NR_fadvise64, sys_fadvise64) +#define __NR_timer_create 222 +__SYSCALL(__NR_timer_create, sys_timer_create) +#define __NR_timer_settime 223 +__SYSCALL(__NR_timer_settime, sys_timer_settime) +#define __NR_timer_gettime 224 +__SYSCALL(__NR_timer_gettime, sys_timer_gettime) +#define __NR_timer_getoverrun 225 +__SYSCALL(__NR_timer_getoverrun, sys_timer_getoverrun) +#define __NR_timer_delete 226 +__SYSCALL(__NR_timer_delete, sys_timer_delete) +#define __NR_clock_settime 227 +__SYSCALL(__NR_clock_settime, sys_clock_settime) +#define __NR_clock_gettime 228 +__SYSCALL(__NR_clock_gettime, sys_clock_gettime) +#define __NR_clock_getres 229 +__SYSCALL(__NR_clock_getres, sys_clock_getres) +#define __NR_clock_nanosleep 230 +__SYSCALL(__NR_clock_nanosleep, sys_clock_nanosleep) +#define __NR_exit_group 231 +__SYSCALL(__NR_exit_group, sys_exit_group) +#define __NR_epoll_wait 232 +__SYSCALL(__NR_epoll_wait, sys_epoll_wait) +#define __NR_epoll_ctl 233 +__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl) +#define __NR_tgkill 234 +__SYSCALL(__NR_tgkill, sys_tgkill) +#define __NR_utimes 235 +__SYSCALL(__NR_utimes, sys_utimes) +#define __NR_vserver 236 +__SYSCALL(__NR_vserver, sys_ni_syscall) +#define __NR_mbind 237 +__SYSCALL(__NR_mbind, sys_mbind) +#define __NR_set_mempolicy 238 +__SYSCALL(__NR_set_mempolicy, sys_set_mempolicy) +#define __NR_get_mempolicy 239 +__SYSCALL(__NR_get_mempolicy, sys_get_mempolicy) +#define __NR_mq_open 240 +__SYSCALL(__NR_mq_open, sys_mq_open) +#define __NR_mq_unlink 241 +__SYSCALL(__NR_mq_unlink, sys_mq_unlink) +#define __NR_mq_timedsend 242 +__SYSCALL(__NR_mq_timedsend, sys_mq_timedsend) +#define __NR_mq_timedreceive 243 +__SYSCALL(__NR_mq_timedreceive, sys_mq_timedreceive) +#define __NR_mq_notify 244 +__SYSCALL(__NR_mq_notify, sys_mq_notify) +#define __NR_mq_getsetattr 245 +__SYSCALL(__NR_mq_getsetattr, sys_mq_getsetattr) +#define __NR_kexec_load 246 +__SYSCALL(__NR_kexec_load, sys_kexec_load) +#define __NR_waitid 247 +__SYSCALL(__NR_waitid, sys_waitid) +#define __NR_add_key 248 +__SYSCALL(__NR_add_key, sys_add_key) +#define __NR_request_key 249 +__SYSCALL(__NR_request_key, sys_request_key) +#define __NR_keyctl 250 +__SYSCALL(__NR_keyctl, sys_keyctl) +#define __NR_ioprio_set 251 +__SYSCALL(__NR_ioprio_set, sys_ioprio_set) +#define __NR_ioprio_get 252 +__SYSCALL(__NR_ioprio_get, sys_ioprio_get) +#define __NR_inotify_init 253 +__SYSCALL(__NR_inotify_init, sys_inotify_init) +#define __NR_inotify_add_watch 254 +__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch) +#define __NR_inotify_rm_watch 255 +__SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch) +#define __NR_migrate_pages 256 +__SYSCALL(__NR_migrate_pages, sys_migrate_pages) +#define __NR_openat 257 +__SYSCALL(__NR_openat, sys_openat) +#define __NR_mkdirat 258 +__SYSCALL(__NR_mkdirat, sys_mkdirat) +#define __NR_mknodat 259 +__SYSCALL(__NR_mknodat, sys_mknodat) +#define __NR_fchownat 260 +__SYSCALL(__NR_fchownat, sys_fchownat) +#define __NR_futimesat 261 +__SYSCALL(__NR_futimesat, sys_futimesat) +#define __NR_newfstatat 262 +__SYSCALL(__NR_newfstatat, sys_newfstatat) +#define __NR_unlinkat 263 +__SYSCALL(__NR_unlinkat, sys_unlinkat) +#define __NR_renameat 264 +__SYSCALL(__NR_renameat, sys_renameat) +#define __NR_linkat 265 +__SYSCALL(__NR_linkat, sys_linkat) +#define __NR_symlinkat 266 +__SYSCALL(__NR_symlinkat, sys_symlinkat) +#define __NR_readlinkat 267 +__SYSCALL(__NR_readlinkat, sys_readlinkat) +#define __NR_fchmodat 268 +__SYSCALL(__NR_fchmodat, sys_fchmodat) +#define __NR_faccessat 269 +__SYSCALL(__NR_faccessat, sys_faccessat) +#define __NR_pselect6 270 +__SYSCALL(__NR_pselect6, sys_pselect6) +#define __NR_ppoll 271 +__SYSCALL(__NR_ppoll, sys_ppoll) +#define __NR_unshare 272 +__SYSCALL(__NR_unshare, sys_unshare) +#define __NR_set_robust_list 273 +__SYSCALL(__NR_set_robust_list, sys_set_robust_list) +#define __NR_get_robust_list 274 +__SYSCALL(__NR_get_robust_list, sys_get_robust_list) +#define __NR_splice 275 +__SYSCALL(__NR_splice, sys_splice) +#define __NR_tee 276 +__SYSCALL(__NR_tee, sys_tee) +#define __NR_sync_file_range 277 +__SYSCALL(__NR_sync_file_range, sys_sync_file_range) +#define __NR_vmsplice 278 +__SYSCALL(__NR_vmsplice, sys_vmsplice) +#define __NR_move_pages 279 +__SYSCALL(__NR_move_pages, sys_move_pages) + +#ifdef __KERNEL__ + +#define __NR_syscall_max __NR_move_pages + +#ifndef __NO_STUBS + +/* user-visible error numbers are in the range -1 - -4095 */ + +#define __syscall_clobber "r11","rcx","memory" + +#define __syscall_return(type, res) \ +do { \ + if ((unsigned long)(res) >= (unsigned long)(-127)) { \ + errno = -(res); \ + res = -1; \ + } \ + return (type) (res); \ +} while (0) + +#define __ARCH_WANT_OLD_READDIR +#define __ARCH_WANT_OLD_STAT +#define __ARCH_WANT_SYS_ALARM +#define __ARCH_WANT_SYS_GETHOSTNAME +#define __ARCH_WANT_SYS_PAUSE +#define __ARCH_WANT_SYS_SGETMASK +#define __ARCH_WANT_SYS_SIGNAL +#define __ARCH_WANT_SYS_UTIME +#define __ARCH_WANT_SYS_WAITPID +#define __ARCH_WANT_SYS_SOCKETCALL +#define __ARCH_WANT_SYS_FADVISE64 +#define __ARCH_WANT_SYS_GETPGRP +#define __ARCH_WANT_SYS_LLSEEK +#define __ARCH_WANT_SYS_NICE +#define __ARCH_WANT_SYS_OLD_GETRLIMIT +#define __ARCH_WANT_SYS_OLDUMOUNT +#define __ARCH_WANT_SYS_SIGPENDING +#define __ARCH_WANT_SYS_SIGPROCMASK +#define __ARCH_WANT_SYS_RT_SIGACTION +#define __ARCH_WANT_SYS_RT_SIGSUSPEND +#define __ARCH_WANT_SYS_TIME +#define __ARCH_WANT_COMPAT_SYS_TIME + +#ifndef __KERNEL_SYSCALLS__ + +#define __syscall "syscall" + +#define _syscall0(type,name) \ +type name(void) \ +{ \ +long __res; \ +__asm__ volatile (__syscall \ + : "=a" (__res) \ + : "0" (__NR_##name) : __syscall_clobber ); \ +__syscall_return(type,__res); \ +} + +#define _syscall1(type,name,type1,arg1) \ +type name(type1 arg1) \ +{ \ +long __res; \ +__asm__ volatile (__syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)) : __syscall_clobber ); \ +__syscall_return(type,__res); \ +} + +#define _syscall2(type,name,type1,arg1,type2,arg2) \ +type name(type1 arg1,type2 arg2) \ +{ \ +long __res; \ +__asm__ volatile (__syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \ +__syscall_return(type,__res); \ +} + +#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ +type name(type1 arg1,type2 arg2,type3 arg3) \ +{ \ +long __res; \ +__asm__ volatile (__syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ + "d" ((long)(arg3)) : __syscall_clobber); \ +__syscall_return(type,__res); \ +} + +#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ +type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \ +{ \ +long __res; \ +__asm__ volatile ("movq %5,%%r10 ;" __syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ + "d" ((long)(arg3)),"g" ((long)(arg4)) : __syscall_clobber,"r10" ); \ +__syscall_return(type,__res); \ +} + +#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ +type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \ +{ \ +long __res; \ +__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ + "d" ((long)(arg3)),"g" ((long)(arg4)),"g" ((long)(arg5)) : \ + __syscall_clobber,"r8","r10" ); \ +__syscall_return(type,__res); \ +} + +#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ +type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5,type6 arg6) \ +{ \ +long __res; \ +__asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; movq %7,%%r9 ; " __syscall \ + : "=a" (__res) \ + : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \ + "d" ((long)(arg3)), "g" ((long)(arg4)), "g" ((long)(arg5)), \ + "g" ((long)(arg6)) : \ + __syscall_clobber,"r8","r10","r9" ); \ +__syscall_return(type,__res); \ +} + +#else /* __KERNEL_SYSCALLS__ */ + +#include +#include + +/* + * we need this inline - forking from kernel space will result + * in NO COPY ON WRITE (!!!), until an execve is executed. This + * is no problem, but for the stack. This is handled by not letting + * main() use the stack at all after fork(). Thus, no function + * calls - which means inline code for fork too, as otherwise we + * would use the stack upon exit from 'fork()'. + * + * Actually only pause and fork are needed inline, so that there + * won't be any messing with the stack from main(), but we define + * some others too. + */ +#define __NR__exit __NR_exit + +static inline pid_t setsid(void) +{ + return sys_setsid(); +} + +static inline ssize_t write(unsigned int fd, char * buf, size_t count) +{ + return sys_write(fd, buf, count); +} + +static inline ssize_t read(unsigned int fd, char * buf, size_t count) +{ + return sys_read(fd, buf, count); +} + +static inline off_t lseek(unsigned int fd, off_t offset, unsigned int origin) +{ + return sys_lseek(fd, offset, origin); +} + +static inline long dup(unsigned int fd) +{ + return sys_dup(fd); +} + +/* implemented in asm in arch/x86_64/kernel/entry.S */ +extern int execve(const char *, char * const *, char * const *); + +static inline long open(const char * filename, int flags, int mode) +{ + return sys_open(filename, flags, mode); +} + +static inline long close(unsigned int fd) +{ + return sys_close(fd); +} + +static inline pid_t waitpid(int pid, int * wait_stat, int flags) +{ + return sys_wait4(pid, wait_stat, flags, NULL); +} + +extern long sys_mmap(unsigned long addr, unsigned long len, + unsigned long prot, unsigned long flags, + unsigned long fd, unsigned long off); + +extern int sys_modify_ldt(int func, void *ptr, unsigned long bytecount); + +asmlinkage long sys_execve(char *name, char **argv, char **envp, + struct pt_regs regs); +asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, + void *parent_tid, void *child_tid, + struct pt_regs regs); +asmlinkage long sys_fork(struct pt_regs regs); +asmlinkage long sys_vfork(struct pt_regs regs); +asmlinkage long sys_pipe(int *fildes); + +#ifndef __ASSEMBLY__ + +#include +#include +#include +#include + +asmlinkage long sys_iopl(unsigned int level, struct pt_regs *regs); +asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on); +struct sigaction; +asmlinkage long sys_rt_sigaction(int sig, + const struct sigaction __user *act, + struct sigaction __user *oact, + size_t sigsetsize); + +#endif /* __ASSEMBLY__ */ + +#endif /* __KERNEL_SYSCALLS__ */ + +/* + * "Conditional" syscalls + * + * What we want is __attribute__((weak,alias("sys_ni_syscall"))), + * but it doesn't work on all toolchains, so we just do it by hand + */ +#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") + +#endif /* __NO_STUBS */ + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_UNISTD_H_ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unwind.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unwind.h new file mode 100644 index 0000000..02710f6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/unwind.h @@ -0,0 +1,12 @@ +#ifndef _ASM_X86_64_UNWIND_H +#define _ASM_X86_64_UNWIND_H + +#define UNW_PC(frame) ((void)(frame), 0UL) +#define UNW_SP(frame) ((void)(frame), 0UL) + +static inline int arch_unw_user_mode(const void *info) +{ + return 0; +} + +#endif /* _ASM_X86_64_UNWIND_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user.h new file mode 100644 index 0000000..12785c6 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user.h @@ -0,0 +1,114 @@ +#ifndef _X86_64_USER_H +#define _X86_64_USER_H + +#include +#include +/* Core file format: The core file is written in such a way that gdb + can understand it and provide useful information to the user. + There are quite a number of obstacles to being able to view the + contents of the floating point registers, and until these are + solved you will not be able to view the contents of them. + Actually, you can read in the core file and look at the contents of + the user struct to find out what the floating point registers + contain. + + The actual file contents are as follows: + UPAGE: 1 page consisting of a user struct that tells gdb what is present + in the file. Directly after this is a copy of the task_struct, which + is currently not used by gdb, but it may come in useful at some point. + All of the registers are stored as part of the upage. The upage should + always be only one page. + DATA: The data area is stored. We use current->end_text to + current->brk to pick up all of the user variables, plus any memory + that may have been malloced. No attempt is made to determine if a page + is demand-zero or if a page is totally unused, we just cover the entire + range. All of the addresses are rounded in such a way that an integral + number of pages is written. + STACK: We need the stack information in order to get a meaningful + backtrace. We need to write the data from (esp) to + current->start_stack, so we round each of these off in order to be able + to write an integer number of pages. + The minimum core file size is 3 pages, or 12288 bytes. */ + +/* + * Pentium III FXSR, SSE support + * Gareth Hughes , May 2000 + * + * Provide support for the GDB 5.0+ PTRACE_{GET|SET}FPXREGS requests for + * interacting with the FXSR-format floating point environment. Floating + * point data can be accessed in the regular format in the usual manner, + * and both the standard and SIMD floating point data can be accessed via + * the new ptrace requests. In either case, changes to the FPU environment + * will be reflected in the task's state as expected. + * + * x86-64 support by Andi Kleen. + */ + +/* This matches the 64bit FXSAVE format as defined by AMD. It is the same + as the 32bit format defined by Intel, except that the selector:offset pairs for + data and eip are replaced with flat 64bit pointers. */ +struct user_i387_struct { + unsigned short cwd; + unsigned short swd; + unsigned short twd; /* Note this is not the same as the 32bit/x87/FSAVE twd */ + unsigned short fop; + __u64 rip; + __u64 rdp; + __u32 mxcsr; + __u32 mxcsr_mask; + __u32 st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ + __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg = 256 bytes */ + __u32 padding[24]; +}; + +/* + * Segment register layout in coredumps. + */ +struct user_regs_struct { + unsigned long r15,r14,r13,r12,rbp,rbx,r11,r10; + unsigned long r9,r8,rax,rcx,rdx,rsi,rdi,orig_rax; + unsigned long rip,cs,eflags; + unsigned long rsp,ss; + unsigned long fs_base, gs_base; + unsigned long ds,es,fs,gs; +}; + +/* When the kernel dumps core, it starts by dumping the user struct - + this will be used by gdb to figure out where the data and stack segments + are within the file, and what virtual addresses to use. */ +struct user{ +/* We start with the registers, to mimic the way that "memory" is returned + from the ptrace(3,...) function. */ + struct user_regs_struct regs; /* Where the registers are actually stored */ +/* ptrace does not yet supply these. Someday.... */ + int u_fpvalid; /* True if math co-processor being used. */ + /* for this mess. Not yet used. */ + int pad0; + struct user_i387_struct i387; /* Math Co-processor registers. */ +/* The rest of this junk is to help gdb figure out what goes where */ + unsigned long int u_tsize; /* Text segment size (pages). */ + unsigned long int u_dsize; /* Data segment size (pages). */ + unsigned long int u_ssize; /* Stack segment size (pages). */ + unsigned long start_code; /* Starting virtual address of text. */ + unsigned long start_stack; /* Starting virtual address of stack area. + This is actually the bottom of the stack, + the top of the stack is always found in the + esp register. */ + long int signal; /* Signal that caused the core dump. */ + int reserved; /* No longer used */ + int pad1; + struct user_pt_regs * u_ar0; /* Used by gdb to help find the values for */ + /* the registers. */ + struct user_i387_struct* u_fpstate; /* Math Co-processor pointer. */ + unsigned long magic; /* To uniquely identify a core file */ + char u_comm[32]; /* User command that was responsible */ + unsigned long u_debugreg[8]; + unsigned long error_code; /* CPU error code or 0 */ + unsigned long fault_address; /* CR3 or 0 */ +}; +#define NBPG PAGE_SIZE +#define UPAGES 1 +#define HOST_TEXT_START_ADDR (u.start_code) +#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) + +#endif /* _X86_64_USER_H */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user32.h new file mode 100644 index 0000000..f769872 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/user32.h @@ -0,0 +1,69 @@ +#ifndef USER32_H +#define USER32_H 1 + +/* IA32 compatible user structures for ptrace. These should be used for 32bit coredumps too. */ + +struct user_i387_ia32_struct { + u32 cwd; + u32 swd; + u32 twd; + u32 fip; + u32 fcs; + u32 foo; + u32 fos; + u32 st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */ +}; + +/* FSAVE frame with extensions */ +struct user32_fxsr_struct { + unsigned short cwd; + unsigned short swd; + unsigned short twd; /* not compatible to 64bit twd */ + unsigned short fop; + int fip; + int fcs; + int foo; + int fos; + int mxcsr; + int reserved; + int st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ + int xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */ + int padding[56]; +}; + +struct user_regs_struct32 { + __u32 ebx, ecx, edx, esi, edi, ebp, eax; + unsigned short ds, __ds, es, __es; + unsigned short fs, __fs, gs, __gs; + __u32 orig_eax, eip; + unsigned short cs, __cs; + __u32 eflags, esp; + unsigned short ss, __ss; +}; + +struct user32 { + struct user_regs_struct32 regs; /* Where the registers are actually stored */ + int u_fpvalid; /* True if math co-processor being used. */ + /* for this mess. Not yet used. */ + struct user_i387_ia32_struct i387; /* Math Co-processor registers. */ +/* The rest of this junk is to help gdb figure out what goes where */ + __u32 u_tsize; /* Text segment size (pages). */ + __u32 u_dsize; /* Data segment size (pages). */ + __u32 u_ssize; /* Stack segment size (pages). */ + __u32 start_code; /* Starting virtual address of text. */ + __u32 start_stack; /* Starting virtual address of stack area. + This is actually the bottom of the stack, + the top of the stack is always found in the + esp register. */ + __u32 signal; /* Signal that caused the core dump. */ + int reserved; /* No __u32er used */ + __u32 u_ar0; /* Used by gdb to help find the values for */ + /* the registers. */ + __u32 u_fpstate; /* Math Co-processor pointer. */ + __u32 magic; /* To uniquely identify a core file */ + char u_comm[32]; /* User command that was responsible */ + int u_debugreg[8]; +}; + + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vga.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vga.h new file mode 100644 index 0000000..0ecf68a --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vga.h @@ -0,0 +1,20 @@ +/* + * Access to VGA videoram + * + * (c) 1998 Martin Mares + */ + +#ifndef _LINUX_ASM_VGA_H_ +#define _LINUX_ASM_VGA_H_ + +/* + * On the PC, we can just recalculate addresses and then + * access the videoram directly without any black magic. + */ + +#define VGA_MAP_MEM(x,s) (unsigned long)phys_to_virt(x) + +#define vga_readb(x) (*(x)) +#define vga_writeb(x,y) (*(y) = (x)) + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall.h new file mode 100644 index 0000000..146b244 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall.h @@ -0,0 +1,62 @@ +#ifndef _ASM_X86_64_VSYSCALL_H_ +#define _ASM_X86_64_VSYSCALL_H_ + +enum vsyscall_num { + __NR_vgettimeofday, + __NR_vtime, +}; + +#define VSYSCALL_START (-10UL << 20) +#define VSYSCALL_SIZE 1024 +#define VSYSCALL_END (-2UL << 20) +#define VSYSCALL_ADDR(vsyscall_nr) (VSYSCALL_START+VSYSCALL_SIZE*(vsyscall_nr)) + +#ifdef __KERNEL__ +#include + +#define __section_vxtime __attribute__ ((unused, __section__ (".vxtime"), aligned(16))) +#define __section_wall_jiffies __attribute__ ((unused, __section__ (".wall_jiffies"), aligned(16))) +#define __section_jiffies __attribute__ ((unused, __section__ (".jiffies"), aligned(16))) +#define __section_sys_tz __attribute__ ((unused, __section__ (".sys_tz"), aligned(16))) +#define __section_sysctl_vsyscall __attribute__ ((unused, __section__ (".sysctl_vsyscall"), aligned(16))) +#define __section_xtime __attribute__ ((unused, __section__ (".xtime"), aligned(16))) +#define __section_xtime_lock __attribute__ ((unused, __section__ (".xtime_lock"), aligned(16))) + +#define VXTIME_TSC 1 +#define VXTIME_HPET 2 +#define VXTIME_PMTMR 3 + +struct vxtime_data { + long hpet_address; /* HPET base address */ + int last; + unsigned long last_tsc; + long quot; + long tsc_quot; + int mode; +}; + +#define hpet_readl(a) readl((const void __iomem *)fix_to_virt(FIX_HPET_BASE) + a) +#define hpet_writel(d,a) writel(d, (void __iomem *)fix_to_virt(FIX_HPET_BASE) + a) + +/* vsyscall space (readonly) */ +extern struct vxtime_data __vxtime; +extern struct timespec __xtime; +extern volatile unsigned long __jiffies; +extern unsigned long __wall_jiffies; +extern struct timezone __sys_tz; +extern seqlock_t __xtime_lock; + +/* kernel space (writeable) */ +extern struct vxtime_data vxtime; +extern unsigned long wall_jiffies; +extern struct timezone sys_tz; +extern int sysctl_vsyscall; +extern seqlock_t xtime_lock; + +extern int sysctl_vsyscall; + +#define ARCH_HAVE_XTIME_LOCK 1 + +#endif /* __KERNEL__ */ + +#endif /* _ASM_X86_64_VSYSCALL_H_ */ diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall32.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall32.h new file mode 100644 index 0000000..c631c08 --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/vsyscall32.h @@ -0,0 +1,20 @@ +#ifndef _ASM_VSYSCALL32_H +#define _ASM_VSYSCALL32_H 1 + +/* Values need to match arch/x86_64/ia32/vsyscall.lds */ + +#ifdef __ASSEMBLY__ +#define VSYSCALL32_BASE 0xffffe000 +#define VSYSCALL32_SYSEXIT (VSYSCALL32_BASE + 0x410) +#else +#define VSYSCALL32_BASE 0xffffe000UL +#define VSYSCALL32_END (VSYSCALL32_BASE + PAGE_SIZE) +#define VSYSCALL32_EHDR ((const struct elf32_hdr *) VSYSCALL32_BASE) + +#define VSYSCALL32_VSYSCALL ((void *)VSYSCALL32_BASE + 0x400) +#define VSYSCALL32_SYSEXIT ((void *)VSYSCALL32_BASE + 0x410) +#define VSYSCALL32_SIGRETURN ((void __user *)VSYSCALL32_BASE + 0x500) +#define VSYSCALL32_RTSIGRETURN ((void __user *)VSYSCALL32_BASE + 0x600) +#endif + +#endif diff --git a/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/xor.h b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/xor.h new file mode 100644 index 0000000..f942fcc --- /dev/null +++ b/BLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release/asm/xor.h @@ -0,0 +1,354 @@ +/* + * include/asm-x86_64/xor.h + * + * Optimized RAID-5 checksumming functions for MMX and SSE. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * You should have received a copy of the GNU General Public License + * (for example /usr/src/linux/COPYING); if not, write to the Free + * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * Cache avoiding checksumming functions utilizing KNI instructions + * Copyright (C) 1999 Zach Brown (with obvious credit due Ingo) + */ + +/* + * Based on + * High-speed RAID5 checksumming functions utilizing SSE instructions. + * Copyright (C) 1998 Ingo Molnar. + */ + +/* + * x86-64 changes / gcc fixes from Andi Kleen. + * Copyright 2002 Andi Kleen, SuSE Labs. + * + * This hasn't been optimized for the hammer yet, but there are likely + * no advantages to be gotten from x86-64 here anyways. + */ + +typedef struct { unsigned long a,b; } __attribute__((aligned(16))) xmm_store_t; + +/* Doesn't use gcc to save the XMM registers, because there is no easy way to + tell it to do a clts before the register saving. */ +#define XMMS_SAVE do { \ + preempt_disable(); \ + asm volatile ( \ + "movq %%cr0,%0 ;\n\t" \ + "clts ;\n\t" \ + "movups %%xmm0,(%1) ;\n\t" \ + "movups %%xmm1,0x10(%1) ;\n\t" \ + "movups %%xmm2,0x20(%1) ;\n\t" \ + "movups %%xmm3,0x30(%1) ;\n\t" \ + : "=&r" (cr0) \ + : "r" (xmm_save) \ + : "memory"); \ +} while(0) + +#define XMMS_RESTORE do { \ + asm volatile ( \ + "sfence ;\n\t" \ + "movups (%1),%%xmm0 ;\n\t" \ + "movups 0x10(%1),%%xmm1 ;\n\t" \ + "movups 0x20(%1),%%xmm2 ;\n\t" \ + "movups 0x30(%1),%%xmm3 ;\n\t" \ + "movq %0,%%cr0 ;\n\t" \ + : \ + : "r" (cr0), "r" (xmm_save) \ + : "memory"); \ + preempt_enable(); \ +} while(0) + +#define OFFS(x) "16*("#x")" +#define PF_OFFS(x) "256+16*("#x")" +#define PF0(x) " prefetchnta "PF_OFFS(x)"(%[p1]) ;\n" +#define LD(x,y) " movaps "OFFS(x)"(%[p1]), %%xmm"#y" ;\n" +#define ST(x,y) " movaps %%xmm"#y", "OFFS(x)"(%[p1]) ;\n" +#define PF1(x) " prefetchnta "PF_OFFS(x)"(%[p2]) ;\n" +#define PF2(x) " prefetchnta "PF_OFFS(x)"(%[p3]) ;\n" +#define PF3(x) " prefetchnta "PF_OFFS(x)"(%[p4]) ;\n" +#define PF4(x) " prefetchnta "PF_OFFS(x)"(%[p5]) ;\n" +#define PF5(x) " prefetchnta "PF_OFFS(x)"(%[p6]) ;\n" +#define XO1(x,y) " xorps "OFFS(x)"(%[p2]), %%xmm"#y" ;\n" +#define XO2(x,y) " xorps "OFFS(x)"(%[p3]), %%xmm"#y" ;\n" +#define XO3(x,y) " xorps "OFFS(x)"(%[p4]), %%xmm"#y" ;\n" +#define XO4(x,y) " xorps "OFFS(x)"(%[p5]), %%xmm"#y" ;\n" +#define XO5(x,y) " xorps "OFFS(x)"(%[p6]), %%xmm"#y" ;\n" + + +static void +xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) +{ + unsigned int lines = bytes >> 8; + unsigned long cr0; + xmm_store_t xmm_save[4]; + + XMMS_SAVE; + + asm volatile ( +#undef BLOCK +#define BLOCK(i) \ + LD(i,0) \ + LD(i+1,1) \ + PF1(i) \ + PF1(i+2) \ + LD(i+2,2) \ + LD(i+3,3) \ + PF0(i+4) \ + PF0(i+6) \ + XO1(i,0) \ + XO1(i+1,1) \ + XO1(i+2,2) \ + XO1(i+3,3) \ + ST(i,0) \ + ST(i+1,1) \ + ST(i+2,2) \ + ST(i+3,3) \ + + + PF0(0) + PF0(2) + + " .align 32 ;\n" + " 1: ;\n" + + BLOCK(0) + BLOCK(4) + BLOCK(8) + BLOCK(12) + + " addq %[inc], %[p1] ;\n" + " addq %[inc], %[p2] ;\n" + " decl %[cnt] ; jnz 1b" + : [p1] "+r" (p1), [p2] "+r" (p2), [cnt] "+r" (lines) + : [inc] "r" (256UL) + : "memory"); + + XMMS_RESTORE; +} + +static void +xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, + unsigned long *p3) +{ + unsigned int lines = bytes >> 8; + xmm_store_t xmm_save[4]; + unsigned long cr0; + + XMMS_SAVE; + + __asm__ __volatile__ ( +#undef BLOCK +#define BLOCK(i) \ + PF1(i) \ + PF1(i+2) \ + LD(i,0) \ + LD(i+1,1) \ + LD(i+2,2) \ + LD(i+3,3) \ + PF2(i) \ + PF2(i+2) \ + PF0(i+4) \ + PF0(i+6) \ + XO1(i,0) \ + XO1(i+1,1) \ + XO1(i+2,2) \ + XO1(i+3,3) \ + XO2(i,0) \ + XO2(i+1,1) \ + XO2(i+2,2) \ + XO2(i+3,3) \ + ST(i,0) \ + ST(i+1,1) \ + ST(i+2,2) \ + ST(i+3,3) \ + + + PF0(0) + PF0(2) + + " .align 32 ;\n" + " 1: ;\n" + + BLOCK(0) + BLOCK(4) + BLOCK(8) + BLOCK(12) + + " addq %[inc], %[p1] ;\n" + " addq %[inc], %[p2] ;\n" + " addq %[inc], %[p3] ;\n" + " decl %[cnt] ; jnz 1b" + : [cnt] "+r" (lines), + [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3) + : [inc] "r" (256UL) + : "memory"); + XMMS_RESTORE; +} + +static void +xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, + unsigned long *p3, unsigned long *p4) +{ + unsigned int lines = bytes >> 8; + xmm_store_t xmm_save[4]; + unsigned long cr0; + + XMMS_SAVE; + + __asm__ __volatile__ ( +#undef BLOCK +#define BLOCK(i) \ + PF1(i) \ + PF1(i+2) \ + LD(i,0) \ + LD(i+1,1) \ + LD(i+2,2) \ + LD(i+3,3) \ + PF2(i) \ + PF2(i+2) \ + XO1(i,0) \ + XO1(i+1,1) \ + XO1(i+2,2) \ + XO1(i+3,3) \ + PF3(i) \ + PF3(i+2) \ + PF0(i+4) \ + PF0(i+6) \ + XO2(i,0) \ + XO2(i+1,1) \ + XO2(i+2,2) \ + XO2(i+3,3) \ + XO3(i,0) \ + XO3(i+1,1) \ + XO3(i+2,2) \ + XO3(i+3,3) \ + ST(i,0) \ + ST(i+1,1) \ + ST(i+2,2) \ + ST(i+3,3) \ + + + PF0(0) + PF0(2) + + " .align 32 ;\n" + " 1: ;\n" + + BLOCK(0) + BLOCK(4) + BLOCK(8) + BLOCK(12) + + " addq %[inc], %[p1] ;\n" + " addq %[inc], %[p2] ;\n" + " addq %[inc], %[p3] ;\n" + " addq %[inc], %[p4] ;\n" + " decl %[cnt] ; jnz 1b" + : [cnt] "+c" (lines), + [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4) + : [inc] "r" (256UL) + : "memory" ); + + XMMS_RESTORE; +} + +static void +xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, + unsigned long *p3, unsigned long *p4, unsigned long *p5) +{ + unsigned int lines = bytes >> 8; + xmm_store_t xmm_save[4]; + unsigned long cr0; + + XMMS_SAVE; + + __asm__ __volatile__ ( +#undef BLOCK +#define BLOCK(i) \ + PF1(i) \ + PF1(i+2) \ + LD(i,0) \ + LD(i+1,1) \ + LD(i+2,2) \ + LD(i+3,3) \ + PF2(i) \ + PF2(i+2) \ + XO1(i,0) \ + XO1(i+1,1) \ + XO1(i+2,2) \ + XO1(i+3,3) \ + PF3(i) \ + PF3(i+2) \ + XO2(i,0) \ + XO2(i+1,1) \ + XO2(i+2,2) \ + XO2(i+3,3) \ + PF4(i) \ + PF4(i+2) \ + PF0(i+4) \ + PF0(i+6) \ + XO3(i,0) \ + XO3(i+1,1) \ + XO3(i+2,2) \ + XO3(i+3,3) \ + XO4(i,0) \ + XO4(i+1,1) \ + XO4(i+2,2) \ + XO4(i+3,3) \ + ST(i,0) \ + ST(i+1,1) \ + ST(i+2,2) \ + ST(i+3,3) \ + + + PF0(0) + PF0(2) + + " .align 32 ;\n" + " 1: ;\n" + + BLOCK(0) + BLOCK(4) + BLOCK(8) + BLOCK(12) + + " addq %[inc], %[p1] ;\n" + " addq %[inc], %[p2] ;\n" + " addq %[inc], %[p3] ;\n" + " addq %[inc], %[p4] ;\n" + " addq %[inc], %[p5] ;\n" + " decl %[cnt] ; jnz 1b" + : [cnt] "+c" (lines), + [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4), + [p5] "+r" (p5) + : [inc] "r" (256UL) + : "memory"); + + XMMS_RESTORE; +} + +static struct xor_block_template xor_block_sse = { + .name = "generic_sse", + .do_2 = xor_sse_2, + .do_3 = xor_sse_3, + .do_4 = xor_sse_4, + .do_5 = xor_sse_5, +}; + +#undef XOR_TRY_TEMPLATES +#define XOR_TRY_TEMPLATES \ + do { \ + xor_speed(&xor_block_sse); \ + } while (0) + +/* We force the use of the SSE xor block because it can write around L2. + We may also be able to load into the L1 only depending on how the cpu + deals with a load to a line that is being prefetched. */ +#define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse) diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_accounting.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_accounting.h new file mode 100644 index 0000000..2f96ff7 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_accounting.h @@ -0,0 +1,140 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Accounting */ /** + * \defgroup Accounting System Time Accounting + * + * System time accounting allows work for a particular service to be + * charged to a world. This allows work to be offloaded to several worlds + * or other contexts but charged to the appropriate world on whose behalf + * the work is being done. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_ACCOUNTING_H_ +#define _VMKAPI_ACCOUNTING_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_world.h" + +/* + * Well-known accounting service names + */ +#define VMK_SERVICE_ACCT_NAME_KERNEL "kernel" +#define VMK_SERVICE_ACCT_NAME_SCSI "scsi" + +/** + * \ingroup Accounting + * \brief Opaque handle representing a service to charge to. + */ +typedef vmk_uint64 vmk_ServiceAcctId; + +/** + * \ingroup Accounting + * \brief Opaque handle to a world-related accounting context. + */ +typedef struct Sched_SysAcctContext *vmk_ServiceTimeContext; + +/** + * \ingroup Accounting + * \brief A service time context that isn't associated with any service. + */ +#define VMK_SERVICE_TIME_CONTEXT_NONE ((vmk_ServiceTimeContext) 0) + +/* + *********************************************************************** + * vmk_ServiceGetID -- */ /** + * + * \ingroup Accounting + * \brief Lookup a service accounting ID handle by name + * + * \param[in] name Well-known accounting service name to lookup. + * \param[out] serviceId Service identifier handle corresponding to + * the name. + * + * \retval VMK_INVALID_NAME The specified service name is invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ServiceGetID( + const char *name, + vmk_ServiceAcctId *serviceId); + +/* + *********************************************************************** + * vmk_ServiceTimeChargeBeginWorld -- */ /** + * + * \ingroup Accounting + * \brief Begin charging work for a serivce to a world ID + * + * \param[in] serviceId Type of service for the work. + * \param[in] worldId World on whose behalf the work is being done. + * May be VMK_INVALID_WORLD_ID if the caller is + * charging to a particular service category + * not on behalf of any particular world. + * + * \note A world should not deschedule between the invocation of + * vmk_ServiceTimeChargeBeginWorld() and its corresponding + * vmk_ServiceTimeChargeEndWorld(). + * + * \return A handle to an accounting context. + * + *********************************************************************** + */ +vmk_ServiceTimeContext vmk_ServiceTimeChargeBeginWorld( + vmk_ServiceAcctId serviceId, + vmk_WorldID worldId); + +/* + *********************************************************************** + * vmk_ServiceTimeChargeEndWorld -- */ /** + * + * \ingroup Accounting + * \brief Stop charging work against a world. + * + * \param[in] context Accounting context to cease charging against. + * May be VMK_SERVICE_TIME_CONTEXT_NONE in which + * case no action is taken. + * + *********************************************************************** + */ +void vmk_ServiceTimeChargeEndWorld( + vmk_ServiceTimeContext context); + +/* + *********************************************************************** + * vmk_ServiceTimeChargeSetWorld -- */ /** + * + * \ingroup Accounting + * \brief Set the worldID for charging the work. + * + * \param[in] context Accounting context used to charge. + * "context" can be VMK_SERVICE_TIME_CONTEXT_NONE in + * which case, the currently established context + * will be used to charge for given worldId + * + * \param[in] worldId World on whose behalf the work is being done. + * + *********************************************************************** + */ +void +vmk_ServiceTimeChargeSetWorld(vmk_ServiceTimeContext context, + vmk_WorldID worldId); + +#endif /* _VMKAPI_ACCOUNTING_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_assert.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_assert.h new file mode 100644 index 0000000..cb96f8f --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_assert.h @@ -0,0 +1,197 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Assertions */ /** + * \defgroup Assert Assertions + * + * Assertions and related interfaces. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_ASSERT_H_ +#define _VMKAPI_ASSERT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_types.h" + +#include + +/* + *********************************************************************** + * vmk_vPanic -- */ /** + * + * \ingroup Assert + * \brief Panics the system. + * + * Used in unrecoverable error conditions.\n + * A system dump is generated if a dump device has been configured. + * + *********************************************************************** + */ +void vmk_vPanic( + const char *fmt, + va_list ap); + +/* + *********************************************************************** + * vmk_Panic -- */ /** + * + * \ingroup Assert + * \brief Panics the system. + * + * Used in unrecoverable error conditions.\n + * A system dump is generated if a dump device has been configured. + * + *********************************************************************** + */ +void +vmk_Panic( + const char *fmt, + ...) +VMK_ATTRIBUTE_PRINTF(1,2); + +/* + *********************************************************************** + * VMK_ASSERT_BUG -- */ /** + * + * \ingroup Assert + * \brief Panics the system if a runtime expression evalutes to false + * regardless of debug build status. + * + * \param[in] _cond_ Expression to check. + * + *********************************************************************** + */ +#define VMK_ASSERT_BUG(_cond_) \ + do { \ + if (VMK_UNLIKELY(!(_cond_))) { \ + vmk_Panic("Failed at %s:%d -- VMK_ASSERT(%s)\n", \ + __FILE__, __LINE__, #_cond_); \ + /* Ensure that we don't lose warnings in condition */ \ + if (0) { if (_cond_) {;} } (void)0; \ + } \ + } while(0) + +/* + *********************************************************************** + * VMK_ASSERT -- */ /** + * + * \ingroup Assert + * \brief Panics the system if a runtime expression evalutes to false + * only in debug builds. + * + * \param[in] _cond_ Expression to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT(_cond_) VMK_ASSERT_BUG(_cond_) +#else +#define VMK_ASSERT(_cond_) +#endif + + +/* + *********************************************************************** + * VMK_ASSERT_ON_COMPILE -- */ /** + * + * \ingroup Assert + * \brief Fail compilation if a condition does not hold true + * + * \note This macro must be used inside the context of a function. + * + * \param[in] _cond_ Expression to check. + * + *********************************************************************** + */ +#define VMK_ASSERT_ON_COMPILE(_cond_) \ + do { \ + switch(0) { \ + case 0: \ + case (_cond_): \ + ; \ + } \ + } while(0) \ + +/* + *********************************************************************** + * VMK_ASSERT_LIST -- */ /** + * + * \ingroup Assert + * \brief To put a VMK_ASSERT_ON_COMPILE() outside a function, wrap it + * in VMK_ASSERT_LIST(). The first parameter must be unique in + * each .c file where it appears + * + * \par Example usage with VMK_ASSERT_ON_COMPILE: + * + * \code + * VMK_ASSERT_LIST(fs_assertions, + * VMK_ASSERT_ON_COMPILE(sizeof(fs_diskLock) == 128); + * VMK_ASSERT_ON_COMPILE(sizeof(fs_LockRes) == DISK_BLK_SIZE); + * ) + * \endcode + * + * \param[in] _name_ Unique name of the list of assertions. + * \param[in] _assertions_ Individual assert-on-compile statements. + * + *********************************************************************** + */ +#define VMK_ASSERT_LIST(_name_, _assertions_) \ + static inline void _name_(void) { \ + _assertions_ \ + } + +/* + *********************************************************************** + * VMK_DEBUG_ONLY -- */ /** + * + * \ingroup Assert + * \brief Compile code only for debug builds. + * + * \par Example usage: + * + * \code + * VMK_DEBUG_ONLY( + * myFunc(); + * x = 1; + * y = 3; + * ) + * \endcode + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_DEBUG_ONLY(x) x +#else +#define VMK_DEBUG_ONLY(x) +#endif + +/* + *********************************************************************** + * VMK_NOT_REACHED -- */ /** + * + * \ingroup Assert + * \brief Panic if code reaches this call + * + *********************************************************************** + */ +#define VMK_NOT_REACHED() \ + vmk_Panic("Failed at %s:%d -- NOT REACHED\n", __FILE__, __LINE__) + +#endif /* _VMKAPI_ASSERT_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_atomic.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_atomic.h new file mode 100644 index 0000000..1afa9b9 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_atomic.h @@ -0,0 +1,490 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Atomics */ /** + * \defgroup Atomics Atomic Operations + * + * Interfaces to CPU atomic operations. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_ATOMIC_H_ +#define _VMKAPI_ATOMIC_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_platform.h" + +/*** + * \brief Atomic unsigned 64 bit integer + * + * \note Operations on unaligned vmk_atomic64's are not guaranteed to + * be atomic. + * + * \note Be aware that some compilers will not obey a type's alignment + * if it is embedded in a packed structure. + */ +typedef volatile vmk_uint64 vmk_atomic64 + VMK_ATTRIBUTE_ALIGN(sizeof(vmk_uint64)); + +/** + * \brief Read Fence Indicator for Atomic Memory Access + * + * If this global is set to true, then CPU atomic operations should + * be followed by a read fence (i.e. "lfence" instruction for the + * x64-64 architecture). + * + * \note This variable should only be used in assembly language routines + * or fragments. C routines should utilize vmk_AtomicPrologue() + * and vmk_AtomicEpilogue(). + */ +extern vmk_Bool vmk_AtomicUseFence; + +/* + *********************************************************************** + * vmk_AtomicPrologue -- */ /** + * + * \ingroup Atomics + * \brief Setup for atomic operations + * + * This routine should be invoked before atomic operations to allow + * for errata work-arounds. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_AtomicPrologue( + void) +{ + /* Nothing for now */ +} + +/* + *********************************************************************** + * vmk_AtomicEpilogue -- */ /** + * + * \ingroup Atomics + * \brief Finish atomic operations + * + * This routine should be invoked after atomic operations to allow + * for errata work-arounds. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_AtomicEpilogue( + void) +{ + if (VMK_UNLIKELY(vmk_AtomicUseFence)) { + vmk_CPUMemFenceRead(); + } +} + +/* + *********************************************************************** + * vmk_AtomicInc64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically increment + * + * \param[out] var Atomic to increment. + * + *********************************************************************** + */ +static inline void vmk_AtomicInc64( + vmk_atomic64 *var) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; incq %0" + : "+m" (*var) + : + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicDec64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically decrement + * + * \param[out] var Atomic to decrement. + * + *********************************************************************** + */ +static inline void vmk_AtomicDec64( + vmk_atomic64 *var) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; decl %0" + : "+m" (*var) + : + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicAdd64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically add + * + * \param[out] var Atomic to add to. + * \param[in] val Value to add to atomic. + * \return None. + * + *********************************************************************** + */ +static inline void vmk_AtomicAdd64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; addq %1, %0" + : "+m" (*var) + : "ri" (val) + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicSub64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically subtract + * + * \param[out] var Atomic to subtract from. + * \param[in] val Value to subtract from atomic. + * + *********************************************************************** + */ +static inline void vmk_AtomicSub64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; subq %1, %0" + : "+m" (*var) + : "ri" (val) + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicOr64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically bitwise OR + * + * \param[out] var Atomic to OR + * \param[in] val Value to OR + * \return None. + * + *********************************************************************** + */ +static inline void vmk_AtomicOr64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; orq %1, %0" + : "+m" (*var) + : "ri" (val) + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicAnd64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically bitwise AND + * + * \param[out] var Atomic to AND. + * \param[in] val Value to AND. + * + *********************************************************************** + */ +static inline void vmk_AtomicAnd64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; andq %1, %0" + : "+m" (*var) + : "ri" (val) + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicXor64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically bitwise XOR + * + * \param[out] var Atomic to XOR. + * \param[in] val Value to XOR. + * + *********************************************************************** + */ +static inline void vmk_AtomicXor64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; xorq %1, %0" + : "+m" (*var) + : "ri" (val) + : "cc" + ); + vmk_AtomicEpilogue(); +} + +/* + *********************************************************************** + * vmk_AtomicRead64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read + * + * \param[out] var Atomic to read. + * + * \return Value of the atomic. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicRead64( + vmk_atomic64 const *var) +{ + return *var; +} + +/* + *********************************************************************** + * vmk_AtomicWrite64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically write + * + * \param[out] var Atomic to write. + * \param[in] val Value to write. + * + *********************************************************************** + */ +static inline void vmk_AtomicWrite64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + /* + * Ensure that we do a single movq. Without this, the compiler + * may do write with a constant as two movl operations. + */ + __asm__ __volatile__( + "movq %1, %0" + : "+m" (*var) + : "r" (val) + ); +} + +/* + *********************************************************************** + * vmk_AtomicReadWrite64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read and write + * + * \param[out] var Atomic to read. + * \param[in] val Value to write. + * + * \return Value of the atomic before written. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadWrite64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_AtomicPrologue(); + __asm__ __volatile__( + "xchgq %0, %1" + : "=r" (val), + "+m" (*var) + : "0" (val) + ); + vmk_AtomicEpilogue(); + + return val; +} + +/* + *********************************************************************** + * vmk_AtomicReadIfEqualWrite64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read, compare, and conditionally write + * + * Atomically writes new to var if its current value is old. + * The value returned is old if new was written, else + * the current unmodified value of the atomic is returned + * + * \param[out] var Atomic to read. + * \param[in] old Value to compare. + * \param[in] new Value to write. + * + * \return Value of the atomic before written. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadIfEqualWrite64( + vmk_atomic64 *var, + vmk_uint64 old, + vmk_uint64 new) +{ + vmk_uint64 val; + + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; cmpxchgq %2, %1" + : "=a" (val), + "+m" (*var) + : "r" (new), + "0" (old) + : "cc" + ); + vmk_AtomicEpilogue(); + + return val; +} + +/* + *********************************************************************** + * vmk_AtomicReadAdd64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read and add + * + * \param[out] var Atomic to read. + * \param[in] val Value to add. + * + * \return Value of the atomic before addition. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadAdd64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + + vmk_AtomicPrologue(); + __asm__ __volatile__( + "lock; xaddq %0, %1" + : "=r" (val), + "+m" (*var) + : "0" (val) + : "cc" + ); + vmk_AtomicEpilogue(); + + return val; +} + +/* + *********************************************************************** + * vmk_AtomicReadInc64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read and increment + * + * \param[out] var Atomic to read. + * + * \return Value of the atomic before incremented. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadInc64( + vmk_atomic64 *var) +{ + return vmk_AtomicReadAdd64(var, 1); +} + +/* + *********************************************************************** + * vmk_AtomicReadDec64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read and decrement + * + * \param[out] var Atomic to read. + * + * \return Value of the atomic before decremented. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadDec64( + vmk_atomic64 *var) +{ + return vmk_AtomicReadAdd64(var, VMK_CONST64U(-1)); +} + +/* + *********************************************************************** + * vmk_AtomicReadOr64 -- */ /** + * + * \ingroup Atomics + * \brief Atomically read and bitwise OR with a value + * + * \param[out] var Atomic to read/OR. + * \param[in] val Value to OR atomically. + * + * \return Value of the atomic before the operation. + * + *********************************************************************** + */ +static inline vmk_uint64 vmk_AtomicReadOr64( + vmk_atomic64 *var, + vmk_uint64 val) +{ + vmk_uint64 res; + + do { + res = vmk_AtomicRead64(var); + } while (res != vmk_AtomicReadIfEqualWrite64(var, res, res | val)); + + return res; +} + +#endif /* _VMKAPI_ATOMIC_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bits.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bits.h new file mode 100644 index 0000000..6f2b71c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bits.h @@ -0,0 +1,204 @@ +/*************************************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Bits */ /** + * \defgroup Bits Bit Manipulation + * + * Utility interfaces for bit shifting, flipping, etc. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_BITS_H_ +#define _VMKAPI_BITS_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" + +/* + *********************************************************************** + * vmk_CPUToBE64 -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 64 bit unsigned integer in the + * CPU native endian format into a big endian 64 bit + * unsigned integer. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_BE64ToCPU + * + *********************************************************************** + */ +static inline vmk_uint64 +vmk_CPUToBE64(vmk_uint64 x) +{ +#if defined(__x86_64__) && defined(__GNUC__) + if (!__builtin_constant_p(x)) { + __asm__ ("bswapq %0" + : "=r" (x) + : "0" (x)); + return x; + } +#endif + return ((x >> 56) & VMK_CONST64U(0x00000000000000FF)) | + ((x >> 40) & VMK_CONST64U(0x000000000000FF00)) | + ((x >> 24) & VMK_CONST64U(0x0000000000FF0000)) | + ((x >> 8) & VMK_CONST64U(0x00000000FF000000)) | + ((x << 8) & VMK_CONST64U(0x000000FF00000000)) | + ((x << 24) & VMK_CONST64U(0x0000FF0000000000)) | + ((x << 40) & VMK_CONST64U(0x00FF000000000000)) | + ((x << 56) & VMK_CONST64U(0xFF00000000000000)); +} + +/* + *********************************************************************** + * vmk_BE64ToCPU -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 64 bit unsigned integer in the + * big endian format into a 64 bit unsigned integer in + * the native CPU endian format. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_CPUToBE64 + * + *********************************************************************** + */ +static inline vmk_uint64 +vmk_BE64ToCPU(vmk_uint64 x) +{ + return vmk_CPUToBE64(x); +} + +/* + *********************************************************************** + * vmk_CPUToBE32 -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 32 bit unsigned integer in the + * CPU native endian format into a big endian 32 bit + * unsigned integer. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_BE32ToCPU + * + *********************************************************************** + */ +static inline vmk_uint32 +vmk_CPUToBE32(vmk_uint32 x) +{ +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + if (!__builtin_constant_p(x)) { + __asm__ ("bswap %0" + : "=r" (x) + : "0" (x)); + return x; + } +#endif + return ((x >> 24) & 0x000000ff) | ((x >> 8) & 0x0000ff00) | + ((x << 8) & 0x00ff0000) | ((x << 24) & 0xff000000); +} + +/* + *********************************************************************** + * vmk_BE32ToCPU -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 32 bit unsigned integer in the + * big endian format into a 32 bit unsigned integer in + * the native CPU endian format. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_CPUToBE32 + * + *********************************************************************** + */ +static inline vmk_uint32 +vmk_BE32ToCPU(vmk_uint32 x) +{ + return vmk_CPUToBE32(x); +} + +/* + *********************************************************************** + * vmk_CPUToBE16 -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 16 bit unsigned integer in the + * CPU native endian format into a big endian 16 bit + * unsigned integer. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_BE16ToCPU + * + *********************************************************************** + */ +static inline vmk_uint16 +vmk_CPUToBE16(vmk_uint16 x) +{ +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + if (!__builtin_constant_p(x)) { + int bits = 8; + __asm__ ("rolw %%cl, %0" + : "=r" (x) + : "0" (x), "c" (bits)); + return x; + } +#endif + return ((x >> 8) & 0x00ff) | ((x << 8) & 0xff00); +} + +/* + *********************************************************************** + * vmk_BE16ToCPU -- */ /** + * + * \ingroup Bits + * \brief Convert an unsigned 16 bit unsigned integer in the + * big endian format into a 16 bit unsigned integer in + * the native CPU endian format. + * + * \param[in] x Value to swap + * + * \return Swapped value. + * + * \sa vmk_CPUToBE16 + * + *********************************************************************** + */ +static inline vmk_uint16 +vmk_BE16ToCPU(vmk_uint16 x) +{ + return vmk_CPUToBE16(x); +} + +#endif /* _VMKAPI_BITS_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bottom_half.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bottom_half.h new file mode 100644 index 0000000..75029a3 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bottom_half.h @@ -0,0 +1,142 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * BottomHalves */ /** + * \defgroup BottomHalves Bottom-Halves + * + * Bottom-halves are soft-interrupt-like contexts that run below + * the priority of hardware interrupts but outside the context + * of a schedulable entity like a World. This means that bottom-half + * callbacks may not block while they execute. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_BOTTOM_HALF_H_ +#define _VMKAPI_BOTTOM_HALF_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +typedef vmk_uint32 vmk_BottomHalf; + +typedef void (*vmk_BottomHalfCallback)(vmk_AddrCookie data); + +/** + * \brief Maximum length of a bottom-half's name string, including + * the terminating nul. + */ +#define VMK_BH_NAME_MAX 32 + +/* + *********************************************************************** + * vmk_BottomHalfRegister -- */ /** + * + * \ingroup BottomHalves + * \brief Register a function that can be scheduled as a bottom-half. + * + * \param[in] callback Bottom-half callback function. + * \param[in] data Data to be passed to the callback function. + * \param[out] newBH Bottom-half identifier + * \param[in] name Name associated with this bottom-half + * + * \retval VMK_NO_RESOURCES Bottom-half registration table was full, + * new bottom-half was not registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_BottomHalfRegister( + vmk_BottomHalfCallback callback, + vmk_AddrCookie data, + vmk_BottomHalf *newBH, + const char *name); + +/* + *********************************************************************** + * vmk_BottomHalfUnregister -- */ /** + * + * \ingroup BottomHalves + * \brief Unregister a previously registered bottom-half callback. + * + * \param[in] bottomHalf Bottom-half to unregister. + * + *********************************************************************** + */ +void vmk_BottomHalfUnregister( + vmk_BottomHalf bottomHalf); + +/* + *********************************************************************** + * vmk_BottomHalfSchedulePCPU -- */ /** + * + * \ingroup BottomHalves + * \brief Schedule the execution of a bottom-half on a particular PCPU + * + * This schedules the function which has been registered and associated + * with the bottom-half identifier by vmk_BottomHalfRegister to + * run as bottom-half with the given physical CPU. + * + * \warning Do not schedule a bottom-half on another CPU too frequently + * since the bottom-half cache-line is kept on the local CPU. + * + * \param[in] bottomHalf Bottom-half to schedule. + * \param[in] pcpu PCPU on which the bottom-half should run. + * + * \retval VMK_OK The given bottom-half has been scheduled successfully. + * \retval VMK_INVALID_TARGET The specified PCPU is not available. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_BottomHalfSchedulePCPU( + vmk_BottomHalf bottomHalf, + vmk_uint32 pcpu); + +/* + *********************************************************************** + * vmk_BottomHalfScheduleAnyPCPU -- */ /** + * + * \ingroup BottomHalves + * \brief Schedule the execution of a bottom-half on any PCPU + * + * \param[in] bottomHalf Bottom-half to schedule. + * + *********************************************************************** + */ +void vmk_BottomHalfScheduleAnyPCPU( + vmk_BottomHalf bottomHalf); + + +/* + *********************************************************************** + * vmk_BottomHalfCheck -- */ /** + * + * \ingroup BottomHalves + * \brief Execute pending bottom-half handlers on the local pcpu. + * + * Afterwards, if a reschedule is pending and "canReschedule" is VMK_TRUE + * then invoke the scheduler. + * + * \param[in] canReschedule If VMK_TRUE then invoke the scheduler after + * pending bottom-halves execute. + * + *********************************************************************** + */ +void vmk_BottomHalfCheck( + vmk_Bool canReschedule); + +#endif /* _VMKAPI_BOTTOM_HALF_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_char.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_char.h new file mode 100644 index 0000000..e09ded3 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_char.h @@ -0,0 +1,385 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Character Devices */ /** + * \defgroup CharDev Character Devices + * + * Interfaces that allow management of vmkernel's UNIX-like character + * device nodes. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_CHAR_H_ +#define _VMKAPI_CHAR_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_module.h" + +/** + * \brief Semaphore rank that may be safely used by character devices. + */ +#define VMK_SEMA_RANK_CHAR VMK_SEMA_RANK_LEAF + +/* + * UNIX-style open flags supported for character devices + */ +/** \brief Read-only. */ +#define VMK_CHARDEV_OFLAG_RDONLY 0x00000000 + +/** \brief Write-only. */ +#define VMK_CHARDEV_OFLAG_WRONLY 0x00000001 + +/** \brief Read-write. */ +#define VMK_CHARDEV_OFLAG_RDWR 0x00000002 + +/** \brief Mask for read/write flags. */ +#define VMK_CHARDEV_OFLAG_RDWR_MASK 0x00000003 + +/** \brief Exclusive access. */ +#define VMK_CHARDEV_OFLAG_EXCLUSIVE 0x00000080 + +/** \brief Append to end of file. Always set for writes */ +#define VMK_CHARDEV_OFLAG_APPEND 0x00000400 + +/** \brief Don't block for file operations. */ +#define VMK_CHARDEV_OFLAG_NONBLOCK 0x00000800 + +/** \brief Synchronous file operations. */ +#define VMK_CHARDEV_OFLAG_SYNC 0x00001000 + +/** \brief Use direct I/O. */ +#define VMK_CHARDEV_OFLAG_DIRECT 0x00004000 + + +/** \brief Flags for poll entry point */ +typedef enum vmk_PollEvent { + /** \brief No events are available */ + VMKAPI_POLL_NONE = 0x00, + /** \brief The device is ready for reading */ + VMKAPI_POLL_READ = 0x01, + /** \brief The device is ready for writing */ + VMKAPI_POLL_WRITE = 0x04, + /** \brief The file was closed during polling for read status */ + VMKAPI_POLL_RDHUP = 0x08, + /** \brief The file was closed during polling for write status */ + VMKAPI_POLL_WRHUP = 0x10, + /** \brief The file is no longer valid */ + VMKAPI_POLL_INVALID = 0x20, +} vmk_PollEvent; + + +/** + * \ingroup CharDev + * \brief Character device's file descriptor's attibutes. + */ +typedef struct vmk_CharDevFdAttr { + /** \brief Character device's major number. */ + vmk_uint16 major; + + /** \brief Character device's minor number. */ + vmk_uint16 minor; + + /** + * \brief UNIX-style file flags used when opening the device + * from the host. + */ + vmk_uint32 openFlags; + + /** + * \brief Client data associated with the file descriptor. + * + * May be used by the character driver to store information + * persistent across syscalls + * + * The field can be updated by the driver at any time during + * a syscall. + */ + void *clientData; /* For use by the character device driver */ + /* across open/ioctl/close calls */ +} vmk_CharDevFdAttr; + +/** + * \brief Opaque poll token handle. + */ +typedef void *vmk_PollToken; + +/** + * \brief Opaque poll context handle. + */ +typedef void *vmk_PollContext; + +/** + * \ingroup CharDev + * \brief Character device driver's entry points + */ +typedef struct vmk_CharDevOps { + VMK_ReturnStatus (*open)(vmk_CharDevFdAttr *attr); + VMK_ReturnStatus (*close)(vmk_CharDevFdAttr *attr); + VMK_ReturnStatus (*ioctl)(vmk_CharDevFdAttr *attr, unsigned int cmd, + vmk_uintptr_t userData, + vmk_IoctlCallerSize callerSize, + vmk_int32 *result); + VMK_ReturnStatus (*fasync)(vmk_CharDevFdAttr *attr); + VMK_ReturnStatus (*poll)(vmk_CharDevFdAttr *attr, void *pollCtx, + unsigned *pollMask); + VMK_ReturnStatus (*read)(vmk_CharDevFdAttr *attr, char *buffer, + vmk_size_t nbytes, vmk_loff_t *ppos, + vmk_ssize_t *nread); + VMK_ReturnStatus (*write)(vmk_CharDevFdAttr *attr, char *buffer, + vmk_size_t nbytes, vmk_loff_t *ppos, + vmk_ssize_t *nwritten); +} vmk_CharDevOps; + +/** + *********************************************************************** + * vmk_CharDevCleanupFn -- */ /** + * + * \ingroup CharDev + * \brief Prototype for a character device driver's cleanup callback. + * + * \param[in] private Optional private data to be used by the callback + * + * \retval VMK_OK The cleanup function executed correctly. + * This is not an indicator of the success or failure of + * the operations in the function, but merely that they + * ran. Any other return value may have undefined + * consequences. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_CharDevCleanupFn)(vmk_AddrCookie private); + +/* + *********************************************************************** + * vmk_CharDevRegister -- */ /** + * + * \ingroup CharDev + * \brief Register the specified character device, to be invoked from + * user-space. + * + * \param[in] module Module that owns the character device. + * \param[in] major Major number of the device. 0 if system + * will allocate the major number. + * \param[in] minor Minor number of the device. + * \param[in] name The name of the device. + * \param[in] ops Table of the driver operations (open, + * close, ioctl, fasync). + * \param[out] assignedMajor Returns the major assigned to the driver + * + * \retval VMK_BUSY The major number is already registered + * \retval VMK_NO_RESOURCES No free major number + * \retval VMK_BAD_PARAM Module ID was invalid, or one or more + * specified driver ops are NULL. + * \retval VMK_NOT_SUPPORTED Minor number is not valid for major number. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CharDevRegister( + vmk_ModuleID module, + vmk_uint16 major, + vmk_uint16 minor, + const char *name, + vmk_CharDevOps *ops, + vmk_int32 *assignedMajor); + + + +/* + *********************************************************************** + * vmk_CharDevUnregister -- */ /** + * + * \ingroup CharDev + * \brief Attempt to unregister a character device immediately. + * + * This can fail if the device is currently open. Use + * vmk_CharDevUnregisterAsync if you want to automatically + * unregister the device once the last reference closes. + * + * \param[in] major Major number of the device. + * \param[in] minor Minor number of the device. + * \param[in] name The name of the device. + * + * \retval VMK_NOT_FOUND The device does not exist. + * \retval VMK_BAD_PARAM The device's name does not match the one given. + * \retval VMK_BUSY The device is in use and cannot be unregistered now. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CharDevUnregister( + vmk_uint16 major, + vmk_uint16 minor, + const char *name); + +/* + *********************************************************************** + * vmk_CharDevUnregisterAsync -- */ /** + * + * \ingroup CharDev + * \brief Unregister a character device once all outstanding + * references to the device are closed (may be immediately). + * + * \note This call can block. + * + * "Async" refers to when the requested character device is + * actually unregistered, since it may be completed well after + * vmk_CharDevUnregisterAsync completes. + * + * \param[in] major Major number of the device. + * \param[in] minor Minor number of the device. + * \param[in] name The name of the device. + * + * \retval VMK_NOT_FOUND The device does not exist. + * \retval VMK_BAD_PARAM The device's name does not match the one given. + * \retval VMK_OK The device was either unregistered or queued to be + * unregistered once all references close. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CharDevUnregisterAsync( + vmk_uint16 major, + vmk_uint16 minor, + const char *name); + +/* + *********************************************************************** + * vmk_CharDevRegisterCleanup -- */ /** + * + * \ingroup CharDev + * \brief Register a cleanup callback to be executed after a + * character device has completed its unregistration. + * + * Only one callback can be registered per device. If you + * attempt to register a new callback when one exists, + * vmk_CharDevRegisterCleanup returns VMK_EXISTS. + * + * \param[in] module Module that owns the character device + * \param[in] major Major number of the registered character device + * \param[in] minor Minor number of the registered character device + * \param[in] cleanup Cleanup function to be executed + * \param[in] private Private data to be passed to the cleanup function + * + * \retval VMK_EXISTS A cleanup callback for this device is already registered. + * \retval VMK_BAD_PARAM The module owner for the device does not match + * the module ID given for the cleanup callback. + * \retval VMK_NOT_FOUND No device with the given major/minor is registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CharDevRegisterCleanup( + vmk_ModuleID module, + vmk_uint16 major, + vmk_uint16 minor, + vmk_CharDevCleanupFn cleanup, + vmk_AddrCookie private); + +/* + *********************************************************************** + * vmk_CharDevUnregisterCleanup -- */ /** + * + * \ingroup CharDev + * \brief Cancel a cleanup callback that had been registered for + * the given character device. + * + * \param[in] module Module that owns the character device + * \param[in] major Major number of the registered character device + * \param[in] minor Minor number of the registered character device + * \param[in] cleanup Cleanup function that was to be executed + * \param[in] private Private data that was to be passed to the cleanup + * function + * + * \retval VMK_BAD_PARAM The module owner for the device does not match + * the module ID given for the cleanup callback + * being unregistered. + * \retval VMK_NOT_FOUND No device with the given major/minor is registered, + * or no callback with the given function and private + * data is registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CharDevUnregisterCleanup( + vmk_ModuleID module, + vmk_uint16 major, + vmk_uint16 minor, + vmk_CharDevCleanupFn cleanup, + vmk_AddrCookie private); + + +/* + *********************************************************************** + * vmk_CharDevWakePollers -- */ /** + * + * \ingroup CharDev + * \brief Wake up all users waiting on a poll call with the specified + * token. + * + * \param[in] token Context on which worlds are waiting. + * + *********************************************************************** + */ +void vmk_CharDevWakePollers(void *token); + +/* + *********************************************************************** + * vmk_CharDevNotifyFasyncComplete -- */ /** + * + * \ingroup CharDev + * \brief Send a signal to processes that have requested notification. + * The device's minor number is assumed to be zero. + * + * \param[in] major Major number of the device. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_CharDevNotifyFasyncComplete(vmk_uint16 major); + +/* + *********************************************************************** + * vmk_CharDevNotifyFasyncCompleteWithMinor -- */ /** + * + * \ingroup CharDev + * \brief Send a signal to processes that have requested notification, + * specifying a nonzero device minor. + * + * \param[in] major Major number of the device. + * \param[in] minor Minor number of the device. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_CharDevNotifyFasyncCompleteWithMinor(vmk_uint16 major, + vmk_uint16 minor); + +/* + *********************************************************************** + * vmk_CharDevSetPollCtx -- */ /** + * + * \ingroup CharDev + * \brief Set the poll context of the calling world to the specified + * context. + * + * \param[in] pollCtx The poll context of the calling thread. + * \param[out] token The token to set in the poll context. + * + *********************************************************************** + */ +void vmk_CharDevSetPollContext(vmk_PollContext *pollCtx, vmk_PollToken *token); + +#endif /* _VMKAPI_CHAR_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_compiler.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_compiler.h new file mode 100644 index 0000000..38ae843 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_compiler.h @@ -0,0 +1,228 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Compiler Utilities */ /** + * \defgroup Compiler Compiler Utilities + * + * These interfaces allow easy access to special compiler-specific + * information and tags. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_COMPILER_H_ +#define _VMKAPI_COMPILER_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + *********************************************************************** + * VMK_ATTRIBUTE_NORETURN -- */ /** + * \ingroup Compiler + * + * \brief Indicate to the compiler that the function never returns + * + *********************************************************************** + */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 9) +#define VMK_ATTRIBUTE_NORETURN \ + __attribute__((__noreturn__)) +#else +#define VMK_ATTRIBUTE_NORETURN +#endif + +/* + *********************************************************************** + * VMK_ATTRIBUTE_ALWAYS_INLINE -- */ /** + * \ingroup Compiler + * + * \brief Indicate to the compiler that an inlined function should + * always be inlined. + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_ATTRIBUTE_ALWAYS_INLINE \ + __attribute__((always_inline)) +#else +#define VMK_ATTRIBUTE_ALWAYS_INLINE +#endif + +/* + *********************************************************************** + * VMK_ATTRIBUTE_PRINTF -- */ /** + * \ingroup Compiler + * + * \brief Compiler format checking for printf-like functions + * + * \param[in] fmt Argument number of the format string + * \param[in] vararg Argument number of the first vararg + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_ATTRIBUTE_PRINTF(fmt, vararg) \ + __attribute__((format(__printf__, fmt, vararg))) +#else +#define VMK_ATTRIBUTE_PRINTF(fmt, vararg) +#endif + +/* + *********************************************************************** + * VMK_ATTRIBUTE_SCANF -- */ /** + * \ingroup Compiler + * + * \brief Compiler format checking for scanf-like functions + * + * \param[in] fmt Argument number of the format string + * \param[in] vararg Argument number of the first vararg + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_ATTRIBUTE_SCANF(fmt, vararg) \ + __attribute__((format(__scanf__, fmt, vararg))) +#else +#define VMK_ATTRIBUTE_SCANF(fmt, vararg) +#endif + +/* + *********************************************************************** + * VMK_ALWAYS_INLINE -- */ /** + * \ingroup Compiler + * + * \brief Indicate to the compiler that a function should be inlined + * and that it should always be inlined. + * + *********************************************************************** + */ +#define VMK_ALWAYS_INLINE \ + inline VMK_ATTRIBUTE_ALWAYS_INLINE + +/* + *********************************************************************** + * VMK_ATTRIBUTE_ALIGN -- */ /** + * \ingroup Compiler + * + * \brief Align the data structure on "n" bytes. + * + * \param[in] n Number of bytes to align the data structure on. + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_ATTRIBUTE_ALIGN(n) \ + /** \cond never */ __attribute__((__aligned__(n))) /** \endcond */ +#else +#define VMK_ATTRIBUTE_ALIGN(n) +#endif + +/* + *********************************************************************** + * VMK_ATTRIBUTE_PACKED -- */ /** + * \ingroup Compiler + * + * \brief Pack a data structure into the minumum number of bytes. + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_ATTRIBUTE_PACKED \ + /** \cond never */ __attribute__((__packed__)) /** \endcond */ +#else +#define VMK_ATTRIBUTE_PACKED +#endif + +/* + *********************************************************************** + * VMK_LIKELY -- */ /** + * + * \ingroup Compiler + * \brief Branch prediction hint to the compiler that the supplied + * expression will likely evaluate to true. + * + * \note Be aware that using this in an if-statement may mean + * the compiler will fail to issue some warnings on the + * given expression. + * + * \param[in] _exp Expression that will likely evaluate to true. + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_LIKELY(_exp) __builtin_expect(!!(_exp), 1) +#else +#define VMK_LIKELY(_exp) (_exp) +#endif + +/* + *********************************************************************** + * VMK_UNLIKELY -- */ /** + * + * \ingroup Compiler + * \brief Branch prediction hint to the compiler that the supplied + * expression will likely evaluate to false. + * + * \note Be aware that using this in an if-statement may mean + * the compiler will fail to issue some warnings on the + * given expression. + * + * \param[in] _exp Expression that will likely evaluate to false. + * + *********************************************************************** + */ +#if (__GNUC__ >= 3) +#define VMK_UNLIKELY(_exp) __builtin_expect((_exp), 0) +#else +#define VMK_UNLIKELY(_exp) (_exp) +#endif + +/* + *********************************************************************** + * VMK_PADDED_STRUCT -- */ /** + * + * \ingroup Compiler + * \brief Macro used for padding a struct + * + * \param _align_sz_ Align the struct to this size + * \param _fields_ fields of the struct + * + *********************************************************************** + */ +#define VMK_PADDED_STRUCT(_align_sz_, _fields_) \ + union { \ + struct _fields_; \ + char pad[((((sizeof(struct _fields_)) + (_align_sz_) - 1) / \ + (_align_sz_)) * (_align_sz_))]; \ + }; + +/* + *********************************************************************** + * vmk_offsetof -- */ /** + * \ingroup Compiler + * + * \brief Get the offset of a member of in a type + * + * \param[in] TYPE Type the member is a part of. + * \param[in] MEMBER Member to get the offset of. + * + * \returns The offset in bytes of MEMBER in TYPE. + * + *********************************************************************** + */ +#define vmk_offsetof(TYPE, MEMBER) ((vmk_size_t) &((TYPE *)0)->MEMBER) + +#endif /* _VMKAPI_COMPILER_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_config.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_config.h new file mode 100644 index 0000000..9a11c08 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_config.h @@ -0,0 +1,175 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Configuration */ /** + * \defgroup Configuration Configuration Options + * + * The configuration option interface allows access to kernel + * configuration options set by the user. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_CONFIG_H_ +#define _VMKAPI_CONFIG_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/* + * Useful configuration group and parameter names + */ + +/** \brief Misc parameter group name */ +#define VMK_CONFIG_GROUP_MISC "Misc" + +/** \brief Disk parameter group name */ +#define VMK_CONFIG_GROUP_DISK "Disk" + +/** \brief Scsi parameter group name */ +#define VMK_CONFIG_GROUP_SCSI "Scsi" + +/** \brief Scsi parameter group name */ +#define VMK_CONFIG_GROUP_NET "Net" + + +/** \brief Host Name parameter name */ +#define VMK_CONFIG_PARAM_HOSTNAME "HostName" + +/** \brief Host IP Address parameter name */ +#define VMK_CONFIG_PARAM_MGMT_IPADDR "ManagementAddr" + +/** + * \brief Opaque handle to a configuration parameter. + */ +typedef vmk_uint64 vmk_ConfigParamHandle; + +/* + *********************************************************************** + * vmk_ConfigParamOpen -- */ /** + * + * \ingroup Configuration + * \brief Open a handle to a configuration parameter. + * + * \param[in] groupName A functional group name associated with + * configuration parameter. + * \param[in] paramName A parameter name. + * \param[out] handle Handle to the configuration parameter. + * + * \retval VMK_BAD_PARAM The group name or configuration parameter + * name was invalid. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ConfigParamOpen( + const char *groupName, + const char *paramName, + vmk_ConfigParamHandle *handle); + +/* + *********************************************************************** + * vmk_ConfigParamClose -- */ /** + * + * \ingroup Configuration + * \brief Close a handle to a configuration parameter. + * + * \param[in] handle Handle to the configuration parameter. + * + * \retval VMK_BAD_PARAM The configuration handle was invalid + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ConfigParamClose( + vmk_ConfigParamHandle handle); + +/* + *********************************************************************** + * vmk_ConfigParamGetUint -- */ /** + * + * \ingroup Configuration + * \brief Get an UInt value associated with a configuration parameter + * handle. + * + * \param[in] handle Handle to the configuration parameter. + * \param[out] value unsigned integer value associated with + * configuration parameter handle. + * + * \retval VMK_BAD_PARAM Invalid handle or there is no unsigned. + * integer value associated with the handle. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ConfigParamGetUint( + vmk_ConfigParamHandle handle, + unsigned *value); +/* + *********************************************************************** + * vmk_ConfigParamGetStringSize -- */ /** + * + * \ingroup Configuration + * \brief Get size of a buffer required to hold string value associated + * with a configuration parameter handle. + * + * \param[in] handle Handle to the configuration parameter. + * \param[out] size Size of the buffer required to hold + * string value (including terminating nul) + * associated with configuration parameter + * handle. + * + * \retval VMK_BAD_PARAM Invalid handle or there is no string value + * associated with the handle + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ConfigParamGetStringSize( + vmk_ConfigParamHandle handle, + vmk_size_t *size); + +/* + *********************************************************************** + * vmk_ConfigParamGetString -- */ /** + * + * \ingroup Configuration + * \brief Get a string value associated with a configuration parameter + * handle. + * + * \param[in] handle Handle to the configuration parameter + * \param[out] value Location for a value associated with + * configuration parameter handle to be + * copied to. + * \param[in] size Size of the buffer in bytes. The buffer + * should have enough room for a terminating + * nul. + * + * \retval VMK_BAD_PARAM Invalid handle or there is no + * string value associated with the + * handle. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ConfigParamGetString( + vmk_ConfigParamHandle handle, + char *value, + vmk_size_t size); + +#endif +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_const.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_const.h new file mode 100644 index 0000000..92ceef7 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_const.h @@ -0,0 +1,72 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Constants */ /** + * \defgroup Constants Constants + * + * Useful constants + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_CONST_H_ +#define _VMKAPI_CONST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#if !defined(NULL) +# ifndef __cplusplus +# define NULL (void *)0 +# else +# define NULL __null +# endif +#endif + +#if defined(VMX86_DEBUG) +# define vmkApiDebug 1 +#else +# define vmkApiDebug 0 +#endif + +/** + * \brief Wrapper for 64 bit signed and unsigned constants + */ +#if defined(__ia64__) || defined(__x86_64__) +#define VMK_CONST64(c) c##L +#define VMK_CONST64U(c) c##UL +#else +#define VMK_CONST64(c) c##LL +#define VMK_CONST64U(c) c##ULL +#endif + +/** Max length of a device name such as 'scsi0' */ +#define VMK_DEVICE_NAME_MAX_LENGTH 32 + +/** Printf format for a 64 bit wide value */ +#if defined(__x86_64__) +#define VMK_FMT64 "l" +#else +#define VMK_FMT64 "L" +#endif + +#define VMK_KILOBYTE (1024) +#define VMK_MEGABYTE (1024 * VMK_KILOBYTE) +#define VMK_GIGABYTE (1024 * VMK_MEGABYTE) +#define VMK_TERABYTE (VMK_CONST64U(1024) * VMK_GIGABYTE) +#define VMK_PETABYTE (VMK_CONST64U(1024) * VMK_TERABYTE) +#define VMK_EXABYTE (VMK_CONST64U(1024) * VMK_PETABYTE) + +#endif /* _VMKAPI_CONST_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_context.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_context.h new file mode 100644 index 0000000..846f07c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_context.h @@ -0,0 +1,118 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Contexts */ /** + * \defgroup Contexts Execution Context Information + * + * There are several types of execution contexts available to run code + * in vmkernel. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_CONTEXT_H_ +#define _VMKAPI_CONTEXT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/** + * \brief Possible execution contexts + */ +typedef enum { + VMK_CONTEXT_TYPE_UNKNOWN=0, + VMK_CONTEXT_TYPE_NMI=1, + VMK_CONTEXT_TYPE_INTERRUPT=2, + VMK_CONTEXT_TYPE_BOTTOM_HALF=3, + VMK_CONTEXT_TYPE_WORLD=4, +} vmk_ContextType; + +/* + *********************************************************************** + * vmk_ContextGetCurrentType -- */ /** + * + * \ingroup Contexts + * \brief Get the current execution context type the caller is + * executing in. + * + * \return The current execution context. + * + *********************************************************************** + */ +vmk_ContextType vmk_ContextGetCurrentType( + void); + +/* + *********************************************************************** + * vmk_ContextGetCurrentType -- */ /** + * + * \ingroup Contexts + * \brief Determine if the current context is an interrupt handler and + * return the interrupt vector being handled. + * + * \return VMK_TRUE if running an interrupt handler. + * \return VMK_FALSE if not running an interrupt handler. + * + *********************************************************************** + */ +vmk_Bool vmk_ContextIsInterruptHandler( + vmk_uint32 *vector); + +/* + *********************************************************************** + * vmk_ContextTypeCanBlock -- */ /** + * + * \ingroup Contexts + * \brief Determine if a particular context type allows blocking calls. + * + * This API only indicates if the given context allows blocking in + * general. It does NOT indicate whether the context \em currently allows + * blocking. For instance, it is forbidden to block while holding + * a spinlock even from a blockable context. If this call were made + * while a spinlock were held, it would return the same value as if + * a spinlock were not held. So it may not be used to determine if + * a context is \em currently blockable. + * + * \param[in] type The context type to check. + * + * \retval VMK_TRUE The supplied context type allows blocking calls. + * \retval VMK_FALSE The supplied context type does not allow + * blocking calls. + * + *********************************************************************** + */ +vmk_Bool vmk_ContextTypeCanBlock( + vmk_ContextType type); + +/* + *********************************************************************** + * vmk_ContextTypeToString -- */ /** + * + * \ingroup Contexts + * \brief Convert a context type to a human-readable string. + * + * \param[in] type The context type to convert to a string. + * + * \return The string corresponding to the context type. + * + *********************************************************************** + */ +const char * vmk_ContextTypeToString( + vmk_ContextType type); + +#endif /* _VMKAPI_CONTEXT_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_cslist.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_cslist.h new file mode 100644 index 0000000..9fef3cd --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_cslist.h @@ -0,0 +1,549 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * CSList */ /** + * \defgroup CSList Counting Singly-Linked List Management + * + * Singly-linked lists with an element counter. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_CSLIST_H_ +#define _VMKAPI_CSLIST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_slist.h" + +/* + * Structure representing the counting singly-linked list. + */ + +typedef struct vmk_CSList { + /** Underlying singly-linked list */ + vmk_SList slist; + + /** Current number of elements in the singly linked list */ + vmk_uint32 numElements; +} vmk_CSList; + +/* + *********************************************************************** + * VMK_CSLIST_FORALL -- */ /** + * + * \ingroup CSList + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member. + * + * \note Expressions that contain side effects aren't valid as + * parameters (example: removal). + * + * \sa VMK_CSLIST_FORALL_SAFE + * + * \param[in] cslist The list to scan. + * \param[in,out] current Loop pointer that is updated with the current + * list member each time through the loop. + * + *********************************************************************** + */ + +#define VMK_CSLIST_FORALL(cslist, current) \ + VMK_SLIST_FORALL(&((cslist)->slist), current) + +/* + *********************************************************************** + * VMK_CSLIST_FORALL_SAFE -- */ /** + * + * \ingroup CSList + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member. + * + * \note This macro can be used when removal of element is needed while + * looping. + * + * \note This macro is pretty inefficient as it maintains 3 pointers + * per iteration and has additional comparisons to do so. In + * case of performance critical loops it is advisable not to use + * it and do the necessary bookkeeping (a subset of this) + * manually. + * + * \sa VMK_CSLIST_FORALL + * + * \param[in] cslist The list to scan. + * \param[in,out] prev Loop pointer that is updated each time through + * the loop with the previous list member. + * \param[in,out] current Loop pointer that is updated each time through + * the loop with the current list member. + * \param[in,out] next Loop pointer that is updated each time through + * the loop with the next list member. + * + *********************************************************************** + */ + +#define VMK_CSLIST_FORALL_SAFE(cslist, prev, current, next) \ + VMK_SLIST_FORALL_SAFE(&((cslist)->slist), prev, current, next) + +/* + *********************************************************************** + * VMK_CSLIST_FORALL_AFTER -- */ /** + * + * \ingroup CSList + * \brief for-loop replacement macro to scan through a list from + * the current to the last list member. + * + * \note Expressions that contain side effects aren't valid as + * parameters (example: removal). + * + * \sa VMK_CSLIST_FORALL + * \sa VMK_CSLIST_FORALL_SAFE + * + * \param[in] cslist The list to scan. + * \param[in,out] current Loop pointer that indicate the element where to + * start and is updated with the current list member + * each time through the loop. + * + *********************************************************************** + */ + +#define VMK_CSLIST_FORALL_AFTER(cslist, current) \ + VMK_SLIST_FORALL_AFTER(&((cslist)->slist), current) + +/* + *********************************************************************** + * vmk_CSListIsEmpty -- */ /** + * + * \ingroup CSList + * \brief Checks whether a list is empty or not. + * + * \param[in] list Target list. + * + * \retval VMK_TRUE The list is empty. + * \retval VMK_FALSE The list is not empty. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_CSListIsEmpty(vmk_CSList *list) +{ + VMK_ASSERT(list); + return list->numElements == 0 ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_CSListFirst -- */ /** + * + * \ingroup CSList + * \brief Returns the first element (head) of a list. + * + * \param[in] list Target list. + * + * \retval NULL The list is empty. + * \return A pointer to the head of the list. + * + *********************************************************************** + */ + +static inline vmk_SList_Links * +vmk_CSListFirst(vmk_CSList *list) +{ + VMK_ASSERT(list); + return vmk_SListFirst(&list->slist); +} + +/* + *********************************************************************** + * vmk_CSListLast -- */ /** + * + * \ingroup CSList + * \brief Returns the last element (tail) of a list. + * + * \param[in] list Target list. + * + * \retval NULL The list is empty. + * \return A pointer to the tail of the list. + * + *********************************************************************** + */ + +static inline vmk_SList_Links * +vmk_CSListLast(vmk_CSList *list) +{ + VMK_ASSERT(list); + return vmk_SListLast(&list->slist); +} + +/* + *********************************************************************** + * vmk_CSListPrev -- */ /** + * + * \ingroup CSList + * \brief Returns the previous element in a list. Runs in O(n). + * + * \param[in] list Target list. + * \param[in] element Element whose previous element is asked for. + * + * \retval NULL We are at the beginning of the list. + * \return A pointer to the previous element. + * + *********************************************************************** + */ + +static inline vmk_SList_Links * +vmk_CSListPrev(vmk_CSList *list, vmk_SList_Links *element) +{ + VMK_ASSERT(list); + return vmk_SListPrev(&list->slist, element); +} + +/* + *********************************************************************** + * vmk_CSListNext -- */ /** + * + * \ingroup CSList + * \brief Returns the following link in a list. + * + * \param[in] element Target list. + * + * \retval NULL We are at the end of the list. + * \return A pointer to the next element. + * + *********************************************************************** + */ + +static inline vmk_SList_Links * +vmk_CSListNext(vmk_SList_Links *element) +{ + return vmk_SListNext(element); +} + +/* + *********************************************************************** + * vmk_CSListInit -- */ /** + * + * \ingroup CSList + * \brief Initializes a list to be an empty list. + * + * \param[in] cslist Target list. + * + *********************************************************************** + */ + +static inline void +vmk_CSListInit(vmk_CSList *cslist) +{ + VMK_ASSERT(cslist); + vmk_SListInit(&cslist->slist); + cslist->numElements = 0; +} + +/* + *********************************************************************** + * vmk_CSListCount -- */ /** + * + * \ingroup CSList + * \brief Returns the number of element in a list. + * + * \param[in] cslist Target list. + * + * \return The number of elements in the list. + * + *********************************************************************** + */ + +static inline vmk_uint32 +vmk_CSListCount(const vmk_CSList *cslist) +{ + VMK_ASSERT(cslist); + return cslist->numElements; +} + +/* + *********************************************************************** + * vmk_CSListPop -- */ /** + * + * \ingroup CSList + * \brief Returns the first element (head) of a list and remove it + * from the list. + * + * \param[in] cslist Target list. + * + * \return A pointer to the head of the list. + * + *********************************************************************** + */ + +static inline vmk_SList_Links * +vmk_CSListPop(vmk_CSList *cslist) +{ + vmk_SList_Links *element; + VMK_ASSERT(cslist); + + element = vmk_SListPop(&cslist->slist); + cslist->numElements--; + return element; +} + +/* + *********************************************************************** + * vmk_CSListInsertAtHead -- */ /** + * + * \ingroup CSList + * \brief Inserts a given element at the beginning of the list. + * + * \param[in] cslist Target list. + * \param[in] element Element to insert. + * + *********************************************************************** + */ + +static inline void +vmk_CSListInsertAtHead(vmk_CSList *cslist, vmk_SList_Links *element) +{ + VMK_ASSERT(cslist); + vmk_SListInsertAtHead(&cslist->slist, element); + cslist->numElements++; +} + +/* + *********************************************************************** + * vmk_CSListInsertAtTail -- */ /** + * + * \ingroup CSList + * \brief Inserts a given element at the end of the list. + * + * \param[in] cslist Target list. + * \param[in] element Element to insert. + * + *********************************************************************** + */ + +static inline void +vmk_CSListInsertAtTail(vmk_CSList *cslist, vmk_SList_Links *element) +{ + VMK_ASSERT(cslist); + vmk_SListInsertAtTail(&cslist->slist, element); + cslist->numElements++; +} + +/* + *********************************************************************** + * vmk_CSListInsertAfter -- */ /** + * + * \ingroup CSList + * \brief Inserts an element after a given element. + * + * \param[in] cslist Target list. + * \param[in] element Element to insert. + * \param[in] after Element to insert the new element after. + * + *********************************************************************** + */ + +static inline void +vmk_CSListInsertAfter(vmk_CSList *cslist, vmk_SList_Links *element, + vmk_SList_Links *after) +{ + VMK_ASSERT(cslist); + vmk_SListInsertAfter(&cslist->slist, element, after); + cslist->numElements++; +} + +/* + *********************************************************************** + * vmk_CSListRemove -- */ /** + * + * \ingroup CSList + * \brief Removes a given element from the list knowing its predecessor + * + * \param[in] cslist Target list. + * \param[in] element Element to remove. + * \param[in] prev Element preceding the element to remove. + * + *********************************************************************** + */ + +static inline void +vmk_CSListRemove(vmk_CSList *cslist, vmk_SList_Links *element, + vmk_SList_Links *prev) +{ + VMK_ASSERT(cslist); + vmk_SListRemove(&cslist->slist, element, prev); + cslist->numElements--; +} + +/* + *********************************************************************** + * vmk_CSListRemoveSlow -- */ /** + * + * \ingroup CSList + * \brief Removes a given element from the list. Runs O(n). + * + * \param[in] cslist Target list. + * \param[in] element Element to remove. + * + *********************************************************************** + */ + +static inline void +vmk_CSListRemoveSlow(vmk_CSList *cslist, vmk_SList_Links *element) +{ + VMK_ASSERT(cslist); + vmk_SListRemoveSlow(&cslist->slist, element); + cslist->numElements--; +} + +/* + *********************************************************************** + * vmk_CSListAppend -- */ /** + * + * \ingroup CSList + * \brief Appends all elements of a list at the end of another. + * + * \note The list appended is initialized to an empty list. + * + * \param[in] cslist1 Target list. + * \param[in] cslist2 List to append. + * + *********************************************************************** + */ + +static inline void +vmk_CSListAppend(vmk_CSList *cslist1, vmk_CSList *cslist2) +{ + VMK_ASSERT(cslist1); + VMK_ASSERT(cslist2); + vmk_SListAppend(&cslist1->slist, &cslist2->slist); + cslist1->numElements += cslist2->numElements; + cslist2->numElements = 0; +} + +/* + *********************************************************************** + * vmk_CSListAppendN -- */ /** + * + * \ingroup CSList + * \brief Appends N elements of a list at the end of another. + * + * \note The list appended is initialized to an empty list. + * + * \param[in] listDest Target list. + * \param[in] listSrc List to append. + * \param[in] num Number of elements to append. + * + *********************************************************************** + */ + +static inline void +vmk_CSListAppendN(vmk_CSList *listDest, vmk_CSList *listSrc, vmk_uint32 num) +{ + VMK_ASSERT(listDest); + VMK_ASSERT(listSrc); + VMK_ASSERT(listSrc->numElements >= num); + + vmk_SListAppendN(&listDest->slist, &listSrc->slist, num); + listDest->numElements += num; + listSrc->numElements -= num; +} + +/* + *********************************************************************** + * vmk_CSListAppend -- */ /** + * + * \ingroup CSList + * \brief Insert all elements of a list at the beginning of another. + * + * \note The list prepended is initialized to an empty list. + * + * \param[in] cslist1 Target list. + * \param[in] cslist2 List to prepend. + * + *********************************************************************** + */ + +static inline void +vmk_CSListPrepend(vmk_CSList *cslist1, vmk_CSList *cslist2) +{ + VMK_ASSERT(cslist1); + VMK_ASSERT(cslist2); + vmk_SListPrepend(&cslist1->slist, &cslist2->slist); + cslist1->numElements += cslist2->numElements; + cslist2->numElements = 0; +} + +/* + *********************************************************************** + * vmk_CSListSplitNHead -- */ /** + * + * \ingroup CSList + * \brief Split a list into two list starting a given element. + * + * \note The second list must be empty. + * + * \param[in] cslist1 Target list, becomes left part of the list. + * \param[in] cslist2 Right part of the list. + * \param[in] n Index of the element where to start + * splitting. + * + *********************************************************************** + */ + +static inline void +vmk_CSListSplitNHead(vmk_CSList *cslist1, vmk_CSList *cslist2, vmk_uint64 n) +{ + vmk_uint32 min; + + VMK_ASSERT(cslist1); + VMK_ASSERT(cslist2); + vmk_SListSplitNHead(&cslist1->slist, &cslist2->slist, n); + min = cslist1->numElements < n ? cslist1->numElements : n; + cslist2->numElements += min; + cslist1->numElements -= min; +} + +/* + *********************************************************************** + * vmk_CSListReplace -- */ /** + * + * \ingroup CSList + * \brief Replace the given entry with a new entry. Runs O(1). + * + * \param[in] list List destination. + * \param[in] targetEntry Entry to replace. + * \param[in] newEntry New entry. + * \param[in] prevEntry Predecessor of the entry to replace. + * + *********************************************************************** + */ + +static inline void +vmk_CSListReplace(vmk_CSList *list, + vmk_SList_Links *targetEntry, + vmk_SList_Links *newEntry, + vmk_SList_Links *prevEntry) +{ + VMK_ASSERT(list); + VMK_ASSERT(targetEntry); + + vmk_SListReplace(&list->slist, targetEntry, newEntry, prevEntry); +} + +#endif +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_entropy.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_entropy.h new file mode 100644 index 0000000..94b37cf --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_entropy.h @@ -0,0 +1,223 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Entropy */ /** + * \defgroup Entropy Entropy + * + * These interfaces to deal with entropy in vmkernel. + * + * Two types of interfaces are provided: + * \li To provide various types of entropy directly to the VMkernel + * and device drivers (as opposed to via reads to /dev/{,u}random). + * \li To allow VMkernel and device drivers to submit hardware entropy. + * + * @{ + *********************************************************************** + */ + + +#ifndef _VMKAPI_ENTROPY_H_ +#define _VMKAPI_ENTROPY_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +typedef enum { + VMK_ENTROPY_HARDWARE_INTERRUPT = 0, + VMK_ENTROPY_HARDWARE_RNG = 1, + VMK_ENTROPY_KEYBOARD = 2, + VMK_ENTROPY_MOUSE = 3, + VMK_ENTROPY_OTHER_HID = 4, + VMK_ENTROPY_STORAGE = 5, + VMK_ENTROPY_SOURCE_LIMIT = VMK_ENTROPY_STORAGE +} vmk_EntropySource; + +typedef enum { + VMK_ENTROPY_HARDWARE = 0, + VMK_ENTROPY_HARDWARE_NON_BLOCKING = 1, + VMK_ENTROPY_SOFTWARE = 2, + VMK_ENTROPY_SOFTWARE_ONLY = 3, + VMK_ENTROPY_TYPE_LIMIT = VMK_ENTROPY_SOFTWARE_ONLY +} vmk_EntropyType; + +/* + *********************************************************************** + * + * Entropy Modules export two types of interfaces: + * + * + * + *********************************************************************** + */ + +/* + *********************************************************************** + * vmk_AddEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Submit hardware entropy to the entropy driveer + * + * vmk_AddEntropyFunctions transfer hardware entropy to an entropy module + * and are guaranteed to be non-blocking and have minimal overhead. + * There is no return status because for security reasons any failure is + * cloaked from all callers who lack privilege to know entropy status + + * \param[in] typeSpecificInfo Source specific info (example: interrupt vector) + * + * \retval none; caller has no need to know success/failure and cannot be told. + * + *********************************************************************** + */ +typedef void (*vmk_AddEntropyFunction)(int sourceSpecificInfo); + +/* + *********************************************************************** + * vmk_GetEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Retrieve entropy from the entropy driveer + * + * vmk_GetEntropyFunctions return various types of entropy: + * VMK_ENTROPY_HARDWARE always returns VMK_OK but may block + * VMK_ENTROPY_HARDWARE_NON_BLOCKING may return VMK_FAILURE but wont block + * VMK_ENTROPY_SOFTWARE always returns VMK_OK and wont block + * VMK_ENTROPY_SOFTWARE_ONLY always returns VMK_OK and wont block + * + * Note: SOFTWARE entropy may include (and thus consume) HARDWARE + * entropy but SOFTWARE_ONLY entropy is guaranteed not to. + * + * \param[in,out] entropy Buffer to store retrieved entropy + * \param[in] bytesRequested Amount of entropy requested + * \param[out] bytesReturned Amount of entropy actually returned + * + * \retval VMK_OK All requested bytes of entropy returned + * \retval VMK_FAILURE Less than all requested bytes of entropy returned + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_GetEntropyFunction)(void *entropy, + int bytesRequested, + int *bytesReturned); + +/* + *********************************************************************** + * vmk_RegisterAddEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Register a function to be used to submit hardware entropy to the + * entropy driver + * + * \param[in] moduleID Module ID of the entropy module + * \param[in] function Function to call when various hardware events occur + * (e.g., hardware interrupts) + * \param[in] source Type of hardware entropy + * + * \retval VMK_OK Add entropy function was sucessfully registered. + * \retval VMK_FAILURE Add entropy function was not registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RegisterAddEntropyFunction( + vmk_ModuleID moduleID, + vmk_AddEntropyFunction function, + vmk_EntropySource source); + +/* + *********************************************************************** + * vmk_RegisterGetEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Register an entropy function to be used to obtain hardware + * or software entropy from an external entropy pool + * + * \param[in] moduleID Module ID of the entropy module + * \param[in] function Function that returns entropy + * \param[in] type Type of entropy (e.g., hardware) + * + * \retval VMK_OK Entropy function was sucessfully registered. + * \retval VMK_FAILURE Entropy function was not registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RegisterGetEntropyFunction( + vmk_ModuleID moduleID, + vmk_GetEntropyFunction function, + vmk_EntropyType type); + +/* + *********************************************************************** + * vmk_GetRegisteredGetEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Get a registered get entropy function to be used to obtain hardware + * or software entropy from an external entropy pool. Note that this + * function must be called with VMKMODCALL + * + * \param[out] *moduleID Module ID of the entropy module providing the function + * \param[out] *function Function that returns entropy + * \param[in] type Type of entropy desired (e.g., hardware) + * + * \retval VMK_OK Entropy function was sucessfully found and returned. + * \retval VMK_FAILURE Entropy function was not found. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_GetRegisteredEntropyFunction( + vmk_ModuleID *moduleID, + vmk_GetEntropyFunction *function, + vmk_EntropyType type); + +/* + *********************************************************************** + * vmk_UnregisterAddEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Unregister a submit entropy function (removes for all sources + * of entropy) + * + * \param[in] moduleID Module ID of the entropy module + * \param[in] function Function to unregister + * + * \retval VMK_OK Add entropy function was sucessfully unregistered. + * \retval VMK_FAILURE Add entropy function was not unregistered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_UnregisterAddEntropyFunction( + vmk_ModuleID moduleID, + vmk_AddEntropyFunction function); + +/* + *********************************************************************** + * vmk_UnregisterGetEntropyFunction -- */ /** + * + * \ingroup Entropy + * \brief Unregister an entropy function (removes for all types of entropy) + * + * \param[in] moduleID Module ID of the entropy module + * \param[in] function Function that returns entropy + * + * \retval VMK_OK Entropy function was sucessfully unregistered. + * \retval VMK_FAILURE Entropy function was not unregistered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_UnregisterGetEntropyFunction( + vmk_ModuleID moduleID, + vmk_GetEntropyFunction function); + +#endif /* _VMKAPI_ENTROPY_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_heap.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_heap.h new file mode 100644 index 0000000..273bd3e --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_heap.h @@ -0,0 +1,412 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Heap */ /** + * \defgroup Heap Heaps + * + * vmkernel has local heaps to help isolate VMKernel subsystems from + * one another. Benefits include: + * \li Makes it easier to track per-subssystem memory consumption, + * enforce a cap on how much memory a given subsystem can allocate, + * locate the origin of memory leaks, ... + * \li Confines most memory corruptions to the guilty subsystem. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_HEAP_H_ +#define _VMKAPI_HEAP_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_status.h" + +#define VMK_INVALID_HEAP_ID NULL + +/** /brief Max length of a heap name, including terminating nul. */ +#define VMK_MAX_HEAP_NAME 32 + +/** /brief Max length of a unique heap name, including terminating nul. */ +#define VMK_MAX_HEAP_UNIQUE_NAME 52 + +typedef struct Heap* vmk_HeapID; + +/** + * \ingroup Heap + * \brief Type of memory the heap will allocate + */ +typedef enum { + /** \brief Allocate memory without any address restrictions */ + VMK_HEAP_ANY_MEM, + + /** + * \brief Allocate memory above 4GB. + * + * Generally used when memory will not be accessed by devices. + */ + VMK_HEAP_HIGH_MEM, + + /** + * \brief Allocate memory below 1GB. + * + * Should be used sparingly, only when absolutely necessary for + * handling a device (never for general purpose use - even in a + * device driver). + */ + VMK_HEAP_1GB_MEM, + + /** + * \brief Allocate memory below 2GB. + * + * Should be used sparingly, only when absolutely necessary for + * handling a device (never for general purpose use - even in a + * device driver). + */ + VMK_HEAP_2GB_MEM, + + /** + * \brief Allocate memory below 4GB. + * + * Typically when needed for device access. + */ + VMK_HEAP_4GB_MEM, +} vmk_HeapMemType; + + +/** + * \brief Physical contiguity of heap memory. + */ +typedef enum { + VMK_HEAP_PHYS_CONTIGUOUS, + VMK_HEAP_PHYS_ANY_CONTIGUITY, + VMK_HEAP_PHYS_DISCONTIGUOUS, +} vmk_HeapPhysType; + + +/** + * \brief Describes characteristics of allocation from a heap. + */ +typedef struct vmk_HeapAllocationDescriptor { + /** \brief The size of the object being allocated. */ + vmk_size_t size; + /** \brief The alignment at which these objects will be allocated. */ + vmk_size_t alignment; + /** \brief The number of objects of this size and alignment being allocated. */ + vmk_uint64 count; +} vmk_HeapAllocationDescriptor; + + +/* + *********************************************************************** + * vmk_HeapCreate -- */ /** + * + * \ingroup Heap + * \brief Create a heap that can grow dynamically up to the max size. + * + * \param[in] name Name associated with this heap. + * \param[in] initial Initial size of the heap in bytes. + * \param[in] max Maximum size of the heap in bytes. This size + * should be based on a value provided by + * vmk_HeapDetermineMaxSize(). + * \param[in] physType Physical contiguity allocated from this heap. + * \param[in] memType Type of memory (low/high/any) allocated from + * this heap. + * \param[out] heapID Newly created heap or VMK_INVALID_HEAP_ID + * on failure. + * + * \retval VMK_NO_MEM The heap could not be allocated + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HeapCreate(char *name, vmk_uint32 initial, vmk_uint32 max, + vmk_HeapPhysType physType, vmk_HeapMemType memType, + vmk_HeapID *heapID); + +/* + *********************************************************************** + * vmk_HeapCreatePkeVisible -- */ /** + * + * \ingroup Heap + * \brief Create a heap that can grow dynamically up to the max size + * and is visible to drivers in PKE domains. + * + * \param[in] name Name associated with this heap. + * \param[in] initial Initial size of the heap in bytes. + * \param[in] max Maximum size of the heap in bytes. This size + * should be based on a value provided by + * vmk_HeapDetermineMaxSize(). + * \param[in] physType Physical contiguity allocated from this heap. + * \param[in] memType Type of memory (low/high/any) allocated from + * this heap. + * \param[out] heapID Newly created heap or VMK_INVALID_HEAP_ID on + * failure. + * + * \retval VMK_NO_MEM The heap could not be allocated + * \retval VMK_OK Heap allocated successfully + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HeapCreatePkeVisible(char *name, vmk_uint32 initial, + vmk_uint32 max, vmk_HeapPhysType physType, + vmk_HeapMemType memType, + vmk_HeapID *heapID); + +/* + *********************************************************************** + * vmk_HeapDestroy -- */ /** + * + * \ingroup Heap + * \brief Destroy a dynamic heap + * + * \param[in] heap Heap to destroy. + * + * \pre All memory allocated on the heap should be freed before the heap + * is destroyed. + * + *********************************************************************** + */ +void vmk_HeapDestroy(vmk_HeapID heap); + +/* + *********************************************************************** + * vmk_HeapFree -- */ /** + * + * \ingroup Heap + * \brief Free memory allocated with vmk_HeapAlloc. + * + * \param[in] heap Heap that memory to be freed was allocated from. + * \param[in] mem Memory to be freed. Should not be NULL. + * + *********************************************************************** + */ +void vmk_HeapFree(vmk_HeapID heap, void *mem); + +/* + *********************************************************************** + * vmk_HeapFreeByMachAddr -- */ /** + * + * \ingroup Heap + * \brief Free memory allocated with vmk_HeapAlloc by machine address. + * + * \param[in] heap Heap that memory to be freed was allocated from. + * \param[in] maddr Machine address of memory to be freed. + * Should not be 0. + * + * \pre The heap given must be a low-memory contiguous heap. + * + *********************************************************************** + */ +void vmk_HeapFreeByMachAddr(vmk_HeapID heap, vmk_MachAddr maddr); + + +/* + *********************************************************************** + * vmk_HeapAllocWithRA -- */ /** + * + * \ingroup Heap + * \brief Allocate memory and specify the caller's address. + * + * This is useful when allocating memory from a wrapper function. + * + * \param[in] heap Heap that memory to be freed was allocated from. + * \param[in] size Number of bytes to allocate. + * \param[in] ra Address to return to. + * + * \retval NULL Cannot allocate 'size' bytes from specified heap. + * \return Address of allocated memory of the specified size. + * + *********************************************************************** + */ +void *vmk_HeapAllocWithRA(vmk_HeapID heap, vmk_uint32 size, void *ra); + +/* + *********************************************************************** + * vmk_HeapAlignWithRA -- */ /** + * + * \ingroup Heap + * \brief Allocate aligned memory and specify the caller's address + * + * This is useful when allocating memory from a wrapper function. + * + * \param[in] heap Heap that memory to be freed was allocated from. + * \param[in] size Number of bytes to allocate. + * \param[in] align Number of bytes the allocation should be aligned + * on. + * \param[in] ra Address to return to after allocation. + * + * \retval NULL Cannot allocate 'size' bytes from specified heap. + * \return Address of allocated memory of the specified size. + * + *********************************************************************** + */ +void *vmk_HeapAlignWithRA(vmk_HeapID heap, vmk_uint32 size, + vmk_uint32 align, void *ra); + +/* + *********************************************************************** + * vmk_HeapAlloc -- */ /** + * + * \ingroup Heap + * \brief Allocate memory in the specified heap + * + * \param[in] heap Heap that memory to be freed was allocated from. + * \param[in] size Number of bytes to allocate. + * + * \retval NULL Cannot allocate 'size' bytes from specified heap. + * \return Address of allocated memory of the specified size. + * + *********************************************************************** + */ +#define vmk_HeapAlloc(heap, size) \ + (vmk_HeapAllocWithRA((heap), (size), __builtin_return_address(0))) + +/* + *********************************************************************** + * vmk_HeapAlign -- */ /** + * + * \ingroup Heap + * \brief Allocate aligned memory + * + * \param[in] heap Heap that memory to be freed was allocated + * from. + * \param[in] size Number of bytes to allocate. + * \param[in] alignment Number of bytes the allocation should be + * aligned on. + * + * \retval NULL Cannot allocate 'size' bytes from specified heap. + * \return Address of allocated memory of the specified size. + * + *********************************************************************** + */ +#define vmk_HeapAlign(heap, size, alignment) \ + (vmk_HeapAlignWithRA((heap), (size), (alignment), __builtin_return_address(0))) + +/* + *********************************************************************** + * vmk_HeapGetUniqueName -- */ /** + * + * \ingroup Heap + * \brief Get unique heap name. + * + * Name will be qualified to be unique kernel wide. + * + * \param[in] heap Heap that caller is interogating. + * \param[out] name Pointer to name string of the given heap. + * \param[in] nameSize Size of name array in bytes including space + * for the terminating nul. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_HeapGetUniqueName(vmk_HeapID heap, char *name, int nameSize); + +/* + *********************************************************************** + * vmk_HeapMaximumSize -- */ /** + * + * \ingroup Heap + * \brief Get the maximum size of the heap. + * + * \param[in] heap Heap that caller is interogating. + * \param[out] size Pointer to the size. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_HeapMaximumSize(vmk_HeapID heap, vmk_size_t *size); + +/* + *********************************************************************** + * vmk_HeapGetProperties -- */ /** + * + * \ingroup Heap + * \brief Get the memory allocation properties of the heap + * + * \param[in] heap Heap that caller is interogating. + * \param[out] physType Physical contiguity allocated from this heap. + * \param[out] memType Type of memory (low/high/any) allocated from + * this heap. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_HeapGetProperties(vmk_HeapID heap, vmk_HeapPhysType *physType, + vmk_HeapMemType *memType); + +/* + *********************************************************************** + * vmk_HeapMA2VA -- */ /** + * + * \ingroup Heap + * \brief Converts the MA mapped for a heap to its VA. + * + * \param[in] heap The heap whose cache that should be searched, + * or INVALID HEAP_ID to iterate over all heaps + * with caches. + * \param[in] cacheOnly If TRUE, this will only search the cache and + * not perform the more costly XMap search to + * update the cache. + * \param[in] machAddr Machine address to find virtual address of. + * \param[out] virtAddr Virtual address mapped to the machine address. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_HeapMA2VA(vmk_HeapID heap, vmk_Bool cacheOnly, + vmk_MachAddr machAddr, vmk_VirtAddr *virtAddr); + +/* + *********************************************************************** + * vmk_HeapDetermineMaxSize -- */ /** + * + * \ingroup Heap + * \brief Determines the required maximum size of a heap in bytes. + * + * Determines the required maximum size of a heap that will contain + * the descriptors described in the descriptors aray. Note that this + * does not include overhead for fragmentation within the heap and it + * is the caller's responsibility to add that in when creating the heap. + * + * \param[in] descriptors Pointer to an array of descriptors that + * the heap will contain. An alignment of + * zero for a descriptor indicates no + * alignment is specified by the caller and + * the heap code will use a value it + * determines. + * \param[in] numDescriptors Number of vmk_HeapAllocationDescriptors + * in the array pointed to by descriptors. + * \param[out] maxSize The determined maximum size. + * + * \retval VMK_OK Size determined successfully and placed + * in maxSize. + * \retval VMK_BAD_PARAM One of the arguments is invalid, or one + * of the descriptors contains an invalid + * value. + * \retval VMK_LIMIT_EXCEEDED The total size required for the + * provided descriptors results in a heap + * greater than the largest possible + * allowed. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_HeapDetermineMaxSize(vmk_HeapAllocationDescriptor *descriptors, + vmk_uint64 numDescriptors, + vmk_size_t *maxSize); + +#endif /* _VMKAPI_HEAP_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_helper.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_helper.h new file mode 100644 index 0000000..b47ebd8 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_helper.h @@ -0,0 +1,422 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * HelperWorlds */ /** + * \defgroup HelperWorlds Helper Worlds + * + * Helper Worlds are a mechanism that allows work to be queued and + * run by a dynamically managed pool of worlds. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_HELPER_WORLDS_H_ +#define _VMKAPI_HELPER_WORLDS_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_world.h" + +/** Maximum length of a helper name, including the trailing nul */ +#define VMK_HELPER_NAME_MAX 32 + +/** Invalid helper ID */ +#define VMK_HELPER_INVALID_ID ((vmk_Helper)-1) + +/** Use default request properties */ +#define VMK_HELPER_DEFAULT_REQ_PROPS ((const vmk_HelperRequestProps *)NULL) + +/* Opaque helper definition */ +typedef vmk_uintptr_t vmk_Helper; + +/* + *********************************************************************** + * vmk_HelperTagComparator -- */ /** + * + * \ingroup HelperWorlds + * \brief Compare two request tags to see if they are equal + * + * This function is used to find a request or set of requests based + * on their tag, such as during cancellation. + * + * \note This function must not block. + * + * \param[in] tag1 First tag to compare. + * \param[in] tag2 Second tag to compare. + * + * \retval VMK_TRUE The tags match. + * \retval VMK_FALSE The tags do not match. + * + *********************************************************************** + */ +typedef vmk_Bool (*vmk_HelperTagComparator)(vmk_AddrCookie tag1, + vmk_AddrCookie tag2); + +/* + *********************************************************************** + * vmk_HelperConstructor -- */ /** + * + * \ingroup HelperWorlds + * \brief Function invoked when a new helper world is spawned. + * + * \param[in] arg Constructor argument that was stored in the helper + * queue's properties. + * + *********************************************************************** + */ +typedef void (*vmk_HelperConstructor)(vmk_AddrCookie arg); + +/* + *********************************************************************** + * vmk_HelperCancelFunc -- */ /** + * + * \ingroup HelperWorlds + * \brief Function invoked when a request is canceled. + * + * \param[in] data Data that was passed in with the request. + * + *********************************************************************** + */ +typedef void (*vmk_HelperCancelFunc)(vmk_AddrCookie data); + +/* + *********************************************************************** + * vmk_HelperRequestFunc -- */ /** + * + * \ingroup HelperWorlds + * \brief Function invoked when a request is processed + * + * \param[in] data Data that was passed in with the request. + * + *********************************************************************** + */ +typedef void (*vmk_HelperRequestFunc)(vmk_AddrCookie data); + +/** + * \brief Properties for a helper queue that may be updated + * after it is created. + */ +typedef struct vmk_HelperMutableProps +{ + /** + * Minimum number of worlds that will continue to exist to serve + * the helper queue. + * + * Setting this to a value less than the value of maxWorlds indicates + * that the helper queue can dynamically create and destroy worlds for + * the helper queue but will always maintain at least the specified + * number of worlds in the queue. + * + * Setting this to -1 or the same value as maxWorlds indicates that + * the caller does not want helper worlds to exit and does not want + * the pool of worlds to shrink dynamically. + */ + vmk_int32 minWorlds; + + /** + * Maximum number of worlds that will service the helper queue. + * + * Setting this to 0 or less indicates that the helper queue should + * use the default number of worlds to service the helper queue. + * + * Setting this to 1 or more indicates that the helper queue should + * use the specified number of worlds as the maximum number of worlds + * that can back the queue. + */ + vmk_int32 maxWorlds; + + /** + * Maximum number of milliseconds a world backing the helper + * queue can be idle before it is retired. + * + * Setting this to 0 or less indicates that the default idle time + * should be used. + * + * Setting this to 1 or more indiciates that if a world in the pool + * backing the helper queue has been idle for the specified number + * of milliseconds it will be retired. + */ + vmk_int32 maxIdleTime; + + /** + * Maximum number of milliseconds a request can wait in the + * queue before a new world will be created to service the request. + * + * Setting this to 0 or less indiciates that the helper queue should + * use the default time. + * + * Setting this to 1 or more indicates that after the specified number + * of milliseconds a new world will be added to the pool of worlds + * backing the helper queue. + * + * \note The specified maximum number of worlds will not be + * exceeded even if a request has been waiting longer + * than the specified time. + */ + vmk_int32 maxRequestBlockTime; +} +vmk_HelperMutableProps; + +/** + * \brief Properties for a new helper queue + */ +typedef struct +{ + /** Human readable name for the helper queue */ + char name[VMK_HELPER_NAME_MAX]; + + /** A heap the helper can use for allocations */ + vmk_HeapID heap; + + /** + * Should an IRQ spinlock should be used when synchronizing + * between producers and consumers of the helper queue? + */ + vmk_Bool useIrqSpinlock; + + /** + * Should all memory for requests be preallocated when + * the helper queue is created? + */ + vmk_Bool preallocRequests; + + /** + * Can callers block when submitting requests? + * Callers can override this setting on a per-call basis. + */ + vmk_Bool blockingSubmit; + + /** + * Maximum number of requests this queue can support + */ + vmk_uint32 maxRequests; + + /** + * Initial setting for properties which may be updated after + * the helper queue is created. + */ + vmk_HelperMutableProps mutables; + + /** + * Function to compare two tags that identify requests + * + * Can be set to NULL if no function is desired. + */ + vmk_HelperTagComparator tagCompare; + + /** + * Function to call when a new world is added to the + * pool of worlds backing the helper queue. + * + * This function will run in the context of the + * new world. + * + * This function will be called before running + * any helper requests on the new world. + * + * This can be set to NULL if no function is desired. + */ + vmk_HelperConstructor constructor; + + /** Data to pass to the constructor function */ + vmk_AddrCookie constructorArg; +} +vmk_HelperProps; + +/** + * \brief Properties for a helper request + */ +typedef struct vmk_HelperRequestProps { + /** Should the submission of this request block the caller? */ + vmk_Bool requestMayBlock; + + /** + * A caller-supplied tag to identify the request. + * + * This tag is used to identify the request for calls + * such as vmk_HelperCancelRequest(). + */ + vmk_AddrCookie tag; + + /** + * An optional function to call after a request is canceled + * to perform cleanup. + * + * May be set to NULL if no function is required. + * + * This field cannot be set if the tag field is set to zero. + */ + vmk_HelperCancelFunc cancelFunc; + + /** + * World to which to bill helper work or VMK_INVALID_WORLD_ID + * if there is no world to bill. + */ + vmk_WorldID worldToBill; +} vmk_HelperRequestProps; + +/* + *********************************************************************** + * vmk_HelperCreate -- */ /** + * + * \ingroup HelperWorlds + * \brief Create a new helper world queue. + * + * \param[in] props Creation properties for the new helper queue. + * \param[out] helper The newly created helper queue. + * + * + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperCreate(vmk_HelperProps *props, + vmk_Helper *helper); + +/* + *********************************************************************** + * vmk_HelperDestroy -- */ /** + * + * \ingroup HelperWorlds + * \brief Destroy an existing helper world queue. + * + * \param[in] helper Helper queue to destroy. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperDestroy(vmk_Helper helper); + +/* + *********************************************************************** + * vmk_HelperUpdateProps -- */ /** + * + * \ingroup HelperWorlds + * \brief Update the mutable properties on an existing helper queue. + * + * \param[in] helper Helper queue to destroy. + * \param[in] props New properties for the helper queue. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperUpdateProps(vmk_Helper helper, + const vmk_HelperMutableProps *props); + +/* + *********************************************************************** + * vmk_HelperRequestPropsInit -- */ /** + * + * \ingroup HelperWorlds + * \brief Initialize a vmk_HelperRequestProps structure. + * + * The resulting structure will have all properties set to their default. + * + * \param[in] props Pointer to the parameters to initialize. + * + * \retval VMK_INVALID_NAME Name for the helper queue is too long + * + *********************************************************************** + */ +void vmk_HelperRequestPropsInit(vmk_HelperRequestProps *props); + +/* + *********************************************************************** + * vmk_HelperSubmitRequest -- */ /** + * + * \ingroup HelperWorlds + * \brief Submit a request to a helper world queue to be executed later + * + * \param[in] helper Helper queue to send the request to. + * \param[in] requestFunc Function to execute + * \param[in] data Data to pass to the function that will be + * executed. + * \param[in] props Properties of this request submission or + * VMK_HELPER_DEFAULT_PARAMS if the default + * parameters are desired. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperSubmitRequest(vmk_Helper helper, + vmk_HelperRequestFunc requestFunc, + vmk_AddrCookie *data, + const vmk_HelperRequestProps *props); + +/* + *********************************************************************** + * vmk_HelperSubmitDelayedRequest -- */ /** + * + * \ingroup HelperWorlds + * \brief Submit a request to a helper world queue to be executed only + * after a specified amount of time. + * + * \param[in] helper Helper queue to send the request to. + * \param[in] requestFunc Function to execute + * \param[in] data Data to pass to the function that will be + * executed. + * \param[in] props Properties of this request submission or + * VMK_HELPER_DEFAULT_PARAMS if the default + * parameters are desired. + * \param[in] timeoutMS Timeout in millseconds after which the function + * would be executed by the helper. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperSubmitDelayedRequest(vmk_Helper helper, + vmk_HelperRequestFunc requestFunc, + vmk_AddrCookie *data, + vmk_uint32 timeoutMS, + const vmk_HelperRequestProps *props); + +/* + *********************************************************************** + * vmk_HelperCancelRequest -- */ /** + * + * \ingroup HelperWorlds + * \brief Cancel requests on the queue that have the specified tag. + * + * \param[in] helper Helper queue on which to issue the cancel. + * \param[in] requestTag Tag used to identify which requests to + * cancel. + * \param[out] numCancelled Number of requests that were actually + * cancelled. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_HelperCancelRequest(vmk_Helper helper, + vmk_AddrCookie requestTag, + vmk_uint32 *numCancelled); + +/* + *********************************************************************** + * vmk_HelperCurrentRequestCount -- */ /** + * + * \ingroup HelperWorlds + * \brief Get a snapshot of the current number of pending requests on + * a helper queue. + * + * \note The count returned by this function does not include the + * count of requests that are actively being processed. + * + * \param[in] helper Helper queue to check. + * + * \return The number of pending requests on the helper queue. + * + *********************************************************************** + */ +vmk_uint32 vmk_HelperCurrentRequestCount(vmk_Helper helper); + +#endif /* _VMKAPI_HELPER_WORLDS_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_libc.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_libc.h new file mode 100644 index 0000000..620fa0c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_libc.h @@ -0,0 +1,548 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * LibC */ /** + * \defgroup LibC C-Library-Style Interfaces + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_LIBC_H_ +#define _VMKAPI_LIBC_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_compiler.h" + +#include + +/* + *********************************************************************** + * vmk_Strnlen -- */ /** + * + * \ingroup LibC + * \brief Determine the length of a string up to a maximum number + * of bytes. + * + * \param[in] src String whose length is to be determined. + * \param[in] maxLen Maximum number of bytes to check. + * + * \return Length of the string in bytes. + * + *********************************************************************** + */ +vmk_size_t vmk_Strnlen ( + const char *src, + vmk_size_t maxLen); + +/* + *********************************************************************** + * vmk_Strcpy -- */ /** + * + * \ingroup LibC + * \brief Copy a string. + * + * \param[out] dst String to copy to. + * \param[in] src String to copy from. + * + * \return Pointer to src. + * + *********************************************************************** + */ +char *vmk_Strcpy( + char *dst, + const char *src); + +/* + *********************************************************************** + * vmk_Strncpy -- */ /** + * + * \ingroup LibC + * \brief Copy a string up to a maximum number of bytes. + * + * \param[out] dst String to copy to. + * \param[in] src String to copy from. + * \param[in] maxLen Maximum number of bytes to copy into dst. + * + * \warning A copied string is not automatically nul-terminated. + * Users should take care to ensure that the destination + * is large enough to hold the string and the nul-terminator. + * + * \return Pointer src. + * + *********************************************************************** + */ +char *vmk_Strncpy( + char *dst, + const char *src, + vmk_size_t maxLen); + +/* + *********************************************************************** + * vmk_Strlcpy -- */ /** + * + * \ingroup LibC + * \brief Copy a string and ensure nul termination. + * + * \param[out] dst String to copy to. + * \param[in] src String to copy from. + * \param[in] size Maximum number of bytes to store a string in dst. + * + * \note At most size-1 characters will be copied. All copies will + * be terminated with a nul unless size is set to zero. + * + * \return The length of src. If the return value is greater than + * or equal to size, then truncation has occured during + * the copy. + * + *********************************************************************** + */ +vmk_size_t vmk_Strlcpy( + char *dst, + const char *src, + vmk_size_t size); + +/* + *********************************************************************** + * vmk_Strcmp -- */ /** + * + * \ingroup LibC + * \brief Compare two strings. + * + * \param[in] src1 First string to compare. + * \param[in] src2 Second string to compare. + * + * \return A value greater than, less than or equal to 0 depending on + * the lexicographical difference between the strings. + * + *********************************************************************** + */ +int vmk_Strcmp( + const char *src1, + const char *src2); + +/* + *********************************************************************** + * vmk_Strncmp -- */ /** + * + * \ingroup LibC + * \brief Compare two strings up to a maximum number of bytes. + * + * \param[in] src1 First string to compare. + * \param[in] src2 Second string to compare. + * \param[in] maxLen Maximum number of bytes to compare. + * + * \return A value greater than, less than or equal to 0 depending on + * the lexicographical difference between the strings. + * + *********************************************************************** + */ +int vmk_Strncmp( + const char *src1, + const char *src2, + vmk_size_t maxLen); + +/* + *********************************************************************** + * vmk_Strncasecmp -- */ /** + * + * \ingroup LibC + * \brief Compare two strings while disregarding case. + * + * \param[in] src1 First string to compare. + * \param[in] src2 Second string to compare. + * \param[in] maxLen Maximum number of bytes to compare. + * + * \return A value greater than, less than or equal to 0 depending on + * the lexicographical difference between the strings as if + * all characters in the string are lower-case. + * + *********************************************************************** + */ +int vmk_Strncasecmp( + const char *src1, + const char *src2, + vmk_size_t maxLen); + +/* + *********************************************************************** + * vmk_Strchr -- */ /** + * + * \ingroup LibC + * \brief Forward search through a string for a character. + * + * \param[in] src String to search forward. + * \param[in] c Character to search for. + * + * \return Pointer to the offset in src where c was found or NULL + * if c was not found in src. + * + *********************************************************************** + */ +char *vmk_Strchr( + const void *src, + int c); + +/* + *********************************************************************** + * vmk_Strrchr -- */ /** + * + * \ingroup LibC + * \brief Reverse search through a string for a character. + * + * \param[in] src String to search backward. + * \param[in] c Character to search for. + * + * \return Pointer to the offset in src where c was found or NULL + * if c was not found in src. + * + *********************************************************************** + */ +char *vmk_Strrchr( + const void *src, + int c); + +/* + *********************************************************************** + * vmk_Strstr -- */ /** + * + * \ingroup LibC + * \brief Search for a substring in a string. + * + * \param[in] s1 String to search. + * \param[in] s2 String to search for. + * + * \return Pointer to the offset in s1 where s2 was found or NULL + * if s2 was not found in s1. + * + *********************************************************************** + */ +char *vmk_Strstr( + const void *s1, + const void *s2); + +/* + *********************************************************************** + * vmk_Strtol -- */ /** + * + * \ingroup LibC + * \brief Convert a string to a signed long integer. + * + * \param[in] str String to convert + * \param[out] end If non-NULL, the address of the first invalid + * character or the value of str if there are no + * digits in the string. + * \param[in] base Base of the number being converted which may be + * between 2 and 36, or 0 may be supplied such + * that strtol will attempt to detect the base + * of the number in the string. + * + * \return Numeric value of the string. + * + *********************************************************************** + */ +long vmk_Strtol( + const char *str, + char **end, + int base); + +/* + *********************************************************************** + * vmk_Strtoul -- */ /** + * + * \ingroup LibC + * \brief Convert a string to an unsigned long integer. + * + * \param[in] str String to convert + * \param[out] end If non-NULL, the address of the first invalid + * character or the value of str if there are no + * digits in the string. + * \param[in] base Base of the number being converted which may be + * between 2 and 36, or 0 may be supplied such + * that strtoul will attempt to detect the base + * of the number in the string. + * + * \return Numeric value of the string. + * + *********************************************************************** + */ +unsigned long vmk_Strtoul( + const char *str, + char **end, + int base); + +/* + *********************************************************************** + * vmk_Sprintf -- */ /** + * + * \ingroup LibC + * \brief Formatted print to a string. + * + * \param[in] str Buffer in which to place output. + * \param[in] format Printf-style format string. + * + * \return Number of characters output. + * + *********************************************************************** + */ +int vmk_Sprintf( + char *str, + const char *format, + ...) +VMK_ATTRIBUTE_PRINTF(2,3); + +/* + *********************************************************************** + * vmk_Snprintf -- */ /** + * + * \ingroup LibC + * \brief Formatted print to a string with a maximum bound. + * + * \param[in] str Buffer in which to place output. + * \param[in] size Maximum number of bytes to output. + * \param[in] format Printf-style format string. + * + * \return Number of characters output. + * + *********************************************************************** + */ +int vmk_Snprintf( + char *str, + vmk_size_t size, + const char *format, + ...) +VMK_ATTRIBUTE_PRINTF(3,4); + + +/* + *********************************************************************** + * vmk_Vsprintf -- */ /** + * + * \ingroup LibC + * \brief Formatted print to a string using varargs. + * + * \param[in] str Buffer in which to place output. + * \param[in] format Printf-style format string. + * \param[in] ap Varargs for format. + * + * \return Number of characters output. + * + *********************************************************************** + */ +int +vmk_Vsprintf( + char *str, + const char *format, + va_list ap); + +/* + *********************************************************************** + * vmk_Vsnprintf -- */ /** + * + * \ingroup LibC + * \brief Formatted print to a string with a maixmum bound using varargs. + * + * \param[in] str Buffer in which to place output. + * \param[in] size Maximum number of bytes to output. + * \param[in] format Printf-style format string. + * \param[in] ap Varargs for format. + * + * \return Number of characters output. + * + *********************************************************************** + */ +int +vmk_Vsnprintf( + char *str, + vmk_size_t size, + const char *format, + va_list ap); + +/* + *********************************************************************** + * vmk_Vsscanf -- */ /** + * + * \ingroup LibC + * \brief Formatted scan of a string using varargs. + * + * \param[in] inp Buffer to scan. + * \param[in] fmt0 Scanf-style format string. + * \param[in] ap Varargs that hold input values for format. + * + * \return Number of input values assigned. + * + *********************************************************************** + */ +int +vmk_Vsscanf( + const char *inp, + char const *fmt0, + va_list ap); + +/* + *********************************************************************** + * vmk_Sscanf -- */ /** + * + * \ingroup LibC + * \brief Formatted scan of a string. + * + * \param[in] ibuf Buffer to scan. + * \param[in] fmt Scanf-style format string. + * + * \return Number of input values assigned. + * + *********************************************************************** + */ +int +vmk_Sscanf( + const char *ibuf, + const char *fmt, + ...) +VMK_ATTRIBUTE_SCANF(2, 3); + +/* + *********************************************************************** + * vmk_Memset -- */ /** + * + * \ingroup LibC + * \brief Set bytes in a buffer to a particular value. + * + * \param[in] dst Destination buffer to set. + * \param[in] byte Value to set each byte to. + * \param[in] len Number of bytes to set. + * + * \return Original value of dst. + * + *********************************************************************** + */ +void *vmk_Memset( + void *dst, + int byte, + vmk_size_t len); + +/* + *********************************************************************** + * vmk_Memcpy -- */ /** + * + * \ingroup LibC + * \brief Copy bytes from one buffer to another. + * + * \param[in] dst Destination buffer to copy to. + * \param[in] src Source buffer to copy from. + * \param[in] len Number of bytes to copy. + * + * \return Original value of dst. + * + *********************************************************************** + */ +void *vmk_Memcpy( + void *dst, + const void *src, + vmk_size_t len); + +/* + *********************************************************************** + * vmk_Memcmp -- */ /** + * + * \ingroup LibC + * \brief Compare bytes between two buffers. + * + * \param[in] src1 Buffer to compare. + * \param[in] src2 Other buffer to compare. + * \param[in] len Number of bytes to compare. + * + * \return Difference between the first two differing bytes or + * zero if the buffers are identical over the specified length. + * + *********************************************************************** + */ +int vmk_Memcmp( + const void *src1, + const void *src2, + vmk_size_t len); + +/* + *********************************************************************** + * vmk_Rand -- */ /** + * + * \ingroup LibC + * \brief Generate the next number in a pseudorandom sequence. + * + * \warning This function's pseudorandom numbers do not have high + * enough quality for cryptographic purposes. + * + * \note The values returned are in the range 0 < n <= 0x7fffffff, + * and the seed supplied must also be in this range. + * + * \param[in] seed The previous number in the sequence, if any. To + * start a new sequence at a random point, call + * vmk_GetRandSeed to get the initial seed. To + * start a new sequence at a deterministic point, + * choose any fixed value in range for the initial + * seed. + * + * \return A pseudorandom number. + * + *********************************************************************** + */ +vmk_uint32 vmk_Rand( + vmk_uint32 seed); + +/* + *********************************************************************** + * vmk_GetRandSeed -- */ /** + * + * \ingroup LibC + * \brief Generate a random initial seed for vmk_Rand() + * + * \warning This function should be called only occasionally, to start + * a sequence of pseudorandom numbers generated by + * vmk_Rand(). Attempting to use this function frequently to + * generate individual random numbers will result in values + * with very poor randomness. Even when this function is + * called only occasionally, its random numbers do not have + * high enough quality for cryptographic purposes. + * + * \return A random seed value suitable to start a new pseudorandom + * sequence. + * + *********************************************************************** + */ +vmk_uint32 +vmk_GetRandSeed( + void); + +/* + *********************************************************************** + * vmk_IsPrint -- */ /** + * + * \ingroup LibC + * \brief Determine if a character is printable. + * + * \param[in] c Character to check. + * + * \retval VMK_TRUE Supplied character is printable. + * \retval VMK_FALSE Supplied character is not printable. + * + *********************************************************************** + */ +vmk_Bool +vmk_IsPrint( + int c); + +#endif /* _VMKAPI_LIBC_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_list.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_list.h new file mode 100644 index 0000000..20cf976 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_list.h @@ -0,0 +1,765 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * list.h -- + * + * Structures, macros, and routines exported by the List module. + * + * Copyright (C) 1985, 1988 Regents of the University of California + * Permission to use, copy, modify, and distribute this + * software and its documentation for any purpose and without + * fee is hereby granted, provided that the above copyright + * notice appear in all copies. The University of California + * makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without + * express or implied warranty. + * + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * List */ /** + * \defgroup List Doubly-Linked Lists + * + * The following are interfaces for a list abstraction which enables + * arbitrary data structures to be linked together into a doubly-linked + * circular list. + * + * A list is composed of a sentinel header and its real members, if any. + * Thus, an empty list consists of a single header element whose nextPtr + * and prevPtr fields point to itself. + * + * The links are contained in a two-element structure called vmk_ListLinks. + * A list joins vmk_ListLinks records (that is, each vmk_ListLinks structure + * points to other vmk_ListLinks structures), but if the vmk_ListLinks is the + * first field within a larger structure, then the larger structures are + * effectively linked together as follows: + * + * \code + * header + * (vmk_ListLinks) First element Second Element + * ----------------- ------------------ ----------------- + * ..-> | nextPtr | ----> | vmk_ListLinks | ----> | vmk_ListLinks | ----.. + * | - - - - - - - | | | | | + * ..-- | prevPtr | <---- | | <---- | | <---.. + * ----------------- - --- --- --- - - --- --- --- - + * | rest of | | rest of | + * | structure | | structure | + * | | | | + * | ... | | ... | + * ----------------- ----------------- + * \endcode + * + * It is possible to link structures through vmk_ListLinks fields that are + * not at the beginning of the larger structure, but it is then necessary + * to use VMK_LIST_ENTRY to extract the surrounding structure from + * the list element. + * + * \par A typical structure might be something like: + * + * \code + * typedef struct { + * vmk_ListLinks links; + * char ch; + * integer flags; + * } Example; + * \endcode + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_LIST_H_ +#define _VMKAPI_LIST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_assert.h" + +/** + * \brief List links container. + */ +typedef struct vmk_ListLinks { + struct vmk_ListLinks *prevPtr; + struct vmk_ListLinks *nextPtr; +} vmk_ListLinks; + + +/* + *********************************************************************** + * VMK_LIST_ENTRY -- */ /** + * + * \ingroup List + * \brief Get a pointer to the structure containing a given list + * element. + * + * \param[in] itemPtr List element that is contained by + * another structure. + * \param[in] containerType C type of the container. + * \param[in] fieldInContainer Name of the structure field in the + * container that itemPtr is pointing to. + * + * This macro allows a list pointer embedded in a structure to be + * somwhere other than the initial item in the structure. + * + * \par Example: + * \code + * typedef struct + * { + * int a; + * vmk_ListLinks links; + * int b; + * } + * myType; + * + * myType example; + * myType *ptr; + * vmk_ListLinks *listElem; + * + * listElem = &(example.links); + * ptr = VMK_LIST_ENTRY(listElem, myType, links); + * \endcode + * "ptr" should now point at "example" + * + *********************************************************************** + */ +#define VMK_LIST_ENTRY(itemPtr, containerType, fieldInContainer) \ + ((containerType *) ((vmk_uint8 *) (itemPtr) - \ + ((vmk_size_t) &((containerType *)0)->fieldInContainer))) + +/* + *********************************************************************** + * vmk_ListInit -- */ /** + * + * \ingroup List + * \brief Initialize a header pointer to point to an empty list. + * + * \param[in] headerPtr List header to initialize. + * + *********************************************************************** + */ +static inline void +vmk_ListInit(vmk_ListLinks *headerPtr) +{ + VMK_ASSERT(headerPtr != NULL); + headerPtr->nextPtr = headerPtr; + headerPtr->prevPtr = headerPtr; +} + +/* + *********************************************************************** + * vmk_ListInitElement -- */ /** + * + * \ingroup List + * \brief Initialize a list element. + * + * \param[in] elementPtr List element to initialize. + * + *********************************************************************** + */ +static inline void +vmk_ListInitElement(vmk_ListLinks *elementPtr) +{ + elementPtr->prevPtr = (vmk_ListLinks *) NULL; + elementPtr->nextPtr = (vmk_ListLinks *) NULL; +} + + +/* + *********************************************************************** + * vmk_ListIsUnlinkedElement -- */ /** + * + * \ingroup List + * \brief Check whether a given element is part of a list or not. + * + * \param[in] elementPtr List element to check. + * + * \retval VMK_TRUE The element is not in a list. + * \retval VMK_FALSE The element is linked into a list. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ListIsUnlinkedElement(vmk_ListLinks *elementPtr) +{ + return (elementPtr->prevPtr == (vmk_ListLinks *) NULL && + elementPtr->nextPtr == (vmk_ListLinks *) NULL); +} + + +/* + *********************************************************************** + * VMK_LIST_FORALL -- */ /** + * + * \ingroup List + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member. + * + * \param[in] headerPtr The list to scan + * \param[out] itemPtr Loop pointer that is updated with the current + * list member each time through the loop. + * + * \note This macro does not tolerate the removal of itemPtr from + * the list during the loop. + * + * \sa VMK_LIST_FORALL_SAFE + * + *********************************************************************** + */ +#define VMK_LIST_FORALL(headerPtr, itemPtr) \ + for (itemPtr = vmk_ListFirst(headerPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = vmk_ListNext(itemPtr)) + + +/* + *********************************************************************** + * VMK_LIST_FORALL_REVERSE -- */ /** + * + * \ingroup List + * \brief for-loop replacement macro to scan through a list from + * the last to the first list member. + * + * \param[in] headerPtr The list to scan + * \param[out] itemPtr Loop pointer that is updated with the current + * list member each time through the loop. + * + * \note This macro does not tolerate the removal of itemPtr from + * the list during the loop. + * + * \sa VMK_LIST_FORALL_REVERSE_SAFE + * + *********************************************************************** + */ +#define VMK_LIST_FORALL_REVERSE(headerPtr, itemPtr) \ + for (itemPtr = vmk_ListLast(headerPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = vmk_ListPrev(itemPtr)) + + +/* + *********************************************************************** + * VMK_LIST_FORALL_SAFE -- */ /** + * + * \ingroup List + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member. + * + * \param[in] headerPtr The list to scan. + * \param[out] itemPtr Loop pointer that is updated each time + * through the loop with the current list member. + * \param[out] nextPtr Loop pointer that is updated each time + * through the loop with the next list member. + * + * \note This macro should be used if itemPtr must be removed from + * the list during the loop. + * + *********************************************************************** + */ +#define VMK_LIST_FORALL_SAFE(headerPtr, itemPtr, nextPtr) \ + for (itemPtr = vmk_ListFirst(headerPtr), nextPtr = vmk_ListNext(itemPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = nextPtr, nextPtr = vmk_ListNext(nextPtr)) + + +/* + *********************************************************************** + * VMK_LIST_FORALL_REVERSE_SAFE -- */ /** + * + * \ingroup List + * \brief for-loop replacement macro to scan through a list from + * the last to the first list member. + * + * \param[in] headerPtr The list to scan. + * \param[out] itemPtr Loop pointer that is updated each time + * through the loop with the current list member. + * \param[out] prevPtr Loop pointer that is updated each time + * through the loop with the next list member. + * + * \note This macro should be used if itemPtr must be removed from + * the list during the loop. + * + *********************************************************************** + */ +#define VMK_LIST_FORALL_REVERSE_SAFE(headerPtr, itemPtr, prevPtr) \ + for (itemPtr = vmk_ListLast(headerPtr), prevPtr = vmk_ListPrev(itemPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = prevPtr, prevPtr = vmk_ListPrev(prevPtr)) + + +/* + *********************************************************************** + * VMK_LIST_ITER -- */ /** + * + * \ingroup List + * \brief while-loop replacement macro to scan through a list from + * a given list member to the last list member. + * + * \param[in] headerPtr The list to scan. + * \param[in,out] itemPtr The first list member to scan. This pointer + * is also updated with the current list member + * each time through the loop. + * + * \note This macro does not tolerate the removal of itemPtr from the + * list during the loop. + * + * \sa VMK_LIST_ITER_SAFE + * + *********************************************************************** + */ +#define VMK_LIST_ITER(headerPtr, itemPtr) \ + for (; \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = vmk_ListNext(itemPtr)) + + +/* + *********************************************************************** + * VMK_LIST_ITER_REVERSE -- */ /** + * + * \ingroup List + * \brief while-loop replacement macro to scan through a list from + * a given list member to the first list member. + * + * \param[in] headerPtr The list to scan. + * \param[in,out] itemPtr The first list member to scan. This pointer + * is also updated with the current list member + * each time through the loop. + * + * \note This macro does not tolerate the removal of itemPtr from the + * list during the loop. + * + * \sa VMK_LIST_ITER_REVERSE_SAFE + * + *********************************************************************** + */ +#define VMK_LIST_ITER_REVERSE(headerPtr, itemPtr) \ + for (; \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = vmk_ListPrev(itemPtr)) + + +/* + *********************************************************************** + * VMK_LIST_ITER_SAFE -- */ /** + * + * \ingroup List + * \brief while-loop replacement macro to scan through a list from + * a given list member to the last list member. + * + * \param[in] headerPtr The list to scan. + * \param[in,out] itemPtr The first list member to scan. This pointer + * is also updated with the current list member + * each time through the loop. + * \param[out] nextPtr Loop pointer that is updated each time through + * the loop with the next list member. + * + * \note This macro should be used if itemPtr must be removed from + * the list during the loop. + * + *********************************************************************** + */ +#define VMK_LIST_ITER_SAFE(headerPtr, itemPtr, nextPtr) \ + for (nextPtr = vmk_ListNext(itemPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = nextPtr, nextPtr = vmk_ListNext(nextPtr)) + + +/* + *********************************************************************** + * VMK_LIST_ITER_REVERSE_SAFE -- */ /** + * + * \ingroup List + * \brief while-loop replacement macro to scan through a list from + * a given list member to the first list member. + * + * \param[in] headerPtr The list to scan. + * \param[in,out] itemPtr The first list member to scan. This pointer + * is also updated with the current list member + * each time through the loop. + * \param[out] prevPtr Loop pointer that is updated each time through + * the loop with the next list member. + * + * \note This macro should be used if itemPtr must be removed from + * the list during the loop. + * + *********************************************************************** + */ +#define VMK_LIST_ITER_REVERSE_SAFE(headerPtr, itemPtr, prevPtr) \ + for (prevPtr = vmk_ListPrev(itemPtr); \ + !vmk_ListIsAtEnd((headerPtr),itemPtr); \ + itemPtr = prevPtr, prevPtr = vmk_ListPrev(prevPtr)) + + +/* + *********************************************************************** + * vmk_ListIsEmpty -- */ /** + * + * \ingroup List + * \brief Check if a list does not contain any members. + * + * \param[in] headerPtr The head of the list to check + * + * \retval VMK_TRUE The list is empty + * \retval VMK_FALSE The list is not empty + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ListIsEmpty(vmk_ListLinks *headerPtr) +{ + return (headerPtr == headerPtr->nextPtr); +} + + +/* + *********************************************************************** + * vmk_ListIsAtEnd -- */ /** + * + * \ingroup List + * \brief Check if itemPtr is pointing just past the last list element. + * + * This function is useful for loops where it can be used to check if + * the loop has scanned all the list elements by checking to see if + * the loop's list pointer has scanned past the end of the list. + * + * \param[in] headerPtr The head of the list to check. + * \param[in] itemPtr The list entry pointer to check. + * + * \retval VMK_TRUE itemPtr points past the last list element. + * \retval VMK_FALSE itemPtr does not point past the last + * list element. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ListIsAtEnd(vmk_ListLinks *headerPtr, vmk_ListLinks *itemPtr) +{ + return (itemPtr == headerPtr); +} + + +/* + *********************************************************************** + * vmk_ListFirst -- */ /** + * + * \ingroup List + * \brief Get the first list member in a list. + * + * \param[in] headerPtr The list from which to retrieve the element. + * + * \return A pointer to the first member in the list. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListFirst(vmk_ListLinks *headerPtr) +{ + return (headerPtr->nextPtr); +} + + +/* + *********************************************************************** + * vmk_ListLast -- */ /** + * + * \ingroup List + * \brief Get the last list member in a list. + * + * \param[in] headerPtr The list from which to retrieve the element. + * + * \return A pointer to the last member in the list + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListLast(vmk_ListLinks *headerPtr) +{ + return (headerPtr->prevPtr); +} + + +/* + *********************************************************************** + * vmk_ListPrev -- */ /** + * + * \ingroup List + * \brief Return the preceeding list memeber. + * + * This function will return the list header if the memeber is the + * first list member. + * + * \param[in] itemPtr The list member from which to get the + * previous member. + * + * \return A pointer to the preceeding list member + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListPrev(vmk_ListLinks *itemPtr) +{ + return (itemPtr->prevPtr); +} + + +/* + *********************************************************************** + * vmk_ListNext -- */ /** + * + * \ingroup List + * \brief Return the following list memeber . + * + * This function will return the list header if the memeber is the + * last list member. + * + * \param[in] itemPtr The list member from which to get the + * following member. + * + * \return A pointer to the following list member. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListNext(vmk_ListLinks *itemPtr) +{ + return (itemPtr->nextPtr); +} + + +/* + *********************************************************************** + * vmk_ListInsert -- */ /** + * + * \ingroup List + * \brief Insert a list element into a list after another element. + * + * vmk_ListAfter, vmk_ListBefore, vmk_ListAtFront, and + * vmk_ListAtRear can be used to determine destPtr. + * + * \par For example: + * \code + * vmk_ListInsert(myElement, vmk_ListAtFront(myList)); + * \endcode + * + * \param[in] itemPtr List element to insert in the list. + * \param[in] destPtr List member to insert after. + * + *********************************************************************** + */ +static inline void +vmk_ListInsert(vmk_ListLinks *itemPtr, vmk_ListLinks *destPtr) +{ + VMK_ASSERT(itemPtr != NULL && destPtr != NULL); + VMK_ASSERT(itemPtr != destPtr); /* Can't insert something after itself. */ + itemPtr->nextPtr = destPtr->nextPtr; + itemPtr->prevPtr = destPtr; + destPtr->nextPtr->prevPtr = itemPtr; + destPtr->nextPtr = itemPtr; +} + + +/* + *********************************************************************** + * vmk_ListAfter -- */ /** + * + * \ingroup List + * \brief Get the appropriate itemPtr for vmk_ListInsert + * so that insertion will take place after a given element. + * + * \param[in] itemPtr List member to insert after. + * + * \return A pointer to a list element that will allow list + * insertion after the given list member. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListAfter(vmk_ListLinks *itemPtr) +{ + return itemPtr; +} + + +/* + *********************************************************************** + * vmk_ListBefore -- */ /** + * + * \ingroup List + * \brief Get the appropriate itemPtr for vmk_ListInsert() + * so that insertion will take place before a given element. + * + * \param[in] itemPtr List member to insert before. + * + * \return A pointer to a list element that will allow list + * insertion before the given list member. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListBefore(vmk_ListLinks *itemPtr) +{ + return itemPtr->prevPtr; +} + + +/* + *********************************************************************** + * vmk_ListAtFront -- */ /** + * + * \ingroup List + * \brief Get the appropriate itemPtr for vmk_ListInsert() to insert + * at the head of a given list. + * + * \param[in] headerPtr List on which the insertion will take place. + * + * \return A pointer to a list element that will allow list insertion + * at the head of the given list. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListAtFront(vmk_ListLinks *headerPtr) +{ + return headerPtr; +} + + +/* + *********************************************************************** + * vmk_ListAtRear -- */ /** + * + * \ingroup List + * \brief Get the appropriate itemPtr for vmk_ListInsert() to insert + * at the tail of a given list. + * + * \param[in] headerPtr List on which the insertion will take place. + * + * \return A pointer to the list element that will allow list insertion + * at the tail of the given list. + * + *********************************************************************** + */ +static inline vmk_ListLinks * +vmk_ListAtRear(vmk_ListLinks *headerPtr) +{ + return headerPtr->prevPtr; +} + + +/* + *********************************************************************** + * vmk_ListRemove -- */ /** + * + * \ingroup List + * \brief Remove a list element from the list in which it is contained. + * + * \param[in] itemPtr List element to be removed. + * + *********************************************************************** + */ +static inline void +vmk_ListRemove(vmk_ListLinks *itemPtr) +{ + VMK_ASSERT(itemPtr != NULL && itemPtr != itemPtr->nextPtr); + VMK_ASSERT(itemPtr->prevPtr->nextPtr == itemPtr && + itemPtr->nextPtr->prevPtr == itemPtr); + itemPtr->prevPtr->nextPtr = itemPtr->nextPtr; + itemPtr->nextPtr->prevPtr = itemPtr->prevPtr; + vmk_ListInitElement(itemPtr); +} + + +/* + *********************************************************************** + * vmk_ListSplitBefore -- */ /** + * + * \ingroup List + * \brief Remove items from the head of a list up to and including + * a given list member and put them at the head of another list. + * + * \param[in] headerPtr The source list from which the members will + * be moved. + * \param[in] headerPtr2 The destination list to which the members + * will be moved. + * \param[in] itemPtr The list member in the source list that is + * the last element to be moved. + * + *********************************************************************** + */ +static inline void +vmk_ListSplitBefore(vmk_ListLinks *headerPtr, vmk_ListLinks *headerPtr2, + vmk_ListLinks *itemPtr) +{ + VMK_ASSERT(headerPtr); + VMK_ASSERT(headerPtr2); + VMK_ASSERT(headerPtr != headerPtr2); + VMK_ASSERT(vmk_ListIsEmpty(headerPtr2)); + + /* set up new list */ + headerPtr2->nextPtr = headerPtr->nextPtr; + headerPtr2->prevPtr = itemPtr; + + /* fix old list */ + headerPtr->nextPtr = itemPtr->nextPtr; + itemPtr->nextPtr->prevPtr = headerPtr; + + /* fix rest of new list entries */ + itemPtr->nextPtr = headerPtr2; + headerPtr2->nextPtr->prevPtr = headerPtr2; +} + + +/* + *********************************************************************** + * vmk_ListSplitAfter -- */ /** + * + * \ingroup List + * \brief Remove items from the tail of a list up to and including + * a given list member and puts them at the tail of another list. + * + * \param[in] headerPtr The source list from which the members will + * be moved. + * \param[in] headerPtr2 The destination list to which the members + * will be moved. + * \param[in] itemPtr The list member in the source list that is + * the first element to be moved. + * + *********************************************************************** + */ +static inline void +vmk_ListSplitAfter(vmk_ListLinks *headerPtr, vmk_ListLinks *headerPtr2, + vmk_ListLinks *itemPtr) +{ + VMK_ASSERT(headerPtr); + VMK_ASSERT(headerPtr2); + VMK_ASSERT(headerPtr != headerPtr2); + VMK_ASSERT(vmk_ListIsEmpty(headerPtr2)); + + /* set up new list */ + headerPtr2->prevPtr = headerPtr->prevPtr; + headerPtr2->nextPtr = itemPtr; + + /* fix old list */ + headerPtr->prevPtr = itemPtr->prevPtr; + itemPtr->prevPtr->nextPtr = headerPtr; + + /* fix rest of new list entries */ + itemPtr->prevPtr = headerPtr2; + headerPtr2->prevPtr->nextPtr = headerPtr2; +} + +#endif /* _VMKAPI_LIST_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock.h new file mode 100644 index 0000000..b320cca --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock.h @@ -0,0 +1,951 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Spinlocks */ /** + * \defgroup Spinlocks Spin Locks + * + * \par Lock and Timer Ranks: + * All locks are associated with a numeric major rank \em R and a + * numeric minor rank \em r. While holding lock \em L1 (ranks: \em R1, + * \em r1) a lock \em L2 (ranks: \em R2, \em r2) can be acquired if one + * of the following hold true:\n + * - \em R2 > \em R1 \n + * - \em R2 == \em R1, \em L2 and \em L1 belong to the same class, + * and \em r2 > \em r1.\n + * \n + * The only exception to the above rule is for "unranked locks", which + * are applicable only for timers. An unranked timer does not participate + * in the ranking rules. Standalone unranked spinlocks are not supported.\n + * \n + * Two types of spinlocks, with respect to lock ranks are supported:\n + * \n + * \li Simple Ranked Spinlock: \n + * A stand-alone spinlock which has an explicit major rank other + * than VMK_SP_RANK_UNRANKED. The minor rank (which is implicitly set) + * is always equal to '0'. + * \li Class Based Ranked Spinlock:\n + * Belongs to a class of spinlocks all of which share the same + * explicit major rank other than VMK_SP_RANK_UNRANKED. Members of + * the same class differ only with respect to their minor rank, which is + * explicitly set to a desired value, other than VMK_SP_RANK_UNRANKED, + * during lock initialization. + * + * \par Timers and Ranks: + * Timers also have ranks within the lock ranking system. While a + * timer callback is firing, the callback is treated as holding a lock + * of the timer's rank, so it is not allowed to acquire locks of lower + * rank. A call to vmk_TimerRemoveSync is treated as acquiring (and + * releasing) a lock of the timer's rank, and thus is not allowed when + * holding locks of higher or equal rank.\n + * \n + * Timers can only be unranked or simple, not class-based. It is + * common to give a timer the rank VMK_SP_RANK_LOWEST; this allows the + * callback to acquire any higher-ranked lock, but requires that code + * calling vmk_TimerRemoveSync on the timer hold no locks. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SPLOCK_H_ +#define _VMKAPI_SPLOCK_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_module.h" +#include "base/vmkapi_lock_rank.h" + +/** + * \brief Recursive flag + * + * Recursive flag indicates that an instace of lock \em L can be held while + * acquiring another instance of lock \em L. It is assumed the caller knows + * what they're doing. + */ +#define VMK_SP_RANK_RECURSIVE_FLAG _VMK_SP_RANK_RECURSIVE_FLAG + +/** + * \brief Mask for rank value + */ +#define VMK_SP_RANK_NUMERIC_MASK _VMK_SP_RANK_NUMERIC_MASK + +/** + * \brief Lowest rank for locks + */ +#define VMK_SP_RANK_LOWEST _VMK_SP_RANK_LOWEST + +/** + * \brief highest rank for locks + */ +#define VMK_SP_RANK_HIGHEST _VMK_SP_RANK_HIGHEST + +/** + * \brief Maximum rank for locks + */ +#define VMK_SP_RANK_MAX (VMK_SP_RANK_NUMERIC_MASK - 1) + +/** + * \brief Minimum rank for locks + */ +#define VMK_SP_RANK_MIN (0) + +/** + * \brief Leaf rank for IRQ locks + * + * To be used for IRQ locks that leafs, except for log/warning + * + */ +#define VMK_SP_RANK_IRQ_LEAF _VMK_SP_RANK_IRQ_LEAF + +/** + * \brief Rank used by calls potentially invoked by timers that need + * to manage memory. For instance: an allocator callable by + * timers. + */ +#define VMK_SP_RANK_IRQ_MEMTIMER _VMK_SP_RANK_IRQ_MEMTIMER + +/** + * \brief Block rank for IRQ locks + * + * To be used for IRQ locks that depend on eventqueue/cpusched locks + */ +#define VMK_SP_RANK_IRQ_BLOCK _VMK_SP_RANK_IRQ_BLOCK + +/** + * \brief Lowest rank for IRQ locks + */ +#define VMK_SP_RANK_IRQ_LOWEST _VMK_SP_RANK_IRQ_LOWEST + +/** + * \brief Leaf rank for locks + * + * Leaf locks are ranked lower than spin locks protecting semaphores, + * so that one can grab a semaphore, grab a leaf lock and then call + * vmk_SemaIsLocked() on the semaphore. + */ +#define VMK_SP_RANK_LEAF _VMK_SP_RANK_LEAF + +/** + * \brief Rank for all SCSI locks + * + */ +#define VMK_SP_RANK_SCSI _VMK_SP_RANK_SCSI + +/** + * \brief Rank for all SCSI plugin locks + * + */ +#define VMK_SP_RANK_SCSI_PLUGIN2 _VMK_SP_RANK_SCSI_PLUGIN2 +#define VMK_SP_RANK_SCSI_PLUGIN1 _VMK_SP_RANK_SCSI_PLUGIN1 + +/** + * \brief Lowest rank for all SCSI locks + * + */ +#define VMK_SP_RANK_SCSI_LOWEST _VMK_SP_RANK_SCSI_LOWEST + +/** + * \brief Lowest rank for locks in FS Device Switch component + * + * Lowest possible rank for locks used by FS Device Switch. Modules + * operating above the device switch, and calling into the device switch + * should use locks ranked lower than this. + */ +#define VMK_SP_RANK_FDS_LOWEST _VMK_SP_RANK_FDS_LOWEST + +/** + * \brief Lowest rank for locks in VMK FS drivers + * + * Lowest possible rank for locks used by VMK FS drivers. FSS and everyone + * above should use locks ranked lower than this. + */ +#define VMK_SP_RANK_FSDRIVER_LOWEST _VMK_SP_RANK_FSDRIVER_LOWEST + +/** + * \brief Rank for Network locks + * + * Usual lock rank used for module internal usage which doesn't imply + * vmkapi call. + */ +#define VMK_SP_RANK_NETWORK _VMK_SP_RANK_NETWORK + +/** + * \brief Lowest Rank for Network locks + * + * Should be used if the module is intended to hold a lock while calling + * a vmkapi function. + */ +#define VMK_SP_RANK_NETWORK_LOWEST _VMK_SP_RANK_NETWORK_LOWEST + +/** + * \brief Highest Rank for Network locks + * + * Should be used if the module is intended to hold a lock while calling + * a vmkapi function. + */ +#define VMK_SP_RANK_NETWORK_HIGHEST _VMK_SP_RANK_NETWORK_HIGHEST + +/** + * \brief Tcpip2 stack highest rank. + * + */ +#define VMK_SP_RANK_TCPIP_HIGHEST _VMK_SP_RANK_TCPIP_HIGHEST + +/** + * \brief Unranked timers. + */ +#define VMK_SP_RANK_UNRANKED_TIMER _VMK_SP_RANK_UNRANKED_TIMER + +/** + * \brief Handle for lock classes + */ +typedef struct vmk_SpinlockClassInt *vmk_SpinlockClass; + +/** + * \brief Handle for non-IRQ locks + */ +typedef struct vmk_SpinlockInt *vmk_Spinlock; + +/** + * \brief Handle for IRQ locks + */ +typedef struct vmk_SpinlockIRQInt *vmk_SpinlockIRQ; + +/** + * \brief Handle for non-IRQ rw locks + */ +typedef struct vmk_SpinlockRWInt *vmk_SpinlockRW; + +/** + * \brief Rank for locks + */ +typedef _vmk_SP_Rank vmk_SpinlockRank; + + +/* + *********************************************************************** + * vmk_SPClassCreate -- */ /** + * + * \ingroup Spinlocks + * \brief Allocate and initialize a spinlock class + * + * Creates a new spinlock class and initializes it. + * + * The spinlock class's rank serves as the major rank for the + * spinlocks that are members of the class. + * + * \note Requires that the module heap be initialized. + * + * \param[out] lockClass Pointer to the new spinlock class. + * \param[in] moduleID Module ID who manages the created + * spinlock class. + * \param[in] name Name of the spinlock class. + * \param[in] rank Rank of the spinlock class. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_LOWEST and less than or + * equal to VMK_SP_RANK_HIGHEST. + * + * \retval VMK_OK The spinlock class was successfully initialized + * \retval VMK_NO_MEMORY The spinlock class could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SPClassCreate( + vmk_SpinlockClass *lockClass, + vmk_ModuleID moduleID, + const char *name, + vmk_SpinlockRank rank); + +/* + *********************************************************************** + * vmk_SPClassDestroy -- */ /** + * + * \ingroup Spinlocks + * \brief Destroy a spinlock class + * + * Revert all side effects of vmk_SPClassCreate + * + * \param[in] lockClass Pointer to the spinlock class to be deleted. + * + *********************************************************************** + */ +void vmk_SPClassDestroy(vmk_SpinlockClass *lockClass); + +/* + *********************************************************************** + * vmk_SPCreate -- */ /** + * + * \ingroup Spinlocks + * \brief Allocate and initialize a non-IRQ spinlock + * + * Creates a new non-IRQ spinlock and initializes it. + * + * \note Requires that the module heap be initialized. + * + * \param[out] lock Pointer to the new spinlock class. + * \param[in] moduleID Module that owns the new spinlock. + * \param[in] name Name of the spinlock, + * \param[in] lockClass Pointer to a spinlock class, or NULL if the + * new spinlock should be a simple (non-classed) + * spinlock. + * \param[in] rank The spinlock's rank.\n + * If lockClass is NULL then this parameter + * specifies the lock's major rank. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_LOWEST and less than or + * equal to VMK_SP_RANK_HIGHEST.\n + * If lockClass is set to a valid spinlock + * class then this parameter specifies the + * new spinlock's minor rank with the lock's + * major rank being inherited from the + * spinlock class. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_MIN and less than or + * equal to VMK_SP_RANK_MAX.\n + * + * \retval VMK_OK The spinlock was successfully initialized + * \retval VMK_NO_MEMORY The spinlock could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SPCreate( + vmk_Spinlock *lock, + vmk_ModuleID moduleID, + const char *name, + vmk_SpinlockClass *lockClass, + vmk_SpinlockRank rank); + +/* + *********************************************************************** + * vmk_SPIsLocked -- */ /* + * + * \ingroup Spinlocks + * \brief Tests a non-IRQ spinlock to see if it is currently locked. + * + * \note This call is only available on debug builds. + * + * \param[in] lock Non-IRQ spinlock to check. + * + * \retval VMK_OK Lock is unlocked. + * \retval VMK_BUSY Lock is locked. + * \retval VMK_BAD_PARAM Not a valid lock. + * + *********************************************************************** + */ +#ifdef VMX86_DEBUG +VMK_ReturnStatus vmk_SPIsLocked( + vmk_Spinlock *lock); +#endif + +/* + *********************************************************************** + * VMK_ASSERT_SPLOCK_LOCKED -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that a spinlock is currently locked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock Non-IRQ spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_SPLOCK_LOCKED(lock) \ + VMK_ASSERT(vmk_SPIsLocked(lock) == VMK_BUSY) + +/* + *********************************************************************** + * VMK_ASSERT_SPLOCK_UNLOCKED -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that a spinlock is currently unlocked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock Non-IRQ spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_SPLOCK_UNLOCKED(lock) \ + VMK_ASSERT(vmk_SPIsLocked(lock) == VMK_OK) + +/* + *********************************************************************** + * vmk_AssertNoSPLocksHeld -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that no non-IRQ spinlocks are held by this CPU. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + *********************************************************************** + */ +#ifdef VMX86_DEBUG +void vmk_AssertNoSPLocksHeld( + void); +#else +static inline void vmk_AssertNoSPLocksHeld( + void) {} +#endif + +/* + *********************************************************************** + * vmk_AssertNoSPLocksHeldIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that no IRQ spinlocks are held by this CPU. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + *********************************************************************** + */ +#ifdef VMX86_DEBUG +void vmk_AssertNoSPLocksHeldIRQ( + void); +#else +static inline void vmk_AssertNoSPLocksHeldIRQ( + void) {} +#endif + +/* + *********************************************************************** + * vmk_SPLock -- */ /** + * + * \ingroup Spinlocks + * \brief Acquire the non-IRQ spinlock + * + * \pre The caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Non-IRQ spinlock to acquire. + * + * \return None. + * + *********************************************************************** + */ +void vmk_SPLock( + vmk_Spinlock *lock); + +/* + *********************************************************************** + * vmk_SPTryLock -- */ /** + * + * \ingroup Spinlocks + * \brief Try acquire a non-IRQ spinlock + * + * This function tries to acquire the given spinlock: + * - If the given spinlock has not been locked, this function locks it. + * - If the given spinlock has been locked already, this function does + * nothing and returns immediately. + * + * \pre This caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Non-IRQ spinlock to attempt to acquire. + * + * \retval VMK_OK The given spinlock is successfully locked by this + * call. + * \retval VMK_BUSY The given spinlock has been locked already. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SPTryLock( + vmk_Spinlock *lock); + +/* + *********************************************************************** + * vmk_SPUnlock -- */ /** + * + * \ingroup Spinlocks + * \brief Release a non-IRQ spinlock + * + * \pre The caller currently owns the spinlock. + * + * \param[in,out] lock Non-IRQ spinlock to release. + * + *********************************************************************** + */ +void vmk_SPUnlock( + vmk_Spinlock *lock); + +/* + *********************************************************************** + * vmk_SPDestroy -- */ /** + * + * \ingroup Spinlocks + * \brief Destroy a non-IRQ spinlock + * + * Revert all side effects of vmk_SPCreate + * + * \param[in] lock Non-IRQ spinlock to be destroyed. + * + *********************************************************************** + */ +void vmk_SPDestroy(vmk_Spinlock *lock); + +/* + *********************************************************************** + * vmk_SPCreateIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Allocate and initialize an IRQ spinlock + * + * Creates a new IRQ spinlock and initializes it. + * + * \note Requires that the module heap be initialized. + * + * \param[out] lock Pointer to the new spinlock class. + * \param[in] moduleID Module that owns the new spinlock. + * \param[in] name Name of the spinlock, + * \param[in] lockClass Pointer to a spinlock class, or NULL if the + * new spinlock should be a simple (non-classed) + * spinlock. + * \param[in] rank The spinlock's rank.\n + * If lockClass is NULL then this parameter + * specifies the lock's major rank. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_IRQ_LOWEST and less + * than or equal to VMK_SP_RANK_IRQ_HIGHEST.\n + * If lockClass is set to a valid spinlock + * class then this parameter specifies the + * new spinlock's minor rank with the lock's + * major rank being inherited from the + * spinlock class. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_MIN and less than or + * equal to VMK_SP_RANK_MAX.\n + * + * \retval VMK_OK The spinlock was successfully initialized + * \retval VMK_NO_MEMORY The spinlock could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SPCreateIRQ( + vmk_SpinlockIRQ *lock, + vmk_ModuleID moduleID, + const char *name, + vmk_SpinlockClass *lockClass, + vmk_SpinlockRank rank); + +/* + *********************************************************************** + * vmk_SPIsLockedIRQ -- */ /* + * + * \ingroup Spinlocks + * \brief Tests an IRQ spinlock to see if it is currently locked. + * + * \note This call is only available on debug builds. + * + * \param[in] lock IRQ spinlock to check + * + * \retval VMK_OK Lock is unlocked. + * \retval VMK_BUSY Lock is locked. + * \retval VMK_BAD_PARAM Not a valid lock. + * + *********************************************************************** + */ +#ifdef VMX86_DEBUG +VMK_ReturnStatus vmk_SPIsLockedIRQ( + vmk_SpinlockIRQ *lock); +#endif + +/* + *********************************************************************** + * VMK_ASSERT_SPLOCK_LOCKED_IRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that an IRQ spinlock is currently locked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock IRQ spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_SPLOCK_LOCKED_IRQ(lock) \ + VMK_ASSERT(vmk_SPIsLockedIRQ(lock) == VMK_BUSY) + +/* + *********************************************************************** + * VMK_ASSERT_SPLOCKIRQ_UNLOCKED_IRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that an IRQ spinlock is currently unlocked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock IRQ spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_SPLOCKIRQ_UNLOCKED_IRQ(lock) \ + VMK_ASSERT(vmk_SPIsLockedIRQ(lock) == VMK_OK) + +/* + *********************************************************************** + * vmk_SPLockIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Acquire the IRQ spinlock + * + * Acquires an IRQ spinlock and disable interrupts on the current CPU + * if they are not already disabled. + * + * \pre The caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock IRQ spinlock to acquire. + * + * \return Previous IRQ state. + * \retval 0 interrupts were enabled. + * \retval 1 interrupts were disabled. + * + *********************************************************************** + */ +unsigned long vmk_SPLockIRQ( + vmk_SpinlockIRQ *lock); + +/* + *********************************************************************** + * vmk_SPTryLockIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Try acquire an IRQ spinlock + * + * This function tries to acquire the given spinlock: + * - If the given IRQ spinlock has not been locked, this function locks it + * and disables interrupts on the current CPU if interrupts were not + * already disabled. + * - If the given IRQ spinlock has been locked already, this function does + * nothing and returns immediately. + * + * \pre This caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock IRQ spinlock to attempt to acquire. + * \param[out] flags Previous IRQ level. 0 if interrupts were enabled. + * 1 if interrupts were disabled. + * + * \retval VMK_OK The given spinlock is successfully locked by this + * call. + * \retval VMK_BUSY The given spinlock has been locked already. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SPTryLockIRQ( + vmk_SpinlockIRQ *lock, + unsigned long *flags); + +/* + *********************************************************************** + * vmk_SPUnlockIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Release an IRQ spinlock + * + * \pre The caller currently owns the spinlock. + * + * \param[in,out] lock IRQ spinlock to unlock. + * \param[in] prevIRQ IRQ level from returned from vmk_SPLockIRQ + * or vmk_SPTryLockIRQ. + * + *********************************************************************** + */ +void vmk_SPUnlockIRQ( + vmk_SpinlockIRQ *lock, + unsigned long prevIRQ); + +/* + *********************************************************************** + * vmk_SPDestroyIRQ -- */ /** + * + * \ingroup Spinlocks + * \brief Destroy an IRQ spinlock + * + * Revert all side effects of vmk_SPCreateIRQ + * + * \param lock IRQ spinlock to be detroyed. + * + *********************************************************************** + */ +void vmk_SPDestroyIRQ(vmk_SpinlockIRQ *lock); + +/* + *********************************************************************** + * vmk_RWCreate -- */ /** + * + * \ingroup Spinlocks + * \brief Allocate and initialize a reader/writer spinlock + * + * Creates a new reader/writer spinlock and initializes it as + * ranked spinlock. + * + * \note Requires that the module heap be initialized. + * + * \param[out] lock Pointer to the new spinlock class. + * \param[in] moduleID Module that owns the new spinlock. + * \param[in] name Name of the spinlock, + * \param[in] lockClass Pointer to a spinlock class, or NULL if the + * new spinlock should be a simple (non-classed) + * spinlock. + * \param[in] rank The spinlock's rank.\n + * If lockClass is NULL then this parameter + * specifies the lock's major rank. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_LOWEST and less than or + * equal to VMK_SP_RANK_HIGHEST.\n + * If lockClass is set to a valid spinlock + * class then this parameter specifies the + * new spinlock's minor rank with the lock's + * major rank being inherited from the + * spinlock class. + * The specified rank must be greater than or + * equal to VMK_SP_RANK_MIN and less than or + * equal to VMK_SP_RANK_MAX.\n + * + * \retval VMK_OK The spinlock was successfully initialized + * \retval VMK_NO_MEMORY The spinlock could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWCreate( + vmk_SpinlockRW *lock, + vmk_ModuleID moduleID, + const char *name, + vmk_SpinlockClass *lockClass, + vmk_SpinlockRank rank); + +/* + *********************************************************************** + * vmk_RWReadLock -- */ /** + * + * \ingroup Spinlocks + * \brief Acquire a reader/writer spinlock for reading. + * + * \pre The caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Reader/writer spinlock to acquire. + * + *********************************************************************** + */ +void vmk_RWReadLock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_RWTryReadLock -- */ /** + * + * \ingroup Spinlocks + * \brief Try acquire the reader/writer spinlock for reading + * + * This function tries to acquire the given spinlock: + * - If the given r/w spinlock has not been locked, this function locks it. + * - If the given r/w spinlock has been locked already, this function does + * nothing and returns immediately. + * + * \pre This caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Reader/writer spinlock to attempt to acquire. + * + * \retval VMK_OK The given spinlock is successfully locked by + * this call. + * \retval VMK_BUSY The given spinlock has been locked already. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWTryReadLock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_RWIsRLocked -- */ /** + * + * \ingroup Spinlocks + * \brief Tests a reader/writer spinlock to see if it is currently + * read-locked. + * + * \param[in] lock Reader/writer spinlock to check + * + * \retval VMK_OK Lock is unlocked. + * \retval VMK_BUSY Lock is locked. + * \retval VMK_BAD_PARAM Not a valid lock. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWIsRLocked( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * VMK_ASSERT_RWLOCK_RLOCKED -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that a reader/writer lock is currently read-locked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock Reader/writer spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_RWLOCK_RLOCKED(lock) \ + VMK_ASSERT(vmk_RWIsRLocked(lock) == VMK_BUSY) + + +/* + *********************************************************************** + * vmk_RWWriteLock -- */ /** + * + * \ingroup Spinlocks + * \brief Acquire a reader/writer spinlock for writing. + * + * \pre The caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Reader/writer spinlock to acquire. + * + * \return None. + * + *********************************************************************** + */ +void vmk_RWWriteLock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_RWTryWriteLock -- */ /** + * + * \ingroup Spinlocks + * \brief Try acquire the reader/writer spinlock for writing + * + * This function tries to acquire the given spinlock: + * - If the given r/w spinlock has not been locked, this function locks it. + * - If the given r/w spinlock has been locked already, this function does + * nothing and returns immediately. + * + * \pre This caller shall not already hold a spinlock of lower or + * equal rank. + * + * \param[in,out] lock Reader/writer spinlock to attempt to acquire. + * + * \retval VMK_OK The given spinlock is successfully locked by this + * call. + * \retval VMK_BUSY The given spinlock has been locked already. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWTryWriteLock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_RWIsWLocked -- */ /** + * + * \ingroup Spinlocks + * \brief Tests a reader/writer spinlock to see if it is currently + * write-locked. + * + * \param[in] lock Reader/writer spinlock to check + * + * \retval VMK_OK Lock is unlocked. + * \retval VMK_BUSY Lock is locked. + * \retval VMK_BAD_PARAM Not a valid lock. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWIsWLocked( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * VMK_ASSERT_RWLOCK_WLOCKED -- */ /** + * + * \ingroup Spinlocks + * \brief Assert that a reader/writer lock is currently write-locked. + * + * \note This call only performs the check on a debug build. + * Other builds always succeed. + * + * \param[in] lock Reader/writer spinlock to check + * + *********************************************************************** + */ +#define VMK_ASSERT_RWLOCK_WLOCKED(lock) \ + VMK_ASSERT(vmk_RWIsWLocked(lock) == VMK_BUSY) + +/* + *********************************************************************** + * vmk_RWReadUnlock -- */ /** + * + * \ingroup Spinlocks + * \brief Release a reader/writer spinlock from a read-lock. + * + * \pre The caller currently has a read-lock on the spinlock. + * + * \param[in,out] lock Reader/writer spinlock to release. + * + *********************************************************************** + */ +void vmk_RWReadUnlock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_RWWriteUnlock -- */ /** + * + * \ingroup Spinlocks + * \brief Release a reader/writer spinlock from a write-lock. + * + * \pre The caller currently has a write-lock on the spinlock. + * + * \param[in,out] lock Reader/writer spinlock to release. + * + *********************************************************************** + */ +void vmk_RWWriteUnlock( + vmk_SpinlockRW *lock); + +/* + *********************************************************************** + * vmk_SPDestroy -- */ /** + * + * \ingroup Spinlocks + * \brief Destroy a reader/writer spinlock + * + * Revert all side effects of vmk_RWCreate + * + * \param[in] lock Reader/writer spinlock to be destroyed. + * + *********************************************************************** + */ +void vmk_RWDestroy(vmk_SpinlockRW *lock); + +#endif /* _VMKAPI_SPLOCK_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock_rank.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock_rank.h new file mode 100644 index 0000000..a8e0fec --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_lock_rank.h @@ -0,0 +1,80 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * These are internal spinlock ranks used to compute the + * exported spinlock ranks. Calling modules should NOT + * use these ranks directly but only those ranks exported + * in vmkapi_lock.h. + */ + +#ifndef _VMKAPI_SPLOCK_RANK_H_ +#define _VMKAPI_SPLOCK_RANK_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/** \cond nodoc */ + +/* + * Private definitions + */ +typedef int _vmk_SP_Rank; + +#define _VMK_SP_RANK_RECURSIVE_FLAG (0x8000) + +/* Real mask */ +#define _VMK_SP_RANK_NUMERIC_MASK (_VMK_SP_RANK_RECURSIVE_FLAG - 1) +/* Special locks */ +#define _VMK_SP_RANK_SERIAL (0x4002) +#define _VMK_SP_RANK_VOB (_VMK_SP_RANK_SERIAL - 1) +#define _VMK_SP_RANK_LOCK_STATS (_VMK_SP_RANK_VOB - 1) +#define _VMK_SP_RANK_SYMBOL_LIST (_VMK_SP_RANK_LOCK_STATS - 1) +#define _VMK_SP_RANK_LOG (_VMK_SP_RANK_SYMBOL_LIST - 1) +#define _VMK_SP_RANK_LOG_EVENT (_VMK_SP_RANK_LOG - 1) +#define _VMK_SP_RANK_VMKTAG (_VMK_SP_RANK_LOG_EVENT - 1) +#define _VMK_SP_RANK_IRQ_LEAF (_VMK_SP_RANK_VMKTAG - 1) +#define _VMK_SP_RANK_IRQ_WATCHPOINT (_VMK_SP_RANK_IRQ_LEAF - 1) +/* To be used for IRQ locks that depend on memory/timer events */ +#define _VMK_SP_RANK_IRQ_MEMTIMER (0x3000) +/* To be used for IRQ locks that depend on worldlet services */ +#define _VMK_SP_RANK_IRQ_WORLDLET (_VMK_SP_RANK_IRQ_MEMTIMER - 1) +/* To be used for IRQ locks that depend on eventqueue/cpusched locks */ +#define _VMK_SP_RANK_IRQ_BLOCK (0x2000) +/* Lowest possible rank for IRQ locks */ +#define _VMK_SP_RANK_IRQ_LOWEST (0x1000) + + +/* Highest possible rank for non-IRQ locks */ +/* To be used for non-IRQ locks that don't call any other non-IRQ locks */ +#define _VMK_SP_RANK_HIGHEST (_VMK_SP_RANK_IRQ_LOWEST - 1) +#define _VMK_SP_RANK_SEMAPHORE (_VMK_SP_RANK_HIGHEST - 1) + +#define _VMK_SP_RANK_LEAF (_VMK_SP_RANK_SEMAPHORE - 1) +#define _VMK_SP_RANK_SCSI (_VMK_SP_RANK_LEAF - 0x3) +#define _VMK_SP_RANK_SCSI_PLUGIN2 (_VMK_SP_RANK_LEAF - 0x4) +#define _VMK_SP_RANK_SCSI_PLUGIN1 (_VMK_SP_RANK_LEAF - 0x5) +#define _VMK_SP_RANK_SCSI_LOWEST (_VMK_SP_RANK_LEAF - 0x20) +#define _VMK_SP_RANK_FDS_LOWEST (_VMK_SP_RANK_SCSI_LOWEST) +#define _VMK_SP_RANK_FSDRIVER_LOWEST (_VMK_SP_RANK_FDS_LOWEST - 0x20) +#define _VMK_SP_RANK_NETWORK (_VMK_SP_RANK_LEAF - 3) +#define _VMK_SP_RANK_NETWORK_LOWEST (_VMK_SP_RANK_SCSI_LOWEST - 0x12) +#define _VMK_SP_RANK_NETWORK_HIGHEST (_VMK_SP_RANK_SCSI_LOWEST - 1) +#define _VMK_SP_RANK_LOWEST (0x0001) +#define _VMK_SP_RANK_TCPIP_HIGHEST (_VMK_SP_RANK_NETWORK_HIGHEST + 0x10) + +#define _VMK_SP_RANK_INVALID (0) +#define _VMK_SP_RANK_UNRANKED_TIMER (0xffff) +/* To be used only for binary compatibility shims. */ +#define _VMK_SP_RANK_UNRANKED_VMKAPI_SHIM_ONLY _VMK_SP_RANK_UNRANKED_TIMER + +#endif /* _VMKAPI_SPLOCK_RANK_H_ */ +/** \endcond nodoc */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_logging.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_logging.h new file mode 100644 index 0000000..34e3803 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_logging.h @@ -0,0 +1,572 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Logging */ /** + * \defgroup Logging Kernel Logging + * + * The logging interfaces provide a means of writing informational + * and error messages to the kernel's logs. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_LOGGING_H_ +#define _VMKAPI_LOGGING_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_compiler.h" + +#include + +/** \brief Max length of log component name. */ +#define VMK_MAX_LOG_COMPONENT_NAME (32) + +/** \brief Opaque log component handle. */ +typedef struct vmk_LogComponent *vmk_LogComponentHandle; + +/** \brief Log handle guaranteed to be invalid. */ +#define VMK_INVALID_LOG_HANDLE NULL + +/** \brief Log urgency level. */ +typedef enum { + VMK_LOG_URGENCY_NORMAL, + VMK_LOG_URGENCY_WARNING, + VMK_LOG_URGENCY_ALERT +} vmk_LogUrgency ; + +/** \brief Types of log throttling */ +typedef enum { + /** Log is not throttled. All messages will be logged. */ + VMK_LOG_THROTTLE_NONE=0, + + /** + * An internal message count will be kept and messages will + * only be logged as the count reaches certain wider-spaced values. + */ + VMK_LOG_THROTTLE_COUNT=1, + + /** + * Messages will be logged depending on the return value + * of a custom log throttling function. + */ + VMK_LOG_THROTTLE_CUSTOM=2, +} vmk_LogThrottleType; + +/* + *********************************************************************** + * vmk_LogThrottleFunc -- */ /** + * + * \ingroup Logging + * \brief Custom throttling function for a log component. + * + * A log throttling function will be called each time an attempt to + * log a message to a log component is made. If this function returns + * VMK_TRUE, the message will be logged. Otherwise, the message will + * not be logged. + * + * \param[in] arg Private data argument + * + * \return Whether or not the logger should log the current log message. + * \retval VMK_TRUE Log the current message. + * \retval VMK_FALSE Do not log the current message. + * + *********************************************************************** + */ +typedef vmk_Bool (*vmk_LogThrottleFunc)(void *arg); + +/** + * \brief Properties that define the type of throttling for + * a particular log component. + */ +typedef struct vmk_LogThrottleProperties { + /** Type of log throttling to use. */ + vmk_LogThrottleType type; + + /** Properties for the specified log throttling type. */ + union { + /** Properties for a custom log throttler. */ + struct { + /** + * Throttling function to call on each message submitted to the + * log component. + */ + vmk_LogThrottleFunc throttler; + + /** + * Private data argument to pass to the log throttling function + * on each call. + */ + void *arg; + } custom; + } info; +} +vmk_LogThrottleProperties; + +/* + *********************************************************************** + * vmk_StatusToString -- */ /** + * + * \ingroup Logging + * \brief Convert a status into a human readable text string + * + * \param[in] status Return status code to convert to a + * human-readable string. + * + * \return Human-readable string that describes the supplied status. + * + *********************************************************************** + */ +const char *vmk_StatusToString( + VMK_ReturnStatus status); + +/* + *********************************************************************** + * vmk_LogRegister -- */ /** + * + * \ingroup Logging + * \brief Register a log component + * + * Should be used to create a new log component with a particular + * string prepended to each message, that can have its log levels + * controlled independently from other log components. + * + * \pre The supplied module should have a heap associated with it. + * + * \param[in] name Log component name. + * \param[in] module Module the log component belongs to. + * \param[in] defaultLevel Default log level. + * \param[in] throttleProps User-defined throttling properties or + * NULL to indicate that no throttling is + * desired. + * \param[out] handle Handle to the newly created log component. + * + * \retval VMK_BAD_PARAM Bad LogThrottleType specified in + * the throttle properties. + * \retval VMK_NO_MEMORY Not enough memory on the module or + * vmkernel heap to create the new + * log component. + * \retval VMK_INVALID_MODULE Supplied module ID is invalid. + * \retval VMK_EXISTS A log component with the same name has + * already been registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogRegister( + const char *name, + vmk_ModuleID module, + vmk_int32 defaultLevel, + const vmk_LogThrottleProperties *throttleProps, + vmk_LogComponentHandle *handle); + +/* + *********************************************************************** + * vmk_LogUnregister -- */ /** + * + * \ingroup Logging + * \brief Unregister a log component + * + * Should be used to unregister an existing logging component + * + * \note Should be called before the module heap is destroyed. + * + * \param[in] handle Pointer to handle for log component to be + * unregistered. + * + * \retval VMK_NOT_FOUND Supplied log component is invalid/unregisterd. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogUnregister( + vmk_LogComponentHandle *handle); + +/* + *********************************************************************** + * vmk_LogGetName -- */ /** + * + * \ingroup Logging + * \brief Get log component name + * + * \param[in] handle Log component handle. + * + * \return The name associated with the supplied log component handle. + * + *********************************************************************** + */ +const char * vmk_LogGetName( + vmk_LogComponentHandle handle); + +/* + *********************************************************************** + * vmk_LogGetCurrentLogLevel -- */ /** + * + * \ingroup Logging + * \brief Get current log level of the given component + * + * \param[in] handle Log component handle. + * + * \return Current log level of the given component returned. + * + *********************************************************************** + */ +vmk_int32 vmk_LogGetCurrentLogLevel( + vmk_LogComponentHandle handle); + +/* + *********************************************************************** + * vmk_LogDebug -- */ /** + * + * \ingroup Logging + * \brief Log a message to a logging component on debug builds only. + * + * Should be used to log information messages and non-error conditions. + * + * Messages are logged only if the component's log level is greater + * than or equal to the minimum log level specified. + * + * \param[in] handle Log component handle, + * \param[in] min Minimum log level required to print the message, + * \param[in] fmt Format string, + * \param[in] args List of message arguments, + * + *********************************************************************** + */ +#ifndef VMX86_LOG +#define vmk_LogDebug(handle, min, fmt, args...) +#else +#define vmk_LogDebug(handle, min, fmt, args...) \ + vmk_LogLevel(VMK_LOG_URGENCY_NORMAL, handle, min, \ + "%s: %s: " fmt "\n", vmk_LogGetName(handle), \ + __FUNCTION__, ##args) +#endif + +/* + *********************************************************************** + * vmk_Log -- */ /** + * + * \ingroup Logging + * \brief Log message to a logging component at its current log level. + * + * Should be used to log information messages and non-error conditions. + * + * \param[in] handle Log component handle. + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_Log(handle, fmt, args...) \ + vmk_LogLevel(VMK_LOG_URGENCY_NORMAL, \ + handle, vmk_LogGetCurrentLogLevel(handle), \ + "%s: %s: " fmt "\n", vmk_LogGetName(handle), \ + __FUNCTION__, ##args) + +/* + *********************************************************************** + * vmk_Warning -- */ /** + * + * \ingroup Logging + * \brief Log a warning message to a logging component at its current + * log level. + * + * Should be used to log abnormal conditions. + * + * \param[in] handle Log component handle. + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_Warning(handle, fmt, args...) \ + vmk_LogLevel(VMK_LOG_URGENCY_WARNING, \ + handle, vmk_LogGetCurrentLogLevel(handle), \ + "%s: %s: " fmt "\n", vmk_LogGetName(handle), \ + __FUNCTION__, ##args) + +/* + *********************************************************************** + * vmk_Alert -- */ /** + * + * \ingroup Logging + * \brief Log an alert message to a logging component at its current + * log level. + * + * Should be used to notify users of system alerts. + * + * \param[in] handle Log component handle. + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_Alert(handle, fmt, args...) \ + vmk_LogLevel(VMK_LOG_URGENCY_ALERT, \ + handle, vmk_LogGetCurrentLogLevel(handle), \ + "%s: %s: " fmt "\n", vmk_LogGetName(handle), \ + __FUNCTION__, ##args) + +/* + *********************************************************************** + * vmk_LogDebugMessage -- */ /** + * + * \ingroup Logging + * \brief Log an information message to the vmkernel log unconditionally + * on debug builds only. + * + * Should be used to log information messages and non-error conditions + * when no log component is available. + * + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#ifndef VMX86_LOG +#define vmk_LogDebugMessage(fmt, args...) +#else +#define vmk_LogDebugMessage(fmt, args...) \ + vmk_LogNoLevel(VMK_LOG_URGENCY_NORMAL, fmt "\n", ##args) +#endif + +/* + *********************************************************************** + * vmk_LogMessage -- */ /** + * + * \ingroup Logging + * \brief Log an information message to the vmkernel log unconditionally. + * + * Should be used to log information messages and non-error conditions + * when no log component is available. + * + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_LogMessage(fmt, args...) \ + vmk_LogNoLevel(VMK_LOG_URGENCY_NORMAL, fmt "\n", ##args) + +/* + *********************************************************************** + * vmk_WarningMessage -- */ /** + * + * \ingroup Logging + * \brief Log a warning or error message to the vmkernel log + * unconditionally. + * + * Should be used to log abnormal conditions when no log component is + * available. + * + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_WarningMessage(fmt, args...) \ + vmk_LogNoLevel(VMK_LOG_URGENCY_WARNING, fmt "\n", ##args) + + +/* + *********************************************************************** + * vmk_AlertMessage -- */ /** + * + * \ingroup Logging + * \brief Log a system alert to the vmkernel log and the console + * unconditionally. + * + * Should be used to log severe problems when no log component is + * available. + * + * \param[in] fmt Format string. + * \param[in] args List of message arguments. + * + *********************************************************************** + */ +#define vmk_AlertMessage(fmt, args...) \ + vmk_LogNoLevel(VMK_LOG_URGENCY_ALERT, fmt "\n", ##args) + +/* + *********************************************************************** + * vmk_LogSetCurrentLogLevel -- */ /** + * + * \ingroup Logging + * \brief Set current log level of a given log component + * + * \param[in] handle Log component handle to modify. + * \param[in] level Log level to set component to. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogSetCurrentLogLevel( + vmk_LogComponentHandle handle, + vmk_int32 level); + +/* + *********************************************************************** + * vmk_vLogLevel -- */ /** + * + * \ingroup Logging + * \brief Log a message using a log component + * + * Output a log message to the vmkernel log if the current log level + * on the given log component is equal to or greater than the given + * log level. + * + * \param[in] urgency How urgent the message is. + * \param[in] handle Log component handle. + * \param[in] level Minimum log level the component must be set to + * in order to print the message. + * \param[in] fmt Format string. + * \param[in] ap List of message arguments. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_vLogLevel( + vmk_LogUrgency urgency, + vmk_LogComponentHandle handle, + vmk_int32 level, + const char *fmt, + va_list ap); + +/* + *********************************************************************** + * vmk_LogLevel -- */ /** + * + * \ingroup Logging + * \brief Log a message using a log component + * + * Output a log message to the vmkernel log if the current log level + * on the given log component is equal to or greater than the given + * log level. + * + * \param[in] urgency How urgent the message is. + * \param[in] handle Log component handle. + * \param[in] level Minimum log level the component must be set to + * in order to print the message. + * \param[in] fmt Format string. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogLevel( + vmk_LogUrgency urgency, + vmk_LogComponentHandle handle, + vmk_int32 level, + const char *fmt, + ...) +VMK_ATTRIBUTE_PRINTF(4,5); + +/* + *********************************************************************** + * vmk_vLogNoLevel -- */ /** + * + * \ingroup Logging + * \brief Log an information message to the vmkernel log + * unconditionally with a va_list. + * + * Should be used to log information messages and non-error conditions + * when no log component is available. + * + * \param[in] urgency How urgent the message is. + * \param[in] fmt Format string. + * \param[in] ap List of message arguments. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_vLogNoLevel( + vmk_LogUrgency urgency, + const char *fmt, + va_list ap); + +/* + *********************************************************************** + * vmk_LogNoLevel -- */ /** + * + * \ingroup Logging + * \brief Log an information message to the vmkernel log + * unconditionally with variable arguments. + * + * Should be used to log information messages and non-error conditions + * when no log component is available. + * + * \param[in] urgency How urgent the message is. + * \param[in] fmt Format string. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogNoLevel( + vmk_LogUrgency urgency, + const char *fmt, + ...) +VMK_ATTRIBUTE_PRINTF(2,3); + + +/* + *********************************************************************** + * vmk_LogFindLogComponentByName -- */ /** + * + * \ingroup Logging + * \brief Get a log component by the given log component name and + * the module ID. + * + * \param[in] id Module ID that registered the log component + * \param[in] name Log component name + * \param[out] handle Returns log component handle of the specified + * name and the module ID. + * + * \retval VMK_NOT_FOUND The given log component name does not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogFindLogComponentByName( + vmk_ModuleID id, + const char *name, + vmk_LogComponentHandle *handle); + +/* + *********************************************************************** + * vmk_LogBacktrace -- */ /** + * + * \ingroup Logging + * \brief Write the current stack backtrace to a log component. + * + * This routine logs at the component's current logging level and + * at NORMAL urgency. + * + * \param[in] handle Log component to write the backtrace to. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogBacktrace( + vmk_LogComponentHandle handle); + +/* + *********************************************************************** + * vmk_LogBacktraceMessage -- */ /** + * + * \ingroup Logging + * \brief Write the current stack backtrace to the vmkernel log. + * + * Should be used to log the backtrace when no logging component + * is available. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_LogBacktraceMessage(void); + +#endif /* _VMKAPI_LOGGING_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_memory.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_memory.h new file mode 100644 index 0000000..17d8887 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_memory.h @@ -0,0 +1,374 @@ +/* ********************************************************** + * Copyright 2005 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Memory */ /** + * + * \defgroup Memory Memory Management + * ESX Server has various means for manipulating both machine memory + * and virtual address space. The interfaces here provide operations for + * acquiring, manipulating, and managing both the machine memory and + * the virtual address space. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MEMORY_H_ +#define _VMKAPI_MEMORY_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_compiler.h" + +/** + * \brief Number of bits that all of the byte offsets in a page + * can occupy in an address + */ +#define VMK_PAGE_SHIFT 12 + +/** + * \brief Number of bytes in a page + */ +#define VMK_PAGE_SIZE (1<> VMK_PAGE_SHIFT); +} + +/* + *********************************************************************** + * vmk_MachPageToMachAddr -- */ /** + * + * \ingroup Memory + * \brief Get the machine addr for the specified machine page. + * + * \param[in] mpage Machine page to look up + * + * \return Machine address for the specified mpage + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE vmk_MachAddr +vmk_MachPageToMachAddr(vmk_MachPage mpage) +{ + return ((vmk_MachAddr)mpage << VMK_PAGE_SHIFT); +} + +/* + *********************************************************************** + * vmk_GetZeroBufferMA -- */ /** + * + * \ingroup Memory + * \brief Return the machine address of the global zero buffer + * + * \param[out] len Global zero buffer size in bytes + * + * \return Machine address for the global zero buffer + * + *********************************************************************** + */ +vmk_MachAddr +vmk_GetZeroBufferMA(vmk_size_t *len); + +#endif +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_mempool.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_mempool.h new file mode 100755 index 0000000..d6c8696 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_mempool.h @@ -0,0 +1,220 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * MemPool */ /** + * \defgroup MemPool Managed Machine-Page Pools + * + * Memory pools are used to manage machine memory resources for admission + * control and for better resource tracking. Each MemPool entity represents + * a set of limits that the internal resource management algorithms honor. + * The functions here provide operations to add such pools starting at + * the root represented by kmanaged group and and also introduces APIs + * to allocate/free memory based on the restrictions of the mempool. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MEMPOOL_H_ +#define _VMKAPI_MEMPOOL_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_memory.h" + +/** \brief Allocate memory anywhere on the machine. */ +#define VMK_MEMPOOL_MAXPAGE_ANY 0 + +/** \brief Allocate memory only in the low 4 gigabytes. */ +#define VMK_MEMPOOL_MAXPAGE_LOW 0x100000 + +/** + * \brief Maximum number of pages that can be requested for a + * reservation or limit. + */ +#define VMK_MEMPOOL_MAX_NUM_PAGES 0xffffffff + +/** + * \ingroup MemPool + * \brief Properties of a memory pool + */ +typedef struct vmk_MemPoolProps { + /** + * \brief Specifies the min num of guaranteed pages reserved for the pool. + */ + vmk_uint32 reservation; + + /** \brief Specifies the max num of pages the pool can offer. */ + vmk_uint32 limit; +} vmk_MemPoolProps; + +/** + * \ingroup MemPool + * \brief Properties of a memory pool allocation + */ +typedef struct vmk_MemPoolAllocProps { + /** \brief Number of pages that the allocation will be aligned on. */ + vmk_uint32 alignment; + + /** \brief Allocate pages with a page number less than or equal to this. */ + vmk_MachPage maxPage; +} vmk_MemPoolAllocProps; + +typedef struct vmk_MemPoolInt* vmk_MemPool; + +/* + *********************************************************************** + * vmk_MemPoolCreate -- */ /** + * + * \ingroup MemPool + * \brief Create a machine memory pool. + * + * \param[in] name Name associated with the new memory pool. + * \param[in] props Properties of the new memory pool. + * \param[out] pool Handle to the newly created memory pool. + * + * \retval VMK_BAD_PARAM The pool or properties arguments were NULL. + * \retval VMK_MEM_MIN_GT_MAX Reservation was larger than the limit + * in the pool properties. The reservation + * should always be less or equal to + * the limit. + * \retval VMK_MEM_ADMIT_FAILED There aren't enough resources in the + * pool's group to admit a pool of the + * specified size. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolCreate( + const char *name, + const vmk_MemPoolProps *props, + vmk_MemPool *pool); + + +/* + *********************************************************************** + * vmk_MemPoolSetProps -- */ /** + * + * \ingroup MemPool + * \brief Change the properties of an existing memory pool + * + * \note If the requested reservation or limit is larger than the + * supported limit, the reservation or limit will be set to + * the supported limit. + * + * \param[in,out] pool Memory pool to change + * \param[in] props New properties for the memory pool + * + * \retval VMK_BAD_PARAM The pool or properties arguments were NULL + * or the pool was invalid. + * \retval VMK_MEM_MIN_GT_MAX Reservation was larger than the limit + * in the pool properties. The reservation + * should always be less or equal to + * the limit. + * \retval VMK_MEM_ADMIT_FAILED There aren't enough resources in the + * pool's group to admit a pool of the + * specified size. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolSetProps( + vmk_MemPool pool, + const vmk_MemPoolProps *props); + +/* + *********************************************************************** + * vmk_MemPoolGetProps -- */ /** + * + * \ingroup MemPool + * \brief Get the properties of an existing memory pool + * + * \param[in] pool Memory pool to query + * \param[out] props Properties associated with the + * memory pool + * + * \retval VMK_BAD_PARAM The pool argument was invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolGetProps( + vmk_MemPool pool, + vmk_MemPoolProps *props); + +/* + *********************************************************************** + * vmk_MemPoolDestroy -- */ /** + * + * \ingroup MemPool + * \brief Destroy a memory pool. + * + * \param[in] pool Memory pool to destroy + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolDestroy( + vmk_MemPool pool); + +/* + *********************************************************************** + * vmk_MemPoolAlloc -- */ /** + * + * \ingroup MemPool + * \brief Allocate a contiguous range of machine pages from a specified + * memory pool. + * + * \param[in] pool Memory pool to allocate from. + * \param[in] props Attributes for this allocation or NULL + * for default attributes. + * \param[in] numPages Number of pages to allocate. + * \param[in] wait VMK_TRUE - Block and wait for the + * requested memory to become available.\n + * VMK_FALSE - If memory is not immediately + * available then return with an error. + * \param[out] startPage The first page in the allocated page range. + * + * \retval VMK_BAD_PARAM The pool argument was invalid or number + * of pages requested was less than one. + * \retval VMK_NOT_SUPPORTED The maxPage property was set too low. + * \retval VMK_MEM_ADMIT_FAILED The requested allocation was rejected + * because the pool or the pools group + * did not have the resources to + * fulfill it. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolAlloc( + vmk_MemPool pool, + const vmk_MemPoolAllocProps *props, + vmk_uint32 numPages, + vmk_Bool wait, + vmk_MachPage *startPage); + +/* + *********************************************************************** + * vmk_MemPoolFree -- */ /** + * + * \ingroup MemPool + * \brief Free a contiguous range of machine pages allocated from a + * memory pool. + * + * \param[in] startPage The first page of the page range to free. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_MemPoolFree( + vmk_MachPage *startPage); + +#endif /* _VMKAPI_MEMPOOL_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module.h new file mode 100644 index 0000000..a8bdf13 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module.h @@ -0,0 +1,715 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Module */ /** + * \defgroup Module Kernel Module Management + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MODULE_H_ +#define _VMKAPI_MODULE_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_util.h" +#include "base/vmkapi_module_int.h" +#include "base/vmkapi_module_ns.h" +#include "base/vmkapi_compiler.h" + +/** + * \brief Opaque handle for a vmkernel module. + * + * \note A handle should never be printed directly. Instead, use + * vmk_ModuleGetDebugID to get a printable value. + */ +typedef int vmk_ModuleID; + +/** + * \brief Module stack element. + */ +typedef struct vmk_ModInfoStack { + /** \brief Module ID. */ + vmk_ModuleID modID; + + /** \brief Module function called. */ + void *mod_fn; + + /** \brief Return address of caller. */ + void *pushRA; + + /** \brief Next module stack element. */ + struct vmk_ModInfoStack *oldStack; +} vmk_ModInfoStack; + +/** + * \brief Guaranteed invalid module ID. + */ +#define VMK_INVALID_MODULE_ID ((vmk_uint32)-1) + +/** + * \brief Module ID for vmkernel itself. + */ +#define VMK_VMKERNEL_MODULE_ID 0 + +/** + * \brief The maximum length of a module name including the terminating nul. + */ +#define VMK_MODULE_NAME_MAX 32 + + +/** + * \brief VMware proprietary code + */ +#define VMK_MODULE_LICENSE_VMWARE "VMware" +/** + * \brief GPLv2 + */ +#define VMK_MODULE_LICENSE_GPLV2 "GPLv2" +/** + * \brief BSD compatibile license + */ +#define VMK_MODULE_LICENSE_BSD "BSD" + + +/* + *********************************************************************** + * VMK_MODPARAM_NAMED -- */ /** + * + * \ingroup Module + * + * \brief Define a parameter set by the user during module load. + * + * \param[in] name Name of the parameter. + * \param[in] var Name of variable to store parameter value. + * \param[in] type Type of the variable. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM_NAMED(name, var, type, desc) \ + __VMK_MODPARAM_NAMED(name, var, type); \ + __VMK_MODPARAM_DESC(name, desc) + +/* + *********************************************************************** + * VMK_MODPARAM -- */ /** + * + * \ingroup Module + * \brief Define a parameter set by the user during module load. + * + * \note This macro relies on having a variable with the same name + * as the parameter. If your variable has a different name + * than the parameter name, use VMK_MODPARAM_NAMED. + * + * \param[in] name Name of the parameter and variable. + * \param[in] type Type of the variable. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM(name, type, desc) \ + VMK_MODPARAM_NAMED(name, name, type, desc) + +/* + *********************************************************************** + * VMK_MODPARAM_ARRAY_NAMED -- */ /** + * + * \ingroup Module + * + * \brief Define an array parameter that can be set by the user during + * module load. + * + * \param[in] name Name of parameter. + * \param[in] var Name of array variable. + * \param[in] type Type of array elements. + * \param[in] nump Variable to store count of set elements. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM_ARRAY_NAMED(name, var, type, nump, desc) \ + __VMK_MODPARAM_ARRAY_NAMED(name, var, type, nump); \ + __VMK_MODPARAM_DESC(name, desc) + +/* + *********************************************************************** + * VMK_MODPARAM_ARRAY -- */ /** + * + * \ingroup Module + * + * \brief Define an array parameter that can be set by the user during + * module load. + * + * \note This macro relies on having a variable with the same name + * as the parameter. If your variable has a different name + * than the parameter name, use VMK_MODPARAM_NAMED. + * + * \param[in] name Name of parameter and variable. + * \param[in] type Type of array elements. + * \param[in] nump Variable to store count of set elements. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM_ARRAY(name, type, nump, desc) \ + VMK_MODPARAM_ARRAY_NAMED(name, name, type, nump, desc) + +/* + *********************************************************************** + * VMK_MODPARAM_STRING_NAMED -- */ /** + * + * \ingroup Module + * \brief Define an string parameter that can be set by the user + * during module load. + * + * \note This creates a copy of the string; your variable must be an + * array of sufficient size to hold the copy. If you do not + * need to modify the string consider using a charp type. + * + * \param[in] name Name of parameter. + * \param[in] string Variable name for the string copy. + * \param[in] len Maximum length of string. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM_STRING_NAMED(name, string, len, desc) \ + __VMK_MODPARAM_STRING_NAMED(name, string, len); \ + __VMK_MODPARAM_DESC(name, desc) + +/* + *********************************************************************** + * VMK_MODPARAM_STRING -- */ /** + * + * \ingroup Module + * \brief Define an string parameter that can be set by the user + * during module load. + * + * \note This creates a copy of the string; your variable must be an + * array of sufficient size to hold the copy. If you do not + * need to modify the string consider using a charp type. + * + * \param[in] name Name of parameter and char array variable. + * \param[in] len Maximum length of string. + * \param[in] desc String describing the variable. + * + *********************************************************************** + */ +#define VMK_MODPARAM_STRING(name, len, desc) \ + VMK_MODPARAM_STRING_NAMED(name, name, len, desc) + +/* + *********************************************************************** + * VMK_VERSION_INFO -- */ /** + * + * \ingroup Module + * \brief Free-form string parameter describing version, build, + * etc. information. + * + * \param[in] string A string to be embedded as version information. + * + *********************************************************************** + */ +#define VMK_VERSION_INFO(string) \ + __VMK_VERSION_INFO(string) + + +/* + *********************************************************************** + * VMK_LICENSE_INFO -- */ /** + * + * \ingroup Module + * \brief A string describing the license this module is released + * under. This determines symbol binding rules -- for example, + * a non-GPL module can not bind to symbols provided by a GPL + * module. + * + * \param[in] string A string to be embedded as the license type. For + * maximum compatability, please use one of the predefined + * license strings. + * + *********************************************************************** + */ +#define VMK_LICENSE_INFO(string) \ + __VMK_LICENSE_INFO(string) + +/* + *********************************************************************** + * vmk_ModuleRegister -- */ /** + * + * \ingroup Module + * \brief Register a module with the VMKernel + * + * \pre The module shall not call any VMKernel function before this + * function has been invoked and has returned. + * + * \note A module should make a successful call to this function only + * once inside its initalization function, else undefined + * behavior may occur. + * + * \param[out] id The address of a variable to store + * the module's module ID handle. + * \param[in] vmkApiModRevision The module version for compatability + * checks. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModuleRegister( + vmk_ModuleID *id, + vmk_uint32 vmkApiModRevision); + +/* + *********************************************************************** + * vmk_ModuleUnregister -- */ /** + * + * \ingroup Module + * \brief Unregister a module with the VMKernel + * + * \pre The module shall not have any VMKernel call in progress at + * the time this function is invoked, nor initiate any VMKernel + * call after it has been invoked. + * + * \note The module ID handle will be invalid after the success of + * this call and should not be used again. + * + * \param[in] id The module ID handle to unregister. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModuleUnregister( + vmk_ModuleID id); + +/* + *********************************************************************** + * vmk_ModuleSetHeapID -- */ /** + * + * \ingroup Module + * \brief Set a module's default heap + * + * Any vmkapi call that does not take an explicit heap that also has + * a side effect of allocating storage will use the heap passed to this + * function. + * + * \pre The default heap may only be assigned once. Subsequent assignments + * will be ignored. + * + *********************************************************************** + */ +void vmk_ModuleSetHeapID( + vmk_ModuleID module, + vmk_HeapID heap); + +/* + *********************************************************************** + * vmk_ModuleGetHeapID -- */ /** + * + * \ingroup Module + * \brief Query a module's default heap + * + * \return The calling module's current default heap. + * \retval VMK_INVALID_HEAP_ID The module has no default heap. + * + *********************************************************************** + */ +vmk_HeapID vmk_ModuleGetHeapID( + vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_ModuleGetID -- */ /** + * + * \ingroup Module + * \brief Get the identifier of the VMKernel module + * + * \param[in] moduleName Name of the module to find. + * + * \return The module ID of the module with the specified name. + * \retval VMK_INVALID_MODULE_ID No module with the specified name + * was found. + * + *********************************************************************** + */ +vmk_ModuleID vmk_ModuleGetID( + const char *moduleName); + +/* + *********************************************************************** + * vmk_ModuleGetSymbol -- */ /** + * + * \ingroup Module + * + * \brief Resolve the address of a given symbol at run-time. + * + * This call is made from the context of the currently running module + * (the "requesting module"). The usual rules for symbol resolution, + * such as name-spaces and license enforcement, are enforced in the + * same way as the requesting module's load-time references. If + * found, the requesting module will be marked as a dependent of the + * module providing the symbol; as a consequence the reference count + * of the providing module will increase. This reference count can + * only be released via the requesting module being unloaded. + * + * \param[in] symbol Name of the symbol to find + * + * \return The address of the symbol, or NULL if not found + * + *********************************************************************** + */ +void* vmk_ModuleGetSymbol( + const char *symbol); + +/* + *********************************************************************** + * vmk_ModuleGetName -- */ /** + * + * \ingroup Module + * \brief Get the name associated with a module. + * + * \note This call will return an error when called to retrieve the + * name of a module that has not yet returned from the module + * init function. + * + * \param[in] module The module ID to query. + * \param[out] moduleName A character buffer large enough to hold the + * module name including the terminating nul. + * \param[in] len The length of the character buffer in bytes. + * + * \retval VMK_NOT_FOUND The module ID was not found. + * \retval VMK_BAD_PARAM The buffer isn't large enough to hold + * the module's string name. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModuleGetName( + vmk_ModuleID module, + char *moduleName, + vmk_uint32 len); + +/* + *********************************************************************** + * vmk_ModuleGetDebugID -- */ /** + * + * \ingroup Module + * \brief Convert a vmk_ModuleID to a 64-bit integer representation. + * This should not be used be used for anything other than a + * short-hand in debugging output. + * + * \param[in] module The module id. + * + *********************************************************************** + */ +vmk_uint64 vmk_ModuleGetDebugID(vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_ModuleIncUseCount -- */ /** + * + * \ingroup Module + * \brief Increment a module's reference count + * + * Any attempt to remove the module with \c vmkload_mod -u will fail + * while the module's reference count is non nul. + * + * \param[in] module Module to increment the reference count for. + * + * \retval VMK_OK The reference count was successfully + * incremented + * \retval VMK_NOT_FOUND The module doesn't exist + * \retval VMK_MODULE_NOT_LOADED The module is being unloaded + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModuleIncUseCount( + vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_ModuleDecUseCount -- */ /** + * + * \ingroup Module + * \brief Decrement a module's reference count. + * + * \param[in] module Module to decrement the reference count for. + * + * \retval VMK_OK The reference count was successfully + * decremented. + * \retval VMK_NOT_FOUND The module doesn't exist. + * \retval VMK_MODULE_NOT_LOADED The module is being unloaded. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModuleDecUseCount( + vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_ModulePushId -- */ /** + * + * \ingroup Module + * \brief Push moduleID onto module tracking stack before an + * inter-module call. + * + * \deprecated This call should no longer be called directly as it is + * likely to go away in a future release. + * + * \param[in] moduleID Module ID from which the inter-module call + * is to be made. + * \param[in] function Address of the inter-module function call + * \param[in] modStack Pointer to a vmk_ModInfoStack struct, + * preferrably on the stack. + * + * \retval VMK_OK The moduleID was sucessfully pushed + * onto the module stack + * \retval VMK_MODULE_NOT_LOADED Module was not found + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ModulePushId( + vmk_ModuleID moduleID, + void *function, + vmk_ModInfoStack *modStack); + +/* + *********************************************************************** + * vmk_ModulePopId -- */ /** + * + * \ingroup Module + * \brief Pop moduleID off of module tracking stack after an + * inter-module call. + * + * \deprecated This call should no longer be called directly as it is + * likely to go away in a future release. + * + *********************************************************************** + */ +void vmk_ModulePopId(void); + +/* + *********************************************************************** + * vmk_ModuleStackTop -- */ /** + * + * \ingroup Module + * \brief Get the latest moduleID pushed onto the module tracking stack. + * + * \retval The moduleID at the top of the module tracking stack. + * + *********************************************************************** + */ +vmk_ModuleID vmk_ModuleStackTop(void); + +/* + *********************************************************************** + * vmk_ModuleProtectionEnabled -- */ /** + * + * \ingroup Module + * \brief Find whether module is being run in a protected environment. + * + * \param[in] module moduleID of module for which protection is to + * be determined. + * + * \retval VMK_TRUE protection enabled. + * \retval VMK_FALSE protection not enabled. + * + *********************************************************************** + */ +vmk_Bool vmk_ModuleProtectionEnabled(vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_ModuleGetProtectedCall -- */ /** + * + * \ingroup Module + * \brief Get the protected entry point for a given call for a module. + * + * \param[in] module moduleID of module for which + * protected call is requested. + * \param[in] callAddr Address of call for which protected + * call is requested. + * \param[out] protectedCallAddr Protected entry point for call + * address. + * + * \retval VMK_NOT_FOUND Couldn't find handle for protected + * call region. + * \retval VMK_BAD_PARAM Couldn't write to protected call region + * for module. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ModuleGetProtectedCall( + vmk_ModuleID module, + void* callAddr, + void* *protectedCallAddr); + +/* + *********************************************************************** + * VMKAPI_MODULE_CALL -- */ /** + * + * \ingroup Module + * \brief Macro wrapper for inter-module calls that return a value. + * + * This wrapper should always be used when calling into another module + * so that vmkernel can properly track resources associated with + * a call. + * + * \param[in] moduleID moduleID of the calling module. + * \param[out] returnValue Variable to hold the return value from + * the called function. + * \param[in] function Inter-module function call to be + * invoked. + * \param[in,out] args Arguments to pass to the inter-module + * function call. + * + *********************************************************************** + */ +#define VMKAPI_MODULE_CALL(moduleID, returnValue, function, args...) \ +do { \ + vmk_ModInfoStack modStack; \ + vmk_ModulePushId(moduleID, function, &modStack) ; \ + returnValue = (function)(args); \ + vmk_ModulePopId(); \ +} while(0) + +/* + *********************************************************************** + * VMKAPI_MODULE_CALL_VOID -- */ /** + * + * \ingroup Module + * \brief Macro wrapper for inter-module calls that do not return + * a value. + * + * This wrapper should always be used when calling into another module + * so that vmkernel can properly track resources associated with + * a call. + * + * \param[in] moduleID moduleID of the calling module + * \param[in] function Inter-module function call to be invoked + * \param[in,out] args Arguments to pass to the inter-module + * function call + * + *********************************************************************** + */ +#define VMKAPI_MODULE_CALL_VOID(moduleID, function, args...) \ +do { \ + vmk_ModInfoStack modStack; \ + vmk_ModulePushId(moduleID, function, &modStack); \ + (function)(args); \ + vmk_ModulePopId(); \ +} while(0) + +/* + *********************************************************************** + * VMK_MODULE_EXPORT_SYMBOL -- */ /** + * + * \ingroup Module + * \brief Mark a symbol as exported + * + * Mark the given symbol as exported, and hence available for other + * modules to find/call. + * + * \param[in] symname The symbol to export. + * + *********************************************************************** + */ +#define VMK_MODULE_EXPORT_SYMBOL(symname) \ + __VMK_MODULE_EXPORT_SYMBOL(symname) + +/* + *********************************************************************** + * VMK_MODULE_EXPORT_SYMBOL_ALIASED -- */ /** + * + * \ingroup Module + * \brief Mark a symbol as exported under an aliased name + * + * Mark the given symbol as exported under an aliased name, and hence + * available for other modules to find/call. It is possible to have + * multiple aliases for a single symbol. + * + * \param[in] symname The symbol to export. + * \param[in] alias The publicly exported name + * + *********************************************************************** + */ +#define VMK_MODULE_EXPORT_SYMBOL_ALIASED(symname, alias) \ + __VMK_MODULE_EXPORT_SYMBOL_ALIASED(symname, alias) + +/* + *********************************************************************** + * VMK_MODULE_EXPORT_ALIAS -- */ /** + * + * \ingroup Module + * \brief Re-export an already exported symbol + * + * Re-export the given original symbol "symname" within the name-space + * and version of the current module (as specified by + * VMK_NAMESPACE_PROVIDES()). The original symbol must be present by + * virtue of being exported by another module, and the current module + * must contain the correct VMK_NAMESPACE_REQUIRED() invocation such + * that the original symbol can be found. + * + * \note Calls via this alias incur no overheads, as referencing the + * alias results in the function address of the original symbol. + * + * \param[in] symname The name of the original symbol to re-export + * + *********************************************************************** + */ +#define VMK_MODULE_EXPORT_ALIAS(symname) \ + __VMK_MODULE_EXPORT_SYMBOL_ALIASED(symname, symname) + +/* + *********************************************************************** + * VMK_NAMESPACE_REQUIRED -- */ /** + * + * \ingroup Module + * \brief Mark this module as requiring a name-space at a given version + * + * Mark the module as requiring a name-space "namespace" at "version". + * VMKAPI documentation should provide these strings. There is no + * limit on the number of name-spaces a module may require. + * + * \param[in] namespace The name-space + * \param[in] version The version of this name-space + * + *********************************************************************** + */ +#define VMK_NAMESPACE_REQUIRED(namespace, version) \ + __VMK_NAMESPACE_REQUIRED(namespace, version) + +/* + *********************************************************************** + * VMK_NAMESPACE_PROIVDES -- */ /** + * + * \ingroup Module + * \brief Mark this module as providing a name-space at a given version + * + * Mark the module as providing a name-space "namespace" at "version". + * Each module may provide only one name-space. + * + * \param[in] namespace The name-space + * \param[in] version The version of this name-space + * + *********************************************************************** + */ +#define VMK_NAMESPACE_PROVIDES(namespace, version) \ + __VMK_NAMESPACE_PROVIDES(namespace, version) + +#endif /* _VMKAPI_MODULE_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_incompat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_incompat.h new file mode 100644 index 0000000..43b2a43 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_incompat.h @@ -0,0 +1,87 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Module (incompatible) */ /** + * \addtogroup Module + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MODULE_INCOMPAT_H_ +#define _VMKAPI_MODULE_INCOMPAT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_module_int.h" + +/* + *********************************************************************** + * VMK_MODULE_EXPORT_SYMBOL_DIRECT -- */ /** + * + * \ingroup Module + * \brief Mark a symbol as exported only for direct calls + * + * Mark the given symbol as exported, and hence available for other + * modules to find/call. This differs from VMK_MODULE_EXPORT_SYMBOL + * in that the exported symbol will never be called through a + * trampoline; all calls will be "direct". Note that exported + * symbols are not called through trampolines by default, so this is + * only necessary if you know callers may use trampolines and you want + * to prevent it. See below for more information. + * + * If modules are loaded into a protected kernel environment (PKE), + * trampolines are created to transition between the module's + * protected domain and the target domain on all calls out of a + * module. Exporting a symbol as "direct" prevents such modules from + * generating trampolines when calling the exported symbol. This + * implies that any domain transition is handled manually by the + * exported symbol, if necessary. + * + * \param[in] __symname The symbol to export. + * + *********************************************************************** + */ +#define VMK_MODULE_EXPORT_SYMBOL_DIRECT(__symname) \ + __VMK_MODULE_EXPORT_SYMBOL_DIRECT(__symname) + + +/* + *********************************************************************** + * vmk_ModuleLoad -- */ /** + * + * \ingroup Module + * \brief Load a vmkernel module. + * + * \note This is a blocking call. + * + * \pre The caller should not hold any spinlock. + * + * \param[in] module Module name to load. + * \param[out] moduleID Module ID if module loaded successfully + * + * \retval VMK_OK Module loaded without error or is already + * loaded. + * \retval VMK_FAILURE Module could not be loaded. + * \retval VMK_TIMEOUT Module could not be loaded. + * \retval VMK_NO_MEMORY Module could not be loaded out of memory. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ModuleLoad(const char *module, vmk_ModuleID *moduleID); + + +#endif /* _VMKAPI_MODULE_INCOMPAT_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_int.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_int.h new file mode 100644 index 0000000..e781966 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_int.h @@ -0,0 +1,283 @@ + +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * Module internal macros, defines, etc. + * + * Do not directly include or use the interfaces + * provided in this header; only use those provided by + * vmkapi_module.h. + */ +/** \cond nodoc */ + +#ifndef _VMKAPI_MODULE_PARAM_H_ +#define _VMKAPI_MODULE_PARAM_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + * Internal macro-machinery for parameter handling + */ +#define __vmk_ModuleParamType_int 1 +#define __vmk_ModuleParamType_int_array 2 +#define __vmk_ModuleParamType_uint 3 +#define __vmk_ModuleParamType_uint_array 4 +#define __vmk_ModuleParamType_long 5 +#define __vmk_ModuleParamType_long_array 6 +#define __vmk_ModuleParamType_ulong 7 +#define __vmk_ModuleParamType_ulong_array 8 +#define __vmk_ModuleParamType_short 9 +#define __vmk_ModuleParamType_short_array 10 +#define __vmk_ModuleParamType_ushort 11 +#define __vmk_ModuleParamType_ushort_array 12 +#define __vmk_ModuleParamType_string 13 +#define __vmk_ModuleParamType_charp 14 +#define __vmk_ModuleParamType_bool 15 +#define __vmk_ModuleParamType_byte 16 + +#define VMK_PARAM(type) VMK_PARAM_##type = __vmk_ModuleParamType_##type + +typedef enum { + VMK_PARAM(int), + VMK_PARAM(int_array), + VMK_PARAM(uint), + VMK_PARAM(uint_array), + VMK_PARAM(long), + VMK_PARAM(long_array), + VMK_PARAM(ulong), + VMK_PARAM(ulong_array), + VMK_PARAM(short), + VMK_PARAM(short_array), + VMK_PARAM(ushort), + VMK_PARAM(ushort_array), + VMK_PARAM(string), + VMK_PARAM(charp), + VMK_PARAM(bool), + VMK_PARAM(byte) +} vmk_ModuleParamType; + +struct vmk_ModuleParam { + const char *name; + vmk_ModuleParamType type; + union { + void *arg; + struct { + char *arg; + int maxlen; + } string; + struct { + void *arg; + int maxlen; + int *nump; + } array; + } param; +}; + +#define VMK_PARAM_SEC ".vmkmodparam" +#define VMK_MODINFO_SEC ".vmkmodinfo" + +/* + * Add a string to modinfo without a corresponding symbol (i.e. + * informational only) + */ +#define __VMK_MODINFO_STAMP(string) \ + asm(".pushsection " VMK_MODINFO_SEC ",\"a\", @progbits\n" \ + "\t.string \"" string "\" \n" \ + "\t.popsection\n") + +/* + * Named parameter + */ +#define __VMK_MODPARAM_NAME(name, type) \ + __VMK_MODINFO_STAMP("param_" #name ":" type) + +/* + * Description of named paramter. Note: can not use stamp method as + * 'desc' may have embedded newlines which the asm calls expands... + */ +#define __VMK_MODPARAM_DESC(name, desc) \ + const char __module_desc_##name[] \ + __attribute__((section(VMK_MODINFO_SEC))) \ + = "param_desc_" #name "=" desc + +/* Required attributes for variables in VMK_PARAM_SEC */ +#define __VMK_MODPARAM_ATTRS \ + __attribute__ (( __section__(VMK_PARAM_SEC) )) \ + __attribute__ (( __used__ )) \ + __attribute__ (( aligned(sizeof(void*)) )) + +/* Basic type */ +#define __VMK_MODPARAM_NAMED(__name, __var, __type) \ + static char __vmk_param_str_##__name[] = #__name; \ + static struct vmk_ModuleParam const __param_##__name \ + __VMK_MODPARAM_ATTRS \ + = { \ + .name = __vmk_param_str_##__name, \ + .type = __vmk_ModuleParamType_##__type, \ + .param.arg = &__var, \ + }; \ + __VMK_MODPARAM_NAME(__name, #__type) + +/* Array */ +#define __VMK_MODPARAM_ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#define __VMK_MODPARAM_ARRAY_NAMED(__name, __array, __type, __nump) \ + static char __vmk_param_str_##__name[] = #__name; \ + static struct vmk_ModuleParam const __param_##__name \ + __VMK_MODPARAM_ATTRS \ + = { \ + .name = __vmk_param_str_##__name, \ + .type = __vmk_ModuleParamType_##__type##_array, \ + .param.array.arg = __array, \ + .param.array.maxlen = __VMK_MODPARAM_ARRAY_SIZE(__array), \ + .param.array.nump = __nump, \ + }; \ + __VMK_MODPARAM_NAME(__name, "array of " #__type) + +/* String */ +#define __VMK_MODPARAM_STRING_NAMED(__name, __string, __max) \ + static char __vmk_param_str_##__name[] = #__name; \ + static struct vmk_ModuleParam const __param_##__name \ + __VMK_MODPARAM_ATTRS \ + = { \ + .name = __vmk_param_str_##__name, \ + .type = __vmk_ModuleParamType_string, \ + .param.string.arg = __string, \ + .param.string.maxlen = __max, \ + }; \ + __VMK_MODPARAM_NAME(__name, "string") + + +/* + * Version Information + */ + +#define VMK_VERSION_INFO_SYM __vmk_versionInfo_str +#define VMK_VERSION_INFO_TAG "version=" +#define VMK_VERSION_INFO_TAG_LEN (sizeof(VMK_VERSION_INFO_TAG)-1) + +#define __VMK_VERSION_INFO(__string) \ + const static char VMK_VERSION_INFO_SYM[] \ + __attribute__((used)) \ + __attribute__((section(VMK_MODINFO_SEC))) = VMK_VERSION_INFO_TAG __string + +/* + * License Information + */ + +#define VMK_LICENSE_INFO_SYM __vmk_licenseInfo_str +#define VMK_LICENSE_INFO_TAG "license=" +#define VMK_LICENSE_INFO_TAG_LEN (sizeof(VMK_LICENSE_INFO_TAG)-1) + +#define __VMK_LICENSE_INFO(__string) \ + const static char VMK_LICENSE_INFO_SYM[] \ + __attribute__((used)) \ + __attribute__((section(VMK_MODINFO_SEC))) = VMK_LICENSE_INFO_TAG __string + +/* + * Symbol Exports + */ + +#define VMK_EXPORT_SYMBOL_SEC ".vmksymbolexports" + +struct vmk_ExportSymbol { + char *name; + enum { + VMK_EXPORT_SYMBOL_DEFAULT, + /* Direct export means don't ever create a trampoline for this symbol. */ + VMK_EXPORT_SYMBOL_DIRECT, + } exportType; +}; + +#define __VMK_EXPORT_SYMBOL_ATTRS \ + __attribute__ (( __section__(VMK_EXPORT_SYMBOL_SEC) )) \ + __attribute__ (( __used__ )) \ + __attribute__ (( aligned(sizeof(void*)) )) + +#define __VMK_MODULE_EXPORT_SYMBOL(__symname) \ + static char __vmk_symbol_str_##__symname[] = #__symname; \ + static struct vmk_ExportSymbol const __vmk_symbol_##__symname \ + __VMK_EXPORT_SYMBOL_ATTRS \ + = { \ + .name = __vmk_symbol_str_##__symname, \ + .exportType = VMK_EXPORT_SYMBOL_DEFAULT, \ + }; + +#define __VMK_MODULE_EXPORT_SYMBOL_DIRECT(__symname) \ + static char __vmk_symbol_str_##__symname[] = #__symname; \ + static struct vmk_ExportSymbol const __vmk_symbol_##__symname \ + __VMK_EXPORT_SYMBOL_ATTRS \ + = { \ + .name = __vmk_symbol_str_##__symname, \ + .exportType = VMK_EXPORT_SYMBOL_DIRECT, \ + }; + +/* + * Aliases + */ + +#define VMK_EXPORT_ALIAS_SEC ".vmksymbolaliases" + +/* + * Note that VMK_MODULE_EXPORT_ALIAS() sets the name and alias the + * same; we assume this condition is a direct external alias and that + * 'name' is exported by another module. + */ + +struct vmk_ExportSymbolAlias { + char *name; + char *alias; +}; + +#define __VMK_EXPORT_ALIAS_ATTRS \ + __attribute__ (( __section__(VMK_EXPORT_ALIAS_SEC) )) \ + __attribute__ (( __used__ )) \ + __attribute__ (( aligned(sizeof(void*)) )) + +#define __VMK_MODULE_EXPORT_SYMBOL_ALIASED(__symname, __alias) \ + static char __vmk_symbol_str_##__symname##__alias[] = #__symname; \ + static char __vmk_symbol_str_##__alias[] = #__alias; \ + static struct vmk_ExportSymbolAlias const \ + __vmk_symbol_##__symname##__alias \ + __VMK_EXPORT_ALIAS_ATTRS \ + = { \ + .name = __vmk_symbol_str_##__symname##__alias, \ + .alias = __vmk_symbol_str_##__alias, \ + }; + + +/* + * Name-spaces + */ + +#define VMK_NAMESPACE_SEC ".vmkrequiredns" + +#define __VMK_NAMESPACE_REQUIRED(__ns, __version) \ + asm(".pushsection " VMK_NAMESPACE_SEC ",\"aS\", @progbits\n" \ + "\t.string \"" __ns "@" __version "\" \n" \ + "\t.popsection\n"); \ + __VMK_MODINFO_STAMP("nsRequired=" __ns "@" __version) + + +#define VMK_NAMESPACE_PROVIDES_SYM __vmk_nsProvides_str +#define VMK_NAMESPACE_PROVIDES_TAG "nsProvides=" +#define VMK_NAMESPACE_PROVIDES_TAG_LEN (sizeof(VMK_NAMESPACE_PROVIDES_TAG)-1) + +#define __VMK_NAMESPACE_PROVIDES(__ns, __version) \ + const static char VMK_NAMESPACE_PROVIDES_SYM[] \ + __attribute__((used)) \ + __attribute__((section(VMK_MODINFO_SEC))) = \ + VMK_NAMESPACE_PROVIDES_TAG __ns "@" __version; + + +#endif /* _VMKAPI_MODULE_PARAM_H_ */ +/** \endcond nodoc */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_ns.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_ns.h new file mode 100644 index 0000000..45a909f --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_module_ns.h @@ -0,0 +1,83 @@ +/* ********************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Module */ /** + * \defgroup Namespace Symbol name-spaces + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MODULE_NS_H_ +#define _VMKAPI_MODULE_NS_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + *********************************************************************** + * VMK_NAMESPACE_VMKAPI + * + * \ingroup Namespace + * \brief Default VMKAPI name-space + * + * This string should be used to access the VMKAPI name-space + * + *********************************************************************** + */ +#define VMK_NAMESPACE_VMKAPI "com.vmware.vmkapi" + +/* + *********************************************************************** + * VMK_NAMESPACE_ESX40_VERSION -- */ /** + * + * \ingroup Namespace + * \brief ESX 4.0 compatability version string + * + * This string should be used to provide an ESX 4.0 compatability + * versioned symbol for any newly created name-space. Modules which + * do not specify any name-space requirements will be assumed to be + * ESX 4.0 modules and run in a compatability mode. In this mode, a + * symbol in any name-space versioned at VMK_NAMESPACE_ESX40_VERSION + * will be assumed to match. + * + *********************************************************************** + */ +#define VMK_NAMESPACE_ESX40_VERSION "v1_0_0_0" + +/* + *********************************************************************** + * VMK_NAMESPACE_ESX41_VERSION -- */ /** + * + * \ingroup Namespace + * \brief ESX 4.1 compatability version string + * + *********************************************************************** + */ +#define VMK_NAMESPACE_ESX41_VERSION "v1_1_0_0" + +/* + *********************************************************************** + * VMK_NAMESPACE_CURRENT_VERSION -- */ /** + * + * \ingroup Namespace + * \brief The current VMKAPI name-space version + * + * Short-cut for exporting to the current VMKAPI name-space + * + *********************************************************************** + */ +#define VMK_NAMESPACE_CURRENT_VERSION VMK_NAMESPACE_ESX41_VERSION + +#endif /* _VMKAPI_MODULE_NS_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_parse.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_parse.h new file mode 100644 index 0000000..029694d --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_parse.h @@ -0,0 +1,55 @@ +/* ********************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Parse */ /** + * \defgroup Parse Parsing Utilities + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_PARSE_H_ +#define _VMKAPI_PARSE_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + *********************************************************************** + * vmk_ParseArgs-- */ /** + * + * \ingroup Parse + * \brief Parse "buf" as a vector of arguments. + * + * Parse "buf" of length "buflen" as a vector of up to "argc" + * arguments delimited by whitespace. Updates "buf" in-place, + * replacing whitespace with NULs, and sets elements of "argv" to + * the start of each parsed argument. + * + * \param[in] buf Source string + * \param[in] buflen Length of source string + * \param[out] argv Array of parsed tokens + * \param[in] argc Count of tokens to be parsed + * + * \return Returns the number of parsed arguments. + * + *********************************************************************** + */ +vmk_uint32 vmk_ParseArgs( + char *buf, + vmk_size_t buflen, + char *argv[], + vmk_uint32 argc); + +#endif /* _VMKAPI_PARSE_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform.h new file mode 100644 index 0000000..8160b28 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform.h @@ -0,0 +1,341 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Platform */ /** + * \defgroup Platform Platform + * + * Interfaces relating to the underlying platform. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_PLATFORM_H_ +#define _VMKAPI_PLATFORM_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_const.h" + +/** \brief Size of an L1 cacheline */ +#define VMK_L1_CACHELINE_SIZE 64 + +/** \brief Type that is large enough to store CPU flags */ +typedef vmk_uintptr_t vmk_CPUFlags; + +/** \brief A set of CPUs */ +typedef struct vmk_AffinityMaskInt *vmk_AffinityMask; + +/** \brief Affinity mask returned if a new mask cannot be created */ +#define VMK_INVALID_AFFINITY_MASK ((vmk_AffinityMask)NULL) + +/* + *********************************************************************** + * VMK_ATTRIBUTE_L1_ALIGNED -- */ /** + * \ingroup Compiler + * + * \brief Indicate to the compiler that a data structure should be + * aligned on an L1 cacheline boundary. + * + *********************************************************************** + */ +#define VMK_ATTRIBUTE_L1_ALIGNED VMK_ATTRIBUTE_ALIGN(VMK_L1_CACHELINE_SIZE) + +/* + *********************************************************************** + * vmk_NumPCPUs -- */ /** + * + * \ingroup Platform + * \brief Return vmkernels numPCPUs global. + * + *********************************************************************** + */ +vmk_uint32 vmk_NumPCPUs(void); + +/* + *********************************************************************** + * vmk_GetPCPUNum -- */ /** + * + * \ingroup Platform + * \brief Return the PCPU we're currently executing on. + * + *********************************************************************** + */ +vmk_uint32 vmk_GetPCPUNum(void); + +/* + *********************************************************************** + * vmk_AffinityMaskCreate -- */ /** + * + * \ingroup Platform + * \brief Allocate zeroed out affinity bitmask object. + * + * \note Requires that the module heap be initialized. + * + * \param[in] module The module whose heap will be used to allocate + * the affinity mask. + * + * \return Allocated affinity mask on success, NULL on failure. + * + *********************************************************************** + */ +vmk_AffinityMask vmk_AffinityMaskCreate( + vmk_ModuleID module); + +/* + *********************************************************************** + * vmk_AffinityMaskDestroy -- */ /** + * + * \ingroup Platform + * \brief Free affinity bitmask object. + * + * \param[in] affinityMask Affinity mask to be freed. + * + *********************************************************************** + */ +void vmk_AffinityMaskDestroy( + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_AffinityMaskAdd -- */ /** + * + * \ingroup Platform + * \brief Add a CPU to an affinity bitmask. + * + * \param[in] cpuNum Index of the CPU, starting at 0. + * \param[out] affinityMask The affinity mask to be modified. + * + *********************************************************************** + */ +void vmk_AffinityMaskAdd( + vmk_uint32 cpuNum, + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_AffinityMaskDel -- */ /** + * + * \ingroup Platform + * \brief Delete a CPU from an affinity bitmask. + * + * \param[in] cpuNum Index of the CPU, starting at 0. + * \param[out] affinityMask The affinity mask to be modified. + * + *********************************************************************** + */ +void vmk_AffinityMaskDel( + vmk_uint32 cpuNum, + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_AffinityMaskClear -- */ /** + * + * \ingroup Platform + * \brief Clear an affinity bitmask of all CPUs. + * + * \param[out] affinityMask The affinity mask to be modified. + * + *********************************************************************** + */ +void vmk_AffinityMaskClear( + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_AffinityMaskFill -- */ /** + * + * \ingroup Platform + * \brief Set an affinity to include all CPUs. + * + * \param[out] affinityMask The affinity mask to be modified. + * + *********************************************************************** + */ +void vmk_AffinityMaskFill( + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_AffinityMaskHasPCPU -- */ /** + * + * \ingroup Platform + * \brief Test if a given affinity mask includes a particular PCPU number. + * + * \param[in] affinityMask The affinity mask to be tested for + * inclusion. + * \param[in] cpuNum The CPU number. + * + * \retval VMK_TRUE cpuNum is represented in the bitmask. + * \retval VMK_FALSE cpuNum is not represented in the bitmask. + * + *********************************************************************** + */ +vmk_Bool vmk_AffinityMaskHasPCPU( + vmk_AffinityMask affinityMask, + vmk_uint32 cpuNum); + + +/* + *********************************************************************** + * vmk_CPUDisableInterrupts -- */ /** + * + * \ingroup Platform + * \brief Disable interrupts on the current CPU. + * + *********************************************************************** + */ +void vmk_CPUDisableInterrupts(void); + +/* + *********************************************************************** + * vmk_CPUEnableInterrupts -- */ /** + * + * \ingroup Platform + * \brief Enable interrupts on the current CPU. + * + *********************************************************************** + */ +void vmk_CPUEnableInterrupts(void); + +/* + *********************************************************************** + * vmk_CPUHasIntsEnabled -- */ /** + * + * \ingroup Platform + * \brief Check whether interrupts are enabled on the current CPU. + * + * \retval VMK_TRUE Interrupts are enabled on the current CPU. + * \retval VMK_FALSE Interrupts are disabled on the current CPU. + * + *********************************************************************** + */ +vmk_Bool vmk_CPUHasIntsEnabled(void); + +/* + *********************************************************************** + * VMK_ASSERT_CPU_HAS_INTS_ENABLED -- */ /** + * + * \ingroup Platform + * \brief Assert that interrupts are enabled on the current CPU. + * + *********************************************************************** + */ +#define VMK_ASSERT_CPU_HAS_INTS_ENABLED() \ + VMK_ASSERT(vmk_CPUHasIntsEnabled()) + +/* + *********************************************************************** + * VMK_ASSERT_CPU_HAS_INTS_DISABLED -- */ /** + * + * \ingroup Platform + * \brief Assert that interrupts are disabled on the current CPU. + * + *********************************************************************** + */ +#define VMK_ASSERT_CPU_HAS_INTS_DISABLED() \ + VMK_ASSERT(!vmk_CPUHasIntsEnabled()) + +/* + *********************************************************************** + * vmk_CPUGetFlags -- */ /** + * + * \ingroup Platform + * \brief Get the current CPU's interrupt flags. + * + * \return The current CPU's interrupt flags. + * + *********************************************************************** + */ +vmk_CPUFlags vmk_CPUGetFlags(void); + +/* + *********************************************************************** + * vmk_CPUSetFlags -- */ /** + * + * \ingroup Platform + * \brief Restore the current CPU's interrupt flags + * + *********************************************************************** + */ +void vmk_CPUSetFlags( + vmk_CPUFlags flags); + + +/* + *********************************************************************** + * vmk_CPUEnsureClearDF -- */ /** + * + * \ingroup Platform + * \brief Ensures that the DF bit is clear. + * + * This is useful for instructions like outs, ins, scas, movs, stos, + * cmps, lods which look at DF. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_CPUEnsureClearDF(void) +{ + __asm__ __volatile__ ("cld\n\t"); +} + +/* + *********************************************************************** + * vmk_CPUMemFenceRead -- */ /** + * + * \ingroup Platform + * \brief Ensure that all loads have completed. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_CPUMemFenceRead(void) +{ + asm volatile ("lfence" ::: "memory"); +} + +/* + *********************************************************************** + * vmk_CPUMemFenceWrite -- */ /** + * + * \ingroup Platform + * \brief Ensure that all stores are completed and globally visible. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_CPUMemFenceWrite(void) +{ + asm volatile ("sfence" ::: "memory"); +} + +/* + *********************************************************************** + * vmk_CPUMemFenceReadWrite -- */ /** + * + * \ingroup Platform + * \brief Ensure that all loads and stores are completed and globally + * visible. + * + *********************************************************************** + */ +static VMK_ALWAYS_INLINE void vmk_CPUMemFenceReadWrite(void) +{ + asm volatile ("mfence" ::: "memory"); +} + +#endif /* _VMKAPI_PLATFORM_H_ */ +/* @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform_incompat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform_incompat.h new file mode 100644 index 0000000..d31fea4 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_platform_incompat.h @@ -0,0 +1,40 @@ +/* ********************************************************** + * Copyright (C) 2009 VMware, Inc. All Rights Reserved + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Platform (incompatible) */ /** + * \addtogroup Platform + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_PLATFORM_INCOMPAT_H_ +#define _VMKAPI_PLATFORM_INCOMPAT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + *********************************************************************** + * vmk_GetAPICCPUID -- */ /** + * + * \ingroup Platform + * \brief Return the APIC ID of a CPU based on its PCPUNum + * + *********************************************************************** + */ +vmk_uint32 vmk_GetAPICCPUID( + vmk_uint32 pcpuNum); + +#endif /*_VMKAPI_PLATFORM_INCOMPAT_H_*/ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_proc.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_proc.h new file mode 100644 index 0000000..98ccd03 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_proc.h @@ -0,0 +1,221 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Proc */ /** + * \defgroup Proc ProcFS Emulation Interfaces + * + * Interfaces relating to the procfs emulation + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_PROC_H_ +#define _VMKAPI_PROC_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/** + * \brief Top-level parent nodess + */ +typedef enum vmk_ProcEntryParent { + VMK_PROC_PRIVATE = -1, + VMK_PROC_ROOT = 0, + VMK_PROC_ROOT_DRIVER, + VMK_PROC_ROOT_NET, + VMK_PROC_ROOT_SCSI, + VMK_PROC_ROOT_BUS, + VMK_PROC_MAX_PREDEF, +} vmk_ProcEntryParent; + +/** Max length of proc name including terminating nul. */ +#define VMK_PROC_MAX_NAME 64 + +/** Max length that can be read during a proc read */ +#define VMK_PROC_READ_MAX (128 * 1024) + +typedef struct vmk_ProcEntryInt vmk_ProcEntryInt, *vmk_ProcEntry; + +typedef int (*vmk_ProcRead)(vmk_ProcEntry vpe, char *buffer, int *len); +typedef int (*vmk_ProcWrite)(vmk_ProcEntry vpe, char *buffer, int *len); + +/* + *********************************************************************** + * vmk_ProcEntryCreate -- */ /** + * + * \ingroup Proc + * \brief Allocate and initialize proc entry structure + * + * \note Requires that the module heap be initialized. + * + * \param[out] vpe Pointer to a new vmk proc entry is returned. + * \param[in] moduleID Module ID who manages the created proc entry. + * \param[in] name Name of the proc entry, 0 terminated string. + * \param[in] isDir Specify if this proc entry is directory or not. + * + * \retval VMK_OK vmk proc entry was successfully initialized + * \retval VMK_NO_MEMORY vmk proc entry could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ProcEntryCreate( + vmk_ProcEntry *vpe, + vmk_ModuleID moduleID, + const char *name, + vmk_Bool isDir); + +/* + *********************************************************************** + * vmk_ProcEntryDestroy -- */ /** + * + * \ingroup Proc + * \brief Frees the proc entry structure + * + * \param[in] vpe Pointer to the vmk proc entry to be freed. + * + *********************************************************************** + */ +void vmk_ProcEntryDestroy( + vmk_ProcEntry vpe); + +/* + *********************************************************************** + * vmk_ProcEntrySetup -- */ /** + * + * \ingroup Proc + * \brief Sets up the proc entry structure + * + * \param[in] vpe Pointer to the vmk proc entry to setup. + * \param[in] parent Pointer to the parent vmk proc entry. + * \param[in] read Read handler for this proc entry. + * \param[in] write Write handler for this proc entry. + * \param[in] canBlock Specify if user need to block. + * \param[in] private Private data for this proc entry. + * + *********************************************************************** + */ +void vmk_ProcEntrySetup( + vmk_ProcEntry vpe, + vmk_ProcEntry parent, + vmk_ProcRead read, + vmk_ProcWrite write, + vmk_Bool canBlock, + void *private); + +/* + *********************************************************************** + * vmk_ProcEntryGetPrivate -- */ /** + * + * \ingroup Proc + * \brief Returns private data of a proc entry + * + * \param[in] vpe Pointer to the vmk proc entry. + * + * \retval Pointer to the private data + * + *********************************************************************** + */ +void* vmk_ProcEntryGetPrivate( + vmk_ProcEntry vpe); + +/* + *********************************************************************** + * vmk_ProcEntryGetGUID -- */ /** + * + * \ingroup Proc + * \brief Returns UUID of a proc entry + * + * \param[in] vpe Pointer to the vmk proc entry. + * + * \retval UUID of the proc entry. + * + *********************************************************************** + */ +vmk_uint32 vmk_ProcEntryGetGUID( + vmk_ProcEntry vpe); + +/* + *********************************************************************** + * vmk_ProcRegister -- */ /** + * + * \ingroup Proc + * \brief Invoke VMKernel function to register a proc entry + * + * \param[in] vpe Pointer to the vmk proc entry to be registered. + * + *********************************************************************** + */ +void vmk_ProcRegister( + vmk_ProcEntry vpe); + +/* + *********************************************************************** + * vmk_ProcUnRegister -- */ /** + * + * \ingroup Proc + * \brief Invoke VMKernel function to remove a previously registered proc + * entry from the /proc file system. + * + * \param[in] vpe Pointer to the vmk proc entry to be registered. + * + * \retval VMK_OK Unregister successful + * \retval VMK_NOT_FOUND vmk proc entry not found + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ProcUnRegister( + vmk_ProcEntry vpe); + +/* + *********************************************************************** + * vmk_ProcSetupPredefinedNode -- */ /** + * + * \ingroup Proc + * \brief Invoke VMKernel function to hook up pre-defined proc node + * + * \param[in] idx Index of the pre-defined proc node + * \param[in] vpe Pointer to the pre-defined proc node to be setup. + * \param[in] root Specify if vmk proc entry is the root node + * + *********************************************************************** + */ +void vmk_ProcSetupPredefinedNode( + vmk_ProcEntryParent idx, + vmk_ProcEntry vpe, + vmk_Bool root); + +/* + *********************************************************************** + * vmk_ProcRemovePredefinedNode -- */ /** + * + * \ingroup Proc + * \brief Invoke VMKernel function to remove pre-defined proc node + * + * \param[in] idx Index of the pre-defined proc node + * \param[in] vpe Pointer to the pre-defined proc node to be removed. + * \param[in] root Specify if vmk proc entry is the root node + * + *********************************************************************** + */ +void vmk_ProcRemovePredefinedNode( + vmk_ProcEntryParent idx, + vmk_ProcEntry vpe, + vmk_Bool root); + +#endif /* _VMKAPI_PROC_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_revision.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_revision.h new file mode 100644 index 0000000..7584d63 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_revision.h @@ -0,0 +1,244 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Define and document the Revision group + * */ /** + * \defgroup Revision Revision Numbering + * + * If an interface is exported it should be accompanied by a declaration + * of it's revision. This is done for the vmkapi itself and some of its + * constituent interfaces such as the SCSI interfaces.\n + * \n + * To declare a revision, pick a representative prefix. The prefix + * is usually related to the interface being exported. For the sake + * of example, let's usee the prefix "FOO".\n + * \n + * The prefix should be used to declare the major, minor, patch-level + * and development level for the interface. This is done by declaring + * four macros for each part of the interface's revision number. Each + * number should be between 0-255.\n + * \n + * For example, here is the revision declaration for the interface + * FOO at revision 1.2.0-25:\n + *\n + * \code + * #define FOO_REVISION_MAJOR 1 + * #define FOO_REVISION_MINOR 2 + * #define FOO_REVISION_UPDATE 0 + * #define FOO_REVISION_PATCH_LEVEL 25 + * \endcode + * \n + * Often, it is useful to compare revision numbers or store them in a + * compact form. This is often represented by an additional macro + * declaration as follows: + * \n + * \code + * #define FOO_REVISION VMK_REVISION_NUMBER(FOO) + * \endcode + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_REVISION_H_ +#define _VMKAPI_REVISION_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/* + * Internal machinery for revision utility macros. + */ +#define VMK_REVISION_STRINGIFY(x) #x +#define VMK_REVISION_EXPANDSTR(x) VMK_REVISION_STRINGIFY(x) + +/* + *********************************************************************** + * VMK_REVISION_STRING -- */ /** + * + * \ingroup Revision + * \brief Convert a interface's revision to a string + * + * \param id The prefix for the interface to be converted + * + * \return A printable string that represets the interface's revision + * + * \par Example: + * \code + * #define FOO_REVISION_MAJOR 1 + * #define FOO_REVISION_MINOR 2 + * #define FOO_REVISION_UPDATE 0 + * #define FOO_REVISION_PATCH_LEVEL 25 + * + * char *api_string = VMK_REVISION_STRING(FOO); + * \endcode + * + *********************************************************************** + */ +#define VMK_REVISION_STRING(id) \ + VMK_REVISION_EXPANDSTR(id##_REVISION_MAJOR) "." \ + VMK_REVISION_EXPANDSTR(id##_REVISION_MINOR) "." \ + VMK_REVISION_EXPANDSTR(id##_REVISION_PATCH_LEVEL) "-" \ + VMK_REVISION_EXPANDSTR(id##_REVISION_UPDATE) +/* + *********************************************************************** + * VMK_REVISION_NUMBER -- */ /** + * + * \ingroup Revision + * \brief Convert a interface's revision to a vmk_revnum + * + * \param id The prefix for the interface to be converted + * + * \return The interface's version number encoded in a vmk_revnum + * + * \par Example: + * \code + * #define FOO_REVISION_MAJOR 1 + * #define FOO_REVISION_MINOR 2 + * #define FOO_REVISION_UPDATE 0 + * #define FOO_REVISION_PATCH_LEVEL 25 + * + * vmk_revnum fooRev = VMK_REVISION_NUMBER(FOO); + * \endcode + * + *********************************************************************** + */ +#define VMK_REVISION_NUMBER(id) ((((id##_REVISION_MAJOR) & 0xFF) << 24) | \ + (((id##_REVISION_MINOR) & 0xFF) << 16) | \ + (((id##_REVISION_UPDATE) & 0xFF) << 8) | \ + ((id##_REVISION_PATCH_LEVEL) & 0xFF)) + +/* + *********************************************************************** + * VMK_REVISION_FROM_NUMBERS -- */ /** + * + * \ingroup Revision + * \brief Create a revision number from specified version numbers. + * + * \param major Major number. + * \param minor Minor number. + * \param update Update number. + * \param patch_level Patch_level number. + * + * \return A revision number that corresponds to the given parameters. + * + * \par Example: + * \code + * #if VMKAPI_REVISION == VMK_REVISION_FROM_NUMBERS(1,0,0,0) + * \endcode + * + *********************************************************************** + */ +#define VMK_REVISION_FROM_NUMBERS(major, minor, update, patch_level) \ + ((((major) & 0xFF) << 24) | \ + (((minor) & 0xFF) << 16) | \ + (((update) & 0xFF) << 8) | \ + ((patch_level) & 0xFF)) + +/* + * \brief Type to use when storing revision numbers + */ +typedef vmk_uint32 vmk_revnum; + +/* + *********************************************************************** + * vmk_RevisionsAreEqual -- */ /** + * + * \ingroup Revision + * \brief Determine if two revision numbers are equal + * + * \param rev1 The first revision number to compare + * \param rev2 The second revision number to compare + * + * \retval VMK_TRUE if the revision numbers are equal + * \retval VMK_FALSE if the revision numbers are not equal + * + *********************************************************************** + */ +static inline +vmk_Bool +vmk_RevisionsAreEqual( + vmk_revnum rev1, + vmk_revnum rev2) +{ + return (rev1 == rev2) ? VMK_TRUE : VMK_FALSE ; +} + +/* + *********************************************************************** + * VMK_REVISION_MAJOR -- */ /** + * + * \ingroup Revision + * \brief Extract the major revision number from a vmk_revnum + * + * \param rev A variable of type vmk_revnum to extract the major + * revision number from + * + * \return The interface's major revision number + * + *********************************************************************** + */ +#define VMK_REVISION_MAJOR(rev) (((rev) >> 24) & 0xFF) + +/* + *********************************************************************** + * VMK_REVISION_MINOR -- */ /** + * + * \ingroup Revision + * \brief Extract the minor revision number from a vmk_revnum + * + * \param rev A variable of type vmk_revnum to extract the minor + * revision number from + * + * \return The interface's minor revision number + * + *********************************************************************** + */ +#define VMK_REVISION_MINOR(rev) (((rev) >> 16) & 0xFF) + +/* + *********************************************************************** + * VMK_REVISION_UPDATE -- */ /** + * + * \ingroup Revision + * \brief Extract the update revision number from a vmk_revnum + * + * \param rev A variable of type vmk_revnum to extract the update + * revision number from + * + * \return The interface's update revision number + * + *********************************************************************** + */ +#define VMK_REVISION_UPDATE(rev) (((rev) >> 8) & 0xFF) + +/* + *********************************************************************** + * VMK_REVISION_PATCH_LEVEL -- */ /** + * + * \ingroup Revision + * \brief Extract the patch-level revision number from a vmk_revnum + * + * \param rev A variable of type vmk_revnum to extract the patch-level + * revision number from + * + * \return The interface's patch-level revision number + * + *********************************************************************** + */ +#define VMK_REVISION_PATCH_LEVEL(rev) ((rev) & 0xFF) + +#endif /* _VMKAPI_REVISION_H_ */ +/* @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_scatter_gather.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_scatter_gather.h new file mode 100644 index 0000000..1f65f98 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_scatter_gather.h @@ -0,0 +1,529 @@ +/* ********************************************************** + * Copyright 2005 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * ScatterGather */ /** + * \defgroup ScatterGather Scatter Gather Buffer Management + * + * Interfaces to manage discontiguous regions of machine memory that + * form a virtually contiguous buffer. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCATTER_GATHER_H_ +#define _VMKAPI_SCATTER_GATHER_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_memory.h" + +/* + *********************************************************************** + * VMK_SGARRAY_SIZE -- */ /** + * + * \ingroup ScatterGather + * \brief Compute the number of bytes necessary to contain a + * scatter-gather array that holds, at most, nbElems + * scatter-gather elements. + * + * \param[in] nbElems Number of elements in the scatter-gather array. + * + * \returns Number of bytes necessary to contain a scatter-gather array + * that holds, at most, the specified number of scatter-gather + * elements. + * + *********************************************************************** +*/ +#define VMK_SGARRAY_SIZE(nbElems) (sizeof(vmk_SgArray) + (nbElems) * sizeof(vmk_SgElem)) + +/** + * \brief + * Element for scatter-gather array that represents a machine-contiguous + * region of memory. + */ +typedef struct vmk_SgElem { + /** + * \brief + * Starting machine address of the machine-contiguous region this + * element represents. + */ + vmk_MachAddr addr; + /** + * \brief + * Length of the machine-contiguous region this element represents. + */ + vmk_uint32 length; +} vmk_SgElem; + + +/** + * \brief Scatter-gather array + */ +typedef struct vmk_SgArray { + /** \brief Maximum possible elements this scatter-gather array can hold */ + vmk_uint32 maxElems; + + /** \brief Number of elements in use */ + vmk_uint32 nbElems; + + /** \brief Elements of the array */ + vmk_SgElem elem[0]; +} vmk_SgArray; + +/** + * \brief Opaque handle for scatter-gather operations. + */ +typedef struct vmk_SgOpsHandleInt *vmk_SgOpsHandle; + + +/* + *********************************************************************** + * vmk_SgArrayOpAlloc-- */ /** + * + * \ingroup ScatterGather + * \brief Callback to allocate and initialize a new scatter-gather + * array. + * + * The returned array should have it's maxElems field set correctly + * and nbElems field set to zero. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[out] sg Variable to return the newly allocated + * buffer in. + * \param[in] numElems Max elements the new array must support. + * \param[in] private Private data from vmk_SgCreateOpsHandle(). + * + * \retval VMK_OK The allocation succeeded. + * \retval VMK_NO_MEMORY Not enough memory to allocate a new + * scatter-gather element. + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SgArrayOpAlloc)(vmk_SgOpsHandle handle, + vmk_SgArray **sg, + vmk_uint32 numElems, + void *private); + +/* + *********************************************************************** + * vmk_SgArrayOpFree-- */ /** + * + * \ingroup ScatterGather + * \brief Callback to free an existing scatter-gather array. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sg scatter-gather array to free. + * \param[in] private Private data from vmk_SgCreateOpsHandle(). + * + * \retval VMK_OK The free succeeded. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SgArrayOpFree)(vmk_SgOpsHandle handle, + vmk_SgArray *sg, + void *private); + +/* + *********************************************************************** + * vmk_SgArrayOpInit-- */ /** + * + * \ingroup ScatterGather + * \brief Callback to initialize a scatter-gather array with the + * machine address ranges for a given virtual buffer. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sg scatter-gather array to update. + * \param[in] vaddr Virtual adress of the beginning of the + * buffer to represent in the scatter-gather + * array. + * \param[in] size Size in bytes of the buffer to represent + * in the scatter-gather array. + * \param[in] startingSGEntry Entry in elem array to begin representing + * the buffer. + * \param[in] private Private data from vmk_SgCreateOpsHandle(). + * + * \retval VMK_OK The initialization succeeded. + * \retval VMK_BAD_PARAM The buffer has too many machine address ranges + * to be represented in the scatter-gather array + * with the given parameters. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SgArrayOpInit)(vmk_SgOpsHandle handle, + vmk_SgArray *sg, + vmk_uint8 *vaddr, + vmk_uint32 size, + vmk_uint32 startingSGEntry, + void *private); + +/* + *********************************************************************** + * vmk_SgArrayOpResize-- */ /** + * + * \ingroup ScatterGather + * + * \brief Callback to recalculate an existing scatter-gather array when + * the virtual buffer it represents changes in size. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[out] sg Newly sized scatter-gather array. + * \param[in] vaddr Virtual address of the buffer being resized. + * \param[in] currsize Original size in bytes of the buffer. + * \param[in] newsize New size in bytes of the buffer. + * \param[in] private Private data from vmk_SgCreateOpsHandle(). + * + * \retval VMK_OK The resize succeeded. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SgArrayOpResize)(vmk_SgOpsHandle handle, + vmk_SgArray **sg, + vmk_uint8 *vaddr, + vmk_uint32 currsize, + vmk_uint32 newsize, + void *private); + +/* + *********************************************************************** + * vmk_SgArrayOpCopy-- */ /** + * + * \ingroup ScatterGather + * \brief Callback to copy a portion of the data represented by one + * scatter-gather array to another. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] dstArray scatter-gather array representing the + * destination for the data to be copied. + * \param[in] initialDstOffset Starting entry in dstArray to copy + * the data to. + * \param[in] srcArray scatter-gather array representing the + * source for the data to be copied. + * \param[in] initialSrcOffset Starting entry in the srcArray to copy + * the data from. + * \param[in] bytesToCopy Number of bytes to copy. + * \param[out] totalBytesCopied Number of bytes actually moved when + * this callback completes. + * \param[in] private Private data from vmk_SgCreateOpsHandle(). + * + * \retval VMK_OK The copy completed successfully + * \retval VMK_FAILURE The copy failed. Some bytes may have been copied. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SgArrayOpCopy)(vmk_SgOpsHandle handle, + vmk_SgArray *dstArray, + int initialDstOffset, + vmk_SgArray *srcArray, + int initialSrcOffset, + int bytesToCopy, + int *totalBytesCopied, + void *private); + +/** + * \brief Scatter-gather array operations. + * + * Routines not implemented by the caller must be set to NULL. + * + * Caller may override default behavior for any routine by supplying + * the routines. + */ +typedef struct vmk_SgArrayOps { + /** Handler used when allocating scatter-gather arrays */ + vmk_SgArrayOpAlloc alloc; + + /** Handler used when freeing scatter-gather arrays */ + vmk_SgArrayOpFree free; + + /** Handler used when initializing a scatter-gather array */ + vmk_SgArrayOpInit init; + + /** Handler used when initializing a scatter-gather array */ + vmk_SgArrayOpResize resize; + + /** Handler used when copying data between scatter-gather arrays */ + vmk_SgArrayOpCopy copy; +} vmk_SgArrayOps; + +/* + *********************************************************************** + * vmk_SgComputeMaxEntries-- */ /** + * + * \brief Compute worst-case maximum number of scatter-gather entries + * necessary to accomodate a memory region starting at a given + * virtual address, of a given size. + * + * \param[in] vaddr Virtual address of the buffer + * \param[in] size Length of the buffer in bytes + * \param[out] numElems Number of scatter-gather entries needed + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgComputeMaxEntries(vmk_uint8 *vaddr, + vmk_uint32 size, + vmk_uint32 *numElems); + +/* + *********************************************************************** + * vmk_SgCreateOpsHandle-- */ /** + * + * \ingroup ScatterGather + * \brief Create an opaque handle for scatter-gather operations. + * + * The handle is used by other routines to invoke callbacks and track + * other state related to scatter-gather operations. + * + * \param[in] heapId HeapID to allocate memory on. + * \param[out] handle Opaque scatter-gather ops handle. + * \param[in] ops Scatter-gather ops to associate with + * the opaque handle. + * \param[in] private Context data private to the caller. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgCreateOpsHandle(vmk_HeapID heapId, + vmk_SgOpsHandle *handle, + vmk_SgArrayOps *ops, + void *private); +/* + *********************************************************************** + * vmk_SgDestroyOpsHandle-- */ /** + * + * \ingroup ScatterGather + * \brief Destroy opaque handle for scatter-gather operations. + * + * \param[in] handle Opaque scatter-gather ops handle to be destroyed. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgDestroyOpsHandle(vmk_SgOpsHandle handle); + +/* + *********************************************************************** + * vmk_SgCreateSimpleOpsHandle-- */ /** + * + * \ingroup ScatterGather + * \brief Create an opaque handle for scatter-gather operations that + * uses only default callbacks. + * + * May be destroyed using vmk_SgDestroyOpsHandle. + * + * \param[in] heapID Heap to allocate handle on. + * \param[in,out] handle Opaque scatter-gather ops handle. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgCreateSimpleOpsHandle(vmk_HeapID heapID, + vmk_SgOpsHandle *handle); + + +/* + *********************************************************************** + * vmk_SgProtectHandle -- */ /** + * + * \ingroup ScatterGather + * \brief Set protection on a handle to prevent unwanted/accidental + * deletion. + * + * \param[in] handle Opaque scatter-gather ops handle to be protected. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgProtectHandle(vmk_SgOpsHandle handle); + + +/* + *********************************************************************** + * vmk_SgUnprotectHandle -- */ /** + * + * \ingroup ScatterGather + * \brief Clear protection on the handle so it can be deleted. + * + * \param[in] handle Opaque scatter-gather ops handle to clear + * protection on. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgUnprotectHandle(vmk_SgOpsHandle handle); + + +/* + *********************************************************************** + * vmk_SgDestroySimpleOpsHandle-- */ /** + * + * \ingroup ScatterGather + * \brief Destroy Simple SG Ops handle passed into the SG routines. + * + * Memory will be freed internally holding the structures pointed + * to by handle, allocated in in vmk_SgCreateOpsHandle. + * + * \param[in] handle Opaque scatter-gather ops handle to be destroyed. + * + *********************************************************************** +*/ +VMK_ReturnStatus vmk_SgDestroySimpleOpsHandle(vmk_SgOpsHandle handle); + +/* + *********************************************************************** + * vmk_SgAlloc-- */ /** + * + * \ingroup ScatterGather + * \brief Allocate a scatter-gather array with enough entries to + * represent any buffer in virtual address space of a given size. + * + * Allocate a SG array that's large enough to hold the machine + * address SGEs describing a range of virtual addresses. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sg New scatter-gather array. + * \param[in] size Used to compute number of SG Array elements. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgAlloc(vmk_SgOpsHandle handle, + vmk_SgArray **sg, + vmk_uint32 size); + +/* + *********************************************************************** + * vmk_SgAllocWithInit-- */ /** + * + * \ingroup ScatterGather + * \brief Allocate a scatter-gather array with enough entries to + * represent a given buffer in virtual address space. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sg Scatter-gather array to initialize. + * \param[in] vaddr Virtual address of buffer. + * \param[in] size Size in bytes of the buffer. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgAllocWithInit(vmk_SgOpsHandle handle, + vmk_SgArray **sg, + vmk_uint8 *vaddr, + vmk_uint32 size); + +/* + *********************************************************************** + * vmk_SgInit-- */ /** + * + * \ingroup ScatterGather + * \brief Initialize a given scatter-gather array with the machine + * addresses representing a buffer in virtual address space. + * + * The scatter-gather array must have enough scatter-gather entries + * to describe the machine address ranges backing the given buffer. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sg Scatter-gather array to initialize. + * \param[in] vaddr Virtual address of buffer. + * \param[in] size Size in bytes of the buffer. + * \param[in] initSGEntry Starting entry index for initialization. + * + * \sa vmk_SgComputeMaxEntries + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgInit(vmk_SgOpsHandle handle, + vmk_SgArray *sg, + vmk_uint8 *vaddr, + vmk_uint32 size, + vmk_uint32 initSGEntry); + +/* + *********************************************************************** + * vmk_SgFree -- */ /** + * + * \ingroup ScatterGather + * \brief Free a scatter-gather array. + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] sgArray Pointer returned by vmk_AllocSgArray() + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgFree(vmk_SgOpsHandle handle, + vmk_SgArray *sgArray); + +/* + *********************************************************************** + * vmk_SgCopy -- */ /** + * + * \ingroup ScatterGather + * \brief Copy data represented by one scatter-gather array to another + * + * \param[in] handle Opaque scatter-gather ops handle. + * \param[in] dstArray Destination scatter-gather array. + * \param[in] initialDstOffset Offset into dstArray to start copying to. + * \param[in] srcArray Scatter-gather to copy from. + * \param[in] initialSrcOffset Offset into srcArray to start copying from. + * \param[in] bytesToCopy Maximum length of data to copy. + * \param[out] totalBytesCopied Number of bytes actually copied. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SgCopy(vmk_SgOpsHandle handle, + vmk_SgArray *dstArray, int initialDstOffset, + vmk_SgArray *srcArray, int initialSrcOffset, + int bytesToCopy, int * totalBytesCopied); + +/* + *********************************************************************** + * vmk_GetSgDataLen -- */ /** + * + * \ingroup ScatterGather + * \brief Compute the size of a scatter-gather list's payload. + * + *********************************************************************** + */ +vmk_uint32 vmk_GetSgDataLen(vmk_SgArray *sgArray); + +/* + *********************************************************************** + * vmk_CopyToSg-- */ /** + * + * \ingroup ScatterGather + * \brief Copy data from a buffer to the machine addresses + * defined in a scatter-gather array. + * + * \retval VMK_OK The copy completed successfully + * \retval VMK_FAILURE The copy failed. Some bytes may have been copied. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CopyToSg(vmk_SgArray *sgArray, + void *dataBuffer, + unsigned int dataLen); +/* + *********************************************************************** + * vmk_CopyFromSg-- */ /** + * + * \ingroup ScatterGather + * \brief Copy data from the machine addresses of a scatter-gather + * array to a buffer. + * + * \retval VMK_OK The copy completed successfully + * \retval VMK_FAILURE The copy failed. Some bytes may have been copied. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_CopyFromSg(void *dataBuffer, + vmk_SgArray *sgArray, + unsigned int dataLen); +#endif /* _VMKAPI_SCATTER_GATHER_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_sem.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_sem.h new file mode 100644 index 0000000..4af83df --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_sem.h @@ -0,0 +1,563 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Semaphores */ /** + * \defgroup Semaphores Semaphores + * + * \par Binary Semaphore Ranks: + * Binary semaphores are semaphores which may be treated like blocking + * locks. As such, they take a rank and sub-rank in a manner analogous + * the the lock ranking used for spinlocks.\n + * \n + * When a world locks a binary semaphore \em BS1 with major rank \em R1 and + * minor rank \em r1, it may only lock another binary semaphore BS2 with + * major rank \em R2 and minor rank \em r2 when: + * \n + * \em R2 > \em R1 \n + * or \n + * \em R2 == \em R1 and \em r2 > \em r1 \n + * \n + * Be aware that rank checking is only performed on debug builds. + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SEM_H_ +#define _VMKAPI_SEM_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_module.h" +#include "base/vmkapi_status.h" + +/** \cond nodoc */ +/* Private definitions */ +#define _VMK_SEMA_RANK_UNRANKED 0x10000 +#define _VMK_SEMA_RANK_MAX 0xffff +#define _VMK_SEMA_RANK_MIN 0 + +#define _VMK_SEMA_RANK_LEAF _VMK_SEMA_RANK_MAX +#define _VMK_SEMA_RANK_STORAGE 0x8000 + +typedef vmk_uint32 _vmk_SemaRank, _vmk_SemaRankMinor; +/** \endcond nodoc */ + +/** + * \brief unranked rank + */ +#define VMK_SEMA_RANK_UNRANKED _VMK_SEMA_RANK_UNRANKED + +/** + * \brief Leaf rank for semaphores + */ +#define VMK_SEMA_RANK_LEAF _VMK_SEMA_RANK_LEAF + +/** + * \brief Maximum rank for semaphores + */ +#define VMK_SEMA_RANK_MAX _VMK_SEMA_RANK_MAX + +/** + * \brief Minimum rank for semaphores + */ +#define VMK_SEMA_RANK_MIN _VMK_SEMA_RANK_MIN + +/** + * \brief Rank for semaphores in storage components + */ +#define VMK_SEMA_RANK_STORAGE _VMK_SEMA_RANK_STORAGE + +/** + * \brief Rank for semaphores + */ +typedef _vmk_SemaRank vmk_SemaphoreRank; + +/** + * \brief Sub rank for semaphores + */ +typedef _vmk_SemaRankMinor vmk_SemaphoreRankMinor; + +/** + * \brief Opaque handle for semaphores + */ +typedef struct vmk_SemaphoreInt *vmk_Semaphore; + +/** + * \brief Opaque handle for readers-writers semaphores + */ +typedef struct vmk_SemaphoreRWInt *vmk_SemaphoreRW; + +/* + *********************************************************************** + * vmk_SemaCreate -- */ /** + * + * \ingroup Semaphores + * \brief Allocate and initialize a counting semaphore + * + * \note Requires that the module heap be initialized. + * + * \param[out] sema New counting semaphore. + * \param[in] moduleID Module on whose behalf the semaphore + * is created. + * \param[in] name Human-readable name of the semaphore. + * \param[in] value Initial count. + * + * \retval VMK_OK The semaphore was successfully created + * \retval VMK_NO_MEMORY The semaphore could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SemaCreate( + vmk_Semaphore *sema, + vmk_ModuleID moduleID, + const char *name, + vmk_int32 value); + +/* + *********************************************************************** + * vmk_BinarySemaCreate -- */ /** + * + * \ingroup Semaphores + * \brief Allocate and initialize a binary semaphore + * + * \note Requires that the module heap be initialized. + * + * \param[out] sema New counting semaphore. + * \param[in] moduleID Module on whose behalf the semaphore + * is created. + * \param[in] name Human-readable name of the semaphore. + * \param[in] majorRank Major rank of the semaphore. + * The rank value must be greater than or + * equal to VMK_SEMA_RANK_MIN and less than + * or equal to VMK_SEMA_RANK_MAX. + * \param[in] minorRank Minor rank of the semaphore. + * The rank value must be greater than or + * equal to VMK_SEMA_RANK_MIN and less than + * or equal to VMK_SEMA_RANK_MAX. + * + * \retval VMK_OK The semaphore was successfully created + * \retval VMK_NO_MEMORY The semaphore could not be allocated + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_BinarySemaCreate( + vmk_Semaphore *sema, + vmk_ModuleID moduleID, + const char *name, + vmk_SemaphoreRank majorRank, + vmk_SemaphoreRankMinor minorRank); + +/* + *********************************************************************** + * _vmkSemaIsLocked + * + * This is used by VMK_ASSERT_SEMA_LOCKED and VMK_ASSERT_SEMA_UNLOCKED. + * VMKAPI users should not call this function directly. + * + *********************************************************************** + */ +/** \cond nodoc */ +VMK_ReturnStatus _vmkSemaIsLocked( + vmk_Semaphore *sema, + vmk_Bool *isLocked); +/** \endcond */ + +/* + *********************************************************************** + * VMK_ASSERT_SEMA_LOCKED -- */ /** + * + * \ingroup Semaphores + * \brief Assert that a semaphore is currently locked only in + * debug builds. + * + * \param[in] sema Semaphore to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT_SEMA_LOCKED(sema) \ + do { \ + vmk_Bool _vmkCheckLockState ; \ + VMK_ASSERT(_vmkSemaIsLocked((sema),&_vmkCheckLockState) == \ + VMK_OK); \ + VMK_ASSERT(_vmkCheckLockState); \ + } while(0) +#else +#define VMK_ASSERT_SEMA_LOCKED(sema) +#endif + +/* + *********************************************************************** + * VMK_ASSERT_SEMA_UNLOCKED -- */ /** + * + * \ingroup Semaphores + * \brief Assert that a semaphore is currently unlocked only in + * debug builds. + * + * \param[in] sema Semaphore to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT_SEMA_UNLOCKED(sema) \ + do { \ + vmk_Bool _vmkCheckLockState ; \ + VMK_ASSERT(_vmkSemaIsLocked((sema),&_vmkCheckLockState) == \ + VMK_OK); \ + VMK_ASSERT(!_vmkCheckLockState); \ + } while(0) +#else +#define VMK_ASSERT_SEMA_UNLOCKED(sema) +#endif + +/* + *********************************************************************** + * vmk_SemaLock -- */ /** + * + * \ingroup Semaphores + * \brief Acquire a semaphore + * + * \pre Shall be called from a blockable context. + * \pre The caller shall not already hold a semaphore of lower or equal + * rank if the semaphore is a binary semaphore. + * + * \param[in] sema The semaphore to acquire. + * + *********************************************************************** + */ +void vmk_SemaLock( + vmk_Semaphore *sema); + +/* + *********************************************************************** + * vmk_SemaTryLock -- */ /** + * + * \ingroup Semaphores + * \brief Try to acquire a semaphore. + * + * This tries to acquire the given semaphore once. + * If the semaphore is already locked, it returns immediately. + * + * \pre Shall be called from a blockable context. + * + * \param[in] sema Semaphore to attempt to acquire. + * + * \retval VMK_OK The semaphore was successfully acquired. + * \retval VMK_BUSY The semaphore is currently locked. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SemaTryLock( + vmk_Semaphore *sema); + +/* + *********************************************************************** + * vmk_SemaUnlock -- */ /** + * + * \ingroup Semaphores + * \brief Release a semaphore + * + * \param[in] sema Semaphore to unlock. + * + *********************************************************************** + */ +void vmk_SemaUnlock( + vmk_Semaphore *sema); + +/* + *********************************************************************** + * vmk_SemaDestroy -- */ /** + * + * \ingroup Semaphores + * \brief Destroy a semaphore + * + * Revert all side effects of vmk_SemaCreate or vmk_BinarySemaCreate. + * + * \param[in] sema Semaphore to destroy. + * + *********************************************************************** + */ +void vmk_SemaDestroy(vmk_Semaphore *sema); + +/* + *********************************************************************** + * VMK_ASSERT_RWSEMA_HAS_READERS -- */ /** + * + * \ingroup Semaphores + * \brief Assert that a readers-writers semaphore has at least one + * shared reader only in debug builds. + * + * \param[in] sema Semaphore to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT_RWSEMA_HAS_READERS(sema) \ + do { \ + VMK_ASSERT(vmk_RWSemaHasReaders(sema) == VMK_TRUE); \ + } while(0) +#else +#define VMK_ASSERT_RWSEMA_HAS_READERS(sema) +#endif + +/* + *********************************************************************** + * VMK_ASSERT_RWSEMA_HAS_WRITER -- */ /** + * + * \ingroup Semaphores + * \brief Assert that a readers-writers semaphore has a writer only in + * debug builds. + * + * \param[in] sema Semaphore to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT_RWSEMA_HAS_WRITER(sema) \ + do { \ + VMK_ASSERT(vmk_RWSemaHasWriter(sema) == VMK_TRUE); \ + } while(0) +#else +#define VMK_ASSERT_RWSEMA_HAS_WRITER(sema) +#endif + +/* + *********************************************************************** + * VMK_ASSERT_RWSEMA_HAS_READERS_WRITERS -- */ /** + * + * \ingroup Semaphores + * \brief Assert that a readers-writers semaphore has a writer only in + * debug builds. + * + * \param[in] sema Semaphore to check. + * + *********************************************************************** + */ +#if defined(VMX86_DEBUG) +#define VMK_ASSERT_RWSEMA_HAS_READERS_WRITERS(sema) \ + do { \ + VMK_ASSERT(vmk_RWSemaHasReadersWriters(sema) == VMK_TRUE); \ + } while(0) +#else +#define VMK_ASSERT_RWSEMA_HAS_READERS_WRITERS(sema) +#endif + +/* + *********************************************************************** + * vmk_RWSemaCreate -- */ /** + * + * \ingroup Semaphores + * \brief Allocate and initialize a readers-writers semaphore + * + * \param[out] sema New readers-writers semaphore. + * \param[in] moduleID Module on whose behalf the semaphore + * is created. + * \param[in] name Human-readable name of the semaphore. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWSemaCreate( + vmk_SemaphoreRW *sema, + vmk_ModuleID moduleID, + const char *name); + +/* + *********************************************************************** + * vmk_RWSemaDestroy -- */ /** + * + * \ingroup Semaphores + * \brief Destroy a readers-writers semaphore + * + * Revert all side effects of vmk_RWSemaCreate. + * + * \param[in] sema Readers-writers semaphore to destroy. + * + *********************************************************************** + */ +void vmk_RWSemaDestroy(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaReadLock -- */ /** + * + * \ingroup Semaphores + * \brief Acquire a readers-writers semaphore for shared read access. + * + * \pre Shall be called from a blockable context. + * + * \param[in] sema Readers-writers semaphore to acquire. + * + *********************************************************************** + */ +void vmk_RWSemaReadLock(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaWriteLock -- */ /** + * + * \ingroup Semaphores + * \brief Acquire a readers-writers semaphore for exclusive write + * access. + * + * \pre Shall be called from a blockable context. + * + * \param[in] sema Readers-writers semaphore to acquire. + * + *********************************************************************** + */ +void vmk_RWSemaWriteLock(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaReadUnlock -- */ /** + * + * \ingroup Semaphores + * \brief Release a readers-writers semaphore from shared read access. + * + * \param[in] sema Readers-writers semaphore to release. + * + *********************************************************************** + */ +void vmk_RWSemaReadUnlock(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaWriteUnlock -- */ /** + * + * \ingroup Semaphores + * \brief Release a readers-writers semaphore from exclusive write + * access. + * + * \param[in] sema Readers-writers semaphore to release. + * + *********************************************************************** + */ +void vmk_RWSemaWriteUnlock(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaUpgradeFromRead -- */ /** + * + * \ingroup Semaphores + * \brief Upgrade a readers-writers semaphore to exclusive write access. + * + * This requests an upgrade to exclusive writers access for the + * readers-writers semaphore while already holding shared reader access. + * If the upgrade is not immediately available, only the first caller + * can block waiting for the upgrade. Others fail, but they retain + * shared reader access. + * + * \pre Shall be called from a blockable context. + * \pre Shall already have read access to the semaphore. + * + * \param[in] sema Readers-writers semaphore to upgrade. + * + * \retval VMK_OK The semaphore was upgraded. + * \retval VMK_BUSY The semaphore could not be upgraded. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWSemaUpgradeFromRead(vmk_SemaphoreRW *sema); + + +/* + *********************************************************************** + * vmk_RWSemaTryUpgradeFromRead -- */ /** + * + * \ingroup Semaphores + * \brief Attempt to upgrade a readers-writers semaphore to + * exclusive write access. + * + * This attempts to obtain exclusive writers access to the + * readers-writers semaphore while already holding shared reader access. + * If the upgrade is not immediately available, shared reader access + * is retained. + * + * \pre Shall already have read access to the semaphore. + * + * \param[in] sema Readers-writers semaphore to upgrade. + * + * \retval VMK_OK The semaphore was upgraded. + * \retval VMK_BUSY The semaphore could not be upgraded. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RWSemaTryUpgradeFromRead(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaDowngradeToRead -- */ /** + * + * \ingroup Semaphores + * \brief Downgrade a readers-writers semaphore from exclusive + * write access to shared read access. + * + * \pre Shall already have write access to the semaphore. + * + * \param[in] sema Readers-writers semaphore to downgrade. + * + *********************************************************************** + */ +void vmk_RWSemaDowngradeToRead(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_RWSemaHasReaders -- */ /** + * + * \ingroup Semaphores + * \brief Determine if a readers-writers semaphore currently has one or + * more readers. + * + * \param[in] sema Readers-writers semaphore to inspect. + * + *********************************************************************** + */ +vmk_Bool vmk_RWSemaHasReaders(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_SemaHasWriter -- */ /** + * + * \ingroup Semaphores + * \brief Determine if a readers-writers semaphore currently has + * a writer. + * + * \param[in] sema Readers-writers semaphore to inspect. + * + *********************************************************************** + */ +vmk_Bool vmk_RWSemaHasWriter(vmk_SemaphoreRW *sema); + +/* + *********************************************************************** + * vmk_SemaHasReadersWriters -- */ /** + * + * \ingroup Semaphores + * \brief Determine if a readers-writers semaphore currently has any + * readers or an exclusive writer. + * + * \param[in] sema Readers-writers semaphore to inspect. + * + *********************************************************************** + */ +vmk_Bool vmk_RWSemaHasReadersWriters(vmk_SemaphoreRW *sema); + + + + +#endif /* _VMKAPI_SEM_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slab.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slab.h new file mode 100644 index 0000000..3e1add0 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slab.h @@ -0,0 +1,388 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Slabs */ /** + * \defgroup Slab Slab Allocation + * + * ESX Server supports slab allocation for high performance driver/stack + * implementations: + * - Reduces memory fragmentation, especially for smaller data structures + * allocated in high volume. + * - Reduces CPU consumption for data structure initialization/teardown. + * - Improves CPU hardware cache performance. + * - Provides finer grained control of memory consumption. + * - Builds structure upon the VMKAPI heap layer. + * + * The ESX concept of slab is a bit different from several well known + * OS implemenations, in that ESX slabs are not physically contiguous + * chunks of memory. An ESX slab is in fact a collection of free + * objects (as seen by the slab user). As seen by the heap, these + * objects appear allocated. + * + *@{ + * + * \par Slab Layout Considerations + * + * Care must be taken when designing a slab to ensure that the layout can + * actually be constructed. The following properties (see + * \b vmk_SlabProps structure) are particularly critical. + * + * - \b maxTotalObj + * \n + * Specifies the maximum number of objects that can be in the slab, including + * free objects cached by the slab, plus objects allocated by the user. + * Slab creation will fail if the specified objects, including internal slab + * overheads, cannot be accommodated in the portion of the heap available to + * the slab (see \b slabPercent below). + * \note + * Also note that object size may be rounded up to satisfy \b props->alignment. + * + * - \b maxFreeObj: + * \n + * In the \b VMK_SLAB_TYPE_SIMPLE, specifies the maximum number of free + * objects that may reside in the slab. In the \b VMK_SLAB_TYPE_NOMINAL + * case, specifies the maximum number of free objects that can be immediately + * allocated from the per-physical CPU caches (a portion of the slab). + * In the NOMINAL case, the maximum number of free objects is constrained + * by \b slabPercent. + * \note + * In the \b VMK_SLAB_TYPE_SIMPLE case, a heuristic typically + * sets a lower constraint on the PCPU cache size. Use + * \b VMK_SLAB_TYPE_NOMINAL if you need more precise control. + * \note + * Even then, further adjustments may be made during slab creation, + * so that the per-PCPU cache size falls into a range that internal + * data structures can efficiently handle. + * + * - \b slabPercent: + * \n + * For the \b VMK_SLAB_TYPE_SIMPLE case, gives the percentage of the heap + * that can be utilized by free objects in the slab. + * + * - \b ctrlOffset: + * \n + * Allows the developer to overlay slab control information (used + * only for free objects) with the object space (thus saving space) + * See \b vmk_SlabControlSize for more information. + * + * - \b notrim: + * \n + * If set, specifies that the slab will never free objects + * back to underlying heap. If this flag is set, then \b slabPercent + * must be 100. + * + * \note + * It should be clear that excessively large values for maxTotalObj or + * maxFreeObj, or alternatively, a small value for slabPercent, + * can cause slab creation to fail if the portion of the heap made available + * cannot accomodate the number of obects specified (including overheads). + * \note + * A similar problem may arise if maxTotalObj cannot accomodate + * maxFreeObj after the latter has been adjusted (up or down) by internal + * considerations. Since esx4.1 can support upto 256 physical CPU cores, + * maxTotalObj should be set to a minimum of 1024. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_SLAB_H_ +#define _VMKAPI_SLAB_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_status.h" + + +/** + * \ingroup Slab + * \brief Opaque handle for a slab cache + */ +typedef struct vmk_SlabIDInt *vmk_SlabID; + +#define VMK_INVALID_SLAB_ID ((vmk_SlabID)NULL) + +/* Max length of a slab name, including the trailing NUL character */ +#define VMK_MAX_SLAB_NAME 32 + + +/* + *********************************************************************** + * vmk_SlabItemConstructor -- */ /** + * + * \ingroup Slab + * \brief Item constructor - optional user defined function. Runs for + * each object when a cluster of memory is + * allocated from the heap. + * + * \note When the control structure is placed inside the free object, + * then the constructor must take care not to modify the control + * structure. + * + * \param[in] object Object to be constructed. + * \param[in] size Size of buffer (possibly greater than objSize). + * \param[in] arg constructorArg (see vmk_SlabProps). + * \param[in] flags Currently unused (reserved for future use). + * + * \retval VMK_OK to indicate object construction has succeded. + * \return Other To indicate failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_SlabItemConstructor)(void *object, + vmk_small_size_t size, + vmk_AddrCookie arg, + int flags); + + +/* + *********************************************************************** + * vmk_SlabItemDestructor -- */ /** + * + * \ingroup Slab + * \brief Item destructor - optional user defined function. Runs for + * each buffer just before a cluster of memory + * is returned to the heap. + * + * \note When the control structure is placed inside the free object, + * then the destructor must take care not to modify the control + * structure. + * + * \param[in] object Object to be destroyed. + * \param[in] size Size of buffer (possibly greater than objSize). + * \param[in] arg constructorArg (see vmk_SlabProps). + * + *********************************************************************** + */ +typedef void (*vmk_SlabItemDestructor)(void *object, vmk_small_size_t size, + vmk_AddrCookie arg); + +/** + * \ingroup Slab + * \brief Types of slab + */ +typedef enum { + VMK_SLAB_TYPE_SIMPLE=0, + VMK_SLAB_TYPE_NOMINAL=1 +} vmk_SlabType; + +/** + * \ingroup Slab + * \brief Properties of a slab allocator + */ +typedef struct { + /** \brief Type of slab */ + vmk_SlabType type; + + /** \brief Byte Size of each object */ + vmk_small_size_t objSize; + + /** \brief Byte alignment for each object */ + vmk_small_size_t alignment; + + /** \brief Called after an object is allocated (or NULL for no action) */ + vmk_SlabItemConstructor constructor; + + /** \brief Called before an object is freed (or NULL for no action) */ + vmk_SlabItemDestructor destructor; + + /** \brief Arument for constructor/destructor calls */ + vmk_AddrCookie constructorArg; + + /** \brief Type-specific slab properties */ + union { + /** \brief Properties for VMK_SLAB_TYPE_SIMPLE, */ + struct { + /* + * \brief Backing store for the cache clusters. + * + * This value must be a valid heap ID previously constructed by + * vmk_HeapCreate or vmk_HeapCreatePkeVisible. It may not be + * VMK_INVALID_HEAP_ID. + */ + vmk_HeapID heap; + + /** \brief Max total objects. */ + vmk_uint32 maxTotalObj; + + /** \brief Max free objects (across all PCPUs). */ + vmk_uint32 maxFreeObj; + } simple; + + /* + * \brief Properties for VMK_SLAB_TYPE_NOMINAL + * + * Use VMK_SLAB_TYPE_NOMINAL for finer control of slab + * properties. + */ + struct { + /* + * \brief Backing store for the cache clusters. + * + * This value must be a valid heap ID previously constructed by + * vmk_HeapCreate or vmk_HeapCreatePkeVisible. It may not be + * VMK_INVALID_HEAP_ID. + */ + vmk_HeapID heap; + + /** \brief Max total objects */ + vmk_uint32 maxTotalObj; + + /** \brief Max free objects in all PCPU caches */ + vmk_uint32 maxFreeObj; + + /** \brief Cap on percentage of the heap consumed by the slab */ + vmk_uint32 slabPercent; + + /** \brief See vmk_SlabControlSize */ + vmk_small_size_t ctrlOffset; + + /** + * \brief Don't free to the backing heap until + * vmk_SlabDestroy is called. + */ + unsigned notrim:1; + } nominal; + } typeSpecific; +} vmk_SlabProps; + + +/* + *********************************************************************** + * vmk_SlabCreate -- */ /** + * + * \ingroup Slab + * \brief Create a slab allocator cache. + * + * \param [in] name Name associated with the new cache. + * \param [in] props Properties of the new cache. + * \param [out] cache For use with vmk_SlabAlloc, etc. + * + * \retval VMK_OK To indicate that slab creation has succeeded. + * \retval VMK_BAD_PARAM Either \em props is NULL or \em props->type + * is invalid. + * \retval VMK_FAILURE \em heap (a field within the \em props union) + * does not specify a valid \em vmk_HeapID. + * \retval VMK_LIMIT_EXCEEDED The underlying heap is too small to contain + * \em maxTotalObjects. + * (a field within the \em props union). + * \retval VMK_FAILURE \em ctrlOffset (a field within the \em props union) + * is larger than the object size. + * \retval VMK_FAILURE \em slabPercent (a field within the \em props union) + * is either negative or larger than 100. + * \retval VMK_FAILURE \em props specifies an inconsistent layout. + * + * \note For debug builds (beta and obj vmkernel types) VMK_FAILURE will + * not be returned if an inconsistent layout is detected. Instead an + * assert will trip resulting in a \b NOT_REACHED PSOD. A message + * similar to the following is logged immediately preceeding the PSOD: + * \code + * Slab: Layout:692: Layout undoable: slabBytes 112, oneCacheBytes 58, \ + * clusterBytes 29, freeClusterLength 1, clusterSize 0 + * \endcode + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SlabCreate(const char *name, + vmk_SlabProps *props, + vmk_SlabID *cache); + + +/* + *********************************************************************** + * vmk_SlabAlloc -- + * + * \ingroup Slab + * \brief Allocate an item from a slab. + * + * The vmk_SlabItemConstructor (if defined) was previously called, + * or the object was previously freed via vmk_SlabFree(). + * + * \note When the control structure is placed inside the free object, + * the caller of vmk_SlabAlloc() must assume this portion of + * the object is uninitialized. + * + * \param[in] cache Slab from which allocation will take place. + * + * \retval NULL Memory could not be allocated. + * + *********************************************************************** + */ +void *vmk_SlabAlloc(vmk_SlabID cache); + + +/* + *********************************************************************** + * vmk_SlabFree -- + * + * \ingroup Slab + * \brief Free memory allocated by vmk_SlabAlloc. + * + * The memory object will be retained by the slab. If at + * some point the slab chooses to give the memory back to the + * system, the vmk_SlabItemDestructor (if defined) will be called. + * + * \param[in] cache Slab from which the item was allocated. + * \param[in] object object to be freed. + * + *********************************************************************** + */ +void vmk_SlabFree( + vmk_SlabID cache, + void *item); + + +/* + *********************************************************************** + * vmk_SlabDestroy -- + * + * \ingroup Slab + * \brief Tear down a slab cache allocated previously created by + * vmk_SlabCreate. + * + * \param[in] cache The cache to be destroyed. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SlabDestroy(vmk_SlabID cache); + + +/* + *********************************************************************** + * vmk_SlabControlSize -- + * + * \ingroup Slab + * \brief Get the size of the per-object "control" structure. + * + * The slab maintains a control structure for each free object + * cached by the slab. When VMK_SLAB_TYPE_SIMPLE properties are + * used to create the slab, the control structure will be tacked + * past the end of the client's object. To save space, the control + * structure can be placed within the user's free object using the + * ctrlOffset paramter to VMK_SLAB_TYPE_NOMINAL properties. + * + * \note See vmk_SlabItemConstructor, vmk_SlabItemDestructor and + * and vmk_SlabAlloc for the constraints that must be obeyed + * when the control structure is placed inside the object. + * + * \return Size of the control structure in bytes. + * + *********************************************************************** + */ +vmk_small_size_t vmk_SlabControlSize(void); + +#endif /* _VMKAPI_SLAB_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slist.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slist.h new file mode 100644 index 0000000..af6aac2 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_slist.h @@ -0,0 +1,744 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SList */ /** + * \defgroup SList Singly-linked List Management + * + * Singly-linked lists. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SLIST_H_ +#define _VMKAPI_SLIST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_assert.h" + +/** + * \brief Singly-linked list link. + * + * This link can be embedded within other data structures to allow them + * to be added to a list. + */ +typedef struct vmk_SList_Links { + struct vmk_SList_Links *next; +} vmk_SList_Links; + +/** + * \brief A singly-linked list. + * + * This structure represents the entire list. + */ +typedef struct vmk_SList { + vmk_SList_Links *head; + vmk_SList_Links *tail; +} vmk_SList; + +/* + *********************************************************************** + * VMK_SLIST_ENTRY -- */ /** + * + * \ingroup SList + * \brief Get a pointer to the structure containing a given list element. + * + * \param itemPtr List element that is contained by another structure + * \param STRUCT C type of the container + * \param MEMBER Name of the structure field in the container + * that itemPtr is pointing to. + * + *********************************************************************** + */ + +#define VMK_SLIST_ENTRY(itemPtr, STRUCT, MEMBER) \ + ((STRUCT *) ((vmk_uint8 *) (itemPtr) - vmk_offsetof (STRUCT, MEMBER))) + +/* + *********************************************************************** + * VMK_SLIST_FORALL -- */ /** + * + * \ingroup SList + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member + * + * \note Expressions that contain side effects aren't valid as + * parameters (example: removal). + * + * \param list The list to scan + * \param current Loop pointer that is updated with the current + * list member each time through the loop + * + *********************************************************************** + */ + +#define VMK_SLIST_FORALL(list, current) \ + for ((current) = (list)->head; \ + (current) != NULL; \ + (current) = (current)->next) + +/* + *********************************************************************** + * VMK_SLIST_FORALL_SAFE -- */ /** + * + * \ingroup SList + * \brief for-loop replacement macro to scan through a list from + * the first to the last list member + * + * \note This macro can be used when removal of element is needed while + * looping. + * + * \note This macro is pretty inefficient as it maintains 3 pointers + * per iteration and has additional comparisons to do so. In + * case of performance critical loops it is advisable not to use + * it and do the necessary bookkeeping (a subset of this) + * manually. + * + * \param list The list to scan + * \param prevPtr Loop pointer that is updated each time through the + * loop with the previous list member + * \param current Loop pointer that is updated each time through the + * loop with the current list member + * \param nextPtr Loop pointer that is updated each time through the + * loop with the next list member + * + *********************************************************************** + */ + +#define VMK_SLIST_FORALL_SAFE(list, prevPtr, current, nextPtr) \ + for ((prevPtr) = NULL, (current) = (list)->head, \ + (nextPtr) = (current) ? (current)->next : NULL; \ + (current) != NULL; \ + (prevPtr) = (!(prevPtr) && ((list)->head != (current)))? NULL : \ + ((prevPtr) && ((prevPtr)->next == (nextPtr)) ? (prevPtr) : (current)), \ + (current) = (nextPtr), (nextPtr) = (current) ? (current)->next : NULL) + +/* + *********************************************************************** + * VMK_SLIST_FORALL_AFTER -- */ /** + * + * \ingroup SList + * \brief for-loop replacement macro to scan through a list from + * the current to the last list member + * + * \note Expressions that contain side effects aren't valid as + * parameters (example: removal). + * + * \param list The list to scan + * \param current Loop pointer that indicate the element where to start + * and is updated with the current list member each time + * through the loop + * + *********************************************************************** + */ + +#define VMK_SLIST_FORALL_AFTER(list, current) \ + for (; \ + (current) != NULL; \ + (current) = (current)->next) + +/* + *********************************************************************** + * VMK_SLIST_FORN -- */ /** + * + * \ingroup SList + * \brief for-loop replacement macro to scan through a list from + * the first to the nth list member + * + * \note Expressions that contain side effects aren't valid as + * parameters (example: removal). + * + * \note On exit, current points to the (n+1)th member or NULL if the + * list has a number of members lower than or equal to n. + * + * \param list The list to scan + * \param current Loop pointer that is updated with the current + * list member each time through the loop + * \param n Index of the element where to stop + * + *********************************************************************** + */ + +#define VMK_SLIST_FORN(list, current, n) \ + for ((current) = (list)->head; \ + ((current) != NULL) && (n != 0); \ + (current) = (current)->next, n--) + +/* + *********************************************************************** + * vmk_SListInitElement -- */ /** + * + * \ingroup SList + * \brief Initialize a list link. + * + * \param[in] element Element to initialize + * + *********************************************************************** + */ +static inline void +vmk_SListInitElement(vmk_SList_Links *element) +{ + VMK_ASSERT(element); + element->next = NULL; +} + +/* + *********************************************************************** + * vmk_SListIsEmpty -- */ /** + * + * \ingroup SList + * \brief Checks whether a list is empty or not. + * + * \param[in] list Target list + * + * \retval VMK_TRUE The list is empty + * \retval VMK_FALSE The list is not empty + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_SListIsEmpty(vmk_SList *list) +{ + VMK_ASSERT(list); + return list->head == NULL ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_SListFirst -- */ /** + * + * \ingroup SList + * \brief Returns the first element (head) of a list. + * + * \param[in] list Target list + * + * \retval NULL The list is empty + * \return A pointer to the head of the list + * + *********************************************************************** + */ +static inline vmk_SList_Links * +vmk_SListFirst(vmk_SList *list) +{ + VMK_ASSERT(list); + return list->head; +} + +/* + *********************************************************************** + * vmk_SListLast -- */ /** + * + * \ingroup SList + * \brief Returns the last element (tail) of a list. + * + * \param[in] list Target list + * + * \retval NULL The list is empty + * \return A pointer to the tail of the list + * + *********************************************************************** + */ +static inline vmk_SList_Links * +vmk_SListLast(vmk_SList *list) +{ + VMK_ASSERT(list); + return list->tail; +} + +/* + *********************************************************************** + * vmk_SListNext -- */ /** + * + * \ingroup SList + * \brief Returns the following link in a list. + * + * \param[in] element Target list + * + * \retval NULL We are at the end of the list + * \return A pointer to the next element + * + *********************************************************************** + */ +static inline vmk_SList_Links * +vmk_SListNext(vmk_SList_Links *element) +{ + VMK_ASSERT(element); + return element->next; +} + +/* + *********************************************************************** + * vmk_SListInit -- */ /** + * + * \ingroup SList + * \brief Initializes a list to be an empty list. + * + * \param[in] list Target list + * + *********************************************************************** + */ +static inline void +vmk_SListInit(vmk_SList *list) +{ + VMK_ASSERT(list); + list->head = NULL; + list->tail = NULL; +} + +/* + *********************************************************************** + * vmk_SListPrev -- */ /** + * + * \ingroup SList + * \brief Returns the previous element in a list. Runs in O(n). + * + * \param[in] list Target list + * \param[in] element Element whose previous element is asked for + * + * \retval NULL We are at the beginning of the list + * \return A pointer to the previous element + * + *********************************************************************** + */ +static inline vmk_SList_Links * +vmk_SListPrev(vmk_SList *list, vmk_SList_Links *element) +{ + vmk_SList_Links *cur; + VMK_ASSERT(list); + VMK_ASSERT(element); + + if (element == list->head) { + return NULL; + } + + VMK_SLIST_FORALL(list, cur) { + if (cur->next == element) { + return cur; + } + } + + VMK_ASSERT(0); /* Element not on the list. */ + + return NULL; +} + +/* + *********************************************************************** + * vmk_SListPop -- */ /** + * + * \ingroup SList + * \brief Returns the first element (head) of a list and remove it + * from the list. + * + * \param[in] list Target list + * + * \return A pointer to the head of the list + * + *********************************************************************** + */ +static inline vmk_SList_Links * +vmk_SListPop(vmk_SList *list) +{ + vmk_SList_Links *oldhead; + VMK_ASSERT(list); + + oldhead = list->head; + VMK_ASSERT(oldhead); + + list->head = oldhead->next; + + if (list->head == NULL) { + list->tail = NULL; + } + + oldhead->next = NULL; + + return oldhead; +} + +/* + *********************************************************************** + * vmk_SListInsertAtHead -- */ /** + * + * \ingroup SList + * \brief Inserts a given element at the beginning of the list. + * + * \param[in] list Target list + * \param[in] element Element to insert + * + *********************************************************************** + */ +static inline void +vmk_SListInsertAtHead(vmk_SList *list, vmk_SList_Links *element) +{ + VMK_ASSERT(list); + VMK_ASSERT(element); + + element->next = list->head; + + if (list->tail == NULL) { + VMK_ASSERT(list->head == NULL); + list->tail = element; + } + + list->head = element; +} + +/* + *********************************************************************** + * vmk_SListInsertAtTail -- */ /** + * + * \ingroup SList + * \brief Inserts a given element at the end of the list. + * + * \param[in] list Target list + * \param[in] element Element to insert + * + *********************************************************************** + */ +static inline void +vmk_SListInsertAtTail(vmk_SList *list, vmk_SList_Links *element) +{ + VMK_ASSERT(list); + VMK_ASSERT(element); + + if (list->tail == NULL) { + list->head = element; + list->tail = element; + } else { + list->tail->next = element; + list->tail = element; + } + + element->next = NULL; +} + +/* + *********************************************************************** + * vmk_SListInsertAfter -- */ /** + * + * \ingroup SList + * \brief Inserts an element after a given element. + * + * \param[in] list Target list + * \param[in] element Element to insert + * \param[in] other Element to insert the new element after + * + *********************************************************************** + */ +static inline void +vmk_SListInsertAfter(vmk_SList *list, vmk_SList_Links *element, vmk_SList_Links *other) +{ + VMK_ASSERT(list); + VMK_ASSERT(element); + VMK_ASSERT(other); + VMK_ASSERT(list->head != NULL); + + element->next = other->next; + other->next = element; + + if (list->tail == other) { + list->tail = element; + } +} + +/* + *********************************************************************** + * vmk_SListRemove -- */ /** + * + * \ingroup SList + * \brief Removes a given element from the list knowing its predecessor + * + * \param[in] list Target list + * \param[in] element Element to remove + * \param[in] prev Element preceding the element to remove + * + *********************************************************************** + */ +static inline void +vmk_SListRemove(vmk_SList *list, vmk_SList_Links *element, + vmk_SList_Links *prev) +{ + VMK_ASSERT(list); + VMK_ASSERT(element); + + if (prev) { + VMK_ASSERT(prev->next == element); + prev->next = element->next; + if (list->tail == element) { + list->tail = prev; + } + } else { + VMK_ASSERT(list->head == element); + list->head = element->next; + if (list->tail == element) { + list->tail = list->head; + } + } + +#if defined(VMX86_DEBUG) + /* don't reinitialize the removed element in release builds */ + vmk_SListInitElement(element); +#endif +} + +/* + *********************************************************************** + * vmk_SListRemoveSlow -- */ /** + * + * \ingroup SList + * \brief Removes a given element from the list. Runs O(n). + * + * \param[in] list Target list + * \param[in] element Element to remove + * + *********************************************************************** + */ +static inline void +vmk_SListRemoveSlow(vmk_SList *list, vmk_SList_Links *element) +{ + vmk_SList_Links *prev = vmk_SListPrev(list, element); + vmk_SListRemove(list, element, prev); +} + +/* + *********************************************************************** + * vmk_SListAppend -- */ /** + * + * \ingroup SList + * \brief Appends all elements of a list at the end of another. + * + * \note The list appended is initialized to an empty list. + * + * \param[in] list1 Target list + * \param[in] list2 List to append + * + *********************************************************************** + */ +static inline void +vmk_SListAppend(vmk_SList *list1, vmk_SList *list2) +{ + VMK_ASSERT(list1); + VMK_ASSERT(list2); + + if (!list2->head) { + return; /* second list empty, nothing to append. */ + } + + if (!list1->head) { + list1->head = list2->head; + list1->tail = list2->tail; + } else { + list1->tail->next = list2->head; + list1->tail = list2->tail; + } + + vmk_SListInit(list2); +} + +/* + *********************************************************************** + * vmk_SListAppendN -- */ /** + * + * \ingroup SList + * \brief Appends N elements of a list at the end of another. + * + * \note The list appended is initialized to an empty list. + * + * \param[in] listDest Target list + * \param[in] listSrc List to append + * \param[in] num Number of elements to append + * + *********************************************************************** + */ + +static inline void +vmk_SListAppendN(vmk_SList *listDest, + vmk_SList *listSrc, + vmk_uint32 num) +{ + vmk_SList_Links *list1head, *list2tail; + vmk_uint32 i; + + VMK_ASSERT(listDest); + VMK_ASSERT(listSrc); + + /* find the last element to be transferred to the destination */ + list1head = listSrc->head; + list2tail = list1head; + for (i=0; inext; + VMK_ASSERT(list2tail); + } + + /* fix the source list */ + if (list2tail == listSrc->tail) { + vmk_SListInit(listSrc); + } else { + listSrc->head = list2tail->next; + } + + /* fix the destination list */ + if (listDest->tail != NULL) { + listDest->tail->next = list1head; + } else { + listDest->head = list1head; + } + listDest->tail = list2tail; + list2tail->next = NULL; +} + + +/* + *********************************************************************** + * vmk_SListPrepend -- */ /** + * + * \ingroup SList + * \brief Insert all elements of a list at the beginning of another. + * + * \note The list prepended is initialized to an empty list. + * + * \param[in] list1 Target list + * \param[in] list2 List to prepend + * + *********************************************************************** + */ +static inline void +vmk_SListPrepend(vmk_SList *list1, vmk_SList *list2) +{ + VMK_ASSERT(list1); + VMK_ASSERT(list2); + + if (!list2->head) { + return; /* second list empty, nothing to prepend. */ + } + + if (!list1->head) { + list1->head = list2->head; + list1->tail = list2->tail; + } else { + list2->tail->next = list1->head; + list1->head = list2->head; + } + + vmk_SListInit(list2); +} + +/* + *********************************************************************** + * vmk_SListSplitHead -- */ /** + * + * \ingroup SList + * \brief Split a list into two list at a given entry. + * + * \note The second list must be empty. + * + * \param[in] list1 Target list, becomes left part of the list + * \param[in] list2 Right part of the list + * \param[in] element Element where to split, this element is moved + * into list2 + * + *********************************************************************** + */ +static inline void +vmk_SListSplitHead(vmk_SList *list1, vmk_SList *list2, vmk_SList_Links *element) +{ + VMK_ASSERT(list1); + VMK_ASSERT(list2); + VMK_ASSERT(vmk_SListIsEmpty(list2)); + VMK_ASSERT(element); + + list2->head = list1->head; + list2->tail = element; + + list1->head = element->next; + if (list1->head == NULL) { + list1->tail = NULL; + } + + element->next = NULL; +} + +/* + *********************************************************************** + * vmk_SListSplitNHead -- */ /** + * + * \ingroup SList + * \brief Split a list into two list starting a given element. + * + * \note The second list must be empty. + * + * \param[in] list1 Target list, becomes left part of the list + * \param[in] list2 Right part of the list + * \param[in] n Index of the element where to start splitting + * + *********************************************************************** + */ +static inline void +vmk_SListSplitNHead(vmk_SList *list1, vmk_SList *list2, vmk_uint64 n) +{ + vmk_SList_Links *cur; + + VMK_SLIST_FORN(list1, cur, n); + if (cur == NULL) { + vmk_SListAppend(list2, list1); + } else { + vmk_SListSplitHead(list1, list2, cur); + } +} + +/* + *********************************************************************** + * vmk_SListReplace -- */ /** + * + * \ingroup SList + * \brief Replace the given entry with a new entry. Runs O(1). + * + * \param[in] list List destination + * \param[in] targetEntry Entry to replace + * \param[in] newEntry New entry + * \param[in] prevEntry Predecessor of the entry to replace + * + *********************************************************************** + */ +static inline void +vmk_SListReplace(vmk_SList *list, + vmk_SList_Links *targetEntry, + vmk_SList_Links *newEntry, + vmk_SList_Links *prevEntry) +{ + VMK_ASSERT(list); + VMK_ASSERT(targetEntry); + + if (!prevEntry) { + VMK_ASSERT(list->head == targetEntry); + list->head = newEntry; + } else { + VMK_ASSERT(prevEntry->next == targetEntry); + prevEntry->next = newEntry; + } + + if (list->tail == targetEntry) { + list->tail = newEntry; + } + + newEntry->next = targetEntry->next; + targetEntry->next = NULL; +} + +#endif /* _VMKAPI_SLIST_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_status.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_status.h new file mode 100644 index 0000000..0b86d33 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_status.h @@ -0,0 +1,365 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Status Codes */ /** + * \defgroup Status Status Codes + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_STATUS_H_ +#define _VMKAPI_STATUS_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + * The return statuses are part of the VMkernel public API. To avoid breaking + * 3rd party software built on top of this API, any change to the table must + * maintain backward source level as well as binary compatibility i.e. a status + * cannot be moved in the table or removed from the table, and new statuses must + * be added at the end (before VMK_GENERIC_LINUX_ERROR). + * + * VMK error code name Description Unix name + * =================== =========== ========= + */ +/** \cond nodoc */ +#define VMK_ERROR_CODES \ + DEFINE_VMK_ERR_AT(VMK_OK, "Success", 0, OK )\ + DEFINE_VMK_ERR_AT(VMK_FAILURE, "Failure", 0x0bad0001, EINVAL )\ + DEFINE_VMK_ERR(VMK_WOULD_BLOCK, "Would block", EAGAIN )\ + DEFINE_VMK_ERR(VMK_NOT_FOUND, "Not found", ENOENT )\ + DEFINE_VMK_ERR(VMK_BUSY, "Busy", EBUSY )\ + DEFINE_VMK_ERR(VMK_EXISTS, "Already exists", EEXIST )\ + DEFINE_VMK_ERR(VMK_LIMIT_EXCEEDED, "Limit exceeded", EFBIG )\ + DEFINE_VMK_ERR(VMK_BAD_PARAM, "Bad parameter", EINVAL )\ + DEFINE_VMK_ERR(VMK_METADATA_READ_ERROR, "Metadata read error", EIO )\ + DEFINE_VMK_ERR(VMK_METADATA_WRITE_ERROR, "Metadata write error", EIO )\ + DEFINE_VMK_ERR(VMK_IO_ERROR, "I/O error", EIO )\ + DEFINE_VMK_ERR(VMK_READ_ERROR, "Read error", EIO )\ + DEFINE_VMK_ERR(VMK_WRITE_ERROR, "Write error", EIO )\ + DEFINE_VMK_ERR(VMK_INVALID_NAME, "Invalid name", ENAMETOOLONG)\ + DEFINE_VMK_ERR(VMK_INVALID_HANDLE, "Invalid handle", EBADF )\ + DEFINE_VMK_ERR(VMK_INVALID_ADAPTER, "No such SCSI adapter", ENODEV )\ + DEFINE_VMK_ERR(VMK_INVALID_TARGET, "No such target on adapter", ENODEV )\ + DEFINE_VMK_ERR(VMK_INVALID_PARTITION, "No such partition on target", ENXIO )\ + DEFINE_VMK_ERR(VMK_INVALID_FS, "No filesystem on the device", ENXIO )\ + DEFINE_VMK_ERR(VMK_INVALID_MEMMAP, "Memory map mismatch", EFAULT )\ + DEFINE_VMK_ERR(VMK_NO_MEMORY, "Out of memory", ENOMEM )\ + DEFINE_VMK_ERR(VMK_NO_MEMORY_RETRY, "Out of memory (ok to retry)", ENOMEM )\ + DEFINE_VMK_ERR(VMK_NO_LPAGE_MEMORY, "Out of large pages", ENOMEM )\ + DEFINE_VMK_ERR(VMK_NO_RESOURCES, "Out of resources", ENOMEM )\ + DEFINE_VMK_ERR(VMK_NO_FREE_HANDLES, "No free handles", EMFILE )\ + DEFINE_VMK_ERR(VMK_NUM_HANDLES_EXCEEDED, "Exceeded maximum number of allowed handles", ENFILE )\ + DEFINE_VMK_ERR(VMK_DEPRECATED_NO_FREE_PTR_BLOCKS, "No free pointer blocks (deprecated)", ENOSPC )\ + DEFINE_VMK_ERR(VMK_DEPRECATED_NO_FREE_DATA_BLOCKS, "No free data blocks (deprecated)", ENOSPC )\ + DEFINE_VMK_ERR(VMK_CORRUPT_REDOLOG, "Corrupt RedoLog", EBADF )\ + DEFINE_VMK_ERR(VMK_STATUS_PENDING, "Status pending", EAGAIN )\ + DEFINE_VMK_ERR(VMK_STATUS_FREE, "Status free", EAGAIN )\ + DEFINE_VMK_ERR(VMK_UNSUPPORTED_CPU, "Unsupported CPU", ENODEV )\ + DEFINE_VMK_ERR(VMK_NOT_SUPPORTED, "Not supported", ENOSYS )\ + DEFINE_VMK_ERR(VMK_TIMEOUT, "Timeout", ETIMEDOUT )\ + DEFINE_VMK_ERR(VMK_READ_ONLY, "Read only", EROFS )\ + DEFINE_VMK_ERR(VMK_RESERVATION_CONFLICT, "SCSI reservation conflict", EAGAIN )\ + DEFINE_VMK_ERR(VMK_FS_LOCKED, "File system locked", EADDRINUSE )\ + DEFINE_VMK_ERR(VMK_NOT_ENOUGH_SLOTS, "Out of slots", ENFILE )\ + DEFINE_VMK_ERR(VMK_INVALID_ADDRESS, "Invalid address", EFAULT )\ + DEFINE_VMK_ERR(VMK_NOT_SHARED, "Not shared", ENOMEM )\ + DEFINE_VMK_ERR(VMK_SHARED, "Page is shared", ENOMEM )\ + DEFINE_VMK_ERR(VMK_KSEG_PAIR_FLUSHED, "Kseg pair flushed", ENOMEM )\ + DEFINE_VMK_ERR(VMK_MAX_ASYNCIO_PENDING, "Max async I/O requests pending", ENOMEM )\ + DEFINE_VMK_ERR(VMK_VERSION_MISMATCH_MINOR, "Minor version mismatch", ENOSYS )\ + DEFINE_VMK_ERR(VMK_VERSION_MISMATCH_MAJOR, "Major version mismatch", ENOSYS )\ + DEFINE_VMK_ERR(VMK_IS_CONNECTED, "Already connected", EINVAL )\ + DEFINE_VMK_ERR(VMK_IS_DISCONNECTED, "Already disconnected", ENOTCONN )\ + DEFINE_VMK_ERR(VMK_IS_ENABLED, "Already enabled", EINVAL )\ + DEFINE_VMK_ERR(VMK_IS_DISABLED, "Already disabled", EINVAL )\ + DEFINE_VMK_ERR(VMK_NOT_INITIALIZED, "Not initialized", EINVAL )\ + DEFINE_VMK_ERR(VMK_WAIT_INTERRUPTED, "Wait interrupted", EINTR )\ + DEFINE_VMK_ERR(VMK_NAME_TOO_LONG, "Name too long", ENAMETOOLONG)\ + DEFINE_VMK_ERR(VMK_MISSING_FS_PES, "VMFS volume missing physical extents", ENOTDIR )\ + DEFINE_VMK_ERR(VMK_NICTEAMING_VALID_MASTER, "NIC teaming master valid", EINVAL )\ + DEFINE_VMK_ERR(VMK_NICTEAMING_SLAVE, "NIC teaming slave", EEXIST )\ + DEFINE_VMK_ERR(VMK_NICTEAMING_REGULAR_VMNIC, "NIC teaming regular VMNIC", EINVAL )\ + DEFINE_VMK_ERR(VMK_ABORT_NOT_RUNNING, "Abort not running", ECANCELED )\ + DEFINE_VMK_ERR(VMK_NOT_READY, "Not ready", EIO )\ + DEFINE_VMK_ERR(VMK_CHECKSUM_MISMATCH, "Checksum mismatch", EIO )\ + DEFINE_VMK_ERR(VMK_VLAN_NO_HW_ACCEL, "VLan HW Acceleration not supported", EINVAL )\ + DEFINE_VMK_ERR(VMK_NO_VLAN_SUPPORT, "VLan is not supported in vmkernel", EOPNOTSUPP )\ + DEFINE_VMK_ERR(VMK_NOT_VLAN_HANDLE, "Not a VLan handle", EINVAL )\ + DEFINE_VMK_ERR(VMK_BAD_VLANID, "Couldn't retrieve VLan id", EBADF )\ + DEFINE_VMK_ERR(VMK_MIG_CONN_CLOSED, "Connection closed by remote host, possibly due to timeout", EINVAL )\ + DEFINE_VMK_ERR(VMK_NO_CONNECT, "No connection", EIO )\ + DEFINE_VMK_ERR(VMK_SEGMENT_OVERLAP, "Segment overlap", EINVAL )\ + DEFINE_VMK_ERR(VMK_BAD_MPS, "Error parsing MPS Table", EIO )\ + DEFINE_VMK_ERR(VMK_BAD_ACPI, "Error parsing ACPI Table", EIO )\ + DEFINE_VMK_ERR(VMK_RESUME_ERROR, "Failed to resume VM", EIO )\ + DEFINE_VMK_ERR(VMK_NO_ADDRESS_SPACE, "Insufficient address space for operation", ENOMEM )\ + DEFINE_VMK_ERR(VMK_BAD_ADDR_RANGE, "Bad address range", EINVAL )\ + DEFINE_VMK_ERR(VMK_ENETDOWN, "Network is down", ENETDOWN )\ + DEFINE_VMK_ERR(VMK_ENETUNREACH, "Network unreachable", ENETUNREACH )\ + DEFINE_VMK_ERR(VMK_ENETRESET, "Network dropped connection on reset", ENETRESET )\ + DEFINE_VMK_ERR(VMK_ECONNABORTED, "Software caused connection abort", ECONNABORTED)\ + DEFINE_VMK_ERR(VMK_ECONNRESET, "Connection reset by peer", ECONNRESET )\ + DEFINE_VMK_ERR(VMK_ENOTCONN, "Socket is not connected", ENOTCONN )\ + DEFINE_VMK_ERR(VMK_ESHUTDOWN, "Can't send after socket shutdown", ESHUTDOWN )\ + DEFINE_VMK_ERR(VMK_ETOOMANYREFS, "Too many references: can't splice", ETOOMANYREFS)\ + DEFINE_VMK_ERR(VMK_ECONNREFUSED, "Connection refused", ECONNREFUSED)\ + DEFINE_VMK_ERR(VMK_EHOSTDOWN, "Host is down", EHOSTDOWN )\ + DEFINE_VMK_ERR(VMK_EHOSTUNREACH, "No route to host", EHOSTUNREACH)\ + DEFINE_VMK_ERR(VMK_EADDRINUSE, "Address already in use", EADDRINUSE )\ + DEFINE_VMK_ERR(VMK_BROKEN_PIPE, "Broken pipe", EPIPE )\ + DEFINE_VMK_ERR(VMK_NOT_A_DIRECTORY, "Not a directory", ENOTDIR )\ + DEFINE_VMK_ERR(VMK_IS_A_DIRECTORY, "Is a directory", EISDIR )\ + DEFINE_VMK_ERR(VMK_NOT_EMPTY, "Directory not empty", ENOTEMPTY )\ + DEFINE_VMK_ERR(VMK_NOT_IMPLEMENTED, "Not implemented", ENOSYS )\ + DEFINE_VMK_ERR(VMK_NO_SIGNAL_HANDLER, "No signal handler", EINVAL )\ + DEFINE_VMK_ERR(VMK_FATAL_SIGNAL_BLOCKED, "Fatal signal blocked", EINVAL )\ + DEFINE_VMK_ERR(VMK_NO_ACCESS, "Permission denied", EACCES )\ + DEFINE_VMK_ERR(VMK_NO_PERMISSION, "Operation not permitted", EPERM )\ + DEFINE_VMK_ERR(VMK_UNDEFINED_SYSCALL, "Undefined syscall", ENOSYS )\ + DEFINE_VMK_ERR(VMK_RESULT_TOO_LARGE, "Result too large", ERANGE )\ + DEFINE_VMK_ERR(VMK_VLAN_FILTERED, "Pkts dropped because of VLAN (support) mismatch", ERANGE )\ + DEFINE_VMK_ERR(VMK_BAD_EXCFRAME, "Unsafe exception frame", EFAULT )\ + DEFINE_VMK_ERR(VMK_MODULE_NOT_LOADED, "Necessary module isn't loaded", ENODEV )\ + DEFINE_VMK_ERR(VMK_NO_SUCH_ZOMBIE, "No dead world by that name", ECHILD )\ + DEFINE_VMK_ERR(VMK_NO_SUCH_CARTEL, "No cartel by that name", ESRCH )\ + DEFINE_VMK_ERR(VMK_IS_A_SYMLINK, "Is a symbolic link", ELOOP )\ + DEFINE_VMK_ERR(VMK_CROSS_DEVICE_LINK, "Cross-device link" , EXDEV )\ + DEFINE_VMK_ERR(VMK_NOT_A_SOCKET, "Not a socket", ENOTSOCK )\ + DEFINE_VMK_ERR(VMK_ILLEGAL_SEEK, "Illegal seek", ESPIPE )\ + DEFINE_VMK_ERR(VMK_ADDRFAM_UNSUPP, "Unsupported address family", EAFNOSUPPORT)\ + DEFINE_VMK_ERR(VMK_ALREADY_CONNECTED, "Already connected", EISCONN )\ + DEFINE_VMK_ERR(VMK_DEATH_PENDING, "World is marked for death", ENOENT )\ + DEFINE_VMK_ERR(VMK_NO_CPU_ASSIGNMENT, "No valid scheduler assignment", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MIN_INVALID, "Invalid cpu min", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MINLIMIT_INVALID, "Invalid cpu minLimit", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MAX_INVALID, "Invalid cpu max", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_SHARES_INVALID, "Invalid cpu shares", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MIN_OVERFLOW, "CPU min outside valid range", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MINLIMIT_OVERFLOW, "CPU minLimit outside valid range", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MAX_OVERFLOW, "CPU max outside valid range" , EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MIN_GT_MINLIMIT, "CPU min exceeds minLimit", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MIN_GT_MAX, "CPU min exceeds max", EINVAL )\ + DEFINE_VMK_ERR(VMK_CPU_MINLIMIT_LT_RESERVED, "CPU minLimit less than cpu already reserved by children", ENOSPC )\ + DEFINE_VMK_ERR(VMK_CPU_MAX_LT_RESERVED, "CPU max less than cpu already reserved by children", ENOSPC )\ + DEFINE_VMK_ERR(VMK_CPU_ADMIT_FAILED, "Admission check failed for cpu resource", ENOSPC )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_INVALID, "Invalid memory min", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MINLIMIT_INVALID, "Invalid memory minLimit", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MAX_INVALID, "Invalid memory max", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_OVERFLOW, "Memory min outside valid range", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MINLIMIT_OVERFLOW, "Memory minLimit outside valid range", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MAX_OVERFLOW, "Memory max outside valid range", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_GT_MINLIMIT, "Memory min exceeds minLimit", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_GT_MAX, "Memory min exceeds max", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MINLIMIT_LT_RESERVED, "Memory minLimit less than memory already reserved by children", ENOSPC )\ + DEFINE_VMK_ERR(VMK_MEM_MAX_LT_RESERVED, "Memory max less than memory already reserved by children", ENOSPC )\ + DEFINE_VMK_ERR(VMK_MEM_ADMIT_FAILED, "Admission check failed for memory resource", ENOSPC )\ + DEFINE_VMK_ERR(VMK_NO_SWAP_FILE, "No swap file", ENOENT )\ + DEFINE_VMK_ERR(VMK_BAD_PARAM_COUNT, "Bad parameter count", EINVAL )\ + DEFINE_VMK_ERR(VMK_BAD_PARAM_TYPE, "Bad parameter type", EINVAL )\ + DEFINE_VMK_ERR(VMK_UNMAP_RETRY, "Dueling unmaps (ok to retry)", ENOMEM )\ + DEFINE_VMK_ERR(VMK_INVALID_IOCTL, "Inappropriate ioctl for device", ENOTTY )\ + DEFINE_VMK_ERR(VMK_MAPFAULT_RETRY, "Mmap changed under page fault (ok to retry)",EBUSY )\ + DEFINE_VMK_ERR(VMK_EINPROGRESS, "Operation now in progress", EINPROGRESS )\ + DEFINE_VMK_ERR(VMK_ADDR_UNMAPPED, "Address temporarily unmapped", EFAULT )\ + DEFINE_VMK_ERR(VMK_INVALID_BUDDY_TYPE, "Invalid buddy type", ENOMEM )\ + DEFINE_VMK_ERR(VMK_LPAGE_INFO_NOT_FOUND, "Large page info not found", ENOMEM )\ + DEFINE_VMK_ERR(VMK_LPAGE_INFO_INVALID, "Invalid large page info", EINVAL )\ + DEFINE_VMK_ERR(VMK_SNAPSHOT_DEV, "SCSI LUN is in snapshot state", EIO )\ + DEFINE_VMK_ERR(VMK_IN_TRANSITION, "SCSI LUN is in transition", EIO )\ + DEFINE_VMK_ERR(VMK_TXN_FULL, "Transaction ran out of lock space or log space", ENOSPC )\ + DEFINE_VMK_ERR(VMK_LOCK_NOT_FREE, "Lock was not free", EBUSY )\ + DEFINE_VMK_ERR(VMK_NUM_FILES_EXCEEDED, "Exceed maximum number of files on the filesystem", ENOSPC)\ + DEFINE_VMK_ERR(VMK_MIGRATE_VMX_FAILURE, "Migration determined a failure by the VMX", EINVAL )\ + DEFINE_VMK_ERR(VMK_VSI_LIST_OVERFLOW, "VSI GetList handler overflow", EFBIG )\ + DEFINE_VMK_ERR(VMK_INVALID_WORLD, "Invalid world", EINVAL )\ + DEFINE_VMK_ERR(VMK_INVALID_VMM, "Invalid vmm", EINVAL )\ + DEFINE_VMK_ERR(VMK_INVALID_TXN, "Invalid transaction", EINVAL )\ + DEFINE_VMK_ERR(VMK_FS_RETRY_OPERATION, "Transient file system condition, suggest retry", EAGAIN )\ + DEFINE_VMK_ERR(VMK_VCPU_LIMIT_EXCEEDED, "Number of running VCPUs limit exceeded", EINVAL )\ + DEFINE_VMK_ERR(VMK_INVALID_METADATA, "Invalid metadata", EINVAL )\ + DEFINE_VMK_ERR(VMK_INVALID_PAGE_NUMBER, "Invalid page number", EINVAL )\ + DEFINE_VMK_ERR(VMK_NOT_EXEC, "Not in executable format", ENOEXEC )\ + DEFINE_VMK_ERR(VMK_NFS_CONNECT_FAILURE, "Unable to connect to NFS server", EHOSTDOWN) \ + DEFINE_VMK_ERR(VMK_NFS_MOUNT_NOT_SUPPORTED, "The NFS server does not support MOUNT version 3 over TCP", EINVAL) \ + DEFINE_VMK_ERR(VMK_NFS_NFS_NOT_SUPPORTED, "The NFS server does not support NFS version 3 over TCP", EINVAL) \ + DEFINE_VMK_ERR(VMK_NFS_MOUNT_DENIED, "The mount request was denied by the NFS server. Check that the export exists and that the client is permitted to mount it", EPERM)\ + DEFINE_VMK_ERR(VMK_NFS_MOUNT_NOT_DIR, "The specified mount path was not a directory", ENOTDIR) \ + DEFINE_VMK_ERR(VMK_NFS_BAD_FSINFO, "Unable to query remote mount point's attributes", EACCES) \ + DEFINE_VMK_ERR(VMK_NFS_VOLUME_LIMIT_EXCEEDED,"NFS has reached the maximum number of supported volumes", EINVAL) \ + DEFINE_VMK_ERR(VMK_NO_MEMORY_NICE, "Out of nice memory", ENOMEM )\ + DEFINE_VMK_ERR(VMK_MIGRATE_PREEMPTIVE_FAIL, "VMotion failed to start due to lack of cpu or memory resources", ENOMEM)\ + DEFINE_VMK_ERR(VMK_CACHE_MISS, "Cache miss", EFAULT )\ + DEFINE_VMK_ERR(VMK_STRESS_INDUCED_ERROR, "Error induced when stress options are enabled", EIO)\ + DEFINE_VMK_ERR(VMK_TOO_MANY_LOCK_HOLDERS, "Maximum number of concurrent hosts are already accessing this resource", EUSERS)\ + DEFINE_VMK_ERR(VMK_NO_JOURNAL, "Host doesn't have a journal", EIO)\ + DEFINE_VMK_ERR(VMK_RANK_VIOLATION, "Lock rank violation detected", EDEADLK)\ + DEFINE_VMK_ERR(VMK_MODULE_FAILED, "Module failed", ENODEV )\ + DEFINE_VMK_ERR(VMK_NO_MASTER_PTY, "Unable to open slave if no master pty", ENXIO )\ + DEFINE_VMK_ERR(VMK_NOT_IOABLE, "Not IOAble", EFAULT )\ + DEFINE_VMK_ERR(VMK_NO_FREE_INODES, "No free inodes", ENOSPC )\ + DEFINE_VMK_ERR(VMK_NO_MEMORY_FOR_FILEDATA, "No free memory for file data", ENOSPC )\ + DEFINE_VMK_ERR(VMK_NO_TAR_SPACE, "No free space to expand file or meta data", ENOSPC )\ + DEFINE_VMK_ERR(VMK_NO_FIFO_READER, "Unable to open writer if no fifo reader", ENXIO )\ + DEFINE_VMK_ERR(VMK_NO_SUCH_DEVICE, "No underlying device for major,minor", EINVAL )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_GT_MEMSIZE, "Memory min exceeds memSize", EINVAL )\ + DEFINE_VMK_ERR(VMK_NO_SUCH_VT, "No virtual terminal for number", ENXIO )\ + DEFINE_VMK_ERR(VMK_TOO_MANY_ELEMENTS, "Too many elements for list", E2BIG )\ + DEFINE_VMK_ERR(VMK_SHAREDAREA_MISMATCH, "VMM<->VMK shared are mismatch", ENOSYS )\ + DEFINE_VMK_ERR(VMK_EXEC_FAILURE, "Failure during exec while original state already lost", ESRCH)\ + DEFINE_VMK_ERR(VMK_VMNIXMOD_NOT_LOADED, "vmnixmod kernel module not loaded", ENOSYS )\ + DEFINE_VMK_ERR(VMK_INVALID_MODULE, "Invalid module", EINVAL )\ + DEFINE_VMK_ERR(VMK_UNALIGNED_ADDRESS, "Address is not aligned on page boundary", EINVAL )\ + DEFINE_VMK_ERR(VMK_NOT_MAPPED, "Address is not mapped in address space", ENOMEM )\ + DEFINE_VMK_ERR(VMK_NO_MESSAGE_SPACE, "No space to record a message", ENOMEM )\ + DEFINE_VMK_ERR(VMK_PKEI_STACK_OVERFLOW, "No space left on PKEI stack", EFBIG )\ + DEFINE_VMK_ERR(VMK_EXCEPTION_HANDLER_INVALID,"Invalid exception handler", EINVAL )\ + DEFINE_VMK_ERR(VMK_EXCEPTION_NOT_HANDLED, "Exception not handled by exception handler", EINVAL )\ + DEFINE_VMK_ERR(VMK_INVALID_MULTIWRITER_OBJECT, "Can't open sparse/TBZ files in multiwriter mode", EDEADLK)\ + DEFINE_VMK_ERR(VMK_STORAGE_RETRY_OPERATION, "Transient storage condition, suggest retry", EAGAIN)\ + DEFINE_VMK_ERR(VMK_HBA_ERROR, "Storage initiator error", EIO)\ + DEFINE_VMK_ERR(VMK_TIMER_INIT_FAILED, "Timer initialization failed", EINVAL)\ + DEFINE_VMK_ERR(VMK_MODULE_NOT_FOUND, "Module not found", ENOENT)\ + DEFINE_VMK_ERR(VMK_NOT_SOCKET_OWNER, "Socket not owned by cartel", EINVAL)\ + DEFINE_VMK_ERR(VMK_VSI_HANDLER_NOT_FOUND, "No VSI handler found for the requested node",ENOENT)\ + DEFINE_VMK_ERR(VMK_INVALID_MMAPPROTFLAGS, "Invalid mmap protection flags", EINVAL)\ + DEFINE_VMK_ERR(VMK_INVALID_MAPCONTIG_SIZE, "Invalid chunk size for contiguous mmap ", EINVAL)\ + DEFINE_VMK_ERR(VMK_INVALID_MAPCONTIG_MAX, "Invalid MPN max for contiguous mmap ", EINVAL)\ + DEFINE_VMK_ERR(VMK_INVALID_MAPCONTIG_FLAG, "Invalid mmap flag on contiguous mmap ", EINVAL)\ + DEFINE_VMK_ERR(VMK_NOT_LAZY_MMINFO, "Unexpected fault on pre-faulted memory region",EINVAL)\ + DEFINE_VMK_ERR(VMK_MMINFO_WONT_SPLIT, "Memory region cannot be split (remap/unmap)",EINVAL)\ + DEFINE_VMK_ERR(VMK_NO_CACHE_INFO, "Cache Information not available", ENOENT)\ + DEFINE_VMK_ERR(VMK_CANNOT_REMAP_PINNED_MEMORY, "Cannot remap pinned memory", EINVAL)\ + DEFINE_VMK_ERR(VMK_NO_SUCH_CARTELGROUP, "No cartel group by that name", ESRCH)\ + DEFINE_VMK_ERR(VMK_SPLOCKSTATS_DISABLED, "SPLock stats collection disabled", EINVAL)\ + DEFINE_VMK_ERR(VMK_BAD_TAR_IMAGE, "Boot image is corrupted", EINVAL)\ + DEFINE_VMK_ERR(VMK_BRANCHED_ALREADY, "Branched file cannot be modified", EPERM)\ + DEFINE_VMK_ERR(VMK_NAME_RESERVED_FOR_BRANCH, "Name is reserved for branched file", EPERM)\ + DEFINE_VMK_ERR(VMK_CANNOT_BRANCH_UNLINKED, "Unlinked file cannot be branched", EPERM)\ + DEFINE_VMK_ERR(VMK_MAX_RETRIES_EXCEEDED, "Maximum kernel-level retries exceeded", EAGAIN)\ + DEFINE_VMK_ERR(VMK_OPTLOCK_STOLEN, "Optimistic lock acquired by another host", EAGAIN)\ + DEFINE_VMK_ERR(VMK_NOT_MMAPABLE, "Object cannot be mmapped", ENODEV)\ + DEFINE_VMK_ERR(VMK_INVALID_CPU_AFFINITY, "Invalid cpu affinity", EINVAL)\ + DEFINE_VMK_ERR(VMK_DEVICE_NOT_PARTOF_LV, "Device does not contain a logical volume", ENXIO)\ + DEFINE_VMK_ERR(VMK_NO_SPACE, "No space left on device", ENOSPC)\ + DEFINE_VMK_ERR(VMK_VSI_INVALID_NODE_ID, "Invalid vsi node ID", EINVAL)\ + DEFINE_VMK_ERR(VMK_TOO_MANY_USERS, "Too many users accessing this resource", EUSERS)\ + DEFINE_VMK_ERR(VMK_EALREADY, "Operation already in progress", EALREADY)\ + DEFINE_VMK_ERR(VMK_BUF_TOO_SMALL, "Buffer too small to complete the operation", EINVAL) \ + DEFINE_VMK_ERR(VMK_SNAPSHOT_DEV_DISALLOWED, "Snapshot device disallowed", EACCES)\ + DEFINE_VMK_ERR(VMK_LVM_DEVICE_UNREACHABLE, "LVM device unreachable", EIO)\ + DEFINE_VMK_ERR(VMK_CPU_INVALID_RESOURCE_UNITS, "Invalid cpu resource units", EINVAL)\ + DEFINE_VMK_ERR(VMK_MEM_INVALID_RESOURCE_UNITS, "Invalid memory resource units", EINVAL)\ + DEFINE_VMK_ERR(VMK_ABORTED, "IO was aborted", ECANCELED)\ + DEFINE_VMK_ERR(VMK_MEM_MIN_LT_RESERVED, "Memory min less than memory already reserved by children", ENOSPC )\ + DEFINE_VMK_ERR(VMK_MEM_MIN_LT_CONSUMED, "Memory min less than memory required to support current consumption", ENOSPC )\ + DEFINE_VMK_ERR(VMK_MEM_MAX_LT_CONSUMED, "Memory max less than memory required to support current consumption", ENOSPC )\ + DEFINE_VMK_ERR(VMK_TIMEOUT_RETRY_DEPRECATED, "Timeout (ok to retry) DEPRECATED", ETIMEDOUT)\ + DEFINE_VMK_ERR(VMK_RESERVATION_LOST, "Reservation Lost", EBUSY)\ + DEFINE_VMK_ERR(VMK_FS_STALE_METADATA, "Cached metadata is stale", ENOENT)\ + DEFINE_VMK_ERR(VMK_NO_FCNTL_LOCK, "No fcntl lock slot left", ENOLCK)\ + DEFINE_VMK_ERR(VMK_NO_FCNTL_LOCK_HOLDER, "No fcntl lock holder slot left", ENOLCK)\ + DEFINE_VMK_ERR(VMK_NO_LICENSE, "Not licensed to access VMFS volumes", EACCES)\ + DEFINE_VMK_ERR(VMK_VSI_MODULE_NOT_FOUND, "Vmkernel module necessary for this vsi call not loaded", ENOENT)\ + DEFINE_VMK_ERR(VMK_LVM_RETRY_OPERATION, "Transient LVM device condition, suggest retry", EAGAIN)\ + DEFINE_VMK_ERR(VMK_SNAPSHOT_LV_INCOMPLETE, "Snapshot LV incomplete", EAGAIN)\ + DEFINE_VMK_ERR(VMK_MEDIUM_NOT_FOUND, "Medium not found", EIO)\ + DEFINE_VMK_ERR(VMK_MAX_PATHS_CLAIMED, "Maximum allowed SCSI paths have already been claimed", ENOMEM)\ + DEFINE_VMK_ERR(VMK_NOT_MOUNTABLE, "Filesystem is not mountable", ENODEV)\ + DEFINE_VMK_ERR(VMK_MEMSIZE_GT_MEMSIZELIMIT, "Memory size exceeds memSizeLimit", EINVAL)\ + DEFINE_VMK_ERR(VMK_RECORD_WRITE_ERROR, "An error occurred trying to write to the log", EIO)\ + DEFINE_VMK_ERR(VMK_REPLAY_READ_ERROR, "An error occurred trying to read from the log", EIO)\ + DEFINE_VMK_ERR(VMK_REPLAY_TYPE_MISMATCH, "There was a type mismatch while reading from the log", EIO)\ + DEFINE_VMK_ERR(VMK_REPLAY_DIVERGENCE, "A divergence was detected during replay", EIO)\ + DEFINE_VMK_ERR(VMK_FT_NOT_RESPONDING, "The remote side of an FT pair isn't responding", ENOTCONN)\ + DEFINE_VMK_ERR(VMK_NET_REPLAY_ERROR, "An error occurred during replay of networking.", EIO)\ + DEFINE_VMK_ERR(VMK_VOBERR_INVALID_VOBID, "Vob ID invalid", EINVAL) \ + DEFINE_VMK_ERR(VMK_VOBERR_FMT_LIMIT_EXCEEDED,"Vob format string too long", EFBIG) \ + DEFINE_VMK_ERR(VMK_VOBERR_INVALID_FMT_STRING,"Invalid format specifier in VOB format string", EINVAL) \ + DEFINE_VMK_ERR(VMK_VOBERR_INVALID_ATTR, "Invalid attribute specifier in VOB format string", EINVAL) \ + DEFINE_VMK_ERR(VMK_ELF_CORRUPT, "ELF file is corrupt.", EINVAL) \ + DEFINE_VMK_ERR(VMK_EADDRNOTAVAIL, "Address not available", EADDRNOTAVAIL)\ + DEFINE_VMK_ERR(VMK_EDESTADDRREQ, "Destination address required", EDESTADDRREQ)\ + DEFINE_VMK_ERR(VMK_LVM_STALE_METADATA, "Cached LVM metadata is stale.", EPERM) \ + DEFINE_VMK_ERR(VMK_NO_RPC_TABLE, "RPC table does not exist", ENOENT) \ + DEFINE_VMK_ERR(VMK_DUPLICATE_UID, "Device already has UID", EEXIST) \ + DEFINE_VMK_ERR(VMK_UNRESOLVED_SYMBOL, "Unresolved symbol", ENOENT) \ + DEFINE_VMK_ERR(VMK_DEVICE_NOT_OWNED, "VMkernel does not own the device", EINVAL) \ + DEFINE_VMK_ERR(VMK_DEVICE_NOT_NAMED, "Device has no name", EINVAL) \ + DEFINE_VMK_ERR(VMK_EPROTONOSUPPORT, "Protocol not supported", EPROTONOSUPPORT) \ + DEFINE_VMK_ERR(VMK_EOPNOTSUPP, "Operation not supported", EOPNOTSUPP) \ + DEFINE_VMK_ERR(VMK_UNDEFINED_VMKCALL, "Undefined VMKCall", ENOSYS)\ + DEFINE_VMK_ERR(VMK_MIGRATE_MAX_DOWNTIME_EXCEEDED, "Maximum switchover time for migration exceeded", ETIMEDOUT) \ + DEFINE_VMK_ERR(VMK_LOCK_EXISTS, "Multiple RO/MW locks held by the same host", EEXIST) \ + DEFINE_VMK_ERR(VMK_MIGRATE_PRECOPY_NO_FORWARD_PROGRESS, "Migration failed due to lack of pre-copy forward progress", EINVAL)\ + DEFINE_VMK_ERR(VMK_UID_CHANGED, "Device UID changed", EEXIST) \ + DEFINE_VMK_ERR(VMK_VMOTION_CONNECT_FAILED, "The ESX hosts failed to connect over the VMotion network", ENOTCONN) \ + DEFINE_VMK_ERR(VMK_NO_MIGRATION_IN_PROGRESS, "No migration in progress", ENOENT) \ + DEFINE_VMK_ERR(VMK_EXEC_FILE_BUSY, "File is being executed, write access denied", ETXTBSY)\ + DEFINE_VMK_ERR(VMK_FS_TIMEOUT_RETRY, "File system timeout (Ok to retry)", ETIMEDOUT) \ + DEFINE_VMK_ERR(VMK_COW_TIMEOUT_RETRY, "COW timeout (Ok to retry)", ETIMEDOUT) \ + DEFINE_VMK_ERR(VMK_FS_LOCKSTATE_IN_TRANSITION_DEPRECATED, "Lock state is in transition (ok to retry) DEPRECATED", EBUSY)\ + DEFINE_VMK_ERR(VMK_FS_LOCK_LOST, "Disk lock acquired earlier, lost", EIO)\ + DEFINE_VMK_ERR(VMK_NO_SPACE_ON_DEVICE, "Underlying device has no free space", ENOSPC)\ + DEFINE_VMK_ERR(VMK_EOVERFLOW, "Value too large for defined data type", EOVERFLOW)\ + DEFINE_VMK_ERR(VMK_MEM_SHARES_INVALID, "Invalid memory shares", EINVAL)\ + DEFINE_VMK_ERR(VMK_LVM_INCONSISTENT_LOCKLESSOP, "LVM lockless op reads in an inconsistent state", EAGAIN) \ + DEFINE_VMK_ERR(VMK_INVALID_SECURITY_LABEL, "Invalid security label", EINVAL)\ + DEFINE_VMK_ERR(VMK_ACCESS_DENIED, "Access denied by vmkernel access control policy", EPERM)\ + DEFINE_VMK_ERR(VMK_WORK_COMPLETED, "Work has already completed", EALREADY)\ + DEFINE_VMK_ERR(VMK_WORK_RUNNING, "Work is currently running", EINPROGRESS)\ + DEFINE_VMK_ERR(VMK_WORK_PENDING, "Work is already pending", EEXIST)\ + DEFINE_VMK_ERR(VMK_WORK_INVALID, "Work or properties provided invalid", EINVAL)\ + DEFINE_VMK_ERR(VMK_VOBERR_OVERFLOW, "VOB context overflow", EFBIG)\ + DEFINE_VMK_ERR(VMK_VOBERR_INVALID_CONTEXT, "VOB context invalid", EINVAL)\ + DEFINE_VMK_ERR(VMK_VOBERR_LOCK_CONFLICT, "VOB context conflict for lock", EINVAL)\ + DEFINE_VMK_ERR(VMK_RETRY, "Retry the operation", EINVAL)\ + DEFINE_VMK_ERR(VMK_NO_MODULE_HEAP, "Module has no heap to allocate from", ENOMEM)\ + DEFINE_VMK_ERR(VMK_REMOTE_PAGE_FAULT_FAILURE,"Remote page fault failure", ENOMEM)\ + DEFINE_VMK_ERR(VMK_VSI_DATA_LENGTH_MISMATCH, "VSI data length mismatch", EIO)\ + DEFINE_VMK_ERR(VMK_MAPPING_FAILED,"Mapping operation failed", EFAULT)\ + DEFINE_VMK_ERR(VMK_ATS_MISCOMPARE, "Atomic test and set of disk block returned false for equality", EINVAL)\ + DEFINE_VMK_ERR(VMK_NO_BUFFERSPACE, "No buffer space available", ENOBUFS)\ + DEFINE_VMK_ERR(VMK_FT_NOT_RUNNING, "FT vm is not enabled", EINVAL) \ + DEFINE_VMK_ERR(VMK_PKEI_STACK_UNDERFLOW, "PKEI stack pointer value below the PKEI stack base ptr", EFAULT )\ + DEFINE_VMK_ERR(VMK_LICENSE_MISMATCH, "Incompatible licenses detected", EINVAL )\ + DEFINE_VMK_ERR(VMK_ELF_UNKNOWN_RELOCATIONS, "ELF file contains invalid relocation types", EINVAL )\ + DEFINE_VMK_ERR(VMK_MESSAGE_TOO_LONG, "Message too long", EMSGSIZE)\ + DEFINE_VMK_ERR(VMK_INVALID_NAMESPACE, "Invalid or missing namespace", ENOENT) \ + DEFINE_VMK_ERR(VMK_SHUTTING_DOWN, "Operation not allowed because the VMKernel is shutting down", ENOENT) \ + DEFINE_VMK_ERR(VMK_VMFS_ABORTED, "IO was aborted by VMFS via a virt-reset on the device", ECANCELED)\ +/* + * --- ADD NEW ERROR CODES ABOVE THIS COMMENT. --- VMK_GENERIC_LINUX_ERROR must be last. \ + */ \ + DEFINE_VMK_ERR_AT(VMK_GENERIC_LINUX_ERROR, "Generic service console error", 0x2bad0000, EIO ) +/* --- Don't add ERR_AT with negative value. --- */ +/** \endcond */ + +/* + * types + */ +/** \cond nodoc */ +#define DEFINE_VMK_ERR(_err, _str, _uerr) /** \brief _str */ _err, +#define DEFINE_VMK_ERR_AT(_err, _str, _val, _uerr) /** \brief _str */ _err = _val, +/** \endcond */ +typedef enum { + VMK_ERROR_CODES +} VMK_ReturnStatus; +/** \cond nodoc */ +#undef DEFINE_VMK_ERR +#undef DEFINE_VMK_ERR_AT +/** \endcond */ + +#endif /* _VMKAPI_STATUS_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_stress.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_stress.h new file mode 100644 index 0000000..07418b6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_stress.h @@ -0,0 +1,146 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Stress */ /** + * \defgroup Stress Stress Options + * + * The stress option interfaces allow access to special environment + * variables that inform code whether or not certain stress code + * should be run. + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_STRESS_H_ +#define _VMKAPI_STRESS_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/* + * Useful stress option names + */ +/** \cond nodoc */ +#define VMK_STRESS_OPT_NET_GEN_TINY_ARP_RARP "NetGenTinyArpRarp" +#define VMK_STRESS_OPT_NET_IF_CORRUPT_ETHERNET_HDR "NetIfCorruptEthHdr" +#define VMK_STRESS_OPT_NET_IF_CORRUPT_RX_DATA "NetIfCorruptRxData" +#define VMK_STRESS_OPT_NET_IF_CORRUPT_RX_TCP_UDP "NetIfCorruptRxTcpUdp" +#define VMK_STRESS_OPT_NET_IF_CORRUPT_TX "NetIfCorruptTx" +#define VMK_STRESS_OPT_NET_IF_FAIL_HARD_TX "NetIfFailHardTx" +#define VMK_STRESS_OPT_NET_IF_FAIL_RX "NetIfFailRx" +#define VMK_STRESS_OPT_NET_IF_FAIL_TX_AND_STOP_QUEUE "NetIfFailTxAndStopQueue" +#define VMK_STRESS_OPT_NET_IF_FORCE_HIGH_DMA_OVERFLOW "NetIfForceHighDMAOverflow" +#define VMK_STRESS_OPT_NET_IF_FORCE_RX_SW_CSUM "NetIfForceRxSWCsum" +#define VMK_STRESS_OPT_NET_NAPI_FORCE_BACKUP_WORLDLET "NetNapiForceBackupWorldlet" +#define VMK_STRESS_OPT_NET_BLOCK_DEV_IS_SLUGGISH "NetBlockDevIsSluggish" + +#define VMK_STRESS_OPT_SCSI_ADAPTER_ISSUE_FAIL "ScsiAdapterIssueFail" + +#define VMK_STRESS_OPT_VMKLINUX_DROP_CMD_SCSI_DONE "VmkLinuxDropCmdScsiDone" +#define VMK_STRESS_OPT_VMKLINUX_ABORT_CMD_FAILURE "VmkLinuxAbortCmdFailure" + +#define VMK_STRESS_OPT_USB_BULK_DELAY_PROCESS_URB "USBBulkDelayProcessURB" +#define VMK_STRESS_OPT_USB_BULK_URB_FAKE_TRANSIENT_ERROR "USBBulkURBFakeTransientError" +#define VMK_STRESS_OPT_USB_DELAY_PROCESS_TD "USBDelayProcessTD" +#define VMK_STRESS_OPT_USB_FAIL_GP_HEAP_ALLOC "USBFailGPHeapAlloc" +#define VMK_STRESS_OPT_USB_STORAGE_DELAY_SCSI_DATA_PHASE "USBStorageDelaySCSIDataPhase" +#define VMK_STRESS_OPT_USB_STORAGE_DELAY_SCSI_TRANSFER "USBStorageDelaySCSITransfer" +/** \endcond nodoc */ + +/** + * \brief Opaque stress option handle. + */ +typedef vmk_uint64 vmk_StressOptionHandle; + +/* + *********************************************************************** + * vmk_StressOptionOpen -- */ /** + * + * \ingroup Stress + * \brief Open a handle to stress option + * + * \param[in] name A stress option name + * \param[out] handle Handle to the stress option + * + * \retval VMK_OK Successful + * \retval VMK_BAD_PARAM The stress option id was invalid + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_StressOptionOpen( + const char *name, + vmk_StressOptionHandle *handle); + +/* + *********************************************************************** + * vmk_StressOptionClose -- */ /** + * + * \ingroup Stress + * \brief Close a handle to stress option + * + * \param[in] handle Handle to the stress option + * + * \retval VMK_OK Successful + * \retval VMK_BAD_PARAM The stress option handle was invalid + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_StressOptionClose( + vmk_StressOptionHandle handle); + +/* + *********************************************************************** + * vmk_StressOptionValue -- */ /** + * + * \ingroup Stress + * \brief Get stress option value + * + * \param[in] handle Handle to the stress option + * \param[out] result Stress option value + * + * \retval VMK_OK Successful + * \retval VMK_BAD_PARAM The stress option handle was invalid + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_StressOptionValue( + vmk_StressOptionHandle handle, + vmk_uint32 *result); + +/* + *********************************************************************** + * vmk_StressOptionCounter -- */ /** + * + * \ingroup Stress + * \brief Increment stress option counter every Nth (value) + * randomized call if the option is enabled (value > 0) + * + * \param[in] handle Handle to the stress option + * \param[out] result VMK_TRUE if counter was incremented, + * VMK_FALSE otherwise + * + * \retval VMK_OK Successful + * \retval VMK_BAD_PARAM The stress option handle was invalid + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_StressOptionCounter( + vmk_StressOptionHandle handle, + vmk_Bool *result); + +#endif /* _VMKAPI_STRESS_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_system.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_system.h new file mode 100644 index 0000000..a13809b --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_system.h @@ -0,0 +1,173 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * System */ /** + * + * \defgroup System General Kernel System Interfaces + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SYSTEM_H_ +#define _VMKAPI_SYSTEM_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/** + * \brief + * The maximum length of a system version info string including the + * trailing nul. + */ +#define VMK_SYSTEM_VERSION_INFO_MAX_LEN 32 + +/** \brief A reboot handler callback */ +typedef void (*vmk_RebootHandler)(void *data); + +/** + * \brief States for a vmkernel system. + */ +typedef enum { + /** \brief System is in a normal running state */ + VMK_SYSTEM_STATE_NORMAL=0, + + /** \brief System is currently panicing */ + VMK_SYSTEM_STATE_PANIC=1, + + /** \brief System is currently shutting down/rebooting */ + VMK_SYSTEM_STATE_UNLOADING=2 +} vmk_SystemState; + +/** + * \brief Host types for a vmkernel system. + */ +typedef enum { + /** \brief Host type is unknown */ + VMK_SYSTEM_HOST_TYPE_UNKNOWN=0, + + /** \brief System is running COS */ + VMK_SYSTEM_HOST_TYPE_COS=1, + + /** \brief System is running Visor */ + VMK_SYSTEM_HOST_TYPE_VISOR=2, +} vmk_SystemHostType; + +/** + * \brief General-interest version and name information about vmkernel + */ +typedef struct { + const char *productName; + const char *productVersion; + const char *buildVersion; +} vmk_SystemVersionInfo; + +/* + *********************************************************************** + * vmk_RegisterRebootHandler -- */ /** + * + * \ingroup System + * \brief Register a handler to be called before reboot. + * + * \param[in] handler Handler function to call before reboot. + * \param[in] data Pointer to be passed to reboot handler function. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RegisterRebootHandler( + vmk_RebootHandler handler, void *data); + +/* + *********************************************************************** + * vmk_UnregisterRebootHandler -- */ /** + * + * \ingroup System + * \brief Unregister a reboot handler. + * + * \param[in] handler Handler function to unregister. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_UnregisterRebootHandler( + vmk_RebootHandler handler); + +/* + *********************************************************************** + * vmk_SystemCheckState -- */ /** + * + * \ingroup System + * \brief Check if the system is in a particular state. + * + * \note A system may be in more than one state simultaneously. + * + * \note This is a snapshot of the state at the time of the call and + * is subject to change. + * + * \param[in] state State to check for. + * + * \retval VMK_TRUE The system is in the specified state. + * \retval VMK_FALSE The system is not in the specified state. + * + *********************************************************************** + */ +vmk_Bool vmk_SystemCheckState( + vmk_SystemState state); + +/* + *********************************************************************** + * vmk_SystemGetIDString -- */ /** + * + * \ingroup System + * \brief Get a persistent system identifier string. + * + * \note The identifier string conforms to the string + * representation cited in section three of RFC 4122. + * + * \param[out] id The identifier string. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SystemGetIDString( + const char *id[]); + +/* + *********************************************************************** + * vmk_SystemGetHostType -- */ /** + * + * \ingroup System + * \brief Determine the type of host the system is running with. + * + *********************************************************************** + */ +vmk_SystemHostType vmk_SystemGetHostType( + void); + +/* + *********************************************************************** + * vmk_SystemGetVersionInfo -- */ /** + * + * \ingroup System + * \brief Get string-style version information about vmkernel + * + * \param[out] info Version information about vmkernel + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_SystemGetVersionInfo( + vmk_SystemVersionInfo *info); + +#endif /* _VMKAPI_SYSTEM_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_time.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_time.h new file mode 100644 index 0000000..57fdc8f --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_time.h @@ -0,0 +1,395 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Time */ /** + * + * \defgroup Time Time and Timers + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_TIME_H_ +#define _VMKAPI_TIME_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + +/** \brief Known invalid value for a timer */ +#define VMK_INVALID_TIMER 0 + +typedef vmk_int64 vmk_TimerRelCycles; +typedef vmk_uint64 vmk_TimerCycles; + +typedef vmk_AddrCookie vmk_TimerCookie; +typedef void (*vmk_TimerCallback)(vmk_TimerCookie data); +typedef vmk_uint64 vmk_Timer; + +/** + * \brief Representation for Time + */ +typedef struct { + vmk_int64 sec; /* seconds */ + vmk_int64 usec; /* microseconds */ +} vmk_TimeVal; + + +/* Convenient time constants */ +#define VMK_USEC_PER_SEC 1000000 +#define VMK_MSEC_PER_SEC 1000 +#define VMK_USEC_PER_MSEC 1000 +#define VMK_USECS_PER_JIFFY 10000 +#define VMK_JIFFIES_PER_SECOND (VMK_USEC_PER_SEC/VMK_USECS_PER_JIFFY) + +/* + *********************************************************************** + * vmk_jiffies -- */ /** + * + * \ingroup Time + * \brief A global that increments every VMK_USECS_PER_JIFFY + * microsceonds. + * + *********************************************************************** + */ +extern volatile unsigned long vmk_jiffies; + +/* + *********************************************************************** + * vmk_GetTimerCycles -- */ /** + * + * \ingroup Time + * \brief Return the time elapsed since the VMKernel was loaded. + * + *********************************************************************** + */ +vmk_TimerCycles vmk_GetTimerCycles(void); + +/* + *********************************************************************** + * vmk_TimerCyclesPerSecond -- */ /** + * + * \ingroup Time + * \brief Return the frequency in Hz of the vmk_GetTimerCycles() clock. + * + *********************************************************************** + */ +vmk_uint64 vmk_TimerCyclesPerSecond(void); + +/* + *********************************************************************** + * vmk_TimerUSToTC -- */ /** + * + * \ingroup Time + * \brief Convert signed microseconds into signed timer cycles. + * + *********************************************************************** + */ +vmk_TimerRelCycles vmk_TimerUSToTC( + vmk_int64 us); + +/* + *********************************************************************** + * vmk_TimerTCToUS -- */ /** + * + * \ingroup Time + * \brief Convert signed timer cycles into signed microseconds. + * + *********************************************************************** + */ +vmk_int64 vmk_TimerTCToUS( + vmk_TimerRelCycles cycles); + +/* + *********************************************************************** + * vmk_TimerMSToTC -- */ /** + * + * \ingroup Time + * \brief Convert signed milliseconds into signed timer cycles. + * + *********************************************************************** + */ +vmk_TimerRelCycles vmk_TimerMSToTC( + vmk_int64 ms); + +/* + *********************************************************************** + * vmk_TimerTCToMS -- */ /** + * + * \ingroup Time + * \brief Convert signed timer cycles into signed milliseconds. + * + *********************************************************************** + */ +vmk_int64 vmk_TimerTCToMS( + vmk_TimerRelCycles cycles); + +/* + *********************************************************************** + * vmk_TimerUnsignedUSToTC -- */ /** + * + * \ingroup Time + * \brief Convert unsigned microseconds into unsigned timer cycles. + * + *********************************************************************** + */ +vmk_TimerCycles vmk_TimerUnsignedUSToTC( + vmk_uint64 us); + +/* + *********************************************************************** + * vmk_TimerUnsignedTCToUS -- */ /** + * + * \ingroup Time + * \brief Convert unsigned timer cycles into unsigned microseconds. + * + *********************************************************************** + */ +vmk_uint64 vmk_TimerUnsignedTCToUS( + vmk_TimerCycles cycles); + +/* + *********************************************************************** + * vmk_TimerUnsignedMSToTC -- */ /** + * + * \ingroup Time + * \brief Convert unsigned millieconds into unsigned timer cycles. + * + *********************************************************************** + */ +vmk_TimerCycles vmk_TimerUnsignedMSToTC( + vmk_uint64 ms); + +/* + *********************************************************************** + * vmk_TimerUnsignedTCToMS -- */ /** + * + * \ingroup Time + * \brief Convert unsigned timer cycles into unsigned milliseconds. + * + *********************************************************************** + */ +vmk_uint64 vmk_TimerUnsignedTCToMS( + vmk_TimerCycles cycles); + +/* + *********************************************************************** + * VMK_ABS_TIMEOUT_MS -- */ /** + * + * \ingroup Time + * \brief Convert a delay in milliseconds into an absolute timeout in + * milliseconds. + * + * \param[in] delay_ms Millisecond delay to convert to absolute time. + * + * \return If delay_ms is nonzero, returns the absolute time in + * milliseconds that is delay_ms from the time of the call. If + * delay_ms is 0, returns 0, avoiding a call to vmk_GetTimerCycles. + * + *********************************************************************** + */ +#define VMK_ABS_TIMEOUT_MS(delay_ms) \ + ((delay_ms) ? vmk_TimerUnsignedTCToMS(vmk_GetTimerCycles()) + (delay_ms) : 0) + +/* + *********************************************************************** + * vmk_GetTimeOfDay -- */ /** + * + * \ingroup Time + * \brief Get the time in vmk_TimeVal representation. + * + *********************************************************************** + */ +void vmk_GetTimeOfDay( + vmk_TimeVal *tv); + +/* + *********************************************************************** + * vmk_GetUptime -- */ /** + * + * \ingroup Time + * \brief Get the uptime in vmk_TimeVal representation. + * + *********************************************************************** + */ +void vmk_GetUptime( + vmk_TimeVal *tv); + +/* + *********************************************************************** + * vmk_DelayUsecs -- */ /** + * + * \ingroup Time + * \brief Spin-wait for a specified number of microseconds. + * + *********************************************************************** + */ +void vmk_DelayUsecs( + vmk_uint32 uSecs); + +/* + *********************************************************************** + * vmk_TimerAdd -- */ /** + * + * \ingroup Time + * \brief Schedule a timer. + * + * The VMKernel can schedule simultaneously a limited number of timers + * for each CPU. + * + * \warning Timers are a limited resource. The VMKernel does not + * guarantee to provide more than 100 concurrent timers per CPU + * system-wide, and exceeding the limit is a fatal error. + * + * \param[in] callback Timer callback. + * \param[in] data Argument passed to the timer callback on + * timeout. + * \param[in] timeoutUs Timeout in microseconds. + * \param[in] periodic Whether the timer should automatically + * reschedule itself. + * \param[in] rank Major rank of the timer; see explanation of + * lock and timer ranks in vmkapi_lock.h. + * \param[out] timer Timer reference. + * + * \retval VMK_NO_RESOURCES Couldn't schedule the timer. + * \retval VMK_OK The timer was successfully scheduled. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_TimerAdd( + vmk_TimerCallback callback, + vmk_TimerCookie data, + vmk_int32 timeoutUs, + vmk_Bool periodic, + vmk_SpinlockRank rank, + vmk_Timer *timer); + +/* + *********************************************************************** + * vmk_TimerModifyOrAdd -- */ /** + * + * \ingroup Time + * \brief Schedule or reschedule a timer. + * + * Atomically remove the timer referenced by *timer (if pending) and + * reschedule it with the given new parameters, possibly replacing + * *timer with a new timer reference. It is permissible for *timer to + * be VMK_INVALID_TIMER on input; in this case a new timer reference is + * always returned. This function is slower than vmk_TimerAdd and + * should be used only if the atomic replacement semantics are needed. + * + * \param[in] callback Timer callback + * \param[in] data Argument passed to the timer callback on + * timeout. + * \param[in] timeoutUs Timeout in microseconds + * \param[in] periodic Whether the timer should automatically + * reschedule itself + * \param[in] rank Major rank of the timer; see explanation of + * lock and timer ranks in vmkapi_lock.h. + * \param[in,out] timer Timer reference + * \param[out] pending Whether the timer was still pending when + * modified. + * + * \retval VMK_NO_RESOURCES Couldn't schedule the timer. + * \retval VMK_OK The timer was successfully scheduled. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_TimerModifyOrAdd( + vmk_TimerCallback callback, + vmk_TimerCookie data, + vmk_int32 timeoutUs, + vmk_Bool periodic, + vmk_SpinlockRank rank, + vmk_Timer *timer, + vmk_Bool *pending); + +/* + *********************************************************************** + * vmk_TimerRemove -- */ /** + * + * \ingroup Time + * \brief Cancel a scheduled timer. + * + * \param[in] timer A timer reference. + * + * \retval VMK_OK The timer was successfully cancelled. If the + * timer was one-shot, it did not fire and never + * will. + * \retval VMK_NOT_FOUND The timer had previously been removed, was a + * one-shot that already fired, or is + * VMK_INVALID_TIMER. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_TimerRemove( + vmk_Timer timer); + +/* + *********************************************************************** + * vmk_TimerRemoveSync -- */ /** + * + * \ingroup Time + * \brief Cancel a scheduled timer + * + * If the timer fired before it could be cancelled, spin until the timer + * callback completes. + * + * \warning This function must not be called from the timer callback + * itself. It must be called with current lock rank less than + * the timer's rank; see an explanation of lock and timer ranks + * in vmkapi_lock.h. + * + * \param[in] timer A timer reference. + * + * \retval VMK_OK The timer was successfully cancelled. If the + * timer was one-shot, it did not fire and + * never will. + * \retval VMK_NOT_FOUND The timer had previously been removed, was a + * one-shot that already fired, or is + * VMK_INVALID_TIMER. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_TimerRemoveSync( + vmk_Timer timer); + +/* + *********************************************************************** + * vmk_TimerIsPending -- */ /** + * + * \ingroup Time + * \brief Query a timer to see if it is pending. + * + * \param[in] timer A timer reference. + * + * \retval VMK_TRUE The timer is pending. For one-shot timers, this + * means the timer has neither fired nor been removed. + * For periodic timers, it means the timer has not + * been removed. + * \retval VMK_FALSE The timer is not pending. For one-shot timers, + * this means the timer has already fired, is in + * the process of firing, or has been removed. For + * periodic timers, it means the timer has been + * removed. VMK_FALSE is also returned for + * VMK_INVALID_TIMER. + * + *********************************************************************** + */ +vmk_Bool vmk_TimerIsPending( + vmk_Timer timer); + +#endif /* _VMKAPI_TIME_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_types.h new file mode 100644 index 0000000..fe7713a --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_types.h @@ -0,0 +1,100 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Types */ /** + * \defgroup Types Basic Types + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_TYPES_H_ +#define _VMKAPI_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/** \brief vmk_Bool FALSE value */ +#define VMK_FALSE 0 + +/** \brief vmk_Bool TRUE value */ +#define VMK_TRUE 1 + +/** \brief Boolean value */ +typedef char vmk_Bool; + +typedef signed char vmk_int8; +typedef unsigned char vmk_uint8; +typedef short vmk_int16; +typedef unsigned short vmk_uint16; +typedef int vmk_int32; +typedef unsigned int vmk_uint32; + +#if defined(__ia64__) || defined(__x86_64__) +typedef long vmk_int64; +typedef unsigned long vmk_uint64; +typedef vmk_uint64 vmk_VirtAddr; +typedef vmk_uint64 vmk_uintptr_t; +#else +typedef long long vmk_int64; +typedef unsigned long long vmk_uint64; +typedef vmk_uint32 vmk_VirtAddr; +typedef vmk_uint32 vmk_uintptr_t; +#endif + +typedef vmk_uint32 vmk_MachPage; +typedef vmk_uint64 vmk_MachAddr; +typedef unsigned long vmk_size_t; +typedef long vmk_ssize_t; +typedef vmk_uint32 vmk_small_size_t; +typedef vmk_int32 vmk_small_ssize_t; +typedef long long vmk_loff_t; + +/** + * \brief Abstract address + */ +typedef union { + vmk_VirtAddr addr; + void *ptr; +} vmk_AddrCookie __attribute__ ((__transparent_union__)); + +/** + * \brief Structure containing information about a generic string + */ +typedef struct { + vmk_uint32 bufferSize; + vmk_uint32 stringLength; + vmk_uint8 *buffer; +} vmk_String; + +#define VMK_STRING_CHECK_CONSISTENCY(string) VMK_ASSERT((string) && ((string)->bufferSize > (string)->stringLength)) + +#define VMK_STRING_SET(str,ptr,size,len) { \ + (str)->buffer = (ptr); \ + (str)->bufferSize = (size); \ + (str)->stringLength = (len); \ + } + +/** + * \brief Address space size of ioctl caller. + */ +typedef enum { + /** \brief Caller has 64-bit address space. */ + VMK_IOCTL_CALLER_64 = 0, + + /** \brief Caller has 32-bit address space. */ + VMK_IOCTL_CALLER_32 = 1 +} vmk_IoctlCallerSize; + +#endif /* _VMKAPI_TYPES_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_util.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_util.h new file mode 100644 index 0000000..362c227 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_util.h @@ -0,0 +1,62 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Utilities */ /** + * + * \defgroup Util Utilities + * + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_UTIL_H_ +#define _VMKAPI_UTIL_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + *********************************************************************** + * VMK_STRINGIFY -- */ /** + * + * \ingroup Util + * \brief Turn a preprocessor variable into a string + * + * \param[in] v A preprocessor variable to be converted to a + * string. + * + *********************************************************************** + */ +/** \cond never */ +#define __VMK_STRINGIFY(v) #v +/** \endcond never */ +#define VMK_STRINGIFY(v) __VMK_STRINGIFY(v) + +/* + *********************************************************************** + * VMK_UTIL_ROUNDUP -- */ /** + * + * \ingroup Util + * \brief Round up a value X to the next multiple of Y. + * + * \param[in] x Value to round up. + * \param[in] y Value to round up to the next multiple of. + * + * \returns Rounded up value. + * + *********************************************************************** + */ +#define VMK_UTIL_ROUNDUP(x, y) ((((x)+(y)-1) / (y)) * (y)) + +#endif /* _VMKAPI_UTIL_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_world.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_world.h new file mode 100644 index 0000000..49c6649 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_world.h @@ -0,0 +1,622 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Worlds */ /** + * \defgroup Worlds Worlds + * + * Worlds are the smallest schedulable entity in the VMkernel. A world + * can be either a kernel thread or a virtual machine. + * + * Once a kernel world is running on a CPU it will not be preempted + * except by hardare interrupts, otherwise it will only yield the CPU + * voluntarily. + * + *@{ + *********************************************************************** + */ + +#ifndef _VMKAPI_WORLD_H_ +#define _VMKAPI_WORLD_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_platform.h" + +/** + * \brief General category of reason for blocking. + */ +typedef enum { + /** \brief Used to indicate miscellaneous blocking */ + VMK_WORLD_WAIT_MISC=0, + + /** \brief Used to indicate blocking during SCSI plugin work */ + VMK_WORLD_WAIT_SCSI_PLUGIN=1, + + /** \brief Used to indicate blocking during Network operations */ + VMK_WORLD_WAIT_NET=2, + + /** + * \brief All wait reasons will be less than this. + * \note This is not a valid wait reason. + */ + VMK_WORLD_WAIT_MAX +} vmk_WorldWaitReason; + +/** + * \brief Even to block on. + * + * Events to block on are, by convention, always kernel virtual addresses. + */ +typedef vmk_VirtAddr vmk_WorldEventId; + +/** \brief The body function of a world. */ +typedef VMK_ReturnStatus (*vmk_WorldStartFunc)(void *data); + +/** \brief Opaque handle for a world */ +typedef vmk_int32 vmk_WorldID; + +/** \brief Key to access private data. */ +typedef vmk_int64 vmk_WorldPrivateInfoKey; + +/** \brief Destructor for private data. */ +typedef void (*vmk_WorldPrivateKeyDestructor)(vmk_AddrCookie, + vmk_WorldPrivateInfoKey, + vmk_WorldID); + +/** \brief An opaque handle for held private data. */ +typedef void *vmk_WorldPrivateDataHandle; + +#define VMK_INVALID_WORLD_ID ((vmk_WorldID)0) + +/** + * \brief Indication of unlimited CPU allocation (max) + */ +#define VMK_CPU_ALLOC_UNLIMITED ((vmk_uint32) -1) + +/* + *********************************************************************** + * vmk_WorldCreate -- */ /** + * + * \ingroup Worlds + * \brief Create and start a new World + * + * \warning Since this World will run in kernel mode, it cannot be + * pre-empted by the scheduler. It is the World's + * responsibility to ensure a fair usage of the CPU. + * + * \param[in] moduleID Module on whose behalf the world is running. + * \param[in] name A string that describes the world. The name + * will show up as debug information. + * \param[in] startFunction Function that the world begins executing + * on creation. + * \param[in] data Argument to passed to startFunction. + * \param[out] worldId World ID associated with the newly + * created world. May be set to NULL if + * the caller does not need the World ID. + * + * \retval VMK_OK World created. + * \retval VMK_NO_MEMORY Ran out of memory. + * \retval VMK_DEATH_PENDING World is in the process of dying. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldCreate( + vmk_ModuleID moduleID, + const char *name, + vmk_WorldStartFunc startFunction, + void *data, + vmk_WorldID *worldId); + +/* + *********************************************************************** + * vmk_WorldExit -- */ /** + * + * \ingroup Worlds + * \brief End execution of the calling world. + * + * \param[in] status Status of the world on exit. + * + *********************************************************************** + */ +void vmk_WorldExit(VMK_ReturnStatus status); + +/* + *********************************************************************** + * vmk_WorldGetID -- */ /** + * + * \ingroup Worlds + * \brief Get the ID of the current world. + * + * \return WorldID of the currently running world that this + * call was invoked from or VMK_INVALID_WORLD_ID if + * this call was not invoked from a world context. + * + *********************************************************************** + */ +vmk_WorldID vmk_WorldGetID( + void); + +/* + *********************************************************************** + * vmk_WorldAssertIsSafeToBlock -- */ /** + * + * \ingroup Globals + * \brief Assert that it is OK for the caller to block. + * + * \note Only works in debug builds. + * + *********************************************************************** + */ +#ifdef VMX86_DEBUG +void vmk_WorldAssertIsSafeToBlock( + void); +#else +static inline void vmk_WorldAssertIsSafeToBlock( + void){} +#endif + +/* + *********************************************************************** + * vmk_WorldWait -- */ /** + * + * \ingroup Worlds + * \brief Deschedule a World holding an Non-IRQ spinlock until awakened. + * + * \note Spurious wakeups are possible. + * + * \note The lock should be of rank VMK_SP_RANK_IRQ_BLOCK or lower + * otherwise a lock rank violation will occur. + * + * \param[in] eventId System wide unique identifier of the event + * to sleep on. + * \param[in] lock Non-IRQ spinlock to release before descheduling + * the world. + * \param[in] reason Subsystem/reason for the descheduling. + * + * \retval VMK_OK Woken up by a vmk_WorldWakeup on + * eventId. + * \retval VMK_DEATH_PENDING Woken up because the world is dying + * and being reaped by the scheduler. + * \retval VMK_WAIT_INTERRUPTED Woken for some other reason. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldWait( + vmk_WorldEventId eventId, + vmk_Spinlock *lock, + vmk_WorldWaitReason reason); + +/* + *********************************************************************** + * vmk_WorldWaitIRQ -- */ /** + * + * \ingroup Worlds + * \brief Deschedule a World holding an IRQ spinlock until awakened. + * + * \note Spurious wakeups are possible. + * + * \param[in] eventId System wide unique identifier of the event + * to sleep on. + * \param[in] lock IRQ spinlock to release before descheduling + * the world. + * \param[in] reason Subsystem/reason for the descheduling. + * \param[in] flags IRQ flags returned by IRQ spinlock function. + * + * \retval VMK_OK Woken up by a vmk_WorldWakeup on + * eventId. + * \retval VMK_DEATH_PENDING Woken up because the world is dying and + * being reaped by the scheduler. + * \retval VMK_WAIT_INTERRUPTED Woken for some other reason. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldWaitIRQ( + vmk_WorldEventId eventId, + vmk_SpinlockIRQ *lock, + vmk_WorldWaitReason reason, + unsigned long flags); + +/* + *********************************************************************** + * vmk_WorldTimedWait -- */ /** + * + * \ingroup Worlds + * \brief Deschedule a World holding an Non-IRQ Spinlock until awakened + * or until the specified timeout expires. + * + * \note Spurious wakeups are possible. + * + * \param[in] eventId System wide unique identifier of the event + * to sleep on. + * \param[in] lock Non-IRQ spinlock to release before + * descheduling the world. + * \param[in] reason Subsystem/reason for the descheduling + * \param[in] timeoutUs Number of microseconds before timeout. + * \param[out] timedOut If non-NULL, set to TRUE if wakeup was + * due to timeout expiration, FALSE otherwise. + * + * \retval VMK_OK Woken up by a vmk_WorldWakeup on + * eventId or by timeout expiration. + * \retval VMK_DEATH_PENDING Woken up because the world is dying + * and being reaped by the scheduler. + * \retval VMK_WAIT_INTERRUPTED Woken for some other reason. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldTimedWait( + vmk_WorldEventId eventId, + vmk_Spinlock *lock, + vmk_WorldWaitReason reason, + vmk_uint64 timeoutUs, + vmk_Bool *timedOut); + +/* + *********************************************************************** + * vmk_WorldTimedWaitIRQ -- */ /** + * + * \ingroup Worlds + * \brief Deschedule a World holding an IRQ Spinlock until awakened + * or until the specified timeout expires. + * + * \note Spurious wakeups are possible. + * + * \param[in] eventId System wide unique identifier of the event + * to sleep on. + * \param[in] lock Non-IRQ spinlock to release before + * descheduling the world. + * \param[in] reason Subsystem/reason for the descheduling + * \param[in] timeoutUs Number of microseconds before timeout. + * \param[in] flags IRQ flags returned by IRQ spinlock function. + * \param[out] timedOut If non-NULL, set to TRUE if wakeup was + * due to timeout expiration, FALSE otherwise. + * + * \retval VMK_OK Woken up by a vmk_WorldWakeup on + * eventId or by timeout expiration. + * \retval VMK_DEATH_PENDING Woken up because the world is dying + * and being reaped by the scheduler. + * \retval VMK_WAIT_INTERRUPTED Woken for some other reason. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldTimedWaitIRQ( + vmk_WorldEventId eventId, + vmk_SpinlockIRQ *lock, + vmk_WorldWaitReason reason, + unsigned long flags, + vmk_uint64 timeoutUs, + vmk_Bool *timedOut); + +/* + *********************************************************************** + * vmk_WorldWakeup -- */ /** + * + * \ingroup Worlds + * \brief Wake up all the Worlds waiting on a event eventId + * + * \param[in] eventId System wide unique identifier of the event. + * + * \retval VMK_OK One or more worlds was woken up. + * \retval VMK_NOT_FOUND No worlds were found that wake up to eventId. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldWakeup( + vmk_WorldEventId eventId); + +/* + *********************************************************************** + * vmk_WorldSleep -- */ /** + * + * \ingroup Worlds + * \brief Deschedule a World for the specified amount of time + * + * \param delayUs Duration of the snooze in microseconds + * + * \retval VMK_OK Woken up by a vmk_WorldWakeup on + * eventId. + * \retval VMK_DEATH_PENDING Woken up because the world is dying + * and beeing reaped by the scheduler. + * \retval VMK_WAIT_INTERRUPTED Woken for some other reason. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldSleep( + vmk_uint64 delayUs); + +/* + *********************************************************************** + * vmk_WorldYield -- */ /** + * + * \ingroup Worlds + * \brief Deschedule the calling World. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldYield( + void); + +/* + *********************************************************************** + * vmk_WorldPrivateKeyCreate -- */ /** + * + * \ingroup Worlds + * \brief Creates a new key to represent world-private info. + * + * The destructor function will be called when a vmk_AddrCookie + * (set up by vmk_WorldSetPrivateInfo) is destroyed. It will be called + * in an unspecified context, not necessarily the context in which + * vmk_WorldSetPrivateInfo ran. + * + * The destructor may not block. + * + * Any module using this interface must destroy the keys it creates by + * call vmk_WorldPrivateKeyDestroy before completing its unload. + * + * \param[out] key The key created. + * \param[in] destructor A optional destructor function, or + * NULL for no destructor. + * + * \retval VMK_OK The key was sucessfully returned. + * \retval VMK_NO_MEMORY Insufficient memory to complete the request. + * \retval VMK_NO_RESOURCES Insufficient resources to complete the request. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldPrivateKeyCreate( + vmk_WorldPrivateInfoKey *key, vmk_WorldPrivateKeyDestructor destructor); + +/* + ************************************************************************ + * vmk_WorldPrivateKeyDestroy - */ /** + * + * \ingroup Worlds + * \brief Destroys a key created by vmk_WorldPrivateKeyCreate. + * + * Upon return, the caller is assured that the destructor (specified by + * vmk_WorldPrivateKeyCreate) has been invoked for every data item + * associated with the key, and that all such destructor invocations + * have completed. + * + * vmk_WorldPrivateKeyDestroy may block. + * + * \param[in] key The key to be destroyed. + * + * \retval VMK_OK The key was sucessfully destroyed. + * \retval VMK_NOT_FOUND The key does not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldPrivateKeyDestroy( + vmk_WorldPrivateInfoKey key); + +/* + *********************************************************************** + * vmk_WorldSetPrivateInfo -- */ /** + * + * \ingroup Worlds + * \brief Associates a data pointer with the calling World and the + * specified key. + * + * This function will typically associate memory (allocated by the caller) + * with the key, private to the currently executing world. + * + * This function can return VMK_NOT_FOUND if the key is concurrently + * being destroyed by vmk_WorldPrivateKeyDestroy. + * + * \param[in] key Key to access private data. + * \param[in] info Private data pointer to store. + * + * \retval VMK_OK The pointer was sucessfully stored. + * \retval VMK_NOT_FOUND The given key does not exist. + * \retval VMK_NO_MEMORY Not enough memory to complete the operation. + * \retval VMK_INVALID_WORLD Caller is not running in world context. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldSetPrivateInfo( + vmk_WorldPrivateInfoKey key, + vmk_AddrCookie info); + +/* + *********************************************************************** + * vmk_WorldGetPrivateInfo -- */ /** + * + * \ingroup Worlds + * \brief Get a World-private data pointer associated with a key. + * + * This function can return VMK_NOT_FOUND if the key is concurrently + * being destroyed by vmk_WorldPrivateKeyDestroy. + * + * \param[in] key The module the data is associated with. + * \param[out] info Retrieved private data pointer. + * + * \retval VMK_OK The pointer was sucessfully retreived. + * \retval VMK_NOT_FOUND The specified key does not exist, or no + * data is currently associated with the key + * for the calling World. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldGetPrivateInfo( + vmk_WorldPrivateInfoKey key, + vmk_AddrCookie *info); + +/* + *********************************************************************** + * vmk_WorldUnsetPrivateInfo -- */ /** + * + * \ingroup Worlds + * \brief Disassociate data with a key for the currently executing + * world. + * + * This function can return VMK_NOT_FOUND if the key is concurrently + * being destroyed by vmk_WorldPrivateKeyDestroy. + * + * Calling this function will provoke a callback to the destructor. + * + * \param[in] key The module the data is associated with. + * + * \retval VMK_OK The moduleID is now disassociated with + * the World-private data pointer. + * \retval VMK_NOT_FOUND No data pointer is associated with the + * moduleID on the calling world. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldUnsetPrivateInfo( + vmk_WorldPrivateInfoKey key); + +/* + *********************************************************************** + * vmk_WorldGetPrivateInfoWithHold -- */ /** + * + * \ingroup Worlds + * \brief Get a World-private data pointer associated with a + * key-world pair. + * + * This function can return VMK_NOT_FOUND if the key is concurrently + * being destroyed by vmk_WorldPrivateKeyDestroy. + * + * The caller must continue to hold the handle to access the data at *info. + * + * The handle returned by this function must be released by + * vmk_ReleasePrivateInfo. As long as the caller holds this handle, + * the private info destructor will not be called. + * + * \param[in] key World Private Data key. + * \param[in] id World ID to identify the world + * \param[out] info A pointer to storage to hold the retreived + * World-private data pointer. + * \param[out] handle A pointer to storage to hold a retrieved handle + * on info. + * + * \retval VMK_OK The pointer was sucessfully retreived. + * \retval VMK_NOT_FOUND No data is currently associated with the + * key for the specified world. + * \retval VMK_INVALID_WORLD Specified world does not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldGetPrivateInfoWithHold( + vmk_WorldPrivateInfoKey key, + vmk_WorldID id, + vmk_AddrCookie *info, + vmk_WorldPrivateDataHandle *handle); + +/* + *********************************************************************** + * vmk_ReleasePrivateInfo -- */ /** + * + * \ingroup Worlds + * \brief Release a private info datum previously acquired through + * vmk_WorldGetPrivateInfoWithHold. + * + * \param[in] handle A handle to private info data, previously + * acquired by vmk_WorldGetPrivateInfoWithHold. + * + * + * \retval VMK_OK The world was successfuly released. + * \retval VMK_INVALID_HANDLE Handle is invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ReleasePrivateInfo( + vmk_WorldPrivateDataHandle handle); + +/* + *********************************************************************** + * vmk_WorldSetAffinity -- */ /** + * + * \ingroup Worlds + * \brief Set the PCPU affinity for the given non-running world + + * \note If the world is currently running and migration must take place + * for compliance with the given affinity, the change will not + * be immediate. + * + * \param[in] id World ID to identify the world. + * \param[in] affinityMask Bitmask of physical CPUs on which the + * world will be allowed to run. + * + * \retval VMK_NOT_FOUND The given world ID does not exist. + * \retval VMK_BAD_PARAM The specified affinity is invalid for the + * given world. + * + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldSetAffinity( + vmk_WorldID id, + vmk_AffinityMask affinityMask); + +/* + *********************************************************************** + * vmk_WorldGetCPUMinMax -- */ /** + * + * \ingroup Worlds + * \brief Get the min/max CPU allocation in MHz for the running world. + + * \param[out] min Minimum CPU allocation of the current running + * world in MHz. + * \param[out] max Maximum CPU allocation of the current running + * world in MHz. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldGetCPUMinMax( + vmk_uint32 *min, + vmk_uint32 *max); + +/* + *********************************************************************** + * vmk_WorldSetCPUMinMax -- */ /** + * + * \ingroup Worlds + * \brief Set the min/max CPU allocation in MHz for the running world + + * \note The scheduling of the current world will change based on the + * input parameters. + * + * \param[in] min Minimum CPU allocation in MHz that will be + * guaranteed. + * \param[in] max Maximum CPU allocation in MHz that the world can + * use. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_WorldSetCPUMinMax( + vmk_uint32 min, + vmk_uint32 max); + +/* + *********************************************************************** + * vmk_WorldsMax -- */ /** + * + * \ingroup Worlds + * \brief Returns the maximum possible number of worlds the system + * will support. + + * \note This includes VMs and any other worlds that the system needs + * to execute. + * + *********************************************************************** + */ +vmk_uint32 vmk_WorldsMax(void); + +#endif /* _VMKAPI_WORLD_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet.h new file mode 100644 index 0000000..27b5692 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet.h @@ -0,0 +1,675 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + ******************************************************************************* + * Worldlets */ /** + * \defgroup Worldlet Worldlets + * + * A worldlet is an object that performs a specified function at + * some point in the future (relative to the time of invocation, which + * is accomplished via vmk_WorldletActivate). + * + * \note + * All functions of this API require that callers do not hold + * any locks with rank _VMK_SP_RANK_IRQ_WORLDLET. + * + * @{ + ******************************************************************************* + */ +#ifndef _VMKAPI_WORLDLET_H_ +#define _VMKAPI_WORLDLET_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_time.h" +#include "base/vmkapi_accounting.h" +#include "base/vmkapi_worldlet_types.h" + +/** + * \brief States of worldlets. + */ +typedef enum { + VMK_WDT_RELEASE = 1, + VMK_WDT_SUSPEND = 2, + VMK_WDT_READY = 4, +} vmk_WorldletState; + +/** + * \brief Affinity relationships. + */ +typedef enum { + /** + * \brief Exact CPU match required. + */ + VMK_WDT_AFFINITY_EXACT = 0, + /** + * \brief Exact affinity match not required. Will attempt to place worldlet + * topologically close to the target. + */ + VMK_WDT_AFFINITY_LOOSE = 1, +} vmk_WorldletAffinityType; + +/** + * \brief Size of the name of a worldlet. All names will be truncated if + * necessary so that the name including NULL termination is of + * this length or less. + */ +#define VMK_WDT_NAME_SIZE_MAX 32 + +/** + * \brief Worldlet Affinity Tracker object. + */ +typedef struct vmk_WorldletAffinityTracker vmk_WorldletAffinityTracker; + +/* + ******************************************************************************* + * vmk_WorldletFn -- */ /** + * + * \ingroup Worldlet + * \brief Prototype for Worldlet callback function. + * + * \param[in] wdt Worldlet handle representing the executing worldlet. + * \param[in] private Private data as specified to vmk_WorldletCreate. + * \param[out] state The Worldlet sets this to define its state upon + * completion of the callback function: + * VMK_WDT_RELEASE: Implies call to vmk_WorldletDestroy + * and VMK_WDT_SUSPEND if the worldlet + * is not freed. + * VMK_WDT_SUSPEND: The worldlet will not execute unless + * directed to do so by a vmk_WorldletActivate + * call. + * VMK_WDT_READY: The worldlet will be called again when + * the system decides to grant it CPU time. + * + * \retval VMK_OK The worldlet function executed correctly. + * This is not a status of whether the actions of the function + * were successfully completed, but rather an indication that + * the code of the function executed. The return of any other + * value may have undefined side-effects. + * + ******************************************************************************* + */ +typedef VMK_ReturnStatus (*vmk_WorldletFn)(vmk_Worldlet wdt, void *data, + vmk_WorldletState *state); + + +/* + ******************************************************************************* + * vmk_WorldletCreate -- */ /** + * + * \ingroup Worldlet + * \brief Create a worldlet object. + * + * \param[out] worldlet Pointer to new vmk_Worldlet. + * \param[in] name Descriptive name for the worldlet. + * \param[in] serviceID Service ID against which the worldlet is charged. + * \param[in] moduleID Id of module making request. + * \param[in] worldletFn Pointer to function called when dispatching the + * request. + * \param[in] private Arbitrary data to associate with the vmk_Worldlet. + * + * \retval VMK_OK The worldlet was successfully initialized. + * \retval VMK_NO_MEMORY The worldlet could not be allocated. + * \retval VMK_INVALID_HANDLE The specified service ID is invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletCreate( + vmk_Worldlet *worldlet, + const char *name, + vmk_ServiceAcctId serviceID, + vmk_ModuleID moduleID, + vmk_WorldletFn worldletFn, + void *private); + + +/* + ******************************************************************************* + * vmk_WorldletCheckState -- */ /** + * + * \ingroup Worldlet + * \brief Query the state of a worldlet. + * + * \param[in] worldlet Pointer to new vmk_Worldlet. + * \param[out] state State of the worldlet. + * + * \retval VMK_OK The worldlet state was successfully returned. + * \retval VMK_BAD_PARAM "state" is a bad pointer. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid or corrupted. + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletCheckState( + vmk_Worldlet worldlet, + vmk_WorldletState *state); + +/* + ******************************************************************************* + * vmk_WorldletActivate -- */ /** + * + * \ingroup Worldlet + * \brief Activate a worldlet object. + * + * The worldlet's callback function will be called at least once following the + * successful execution of this function (though that may be deferred due to + * the worldlet being disabled). + * + * \param[in] worldlet Worldlet to activate. + * + * \retval VMK_OK The worldlet was successfully activated. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletActivate( + vmk_Worldlet worldlet); + +/* + ******************************************************************************* + * vmk_WorldletUnref -- */ /** + * + * \ingroup Worldlet + * \brief Release a worldlet (thereby decrementing internal ref count). + * + * The caller is responsible for ensuring that when this is called to release + * the last reference, that the worldlet is not awaiting pending activation and + * will not be activated in the future. This implies that the worldlet must be + * in a VMK_WDT_SUSPEND state. + * + * \param[in] worldlet Worldlet to destroy. + * + * \retval VMK_OK The worldlet was successfully released. + * \retval VMK_BUSY The worldlet is still in use. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletUnref( + vmk_Worldlet worldlet); + +/* + ******************************************************************************* + * vmk_WorldletUnrefWithData -- */ /** + * + * \ingroup Worldlet + * \brief Release a worldlet (thereby decrementing internal ref count). + * + * Also returns the private data registered with the worldlet when it + * was created. + * + * \param[in] worldlet Worldlet to destroy. + * \param[out] private Private data associated with worldlet. + * + * \retval VMK_OK The worldlet was successfully released. + * \retval VMK_BUSY The worldlet is still in use. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletUnrefWithData( + vmk_Worldlet worldlet, + void **private); + +/* + ******************************************************************************* + * vmk_WorldletShouldYield -- */ /** + * + * \ingroup Worldlet + * \brief Returns an indicator of whether a worldlet should yield. + * + * \param[in] worldlet Currently executing worldlet. + * \param[out] yield Set to VMK_TRUE/VMK_FALSE to indicate if + * worldlet should yield. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE Worldlet is invalid or not running. + * \retval VMK_BAD_PARAM "yield" is a bad pointer. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletShouldYield( + vmk_Worldlet worldlet, + vmk_Bool *yield); + +/* + ******************************************************************************* + * vmk_WorldletGetCurrent -- */ /** + * + * \ingroup Worldlet + * \brief Returns current executing worldlet and private data. + * + * \param[out] worldlet Currently executing worldlet. + * \param[out] private Private data associated with worldlet. + * + * \retval VMK_OK Success. + * \retval VMK_NOT_FOUND Not running on a worldlet. + * \retval VMK_BAD_PARAM Invalid "worldlet" or "private" pointers. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletGetCurrent( + vmk_Worldlet *worldlet, + void **private); + +/* + ******************************************************************************* + * vmk_WorldletGetFn -- */ /** + * + * \ingroup Worldlet + * \brief Returns the function associated with a worldlet. + * + * \param[in] worldlet Worldlet object. + * \param[out] worldletFn Pointer to function called when dispatching + * the request. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletGetFn( + vmk_Worldlet worldlet, + vmk_WorldletFn *worldletFn); + +/* + ****************************************************************************** + * vmk_WorldletSetAffinityToWorldlet -- */ /** + * + * \ingroup Worldlet + * \brief Sets the affinity of one worldlet to another. + * + * This means that the system will attempt to execute the "worldlet" worldlet + * on the same CPU as the "target" worldlet. Unsetting this affinity is + * accomplished by using a NULL value for the "target" worldlet. + * + * This function alters internal reference counts therefore if a worldlet is + * used as a "target" worldlet the affinity to that worldlet must be torn down + * prior to it being destroyed (i.e. vmk_WorldletUnref will not return VMK_OK). + * + * \param[in] worldlet Worldlet whose affinity will be changed. + * \param[in] target Worldlet to which "worldlet" will have + * affinity to. (May be NULL.) + * \param[in] type Type of affinity. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" or "target" are invalid. + * + ****************************************************************************** + */ +VMK_ReturnStatus vmk_WorldletSetAffinityToWorldlet( + vmk_Worldlet worldlet, + vmk_Worldlet target, + vmk_WorldletAffinityType type); + +/* + ******************************************************************************* + * vmk_WorldletSetAffinityToWorld -- */ /** + * + * \ingroup Worldlet + * \brief Sets the affinity of one worldlet to another. + * + * This means that the system will attempt to execute the "worldlet" worldlet + * on the same CPU as the "target" worldlet. Unsetting this affinity is + * accomplished by using a VMK_INVALID_WORLD_ID value for the "target" world. + * + * \param[in] worldlet Worldlet whose affinity will be changed. + * \param[in] target World to which "worldlet" will have + * affinity to. (May be VMK_INVALID_WORLD_ID.) + * \param[in] type Type of affinity. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" or "target" are invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletSetAffinityToWorld( + vmk_Worldlet worldlet, + vmk_WorldID target, + vmk_WorldletAffinityType type); + +/* + ******************************************************************************* + * vmk_WorldletVectorSet -- */ /** + * + * \ingroup Worldlet + * \brief Sets the interrupt vector for the worldlet. + * + * Once set, the worldlet scheduler takes over interrupt scheduling. When the + * worldlet moves, it's corresponding interrupt is moved too. + * + * \param[in] worldlet Worldlet the vector is associated to + * \param[in] vector Interrupt vector + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" or "target" are invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletVectorSet( + vmk_Worldlet worldlet, + vmk_uint32 vector); + + +/* + ******************************************************************************* + * vmk_WorldletVectorUnSet -- */ /** + * + * \ingroup Worldlet + * \brief Disassociate interrupt vector associated with the worldlet. + * + * \param[in] worldlet Worldlet the vector is associated to + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" or "target" are invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletVectorUnSet( + vmk_Worldlet worldlet); + +/* + ******************************************************************************* + * vmk_WorldletNameSet -- */ /** + * + * \ingroup Worldlet + * \brief Set the name of a worldlet object. + * + * \param[in] worldlet Worldlet object. + * \param[in] name Descriptive name for the worldlet. + + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" or "target" are invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletNameSet( + vmk_Worldlet worldlet, + const char *name); + +/* + ******************************************************************************* + * vmk_WorldletDisable -- */ /** + * + * \ingroup Worldlet + * \brief "Disable" a worldlet from running. + * + * A disabled worldlet is blocked from performing a transition from READY to + * ACTIVE state; i.e. if/when it reaches the front of the run-queue it is + * prevented from being called. When a worldlet is disabled, it may still be + * running and that current invocation is not affected. + * + * \param[in] worldlet Worldlet object. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletDisable( + vmk_Worldlet worldlet); + +/* + ******************************************************************************* + * vmk_WorldletEnable -- */ /** + * + * \ingroup Worldlet + * \brief Reverses the effect of vmk_WorldletDisable. + * + * \param[in] worldlet Worldlet object. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletEnable( + vmk_Worldlet worldlet); + +/* + ******************************************************************************* + * vmk_WorldletIsQuiesced -- */ /** + * + * \ingroup Worldlet + * \brief Identifies if a worldlet is quiesced; disabled and not active. + * + * \param[in] worldlet Worldlet object. + * \param[out] quiesced Quiesce status of the worldlet. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * \retval VMK_BAD_PARAM "quieseced" is a bad pointer. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletIsQuiesced( + vmk_Worldlet worldlet, + vmk_Bool *quiesced); + +/* + ******************************************************************************* + * vmk_WorldletWaitForQuiesce -- */ /** + * + * \ingroup Worldlet + * \brief Waits at most "maxWaitUs" for "worldlet" to become quiesced. + * + * \param[in] worldlet Worldlet object. + * \param[in] maxWaitUS Maximum number of sec to wait. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * \retval VMK_IS_ENABLED "worldlet" is enabled. + * \retval VMK_TIMEOUT "worldlet" did not quiesce. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletWaitForQuiesce( + vmk_Worldlet worldlet, + vmk_uint32 maxWaitUS); + +/* + ******************************************************************************* + * vmk_WorldletGetId -- */ /** + * + * \ingroup Worldlet + * \brief Returns id of given worldlet + * + * \param[in] worldlet Worldlet object. + * \param[out] id Worldlet id. + * + * \retval VMK_OK Success. + * \retval VMK_INVALID_HANDLE "worldlet" is invalid. + * + ******************************************************************************* + */ +VMK_ReturnStatus vmk_WorldletGetId( + vmk_Worldlet worldlet, + vmk_WorldletId *id); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerCreate -- */ /** + * + * \ingroup Worldlet + * \brief Create a worldlet affinity tracker object. + * + * An affinity tracker object collects samples of world or worldlet ids that + * have a potential affinity relationship with a particular target worldlet. + * Periodically the user of the tracker object will ask it to calculate an + * affinity setting based on the id which collected the most samples over the + * predetermined time frame (resetTime). A "set threshold" and "drop + * threshold" setting determine the percentage of samples that an id must + * represent so that affinity is set or dropped. + * vmk_WorldletAffinityTrackerCreate should be used to allocate the object and + * subsequently vmk_WorldletAffinityTrackerConfig should be used to set the + * parameters of the tracker object. Until vmk_WorldletAffinityTrackerConfig + * is called the object will not set any affinities. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracked Worldlet who's affinity setting will be managed. + * \param[out] tracker Tracker object created. + * + * \retval VMK_OK Success. + * \retval VMK_NO_MEMORY Allocation failed. + * \retval VMK_BAD_PARAM Bad "tracker" or "tracked" pointer. + * \retval VMK_INVALID_HANDLE Bad "tracked" worldlet. + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletAffinityTrackerCreate( + vmk_Worldlet tracked, + vmk_WorldletAffinityTracker **tracker +); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerDestroy -- */ /** + * + * \ingroup Worldlet + * \brief Destroy a worldlet affinity tracker object. + * + * Does not alter the affinity of the worldlet for which affinity tracking is + * being performed. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracker Tracker object to destroy. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Bad "tracker" pointer. + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletAffinityTrackerDestroy( + vmk_WorldletAffinityTracker *tracker +); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerConfig -- */ /** + * + * \ingroup Worldlet + * \brief Configures a worldlet affinity tracker object. + * + * Defines the thresholds, reset frequency and affinity types of an affinity + * tracker object. May be called multiple times. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracker Tracker object to initialize. + * \param[in] setThresh Usage threshold (%) at which to establish affinity. + * \param[in] dropThresh Usage threshold (%) at which to drop affinity. + * \param[in] resetTimeUS Minimum microseconds between updates. + * \param[in] worldAffType Type of affinity to apply to worlds. + * \param[in] wdtAffType Type of affinity to apply to worldlets. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM A threshold is invalid (> 100). + * + ******************************************************************************* + */ +VMK_ReturnStatus +vmk_WorldletAffinityTrackerConfig( + vmk_WorldletAffinityTracker *tracker, + vmk_uint16 setThresh, + vmk_uint16 dropThresh, + vmk_uint16 resetTimeUS, + vmk_WorldletAffinityType worldAffType, + vmk_WorldletAffinityType wdtAffType +); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerAddWorldSample -- */ /** + * + * \ingroup Worldlet + * \brief Adds a sample for a world id to an affinity tracker. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracker Tracker object to add sample to. + * \param[in] userID World id of sample to add. + * \param[in] count Number of samples to add. + * + * \retval VMK_OK Success. + * + ******************************************************************************* + */ + +VMK_ReturnStatus +vmk_WorldletAffinityTrackerAddWorldSample( + vmk_WorldletAffinityTracker *tracker, + vmk_WorldID userID, + vmk_uint32 count); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerAddWorldletSample -- */ /** + * + * \ingroup Worldlet + * \brief Adds a sample for a world id to an affinity tracker. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracker Tracker object to add sample to. + * \param[in] userID Worldlet id of sample to add. + * \param[in] count Number of samples to add. + * + * \retval VMK_OK Success. + * + ******************************************************************************* + */ + +VMK_ReturnStatus +vmk_WorldletAffinityTrackerAddWorldletSample( + vmk_WorldletAffinityTracker *tracker, + vmk_WorldletId userID, + vmk_uint32 count); + +/* + ******************************************************************************* + * vmk_WorldletAffinityTrackerCheck -- */ /** + * + * \ingroup Worldlet + * \brief Update the tracked worldlet's affinity based on collected samples. + * + * If the indicated time has surpassed the resetTimeUS as indicated in the + * object initializaiton then look at the collected samples and update the + * tracked worldlet's affinity as appropriate according to the tracker object's + * specified threshold settings. Reset the collected samples and begin a new + * sample period. + * + * Caller is required to provide appropriate locking or exclusion. + * + * \param[in] tracker Tracker object to check. + * \param[in] now Current time to consider. + * + * \retval VMK_OK Success. + * \retval VMK_RETRY Not enough time has passed since the last updated. + * + ******************************************************************************* + */ + +VMK_ReturnStatus +vmk_WorldletAffinityTrackerCheck( + vmk_WorldletAffinityTracker *tracker, + vmk_TimerCycles now); + + +#endif /* _VMKAPI_WORLDLET_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet_types.h new file mode 100644 index 0000000..c4cf993 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_worldlet_types.h @@ -0,0 +1,43 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + ******************************************************************************* + * Worldlet Types */ /** + * \addtogroup Worldlet + * + * Shared worldlet types. + * + * @{ + ******************************************************************************* + */ +#ifndef _VMKAPI_WORLDLET_TYPES_H_ +#define _VMKAPI_WORLDLET_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/** + * \brief Handle for vmk_Worldlet + */ +typedef struct vmk_WorldletInt* vmk_Worldlet; +#define VMK_INVALID_WORLDLET ((vmk_Worldlet)NULL) + +/** + * \brief Worldlet identifier + */ +typedef vmk_uint32 vmk_WorldletId; +#define VMK_INVALID_WORLDLET_ID ((vmk_WorldletId)-1) + +#endif /* _VMKAPI_WORLDLET_TYPES_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_acpi.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_acpi.h new file mode 100755 index 0000000..bfbcc55 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_acpi.h @@ -0,0 +1,125 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * ACPI */ /** + * \addtogroup Device + * @{ + * \defgroup ACPI ACPI Device Information Interfaces + * @{ + * + * These interfaces deal with information about various device-associated + * resources. The resources could be memory ranges, IO ranges, IRQs, etc. + * + * The interfaces deal only with device information for devices which have + * a populated ACPI entry. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_ACPI_H_ +#define _VMKAPI_ACPI_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/** \brief The Fixed IO range resource. */ +typedef struct vmk_AcpiFixedIORange { + vmk_uint64 start; + vmk_uint64 end; +} vmk_AcpiFixedIORange; + +/** \brief The Fixed Memory range resource. */ +typedef struct vmk_AcpiFixedMemRange { + vmk_Bool writeProtect; + vmk_uint64 start; + vmk_uint64 end; +} vmk_AcpiFixedMemRange; + +/** \brief The ACPI decode width. */ +typedef enum { + VMK_ACPI_DECODE_WIDTH_10 = 0, + VMK_ACPI_DECODE_WIDTH_16 = 1 +} vmk_AcpiDecodeWidth; + +/** \brief The dynamic IO range resource. */ +typedef struct vmk_AcpiIORange { + vmk_AcpiDecodeWidth decodeWidth; + vmk_uint64 start; + vmk_uint64 end; + vmk_uint64 alignment; +} vmk_AcpiIORange; + +/** \brief The dynamic memory range resource. */ +typedef struct vmk_AcpiMemRange { + vmk_Bool writeProtect; + vmk_uint64 start; + vmk_uint64 end; + vmk_uint64 alignment; +} vmk_AcpiMemRange; + +/** \brief Max number of ACPI resources for a TPM device. */ +#define VMK_ACPI_TPM_MAX_RESOURCES 10 + +/** \brief The device info capturing all the resources used. */ +typedef struct vmk_AcpiTPMDevice { + unsigned fixedIORangeLen; + unsigned ioRangeLen; + unsigned fixedMemRangeLen; + unsigned memRangeLen; + vmk_AcpiFixedIORange fixedIO[VMK_ACPI_TPM_MAX_RESOURCES]; + vmk_AcpiIORange io[VMK_ACPI_TPM_MAX_RESOURCES]; + vmk_AcpiFixedMemRange fixedMem[VMK_ACPI_TPM_MAX_RESOURCES]; + vmk_AcpiMemRange mem[VMK_ACPI_TPM_MAX_RESOURCES]; +} vmk_AcpiTPMDevice; + +/** \brief What type of device info to query. */ +typedef enum { + VMK_ACPI_INFO_TPM = 0 +} vmk_AcpiDeviceType; + +/** \brief Device information. */ +typedef struct vmk_AcpiDeviceInfo { + vmk_AcpiDeviceType type; + union { + vmk_AcpiTPMDevice tpmInfo; + } info; +} vmk_AcpiDeviceInfo; + +/* + *********************************************************************** + * vmk_AcpiGetInfo -- */ /** + * + * \ingroup ACPI + * \brief Use ACPI to get the information about resources used by some + * device. + * + * \param[in] type Type of the device to query. + * \param[out] deviceInfo ACPI information about the device. + * + * \retval VMK_BAD_PARAM If the deviceType passed is unsupported. + * \retval VMK_FAILURE If device is not found or any other error + * because of which resource information could + * not be obtained. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_AcpiGetInfo(vmk_AcpiDeviceType type, + vmk_AcpiDeviceInfo *deviceInfo); + +#endif /* _VMKAPI_ACPI_H_ */ +/** @} */ +/** @} */ + diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_device.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_device.h new file mode 100644 index 0000000..d512bcb --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_device.h @@ -0,0 +1,158 @@ +/*************************************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Devices */ /** + * \defgroup Device Device and Bus Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_DEVICE_H_ +#define _VMKAPI_DEVICE_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_memory.h" + +/** + * \brief Opaque device handle + */ +typedef struct vmk_DeviceInt *vmk_Device; + +/** \brief A null device handle. */ +#define VMK_DEVICE_NONE ((vmk_Device)0) + +/** + * \brief Bus types. + */ +typedef enum { + /* + * Registered bus types + */ + VMK_BUS_TYPE_NONE=0, + VMK_BUS_TYPE_LOCALBUS=1, + VMK_BUS_TYPE_ISA=2, + VMK_BUS_TYPE_PCI=3, + VMK_BUS_TYPE_PSEUDO=4, + VMK_BUS_TYPE_RESERVED=5 +} vmk_DeviceBusType; + +/** + * \brief Generic device information. + * + * This structure is created by the bus-specific device driver + * and is filled in when a device is discovered and then registered + * to get a device handle. + */ +typedef struct vmk_DeviceInfo { + + /** Bus type the device is on */ + vmk_DeviceBusType bus; + + /** Bus-specific information about the device */ + void *specific; + + /** Device-private Info */ + void *private; +} vmk_DeviceInfo; + +/* + *********************************************************************** + * vmk_DeviceRegister -- */ /** + * + * \ingroup Device + * \brief Register the device info with the device database and + * get a device handle back. + * + * \param[in] deviceInfo Device information about device to register. + * \param[out] device New device handle. + * + * \retval VMK_BAD_PARAM deviceInfo argument is NULL. + * \retval VMK_NO_MEMORY Unable to allocate memory for device handle. + * \retval VMK_OK Successfully registered device info. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_DeviceRegister(vmk_DeviceInfo *deviceInfo, + vmk_Device *device); + +/* + *********************************************************************** + * vmk_DeviceGetInfo -- */ /** + * + * \ingroup Device + * \brief Retrieve deviceInfo given device handle. + * + * \param[in] device Device handle. + * \param[in] deviceInfo Device information. + * + * \retval VMK_BAD_PARAM device handle or deviceInfo is NULL. + * \retval VMK_OK deviceInfo is successfully retrieved. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_DeviceGetInfo(vmk_Device device, + vmk_DeviceInfo *deviceInfo); + +/* + *********************************************************************** + * vmk_DeviceGetBusType -- */ /** + * + * \ingroup Device + * \brief Returns the bus type of a device. + * + * \param[in] device Device handle. + * + * \retval VMK_BUS_TYPE_NONE Specified device is invalid. + * \retval bus type is returned. + * + *********************************************************************** + */ +vmk_DeviceBusType vmk_DeviceGetBusType(vmk_Device device); + +/* + *********************************************************************** + * vmk_DeviceGetBusPrivateInfo -- */ /** + * + * \ingroup Device + * \brief Returns the bus private info + * + * \param[in] device device handle. + * + * \retval Bus private info if handle is valid or NULL on error. + * + *********************************************************************** + */ +void *vmk_DeviceGetBusPrivateInfo(vmk_Device device); + +/* + *********************************************************************** + * vmk_DeviceUnregister -- */ /** + * + * \ingroup Device + * \brief Unregister the device handle and remove the info from + * the device database. + * + * \param[in] device Device handle. + * + * \retval VMK_BAD_PARAM device handle is NULL. + * \retval VMK_OK Device successfully unregistered (and handle freed). + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_DeviceUnregister(vmk_Device device); + +#endif /* _VMKAPI_DEVICE_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_input.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_input.h new file mode 100644 index 0000000..147556d --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_input.h @@ -0,0 +1,235 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Input */ /** + * \addtogroup Device + * @{ + * \defgroup Input Human Input Device Interfaces + * + * Interfaces that allow to enqueue keyboard character(s) to vmkernel + * and forward input events to the host. + * @{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_INPUT_H_ +#define _VMKAPI_INPUT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" + + +/** + * \brief Values for special keys (beyond normal ASCII codes). + */ +enum { + VMK_INPUT_KEY_F1 = (vmk_int8) 0x81, + VMK_INPUT_KEY_F2, + VMK_INPUT_KEY_F3, + VMK_INPUT_KEY_F4, + VMK_INPUT_KEY_F5, + VMK_INPUT_KEY_F6, + VMK_INPUT_KEY_F7, + VMK_INPUT_KEY_F8, + VMK_INPUT_KEY_F9, + VMK_INPUT_KEY_F10, + VMK_INPUT_KEY_F11, + VMK_INPUT_KEY_F12, + VMK_INPUT_KEY_SHIFT_F1, + VMK_INPUT_KEY_SHIFT_F2, + VMK_INPUT_KEY_SHIFT_F3, + VMK_INPUT_KEY_SHIFT_F4, + VMK_INPUT_KEY_SHIFT_F5, + VMK_INPUT_KEY_SHIFT_F6, + VMK_INPUT_KEY_SHIFT_F7, + VMK_INPUT_KEY_SHIFT_F8, + VMK_INPUT_KEY_SHIFT_F9, + VMK_INPUT_KEY_SHIFT_F10, + VMK_INPUT_KEY_SHIFT_F11, + VMK_INPUT_KEY_SHIFT_F12, + VMK_INPUT_KEY_CTRL_F1, + VMK_INPUT_KEY_CTRL_F2, + VMK_INPUT_KEY_CTRL_F3, + VMK_INPUT_KEY_CTRL_F4, + VMK_INPUT_KEY_CTRL_F5, + VMK_INPUT_KEY_CTRL_F6, + VMK_INPUT_KEY_CTRL_F7, + VMK_INPUT_KEY_CTRL_F8, + VMK_INPUT_KEY_CTRL_F9, + VMK_INPUT_KEY_CTRL_F10, + VMK_INPUT_KEY_CTRL_F11, + VMK_INPUT_KEY_CTRL_F12, + VMK_INPUT_KEY_CTRLSHIFT_F1, + VMK_INPUT_KEY_CTRLSHIFT_F2, + VMK_INPUT_KEY_CTRLSHIFT_F3, + VMK_INPUT_KEY_CTRLSHIFT_F4, + VMK_INPUT_KEY_CTRLSHIFT_F5, + VMK_INPUT_KEY_CTRLSHIFT_F6, + VMK_INPUT_KEY_CTRLSHIFT_F7, + VMK_INPUT_KEY_CTRLSHIFT_F8, + VMK_INPUT_KEY_CTRLSHIFT_F9, + VMK_INPUT_KEY_CTRLSHIFT_F10, + VMK_INPUT_KEY_CTRLSHIFT_F11, + VMK_INPUT_KEY_CTRLSHIFT_F12, + VMK_INPUT_KEY_HOME, + VMK_INPUT_KEY_UP, + VMK_INPUT_KEY_PAGEUP, + VMK_INPUT_KEY_NUMMINUS, + VMK_INPUT_KEY_LEFT, + VMK_INPUT_KEY_CENTER, + VMK_INPUT_KEY_RIGHT, + VMK_INPUT_KEY_NUMPLUS, + VMK_INPUT_KEY_END, + VMK_INPUT_KEY_DOWN, + VMK_INPUT_KEY_PAGEDOWN, + VMK_INPUT_KEY_INSERT, + VMK_INPUT_KEY_DELETE, + VMK_INPUT_KEY_UNUSED1, + VMK_INPUT_KEY_UNUSED2, + VMK_INPUT_KEY_UNUSED3, + VMK_INPUT_KEY_ALT_F1, + VMK_INPUT_KEY_ALT_F2, + VMK_INPUT_KEY_ALT_F3, + VMK_INPUT_KEY_ALT_F4, + VMK_INPUT_KEY_ALT_F5, + VMK_INPUT_KEY_ALT_F6, + VMK_INPUT_KEY_ALT_F7, + VMK_INPUT_KEY_ALT_F8, + VMK_INPUT_KEY_ALT_F9, + VMK_INPUT_KEY_ALT_F10, + VMK_INPUT_KEY_ALT_F11, + VMK_INPUT_KEY_ALT_F12, +}; + +/** + * \brief Opaque handle for a keyboard interrupt handler. + */ +typedef void *vmk_KeyboardInterruptHandle; + +/* + *********************************************************************** + * vmk_InputPutQueue -- */ /** + * + * \ingroup Input + * \brief Enqueue a keyboard character to vmkernel. + * + * Does nothing if vmkernel is not the audience. + * + * \param[in] ch Input character (ASCII or special). + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_InputPutQueue(int ch); + +/* + *********************************************************************** + * vmk_InputPutsQueue -- */ /** + * + * \ingroup Input + * \brief Enqueue multiple keyboard characters to vmkernel. + * + * Does nothing if vmkernel is not the audience. + * + * \param[in] cp Input characters (ASCII or special). + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_InputPutsQueue(char *cp); + +/* + *********************************************************************** + * vmk_InputEvent -- */ /** + * + * \ingroup Input + * \brief Forward input event to host. + * + * input_event() in COS will be called with corresponding parameters. + * Does nothing if COS is not the audience. + * + * \param[in] type Event type. + * \param[in] code Event code. + * \param[in] value Event value. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_InputEvent(vmk_uint32 type, + vmk_uint32 code, vmk_uint32 value); + +/* + *********************************************************************** + * vmk_InterruptHandler -- */ /** + * + * \ingroup Input + * \brief Interrupt handler pointer type provided to VMkernel + * + * \param[in] irq Source specific IRQ info. + * \param[in] context Source specific context info. + * \param[in] registers Source specific register state. + * + *********************************************************************** + */ +typedef void (*vmk_InputInterruptHandler)(int irq, + void *context, + void *registers); + +/* + *********************************************************************** + * vmk_RegisterInputKeyboardInterruptHandler -- */ /** + * + * \ingroup Input + * \brief Register an interrupt handler for polling an external + * keyboard. + * + * \note This function \em must be called at module load time. + * + * \param[in] handler Interrupt handler. + * \param[in] irq Interrupt vector. + * \param[in] context Context info. + * \param[in] registers Register or other state. + * \param[out] handle Handle for registered keyboard interrupt + * handler. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_RegisterInputKeyboardInterruptHandler(vmk_InputInterruptHandler *handler, + vmk_uint32 irq, + void *context, + void *registers, + vmk_KeyboardInterruptHandle *handle); + +/* + *********************************************************************** + * vmk_UnregisterInputKeyboardInterruptHandler -- */ /** + * + * \ingroup Input + * \brief Unregister a keyboard interrupt handler. + * + * \param[in] handle Handle for registered keyboard interrupt + * handler. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_UnregisterInputKeyboardInterruptHandler(vmk_KeyboardInterruptHandle handle); + +#endif +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_isa.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_isa.h new file mode 100644 index 0000000..97a6353 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_isa.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * ISA */ /** + * \addtogroup Device + * @{ + * \defgroup ISA ISA-Bus Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_ISA_H_ +#define _VMKAPI_ISA_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/* + *********************************************************************** + * vmk_ISAMapIRQToVector -- */ /** + * + * \ingroup ISA + * \brief Retrieves the vector the kernel assigned for an isa IRQ + * + * \param[in] isaIRQ ISA IRQ value. + * \param[out] vector Corresponding vector for specified IRQ. + * + * \retval VMK_BAD_PARAM isaIRQ is out of range. + * \retval VMK_BAD_PARAM Vector was NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ISAMapIRQToVector(vmk_uint32 isaIRQ, + vmk_uint32 *vector); +#endif /* _VMKAPI_ISA_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_pci.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_pci.h new file mode 100644 index 0000000..969945a --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_pci.h @@ -0,0 +1,880 @@ +/* ********************************************************** + * Copyright 1998 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * PCI */ /** + * \addtogroup Device + * @{ + * \defgroup PCI PCI-Bus Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_PCI_H_ +#define _VMKAPI_PCI_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_module.h" +#include "device/vmkapi_device.h" +#include "device/vmkapi_vector.h" + +/** \brief Maximum number of characters in a PCI device name. */ +#define VMK_PCI_DEVICE_NAME_LENGTH 32 + +/** \brief Max PCI segments supported */ +#define VMK_PCI_NUM_SEGS 256 +/** \brief Per-system max for busses */ +#define VMK_PCI_NUM_BUSES 256 +/** \brief Per-bus max for slots */ +#define VMK_PCI_NUM_SLOTS 32 +/** \brief Per-slot max for functions */ +#define VMK_PCI_NUM_FUNCS 8 +/** \brief Per-slot max for primary interrupt pins */ +#define VMK_PCI_NUM_PINS 4 +/** \brief Per-device max for BARs */ +#define VMK_PCI_NUM_BARS 6 +/** \brief Per-device max for BARs on a bridge */ +#define VMK_PCI_NUM_BARS_BRIDGE 2 + +/** + * \brief PCI device owner. + */ +typedef enum vmk_PCIDeviceOwner { + VMK_PCI_DEVICE_OWNER_UNKNOWN = 0, + VMK_PCI_DEVICE_OWNER_HOST = 1, + VMK_PCI_DEVICE_OWNER_KERNEL = 2, + VMK_PCI_DEVICE_OWNER_MODULE = 3, + VMK_PCI_DEVICE_OWNER_VM = 4, +} vmk_PCIDeviceOwner; + +/** + * \brief PCI BAR flags. + */ +typedef enum vmk_PCIBARFlags { + VMK_PCI_BAR_FLAGS_IO = 0x1, + VMK_PCI_BAR_FLAGS_MEM_64_BITS = 0x4, + VMK_PCI_BAR_FLAGS_MEM_PREFETCHABLE = 0x8, + VMK_PCI_BAR_FLAGS_IO_MASK = 0x3, + VMK_PCI_BAR_FLAGS_MEM_MASK = 0xF, +} vmk_PCIBARFlags; + +/** + * \brief BAR descriptor. + */ +typedef struct vmk_PCIBARInfo { + /** BAR base address */ + vmk_MachAddr address; + + /** BAR size (in bytes) */ + vmk_size_t size; + + /** BAR flags */ + vmk_PCIBARFlags flags; +} vmk_PCIBARInfo; + +/** + * \brief Information about a PCI device. + * + * VMK_PCI_NUM_BARS is the maximum number of BARs as per the PCI spec. + * The actual valid number of BARs depends on the device type; + * for bridges, this number is VMK_PCI_NUM_BARS_BRIDGE and for + * non-bridges, it is VMK_PCI_NUM_BARS. + */ +typedef struct vmk_PCIDeviceInfo { + vmk_uint16 vendorID; + vmk_uint16 deviceID; + vmk_uint16 classCode; + vmk_uint16 progIFRevID; + vmk_uint16 subVendorID; + vmk_uint16 subDeviceID; + vmk_uint8 hdrType; + vmk_uint8 intLine; + vmk_uint8 intPin; + + /** \brief Spawned bus number if device is a PCI bridge. */ + vmk_uint8 spawnedBus; + + /** \brief Current owner of the device */ + vmk_PCIDeviceOwner owner; + + /** \brief Device BARs */ + vmk_PCIBARInfo bars[VMK_PCI_NUM_BARS]; +} vmk_PCIDeviceInfo; + +/** + * \brief A PCI device capability value. + */ +typedef struct vmk_PCICapability { + vmk_uint16 capIdx; + vmk_uint8 capType; +} vmk_PCICapability; + +/** + * \brief Opaque PCI device handle + */ +typedef struct vmk_PCIDeviceInt *vmk_PCIDevice; + +/** + * \brief Configuration space access types + */ +typedef enum vmk_ConfigSpaceAccess{ + VMK_ACCESS_8 = 1, + VMK_ACCESS_16 = 2, + VMK_ACCESS_32 = 4 +} vmk_ConfigSpaceAccess; + +/** + * \brief Opaque map handle + */ +typedef struct vmk_PCIMapHandleInt *vmk_PCIMapHandle; + +/** + * \brief Type of interrupt triggering + * If the device is not interruptive, it will have an interrupt type of + * VMK_PCI_INTERRUPT_TYPE_NONE. + */ +typedef enum vmk_PCIInterruptType { + VMK_PCI_INTERRUPT_TYPE_NONE=0, + VMK_PCI_INTERRUPT_TYPE_LEGACY=1, + VMK_PCI_INTERRUPT_TYPE_MSI=2, + VMK_PCI_INTERRUPT_TYPE_MSIX=3, +} vmk_PCIInterruptType; + +/** + * \brief Type of interrupt triggering + */ +typedef enum vmk_PCIInterruptTriggerType { + VMK_PCI_INTERRUPT_TRIGGER_NONE=0, + VMK_PCI_INTERRUPT_TRIGGER_LEVEL=1, + VMK_PCI_INTERRUPT_TRIGGER_EDGE=2, +} vmk_PCIInterruptTriggerType; + +/** + * \brief interrupt information + */ +typedef struct vmk_PCIInterruptInfo { + /** Device-specific interrupt info */ + void *specific; + + /** Vmkernel vector */ + vmk_uint32 vector; + + /** Type of interrupt */ + vmk_PCIInterruptType type; + + /** Type of interrupt triggering */ + vmk_PCIInterruptTriggerType triggering; +} vmk_PCIInterruptInfo; + +/** + * \brief Device callback reason + */ +typedef enum vmk_PCIDeviceCallbackReason { + VMK_PCI_DEVICE_INSERTED = 0, + VMK_PCI_DEVICE_REMOVED = 1, + VMK_PCI_DEVICE_CHANGED_OWNER = 2, +} vmk_PCIDeviceCallbackReason; + +/** + * \brief Argument passed to a PCI event callback + */ +typedef struct vmk_PCIDeviceCallbackArg { + /* Reason for callback */ + vmk_PCIDeviceCallbackReason reason; + + /* Data for callback */ + union { + struct { + vmk_PCIDeviceOwner old; + vmk_PCIDeviceOwner new; + } changedOwner; + } data; +} vmk_PCIDeviceCallbackArg; + +/** + * \brief Callback to handle PCI events. + */ +typedef void (*vmk_PCICallback)(vmk_PCIDevice device, + vmk_PCIDeviceCallbackArg *callbackArgs, + void *callbackPrivate); + +/* + *********************************************************************** + * vmk_PCIGetDevice -- */ /** + * + * \ingroup PCI + * \brief Retrieves vmk_PCIDevice that corresponds to the generic + * device genDevice. + * + * \param[in] genDevice Generic device handle. + * \param[out] pciDevice Pointer to PCI device handle. + * + * \retval VMK_BAD_PARAM genDevice is invalid + * \retval VMK_OK PCI device handle is successfully returned. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetDevice(vmk_Device genDevice, + vmk_PCIDevice *pciDevice); + +/* + *********************************************************************** + * vmk_PCIGetPCIDevice -- */ /** + * + * \ingroup PCI + * \brief Retrieves vmk_PCIDevice handle that corresponds to segment, + * bus, device and function + * + * \param[in] segment PCI segment + * \param[in] bus Bus number + * \param[in] dev Device number + * \param[in] func Function number + * \param[out] device PCI device handle + * + * \retval VMK_NOT_FOUND Device with bus, device, number does not exist + * \retval VMK_BAD_PARAM device argument is NULL + * \retval VMK_OK device handle is successfully returned. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetPCIDevice(const vmk_uint16 segment, + const vmk_uint8 bus, + const vmk_uint8 dev, + const vmk_uint8 func, + vmk_PCIDevice *device); + +/* + *********************************************************************** + * vmk_PCIGetSegmentBusDevFunc -- */ /** + * + * \ingroup PCI + * \brief Return device's bus, device, func and function + * + * \param[in] device PCI device handle + * \param[out] segment Pointer to Segment number + * \param[out] bus Pointer to Bus number + * \param[out] dev Pointer to Device number + * \param[out] func Pointer to Function number + * + * \retval VMK_BAD_PARAM One or more of bus, dev, func is NULL. + * \retval VMK_BAD_PARAM Device handle is invalid or device does + * not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetSegmentBusDevFunc(vmk_PCIDevice device, + vmk_uint16 *segment, + vmk_uint8 *bus, + vmk_uint8 *dev, + vmk_uint8 *func); + +/* + *********************************************************************** + * vmk_PCIGetIDs -- */ /** + * + * \ingroup PCI + * \brief Return device's vendor ID, device ID, sub vendor ID and + * sub device iD + * + * \param[in] device PCI device handle + * \param[out] vendorID Pointer to vendor ID. + * \param[out] deviceID Pointer to device ID. + * \param[out] subVendorID Pointer to sub vendor ID. + * \param[out] subDeviceID Pointer to sub device ID. + * + * \retval VMK_BAD_PARAM One or more of vendorID, deviceID + * subVendorID and subDeviceID is NULL. + * \retval VMK_BAD_PARAM Device handle is invalid or device does + * not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetIDs(vmk_PCIDevice device, + vmk_uint16 *vendorID, + vmk_uint16 *deviceID, + vmk_uint16 *subVendorID, + vmk_uint16 *subDeviceID); + +/* + *********************************************************************** + * vmk_PCIGetInfo -- */ /** + * + * \ingroup PCI + * \brief Fills in the details corresponding to device. + * + * \note The BARs stored in the vmk_PCIDeviceInfo are canonical. User + * should not read the PCI config registers to obtain the BARs values. + * + * \param[in] device PCI device handle + * \param[in] deviceInfo Pointer to vmk_PCIDeviceInfo + * + * \retval VMK_BAD_PARAM DeviceInfo pointer is NULL. + * \retval VMK_BAD_PARAM Device handle is invalid or device does + * not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetInfo(vmk_PCIDevice device, + vmk_PCIDeviceInfo *deviceInfo); + +/* + *********************************************************************** + * vmk_PCIGetDeviceList -- */ /** + * + * \ingroup PCI + * \brief Returns an array of vmk_PCIDevice handles of all devices with + * vendorID and deviceID. + * + * The list of devices returned is just a snap shot at the time the call + * was made. The list can change between invocations and the number of + * devices may be actually more or less than what is returned to the + * caller. + * + * Only the list of devices with matching vendorID or deviceID are + * returned. vendorID/deviceID of 0xFFFF matches any vendorID/deviceID. + * + * \note Requires that the module heap be initialized. + * + * \param[in] moduleID Module ID of the caller + * \param[in] vendorID Vendor ID of interest + * \param[in] deviceID Device ID of interest + * \param[out] devices Pointer to an array of vmk_PCIDevice handles + * \param[out] numDevices Pointer to the number of array elements + * + * \retval VMK_BAD_PARAM Devices and/or numDevices ponters are NULL. + * \retval VMK_NO_MEMORY Unable to allocate memory to hold the handles + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetDeviceList(vmk_ModuleID moduleID, + vmk_uint16 vendorID, + vmk_uint16 deviceID, + vmk_PCIDevice **devices, + int *numDevices); + +/* + *********************************************************************** + * vmk_PCISetDeviceName -- */ /** + * + * \ingroup PCI + * \brief Sets the device name + * + * \param[in] device PCI device handle + * \param[in] name Name to be set + * + * \retval VMK_BAD_PARAM Device handle is invalid/non existent or name + * is NULL + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCISetDeviceName(vmk_PCIDevice device, + const char *name); + +/* + *********************************************************************** + * vmk_PCIGetDeviceName -- */ /** + * + * \ingroup PCI + * \brief Gets the device name + * + * \param[in] device PCI device handle + * \param[out] name Pointer to char array to return the name in + * \param[in] nameLen Length of the char array. + * + * \retval VMK_BAD_PARAM Device is invalid or non existent. + * \retval VMK_BAD_PARAM Name is NUL or nameLen is greater than + * VMK_PCI_DEVICE_NAME_LENGTH. + * \retval VMK_DEVICE_NOT_NAMED Device is not named + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetDeviceName(vmk_PCIDevice device, + char *name, + vmk_size_t nameLen); + +/* + *********************************************************************** + * vmk_PCIGetAlternateName -- */ /** + * + * \ingroup PCI + * \brief Gets the alternate name of the device + * + * \param[in] device PCI device handle + * \param[out] name Pointer to char array to return the name in + * \param[in] nameLen Length of the char array. + * + * \retval VMK_BAD_PARAM Device is invalid or non existent. + * \retval VMK_BAD_PARAM Name is NULL or nameLen is greater than + * VMK_PCI_DEVICE_NAME_LENGTH. + * \retval VMK_DEVICE_NOT_NAMED Device has no alternate name + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetAlternateName(vmk_PCIDevice device, + char *name, + vmk_size_t nameLen); + +/* + *********************************************************************** + * vmk_PCIGetCapabilityIndex -- */ /** + * + * \ingroup PCI + * \brief Returns the offset of the capability in device's config space. + * + * \param[in] device PCI device handle + * \param[in] capType Capability of interest + * \param[out] capIdx Pointer to the capability index + * + * \retval VMK_BAD_PARAM If capIdx is NULL or device handle is NULL/invalid + * \retval VMK_NOT_FOUND capability is not found + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetCapabilityIndex(vmk_PCIDevice device, + vmk_uint8 capType, + vmk_uint16 *capIdx); + +/* + *********************************************************************** + * vmk_PCIGetCapabilities -- */ /** + * + * \ingroup PCI + * \brief Returns an array of capabilities of the specified device + * + * \note Requires that the module heap be initialized. + * + * \param[in] moduleID Caller's module ID + * \param[in] device PCI device handle + * \param[out] capabilities Pointer to an array of vmk_PCICapability + * structures + * \param[out] numCapabilities Pointer to the number of array elements + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid. + * \retval VMK_BAD_PARAM Capabilities or numCapabilities is NULL. + * \retval VMK_NO_MEMORY Failed to allocate memory to hold capabilities + * \retval VMK_NO_MODULE_HEAP The module has no heap to allocate from + * \retval VMK_OK Success. Capabilities points to the array of + * vmk_PCICapability structures, the number of + * elements in the array is returned in + * numCapabilities. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetCapabilities(vmk_ModuleID moduleID, + vmk_PCIDevice device, + vmk_PCICapability **capabilities, + int *numCapabilities); + +/* + *********************************************************************** + * vmk_PCIGetParent -- */ /** + * + * \ingroup PCI + * \brief Returns the parent of device in parent. + * + * \param[in] device PCI device handle + * \param[out] parent Pointer to parent device handle + * + * Returns NULL in parent if device is the root of the hierarchy. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid + * \retval VMK_BAD_PARAM Parent is NULL + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetParent(vmk_PCIDevice device, + vmk_PCIDevice *parent); + +/* + *********************************************************************** + * vmk_PCIGetChild -- */ /** + * + * \ingroup PCI + * \brief Returns the child of device in child. + * + * \param[in] device PCI device handle + * \param[out] child Pointer to child device handle + * + * Returns NULL in child if device is a leaf in the hierarchy. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid + * \retval VMK_BAD_PARAM Child is NULL + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetChild(vmk_PCIDevice device, + vmk_PCIDevice *child); + +/* + *********************************************************************** + * vmk_PCIGetSibling -- */ /** + * + * \ingroup PCI + * \brief Returns the next sibling of device pointed in sibling. + * + * \param[in] device PCI device handle. + * \param[out] sibling Pointer to sibling device handle. + * + * Sets sibling to NULL if no more siblings. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid + * \retval VMK_BAD_PARAM Child is sibling + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetSibling(vmk_PCIDevice device, + vmk_PCIDevice *sibling); + +/* + *********************************************************************** + * vmk_PCIReadConfigSpace -- */ /** + * + * \ingroup PCI + * \brief Read config space of device at offset. + * + * \param[in] device PCI device handle. + * \param[in] accessType Access 1, 2 or 4 bytes. + * \param[in] offset Offset to read. + * \param[out] data Pointer to the data read. + * + * \note Offset is expected to meet the alignment requirements of the + * specified access type. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid + * \retval VMK_BAD_PARAM Data pointer is NULL + * \retval VMK_BAD_PARAM Offset is not aligned for the access type + * \retval VMK_BAD_PARAM AccessType is not a valid access type + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIReadConfigSpace(vmk_PCIDevice device, + vmk_ConfigSpaceAccess accessType, + vmk_uint16 offset, + vmk_uint32 *data); + +/* + *********************************************************************** + * vmk_PCIWriteConfigSpace -- */ /** + * + * \ingroup PCI + * \brief Write data to config space of device at offset. + * + * \param[in] device PCI device handle. + * \param[in] accessType Access 1, 2 or 4 bytes. + * \param[in] offset Offset to write at. + * \param[in] data Data to write. + * + * \note Offset is expected to meet the alignment requirements of the + * specified access type. + * + * \retval VMK_BAD_PARAM device handle is NULL/invalid. + * \retval VMK_BAD_PARAM offset is not aligned for the access type. + * \retval VMK_BAD_PARAM accessType is not a valid access type. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIWriteConfigSpace(vmk_PCIDevice device, + vmk_ConfigSpaceAccess accessType, + vmk_uint16 offset, + vmk_uint32 data); + +/* + *********************************************************************** + * vmk_PCIMapIOResource -- */ /** + * + * \ingroup PCI + * \brief Map PCI IO/Memory space described by pciBar. + * + * Allocates and fills mapHandle that should be used for the subsequent unmap + * call. + * + * \param[in] device PCI device handle. + * \param[in] pciBar PCI bar to map. + * \param[in] cacheable Whether the mapping can be in cacheable + * memory. + * \param[out] mappedAddress Pointer to the address the BAR is + * mapped at. + * \param[out] mapHandle Pointer to the mapping handle; use at + * unmap time. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid. + * \retval VMK_BAD_PARAM PciBar is invalid. + * \retval VMK_BAD_PARAM MappedAddres is NULL or mapHandle + * is NULL. + * \retval VMK_NO_MEMORY No memory to allocate mapHandle. + * \retval VMK_DEVICE_NOT_OWNED Device is not owned by kernel. + * \retval VMK_BAD_PARAM PciBar is second half of 64-bit MMIO BAR. + * \retval VMK_BAD_PARAM PciBar addr/size are too large for 32-bit MPN. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIMapIOResource(vmk_PCIDevice device, + vmk_uint8 pciBar, + vmk_Bool cacheable, + vmk_VirtAddr *mappedAddress, + vmk_PCIMapHandle *mapHandle); + +/* + *********************************************************************** + * vmk_PCIReleaseIOResource -- */ /** + * + * \ingroup PCI + * \brief Unmap the previously established PCI IO/Memory mapping. + * + * Upon successful return from the call, the mapping is no longer valid. + * + * \param[in] mapHandle Mapping handle returned by a previous call + * to vmk_PCIMapIOResource. + * + * \retval VMK_BAD_PARAM mapHandle is NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIReleaseIOResource(vmk_PCIMapHandle mapHandle); + +/** + * Interrupt related functions. + * + * Driver should first allocate an interrupt vector, add handlers for + * the vector and then enable the vector. + */ + +/* + *********************************************************************** + * vmk_PCIAllocateIntVectors -- */ /** + * + * \ingroup PCI + * \brief Allocate numVectors of intrType for device. + * + * \param[in] device PCI device handle + * \param[in] intrType Interrupt type to allocate + * \param[in] numVectorsRequested Number of vectors to allocate + * \param[in] indexAarray Array of index that vectors in the + * vectorArray. Need to be associated + * with. Used only when intrType is + * VMK_INTERRUPT_TYPE_PCI_MSIX. + * \param[in] bestEffortAllocation Controls MSIX vector allocation + * behavior. Vmkernel tries to allocate + * numVectorsRequested vectors but if + * it is unable to allocate that many + & vectors and if this flag is VMK_FALSE, + * this call will return a failure status. + * \param[out] vectorArray Array of vectors allocated. + * \param[out] numVectorsAlloced Number of vectors actually allocated. + * + * \note If intrType is VMK_INTERRUPT_TYPE_PCI_LEGACY, numVectors is + * ignored and only 1 vector is allocated. + * + * \retval VMK_BAD_PARAM Vectors argument is NULL. + * \retval VMK_BAD_PARAM Device handle is invalid/NULL. + * \retval VMK_BAD_PARAM Device is not interruptive. + * \retval VMK_BAD_PARAM If intrType is not + * VMK_INTERRUPT_TYPE_PCI_MSIX + * and numVectors is not equal to 1. + * \retval VMK_BAD_PARAM If intrType is + * VMK_INTERRUPT_TYPE_PCI_MSIX and + * indexAarray is NULL. + * \retval VMK_NO_MEMORY Internal memory allocation failure + * \retval VMK_DEVICE_NOT_OWNED Device is not owned by vmkernel + * \retval VMK_NO_RESOURCES If unable to allocate the requested + * number of vectors and + * bestEffortAllocation is VMK_FALSE. + * \retval VMK_FAILIURE All other errors. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIAllocateIntVectors(vmk_PCIDevice device, + vmk_PCIInterruptType intrType, + vmk_int32 numVectorsRequested, + vmk_uint16 *indexAarray, + vmk_Bool bestEffortAllocation, + vmk_uint32 *vectorArray, + vmk_int32 *numVectorsAlloced); + +/* + *********************************************************************** + * vmk_PCIFreeIntVectors -- */ /** + * + * \ingroup PCI + * \brief Free numVectors interrupt vectors that were previously + * allocated by a call to vmk_PCIAllocateIntVectors(). + * + * \param[in] device PCI device handle + * \param[in] numVectors Number of vectors in vectorArray + * \param[in] vectorArray Array of vectors to be freed. + * + * \retval VMK_BAD_PARAM vectorArray argument is NULL + * \retval VMK_BAD_PARAM Device handle is invalid/NULL + * \retval VMK_DEVICE_NOT_OWNED Device is not owned by vmkernel + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIFreeIntVectors(vmk_PCIDevice device, + vmk_int32 numVectors, + vmk_uint32 *vectorArray); + +/* + *********************************************************************** + * vmk_PCIGetInterruptInfo -- */ /** + * + * \ingroup PCI + * \brief Retrieve interrupt details of device. + * + * \param[in] device PCI device handle + * \param[in] interrupt Pointer to vmk_PCIInterruptInfo. + * + * \retval VMK_BAD_PARAM Device handle is NULL/invalid + * \retval VMK_BAD_PARAM Interrupt arg is NULL + * \retval VMK_DEVICE_NOT_OWNED Device is not owned by vmkernel. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIGetInterruptInfo(vmk_PCIDevice device, + vmk_PCIInterruptInfo *interrupt); + +/* + *********************************************************************** + * vmk_PCIRegisterCallback -- */ /** + * + * \ingroup PCI + * \brief Register event callback. + * + * \param[in] moduleID Module ID of the caller + * \param[in] callback Event callback routine + * \param[in] callbackPrivate Private data for callback routine. + * + * \retval VMK_BAD_PARAM moduleID is already registered for callbacks + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PCIRegisterCallback(vmk_ModuleID moduleID, + vmk_PCICallback callback, + void *callbackPrivate); +/* + *********************************************************************** + * vmk_PCIDoPreRemove -- */ /** + * + * \ingroup PCI + * \brief Invoke a module-specific function before a device is removed. + * + * This function should only be called by drivers, not by vmkernel + * modules. + * + * \param[in] moduleID ID of the module whose pre-remove func is to be + * called. + * \param[in] device Device handle to be passed to the pre-remove + * function. + * + * \retval VMK_BAD_PARAM Device is invalid/NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_PCIDoPreRemove(vmk_ModuleID moduleID, + vmk_PCIDevice device); + +/* + *********************************************************************** + * vmk_PCIDoPostInsert -- */ /** + * + * \ingroup PCI + * \brief Invoke a module-specific function after a device has been + * inserted. + * + * \param[in] moduleID ID of the module whose post-insert func is to + * be called. + * \param[in] device Device handle to be passed to the post-insert + * function. + * + * This function should only be called by drivers, not by vmkernel + * modules. + * + * \retval VMK_BAD_PARAM device is invalid/NULL + * \retval VMK_OK success. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_PCIDoPostInsert(vmk_ModuleID moduleID, + vmk_PCIDevice device); + +/* + *********************************************************************** + * vmk_PCIEnableVFs -- */ /** + * + * \ingroup PCI + * \brief Enable Virtual Functions (VFs) on an SR-IOV device. + * + * \param[in] device Device handle of the SR-IOV device. + * \param[in,out] numVFs Number of Virtual Functions to enable/enabled. + * + * Passing a value of 0 as *numVFs will request to enable all the + * Virtual Functions. The actual number of VFs successfully enabled is + * returned in *numVFs upon success. + * + * \retval VMK_BAD_PARAM Device handle is invalid or device does not exist. + * \retval VMK_FAILURE Cannot enable Virtual Functions. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_PCIEnableVFs(vmk_PCIDevice device, + vmk_uint16 *numVFs); + +/* + *********************************************************************** + * vmk_PCIDisableVFs -- */ /** + * + * \ingroup PCI + * \brief Disable all the Virtual Functions (VFs) on an SR-IOV device. + * + * \param[in] device Device handle of the SR-IOV device. + * + * \retval VMK_BAD_PARAM Device handle is invalid or device does not exist. + * \retval VMK_FAILURE Device is not in SR-IOV mode. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_PCIDisableVFs(vmk_PCIDevice device); + +/* + *********************************************************************** + * vmk_PCIGetVFPCIDevice -- */ /** + * + * \ingroup PCI + + * \brief Retrieves the handle of a Virtual Function (VF) given its + * parent Physical Function (PF). + + * \param[in] pf PCI device handle of the parent Physical Function. + * \param[in] vfIndex Index of the Virtual Function. + * \param[out] handle PCI device handle of the requested Virtual Function. + * + * \retval VMK_BAD_PARAM PF device handle is invalid or device does not exist. + * \retval VMK_BAD_PARAM handle argument is NULL. + * \retval VMK_NOT_FOUND VF doesn't exist. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_PCIGetVFPCIDevice(vmk_PCIDevice pf, + vmk_uint16 vfIndex, + vmk_PCIDevice *handle); + +#endif /* _VMKAPI_PCI_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_vector.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_vector.h new file mode 100644 index 0000000..471a9e3 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/device/vmkapi_vector.h @@ -0,0 +1,211 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Vector */ /** + * \addtogroup Device + * @{ + * \defgroup Vector Interrupt Vector Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_VECTOR_H_ +#define _VMKAPI_VECTOR_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "device/vmkapi_device.h" + +/* + *********************************************************************** + * vmk_InterruptHandler -- */ /** + * + * \ingroup Vector + * \brief Interrupt callback function. + * + * \param[in] clientData Callback argument specified while adding + * the handler. + * \param[in] vector Vector associated with the interrupt. + * + * \retval None + * + *********************************************************************** + */ +typedef void (*vmk_InterruptHandler)(void *clientData, + vmk_uint32 vector); + +/** + * \brief Options for adding the handler + */ +typedef struct vmk_VectorAddHandlerOptions { + /** \brief Vector is shared */ + vmk_Bool sharedVector; + + /** \brief Vector is an entroy source */ + vmk_Bool entropySource; +} vmk_VectorAddHandlerOptions; + + +/* + *********************************************************************** + * vmk_AddInterruptHandler -- */ /** + * + * \ingroup Vector + * \brief Add interrupt handler for vector + * + * \param[in] vector Vector to add the handler for + * \param[in] deviceName Name the driver wants use with the request + * \param[in] handler Interrupt handler + * \param[in] callbackArg Callback argument passed to the handler + * for shared interrupt, callbackArg shall be + * non-NULL and is used identify the callers + * sharing the vector. + * \param[in] options Specifies how the vector should be used + * (shared vector, entropy source etc.) + * + * \retval VMK_BAD_PARAM If vector is not a valid device vector + * \retval VMK_BAD_PARAM Null callbackArg is specified for + * shared vectors. + * \retval VMK_BUSY If request to add as non-shared and the vector + * is already shared + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_AddInterruptHandler(vmk_uint32 vector, + const char *deviceName, + vmk_InterruptHandler handler, + void *callbackArg, + vmk_VectorAddHandlerOptions *options); + +/* + *********************************************************************** + * vmk_RemoveInterruptHandler -- */ /** + * + * \ingroup Vector + * \brief Remove a previously established interrupt handler for vector + * + * \param[in] vector Vector for which to remove the handler. + * \param[in] callbackArg Callback argument that was passed + * while adding the handler. + * + * \retval VMK_BAD_PARAM If callbackArg is NULL and the vector is shared. + * \retval VMK_BAD_PARAM If vector is not a valid device vector + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_RemoveInterruptHandler(vmk_uint32 vector, + void *callbackArg); + +/* + *********************************************************************** + * vmk_VectorEnable -- */ /** + * + * \ingroup Vector + * \brief Sets up the vector for delivery of interrupts and unmasks the + * vector. + * + * \param[in] vector Vector to enable. + * Depending on the interrupt type, vector may + * always be enabled. (It is not possible + * to enable/disable VMK_INTERRUPT_TYPE_PCI_MSI + * vectors if the device does not support + * per vector masking.) + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_VectorEnable(vmk_uint32 vector); + +/* + *********************************************************************** + * vmk_VectorDisable -- */ /** + * + * \ingroup Vector + * \brief Masks the vector and disables interrupt delivery. + * + * \warning This API should not be used for indefinite periods for + * shared interrupts as this will block interrupts for other + * devices that may share the same interrupt line. + * + * \param[in] vector Vector to disable. + * Depending on the interrupt type, vector will + * always be enabled. (It is not possible + * to enable/disable VMK_INTERRUPT_TYPE_PCI_MSI + * vectors if the device does not support + * per vector masking.) + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_VectorDisable(vmk_uint32 vector); + +/* + *********************************************************************** + * vmk_VectorSync -- */ /** + * + * \ingroup Vector + * \brief Blocks, waiting till vector is inactive on all CPUs. + * + * \param[in] vector Vector to synchronize. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_VectorSync(vmk_uint32 vector); + +/* + *********************************************************************** + * vmk_VectorChipsetDisable -- */ /** + * + * \ingroup Vector + * \brief Masks given vector at the Chipset level. + * + * \warning This API should not be used for indefinite periods for shared + * interrupts as this will block interrupts for other devices that + * may share the same interrupt line. Specifically, if there is a + * device specific method for masking/unmasking interrupts, that + * should be preferred over this API. This API is currently + * provided for masking exclusive interrupts (such as MSI) in a + * device independent manner. + * + * \note This vector should already have been setup using + * vmk_VectorEnable. + * + * \param[in] vector Vector to mask + * + *********************************************************************** + */ +void vmk_VectorChipsetDisable (vmk_uint32 vector); + +/* + *********************************************************************** + * vmk_VectorChipsetEnable -- */ /** + * + * \ingroup Vector + * \brief Unmasks the given vector at the Chipset level. + * + * \warning If there is a device specific method for masking/unmasking + * interrupts, that should be preferred over this API. This API + * is currently provided for masking/unmasking exclusive + * interrupts(such as MSI) in a device independent manner. + * + * \note This vector should already have been setup using vmk_VectorEnable. + * + * \param[in] vector Vector to unmask + * + *********************************************************************** + */ +void vmk_VectorChipsetEnable (vmk_uint32 vector); + +#endif /* _VMKAPI_VECTOR_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/execmem/vmkapi_execmem.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/execmem/vmkapi_execmem.h new file mode 100644 index 0000000..25e20a7 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/execmem/vmkapi_execmem.h @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * ExecMem */ /** + * \defgroup ExecMem Read-only Executable Memory Management Interfaces + * @{ + *********************************************************************** + */ +#ifndef _VMKAPI_EXECMEM_H_ +#define _VMKAPI_EXECMEM_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_const.h" + +/** + * \brief Maximum length of symbol name + */ +#define VMK_EXECMEM_MAX_SYM_NAME 128 + +/** + * \brief Opaque handle for an executable region + */ +typedef struct vmk_ExecMemInt *vmk_ExecMem; + +/* + *********************************************************************** + * vmk_ExecMemCreate -- */ /** + * + * \ingroup ExecMem + * \brief Create a read-only executable memory region + * + * \param[in] len Length of the R/O executable region. + * \param[out] ptr Pointer to the allocated region. + * \param[in] symbolName Symbol name for the region. + * \param[out] handle Handle to the region. + * + * \retval VMK_OK Executable memory region created + * successfully. + * \retval VMK_BAD_PARAM Symbol name length is greater than + * VMK_EXECMEM_MAX_SYM_NAME + * \retval VMK_NO_MEMORY System is out of memory so executable + * region cannot be created. + * \retval VMK_EXISTS Module symbol already exists + * \retval VMK_LIMIT_EXCEEDED No space for more symbols in symbol + * table. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ExecMemCreate( + vmk_uint32 len, + void **ptr, + const char *symbolName, + vmk_ExecMem *handle); + +/* + *********************************************************************** + * vmk_ExecMemCopyTo -- */ /** + * + * \ingroup ExecMem + * \brief Copy data to an executable memory region. + * + * \param[in] handle Handle to the destination memory . + * \param[in] src Pointer to the source to be copied. + * \param[in] len length in bytes to be copied. + * + * \retval VMK_OK Copy to executable memory was successful. + * \retval VMK_BAD_PARAM Src is NULL or handle is invalid or some other + * parameter is invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ExecMemCopyTo( + vmk_ExecMem handle, + const void *src, + vmk_uint32 len); + +/* + *********************************************************************** + * vmk_ExecMemDestroy -- */ /** + * + * \ingroup ExecMem + * \brief Destroy an executable memory region. + * + * Frees the read-only region associated with the executable + * region. + * + * \param[in] handle Handle to the region to be destroyed. + * + * \retval VMK_OK Memory is freed. + * \retval VMK_BAD_PARAM Handle is invalid. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_ExecMemDestroy( + vmk_ExecMem handle); + +#endif /*_VMKAPI_EXECMEM_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_compat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_compat.h new file mode 100644 index 0000000..cbea180 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_compat.h @@ -0,0 +1,1345 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * iSCSI Externally Exported Interfaces */ /** + * \defgroup ISCSI ISCSI Interfaces + * @{ + * + * \defgroup IscsiTransport iSCSI Transport public interfaces + * + * Vmkernel-specific iSCSI constants & types which are shared with + * user-mode and driver code. + * @{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_ISCSI_TRANSPORT_COMPAT_H +#define _VMKAPI_ISCSI_TRANSPORT_COMPAT_H + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif + +#include "base/vmkapi_types.h" +#include "base/vmkapi_revision.h" +#include "scsi/vmkapi_scsi_types.h" +#include "net/vmkapi_net_types.h" + +/* iSCSI Transport API Revision */ +#define VMK_ISCSI_TRANSPORT_REVISION_MAJOR 1 +#define VMK_ISCSI_TRANSPORT_REVISION_MINOR 0 +#define VMK_ISCSI_TRANSPORT_REVISION_UPDATE 0 +#define VMK_ISCSI_TRANSPORT_REVISION_PATCH_LEVEL 0 + +#define VMK_ISCSI_TRANSPORT_REVISION \ + VMK_REVISION_NUMBER(VMK_ISCSI_TRANSPORT) +/** \endcond never */ + +#define VMK_ISCSI_MAX_PARAM_BUFFER_SZ (4096) +#define VMK_ISCSI_MAX_SSID_BUFFER_SZ (1024) +#define VMK_ISCSI_MAX_TRANSPORT_NAME_SZ (256) +#define VMK_ISCSI_MAX_TRANSPORT_DESC_SZ (256) + +/** + * \brief iSCSI Parameters + * + * iSCSI parameters are passed from user space code and then resent + * to the media driver. The Media Drivers use these by name. The data + * for the parameter is always passed in as an ASCII string. For + * instance numeric parameter will be passed in as "1234\0". + */ +typedef enum { + /** + * \brief Specify Max Receive Data Segment Length. + * + */ + VMK_ISCSI_CONN_PARAM_MAX_RECV_DLENGTH = 0, + + /** + * \brief Specify Max Transmit Data Segment Length. + * + */ + VMK_ISCSI_CONN_PARAM_MAX_XMIT_DLENGTH = 1, + + /** + * \brief Enable/Disable Header Digest. + * + */ + VMK_ISCSI_CONN_PARAM_HDRDGST_EN = 2, + + /** + * \brief Enable/Disable Data Digest. + * + */ + VMK_ISCSI_CONN_PARAM_DATADGST_EN = 3, + + /** + * \brief Enable/Disable Initital R2T. + * + */ + VMK_ISCSI_SESS_PARAM_INITIAL_R2T_EN = 4, + + /** + * \brief Specifiy Maximum Outstanding R2T. + * + */ + VMK_ISCSI_SESS_PARAM_MAX_R2T = 5, + + /** + * \brief Enable/Disable Immediate Data. + * + */ + VMK_ISCSI_SESS_PARAM_IMM_DATA_EN = 6, + + /** + * \brief Specify First Burst Size. + * + */ + VMK_ISCSI_SESS_PARAM_FIRST_BURST = 7, + + /** + * \brief Specify Max Burst Size. + * + */ + VMK_ISCSI_SESS_PARAM_MAX_BURST = 8, + + /** + * \brief Enable/Disable Ordered PDU. + * + */ + VMK_ISCSI_SESS_PARAM_PDU_INORDER_EN = 9, + + /** + * \brief Enable/Disable Inorder Data Sequence Delivery. + * + */ + VMK_ISCSI_SESS_PARAM_DATASEQ_INORDER_EN = 10, + + /** + * \brief Specify Error Recovery Level. + * + */ + VMK_ISCSI_SESS_PARAM_ERL = 11, + + /** + * \brief Enable/Disable IF Marker. + * + */ + VMK_ISCSI_CONN_PARAM_IFMARKER_EN = 12, + + /** + * \brief Enable/Disable OF Marker. + * + */ + VMK_ISCSI_CONN_PARAM_OFMARKER_EN = 13, + + /** + * \brief Expected StatSN. + * + */ + VMK_ISCSI_CONN_PARAM_EXP_STATSN = 14, + + /** + * \brief Specify Target Name. + * + */ + VMK_ISCSI_SESS_PARAM_TARGET_NAME = 15, + + /** + * \brief Specify Target Portal Group Tag. + * + */ + VMK_ISCSI_SESS_PARAM_TPGT = 16, + + /** + * \brief Specify Persistent Target Address (i.e Group Address). + * + */ + VMK_ISCSI_CONN_PARAM_PERSISTENT_ADDRESS = 17, + + /** + * \brief Specify Persistent Socket Port. + * + */ + VMK_ISCSI_CONN_PARAM_PERSISTENT_PORT = 18, + + /** + * \brief Specify Recovery Timeout. + * + */ + VMK_ISCSI_SESS_PARAM_SESS_RECOVERY_TMO = 19, + + /** + * \brief Connected port. + * + */ + VMK_ISCSI_CONN_PARAM_CONN_PORT = 20, + + /** + * \brief Connected Target address. + * + */ + VMK_ISCSI_CONN_PARAM_CONN_ADDRESS = 21, + + /** + * \brief Specify outgoing authentication user name. + * + */ + VMK_ISCSI_SESS_PARAM_USERNAME = 22, + + /** + * \brief Specify incoming authentication user name. + * + */ + VMK_ISCSI_SESS_PARAM_USERNAME_IN = 23, + + /** + * \brief Specify outgoing authentication password. + * + */ + VMK_ISCSI_SESS_PARAM_PASSWORD = 24, + + /** + * \brief Specify incoming authentication password. + * + */ + VMK_ISCSI_SESS_PARAM_PASSWORD_IN = 25, + + /** + * \brief Enable/Disable FastAbort. + * + */ + VMK_ISCSI_SESS_PARAM_FAST_ABORT = 26, + + /** + * \brief Specify "Initiator Session ID" for the session. + * + */ + VMK_ISCSI_SESS_PARAM_ISID = 27, + + /** + * \brief Specify persistent ID used to uniqley identify the session. + * + */ + VMK_ISCSI_SESS_PARAM_SSID = 28, + + /** + * \brief Report maximum session supported by transport driver. + * + */ + VMK_ISCSI_TRANS_PARAM_MAX_SESSIONS = 29, + + /** \cond never */ + VMK_ISCSI_TRANS_ISCSI_PARAM_MAX + /** \endcond never */ +} vmk_IscsiTransIscsiParam; + +/** + * \brief iSCSI HBA/host parameters + */ +typedef enum { + VMK_ISCSI_HOST_PARAM_HWADDRESS = 0, + VMK_ISCSI_HOST_PARAM_INITIATOR_NAME = 1, + VMK_ISCSI_HOST_PARAM_NETDEV_NAME = 2, + VMK_ISCSI_HOST_PARAM_IPADDRESS = 3, + /** \cond never */ + VMK_ISCSI_TRANS_HOST_PARAM_MAX + /** \endcond never */ +} vmk_IscsiTransHostParam; + +/** + * \brief iSCSI transport discovery types + */ +typedef enum { + VMK_ISCSI_TGT_DSCVR_SEND_TARGETS = 1, + VMK_ISCSI_TGT_DSCVR_ISNS = 2, + VMK_ISCSI_TGT_DSCVR_SLP = 3, +} vmk_IscsiTransTgtDiscvr; + +/** + * \brief iSCSI protocol specific error code + */ +typedef enum { + + /** + * \brief No Error. + * + */ + VMK_ISCSI_OK = 0, + + /** + * \brief Data packet sequence number incorrect. + * + */ + VMK_ISCSI_ERR_DATASN = 1001, + + /** + * \brief Data packet offset number incorrect. + * + */ + VMK_ISCSI_ERR_DATA_OFFSET = 1002, + + /** + * \brief Exceeded Max cmd sequence number. + * + */ + VMK_ISCSI_ERR_MAX_CMDSN = 1003, + + /** + * \brief Command sequence number error. + * + */ + VMK_ISCSI_ERR_EXP_CMDSN = 1004, + + /** + * \brief Invalid iSCSI OP code. + * + */ + VMK_ISCSI_ERR_BAD_OPCODE = 1005, + + /** + * \brief Data length error. + * + */ + VMK_ISCSI_ERR_DATALEN = 1006, + + /** + * \brief AHS Length error. + * + */ + VMK_ISCSI_ERR_AHSLEN = 1007, + + /** + * \brief Generic Protocol violation. + * + */ + VMK_ISCSI_ERR_PROTO = 1008, + + /** + * \brief Invalid LUN. + * + */ + VMK_ISCSI_ERR_LUN = 1009, + + /** + * \brief Invalid ITT. + * + */ + VMK_ISCSI_ERR_BAD_ITT = 1010, + + /** + * \brief Connection Failure. + * + */ + VMK_ISCSI_ERR_CONN_FAILED = 1011, + + /** + * \brief Ready to send sequence error. + * + */ + VMK_ISCSI_ERR_R2TSN = 1012, + + /** + * \brief Session Failed. + * + */ + VMK_ISCSI_ERR_SESSION_FAILED = 1013, + + /** + * \brief Header Digest invalid. + * + */ + VMK_ISCSI_ERR_HDR_DGST = 1014, + + /** + * \brief Data digest invalid. + * + */ + VMK_ISCSI_ERR_DATA_DGST = 1015, + + /** + * \brief Invalid/Unsupported Parameter. + * + */ + VMK_ISCSI_ERR_PARAM_NOT_FOUND = 1016, + + /** + * \brief Invalid iSCSI command. + * + */ + VMK_ISCSI_ERR_NO_SCSI_CMD = 1017, +} vmk_IscsiTransIscsiErrorCode; + +/** + * \brief Flags for stopConnection + */ +typedef enum { + /** + * \brief The connection is going to be terminated. + * + */ + VMK_ISCSI_STOP_CONN_TERM = 0x1, + + /** + * \brief The connection will be recovered. + * + */ + VMK_ISCSI_STOP_CONN_RECOVER = 0x3, + + /** + * \brief For cleanup following reporting a connection error. + * + */ + VMK_ISCSI_STOP_CONN_CLEANUP_ONLY = 0xff +} vmk_IscsiStopConnMode; + +/** + * \brief Transport capabilities. + * + * These flags presents iSCSI Data-Path capabilities. + */ +typedef enum { + /** + * \brief Transport driver supports Error Recovery Level 0. + * + */ + VMK_ISCSI_CAP_RECOVERY_L0 = 0, + + /** + * \brief Transport driver supports Error Recovery Level 1. + * + */ + VMK_ISCSI_CAP_RECOVERY_L1 = 1, + + /** + * \brief Transport driver supports Error Recovery Level 2. + * + */ + VMK_ISCSI_CAP_RECOVERY_L2 = 2, + + /** + * \brief Transport driver supports multiple outstanding R2T's. + * + */ + VMK_ISCSI_CAP_MULTI_R2T = 3, + + /** + * \brief Transport driver supports Header Digest. + * + */ + VMK_ISCSI_CAP_HDRDGST = 4, + + /** + * \brief Transport driver supports Data Digest. + * + */ + VMK_ISCSI_CAP_DATADGST = 5, + + /** + * \brief Transport driver supports Multiple Connections per session. + * + */ + VMK_ISCSI_CAP_MULTI_CONN = 6, + + /** + * \brief Transport driver supports Text Negotiation. + * + */ + VMK_ISCSI_CAP_TEXT_NEGO = 7, + + /** + * \brief Transport driver supports Marker PDU's. + * + */ + VMK_ISCSI_CAP_MARKERS = 8, + + /** + * \brief Transport driver supports Firmware Data Base. + * + */ + VMK_ISCSI_CAP_FW_DB = 9, + + /** + * \brief Transport driver supports Offloaded SendTargets Discovery. + * + */ + VMK_ISCSI_CAP_SENDTARGETS_OFFLOAD = 10, + + /** + * \brief Transport driver supports Data Path Offload. + * + */ + VMK_ISCSI_CAP_DATA_PATH_OFFLOAD = 11, + + /** + * \brief Session Creation with Target and Channel ID assigned by + * transport. + * + */ + VMK_ISCSI_CAP_SESSION_PERSISTENT = 12, + + /** + * \brief Transport driver supports IPV6. + * + */ + VMK_ISCSI_CAP_IPV6 = 13, + + /** + * \brief Transport driver supports RDMA protocol. + * + */ + VMK_ISCSI_CAP_RDMA = 14, + + /** + * \brief User space socket creation style transport driver. + * + */ + VMK_ISCSI_CAP_USER_POLL = 15, + + /** + * \brief Transport driver supports Kernel space poll. + * + */ + VMK_ISCSI_CAP_KERNEL_POLL = 16, + + /** + * \brief Transport driver supports cleanup primitive to connection + * stop. + * + */ + VMK_ISCSI_CAP_CONN_CLEANUP = 17, + /** \cond never */ + VMK_ISCSI_CAP_MAX + /** \endcond never */ +} vmk_IscsiTransCapabilities; + +/** + * \brief iSCSI transport property types + * + */ +typedef enum { + VMK_ISCSI_TRANSPORT_PROPERTY_TYPE_UNKNOWN = 0, + /** + * \brief ISCSI connection/session params + * + * \note This is a mask type property and 'value' if given + * during add/remove is ignored. + */ + VMK_ISCSI_TRANSPORT_PROPERTY_ISCSI_PARAM = 1, + + /** + * \brief ISCSI host/hba params + * + * \note This is a mask type property and 'value' if given + * during add/remove is ignored. + */ + VMK_ISCSI_TRANSPORT_PROPERTY_HOST_PARAM = 2, + + /** + * \brief ISCSI transport driver capabilities + * + * \note This is a mask type property and 'value' if given + * during add/remove is ignored. + */ + VMK_ISCSI_TRANSPORT_PROPERTY_CAPABILITIES = 3, + + /** \cond never */ + VMK_ISCSI_TRANSPORT_PROPERTY_TYPE_MAX + /** \endcond never */ +} vmk_IscsiTransPropertyType; + +/** + * \brief Endpoint poll status. Indicates whether or not availability of data on the + * connection endpoint. + * + */ +typedef enum vmk_IscsiTransPollStatus { + /** \brief Indicates the endpoint has no data available */ + VMK_ISCSI_TRANSPORT_POLL_STATUS_NO_DATA = 0, + + /** \brief Indicates the endpoint has some data available */ + VMK_ISCSI_TRANSPORT_POLL_STATUS_DATA_AVAILABLE = 1, +} vmk_IscsiTransPollStatus; + +/** + * \brief Generic Property, an opaque handle for the + * iscsi transport supported properties. + * + */ +typedef struct vmk_IscsiTransGenericProperty { + /** + * \brief Property type. + * + */ + vmk_IscsiTransPropertyType propertyType; +} vmk_IscsiTransGenericProperty; + +/** + * \brief Session/connection parameter property. + * + */ +typedef vmk_IscsiTransGenericProperty *vmk_IscsiTransIscsiParamProperty; + +/* + *********************************************************************** + * vmk_IscsiTransportCreateIscsiParamProperty-- */ /** + * + * \brief Create an IscsiParam property object. + * + * \param[out] prop Pointer to the property object where allocated + * object is returned. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateIscsiParamProperty( + vmk_IscsiTransIscsiParamProperty *prop); + +/* + *********************************************************************** + * vmk_IscsiTransportAddIscsiParamProperty-- */ /** + * + * \brief Add an supported IscsiParam for a given property object. + * + * \param[in] prop Property object. + * \param[in] param The IscsiParam property item to be added. + * + * \note It is not an error to add the same parameter to a property + * more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportAddIscsiParamProperty( + vmk_IscsiTransIscsiParamProperty prop, + vmk_IscsiTransIscsiParam param); + +/* + *********************************************************************** + * vmk_IscsiTransportRemoveIscsiParamProperty-- */ /** + * + * \brief Remove an IscsiParam property item from the list for a + * given property object. + * + * \param[in] prop iSCSI Parameter property object. + * \param[in] param The IscsiParam property item to be removed. + * + * \note It is not an error to remove the same parameter from a + * property more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportRemoveIscsiParamProperty( + vmk_IscsiTransIscsiParamProperty prop, + vmk_IscsiTransIscsiParam param); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroyIscsiParamProperty-- */ /** + * + * \brief Destroy an IscsiParams property object and associated + * resources. + * + * \param[in] prop Property object to be destroyed. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroyIscsiParamProperty( + vmk_IscsiTransIscsiParamProperty prop); + +/** + * \brief Host parameter property. + * + */ +typedef vmk_IscsiTransGenericProperty *vmk_IscsiTransHostParamProperty; +/* + *********************************************************************** + * vmk_IscsiTransportCreateHostParamProperty-- */ /** + * + * \brief Create an HostParam property object. + * + * \param[out] prop Pointer to the property object where allocated + * object is returned. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateHostParamProperty( + vmk_IscsiTransHostParamProperty *prop); + +/* + *********************************************************************** + * vmk_IscsiTransportAddHostParamProperty-- */ /** + * + * \brief Add an supported HostParam for a given property object. + * + * \param[in] prop Property object. + * \param[in] param The HostParam property item to be added. + * + * \note It is not an error to add the same parameter to a property + * more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportAddHostParamProperty( + vmk_IscsiTransHostParamProperty prop, + vmk_IscsiTransHostParam param); + +/* + *********************************************************************** + * vmk_IscsiTransportRemoveHostParamProperty-- */ /** + * + * \brief Remove an HostParam property item from the list for a + * given property object. + * + * \param[in] prop iSCSI Parameter property object. + * \param[in] param The HostParam property item to be removed. + * + * \note It is not an error to remove the same parameter from a + * property more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportRemoveHostParamProperty( + vmk_IscsiTransHostParamProperty prop, + vmk_IscsiTransHostParam param); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroyHostParamProperty-- */ /** + * + * \brief Destroy an HostParams property object and associated + * resources. + * + * \param[in] prop Property object to be destroyed. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroyHostParamProperty( + vmk_IscsiTransHostParamProperty prop); + +/** + * \brief Transport capabilities property. + * + */ +typedef vmk_IscsiTransGenericProperty *vmk_IscsiTransCapabilitiesProperty; + +/* + *********************************************************************** + * vmk_IscsiTransportCreateCapabilitiesProperty-- */ /** + * + * \brief Create an Capabilities property object. + * + * \param[out] prop Pointer to the property object where allocated + * object is returned. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateCapabilitiesProperty( + vmk_IscsiTransCapabilitiesProperty *prop); + +/* + *********************************************************************** + * vmk_IscsiTransportAddCapabilitiesProperty-- */ /** + * + * \brief Add an supported Capabilities for a given property object. + * + * \param[in] prop Property object. + * \param[in] cap The Capabilities property item to be added. + * + * \note It is not an error to add the same capability to a property + * more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportAddCapabilitiesProperty( + vmk_IscsiTransCapabilitiesProperty prop, + vmk_IscsiTransCapabilities cap); + +/* + *********************************************************************** + * vmk_IscsiTransportRemoveCapabilitiesProperty-- */ /** + * + * \brief Remove an Capabilities property item from the list for a + * given property object. + * + * \param[in] prop iSCSI Parameter property object. + * \param[in] cap The Capabilities property item to be removed. + * + * \note It is not an error to remove the same capability from a + * property more than once. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_IscsiTransportRemoveCapabilitiesProperty( + vmk_IscsiTransCapabilitiesProperty prop, + vmk_IscsiTransCapabilities cap); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroyCapabilitiesProperty-- */ /** + * + * \brief Destroy an Capabilitiess property object and associated + * resources. + * + * \param[in] prop Property object to be destroyed. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroyCapabilitiesProperty( + vmk_IscsiTransCapabilitiesProperty prop); + +/** + * \brief Transport driver limit "min-max" specifiers. + * + */ +typedef struct { + /** + * \brief Transport driver's minimum supported value. + * + * This structure to be used + */ + vmk_uint32 min; + + /** + * \brief Transport driver's maximum supported value. + * + */ + vmk_uint32 max; +} vmk_IscsiTransportLimitMinMax; + +/** + * \brief Transport driver limit "list" specifiers. + */ +typedef struct { + + /** + * \brief Max number of allowed values in "value". + * + */ + vmk_uint32 count; + + /** + * \brief List of values. + * + */ + vmk_uint32 value[0]; +} vmk_IscsiTransportLimitList; + +/** + * \brief Transport driver limit specifiers -- limit type. + */ +typedef enum { + /** + * \brief Transport driver does not support limits for the param. + * + */ + VMK_ISCSI_TRANPORT_LIMIT_TYPE_UNSUPPORTED = 0, + + /** + * \brief Limits is of type Min-Max format. + * + */ + VMK_ISCSI_TRANPORT_LIMIT_TYPE_MINMAX = 1, + + /** + * \brief Limits is of type list format. + * + */ + VMK_ISCSI_TRANPORT_LIMIT_TYPE_LIST = 2 +} vmk_IscsiTransTransportParamLimitType; + +/** + * \brief Specify driver min-max/list limit for iSCSI parameters. + * + * Once the driver registers it's transport template, iSCSI transport + * queries the driver for min-max values supported by driver for range + * related iSCSI parameters described in vmk_IscsiTransIscsiParam. If + * the driver doesn't support min-max values, it must set the "type" to + * VMK_ISCSI_TRANPORT_LIMIT_TYPE_UNSUPPORTED and return VMK_OK. In that + * case the transport uses RFC defined ranges as the min-max values as + * valid values. If the driver does support min-max/list values, then + * it must set the "type" to either VMK_ISCSI_TRANPORT_LIMIT_TYPE_LIST + * or VMK_ISCSI_TRANPORT_LIMIT_TYPE_MINMAX and fill in the "limit" + * accordingly. The given min-max/list values must be with in the + * allowed min-max/list as specififed in RFC (if specified in iSCSI + * specification) or as documented by iSCSI configuration guide. + * + * The driver can also specify it's default preferred value. The + * transport will try to use that for session/connection as far as + * possible. + * + * Driver is queried for following list of parameters to get driver's + * min-max/allowed list values (transport's min-max and default values + * also documented here): + * + * VMK_ISCSI_CONN_PARAM_MAX_RECV_DLENGTH: + * min:512, max: 16MB-1 default:256K + * + * VMK_ISCSI_SESS_PARAM_FIRST_BURST: + * min:512, max: 16MB-1 default:256K + * + * VMK_ISCSI_SESS_PARAM_MAX_BURST: + * min:512, max: 16MB-1 default:256K + * + * VMK_ISCSI_SESS_PARAM_PDU_INORDER_EN: + * list:Yes=1,N0=0 default:Yes + * + * VMK_ISCSI_SESS_PARAM_DATASEQ_INORDER_EN: + * list:Yes=1,No= default:Yes + * + * VMK_ISCSI_SESS_PARAM_INITIAL_R2T_EN: + * list:Yes=1,No=0 default:No + * + * VMK_ISCSI_SESS_PARAM_MAX_R2T: + * min:1, max: 64K default:1 + * + * VMK_ISCSI_SESS_PARAM_IMM_DATA_EN: + * list:Yes=1,No=0 default:Yes + * + * VMK_ISCSI_SESS_PARAM_ERL: + * min:0 max:0 default:0 + * + * VMK_ISCSI_CONN_PARAM_HDRDGST_EN: + * list:DIGEST_NONE=0,DIGEST_CRC32=1 default: both + * + * VMK_ISCSI_CONN_PARAM_DATADGST_EN: + * list:NONE=0,CRC32=1 default: both + * + * VMK_ISCSI_TRANSPORT_PARAM_MAX_SESSIONS: + * list:1-4096 default:4096 + * + *********************************************************************** + */ +typedef struct { + /** + * \brief Limit type + * + * As documented in vmk_IscsiTransTransportParamLimitType. + */ + vmk_IscsiTransTransportParamLimitType type; + + /** + * \brief Indicates if media driver has a preferred value for + * the parameter. + * + */ + vmk_Bool hasPreferred; + + /** + * \brief Transport driver's preferred value. + * + * If hasPreferred == VMK_TRUE, iSCSI transport will use this as + * the default value. + */ + vmk_uint32 preferred; + + /** + * \brief Parameter name + * + * As documented in vmk_IscsiTransIscsiParam. + */ + vmk_IscsiTransIscsiParam param; + + union{ + vmk_IscsiTransportLimitMinMax minMax; + vmk_IscsiTransportLimitList list; + } limit; +} vmk_IscsiTransTransportParamLimits; + +#define VMK_ISCSI_STATS_CUSTOM_DESC_MAX 64 + +/** + * \brief iSCSI transport connection custom stats. + */ +typedef struct { + /** + * \brief Custom statistic name. + * + */ + vmk_int8 desc[VMK_ISCSI_STATS_CUSTOM_DESC_MAX]; + + /** + * \brief Custom statistic data. + * + */ + vmk_uint64 value; +} vmk_IscsiTransCustomIscsiStats; + +/** + * \brief iSCSI transport connection MIB-II stats + */ +typedef struct { + /* octets */ + vmk_uint64 txdata_octets; + vmk_uint64 rxdata_octets; + + /* xmit pdus */ + vmk_uint32 noptx_pdus; + vmk_uint32 scsicmd_pdus; + vmk_uint32 tmfcmd_pdus; + vmk_uint32 login_pdus; + vmk_uint32 text_pdus; + vmk_uint32 dataout_pdus; + vmk_uint32 logout_pdus; + vmk_uint32 snack_pdus; + + /* recv pdus */ + vmk_uint32 noprx_pdus; + vmk_uint32 scsirsp_pdus; + vmk_uint32 tmfrsp_pdus; + vmk_uint32 textrsp_pdus; + vmk_uint32 datain_pdus; + vmk_uint32 logoutrsp_pdus; + vmk_uint32 r2t_pdus; + vmk_uint32 async_pdus; + vmk_uint32 rjt_pdus; + + /* errors */ + vmk_uint32 digest_err; + vmk_uint32 timeout_err; + + /* + * iSCSI Custom Statistics support, i.e. Transport could + * extend existing MIB statistics with its own specific + * statistics up to ISCSI_STATS_CUSTOM_MAX. + */ + vmk_uint32 custom_length; + vmk_IscsiTransCustomIscsiStats custom[0] + VMK_ATTRIBUTE_ALIGN(sizeof(vmk_uint64)); +} vmk_IscsiTransIscsiStats; + +typedef vmk_AddrCookie vmk_IscsiNetHandle; + +/* + *********************************************************************** + * vmk_IscsiTansportGetVmkNic -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the vmkNIC name associated with a IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] vmkNic The vmkNic name. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetVmkNic( + vmk_IscsiNetHandle iscsiNetHandle, + char *vmkNic); + +/* + *********************************************************************** + * vmk_IscsiTransportGetUplink -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the uplink name associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] uplink The uplink name. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetUplink( + vmk_IscsiNetHandle iscsiNetHandle, + char *uplink); + +/* + *********************************************************************** + * vmk_IscsiTransportGetSrcIP -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the Source IP Addr and family for an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] srcFamily Sockaddr family value. + * \param[out] srcIPAddr The source address. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetSrcIP( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *srcFamily, + vmk_uint8 *srcIPAddr); + +/* + *********************************************************************** + * vmk_IscsiTransportGetSrcSubnet -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the source subnet associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] srcFamily Sockaddr family value. + * \param[out] srcSubnet The source subnet. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetSrcSubnet( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *srcFamily, + vmk_uint8 *srcSubnet); + +/* + *********************************************************************** + * vmk_IscsiTransportGetDstIP -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the destination IP addr and family for an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] dstFamily Sockadr family value. + * \param[out] dstIPAddr The destination IP address. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetDstIP( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *dstFamily, + vmk_uint8 *dstIPAddr); + +/* + *********************************************************************** + * vmk_IscsiTransportGetNextHopIP -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the next hop IP address associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] nextHopFamily Sockaddr family value. + * \param[out] nextHopIPAddr The next hop IP address. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetNextHopIP( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *nextHopFamily, + vmk_uint8 *nextHopIPAddr); + +/* + *********************************************************************** + * vmk_IscsiTransportGetNextHopMAC -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the Next Hop MAC Address for an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] nextHopMAC The MAC address of the next hop. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetNextHopMAC( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_EthAddress nextHopMAC); + +/* + *********************************************************************** + * vmk_IscsiTransportGetSrcMAC -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the source MAC Address associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] srcMAC The MAC address of the local interface. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetSrcMAC( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_EthAddress srcMAC); + +/* + *********************************************************************** + * vmk_IscsiTransportGetMtu -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the mtu associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] mtu The mtu. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetMtu( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *mtu); + +/* + *********************************************************************** + * vmk_IscsiTransportGetPmtu -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the path mtu associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] pmtu The pmtu. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetPmtu( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *pmtu); + +/* + *********************************************************************** + * vmk_IscsiTransportGetVlan -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the Vlan ID associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] vlan The vlan ID. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetVlan( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *vlan); + +/* + *********************************************************************** + * vmk_IscsiTransportGetPVlan -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the private VLan ID associated with an IscsiNetHandle. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] pvlan The private vlan ID. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetPVlan( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *pvlan); + +/* + *********************************************************************** + * vmk_IscsiTransportGetPortReservation -- */ /** + * + * \ingroup IscsiTransport + * \brief Returns the start and number of reserved TCP ports. + * + * \param[in] iscsiNetHandle Net Handle for this connection. + * \param[out] firstPort The number of the first reserved port. + * \param[out] portCount The number of reserved ports. + * + * \retval VMK_OK Success. + * \retval VMK_BAD_PARAM Not a valid iscsi Net Handle. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportGetPortReservation( + vmk_IscsiNetHandle iscsiNetHandle, + vmk_uint32 *firstPort, + vmk_uint32 *portCount); +#endif /* _VMKAPI_ISCSI_TRANSPORT_COMPAT_H */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_incompat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_incompat.h new file mode 100644 index 0000000..36ca84b --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/iscsi/vmkapi_iscsi_transport_incompat.h @@ -0,0 +1,1417 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * iSCSI Externally Exported Interfaces (Incompatible) */ /** + * \addtogroup ISCSI ISCSI Interfaces + * @{ + * + * \addtogroup IscsiTransport iSCSI Transport public interfaces + * + * Vmkernel-specific iSCSI constants & types which are shared with + * user-mode and driver code. + * @{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_ISCSI_TRANSPORT_INCOMPAT_H +#define _VMKAPI_ISCSI_TRANSPORT_INCOMPAT_H + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif + +#include "base/vmkapi_types.h" +#include "base/vmkapi_revision.h" +#include "scsi/vmkapi_scsi_types.h" +#include "iscsi/vmkapi_iscsi_transport_compat.h" +/** \endcond never */ + +/** \cond never */ +struct vmk_IscsiTransConnection; +/** + * \brief iSCSI transport connection object. + */ +typedef struct vmk_IscsiTransConnection vmk_IscsiTransConnection; + +struct vmk_IscsiTransSession; +/** + * \brief iSCSI transport session object. + */ +typedef struct vmk_IscsiTransSession vmk_IscsiTransSession; + +struct vmk_IscsiTransTransport; +/** + * \brief iSCSI transport transport object. + */ +typedef struct vmk_IscsiTransTransport vmk_IscsiTransTransport; +/** \endcond never */ + +/* + *********************************************************************** + * vmk_IscsiCreateSessionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * create a session object. + * + * \param[in] transport Pointer to vmk_IscsiTransTransport. + * \param[in] maxCmds Maximum concurrent tasks allowed per + * session. + * \param[in] qDepth Qdepth per session. + * \param[in] initialCmdSeqNum Initial command sequence number to be + * used for the session. + * \param[in] targetId Target ID for the session. + * \param[in] channelId Channel ID for the session. + * \param[out] hostNumber Host number used by the driver is + * returned in this argument. + * \param[out] outSession Newly created session is returned + * here. + * + * \return VMK_OK, if session is successfully created. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiCreateSessionDrvIntf) ( + vmk_IscsiTransTransport *transport, + vmk_uint16 maxCmds, + vmk_uint16 qDepth, + vmk_uint32 initialCmdSeqNum, + vmk_uint32 targetId, + vmk_uint32 channelId, + vmk_uint32 *hostNumber, + vmk_IscsiTransSession **outSession); + +/* + *********************************************************************** + * vmk_IscsiDestroySessionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * destroy a session object. + * + * \param[in] sess Pointer to session object to be destroyed. + * + * \return VMK_OK, if session is successfully destroyed. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiDestroySessionDrvIntf) ( + vmk_IscsiTransSession *sess); + +/* + *********************************************************************** + * vmk_IscsiCreateConnectionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * create a connection object. + * + * \param[in] sess Pointer to session object for which + * the new connection object to be + * created. + * \param[in] connId Connection ID to be used for the new + * connection. + * \param[out] outConnection Newly created connection is returned + * here. + * + * \return VMK_OK, if connection is successfully created. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiCreateConnectionDrvIntf) ( + vmk_IscsiTransSession *sess, + vmk_uint32 connId, + vmk_IscsiTransConnection **outConnection); + +/* + *********************************************************************** + * vmk_IscsiBindConnectionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * associate a connection endpoint to a connection object. + * + * \param[in] sess Pointer to session object the connection + * belongs. + * \param[in] conn Pointer to connection object to be bound. + * \param[in] socket The "socket" or the connection endpoint to + * to be associated with the connection. + * \param[in] isLeading Boolean flag indicating if it is the + * "leading" connection. + * + * \return VMK_OK, if bind operation is successfull. All other return + * code indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiBindConnectionDrvIntf) ( + vmk_IscsiTransSession *sess, + vmk_IscsiTransConnection *conn, + vmk_uint64 socket, + vmk_Bool isLeading); + +/* + *********************************************************************** + * vmk_IscsiStartConnectionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * enable the connection for IO. + * + * \param[in] conn Pointer to the connection object to be enabled. + * + * \return VMK_OK, if bind operation is successfull. All other return + * code indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiStartConnectionDrvIntf) ( + vmk_IscsiTransConnection *conn); + +/* + *********************************************************************** + * vmk_IscsiStopConnectionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * disable the connection for IO and dis-associate the socket + * from the connection. + * + * \param[in] conn Pointer to the connection object to be disabled. + * \param[in] mode The reason for calling the interface. + * + * \retval VMK_OK If connection has successfully + * completed stop operation. + * \retval VMK_STATUS_PENDING If connection stop operation is + * pending completion. The driver is + * required to asynchrounsly call + * vmk_IscsiTransportConnectionStopDone() + * to complete the stop operation. + * + * \note All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiStopConnectionDrvIntf) ( + vmk_IscsiTransConnection *conn, + vmk_IscsiStopConnMode mode); + +/* + *********************************************************************** + * vmk_IscsiDestroyConnectionDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * destroy the connection object. + * + * \param[in] conn Pointer to the connection object to be destroyed. + * + * \return VMK_OK, if connection is destroyed successfully. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiDestroyConnectionDrvIntf) ( + vmk_IscsiTransConnection *conn); + +/* + *********************************************************************** + * vmk_IscsiGetSessionParamDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * obtain session parameter values. + * + * \param[in] sess Pointer to session object for which the + * parameter applies. + * \param[in] param The parameter to get. + * \param[out] dataBuf Pointer to the data buffer where the value + * is to be returned. + * \param[out] dataLen Pointer to the data len to be filled by the + * driver. + * + * \return VMK_OK, if the get operation is successful. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiGetSessionParamDrvIntf) ( + vmk_IscsiTransSession *sess, + vmk_IscsiTransIscsiParam param, + vmk_int8 *dataBuf, + vmk_int32 *dataLen); + +/* + *********************************************************************** + * vmk_IscsiSetParamDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * set session/connection parameter values. + * + * \param[in] conn Pointer to connection object for which the + * parameter applies. + * \param[in] param The parameter to set + * \param[in] dataBuf Pointer to the data buffer where the value + * is to be obtained from. + * \param[in] bufLen Size of the dataBuf. + * + * \return VMK_OK, if the set operation is successful. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiSetParamDrvIntf) ( + vmk_IscsiTransConnection *conn, + vmk_IscsiTransIscsiParam param, + vmk_int8 *dataBuf, + vmk_int32 bufLen); + +/* + *********************************************************************** + * vmk_IscsiGetConnectionParamDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * obtain connection parameter values. + * + * \param[in] conn Pointer to connection object for which the + * parameter applies. + * \param[in] param The parameter to get + * \param[in] dataBuf Pointer to the data buffer where the + * value is to be returned. + * \param[out] dataLen Pointer to the data len to be filled by the + * driver. + * + * \return VMK_OK, if the get operation is successful. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiGetConnectionParamDrvIntf) ( + vmk_IscsiTransConnection *conn, + vmk_IscsiTransIscsiParam param, + vmk_int8 *dataBuf, + vmk_int32 *dataLen); + +/* + *********************************************************************** + * vmk_IscsiGetHostParamDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * obtain host/adapter parameter values. + * + * \param[in] transport Pointer to the transport object for which + * the parameter applies + * \param[in] hostPrivate Pointer to hostPrivate object that was + * registered using + * vmk_IscsiTransportRegisterAdapter() + * \param[in] param The parameter to get + * \param[out] dataBuf Pointer to the data buffer where the value + * is to be returned. + * \param[out] dataLen Pointer to the data len to be filled by the + * driver. + * + * \return VMK_OK, if the get operation is successful. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiGetHostParamDrvIntf) ( + vmk_IscsiTransTransport *transport, + void *hostPrivate, + vmk_IscsiTransHostParam param, + vmk_int8 *dataBuf, + vmk_int32 *dataLen); + +/* + *********************************************************************** + * vmk_IscsiSetHostParamDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * set host/adapter parameter values. + * + * \param[in] transport Pointer to the transport object for which + * the parameter applies + * \param[in] hostPrivate Pointer to hostPrivate object that was + * registered using + * vmk_IscsiTransportRegisterAdapter() + * \param[in] param The parameter to get + * \param[in] dataBuf Pointer to the data buffer where the value + * is to be returned. + * \param[in] bufLen Size of the dataBuf + * + * \return VMK_OK, if the set operation is successful. All other + * return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiSetHostParamDrvIntf) ( + vmk_IscsiTransTransport *transport, + void *hostPrivate, + vmk_IscsiTransHostParam param, + vmk_int8 *dataBuf, + vmk_int32 bufLen); + +/* + *********************************************************************** + * vmk_IscsiSendPduDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * send raw PDU on the connection. + * + * \param[in] conn Pointer to connection object using which the + * PDU is to be sent. + * \param[in] pduHdr PDU Header + * \param[in] pduData PDU Data + * \param[in] dataLen PDU Data Length + * + * \return VMK_OK, if driver is able to the send the PDU successfully. + * All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiSendPduDrvIntf) ( + vmk_IscsiTransConnection *conn, + void *pduHdr, + vmk_int8 *pduData, + vmk_uint32 dataLen); + +/* + *********************************************************************** + * vmk_IscsiGetStatsDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * obtain connection statistics. + * + * \param[in] conn Pointer to connection object for which the + * statistics applies. + * \param[in] stats Pointer to the statistics object where the + * stats are to be returned. + * + * \return VMK_OK, if driver is provide the stats successfully. + * All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiGetStatsDrvIntf) ( + vmk_IscsiTransConnection *conn, + vmk_IscsiTransIscsiStats *stats); + +/* + *********************************************************************** + * vmk_IscsiSessionRecoveryTimedoutDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport + * when recovery timer expires. + * + * One of the action the driver could take in this callback + * is to start failing the IO with VMK_NO_CONNECT and initiate + * the path state probe. + * + * \param[in] sess Pointer to session object which has expired + * the recovery timer. + * + *********************************************************************** + */ +typedef void (*vmk_IscsiSessionRecoveryTimedoutDrvIntf) ( + vmk_IscsiTransSession *sess); + +/* + *********************************************************************** + * vmk_IscsiEPConnectExtendedDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * establish a TCP connection for a future iSCSI session. + * + * \param[in] transport Pointer to transport object for which + * the interface applies. + * \param[in] destAddr iSCSI target address to be connected to + * \param[in] isNonBlocking A flag indicating if it should be + * non-blocking connection establishment + * or not. + * \param[out] ep Connection endpoint object handle to be + * returned. + * \param[in] iscsiNetHandle Handle containing routing information. + * + * \retval VMK_OK If connection is successfully + * established. + * \retval VMK_STATUS_PENDING If connection is in the process + * being established. The transport will + * poll using EPPoll() to determine the + * connection status. + * + * \note All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiEPConnectExtendedDrvIntf) ( + vmk_IscsiTransTransport *transport, + void *destAddr, + vmk_Bool isNonBlocking, + vmk_uint64 *ep, + vmk_IscsiNetHandle iscsiNetHandle); + +/* + *********************************************************************** + * vmk_IscsiEPPollDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * poll for an event on the connection endpoint. + * + * \param[in] transport Pointer to transport object for which the + * interface applies. + * \param[in] ep The connection endpoint for polling. + * \param[in] timeoutMS Timeout for polling. + * \param[out] eventReply Driver indication whether poll yields + * any data or not for application. + * + * \return VMK_OK, if the poll operation is successfull and poll + * state is available in "eventReply". All other return + * code indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiEPPollDrvIntf) ( + vmk_IscsiTransTransport *transport, + vmk_uint64 ep, + vmk_int32 timeoutMS, + vmk_IscsiTransPollStatus *eventReply); + +/* + *********************************************************************** + * vmk_IscsiEPDisconnectDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * disconnect an existing TCP connection. + * + * \param[in] transport Pointer to transport object for which + * the interface applies. + * \param[out] ep Connection endpoint object handle to be + * disconnected. + * \return VMK_OK, if the disconnect operation is successful. + * All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiEPDisconnectDrvIntf) ( + vmk_IscsiTransTransport *transport, + vmk_uint64 ep); + +/* + *********************************************************************** + * vmk_IscsiTargetDiscoverDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * perform discovery operation. + * + * \param[in] transport Pointer to transport object for which the + * interface applies. + * \param[in] hostPrivate Pointer to the private object associated + * with adapter. + * \param[in] discType Type of discovery. + * \param[in] enable Flag indicating whether to enable or disable the + * discovery address. + * \param[in] discAddress The discovery target address. + * + * \return VMK_OK, if the given discovery address is enabled/disabled + * successfully. All other return codes indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiTargetDiscoverDrvIntf) ( + vmk_IscsiTransTransport *transport, + void *hostPrivate, + vmk_IscsiTransTgtDiscvr discType, + vmk_Bool enable, + void *discAddress); + +/* + *********************************************************************** + * vmk_IscsiGetTransportLimitsDrvIntf-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Driver entry point interface called by iSCSI transport to + * obtain the transport's parameter min-max limits. + * + * \param[in] transport Pointer to session object for which the + * parameter applies. + * \param[in] param The parameter to get + * \param[out] paramList Pointer to the limits object in which the + * limit data is to be returned. + * \param[in] listMaxLen Size of paramList + * + * \return VMK_OK, if driver is able to provide the "limits" values + * for the parameter being passed. All other return codes + * indicates failure. + * + *********************************************************************** + */ +typedef VMK_ReturnStatus (*vmk_IscsiGetTransportLimitsDrvIntf) ( + vmk_IscsiTransTransport *transport, + vmk_IscsiTransIscsiParam param, + vmk_IscsiTransTransportParamLimits *paramList, + vmk_int32 listMaxLen); + +/** + * \brief iSCSI transport connection object + */ +struct vmk_IscsiTransConnection { + /** + * \brief Object Signature + * + * Created and assigned by iSCSI transport. + */ + vmk_uint64 magic; + + /** + * \brief Last Rx time in jiffies + * + * To be updated by media drivers every time it has a successful + * Rx. This is used by iSCSI transport to determine if connection + * probe is necessary or not. + */ + vmk_uint64 *lastRxTimeJiffies; + + /** + * \brief Driver's Private Object + * + * This is private use for the Media Driver. If connDataSize in + * transport template is non-zero vmk_IscsiTransCreateConnection() + * will allocate and save the address in this member field. If + * connDataSize is zero, it is up to the driver to manage this + * member. + */ + void *ddData; +}; + +/** + * \brief iSCSI transport session object + */ +struct vmk_IscsiTransSession { + /** + * \brief Object Signature + * + * Created and assigned by iSCSI transport. + */ + vmk_uint64 magic; + + /** + * \brief Session Recovery Timeout Value + * + * For iSCSI transport managed drivers, the timeout value is set by + * the management application. For other drivers, the driver need to + * update the value after session creation. + * + */ + vmk_int32 *recoveryTimeout; + + /** + * \brief Driver's Private Object + * + * This is private use for the Media Driver. If sessionDataSize in + * transport template is non-zero vmk_IscsiTransCreateSession() / + * vmk_IscsiTransAllocSession will allocate and save the address + * in this member field. If sessionDataSize is zero, it is up + * to the driver to manage this member. + */ + void *ddData; +}; + +/** + * \brief iSCSI transport's transport object + */ +struct vmk_IscsiTransTransport { + /** + * \brief iSCSI Transport API version + * + * The media driver is responsible to fill in the version of the + * API. The media driver must assign VMK_ISCSI_TRANSPORT_REVISION + * into this field. The iSCSI transport only accepts transport + * registration if the version is the current transport API version + * that is being managed. If the version does not match, + * vmk_IscsiTransRegisterRansport() will fail with VMK_BAD_PARAM. + */ + vmk_uint32 revision; + + /** + * \brief Object signature + * + * Created and assigned by iSCSI transport. + */ + vmk_uint64 magic; + + /** + * \brief Name of the transport + * + * Every transport registration must with be unique address with + * unique name. + */ + vmk_uint8 name[VMK_ISCSI_MAX_TRANSPORT_NAME_SZ]; + + /** + * \brief Display Description of the transport + * + * Every transport registration must provide a human readable + * description of the transport. + */ + char description[VMK_ISCSI_MAX_TRANSPORT_DESC_SZ]; + + /** + * \brief Media driver's private data area + * + * iSCSI transport does not manage this member. + */ + void *ddData; + + /** + * \brief Transport driver's capabilities + * + * As documented in vmk_IscsiTransCapabilities + */ + vmk_IscsiTransCapabilitiesProperty capsProperty; + + /** + * \brief Connection & Session Supported parameter mask + * + * Controls get / set of particular parameter. + */ + vmk_IscsiTransIscsiParamProperty iscsiParamProperty; + + /** + * \brief Supported adapter parameter mask + * + * This controls the param types that will be get/set on the + * host/adapter. + */ + vmk_IscsiTransHostParamProperty hostParamProperty; + + /** + * \brief Connection data size + * + * Size of private memory to be allocated when connection is + * created. The allocated memory address is saved in ddData of + * connection object. + */ + vmk_int32 connDataSize; + + /** + * \brief Session data size + * + * Size of private memory to be allocated when session is + * created. The allocated memory address is saved in ddData of + * session object. + */ + vmk_int32 sessionDataSize; + + /** + * \brief Maximum number of LUNs supported. + * + */ + vmk_int32 maxLun; + + /** + * \brief Maximum number of connections per session supported. + * + */ + vmk_int32 maxConn; + + /** + * \brief Maximum SCSI command length (CDB length) + * + */ + vmk_int32 maxCmdLen; + + /** + * \brief Creates and initializes the session object + * + */ + vmk_IscsiCreateSessionDrvIntf createSessionPersistent; + + /** + * \brief Delete and free the session object + * + */ + vmk_IscsiDestroySessionDrvIntf destroySession; + + /** + * \brief Create a connection class object + * + */ + vmk_IscsiCreateConnectionDrvIntf createConnection; + + /** + * \brief Bind a socket created in user space to a session. + * + */ + vmk_IscsiBindConnectionDrvIntf bindConnection; + + /** + * \brief Enable connection for IO ( Connect ) + * + */ + vmk_IscsiStartConnectionDrvIntf startConnection; + + /** + * \brief Stop IO on the connection ( Disconnect ) + * + */ + vmk_IscsiStopConnectionDrvIntf stopConnection; + + /** + * \brief Destroy a connection + * + */ + vmk_IscsiDestroyConnectionDrvIntf destroyConnection; + + /** + * \brief Retrieve session parameters from Media Driver + * + */ + vmk_IscsiGetSessionParamDrvIntf getSessionParam; + + /** + * \brief Set connection/session parameters from Media Driver + * + */ + vmk_IscsiSetParamDrvIntf setParam; + + /** + * \brief Retrieve connection parameters from Media Driver + * + */ + vmk_IscsiGetConnectionParamDrvIntf getConnectionParam; + + /** + * \brief Retrieve host configuration parameters from Media Driver + * + */ + vmk_IscsiGetHostParamDrvIntf getHostParam; + + /** + * \brief Set a host configuration parameters for a Media Driver + * + */ + vmk_IscsiSetHostParamDrvIntf setHostParam; + + /** + * \brief Send a data PDU to a target. + * + */ + vmk_IscsiSendPduDrvIntf sendPdu; + + /** + * \brief Retrieve per connection statistics from the Media Driver + * + */ + vmk_IscsiGetStatsDrvIntf getStats; + + /** + * \brief Recovery timer expiry callback + * + */ + vmk_IscsiSessionRecoveryTimedoutDrvIntf sessionRecoveryTimedout; + + /** + * \brief Connect to the specified destination through a media driver. + * + */ + vmk_IscsiEPConnectExtendedDrvIntf EPConnectExtended; + + /** + * \brief Poll for an event from the Media Driver + * + */ + vmk_IscsiEPPollDrvIntf EPPoll; + + /** + * \brief Disconnect the socket channel though the Media Driver + * + */ + vmk_IscsiEPDisconnectDrvIntf EPDisconnect; + + /** + * \brief Perform a target discovery on a specific ip address + * + */ + vmk_IscsiTargetDiscoverDrvIntf targetDiscover; + + /** + * \brief Get driver's lower and upper limits for the parameters + * + */ + vmk_IscsiGetTransportLimitsDrvIntf getTransportLimits; +}; + +/* + *********************************************************************** + * vmk_IscsiTransportCreateSessionDone-- */ /** + * + * \ingroup IscsiTransport + * + * \brief Inform completion of session creation. + * + * This interface is called from the media drivers when it has + * completed creating a session or an existing session has + * gone into the "Logged In" in state. + * + * \param[in] conn Transport connection object. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateSessionDone( + vmk_IscsiTransConnection *conn); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroySessionDone-- */ /** + * + * \ingroup IscsiTransport + * \brief Inform completion of session termination. + * + * This interface is called from the media drivers to inform + * that a particular session was removed by the media driver. + * + * \param[in] conn Transport connection object. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroySessionDone( + vmk_IscsiTransConnection *conn); + +/* + *********************************************************************** + * vmk_IscsiTransportConnectionStartDone-- */ /** + * + * \ingroup IscsiTransport + * \brief Inform completion of connection start. + * + * This interface is called from the media drivers when it has + * completed the connection start operation. The connection is + * ready for IO operations. + * + * \param[in] conn Transport connection object. + * \param[in] error Error code for the operation. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportConnectionStartDone( + vmk_IscsiTransConnection *conn, + VMK_ReturnStatus error); + +/* + *********************************************************************** + * vmk_IscsiTransportConnectionStopDone-- */ /** + * + * \ingroup IscsiTransport + * \brief Inform completion of connection stop. + * + * This interface is called from the media drivers when it has + * completed the connection stop operation. As part of the + * connection stop, the drivers are required to clean-up + * active/pending IO's. + * + * \param[in] conn Transport connection object. + * \param[in] error Error code for the operation. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportConnectionStopDone( + vmk_IscsiTransConnection *conn, + VMK_ReturnStatus error); + +/* + *********************************************************************** + * vmk_IscsiTransportReportConnectionError-- */ /** + * + * \ingroup IscsiTransport + * \brief Report an error on the connection. + * + * This interface is called by media drivers when a connection + * fails. IE: a target disconnect occurs, network error, etc. + * Following reporting of this error, the iSCSI transport will + * start error recovery procedure on the connection. + * + * \param[in] conn Transport connection object. + * \param[in] error Error code that caused the failure. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportReportConnectionError( + vmk_IscsiTransConnection *conn, + vmk_IscsiTransIscsiErrorCode error); + +/* + *********************************************************************** + * vmk_IscsiTransportSendReceivedPdu-- */ /** + * + * \ingroup IscsiTransport + * \brief Send a received iSCSI control PDU up to iSCSI transport. + * + * Called by media drivers to have the iSCSI transport handle + * a specific PDU. Only following PDU's are valid: + * Login Response, + * Logout Response, + * Nop In, + * Async Event, + * Text Response. + * + * \param[in] conn Transport connection object. + * \param[in] pduHdr Pointer to buffer containing iSCSI PDU header. + * \param[in] pduData Pointer to buffer containing iSCSI PDU data. + * (can be NULL if no data). + * \param[in] dataLen Data length if pduData is not NULL. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid connection object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportSendReceivedPdu( + vmk_IscsiTransConnection *conn, + void *pduHdr, + vmk_uint8 *pduData, + vmk_uint32 dataLen); + +/* + *********************************************************************** + * vmk_IscsiTransportRegisterAdapter-- */ /** + * + * \ingroup IscsiTransport + * \brief Register the iSCSI adapter with iSCSI transport. + * + * Register an adapter with the iSCSI transport so for + * attaching management interfaces. + * + * \param[in] vmkAdapter The adapter to attach our management adapter. + * \param[in] transport The transport template that will be used to + * call into the media driver for this adapter. + * + * \retval VMK_OK + * \retval VMK_EXISTS + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid transport/adapter object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportRegisterAdapter( + vmk_ScsiAdapter *vmkAdapter, + vmk_IscsiTransTransport *transport + ); + +/* + *********************************************************************** + * vmk_IscsiTransportUnregisterAdapter-- */ /** + * + * \ingroup IscsiTransport + * \brief Release this adapter freeing it's management interfaces. + * + * \param[in] vmkAdapter The adapter to release. + * + * \retval VMK_OK + * \retval VMK_BUSY + * \retval VMK_BAD_PARAM Not a valid adapter object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportUnregisterAdapter( + vmk_ScsiAdapter *vmkAdapter); + +/* + *********************************************************************** + * vmk_IscsiTransportAllocSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Allocates iSCSI session object. + * + * Allocates and initialize the class object that represents a + * session. + * + * \param[in] hostPrivate A private object to be associated with + * the session. + * \param[in] transport Pointer to transport object. + * \param[out] session The pointer to the newly allocated session. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid transport object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportAllocSession( + void *hostPrivate, + vmk_IscsiTransTransport *transport, + vmk_IscsiTransSession **session); + +/* + *********************************************************************** + * vmk_IscsiTransportAddSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Associate host, target and channel Ids for the session. + * + * Also activates the session for further operations. Following + * completion of this interface, the storage stack can perform + * scanning operations on the session. + * + * \param[in] session A session previously created with + * vmk_IscsiTransportAllocSession(). + * \param[in] hostNo The host ID to be asssociated for this + * session. + * \param[in] targetId The target ID to be asssociated for this + * session. + * \param[out] channelId The channel ID to be asssociated for this + * session. + * + * \retval VMK_OK + * \retval VMK_BAD_PARAM Given session object is invalid. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportAddSession( + vmk_IscsiTransSession *session, + vmk_uint32 hostNo, + vmk_uint32 targetId, + vmk_uint32 channelId); + +/* + *********************************************************************** + * vmk_IscsiTransportCreateSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Creates and activates a new session. + * + * This interface allocates a new iSCSI transport session + * object and activates it. + * + * \param[in] hostPrivate Driver's private data to be associated + * with the session object. + * \param[in] transport Transport object to be associated with the + * session object. + * \param[in] hostNo The host ID to be asssociated for this + * session. + * \param[in] targetId The target ID to be asssociated for this + * session. + * \param[in] channelId The channel ID to be asssociated for this + * session. + * \param[out] session The pointer to the newly allocated session. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_EXISTS Already an object with same targetId and + * channelId exists for the same transport. + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateSession( + void *hostPrivate, + vmk_IscsiTransTransport *transport, + vmk_uint32 hostNo, + vmk_uint32 targetId, + vmk_uint32 channelId, + vmk_IscsiTransSession **session); + +/* + *********************************************************************** + * vmk_IscsiTransportRemoveSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Removes a session object from iSCSI transport's active list. + * + * \param[in] session The session to be removed. + * + * \retval VMK_OK + * \retval VMK_BUSY There are other resources attached to the + * object, can't be removed. + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportRemoveSession( + vmk_IscsiTransSession *session); + +/* + *********************************************************************** + * vmk_IscsiTransportFreeSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Free the memory associated with session object. + * + * \param[in] session The session to be freed. + * + * \retval VMK_OK + * \retval VMK_BUSY There are other resources attached to the + * object, can't be freed. + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportFreeSession( + vmk_IscsiTransSession *session); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroySession-- */ /** + * + * \ingroup IscsiTransport + * \brief Remove and free the session object. + * + * \param[in] session The session to be destroyed. + * + * \retval VMK_OK + * \retval VMK_BUSY There are other resources attached to the + * object, can't be freed. + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroySession( + vmk_IscsiTransSession *session); + +/* + *********************************************************************** + * vmk_IscsiTransportCreateConnection-- */ /** + * + * \ingroup IscsiTransport + * \brief Create a new connection object for the specified session. + * + * \param[in] session The session for which the new connection to + * be created. + * \param[in] connId The connection ID to be associated with the + * new connection. + * \param[out] conn Newly created connection object. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportCreateConnection( + vmk_IscsiTransSession *session, + vmk_uint32 connId, + vmk_IscsiTransConnection **conn); + +/* + *********************************************************************** + * vmk_IscsiTransportDestroyConnection-- */ /** + * + * \ingroup IscsiTransport + * \brief Destroy the connection object previously created. + * + * \param[in] conn The connection to be destroyed. + * + * \retval VMK_OK + * \retval VMK_BUSY There are other resources attached to the + * object, object can't be destroyed. + * \retval VMK_BAD_PARAM Not a valid session object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportDestroyConnection( + vmk_IscsiTransConnection *conn); + +/* + *********************************************************************** + * vmk_IscsiTransportStopSessionRecoveryTimer-- */ /** + * + * \ingroup IscsiTransport + * \brief Disarm the recovery timer that was started earlier. + * + * \param[in] sess The session object for which the timer is to + * be stopped. + * + *********************************************************************** + */ +void +vmk_IscsiTransportStopSessionRecoveryTimer( + vmk_IscsiTransSession *sess); + +/* + *********************************************************************** + * vmk_IscsiTransportStartSessionRecoveryTimer-- */ /** + * + * \ingroup IscsiTransport + * \brief Schedule the recovery timer for the session. + * + * \param[in] sess The session object for which the timer is to + * be started. + * + * \retval VMK_OK + * \retval VMK_NO_RESOURCES + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportStartSessionRecoveryTimer( + vmk_IscsiTransSession *sess); + +/* + *********************************************************************** + * vmk_IscsiTransportRegisterTransport-- */ /** + * + * \ingroup IscsiTransport + * \brief Register media driver transport interface with the iSCSI + * transport. + * + * \param[in] transport Transport object to be registered. + * + * \retval VMK_OK + * \retval VMK_NO_MEMORY + * \retval VMK_BAD_PARAM Not a valid transport object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportRegisterTransport( + vmk_IscsiTransTransport *transport); + +/* + *********************************************************************** + * vmk_IscsiTransportUnregisterTransport-- */ /** + * + * \ingroup IscsiTransport + * \brief Unregister the media driver transport interface. + * + * \param[in] transport Transport object to be registered. + * + * \retval VMK_OK + * \retval VMK_BUSY There are still some resources using this + * transport object. + * \retval VMK_BAD_PARAM Not a valid transport object. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportUnregisterTransport( + vmk_IscsiTransTransport *transport); + +/* + *********************************************************************** + * vmk_IscsiTransportLookupSession-- */ /** + * + * \ingroup IscsiTransport + * \brief Return session associated with Host, Channel and Target ID. + * + * \param[in] hostNum Host ID. + * \param[in] channelId Channel ID. + * \param[in] targetId Target ID. + * \param[out] session If found, pointer to session object is + * returned in this + * + * \retval VMK_OK Found a session for given Host, Channel and + * Target ID. + * \retval VMK_NOT_FOUND Unable to find a session for given Host + * Channel and target ID. + * \retval VMK_FAILURE Any other failure. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_IscsiTransportLookupSession( + vmk_int32 hostNum, + vmk_int32 channelId, + vmk_int32 targetId, + vmk_IscsiTransSession **session); + +#endif /* _VMKAPI_ISCSI_TRANSPORT_INCOMPAT_H */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp.h new file mode 100644 index 0000000..f1baab6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp.h @@ -0,0 +1,2002 @@ +/*************************************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * MPP */ /** + * \addtogroup Storage + * @{ + * \defgroup MPP Multi-Pathing Plugin Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MPP_H_ +#define _VMKAPI_MPP_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_heap.h" +#include "base/vmkapi_memory.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_revision.h" +#include "scsi/vmkapi_scsi.h" +#include "scsi/vmkapi_scsi_mgmt_types.h" +#include "scsi/vmkapi_scsi_ext.h" +#include "scsi/vmkapi_scsi_const.h" +#include "scsi/vmkapi_scsi_types.h" +#include "mpp/vmkapi_mpp_types.h" + +/** \cond never */ +#define VMK_SCSI_REVISION_MAJOR 1 +#define VMK_SCSI_REVISION_MINOR 0 +#define VMK_SCSI_REVISION_UPDATE 0 +#define VMK_SCSI_REVISION_PATCH_LEVEL 0 + +#define VMK_SCSI_REVISION VMK_REVISION_NUMBER(VMK_SCSI) +/** \endcond never */ + +/** \brief Max length of vendor name string including terminating nul. */ +#define VMK_SCSI_VENDOR_NAME_LENGTH (VMK_SCSI_INQUIRY_VENDOR_LENGTH + 1) + +//** \brief Max length of model name string including terminating nul. */ +#define VMK_SCSI_MODEL_NAME_LENGTH (VMK_SCSI_INQUIRY_MODEL_LENGTH + 1) + +/** \brief Default name used for unregistered devices */ +#define VMK_SCSI_UNREGISTERED_DEV_NAME "Unregistered Device" + +/** + * \brief Choices for probe rate for vmk_ScsiSetDeviceProbeRate. + */ +typedef enum { + /** \brief For normal operation (once/5 Sec.) */ + VMK_SCSI_PROBE_RATE_DEFAULT = 1, + /** \brief Selected when the device is in APD (once/Sec.) */ + VMK_SCSI_PROBE_RATE_FAST = 2 +} vmk_ScsiDeviceProbeRate; + +/** + * \brief Flags defined for vmk_ScsiSetDeviceProbeRate + */ +typedef enum { + /** \brief Revert to VMK_SCSI_PROBE_RATE_DEFAULT after next probe. */ + VMK_SCSI_ONE_PROBE_ONLY = 0x00000001 +} vmk_ScsiSetDeviceProbeRateOption; + + +/* + *********************************************************************** + * vmk_ScsiGetCachedPathStandardUID -- */ /** + * + * \ingroup MPP + * + * \brief Get the cached NAA, EUI, IQN, or TIO UID for physical path. + * + * The function returns the cached UID saved with the path as recorded + * during the last rescan (since rescans will cause UIDs of all paths + * to be verified). Success may be returned even if the path to the + * device is not working. Plugins can use this API function in the + * plugin's \em pathClaim entrypoint. + * + * \note This is a non-blocking call. + * + * \param[in] path Path to obtain cached UID for. + * \param[out] uid Obtained UID on success. + * + * \retval VMK_BAD_PARAM The passed in path or uid was null. + * \retval VMK_FAILURE The path does not have a standard UID. + * \retval VMK_OK Otherwise. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetCachedPathStandardUID( + vmk_ScsiPath *path, + vmk_ScsiUid *uid); + +/* + *********************************************************************** + * vmk_ScsiReadPathStandardUID -- */ /** + * + * \ingroup MPP + * + * \brief Read the NAA, EUI, IQN, or TIO UID for physical path from + * the device. + * + * This function reads the UID from the SCSI device logical unit + * that the path refers to and will return failure if the path is + * not working. This API function is useful to check whether the UID + * for a given path has changed; for example, in the plugin's + * \em pathProbe entrypoint. + * + * \note This will regenerate the UID saved with the path. + * \note This is a blocking call. + * + * \param[in] path Path to acquire standard UID for. + * \param[out] uid Obtained UID on success. + * + * \retval VMK_OK The UID was successfully obtained. + * \retval VMK_BAD_PARAM The passed in path or uid was null. + * \retval Other Failed to obtain the UID. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiReadPathStandardUID( + vmk_ScsiPath *path, + vmk_ScsiUid *uid); + +/* + *********************************************************************** + * vmk_ScsiVerifyPathUID -- */ /** + * + * \ingroup MPP + * + * \brief Re-read path standard or legacy UID and verify that + * it did not change. + * + * This function will reread the standard path UID from the device and + * compare it against the cached UID obtained during the last rescan. + * + * \note This is a blocking call. + * + * \param[in] path Path to check UID for. + * \param[out] uid UID read from disk. + * + * \retval VMK_OK UID was generated and did not change. + * \retval VMK_UID_CHANGED New UID was detected. + * \retval VMK_NO_CONNECT Path connectivity has failed. + * \retval VMK_BAD_PARAM vmkPath or uid is NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiVerifyPathUID( + vmk_ScsiPath *path, + vmk_ScsiUid *uid); + +/* + *********************************************************************** + * vmk_ScsiComputeUidFromEvpd83 -- */ /** + * + * \ingroup MPP + * + * \brief Get NAA, EUI, IQN, or TIO UID for physical device using + * caller supplied inquiry evpd page 0x83 data. + * + * This function will compute the UID from the passed in evpd83Buf. + * + * \note This is a non-blocking call. + * \note The size of the \em evpd83Buf has to to be at least as big as + * indicated by its 16-bit page length field. + * + * \param[in] vmkPath Path to acquire inquiry evpd page 0x83. + * \param[in] evpd83Buf Buffer to store evpd page 0x83 data. + * \param[out] uid UID. + * + * \retval VMK_OK UID was generated and did not change. + * \retval VMK_FAILURE No usable UID type (NAA/EUI/IQN/T10) + * was found in the passed buffer. + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiComputeUidFromEvpd83( + vmk_ScsiPath *vmkPath, + vmk_uint8 *evpd83Buf, + vmk_ScsiUid *uid); + +/* + *********************************************************************** + * vmk_ScsiGetPathTransportUID -- */ /** + * + * \ingroup MPP + * + * \brief Get Path Transport UID for the physical path. + * + * This function will obtain a pair of UIDs - one UID for the HBA + * endpoint and one for the target endpoint of the path. The UID is + * transport dependent - for FC each endpoint will be of the form + * WWNN:WWPN and for other transports each endpoint will be whatever + * unique identifier is used in place for traditional target IDs + * (e.g. for iSCSI each endpoint will be an IQN). + * + * \note This is a non-blocking call. + * + * \param[in] path Path to acquire transport uids for. + * \param[out] uid Obtained UIDs on success. + * + * \retval VMK_OK UID successfully obtained. + * \retval VMK_BAD_PARAM Either path or uid is NULL. + * \retval VMK_NOT_FOUND The UIDs could not be obtained. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetPathTransportUID( + vmk_ScsiPath *path, + vmk_ScsiPathUid *uid); + +/* + *********************************************************************** + * vmk_ScsiUIDsAreEqual -- */ /** + * + * \ingroup MPP + * + * \brief compare two uids and return true if they are equal. + * + * \note This is a non-blocking call. + * + * \param[in] uid1 First UID to compare. + * \param[in] uid2 Second UID to compare. + * + * \retval VMK_TRUE The UIDs are equal. + * \retval VMK_FALSE The UIDs are not equal. + * + *********************************************************************** + */ +vmk_Bool vmk_ScsiUIDsAreEqual( + vmk_ScsiUid *uid1, + vmk_ScsiUid *uid2); + +/* + *********************************************************************** + * vmk_ScsiAllocateDevice -- */ /** + * + * \ingroup MPP + * + * \brief Allocate a logical storage device data structure. + * + * This function will allocate space for a vmk_ScsiDevice structure. + * Obtaining this structure also ensure that the call to register + * the device will not fail due to max. number of devices already + * registered. Since the success of this call takes up a slot for a + * registered SCSI device it is important that such allocations are + * not left around idle, but are either fully registered or freed + * again as soon as possible through vmk_ScsiFreeDevice(). + * + * \see vmk_ScsiFreeDevice(). + * + * \see vmk_ScsiRegisterDevice(). + * + * \note This is a blocking call. + * \note The call also allocates and initializes various associated + * VMkernel private data structures. + * \note This call should only be used by MP plugins. + * + * \post The obtained device MUST be freed through vmk_ScsiFreeDevice(). + * + * \param[in] plugin Plugin allocating the device. + * + * \return Pointer to vmk_ScsiDevice or NULL if allocation fails or + * if max. number of SCSI devices are already registered. + * + *********************************************************************** + */ +vmk_ScsiDevice *vmk_ScsiAllocateDevice( + vmk_ScsiPlugin *plugin); + +/* + *********************************************************************** + * vmk_ScsiRegisterDevice -- */ /** + * + * \ingroup MPP + * + * \brief Add a logical storage device. + * + * This function will attempt to register a logical SCSI device with + * the VMkernel. There must be at least one UID passed in and precisely + * one of the UIDs must have \em VMK_SCSI_UID_FLAG_PRIMARY set in its + * \em uid->idFlags. The \em device->ops field must point to a structure + * filled with at least the \em startCommand, \em taskMgmt, \em open, + * \em close, \em probe, \em getInquiry, \em issueDumpCmd, + * \em isPseudoDevice and \em u.mpDeviceOps.getPathnames function + * pointers. + * + * \see vmk_ScsiDeviceUIDAdd(). + * vmk_ScsiUnregisterDevice(). + * + * \note This is a blocking call. + * \note The plugin will be pinned (unable to unload) until the device + * has been unregistered again + * \note This call should only be used by MP plugins. + * + * \pre The caller MUST have obtained the passed vmk_ScsiDevice + * through a call to vmk_ScsiAllocatedevice(). + * \pre The device MUST be ready to accept I/O when the call is made. + * + * \param[in] device Device to register. + * \param[in] uid Pointer to an array of numUids uids + * to register for this device. + * \param[in] numUids Number of UIDs in the **uid list. + * + * \retval VMK_OK Device successfully registered. + * \retval VMK_BAD_PARAM The value of numUids is less than 1, + * there is not exactly one uid marked + * with the VMK_SCSI_UID_FLAG_PRIMARY, + * the device->ops are not specified + * correctly, or same as + * vmk_ScsiDeviceUIDAdd(). + * \retval VMK_NOT_SUPPORTED The plugin controlling the device + * is not marked as + * VMK_SCSI_PLUIGN_TYPE_MULTIPATHING + * or same as vmk_ScsiDeviceUIDAdd(). + * \retval VMK_NOT_FOUND No paths are specified for the device. + * \retval VMK_EXISTS Same as vmk_ScsiDeviceUIDAdd(). + * \retval VMK_DUPLIATE_UID Same as vmk_ScsiDeviceUIDAdd(). + * \retval VMK_TOO_MANY_ELEMENTS Same as vmk_ScsiDeviceUIDAdd(). + * \retval VMK_FAILURE Could not determine the legacy UID + * for the device. + * \retval VMK_NO_CONNECT A path to the device is in the + * process of being removed. + * \retval VMK_TIMEOUT I/O command did not complete within + * the timeout time due to a transient + * errors. + * \retval VMK_ABORTED I/O command did not complete and + * was aborted. + * \retval VMK_BUSY I/O command did not complete because + * the device was busy or there was a + * race to register/unregister the same + * device with another thread. + * \retval VMK_RESERVATION_CONFLICT I/O command did not complete due + * to a SCSI reservation on the device. + * \retval VMK_STORAGE_RETRY_OPERATION I/O command did not complete + * due to a transient error. + * \retval VMK_HBA_ERROR I/O command did not complete due + * to an HBA or driver error. + * \retval VMK_IO_ERROR I/O command did not complete due + * to an unknown error. + * \retval VMK_NOT_SUPPORTED I/O command did not complete due + * to an unspecified error. + * \retval VMK_MEDIUM_NOT_FOUND I/O command did not complete on a + * removeable media device and media + * is not present. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiRegisterDevice( + vmk_ScsiDevice *device, + vmk_ScsiUid **uid, + vmk_int32 numUids); + +/* + *********************************************************************** + * vmk_ScsiUnregisterDevice -- */ /** + * + * \ingroup MPP + * + * \brief Remove a logical storage device. + * + * This function will wait for outstanding Task Management operations + * on the device to drain before finally unregistering the device. + * If the device is open by any world the call will fail. + * + * \see vmk_ScsiRegisterDevice(). + * \see vmkScsiFreeDevice(). + * + * \note This is a blocking call. + * \note The caller should not hold any semaphores. + * \note This call should only be used by MP plugins. + * + * \pre The device MUST have been successfully registered with a call + * to vmk_ScsiRegisterDevice(). + * + * \param[in] device Device to unregister. + * + * \retval VMK_OK Device successfully unregistered. + * \retval VMK_BUSY Device not unregistered as the device + * was busy. + * \retval VMK_BAD_PARAM Device has already been unregistered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiUnregisterDevice( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiFreeDevice -- */ /** + * + * \ingroup MPP + * + * \brief Free the storage associated with a logical storage device. + * + * This function will undo the work of vmk_ScsiAllocateDevice() and + * will both free the structure and also clean up some associated + * VMkernel internal structures. Among this is the freeing of the + * device "slot" that will limit the total number of allocated devices. + * It is therefore important that this function is used to free the + * vmk_ScsiDevice structure allocated through vmk_ScsiAllocateDevice(). + * + * \see vmk_ScsiUnregisterDevice(). + * \see vmk_ScsiAllocateDevice(). + * + * \note This is a blocking call. + * \note This call should only be used by MP plugins. + * + * \pre The device MUST have been unregistered (or never registered). + * + * \param[in] device Device to free. + * + *********************************************************************** + */ +void vmk_ScsiFreeDevice( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiSetDeviceState-- */ /** + * + * \ingroup MPP + * + * \brief Set current device state. + * + * This function allows a plugin to set the state of a device. The + * intent of this call is to allow the user to see the state of a + * device through the UI or CLI. + * + * \note This is a non-blocking call. + * \note No actions are currently taken by the PSA on changes to the + * device state. However this could change in a future release + * to add some events to notify upper layers (or VOB notifications) + * of device state changes. Decisions on whether to issue I/Os + * to the devices are NOT made on the basis of the device state. + * + * \param[in] device Device whose state should be set. + * \param[in] state The new state of the device. + * + *********************************************************************** + */ +void vmk_ScsiSetDeviceState( + vmk_ScsiDevice *device, + vmk_ScsiDeviceState state); + +/* + *********************************************************************** + * vmk_ScsiDeviceStateToString -- */ /** + * + * \ingroup MPP + * + * \brief Convert a device state into a human readable text string. + * + * \see vmk_ScsiSetDeviceState(). + * \see vmk_ScsiGetDeviceState(). + * + * \note This is a non-blocking call. + * + * \param[in] state Device state to convert to string. + * + * \return String with human readable representation of device state. + * + *********************************************************************** + */ +const char *vmk_ScsiDeviceStateToString( + vmk_ScsiDeviceState state); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceState -- */ /** + * + * \ingroup MPP + * + * \brief Get the current device state. + * + * \see vmk_ScsiSetDeviceState(). + * \see vmk_ScsiDeviceStateToString(). + * + * \note The purpose of having a common device state is to show + * consistent information to the user. Plugins may have command + * line tools that display among other things the plugin device + * state. The recommendation is to use vmk_ScsiGetDeviceState() + * and vmk_ScsiDeviceStateToString() to return consistent + * information. + * + * \note This is a non-blocking call. + * + * \param[in] device Device whose state to acquire. + * + * \return Device's state + * + *********************************************************************** + */ +vmk_ScsiDeviceState vmk_ScsiGetDeviceState( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceClass -- */ /** + * + * \ingroup MPP + * + * \brief Get the current device class. + * + * This function returns the device class of the device, which is + * mostly according to the SCSI spec, but a few unsupported types + * have been "overloaded" - VMK_IDE_CLASS_CDROM is a synonym for + * VMK_SCSI_CLASS_ASCA and VMK_IDE_CLASS_OTHER is a synonym for + * VMK_SCSI_CLASS_ASCB. + * + * \note This is a non-blocking call. + * + * \param[in] device Device whose class to acquire. + * + * \return Integer representing device class + * + *********************************************************************** + */ +vmk_ScsiDeviceClass vmk_ScsiGetDeviceClass( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceNumBlocks -- */ /** + * + * \ingroup MPP + * + * \brief Return the number of blocks as reported by Read Capacity. + * + * \note This is a non-blocking call. + * + * \param[in] device Device whose # of blocks to acquire. + * + * \return The number of blocks. + * + *********************************************************************** + */ +vmk_uint64 vmk_ScsiGetDeviceNumBlocks( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceBlockSize -- */ /** + * + * \ingroup MPP + * + * \brief Return the block size as reported by Read Capacity. + * + * \note This is a non-blocking call. + * + * \param[in] device Device whose block size to acquire. + * + * \return The block size used by the device. + * + *********************************************************************** + */ +vmk_uint32 vmk_ScsiGetDeviceBlockSize( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceMaxQDepth -- */ /** + * + * \ingroup MPP + * + * \brief Return the maximum number of I/Os queueable to the MPP by + * the framework. + * + * This function will get the queue depth of the logical device + * registered with the PSA layer and will be the maximum number of + * I/Os that is allowed to be outstanding to the logical device's + * owning MP plugin. + * + * \see vmk_ScsiSetDeviceMaxQDepth(). + * + * \note This is a non-blocking call. + * \note This is \b not the maximum queue depth on the physical device. + * \note You may see less I/Os queued on the logical device even when + * multiple VMs are very busy on a VMFS volume. This is due to + * the throttling mechanism in ESX that ensure fairness. + * + * \param[in] device Device to acquire max. queue depth for. + * + * \return Device's queue depth. + * + *********************************************************************** + */ +vmk_uint16 vmk_ScsiGetDeviceMaxQDepth( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiSetDeviceMaxQDepth -- */ /** + * + * \ingroup MPP + * + * \brief Set the maximum number of I/Os queuable to the MPP by + * the framework. + * + * This function will set the queue depth of the logical device + * registered with the PSA layer. It will be the maximum number of + * I/Os that is allowed to be outstanding on the logical device. + * A MPP plugin can use this to increase the number of I/Os if it + * needs to distribute them on many paths (load balancing). + * + * \see vmk_ScsiGetDeviceMaxQDepth(). + * + * \note This is a non-blocking call. + * \note This is \b not the maximum queue depth on the physical device. + * \note You may see less I/Os queued on the logical device even when + * multiple VMs are very busy on a VMFS volume. This is due to + * the throttling mechanism in ESX that ensure fairness. + * + * \param[in] device Device whose max queueing depth to set. + * \param[out] qDepth Depth to set. + * + * \retval VMK_OK The queue depth was successfully changed. + * \retval VMK_BAD_PARAM The qDepth parameter value was 0. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiSetDeviceMaxQDepth( + vmk_ScsiDevice *device, + vmk_uint16 qDepth); + +/* + *********************************************************************** + * vmk_ScsiSetDeviceProbeRate -- */ /** + * + * \ingroup MPP + * + * \brief Set a device's periodic path state update rate. + * + * This function can select one of two probe rates for a logical device. + * The fast probe rate would normally be requested in case of path + * failures to quickly get an update of how many paths are affected. + * + * \note This is a non-blocking call. + * \note The device should be probed at least as frequently as specified + * but may be probed more frequently than specified. + * \note This call should only be used by MP plugins. + * + * \param[in] vmkDevice Targeted device. + * \param[in] newProbeRate New probe rate ("DEFAULT" or "FAST"). + * \param[in] flags Specifies any options, such as + * VMK_SCSI_ONE_PROBE_ONLY. + * + * \retval VMK_OK Probe rate set successfully. + * \retval VMK_BAD_PARAM A new probe rate other than + * VMK_SCSI_PROBE_RATE_DEFAULT or VMK_SCSI_PROBE_RATE_FAST + * was requested. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiSetDeviceProbeRate( + vmk_ScsiDevice *vmkDevice, + vmk_ScsiDeviceProbeRate newProbeRate, + vmk_uint32 flags); + +/* + *********************************************************************** + * vmk_ScsiSwitchDeviceProbeRate -- */ /** + * + * \ingroup MPP + * + * \brief Set a device's periodic path state update rate and + * return the current probe rate settings. + * + * \note This is a non-blocking call. + * \note The device should be probed at least as frequently as + * specified but may be probed more frequently than specified. + * + * \param[in] vmkDevice Targeted device. + * \param[in] newProbeRate New probe rate + * ("DEFAULT" or "FAST"). + * \param[in] flags Options if any + * (i.e. VMK_SCSI_ONE_PROBE_ONLY). + * \param[out] currentProbeRate Probe rate prior to this call. + * \param[out] currentProbeRateFlags Probe flags prior to this call. + * + * \retval VMK_OK Probe rate set successfully. + * \retval VMK_BAD_PARAM A new probe rate other than + * VMK_SCSI_PROBE_RATE_DEFAULT or VMK_SCSI_PROBE_RATE_FAST + * was requested. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiSwitchDeviceProbeRate( + vmk_ScsiDevice *vmkDevice, + vmk_ScsiDeviceProbeRate newProbeRate, + vmk_ScsiSetDeviceProbeRateOption flags, + vmk_ScsiDeviceProbeRate *currentProbeRate, + vmk_ScsiSetDeviceProbeRateOption *currentProbeRateFlags); + +/* + *********************************************************************** + * vmk_ScsiGetDeviceName -- */ /** + * + * \ingroup MPP + * + * \brief Get the logical device's name. + * + * This function can be used to provide a consistent device name + * among logs from PSA and MP plugins. + * + * \note This is a non-blocking call. + * + * \param[in] device Device to acquire name for. + * + * \return The name of the device as a human readable string. + * + *********************************************************************** + */ +const char *vmk_ScsiGetDeviceName( + vmk_ScsiDevice *device); + +/* + *********************************************************************** + * vmk_ScsiDeviceUIDAdd -- */ /** + * + * \ingroup MPP + * + * \brief Add a UID to a device. + * + * Valid UIDs (vmk_ScsiUid.id) are nul-terminated C strings that + * may contain only the following characters: + * - '0' through '9' + * - 'a' through 'z' + * - 'A' through 'Z' + * - '_', ':', ',', '.' + * + * Valid UIDs should be persistent across power cycles, HBA + * reordering, and SAN reconfiguration. Additionally, a valid UID + * should be the same on all ESX hosts that can access the same + * physical storage. This function can only be called on a registered + * device. Only one UID of type Primary ID is permitted. + * + * \note This function can only be called for registered devices. + * \note This is a non-blocking call. + * \note This call should only be used by MP plugins. + * + * \param[in] vmkDevice Device to add uid to. + * \param[in] uidToAdd UID to add to device. + * + * \retval VMK_OK The UID was successfully added. + * \retval VMK_EXISTS The UID matches the uid of a + * different device. + * \retval VMK_BAD_PARAM The UID has invalid flags or is + * composed of disallowed characters. + * \retval VMK_DUPLICATE_UID The UID to be added to the device is + * already associated with the device. + * \retval VMK_TOO_MANY_ELEMENTS UID to be added is a primary UID and + * the device already has a primary UID. + * \retval VMK_NOT_SUPPORTED The specified device is unregistered. + * \retval VMK_NAME_TOO_LONG UID is too long (>128 bytes). + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiDeviceUIDAdd( + vmk_ScsiDevice *vmkDevice, + vmk_ScsiUid *uidToAdd); + +/* + *********************************************************************** + * vmk_ScsiDeviceUIDRemove -- */ /** + * + * \ingroup MPP + * + * \brief Remove a UID from a device. + * + * \see vmk_ScsiDeviceUIDAdd(). + * + * \note This is a non-blocking call. + * \note This call should only be used by MP plugins. + * + * \param[in] device Device to remove UID from. + * \param[in] uidToRemove UID to remove from device. + * + * \retval VMK_OK The UID was successfully removed. + * \retval VMK_READ_ONLY The UID is the primary uid or a legacy UID + * for a device and cannot be removed. + * \retval VMK_NOT_FOUND The UID is not associated with the device. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiDeviceUIDRemove( + vmk_ScsiDevice *device, + vmk_ScsiUid *uidToRemove); + +/* + *********************************************************************** + * vmk_ScsiGetPathState-- */ /** + * + * \ingroup MPP + * + * \brief Return current path state. + * + * This function returns the current path state. It does not block + * nor does it acquire another spin lock. So it is safe to call it + * while holding a spin lock without having to worry about blocking + * or lock ranking issues. + * + * \note This is a non-blocking call. + * + * \param[in] path Path to get state for. + * + * \return The state of the path. + * + *********************************************************************** + */ +vmk_ScsiPathState +vmk_ScsiGetPathState(vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiSetPathState-- */ /** + * + * \ingroup MPP + * + * \brief Set PSA framework current path state. + * + * This function may only be called by the MP Plugin that is + * managing the path. Other callers wishing to change a path's + * state should instead use vmk_ScsiSetPluginPathState(). This + * function exists so that an MP Plugin may notify the PSA + * framework of a path state change. vmk_ScsiSetPluginPathState() + * exists so that other callers can notify the MP Plugin of a + * path state change (with the expectation that the MP Plugin will + * duly call vmk_ScsiSetPathState() after doing any internal + * bookkeeping). + * + * \see vmk_ScsiGetPathState(). + * \see vmk_ScsiSetPluginPathState(). + * + * \note This is a non-blocking call. + * + * \param[in] plugin Plugin that owns the path. + * \param[in] path Path to set state on. + * \param[in] state State to set. + * + * \retval VMK_OK The path state was successfully set. + * \retval VMK_NO_PERMISSION The plugin is not the owner of the path. + * \retval VMK_BAD_PARAM The path state was invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiSetPathState( + vmk_ScsiPlugin *plugin, + vmk_ScsiPath *path, + vmk_ScsiPathState state); + +/* + *********************************************************************** + * vmk_ScsiSetPluginPathState-- */ /** + * + * \ingroup MPP + * + * \brief Set MP Plugin current path state. + * + * This function may only be called by non-MP Plugin callers. An + * MP Plugin wishing to change a path's state should instead use + * vmk_ScsiSetPathState(). This function exists so that + * non-MP Plugin callers can notify a plugin of a path state + * change. vmk_ScsiSetPluginState() exists so that an MP Plugin + * can notify the PSA framework of a path state change, with the + * expectation that the MP Plugin will duly call + * vmk_ScsiSetPathState() after its internal bookkeeping as a + * of vmk_ScsiSetPluginPathState(). The path state change is + * limited to admistrative change only to enable a disabled path + * and vice versa. + * + * \see vmk_ScsiSetPathState(). + * + * \note This is a blocking call. + * \note Only VMK_SCSI_PATH_STATE_{ON/OFF} are allowed. + * + * \param[in] path Path to set state on. + * \param[in] state State to set. + * + * \retval VMK_OK Path state was successfully set. + * \retval VMK_BAD_PARAM Invalid path state was passed. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiSetPluginPathState( + vmk_ScsiPath *path, + vmk_ScsiPathState state); + +/* + *********************************************************************** + * vmk_ScsiPathStateToString-- */ /** + * + * \ingroup MPP + * + * \brief Get a text string describing the current path state. + * + * \see vmk_ScsiGetPathState(). + * + * \note This is a non-blocking call. + * + * \param[in] state State to convert to string. + * + * \return Human-readable string describing the path state or + * "Unknown path state" in case an invalid path state is passed. + * + *********************************************************************** + */ +const char *vmk_ScsiPathStateToString( + vmk_ScsiPathState state); + +/* + *********************************************************************** + * vmk_ScsiGetPathLUN -- */ /** + * + * \ingroup MPP + * + * \brief Get path LUN. + * + * \note This is a non-blocking call. + * + * \param[in] path Path to acquire logical unit number. + * + * \return LUN for the given path. + * + *********************************************************************** + */ +vmk_int32 vmk_ScsiGetPathLUN( + vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiGetPathTarget -- */ /** + * + * \ingroup MPP + * + * \brief Get path target. + * + * \note This is the target ID as returned from the driver layer and + * in case of FC/iSCSI this is thus a logical mapping of the + * real target ID (which is a WWNN or IQN). + * \note This is a non-blocking call. + * + * \param[in] path Path to acquire target id for. + * + * \return Target ID for the given path. + * + *********************************************************************** + */ +vmk_int32 vmk_ScsiGetPathTarget( + vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiGetPathChannel -- */ /** + * + * \ingroup MPP + * + * \brief Get path Channel. + * + * \note This is a non-blocking call. + * + * \param[in] path Path to acquire channel number. + * + * \return Channel number for the given path. + * + *********************************************************************** + */ +vmk_int32 vmk_ScsiGetPathChannel( + vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiGetPathAdapter -- */ /** + * + * \ingroup MPP + * + * \brief Get path's Adapter name. + * + * \note This is a non-blocking call. + * + * \param[in] path Path to acquire adapter name for. + * + * \return Adapter name for the given path. + * + *********************************************************************** + */ +const char *vmk_ScsiGetPathAdapter( + vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiGetAdapterTransport -- */ /** + * + * \ingroup MPP + * + * \brief Get the adapter transport name. + * + * Get the adapter transport type (fc/iscsi/..) as a printable string. + * + * \note This is a non-blocking call. + * + * \param[in] adapName Adapter to acquire transport from. + * \param[out] transport Transport buffer. + * \param[in] transportLength Size of transport buffer. + * + * \retval VMK_OK Successfully obtained transport type. + * \retval VMK_NOT_FOUND The passed adapter could not be found. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetAdapterTransport( + const char *adapName, + char *transport, + vmk_uint32 transportLength); + +/* + *********************************************************************** + * vmk_ScsiGetAdapterPendingCmdInfo -- */ /** + * + * \ingroup MPP + * + * \brief Get the queued and active cmd counts for the adapter. + * + * Get the number of active and queued commands on the given adapter. + * + * \note This is a non-blocking call. + * \note This information is only a snapshot of the values and they + * may even have changed as the function returns. + * + * \param[in] adapterName Adapter name. + * \param[out] ioCmdCounts If this pointer is non-NULL the memory + * specified will be filled in with a + * snapshot of the adapter active / queued + * command count structure + * \em vmk_ScsiIOCmdCounts. + * \param[out] queueDepthPtr If the pointer is non-NULL the memory + * specified will be filled in with a + * snapshot of the adapter maximum queue + * depth. + * + * \retval VMK_OK Successfully obtained the pending cmd. info. + * \retval VMK_NOT_FOUND The passed adapter could not be found. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetAdapterPendingCmdInfo( + const char *adapterName, + vmk_ScsiIOCmdCounts *ioCmdCounts, + vmk_int32 *queueDepthPtr); + +/* + *********************************************************************** + * vmk_ScsiGetPathInquiry -- */ /** + * + * \ingroup MPP + * + * \brief Get the path's cached inquiry data. + * + * This function is used to obtain a copy of cached inquiry data for + * a path. The call can fail if the data has not yet been obtained. + * + * \note This is a non-blocking call. + * \note \em inqBuf may be NULL in which case only \em *pageLen is + * returned. This can be used to find the right buffer size up + * front and see whether the data is available at all. + * + * \param[in] path Scsi path from which we are retrieving + * inquiry data. + * \param[out] inqBuf Buffer to which inquiry data will be copied. + * \param[in] inqBufLen Size of the inquiry buffer in bytes. + * \param[in] vmkScsiPage Page type for the inquiry data to be + * copied into the inquiry buffer. + * \param[out] pageLen Optional actual page length based on page + * header. + * + * \retval VMK_OK Successfully obtained the inquiry data. + * \retval VMK_NOT_SUPPORTED The data was not yet available or the + * page type was invalid. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetPathInquiry( + vmk_ScsiPath *path, + vmk_uint8 *inqBuf, + vmk_uint32 inqBufLen, + vmk_ScsiInqType vmkScsiPage, + vmk_uint32 *pageLen); + +/* + *********************************************************************** + * vmk_ScsiGetPathVendor -- */ /** + * + * \ingroup MPP + * + * \brief Get the path's vendor from its cached inquiry data. + * + * This function will retrieve the vendor string from the cached + * inquiry data. + * + * \note This is a non-blocking call. + * \note The passed string buffer must have space for at least + * VMK_SCSI_VENDOR_NAME_LENGTH characters. + * + * \param[in] path SCSI path from which we are retrieving inq + * vendor. + * \param[out] vendor Buffer to which inquiry vendor will be copied. + * + *********************************************************************** + */ +void vmk_ScsiGetPathVendor( + vmk_ScsiPath *path, + char vendor[VMK_SCSI_VENDOR_NAME_LENGTH]); + +/* + *********************************************************************** + * vmk_ScsiGetPathModel -- */ /** + * + * \ingroup MPP + * + * \brief Get the path's model from its cached inquiry data. + * + * \note This is a non-blocking call. + * \note The passed string buffer must have space for at least + * VMK_SCSI_MODEL_NAME_LENGTH characters. + * + * \param[in] path Scsi path from which we are retrieving inquiry + * model. + * \param[out] model Buffer to which inquiry model will be copied. + * + * \return Human readable string with the inquiry data's model. + * + *********************************************************************** + */ +void vmk_ScsiGetPathModel( + vmk_ScsiPath *path, + char model[VMK_SCSI_MODEL_NAME_LENGTH]); + +/* + *********************************************************************** + * vmk_ScsiGetPathName -- */ /** + * + * \ingroup MPP + * + * \brief Get the current path name. + * + * \note This is a non-blocking call. + * \note The obtained string should never be modified/freed. + * + * \param[in] path Path whose name to acquire. + * + * \return Human readable string with the path's name. + * + *********************************************************************** + */ +const char *vmk_ScsiGetPathName( + vmk_ScsiPath *path); + +/* + *********************************************************************** + * vmk_ScsiGetPathInfo -- */ /** + * + * \ingroup MPP + * + * \brief Get the path's adapter/channel/target/lun info. + * + * \note This is a non-blocking call. + * + * \param[in] vmkPath Path to get info for. + * \param[out] adapterName Adapter name for the given path. + * \param[in] adapterNameSize Size of adapterName array in bytes. + * \param[out] channel Channel of the given path. + * \param[out] target Target id of the given path. + * \param[out] lun LUN id of the given path. + * + * \retval VMK_OK The path info was successfully obtained. + * \retval VMK_BAD_PARAM One of the input parameter(s) was NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetPathInfo( + vmk_ScsiPath *vmkPath, + char *adapterName, + int adapterNameSize, + vmk_uint32 *channel, + vmk_uint32 *target, + vmk_uint32 *lun); + +/* + *********************************************************************** + * vmk_ScsiGetPathPendingCmdInfo -- */ /** + * + * \ingroup MPP + * + * \brief Get the queued and active cmd counts for the path. + * + * \note This is a non-blocking call. + * \note This information is only a snapshot. + * + * \param[in] vmkPath Path to get info for. + * \param[out] ioCmdCounts If this is non-NULL the memory specified + * will be filled in with a snapshot of the + * path active / queued command count + * structure vmk_ScsiIOCmdCounts. + * \param[out] queueDepthPtr If this is is non-NULL the memory specified + * will be filled in with a snapshot of the + * path's maximum queue depth. + * + * \retval VMK_OK Successfully obtained the pending cmd. info. + * \retval VMK_BAD_PARAM The path was invalid or NULL. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiGetPathPendingCmdInfo( + vmk_ScsiPath *vmkPath, + vmk_ScsiIOCmdCounts *ioCmdCounts, + vmk_int32 *queueDepthPtr); + +/* + *********************************************************************** + * vmk_ScsiIssuePathTaskMgmt-- */ /** + * + * \ingroup MPP + * + * \brief Issue a task management command on the specified path. + * + * This function issues a task management command to abort/reset one + * or more outstanding I/Os. While a virtual reset will reset only + * commands for the given world a device/LUN reset will reset all I/O + * on the path. An abort is targeting a single I/O though that I/O may + * have been split into several smaller ones and can thus cause several + * I/Os to be aborted in the driver layer. + * + * Note that any I/Os aborted by the call will complete asynchronously + * and may not have completed when the call returns. The abort/reset is + * thus only meant as a mean to speed up completion of I/Os - normally + * by returning the I/O with an error (aborted/reset status). + * + * The \em taskMgmt structure is obtained from a prior call to + * vmk_ScsiInitTaskMgmt(). + * + * \note This is a blocking call. + * + * \param[in] path Path to issue task mgmt on. + * \param[in] taskMgmt Task management request to issue. + * + * \retval VMK_OK Task management call was successfull. This + * does \em not mean that everything will + * complete since there are natural races in the + * stack so retry the operation if things don't + * complete soon after this (in a second or two). + * \retval VMK_BAD_PARAM The task management type in the passed + * taskMgmt struct is invalid. + * \retval VMK_NO_MEMORY Memory needed to issue the command could + * not be allocated. + * \retval VMK_FAILURE Could not abort/reset for other reason, + * but the operation can be retried. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssuePathTaskMgmt( + vmk_ScsiPath *path, + vmk_ScsiTaskMgmt *taskMgmt); + +/* + *********************************************************************** + * vmk_ScsiCreateCommand -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Allocate and initialize a SCSI command. + * + * For performance reasons, this routine will initialize only + * some of the fields of the vmk_ScsiCommand (lba, lbc, + * dataDirection, cdb, cdblen will NOT be initialized). + * + * \note This is a non-blocking call. + * \note The command must be freed using vmk_ScsiDestroyCommand(). + * + * \return a pointer to vmk_ScsiCommand or NULL if allocation failed. + * + *********************************************************************** + */ +vmk_ScsiCommand *vmk_ScsiCreateCommand(void); + +/* + *********************************************************************** + * vmk_ScsiDestroyCommand -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Free a SCSI command. + * + * \note This is a non-blocking call. + * + * \pre The supplied command must have been allocated via + * vmk_ScsiCreateCommand() or one of the utility + * vmk_ScsiCreateXXXCommand() functions. + * command->sgArray must be NULL. (the implication is that if + * this field was previously set, caller has vmk_SgFree()'d it). + * + * \param[in] command Command to destroy. + * + *********************************************************************** + */ +void vmk_ScsiDestroyCommand(vmk_ScsiCommand *command); + +/* + *********************************************************************** + * vmk_ScsiCreateInqCommand -- */ /** + * + * \ingroup MPP + * + * \brief Allocate and initialize a SCSI inquiry command. + * + * \note This is a non-blocking call. + * \note The command must be freed using vmk_ScsiDestroyCommand(). + * + * \return a pointer to vmk_ScsiCommand or NULL if allocation failed. + * + *********************************************************************** + */ +vmk_ScsiCommand * +vmk_ScsiCreateInqCommand( + vmk_Bool evpd, + vmk_uint8 evpdPage, + vmk_uint32 minLen, + vmk_uint32 maxLen); + +/* + *********************************************************************** + * vmk_ScsiCreateTURCommand -- */ /** + * + * \ingroup MPP + * + * \brief Allocate and initialize a SCSI test unit ready command. + * + * \note This is a non-blocking call. + * \note The command must be freed using vmk_ScsiDestroyCommand(). + * + * \return a pointer to vmk_ScsiCommand or NULL if allocation failed. + * + *********************************************************************** + */ +vmk_ScsiCommand *vmk_ScsiCreateTURCommand(void); + + +/* + *********************************************************************** + * vmk_ScsiGetNextDeviceCommand -- */ /** + * + * \ingroup MPP + * + * \brief Get the next command for a logical device from the IO + * scheduler. + * + * This function is meant to be used from within an MPP in its + * \em startCommand entry point. This should be called in a loop since + * the scheduler will automatically stop when enough I/O has been + * queued (e.g. the PSA queues may still hold I/Os, but due to max. + * device queue depth or throttling no more I/Os will be issued). + * + * \note This is a non-blocking call. + * \note This call should only be used by MP plugins. + * + * \pre The caller should not hold any spinlocks. + * \pre The caller should have acquired any needed resources that need + * to be tied to the I/O up front as I/Os cannot be returned to + * the device queue again. + * + * \param[in] vmkDev Device for which to get the next command. + * + * \return Pointer to a SCSI command or NULL if there are no more + * commands to send at this time. + * In that case, SCSI will invoke the plugin's \em start() entry + * point again when the scheduler wants to issue I/Os again. + * + *********************************************************************** + */ +vmk_ScsiCommand *vmk_ScsiGetNextDeviceCommand(vmk_ScsiDevice *vmkDev); + +/* + *********************************************************************** + * vmk_ScsiDeviceFlushAPDCommands -- */ /** + * + * \ingroup MPP + * + * \brief Scan the device's scheduling queues for commands tagged with + * VMK_SCSI_COMMAND_FLAGS_NO_CONNECT_IF_APD and complete them + * with NO_CONNECT now. + * + * \param[in] vmkDev The target SCSI device + * + *********************************************************************** + */ +void vmk_ScsiDeviceFlushAPDCommands(vmk_ScsiDevice *vmkDev); + +/* + *********************************************************************** + * vmk_ScsiIssueAsyncPathCommand -- */ /** + * + * \ingroup MPP + * + * \brief Issue a command on the specified path. + * + * This function issues a SCSI command on a specific path. The command + * will complete asynchronously at a later point using the command's + * \em done() completion callback. + * + * \note This is a non-blocking call. + * + * \pre The caller should not hold any spinlocks. + * + * \param[in] path Path to issue command to. + * \param[in] command Command to issue on path. + * + * \retval VMK_OK Successfully issued the command. + * \retval VMK_NO_CONNECT Path is in process of being removed. + * \retval VMK_NO_MEMORY Unable to allocate memory for additional + * resources to be associated with command. + * \retval VMK_TIMEOUT The command had a timeout set and the + * timeout time had already been passed when + * the command was to be issued. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssueAsyncPathCommand( + vmk_ScsiPath *path, + vmk_ScsiCommand *command); + +/* + *********************************************************************** + * vmk_ScsiIssueSyncPathCommand -- */ /** + * + * \ingroup MPP + * + * \brief Issue a synchronous command on the specified path. + * + * This function issues a command on a specific path and waits for + * the command to complete before returning. + * + * \see vmk_ScsiIssueSyncPathCommandWithData(). + * \see vmk_ScsiIssueSyncPathCommandWithRetries(). + * + * \note This is a blocking call. + * \note The call specifies the buffer to use for data transfer (if + * needed) using \em command->sgArray. + * \note The calling world sleeps until the command completes. + * + * \pre The caller should not hold any spinlock. + * + * \param[in] path Path to issue command to. + * \param[in] command Command to issue on path. + * + * \retval VMK_OK The command was issued successfully and + * the command's status is valid. + * \retval VMK_NO_CONNECT Path is in process of being removed + * \retval VMK_NO_MEMORY Unable to allocate memory for additional + * resources associated with command. + * \retval VMK_TIMEOUT The command had a timeout set and was + * already timed when it was to be issued. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssueSyncPathCommand( + vmk_ScsiPath *path, + vmk_ScsiCommand *command); + +/* + *********************************************************************** + * vmk_ScsiIssueSyncPathCommandWithData -- */ /** + * + * \ingroup MPP + * + * \brief Issue a synchronous command on the specified path. + * + * This function issues a command on a specific path and waits for + * the command to complete before returning. The caller can specify the + * buffer to use for data transfer using the \em data and \em dataLen + * parameters. The passed data buffer is used to create an sgArray + * for the command, so the \em command->sgArray must be NULL. + * + * \see vmk_ScsiIssueSyncPathCommand(). + * \see vmk_ScsiIssueSyncPathCommandWithRetries(). + * + * \note This is a blocking call. + * \note The calling world sleeps until the command completes. + * + * \pre The caller should not hold any spinlock. + * \pre The \em command->sgArray must be NULL. + * + * \param[in] path Path to issue command to. + * \param[in] command Command to issue on path. + * \param[in,out] data Data buffer. + * \param[in] dataLen Length of data buffer. + * + * \retval VMK_OK The command was issued successfully and + * the command's status is valid. + * \retval VMK_NO_CONNECT Path is in process of being removed. + * \retval VMK_NO_MEMORY Unable to allocate memory for additional + * resources associated with command. + * \retval VMK_TIMEOUT The command had a timeout set and was + * already timed when it was to be issued. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssueSyncPathCommandWithData( + vmk_ScsiPath *path, + vmk_ScsiCommand *command, + void *data, + vmk_uint32 dataLen); + +/* + *********************************************************************** + * vmk_ScsiIssueSyncPathCommandWithRetries -- */ /** + * + * \ingroup MPP + * + * \brief Issue a synchronous command on the specified path. + * + * This function issues a command on a specific path and waits for + * the command to complete before returning. The caller can specify + * the buffer to use for any data transfer using either the data and + * dataLen parameters or \em scsiCmd->sgArray, but not both. + * + * The issued command can complete with the errors listed below in + * the completionStatus parameter. + * - VMK_MEDIUM_NOT_FOUND the device returned a medium not + present error. + * - VMK_TIMEOUT the command timed out. + * - VMK_ABORTED the command was aborted. + * - VMK_NO_CONNECT the path is not connected. + * - VMK_HBA_ERROR the device driver returned an non-retriable + * error like data underrun. + * + * The issued command can also complete with the transient errors + * listed below. + * + * Before these errors are returned in the completionStatus + * parameter, the command will be retried a number of times. + * - VMK_RESERVATION_CONFLICT the device is reserved. + * - VMK_BUSY the device returned a busy status. + * - VMK_NO_MEMORY the system is out of memory. + * - VMK_STORAGE_RETRY_OPERATION the command failed with: + * - A check condition of power on/reset or unit attention. + * - A check condition with a sense key of aborted cmd. + * - A check condition with a sense key of not ready/becoming + * ready. + * - A host error status of retry. + * - The cmd was specified with a timeout value and it was + * terminated with an abort/reset prior to the expiration of + * the timeout value. + * + * \see vmk_ScsiIssueSyncPathCommand(). + * \see vmk_ScsiIssueSyncPathCommandWithData(). + * + * \note This is a blocking call. + * \note The calling world sleeps until the command completes. + * + * \param[in] path The path the cmd is to be issued to. + * \param[in] command Command to be issued. + * \param[in] data Read/write data associated with + * the command. + * \param[in] dataLen Length of the read/write data + * associated with the command. + * \param[out] completionStatus Completion status of the command. + * The completion status is only valid + * if this function returns VMK_OK. + * + * \retval VMK_OK The command was issued successfully and + * the command's status is valid. + * \retval VMK_NO_CONNECT Path is in process of being removed. + * \retval VMK_NO_MEMORY Unable to allocate memory for additional + * resources associated with command. + * \retval VMK_TIMEOUT The command had a timeout set and was + * already timed when it was to be issued. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssueSyncPathCommandWithRetries( + vmk_ScsiPath *path, + vmk_ScsiCommand *command, + vmk_uint8 *data, + vmk_uint32 dataLen, + VMK_ReturnStatus *completionStatus); + +/* + *********************************************************************** + * vmk_ScsiIssueSyncDumpCommand -- */ /** + * + * \ingroup MPP + * + * \brief Issue a dump command to a path during a system core dump. + * + * This function issues a dump command on the given path and + * busywaits until the command completes. It is meant for an MP plugin + * to call this from it's device->dumpCommand entry point. + * + * \note This is a blocking call. + * + * \param[in] path Path to issue command to. + * \param[in] command Command to issue on path. + * + * \retval VMK_OK Dump command was issued successfully and + * the command's status is valid. + * \retval VMK_FAILURE The adapter backing the path is not enabled. + * \retval VMK_TIMEOUT Command timed out and should NOT be retried. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiIssueSyncDumpCommand( + vmk_ScsiPath *path, + vmk_ScsiCommand *command); + +/* + *********************************************************************** + * vmk_ScsiIssueSyncFilterCommandWithRetries -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Issue a synchronous command on a device. + * + * This function issues a command on the device on behalf of + * the Filter or VAAI plugin and waits for the command to complete + * before returning. The device is opened before command is issued, + * and is closed after the command completes. The caller can specify + * the buffer to use for any data transfer using either the data and + * dataLen parameters or vmkCmd->sgArray, but not both. + * + * The command gets retried for basic low level failures such + * as device busy, queue full, and some check conditions. + * + * \note Only Filters and VAAI plugins can use this API. + * \note This is a blocking call. + * \note The calling world sleeps until the command completes. + * + * \param[in] vmkPlugin Issuing plugin. + * Has to be Filter or VAAI type. + * \param[in] vmkDevice The device the cmd is to be issued to. + * \param[in] vmkCmd Command to be issued. + * \param[in] data Read/write data associated with + * the command. + * \param[in] dataLen Length of the read/write data + * associated with the command, + * or NULL if vmkCmd->sgArray is used. + * + * \return The IO issue status + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiIssueSyncFilterCommandWithRetries( + vmk_ScsiPlugin *vmkPlugin, + struct vmk_ScsiDevice *vmkDevice, + vmk_ScsiCommand *vmkCmd, + vmk_uint8 *data, + vmk_int32 dataLen); + +/* + *********************************************************************** + * vmk_ScsiSchedCommandCompletion -- */ /** + * + * \ingroup MPP + * + * \brief Schedules a non-blocking context to complete the command. + * + * This function schedules a non-blocking context to complete a + * command. The intent is to use this from the issuing path where + * a command cannot be completed directly since that could lead to + * stack exhaustion due to recursive calls to the issuing path from + * the completion path. + * + * \note This is a non-blocking call. + * + * \param[in] command The cmd to complete. + * + *********************************************************************** + */ +void vmk_ScsiSchedCommandCompletion( + vmk_ScsiCommand *command); + +/* + *********************************************************************** + * vmk_ScsiRegisterEventHandler -- */ /** + * + * \ingroup MPP + * + * \brief Add an Event Handler for the specific masked event types + * on the specified adapter. + * + * This function registers a handler that will be called as certain + * events on the passed adapter occur. + * + * \see vmk_ScsiAdapterEvents. + * \see vmk_ScsiUnRegisterEventHandler(). + * + * \note This is a non-blocking call. + * \note When the callback is called, it should not grab any locks + * below minor rank 7, major rank SP_RANK_SCSI. + * + * \param[in] adapterName Adapter name to register callback for. + * \param[in] mask Events to be notified of as a bit mask. + * \param[in] handlerCbk Callback to be called when an event + * occurs. + * + * \retval VMK_OK Event handler successfully registered. + * \retval VMK_INVALID_ADAPTER The passed adapter does not exist. + * \retval VMK_NO_MEMORY Failed to allocate memory for event. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiRegisterEventHandler(const char *adapterName, vmk_uint32 mask, + vmk_EventHandlerCbk handlerCbk); + +/* + *********************************************************************** + * vmk_ScsiUnRegisterEventHandler -- */ /** + * + * \ingroup MPP + * + * \brief Remove an Event Handler for the specific masked event types + * on the specified adapter. + * + * This function unregisters an event handler earlier registered by + * vmk_ScsiRegisterEventHandler. All arguments need to match those that + * were used to register the handler in order for the call to succeed. + * + * \see vmk_ScsiRegisterEventHandler(). + * + * \note This is a non-blocking call. + * + * \param[in] adapterName Name of the adapter to unregister for events. + * \param[in] mask Event bit mask to unregister. + * \param[in] handlerCbk Event callback to be unregistered. + * + * \retval VMK_OK Event handler successfully unregistered. + * \retval VMK_INVALID_ADAPTER The passed adapter does not exist. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiUnRegisterEventHandler(const char *adapterName, vmk_uint32 mask, + vmk_EventHandlerCbk handlerCbk); + +/* + *********************************************************************** + * vmk_ScsiAllocatePlugin -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Allocate a plugin data structure. + * + * This function will allocate a plugin structure for use when + * registering the plugin with PSA. The structure should be freed + * with vmk_ScsiFreePlugin() again when it is no longer registered. + * + * \see vmk_ScsiRegisterPlugin(). + * \see vmk_ScsiUnregisterPlugin(). + * \see vmk_ScsiFreePlugin(). + * + * \note This is a blocking call. + * + * \post The plugin MUST be freed through vmk_ScsiFreePlugin(). + * + * \param[in] heapID Heap id to allocate memory from. + * \param[in] pluginName Name of allocating plugin. + * + * \return Pointer to vmk_ScsiPlugin structure or NULL if memory + * could not be allocated for the structure. + * + *********************************************************************** + */ +vmk_ScsiPlugin *vmk_ScsiAllocatePlugin( + vmk_HeapID heapID, char *pluginName); + +/* + *********************************************************************** + * vmk_ScsiFreePlugin -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Free a plugin data structure allocated by + * vmk_ScsiAllocatePlugin(). + * + * \see vmk_ScsiAllocatePlugin(). + * \see vmk_ScsiUnregisterPlugin(). + * + * \note This is a blocking call. + * + * \pre The plugin structure must first be unregistered with PSA (or + * never have been registered). + * + * \param[in] plugin Plugin to free. + * + *********************************************************************** + */ +void vmk_ScsiFreePlugin( + vmk_ScsiPlugin *plugin); + +/* + *********************************************************************** + * vmk_ScsiRegisterPlugin -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Register a plugin with SCSI. + * + * This function will register a plugin with PSA. + * + * \see vmk_ScsiAllocatePlugin(). + * \see vmk_ScsiUnregisterPlugin(). + * + * \note This is a blocking call. + * + * \pre The vmk_ScsiPlugin structure MUST have been allocated through + * vmk_ScsiAllocatePlugin(). + * + * \param[in] plugin Plugin to register. + * + * \retval VKM_OK Successfully registered the plugin. + * \retval VMK_EXISTS The plugin is already registered with PSA. + * \retval VMK_NOT_SUPPORTED The API revision the plugin is compiled + * for is incompatible with the ESX server. + * \retval VMK_BAD_PARAM The plugin's type is invalid/unsupported + * or some required entry points are not set. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiRegisterPlugin( + vmk_ScsiPlugin *plugin); + +/* + *********************************************************************** + * vmk_ScsiUnregisterPlugin -- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Unregister a plugin previously registered via + * vmk_ScsiRegisterPlugin(). + * + * This function is used to unregister a plugin that has previously + * been successfully registered with PSA. Before a plugin can be + * unregistered it must not have any paths claimed or devices + * registered. + * The plugin must also have a state of VMK_SCSI_PLUGIN_STATE_DISABLED + * when this function is called, which has to be set through + * vmkScsiSetPluginState() - the latter will ensure that no claim + * operations will be passed to the plugin. + * + * \see vmk_ScsiFreePlugin(). + * \see vmk_ScsiSetPluginState(). + * + * \note This is a blocking call. + * + * \pre The plugin should have released all its SCSI resources (paths, + * devices, ...). + * \pre The plugin state must be VMK_SCSI_PLUGIN_STATE_DISABLED. + * + * \param[in] plugin Plugin to unregister. + * + * \retval VMK_OK Successfully unregistered the plugin. + * \retval VMK_BAD_PARAM The plugin was already not registered. + * \retval VMK_BUSY The plugin state was not set to disabled. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiUnregisterPlugin( + vmk_ScsiPlugin *plugin); + +/* + *********************************************************************** + * vmk_ScsiSetPluginState-- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Set the current state of the plugin. + * + * This function sets the plugin state to one of the possible values + * defined by the vmk_ScsiPluginState enum. The plugin will normally + * operate in ENABLED mode and when the \em pathClaimBegin entry point + * is called the plugin should (temporarily) set it to CLAIM_PATHS and + * then set it back to ENABLED when the \em pathClaimEnd entry point is + * later invoked. Lastly it should be set to DISABLED before the + * plugin is finally unregistered. + * + * \note This is a non-blocking call. + * + * \param[in] plugin Plugin to set state to. + * \param[in] state New state to set. + * + *********************************************************************** + */ +void vmk_ScsiSetPluginState( + vmk_ScsiPlugin *plugin, + vmk_ScsiPluginState state); + +/* + *********************************************************************** + * vmk_ScsiGetPluginState-- */ /** + * + * \ingroup PSA_PLUGIN + * + * \brief Get the current state of the plugin. + * + * \see vmk_ScsiSetPluginState(). + * + * \note This is a non-blocking call. + * + * \param[in] plugin Plugin to get state from. + * + *********************************************************************** + */ +vmk_ScsiPluginState vmk_ScsiGetPluginState( + vmk_ScsiPlugin *plugin); + +/* + *********************************************************************** + * vmk_ScsiIncReserveGeneration -- */ /** + * + * \ingroup MPP + * + * \brief Increment the reservation generation count of the device. + * + * This function is used to tell the PSA layer that a reservation was + * broken/cleared by the MP plugin and thus PSA should fail any + * reservation sensitive transactions using the previous generation. + * + * The intent is that an MP plugin calls this if it has to do a failover + * while a SCSI-2 reservation is held on the device and thus has to + * force a LU reset on the new path (or if it has to do a LU reset for + * any other reason - or invokes/knows about any other operation that + * will clear or has cleared the held reservation). + * + * \note This is a non-blocking call. + * \note This call should only be used by MP plugins. + * + * \param[in] vmkDevice Device whose reservation generation to bump. + * + *********************************************************************** + */ +void +vmk_ScsiIncReserveGeneration(vmk_ScsiDevice *vmkDevice); + +/* + *********************************************************************** + * vmk_ScsiCommandMaxCommands -- */ /** + * + * \ingroup MPP + * + * \brief Maximum outstanding SCSI commands + * + * This returns the maximum number of SCSI commands that the VMkernel + * SCSI command slab allocator supports. These many SCSI commands can + * be outstanding in the ESX kernel at any time. + * + * Any slab in a plugin, that is created for the purpose of allocating + * any per-command plugin data structures, should be sized per this, to + * ensure that at any time we have enough plugin objects for all the + * SCSI commands. + * + *********************************************************************** + */ +vmk_uint32 +vmk_ScsiCommandMaxCommands(void); + +/* + *********************************************************************** + * vmk_ScsiCommandMaxFree -- */ /** + * + * \ingroup MPP + * + * \brief Maximum idle SCSI commands + * + * This returns the maximum number of SCSI commands that the SCSI command + * allocator will keep in its cache for fast allocation. Any more freed + * SCSI commands are freed to the slab heap, for better memory utilization. + * + * This should be used by plugins as a good guidance value while creating + * their own slabs for any per-command object allocation. + * + *********************************************************************** + */ +vmk_uint32 +vmk_ScsiCommandMaxFree(void); + +#endif /* _VMKAPI_MPP_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp_types.h new file mode 100644 index 0000000..5cacb96 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/mpp/vmkapi_mpp_types.h @@ -0,0 +1,704 @@ +/*************************************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * PSA_PLUGIN SCSI Plugin API */ /** + * \addtogroup Storage + * @{ + * \defgroup PSA_PLUGIN SCSI Plugin Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_MPP_TYPES_H_ +#define _VMKAPI_MPP_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_const.h" +#include "scsi/vmkapi_scsi_types.h" + +/** + * \brief Private data container for SCSI path + */ + +typedef struct vmk_ScsiPath { + /** \brief claiming plugin's priv data */ + void *pluginPrivateData; +} vmk_ScsiPath; + +/** + * \brief SCSI plugin type. + */ +typedef enum { + VMK_SCSI_PLUGIN_TYPE_INVALID, + VMK_SCSI_PLUGIN_TYPE_MULTIPATHING, + VMK_SCSI_PLUGIN_TYPE_FILTER, /* Requires incompatible APIs */ + VMK_SCSI_PLUGIN_TYPE_VAAI, +#define VMK_SCSI_MAX_PLUGIN_TYPE (VMK_SCSI_PLUGIN_TYPE_VAAI) +} vmk_ScsiPluginType; + +/** + * \brief SCSI plugin priority as expressed by rank + */ +typedef enum { + VMK_SCSI_PLUGIN_PRIORITY_UNKNOWN = 0, +#define VMK_SCSI_PLUGIN_PRIORITY_SIMPLE (VMK_SCSI_PLUGIN_PRIORITY_HIGHEST) + VMK_SCSI_PLUGIN_PRIORITY_HIGHEST = 1, + VMK_SCSI_PLUGIN_PRIORITY_VIRUSSCAN = 0x20000000, + VMK_SCSI_PLUGIN_PRIORITY_VAAI = 0x40000000, + VMK_SCSI_PLUGIN_PRIORITY_DEDUPLICATION = 0x60000000, + VMK_SCSI_PLUGIN_PRIORITY_COMPRESSION = 0x80000000, + VMK_SCSI_PLUGIN_PRIORITY_ENCRYPTION = 0xa0000000, + VMK_SCSI_PLUGIN_PRIORITY_REPLICATION = 0xc0000000, + VMK_SCSI_PLUGIN_PRIORITY_LOWEST = 0xffffffff +} vmk_ScsiPluginPriority; + +/** \cond nodoc */ +typedef struct vmk_ScsiDevice vmk_ScsiDevice; +/** \endcond */ + +typedef enum vmk_ScsiPluginStatelogFlag { + VMK_SCSI_PLUGIN_STATELOG_GLOBALSTATE = 0x00000001, + VMK_SCSI_PLUGIN_STATE_LOG_CRASHDUMP = 0x00000002 +} vmk_ScsiPluginStatelogFlag; + +#define VMK_SCSI_UID_MAX_ID_LEN 256 + +/** + * \brief data for ioctl on SCSI plugin + */ +typedef vmk_uint32 vmk_ScsiPluginIoctl; + +/** + * \brief Ioctl data argument encapsulating every optional argument + * that can be passed to vmk_ScsiPlugin->pluginIoctl() + */ +typedef union vmk_ScsiPluginIoctlData { + /** \brief plugin type specific union */ + union { + /** \brief reserved */ + vmk_uint8 reserved[128]; + } u; +} vmk_ScsiPluginIoctlData; + + +struct vmk_ScsiPlugin; + +/** + *********************************************************************** + * */ /** + * \brief Multipathing plugin vmk_ScsiPlugin specific data & operations. + * + * vmk_ScsiPlugin data for plugin type VMK_SCSI_PLUGIN_TYPE_MULTIPATHING + * + *********************************************************************** + */ +typedef struct vmk_ScsiMPPluginSpecific { + /** + * \brief Tell the plugin we're about to start offering it paths + * + * A series of pathClaim calls is always preceded by a + * pathClaimBegin call. + */ + VMK_ReturnStatus (*pathClaimBegin)(struct vmk_ScsiPlugin *plugin); + /** + * \brief Offer a path to the plugin for claiming + * + * Give the plugin a chance to claim a path. The plugin is the + * owner of the path for the duration of the call; to retain + * ownership of the path beyond that call, the plugin must return + * VMK_OK and set claimed to VMK_TRUE. + * + * If an error occurs that prevents the plugin from claiming the + * path (e.g. out of memory, IO error, ...) it should return a non + * VMK_OK status to let SCSI know that a problem occured and + * that it should skip that path. + * The plugin can issue IOs on the path, change its state, sleep, + * ... + * If it decides not to claim the path, the plugin must drain all + * the IOs it has issued to the path before returning. + * + * A series of pathClaim calls is always preceded by a + * pathClaimBegin call and followed by a pathClaimEnd call. + */ + VMK_ReturnStatus (*pathClaim)(vmk_ScsiPath *path, + vmk_Bool *claimed); + /** + * \brief Ask the plugin to unclaim a path + * + * Tell the plugin to unclaim the specified path. + * The plugin can perform blocking tasks before returning. + * If the plugin successfully unclaims the path, then this path + * is moved to the "DEAD" state. + */ + VMK_ReturnStatus (*pathUnclaim)(vmk_ScsiPath *path); + /** + * \brief Tell the plugin we're done offering it paths + * + * A series of pathClaim calls is always terminated by a + * pathClaimEnd call. The PSA framework serializes this call and will + * not call into this entrypoint from more than a single world + * simultaneously. Paths can be in a dead state when they are first + * claimed, so a probe OR other path state update is needed during this + * call. + */ + VMK_ReturnStatus (*pathClaimEnd)(struct vmk_ScsiPlugin *plugin); + /** + * \brief Probe the path; update its current state + * + * Issue a probe IO and update the current state of the path. + * The function blocks until the state of the path has been updated + */ + VMK_ReturnStatus (*pathProbe)(vmk_ScsiPath *path); + /** + * \brief Set a path's state (on or off only) + * + * Turn the path on or off per administrator action, or else mark the + * underlying adapter driver is informing the plugin that a path is dead. + * An MP Plugin should notify the PSA framework if a path state has changed + * via vmk_ScsiSetPathState() after it has performed any necessary internal + * bookkeeping. + */ + VMK_ReturnStatus (*pathSetState)(vmk_ScsiPath *path, + vmk_ScsiPathState state); + /** + * \brief Get device name associated with a path + * + * On successful completion of this routine the MP plugin is expected to + * return the device UID in the deviceName. The device UID string must + * be NULL terminated. + * If the path is not claimed by the plugin then an error status of + * of VMK_FAILURE has to be returned by the plugin. + * If the device corresponding to the path has not been registered with + * the PSA framework then an error status of VMK_NOT_FOUND has to be + * returned by the plugin. + * PSA will return these errors to the callers of this routine. + */ + VMK_ReturnStatus (*pathGetDeviceName)(vmk_ScsiPath *path, + char deviceName[VMK_SCSI_UID_MAX_ID_LEN]); +} vmk_ScsiMPPluginSpecific; + +/* + * \brief VAAI-specific command completion status + */ +typedef enum { + /** + * \brief No VAAI specific status + */ + VMK_SCSI_VAAI_CMD_STATUS_OK, + /** + * \brief VAAI command failed due to VAAI Queue being full. + * + * Retry command after a delay. + */ + VMK_SCSI_VAAI_CMD_STATUS_QUEUE_FULL, + /** + * \brief Thin Provisioned device is busy while growing. + * + * Retry command after a delay. + * Not currently used. + */ + VMK_SCSI_VAAI_CMD_STATUS_BUSY_GROWING, + /** + * \brief Thin Provisioned device is at soft quota. + * + * Not currently used. + */ + VMK_SCSI_VAAI_CMD_STATUS_ATQUOTA, + /** + * \brief Thin Provisioned device is out of space. + * + * Not currently used. + */ + VMK_SCSI_VAAI_CMD_STATUS_NOSPACE, +} vmk_ScsiVAAIPCmdStatus; + +/** + *********************************************************************** + * */ /** + * \brief VAAI plugin vmk_ScsiPlugin specific data & operations. + * + * vmk_ScsiPlugin data for plugin type VMK_SCSI_PLUGIN_TYPE_VAAI. + * + *********************************************************************** + */ +typedef struct vmk_ScsiVAAIPluginSpecific { + /** + * \brief Offer a device to the plugin for claiming + * + * Give the plugin a chance to claim a device. The plugin is the + * owner of the device for the duration of the call; To retain + * ownership of the device beyond that call, the plugin must return + * VMK_OK. + * + * If it decides not to claim the device, the plugin must drain all + * the IOs it has issued to the device and return a failure code. + */ + VMK_ReturnStatus (*claim)(vmk_ScsiDevice *device); + /** + * \brief Tell the plugin to unclaim a device + * + * Tell the plugin to try and unclaim the specified device. + * The plugin can perform blocking tasks before returning. + */ + void (*unclaim)(vmk_ScsiDevice *device); + /** + * \brief Initialize vendor cloneblocks command + * + * Initialize vmkCmd with a vendor specific cdb necessary for + * initiating a clone of lbc blocks from srcDev beginning + * at srcLba to dstDev beginning at dstLba. + * This function just needs to initialize vmkCmd, the caller + * is responsible for issuing the command to the device. + * The command populated by this call will be issued to + * either prefIssueDev, or the value of preferCloneSrc will + * be honored. + * + * \param[in] srcDev The source device to clone from + * \param[in] dstDev The destination device to clone to + * \param[in] srcLba The source lba to start cloning from + * \param[in] dstLba The destination lba to start cloning from + * \param[in] lbc The number of blocks to clone + * \param[out] prefIssueDev The preferred device to issue vmkCmd to + * \param[out] vmkCmd The command to populate + * + * \note This is a non-blocking call. + * \note Function may populate vmkCmd->done with a completion handler + * to get notification of i/o completion. The caller guarantees + * that vmkCmd->done will be NULL prior to this call. + * \note The framework at its discretion may or may not honor prefIssueDev. + * In the event it does not, it will honor preferCloneSrc below + * instead. + */ + VMK_ReturnStatus (*cloneBlocks)(vmk_ScsiDevice *srcDev, + vmk_ScsiDevice *dstDev, + vmk_uint64 srcLba, + vmk_uint64 dstLba, + vmk_uint32 lbc, + vmk_ScsiDevice **prefIssueDev, + vmk_ScsiCommand *vmkCmd); + /** + * \brief Initialize vendor deleteblocks command + * + * Initialize vmkCmd with a vendor specific cdb necessary for + * initiating a delete of lbc blocks from device beginning + * at lba. + * This function just needs to initialize vmkCmd, the caller + * is responsible for issuing the command to the device. + * + * \param[in] device The device to delete from + * \param[in] lba The lba to start deleting from + * \param[in] lbc The number of blocks to delete + * \param[out] vmkCmd The command to populate + * + * \note This is a non-blocking call. + * \note Function may populate vmkCmd->done with a completion handler + * to get notification of i/o completion. The caller guarantees + * that vmkCmd->done will be NULL prior to this call. + */ + VMK_ReturnStatus (*deleteBlocks)(vmk_ScsiDevice *device, + vmk_uint64 lba, + vmk_uint32 lbc, + vmk_ScsiCommand *vmkCmd); + /** + * \brief Initialize zerlblocks command + * + * Initialize vmkCmd with a vendor specific cdb necessary for + * initiating a zero of lbc blocks to device beginning + * at lba. + * This function just needs to initialize vmkCmd, the caller + * is responsible for issuing the command to the device. + * + * \param[in] device The device to zero blocks from + * \param[in] lba The lba to start zeroing from + * \param[in] lbc The number of blocks to zero + * \param[out] vmkCmd The command to populate + * + * \note This is a non-blocking call. + * \note Function may populate vmkCmd->done with a completion handler + * to get notification of i/o completion. The caller guarantees + * that vmkCmd->done will be NULL prior to this call. + */ + VMK_ReturnStatus (*zeroBlocks)(vmk_ScsiDevice *device, + vmk_uint64 lba, + vmk_uint32 lbc, + vmk_ScsiCommand *vmkCmd); + /** + * \brief Initialize vendor ats command + * + * Initialize vmkCmd with a vendor specific cdb necessary for + * initiating an atomic-test-and-set of testData and setData + * at lba on device dev. + * This function just needs to initialize vmkCmd, the caller + * is responsible for issuing the command to the device. + * + * \param[in] device The device to whice ats will be issued + * \param[in] lba The lba to ats + * \param[in] testData The data to test against + * \param[in] setData The data to conditionally write + * \param[out] vmkCmd The command to populate + * + * \note This is a non-blocking call. + * \note Function may populate vmkCmd->done with a completion handler + * to get notification of i/o completion. The caller guarantees + * that vmkCmd->done will be NULL prior to this call. + */ + VMK_ReturnStatus (*ats)(vmk_ScsiDevice *dev, + vmk_uint64 lba, + const void *testData, + const void *setData, + vmk_ScsiCommand *vmkCmd); + /** + * \brief Get VAAIP command status + * + * Determine the VAAIP error status of completed command + * vmkCmd. This function should determine based on the + * scsi error status and sense data whether the error + * indicates a VAAI specific error code. If not the function + * should return VMK_SCSI_VAAI_CMD_STATUS_OK. + * + * \param[in] vmkCmd The command to populate + */ + vmk_ScsiVAAIPCmdStatus (*getVAAIPCmdStatus)(const vmk_ScsiCommand *vmkCmd); + + /** + * \brief cloneLbaAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a clone operation's start lba alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a clone operation's + * start lba alignment. Value is expressed in number of blocks. + */ + vmk_uint64 cloneLbaAlignment; + + /** + * \brief cloneLbcAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a clone operation's lbc alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a clone operation's + * lbc alignment. Value is expressed in number of blocks. + */ + vmk_uint64 cloneLbcAlignment; + + /** + * \brief atsLbaAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * an ats operation's start lba alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a ats operation's + * start lba alignment. Value is expressed in number of blocks. + */ + vmk_uint64 atsLbaAlignment; + + /** + * \brief atsLbcAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a ats operation's lbc alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a ats operation's + * lbc alignment. Value is expressed in number of blocks. + */ + vmk_uint64 atsLbcAlignment; + + /** + * \brief deleteLbaAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a delete operation's start lba alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a delete operation's + * start lba alignment. Value is expressed in number of blocks. + */ + vmk_uint64 deleteLbaAlignment; + + /** + * \brief deleteLbcAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a delete operation's lbc alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a delete operation's + * lbc alignment. Value is expressed in number of blocks. + */ + vmk_uint64 deleteLbcAlignment; + + /** + * \brief zeroLbaAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a zero operation's start lba alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a zero operation's + * start lba alignment. Value is expressed in number of blocks. + */ + vmk_uint64 zeroLbaAlignment; + + /** + * \brief zeroLbcAlignment + * + * The VAAI plugin should set this to 0 if there are no restrictions on + * a zero operation's lbc alignment. The VAAI plugin should set + * this to a power of 2 if there are restrictions on a zero operation's + * lbc alignment. Value is expressed in number of blocks. + */ + vmk_uint64 zeroLbcAlignment; + + /** + * \brief preferCloneSrc + * + * VAAI plugin should set this to TRUE at initialization time to indicate to + * the framework that it prefers cloneBlocks() operation to be sent to + * the source device rather than the destination device. The framework + * at its discretion may or may not honor this value. In the event it + * does not, it will honor the prefIssueDev out param in the cloneBlocks + * function call. + */ + vmk_Bool preferCloneSrc; +} vmk_ScsiVAAIPluginSpecific; + +#define VMK_SCSI_PLUGIN_NAME_MAX_LEN 40 + +/** + * \brief SCSI plugin + */ +typedef struct vmk_ScsiPlugin { + /** \brief Revision of the SCSI API implemented by the plugin */ + vmk_revnum scsiRevision; + /** + * \brief Revision of the plugin. + * + * This field is used for support and debugging purposes only. + */ + vmk_revnum pluginRevision; + /** + * \brief Revision of the product implemented by this plugin. + * + * This field is used for support and debugging purposes only. + */ + vmk_revnum productRevision; + /** \brief moduleID of the VMkernel module hosting the plugin. */ + vmk_ModuleID moduleID; + /** \brief lock class of the VMkernel module hosting the plugin. */ + vmk_SpinlockClass lockClass; + /** + * \brief Human readable name of the plugin. + * + * This field is used for logging and debugging only. + */ + char name[VMK_SCSI_PLUGIN_NAME_MAX_LEN]; + /** + * \brief plugin type specific union + */ + union { + /** \brief multipathing plugin specific data & entrypoints */ + /* type == VMK_SCSI_PLUGIN_TYPE_MULTIPATHING */ + vmk_ScsiMPPluginSpecific mp; + /* type == VMK_SCSI_PLUGIN_TYPE_VAAI */ + vmk_ScsiVAAIPluginSpecific vaai; + /** \brief reserved */ + unsigned char reserved[512]; + } u; + + /** + * \brief Issue a management ioctl on the specified plugin + * + * - Not currently used + */ + VMK_ReturnStatus (*pluginIoctl)(struct vmk_ScsiPlugin *plugin, + vmk_ScsiPluginIoctl cmd, + vmk_ScsiPluginIoctlData *data); + /** + * \brief Prompt a plugin to log its internal state + * + * Log a plugin's internal state + */ + VMK_ReturnStatus (*logState)(struct vmk_ScsiPlugin *plugin, + const vmk_uint8 *logParam, + vmk_ScsiPluginStatelogFlag logFlags); + /** \brief reserved */ + vmk_VirtAddr reserved1[4]; + /** \brief reserved */ + vmk_uint32 reserved2[3]; + /** \brief Type of the plugin + * + * Currently only MULTIPATHING, FILTER, and VAAI are supported. + * This field is used to determine what capabilities the plugin + * is allowed to implement. + */ + vmk_ScsiPluginType type; +} vmk_ScsiPlugin; + +/* + * SCSI Device Identifiers + */ +#define VMK_SCSI_UID_FLAG_PRIMARY 0x00000001 +/** \brief This represents the legacy UID (starting with vml.xxx..) */ +#define VMK_SCSI_UID_FLAG_LEGACY 0x00000002 +/** \brief The uid is globally unique. */ +#define VMK_SCSI_UID_FLAG_UNIQUE 0x00000004 +/** \brief The uid does not change across reboots. */ +#define VMK_SCSI_UID_FLAG_PERSISTENT 0x00000008 + +#define VMK_SCSI_UID_FLAG_DEVICE_MASK \ + (VMK_SCSI_UID_FLAG_PRIMARY | \ + VMK_SCSI_UID_FLAG_LEGACY | \ + VMK_SCSI_UID_FLAG_UNIQUE | \ + VMK_SCSI_UID_FLAG_PERSISTENT) + +/** + * \brief SCSI identifier + */ +typedef struct vmk_ScsiUid { + /** \brief null terminated printable identifier */ + char id[VMK_SCSI_UID_MAX_ID_LEN]; + /** \brief id attributes, see uid_flags above */ + vmk_uint32 idFlags; + /** \brief reserved */ + vmk_uint8 reserved[4]; +} vmk_ScsiUid; + +#define VMK_SCSI_UID_FLAG_PATH_MASK \ + (VMK_SCSI_UID_FLAG_UNIQUE | \ + VMK_SCSI_UID_FLAG_PERSISTENT) + +/** + * \ingroup MPP + * + * \brief SCSI path identifier. + * + * Path identifier constructed from transport specific data + */ +typedef struct vmk_ScsiPathUid { + /** \brief flags indicating uniqueness and persistence */ + vmk_uint64 idFlags; + /** \brief adapter id */ + char adapterId[VMK_SCSI_UID_MAX_ID_LEN]; + /** \brief target id */ + char targetId[VMK_SCSI_UID_MAX_ID_LEN]; + /** \brief device id (matches vmk_ScsiDevice's primary vmk_ScsiUid) */ + char deviceId[VMK_SCSI_UID_MAX_ID_LEN]; +} vmk_ScsiPathUid; + +/** + * \ingroup MPP + * + * \brief Operations provided by a device managed by + * VMK_SCSI_PLUGIN_TYPE_MULTIPATHING + */ +typedef struct vmk_ScsiMPPluginDeviceOps { + /** \brief Get a list of path names associated with a device */ + VMK_ReturnStatus (*getPathNames)(vmk_ScsiDevice *device, + vmk_HeapID *heapID, + vmk_uint32 *numPathNames, + char ***pathNames); +} vmk_ScsiMPPluginDeviceOps; + +/** + * \brief Operations provided by a device to the storage stack + */ +typedef struct vmk_ScsiDeviceOps { + /** + * \brief Notify the plugin that a command is available on the specified + * device. + * + * The plugin should fetch the command at the earliest opportunity + * using vmk_ScsiGetNextDeviceCommand(). + * + * SCSI invokes startCommand() only when queueing an IO in an empty + * queue. SCSI does not invoke startCommand() again until + * vmk_ScsiGetNextDeviceCommand() has returned NULL once. + * + * \note IO CPU accounting: + * MP plugin has to implement CPU accounting for processing IOs + * on behalf of each world via vmk_ServiceTimeChargeBeginWorld / + * vmk_ServiceTimeChargeEndWorld API in the issuing and task + * management paths. CPU accounting for the completion path is + * done by the PSA path layer. Path probing and other auxillary + * tasks are not executed on behalf of any particular world and, + * therefore, do not require CPU accounting. + */ + VMK_ReturnStatus (*startCommand)(vmk_ScsiDevice *device); + /** + * \brief Issue a task management request on the specified device. + * + * The plugin should: + * + * - invoke vmk_ScsiQueryTaskMgmtAction() for all the device's IOs + * currently queued inside the plugin or until + * vmk_ScsiGetNextDeviceCommand() returns + * VMK_SCSI_TASKMGMT_ACTION_BREAK or + * VMK_SCSI_TASKMGMT_ACTION_ABORT_AND_BREAK + * - complete all IOs returning VMK_SCSI_TASKMGMT_ACTION_ABORT or + * VMK_SCSI_TASKMGMT_ACTION_ABORT_AND_BREAK with the status + * specified in the task management request + * + * If vmk_ScsiQueryTaskMgmtAction() did not return with + * VMK_SCSI_TASKMGMT_ACTION_BREAK or + * VMK_SCSI_TASKMGMT_ACTION_ABORT_AND_BREAK: + * + * - forward the request to all paths with at least one IO in + * progress for that device, and + * - one (live) path to the device + */ + VMK_ReturnStatus (*taskMgmt)(vmk_ScsiDevice *device, + vmk_ScsiTaskMgmt *taskMgmt); + /** \brief Open a device + * The plugin should fail the open if the device state is set + * to VMK_SCSI_DEVICE_STATE_OFF + */ + VMK_ReturnStatus (*open)(vmk_ScsiDevice *device); + /** \brief Close a device */ + VMK_ReturnStatus (*close)(vmk_ScsiDevice *device); + /** \brief Probe a device */ + VMK_ReturnStatus (*probe)(vmk_ScsiDevice *device); + /** \brief Get the inquiry data from the specified device */ + VMK_ReturnStatus (*getInquiry)(vmk_ScsiDevice *device, + vmk_ScsiInqType inqPage, + vmk_uint8 *inquiryData, + vmk_uint32 inquirySize); + /** \brief Issue a sync cmd to write out a core dump */ + VMK_ReturnStatus (*issueDumpCmd)(vmk_ScsiDevice *device, + vmk_ScsiCommand *scsiCmd); + /** \brief plugin type specific union */ + union { + /** \brief multipathing plugin specific device ops */ + vmk_ScsiMPPluginDeviceOps mpDeviceOps; + /** \brief reserved */ + unsigned char reserved[128]; + } u; + /** \brief Identify if the device is a pseudo device */ + VMK_ReturnStatus (*isPseudoDevice)(vmk_ScsiDevice *device, + vmk_Bool *isPseudo); + /** \note reserved for future extension. */ + void (*reserved[4])(void); +} vmk_ScsiDeviceOps; + + +/** + * \brief SCSI device structure + */ +struct vmk_ScsiDevice { + /** \brief producing plugin's priv data */ + void *pluginPrivateData; + /** \brief device ops the PSA framework should use for this device */ + vmk_ScsiDeviceOps *ops; + /** \brief producing plugin's module id */ + vmk_ModuleID moduleID; + /** \brief reserved */ + vmk_uint8 reserved[4]; +}; + +#endif /* _VMKAPI_MPP_TYPES_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_debug.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_debug.h new file mode 100644 index 0000000..cf5310e --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_debug.h @@ -0,0 +1,61 @@ +/* ********************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Debug */ /** + * \addtogroup Network + *@{ + * \defgroup Debug Debug + *@{ + * + * \par Debug: + * + * Networking Debug API's to support debugging the vmkernel. + * This includes interfaces such as receiving packets directly + * into the network coredumper to be used at panic time. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_DEBUG_H_ +#define _VMKAPI_NET_DEBUG_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_cslist.h" + +#include "net/vmkapi_net_types.h" + +/* + *********************************************************************** + * vmk_NetDebugRxToDumper -- */ /** + * + * \brief Deliver Rx packets directly to the network coredump handler. + * + * \param[in] pktList Set of packets to process. + * + * \retval VMK_OK If the network coredump handles + * the packets successfully. + * + *********************************************************************** + */ + +VMK_ReturnStatus +vmk_NetDebugRxToDumper(vmk_PktList *pktList); + +#endif /* _VMKAPI_NET_DEBUG_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_netqueue.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_netqueue.h new file mode 100644 index 0000000..a2cd934 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_netqueue.h @@ -0,0 +1,754 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Netqueue */ /** + * \addtogroup Network + *@{ + * \defgroup Netqueue Netqueue + *@{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_NETQUEUE_H_ +#define _VMKAPI_NET_NETQUEUE_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" + +#include "net/vmkapi_net_types.h" +#include "net/vmkapi_net_pkt.h" + +/** Major version of netqueue api */ +#define VMK_NETQUEUE_OPS_MAJOR_VER (2) + +/** Minor version of netqueue api */ +#define VMK_NETQUEUE_OPS_MINOR_VER (0) + +/** + * \brief Netqueue queue id + */ +typedef vmk_uint64 vmk_NetqueueQueueId; + +/** Well known Netqueue queue id values */ +enum { + /** Default queue id */ + VMK_NETQUEUE_DEFAULT_QUEUEID = (vmk_NetqueueQueueId)0, + + /** Invalid queue id */ + VMK_NETQUEUE_INVALID_QUEUEID = (vmk_NetqueueQueueId)~0, +}; + +/** + * \brief Netqueue filter id + */ +typedef vmk_uint32 vmk_NetqueueFilterId; + +/** Well known Netqueue filter id values */ +enum { + /** Invalid filter id */ + VMK_NETQUEUE_INVALID_FILTERID = (vmk_NetqueueFilterId)~0, +}; + +/** Netqueue priority */ +typedef vmk_VlanPriority vmk_NetqueuePriority; + +/** Netqueue features supported */ +typedef enum { + + /** No features supported */ + VMK_NETQUEUE_FEATURE_NONE = 0x0, + + /** Rx queues features supported */ + VMK_NETQUEUE_FEATURE_RXQUEUES = 0x1, + + /** Tx queues features supported */ + VMK_NETQUEUE_FEATURE_TXQUEUES = 0x2, +} vmk_NetqueueFeatures; + +/** + * \ingroup Netqueue + * \brief Netqueue operations + */ +typedef enum { + + /** + * \brief None + */ + VMK_NETQUEUE_OP_NONE = 0x0, + + /** + * \brief Get version + * Get the device's netqueue version. + */ + VMK_NETQUEUE_OP_GET_VERSION = 0x1, + + /** + * \brief Get features + * Get the device's netqueue features. + */ + VMK_NETQUEUE_OP_GET_FEATURES = 0x2, + + /** + * \brief Get queue count + * Get the number of Rx/Tx queues supported on a device. + */ + VMK_NETQUEUE_OP_QUEUE_COUNT = 0x3, + + /** + * \brief Get filter count + * Get the number of filters supported per queue. + */ + VMK_NETQUEUE_OP_FILTER_COUNT = 0x4, + + /** + * \brief Allocate a queue + * Allocate a queue of a specific type. + */ + VMK_NETQUEUE_OP_ALLOC_QUEUE = 0x5, + + /** + * \brief Release a queue + * Release an allocated queue. + */ + VMK_NETQUEUE_OP_FREE_QUEUE = 0x6, + + /** + * \brief Get queue vector + * Get the queue vector associated to a queue. + */ + VMK_NETQUEUE_OP_GET_QUEUE_VECTOR = 0x7, + + /** + * \brief Get default queue + * Get the Rx/Tx default queue. + */ + VMK_NETQUEUE_OP_GET_DEFAULT_QUEUE = 0x8, + + /** + * \brief Apply rx filter + * Apply a filter to a Rx queue. + */ + VMK_NETQUEUE_OP_APPLY_RX_FILTER = 0x9, + + /** + * \brief Remove rx filter + * Remove a filter from a Rx queue. + */ + VMK_NETQUEUE_OP_REMOVE_RX_FILTER = 0xa, + + /** + * \brief Get queue stats + * Get stats on a particular queue. + */ + VMK_NETQUEUE_OP_GET_QUEUE_STATS = 0xb, + + /** + * \brief Set Tx priority + * Set a priority on a particular Tx queue. + */ + VMK_NETQUEUE_OP_SET_TX_PRIORITY = 0xc, + + /** + * \brief Get/Set queue state + * Get and Set the state of netqueue on a particular device. + * Changing the mtu on a device puts netqueue in an invalid state + * in which the Rx filters are removed. Such state needs to + * be notified in order to restore the configuration before invalidation. + */ + VMK_NETQUEUE_OP_GETSET_QUEUE_STATE = 0xd, + + /** + * \brief Set queue vector + * Set the queue vector associated to a queue. + */ + VMK_NETQUEUE_OP_SET_QUEUE_VECTOR = 0xe, + + /** + * \brief Allocate a queue with attributes + * Allocate a queue of a specific type with attributes. + */ + VMK_NETQUEUE_OP_ALLOC_QUEUE_WITH_ATTR = 0xf, + + /** + * \brief Enable queue's feature + * Enable a feature on a given queue. + */ + VMK_NETQUEUE_OP_ENABLE_QUEUE_FEAT = 0x10, + + /** + * \brief Disable queue's feature + * Disable a feature on a given queue. + */ + VMK_NETQUEUE_OP_DISABLE_QUEUE_FEAT = 0x11, + + /** + * \brief Get queue's features + * Get the supported queues' features of a device. + */ + VMK_NETQUEUE_OP_GET_QUEUE_SUPPORTED_FEAT = 0x12, +} vmk_NetqueueOp; + +/** + * \ingroup Netqueue + * \brief Filter class + */ +typedef enum vmk_NetqueueFilterClass { + + /** Invalid filter */ + VMK_NETQUEUE_FILTER_NONE = 0x0, + + /** Mac address filter */ + VMK_NETQUEUE_FILTER_MACADDR = 0x1, + + /** Vlan tag filter */ + VMK_NETQUEUE_FILTER_VLAN = 0x2, + + /** Vlan tag + mac addr filter */ + VMK_NETQUEUE_FILTER_VLANMACADDR = 0x3, +} vmk_NetqueueFilterClass; + +/** + * \ingroup Netqueue + * \brief Queue type + */ +typedef enum { + + /** Invalid queue type */ + VMK_NETQUEUE_QUEUE_TYPE_INVALID = 0, + + /** Rx queue type */ + VMK_NETQUEUE_QUEUE_TYPE_RX = 1, + + /** Tx queue type */ + VMK_NETQUEUE_QUEUE_TYPE_TX = 2, + + /** Default Rx queue type */ + VMK_NETQUEUE_QUEUE_TYPE_DEFAULTRXQUEUE = 3, + + /** Default Tx queue type */ + VMK_NETQUEUE_QUEUE_TYPE_DEFAULTTXQUEUE = 4, +} vmk_NetqueueQueueType; + +/** + * \ingroup Netqueue + * \brief Filter type + */ +typedef enum vmk_NetqueueFilterType { + + /** Invalid filter type */ + VMK_NETQUEUE_FILTER_TYPE_INVALID = 0, + + /** Rx/Tx filter type */ + VMK_NETQUEUE_FILTER_TYPE_TXRX = 1, +} vmk_NetqueueFilterType; + +/** + * \ingroup Netqueue + * \brief Filter definition + */ +typedef struct vmk_NetqueueFilter { + + /** Filter class */ + vmk_NetqueueFilterClass class; + union { + + /** Filter class mac only */ + vmk_uint8 macaddr[6]; + + /** Filter class vlan tag only */ + vmk_uint16 vlan_id; + + /** Filter class vlan tag + mac */ + struct { + vmk_uint8 macaddr[6]; + vmk_uint16 vlan_id; + } vlanmac; + } u; +} vmk_NetqueueFilter; + +/** + * \ingroup Netqueue + * \brief Filter properties + */ +typedef enum vmk_NetqueueFilterProperties { + + /** None */ + VMK_NETQUEUE_FILTER_PROP_NONE = 0x0, + + /** Management filter */ + VMK_NETQUEUE_FILTER_PROP_MGMT = 0x1, +} vmk_NetqueueFilterProperties; + +/** + * \ingroup Netqueue + * \brief Features supported on queues + */ +typedef enum vmk_NetqueueQueueFeatures { + + /** None */ + VMK_NETQUEUE_QUEUE_FEAT_NONE = 0x0, + + /** LRO feature */ + VMK_NETQUEUE_QUEUE_FEAT_LRO = 0x1, +} vmk_NetqueueQueueFeatures; + +/** + * \ingroup Netqueue + * \brief Netqueue queue attribute + */ +typedef struct vmk_NetqueueQueueAttr { + enum { + + /** Priority attribute */ + VMK_NETQUEUE_QUEUE_ATTR_PRIOR, + + /** Features attribute */ + VMK_NETQUEUE_QUEUE_ATTR_FEAT, + + /** Number of attributes */ + VMK_NETQUEUE_QUEUE_ATTR_NUM, + } type; + + union { + + /** VMK_NETQUEUE_QUEUE_ATTR_PRIOR argument */ + vmk_VlanPriority priority; + + /** VMK_NETQUEUE_QUEUE_ATTR_FEAT argument */ + vmk_NetqueueQueueFeatures features; + + /** Generic attribute argument */ + void *p; + } args; +} vmk_NetqueueQueueAttr; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_VERSION + */ +typedef struct vmk_NetqueueOpGetVersionArgs { + + /** Minor version [out] */ + vmk_uint16 minor; + + /** Major version [out] */ + vmk_uint16 major; +} vmk_NetqueueOpGetVersionArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_FEATURES + */ +typedef struct vmk_NetqueueOpGetFeaturesArgs { + + /** Supported features [out] */ + vmk_NetqueueFeatures features; +} vmk_NetqueueOpGetFeaturesArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_QUEUE_COUNT + */ +typedef struct vmk_NetqueueOpGetQueueCountArgs { + + /** Queue type aimed [in] */ + vmk_NetqueueQueueType qtype; + + /** Number of queue of this type [out] */ + vmk_uint16 count; +} vmk_NetqueueOpGetQueueCountArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_FILTER_COUNT + */ +typedef struct vmk_NetqueueOpGetFilterCountArgs { + + /** Queue type aimed [in] */ + vmk_NetqueueQueueType qtype; + + /** Number of filters per queue of this type [out] */ + vmk_uint16 count; +} vmk_NetqueueOpGetFilterCountArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_ALLOC_QUEUE + */ +typedef struct vmk_NetqueueOpAllocQueueArgs { + + /** Queue type aimed [in] */ + vmk_NetqueueQueueType qtype; + + /** Queue id of the allocated queue [out] */ + vmk_NetqueueQueueId qid; + + /** Worldet on top of the allocated queue if any [out] */ + void *worldlet; +} vmk_NetqueueOpAllocQueueArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_FREE_QUEUE + */ +typedef struct vmk_NetqueueOpFreeQueueArgs { + + /** Queue to release [in] */ + vmk_NetqueueQueueId qid; +} vmk_NetqueueOpFreeQueueArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_QUEUE_VECTOR + */ +typedef struct vmk_NetqueueOpGetQueueVectorArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Interrupt vector associated to the queue [out] */ + vmk_uint16 vector; +} vmk_NetqueueOpGetQueueVectorArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_DEFAULT_QUEUE + */ +typedef struct vmk_NetqueueOpGetDefaultQueueArgs { + + /** Default queue type VMK_NETQUEUE_QUEUE_TYPE_[RX|TX] [in] */ + vmk_NetqueueQueueType qtype; + + /** Queue id of the default queue [out] */ + vmk_NetqueueQueueId qid; + + /** Worldet on top of the default queue if any [out] */ + void *worldlet; +} vmk_NetqueueOpGetDefaultQueueArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_APPLY_RX_FILTER + */ +typedef struct vmk_NetqueueOpApplyRxFilterArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Filter to be applied [in] */ + vmk_NetqueueFilter filter; + + /** Filter id [out] */ + vmk_NetqueueFilterId fid; +} vmk_NetqueueOpApplyRxFilterArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_REMOVE_RX_FILTER + */ +typedef struct vmk_NetqueueOpRemoveRxFilterArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Filter to be removed [in] */ + vmk_NetqueueFilterId fid; +} vmk_NetqueueOpRemoveRxFilterArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_QUEUE_STATS + */ +typedef struct vmk_NetqueueOpGetQueueStatsArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; +} vmk_NetqueueOpGetQueueStatsArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_SET_TX_PRIORITY + */ +typedef struct vmk_NetqueueOpSetTxPriorityArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Priority to set on the queue [in] */ + vmk_VlanPriority priority; +} vmk_NetqueueOpSetTxPriorityArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GETSET_QUEUE_STATE + */ +typedef struct vmk_NetqueueOpGetSetQueueStateArgs { + + /** Netqueue old state (TRUE: Netqueue was in valid state, FALSE: otherwise) [out] */ + vmk_Bool oldState; + + /** Netqueue new state (TRUE: Netqueue set to valid state, FALSE: otherwise) [in] */ + vmk_Bool newState; +} vmk_NetqueueOpGetSetQueueStateArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_SET_QUEUE_VECTOR + */ +typedef struct vmk_NetqueueOpSetQueueVectorArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Vector to be set [in] */ + vmk_uint16 vector; +} vmk_NetqueueOpSetQueueVectorArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_ALLOC_QUEUE_WITH_ATTR + */ +typedef struct vmk_NetqueueOpAllocQueueWithAttrArgs { + + /** Queue type aimed [in] */ + vmk_NetqueueQueueType qtype; + + /** Number of attributes (Cannot be greater than VMK_NETQUEUE_QUEUE_ATTR_NUM) [in] */ + vmk_uint16 nattr; + + /** Queue attributes [in] */ + vmk_NetqueueQueueAttr *attr; + + /** Queue id of the allocated queue [out] */ + vmk_NetqueueQueueId qid; + + /** Worldet on top of the allocated queue if any [out] */ + void *worldlet; +} vmk_NetqueueOpAllocQueueWithAttrArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_ENABLE_QUEUE_FEAT + */ +typedef struct vmk_NetqueueOpEnableQueueFeatArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Features to be enabled [in] */ + vmk_NetqueueQueueFeatures features; +} vmk_NetqueueOpEnableQueueFeatArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_DISABLE_QUEUE_FEAT + */ +typedef struct vmk_NetqueueOpDisableQueueFeatArgs { + + /** Queue aimed [in] */ + vmk_NetqueueQueueId qid; + + /** Features to be disabled [in] */ + vmk_NetqueueQueueFeatures features; +} vmk_NetqueueOpDisableQueueFeatArgs; + +/** + * \ingroup Netqueue + * \brief Arguments to VMK_NETQUEUE_OP_GET_QUEUE_SUPPORTED_FEAT + */ +typedef struct vmk_NetqueueOpGetQueueSupFeatArgs { + + /** Queue type aimed [in] */ + vmk_NetqueueQueueType qtype; + + /** Features supported [out] */ + vmk_NetqueueQueueFeatures features; +} vmk_NetqueueOpGetQueueSupFeatArgs; + +/* + *********************************************************************** + * vmk_NetqueueSetQueueIdUserVal -- */ /** + * + * \ingroup Netqueue + * \brief Set user's private value for queue id. + * + * \param[in] qid Queue id. + * \param[in] userval User value. + * + * \retval VMK_OK Always. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_NetqueueSetQueueIdUserVal(vmk_NetqueueQueueId *qid, + vmk_uint32 userval); + +/* + *********************************************************************** + * vmk_NetqueueQueueIdUserVal -- */ /** + * + * \ingroup Netqueue + * \brief Get user part of queue id + * + * \param[in] qid Queue id. + * + * \retval vmk_uint32 User value. + * + *********************************************************************** + */ + +vmk_uint32 vmk_NetqueueQueueIdUserVal(vmk_NetqueueQueueId qid); + +/* + *********************************************************************** + * vmk_NetqueueMkTxQueueId -- */ /** + * + * \ingroup Netqueue + * \brief Create a Tx queue id. + * + * \param[in] val The embedded value of the queue id. + * \param[out] qid The created queue id. + * + * \retval VMK_OK Always. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_NetqueueMkTxQueueId(vmk_NetqueueQueueId *qid, + vmk_uint32 val); + +/* + *********************************************************************** + * vmk_NetqueueMkRxQueueId -- */ /** + * + * \ingroup Netqueue + * \brief Create a Rx queue id. + * + * \param[in] val The embedded value of the queue id. + * \param[out] qid The created queue id. + * + * \retval VMK_OK Always. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_NetqueueMkRxQueueId(vmk_NetqueueQueueId *qid, + vmk_uint32 val); + +/* + *********************************************************************** + * vmk_NetqueueQueueIdVal -- */ /** + * + * \ingroup Netqueue + * \brief Retrieve the embedded value of a queue id. + * + * \param[in] qid The aimed queue id. + * + * \return The embedded value. + * + *********************************************************************** + */ + +vmk_uint32 vmk_NetqueueQueueIdVal(vmk_NetqueueQueueId qid); + +/* + *********************************************************************** + * vmk_NetqueueQueueIdType -- */ /** + * + * \ingroup Netqueue + * \brief Retrieve the type of a queue id. + * + * \param[in] qid The aimed queue id. + * + * \return The type. + * + *********************************************************************** + */ + +vmk_NetqueueQueueType vmk_NetqueueQueueIdType(vmk_NetqueueQueueId qid); + +/* + *********************************************************************** + * vmk_NetqueueMkFilterId -- */ /** + * + * \ingroup Netqueue + * \brief Create a filter id. + * + * \param[in] val The embedded value of the filter id. + * \param[out] fid The created filter. + * + * \retval VMK_OK Always. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_NetqueueMkFilterId(vmk_NetqueueFilterId *fid, + vmk_uint16 val); + +/* + *********************************************************************** + * vmk_NetqueueFilterIdVal -- */ /** + * + * \ingroup Netqueue + * \brief Retrieve the embedded value of a filter id. + * + * \param[in] fid The aimed filter id. + * + * \return The embedded value. + * + *********************************************************************** + */ + +vmk_uint16 vmk_NetqueueFilterIdVal(vmk_NetqueueFilterId fid); + +/* + *********************************************************************** + * vmk_PktQueueIdGet -- */ /** + * + * \ingroup Netqueue + * \brief Retrieve netqueue queueid of a specified packet. + * + * \param[in] pkt Packet of interest + * + * \return Netqueue queue id. + * + *********************************************************************** + */ +extern +vmk_NetqueueQueueId vmk_PktQueueIdGet(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktQueueIdSet -- */ /** + * + * \ingroup Netqueue + * \brief Set netqueue queueid of a specified packet. + * + * \param[in] pkt Packet of interest + * \param[in] qid Packet queue id + * + * \retval VMK_OK + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktQueueIdSet(vmk_PktHandle *pkt, vmk_NetqueueQueueId qid); + + +#endif /* _VMKAPI_NET_NETQUEUE_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay.h new file mode 100644 index 0000000..8ecb323 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay.h @@ -0,0 +1,687 @@ +/*************************************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Overlay */ /** + * \addtogroup Network + * @{ + * \defgroup Overlay Overlay + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_OVERLAY_H_ +#define _VMKAPI_NET_OVERLAY_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "net/vmkapi_net_types.h" +#include "net/vmkapi_net_pkt.h" +#include "net/vmkapi_net_pktlist.h" +#include "net/vmkapi_net_vswitch.h" + +#include "base/vmkapi_revision.h" +#include "vmkapi_net_overlay_ext.h" + +/** \cond never */ +#define VMK_NET_OVERLAY_REVISION_MAJOR 1 +#define VMK_NET_OVERLAY_REVISION_MINOR 0 +#define VMK_NET_OVERLAY_REVISION_UPDATE 0 +#define VMK_NET_OVERLAY_REVISION_PATCH_LEVEL 0 + +#define VMK_NET_OVERLAY_REVISION VMK_REVISION_NUMBER(VMK_NET_OVERLAY) +/** \endcond never */ + +/** + * \ingroup Overlay + * \brief Opaque handle to the instance object in overlay framework. + */ +typedef void *vmk_NetOverlayInstance; + +/** + * \ingroup Overlay + * \brief Handle to overlay user self created per instance + * data structure. + */ +typedef void *vmk_NetOverlayInstanceImpl; + +/** + * \ingroup Overlay + * \brief Opaque handle to the class object in overlay framework. + */ +typedef void *vmk_NetOverlayClassHandle; + +/** + * \ingroup Overlay + * \brief Opaque handle to the port object in overlay framework. + */ +typedef void *vmk_NetOverlayPort; + +/** + * \ingroup Overlay + * \brief Handle to overlay user self created per port data structure. + */ +typedef void *vmk_NetOverlayPortImpl; + +/** + * \ingroup Overlay + * \brief Overlay forward policy type. + */ +typedef enum vmk_NetOverlayForwardPolicyType { + /** The policy enforcement is for forward path. */ + VMK_NET_OVERLAY_FORWARD_PATH_POLICY = 1, + + /** The policy enforcement is for reverse path. */ + VMK_NET_OVERLAY_REVERSE_PATH_POLICY = 2, +} vmk_NetOverlayForwardPolicyType; + +/** + * \ingroup Overlay + * \brief Overlay class type. + */ +typedef enum vmk_NetOverlayClassType { + /** class can be instantiated no more than one per VDS instance. */ + VMK_NET_OVERLAY_CLASS_TYPE_SINGLETON = 1, + + /** class can be instantiated more than one per VDS instance. */ + VMK_NET_OVERLAY_CLASS_TYPE_STACKABLE = 2, +} vmk_NetOverlayClassType; + + +/* + *********************************************************************** + * */ /** + * \ingroup Overlay + * \brief Overlay class callbacks. + * + *********************************************************************** + */ +typedef struct vmk_NetOverlayClassOps { + + /* + ******************************************************************** + * createInstance -- */ /** + * + * \brief Instantiate an overlay instance. + * + * \note This callback is protected from other callbacks exclusively + * by the underneath overlay infrastructure. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[out] instanceImpl Pointer to the opaque data which is + * created by overlay users for their + * specific purpose. + * + * \return Every value but VMK_OK will be treated as an error + * and logged. While the Overlay subsystem does not + * differentiate between error codes, providing an + * accurate error code is useful for troubleshooting. + * + ******************************************************************** + */ + VMK_ReturnStatus (*createInstance)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl *instanceImpl); + + /* + ******************************************************************** + * destroyInstance -- */ /** + * + * \brief Destroy an overlay instance. + * + * \note This callback is protected from other callbacks exclusively + * by the underneath overlay infrastructure. + * + * \note Before returning, this function should wait for the + * termination of all pending calls and prevent any new calls + * to the overlay APIs using this instance. + * + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay instance + * under destroying. + * + ******************************************************************** + */ + VMK_ReturnStatus (*destroyInstance)(vmk_NetOverlayInstanceImpl instanceImpl); + + /* + ******************************************************************** + * eventHandler -- */ /** + * + * \brief Event handler for vswitch event notifications. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] portID Port ID associated with the event, + * if event is not port based, it will + * be VMK_VSWITCH_INVALID_PORT_ID. + * \param[in] event Event type. + * + ******************************************************************** + */ + VMK_ReturnStatus (*eventHandler)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_SwitchPortID portID, + vmk_VswitchEvent event); + + /* + ******************************************************************** + * setOPI -- */ /** + * + * \brief Set the OPI(overlay parameter index) for a port. + * + * \note This callback is protected from other callbacks exclusively + * by the underneath overlay infrastructure. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object + * \param[in] param Overlay param value needed to be set. + * + ******************************************************************** + */ + VMK_ReturnStatus (*setOPI)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayParamID param); + + /* + ******************************************************************** + * leafInput -- */ /** + * + * \brief Process leaf port inbound packets. + * + * \note This callback should be reentrant. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object. + * \param[in,out] pktList List of packets incoming from + * leaf port. + * + * \return Any value other than VMK_OK will result in the packets + * being released and not delivered to the target. + * + ******************************************************************** + */ + VMK_ReturnStatus (*leafInput)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_PktList *pktL); + + /* + ******************************************************************** + * leafOutput -- */ /** + * + * \brief Process leaf port outbound packets. + * + * \note This callback should be reentrant. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object. + * \param[in,out] pktList List of packets leaving the + * leaf port. + * + * \return Any value other than VMK_OK will result in the packets + * being released and not delivered to the target. + * + ******************************************************************** + */ + VMK_ReturnStatus (*leafOutput)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_PktList *pktList); + + /* + ******************************************************************** + * uplinkInput -- */ /** + * + * \brief Process uplink port inbound packets. + * + * \note This callback should be reentrant. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object. + * \param[in,out] pktList List of packets leaving the leaf port. + * + * \return Any value other than VMK_OK will result in the packets + * being released and not delivered to the target. + * + ******************************************************************** + */ + VMK_ReturnStatus (*uplinkInput)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_PktList *pktList); + + /* + ******************************************************************** + * uplinkOutput -- */ /** + * + * \brief Process uplink port outbound packets. + * + * \note This callback should be reentrant. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object. + * \param[in,out] pktList List of packets leaving the leaf port. + * + * \return Any value other than VMK_OK will result in the packets + * being released and not delivered to the target. + * + ******************************************************************** + */ + VMK_ReturnStatus (*uplinkOutput)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_PktList *pktList); + + /* + ******************************************************************** + * forwardPolicy -- */ /** + * + * \brief Overlay forward policy enforcement logic. + * + * \note This callback should be reentrant. + * + * \param[in] overlayInstance Handle to the VMkernel overlay + * instance object. + * \param[in] instanceImpl Pointer to the user created data + * associated with current overlay + * instance under processing. + * \param[in] overlayPort Pointer to the VMKernel port object. + * \param[in] type Forward policy enforcement type. + * \param[in] pkt Packet under processing. + * + * \retval VMK_TRUE The pkt can be forward to the overlayPort + * if enforcement type is forward path, or + * the pkt can be originated from the overlayPort + * if enforcement type is reverse path. + * \retval VMK_FALSE otherwise. + * + ******************************************************************** + */ + vmk_Bool (*forwardPolicy)(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayInstanceImpl instanceImpl, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayForwardPolicyType type, + vmk_PktHandle *pkt); + + /* + ******************************************************************** + * verifyHostKey -- */ /** + * + * \brief Overlay class hostkey update verification. + * + * \param[in] classHandle Handle to the VMkernel overlay + * class object. + * \param[in] hostKey Host key needs to be verified. + * + * \return Any value other than VMK_OK will result host key + * update failure. + * + ******************************************************************** + */ + VMK_ReturnStatus (*verifyHostKey)(vmk_NetOverlayClassHandle classHandle, + vmk_NetOverlayHostKey hostKey); + + /* + ******************************************************************** + * commitHostKey -- */ /** + * + * \brief Overlay class hostkey commit + * + * \param[in] classHandle Handle to the VMkernel overlay + * class object. + * \param[in] hostKey Host key needs to be commited. + * + ******************************************************************** + */ + VMK_ReturnStatus (*commitHostKey)(vmk_NetOverlayClassHandle classHandle, + vmk_NetOverlayHostKey hostKey); +} vmk_NetOverlayClassOps; + + +/* + * + * Functions + * + */ + + +/* + *********************************************************************** + * vmk_NetOverlayRegisterClass -- */ /** + * + * \ingroup Overlay + * \brief Register an Overlay class with the network stack. + * + * \pre Must be called in a blockable context. + * + * \param[in] name Human readable name of the overlay class. + * \param[in] apiRev Version number of the Overlay API + * implemented by this overlay class. + * \param[in] moduleID ID of the overlay class's VMkernel module. + * \param[in] ops Array of function pointers to the overlay + * class's ops. + * \param[in] type Type of singleton or stackable. + * \param[in] eventMask Event types which overlay class is + * interesting in. + * \param[in] byteInspected Bytes inspected for this class, 0 will + * cause overlay to use the default value. + * \param[out] classHandle Pointer to the VMkernel overlay class + * handle. + * + * \retval VMK_NOT_SUPPORTED API version mismatch. + * \retval VMK_BAD_PARAM Supplied parameters are not acceptable, + * e.g. mandatory operations were missing + * or the supplied name is too short. + * \retval VMK_EXISTS An overlay class with that name is + * already registered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayRegisterClass(const char *name, + vmk_revnum apiRev, + vmk_ModuleID moduleID, + vmk_NetOverlayClassOps *ops, + vmk_NetOverlayClassType type, + vmk_VswitchEvent eventMask, + vmk_uint32 byteInspected, + vmk_NetOverlayClassHandle *classHandle); + +/* + *********************************************************************** + * vmk_NetOverlayUnregisterClass -- */ /** + * + * \ingroup Overlay + * \brief Unregister an Overlay class previously registered + * by vmk_NetOverlayRegisterClass. + * + * \pre Must be called in a blockable context. + * + * \param[in] classHandle Handle to the VMkernel overlay class. + * + * \retval VMK_BUSY Class is still using and can't be unregistered. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayUnregisterClass(vmk_NetOverlayClassHandle classHandle); + +/* + *********************************************************************** + * vmk_NetOverlayVersion -- */ /** + * + * \ingroup Overlay + * \brief Query the overlay vmkapi revison number. + * + * \return revision number. + * + *********************************************************************** + */ +vmk_revnum vmk_NetOverlayVersion(void); + +/* + *********************************************************************** + * vmk_NetOverlayGetMaxDepth -- */ /** + * + * \ingroup Overlay + * \brief Query the maximum nested overlay instances will be allowed. + * + * \param[out] depth Pointer to a buffer to fill in with the requested + * maximum depth. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetMaxDepth(vmk_uint32 *depth); + +/* + *********************************************************************** + * vmk_NetOverlayGetMTU -- */ /** + * + * \ingroup Overlay + * \brief Query the MTU of underneath portset which the overlayInstance + * is associated with. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[out] mtu Pointer to a buffer to fill in with the + * requested MTU value. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetMTU(vmk_NetOverlayInstance overlayInstance, + vmk_uint32 *mtu); + +/* + *********************************************************************** + * vmk_NetOverlayGetClassName -- */ /** + * + * \ingroup Overlay + * \brief Query the human readable class name of the overlay instance. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance + * object. + * \param[out] name Pointer to a buffer to fill in with the + * class name. + * \param[in] len Length of the supplied buffer. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetClassName(vmk_NetOverlayInstance overlayInstance, + char *name, + vmk_size_t len); + +/* + *********************************************************************** + * vmk_NetOverlayInstanceGetName -- */ /** + * + * \ingroup Overlay + * \brief Query the human readable name of the overlay instance, + * it's in the format of "dvs-name:depth:overlayClassName". + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance + * object. + * \param[out] name Pointer to a buffer to fill in with + * the name. + * \param[in] len Length of the supplied buffer. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayInstanceGetName(vmk_NetOverlayInstance overlayInstance, + char *name, + vmk_size_t len); + +/* + *********************************************************************** + * vmk_NetOverlayGetPortOPI -- */ /** + * + * \ingroup Overlay + * \brief Query the OPI value of the port for the overlay instance. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] overlayPort Handle to the port. + * \param[out] opi Pointer to a buffer to fill in with the + * requested OPI value. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetPortOPI(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayParamID *opi); + +/* + *********************************************************************** + * vmk_NetOverlaySetPortOPI -- */ /** + * + * \ingroup Overlay + * \brief Set the OPI value of the port for the overlay instance. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] overlayPort Handle to the port. + * \param[in] opi OPI value to be set. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlaySetPortOPI(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayParamID opi); + + +/* + *********************************************************************** + * vmk_NetOverlayGetPacketOPI -- */ /** + * + * \ingroup Overlay + * \brief Query the packet OPI value associated with the overlay + * instance. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] pkt The packet to get OPI from. + * \param[out] opi Pointer to a buffer to fill in with the + * requested OPI value. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetPacketOPI(vmk_NetOverlayInstance overlayInstance, + vmk_PktHandle *pkt, + vmk_NetOverlayParamID *opi); + +/* + *********************************************************************** + * vmk_NetOverlaySetPacketOPI -- */ /** + * + * \ingroup Overlay + * \brief Set the packet OPI value associated with the overlay instance. + * + * \note vmk_PktIsBufDescWritable must hold VMK_TRUE before call this + * function. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] pkt The packet to Set OPI to. + * \param[in] opi The OPI value to set. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlaySetPacketOPI(vmk_NetOverlayInstance overlayInstance, + vmk_PktHandle *pkt, + vmk_NetOverlayParamID opi); + +/* + *********************************************************************** + * vmk_NetOverlayGetPortID -- */ /** + * + * \ingroup Overlay + * \brief Query the portID for the overlayPort. + * + * \param[in] overlayPort Handle to the port. + * \param[out] portID Pointer to a buffer to fill in with the + * requested portID. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetPortID(vmk_NetOverlayPort overlayPort, + vmk_SwitchPortID *portID); + +/* + *********************************************************************** + * vmk_NetOverlayGetDepth -- */ /** + * + * \ingroup Overlay + * \brief Query the depth for the overlayInstance on the VDS. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[out] depth Pointer to a buffer to fill in with the + * requested depth. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetDepth(vmk_NetOverlayInstance overlayInstance, + vmk_uint32 *depth); + + +/* + *********************************************************************** + * vmk_NetOverlaySetPortImpl -- */ /** + * + * \ingroup Overlay + * \brief Associate portImpl with the overlay port. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] overlayPort Handle to the port. + * \param[in] portImpl Handle to the user created per port + * data structure, NULL pointer means + * dissociation. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlaySetPortImpl(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayPortImpl portImpl); + + +/* + *********************************************************************** + * vmk_NetOverlayGetPortImpl -- */ /** + * + * \ingroup Overlay + * \brief Get portImpl associateid with the overlay port. + * + * \param[in] overlayInstance Handle to the VMkernel overlay instance. + * \param[in] overlayPort Handle to the port. + * \param[out] portImpl Pointer to a buffer to fill in with the + * requested portImpl. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetPortImpl(vmk_NetOverlayInstance overlayInstance, + vmk_NetOverlayPort overlayPort, + vmk_NetOverlayPortImpl *portImpl); + +/* + *********************************************************************** + * vmk_NetOverlayGetDepth -- */ /** + * + * \ingroup Overlay + * \brief Query the hostkey for current host. + * + * \param[out] hostKey Pointer to a buffer to fill in with the requested + * hostKey. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_NetOverlayGetHostKey(vmk_NetOverlayHostKey *hostKey); + +#endif /* _VMKAPI_NET_OVERLAY_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay_ext.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay_ext.h new file mode 100644 index 0000000..06ead1f --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_overlay_ext.h @@ -0,0 +1,71 @@ +/*************************************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + + +/* + *********************************************************************** + * Overlay Externally Exported Interfaces */ /** + * \addtogroup Overlay + * @{ + * + * \defgroup Overlayext Overlay Interfaces Exported to User Mode + * + * Vmkernel-specific Overlay constants & types which are shared with + * user-mode code. + * @{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_OVERLAY_EXT_H_ +#define _VMKAPI_NET_OVERLAY_EXT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/** + * \brief Maximum overlay class name length, + * including the trailing NUL character. + */ +#define VMK_NET_OVERLAY_CLASS_MAX_NAME_LEN 50 + +/** + * \brief Maximum portset name length exposed to the user. + */ +#define VMK_NET_OVERLAY_PORTSET_MAX_NAME_LEN 32 + +/** + * \brief Maximum overlay instance name length, + * the format is: portset-name:depth:overlayClassName. + */ +#define VMK_NET_OVERLAY_INSTANCE_MAX_NAME_LEN \ + VMK_NET_OVERLAY_CLASS_MAX_NAME_LEN + VMK_NET_OVERLAY_PORTSET_MAX_NAME_LEN + 3 + +/** + * \brief Non applicable overlay parameter index. + */ +#define VMK_NET_OVERLAY_PARAM_NON_APPLICABLE 0 + +/** + * \brief Overlay parameter index. + */ +typedef vmk_uint32 vmk_NetOverlayParamID; + +/** + * \brief Overlay unique key per host across multiple hosts. + */ +typedef vmk_uint32 vmk_NetOverlayHostKey; + +#endif /* _VMKAPI_NET_OVERLAY_EXT_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt.h new file mode 100644 index 0000000..64d3bf8 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt.h @@ -0,0 +1,2124 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Pkt */ /** + * \addtogroup Network + *@{ + * \defgroup Pkt Packet Management + *@{ + * + * \par VMKernel packet representation: + * + * vmk_PktHandle represents a network packet in the vmkernel. The + * following are its important components: + * + * - Fragments: + *\n + * The set of non-contiguous buffers that store the frame data. A + * packet can have at most VMK_PKT_FRAGS_MAX_LENGTH fragments. + * Fragments can span multiple pages and be larger than + * VMK_PAGE_SIZE, but any individual fragment has to be physically + * contiguous in the machine address space.\n + *\n + * - Mapped Area: + *\n + * In order to access packet data, the buffer containing it needs to + * be mapped in virtual memory. In vmkernel, only the first fragment + * of a packet is mapped in virtual memory, and it is not guaranteed + * that the entire first fragment is mapped. The mapped area of a + * frame (returned via vmk_PktFrameMappedPointerGet() with length of + * vmk_PktFrameMappedLenGet()) starts from the beginning of the + * first fragment.\n + *\n + * Be aware that the mapped area may also be larger than the frame + * length, which is often the case for Rx processing since pNIC's + * will allocate fixed size buffers in advance without knowing the + * size of the frame that will be received. Thus, when processing + * data use MIN(FrameLen, FrameMappedLen) to determine which part + * of the frame can be accessed using the frame mapped pointer:\n + *\n + * \code + * int i; + * unsigned int len; + * vmk_uint8 *frameVA; + * + * len = MIN(vmk_PktFrameMappedLenGet(pkt), vmk_PktFrameLenGet(pkt)); + * frameVA = (vmk_uint8 *) vmk_PktFrameMappedPointerGet(pkt); + * + * printk("frame bytes that are mapped = 0x%x\n", len); + * for (i = 0; i < len; i++) { + * printk("0x%x ", frameVA[i]); + * } + * printk("\n"); + * \endcode + *\n + * - Headroom: + *\n + * The padding space available in front of the frame contents. + * Packets allocated with vmk_PktAlloc() don't have any headroom + * space by default. Headroom space can be adjusted using + * vmk_PktPushHeadroom(), vmk_PktPullHeadroom() or vmk_PktAdjust(). + * These API's redefine the bytes in the beginning of the frame + * to become the headroom. If it is desired to keep all the frame + * data and insert headroom in front of them then API's such as + * vmk_PktPartialCopyWithHeadroom() or vmk_PktDupWithHeadroom() + * can be used. + *\n + * - Metadata: + *\n + * Apart from the buffers containing the frame data, + * vmk_PktHandle also contains metadata fields and flags that + * describe attributes of the packet. Some of these fields are:\n + *\n + * - VLAN ID:\n + * 802.1q VLAN identifier tag if one is associated with the packet. + * Valid values are 0 - 4094 inclusive. Please note that although + * the 802.1q specifications allow 4095 as a valid VLAN ID, this + * value is reserved under vmkernel and must not be used to tag + * packets. In vmkernel outer tags of packets with VLAN-tagged + * ethernet headers are stripped from the frame and stored inside + * the vmk_PktHandle VLAN ID metadata.\n + *\n + * The VLAN ID of a packet can be accessed using vmk_PktVlanIDGet() + * and changed via vmk_PktVlanIDSet() and vmk_PktVlanIDClear(). + * Note that setting a VLAN ID for a packet causes the packet to + * be marked with the "must VLAN tag" flag, which tells vmkernel + * that the VLAN tag needs to be inserted to the frame's ethernet + * header before delivery (note that in some configurations such as + * vswitch tagging mode, packets going into a VM will not be tagged + * even if this flag is set). This flag can be checked using + * vmk_PktMustVlanTag().\n + *\n + * - Large TCP packet flag\n + * The large TCP packet flag identifies a packet as a TSO (TCP + * Segmentation Offload) or LRO (Large Receive Offload) packet. + * This flag is only allowed for TCP packets, and indicates + * that the frame is potentially larger than the default MTU size, + * and thus TCP segmentation must be applied before transmitting + * the packet out of an uplink or receiving into a VM without LPD + * (Large Packet Delivery) support. In the TSO case this flag + * implies that the TCP checksum needs to be computed.\n + *\n + * The large tcp packet flag can be retrieved with + * vmk_PktIsLargeTcpPacket() and its value can be modified with + * vmk_PktSetLargeTcpPacket(), which also requires the MSS + * (Maximum segment size) for the packet to be specified. The + * maximum segment size is used by the TCP segmentation + * implementation (software or hardware in case of pNIC) to + * determine the maximum TCP payload size for individual packets. + * The MSS value can be retrieved with + * vmk_PktGetLargeTcpPacketMss()\n + *\n + * - Checksum required flag:\n + * This flag indicates to vmkernel that the underlying packet is + * using layer 4 checksum offload and requires the checksum to be + * computed and inserted before final delivery of the frame. + * TCP/UDP over IPv4 and IPv6 are supported in software, and if + * supported by the pNIC are offloaded to hardware for outgoing + * packets. The value of this flag can be accessed with + * vmk_PktIsMustCsum() and modified with vmk_PktSetMustCsum()\n + *\n + * - Checksum verified flag:\n + * This flag indicates to vmkernel that the layer 4 checksum of the + * underlying packet (TCP or UDP) has already been verified, and + * doesn't need to be verified again before final delivery of the + * frame. The value of this flag can be modified with + * vmk_PktClearCsumVfd() and vmk_PktSetCsumVfd()\n + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_PKT_H_ +#define _VMKAPI_NET_PKT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_cslist.h" +#include "base/vmkapi_memory.h" +#include "base/vmkapi_scatter_gather.h" + +#include "net/vmkapi_net_types.h" + +/** Maximum number of fragments a packet can contain */ +#define VMK_PKT_FRAGS_MAX_LENGTH 24 + +/** Maximum size of the low-memory packet heap */ +#define VMK_PKT_HEAP_MAX_SIZE 96 + +/** Maximum size of the high-memory packet heap */ +#define VMK_HIGH_PKT_HEAP_MAX_SIZE 192 + +/** + * \ingroup Pkt + * \struct vmk_NetSGArray + * \brief Scatter-gather array definition used in vmkernel networking code. + * + * This array represents the buffer fragments that makes up a packet. + */ +typedef struct vmk_NetSGArray { + /** Number of valid fragments in this array */ + vmk_uint32 length; + + /** Maximum number of fragments */ + vmk_uint32 maxLength; + + /** Array consisting of individual fragment elements */ + vmk_SgElem sg[VMK_PKT_FRAGS_MAX_LENGTH]; +} vmk_NetSGArray; + +/** + * \ingroup Pkt + * \brief Packet allocation flags for use with vmk_PktAllocWithFlags() + */ +typedef enum { + /** Allocate packet buffers from low memory */ + VMK_PKT_ALLOC_FROM_LOW_MEM = 0x00000001, + + /** Allocate packet buffers from high memory */ + VMK_PKT_ALLOC_FROM_HIGH_MEM = 0x00000002, +} vmk_PktAllocFlags; + +/** + * \ingroup Pkt + * \brief Metadata flags for use in the flags field of vmk_PktBufDescriptor + */ +typedef enum { + /** TCP/UDP checksum needs to be computed and inserted into the frame */ + VMK_PKTBUF_FLAG_MUST_CSUM = 0x00020000, + + /** TCP/UDP checksum has already been verified */ + VMK_PKTBUF_FLAG_CSUM_VFD = 0x00040000, + + /** TCP segmentation needs to be performed before final delivery */ + VMK_PKTBUF_FLAG_MUST_TSO = 0x00080000, + + /** Packet was generated by a virtual switch */ + VMK_PKTBUF_FLAG_SWITCH_GEN = 0x00100000, + + /** Packet contains fragments that span multiple pages */ + VMK_PKTBUF_FLAG_SG_SPAN_PAGES = 0x00200000, + + /** Fragments point to KMem pages */ + VMK_PKTBUF_FLAG_SG_KMEM_PAGES = 0x00400000, + + /** Mask for all valid flags */ + VMK_PKTBUF_VALID_FLAGS = 0x007E0000 +} vmk_PktBufDescFlags; + +/** + * \ingroup Pkt + * \struct vmk_PktBufDescriptor + * \brief Packet buffer descriptor which represents the buffers that + * make up the packet along with metadata associated with these + * buffers. + * + * Functions such as vmk_PktPartialCopy() will cause the child + * packet to have a new vmk_PktBufDescriptor, whereas functions + * such as vmk_PktClone() will result in the child packet sharing + * its parent's vmk_PktBufDescriptor. + */ +typedef struct vmk_PktBufDescriptor { + /** Total length of the buffer(s) that are part of this packet handle */ + vmk_small_size_t bufLen; + + /** Length of the frame data */ + vmk_small_size_t frameLen; + + /** Maximum segment size for TCP Segmentation Offload */ + vmk_uint16 tsoMss; + + /** Length of the headroom preceding frame data */ + vmk_uint16 headroomLen; + + /** DVFilter packet tags */ + vmk_uint32 dvfilterTagBits; + + /** Metadata flags private to this reference of the packet */ + vmk_PktBufDescFlags flags; + + /** DVFilter packet metadata */ + vmk_VirtAddr dvfilterMetadata; + + /** Length of DVFilter packet metadata */ + vmk_uint32 dvfilterMetadataLen; + + /** Scatter-gather array describing buffers that make up the packet */ + vmk_NetSGArray sgMA; + + /* + * don't put anything else here, sgMA *must* be the last field so + * that we can alloc larger blocks in order to have more than + * NET_PKT_SG_DEFAULT_SIZE scatter gather elements, which is + * required in some cases, such as when we get elements from a + * client that cross page boundaries (which may be contiguous + * in PA space, but not in MA space) + * + * API Note: Please don't expose this comment through doxygen. + */ +} vmk_PktBufDescriptor; + +/** + * \ingroup Pkt + * \brief Metadata flags for use in the flags field of vmk_PktDescriptor + */ +typedef enum { + /** Packet is allocated (in use) and has not been free'd yet */ + VMK_PKTDESC_FLAG_ALLOCATED = 0x00000001, + + /** Packet has been freed and should not be used any more */ + VMK_PKTDESC_FLAG_FREE = 0x00000002, + + /** Calling the completion handler is needed for releasing the packet */ + VMK_PKTDESC_FLAG_NOTIFY_COMPLETE = 0x00000004, + + /** Packet buffers can be held for a relatively longer time before + * completion. This is often the case for packets backed up by vmkernel + * buffers, but not the case for packets backed up by guest buffers + * such as zero-copy Tx. This flag is used to determine whether a copy + * is needed in some cases where buffers would need to be held for a + * long time without completion, such as LRO or traffic shaping. + */ + VMK_PKTDESC_FLAG_SLOW_COMPLETION = 0x00000008, + + /** Mask for all valid flags */ + VMK_PKTDESC_VALID_FLAGS = 0x0000000f +} vmk_PktDescFlags; + +/** Pointer to context data for use by the packet completion handler */ +typedef void *vmk_PktCompletionData; + +/** + * \ingroup Pkt + * \struct vmk_PktDescriptor + * \brief Packet descriptor structure containing common metadata + * shared by all children that are spawned from a master vmk_PktHandle. + */ +typedef struct vmk_PktDescriptor { + /** Metadata flags common to all references of the packet */ + vmk_PktDescFlags flags; + + /** Context data for the packet's completion handler */ + vmk_PktCompletionData ioCompleteData; + + /** Additional completion context data */ + vmk_PktCompletionData auxCompleteData; +} vmk_PktDescriptor; + +/** + * \ingroup Pkt + * \brief Metadata flags for use in the flags field of vmk_PktHandle + */ +typedef enum { + /** vmk_PktFrameMappedPointerGet() is a valid pointer */ + VMK_PKT_FLAG_FRAME_HEADER_MAPPED = 0x00000001, + + /** The vmk_PktBufDescriptor is private to this vmk_PktHandle */ + VMK_PKT_FLAG_PRIVATE_BUF_DESC = 0x00000002, + + /** Packet is allocated (in use) and has not been free'd yet */ + VMK_PKT_FLAG_ALLOCATED = 0x00000004, + + /** Packet has been freed and should not be used any more */ + VMK_PKT_FLAG_FREE = 0x00000008, + + /** Packet is allocated from the low-memory slab */ + VMK_PKT_FLAG_SLAB_ALLOCATED = 0x00000010, + + /** Packet has VLAN redirection */ + VMK_PKT_FLAG_VLAN_REDIRECT = 0x00000020, + + /** Packet needs to be tagged for VLAN redirection */ + VMK_PKT_FLAG_MUST_TAG_REDIRECT = 0x00000040, + + /** Packet is allocated from low-memory packet heap (not from slab) */ + VMK_PKT_FLAG_NETPKT_HEAP_ALLOCATED = 0x00000080, + + /** Packet is allocated from the general purpose network heap */ + VMK_PKT_FLAG_NET_GP_HEAP_ALLOCATED = 0x00000100, + + /** DVFilter slave packet that needs special completion */ + VMK_PKT_FLAG_DVFILTER_SLAVE = 0x00000200, + + /** Packet needs VLAN tag inserted into the frame's ethernet header */ + VMK_PKT_FLAG_MUST_TAG = 0x00000400, + + /** Mask for all valid flags */ + VMK_PKT_VALID_FLAGS = 0x000007ff +} vmk_PktHandleFlags; + +/** + * \ingroup Pkt + * \struct vmk_PktHandle + * \brief Structure representing a network packet in vmkernel. + */ +typedef struct vmk_PktHandle { + /** List element when the packet handle is part of a list */ + vmk_SList_Links pktLinks; + + /** Virtual address of the frame mapped area */ + vmk_VirtAddr frameVA; + + /** Length of the frame mapped area */ + vmk_small_size_t frameMappedLen; + + /** Metadata flags that are private to this vmk_PktHandle */ + vmk_PktHandleFlags flags; + + /** Buffer descriptor that this handle refers to */ + vmk_PktBufDescriptor *bufDesc; + + /** Packet descriptor that this handle refers to */ + vmk_PktDescriptor *pktDesc; +} vmk_PktHandle; + +/** + * \ingroup Pkt + * \struct vmk_PktFrag + * \brief Structure representing a buffer fragment that is part of a packet. + * + * This structure is used for returning fragment information via vmk_PktFragGet(). + */ +typedef struct { + /** Machine address of the fragment. */ + vmk_MachAddr addr; + + /** Length of the fragment. */ + vmk_small_size_t length; +} vmk_PktFrag; + +/* + *********************************************************************** + * vmk_PktAlloc -- */ /** + * + * \ingroup Pkt + * \brief Allocate a vmk_PktHandle containing a single buffer fragment. + * + * This function allocates a vmk_PktHandle complete with its own + * vmk_PktDescriptor and vmk_PktBufDescriptor. The metadata fields are + * initialized to their default values: + * + * VLAN: No VLAN (tagging not required)\n + * Csum offload: Not required\n + * Csum verified: No\n + * TSO required: No\n + * Completion: Not required\n + * + * A single buffer (guaranteed to be contiguous in machine address space) + * at least as large as the requested length is allocated from the low + * memory packet heap and appended to the vmk_PktHandle as the first + * (index 0) fragment. + * + * The returned vmk_PktHandle is a master packet, and the only current + * reference to its buffer, ie. vmk_PktIsBufDescWritable() and + * vmk_PktIsDescWritable() will return TRUE until a copy/clone operation + * is performed on the packet, meaning callers are free to modify the + * frame contents or packet metadata. + * + * \param[in] len Minimum size of the buffer allocated for this + * packet. + * \param[out] pkt Pointer to the allocated vmk_PktHandle. + * + * \retval VMK_OK Allocation succeeded. + * \retval VMK_NO_RESOURCES Not enough memory to satisfy the + * allocation request, or an unspecified + * error has occured. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktAlloc(vmk_uint32 len, + vmk_PktHandle **pkt); + +/* + *********************************************************************** + * vmk_PktAllocWithFlags -- */ /** + * + * \ingroup Pkt + * \brief Allocate a vmk_PktHandle containing a single buffer fragment + * with the specified allocation flags. + * + * Please refer to vmk_PktAlloc() documentation for properties of the + * allocated packet. These properties can be customized by use of the + * following allocation flags: + * + * VMK_PKT_ALLOC_FROM_HIGH_MEM: Buffer fragment is allocated from + * the high memory (> 4GB) packet heap. If high memory is not available + * in the system the buffer will be allocated from low memory instead. + * + * VMK_PKT_ALLOC_FROM_LOW_MEM: Buffer fragment is allocated from + * the low memory (< 4GB) packet heap. This flag is mutually exclusive + * with VMK_PKT_ALLOC_FROM_HIGH_MEM. In case neither of these two flags + * are specified the buffer allocation defaults to low memory. + * + * \param[in] len Minimum size of the buffer allocated for this + * packet. + * \param[in] allocFlags Packet allocation flags. + * \param[out] pkt Pointer to the allocated vmk_PktHandle. + * + * \retval VMK_OK Allocation succeeded. + * \retval VMK_NO_RESOURCES Not enough memory to satisfy the + * allocation request, or an unspecified + * error has occured. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktAllocWithFlags(vmk_uint32 len, + vmk_PktAllocFlags allocFlags, + vmk_PktHandle **pkt); + +/* + *********************************************************************** + * vmk_PktRelease -- */ /** + * + * \ingroup Pkt + * \brief Release all resources of a given vmk_PktHandle. + * + * This function cleans up all resources that are referred to by the + * given vmk_PktHandle, which includes memory for the vmk_PktHandle and + * associated descriptors as well as the original buffer allocated with + * vmk_PktAlloc(). + * + * If the packet only contains a single buffer allocated from the low or + * high memory packet heaps (as is the case with vmk_PktAlloc() usage) + * then its resources can be released by this function. However, if + * fragments were added in addition to the original buffer (through + * vmk_PktAppendFrag() or vmk_PktAppend()) then a completion handler + * must be registered that must handle properly freeing those fragments. + * If a completion handler is registered it will be called by this + * function. + * + * \pre Packet must have a single fragment or a completion handler + * must have been registered. + * + * \pre This function should only be called from a non-IRQ context. + * For freeing packets from an interrupt context use + * vmk_PktReleaseIRQ(). + * + * \param[in] pkt Packet to be released. + * + *********************************************************************** + */ + +void vmk_PktRelease(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktReleaseIRQ -- */ /** + * + * \ingroup Pkt + * \brief Release all resources of a given vmk_PktHandle from an + * interrupt context. + * + * This function should be called instead of vmk_PktRelease() when + * releasing packets from an interrupt context. Please refer to + * vmk_PktRelease() documentation for more information on releasing + * packets. + * + * \param[in] pkt Packet to be released. + * + *********************************************************************** + */ + +void vmk_PktReleaseIRQ(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktReleaseAfterComplete -- */ /** + * + * \ingroup Pkt + * \brief Release a master vmk_PktHandle that has gone through + * completion. + * + * This function is the fast path version of vmk_PktRelease() for calling + * at the end of a completion handler. The given packet MUST be a master, + * and the reference count to its resources MUST be 1 (no other + * references). The packet must either have a single fragment (allocated + * through vmk_PktAlloc()) or no buffer fragments. + * + * \pre Packet must be a master with no other references to its + * resources. + * + * \param[in] pkt Packet to be released. + * + *********************************************************************** + */ + +void vmk_PktReleaseAfterComplete(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktIsDescWritable -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the packet is a master with no other + * references. + * + * The packet descriptor is considered "writable" if the given packet is + * a master (not generated through copy/clone API's) with no outstanding + * references left (all copies/clones are released). This function needs + * to be TRUE for modification of the packet descriptor via + * vmk_PktSetCompletionData(), vmk_PktClearCompletionData() or + * vmk_PktAllowSlowCompletion() to be allowed. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Descriptor is writable. + * \retval VMK_FALSE Descriptor is not writable. + * + *********************************************************************** + */ + +vmk_Bool vmk_PktIsDescWritable(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktIsBufDescWritable -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the packet has a private buffer descriptor. + * + * A packet can only modify its buffer descriptor (modify the contents + * of the buffers, append fragments etc.) if it is the master + * vmk_PktHandle with no other references, or if it has a private + * vmk_PktBufDescriptor obtained through API's such as + * vmk_PktPartialCopy(). Note that a child packet with a private + * vmk_PktBufDescriptor is only allowed to modify buffer contents of + * buffers up to however many bytes were requested to be copied to + * private buffers with vmk_PktPartialCopy(), buffers after that offset + * are not guaranteed to be safe for modification as they can be + * shared with other vmk_PktHandle's. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Descriptor is writable. + * \retval VMK_FALSE Descriptor is not writable. + * + *********************************************************************** + */ + +vmk_Bool vmk_PktIsBufDescWritable(const vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktFrameLenGet -- */ /** + * + * \ingroup Pkt + * \brief Retrieve the frame length of the given packet. + * + * The frame length of the packet indicates the number of bytes which + * constitute the actual frame data that will be delivered. + * + * \param[in] pkt Target packet. + * + * \return Frame length. + * + *********************************************************************** + */ + +static inline vmk_small_size_t +vmk_PktFrameLenGet(vmk_PktHandle *pkt) +{ + return pkt->bufDesc->frameLen; +} + +/* + *********************************************************************** + * vmk_PktFrameLenSet -- */ /** + * + * \ingroup Pkt + * \brief Set the frame length of the given packet. + * + * The frame length of the packet indicates the number of bytes which + * constitute the actual frame data. + * + * \param[in] pkt Target packet + * \param[in] len Size of the frame described by the packet. Has to + * be less than or equal to the amount of available + * buffer space in the vmk_PktHandle. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt. + * + * \retval VMK_OK If the frame length is set. + * \retval VMK_BAD_PARAM Supplied frame length larger than available + * buffer space. + * + *********************************************************************** + */ + +static inline VMK_ReturnStatus +vmk_PktFrameLenSet(vmk_PktHandle *pkt, + vmk_small_size_t len) +{ + VMK_ASSERT(vmk_PktIsBufDescWritable(pkt)); + + if (VMK_UNLIKELY(len > pkt->bufDesc->bufLen)) { + return VMK_BAD_PARAM; + } + pkt->bufDesc->frameLen = len; + + return VMK_OK; +} + +/* + *********************************************************************** + * vmk_PktFragGet -- */ /** + * + * \ingroup Pkt + * \brief Retrieve information for a particular fragment of the given + * packet. + * + * The fragment information is returned in a vmk_PktFrag struct and + * contains information such as the machine address of the buffer and + * its length. The API caller has to manage the allocation and release + * of this struct. + * + * This function can only be called for fragment indices that exist in + * the scatter-gather array of the packet, ie. index 0 to + * (vmk_PktFragsNb() - 1) + * + * \note A vmk_PktHandle can have at most #VMK_PKT_FRAGS_MAX_LENGTH + * fragments. + * + * \param[in] pkt Target packet. + * \param[out] frag Structure to store fragment information + * \param[in] entry Index of the desired fragment. The first + * fragment of a vmk_PktHandle is at index + * 0. + * + * \retval VMK_OK Fragment data returned sucessfully. + * \retval VMK_NOT_FOUND No fragment exists with the given index. + * + *********************************************************************** + */ + +static inline VMK_ReturnStatus +vmk_PktFragGet(vmk_PktHandle *pkt, + vmk_PktFrag *frag, + vmk_uint16 entry) +{ + if (VMK_UNLIKELY(entry >= pkt->bufDesc->sgMA.length)) { + return VMK_NOT_FOUND; + } + + frag->addr = pkt->bufDesc->sgMA.sg[entry].addr; + frag->length = pkt->bufDesc->sgMA.sg[entry].length; + + return VMK_OK; +} + +/* + *********************************************************************** + * vmk_PktFragsNb -- */ /** + * + * \ingroup Pkt + * \brief Return the number of fragments attached to the given + * vmk_PktHandle. + * + * \param[in] pkt Target packet. + * + * \return Number of fragments. + * + *********************************************************************** + */ + +static inline vmk_uint16 +vmk_PktFragsNb(vmk_PktHandle *pkt) +{ + return pkt->bufDesc->sgMA.length; +} + +/* + *********************************************************************** + * vmk_PktIsFlatBuffer -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the packet has less than or equal to one + * fragment. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Packet has a flat buffer. + * \retval VMK_FALSE Packet doesn't have a flat buffer. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktIsFlatBuffer(vmk_PktHandle *pkt) +{ + if (pkt->bufDesc->sgMA.length <= 1) { + VMK_DEBUG_ONLY({ + if (pkt->bufDesc->sgMA.length != 0) { + VMK_ASSERT(pkt->bufDesc->sgMA.sg[0].length == pkt->bufDesc->bufLen); + } + }) + return VMK_TRUE; + } + return VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktFrameMappedLenGet -- */ /** + * + * \ingroup Pkt + * \brief Retrieve the length of the frame mapped area of the given + * packet. + * + * \see Refer to the "Mapped Area" section of the \ref Pkt detailed + * desription. + * + * \param[in] pkt Target packet. + * + * \return Length of the frame mapped area. + * + *********************************************************************** + */ + +static inline vmk_small_size_t +vmk_PktFrameMappedLenGet(const vmk_PktHandle *pkt) +{ + return pkt->frameMappedLen; +} + +/* + *********************************************************************** + * vmk_PktIsFullyMapped -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the entire packet buffer is mapped. + * + * A packet is fully mapped if it consists of a single fragment and all + * of that fragment is mapped. + * + * \param[in] pkt Target packet. + + * \retval VMK_TRUE Fully mapped. + * \retval VMK_FALSE Not fully mapped. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktIsFullyMapped(vmk_PktHandle *pkt) +{ + return pkt->bufDesc->bufLen == vmk_PktFrameMappedLenGet(pkt) ? + VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktFrameMappedPointerGet -- */ /** + * + * \ingroup Pkt + * \brief Retrieve the pointer to the frame mapped area of the given + * packet. + * + * \see Refer to the "Mapped Area" section of the \ref Pkt detailed + * desription. + * + * \param[in] pkt Target packet. + * + * \return A pointer to the frame mapped area. + * + *********************************************************************** + */ + +static inline vmk_VirtAddr +vmk_PktFrameMappedPointerGet(const vmk_PktHandle *pkt) +{ + return pkt->frameVA; +} + +/* + *********************************************************************** + * vmk_PktAdjust -- */ /** + * + * \ingroup Pkt + * \brief Adjust the packet buffers by moving frame mapped region and/or + * trimming the scatter-gather array. + * + * If a non-zero pushLen argument is supplied this function will move + * the frame mapped region forward by pushLen and decrease the frame + * mapped length by pushLen. The frame length is left unmodified. + * + * After applying pushLen the function will trim off any scatter-gather + * elements that contain bytes after pushLen + adjustLen. The number of + * fragments of the packet may be changed, as well as the length of the + * last fragment. In case pushLen + adjustLen falls within the first + * fragment the frame mapped length and frame mapped pointer values may + * also change. + * + * This operation is not reversible, adjustments made by using pushLen + * and adjustLen are no longer considered part of the packet. + * + * \note A non-zero adjustLen parameter MUST be specified, whereas + * the pushLen parameter can be zero. + * + * \note pushLen has to be less than or equal to the size of the first + * fragment. + * + * \note pushLen + adjustLen must be less than or equal to the total + * size of buffers in the packet's scatter-gather array. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * \param[in] pushLen Amount of bytes to add in front of the frame. + * \param[in] adjustLen Amount of bytes to keep from the packet fragments + * after pushLen bytes. The rest of the bytes are + * simply discarded. When zero, VMK_LIMIT_EXCEEDED + * is returned. + * + * \retval VMK_OK The packet adjustement suceeded. + * \retval VMK_LIMIT_EXCEEDED The packet could not be adjusted. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktAdjust(vmk_PktHandle *pkt, + vmk_uint32 pushLen, + vmk_uint32 adjustLen); + +/* + *********************************************************************** + * vmk_PktAppend -- */ /** + * + * \ingroup Pkt + * \brief Append fragments starting at the specified offset from a + * source packet into the destination packet. + * + * The frame length, number of fragments and fragment information of the + * destination packet can be modified. The source packet is left + * unmodified. + * + * \note After this operation the destination packet will contain + * references to fragments in the source packet, hence must + * be released BEFORE the source packet can safely be released. + * + * \note This function invalidates all previous calls to + * vmk_PktFragGet(). + * + * \note srcOffset + appendLen must be less than or equal to the frame + * length of the source packet. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for dstPkt. + * + * \param[in] dstPkt Packet to append fragments into. + * \param[in] srcPkt Packet to append fragments from. + * \param[in] srcOffset Data offset from the beginning of source packet. + * \param[in] appendLen Number of bytes to be appended. + * + * \retval VMK_OK The fragments have sucessfully been appended. + * \retval VMK_LIMIT_EXCEEDED The destination packet doesn't have + * enough empty scatter-gather entries for + * the append operation. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktAppend(vmk_PktHandle *dstPkt, + vmk_PktHandle *srcPkt, + vmk_uint32 srcOffset, + vmk_uint32 appendLen); + +/* + *********************************************************************** + * vmk_PktAppendFrag -- */ /** + * + * \ingroup Pkt + * \brief Append the given buffer as a fragment to the given packet. + * + * The given buffer is simply appended at the end of the existing + * fragments in the target packet. The frame length, number of fragments + * and fragment information of the packet are modified. + * + * \note The given buffer should NOT be freed until the packet is + * released, since the packet will contain a reference to the + * buffer. One possible way of properly freeing the buffer is + * to set up a completion handler (see vmk_PktSetCompletionData() + * documentation) that will free the buffers. Note that the + * regular packet release path (vmk_PktRelease() etc.) can NOT + * properly free fragments appended through this API since it + * doesn't have any way of knowing where the buffers are + * allocated from. + * + * \note This function invalidates all previous calls to + * vmk_PktFragGet(). + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * \param[in] fragMA Fragment machine address - A virtual address + * must first be converted to a machine address + * with vmk_VirtAddrToMachAddr(). + * \param[in] fragLen Fragment length. + * + * \retval VMK_OK If the fragment has been appended. + * \retval VMK_LIMIT_EXCEEDED The destination packet doesn't have + * enough empty scatter-gather entries for + * the append operation. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktAppendFrag(vmk_PktHandle *pkt, + vmk_MachAddr fragMA, + vmk_uint32 fragLen); + +/* + *********************************************************************** + * vmk_PktSetCompletionData -- */ /** + * + * \ingroup Pkt + * \brief Set packet completion data for the given packet. + * + * Packet completion is a mechanism for releasing packets that have + * custom buffer arrangements or hold on to additional resources (such + * as descriptor entries in a vNIC ring) and as such a customized + * completion handler needs to be called prior to release of the + * vmk_PktHandle. + * + * See vmk_UplinkRegisterCompletionFn() for registering a completion + * handler. vmk_UplinkRegisterCompletionFn() is private API and should + * only be used in the driver layer. vmk_PktSetCompletionData(), + * vmk_PktGetCompletionData(), vmk_PktNeedCompletion() and + * vmk_PktAllowSlowCompletion() shouldn't be used unless a completion + * handler is registered. + * + * The ioData and auxData parameters are both pointers available for the + * implentation to set and will be preserved with the vmk_PktHandle. + * They can be retrieved at the completion handler to access completion + * context information specific to this packet. + * + * See vmk_PktAllowSlowCompletion() for documentation of the slow + * completion flag. + * + * \note As a side effect of calling this function the packet will be + * marked as needing completion (see vmk_PktNeedCompletion()) + * + * \pre vmk_PktIsDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * \param[in] ioData Pointer to the completion context for + * the packet. + * \param[in] auxData Additional pointer for completion context. + * \param[in] allowSlowCompletion Packet can be held indefinitely before + * completion. + * + *********************************************************************** + */ + +static inline void +vmk_PktSetCompletionData(vmk_PktHandle *pkt, + vmk_PktCompletionData ioData, + vmk_PktCompletionData auxData, + vmk_Bool allowSlowCompletion) +{ + VMK_ASSERT(vmk_PktIsDescWritable(pkt)); + + if (allowSlowCompletion) { + pkt->pktDesc->flags |= VMK_PKTDESC_FLAG_SLOW_COMPLETION; + } + pkt->pktDesc->flags |= VMK_PKTDESC_FLAG_NOTIFY_COMPLETE; + pkt->pktDesc->ioCompleteData = ioData; + pkt->pktDesc->auxCompleteData = auxData; +} + +/* + *********************************************************************** + * vmk_PktGetCompletionData -- */ /** + * + * \ingroup Pkt + * \brief Get embedded completion data for the given packet. + * + * \see vmk_PktSetCompletionData() + * + * \param[in] pkt Target packet. + * \param[out] ioData Pointer to the completion context for the packet. + * \param[out] auxData Additional pointer for completion context. + * + *********************************************************************** + */ + +static inline void +vmk_PktGetCompletionData(vmk_PktHandle *pkt, + vmk_PktCompletionData *ioData, + vmk_PktCompletionData *auxData) +{ + if (ioData) { + *ioData = pkt->pktDesc->ioCompleteData; + } + + if (auxData) { + *auxData = pkt->pktDesc->auxCompleteData; + } +} + +/* + *********************************************************************** + * vmk_PktClearCompletionData - */ /** + * + * \ingroup Pkt + * \brief Clear the embedded completion data for the given packet. + * + * Clears the completion context pointers set via + * vmk_PktSetCompletionData() and marks the packet as not needing + * completion (see vmk_PktNeedCompletion()). + * + * \pre vmk_PktIsDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +static inline void +vmk_PktClearCompletionData(vmk_PktHandle *pkt) +{ + VMK_ASSERT(vmk_PktIsDescWritable(pkt)); + + pkt->pktDesc->auxCompleteData = NULL; + pkt->pktDesc->ioCompleteData = NULL; + pkt->pktDesc->flags &= ~(VMK_PKTDESC_FLAG_NOTIFY_COMPLETE | VMK_PKTDESC_FLAG_SLOW_COMPLETION); +} + +/* + *********************************************************************** + * vmk_PktNeedCompletion - */ /** + * + * \ingroup Pkt + * \brief Returns whether the packet needs completion before being + * released. + * + * This function will return VMK_TRUE if completion data has been set + * for the packet via vmk_PktSetCompletionData(). It indicates to + * vmkernel that the source port's notify chain needs to be executed (to + * run the registered completion handler) prior to releasing + * vmk_PktHandle resources. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Packet needs completion. + * \retval VMK_FALSE Packet doesn't need completion. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktNeedCompletion(vmk_PktHandle *pkt) +{ + return (pkt->pktDesc-> flags & VMK_PKTDESC_FLAG_NOTIFY_COMPLETE) != 0 ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktAllowSlowCompletion - */ /** + * + * \ingroup Pkt + * \brief Return whether the packet can be held indefinitely without + * completion or not. + * + * This flag is set via vmk_PktSetCompletionData(). + * + * Packet receivers that can incur long delays are sensitive to the + * setting of this flag, and examine its value to determine what action + * to take. If the packet does NOT have allowSlowCompletion enabled, then + * such a receiver will need to make a deep copy of the frame, allowing + * the original frame to be completed earlier. + * + * An example packet receiver with long delays is the vmkernel TCP/IP + * stack. The long delays may occur due to fragment reassembly, packet + * reordering, or the zero-copy receive optimization. + * + * Another example is guest vNic's such as vlance that make use of a + * packet's fragments during their receive processing. The packet cannot + * be completed until the vNic indicates that it is done with the packet. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Packet can be held indefinitely + * without completion. + * \retval VMK_FALSE Packet can't be held indefinitely + * without completion. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktAllowSlowCompletion(vmk_PktHandle *pkt) +{ + return (((pkt->pktDesc-> flags & VMK_PKTDESC_FLAG_NOTIFY_COMPLETE) != 0) && + ((pkt->pktDesc->flags & VMK_PKTDESC_FLAG_SLOW_COMPLETION) != 0)) ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktPriorityGet -- */ /** + * + * \ingroup Pkt + * \brief Returns the 802.1p priority associated with the given packet. + * + * \note The priority that is returned is part of the vmk_PktHandle + * metadata, it doesn't come from the ethernet header of the + * underlying frame. + * + * \param[in] pkt Target packet. + * + * \return Packet priority. + * + *********************************************************************** + */ + +vmk_VlanPriority vmk_PktPriorityGet(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktPrioritySet -- */ /** + * + * \ingroup Pkt + * \brief Modify 802.1p priority of the given packet. + * + * This function sets the priority metadata for the given packet and if + * supplied a non-zero priority marks the packet as "must insert VLAN + * tag" so that tag insertion is performed prior to final delivery of the + * frame. A zero priority value will clear this flag, and is identical + * to calling vmk_PktPriorityClear(). + * + * \note The priority that is modified is part of the vmk_PktHandle + * metadata, this function doesn't change the ethernet header of + * the underlying frame. + * + * \note If priority parameter is outside the range of [0-7] then this + * function will cause an ASSERT failure on debug builds, and + * set (priority % 8) instead on release builds. + * + * \param[in] pkt Target packet. + * \param[in] priority New priority between [0-7]. + * + *********************************************************************** + */ + +void vmk_PktPrioritySet(vmk_PktHandle *pkt, + vmk_VlanPriority priority); + + +/* + *********************************************************************** + * vmk_PktPriorityClear -- */ /** + * + * \ingroup Pkt + * \brief Clear 802.1p priority of the given packet. + * + * This function sets the priority metadata for the given packet to 0 and + * unsets the "must insert VLAN tag" flag. + * + * \note The priority that is cleared is part of the vmk_PktHandle + * metadata, this function doesn't change the ethernet header of + * the underlying frame. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +void vmk_PktPriorityClear(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktVlanIDGet -- */ /** + * + * \ingroup Pkt + * \brief Returns the VLAN ID associated with the given packet. + * + * \note The VLAN ID that is returned is part of the vmk_PktHandle + * metadata, it doesn't come from the ethernet header of the + * underlying frame. + * + * \param[in] pkt Target packet. + * + * \return VLAN ID associated with the packet. + * + *********************************************************************** + */ + +vmk_VlanID vmk_PktVlanIDGet(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktVlanIDSet -- */ /** + * + * \ingroup Pkt + * \brief Modify the VLAN ID of the given packet. + * + * This function sets the VLAN ID metadata for the given packet and if + * supplied a non-zero VLAN ID marks the packet as "must insert VLAN + * tag" so that tag insertion is performed prior to final delivery of the + * frame. A zero VLAN ID value will clear this flag, and is identical to + * calling vmk_PktVlanIDClear(). + * + * \note The VLAN ID that is modified is part of the vmk_PktHandle + * metadata, this function doesn't change the ethernet header of + * the underlying frame. + * + * \note If vid parameter is outside the range of [0-4094] then this + * function will cause an ASSERT failure on debug builds, and + * set (vid % 4095) instead on release builds. + * + * \param[in] pkt Target packet. + * \param[in] vid New VLAN ID between [0-4094]. + * + *********************************************************************** + */ + +void vmk_PktVlanIDSet(vmk_PktHandle *pkt, + vmk_VlanID vid); + +/* + *********************************************************************** + * vmk_PktVlanIDClear -- */ /** + * + * \ingroup Pkt + * \brief Clear the VLAN ID of the given packet. + * + * This function sets the VLAN ID metadata for the given packet to 0 and + * unsets the "must insert VLAN tag" flag. + * + * \note The VLAN ID that is cleared is part of the vmk_PktHandle + * metadata, this function doesn't change the ethernet header of + * the underlying frame. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +void vmk_PktVlanIDClear(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktSetCsumVfd -- */ /** + * + * \ingroup Pkt + * \brief Mark the given packet as "TCP/UDP checksum verified". + * + * If the packet's TCP/UDP checksum has already been verified, mark it + * with this flag before queueing it for Rx processing. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt, otherwise + * the flag will NOT be set. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +static inline void +vmk_PktSetCsumVfd(vmk_PktHandle *pkt) +{ + if (vmk_PktIsBufDescWritable(pkt)) { + pkt->bufDesc->flags |= VMK_PKTBUF_FLAG_CSUM_VFD; + } +} + +/* + *********************************************************************** + * vmk_PktClearCsumVfd -- */ /** + * + * \ingroup Pkt + * \brief Clear the "TCP/UDP checksum verified" flag from the given + * packet. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt, otherwise + * the flag will NOT be cleared. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +static inline void +vmk_PktClearCsumVfd(vmk_PktHandle *pkt) +{ + if (vmk_PktIsBufDescWritable(pkt)) { + pkt->bufDesc->flags &= ~VMK_PKTBUF_FLAG_CSUM_VFD; + } +} + +/* + *********************************************************************** + * vmk_PktIsMustCsum -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the given packet requires TCP/UDP checksum to + * be computed. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Checksumming needed. + * \retval VMK_FALSE Checksumming not needed. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktIsMustCsum(const vmk_PktHandle *pkt) +{ + return (pkt->bufDesc->flags & VMK_PKTBUF_FLAG_MUST_CSUM) != 0 ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktClearMustCsum -- */ /** + * + * \ingroup Pkt + * \brief Clear the "TCP/UDP checksum needs to be computed" flag for the + * given packet. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +static inline void +vmk_PktClearMustCsum(const vmk_PktHandle *pkt) +{ + VMK_ASSERT(vmk_PktIsBufDescWritable(pkt)); + pkt->bufDesc->flags &= ~VMK_PKTBUF_FLAG_MUST_CSUM; +} + +/* + *********************************************************************** + * vmk_PktSetMustCsum -- */ /** + * + * \ingroup Pkt + * \brief Mark the given packet as "TCP/UDP checksum needs to be + * computed". + * + * \pre The frame contained by pkt must be a IPv4 or IPv6 TCP/UDP + * frame. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE for pkt. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +static inline void +vmk_PktSetMustCsum(const vmk_PktHandle *pkt) +{ + VMK_ASSERT(vmk_PktIsBufDescWritable(pkt)); + pkt->bufDesc->flags |= VMK_PKTBUF_FLAG_MUST_CSUM; +} + +/* + *********************************************************************** + * vmk_PktMustVlanTag -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the given packet is marked as "must insert + * VLAN tag". + * + * \see vmk_PktVlanIDSet(), vmk_PktPrioritySet() + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Vlan tag needs to be inserted before final + * delivery. + * \retval VMK_FALSE Vlan tag insertion is not necessary. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktMustVlanTag(vmk_PktHandle *pkt) +{ + return ((pkt->flags & VMK_PKT_FLAG_MUST_TAG) || + (pkt->flags & VMK_PKT_FLAG_MUST_TAG_REDIRECT)) ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktIsLargeTcpPacket -- */ /** + * + * \ingroup Pkt + * \brief Returns whether the given packet is marked as "requires + * TCP segmentation offload". + * + * \see vmk_PktSetLargeTcpPacket() + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE TCP Segmentation Offload is needed. + * \retval VMK_FALSE TCP Segmentation Offload is not needed. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktIsLargeTcpPacket(const vmk_PktHandle *pkt) +{ + return (pkt->bufDesc->flags & VMK_PKTBUF_FLAG_MUST_TSO) != 0 ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_PktSetLargeTcpPacket -- */ /** + * + * \ingroup Pkt + * \brief Mark the given packet as "requires TCP segmentation offload". + * + * This function marks a packet as requiring TCP segmentation offload + * and sets the maximum segment size to be used by the segmentation + * implementation. TCP packets that are larger than the underlying MTU + * value due to certain optimizations need to be marked with this flag + * so that vmkernel can take appropriate action before delivery of the + * frame to an endpoint that doesn't support receiving such packets + * (software segmentation) or if the packet is going out of a pNIC that + * supports TSO to use hardware offload. + * + * \pre vmk_PktIsBufDescWritable() must be TRUE on this packet. + * + * \param[in] pkt Target packet. + * \param[in] mss Maximum segment size of the TCP connection for + * use by the software/hardware segmentation + * implementation. + * + *********************************************************************** + */ + +static inline void +vmk_PktSetLargeTcpPacket(vmk_PktHandle *pkt, + vmk_uint32 mss) +{ + VMK_ASSERT(vmk_PktIsBufDescWritable(pkt)); + + pkt->bufDesc->flags |= VMK_PKTBUF_FLAG_MUST_TSO; + pkt->bufDesc->tsoMss = mss; +} + +/* + *********************************************************************** + * vmk_PktGetLargeTcpPacketMss -- */ /** + * + * \ingroup Pkt + * \brief Returns the MSS value set with vmk_PktSetLargeTcpPacket(). + * + * \param[in] pkt Target packet. + * + * \return Maximum segment size of the TCP connection. + * + *********************************************************************** + */ + +static inline vmk_uint32 +vmk_PktGetLargeTcpPacketMss(vmk_PktHandle *pkt) +{ + VMK_ASSERT(vmk_PktIsLargeTcpPacket(pkt)); + + return pkt->bufDesc->tsoMss; +} + +/* + *********************************************************************** + * vmk_PktCopyMetaData -- */ /** + * + * \ingroup Pkt + * \brief Copy packet metadata from the given source packet into the + * given destination packet. + * + * This function copies the vmk_PktHandle metadata from srcPkt into + * dstPkt. The following fields are copied: + * + * - VLAN ID + * - Priority + * - Must VLAN tag flag + * + * \note The completion context pointers for dstPkt are cleared as a + * result of this function (see vmk_PktClearCompletionData()). + * + * \pre dstPkt has to be a master vmk_PktHandle with no outstanding + * references. + * + * \pre vmk_PktIsDescWritable() needs to be VMK_TRUE for dstPkt. + * + * \param[in] srcPkt Source packet with the metadata to copy. + * \param[in] dstPkt Packet to copy the metadata into. + * + *********************************************************************** + */ + +void vmk_PktCopyMetaData(vmk_PktHandle *srcPkt, + vmk_PktHandle *dstPkt); + +/* + *********************************************************************** + * vmk_PktCheckConsistency -- */ /** + * + * \ingroup Pkt + * \brief Check for inconsistencies in the internal representation + * of the given packet. + * + * This function is intended for debugging purposes and should not be + * called from the data path. It is intended for code that directly + * manipulates vmk_PktHandle fields instead of using vmk_Pkt* API's. + * Note that this is not recommended. + * + * \param[in] pkt Target packet. + * + * \retval VMK_TRUE Packet is consistent. + * \retval VMK_FALSE Packet is not consistent. + * + *********************************************************************** + */ + +vmk_Bool vmk_PktCheckInternalConsistency(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktSetIsCorrupted -- */ /** + * + * \ingroup Pkt + * \brief Mark a packet as having been corrupted. + * + * This function is intended for bookkeeping of stress option induced + * corruption in the frame contents of the packet. It shouldn't be used + * except for debugging purposes. + * + * \param[in] pkt Target packet. + * + *********************************************************************** + */ + +void vmk_PktSetIsCorrupted(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktPartialCopy -- */ /** + * + * \ingroup Pkt + * \brief Create a partial copy of the given packet with a private + * writable region. + * + * This function can be used by modules which intend to modify a packet. + * In general only the frame mapped area of a packet is allowed to be + * modified, and only when vmk_PktIsBufDescWritable() is VMK_TRUE for + * that packet. If the data beyond the frame mapped length needs to be + * modified or vmk_PktIsBufDescWritable is VMK_FALSE, a partial copy of + * the packet should be made with this function in order to modify the + * frame contents. The numBytes parameter describes the number of bytes + * modifiable in the frame mapped area of the resulting packet. + * + * All partial copies are related to the original packet. The source + * packet cannot be completed or released until all the partial copies + * have been completed or released. + * + * The private area of the resulting packet starts at its frame mapped + * pointer (see vmk_PktFrameMappedPointerGet()) and will have a + * vmk_PktFrameMappedLenGet() value at least as much as the requested + * numBytes parameter, and at most the frame length of the original + * packet. Frame contents in this region can be modified, whereas frame + * contents beyond this region are still shared with the original packet + * and as such can't be modified. + * + * \note It is possible for the vmk_PktFrameMappedLenGet() of the + * resulting packet to be larger than the requested size. For + * example, when a partial copy is made of a packet which is + * already a partial copy, the vmk_PktFrameMappedLenGet() of the + * result will be at least as large as the original packet. + * + * \note If the source packet has a headroom, it will not be retained + * on the resulting packet. + * + * \note Requests of numBytes larger than the frame length of pkt are + * truncated to the frame length. By using the frame length + * as numBytes, a complete private copy of the original frame + * is created. + * + * \note Partial copies can be made on packets which are the result + * of previous vmk_PktPartialCopy() calls. + * + * \param[in] pkt Target packet. + * \param[in] numBytes Number of bytes in the private region of + * the resulting packet. + * \param[out] copyPkt Resulting packet with a private mapped + * region. + * + * \retval VMK_OK If the partial copy was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktPartialCopy(vmk_PktHandle *pkt, + vmk_uint32 numBytes, + vmk_PktHandle **copyPkt); + +/* + *********************************************************************** + * vmk_PktPartialCopyWithHeadroom -- */ /** + * + * \ingroup Pkt + * + * \brief Create a partial copy of the given packet with a private area + * and headroom in front of the frame. + * + * This function is identical to vmk_PktPartialCopy() except that the + * resulting frame will also contain headroomLen bytes of headroom. + * + * \see vmk_PktPartialCopy(), vmk_PktPushHeadroom() + * + * \param[in] pkt Target packet. + * \param[in] numBytes Number of bytes in the private region of + * the resulting packet. + * \param[in] headroomLen Number of bytes in the headroom of the + * resulting packet. + * \param[out] copyPkt Resulting packet with a private mapped + * region and requested amount of headroom. + * + * \retval VMK_OK If the partial copy was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktPartialCopyWithHeadroom(vmk_PktHandle *pkt, + vmk_uint32 numBytes, + vmk_uint16 headroomLen, + vmk_PktHandle **copyPkt); + +/* + *********************************************************************** + * vmk_PktCopy -- */ /** + * + * \ingroup Pkt + * \brief Create a copy of the frame contents of the given packet. + * + * This function is identical to calling vmk_PktPartialCopy() with + * vmk_PktFrameLenGet() as the numBytes argument. + * + * \see vmk_PktPartialCopy() + * + * \note Although a full frame copy, copyPkt is still related to the + * source packet. The source packet won't be completed until + * copyPkt is completed (and vice versa). Any part of copyPkt + * that is beyond frameLen (rounded up for alignment) will be + * a reference to the source packet. + * + * \note Every packet pushed into a module is considered read-only by + * default. This function is a way to change this policy. In + * copyPkt, the frame contents are guarenteed to be mapped and + * physically contiguous. + * + * \note pkt must have a frame length greater than 0. + * + * \param[in] pkt Source packet. + * \param[out] copyPkt Resulting packet with a private mapped region. + * + * \retval VMK_OK If the partial copy was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktCopy(vmk_PktHandle *pkt, + vmk_PktHandle **copyPkt); + +/* + *********************************************************************** + * vmk_PktCopyWithHeadroom -- */ /** + * + * \ingroup Pkt + * \brief Create a copy of the frame contents of the given packet and + * add headroom in front of the frame. + * + * This function is identical to calling vmk_PktPartialCopyWithHeadroom() + * with vmk_PktFrameLenGet() as the numBytes argument. + * + * \see vmk_PktPartialCopyWithHeadroom() + * + * \note Although a full frame copy, copyPkt is still related to the + * source packet. The source packet won't be completed until + * copyPkt is completed (and vice versa). Any part of copyPkt + * that is beyond frameLen will be a reference to the source + * packet. Also, if the source packet has existing headroom, + * it won't be maintained in the copy. + * + * \note Every packet pushed into a module is considered read-only by + * default. This function is a way to change this policy. In + * copyPkt, the frame contents are guarenteed to be mapped and + * physically contiguous. + * + * \param[in] pkt Source packet. + * \param[in] headroomLen Number of bytes in the headroom of the + * resulting packet. + * \param[out] copyPkt Resulting packet with a private mapped + * region and requested amount of headroom. + * + * \retval VMK_OK If the partial copy was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktCopyWithHeadroom(vmk_PktHandle *pkt, + vmk_uint16 headroomLen, + vmk_PktHandle **copyPkt); + +/* + *********************************************************************** + * vmk_PktClone -- */ /** + * + * \ingroup Pkt + * \brief Create a clone of the given packet. + * + * This function is identical to calling vmk_PktPartialCopy() with 0 as + * the numBytes argument. The resulting packet has no private region + * (hence is read-only) and refers to the all the buffers in the source + * packet. + * + * \see vmk_PktPartialCopy() + * + * \note The headroom from the source packet is not guaranteed to be + * retained in the resulting clone packet, although in some + * cases it may be retained. + * + * \param[in] pkt Source packet. + * \param[out] clonePkt Resulting packet that is a read-only copy + * of the source packet. + * + * \retval VMK_OK If the partial copy was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktClone(vmk_PktHandle *pkt, + vmk_PktHandle **clonePkt); + +/* + *********************************************************************** + * vmk_PktGetHeadroomLen -- */ /** + * + * \ingroup Pkt + * \brief Return the length of headroom in front of the frame contents + * of the given packet. + * + * \param[in] pkt Target packet. + * + * \retval >=0 Length of the headroom. + * + *********************************************************************** + */ + +vmk_uint16 vmk_PktGetHeadroomLen(vmk_PktHandle *pkt); + +/* + *********************************************************************** + * vmk_PktPushHeadroom -- */ /** + * + * \ingroup Pkt + * \brief Increase the size of the headroom in front of the frame + * contents of the given packet. + * + * "Push" the start of frame pointer forward without changing the frame + * contents. After this operation the frame length is reduced by + * headroomLen and the frame mapped pointer is pushed forward by + * headroomLen. + * + * \note The headroomLen argument should be at most as large as the + * minimum of the packet's frame length and frame mapped length. + * + * \param[in] pkt Target packet. + * \param[in] headroomLen Amount of bytes to add to the headroom. + * + * \retval VMK_OK The headroom has been enlarged properly. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktPushHeadroom(vmk_PktHandle *pkt, + vmk_uint16 headroomLen); + +/* + *********************************************************************** + * vmk_PktPullHeadroom -- */ /** + * + * \ingroup Pkt + * \brief Decrease the size of the headroom in front of the frame + * contents of the given packet. + * + * \note As a result of decreasing the headroom space, the length of + * the frame mapped area and the set of fragments will be modified. + * The frame length will also be updated as a result. + * + * \param[in] pkt Target packet. + * \param[in] headroomLen Amount of bytes to reduce from the headroom. + * + * \retval VMK_OK The headroom has been reduced properly. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktPullHeadroom(vmk_PktHandle *pkt, + vmk_uint16 headroomLen); + +/* + *********************************************************************** + * vmk_PktDup -- */ /** + * + * \ingroup Pkt + * \brief Make a full, independent copy of the given vmk_PktHandle + * + * The following fields are identical with the source packet in the + * resulting packet: + * + * - Frame contents (fragment layout will likely differ) + * - Frame length + * - VLAN ID + * - Priority + * - Must VLAN tag flag + * - Checksum computation required flag + * - Checksum verified flag + * - TSO required flag + * - TSO maximum segment size value + * + * The following fields are NOT retained in the resulting packet: + * + * - Completion context pointers + * - Completion required flag + * - Headroom + * + * It is legal to call this function with a source packet that is the + * result of a previous vmk_PktPartialCopy() family function call. The + * resulting packet will be independent from those packets (will be a + * master packet) and is fully modifiable (vmk_PktIsBufDescWritable() + * and vmk_PktIsDescWritable() will be VMK_TRUE). + * + * \param[in] pkt Target packet. + * \param[out] dupPkt Resulting duplicate packet. + * + * \retval VMK_OK If the duplication was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktDup(vmk_PktHandle *pkt, + vmk_PktHandle **dupPkt); + +/* + *********************************************************************** + * vmk_PktDupAndCsum -- */ /** + * + * \ingroup Pkt + * \brief Make a full, independent copy of the given vmk_PktHandle and + * perform checksumming on the frame. + * + * This function is identical to vmk_PktDup() except that the TCP/UDP + * checksum for the frame contents is computed and inserted into the + * frame. + * + * \see vmk_PktDup() + * + * \pre The frame contained by pkt must be a IPv4 or IPv6 TCP/UDP + * frame. + * + * \param[in] pkt Target packet. + * \param[out] dupPkt Resulting duplicate packet. + * + * \retval VMK_OK If the duplication was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktDupAndCsum(vmk_PktHandle *pkt, + vmk_PktHandle **dupPkt); + +/* + *********************************************************************** + * vmk_PktDupWithHeadroom -- */ /** + * + * \ingroup Pkt + * \brief Make a full, independent copy of the given vmk_PktHandle and + * add headroom in front of the frame. + * + * This function is identical to vmk_PktDup() except that the resulting + * packet will also have a headroom of the specified size added in front + * of the frame contents. + * + * \see vmk_PktDup() + * + * \param[in] pkt Target packet. + * \param[in] headroomLen Number of headroom bytes before the actual + * frame. + * \param[out] dupPkt Resulting duplicate packet. + * + * \retval VMK_OK If the duplication was successful. + * \retval VMK_BAD_PARAM If either pkt or dupPkt is NULL. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktDupWithHeadroom(vmk_PktHandle *pkt, + vmk_uint16 headroomLen, + vmk_PktHandle **dupPkt); + +/* + *********************************************************************** + * vmk_PktDupLenWithHeadroomAndTailroom -- */ /** + * + * \ingroup Pkt + * \brief Make a partial, independent, copy of the pkt and meta data + * optionally adding headroom to dup + * + * This is like vmk_PktDupWithHeadroom(), except that it copies only the + * specified "dupLen" bytes of frame data, and it adds extra space after + * the frame that can be used to append additional data. This routine + * should not be used for the trivial case where dupLen is 0. + * + * \param[in] pkt Original packet. + * \param[in] dupLen Amount to duplicate. + * \param[in] headroomLen Amount of headroom needed before actual frame. + * \param[in] tailroomLen Amount of tailroom needed after actual frame. + * \param[out] dupPkt New packet with partial copy of data. + * + * \retval VMK_OK If the duplication was successful. + * \retval VMK_BAD_PARAM If either pkt or dupPkt is NULL. + * \retval VMK_BAD_PARAM If value of dupLen is not > 0. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktDupLenWithHeadroomAndTailroom(vmk_PktHandle *pkt, + vmk_uint32 dupLen, + vmk_uint16 headroomLen, + vmk_uint16 tailroomLen, + vmk_PktHandle **dupPkt); + +/* + *********************************************************************** + * vmk_PktDupAndCsumWithHeadroom -- */ /** + * + * \ingroup Pkt + * \brief Makes a full, independent copy of the given vmk_PktHandle, + * performs checksumming and adds headroom in front of the + * frame. + * + * This function is identical to vmk_PktDupAndCsum() except that the + * resulting packet will also have a headroom of the specified size added + * in front of the frame contents. + * + * \see vmk_PktDupAndCsum() + * + * \pre The frame contained by pkt must be a IPv4 or IPv6 TCP/UDP + * frame. + * + * \param[in] pkt Target packet. + * \param[in] headroomLen Number of headroom bytes before the actual + * frame. + * \param[out] dupPkt Resulting duplicate packet. + * + * \retval VMK_OK If the duplication was successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktDupAndCsumWithHeadroom(vmk_PktHandle *pkt, + vmk_uint16 headroomLen, + vmk_PktHandle **dupPkt); + +/* + *********************************************************************** + * vmk_PktPullHdrIntoMappedSpace -- */ /** + * + * \ingroup Pkt + * \brief Pulls data from scatter-gather fragments into the mapped region. + * + * This function copies hdrCopyLen bytes starting from the end of the + * frame mapped region (vmk_PktFrameMappedLenGet()) into the frame mapped + * region starting at targetOffset. + * + * This function is typically used when a new packet is being constructued. + * Space is reserved in the frame mapped region of the packet to contain + * a prefix of the packet. Scatter-gather fragments are then added to the + * packet. When sufficient fragments have been added, the prefix portion + * of the packet is copied into the frame mapped region, and the packet's + * scatter-gather array is adjusted to "excise" the copied portion. This + * function also takes care of the case when the resulting packet is + * smaller than the original reserved space, in which case more of the + * packet, including the tail-end of the frame mapped region, is excised + * from the pkt. + * + * \note frame mapped length should be >= targetOffset + hdrCopyLen. + * + * \param[in] pkt Target packet. + * \param[in] targetOffset Offset in the frame mapped region to copy + * data into. + * \param[out] hdrCopyLen Length of data to copy starting from frame + * mapped length as the offset. + * + * \retval VMK_OK If successful. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktPullHdrIntoMappedSpace(vmk_PktHandle *pkt, + vmk_uint32 targetOffset, + vmk_uint32 hdrCopyLen); + +/* + *********************************************************************** + * vmk_PktCopyBytesOut -- */ /** + * + * \ingroup Pkt + * \brief Copies bytes from a packet into a contiguous local buffer. + * + * \note length == 0 is allowed; result will be VMK_OK with no bytes copied. + * + * \param[in] buffer Buffer to copy pkt data to. + * \param[in] length Amount of pkt data to copy. + * \param[in] offset Pkt offset from which to begin copy. + * \param[in] pkt Source packet. + * + * \retval VMK_OK If successful. + * \retval VMK_BAD_PARAM If buffer or pkt pointer is NULL. + * \retval VMK_BAD_PARAM If length + offset is beyond the pkt's mem. + * \retval VMK_INVALID_ADDRESS If pkt frag MA is invalid. + * \retval VMK_FAILURE Otherwise. + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_PktCopyBytesOut(vmk_uint8 *buffer, + vmk_size_t length, + vmk_uint32 offset, + vmk_PktHandle *pkt); + +#endif +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt_incompat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt_incompat.h new file mode 100644 index 0000000..4c89aee --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pkt_incompat.h @@ -0,0 +1,90 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Pkt */ /** + * \addtogroup Network + *@{ + * \defgroup PktIncompat Packet Management (incompatible) + *@{ + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_PKT_INCOMPAT_H_ +#define _VMKAPI_NET_PKT_INCOMPAT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_memory.h" + +#include "net/vmkapi_net_types.h" +#include "net/vmkapi_net_pkt.h" + +/* + *********************************************************************** + * vmk_PktSlabAllocPage -- */ /** + * + * \ingroup PktIncompat + * \brief Allocate one or more pages from the packet page pool. + * + * \note If more than one page is allocated through this API they are + * guaranteed to be physically contiguous. + * + * \param[in] numPages Number of pages to allocate. + * \param[in] allocFlags If VMK_PKT_ALLOC_FROM_LOW_MEM is specified + * then the pages are guaranteed to be allocated + * from low memory (<4GB) only. Otherwise the + * pages will be allocated from any memory. + * \param[out] firstPage First page in the resulting allocation block. + * + * \retval VMK_OK Allocation successful. + * \retval VMK_BAD_PARAM If firstPage is NULL. + * \retval VMK_NO_MEMORY Not enough memory in the page pool + * to satisfy the request. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_PktSlabAllocPage(vmk_uint32 numPages, + vmk_PktAllocFlags allocFlags, + vmk_MachPage *firstPage); + +/* + *********************************************************************** + * vmk_PktSlabFreePage -- */ /** + * + * \ingroup PktIncompat + * \brief Free one or more pages allocated from the packet page pool + * back to it. + * + * \note The pages must have been originally allocated through + * vmk_PktSlabAllocPage() and not any other page allocation mechanism. + * + * \note Pages must be free'd in the same block size that they have been + * allocated with. For example, a call to vmk_PktSlabAllocPage() for 6 + * pages should only be followed by a vmk_PktSlabFreePage() for all the + * 6 pages, and not individual calls for each page, or two calls for 3 + * pages each. + * + * \param[in] page First page in the block that is being freed. + * \param[in] numPages Number of pages to free. + * + *********************************************************************** + */ +void vmk_PktSlabFreePage(vmk_MachPage page, + vmk_uint32 numPages); + +#endif +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pktlist.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pktlist.h new file mode 100644 index 0000000..be4fc3c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pktlist.h @@ -0,0 +1,574 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * PktList */ /** + * \addtogroup Network + *@{ + * \defgroup PktList Packet List Management + *@{ + * + * \par Packet Lists: + * + * Packet list are an important entity in vmkernel as any set of packets + * are represented through this data structure. + * Every module will need to deal with it as vmkernel expects it to + * be able to. + * + * For example if a module is intended to manage device driver and want + * vmkernel to use it in order to communicate with the external world, + * it will receive packet lists for Tx process. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_PKTLIST_H_ +#define _VMKAPI_NET_PKTLIST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_cslist.h" + +#include "net/vmkapi_net_types.h" + +/* + * Structure representing the packet list. + */ + +typedef struct vmk_PktList { + vmk_Bool mayModify; + vmk_CSList csList; +} vmk_PktList; + +/* + *********************************************************************** + * vmk_PktListInit -- */ /** + * + * \ingroup PktList + * \brief Initialize a packet list. + * + * \param[in] pktList Target packet list + * + *********************************************************************** + */ + +static inline void +vmk_PktListInit(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + pktList->mayModify = VMK_FALSE; + vmk_CSListInit(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListCount -- */ /** + * + * \ingroup PktList + * \brief Retrieve the number of a packet in a specified packet list. + * + * \param[in] pktList Target packet list + * + * \return Number of packets in the list + * + *********************************************************************** + */ + +static inline vmk_uint32 +vmk_PktListCount(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + return vmk_CSListCount(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListIsConsistent -- */ /** + * + * \ingroup PktList + * \brief Check if a packet list is consistent or not. + * + * \param[in] list Target packet list. + * + * \retval VMK_TRUE List is correct. + * \retval VMK_FALSE List is corrupted. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktListIsConsistent(vmk_PktList *list) +{ + if (!list) { + return VMK_FALSE; + } + + if ((vmk_SListFirst(&list->csList.slist) == NULL) && + (vmk_SListLast(&list->csList.slist) == NULL) && + (vmk_PktListCount(list) == 0)) { + return VMK_TRUE; /* empty list. */ + } else if (!((vmk_SListFirst(&list->csList.slist) != NULL) && + (vmk_SListLast(&list->csList.slist) != NULL) && + (vmk_PktListCount(list) != 0))) { + return VMK_FALSE; /* inconsistent non-empty list. */ + } + + { /* counting packets */ + vmk_uint32 i = 0; + vmk_SList_Links *cur, *prev = NULL; + + VMK_CSLIST_FORALL(&list->csList, cur) { + prev = cur; + if (++i > vmk_PktListCount(list)) { /* too many elements? */ + return VMK_FALSE; + } + } + + if (i != vmk_PktListCount(list)) { /* list count is correct? */ + return VMK_FALSE; + } + + if (prev != vmk_SListLast(&list->csList.slist)) { /* tail is correct? */ + return VMK_FALSE; + } + + if (prev->next != NULL) { /* list NULL terminated? */ + return VMK_FALSE; + } + } + + return VMK_TRUE; +} + +/* + *********************************************************************** + * vmk_PktListIsEmpty -- */ /** + * + * \ingroup PktList + * \brief Check if a specified packet list is empty. + * + * \param[in] pktList Target packet list. + * + * \retval VMK_TRUE List empty. + * \retval VMK_FALSE List not empty. + * + *********************************************************************** + */ + +static inline vmk_Bool +vmk_PktListIsEmpty(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + return vmk_CSListIsEmpty(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListAddToHead -- */ /** + * + * \ingroup PktList + * \brief Add a specified packet at the front of a specified packet list. + * + * \param[in] pktList Target packet list. + * \param[in] pkt Packet to be added. + * + *********************************************************************** + */ + +static inline void +vmk_PktListAddToHead(vmk_PktList *pktList, + vmk_PktHandle *pkt) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(pkt); + vmk_CSListInsertAtHead(&pktList->csList, &pkt->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktListAddToTail -- */ /** + * + * \ingroup PktList + * \brief Add a specifed packet at the end of a specified packet list. + * + * \param[in] pktList Target packet list. + * \param[in] pkt Packet to be added. + * + *********************************************************************** + */ + +static inline void +vmk_PktListAddToTail(vmk_PktList *pktList, + vmk_PktHandle *pkt) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(pkt); + vmk_CSListInsertAtTail(&pktList->csList, &pkt->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktListInsertAfter -- */ /** + * + * \ingroup PktList + * \brief Insert a packet after the specified element in the packet list. + * + * \param[in] pktList Target packet list. + * \param[in] prev Packet to insert after. + * \param[in] pkt Packet to insert. + * + *********************************************************************** + */ + +static inline void +vmk_PktListInsertAfter(vmk_PktList *pktList, + vmk_PktHandle *prev, + vmk_PktHandle *pkt) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(prev); + VMK_ASSERT(pkt); + vmk_CSListInsertAfter(&pktList->csList, &pkt->pktLinks, &prev->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktListGetHead -- */ /** + * + * \ingroup PktList + * \brief Retrieve the packet in front of a specified packet list. + * + * \param[in] pktList Target packet list + * + * \retval NULL The list is empty. + * \return A pointer to the head of the list. + * + *********************************************************************** + */ + +static inline vmk_PktHandle * +vmk_PktListGetHead(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + return (vmk_PktHandle *) vmk_CSListFirst(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListGetNext -- */ /** + * + * \ingroup PktList + * \brief Retrieve the packet following a specified packet in a + * specified packet list. + * + * \param[in] pktList Target packet list. + * \param[in] pkt Target packet. + * + * \retval NULL End of the list. + * \return A pointer to the successor in the list. + * + *********************************************************************** + */ + +static inline vmk_PktHandle * +vmk_PktListGetNext(vmk_PktList *pktList, + vmk_PktHandle *pkt) +{ + VMK_ASSERT(pktList && pkt); + return (vmk_PktHandle *) vmk_CSListNext(&pkt->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktListGetPrev -- */ /** + * + * \ingroup PktList + * \brief Retrieve the packet preceding a specified packet in a + * specified packet list. + * + * \param[in] pktList Target packet list. + * \param[in] pkt Target packet. + * + * \retval NULL Beginning of the list. + * \return A pointer to the predecessor in the list. + * + *********************************************************************** + */ + +static inline vmk_PktHandle * +vmk_PktListGetPrev(vmk_PktList *pktList, + vmk_PktHandle *pkt) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(pkt); + return (vmk_PktHandle *) vmk_CSListPrev(&pktList->csList, &pkt->pktLinks); +} + + +/* + *********************************************************************** + * vmk_PktListGetTail -- */ /** + * + * \ingroup PktList + * \brief Retrieve the packet at the end of a specified packet list. + * + * \param[in] pktList Target packet list. + * + * \retval NULL The list is empty. + * \return A pointer to the tail of the list. + * + *********************************************************************** + */ + +static inline vmk_PktHandle * +vmk_PktListGetTail(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + return (vmk_PktHandle *) vmk_CSListLast(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListPopHead -- */ /** + * + * \ingroup PktList + * \brief Pop the packet in front of a specified packet list. + * + * \param[in] pktList Target packet list + * + * \return The head of the list + * + *********************************************************************** + */ + +static inline vmk_PktHandle * +vmk_PktListPopHead(vmk_PktList *pktList) +{ + VMK_ASSERT(pktList); + return (vmk_PktHandle *) vmk_CSListPop(&pktList->csList); +} + +/* + *********************************************************************** + * vmk_PktListRemoveFast -- */ /** + * + * \ingroup PktList + * \brief Fast method to remove a specified packet in a specified packet list. + * + * \note The caller needs to provide the previous packet of the removed + * one in order to use this optimization. + * + * \param[in] pktList Target packet list + * \param[in] pkt Packet to be removed + * \param[in] ppkt Packet preceding the removed one + * + *********************************************************************** + */ + +static inline void +vmk_PktListRemoveFast(vmk_PktList *pktList, + vmk_PktHandle *pkt, + vmk_PktHandle *ppkt) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(pkt); + + /* This is required for the prev == NULL case to work */ +#ifndef __cplusplus + VMK_ASSERT_ON_COMPILE(VMK_SLIST_ENTRY(ppkt, vmk_PktHandle, pktLinks) == ppkt); +#endif + + vmk_CSListRemove(&pktList->csList, &pkt->pktLinks, &ppkt->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktListRemove -- */ /** + * + * \ingroup PktList + * \brief Remove a specified packet in a specified packet list. + * + * \param[in] pktList Target packet list + * \param[in] pkt Packet to be removed + * + *********************************************************************** + */ + +static inline void +vmk_PktListRemove(vmk_PktList *pktList, + vmk_PktHandle *pkt) +{ + vmk_PktHandle *prevEntry; + VMK_ASSERT(pktList); + VMK_ASSERT(pkt); + VMK_ASSERT(vmk_PktListCount(pktList)); + + prevEntry = vmk_PktListGetPrev(pktList, pkt); + vmk_PktListRemoveFast(pktList, pkt, prevEntry); +} + +/* + *********************************************************************** + * vmk_PktListJoin -- */ /** + * + * \ingroup PktList + * \brief Remove and append all the packets of one sourcepacket list at + * the end of a destination packet list. + * + * \note After this call the source packet list is empty. + * + * \param[in] pktListDest Packet list destination + * \param[in] pktListSrc Packet list source + * + * + *********************************************************************** + */ + +static inline void +vmk_PktListJoin(vmk_PktList *pktListDest, + vmk_PktList *pktListSrc) +{ + VMK_ASSERT(pktListDest); + VMK_ASSERT(pktListSrc); + + vmk_CSListAppend(&pktListDest->csList, &pktListSrc->csList); +} + +/* + *********************************************************************** + * vmk_PktListReleasePkts -- */ /** + * + * \ingroup PktList + * \brief Release all the packets of a specified packet list. + * + * \note This function take care of the packet Tx completion. + * + * \param[in] pktList Target packet list + * + *********************************************************************** + */ + +extern void +vmk_PktListReleasePkts(vmk_PktList *pktList); + +/* + *********************************************************************** + * vmk_PktListAppendN -- */ /** + * + * \ingroup PktList + * \brief Remove and append the first n packets of a source packet + * list at the end of a destination packet list. + * + * \param[in] pktListDest Packet list destination + * \param[in] pktListSrc Packet list source + * \param[in] numPkts Number of packets at the front to appended + * + *********************************************************************** + */ + +static inline void +vmk_PktListAppendN(vmk_PktList *pktListDest, + vmk_PktList *pktListSrc, + vmk_uint32 numPkts) +{ + VMK_ASSERT(pktListDest); + VMK_ASSERT(pktListSrc); + + vmk_CSListAppendN(&pktListDest->csList, &pktListSrc->csList, numPkts); +} + +/* + *********************************************************************** + * vmk_PktListPrepend -- */ /** + * + * \ingroup PktList + * \brief Join two lists by prepending the source list before the + * destination. + * + * \param[in] pktListDest Packet list destination + * \param[in] pktListSrc Packet list source + * + *********************************************************************** + */ + +static inline void +vmk_PktListPrepend(vmk_PktList *pktListDest, vmk_PktList *pktListSrc) +{ + VMK_ASSERT(pktListDest); + VMK_ASSERT(pktListSrc); + + vmk_CSListPrepend(&pktListDest->csList, &pktListSrc->csList); +} + +/* + *********************************************************************** + * vmk_PktListReplace -- */ /** + * + * \ingroup PktList + * \brief Replace the given entry with a new entry. Runs O(1). + * + * \param[in] pktList Packet list destination + * \param[in] targetEntry Entry to replace + * \param[in] newEntry New entry + * \param[in] prevEntry Predecessor of the entry to replace + * + *********************************************************************** + */ + +static inline void +vmk_PktListReplace(vmk_PktList *pktList, + vmk_PktHandle *targetEntry, + vmk_PktHandle *newEntry, + vmk_PktHandle *prevEntry) +{ + VMK_ASSERT(pktList); + VMK_ASSERT(vmk_PktListCount(pktList)); + VMK_ASSERT(targetEntry); + + vmk_CSListReplace(&pktList->csList, &targetEntry->pktLinks, + &newEntry->pktLinks, &prevEntry->pktLinks); +} + +/* + *********************************************************************** + * vmk_PktTcpSegmentation -- */ /** + * + * \ingroup PktList + * + * \brief Software TSO. The TSO friendly TCP/IP stack will make sure + * the next IP frame won't have a conflicting IP id #. ipId + * are incremented starting with the ident of the original + * (non-segmented) packet. + * + * \note It is the responsibility of the caller to ensure the entire + * ip/tcp header is contained within frameVA/frameMappedLen. + * + * \param[in] pkt Packet to segment + * \param[out] pktList List of segment packets + * + * \retval VMK_OK If the segmentation was successful + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +extern VMK_ReturnStatus +vmk_PktTcpSegmentation(vmk_PktHandle *pkt, + vmk_PktList *pktList); + +#endif /* _VMKAPI_NET_PKTLIST_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pt.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pt.h new file mode 100644 index 0000000..9364bd7 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_pt.h @@ -0,0 +1,1144 @@ +/* ********************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Passthru */ /** + * \addtogroup Network + *@{ + * \defgroup Passthru Networking Passthrough + * + * Networking passthrough includes Uniform Passthrough (UPT) and + * Network Plugin Architecture (NPA). + *@{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_PT_H_ +#define _VMKAPI_NET_PT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "net/vmkapi_net_types.h" +#include "device/vmkapi_pci.h" + +/** Definition of maximum number passthrough regions for a VF */ +#define VMK_VF_MAX_PT_REGIONS 6 + +/** Definition of RSS indirection table maximum size */ +#define VMK_NETVF_RSS_MAX_IND_TABLE_SIZE 128 + +/** Definition of RSS hash key maximum size */ +#define VMK_NETVF_RSS_MAX_KEY_SIZE 40 + +/** Maximum length of a plugin name */ +#define VMK_NPA_MAX_PLUGIN_NAME_LEN 32 + +/** Maximum size of the plugin data (passed from PF driver to plugin) + in 32-bit words */ +#define VMK_NPA_MAX_PLUGIN_DATA_SIZE 32 + +/** Number of possible multicast MAC filters per VF (NPA) */ +#define VMK_NPA_MAX_MULTICAST_FILTERS 32 + +/** + * \ingroup Passthru + * \brief VF identifier + */ +typedef vmk_uint32 vmk_VFID; + +/** + * \ingroup Passthru + * \brief Passthru operations + * + * Each value corresponds to an operation that needs to be performed + * by the driver. + * + * The driver is called through a callback of the following form: + * + * VMK_ReturnStatus (*vmk_UplinkPTOpFunc)(void *clientData, + * vmk_NetPTOP op, + * void *args); + * + * `clientData' is the device (struct net_device *) in the case of a + * network driver. + * `args' is a pointer to an operation-specific argument + * structure. Please refer to the documentation of these structures + * (vmk_NetPTOP...Args) to see which one match to each operation. + */ +typedef enum vmk_NetPTOP { + /** Is passthrough supported */ + VMK_NETPTOP_IS_SUPPORTED = 0x00000001, + + /** Allocate a VF */ + VMK_NETPTOP_VF_ACQUIRE = 0x00000002, + + /** Initialize a VF */ + VMK_NETPTOP_VF_INIT = 0x00000003, + + /** Activate a VF */ + VMK_NETPTOP_VF_ACTIVATE = 0x00000004, + + /** Quiesce a VF */ + VMK_NETPTOP_VF_QUIESCE = 0x00000005, + + /** Save state of a VF */ + VMK_NETPTOP_VF_SAVE_STATE = 0x00000006, + + /** Release a VF */ + VMK_NETPTOP_VF_RELEASE = 0x00000007, + + /** Get VF information */ + VMK_NETPTOP_VF_GET_INFO = 0x00000008, + + /** Set RSS indirection table for a VF */ + VMK_NETPTOP_VF_SET_RSS_IND_TABLE = 0x00000009, + + /** Get traffic statistics of a queue */ + VMK_NETPTOP_VF_GET_QUEUE_STATS = 0x0000000a, + + /** Get status of a queue */ + VMK_NETPTOP_VF_GET_QUEUE_STATUS = 0x0000000b, + + /** Set the MAC address of a VF */ + VMK_NETPTOP_VF_SET_MAC = 0x0000000c, + + /** Set multicast MAC addresses filtered for a VF port */ + VMK_NETPTOP_VF_SET_MULTICAST = 0x0000000d, + + /** Control RX mode of a VF port */ + VMK_NETPTOP_VF_SET_RX_MODE = 0x0000000e, + + /** Add an authorized VLAN range to a VF port */ + VMK_NETPTOP_VF_ADD_VLAN_RANGE = 0x0000000f, + + /** Remove an authorized VLAN range from a VF port */ + VMK_NETPTOP_VF_DEL_VLAN_RANGE = 0x00000010, + + /** Setup VLAN insertion/stripping for a VF port */ + VMK_NETPTOP_VF_SET_DEFAULT_VLAN = 0x00000011, + + /** Enable MAC-address anti-spoofing on a VF port */ + VMK_NETPTOP_VF_SET_ANTISPOOF = 0x00000012, + + /** Add a MAC address filter to the PF */ + VMK_NETPTOP_PF_ADD_MAC_FILTER = 0x00000013, + + /** Delete a MAC address filter from the PF */ + VMK_NETPTOP_PF_DEL_MAC_FILTER = 0x00000014, + + /** Enable mirroring all traffic to the PF */ + VMK_NETPTOP_PF_MIRROR_ALL = 0x00000015 + +} vmk_NetPTOP; + +/** + * \ingroup Passthru + * \brief Enumeration of VF features. + */ +typedef enum vmk_NetVFFeatures { + /** Supports RX checksum offload */ + VMK_NETVF_F_RXCSUM = 0x0001, + + /** Supports Receive Side Scaling */ + VMK_NETVF_F_RSS = 0x0002, + + /** Supports RX VLAN acceleration */ + VMK_NETVF_F_RXVLAN = 0x0004, + + /** Supports Large Receive Offload */ + VMK_NETVF_F_LRO = 0x0008 + +} vmk_NetVFFeatures; + +/** + * \ingroup Passthru + * \brief Type for VF requested settings. + * + * This structure contains the main characteristics of a VF in the + * case of VF allocation and initialization. + * + * The `version' field can be used to distinguish between the + * different API versions on VF allocation (VMK_NETPTOP_VF_ACQUIRE). + */ +typedef struct vmk_NetVFRequirements { + /** Version of the UPT/NPA code */ + vmk_uint32 version; + + /** Features requested */ + vmk_NetVFFeatures features; + + /** Features optionally requested */ + vmk_NetVFFeatures optFeatures; + + /** MTU requested */ + vmk_uint16 mtu; + + /** Number of TX queues requested */ + vmk_uint8 numTxQueues; + + /** Number of RX queues requested */ + vmk_uint8 numRxQueues; + + /** Number of requested interrupts */ + vmk_uint8 numIntrs; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFRequirements; + +/** + * \ingroup Passthru + * \brief Enumeration of Interrupt Moderation Level (IML). + */ +typedef enum vmk_NetVFIML { + /** No interrupt moderation */ + VMK_NETVF_IML_NONE = 0, + + /** Least interrupts generated */ + VMK_NETVF_IML_HIGHEST = 7, + + /** Adaptive moderation */ + VMK_NETVF_IML_ADAPTIVE = 8, + +} vmk_NetVFIML; + +/** + * \ingroup Passthru + * \brief Type for ring descriptor (UPT only). + * + * This structure is used in UPT to save or restore the parameters of + * a ring queue. + */ +typedef struct vmk_UPTVFRingDesc { + /** Physical address of the ring */ + vmk_uint64 basePA; + + /** Number of descriptors */ + vmk_uint32 size; + + /** Index of the desriptor the producer will write to next */ + vmk_uint32 prodIdx; + + /** Index of the desriptor the consumer will read next */ + vmk_uint32 consIdx; + +} vmk_UPTVFRingDesc; + +/** + * \ingroup Passthru + * \brief Type for RX queue settings (UPT). + * + * This structure is used in UPT to initialize or restore the + * parameters of a RX queue for a VF. + */ +typedef struct vmk_UPTVFRXQueueParams { + /** First RX command ring */ + vmk_UPTVFRingDesc rxRing; + + /** Second RX command ring */ + vmk_UPTVFRingDesc rxRing2; + + /** RX completion ring */ + vmk_UPTVFRingDesc compRing; + + /** Value of GEN bit for the completion ring */ + vmk_uint32 compGen; + + /** Index of the MSI/MSI-X vector for this queue */ + vmk_uint8 intrIdx; + + /** Whether or not the queue is stopped */ + vmk_Bool stopped; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTVFRXQueueParams; + +/** + * \ingroup Passthru + * \brief Type for TX queue settings (UPT). + * + * This structure is used in UPT to initialize or restore the parameters of + * a TX queue for a VF. + */ +typedef struct vmk_UPTVFTXQueueParams { + /** TX command ring */ + vmk_UPTVFRingDesc txRing; + + /** TX data ring */ + vmk_UPTVFRingDesc dataRing; + + /** TX completion ring */ + vmk_UPTVFRingDesc compRing; + + /** Value of GEN bit for the completion ring */ + vmk_uint32 compGen; + + /** Index of the MSI/MSI-X vector for this queue */ + vmk_uint8 intrIdx; + + /** Whether or not the queue is stopped */ + vmk_Bool stopped; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTVFTXQueueParams; + +/** + * \ingroup Passthru + * \brief Type for queue settings (NPA). + * + * This structure is used in NPA to initialize a queue. + * + */ +typedef struct vmk_NPAVFQueueParams { + /** Physical address of the ring */ + vmk_uint64 basePA; + + /** Size of the ring */ + vmk_uint32 size; + + /** Length in bytes of the ring */ + vmk_uint32 length; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NPAVFQueueParams; + +/** + * \ingroup Passthru + * \brief Type for interrupt vector settings. + * + * This structure is used in UPT to initialize of restore an interrupt + * vector's parameters for a VF. + */ +typedef struct vmk_UPTVFIntrVectorParams { + /** Value of IMR for the vector */ + vmk_uint32 imr; + + /** Is there an interrupt pending on this vector? */ + vmk_Bool pending; + + /** Interrupt moderation level for the vector */ + vmk_NetVFIML modLevel; + +} vmk_UPTVFIntrVectorParams; + +/** + * \ingroup Passthru + * \brief Type for interrupts settings (UPT). + * + * This structure is used in UPT to initialize or restore interrupts + * parameters of a VF for each vector. + */ +typedef struct vmk_UPTVFIntrParams { + /** Interrupt scheme to use */ + vmk_PCIInterruptType intrType; + + /** Whether or not auto mask is used */ + vmk_Bool autoMask; + + /** (array) Parameters specific to each vector */ + vmk_UPTVFIntrVectorParams *vectors; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTVFIntrParams; + +/** + * \ingroup Passthru + * \brief Type for interrupts settings (NPA). + * + * This structure is used in NPA to initialize an interrupts vector's + * parameters. + */ +typedef struct vmk_NPAVFIntrParams { + /** Interrupt moderation level for the queue */ + vmk_NetVFIML modLevel; + +} vmk_NPAVFIntrParams; + +/** + * \ingroup Passthru + * \brief Enumeration of RSS hash types. + */ +typedef enum vmk_NetVFRSSHashType { + /** Disable RSS */ + VMK_NETVF_HASH_TYPE_NONE = 0x00, + + /** RSS hash based on IP */ + VMK_NETVF_HASH_TYPE_IPV4 = 0x01, + + /** RSS hash based on TCP (with IP) */ + VMK_NETVF_HASH_TYPE_TCP_IPV4 = 0x02, + + /** RSS hash based on IPv6 */ + VMK_NETVF_HASH_TYPE_IPV6 = 0x04, + + /** RSS hash based on TCP (with IPv6) */ + VMK_NETVF_HASH_TYPE_TCP_IPV6 = 0x08 + +} vmk_NetVFRSSHashType; + +/** + * \ingroup Passthru + * \brief Enumeration of RSS hash functions. + */ +typedef enum vmk_NetVFRSSHashFunc { + /** Disable RSS */ + VMK_NETVF_HASH_FUNC_NONE = 0x00, + /** Use Toeplitz hash function */ + VMK_NETVF_HASH_FUNC_TOEPLITZ = 0x01 + +} vmk_NetVFRSSHashFunc; + +/** + * \ingroup Passthru + * \brief Type for RSS hash key. + * + * This structure is used to program the RSS hash key. + */ +typedef struct vmk_NetVFRSSHashKey { + /** Size of the key */ + vmk_uint16 keySize; + + /** Contents */ + vmk_uint8 key[VMK_NETVF_RSS_MAX_KEY_SIZE]; + +} vmk_NetVFRSSHashKey; + +/** + * \ingroup Passthru + * \brief Type for RSS indirection table. + * + * This structure is used to program or update the RSS indirection + * table. + */ +typedef struct vmk_NetVFRSSIndTable { + /** Size of the table */ + vmk_uint16 indTableSize; + + /** Contents */ + vmk_uint8 indTable[VMK_NETVF_RSS_MAX_IND_TABLE_SIZE]; + +} vmk_NetVFRSSIndTable; + +/** + * \ingroup Passthru + * \brief Type for RSS configuration. + * + * This structure contains all the necessary settings to program a + * VF's RSS engine. + */ +typedef struct vmk_NetVFRSSParams { + /** Hash type to be used */ + vmk_NetVFRSSHashType hashType; + + /** Hash function to be used */ + vmk_NetVFRSSHashFunc hashFunc; + + /** Hash key */ + vmk_NetVFRSSHashKey key; + + /** Indirection table */ + vmk_NetVFRSSIndTable indTable; + +} vmk_NetVFRSSParams; + +/** + * \ingroup Passthru + * \brief Type for VF settings. + * + * This structure is used in both UPT and NPA to initialize or restore + * (in the case of UPT) the settings of a VF, including RX, TX queues, + * interrupt vectors, RSS and more. + * + * Since a driver can only be UPT or NPA but not both at a time, there + * is no field to distinguish whether to use u.upt or u.npa in the + * union. The driver must always be aware of whether it is doing UPT + * or NPA. + */ +typedef struct vmk_NetVFParameters { + /** Number of TX queues requested */ + vmk_uint8 numTxQueues; + + /** Number of RX queues requested */ + vmk_uint8 numRxQueues; + + /** Number of requested vectors */ + vmk_uint8 numIntrs; + + /** Parameters for RSS */ + vmk_NetVFRSSParams rss; + + union { + /** UPT specific parameters */ + struct { + /** (array of numRxQueues) Parameters for each RX queue */ + vmk_UPTVFRXQueueParams *rxQueues; + + /** (array of numTxQueues) Parameters for each TX queue */ + vmk_UPTVFTXQueueParams *txQueues; + + /** Parameters for interrupts */ + vmk_UPTVFIntrParams intr; + + /** Number of OOB pages allocated */ + vmk_uint8 numOOBPages; + + /** The starting guest physical address of the OOB pages. OOB pages are mapped contiguously */ + vmk_uint64 OOBStartPA; + + /** The VMkernel virtual address used to access the OOB pages */ + void *OOBMapped; + + } upt; + + /** NPA specific parameters */ + struct { + /** (array of numRxQueues) Parameters for each RX queue */ + vmk_NPAVFQueueParams *rxQueues; + + /** (array of numTxQueues) Parameters for each TX queue */ + vmk_NPAVFQueueParams *txQueues; + + /** (array of numIntrs) Parameters for interrupts */ + vmk_NPAVFIntrParams *intr; + + } npa; + + } u; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFParameters; + +/** + * \ingroup Passthru + * \brief Type for VF passthrough MMIO region. + */ +typedef struct vmk_VFPTRegion { + /** Region address */ + vmk_uint64 MA; + + /** Region size in pages */ + vmk_uint32 numPages; +} vmk_VFPTRegion; + +/** + * \ingroup Passthru + * \brief Type for VF info. + * + * This structure is used to retrieve VF's information, including + * passthrough regions, device address on the bus (SBDF), plugin + * information etc... + */ +typedef struct vmk_NetVFInfo { + /** Address and size of passthrough MMIO regions */ + vmk_VFPTRegion ptRegions[VMK_VF_MAX_PT_REGIONS]; + + /** Number of regions used */ + vmk_uint8 numPtRegions; + + /** Segment,Bus,Device,Function of the VF */ + vmk_uint32 sbdf; + + union { + /** UPT specific information */ + struct { + /** The device revision */ + vmk_uint32 devRevision; + + /** Reserved, must set to 0 */ + vmk_uint32 reserved; + + /** The size of the out-of-band DMA buffer needed, in pages */ + vmk_uint8 numOOBPages; + } upt; + + /** NPA specific information */ + struct { + /** Plugin name */ + char pluginName[VMK_NPA_MAX_PLUGIN_NAME_LEN]; + + /** Some opaque data to be passed to the plugin */ + vmk_uint32 pluginData[VMK_NPA_MAX_PLUGIN_DATA_SIZE]; + } npa; + + } u; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFInfo; + +/** + * \ingroup Passthru + * \brief Enumeration of queue types. + */ +typedef enum vmk_NetVFQueueType { + /** Queue is RX */ + VMK_NETVF_QUEUE_TYPE_RX, + + /** Queue is TX */ + VMK_NETVF_QUEUE_TYPE_TX + +} vmk_NetVFQueueType; + +/** + * \ingroup Passthru + * \brief Type for RX statistics for a queue. + * + * This structure is used to save, restore or retrieve statistics of + * a VF's RX queue. + */ +typedef struct vmk_NetVFRXQueueStats { + /** Unicast packets received */ + vmk_uint64 unicastPkts; + + /** Unicast bytes received */ + vmk_uint64 unicastBytes; + + /** Multicast packets received */ + vmk_uint64 multicastPkts; + + /** Multicast bytes received */ + vmk_uint64 multicastBytes; + + /** Broadcast packets received */ + vmk_uint64 broadcastPkts; + + /** Broadcast bytes received */ + vmk_uint64 broadcastBytes; + + /** Packets dropped due to buffer shortage */ + vmk_uint64 outOfBufferDrops; + + /** Packets dropped due to other errors */ + vmk_uint64 errorDrops; + + /** Number of packets aggregated by LRO */ + vmk_uint64 LROPkts; + + /** Bytes received from LRO packets */ + vmk_uint64 LROBytes; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFRXQueueStats; + +/** + * \ingroup Passthru + * \brief Type for storing RX statistics for a queue. + * + * This structure is used to save, restore or retrieve statistics of + * a VF's TX queue. + */ +typedef struct vmk_NetVFTXQueueStats { + /** Unicast packets transmitted */ + vmk_uint64 unicastPkts; + + /** Unicast bytes transmitted */ + vmk_uint64 unicastBytes; + + /** Multicast packets transmitted */ + vmk_uint64 multicastPkts; + + /** Multicast bytes transmitted */ + vmk_uint64 multicastBytes; + + /** Broadcast packets transmitted */ + vmk_uint64 broadcastPkts; + + /** Broadcast bytes transmitted */ + vmk_uint64 broadcastBytes; + + /** Packets failed to transmit */ + vmk_uint64 errors; + + /** Packets discarded */ + vmk_uint64 discards; + + /** Number of TSO packets transmitted */ + vmk_uint64 TSOPkts; + + /** Number of bytes transmitted in TSO packets */ + vmk_uint64 TSOBytes; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFTXQueueStats; + +/** + * \ingroup Passthru + * \brief Type for storing the status of a queue. + * + * This structure is query the status of a TX or RX queue. + */ +typedef struct vmk_NetVFQueueStatus { + /** Is the queue stopped */ + vmk_Bool stopped; + + /** Vendor-specific error code */ + vmk_uint32 error; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetVFQueueStatus; + +/** + * \ingroup Passthru + * \brief Type for the state saved for a TX queue (UPT). + * + * This structure is used by UPT to save the state of a TX queue. + */ +typedef struct vmk_UPTTXQueueSaveState { + /** The index of the tx command descriptor the device will read next */ + vmk_uint32 txProd; + + /** The index of the tx command descriptor the driver will write to next */ + vmk_uint32 txCons; + + /** The index of the tx completion descriptor the device will write + to next */ + vmk_uint32 tcProd; + + /** The value of the GEN bit the device will write to the next tx + completion descriptor */ + vmk_uint32 tcGen; + + /** The stats maintained by a tx queue */ + vmk_NetVFTXQueueStats stats; + + /** Is the queue stopped */ + vmk_Bool stopped; + + /** Vendor-specific error code for stoppage */ + vmk_uint32 error; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTTXQueueSaveState; + +/** + * \ingroup Passthru + * \brief Type for the state saved for a RX queue (UPT). + * + * This structure is used by UPT to save the state of a TX queue. + */ +typedef struct vmk_UPTRXQueueSaveState { + /** The index of the next rx command descriptor the driver will write to */ + vmk_uint32 rxProd; + + /** The index of the next rx command descriptor the device will + receive pkts into */ + vmk_uint32 rxCons; + + /** The index of the next rx command descriptor in the 2nd ring the + driver will write to */ + vmk_uint32 rxProd2; + + /** The index of the next rx command descriptor in the 2nd ring the + device will receive pkts into */ + vmk_uint32 rxCons2; + + /** The index of the next rx completion descriptor the device will + write to */ + vmk_uint32 rcProd; + + /** The value of the GEN bit the device will write to the next rx + completion descriptor */ + vmk_uint32 rcGen; + + /** The stats maintained by a rx queue */ + vmk_NetVFRXQueueStats stats; + + /** Is the queue stopped */ + vmk_Bool stopped; + + /** Vendor-specific error code for stoppage */ + vmk_uint32 error; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTRXQueueSaveState; + +/** + * \ingroup Passthru + * \brief Type for the state saved for the interrupt unit (UPT). + * + * This structure is used by UPT to save the state of a VF's interrupt + * vector. + */ +typedef struct vmk_UPTIntrSaveState { + /** The value of IMR for the i-th intr */ + vmk_uint32 imr; + + /** Reserved for future use */ + vmk_uint32 _rsvd[2]; + +} vmk_UPTIntrSaveState; + +/** + * \ingroup Passthru + * \brief Type for storing VF state (UPT). + * + * This structure is used by UPT to store the entire state of a VF, + * including RX/TX queues state and interrupt state. + */ +typedef struct vmk_UPTVFSaveState { + /** The number of tx queues */ + vmk_uint8 numTxQueues; + + /** The number of rx queues */ + vmk_uint8 numRxQueues; + + /** The number of intrs configured */ + vmk_uint32 numIntrs; + + /** The state of the tx queues */ + vmk_UPTTXQueueSaveState *tqState; + + /** The state of the rx queues */ + vmk_UPTRXQueueSaveState *rqState; + + /** The state of the intr unit */ + vmk_UPTIntrSaveState *intrState; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_UPTVFSaveState; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Acquire operation. + * + * This structure is passed as argument of the NETPTOP_VF_ACQUIRE + * operation. It contains the required features on the VF being + * allocated. + */ +typedef struct vmk_NetPTOPVFAcquireArgs { + /** Requested options for the VF */ + vmk_NetVFRequirements props; + + /** (output) Identifier of the allocated VF */ + vmk_VFID vf; + +} vmk_NetPTOPVFAcquireArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Init operation. + * + * This structure is passed as argument of the NETPTOP_VF_INIT + * operation. It contains the settings used to initialize the VF. + */ +typedef struct vmk_NetPTOPVFInitArgs { + /** VF id */ + vmk_VFID vf; + + /** Parameters for the VF */ + vmk_NetVFParameters params; + +} vmk_NetPTOPVFInitArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Activate, Quiesce and Release operations. + * + * This structure is passed as an argument of the NETPTOP_VF_ACTIVATE, + * NETPTOP_VF_QUIESCE and NETPTOP_VF_RELEASE operations. + */ +typedef struct vmk_NetPTOPVFSimpleArgs { + /** VF id */ + vmk_VFID vf; + +} vmk_NetPTOPVFSimpleArgs; + +/** + * \ingroup Passthru + * \brief Arguments for VF Save State operation. + * + * This structure is passed as argument of UPT's NETPTOP_VF_SAVE_STATE + * operation. The driver must fill the `state' structure with the + * current state of the VF. + */ +typedef struct vmk_NetPTOPVFSaveStateArgs { + /** VF id */ + vmk_VFID vf; + + /** (output) VF state */ + vmk_UPTVFSaveState state; + +} vmk_NetPTOPVFSaveStateArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Get Info operation. + * + * This structure is passed as argument of NETPTOP_VF_GET_INFO + * operation and have to be filled (`info' structure) by the driver. + */ +typedef struct vmk_NetPTOPVFGetInfoArgs { + /** VF id */ + vmk_VFID vf; + + /** (output) Information of the VF */ + vmk_NetVFInfo info; + +} vmk_NetPTOPVFGetInfoArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set Indirection Table operation. + * + * This structure is passed as argument of the + * NETPTOP_VF_SET_RSS_IND_TABLE operation and contains the updated RSS + * indirection table for the VF. + */ +typedef struct vmk_NetPTOPVFSetRSSIndTableArgs { + /** VF id */ + vmk_VFID vf; + + /** RSS Indirection table for the VF */ + vmk_NetVFRSSIndTable table; + +} vmk_NetPTOPVFSetRSSIndTableArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Get Queue Stats operation. + * + * This structure is passed as argument of the + * NETPTOP_VF_GET_QUEUE_STATS operation. It has to be allocated by the + * caller and `vf', `numTxQueues' and `numRxQueues' must be set + * properly. The driver then put the statistics of each queue in the + * `tqStats' and `rqStats' arrays. + */ +typedef struct vmk_NetPTOPVFGetQueueStatsArgs { + /** VF id */ + vmk_VFID vf; + + /** Number of TX queues requested */ + vmk_uint8 numTxQueues; + + /** Number of RX queues requested */ + vmk_uint8 numRxQueues; + + /** (output) Statistics from the TX queues. Buffer is allocated and zeroed by the caller */ + vmk_NetVFTXQueueStats *tqStats; + + /** (output) Statistics from the RX queues. Buffer is allocated and zeroed by the caller */ + vmk_NetVFRXQueueStats *rqStats; +} vmk_NetPTOPVFGetQueueStatsArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Get Queue Status operation. + * + * This structure is passed as argument of the + * NETPTOP_VF_GET_QUEUE_STATUS to query the status of a VF's queue. + * It has to be allocated by the caller and `vf', `numTxQueues' and + * `numRxQueues' must be set properly. The driver then put the status + * of each queue in the `tqStatus' and `rqStatus' arrays. + */ +typedef struct vmk_NetPTOPVFGetQueueStatusArgs { + /** VF id */ + vmk_VFID vf; + + /** Number of TX queues requested */ + vmk_uint8 numTxQueues; + + /** Number of RX queues requested */ + vmk_uint8 numRxQueues; + + /** (output) Status for the TX queues. Buffer is allocated and zeroed by the caller */ + vmk_NetVFQueueStatus *tqStatus; + + /** (output) Status for the RX queues. Buffer is allocated and zeroed by the caller */ + vmk_NetVFQueueStatus *rqStatus; + +} vmk_NetPTOPVFGetQueueStatusArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set Mac operation. + * + * This structure is passed to the NETPTOP_VF_SET_MAC operation and + * configures or updates the MAC address of a VF. + */ +typedef struct vmk_NetPTOPVFSetMacArgs { + /** VF id */ + vmk_VFID vf; + + /** MAC address */ + vmk_EthAddress mac; + +} vmk_NetPTOPVFSetMacArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set Multicast operation. + * + * This structure is passed to the NETPTOP_VF_SET_MULTICAST operation + * and sets the list of multicast addresses to receive packets on. + */ +typedef struct vmk_NetPTOPVFSetMulticastArgs { + /** VF id */ + vmk_VFID vf; + + /** Number of MAC filters contained in the `mac' array */ + vmk_size_t nmac; + + /** MAC addresses */ + vmk_EthAddress macList[VMK_NPA_MAX_MULTICAST_FILTERS]; + + /** Reserved for future use */ + vmk_uint32 _rsvd[4]; + +} vmk_NetPTOPVFSetMulticastArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set RX Mode operation. + * + * This structure is passed as argument of the NETPTOP_VF_SET_RX_MODE + * operation and sets or update the RX filtering options of a VF. + */ +typedef struct vmk_NetPTOPVFSetRxModeArgs { + /** VF id */ + vmk_VFID vf; + + /** Enable unicast receive filter */ + vmk_Bool unicast; + + /** Enable multicast receive filter(s) */ + vmk_Bool multicast; + + /** Enable accepting broadcast */ + vmk_Bool broadcast; + + /** Enable multicast promiscuous mode */ + vmk_Bool allmulti; + + /** Enable promiscuous mode */ + vmk_Bool promiscuous; + +} vmk_NetPTOPVFSetRxModeArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the Add Vlan Range and Del Vlan Range operations. + * + * This structure is used both for the NETPTOP_VF_ADD_VLAN_RANGE and + * NETPTOP_VF_DEL_VLAN_RANGE to enable or disable forwarding of a + * given range of VLANs to a VF. + */ +typedef struct vmk_NetPTOPVFVlanRangeArgs { + /** VF id */ + vmk_VFID vf; + + /** starting vlan ID */ + vmk_VlanID first; + + /** ending vlan ID (included) */ + vmk_VlanID last; + +} vmk_NetPTOPVFVlanRangeArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set Default Vlan operation. + * + This structure is passed as argument of the + NETPTOP_VF_SET_DEFAULT_VLAN operation to enable or disable 802.1 + VLAN tag/priority insertion and stripping. + */ +typedef struct vmk_NetPTOPVFSetDefaultVlanArgs { + /** VF id */ + vmk_VFID vf; + + /** Enable/disable */ + vmk_Bool enable; + + /** VLAN id to insert */ + vmk_VlanID vid; + + /** Priority value */ + vmk_VlanPriority prio; + +} vmk_NetPTOPVFSetDefaultVlanArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the VF Set Antispoof operation. + * + * This structure is passed as argument of the + * NETPTOP_VF_SET_ANTISPOOF operation to enable or disable source MAC + * address enforcement in the 802.3 header. + */ +typedef struct vmk_NetPTOPVFSetAntispoofArgs { + /** VF id */ + vmk_VFID vf; + + /** Enable MAC anti-spoofing */ + vmk_Bool enable; + +} vmk_NetPTOPVFSetAntispoofArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the PF Add Mac Filter and Del Mac Filter operations. + * + * This simple structure is used for both NETPTOP_PF_ADD_MAC_FILTER + * and NETPTOP_PF_DEL_MAC_FILTER operations to insert or remove a MAC + * address filter on the default queue. + */ +typedef struct vmk_NetPTOPPFMacFilterArgs { + /** MAC address */ + vmk_EthAddress mac; + +} vmk_NetPTOPPFMacFilterArgs; + +/** + * \ingroup Passthru + * \brief Arguments for the PF Mirror All operation. + * + * This simple structure is passed to the NETPTOP_PF_MIRROR_ALL + * operation and enables or disables the mirroring of all traffic to + * the default queue. + */ +typedef struct vmk_NetPTOPPFMirrorAllArgs { + /** Enable mirroring */ + vmk_Bool enable; + +} vmk_NetPTOPPFMirrorAllArgs; + +#endif /* _VMKAPI_NET_PT_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_types.h new file mode 100644 index 0000000..a5d7006 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_types.h @@ -0,0 +1,123 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Network Types */ /** + * \addtogroup Network + *@{ + *********************************************************************** + */ +#ifndef _VMKAPI_NET_TYPES_H_ +#define _VMKAPI_NET_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" + +/* + *********************************************************************** + * Vlan */ /** + * \defgroup Vlan Virtual Lan + *@{ + *********************************************************************** + */ + +/** + * \brief Identifier number for vlan group. + */ + +typedef vmk_uint16 vmk_VlanID; + +/** + * \brief 802.1p priority value for vlan tag. + */ + +typedef vmk_uint8 vmk_VlanPriority; + +/* + * \brief Symbolic names for 802.1p priority values. + * + * Following the published version in 802.1Q-2005 Annex G. + * Actual ranking in order of least to most important is not strictly numerical. + * Priority 0 is the default priority and is ranked specially. + * The ranking, from least to most important, is + * 1, 0, 2, 3, 4, 5, 6, 7 + * or, using the corresponding 2-letter acronyms from 802.1Q, + * BK, BE, EE, CA, VI, VO, IC, NC + */ +enum { + VMK_VLAN_PRIORITY_MINIMUM = 0, + + VMK_VLAN_PRIORITY_BE = VMK_VLAN_PRIORITY_MINIMUM, + VMK_VLAN_PRIORITY_BEST_EFFORT = VMK_VLAN_PRIORITY_BE, + + VMK_VLAN_PRIORITY_BK = 1, + VMK_VLAN_PRIORITY_BACKGROUND = VMK_VLAN_PRIORITY_BK, + + VMK_VLAN_PRIORITY_EE = 2, + VMK_VLAN_PRIORITY_EXCELLENT_EFFORT = VMK_VLAN_PRIORITY_EE, + + VMK_VLAN_PRIORITY_CA = 3, + VMK_VLAN_PRIORITY_CRITICAL_APPS = VMK_VLAN_PRIORITY_CA, + + VMK_VLAN_PRIORITY_VI = 4, + VMK_VLAN_PRIORITY_VIDEO = VMK_VLAN_PRIORITY_VI, + + VMK_VLAN_PRIORITY_VO = 5, + VMK_VLAN_PRIORITY_VOICE = VMK_VLAN_PRIORITY_VO, + + VMK_VLAN_PRIORITY_IC = 6, + VMK_VLAN_PRIORITY_INTERNETWORK_CONROL = VMK_VLAN_PRIORITY_IC, + + VMK_VLAN_PRIORITY_NC = 7, + VMK_VLAN_PRIORITY_NETWORK_CONROL = VMK_VLAN_PRIORITY_NC, + + VMK_VLAN_PRIORITY_MAXIMUM = VMK_VLAN_PRIORITY_NC, + + VMK_VLAN_NUM_PRIORITIES = VMK_VLAN_PRIORITY_MAXIMUM+1, + + VMK_VLAN_PRIORITY_INVALID = (vmk_VlanPriority)~0U +}; +/** @} */ + +/** + * \brief Enumeration of passthru types. + */ +typedef enum vmk_NetPTType { + VMK_PT_UPT = 1, + VMK_PT_CDPT = 2, +} vmk_NetPTType; + + +/** + * \brief Ethernet address length + */ +#define VMK_ETH_ADDR_LENGTH 6 + +/** + * \brief Ethernet address type + */ +typedef vmk_uint8 vmk_EthAddress[VMK_ETH_ADDR_LENGTH]; + +/** Invalid identification number for a port */ +#define VMK_VSWITCH_INVALID_PORT_ID 0 + +/** + * \brief Identifier number for port on a virtual switch. + */ +typedef vmk_uint32 vmk_SwitchPortID; + + +#endif /* _VMKAPI_NET_TYPES_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink.h new file mode 100644 index 0000000..009e3f6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink.h @@ -0,0 +1,1447 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Uplink */ /** + * \addtogroup Network + *@{ + * \defgroup Uplink Uplink + *@{ + * + * \par Uplink: + * + * A module may have many different functional direction and one of + * them is to be a gateway to external network. + * Thereby vmkernel could rely on this module to Tx/Rx packets. + * + * So one can imagine an uplink as a vmkernel bundle containing + * all the handle required to interact with a module's internal network + * object. + * + * Something important to understand is that an uplink need to reflect + * the harware services provided by the network interface is linked to. + * Thereby if your network interface do vlan tagging offloading a capability + * should be passed to vmkernel to express this service and it will be able + * to use this capability to optimize its internal path when the got + * corresponding uplink is going to be used. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_UPLINK_H_ +#define _VMKAPI_NET_UPLINK_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_module.h" + +#include "net/vmkapi_net_types.h" +#include "net/vmkapi_net_pkt.h" +#include "net/vmkapi_net_pktlist.h" +#include "net/vmkapi_net_netqueue.h" +#include "net/vmkapi_net_pt.h" +#include "net/vmkapi_net_uplink_types.h" + +/** + * \brief Structure to represent an uplink. + */ +typedef struct UplinkDev vmk_Uplink; + + +/** + * \brief Capabilities provided by the device associated to an uplink. + */ + +typedef vmk_uint64 vmk_UplinkCapabilities; + +/** + * \brief Structure containing link status information related to the device associated to an uplink. + */ + +typedef struct { + + /** Device link state */ + vmk_UplinkLinkState linkState; + + /** Device link speed in Mbps */ + vmk_int32 linkSpeed; + + /** Device full duplex activated */ + vmk_Bool fullDuplex; +} vmk_UplinkLinkInfo; + +/** + * \brief Structure containing PCI information of the device associated to an uplink. + */ + +typedef struct { + /** PCI segment number */ + vmk_uint32 segment; + + /** PCI bus number */ + vmk_uint32 bus; + + /** PCI slot number */ + vmk_uint32 slot; + + /** PCI function number */ + vmk_uint32 func; + + /** Device vendor identifier */ + vmk_uint16 vendor; + + /** Device identifier */ + vmk_uint16 device; + + /** Allow pci hot plug notifications */ + vmk_Bool hotPlug; +} vmk_UplinkPCIInfo; + +/** + * \brief Structure containing Panic-time polling information of the device associated to an uplink. + */ + +typedef struct { + + /** Interrupt vector */ + vmk_uint32 vector; + + /** Polling data to be passed to the polling function */ + void *clientData; +} vmk_UplinkPanicInfo; + +/** + * \brief Structure containing memory resources information related to the device associated to an uplink. + */ + +typedef struct { + + /** Uplink I/O address */ + void *baseAddr; + + /** Shared mem start */ + void *memStart; + + /** Shared mem end */ + void *memEnd; + + /** DMA channel */ + vmk_uint8 dma; +} vmk_UplinkMemResources; + +/** + * \brief Structure containing the information of the driver controlling the + * the device associated to an uplink. + */ + +typedef struct { + + /** \brief String used to store the name of the driver */ + vmk_String driver; + + /** \brief String used to store the version of the driver */ + vmk_String version; + + /** \brief String used to store the firmware version of the driver */ + vmk_String firmwareVersion; + + /** \brief String used to store the name of the module managing this driver */ + vmk_String moduleInterface; +} vmk_UplinkDriverInfo; + +/** + * \brief Capabilities of wake-on-lan (wol) + */ +typedef enum { + /** \brief wake on directed frames */ + VMK_UPLINK_WAKE_ON_PHY = 0x01, + + /** \brief wake on unicast frame */ + VMK_UPLINK_WAKE_ON_UCAST = 0x02, + + /** \brief wake on multicat frame */ + VMK_UPLINK_WAKE_ON_MCAST = 0x04, + + /** \brief wake on broadcast frame */ + VMK_UPLINK_WAKE_ON_BCAST = 0x08, + + /** \brief wake on arp */ + VMK_UPLINK_WAKE_ON_ARP = 0x10, + + /** \brief wake up magic frame */ + VMK_UPLINK_WAKE_ON_MAGIC = 0x20, + + /** \brief wake on magic frame */ + VMK_UPLINK_WAKE_ON_MAGICSECURE = 0x40 + +} vmk_UplinkWolCaps; + +/** + * \brief Structure describing the wake-on-lan features and state of an uplink + */ + +typedef struct { + + /** \brief bit-flags, describing uplink supported wake-on-lan features */ + vmk_UplinkWolCaps supported; + + /** \brief bit-flags, describing uplink enabled wake-on-lan features */ + vmk_UplinkWolCaps enabled; + + /** \brief wake-on-lan secure on password */ + vmk_String secureONPassword; + +} vmk_UplinkWolState; + + +/** + * \brief Structure describing interrupt coalescing parameters of an uplink + */ +typedef struct { + /** \brief number of milliseconds to wait for Rx, before interrupting */ + vmk_uint32 rxUsecs; + + /** \brief maximum number of (Rx) frames to wait for, before interrupting */ + vmk_uint32 rxMaxFrames; + + /** \brief number of milliseconds to wait for completed Tx, before interrupting */ + vmk_uint32 txUsecs; + + /** \brief maximum number of completed (Tx) frames to wait for, before interrupting */ + vmk_uint32 txMaxFrames; + +} vmk_UplinkCoalesceParams; + + +/* + *********************************************************************** + * vmk_UplinkStartTx -- */ /** + * + * \brief Handler used by vmkernel to send packet through the device + * associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] pktList The set of packet needed to be sent + * + * \retval VMK_OK All the packets are being processed + * \retval VMK_FAILURE If the module detects any error during + * Tx process + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkStartTx)(void *clientData, + vmk_PktList *pktList); + +/* + *********************************************************************** + * vmk_UplinkOpenDev -- */ /** + * + * \brief Handler used by vmkernel to open the device associated to an uplink . + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK Open succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkOpenDev)(void *clientData); + +/* + *********************************************************************** + * vmk_UplinkCloseDev -- */ /** + * + * \brief Handler used by vmkernel to close the device associated to an uplink + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK Close succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkCloseDev)(void *clientData); + +/* + *********************************************************************** + * vmk_UplinkPanicPoll -- */ /** + * + * \brief Handler used by vmkernel to poll for packets received by + * the device associated to an uplink. Might be ignored. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] budget Maximum work to do in the poll function. + * \param[out] workDone The amount of work done by the poll handler + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkPanicPoll)(void *clientData, + vmk_uint32 budget, + vmk_int32* workDone); + +/* + *********************************************************************** + * vmk_UplinkFlushBuffers -- */ /** + * + * \brief Handler used by vmkernel to flush the Tx/Rx buffer of + * the device associated to an uplink. Might be ignored. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkFlushBuffers)(void *clientData); + +/* + *********************************************************************** + * vmk_UplinkIoctl -- */ /** + * + * \brief Handler used by vmkernel to do an ioctl call against the + * device associated to an uplink. + * + * + * \param[in] uplinkName Name of the aimed device + * \param[in] cmd Command ioctl to be issued + * \param[in] args Arguments to be passed to the ioctl call + * \param[out] result Result value of the ioctl call + * + * \retval VMK_OK If ioctl call succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkIoctl)(vmk_String *uplinkName, + vmk_uint32 cmd, + void *args, + vmk_uint32 *result); + +/* + *********************************************************************** + * vmk_UplinkBlockDev -- */ /** + * + * \brief Handler used by vmkernel to block a device. No more traffic + * should go through after this call. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK If device is blocked + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkBlockDev)(void *clientData); + +/* + *********************************************************************** + * vmk_UplinkUnblockDev -- */ /** + * + * \brief Handler used by vmkernel to unblock a device. Traffic should + * go through after this call. + * + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK If device is unblocked + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkUnblockDev)(void *clientData); + +/* + *********************************************************************** + * vmk_UplinkSetLinkStatus -- */ /** + * + * \brief Handler used by vmkernel to set the speed/duplex of a device + * associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] linkInfo Specifies speed and duplex + * + * \retval VMK_OK If operation was successful + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetLinkStatus)(void *clientData, + vmk_UplinkLinkInfo *linkInfo); + +/* + *********************************************************************** + * vmk_UplinkResetDev -- */ /** + * + * \brief Handler used by vmkernel to reset a device. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * + * \retval VMK_OK If device is reset + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkResetDev)(void *clientData); + + +/* + *********************************************************************** + * vmk_UplinkGetStates -- */ /** + * + * \brief Handler used by vmkernel to get the state of a device + * associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] state State of the device + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetStates)(void *clientData, + vmk_UplinkStates *states); + +/* + *********************************************************************** + * vmk_UplinkGetMemResources -- */ /** + * + * \brief Handler used by vmkernel to get the memory resources of a device + * associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] resources Memory resources of the device + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetMemResources)(void *clientData, + vmk_UplinkMemResources *resources); + +/* + *********************************************************************** + * vmk_UplinkGetPCIProperties -- */ /** + * + * \brief Handler used by vmkernel to get pci properties of a device + * associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] pciInfo PCI properties of the device + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetPCIProperties)(void *clientData, + vmk_UplinkPCIInfo *pciInfo); + +/* + *********************************************************************** + * vmk_UplinkGetPanicInfo -- */ /** + * + * \brief Handler used by vmkernel to get panic-time polling properties + * of a device associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] panicInfo Panic-time polling properties of the device + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetPanicInfo)(void *clientData, + vmk_UplinkPanicInfo *panicInfo); + +/* + *********************************************************************** + * vmk_UplinkGetMACAddr -- */ /** + * + * \brief Handler used by vmkernel to get the mac address of a device + * associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] macAddr Buffer used to store the mac address + * + * \retval VMK_OK If the mac address is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetMACAddr)(void *clientData, + vmk_UplinkMACAddress macAddr); + +/* + *********************************************************************** + * vmk_UplinkGetDeviceName -- */ /** + * + * \brief Handler used by vmkernel to get the name of the device + * associated to an uplink + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] devName Structure used to store all the requested + * information. + * + * \retval VMK_OK If the name is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetName)(void *clientData, + vmk_UplinkDeviceName *devName); +/* + *********************************************************************** + * vmk_UplinkGetStats -- */ /** + * + * \brief Handler used by vmkernel to get statistics on a device associated + * to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] stats Structure used to store all the requested + * information. + * + * \retval VMK_OK If the statistics are properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetStats)(void *clientData, + vmk_UplinkStats *stats); + +/* + *********************************************************************** + * vmk_UplinkGetDriverInfo -- */ /** + * + * \brief Handler used by vmkernel to get driver information of the + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] driverInfo Structure used to store all the requested + * information. + * + * \retval VMK_OK If the driver information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetDriverInfo)(void *clientData, + vmk_UplinkDriverInfo *driverInfo); + +/* + *********************************************************************** + * vmk_UplinkGetWolState -- */ /** + * + * \brief Handler used by vmkernel to get wake-on-lan state of + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] wolState Structure used to store all the requested + * information. + * + * \retval VMK_OK If the driver information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetWolState)(void *clientData, + vmk_UplinkWolState *wolState); + +/* + *********************************************************************** + * vmk_UplinkSetWolState -- */ /** + * + * \brief Handler used by vmkernel to get wake-on-lan state of + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] wolState Structure used to store all the requested + * information. + * + * \retval VMK_OK If the driver information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetWolState)(void *clientData, + vmk_UplinkWolState *wolState); + +/* + *********************************************************************** + * vmk_UplinkGetCoalesceParams -- */ /** + * + * \brief Handler used by vmkernel to get coalescing parameters of + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] coalesceParams Structure used to store all the requested + * information. + * + * \retval VMK_OK If the driver information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetCoalesceParams)(void *clientData, + vmk_UplinkCoalesceParams *coalesceParams); + +/* + *********************************************************************** + * vmk_UplinkSetCoalesceParams -- */ /** + * + * \brief Handler used by vmkernel to set coalescing parameters of + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] coalesceParams Structure used to store all the requested + * information. + * + * \retval VMK_OK If the driver information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetCoalesceParams)(void *clientData, + vmk_UplinkCoalesceParams *coalesceParams); + + +/** + * \brief Default value for timeout handling before panic. + */ + +#define VMK_UPLINK_WATCHDOG_HIT_CNT_DEFAULT 5 + +/* + *********************************************************************** + * vmk_UplinkGetWatchdogHitCnt -- */ /** + * + * \brief Used only if the module provides a timeout mechanism to + * recover from a wedged device. + * Handler used by vmkernel to get the timeout hit counter needed + * before hitting a panic. + * If no panic mode is implemented you could ignore this handler. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] counter Used to store the timeout hit counter + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetWatchdogHitCnt)(void *clientData, + vmk_int16 *counter); + +/* + *********************************************************************** + * vmk_UplinkSetWatchdogHitCnt -- */ /** + * + * \brief Used only if the module provides a timeout mechanism to + * recover from a wedged device. + * Handler used by vmkernel to set the timeout hit counter + * needed before hitting a panic. + * If no panic mode is implemented you could ignore this handler. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] counter The timeout hit counter + * + * \retval VMK_OK If the new setting is effective + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetWatchdogHitCnt)(void *clientData, + vmk_int16 counter); + +/* + *********************************************************************** + * vmk_UplinkGetWatchdogStats -- */ /** + * + * \brief Used only if the module provides a timeout mechanism to + * recover from a wedged device. + * Handler used by vmkernel to know the number of times the recover + * process (usually a reset) has been run on the device associated + * to an uplink. Roughly the number of times the device got wedged. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] counter The number of times the device got wedged + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetWatchdogStats)(void *clientData, + vmk_int16 *counter); + +/** + * \brief Define the different status of uplink watchdog panic mod + */ + +typedef enum { + + /** \brief The device's watchdog panic mod is disabled */ + VMK_UPLINK_WATCHDOG_PANIC_MOD_DISABLE, + + /** \brief The device's watchdog panic mod is enabled */ + VMK_UPLINK_WATCHDOG_PANIC_MOD_ENABLE +} vmk_UplinkWatchdogPanicModState; + +/* + *********************************************************************** + * vmk_UplinkGetWatchdogPanicModState -- */ /** + * + * \brief Used only if the module provides a timeout mechanism to + * recover from a wedged device. + * Handler used by vmkernel to know if the timeout panic mod + * is enabled or not. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] status Status of the watchdog panic mod + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetWatchdogPanicModState)(void *clientData, + vmk_UplinkWatchdogPanicModState *state); + +/* + *********************************************************************** + * vmk_UplinkSetWatchdogPanicModState -- */ /** + * + * \brief Used only if the module provides a timeout mechanism to + * recover from a wedged device. + * Handler used by vmkernel to enable or disable the timeout + * panic mod. Set panic mod could be useful for debugging as it + * is possible to get a coredump at this point. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] enable Tne status of the watchdog panic mod + * + * \retval VMK_OK If the new panic mod is effective + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetWatchdogPanicModState)(void *clientData, + vmk_UplinkWatchdogPanicModState state); + +/* + *********************************************************************** + * vmk_UplinkSetMTU -- */ /** + * + * \brief Handler used by vmkernel to set up the mtu of the + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] mtu The mtu to be set up + * + * \retval VMK_OK If the mtu setting is effective + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkSetMTU) (void *clientData, + vmk_uint32 mtu); + +/* + *********************************************************************** + * vmk_UplinkGetMTU -- */ /** + * + * \brief Handler used by vmkernel to retrieve the mtu of the + * device associated with an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[out] mtu Used to stored the current mtu + * + * \retval VMK_OK If the information is properly stored + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkGetMTU) (void *clientData, + vmk_uint32 *mtu); + +/* + *********************************************************************** + * vmk_UplinkVlanSetupHw -- */ /** + * + * \brief Handler used by vmkernel to activate vlan and add vid for the + * device associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] enable Initialize hw vlan functionality + * \param[in] bitmap A bitmap of permitted vlan id's. + * + * \retval VMK_OK If vlan (de)activation succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkVlanSetupHw)(void *clientData, + vmk_Bool enable, + void *bitmap); + +/* + *********************************************************************** + * vmk_UplinkVlanRemoveHw -- */ /** + * + * \brief Handler used by vmkernel to delete vlan ids and deactivate + * hw vlan for the device associated to an uplink. + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] disable Deactivate hw vlan completely + * \param[in] bitmap A bitmap of permitted vlan id's. + * + * \retval VMK_OK If vlan update succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkVlanRemoveHw)(void *clientData, + vmk_Bool disable, + void *bitmap); + +/* + *********************************************************************** + * vmk_UplinkNetqueueOpFunc -- */ /** + * + * \brief Handler used by vmkernel to issue netqueue control operations + * + * \param[in] clientData Internal module structure for the device + * associated to the uplink. This structure + * is the one passed during uplink connection + * \param[in] op Netqueue operation + * \param[in] opArgs Arguments to Netqueue operation + * + * \retval VMK_OK Operation succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkNetqueueOpFunc)(void *clientData, + vmk_NetqueueOp op, + void *opArgs); + +typedef VMK_ReturnStatus (*vmk_UplinkNetqueueXmit)(void *, + vmk_NetqueueQueueId, + vmk_PktList *); +/* + *********************************************************************** + * vmk_UplinkPTOpFunc -- */ /** + * + * \brief The routine to dispatch PT management operations to + * driver exported callbacks + * + * \param[in] clientData Used to identify a VF + * \param[in] op The operation + * \param[in] args The optional arguments for the operation + * + * \retval VMK_OK If the operation succeeds + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +typedef VMK_ReturnStatus (*vmk_UplinkPTOpFunc)(void *clientData, + vmk_NetPTOP op, + void *args); + +/** + * \brief Structure used to have access to the properties of the + * device associated to an uplink. + */ + +typedef struct { + + /** Handler used to retrieve the state of the device */ + vmk_UplinkGetStates getStates; + + /** Handler used to retrieve memory resources of the device */ + vmk_UplinkGetMemResources getMemResources; + + /** Handler used to retrieve pci properties of the device */ + vmk_UplinkGetPCIProperties getPCIProperties; + + /** Handler used to retrieve panic-time polling properties of the device */ + vmk_UplinkGetPanicInfo getPanicInfo; + + /** Handler used to retrieve the MAC address of the device */ + vmk_UplinkGetMACAddr getMACAddr; + + /** Handler used to retrieve the name of the device */ + vmk_UplinkGetName getName; + + /** Handler used to retrieve the statistics of the device */ + vmk_UplinkGetStats getStats; + + /** Handler used to retrieve the driver information of the device */ + vmk_UplinkGetDriverInfo getDriverInfo; + + /** Handler used to retrieve the wake-on-lan state of the device */ + vmk_UplinkGetWolState getWolState; + + /** Handler used to set the wake-on-lan state of the device */ + vmk_UplinkGetWolState setWolState; + + /** Handler used to get colesing state of the device */ + vmk_UplinkGetCoalesceParams getCoalesceParams; + + /** Handler used to set colesing state of the device */ + vmk_UplinkSetCoalesceParams setCoalesceParams; +} vmk_UplinkPropFunctions; + +/** + * \brief Structure used to have access to the timeout properties of the + * device associated to an uplink. + * If the module does not provide a timeout mechanism, this information + * can be ignored. + */ + +typedef struct { + + /** Handler used to retrieve the number of times the device handles timeout before hitting a panic */ + vmk_UplinkGetWatchdogHitCnt getHitCnt; + + /** Handler used to set the number of times the device handles timeout before hitting a panic */ + vmk_UplinkSetWatchdogHitCnt setHitCnt; + + /** Handler used to retrieve the global number of times the device hit a timeout */ + vmk_UplinkGetWatchdogStats getStats; + + /** Handler used to retrieve the timeout panic mod's status for the device */ + vmk_UplinkGetWatchdogPanicModState getPanicMod; + + /** Handler used to set the timeout panic mod's status for the device */ + vmk_UplinkSetWatchdogPanicModState setPanicMod; +} vmk_UplinkWatchdogFunctions; + +typedef struct { + /** Netqueue control operation entry point */ + vmk_UplinkNetqueueOpFunc netqOpFunc; + + /** Netqueue packet transmit function (obsolete) */ + vmk_UplinkNetqueueXmit netqXmit; +} vmk_UplinkNetqueueFunctions; + +typedef struct { + /** dispatch routine for PT management operations */ + vmk_UplinkPTOpFunc ptOpFunc; +} vmk_UplinkPTFunctions; + +typedef struct { + + /** Handler used to setup vlan hardware context and add vid */ + vmk_UplinkVlanSetupHw setupVlan; + + /** Handler used to delete vlan id and deactivate hw for the device */ + vmk_UplinkVlanRemoveHw removeVlan; +} vmk_UplinkVlanFunctions; + +typedef struct { + + /** Handler used to retrieve the MTU of the device */ + vmk_UplinkGetMTU getMTU; + + /** Handler used to set the MTU of the device */ + vmk_UplinkSetMTU setMTU; +} vmk_UplinkMtuFunctions; + +typedef struct { + + /** Handler used to Tx a packet immediately through the device */ + vmk_UplinkStartTx startTxImmediate; + + /** Handler used to set up the resources of the device */ + vmk_UplinkOpenDev open; + + /** Handler used to release the resources of the device */ + vmk_UplinkCloseDev close; + + /** Handler used to poll device for a Rx packet */ + vmk_UplinkPanicPoll panicPoll; + + /** Handler used to flush the Rx/Tx buffers of the device */ + vmk_UplinkFlushBuffers flushRxBuffers; + + /** Handler used to issue an ioctl command to the device */ + vmk_UplinkIoctl ioctl; + + /** Handler used to set the device as blocked */ + vmk_UplinkBlockDev block; + + /** Handler used to set the device as unblocked */ + vmk_UplinkUnblockDev unblock; + + /** Handler used to change link speed and duplex */ + vmk_UplinkSetLinkStatus setLinkStatus; + + /** Handler used to reset a device */ + vmk_UplinkResetDev reset; +} vmk_UplinkCoreFunctions; + +/** + * \brief Structure passed to vmkernel in order to interact with the device + * associated to an uplink. + */ + +typedef struct vmk_UplinkFunctions { + + /** Set of functions giving access to the core services of the device */ + vmk_UplinkCoreFunctions coreFns; + + /** Set of functions giving access to the vlan services of the device */ + vmk_UplinkVlanFunctions vlanFns; + + /** Set of functions giving access to the MTU services of the device*/ + vmk_UplinkMtuFunctions mtuFns; + + /** Set of functions giving access to the properties/statistics of the device */ + vmk_UplinkPropFunctions propFns; + + /** Set of functions giving access to the watchdog management of the device */ + vmk_UplinkWatchdogFunctions watchdogFns; + + /** Set of functions giving access to the netqueue services of the device */ + vmk_UplinkNetqueueFunctions netqueueFns; + + /** Set of functions giving access to the PT services of the device */ + vmk_UplinkPTFunctions ptFns; + +} vmk_UplinkFunctions; + +/** + * \brief Uplink flags for misc. info. + */ +typedef enum { + /** \brief hidden from management apps */ + VMK_UPLINK_FLAG_HIDDEN = 0x01, + +} vmk_UplinkFlags; + +/** + * \brief Structure containing all the required information to bind a + * device to an uplink. + */ + +typedef struct { + + /** Name of the freshly connected device */ + vmk_String devName; + + /** Internal module structure for this network device */ + void *clientData; + + /** Module identifier of the caller module */ + vmk_ModuleID moduleID; + + /** Functions used by vmkernel to interact with module network services */ + vmk_UplinkFunctions *functions; + + /** Maximum packet fragments the caller module can handle */ + vmk_size_t maxSGLength; + + /** Capabilities populated to vmkernel level for this particular uplink */ + vmk_UplinkCapabilities cap; + + /** Data misc. flags for the uplink */ + vmk_UplinkFlags flags; +} vmk_UplinkConnectInfo; + +/* + *********************************************************************** + * vmk_UplinkUpdateLinkState -- */ /** + * + * \ingroup Uplink + * \brief Update link status information related to a specified uplink + * with a bundle containing the information. + * + * \param[in] uplink Uplink aimed + * \param[in] linkInfo Structure containing link information + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkUpdateLinkState(vmk_Uplink *uplink, + vmk_UplinkLinkInfo *linkInfo); + +/* + *********************************************************************** + * vmk_UplinkWatchdogTimeoutHit -- */ /** + * + * \brief Notify vmkernel that a watchdog timeout has occurred. + * + * \note If an uplink driver has a watchdog for the transmit queue of the device, + * the driver should notify vmkernel when a timeout occurs. Vmkernel may use this + * information to determine the reliability of a particular uplink. + * + * \param[in] uplink Uplink aimed + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkWatchdogTimeoutHit(vmk_Uplink *uplink); + +/* + *********************************************************************** + * vmk_UplinkStopped + * + * \brief Notify vmkernel that the device has been stopped and can not + * transmit any more packets. + * + * + * \param[in] uplink Uplink aimed + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkStopped(vmk_Uplink *uplink); + +/* + *********************************************************************** + * vmk_UplinkStarted + * + * \brief Notify vmkernel that the device has been started and can + * start transmiting packets. + * + * + * \param[in] uplink Uplink aimed + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkStarted(vmk_Uplink *uplink); + +/* + *********************************************************************** + * vmk_UplinkConnected -- */ /** + * + * \ingroup Uplink + * \brief Notify vmkernel that an uplink has been connected. + * + * \note This function create the bond between vmkernel uplink and + * a module internal structure. + * Through this connection vmkernel will be able to manage + * Rx/Tx and other operations on module network services. + * + * \param[in] connectInfo Information passed to vmkernel to bind an + * uplink to a module internal NIC representation + * \param[out] uplink Address of the new uplink + * + * \retval VMK_OK if succeed + * \retval VMK_FAILURE otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkConnected(vmk_UplinkConnectInfo *connectInfo, + vmk_Uplink **uplink); + +/* + *********************************************************************** + * vmk_UplinkOpen -- */ /** + * + * \ingroup Uplink + * \brief Open the device associated with the uplink + * + * \note This function needs to be called if the device associated with + * the uplink is not a PCI device. For PCI device, + * vmk_PCIDoPostInsert() should be called instead. + * + * \param[in] uplinkName Name of the uplink to be opened + * + * \retval VMK_OK if succeed + * \retval VMK_FAILURE otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkOpen(vmk_String *uplinkName); + +/* + *********************************************************************** + * vmk_UplinkClose -- */ /** + * + * \ingroup Uplink + * \brief Close the device associated with the uplink and disconnect the + * uplink from the network services + * + * \note This function needs to be called if the device associated with + * the uplink is not a PCI device. For PCI device, + * vmk_PCIDoPreRemove() should be called instead. + * + * \param[in] uplinkName Name of the uplink to be closed + * + * \retval VMK_OK if succeed + * \retval VMK_FAILURE otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkClose(vmk_String *uplinkName); + +/* + *********************************************************************** + * vmk_UplinkIsNameAvailable -- */ /** + * + * \ingroup Uplink + * \brief Check if a name is already used by an uplink in vmkernel. + * + * \param[in] uplinkName Name of the uplink + * + * \retval VMK_TRUE the uplink name is available + * \retval VMK_FALSE otherwise + * + *********************************************************************** + */ + +vmk_Bool vmk_UplinkIsNameAvailable(vmk_String *uplinkName); + +/* + *********************************************************************** + * vmk_UplinkWorldletSet -- */ /** + * + * \ingroup Uplink + * \brief Associate worldlet with an uplink. + * + * \param[in] uplink Uplink aimed + * \param[in] worldlet Worldlet to associate with this uplink + * + * \retval VMK_OK if succeed + * \retval VMK_FAILURE otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkWorldletSet(vmk_Uplink *uplink, + void *worldlet); + +/* + *********************************************************************** + * vmk_UplinkCapabilitySet -- */ /** + * + * \ingroup Uplink + * \brief Enable/Disable a capability for an uplink. + * + * \param[in] uplinkCaps Capabilities to be modified + * \param[in] cap Capability to be enabled/disabled + * \param[in] enable true => enable, false => disable + * + * \retval VMK_OK If capability is valid + * \retval VMK_NOT_FOUND Otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkCapabilitySet(vmk_UplinkCapabilities *uplinkCaps, + vmk_UplinkCapability cap, + vmk_Bool enable); + +/* + *********************************************************************** + * vmk_UplinkCapabilityGet -- */ /** + * + * \ingroup Uplink + * \brief Retrieve status of a capability for an uplink. + * + * \param[in] uplinkCaps Capabilities to be modified + * \param[in] cap Capability to be checked + * \param[out] status true => enabled, false => disabled + * + * \retval VMK_OK If capability is valid + * \retval VMK_NOT_FOUND Otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkCapabilityGet(vmk_UplinkCapabilities *uplinkCaps, + vmk_UplinkCapability cap, + vmk_Bool *status); + +/* + *********************************************************************** + * vmk_UplinkQueueStop -- */ /** + * + * \ingroup Uplink + * \brief Notify stack of uplink queue stop + * + * \param[in] uplink Uplink aimed + * \param[in] qid Queue Id + * + * \retval VMK_OK + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkQueueStop(vmk_Uplink *uplink, + vmk_NetqueueQueueId qid); + +/* + *********************************************************************** + * vmk_UplinkQueueStart -- */ /** + * + * \ingroup Uplink + * \brief Notify stack of uplink queue (re)start + * + * \param[in] uplink Uplink aimed + * \param[in] qid Queue Id + * + * \retval VMK_OK + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_UplinkQueueStart(vmk_Uplink *uplink, + vmk_NetqueueQueueId qid); + +/* + *********************************************************************** + * vmk_PktQueueForRxProcess -- */ /** + * + * \ingroup Uplink + * \brief Queue a specified packet coming from an uplink for Rx process. + * + * \param[in] pkt Target packet + * \param[in] uplink Uplink where the packet came from + * + *********************************************************************** + */ +extern +void vmk_PktQueueForRxProcess(vmk_PktHandle *pkt, + vmk_Uplink *uplink); + +/* + *********************************************************************** + * vmk_PktListRxProcess -- */ /** + * + * \ingroup Uplink + * \brief Process a list of packets from an uplink. + * + * \param[in] pktList Set of packets to process. + * \param[in] uplink Uplink from where the packets came from. + * + *********************************************************************** + */ +extern +void vmk_PktListRxProcess(vmk_PktList *pktList, + vmk_Uplink *uplink); + +#endif /* _VMKAPI_NET_UPLINK_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink_types.h new file mode 100644 index 0000000..fb5083f --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_uplink_types.h @@ -0,0 +1,250 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Network Types */ /** + * \addtogroup Network + *@{ + * + *********************************************************************** + */ +#ifndef _VMKAPI_NET_UPLINK_TYPES_H_ +#define _VMKAPI_NET_UPLINK_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" +#include "net/vmkapi_net_types.h" + +/** + * \brief Possible link status for the device associated to an uplink. + */ +typedef enum { + /** Unknown or invalid speed duplex */ + VMK_UPLINK_INVALID_SPEED_DUPLEX = 0x0, + + /** Auto negotiation */ + VMK_UPLINK_AUTO_NEGOTIATION = 0x0001, + + /** 10 Mb/s, half duplex */ + VMK_UPLINK_10_HALF = 0x0002, + + /** 10 Mb/s, full duplex */ + VMK_UPLINK_10_FULL = 0x0004, + + /** 100 Mb/s, half duplex */ + VMK_UPLINK_100_HALF = 0x0008, + + /** 100 Mb/s, full duplex */ + VMK_UPLINK_100_FULL = 0x0010, + + /** 1000 Mb/s, half duplex */ + VMK_UPLINK_1000_HALF = 0x0020, + + /** 1000 Mb/s, full duplex */ + VMK_UPLINK_1000_FULL = 0x0040, + + /** 10000 Mb/s, full duplex */ + VMK_UPLINK_10000_FULL = 0x0080, + +} vmk_UplinkSpeedDuplex; + +/** + * \brief Possible capabilities for the device associated to an uplink. + */ + +typedef enum { + /** Scatter-gather */ + VMK_UPLINK_CAP_SG = 0x0001, + + /** Checksum offloading */ + VMK_UPLINK_CAP_IP4_CSUM = 0x0002, + + /** High dma */ + VMK_UPLINK_CAP_HIGH_DMA = 0x0008, + + /** TCP Segmentation Offload */ + VMK_UPLINK_CAP_TSO = 0x0020, + + /** VLAN tagging offloading on tx path */ + VMK_UPLINK_CAP_HW_TX_VLAN = 0x0100, + + /** VLAN tagging offloading on rx path */ + VMK_UPLINK_CAP_HW_RX_VLAN = 0x0200, + + /** Scatter-gather span multiple pages */ + VMK_UPLINK_CAP_SG_SPAN_PAGES = 0x40000, + + /** checksum IPv6 **/ + VMK_UPLINK_CAP_IP6_CSUM = 0x80000, + + /** TSO for IPv6 **/ + VMK_UPLINK_CAP_TSO6 = 0x100000, + + /** TSO size up to 256kB **/ + VMK_UPLINK_CAP_TSO256k = 0x200000, + + /** Uniform Passthru, only configurable by uplink device if supported. + Uplink port shall not explicitly activate/de-activate it */ + VMK_UPLINK_CAP_UPT = 0x400000, + + /** Device driver modifies the inet headers for any reason */ + VMK_UPLINK_CAP_RDONLY_INETHDRS = 0x800000, +} vmk_UplinkCapability; + +/** + * \brief State of the device's link associated to an uplink. + */ + +typedef enum { + + /** The device's link state is down */ + VMK_UPLINK_LINK_DOWN, + + /** The device's link state is up */ + VMK_UPLINK_LINK_UP +} vmk_UplinkLinkState; + +/** + * \brief State of the device associated to an uplink. + */ + +typedef vmk_uint64 vmk_UplinkStates; + +typedef enum { + + /** The device associated to an uplink is present */ + VMK_UPLINK_STATE_PRESENT = 0x1, + + /** The device associated to an uplink is ready */ + VMK_UPLINK_STATE_READY = 0x2, + + /** The device associated to an uplink is running */ + VMK_UPLINK_STATE_RUNNING = 0x4, + + /** The device's queue associated to an uplink is operational */ + VMK_UPLINK_STATE_QUEUE_OK = 0x8, + + /** The device associated to an uplink is linked */ + VMK_UPLINK_STATE_LINK_OK = 0x10, + + /** The device associated to an uplink is in promiscious mode */ + VMK_UPLINK_STATE_PROMISC = 0x20, + + /** The device associated to an uplink supports broadcast packets */ + VMK_UPLINK_STATE_BROADCAST = 0x40, + + /** The device associated to an uplink supports multicast packets */ + VMK_UPLINK_STATE_MULTICAST = 0x80 +} vmk_UplinkState; + +/** + * \brief String containing naming information of the device associated to an uplink. + */ + +typedef vmk_String vmk_UplinkDeviceName; + +/** + * \brief MAC address of the device associated to an uplink. + */ + +typedef vmk_EthAddress vmk_UplinkMACAddress; + +/** + * \brief Structure containing statistics related to the device associated to an uplink. + */ + +typedef struct { + + /** \brief The number of rx packets received by the driver */ + vmk_uint32 rxPkt; + + /** \brief The number of tx packets sent by the driver */ + vmk_uint32 txPkt; + + /** \brief The number of rx bytes by the driver */ + vmk_uint32 rxBytes; + + /** \brief The number of tx bytes by the driver */ + vmk_uint32 txBytes; + + /** \brief The number of rx packets with errors */ + vmk_uint32 rxErr; + + /** \brief The number of tx packets with errors */ + vmk_uint32 txErr; + + /** \brief The number of rx packets dropped */ + vmk_uint32 rxDrp; + + /** \brief The number of tx packets dropped */ + vmk_uint32 txDrp; + + /** \brief The number of rx multicast packets */ + vmk_uint32 mltCast; + + /** \brief The number of collisions */ + vmk_uint32 col; + + /** \brief The number of rx length errors */ + vmk_uint32 rxLgtErr; + + /** \brief The number of rx ring buffer overflow */ + vmk_uint32 rxOvErr; + + /** \brief The number of rx packets with crc errors */ + vmk_uint32 rxCrcErr; + + /** \brief The number of rx packets with frame alignment error */ + vmk_uint32 rxFrmErr; + + /** \brief The number of rx fifo overrun */ + vmk_uint32 rxFifoErr; + + /** \brief The number of rx packets missed */ + vmk_uint32 rxMissErr; + + /** \brief The number of tx aborted errors */ + vmk_uint32 txAbortErr; + + /** \brief The number of tx carriers errors */ + vmk_uint32 txCarErr; + + /** \brief The number of tx fifo errors */ + vmk_uint32 txFifoErr; + + /** \brief The number of tx heartbeat errors */ + vmk_uint32 txHeartErr; + + /** \brief The number of tx windows errors */ + vmk_uint32 txWinErr; + + /** \brief The number of rx packets received by the module interface hosting the driver */ + vmk_uint32 intRxPkt; + + /** \brief The number of tx packets sent by the module interface hosting the driver */ + vmk_uint32 intTxPkt; + + /** \brief The number of rx packets dropped by the module interface hosting the driver */ + vmk_uint32 intRxDrp; + + /** \brief The number of tx packets dropped by the module interface hosting the driver */ + vmk_uint32 intTxDrp; + + /** \brief String used to store the information specific the device associated to an uplink */ + vmk_String privateStats; +} vmk_UplinkStats; + +#endif /* _VMKAPI_NET_UPLINK_TYPES_H_ */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_vswitch.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_vswitch.h new file mode 100644 index 0000000..0c66032 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/net/vmkapi_net_vswitch.h @@ -0,0 +1,129 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * Vswitch */ /** + * \addtogroup Network + *@{ + * \defgroup Vswitch Virtual Switch + *@{ + * + * \par Vswitch: + * + * In vmkernel, many different instances could need to communicate with + * the external world but also between them. + * These internal communications are done through a virtual switch which + * is roughly a set of port with policies connecting a set of instances + * together. + * + * Each instance is connected to a port and all the inbound/outbound + * network packets are going through it. + * To emulate a physical switch behavior, every port owns a chain of command + * processing, filtering the packet and post them to their next destination. + * For more information about port's chain of command refer to iochain vmkapi. + * + *********************************************************************** + */ + +#ifndef _VMKAPI_NET_VSWITCH_H_ +#define _VMKAPI_NET_VSWITCH_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_const.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_status.h" +#include "net/vmkapi_net_types.h" + + +/** + * \brief Event identifier for vswitch notifications. + */ + +typedef vmk_uint64 vmk_VswitchEvent; + +/** Port has been connected */ +#define VMK_VSWITCH_EVENT_PORT_CONNECT 0x1 + +/** Port has been disconnected */ +#define VMK_VSWITCH_EVENT_PORT_DISCONNECT 0x2 + +/** Port has been blocked */ +#define VMK_VSWITCH_EVENT_PORT_BLOCK 0x4 + +/** Port has been unblocked */ +#define VMK_VSWITCH_EVENT_PORT_UNBLOCK 0x8 + +/** Port ethernet frame policy has been updated */ +#define VMK_VSWITCH_EVENT_PORT_L2ADDR 0x10 + +/** Port has been enabled */ +#define VMK_VSWITCH_EVENT_PORT_ENABLE 0x20 + +/** Port has been disabled */ +#define VMK_VSWITCH_EVENT_PORT_DISABLE 0x40 + +/** Portset MTU has been updated */ +#define VMK_VSWITCH_EVENT_PORTSET_MTU_UPDATED 0x80 + +/** Port event mask */ +#define VMK_VSWITCH_EVENT_MASK_ALL 0xff + +/** Event callback used for vswitch notification */ +typedef void (*vmk_VswitchEventCB)(vmk_SwitchPortID, vmk_VswitchEvent, void *); + +/* + *********************************************************************** + * vmk_VswitchRegisterEventCB -- */ /** + * + * \ingroup Vswitch + * \brief Register a handler to receive vswitch event notifications. + * + * \note These are asynchronous event notifications, meaning that the event + * handler should examine the port to determine current state at + * the time the callback is made. + * + * \param[in] cb Handler to call to notify a vswitch event + * \param[in] cbData Data to pass to the handler + * \param[out] handle Handle needed to passed in order to unregister the + * handler + * + * \retval VMK_OK Registration succeeded + * \retval VMK_FAILURE Otherwise + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_VswitchRegisterEventCB(vmk_VswitchEventCB cb, + void *cbData, + void **handle); + +/* + *********************************************************************** + * vmk_VswitchUnregisterEventCB -- */ /** + * + * \ingroup Vswitch + * \brief Unregister a handler to receive vswitch event notifications. + * + * \param[in] handle Handle return by register process + * + * \retval VMK_OK Always + * + *********************************************************************** + */ + +VMK_ReturnStatus vmk_VswitchUnregisterEventCB(void *handle); + +#endif /* _VMKAPI_NET_VSWITCH_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv.h new file mode 100644 index 0000000..472cbd5 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv.h @@ -0,0 +1,254 @@ +/* ********************************************************** + * Copyright 2008 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * vmkapi_npiv.h -- + * + * Defines some of the vmkernel specific VPORT types used to interact with + * NPIV VPORT aware drivers. + * Version 1 - ESX 3.5 + * Version 2 - ESX 4.0 + */ + +#ifndef _VMKAPI_NPIV_H_ +#define _VMKAPI_NPIV_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "npiv/vmkapi_npiv_wwn.h" + +/* + * Definitions + */ + +/** + * \brief VPORT API version values + */ +#define VMK_VPORT_API_VERSION 0x00000002 // ESX 4.0 (Latest) +#define VMK_VPORT_API_VERSION_35 0x00000001 // ESX 3.5 + +/** + * \brief VPORT API vport specific error codes returned by the fc driver + * + * Any of the VPORT API commands can return these errors + */ +#define VMK_VPORT_OK 0 /* command completed OK */ +#define VMK_VPORT_ERROR (-1) /* general vport error */ +#define VMK_VPORT_INVAL (-2) /* invalid value passed */ +#define VMK_VPORT_NOMEM (-3) /* no memory available for command */ +#define VMK_VPORT_NORESOURCES (-4) /* no vport resources */ +#define VMK_VPORT_PARAMETER_ERR (-5) /* wrong parameter passed */ + +/** + * \brief VPORT API default invalid count value + */ +#define VMK_VPORT_CNT_INVALID 0xFFFFFFFF + +/** + * \brief VPORT API autoretry flag + */ +#define VMK_VPORT_OPT_AUTORETRY 0x01 + +/** + * \brief VPORT API Symbolic (VM) name - NULL terminated string associated with a vport + * + * This name will be used at the time of creating a Vport at fc driver. This is + * an array of 128 bytes (max 128, so the max name length is 127 bytes + 1 NULL). + */ +#define VMK_VPORT_VM_NAME_LENGTH 128 + +/** + * \brief VPORT API future VSAN API use + */ +#define VMK_VPORT_VF_ID_UNDEFINED 0xFFFFFFFF +#define VMK_VPORT_FABRIC_NAME_LENGTH 8 + +/** + * \brief VPORT API bit masks for active FC4 roles + */ +#define VMK_VPORT_ROLE_FCP_INITIATOR 0x01 +#define VMK_VPORT_ROLE_FCP_TARGET 0x02 +#define VMK_VPORT_ROLE_IP_OVER_FC 0x04 + +/* + * Data structures + */ + +/** + * \brief VPORT API commands + * + * These are the commands that are allowed via the NPIV API entry point + */ +typedef enum { + VMK_VPORT_CREATE = 1, /* Create a vport */ + VMK_VPORT_DELETE = 2, /* Delete a vport */ + VMK_VPORT_INFO = 3, /* Get vport info from phys hba */ + VMK_VPORT_TGT_REMOVE = 4, /* Target Remove (not used) */ + VMK_VPORT_SUSPEND = 5 /* suspend/resume vport */ +} vmk_VportOpCmd; + +/** + * \brief VPORT API link type + * + * Used by underlying transport to inform link type to scsi midlayer + */ +typedef enum { + VMK_VPORT_TYPE_PHYSICAL = 0, /* physical FC-Port */ + VMK_VPORT_TYPE_VIRTUAL /* Virtual Vport Port */ +} vmk_VportLinkType; + + +/** + * \brief VPORT API port state + */ +typedef enum { + VMK_VPORT_STATE_OFFLINE = 0, /* vport is offline */ + VMK_VPORT_STATE_ACTIVE, /* vport is active */ + VMK_VPORT_STATE_FAILED /* vport is failed */ +} vmk_VporState; + +/** + * \brief VPORT API port specific fail reason + */ +typedef enum { + VMK_VPORT_FAIL_UNKNOWN = 0, /* vport fail unknown reason */ + VMK_VPORT_FAIL_LINKDOWN, /* physical link is down */ + VMK_VPORT_FAIL_FAB_UNSUPPORTED, /* san fabric does not support npiv */ + VMK_VPORT_FAIL_FAB_NORESOURCES, /* not enough reasources in san fabric */ + VMK_VPORT_FAIL_FAB_LOGOUT, /* san logged out the vport */ + VMK_VPORT_FAIL_ADAP_NORESOURCES +} vmk_VportFailReason; + +/** + * \brief VPORT API vport-type flag used by scsi midlayer + * + * Vport type flag passed using vmk_ScsiVportArgs.flags used scsi midlayer + * to inform vmkernel about the vport type backing a vmkernel adapter. + */ +typedef enum { + VMK_SCSI_VPORT_TYPE_LEGACY = 0x00000001, /* vport hba is legacy vport */ + VMK_SCSI_VPORT_TYPE_FULLHBA = 0x00000002, /* vport hba has full HBA status */ + VMK_SCSI_VPORT_TYPE_PASSTHRU = 0x00000004 /* vport hba is a passthru */ +} vmk_ScsiVportTypeFlags; + +/** + * \brief VPORT API Args list is used to pass arguments to lowlevel underlying + * transport layer and eventually to HBA driver through the NPIV API + * + * This Structure is used for all types of vport calls made from vmkernel + * to underlying transport layer. + */ +typedef struct vmk_ScsiVportArgs { + /** \brief Node World Wide Name */ + vmk_VportWwn wwpn; + /** \brief Port World Wide Name */ + vmk_VportWwn wwnn; + /** \brief Vport's ScsiHost pointer */ + void *virthost; + /** \brief Reserved for arguments structure */ + void *arg; + /** \brief Symbolic name, generally VM's name is used */ + char *name; + /** \brief Vport's Scsi Adapter */ + void *virtAdapter; + /** \brief Vport type flag, internal use only */ + vmk_uint32 flags; +} vmk_ScsiVportArgs; + +/** + * \brief VPORT API This Structure is used to get the NPIV specific information + * from physical host bus adapter. + * + * Info structure returned by the VMK_VPORT_INFO command made to the physical + * HBA adapter + */ +typedef struct vmk_VportInfo { + /** \brief Vport API version */ + vmk_uint32 api_version; + /** \brief Vport link type */ + vmk_VportLinkType linktype; + /** \brief State of vport support */ + vmk_VporState state; + /** \brief reason for VportInfo failure */ + vmk_VportFailReason fail_reason; + /** \brief previous reason for VportInfo failure */ + vmk_VportFailReason prev_fail_reason; + /** \brief Node World Wide Name */ + vmk_VportWwn node_name; + /** \brief Port World Wide Name */ + vmk_VportWwn port_name; + + /* Following values are valid only on physical ports */ + /** \brief maximum number of vports supported by fc hba */ + vmk_uint32 vports_max; + /** \brief number of vports that are in use on fc hba */ + vmk_uint32 vports_inuse; + /** \brief maximum number of RPIs available in the fc FW */ + vmk_uint32 rpi_max; + /** \brief number of RPIs currently in-use in the fc FW */ + vmk_uint32 rpi_inuse; + + /* QoS Values */ + /** \brief QoS (Quality of Service) Priority */ + vmk_uint8 QoSPriority; + /** \brief QoS (Quality of Service) Bandwidth percentage */ + vmk_uint8 QosBandwith; + + /** \brief Virtual SAN (VSAN) number */ + vmk_int16 vsan_number; + /** \brief Virtual Fabric (VF) id number, undefined value is -1 */ + vmk_int32 vf_id; + /** \brief Vport role id initiator/target etc */ + vmk_int32 role_id; +} vmk_VportInfo; + +/** + * \brief VPORT API This structure is to communicate with the host bus adapter + * driver at the time of vport create operation. + * + * On success, a new ScsiHost will be assigned to vport_shost for the newly + * created virtual port. + */ +struct vmk_VportData { + /** \brief Vport API version */ + vmk_uint32 api_version; + /** \brief optional values */ + vmk_uint32 options; + /** \brief Node World Wide Name */ + vmk_VportWwn node_name; + /** \brief Port World Wide Name */ + vmk_VportWwn port_name; + /** \brief Vport's ScsiHost pointer */ + void *vport_shost; + + /** \brief fabric name, zero's if direct connect/private loop */ + vmk_uint8 fabric_name[VMK_VPORT_FABRIC_NAME_LENGTH]; + + /* QoS Values */ + /** \brief QoS (Quality of Service) Priority */ + vmk_uint8 QoSPriority; + /** \brief QoS (Quality of Service) Bandwidth percentage */ + vmk_uint8 QosBandwith; + + /** \brief Virtual SAN (VSAN) number */ + vmk_int16 vsan_number; + /** \brief Virtual Fabric (VF) id number, undefined value is -1 */ + vmk_int32 vf_id; + /** \brief Vport role id initiator/target etc */ + vmk_int32 role_id; + + /** \brief Symbolic name, generally VM's name is used */ + vmk_int8 symname[VMK_VPORT_VM_NAME_LENGTH]; +}; + +#endif /* _VMKAPI_NPIV_H_ */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv_wwn.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv_wwn.h new file mode 100644 index 0000000..15e58d6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/npiv/vmkapi_npiv_wwn.h @@ -0,0 +1,34 @@ +/* ********************************************************** + * Copyright 2006 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * vmkapi_npiv_wwn.h -- + * + * WWN Defines exported to everyone + */ + +#ifndef _VMKAPI_NPIV_WWN_H_ +#define _VMKAPI_NPIV_WWN_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/** + * \brief VPORT API World Wide Name length + */ +#define VMK_VPORT_WWN_LEN 8 /* 8 bytes */ + +/** + * \brief VPORT API Vport World Wide Name + */ +typedef unsigned char vmk_VportWwn[VMK_VPORT_WWN_LEN]; + +#endif // _VMKAPI_NPIV_WWN_H_ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi.h new file mode 100644 index 0000000..6a2b1e6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi.h @@ -0,0 +1,1259 @@ +/*************************************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SCSI */ /** + * \addtogroup Storage + * @{ + * \defgroup SCSI SCSI Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_H_ +#define _VMKAPI_SCSI_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_heap.h" +#include "base/vmkapi_memory.h" +#include "base/vmkapi_scatter_gather.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_revision.h" +#include "scsi/vmkapi_scsi_const.h" +#include "scsi/vmkapi_scsi_types.h" +#include "device/vmkapi_vector.h" + +/* + * Physical Path + */ + +/* + *********************************************************************** + * vmk_ScsiDeviceClassToString -- */ /** + * + * \ingroup SCSI + * + * \brief Convert a SCSI class identifier into a human-readable text + * string. + * + * \param[in] sclass SCSI class to convert. + * + * \return The description string. + * + *********************************************************************** + */ +const char *vmk_ScsiDeviceClassToString( + vmk_ScsiDeviceClass sclass); + +/* + *********************************************************************** + * vmk_ScsiScanPaths -- */ /** + * + * \ingroup SCSI + * + * \brief Scan one or more physical paths. + * + * The discovered paths are automatically registered with the + * storage stack. + * + * The sparse luns, max lun id and lun mask settings affect which + * paths are actually scanned. + * + * \note If this routine returns an error, some paths may have been + * sucessfully discovered. + * \note This function may block. + * + * \param[in] adapterName Name of the adapter to scan, or + * VMK_SCSI_PATH_ANY_ADAPTER to scan all + * adapters. + * \param[in] channel Channel to scan, or VMK_SCSI_PATH_ANY_CHANNEL + * to scan all channels. + * \param[in] target Target id to scan, or VMK_SCSI_PATH_ANY_TARGET + * to scan all targets. + * \param[in] lun LUN id to scan, or VMK_SCSI_PATH_ANY_LUN to + * scan all LUNs. + * + * + * \retval VMK_INVALID_NAME The requested adapter was not found. + * \retval VMK_BUSY The requested adapter is currently being + * scanned by some other context. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiScanPaths( + const char *adapterName, + vmk_uint32 channel, + vmk_uint32 target, + vmk_uint32 lun); + +/* + *********************************************************************** + * vmk_ScsiScanAndClaimPaths -- */ /** + * + * \ingroup SCSI + * + * \brief Scan one or more physical paths and run the plugin claim rules. + * + * The discovered paths are automatically registered with the + * storage stack. Path claim is invoked after a successful scan. + * This may result in new SCSI devices being registered with VMkernel. + * + * The sparse luns, max lun id and lun mask settings affect which + * paths are actually scanned. + * + * \note This function may block. + * + * \param[in] adapterName Name of the adapter to scan, or + * \em VMK_SCSI_PATH_ANY_ADAPTER to scan all + * adapters. + * \param[in] channel Channel to scan, or + * \em VMK_SCSI_PATH_ANY_CHANNEL to scan all + * channels. + * \param[in] target Target id to scan, or + * \em VMK_SCSI_PATH_ANY_TARGET to scan all + * targets. + * \param[in] lun LUN id to scan, or \em VMK_SCSI_PATH_ANY_LUN + * to scan all LUNs. + * + * \return It can return all the errors that vmk_ScsiScanPaths() can return. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiScanAndClaimPaths( + const char *adapterName, + vmk_uint32 channel, + vmk_uint32 target, + vmk_uint32 lun); + +/* + *********************************************************************** + * vmk_ScsiScanDeleteAdapterPath -- */ /** + * + * \ingroup SCSI + * + * \brief Scan a physical path and remove it if dead + * + * The path will be unclaimed and removed only if it is dead. + * This may result in a SCSI device being unregistered with VMkernel + * in the case where this is the last path backing that device. + * If there are users of the device and it is the last path to the + * device, then the unclaim and deletion of the path will fail. + * + * The sparse luns, max lun id and lun mask settings affect whether + * the path is actually scanned or not. + * + * \note This function may block. + * + * \note Do NOT use a loop around this call to rescan every possible + * path on an adapter. This API is only intended for removal of + * specific paths based on a plugins better knowledge of such a + * path being removed. In general VMware wants the end user to + * know about dead paths so misconfigurations can be fixed and + * a plugin should thus never remove a path if it does not have + * special knowledge from the backing device about the path + * being dead and that this knowledge is irrelevant to the user + * (e.g. because the user removed the device through device + * specific means etc.). + * + * \param[in] adapterName Name of the adapter to scan + * \param[in] channel Channel to scan + * \param[in] target Target id to scan + * \param[in] lun LUN id to scan + * + * \return It can return all the errors that vmk_ScsiScanPaths() can + * return as well as VMK_BAD_PARAM if the channel/target/lun + * is an ANY parameter (you can only scan one specific path). + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiScanDeleteAdapterPath( + const char *adapterName, + vmk_uint32 channel, + vmk_uint32 target, + vmk_uint32 lun); + +/* + *********************************************************************** + * vmk_ScsiNotifyPathStateChange -- */ /** + * + * \ingroup SCSI + * + * \brief Notify the VMkernel of a possible path state change (sync). + * + * Path is identified by \em vmkAdapter, \em channel, \em target + * and \em lun. + * This interface does the path probe in the calling context. + * The function returns the result from an attempt to probe the + * state of the path(s) without retrying on error conditions. + * + * \note This function may block. + * \note No spin lock may be held when calling this function. + * + * \param[in] vmkAdapter Name of the adapter for state change. + * \param[in] channel Channel for state change. + * \param[in] target Target for state change. + * \param[in] lun LUN for state change. If -1, scan all + * LUNs on the given adapter, channel, + * and target. + * + * \retval VMK_NOT_FOUND Requested path was not found. This will + * be returned only when a specific \em lun + * is mentioned (not for \em lun==-1). + * \retval VMK_BUSY Requested path is already being probed. + * + * \return Any other error indicates some plugin specific error while + * probing for the path. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiNotifyPathStateChange( + vmk_ScsiAdapter *vmkAdapter, + vmk_int32 channel, + vmk_int32 target, + vmk_int32 lun); + +/* + *********************************************************************** + * vmk_ScsiNotifyPathStateChangeAsync -- */ /** + * + * \ingroup SCSI + * + * \brief Notify the VMkernel of a possible path state change (async). + * + * Path is identified by \em vmkAdapter, \em channel, \em target, + * \em lun. Unlike vmk_ScsiNotifyPathStateChange(), which does the + * path probe in the calling context, this function only schedules + * the path probe to happen in separate context. Hence there is no + * restriction on the calling context (interrupt, or bottom-half, + * or kernel context) and the locks held on entry. + * + * The function returns the result of an attempt to schedule a + * probe of the state of the path(s). The result of the probe + * itself is not returned. In the face of error conditions, + * the probe will be retried a large number of times. + * + * \param[in] vmkAdapter Name of the adapter for state change. + * \param[in] channel Channel for state change. + * \param[in] target Target for state change. + * \param[in] lun LUN for state change. If -1, scan all + * LUNs on the given adapter, channel, + * and target. + * + * \retval VMK_NO_MEMORY Out of memory. + * \retval VMK_NO_RESOURCES Failed to schedule the asynchronous path + * probe due to lack of resources. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiNotifyPathStateChangeAsync( + vmk_ScsiAdapter *vmkAdapter, + vmk_int32 channel, + vmk_int32 target, + vmk_int32 lun); + +/* + *********************************************************************** + * vmk_ScsiInitTaskMgmt -- */ /** + * + * \ingroup SCSI + * + * \brief Create a task management request filter. + * + * A task management request filter consists of two things: + * + * - A TASK MANAGEMENT action (abort, device reset, bus reset, lun + * reset etc). This is the \em type parameter. + * + * - A rule to define the commands on which the above action should + * be performed. This is defined by the \em cmdId parameter. + * + * A task management request filter thus created can then be used by any + * subsequent functions that expect a \em vmk_ScsiTaskMgmt argument. + * + * \param[in] vmkTask The task management structure to initialize. + * \param[in] type Type of task management request. + * \param[in] cmdId Identifier of the command(s) to abort. + * This field is only valid for abort and virtual + * reset. It is ignored otherwise. + * \em VMK_SCSI_TASKMGMT_ANY_INITIATOR is only + * valid for virtual reset. + * cmdID.initiator may one of the following: + * - cmdID.initiator from the vmk_ScsiCommand + * structure. + * - \em VMK_SCSI_TASKMGMT_ANY_INITIATOR. + * - NULL + * If initiator is from the vmk_ScsiCommand + * structure and type is \em VMK_SCSI_TASKMGMT_ABORT, + * then cmdID.serialNumber can also be obtained + * from vmk_ScsiCommand (cmdID.serialNumber) + * else 0. + * cmdID.serialNumber is only valid for abort. + * It is ignored otherwise. + * \param[in] worldId World on behalf of whom the command was issued. + * This argument is only valid for abort and + * virtual reset. It is ignored otherwise. + * + * \par Examples: + * - Abort a specific I/O: + * \code + * vmk_ScsiInitTaskMgmt(task, VMK_SCSI_TASKMGMT_ABORT, + * vmkCmd->cmdId, vmkCmd->worldId); + * \endcode + * - Abort all i/os issued by a single world: + * \code + * cmdId.initiator = VMK_SCSI_TASKMGMT_ANY_INITIATOR; + * cmdId.serialNumber = 0; + * vmk_ScsiInitTaskMgmt(task, VMK_SCSI_TASKMGMT_VIRT_RESET, + * cmdId, worldId); + * \endcode + * - Abort all i/os issued by a single world from a specific initiator: + * \code + * cmdId.initiator = originalInitiator: + * cmdId.serialNumber = 0; + * vmk_ScsiInitTaskMgmt(task, VMK_SCSI_TASKMGMT_VIRT_RESET, + * cmdId, worldId); + * \endcode + * - Abort all i/os issued by all worlds: + * \code + * cmdId.initiator = NULL; + * cmdId.serialNumber = 0; + * vmk_ScsiInitTaskMgmt(task, VMK_SCSI_TASKMGMT_LUN_RESET, + * cmdId, worldId); + * \endcode + * The worldID should be the World ID of the reset issuer. + * + *********************************************************************** + */ +void vmk_ScsiInitTaskMgmt( + vmk_ScsiTaskMgmt *vmkTask, + vmk_ScsiTaskMgmtType type, + vmk_ScsiCommandId cmdId, + vmk_uint32 worldId); + +/* + *********************************************************************** + * vmk_ScsiQueryTaskMgmt -- */ /** + * + * \ingroup SCSI + * + * \brief Matches a SCSI command against a task management request + * filter, and returns the action to be taken for that command. + * + * The task management request filter is obtained by a call to + * vmk_ScsiInitTaskMgmt() + * + * \param[in] vmkTaskMgmt Task management request. + * \param[in] cmd Command to check. + * + * \retval VMK_SCSI_TASKMGMT_ACTION_IGNORE No task management action to + * be taken for this command. + * \retval VMK_SCSI_TASKMGMT_ACTION_ABORT Complete this command with + * status + * \em vmkTaskMgmt->\em status + * + *********************************************************************** + */ +vmk_ScsiTaskMgmtAction vmk_ScsiQueryTaskMgmt( + const vmk_ScsiTaskMgmt *vmkTaskMgmt, + const vmk_ScsiCommand *cmd); + +/* + *********************************************************************** + * vmk_ScsiGetTaskMgmtTypeName -- */ /** + * + * \ingroup SCSI + * + * \brief Returns a human readable description of the task management + * request. + * + * \param[in] taskMgmtType Task management type to convert to a + * string. + * + * \return The description string. + * + *********************************************************************** + */ +const char *vmk_ScsiGetTaskMgmtTypeName( + vmk_ScsiTaskMgmtType taskMgmtType); + +/* + *********************************************************************** + * vmk_ScsiDebugDropCommand -- */ /** + * + * \ingroup SCSI + * + * \brief Tell whether a command should be dropped. + * + * This is used for fault injection. + * + * \param[in] adapter Adapter the command would be issued to. + * \param[in] cmd Command to check. + * + * \retval VMK_TRUE The command should be dropped. + * \retval VMK_FALSE The command should not be dropped. + * + * \note vmk_ScsiDebugDropCommand() always returns VMK_FALSE for release + * builds. + * + *********************************************************************** + */ +vmk_Bool +vmk_ScsiDebugDropCommand(vmk_ScsiAdapter *adapter, vmk_ScsiCommand *cmd); + +/* + *********************************************************************** + * vmk_ScsiAdapterEvent -- */ /** + * + * \ingroup SCSI + * + * \brief Notifies the VMkernel of a specific event on the + * specified adapter. + * + * \param[in] adapter Pointer to the adapter to signal the event on. + * \param[in] eventType Event to signal. + * + * \retval VMK_BUSY Another adapter event is being processed. + * \retval VMK_NO_MEMORY Out of memory. + * + * \return Any other error value indicates some internal error + * encountered while notifying VMkernel. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiAdapterEvent(vmk_ScsiAdapter *adapter, vmk_uint32 eventType); + +/* + *********************************************************************** + * vmk_ScsiAdapterIsPAECapable -- */ /** + * + * \ingroup SCSI + * + * \brief Determines if the adapter supports DMA beyond 32 bits of + * machine-address space. + * + * \param[in] adapter Adapter to check. + * + * \retval VMK_TRUE The adapter supports DMA beyond 32 bits. + * \retval VMK_FALSE The adapter is limited to DMA in the lower + * 32 bits of machine-address space + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiAdapterIsPAECapable(vmk_ScsiAdapter *adapter) +{ + return adapter->paeCapable; +} + +/* + *********************************************************************** + * vmk_ScsiCmdStatusIsGood -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if a command status indicates a successful + * completion. Note that this function returns false + * if the device returns a check condition with a + * recovered error sense code. See vmk_ScsiCmdIsSuccessful() + * to test for both conditions. + * + * \param[in] status Status to check. + * + * \retval VMK_TRUE The status indicates successful completion. + * \retval VMK_FALSE The status indicates some error. Use + * vmk_ScsiCmdStatusIsCheck() and + * vmk_ScsiExtractSenseData() to get the actual + * error. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdStatusIsGood(vmk_ScsiCmdStatus status) +{ + return (status.device == VMK_SCSI_DEVICE_GOOD && + status.host == VMK_SCSI_HOST_OK && + status.plugin == VMK_SCSI_PLUGIN_GOOD) ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_ScsiCmdIsRecoveredError -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if a command status indicates a recovered + * error. + * + * \param[in] vmkCmd Command to check. + * + * \retval VMK_TRUE The status indicates a command completed with + * a recovered error status. + * \retval VMK_FALSE The status indicates a command did not + * complete with a recovered error status. + * + *********************************************************************** + */ +vmk_Bool +vmk_ScsiCmdIsRecoveredError(const vmk_ScsiCommand *vmkCmd); + +/* + *********************************************************************** + * vmk_ScsiCmdIsSuccessful -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if vmk_ScsiCommand completed successfully. + * + * \param[in] vmkCmd vmkCmd to check + * + * \retval VMK_TRUE The status indicates the i/o completed + * successfully + * \retval VMK_FALSE The status indicates some error. Use + * vmk_ScsiCmdStatusIsCheck() and + * vmk_ScsiExtractSenseData() to get the actual + * error. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdIsSuccessful(const vmk_ScsiCommand *vmkCmd) +{ + return vmk_ScsiCmdStatusIsGood(vmkCmd->status) || + vmk_ScsiCmdIsRecoveredError(vmkCmd); +} + +/* + *********************************************************************** + * vmk_ScsiCmdStatusIsResvConflict -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if a command status indicates a reservation + * conflict. + * + * \param[in] status Status to check. + * + * \retval VMK_TRUE The status is reservation conflict. + * \retval VMK_FALSE The status is not a reservation conflict. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdStatusIsResvConflict(vmk_ScsiCmdStatus status) +{ + return (status.device == VMK_SCSI_DEVICE_RESERVATION_CONFLICT && + status.host == VMK_SCSI_HOST_OK && + status.plugin == VMK_SCSI_PLUGIN_GOOD); +} + +/* + *********************************************************************** + * vmk_ScsiCmdStatusIsCheck -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if a command status indicates a check condition. + * + * \param[in] status Status to check. + * + * \retval VMK_TRUE The status indicates a check condition. + * \retval VMK_FALSE The status is not a check condition. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdStatusIsCheck(vmk_ScsiCmdStatus status) +{ + return (status.device == VMK_SCSI_DEVICE_CHECK_CONDITION && + status.host == VMK_SCSI_HOST_OK && + status.plugin == VMK_SCSI_PLUGIN_GOOD) ? VMK_TRUE : VMK_FALSE; +} + +/* + *********************************************************************** + * vmk_ScsiCmdSenseIsPOR -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if sense data is a unit attention with Power-On Reset + * as the additional sense code. + * + * \param[in] senseData sense data to inspect. + * + * \retval VMK_TRUE The status indicates a unit attention with + * power-on reset. + * \retval VMK_FALSE The status is not a power-on reset unit attention. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdSenseIsPOR(const vmk_ScsiSenseData *senseData) +{ + return ((senseData->key == VMK_SCSI_SENSE_KEY_UNIT_ATTENTION) && + (senseData->optLen >= 6) && + (senseData->asc == VMK_SCSI_ASC_POWER_ON_OR_RESET) && + (senseData->ascq == 0)); +} + +/* + *********************************************************************** + * vmk_ScsiCmdSenseIsResvReleased -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if sense data is a unit attention with reservation + * released as the additional sense code. + * + * \param[in] senseData sense data to inspect. + * + * \retval VMK_TRUE The senses data is a unit attention with + * reservation released. + * \retval VMK_FALSE The senses data is not a unit attention with + * reservation released. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdSenseIsResvReleased(const vmk_ScsiSenseData *senseData) +{ + return ((senseData->key == VMK_SCSI_SENSE_KEY_UNIT_ATTENTION) && + (senseData->asc == VMK_SCSI_ASC_PARAMS_CHANGED) && + (senseData->ascq == + VMK_SCSI_ASC_PARAMS_CHANGED_ASCQ_RESERVATIONS_RELEASED)); +} + +/* + *********************************************************************** + * vmk_ScsiCmdSenseIsMediumNotPresent -- */ /** + * + * \ingroup SCSI + * + * \brief Determine if sense data is a sense key not ready with medium + * not present as the additional sense code. + * + * \param[in] senseData sense data to inspect. + * + * \retval VMK_TRUE The senses data is sense key not ready with + * medium not present. + * \retval VMK_FALSE The senses data is not a sense key not ready + * with medium not present. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiCmdSenseIsMediumNotPresent(const vmk_ScsiSenseData *senseData) +{ + return ((senseData->key == VMK_SCSI_SENSE_KEY_NOT_READY) && + (senseData->asc == VMK_SCSI_ASC_MEDIUM_NOT_PRESENT)); +} + +/* + *********************************************************************** + * vmk_ScsiGetLbaLbc -- */ /** + * + * \ingroup SCSI + * + * \brief Parse a SCSI CDB and pull out lba and lbc. + * + * Determine the lba and lbc for a given cdb. This is most useful + * for READ and WRITE cdb's. This function will deal with converting + * endianness & differences between the sizes of cdbs. + * + * \param[in] cdb SCSI cdb to parse. + * \param[in] cdbLen Length of cdb in bytes. + * \param[in] devClass SCSI Device Class. + * \param[out] lba Logical Block Address. + * \param[out] lbc Logical Block Count. + * + * \retval VMK_NOT_SUPPORTED \em devClass is none of + * \em SCSI_CLASS_DISK, \em SCSI_CLASS_CDROM, + * \em SCSI_CLASS_TAPE, or, + * \em devClass is + * \em SCSI_CLASS_CDROM and \em cdb[0] does + * not contain 10/12 byte READ/WRITE SCSI + * command opcode. + * \retval VMK_BAD_PARAM \em cdb[0] does not contain 6/10/12/16 + * byte READ/WRITE SCSI command opcode. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiGetLbaLbc(unsigned char *cdb, vmk_size_t cdbLen, + vmk_ScsiDeviceClass devClass, vmk_uint64 *lba, + vmk_uint32 *lbc); + +/* + *********************************************************************** + * vmk_ScsiSetLbaLbc -- */ /** + * + * \ingroup SCSI + * + * \brief Set lba and lbc fields in a given SCSI CDB. + * + * Set the lba and lbc for a given cdb. This is most useful + * for READ and WRITE cdb's. This function will deal with converting + * endianness & differences between the sizes of cdb's. Callers + * must set \em cdb[0] before making this call. + * + * \param[in,out] cdb SCSI cdb to set. + * \param[in] cdbLen Length of cdb in bytes. + * \param[in] devClass SCSI Device Class. + * \param[out] lba Logical Block Address. + * \param[out] lbc Logical Block Count. + * + * \retval VMK_NOT_SUPPORTED \em devClass is none of + * \em SCSI_CLASS_DISK, + * \em SCSI_CLASS_CDROM, or, + * \em devClass is \em SCSI_CLASS_CDROM and + * \em cdb[0] does not contain 10/12 byte + * READ/WRITE SCSI command opcode. + * \retval VMK_BAD_PARAM \em cdb[0] does not contain 6/10/12/16 + * byte SCSI READ/WRITE command opcode. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiSetLbaLbc(unsigned char *cdb, vmk_size_t cdbLen, + vmk_ScsiDeviceClass devClass, vmk_uint64 *lba, + vmk_uint32 *lbc); + +/* + *********************************************************************** + * vmk_ScsiAllocateAdapter -- */ /** + * + * \ingroup SCSI + * + * \brief Allocate an adapter. + * + * After successful return, the adapter is in \em allocated state. + * Use vmk_ScsiFreeAdapter() to free this adapter structure. + * + * \param[in] heapID Heap to allocate the new adapter from. + * + * \return New adapter. + * \retval NULL Out of memory. + * + *********************************************************************** + */ +vmk_ScsiAdapter * vmk_ScsiAllocateAdapter( + vmk_HeapID heapID); + +/* + *********************************************************************** + * vmk_ScsiRegisterAdapter -- */ /** + * + * \ingroup SCSI + * + * \brief Register an adapter with the VMkernel. + * + * After successful return, the adapter is in \em enabled state and + * drivers can issue a scan on that adapter. + * + * If \em ScanOnDriverLoad config option is set and + * \em vmk_ScsiAdapter->\em flag + * has \em VMK_SCSI_ADAPTER_FLAG_REGISTER_WITHOUT_SCAN bit clear, then + * VMkernel will scan all the LUs connected to this adapter. Path + * claiming will be run which might result in new SCSI devices being + * registered with VMkernel. + * + * If you do not want this autoscan and claim process to happen, you can + * set the \em VMK_SCSI_ADAPTER_FLAG_REGISTER_WITHOUT_SCAN in + * \em vmk_ScsiAdapter->\em flag, before calling vmk_ScsiRegisterAdapter(). + * This can be useful for some drivers f.e. iSCSI, where a usual SCSI + * scan does not make sense. + * + * \note The scan and claim is done in a deferred context and hence might + * not have completed when vmk_ScsiRegisterAdapter() returns. + * \note This function does not block. + * + * \param[in] adapter Adapter to register. This should have been + * allocated with a prior call to + * vmk_ScsiAllocateAdapter(). + * + * \retval VMK_OK The adapter was successfully registered. Scan + * and path claim might be still running. + * \retval VMK_EXISTS An adapter with same name already registered. + * \retval VMK_BAD_PARAM One or more adapter fields are not initialized + * correctly. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiRegisterAdapter( + vmk_ScsiAdapter *adapter); + +/* + *********************************************************************** + * vmk_ScsiUnregisterAdapter -- */ /** + * + * \ingroup SCSI + * + * \brief Unregister an adapter previously registered by + * vmk_ScsiRegisterAdapter(). + * + * \note This function may block indefinitely, waiting for all the + * references on the adapter to be released. + * + * \param[in] adapter Adapter to unregister. + * + * \retval VMK_OK Successfully unregistered. The adapter will go + * to \em allocated state and can be used for a + * subsequent vmk_ScsiRegisterAdapter() call. + * \retval VMK_BUSY One or more paths originating from this adapter + * are claimed by some plugin. + * \retval VMK_FAILURE Adapter is neither in \em enabled, \em disabled + * or \em allocated state. An appropriate message is + * logged. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiUnregisterAdapter( + vmk_ScsiAdapter *adapter); + +/* + *********************************************************************** + * vmk_ScsiFreeAdapter -- */ /** + * + * \ingroup SCSI + * + * \brief Free an adapter previously allocated by + * vmk_ScsiAllocateAdapter(). + * + * \warning Do not call vmk_ScsiFreeAdapter() for a registered adapter. + * The adapter should be in \em allocated state. + * + * \param[in] adapter Adapter to free. + * + *********************************************************************** + */ +void vmk_ScsiFreeAdapter( + vmk_ScsiAdapter *adapter); + +/* + *********************************************************************** + * vmk_ScsiRemovePath -- */ /** + * + * \ingroup SCSI + * + * \brief Destroy the path identified by \em adapter, \em channel, + * \em targetId and \em lunId. + * + * If the path to be removed is claimed by an MP plugin, VMkernel will + * first try to unclaim the path by calling the plugin's \em unclaim + * entrypoint. + * + * \note This function may block indefinitely, waiting for all the + * references held on the path to be released. + * + * \param[in] adapter Adapter for path to remove. + * \param[in] channel Channel for path to remove. + * \param[in] targetId Target ID for path to remove. + * \param[in] lunId LUN ID for path to remove. + * + * \retval VMK_TRUE The path was removed successfully. + * \retval VMK_FALSE The path doesn't exist or the path exists but is + * claimed by a plugin and could not be successfully + * unclaimed. + * + *********************************************************************** + */ +vmk_Bool vmk_ScsiRemovePath( + vmk_ScsiAdapter *adapter, + vmk_uint32 channel, + vmk_uint32 targetId, + vmk_uint32 lunId); + + +/* + *********************************************************************** + * vmk_ScsiRegisterIRQ -- */ /** + * + * \ingroup SCSI + * + * \brief Registers an adapter's interrupt handler and interrupt vector + * with the VMkernel for polling during a core dump. + * + * To unregister, simply call vmk_ScsiRegisterIRQ() with NULL for + * \em intrHandler. + * + * \param[in] adapter Adapter to register on behalf of. + * \param[in] intrVector Interrupt vector number to register. + * \param[in] intrHandler Interrupt handler callback to invoke + * when an interrupt needs to be serviced. + * \param[in] intrHandlerData Private data to pass to the handler. + * + * \return vmk_ScsiRegisterIRQ() always succeeds. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiRegisterIRQ( + void *adapter, + vmk_uint32 intrVector, + vmk_InterruptHandler intrHandler, + void *intrHandlerData); + +/* + *********************************************************************** + * vmk_ScsiHostStatusToString -- */ /** + * + * \ingroup SCSI + * + * \brief Take a SCSI host status and return a static string describing it. + * + * \param[in] hostStatus Status to convert. + * + * \return Host status as a human readable string. + * + *********************************************************************** + */ +char * +vmk_ScsiHostStatusToString(vmk_ScsiHostStatus hostStatus); + +/* + *********************************************************************** + * vmk_ScsiDeviceStatusToString -- */ /** + * + * \ingroup SCSI + * + * \brief Take a SCSI device status and return a static string describing + * it. + * + * \param[in] deviceStatus Status to convert. + * + * \return Device status as a human readable string. + * + *********************************************************************** + */ +char * +vmk_ScsiDeviceStatusToString(vmk_ScsiDeviceStatus deviceStatus); + +/* + *********************************************************************** + * vmk_ScsiSenseKeyToString -- */ /** + * + * \ingroup SCSI + * + * \brief Take a SCSI sense key and return a static string describing it. + * + * \param[in] senseKey SCSI sense key to convert. + * + * \return Sense key as a human readable string. + * + *********************************************************************** + */ +char * +vmk_ScsiSenseKeyToString(vmk_uint32 senseKey); + +/* + *********************************************************************** + * vmk_ScsiAdditionalSenseToString -- */ /** + * + * \ingroup SCSI + * + * \brief Take a SCSI ASC/ASCQ and return a static string describing it. + * + * \param[in] asc SCSI ASC value to convert. + * \param[in] ascq SCSI ASCQ value to convert. + * + * \return ASC/ASCQ as a human readable string. + * + *********************************************************************** + */ +char * +vmk_ScsiAdditionalSenseToString(vmk_uint32 asc, + vmk_uint32 ascq); + +/* + ********************************************************************** + * vmk_ScsiExtractSenseData -- */ /** + * + * \ingroup SCSI + * + * \brief Extract the SCSI Check Condition. + * + * Examine the contents of the senseBuffer and return the SCSI check + * condtion key, the Additional Sense Code, and the Additional Sense + * Code Qualifier. + * + * \note The routine only handles sense buffers with a response + * code of 0x70 or 0x71 (Section 4.5.3 in the SCSI-3 spec). + * It does not handle response codes of 0x72, 0x73 or any + * vendor specific response codes. + * + * \param[in] senseBuffer The sense buffer to be examined. + * \param[out] sense_key The sense key to be extracted. + * \param[out] asc The Additional Sense Code to be extracted. + * \param[out] ascq The Additional Sense Code Qualifier to be + * extracted. + * + * \retval VMK_TRUE The sense buffer indicates a SCSI error condition, + * and sense_key, asc and ascq have been correctly + * set. + * \retval VMK_FALSE There was no error indicated on the current or + * previous command. + * + *********************************************************************** + */ +vmk_Bool +vmk_ScsiExtractSenseData(vmk_ScsiSenseData *senseBuffer, + vmk_uint8 *sense_key, + vmk_uint8 *asc, + vmk_uint8 *ascq); + +/* + *********************************************************************** + * vmk_ScsiVPDPageSize -- */ /** + * + * \ingroup SCSI + * + * \brief Get the size of a VPD page. + * + * \param[in] response SCSI VPD Inquiry response header. This is usually + * the SCSI Inquiry response obtained by a prior + * vmk_ScsiGetPathInquiry() call. + * + * \return Size of VPD Page in bytes. + * + * \note The routine assumes that VPD length field is one byte for + * all pages except for page 83 which has 2 byte length. + * + *********************************************************************** + */ +vmk_uint16 +vmk_ScsiVPDPageSize(vmk_ScsiInquiryVPDResponse *response); + +/* + *********************************************************************** + * vmk_ScsiIllegalRequest -- */ /** + * + * \ingroup SCSI + * + * \brief Generates "illegal request" sense buffer data. + * + * \param[out] senseBuffer The sense buffer to be modified + * \param[in] asc The Additional Sense Code + * \param[in] ascq The Additional Sense Code Qualifier + * + * \note Status must be set to VMK_SCSI_DEVICE_CHECK_CONDITION + * in order for the sense buffer to be examined. + * + *********************************************************************** + */ +void +vmk_ScsiIllegalRequest(vmk_ScsiSenseData *senseBuffer, + vmk_uint8 asc, + vmk_uint8 ascq); + +/* + *********************************************************************** + * vmk_ScsiIsReadCdb -- */ /** + * + * \ingroup SCSI + * + * \brief Check whether the given SCSI opcode is one of the READ + * commands. + * + * \retval VMK_TRUE Opcode is a READ CDB opcode. + * \retval VMK_FALSE Opcode is not a READ CDB opcode. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiIsReadCdb(vmk_uint8 cdb0) +{ + return cdb0 == VMK_SCSI_CMD_READ6 + || cdb0 == VMK_SCSI_CMD_READ10 + || cdb0 == VMK_SCSI_CMD_READ12 + || cdb0 == VMK_SCSI_CMD_READ16; +} + +/* + *********************************************************************** + * vmk_ScsiIsWriteCdb -- */ /** + * + * \ingroup SCSI + * + * \brief Check whether the given SCSI opcode is one of the WRITE + * commands. + * + * \retval VMK_TRUE Opcode is a WRITE CDB opcode. + * \retval VMK_FALSE Opcode is not a WRITE CDB opcode. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiIsWriteCdb(vmk_uint8 cdb0) +{ + return cdb0 == VMK_SCSI_CMD_WRITE6 + || cdb0 == VMK_SCSI_CMD_WRITE10 + || cdb0 == VMK_SCSI_CMD_WRITE12 + || cdb0 == VMK_SCSI_CMD_WRITE16; +} + +/* + ********************************************************************** + * vmk_ScsiSetPathXferLimit -- */ /** + * + * \ingroup SCSI + * \brief Set the maximum single transfer size limit for a path. + * + * \param[in] vmkAdapter The target adapter. + * \param[in] channel The target channel. + * \param[in] target The target number. + * \param[in] lun The target LUN. + * \param[in] maxXfer The new maximum transfer size in bytes. + * + * \retval VMK_OK The max transfer size was set successfully. + * \retval VMK_NOT_FOUND The requested path was not found. + * + * \warning Do not set maximum transfer size to 0. This will result + * in undefined behaviour. + * + * \note You should not set maximum transfer size to a value greater + * than the adapter's maximum transfer size. Most adapters + * support a maximum transfer size of 256K, so it is safe to + * set a \em maxXfer value <= 256K. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiSetPathXferLimit(vmk_ScsiAdapter *vmkAdapter, + vmk_int32 channel, + vmk_int32 target, + vmk_int32 lun, + vmk_uint64 maxXfer); + +/* + ********************************************************************** + * vmk_ScsiModifyQueueDepth -- */ /** + * + * \ingroup SCSI + * + * \brief Set the queue depth of the path specified by \em vmkAdapter + * \em channel, \em target, and \em lun. + * + * For multiple paths going through the same SCSI adapter, the path + * queue depth controls the share of that path in the adapter's queue. + * Setting path queue depth to a value greater than the underlying + * adapter's queue depth is inconsequential and should not be done. + * + * + * \param[in] vmkAdapter The target adapter. + * \param[in] channel The target channel. + * \param[in] target The target number. + * \param[in] lun The target LUN. + * \param[in] qdepth The new queue depth value. + * + * \retval VMK_OK The queue depth was set successfully. + * \retval VMK_NOT_FOUND The requested path was not found. + * + * \warning Do not set qdepth to 0. This will result in undefined + * behaviour. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiModifyQueueDepth(vmk_ScsiAdapter *vmkAdapter, + vmk_int32 channel, + vmk_int32 target, + vmk_int32 lun, + vmk_uint32 qdepth); + +/* + *********************************************************************** + * vmk_ScsiAllFCPathsDown -- */ /** + * + * \brief Check if all Fibre Channel transport paths are dead. + * + * \retval VMK_TRUE There are one or more Fibre Channel paths but all + * of them are currently down. + * \retval VMK_FALSE There are no Fibre Channel paths or one or more + * Fibre Channel paths are up. + * + *********************************************************************** + */ +vmk_Bool vmk_ScsiAllFCPathsDown(void); + +/* + *********************************************************************** + * vmk_ScsiAdapterUniqueName -- */ /** + * + * \ingroup DeviceName + * \brief Create a new unique adapter name. + * + * This function returns a new unique adapter name. + * + * \param[out] adapterName Pointer to an array of characters at least + * VMK_SCSI_ADAPTER_NAME_LENGTH long, to + * receive the new adapter name. + *********************************************************************** + */ +void vmk_ScsiAdapterUniqueName(char *adapterName); + +/* + *********************************************************************** + * vmk_ScsiGetIdentifierFromPage83Inquiry -- */ /** + * + * \ingroup SCSI + * + * \brief Get the identifier of the given idType from the given page 83 + * inquiry data buffer. + * + * \param[in] *inquiryBuf buffer with VPD page 83 + * \param[in] inquiryBufLen length of the inquiryBuf buffer + * \param[in] idType + * \param[in] assoc + * \param[out] id[] + * \param[in] idLength + * + * \retval VMK_NOT_FOUND An identifier descriptor of the given idType + * could not be found in the page 83 inquiry + * response + * \retval VMK_OK An identifier descriptor of the given idType + * was found and the identifier was copied into + * the provided id buffer + * \retval VMK_BAD_PARAM An identifier descriptor of the given idType + * was found but the identifier was larger than + * the provided id[] array. + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiGetIdentifierFromPage83Inquiry(vmk_uint8 *inquiryBuf, + vmk_uint32 inquiryBufLen, + vmk_uint8 idType, + vmk_uint8 assoc, + vmk_uint8 id[], + vmk_uint32 idLength); + +/* + *********************************************************************** + * vmk_ScsiGetSystemLimits---- */ /** + * + * \ingroup SCSI + * + * \brief Retrieve the max number of Scsi devices and paths supported + * + * \param[out] limits pointer to a structure containing + * max number of supported devices and paths + * + *********************************************************************** + */ +void +vmk_ScsiGetSystemLimits(vmk_ScsiSystemLimits *limits); + +#endif /* _VMKAPI_SCSI_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_const.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_const.h new file mode 100644 index 0000000..864c262 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_const.h @@ -0,0 +1,455 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SCSI Constants */ /** + * \addtogroup SCSI + * @{ + * + * \defgroup SCSIconst SCSI Constants + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_CONST_H_ +#define _VMKAPI_SCSI_CONST_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +/* + * Non-exhaustive list of SCSI operation codes. Note that + * some codes are defined differently according to the target + * device. Also, codes may have slightly different meanings + * and/or names based on the version of the SCSI spec. + * + * Note: Command descriptions come from the "SCSI Book" and not + * from the SCSI specifications (YMMV). + */ +/** \brief Test if LUN ready to accept a command. */ +#define VMK_SCSI_CMD_TEST_UNIT_READY 0x00 +/** \brief Seek to track 0. */ +#define VMK_SCSI_CMD_REZERO_UNIT 0x01 +/** \brief Return detailed error information. */ +#define VMK_SCSI_CMD_REQUEST_SENSE 0x03 +#define VMK_SCSI_CMD_FORMAT_UNIT 0x04 +#define VMK_SCSI_CMD_READ_BLOCKLIMITS 0x05 +#define VMK_SCSI_CMD_REASSIGN_BLOCKS 0x07 +/** \brief Media changer. */ +#define VMK_SCSI_CMD_INIT_ELEMENT_STATUS 0x07 +/** \brief Read w/ limited addressing. */ +#define VMK_SCSI_CMD_READ6 0x08 +/** \brief Write w/ limited addressing. */ +#define VMK_SCSI_CMD_WRITE6 0x0a +/** \brief Print data. */ +#define VMK_SCSI_CMD_PRINT 0x0a +/** \brief Seek to LBN. */ +#define VMK_SCSI_CMD_SEEK6 0x0b +/** \brief Advance and print. */ +#define VMK_SCSI_CMD_SLEW_AND_PRINT 0x0b +/** \brief Read backwards. */ +#define VMK_SCSI_CMD_READ_REVERSE 0x0f +#define VMK_SCSI_CMD_WRITE_FILEMARKS 0x10 +/** \brief Print contents of buffer. */ +#define VMK_SCSI_CMD_SYNC_BUFFER 0x10 +#define VMK_SCSI_CMD_SPACE 0x11 +/** \brief Return LUN-specific information. */ +#define VMK_SCSI_CMD_INQUIRY 0x12 +/** \brief Recover buffered data. */ +#define VMK_SCSI_CMD_RECOVER_BUFFERED 0x14 +/** \brief Set device parameters. */ +#define VMK_SCSI_CMD_MODE_SELECT 0x15 +/** \brief Make LUN accessible only to certain initiators. */ +#define VMK_SCSI_CMD_RESERVE_UNIT 0x16 +/** \brief Make LUN accessible to other initiators. */ +#define VMK_SCSI_CMD_RELEASE_UNIT 0x17 +/** \brief Autonomous copy from/to another device. */ +#define VMK_SCSI_CMD_COPY 0x18 +#define VMK_SCSI_CMD_ERASE 0x19 +/** \brief Read device parameters. */ +#define VMK_SCSI_CMD_MODE_SENSE 0x1a +/** \brief Load/unload medium. */ +#define VMK_SCSI_CMD_START_UNIT 0x1b +/** \brief Perform scan. */ +#define VMK_SCSI_CMD_SCAN 0x1b +/** \brief Interrupt printing. */ +#define VMK_SCSI_CMD_STOP_PRINT 0x1b +/** \brief Read self-test results. */ +#define VMK_SCSI_CMD_RECV_DIAGNOSTIC 0x1c +/** \brief Initiate self-test. */ +#define VMK_SCSI_CMD_SEND_DIAGNOSTIC 0x1d +/** \brief Lock/unlock door. */ +#define VMK_SCSI_CMD_MEDIUM_REMOVAL 0x1e +/** \brief Read format capacities. */ +#define VMK_SCSI_CMD_READ_FORMAT_CAPACITIES 0x23 +/** \brief Set scanning window. */ +#define VMK_SCSI_CMD_SET_WINDOW 0x24 +/** \brief Get scanning window. */ +#define VMK_SCSI_CMD_GET_WINDOW 0x25 +/** \brief Read number of logical blocks. */ +#define VMK_SCSI_CMD_READ_CAPACITY 0x25 +/** \brief Read. */ +#define VMK_SCSI_CMD_READ10 0x28 +/** \brief Read max generation address of LBN. */ +#define VMK_SCSI_CMD_READ_GENERATION 0x29 +/** \brief Write. */ +#define VMK_SCSI_CMD_WRITE10 0x2a +/** \brief Seek LBN. */ +#define VMK_SCSI_CMD_SEEK10 0x2b +/** \brief Media changer. */ +#define VMK_SCSI_CMD_POSITION_TO_ELEMENT 0x2b +/** \brief Read specific version of changed block. */ +#define VMK_SCSI_CMD_READ_UPDATED_BLOCK 0x2d +/** \brief Write w/ verify of success. */ +#define VMK_SCSI_CMD_WRITE_VERIFY 0x2e +/** \brief Verify success. */ +#define VMK_SCSI_CMD_VERIFY 0x2f +/** \brief Search for data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_HIGH 0x30 +/** \brief Search for data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_EQUAL 0x31 +/** \brief Search for data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_LOW 0x32 +/** \brief Define logical block boundaries. */ +#define VMK_SCSI_CMD_SET_LIMITS 0x33 +/** \brief Read data into buffer. */ +#define VMK_SCSI_CMD_PREFETCH 0x34 +/** \brief Read current tape position. */ +#define VMK_SCSI_CMD_READ_POSITION 0x34 +/** \brief Re-read data into buffer. */ +#define VMK_SCSI_CMD_SYNC_CACHE 0x35 +/** \brief Lock/unlock data in cache. */ +#define VMK_SCSI_CMD_LOCKUNLOCK_CACHE 0x36 +#define VMK_SCSI_CMD_READ_DEFECT_DATA 0x37 +/** \brief Search for free area. */ +#define VMK_SCSI_CMD_MEDIUM_SCAN 0x38 +/** \brief Compare data. */ +#define VMK_SCSI_CMD_COMPARE 0x39 +/** \brief Autonomous copy w/ verify. */ +#define VMK_SCSI_CMD_COPY_VERIFY 0x3a +/** \brief Write data buffer. */ +#define VMK_SCSI_CMD_WRITE_BUFFER 0x3b +/** \brief Read data buffer. */ +#define VMK_SCSI_CMD_READ_BUFFER 0x3c +/** \brief Substitute block with an updated one. */ +#define VMK_SCSI_CMD_UPDATE_BLOCK 0x3d +/** \brief Read data and ECC. */ +#define VMK_SCSI_CMD_READ_LONG 0x3e +/** \brief Write data and ECC. */ +#define VMK_SCSI_CMD_WRITE_LONG 0x3f +/** \brief Set SCSI version. */ +#define VMK_SCSI_CMD_CHANGE_DEF 0x40 +#define VMK_SCSI_CMD_WRITE_SAME 0x41 +/** \brief Read subchannel data and status. */ +#define VMK_SCSI_CMD_READ_SUBCHANNEL 0x42 +/** \brief Read contents table. */ +#define VMK_SCSI_CMD_READ_TOC 0x43 +/** \brief Read LBN header. */ +#define VMK_SCSI_CMD_READ_HEADER 0x44 +/** \brief Audio playback. */ +#define VMK_SCSI_CMD_PLAY_AUDIO10 0x45 +/** \brief Get configuration (SCSI-3). */ +#define VMK_SCSI_CMD_GET_CONFIGURATION 0x46 +/** \brief Audio playback starting at MSF address. */ +#define VMK_SCSI_CMD_PLAY_AUDIO_MSF 0x47 +/** \brief Audio playback starting at track/index. */ +#define VMK_SCSI_CMD_PLAY_AUDIO_TRACK 0x48 +/** \brief Audio playback starting at relative track. */ +#define VMK_SCSI_CMD_PLAY_AUDIO_RELATIVE 0x49 +#define VMK_SCSI_CMD_GET_EVENT_STATUS_NOTIFICATION 0x4a +/** \brief Audio playback pause/resume. */ +#define VMK_SCSI_CMD_PAUSE 0x4b +/** \brief Select statistics. */ +#define VMK_SCSI_CMD_LOG_SELECT 0x4c +/** \brief Read statistics. */ +#define VMK_SCSI_CMD_LOG_SENSE 0x4d +/** \brief Audio playback stop. */ +#define VMK_SCSI_CMD_STOP_PLAY 0x4e +/** \brief Info on CDRs. */ +#define VMK_SCSI_CMD_READ_DISC_INFO 0x51 +/** \brief Track info on CDRs. */ +#define VMK_SCSI_CMD_READ_TRACK_INFO 0x52 +/** \brief Leave space for data on CDRs. */ +#define VMK_SCSI_CMD_RESERVE_TRACK 0x53 +/** \brief Optimum Power Calibration. */ +#define VMK_SCSI_CMD_SEND_OPC_INFORMATION 0x54 +/** \brief Set device parameters. */ +#define VMK_SCSI_CMD_MODE_SELECT10 0x55 +#define VMK_SCSI_CMD_RESERVE_UNIT10 0x56 +#define VMK_SCSI_CMD_RELEASE_UNIT10 0x57 +/** \brief Read device parameters. */ +#define VMK_SCSI_CMD_MODE_SENSE10 0x5a +/** \brief Close area/sesssion (recordable). */ +#define VMK_SCSI_CMD_CLOSE_SESSION 0x5b +/** \brief CDR burning info.. */ +#define VMK_SCSI_CMD_READ_BUFFER_CAPACITY 0x5c +/** \brief (CDR Related?). */ +#define VMK_SCSI_CMD_SEND_CUE_SHEET 0x5d +#define VMK_SCSI_CMD_PERSISTENT_RESERVE_IN 0x5e +#define VMK_SCSI_CMD_PERSISTENT_RESERVE_OUT 0x5f +/** \brief Extended Copy */ +#define VMK_SCSI_CMD_EXTENDED_COPY 0x83 +/** \brief Read data. */ +#define VMK_SCSI_CMD_READ16 0x88 +/** \brief Write data. */ +#define VMK_SCSI_CMD_WRITE16 0x8a +/** \brief Write same 16 */ +#define VMK_SCSI_CMD_WRITE_SAME16 0x93 +/** \brief Read number of logical blocks. */ +#define VMK_SCSI_CMD_READ_CAPACITY16 0x9e +/** \brief Service action out. */ +#define VMK_SCSI_CMD_SERVICE_ACTION_OUT 0x9f +#define VMK_SCSI_CMD_REPORT_LUNS 0xa0 +/** \brief Erase RW media. */ +#define VMK_SCSI_CMD_BLANK 0xa1 +/** \brief Service actions define reports. */ +#define VMK_SCSI_CMD_MAINTENANCE_IN 0xa3 +/** \brief Service actions define changes. */ +#define VMK_SCSI_CMD_MAINTENANCE_OUT 0xa4 +#define VMK_SCSI_CMD_SEND_KEY 0xa3 +/** \brief Report key (SCSI-3). */ +#define VMK_SCSI_CMD_REPORT_KEY 0xa4 +/** \brief Report target port group. */ +#define VMK_SCSI_CMD_RTPGC 0xa3 +/** \brief Set target port group. */ +#define VMK_SCSI_CMD_STPGC 0xa4 +#define VMK_SCSI_CMD_MOVE_MEDIUM 0xa5 +/** \brief Audio playback. */ +#define VMK_SCSI_CMD_PLAY_AUDIO12 0xa5 +#define VMK_SCSI_CMD_EXCHANGE_MEDIUM 0xa6 +#define VMK_SCSI_CMD_LOADCD 0xa6 +/** \brief Read (SCSI-3). */ +#define VMK_SCSI_CMD_READ12 0xa8 +/** \brief Audio playback starting at relative track. */ +#define VMK_SCSI_CMD_PLAY_TRACK_RELATIVE 0xa9 +/** \brief Write data. */ +#define VMK_SCSI_CMD_WRITE12 0xaa +/** \brief Erase logical block. */ +#define VMK_SCSI_CMD_ERASE12 0xac +#define VMK_SCSI_CMD_GET_PERFORMANCE 0xac +/** \brief Read DVD structure (SCSI-3). */ +#define VMK_SCSI_CMD_READ_DVD_STRUCTURE 0xad +/** \brief Write logical block, verify success. */ +#define VMK_SCSI_CMD_WRITE_VERIFY12 0xae +/** \brief Verify data. */ +#define VMK_SCSI_CMD_VERIFY12 0xaf +/** \brief Search data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_HIGH12 0xb0 +/** \brief Search data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_EQUAL12 0xb1 +/** \brief Search data pattern. */ +#define VMK_SCSI_CMD_SEARCH_DATA_LOW12 0xb2 +/** \brief Set block limits. */ +#define VMK_SCSI_CMD_SET_LIMITS12 0xb3 +#define VMK_SCSI_CMD_REQUEST_VOLUME_ELEMENT_ADDR 0xb5 +#define VMK_SCSI_CMD_SEND_VOLUME_TAG 0xb6 +/** \brief For avoiding over/underrun. */ +#define VMK_SCSI_CMD_SET_STREAMING 0xb6 +/** \brief Read defect data information. */ +#define VMK_SCSI_CMD_READ_DEFECT_DATA12 0xb7 +/** \brief Read element status. */ +#define VMK_SCSI_CMD_READ_ELEMENT_STATUS 0xb8 +/** \brief Set data rate. */ +#define VMK_SCSI_CMD_SELECT_CDROM_SPEED 0xb8 +/** \brief Read CD information (all formats, MSF addresses). */ +#define VMK_SCSI_CMD_READ_CD_MSF 0xb9 +/** \brief Fast audio playback. */ +#define VMK_SCSI_CMD_AUDIO_SCAN 0xba +/** \brief (proposed). */ +#define VMK_SCSI_CMD_SET_CDROM_SPEED 0xbb +#define VMK_SCSI_CMD_SEND_CDROM_XA_DATA 0xbc +#define VMK_SCSI_CMD_PLAY_CD 0xbc +#define VMK_SCSI_CMD_MECH_STATUS 0xbd +/** \brief Read CD information (all formats, MSF addresses). */ +#define VMK_SCSI_CMD_READ_CD 0xbe +/** \brief Burning DVDs?. */ +#define VMK_SCSI_CMD_SEND_DVD_STRUCTURE 0xbf +/** + * A workaround for a specific scanner (NIKON LS-2000). + * Can be removed once Linux backend uses 2.4.x interface + */ +#define VMK_SCSI_CMD_VENDOR_NIKON_UNKNOWN 0xe1 + +/* + * See comments for struct vmk_ScsiVmwareInternal16Cmd + */ +#define VMK_SCSI_CMD_VENDOR_SPECIFIC_0xFE 0xfe + +/* + * Sense key values. + */ + +/** \brief There is no sense information. */ +#define VMK_SCSI_SENSE_KEY_NONE 0x0 +/** \brief The last command completed succesfully but used error correction in the process. */ +#define VMK_SCSI_SENSE_KEY_RECOVERED_ERROR 0x1 +/** \brief The addressed LUN is not ready to be accessed. */ +#define VMK_SCSI_SENSE_KEY_NOT_READY 0x2 +/** \brief The target detected a data error on the medium. */ +#define VMK_SCSI_SENSE_KEY_MEDIUM_ERROR 0x3 +/** \brief The target detected a hardware error during a command or self-test. */ +#define VMK_SCSI_SENSE_KEY_HARDWARE_ERROR 0x4 +/** \brief Either the command or the parameter list contains an error. */ +#define VMK_SCSI_SENSE_KEY_ILLEGAL_REQUEST 0x5 +/** \brief The LUN has been reset (bus reset of medium change). */ +#define VMK_SCSI_SENSE_KEY_UNIT_ATTENTION 0x6 +/** \brief Access to the data is blocked. */ +#define VMK_SCSI_SENSE_KEY_DATA_PROTECT 0x7 +/** \brief Reached an unexpected written or unwritten region of the medium. */ +#define VMK_SCSI_SENSE_KEY_BLANK_CHECK 0x8 +/** \brief COPY, COMPARE, or COPY AND VERIFY was aborted. */ +#define VMK_SCSI_SENSE_KEY_COPY_ABORTED 0xa +/** \brief The target aborted the command. */ +#define VMK_SCSI_SENSE_KEY_ABORTED_CMD 0xb +/** \brief Comparison for SEARCH DATA was unsuccessful. */ +#define VMK_SCSI_SENSE_KEY_EQUAL 0xc +/** \brief The medium is full. */ +#define VMK_SCSI_SENSE_KEY_VOLUME_OVERFLOW 0xd +/** \brief Source and data on the medium do not agree. */ +#define VMK_SCSI_SENSE_KEY_MISCOMPARE 0xe + +/* + * The Additional Sense Code - ASC and + * Additional Sense Code Qualifiers - ASCQ + * always come in pairs. + * + * Note: + * These values are found at senseBuffer[12} and senseBuffer[13]. + * You may see references to these in legacy code. New code should make an + * attempt to use the ASC/ASCQ syntax. + */ +/** \brief Logical unit not ready. */ +#define VMK_SCSI_ASC_LU_NOT_READY 0x04 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_CAUSE_NOT_REPORTABLE 0x00 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_UNIT_BECOMING_READY 0x01 +/** \brief Initializing command required. */ +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_INIT_CMD_REQUIRED 0x02 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_MANUAL_INTERVENTION_REQUIRED 0x03 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_FORMAT_IN_PROGRESS 0x04 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_REBUILD_IN_PROGRESS 0x05 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_RECALCULATION_IN_PROGRESS 0x06 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_OPERATION_IN_PROGRESS 0x07 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_LONG_WRITE_IN_PROGRESS 0x08 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_SELF_TEST_IN_PROGRESS 0x09 +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_ASYMMETRIC_ACCESS_STATE_TRANSITION 0x0a +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_TARGET_PORT_IN_STANDBY_STATE 0x0b +#define VMK_SCSI_ASC_LU_NOT_READY_ASCQ_TARGET_PORT_IN_UNAVAILABLE_STATE 0x0c +/** \brief Logical unit doesn't respond to selection. */ +#define VMK_SCSI_ASC_LU_NO_RESPONSE_TO_SELECTION 0x05 +/** \brief Write error. */ +#define VMK_SCSI_ASC_WRITE_ERROR 0x0c +/** \brief Unrecovered read error. */ +#define VMK_SCSI_ASC_UNRECOVERED_READ_ERROR 0x11 +/** \brief Parameter list length error. */ +#define VMK_SCSI_ASC_PARAM_LIST_LENGTH_ERROR 0x1a +/** \brief Invalid command operation code. */ +#define VMK_SCSI_ASC_INVALID_COMMAND_OPERATION 0x20 +#define VMK_SCSI_ASC_INVALID_FIELD_IN_CDB 0x24 +/** \brief LU has been removed. */ +#define VMK_SCSI_ASC_LU_NOT_SUPPORTED 0x25 +#define VMK_SCSI_ASC_INVALID_FIELD_IN_PARAMETER_LIST 0x26 +/** \brief Device is write protected. */ +#define VMK_SCSI_ASC_WRITE_PROTECTED 0x27 +/** \brief After changing medium. */ +#define VMK_SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED 0x28 +/** \brief Device power-on or SCSI reset. */ +#define VMK_SCSI_ASC_POWER_ON_OR_RESET 0x29 +#define VMK_SCSI_ASC_COMMANDS_CLEARED 0x2F +#define VMK_SCSI_ASC_PARAMS_CHANGED 0x2a +#define VMK_SCSI_ASC_PARAMS_CHANGED_ASCQ_RESERVATIONS_RELEASED 0x04 +#define VMK_SCSI_ASC_PARAMS_CHANGED_ASCQ_ASYMMETRIC_ACCESS_STATE_CHANGED 0x06 +/** \brief Saving parameters not supported. */ +#define VMK_SCSI_ASC_SAVING_PARAMS_NOT_SUPPORTED 0x39 +/** \brief Changing medium. */ +#define VMK_SCSI_ASC_MEDIUM_NOT_PRESENT 0x3a +/** \brief An ascq. */ +#define VMK_SCSI_ASC_MEDIUM_NOT_PRESENT_ASCQ_TRAY_OPEN 0x02 +/** \brief Something changed in LU or Target. */ +#define VMK_SCSI_ASC_CHANGED 0x3f +/** \brief Internal target failure. */ +#define VMK_SCSI_ASC_INTERNAL_TARGET_FAILURE 0x44 +/** \brief Internal target failure. */ +#define VMK_SCSI_ASCQ_INTERNAL_TARGET_FAILURE_ASCQ0 0x00 +/** \brief An ascq: REPORTED LUNS DATA HAS CHANGED. */ +#define VMK_SCSI_ASC_CHANGED_ASCQ_REPORTED_LUNS_DATA_CHANGED 0x0e +/** \brief During persistent reservations. */ +#define VMK_SCSI_ASC_INSUFFICIENT_REGISTRATION_RESOURCES 0x55 + +/* + * Inquiry data. + */ + +/* \brief Standard INQUIRY data layout. */ +#define VMK_SCSI_INQUIRY_DATA_LEN 255 + +/** \brief Byte offset of vendor name in SCSI inquiry. */ +#define VMK_SCSI_INQUIRY_VENDOR_OFFSET 8 +/** \brief Length of vendor name in SCSI inquiry (w/o terminating NUL). */ +#define VMK_SCSI_INQUIRY_VENDOR_LENGTH 8 +/** \brief Byte offset of model name in SCSI inquiry. */ +#define VMK_SCSI_INQUIRY_MODEL_OFFSET 16 + /** \brief Length of model name in SCSI inquiry (w/o terminating NUL). */ +#define VMK_SCSI_INQUIRY_MODEL_LENGTH 16 +/** \brief Byte off of revision string in SCSI inquiry. */ +#define VMK_SCSI_INQUIRY_REVISION_OFFSET 32 +/** \brief Length of revision string in SCSI inquiry (w/o terminating NUL). */ +#define VMK_SCSI_INQUIRY_REVISION_LENGTH 4 + +#define VMK_SCSI_PAGE0_INQUIRY_DATA_LEN 255 +#define VMK_SCSI_PAGE80_INQUIRY_DATA_LEN 255 + +/* Inquiry page 0x83: Identifier Type. */ +#define VMK_SCSI_IDENTIFIERTYPE_VENDOR_SPEC 0x0 +#define VMK_SCSI_IDENTIFIERTYPE_T10 0x1 +#define VMK_SCSI_IDENTIFIERTYPE_EUI 0x2 +#define VMK_SCSI_IDENTIFIERTYPE_NAA 0x3 +#define VMK_SCSI_IDENTIFIERTYPE_RTPI 0x4 +#define VMK_SCSI_IDENTIFIERTYPE_TPG 0x5 +#define VMK_SCSI_IDENTIFIERTYPE_LUG 0x6 +#define VMK_SCSI_IDENTIFIERTYPE_MD5 0x7 +#define VMK_SCSI_IDENTIFIERTYPE_SNS 0x8 +#define VMK_SCSI_IDENTIFIERTYPE_RESERVED 0x9 +#define VMK_SCSI_IDENTIFIERTYPE_MAX VMK_SCSI_IDENTIFIERTYPE_RESERVED + +/* Inquiry page 0x83: UUID Entity. */ +#define VMK_SCSI_ASSOCIATION_LUN 0x0 +#define VMK_SCSI_ASSOCIATION_TARGET_PORT 0x1 +#define VMK_SCSI_ASSOCIATION_TARGET_DEVICE 0x2 +#define VMK_SCSI_ASSOCIATION_RESERVED 0x3 + +/* Persistent Reserve Out Service Actions. */ +#define VMK_SCSI_REGISTER 0x0 +#define VMK_SCSI_PRESERVE 0x1 +#define VMK_SCSI_PRELEASE 0x2 +#define VMK_SCSI_CLEAR 0x3 +#define VMK_SCSI_PREEMPT 0x4 +#define VMK_SCSI_PREEMPT_AND_ABORT 0x5 +#define VMK_SCSI_REGISTER_AND_IGNORE_EXISTING_KEY 0x6 +#define VMK_SCSI_REGISTER_AND_MOVE 0x7 + +/* Persistent Reservation Type Codes. */ +#define VMK_SCSI_WRITE_EXCL 0x1 +#define VMK_SCSI_EXCL_ACCESS 0x3 +#define VMK_SCSI_WRITE_EXCL_REG_ONLY 0x5 +#define VMK_SCSI_EXCL_ACCESS_REG_ONLY 0x6 +#define VMK_SCSI_WRITE_EXCL_ALL_REG 0x7 +#define VMK_SCSI_EXCL_ACCESS_ALL_REG 0x8 + +/* Persistent Reservation In Service Actions. */ +#define VMK_SCSI_READ_KEYS 0x0 +#define VMK_SCSI_READ_RESERVATION 0x1 +#define VMK_SCSI_REPORT_CAPABILITIES 0x2 +#define VMK_SCSI_READ_FULL_STATUS 0x3 + +#endif /*_VMKAPI_SCSI_CONST_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_device.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_device.h new file mode 100644 index 0000000..e3f2ba6 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_device.h @@ -0,0 +1,48 @@ +/*************************************************************************** + * Copyright 2008 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * vmkapi_scsi_device.h -- + * + * SCSI device related API. + * + */ +#ifndef _VMKAPI_SCSI_DEVICE_H_ +#define _VMKAPI_SCSI_DEVICE_H_ + +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif + +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" + +struct vmk_ScsiDevice; + +/* + *********************************************************************** + * vmk_ScsiDeviceGetIdFromPage83 -- */ /** + * + * \ingroup SCSI + * \brief Return upto 'idLength' bytes of the requested device uid + type/association caller-provided buffer 'id'. + * + * \retval VMK_OK Requested id was found and returned in 'uid'. + * \retval Other An error occured. + * + *********************************************************************** + */ +VMK_ReturnStatus +vmk_ScsiDeviceGetIdFromPage83( + struct vmk_ScsiDevice *vmkDevice, + vmk_uint8 idType, + vmk_uint8 assoc, + vmk_uint32 idLength, + vmk_uint8 *id); + +#endif //_VMKAPI_SCSI_DEVICE_H_ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_ext.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_ext.h new file mode 100644 index 0000000..0a3f772 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_ext.h @@ -0,0 +1,383 @@ +/* ********************************************************** + * Copyright 2007 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + + +/* + *********************************************************************** + * SCSI Externally Exported Interfaces */ /** + * \addtogroup SCSI + * @{ + * + * \defgroup SCSIext SCSI Interfaces Exported to User Mode + * + * Vmkernel-specific SCSI constants & types which are shared with + * user-mode code. + * @{ + * + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_EXT_H_ +#define _VMKAPI_SCSI_EXT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" + +/** + * \brief Length of the device class description, + * including the trailing NUL character. + */ +#define VMK_SCSI_CLASS_MAX_LEN 18 + +/** \cond nodoc */ +#define VMK_SCSI_DEVICE_CLASSES \ + VMK_SCSI_DEVICE_CLASS_NUM(VMK_SCSI_CLASS_DISK, 0, "Direct-Access ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_TAPE, "Sequential-Access") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_PRINTER, "Printer ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_CPU, "Processor ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_WORM, "WORM ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_CDROM, "CD-ROM ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_SCANNER, "Scanner ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_OPTICAL, "Optical Device ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_MEDIA, "Medium Changer ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_COM, "Communications ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_ASCA, "ASC IT8 0xA ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_ASCB, "ASC IT8 0xB ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RAID, "RAID Ctlr ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_ENCLOSURE, "Enclosure Svc Dev") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_SIMPLE_DISK, "Simple disk ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV1, "Reserved 0xF ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV2, "Reserved 0x10 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV3, "Reserved 0x11 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV4, "Reserved 0x12 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV5, "Reserved 0x13 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV6, "Reserved 0x14 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV7, "Reserved 0x15 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV8, "Reserved 0x16 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV9, "Reserved 0x17 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV10, "Reserved 0x18 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV11, "Reserved 0x19 ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV12, "Reserved 0x1A ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV13, "Reserved 0x1B ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV14, "Reserved 0x1C ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV15, "Reserved 0x1D ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_RESV16, "Reserved 0x1E ") \ + VMK_SCSI_DEVICE_CLASS(VMK_SCSI_CLASS_UNKNOWN, "No device type ") \ + +#define VMK_SCSI_DEVICE_CLASS(name, description) \ + /** \brief description */ name, +#define VMK_SCSI_DEVICE_CLASS_NUM(name, value, description) \ + /** \brief description */ name = value, +/** \endcond */ + +/** + * \brief SCSI device classes. + */ +typedef enum { + VMK_SCSI_DEVICE_CLASSES + VMK_SCSI_DEVICE_CLASS_LAST +} vmk_ScsiDeviceClass; + +/** \cond nodoc */ +#undef VMK_SCSI_DEVICE_CLASS +#undef VMK_SCSI_DEVICE_CLASS_NUM +/** \endcond */ + +/** \cond nodoc */ +#define VMK_SCSI_DEVICE_STATES \ + VMK_SCSI_DEVICE_STATE_NUM(VMK_SCSI_DEVICE_STATE_ON, 0, "on", \ + "The device is operational.") \ + VMK_SCSI_DEVICE_STATE(VMK_SCSI_DEVICE_STATE_OFF, "off", \ + "The device has been disabled by user intervention.") \ + VMK_SCSI_DEVICE_STATE(VMK_SCSI_DEVICE_STATE_APD, "APD", \ + "There are no paths to the device.") \ + VMK_SCSI_DEVICE_STATE(VMK_SCSI_DEVICE_STATE_QUIESCED, "quiesced", \ + "The device is not accepting I/Os temporarily.") \ + +#define VMK_SCSI_DEVICE_STATE(name,description,longDesc) \ + /** \brief longDesc */ name, +#define VMK_SCSI_DEVICE_STATE_NUM(name,value,description,longDesc) \ + /** \brief longDesc */ name = value, +/** \endcond */ + +/** + * \brief SCSI device states. + */ +typedef enum { + VMK_SCSI_DEVICE_STATES + VMK_SCSI_DEVICE_STATE_LAST +} vmk_ScsiDeviceState; + +#define VMK_SCSI_DEVICE_STATE_DEAD VMK_SCSI_DEVICE_STATE_APD + +/** \cond nodoc */ +#undef VMK_SCSI_DEVICE_STATE +#undef VMK_SCSI_DEVICE_STATE_NUM +/** \endcond */ + +/* + * Paths + */ + +/** + * \brief Maximum SCSI path name length. + * + * Path names are of the form ":C%u:T%u:L%u"; + * Their length is limited by SCSI_DISK_ID_LEN (44) because, absent + * a better ID, the pathname may be used as ID on-disk. This leaves + * 11 bytes beyond VMK_SCSI_ADAPTER_NAME_LENGTH (32), which is enough + * for "...:Cn:Tnn:Lnn" or "...:Cn:Tn:Ln nn". + */ +#define VMK_SCSI_PATH_NAME_MAX_LEN 44 + +/** \cond nodoc */ +#define VMK_SCSI_PATHSTATES \ + VMK_SCSI_PATH_STATE_NUM(VMK_SCSI_PATH_STATE_ON, 0, "on") \ + VMK_SCSI_PATH_STATE(VMK_SCSI_PATH_STATE_OFF, "off") \ + VMK_SCSI_PATH_STATE(VMK_SCSI_PATH_STATE_DEAD, "dead") \ + VMK_SCSI_PATH_STATE(VMK_SCSI_PATH_STATE_STANDBY, "standby") \ + VMK_SCSI_PATH_STATE(VMK_SCSI_PATH_STATE_DEVICE_CHANGED, "device_changed") \ + +#define VMK_SCSI_PATH_STATE(name,description) \ + /** \brief description */ name, +#define VMK_SCSI_PATH_STATE_NUM(name,value,description) \ + /** \brief description */ name = value, + +/** \endcond */ + +/** + * \brief State of a SCSI path. + */ +typedef enum { + VMK_SCSI_PATHSTATES + VMK_SCSI_PATH_STATE_LAST +} vmk_ScsiPathState; + +/** \cond nodoc */ +#undef VMK_SCSI_PATH_STATE +#undef VMK_SCSI_PATH_STATE_NUM +/** \endcond */ + +/* + * Commands + */ + +#define VMK_SCSI_MAX_CDB_LEN 16 +#define VMK_SCSI_MAX_SENSE_DATA_LEN 64 + +typedef enum { + VMK_SCSI_COMMAND_DIRECTION_UNKNOWN, + VMK_SCSI_COMMAND_DIRECTION_WRITE, + VMK_SCSI_COMMAND_DIRECTION_READ, + VMK_SCSI_COMMAND_DIRECTION_NONE, +} vmk_ScsiCommandDirection; + +/** + * \brief Adapter specific status for a SCSI command. + * \note The vmk_ScsiHostStatus is a status value from the driver/hba. Most errors here + * mean that the I/O was not issued to the target. + */ +typedef enum { + /** \brief No error. */ + VMK_SCSI_HOST_OK = 0x00, + /** \brief The HBA could not reach the target. */ + VMK_SCSI_HOST_NO_CONNECT = 0x01, + /** \brief The SCSI BUS was busy. + * \note This error is most relevant for parallel SCSI devices because SCSI uses a bus + * arbitration mechanism for multiple initiators. Newer transport + * protocols are packetized and use switches, so this error does not occur. However, + * some drivers will return this in other unrelated error cases - if a + * connection is temporarily lost for instance. + */ + VMK_SCSI_HOST_BUS_BUSY = 0x02, + /** \brief Driver was unable to issue the command to the device. */ + VMK_SCSI_HOST_TIMEOUT = 0x03, + /** \brief Driver receives an I/O for the target ID of the initiator (HBA). + * \note Some drivers return this error when they + * really mean NO_CONNECT. Note that ESX should never cause a driver to return this + * error if the driver has reported it's initiator ID correctly. + */ + VMK_SCSI_HOST_BAD_TARGET = 0x04, + /** \brief The I/O was successfully aborted. */ + VMK_SCSI_HOST_ABORT = 0x05, + /** \brief A parity error was detected. + * \note This error is most relevant to parallel SCSI devices where the BUS uses + * a simple parity bit to check that transfers are not corrupted (it can detect + * only 1, 3, 5 and 7 bit errors). + */ + VMK_SCSI_HOST_PARITY = 0x06, + /** \brief Generic error. + * \note This is an error that the driver can return for + * events not covered by other errors. For instance, drivers will return this + * error in the event of a data overrun/underrun. + */ + VMK_SCSI_HOST_ERROR = 0x07, + /** \brief Device was reset. + * \note This error Indicates that the I/O was cleared from the HBA due to + * a BUS/target/LUN reset. + */ + VMK_SCSI_HOST_RESET = 0x08, + /** \brief Legacy error. + * \note This error is not expected to be returned and should be + * treated as a VMK_SCSI_HOST_ERROR. + */ + VMK_SCSI_HOST_BAD_INTR = 0x09, + /** \brief Legacy error. + * \note This error should nolonger be returned. + */ + VMK_SCSI_HOST_PASSTHROUGH = 0x0a, + /** \brief Retriable error + * \note Drivers use this to return an I/O that has failed due to temporary + * conditions and should be retried. + */ + VMK_SCSI_HOST_SOFT_ERROR = 0x0b, + /** \brief Legacy error. + * \note This error is not expected to be returned. + * I/O cmd should be reissued immediately. + */ + VMK_SCSI_HOST_RETRY = 0x0c, + /** \brief A transient error has occured. + * \note This error indicates that the I/O cmd should be + * queued and reissued later. + */ + VMK_SCSI_HOST_REQUEUE = 0x0d, + VMK_SCSI_HOST_MAX_ERRORS, /* Add all error codes before this. */ +} vmk_ScsiHostStatus; + +/** + * \brief Device specific status for a SCSI command. + * \note The vmk_ScsiDeviceStatus is the status reported by the target/LUN itself. The + * values are defined in the SCSI specification. + */ +typedef enum { + VMK_SCSI_DEVICE_GOOD = 0x00, + VMK_SCSI_DEVICE_CHECK_CONDITION = 0x02, + VMK_SCSI_DEVICE_CONDITION_MET = 0x04, + VMK_SCSI_DEVICE_BUSY = 0x08, + VMK_SCSI_DEVICE_INTERMEDIATE = 0x10, + VMK_SCSI_DEVICE_INTERMEDIATE_CONDITION_MET = 0x14, + VMK_SCSI_DEVICE_RESERVATION_CONFLICT = 0x18, + VMK_SCSI_DEVICE_COMMAND_TERMINATED = 0x22, + VMK_SCSI_DEVICE_QUEUE_FULL = 0x28, + VMK_SCSI_DEVICE_ACA_ACTIVE = 0x30, + VMK_SCSI_DEVICE_TASK_ABORTED = 0x40, +} vmk_ScsiDeviceStatus; + +/** + * \brief Plugin specific status for a SCSI command. + * \note The vmk_ScsiPluginStatus is a status value returned from the MP plugin that was + * processing the I/O cmd. If an error is returned it means that the command could + * not be issued or needs to be retried etc. + */ +typedef enum vmk_ScsiPluginStatus { + /** \brief No error. */ + VMK_SCSI_PLUGIN_GOOD, + /** \brief An unspecified error occurred. + * \note The I/O cmd should be retried. + */ + VMK_SCSI_PLUGIN_TRANSIENT, + /** \brief The device is a deactivated snapshot. + * \note The I/O cmd failed because the device is a deactivated snapshot and so + * the LUN is read-only. + */ + VMK_SCSI_PLUGIN_SNAPSHOT, + /** \brief SCSI-2 reservation was lost. */ + VMK_SCSI_PLUGIN_RESERVATION_LOST, + /** + * \brief Allocating more thin provision space. + * \note Device server is in the process of allocating more + * space in the backing pool for a thin provisioned LUN. + */ + VMK_SCSI_PLUGIN_THINPROV_BUSY_GROWING, + /** \brief Thin provisioning soft-limit exceeded. */ + VMK_SCSI_PLUGIN_THINPROV_ATQUOTA, + /** \brief Backing pool for thin provisioned LUN is out of space. */ + VMK_SCSI_PLUGIN_THINPROV_NOSPACE, + /** + * \brief The test and set data in the ATS request returned false for + * equality. + */ + VMK_SCSI_PLUGIN_ATS_MISCOMPARE, + /** \brief The plugin wants to requeue the IO back + * \note The IO will be retried. + */ + VMK_SCSI_PLUGIN_REQUEUE, +} vmk_ScsiPluginStatus; + +/** + * \brief Status a for SCSI command. + * \note The completion status for an I/O is a three-level hierarchy of + * vmk_scsiPluginStatus, vmk_ScsiHostStatus, and vmk_ScsiDeviceStatus. + * - vmk_scsiPluginStatus is the highest level + * - vmk_scsiHostAtatus is the next level + * - vmk_scsiDeviceStatus is the lowest level + * + * An error reported at one level should not be considered valid if there is an + * error reported by a higher level of the hierarchy. For instance, if + * vmk_ScsiPluginStatus does not indicate an error and an error is indicated in + * vmk_ScsiHostStatus, then the value of vmk_ScsiDeviceStatus is ignored. + */ +typedef struct vmk_ScsiCmdStatus { + /** \brief Device specific command status. + * \note This is the lowest level error. + */ + vmk_ScsiDeviceStatus device; + /** \brief Adapter specific command status. */ + vmk_ScsiHostStatus host; + /** \brief Plugin specific command status. + * \note This is the highest level error. + */ + vmk_ScsiPluginStatus plugin; +} vmk_ScsiCmdStatus; + +/* \cond nodoc */ +#define VMK_SCSI_TASK_MGMT_TYPES(def) \ + def(VMK_SCSI_TASKMGMT_ABORT, "abort", "Abort single command.") \ + def(VMK_SCSI_TASKMGMT_VIRT_RESET, "virt reset", \ + "Abort all commands sharing a unique originator ID" ) \ + def(VMK_SCSI_TASKMGMT_LUN_RESET, "lun reset", "Reset a LUN.") \ + def(VMK_SCSI_TASKMGMT_DEVICE_RESET, "target reset", "Reset a target.") \ + def(VMK_SCSI_TASKMGMT_BUS_RESET, "bus reset", "Reset the bus.") \ + +#define VMK_SCSI_DEF_TASK_MGMT_NAME(name, desc, longDesc) name, +#define VMK_SCSI_DEF_TASK_MGMT_DESC(name, desc, longDesc) desc, +#define VMK_SCSI_DEF_TASK_MGMT_NAME_WITH_COMMENT(name, desc, longDesc) \ + /** \brief longDesc */ name, +/* \endcond */ + +/** + * \brief Task management types. + */ +typedef enum { + VMK_SCSI_TASK_MGMT_TYPES(VMK_SCSI_DEF_TASK_MGMT_NAME_WITH_COMMENT) + VMK_SCSI_TASKMGMT_LAST +} vmk_ScsiTaskMgmtType; + +typedef struct vmk_ScsiIOCmdCountFields { + vmk_uint32 rdCmds; + vmk_uint32 wrCmds; + vmk_uint32 otherCmds; + vmk_uint32 totalCmds; +} vmk_ScsiIOCmdCountFields; + +/** + * \brief I/O Stats for Path and Adapter + */ +typedef struct vmk_ScsiIOCmdCounts { + vmk_ScsiIOCmdCountFields active; + vmk_ScsiIOCmdCountFields queued; +} vmk_ScsiIOCmdCounts; + +#endif /* _VMKAPI_SCSI_EXT_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_incompat.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_incompat.h new file mode 100644 index 0000000..7362d5c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_incompat.h @@ -0,0 +1,125 @@ +/*************************************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SCSI binary incompatible interfaces */ /** + * \addtogroup SCSI + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_INCOMPAT_H_ +#define _VMKAPI_SCSI_INCOMPAT_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" +#include "mpp/vmkapi_mpp_types.h" + +/* + *********************************************************************** + * vmk_ScsiScanDeleteAdapterPaths -- */ /** + * + * \ingroup SCSI + * + * \brief Delete all dead physical paths originating from the adapter. + * + * The paths that are missing are automatically unregistered from the + * storage stack. If any paths are left, the adapter can not be + * removed. + * + * The sparse luns, max lun id and lun mask settings affect which + * paths on this adapter are actually scanned. + * + * \note If this routine returns an error, some paths may have been + * sucessfully deleted. + * \note This function may block. + * + * \param[in] vmkAdapter Pointer to the adapter to remove + * all dead paths + * + * \retval VMK_BUSY The requested adapter is currently being + * scanned by some other context. + * + *********************************************************************** + */ +VMK_ReturnStatus vmk_ScsiScanDeleteAdapterPaths( + vmk_ScsiAdapter *vmkAdapter); + +/** + *********************************************************************** + * */ /** + * \brief PSA Filter plugin vmk_ScsiPlugin specific data & operations. + * + * vmk_ScsiPlugin data for plugin type VMK_SCSI_PLUGIN_TYPE_FILTER. + * + *********************************************************************** + */ +typedef struct vmk_ScsiFilterPluginSpecific { + /** + * \brief Filter priority + * + */ + vmk_ScsiPluginPriority priority; + + /** + * \brief Offer a device to the plugin for claiming + * + * Give the plugin a chance to claim a device. The plugin is the + * owner of the device for the duration of the call; To retain + * ownership of the device beyond that call, the plugin must return + * VMK_OK. + * + * If it decides not to claim the device, the plugin must drain all + * the IOs it has issued to the device and return a failure code. + * + * \param[in] device Scsi device to claim + * \param[out] filterPrivateData filter's private data + * associated with the claimed device. This data will be + * passed in ->notify(), ->ioctl() and ->unclaim() calls + */ + VMK_ReturnStatus (*claim)(vmk_ScsiDevice *device, void **filterPrivateData); + /** + * \brief Tell the plugin to unclaim a device + * + * Tell the plugin to unclaim the specified device. + * The plugin can perform blocking tasks before returning. + */ + void (*unclaim)(void *filterPrivateData); + /** + * \brief Notify the plugin of an issued I/O + * + * Tells the plugin about an issued I/O and allows it to provide a + * replacement I/O. + */ + VMK_ReturnStatus (*notify)(void *filterPrivateData, + vmk_ScsiCommand *vmkCmd, + vmk_ScsiCommand **replacement); + + /** + * \brief Issue a device ioctl request + * + */ + VMK_ReturnStatus (*ioctl)(void *filterPrivateData, + vmk_ScsiPluginIoctl cmd, + vmk_ScsiPluginIoctlData *data); +} vmk_ScsiFilterPluginSpecific; + +VMK_ASSERT_LIST(FILTER, + VMK_ASSERT_ON_COMPILE(sizeof(vmk_ScsiFilterPluginSpecific) <= + sizeof(((vmk_ScsiPlugin*)(0))->u)); +) +#endif /* _VMKAPI_SCSI_INCOMPAT_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_mgmt_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_mgmt_types.h new file mode 100644 index 0000000..f37ea6c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_mgmt_types.h @@ -0,0 +1,419 @@ +/*************************************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SCSI Device management types and constants */ /** + * \addtogroup SCSI + * @{ + * + * \defgroup SCSImgmt SCSI Device Management Interfaces + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_MGMT_TYPES_H_ +#define _VMKAPI_SCSI_MGMT_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" + +#define VMKDRIVER_DEV_NAME_LENGTH 64 +#define VMK_MAX_IP_STRING_LENGTH 64 +#define VMK_MAX_PORT_STRING_LENGTH 16 +#define VMK_MAX_ISCSI_IQN_LENGTH 224 +#define VMK_MAX_ISCSI_ISID_STRING_LENGTH 13 +#define VMK_MAX_ISCSI_TPGT_STRING_LENGTH 16 +#define VMK_MAX_ETHERNET_MAC_LENGTH 6 +#define VMK_MAX_ISCSI_PARAM_LENGTH 256 +#define VMK_MAX_ISCSI_UID_LENGTH 256 + +/* Session related Parameters */ +#define VMK_ISCSI_ADAPTER_IQN 0x00000001 +#define VMK_ISCSI_PARAM_DATAPDU_ORDER 0x00000002 +#define VMK_ISCSI_PARAM_DATASEQ_ORDER 0x00000004 +#define VMK_ISCSI_PARAM_R2T 0x00000008 +#define VMK_ISCSI_PARAM_IMMDATA 0x00000010 +#define VMK_ISCSI_PARAM_ERL 0x00000020 +#define VMK_ISCSI_PARAM_TIME2WAIT 0x00000040 +#define VMK_ISCSI_PARAM_TIME2RETAIN 0x00000080 +#define VMK_ISCSI_PARAM_MAXCONNECTIONS 0x00000100 +#define VMK_ISCSI_PARAM_MAXR2T 0x00000200 +#define VMK_ISCSI_PARAM_FBL 0x00000400 +#define VMK_ISCSI_PARAM_MBL 0x00000800 +#define VMK_ISCSI_PARAM_HDRDIGEST 0x00001000 +#define VMK_ISCSI_PARAM_DATADIGEST 0x00002000 +#define VMK_ISCSI_PARAM_RCVDATASEGMENT 0x00004000 +#define VMK_ISCSI_PARAM_ICHAPNAME 0x00008000 +#define VMK_ISCSI_PARAM_TCHAPNAME 0x00010000 +#define VMK_ISCSI_PARAM_ICHAPSECRET 0x00020000 +#define VMK_ISCSI_PARAM_TCHAPSECRET 0x00040000 +#define VMK_ISCSI_PARAM_ISID 0x00080000 + +/* Target Information */ +#define VMK_ISCSI_IQN_TARGET_NAME 0x00100000 +#define VMK_ISCSI_TARGET_IP 0x00200000 +#define VMK_ISCSI_TARGET_PORT 0x00400000 +#define VMK_ISCSI_TARGET_TPGT 0x00800000 + +/* Adapter TCP/IP Properties */ +#define VMK_ISCSI_ADAPTER_IP 0x01000000 +#define VMK_ISCSI_ADAPTER_SUBNET 0x02000000 +#define VMK_ISCSI_ADAPTER_GATEWAY 0x04000000 +#define VMK_ISCSI_ADAPTER_PRIMARY_DNS 0x08000000 +#define VMK_ISCSI_ADAPTER_SECONDARY_DNS 0x10000000 + +/* iscsi_trans max channels, target mask 0-15: channel, 16-31: target */ +#define ISCSI_MAX_CHANNEL_TARGET_MASK 0x0000FFFF + +/* max iscsi parm string length */ +#define ISCSI_MAX_PARM_STRING_LENGTH 4096 + +/* iscsi parm types */ +typedef enum vmk_IscsiParmType { + VMK_ISCSI_SESSION_PARM, + VMK_ISCSI_CONN_PARM, +} vmk_IscsiParmType; + +/* FC Port State */ +typedef enum vmk_FcPortState { + VMK_FC_PORTSTATE_UNKNOWN = 0x0, + VMK_FC_PORTSTATE_NOTPRESENT, + VMK_FC_PORTSTATE_ONLINE, + VMK_FC_PORTSTATE_OFFLINE, + VMK_FC_PORTSTATE_BLOCKED, + VMK_FC_PORTSTATE_BYPASSED, + VMK_FC_PORTSTATE_DIAGNOSTICS, + VMK_FC_PORTSTATE_LINKDOWN, + VMK_FC_PORTSTATE_ERROR, + VMK_FC_PORTSTATE_LOOPBACK, + VMK_FC_PORTSTATE_DELETED, +} vmk_FcPortState; + +/* FC Port Speed */ +typedef enum vmk_FcLinkSpeed { + VMK_FC_SPEED_UNKNOWN = 0x0, + VMK_FC_SPEED_1GBIT, + VMK_FC_SPEED_2GBIT, + VMK_FC_SPEED_4GBIT, + VMK_FC_SPEED_8GBIT, + VMK_FC_SPEED_10GBIT, + VMK_FC_SPEED_16GBIT, +} vmk_FcLinkSpeed; + +/* FC Port TYPE */ +typedef enum vmk_FcPortType { + VMK_FC_PORTTYPE_UNKNOWN = 0x0, + VMK_FC_PORTTYPE_OTHER, + VMK_FC_PORTTYPE_NOTPRESENT, + VMK_FC_PORTTYPE_NPORT, + VMK_FC_PORTTYPE_NLPORT, + VMK_FC_PORTTYPE_LPORT, + VMK_FC_PORTTYPE_PTP, + VMK_FC_PORTTYPE_NPIV, + VMK_FC_PORTTYPE_VNPORT, +} vmk_FcPortType; + +/* Adapter Status */ +typedef enum vmk_AdapterStatus { + VMK_ADAPTER_STATUS_UNKNOWN = 0x0, + VMK_ADAPTER_STATUS_ONLINE, + VMK_ADAPTER_STATUS_OFFLINE, +} vmk_AdapterStatus; + +/* Link Rescan Status */ +typedef enum vmk_RescanLinkStatus { + VMK_RESCAN_LINK_UNSUPPORTED = 0x0, + VMK_RESCAN_LINK_SUCCEEDED, + VMK_RESCAN_LINK_FAILED, +} vmk_RescanLinkStatus; + +/** + * \brief fc target attributes + */ +typedef struct vmk_FcTargetAttrs { + /** \brief target node WWN */ + vmk_uint64 nodeName; + /** \brief target port WWN */ + vmk_uint64 portName; + /** \brief target port id */ + vmk_uint32 portId; +} vmk_FcTargetAttrs; + +/** + * \brief fc adapter + */ +typedef struct vmk_FcAdapter +{ + /** \brief Get FC Node Name */ + vmk_uint64 (*getFcNodeName) ( + void *clientData); + /** \brief Get FC Port Name */ + vmk_uint64 (*getFcPortName) ( + void *clientData); + /** \brief Get FC Port Id */ + vmk_uint32 (*getFcPortId) ( + void *clientData); + /** \brief Get FC Link Speed */ + vmk_FcLinkSpeed (*getFcLinkSpeed) ( + void *clientData); + /** \brief Get FC Port Type */ + vmk_FcPortType (*getFcPortType) ( + void *clientData); + /** \brief Get FC Port State */ + vmk_FcPortState (*getFcPortState) ( + void *clientData); + /** \brief Get FC Target Attributes */ + VMK_ReturnStatus (*getFcTargetAttributes) ( + void *pSCSI_Adapter, vmk_FcTargetAttrs *fcAttrib, + vmk_uint32 channelNo, vmk_uint32 targetNo); + /** \brief Get FC Adapter Status */ + vmk_AdapterStatus (*getFcAdapterStatus) ( + void *clientData); + /** \brief rescan FC Link Status */ + vmk_RescanLinkStatus (*rescanFcLink) ( + void *clientData); + + /** + * \brief link timeout + * This is the user provided Link Time out value. + * If this is not set, default timeout set by + * the underlying layer(driver layer/driver) is used + */ + vmk_uint64 linkTimeout; + + /** + * \brief i/o timeout + * This is the user provided I/O Time out value. + * If this is not set, default timeout set by + * the underlying layer(driver layer/driver) is used + */ + vmk_uint64 ioTimeout; + /** \brief reserved */ + vmk_uint32 reserved1[4]; + /** \brief reserved */ + vmk_VirtAddr reserved2[4]; +} vmk_FcAdapter; + +/** + * \brief FIP mode used for FCoE discovery + */ +typedef enum vmk_FIPType { + VMK_FIP_TYPE_UNKNOWN = 0x0, + VMK_FIP_TYPE_FPMA, + VMK_FIP_TYPE_SPMA, +} vmk_FIPType; + +/** + * \brief FCoE Adapter attributes + */ +typedef struct vmk_FcoeAdapterAttrs { + /** \brief FCoE Controller MAC Address */ + vmk_uint8 fcoeContlrMacAddr[VMK_MAX_ETHERNET_MAC_LENGTH]; + /** \brief FCF MAC Address */ + vmk_uint8 fcfMacAddr[VMK_MAX_ETHERNET_MAC_LENGTH]; + /** \brief VN Port MAC Address*/ + vmk_uint8 vnPortMacAddr[VMK_MAX_ETHERNET_MAC_LENGTH]; + /** \brief FIP Type */ + vmk_FIPType fip; + /** \brief VLAN ID */ + vmk_uint16 vlanId; + /** \brief Bandwidth Percentage */ + vmk_uint16 bwPercentage; + /** \brief FCoE MTU */ + vmk_uint32 frameSize; + /** \brief Underlying vmnic Name in case of CNA */ + char vmnicName[VMK_DEVICE_NAME_MAX_LENGTH]; +} vmk_FcoeAdapterAttrs; + +/** + * \brief fcoe adapter + */ +typedef struct vmk_FcoeAdapter +{ + /** \brief Get FCoE adapter Details */ + VMK_ReturnStatus (*getFCoEAdapterAttributes) ( + void *clientData, vmk_FcoeAdapterAttrs *fcoeAttrs); + + /** \brief Get FC Details */ + vmk_FcAdapter fc; + + /** \brief reserved */ + vmk_uint32 reserved1[4]; + /** \brief reserved */ + vmk_VirtAddr reserved2[4]; +} vmk_FcoeAdapter; + +/** + * \brief SAS target attributes + */ +typedef struct vmk_SasTargetAttrs { + /** \brief SAS address */ + vmk_uint64 sasAddress; +} vmk_SasTargetAttrs; + +/** + * \brief SAS adapter + */ +typedef struct vmk_SasAdapter +{ + /** \brief get the adapter's SAS address */ + vmk_uint64 (*getInitiatorSasAddress) ( + void *clientData); + /** \brief get the target's attributes */ + VMK_ReturnStatus (*getSasTargetAttributes) ( + void *pSCSI_Adapter, vmk_SasTargetAttrs *sasAttrib, + vmk_uint32 channelNo, vmk_uint32 targetNo); + /** \brief reserved */ + vmk_uint32 reserved1[4]; + /** \brief reserved */ + vmk_VirtAddr reserved2[4]; +} vmk_SasAdapter; + +/** + * \brief Block adapter + */ +typedef struct vmk_BlockAdapter { + /** \brief device name */ + char devName[VMKDRIVER_DEV_NAME_LENGTH]; + /** \brief controller instance number */ + vmk_uint32 controllerInstance; + /** \brief reserved */ + vmk_uint32 reserved1[4]; + /** \brief reserved */ + vmk_VirtAddr reserved2[4]; +} vmk_BlockAdapter; + +/** + * \brief Identifier for generic SAN initiator/target + */ +typedef struct vmk_XsanID { + /** \brief generic SAN ID lower 64bit */ + vmk_uint64 L; + /** \brief generic SAN ID higher 64bit */ + vmk_uint64 H; +} vmk_XsanID; + +/** + * \brief generic SAN target attributes + */ +typedef struct vmk_XsanTargetAttrs { + /** \brief generic SAN target ID */ + vmk_XsanID id; +} vmk_XsanTargetAttrs; + +/** + * \brief generic SAN adapter + */ +typedef struct vmk_XsanAdapter { + /** \brief get the generic SAN initiator's ID */ + VMK_ReturnStatus (*getXsanInitiatorID)(void *clientData, vmk_XsanID *xsanID); + /** \brief get the target's attributes on generic SAN */ + VMK_ReturnStatus (*getXsanTargetAttributes) ( + void *pSCSI_Adapter, vmk_XsanTargetAttrs *xsanAttrib, + vmk_uint32 channelNo, vmk_uint32 targetNo); +} vmk_XsanAdapter; + +/* Return types for iSCSI Adapter param settings */ +typedef enum vmk_IscsiAdapterParamStatus { + VMK_ISCSI_ADAPTER_PARAM_UNSUPPORTED = 0x0, + VMK_ISCSI_ADAPTER_PARAM_CONFIG_SUCCEEDED, + VMK_ISCSI_ADAPTER_PARAM_CONFIG_FAILED, +} vmk_IscsiAdapterParamStatus; + +/* Return types for iSCSI Session/Connection Param settings */ +typedef enum vmk_IscsiParamStatus { + VMK_ISCSI_PARAM_CONFIG_UNSUPPORTED = 0x0, + VMK_ISCSI_PARAM_CONFIG_SUCCEEDED, + VMK_ISCSI_PARAM_CONFIG_FAILED, +} vmk_IscsiParamStatus; + +/* iSCSI Adapter Structure */ +typedef struct vmk_IscsiAdapter +{ + char reserved[5048]; /* not used */ + + void *transport; /* For use by Annex iSCSI */ + vmk_IscsiAdapterParamStatus (*getAdapterParams) + (void *clientData, vmk_uint32 param, char *pBuf, vmk_uint32 bufLength); + /* Configure Iscsi Session/Connection Parameters */ + vmk_IscsiParamStatus (*getIscsiAttributes) + (void *clientData, vmk_uint32 sessionId, vmk_uint32 param, char *pBuf, vmk_uint32 bufLength); + + /* Get iSCSI Target Uid */ + VMK_ReturnStatus (*getIscsiTargetUid) + (void *pSCSI_Adapter, char *pTargetUid, vmk_uint32 uidLength, + vmk_uint32 channelNo, vmk_uint32 targetNo); + +} vmk_IscsiAdapter; + +/** + * \brief Managed storage adapter types. + */ +typedef enum vmk_StorageTransport { + VMK_STORAGE_ADAPTER_TRANSPORT_UNKNOWN = 0x0, + VMK_STORAGE_ADAPTER_BLOCK, + VMK_STORAGE_ADAPTER_FC, + VMK_STORAGE_ADAPTER_ISCSI_RESERVED, /* not used */ + VMK_STORAGE_ADAPTER_IDE, + VMK_STORAGE_ADAPTER_ISCSI_VENDOR_SUPPLIED_IMA, + VMK_STORAGE_ADAPTER_SAS, + VMK_STORAGE_ADAPTER_SATA, + VMK_STORAGE_ADAPTER_USB, + VMK_STORAGE_ADAPTER_PSCSI, + /** + * VMK_STORAGE_ADAPTER_XSAN generically represents any type of SAN + * transport not explicitly encoded elsewhere in this list. It is + * intended mainly to support novel SAN transports that aren't yet + * fully integrated and supported in the way other transports are. + * This type of SAN adapters generally masquerade as + * locally-attached storage, except that: + * - They respond to SCSI "Inquiry" commands, yielding unique target IDs. + * - RDMs are allowed. + * - Periodic rescanning for new LUNs is performed. + */ + VMK_STORAGE_ADAPTER_XSAN, + VMK_STORAGE_ADAPTER_FCOE, +} vmk_StorageTransport; + +/** + * \brief Transport specific info required for management. + */ +typedef struct vmk_SCSITransportMgmt { + /** \brief Storage transport type. */ + vmk_StorageTransport transport; + /** \brief Reserved */ + vmk_uint8 reserved[4]; + /** \brief Driver transport specific data */ + void *transportData; + /** \brief Transport-specifics */ + union { + /** \brief Block transport specific data. */ + vmk_BlockAdapter *block; + /** \brief Fibre Channel transport specific data. */ + vmk_FcAdapter *fc; + /** \brief ISCSI transport specific data. */ + vmk_IscsiAdapter *iscsi; + /** \brief SAS transport specific data. */ + vmk_SasAdapter *sas; + /** \brief Generic SAN transport specific data. */ + vmk_XsanAdapter *xsan; + /** \brief FCoE specific data */ + vmk_FcoeAdapter *fcoe; + } t; +} vmk_SCSITransportMgmt; + +#endif /* _VMKAPI_SCSI_MGMT_TYPES_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_types.h new file mode 100644 index 0000000..54c151c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_types.h @@ -0,0 +1,1466 @@ +/*************************************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + *********************************************************************** + * SCSI-specific types */ /** + * \addtogroup SCSI + * @{ + * + * \defgroup SCSItypes SCSI Types + * @{ + *********************************************************************** + */ + +#ifndef _VMKAPI_SCSI_TYPES_H_ +#define _VMKAPI_SCSI_TYPES_H_ + +/** \cond never */ +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif +/** \endcond never */ + +#include "base/vmkapi_types.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_const.h" +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_scatter_gather.h" +#include "scsi/vmkapi_scsi_ext.h" +#include "scsi/vmkapi_scsi_mgmt_types.h" +#define VMK_SECTOR_SIZE 512 + +/** + * \brief configured SCSI system limits + */ +typedef struct vmk_ScsiSystemLimits { + vmk_uint32 maxDevices; + vmk_uint32 maxPaths; + vmk_VirtAddr pad[3]; +} vmk_ScsiSystemLimits; + +/** + * \brief sense data structure maintained in each SCSI device + * SPC 3 r23, Section 4.5.3 table 26 + * + * NB: The "valid" bit in the data structure does NOT tell whether the sense is + * actually valid and thus the name is really badly chosen (even though it is + * the official name from the SCSI II specification). The SCSI II spec. + * states "A valid bit of zero indicates that the information field is not as + * defined in this International Standard". we have seen that many tape drives + * are capable of returning sense without this bit set + */ +typedef struct vmk_ScsiSenseData { + /** \brief error type and format of sense data (see SPC 3 r23, Sec. 4.5.1) */ + vmk_uint8 error :7, +/* \brief sense data is for "current command" */ +#define VMK_SCSI_SENSE_ERROR_CURCMD 0x70 +/* \brief sense data is for an earlier command */ +#define VMK_SCSI_SENSE_ERROR_PREVCMD 0x71 + /** \brief set to one indicates the 'info' field is valid */ + valid :1; + /** \brief obsolete */ + vmk_uint8 segment; + /** \brief generic information describing the error or exception condition */ + vmk_uint8 key :4, + :1, + /** \brief see above spc section */ + ili :1, + /** \brief see above spc section */ + eom :1, + /** \brief see above spc section */ + filmrk :1; + /** \brief see above spc section */ + vmk_uint8 info[4]; + /** \brief see above spc section */ + vmk_uint8 optLen; + /** \brief see above spc section */ + vmk_uint8 cmdInfo[4]; + /** \brief further information about to the condition reported in 'key' */ + vmk_uint8 asc; + /** \brief detailed information about to the additional sense code in 'asc' */ + vmk_uint8 ascq; + /** \brief Field Replacable Unit code (see SPC 3 r23, 4.5.2.5) */ + vmk_uint8 fru; + /** \brief Sense-key specific fields (see SPC 3 r23, 4.5.2.4) */ + vmk_uint8 bitpos :3, + bpv :1, + :2, + cd :1, + /** \brief Set to indicate sense-key specific fields are valid */ + sksv :1; + /** \brief field indicates which byte of the CDB or param data was in error */ + vmk_uint16 epos; + + /* + * \brief may contain vendor specific data further defining exception cond. + * + * Some vendors want to return additional data which + * requires a sense buffer of up to 64 bytes. + * + * See SPC 3 r23, Section 4.5 + */ + vmk_uint8 additional[46]; +} VMK_ATTRIBUTE_PACKED vmk_ScsiSenseData; + +/* + * Commands + */ + +/** + * \brief SCSI command ID + */ + +typedef struct vmk_ScsiCommandId { + /** \brief unique token of originator of cmd */ + void *initiator; + /** \brief unique serial of cmd */ + vmk_uint64 serialNumber; +} vmk_ScsiCommandId; + +struct vmk_ScsiCommand; + +typedef void (*vmk_ScsiCommandDoneCbk)(struct vmk_ScsiCommand *cmd); + +/** + * \brief Flag definitions for vmk_ScsiCommand.flags field. + * + * \cond nodoc + * Be sure to modify VMK_SCSI_COMMAND_FLAGS_REISSUE_SCRUB_MASK if a newly + * added flag should be cleared if caller chooses to re-issue the command + * using the same command structure. + * \endcond + * + * NOTES: + * - If a command has the VMK_SCSI_COMMAND_FLAGS_RESERVATION_SENSITIVE + * flag set, the plugin should _not_ retry the IO upon failure. + * - If you add a new flag that shouldn't be carried across command + * retries, make sure you add it to + * VMK_SCSI_COMMAND_FLAGS_REISSUE_SCRUB_MASK. + * + * ISSUE_WITH_ORDERED_TAG, instructs the lower level drivers to issue this + * command with an ORDERED tag if tagged queuing + * is being used - if tagged queuing is not in + * effect for the target it can be ignored + * VPORT, command being issued is destined to NPIV virtual port + * NEEDS_COMPLETION, used internally by the framework's ScsiDevice layer + * USE_PRIORITY_QUEUE, used internally by the framework's ScsiDevice layer. + * NO_CONNECT_IF_APD, instructs an MP Plugin to fail the I/O with a + * VMK_SCSI_HOST_NO_CONNECT host status if it finds + * that a vmk_ScsiDevice is in an all-paths-dead + * condition. Normally an MP Plugin should keep + * retrying the I/O until a path becomes available or + * it recieves a task mamagement abort or reset + * request. + * VM_CLUSTER, command issued by a VM that is a guest cluster node + * Cluster may use SCSI reservation as a mechanism to determine + * node membership. As a result, VM cluster is particularly + * sensitive to RESERVATION CONFLICT command status. The MPP + * must avoid issuing VM cluster generated IO over an active + * path that doesn't hold reservation. Doing that would create + * an artificial reservation conflict that would interfere with + * the way VM cluster works. + * SKIPRETRY [set internally] indicates the command was aborted as part of a + * SCSI_DeviceVirtReset call and so should not be retried, even if + * the command timeout has not yet expired. + */ +typedef enum { + VMK_SCSI_COMMAND_FLAGS_ISSUE_WITH_ORDERED_TAG = 0x00010000, + VMK_SCSI_COMMAND_FLAGS_RESERVATION_SENSITIVE = 0x00008000, + VMK_SCSI_COMMAND_FLAGS_VPORT = 0x00004000, + VMK_SCSI_COMMAND_FLAGS_SKIPRETRY = 0x00002000, + VMK_SCSI_COMMAND_FLAGS_USE_PRIORITY_QUEUE = 0x00001000, + VMK_SCSI_COMMAND_FLAGS_NO_CONNECT_IF_APD = 0x00000800, + VMK_SCSI_COMMAND_FLAGS_VM_CLUSTER = 0x00000400, +} /** \cond nodoc */ VMK_ATTRIBUTE_PACKED VMK_ATTRIBUTE_ALIGN(1) /* \endcond*/ +vmk_ScsiCommandFlags; + +#define VMK_SCSI_COMMAND_FLAGS_REISSUE_SCRUB_MASK \ + (VMK_SCSI_COMMAND_FLAGS_SKIPRETRY) + +#define VMK_SCSI_MAX_CDB_LEN 16 +#define VMK_SCSI_MAX_SENSE_DATA_LEN 64 + +/** + * \brief SCSI command structure + */ +typedef struct vmk_ScsiCommand { + /** \brief command completion callback for async i/o */ + vmk_ScsiCommandDoneCbk done; + /** \brief command completion callback argument for async i/o */ + void *doneData; + /** \brief scatter/gather list pointing to i/o's data buffer */ + vmk_SgArray *sgArray; + /** \brief hint indicating the direction of data transfer */ + vmk_ScsiCommandDirection dataDirection; + /** \brief command flags, see above */ + vmk_uint32 flags; + /** \brief hint indicating whether a cmd is a read i/o */ + vmk_Bool isReadCdb; + /** \brief hint indicating whether a cmd is a write i/o */ + vmk_Bool isWriteCdb; + /** \brief reserved */ + vmk_uint8 reserved1[2]; + /** \brief minimum data transfer length. must be <= vmk_GetSgDataLen(sgArray) + */ + vmk_uint32 requiredDataLen; + /** \brief worldId of the world on behalf of whom cmd is issued */ + vmk_uint32 worldId; + /** + * \brief number of blocks to be xfer'd + * + * only valid for isReadCdb || isWriteCdb + */ + vmk_uint32 lbc; + /** + * \brief address of first block to be xfer'd + * + * only valid for isReadCdb || isWriteCdb + */ + vmk_uint64 lba; + /** + * \brief # of Msecs since system boot before cmd is timed out + * + * 0 indicates the cmd will not be timed out. nonzero indicates the system + * time beyond which the PSA framework will issue an abort task management + * request and fail the i/o with a timeout status + */ + vmk_uint64 absTimeoutMs; + /** \brief unique tag for this command */ + vmk_ScsiCommandId cmdId; + /** \brief SCSI command descriptor block */ + vmk_uint8 cdb[VMK_SCSI_MAX_CDB_LEN]; + /** \brief # valid bytes in cdb, must be <= VMK_SCSI_MAX_CDB_LEN */ + vmk_uint32 cdbLen; + /** \brief command completion status */ + vmk_ScsiCmdStatus status; + /** \brief # of bytes xfer'd to/from data buffer */ + vmk_uint32 bytesXferred; + /** \brief reserved */ + vmk_uint32 reserved2[3]; + /** \brief SCSI sense, only valid if vmk_ScsiCmdStatusIsCheck(cmd->status) */ + vmk_ScsiSenseData senseData; + /** \brief reserved */ + vmk_VirtAddr reserved3[2]; + /** \brief command completion status */ +} vmk_ScsiCommand; + +/** + * \brief SCSI task management action + */ +typedef enum { + VMK_SCSI_TASKMGMT_ACTION_IGNORE = 0, + VMK_SCSI_TASKMGMT_ACTION_ABORT = 1, +} vmk_ScsiTaskMgmtAction; + +/** + * \brief Used to abort all commands, regardless of initiator and s/n + */ +#define VMK_SCSI_TASKMGMT_ANY_INITIATOR (void*)0xA11 + +/** + * \brief SCSI task management + */ +typedef struct vmk_ScsiTaskMgmt { + /** \brief magic */ + vmk_uint32 magic; + /** \brief task mgmt type */ + vmk_ScsiTaskMgmtType type; + /** \brief command status */ + vmk_ScsiCmdStatus status; + /** \brief cmdId of the cmd to abort. cmdId.serialNumber is only + * applicable for VMK_SCSI_TASKMGMT_ABORT and ignored for all + * other vmk_ScsiTaskMgmtType values. cmdId.initiator is only + * applicable for VMK_SCSI_TASKMGMT_ABORT and + * VMK_SCSI_TASKMGMT_VIRT_RESET, ignored for all other + * vmk_ScsiTaskMgmtType values + */ + vmk_ScsiCommandId cmdId; + /** \brief worldId of the cmd(s) to abort. only applicable for + * VMK_SCSI_TASKMGMT_ABORT and VMK_SCSI_TASKMGMT_VIRT_RESET, ignored + * for all other vmk_ScsiTaskMgmtType values + */ + vmk_uint32 worldId; +} vmk_ScsiTaskMgmt; + +/* + * SCSI Adapter + */ + +typedef enum vmk_ScanAction { + VMK_SCSI_SCAN_CREATE_PATH, + VMK_SCSI_SCAN_CONFIGURE_PATH, + VMK_SCSI_SCAN_DESTROY_PATH, +} vmk_ScanAction; + +/* Maximum length of name fields (including 1 byte for the terminating NUL) */ +#define VMK_SCSI_ADAPTER_NAME_LENGTH 32 +#define VMK_SCSI_DRIVER_NAME_LENGTH 32 +#define VMK_SCSI_ADAPTER_PROC_NAME_LENGTH 32 +#define VMK_SCSI_TRANSPORT_NAME_LENGTH 32 + +/** + * \brief bitmasks for adapter events + * + * Events are bit fields because users can + * wait for multiple events + * + */ +typedef enum vmk_ScsiAdapterEvents { + VMK_SCSI_ADAPTER_EVENT_FC_LOOP_UP = 0x00000001, + VMK_SCSI_ADAPTER_EVENT_FC_LOOP_DOWN = 0x00000002, + VMK_SCSI_ADAPTER_EVENT_FC_RSCN = 0x00000004, + VMK_SCSI_ADAPTER_EVENT_FC_NEW_TARGET = 0x00000008, + VMK_SCSI_ADAPTER_EVENT_FC_REMOVED_TARGET = 0x00000010, + VMK_SCSI_ADAPTER_EVENT_FC_NEW_VPORT = 0x00000020, + VMK_SCSI_ADAPTER_EVENT_FC_REMOVED_VPORT = 0x00000040, + VMK_SCSI_ADAPTER_EVENT_HOT_PLUG_ADD = 0x00000080, + VMK_SCSI_ADAPTER_EVENT_HOT_PLUG_REMOVE = 0x00000100, + VMK_SCSI_ADAPTER_EVENT_FC_TARGET_SCAN_DONE = 0x00000200, +} vmk_ScsiAdapterEvents; + + /** \brief Event handler callback entry */ +typedef void (*vmk_EventHandlerCbk) (void *clientData, vmk_uint32 eventType); + +/** + * \brief bitmasks for flags field of SCSI adapter + * + * Through this flags, give vmkernel information how handle the adapter. + * + */ +typedef enum vmk_ScsiAdapterFlags { + VMK_SCSI_ADAPTER_FLAG_BLOCK = 0x00000001, + /** This adapter is an NPIV VPORT */ + VMK_SCSI_ADAPTER_FLAG_NPIV_VPORT = 0x00000002, + /** Do not scan when registering this adapter */ + VMK_SCSI_ADAPTER_FLAG_REGISTER_WITHOUT_SCAN = 0x00000004, + /** Do not scan periodically */ + VMK_SCSI_ADAPTER_FLAG_NO_PERIODIC_SCAN = 0x00000008, + /** Ok to probe periodically, but no adapter rescan */ + VMK_SCSI_ADAPTER_FLAG_NO_ADAPTER_RESCAN = 0x00000010, + /** This adapter is a Legacy NPIV VPORT */ + VMK_SCSI_ADAPTER_FLAG_NPIV_LEGACY_VPORT = 0x00000020, +} vmk_ScsiAdapterFlags; + +/** + * \brief main data structure for SCSI adapter + * + * The discover() entrypoint passes back a deviceData. + * This deviceData must be able to completely identify + * the channel:target:lun of the device as it's the only + * thing that will be passed back once it's set by the + * discover() entrypoint. + */ +typedef struct vmk_ScsiAdapter { + /** \brief max # of scatter/gather entries */ + int sgSize; + /** \brief required scatter/gather element alignment */ + int sgElemAlignment; + /** \brief if non-zero, scatter/gather element length multiple */ + int sgElemSizeMult; + /** \brief max # of blocks per i/o */ + int hostMaxSectors; + /** \brief adapter's ->can_queue entrypoint */ + vmk_uint32 *qDepthPtr; + /** \brief adapter creator's private convenience scratch data ptr */ + void *clientData; + /** \brief adapter support physical address extensions? */ + vmk_Bool paeCapable; + /** \brief reserved */ + vmk_uint8 reserved1[1]; + /** \brief Unique adapter number. Set by vmk_ScsiAllocateAdapter. */ + vmk_uint16 hostNum; + /** \brief SCSI target id of adapter, or -1 if n/a */ + int targetId; + /** \brief Issue a SCSI command to the specified device */ + VMK_ReturnStatus (*command)( + void *clientData, + struct vmk_ScsiCommand *cmd, + void *deviceData); + /** \brief Issue a SCSI task management */ + VMK_ReturnStatus (*taskMgmt)( + void *clientData, + struct vmk_ScsiTaskMgmt *taskMgmt, + void *deviceData); + /** \brief Issue a SCSI command during a core dump */ + VMK_ReturnStatus (*dumpCommand)( + void *clientData, + vmk_ScsiCommand *cmd, + void *deviceData); + /** \brief Destroy the adapter */ + void (*close)(void *clientData); + /** \brief generate the adapter's proc node information */ + VMK_ReturnStatus (*procInfo)( + void* clientData, + char* buf, + vmk_uint32 offset, + vmk_uint32 count, + vmk_uint32* nbytes, + int isWrite); + /** \brief Log the current adapter queue */ + void (*dumpQueue)(void *clientData); + /** \brief Run the adapter's BH, called on the dump device during a PSOD + * Interrupts are disabled and BHs aren't running. + */ + void (*dumpBHHandler)(void *clientData); + /** \brief arg to dumpQueue() */ + void *dumpBHHandlerData; + /** \brief driver specific ioctl */ + VMK_ReturnStatus (*ioctl)( + void *clientData, + void *deviceData, + vmk_uint32 fileFlags, + vmk_uint32 cmd, + vmk_VirtAddr userArgsPtr, + vmk_IoctlCallerSize callerSize, + vmk_int32 *drvErr); + /** \brief discover & destroy a device */ + VMK_ReturnStatus (*discover)( + void *clientData, + vmk_ScanAction action, + int channel, + int targetId, + int lunId, + void **deviceData); + /** \brief send NPIV specific commands to a device */ + VMK_ReturnStatus (*vportop)( + void *handle, + vmk_uint32 cmd, + void *arg, + vmk_int32 *drvErr); + /** \brief scan a single LUN on a vport */ + VMK_ReturnStatus (*vportDiscover)( + void *clientData, + vmk_ScanAction action, + int ctlr, + int devNum, + int lun, + struct vmk_ScsiAdapter **vmkAdapter, + void **deviceData); + /** \brief try changing the path queue depth */ + int (*modifyDeviceQueueDepth)( + void *clientData, + int qDepth, + void *deviceData); + /** \brief query the path queue depth */ + int (*queryDeviceQueueDepth)( + void *clientData, + void *deviceData); + /** \brief checks if a target exists */ + VMK_ReturnStatus (*checkTarget)( + void *clientData, + int channel, + int targetId); + /** \brief adapter flags, see vmk_ScsiAdapterFlags above */ + vmk_uint32 flags; + /** \brief block data */ + int blockData; + /** \brief id of module running this adapter */ + vmk_ModuleID moduleID; + /** \brief # of channels */ + int channels; + /** \brief # of targets per channel */ + int maxTargets; + /** \brief max # of logical units per target */ + int maxLUNs; + /** \brief pci bus # or 0xffff if n/a */ + vmk_uint16 bus; + /** \brief pci devfn (slot and function num) or 0xffff if n/a */ + vmk_uint16 devfn; + /** \brief pci segment # or 0xffff if n/a */ + vmk_uint16 segment; + /** \brief reserved */ + vmk_uint8 reserved2[2]; + /** \brief adapter name */ + char name[VMK_SCSI_ADAPTER_NAME_LENGTH]; + /** \brief block device name + * only valid for mgmtAdapter.transport == VMK_STORAGE_ADAPTER_BLOCK + */ + char blockDevName[VMK_SCSI_ADAPTER_NAME_LENGTH]; + /** \brief driver name */ + char driverName[VMK_SCSI_DRIVER_NAME_LENGTH]; + /** \brief /proc directory */ + char procName[VMK_SCSI_ADAPTER_PROC_NAME_LENGTH]; + /** \brief reserved */ + vmk_uint32 reserved3[4]; + /** \brief reserved */ + vmk_VirtAddr reserved4[4]; + /** \brief transport specific mgmtAdapter hooks */ + vmk_SCSITransportMgmt mgmtAdapter; +} vmk_ScsiAdapter; + +/* + * Physical Path + */ + +#define VMK_SCSI_PATH_ANY_ADAPTER "*" +#define VMK_SCSI_PATH_ANY_CHANNEL ~0 +#define VMK_SCSI_PATH_ANY_TARGET ~0 +#define VMK_SCSI_PATH_ANY_LUN ~0 + +/** + * \brief SCSI Plugin run-time state + */ +typedef enum { + VMK_SCSI_PLUGIN_STATE_ENABLED, + VMK_SCSI_PLUGIN_STATE_DISABLING, + VMK_SCSI_PLUGIN_STATE_DISABLED, + VMK_SCSI_PLUGIN_STATE_CLAIM_PATHS, +} vmk_ScsiPluginState; + +/** + * \brief Format of INQUIRY request block. + * SPC 3 r23, Section 6.4.1 table 80 + */ +typedef struct vmk_ScsiInquiryCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 evpd :1, + /** \brief see above spc section */ + cmddt :1, + /** \brief see above spc section */ + resv12:3, + /** \brief see above spc section */ + lun :3; + /** \brief see above spc section */ + vmk_uint8 pagecode; + /** \brief see above spc section */ + vmk_uint8 reserved; + /** \brief see above spc section */ + vmk_uint8 len; + /** \brief see above spc section */ + vmk_uint8 ctrl; +} vmk_ScsiInquiryCmd; + +/** + * \brief Format of INQUIRY response block. + * SPC 3 r23, Section 6.4.2 table 81 + */ +typedef struct vmk_ScsiInquiryResponse { + /** \brief see above spc section */ + vmk_uint8 devclass :5, +#define VMK_IDE_CLASS_CDROM 0x0a // IDE CD-ROM drive - deprecated +#define VMK_IDE_CLASS_OTHER 0x0b // Generic IDE - deprecated +#define VMK_SCSI_CLASS_SES 0x0d // SCSI Enclosure Services device (t10 SES) - deprecated + /** \brief see above spc section */ + pqual :3; +#define VMK_SCSI_PQUAL_CONNECTED 0 // device described is connected to the LUN +#define VMK_SCSI_PQUAL_NOTCONNECTED 1 // target supports such a device, but none is connected +#define VMK_SCSI_PQUAL_NODEVICE 3 // target does not support a physical device for this LUN + /** \brief see above spc section */ + vmk_uint8 :7, + /** \brief see above spc section */ + rmb:1; + /** \brief see above spc section */ + vmk_uint8 ansi :3, +#define VMK_SCSI_ANSI_SCSI1 0x0 // device supports SCSI-1 +#define VMK_SCSI_ANSI_CCS 0x1 // device supports the CCS +#define VMK_SCSI_ANSI_SCSI2 0x2 // device supports SCSI-2 +#define VMK_SCSI_ANSI_SCSI3_SPC 0x3 // device supports SCSI-3 version SPC +#define VMK_SCSI_ANSI_SCSI3_SPC2 0x4 // device supports SCSI-3 version SPC-2 +#define VMK_SCSI_ANSI_SCSI3_SPC3 0x5 // device supports SCSI-3 version SPC-3 +#define VMK_SCSI_ANSI_SCSI3_SPC4 0x6 // device supports SCSI-3 version SPC-4 + /** \brief see above spc section */ + ecma :3, + /** \brief see above spc section */ + iso :2; + /** \brief see above spc section */ + vmk_uint8 dataformat :4, + /** \brief see above spc section */ + :1, + /** \brief see above spc section */ + naca :1, + /** \brief see above spc section */ + tio :1, + /** \brief see above spc section */ + aen :1; + /** \brief see above spc section */ + vmk_uint8 optlen; + /** \brief see above spc section */ + vmk_uint8 protect :1, + /** \brief see above spc section */ + rsrv :2, + /** \brief see above spc section */ + tpcp :1, + /** \brief see above spc section */ + tpgs :2, + /** \brief see above spc section */ + acc :1, + /** \brief see above spc section */ + sccs :1; +#define VMK_SCSI_TPGS_NONE 0x0 +#define VMK_SCSI_TPGS_IMPLICIT_ONLY 0x1 +#define VMK_SCSI_TPGS_IMPLICIT VMK_SCSI_TPGS_IMPLICIT_ONLY +#define VMK_SCSI_TPGS_EXPLICIT_ONLY 0x2 +#define VMK_SCSI_TPGS_EXPLICIT VMK_SCSI_TPGS_EXPLICIT_ONLY +#define VMK_SCSI_TPGS_BOTH_IMPLICIT_AND_EXPLICIT 0x3 +#define VMK_SCSI_TPGS_BOTH VMK_SCSI_TPGS_BOTH_IMPLICIT_AND_EXPLICIT + /** \brief see above spc section */ + vmk_uint8 adr16 :1, + /** \brief see above spc section */ + adr32 :1, + /** \brief see above spc section */ + arq :1, + /** \brief see above spc section */ + mchngr :1, + /** \brief see above spc section */ + dualp :1, + /** \brief see above spc section */ + port :1, + /** \brief see above spc section */ + :2; + /** \brief see above spc section */ + vmk_uint8 sftr :1, + /** \brief see above spc section */ + que :1, + /** \brief see above spc section */ + trndis :1, + /** \brief see above spc section */ + link :1, + /** \brief see above spc section */ + sync :1, + /** \brief see above spc section */ + w16 :1, + /** \brief see above spc section */ + w32 :1, + /** \brief see above spc section */ + rel :1; + /** \brief see above spc section */ + vmk_uint8 manufacturer[8]; + /** \brief see above spc section */ + vmk_uint8 product[16]; + /** \brief see above spc section */ + vmk_uint8 revision[4]; + /** \brief see above spc section */ + vmk_uint8 vendor1[20]; + /** \brief see above spc section */ + vmk_uint8 reserved[40]; +} vmk_ScsiInquiryResponse; + +#define VMK_SCSI_STANDARD_INQUIRY_MIN_LENGTH 36 + +/** + * \brief Format of INQUIRY EVPD responses + * SPC 3 r23, Section 7.6 + */ +typedef struct vmk_ScsiInquiryVPDResponse { + /** \brief see above spc section */ + vmk_uint8 devclass :5, + /** \brief see above spc section */ + pqual :3; + /** \brief see above spc section */ + vmk_uint8 pageCode; + /** \brief see above spc section */ + vmk_uint8 reserved; + /** \brief see above spc section */ + vmk_uint8 payloadLen; + /** \brief see above spc section */ + vmk_uint8 payload[0]; +} VMK_ATTRIBUTE_PACKED VMK_ATTRIBUTE_ALIGN(1) vmk_ScsiInquiryVPDResponse; + +/* + * \brief Format of INQUIRY EVPD Page 83 response + * SPC 3 r23, Section 7.6.3.1 table 294 + */ +typedef struct vmk_ScsiInquiryVPD83Response { + /** \brief see above spc section */ + vmk_uint8 devclass :5, + /** \brief see above spc section */ + pqual :3; + /** \brief see above spc section */ + vmk_uint8 pageCode; + /** \brief see above spc section */ + vmk_uint16 payloadLen; + /** \brief see above spc section */ + vmk_uint8 payload[0]; +} VMK_ATTRIBUTE_PACKED VMK_ATTRIBUTE_ALIGN(1) vmk_ScsiInquiryVPD83Response; + +/* + * \brief Format of INQUIRY EVPD Page 83 response id descriptor + * SPC 3 r23, Section 7.6.3.1 table 295 + */ +typedef struct vmk_ScsiInquiryVPD83IdDesc { + /** \brief see above spc section */ + vmk_uint8 codeSet :4, + /** \brief see above spc section */ + protocolId :4; +#define VMK_SCSI_EVPD83_ID_VENDOR (0x0) +#define VMK_SCSI_EVPD83_ID_T10 (0x1) +#define VMK_SCSI_EVPD83_ID_EUI (0x2) +#define VMK_SCSI_EVPD83_ID_NAA (0x3) +#define VMK_SCSI_EVPD83_ID_RTP (0x4) +#define VMK_SCSI_EVPD83_ID_TPG (0x5) +#define VMK_SCSI_EVPD83_ID_LUG (0x6) +#define VMK_SCSI_EVPD83_ID_MD5 (0x7) +#define VMK_SCSI_EVPD83_ID_SCSINAME (0x8) + /** \brief see above spc section */ + vmk_uint8 idType :4, +#define VMK_SCSI_EVPD83_ASSOCIATION_LU (0x0) +#define VMK_SCSI_EVPD83_ASSOCIATION_PORT (0x1) +#define VMK_SCSI_EVPD83_ASSOCIATION_DEV (0x2) + /** \brief see above spc section */ + association :2, + /** \brief see above spc section */ + reserved1 :1, + /** \brief see above spc section */ + piv :1; + /** \brief see above spc section */ + vmk_uint8 reserved2; + /** \brief see above spc section */ + vmk_uint8 idLen; + /** \brief see above spc section */ + vmk_uint8 id[0]; +} VMK_ATTRIBUTE_PACKED VMK_ATTRIBUTE_ALIGN(1) vmk_ScsiInquiryVPD83IdDesc; + +#define VMK_SCSI_EVPD83_NAA_EXTENDED (0x2) +#define VMK_SCSI_EVPD83_NAA_REGISTERED (0x5) +#define VMK_SCSI_EVPD83_NAA_REG_EXT (0x6) + +/** + * \brief NAA IEEE Registered Extended identification field foramt + * SPC 3 r23: + * Section 7.6.3.6.4 table 309. + */ +typedef struct vmk_ScsiNAARegExtendedIdField { + vmk_uint8 companyIdMSB :4, + NAA :4; + vmk_uint16 companyIdMiddleBytes; + vmk_uint8 vendorSpecIdMSB :4, + companyIdLSB :4; + vmk_uint32 vendorSpecIdLSB; + vmk_uint64 vendorSpecIdExt; +} __attribute__((packed,aligned(1))) vmk_ScsiNAARegExtendedIdField; + +/** + * \brief Format of the 6 byte version of MODE SELECT + * SPC 3 r23, Section 6.9.1 table 97 + */ +typedef struct vmk_ScsiModeSenseCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 :3, + /** \brief see above spc section */ + dbd :1, + :1, + /** \brief see above spc section */ + lun :3; + /** \brief see above spc section */ + vmk_uint8 page :6, +#define VMK_SCSI_MS_PAGE_VENDOR 0x00 // vendor-specific (ALL) +#define VMK_SCSI_MS_PAGE_RWERROR 0x01 // read/write error (DISK/TAPE/CDROM/OPTICAL) +#define VMK_SCSI_MS_PAGE_CONNECT 0x02 // disconnect/connect (ALL) +#define VMK_SCSI_MS_PAGE_FORMAT 0x03 // format (DISK) +#define VMK_SCSI_MS_PAGE_PARALLEL 0x03 // parallel interface (PRINTER) +#define VMK_SCSI_MS_PAGE_UNITS 0x03 // measurement units (SCANNER) +#define VMK_SCSI_MS_PAGE_GEOMETRY 0x04 // rigid disk geometry (DISK) +#define VMK_SCSI_MS_PAGE_SERIAL 0x04 // serial interface (PRINTER) +#define VMK_SCSI_MS_PAGE_FLEXIBLE 0x05 // flexible disk geometry (DISK) +#define VMK_SCSI_MS_PAGE_PRINTER 0x05 // printer operations (PRINTER) +#define VMK_SCSI_MS_PAGE_OPTICAL 0x06 // optical memory (OPTICAL) +#define VMK_SCSI_MS_PAGE_VERIFY 0x07 // verification error (DISK/CDROM/OPTICAL) +#define VMK_SCSI_MS_PAGE_CACHE 0x08 // cache (DISK/CDROM/OPTICAL) +#define VMK_SCSI_MS_PAGE_PERIPH 0x09 // peripheral device (ALL) +#define VMK_SCSI_MS_PAGE_CONTROL 0x0a // control mode (ALL) +#define VMK_SCSI_MS_PAGE_MEDIUM 0x0b // medium type (DISK/CDROM/OPTICAL) +#define VMK_SCSI_MS_PAGE_NOTCH 0x0c // notch partitions (DISK) +#define VMK_SCSI_MS_PAGE_CDROM 0x0d // CD-ROM (CDROM) +#define VMK_SCSI_MS_PAGE_CDAUDIO 0x0e // CD-ROM audio (CDROM) +#define VMK_SCSI_MS_PAGE_COMPRESS 0x0f // data compression (TAPE) +#define VMK_SCSI_MS_PAGE_CONFIG 0x10 // device configuration (TAPE) +#define VMK_SCSI_MS_PAGE_EXCEPT 0x1c // informal exception (ALL:SCSI-3) +#define VMK_SCSI_MS_PAGE_CDCAPS 0x2a // CD-ROM capabilities and mechanical status (CDROM) +// more defined... +#define VMK_SCSI_MS_PAGE_ALL 0x3f // all available pages (ALL) + /** \brief see above spc section */ + pcf :2; +#define VMK_SCSI_MS_PCF_CURRENT 0x00 // current values +#define VMK_SCSI_MS_PCF_VOLATILE 0x01 // changeable values +#define VMK_SCSI_MS_PCF_DEFAULT 0x02 // default values +#define VMK_SCSI_MS_PCF_SAVED 0x03 // saved values + /** \brief see above spc section */ + vmk_uint8 subpage; + /** \brief see above spc section */ + vmk_uint8 length; + /** \brief see above spc section */ + vmk_uint8 ctrl; +} vmk_ScsiModeSenseCmd; + +/** + * \brief Format of READ_CAPACITY(10) response block. + * SBC 2 r16, section 5.10.1 table 34 + */ +typedef struct { + /** \brief see above sbc section */ + vmk_uint32 lbn; + /** \brief see above sbc section */ + vmk_uint32 blocksize; +} vmk_ScsiReadCapacityResponse; + +/* + * Format of REPORT TARGET PORT GROUPS request and response blocks. + */ + + +/** + * \brief target port group command for SCSI report + * SPC 3 r23, section 6.25 table 162 + */ +typedef struct vmk_ScsiReportTargetPortGroupsCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 svc:5, +#define VMK_SCSI_RTPGC_SVC 0xA + /** \brief see above spc section */ + res1:3; + /** \brief see above spc section */ + vmk_uint8 reserved1[4]; + /** \brief see above spc section */ + vmk_uint32 length; + /** \brief see above spc section */ + vmk_uint8 reserved2; + /** \brief see above spc section */ + vmk_uint8 ctrl; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReportTargetPortGroupsCmd; + +/** + * \brief target port group response for SCSI report + * SPC 3 r23, section 6.25 table 163 + */ +typedef struct vmk_ScsiReportTargetPortGroupsResponse { + /** \brief see above spc section */ + vmk_uint32 length; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReportTargetPortGroupsResponse; + +/** + * \brief target port group descriptor for SCSI report + * SPC 3 r23, section 6.25 table 164 + */ +typedef struct vmk_ScsiReportTargetPortGroupDescriptor { + /** \brief see above spc section */ + vmk_uint8 aas:4, + /** \brief see above spc section */ + res1:3, + /** \brief see above spc section */ + pref:1; +#define VMK_SCSI_TPGD_AAS_AO 0x00 //!< active/optimized +#define VMK_SCSI_TPGD_AAS_ANO 0x01 //!< active/nonoptomized +#define VMK_SCSI_TPGD_AAS_STBY 0x02 //!< standby +#define VMK_SCSI_TPGD_AAS_UNAVAIL 0x03 //!< unavailable +#define VMK_SCSI_TPGD_AAS_TRANS 0x0F //!< transitioning + /** \brief see above spc section */ + vmk_uint8 aosup:1, + /** \brief see above spc section */ + ansup:1, + /** \brief see above spc section */ + ssup:1, + /** \brief see above spc section */ + usup:1, + /** \brief see above spc section */ + res2:3, + /** \brief see above spc section */ + tsup:1; + /** \brief see above spc section */ + vmk_uint16 targetPortGroup; + /** \brief see above spc section */ + vmk_uint8 reserved1; +#define VMK_SCSI_TPGD_STAT_NONE 0x00 //!< no status available +#define VMK_SCSI_TPGD_STAT_EXP 0x01 //!< state altered by SET command +#define VMK_SCSI_TPGD_STAT_IMP 0x02 //!< state altered by implicit behavior + /** \brief see above spc section */ + vmk_uint8 status; + /** \brief see above spc section */ + vmk_uint8 vendorSpec; + /** \brief see above spc section */ + vmk_uint8 targetPortCount; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReportTargetPortGroupDescriptor; + +/** + * \brief SCSI target port descriptor format + * SPC 3 r23, section 6.25 table 167 + */ +typedef struct vmk_ScsiReportTargetPortDescriptor { + /** \brief see above spc section */ + vmk_uint16 obsolete; + /** \brief see above spc section */ + vmk_uint16 relativeTargetPortId; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReportTargetPortDescriptor; + +/** + * \brief set target port groups command + * SPC 3 r23, Section 6.31 table 178 + */ +typedef struct vmk_ScsiSetTargetPortGroupsCmd{ + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 svc:5, +#define VMK_SCSI_STPGC_SVC 0xA + /** \brief see above spc section */ + res1:3; + /** \brief see above spc section */ + vmk_uint8 reserved1[4]; + /** \brief see above spc section */ + vmk_uint32 length; + /** \brief see above spc section */ + vmk_uint8 reserved2; + /** \brief see above spc section */ + vmk_uint8 ctrl; +} VMK_ATTRIBUTE_PACKED vmk_ScsiSetTargetPortGroupsCmd; + +#define SCSI_STPG_PARAM_LIST_OFFSET 4 + +/** + * \brief set target port group descriptor + * SPC 3 r23, Section 6.31 table 180 + */ +typedef struct vmk_ScsiSetTargetPortGroupDescriptor{ + /** \brief see above spc section */ + vmk_uint8 aas:4, + /** \brief see above spc section */ + res1:4; + /** \brief see above spc section */ + vmk_uint8 reserved1; + /** \brief see above spc section */ + vmk_uint16 targetPortGroup; +} VMK_ATTRIBUTE_PACKED vmk_ScsiSetTargetPortGroupDescriptor; + + +/** + * \brief parameter header of module sense for SCSI + * SPC 3 r23, Section 7.4.3 table 239 + */ +typedef struct vmk_Scsi4ByteModeSenseParameterHeader { + /** \brief see above spc section */ + vmk_uint8 modeDataLength; + /** \brief see above spc section */ + vmk_uint8 mediumType; + /** \brief see above spc section */ + vmk_uint8 reserved1:4, + /** \brief see above spc section */ + dpofua:1, + /** \brief see above spc section */ + reserved2:2, + /** \brief see above spc section */ + wp:1; + /** \brief see above spc section */ + vmk_uint8 blockDescriptorLength; +} VMK_ATTRIBUTE_PACKED vmk_Scsi4ByteModeSenseParameterHeader; + +/** + * \brief block descriptor for SCSI mode sense + * SPC 3 r23, Section 7.4.4.1 table 241 + */ +typedef struct vmk_ScsiModeSenseBlockDescriptor { + /** \brief see above spc section */ + vmk_uint8 densityCode; + /** \brief see above spc section */ + vmk_uint8 numberOfBlocks[3]; + /** \brief see above spc section */ + vmk_uint8 reserved1; + /** \brief see above spc section */ + vmk_uint8 blockLength[3]; +} VMK_ATTRIBUTE_PACKED vmk_ScsiModeSenseBlockDescriptor; + + +/** + * \brief Format of READ/WRITE (6) request. + * SBC 2 r16, Section 5.5 table 26 & 5.24 table 61 + */ +typedef struct vmk_ScsiReadWrite6Cmd { + /** \brief see above sbc section */ + vmk_uint32 opcode:8, + /** \brief see above sbc section */ + lun:3, + /** \brief see above sbc section */ + lbn:21; + /** \brief see above sbc section */ + vmk_uint8 length; + /** \brief see above sbc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadWrite6Cmd; + +/** + * \brief Format of READ/WRITE (10) request. + * SBC 2 r16, Section 5.6 table 28 & 5.25 table 62 + */ +typedef struct vmk_ScsiReadWrite10Cmd { + /** \brief see above sbc section */ + vmk_uint8 opcode; + /** \brief see above sbc section */ + vmk_uint8 rel :1, + :2, + /** \brief see above sbc section */ + flua :1, + /** \brief see above sbc section */ + dpo :1, + /** \brief see above sbc section */ + lun :3; + /** \brief see above sbc section */ + vmk_uint32 lbn; + /** \brief see above sbc section */ + vmk_uint8 reserved; + /** \brief see above sbc section */ + vmk_uint16 length; + /** \brief see above sbc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadWrite10Cmd; + +/** + * \brief Format of READ/WRITE (12) request. + * SBC 2 r16, Section 5.7 table 31 & 5.26 table 65 + */ +typedef struct vmk_ScsiReadWrite12Cmd { + /** \brief see above sbc section */ + vmk_uint8 opcode; + /** \brief see above sbc section */ + vmk_uint8 rel :1, + :2, + /** \brief see above sbc section */ + flua :1, + /** \brief see above sbc section */ + dpo :1, + /** \brief see above sbc section */ + lun :3; + /** \brief see above sbc section */ + vmk_uint32 lbn; + /** \brief see above sbc section */ + vmk_uint32 length; + /** \brief see above sbc section */ + vmk_uint8 reserved; + /** \brief see above sbc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadWrite12Cmd; + +/** + * \brief Format of READ/WRITE (16) request. + * SBC 2 r16, Section 5.8 table 32 & 5.27 table 66 + */ +typedef struct vmk_ScsiReadWrite16Cmd { + /** \brief see above sbc section */ + vmk_uint8 opcode; + /** \brief see above sbc section */ + vmk_uint8 rel :1, + :2, + /** \brief see above sbc section */ + flua :1, + /** \brief see above sbc section */ + dpo :1, + :3; + /** \brief see above sbc section */ + vmk_uint64 lbn; + /** \brief see above sbc section */ + vmk_uint32 length; + /** \brief see above sbc section */ + vmk_uint8 reserved; + /** \brief see above sbc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadWrite16Cmd; + +/** + * \brief Scsi page types for inquiry data + */ +typedef enum { + VMK_SCSI_INQ_TYPE_STD, + VMK_SCSI_INQ_TYPE_EVPD80, + VMK_SCSI_INQ_TYPE_EVPD83, + VMK_SCSI_INQ_TYPE_VMW_RESV_INITDATA, +} vmk_ScsiInqType; + +/** + * \brief Persistent Reserve Out Command + * SPC 3 r23, Section 6.12.1 (Table 112) + */ +typedef struct vmk_ScsiPersistentReserveOutCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 serviceAction :5, + /** \brief see above spc section */ + reserved :3; + /** \brief see above spc section */ + vmk_uint8 type :4, + /** \brief see above spc section */ + scope :4; + /** \brief see above spc section */ + vmk_uint8 reserved1[2]; + /** \brief see above spc section */ + vmk_uint32 parameterListLength; + /** \brief see above spc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiPersistentReserveOutCmd; + +/** + * \brief Persistent Reserve Out parameter List. + * SPC 3 r23, Section 6.12.3 (Table 114) + */ +typedef struct vmk_ScsiPersistentReserveOutPList { + /** \brief see above spc section */ + vmk_uint64 reservationKey; + /** \brief see above spc section */ + vmk_uint64 serviceActionResKey; + /** \brief see above spc section */ + vmk_uint8 obsolete1[4]; + /** \brief see above spc section */ + vmk_uint8 aptpl :1, + /** \brief see above spc section */ + reserved1 :1, + /** \brief see above spc section */ + all_tg_pt :1, + /** \brief see above spc section */ + spec_i_pt :1, + /** \brief see above spc section */ + reserved2 :4; + /** \brief see above spc section */ + vmk_uint8 reserved3; + /** \brief see above spc section */ + vmk_uint8 obsolete2[2]; +} VMK_ATTRIBUTE_PACKED vmk_ScsiPersistentReserveOutPList; + +/** + * \brief Persistent Reserve In Command + * SPC 3 r23, Section 6.11.1 (Table 101) + */ +typedef struct vmk_ScsiPersistentReserveInCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 serviceAction :5, + /** \brief see above spc section */ + reserved :3; + /** \brief see above spc section */ + vmk_uint8 reserved1[5]; + /** \brief see above spc section */ + vmk_uint16 allocationLength; + /** \brief see above spc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiPersistentReserveInCmd; + +/** + * \brief Persistent read reservation response + * SPC 3 r23, Section 6.11.3.4 (Table 105) + */ +typedef struct vmk_ScsiReadReservationResp { + /** \brief see above spc section */ + vmk_uint32 prGeneration; + /** \brief see above spc section */ + vmk_uint32 additionalLength; + /** \brief see above spc section */ + vmk_uint64 reservationKey; + /** \brief see above spc section */ + vmk_uint8 obsolete[4]; + /** \brief see above spc section */ + vmk_uint8 reserved; + /** \brief see above spc section */ + vmk_uint8 type :4, + /** \brief see above spc section */ + scope :4; + /** \brief see above spc section */ + vmk_uint8 obsolete1[2]; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadReservationResp; + +/** + * \brief Extended copy (XCOPY) command + * SPC 3 r23, Section 6.3.1 table 50 + */ +typedef struct vmk_ScsiExtendedCopyCmd { + /** \brief see above spc section */ + vmk_uint8 opcode; + /** \brief see above spc section */ + vmk_uint8 reserved1[9]; + /** \brief see above spc section */ + vmk_uint32 parameterListLength; + /** \brief see above spc section */ + vmk_uint8 reserved2; + /** \brief see above spc section */ + vmk_uint8 control; +} __attribute__ ((packed)) vmk_ScsiExtendedCopyCmd; + +/** + * \brief Extended copy parameter list header + * SPC 3 r23, Section 6.3.1 table 51 + */ +typedef struct vmk_ScsiExtendedCopyParamListHeader { + /** \brief see above spc section */ + vmk_uint8 listID; + /** \brief see above spc section */ + vmk_uint8 priority:3, + /** \brief see above spc section */ + reserved1:1, + /** \brief see above spc section */ + NRCR:1, + /** \brief see above spc section */ + STR:1, + /** \brief see above spc section */ + reserved2:2; + /** \brief see above spc section */ + vmk_uint16 targetDescriptorListLength; + /** \brief see above spc section */ + vmk_uint8 reserved3[4]; + /** \brief see above spc section */ + vmk_uint32 segmentDescriptorListLength; + /** \brief see above spc section */ + vmk_uint32 inlineDataLength; +} __attribute__ ((packed,aligned(1))) vmk_ScsiExtendedCopyParamListHeader; + +/** + * \brief Identification descriptor target + * descriptor for the extended copy command + * SPC 3 r23, Section 6.3.6.2 table 56 + */ +typedef struct vmk_ScsiIdDescriptorTargetDescriptor { + /** \brief see above spc section */ + vmk_uint8 descTypeCode; + /** \brief see above spc section */ + vmk_uint8 peripheralDeviceType:5, + /** \brief see above spc section */ + nul:1, + /** \brief see above spc section */ + luIdType:2; + /** \brief see above spc section */ + vmk_uint16 relativeInitiatorPortId; + /** \brief see above spc section */ + vmk_uint8 codeSet :4, + /** \brief see above spc section */ + reserved1 :4; + /** \brief see above spc section */ + vmk_uint8 idType :4, + /** \brief see above spc section */ + association :2, + /** \brief see above spc section */ + reserved2 :2; + /** \brief see above spc section */ + vmk_uint8 reserved3; + /** \brief see above spc section */ + vmk_uint8 idLen; + /** \brief see above spc section */ + vmk_uint8 varLenId[20]; + /** \brief see above spc section */ + vmk_uint8 devTypeSpecParams[4]; +} __attribute__ ((packed,aligned(1))) vmk_ScsiIdDescriptorTargetDescriptor; + + +/** + * \brief Device type specific target descriptor parameters for block + * device types, for the extended copy command + * SPC 3 r23, Section 6.3.6.4 table 58 + */ +typedef struct vmk_ScsiBlockDeviceSpecTargetDescParams { + /** \brief see above spc section */ + vmk_uint8 reserved1:2; + /** \brief see above spc section */ + vmk_uint8 PAD:1; + /** \brief see above spc section */ + vmk_uint8 reserved2:5; + /** \brief see above spc section */ + vmk_uint8 blockSize[3]; +} __attribute__ ((packed,aligned(1))) vmk_ScsiBlockDeviceSpecTargetDescParams; + + +/** + * \brief Block device to block device segment descriptor + * for the extended copy command + * SPC 3 r23, Section 6.3.7.5 table 66 + */ +typedef struct vmk_ScsiBlockToBlockSegmentDescriptor { + /** \brief see above spc section */ + vmk_uint8 descriptorTypeCode; + /** \brief see above spc section */ + vmk_uint8 CAT:1, + /** \brief see above spc section */ + DC:1, + /** \brief see above spc section */ + reserved1:6; + /** \brief see above spc section */ + vmk_uint16 descriptorLength; + /** \brief see above spc section */ + vmk_uint16 srcTargetDescriptorIndex; + /** \brief see above spc section */ + vmk_uint16 dstTargetDescriptorIndex; + /** \brief see above spc section */ + vmk_uint8 reserved2[2]; + /** \brief see above spc section */ + vmk_uint16 numBlocks; + /** \brief see above spc section */ + vmk_uint64 srcLBA; + /** \brief see above spc section */ + vmk_uint64 dstLBA; +} __attribute__ ((packed,aligned(1))) vmk_ScsiBlockToBlockSegmentDescriptor; + +/** + * \brief Format of REQUEST SENSE block. + * SPC 3 r23, Section 6.27 table 170 + */ +typedef struct vmk_ScsiRequestSenseCommand { + /** \brief Operation Code (03h) */ + vmk_uint8 opcode; + /** \brief DESC */ + vmk_uint8 desc:1, + /** \brief Reserved */ + resv1:4, + /** \brief Reserved in SPC3R23, and ignored */ + lun:3; + /** \brief Reserved */ + vmk_uint8 resv2; + /** \brief Reserved */ + vmk_uint8 resv3; + /** \brief Allocation Length */ + vmk_uint8 len; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiRequestSenseCommand; + +/** + * \brief Format of MODE SELECT block. + * SPC 3 r23, Section 6.7 table 94 + */ +typedef struct vmk_ScsiModeSelectCommand { + /** \brief Operation Code (15h) */ + vmk_uint8 opcode; + /** \brief Save Pages */ + vmk_uint8 sp:1, + /** \brief Reserved */ + resv11:3, + /** \brief Page Format */ + pf:1, + /** \brief Actually, reserved */ + lun:3; + /** \brief Reserved */ + vmk_uint8 resv2; + /** \brief Reserved */ + vmk_uint8 resv3; + /** \brief Allocation Length */ + vmk_uint8 len; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiModeSelectCommand; + +/** + * \brief Format of REPORT LUNS block. + * SPC 3 r23, Section 6.21 table 147 + */ +typedef struct vmk_ScsiReportLunsCommand { + /** \brief Operation Code (A0h) */ + vmk_uint8 opcode; + /** \brief Reserved */ + vmk_uint8 resv1; + /** \brief SELECT REPORT */ + vmk_uint8 selectReport; + /** \brief Reserved */ + vmk_uint8 resv2; + /** \brief Reserved */ + vmk_uint8 resv3; + /** \brief Reserved */ + vmk_uint8 resv4; + /** \brief Allocation Length */ + vmk_uint32 len; + /** \brief Reserved */ + vmk_uint8 resv5; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReportLunsCommand; + +/** + * \brief Format of READ CAPACITY 10 byte block. + * SBC 3 r18, Section 5.12.1 table 45 + */ +typedef struct vmk_ScsiReadCap10Command { + /** \brief Operation Code (25h) */ + vmk_uint8 opcode; + /** \brief Obsolete */ + vmk_uint8 obs:1, + resv1:7; + /** \brief Logical Block Address */ + vmk_uint32 lba; + vmk_uint8 resv2; + vmk_uint8 resv3; + /** \brief PMI */ + vmk_uint8 pmi:1, + resv4:7; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadCap10Command; + +/** + * \brief Format of READ CAPACITY 16 byte block. + * SBC 3 r18, Section 5.13.1 table 47 + */ +typedef struct vmk_ScsiReadCap16Command { + /** \brief Operation Code (9eh) */ + vmk_uint8 opcode; + /** \brief Service Action (10h) */ + vmk_uint8 sa:5, + resv1:3; + /** \brief Logical Block Address */ + vmk_uint64 lba; + /** \brief Allocation Length */ + vmk_uint32 len; + vmk_uint8 pmi:1, + resv2:7; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadCap16Command; + +/** + * \brief Format of READ BUFFER block. + * SPC 3 r23, Section 6.15 table 126 + */ +typedef struct vmk_ScsiReadBufferCommand { + /** \brief Operation Code (3Ch) */ + vmk_uint8 opcode; + /** \brief Mode */ + vmk_uint8 mode:5, + /** \brief Reserved */ + resv1:3; + /** \brief BUFFER ID */ + vmk_uint8 bufferId; + /** \brief BUFFER OFFSET - MSB */ + vmk_uint8 msbbo; + /** \brief BUFFER OFFSET - MID */ + vmk_uint8 midbo; + /** \brief BUFFER OFFSET - LSB */ + vmk_uint8 lsbbo; + /** \brief Allocation Length MSB */ + vmk_uint8 msblen; + /** \brief Allocation Length MID */ + vmk_uint8 midlen; + /** \brief Allocation Length LSB */ + vmk_uint8 lsblen; + /** \brief Control */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiReadBufferCommand; + +/** + * \brief WRITE LONG (16) Command + * SBC 2 r16, Secion 5.34 table 73 + */ +typedef struct vmk_ScsiWriteLong16 { + /** \brief Operation Code (9fh) */ + vmk_uint8 opcode; + /** \brief service action (11h) */ + vmk_uint8 serviceAction :5, + /** \brief reserved */ + reserved1 :3; + /** \brief see above sbc section */ + vmk_uint64 lba; + /** \brief see above sbc section */ + vmk_uint8 reserved2[2]; + /** \brief see above sbc section */ + vmk_uint16 transferLength; + /** \brief see above sbc section */ + vmk_uint8 corrct : 1, + reserved3 : 7; + /** \brief see above sbc section */ + vmk_uint8 control; +} VMK_ATTRIBUTE_PACKED vmk_ScsiWriteLong16; + +#endif /* _VMKAPI_SCSI_TYPES_H_ */ +/** @} */ +/** @} */ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware.h new file mode 100644 index 0000000..f555a0c --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright 2009 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * vmkapi_scsi_vmware.h -- + * + * Defines some of the VMware vendor specific SCSI interfaces + * + */ + +#ifndef _VMKAPI_SCSI_VMWARE_H_ +#define _VMKAPI_SCSI_VMWARE_H_ + +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif + +#include "scsi/vmkapi_scsi.h" + +/* + *********************************************************************** + * vmk_ScsiSetATSCmdStatus -- */ /** + * + * \ingroup SCSI + * \brief Set a command's ATS status + * + * On I/O completion, set the command's ATS status. + * + * \param[in] vmkCmd Scsi command whose status to set + * \param[in] miscompare Boolean to indicate whether the command's + * status should be set to + * VMK_SCSI_PLUGIN_ATS_MISCOMPARE + * + * \pre if vmkCmd does not already indicate that the command failed with a + * check condition, this function is a no-op. + * + *********************************************************************** + */ +static inline void +vmk_ScsiSetATSCmdStatus(vmk_ScsiCommand *vmkCmd, vmk_Bool miscompare) +{ + if (vmk_ScsiCmdStatusIsCheck(vmkCmd->status)) { + vmkCmd->status.plugin = miscompare ? VMK_SCSI_PLUGIN_ATS_MISCOMPARE : + VMK_SCSI_PLUGIN_GOOD; + } +} + +#endif //_VMKAPI_SCSI_VMWARE_H_ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware_types.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware_types.h new file mode 100644 index 0000000..2a59005 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/scsi/vmkapi_scsi_vmware_types.h @@ -0,0 +1,136 @@ +/*************************************************************************** + * Copyright 2008 VMware, Inc. All rights reserved. + ***************************************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * vmkapi_scsi_vmware_types.h -- + * + * Defines some of the VMware vendor specific SCSI types + * + */ + +#ifndef _VMKAPI_SCSI_VMWARE_TYPES_H_ +#define _VMKAPI_SCSI_VMWARE_TYPES_H_ + +#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +#error This vmkapi file should never be included directly but only via vmkapi.h +#endif + +#include "base/vmkapi_types.h" +#include "base/vmkapi_const.h" + +struct vmk_ScsiDevice; + +#define VMK_SCSI_VMW_CDB_MAGIC 0xfb +/** + * \brief VMware vendor specific command code. 16-byte CDB with transfer + * direction "unknown". These commands should not make it to the wire. + * They are typically used inside the storage stack to encode directives + * that later need to be trascribed to some hardware-vendor-specific + * CDB. We use an invalid SCSI opcode so that the device server rejects + * the command in case the command mistakenly makes it out to the + * wire. + */ +typedef struct vmk_ScsiVmwareInternal16Cmd { + /** \brief VMK_SCSI_CMD_VENDOR_SPECIFIC_0xFE */ + vmk_uint8 opcode; + /** \brief Magic number VMK_SCSI_VMW_CDB_MAGIC */ + vmk_uint8 magic; +#define VMK_SCSI_VMW_INT_CLONE_BLOCK 0x01 +#define VMK_SCSI_VMW_INT_ATS_BLOCK 0x02 +#define VMK_SCSI_VMW_INT_DELETE_BLOCK 0x03 +#define VMK_SCSI_VMW_INT_ZERO_BLOCK 0x04 + /** + * \brief A high level function that the command data pertains to. + * One of VMK_SCSI_VMW_INT_* values + */ + vmk_uint16 function; + /** \brief Size of arguments and result buffer that follows as command data */ + vmk_uint32 dataLength; + /** + * \brief Offset within the data buffer where results are stored. Valid + * values are from 0 (no arguments) to dataLength (no results) + */ + vmk_uint32 resultStartOffset; + /** \brief Reserved */ + vmk_uint8 reserved[4]; +} __attribute__ ((packed)) vmk_ScsiVmwareInternal16Cmd; + +/* + *********************************************************************** + * vmk_ScsiIsVMwareCdb -- */ /** + * + * \ingroup SCSI + * \brief Check whether the given SCSI CDB is the VMware vendor + * specific CDB. + * + * \param[in] cdb Pointer to a CDB, usually contained in a + vmk_ScsiCommand. + * + * \retval VMK_TRUE Opcode is VMware vendor specfic opcode. + * \retval VMK_FALSE Opcode is not VMware vendor specific opcode. + * + *********************************************************************** + */ +static inline vmk_Bool +vmk_ScsiIsVMwareCdb(const vmk_uint8 *cdb) +{ + vmk_ScsiVmwareInternal16Cmd *vmwScsiCmd; + + vmwScsiCmd = (vmk_ScsiVmwareInternal16Cmd *)cdb; + + return (vmwScsiCmd->opcode == VMK_SCSI_CMD_VENDOR_SPECIFIC_0xFE && + vmwScsiCmd->magic == VMK_SCSI_VMW_CDB_MAGIC); +} + +/** + * \brief VMware vendor specific argument structure for vendor specific + * command code VMK_SCSI_CMD_VENDOR_SPECIFIC_0xFE, function + * VMK_SCSI_VMW_INT_CLONE_BLOCK. This structure encodes a single extent + * clone primitive from source device to destination device. The source + * and destination device block size should match. + */ +typedef struct vmk_ScsiCloneElem { + /** \brief Pointer to source device */ + struct vmk_ScsiDevice *srcDevice; + /** \brief Pointer to destination device */ + struct vmk_ScsiDevice *destDevice; + /** \brief Start offset of source extent */ + vmk_uint64 srcLba; + /** \brief Start offset of destination extent */ + vmk_uint64 destLba; + /** \brief Number of blocks (in device blocksize granularity) to be cloned */ + vmk_uint32 numBlocks; +} vmk_ScsiCloneElem; + +typedef struct vmk_ScsiAtsElem { + /** \brief Start offset of the extent */ + vmk_uint64 lba; + /** \brief Number of blocks (in device blocksize granularity) */ + vmk_uint32 lbc; + /** \brief Pointer to test block of ATS request */ + const vmk_uint8 *testBlock; + /** \brief Pointer to set block of ATS request */ + const vmk_uint8 *setBlock; +} __attribute__ ((packed)) vmk_ScsiAtsElem; + +#define VMK_SCSI_PLUGIN_IOC_VAAI_BASE (0x69616176) +#define VMK_SCSI_PLUGIN_IOC_VAAI_ALIGNMENT (VMK_SCSI_PLUGIN_IOC_VAAI_BASE) +#define VMK_SCSI_PLUGIN_IOC_VAAI_CLONE_PREF (VMK_SCSI_PLUGIN_IOC_VAAI_BASE + 1) + +typedef struct vmk_ScsiPluginIoctlVaaiAlignData { + vmk_uint16 function; + vmk_uint8 reserved[6]; + vmk_uint64 lbaAlignment; + vmk_uint64 lbcAlignment; +} vmk_ScsiPluginIoctlVaaiAlignData; + +typedef struct vmk_ScsiPluginIoctlVaaiClonePrefData { + vmk_Bool useSrcDev; +} vmk_ScsiPluginIoctlVaaiClonePrefData; + +#endif //_VMKAPI_SCSI_VMWARE_TYPES_H_ diff --git a/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/vmkapi.h b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/vmkapi.h new file mode 100644 index 0000000..dfc0945 --- /dev/null +++ b/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/vmkapi.h @@ -0,0 +1,518 @@ +/* ********************************************************** + * Copyright 2004 - 2009 VMware, Inc. All rights reserved. + * **********************************************************/ + +/* + * @VMKAPIMOD_LICENSE@ + */ + +/* + * VMKernel external API + */ + +#ifndef _VMKAPI_H_ +#define _VMKAPI_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/** \cond never */ + +/* + * Basic include checks + */ +#define INCLUDE_ALLOW_VMKERNEL +#define INCLUDE_ALLOW_VMK_MODULE +#define INCLUDE_ALLOW_DISTRIBUTE +#define INCLUDE_ALLOW_MODULE +#define INCLUDE_ALLOW_VMKDRIVERS +#define INCLUDE_ALLOW_VMCORE +#define INCLUDE_ALLOW_VMMEXT +#define INCLUDE_ALLOW_VMNIXMOD +#define INCLUDE_ALLOW_USERLEVEL +#include "includeCheck.h" + +/* + * Determine if we're compiling in user mode or kernel mode + */ +#if defined(USERLEVEL) || !defined(__KERNEL__) +#define VMK_BUILDING_FOR_USER_MODE +#else +#define VMK_BUILDING_FOR_KERNEL_MODE +#endif + +/* + * For certain VMware-internal build environments we must turn + * on all of vmkapi from a single switch. + */ +#ifdef VMK_ENABLE_ALL_VMKAPIS +#if (defined(__VMKERNEL__) || defined(__VMKERNEL_MODULE__)) +#error VMK_ENABLE_ALL_VMKAPIS should not be defined when building for vmkernel. +#endif +#define VMK_DEVKIT_HAS_API_VMKAPI_BASE +#define VMK_DEVKIT_HAS_API_VMKAPI_DEVICE +#define VMK_DEVKIT_HAS_API_VMKAPI_DVFILTER +#define VMK_DEVKIT_HAS_API_VMKAPI_EXECMEM +#define VMK_DEVKIT_HAS_API_VMKAPI_ISCSI +#define VMK_DEVKIT_HAS_API_VMKAPI_ISCSI_NET +#define VMK_DEVKIT_HAS_API_VMKAPI_NET +#define VMK_DEVKIT_HAS_API_VMKAPI_SOCKETS +#define VMK_DEVKIT_HAS_API_VMKAPI_SCSI +#define VMK_DEVKIT_HAS_API_VMKAPI_MPP +#define VMK_DEVKIT_HAS_API_VMKAPI_NMP +#define VMK_DEVKIT_HAS_API_VMKAPI_NPIV +#define VMK_DEVKIT_HAS_API_VMKAPI_VDS +#define VMK_DEVKIT_HAS_API_VMKAPI_EXPERIMENTAL +#define VMK_DEVKIT_USES_PUBLIC_APIS +#define VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS +#define VMK_DEVKIT_USES_PRIVATE_APIS +#define VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS +#define VMK_DEVKIT_IS_DDK +#endif + +/* + * Allow vmkapi headers to be included when pulled in from + * this header only. All other cases should cause an error. + * + * This should NEVER be used anywhere but this header! + */ +#define VMK_HEADER_INCLUDED_FROM_VMKAPI_H + +/** \endcond never */ + +/* + *********************************************************************** + * Devkit-based Header Inclusions. + *********************************************************************** + */ + +/* + * Base + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_BASE + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if (defined(VMK_BUILDING_FOR_KERNEL_MODE) || \ + defined(VMK_BUILDING_FOR_USER_MODE)) +#include "base/vmkapi_const.h" +#include "base/vmkapi_status.h" +#include "base/vmkapi_types.h" +#endif + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "base/vmkapi_accounting.h" +#include "base/vmkapi_assert.h" +#include "base/vmkapi_atomic.h" +#include "base/vmkapi_bits.h" +#include "base/vmkapi_char.h" +#include "base/vmkapi_compiler.h" +#include "base/vmkapi_config.h" +#include "base/vmkapi_cslist.h" +#include "base/vmkapi_heap.h" +#include "base/vmkapi_helper.h" +#include "base/vmkapi_libc.h" +#include "base/vmkapi_list.h" +#include "base/vmkapi_lock.h" +#include "base/vmkapi_logging.h" +#include "base/vmkapi_memory.h" +#include "base/vmkapi_mempool.h" +#include "base/vmkapi_module.h" +#include "base/vmkapi_platform.h" +#include "base/vmkapi_revision.h" +#include "base/vmkapi_scatter_gather.h" +#include "base/vmkapi_sem.h" +#include "base/vmkapi_slab.h" +#include "base/vmkapi_slist.h" +#include "base/vmkapi_stress.h" +#include "base/vmkapi_system.h" +#include "base/vmkapi_time.h" +#include "base/vmkapi_util.h" +#include "base/vmkapi_world.h" +#include "base/vmkapi_parse.h" +#include "base/vmkapi_worldlet_types.h" +#endif + +/* + * Headers which will shortly become binary-incompatible but which must + * remain compatible because they are leaked through the DDK. + */ +#if defined(VMK_DEVKIT_IS_DDK) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "base/vmkapi_context.h" +#endif + +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "base/vmkapi_bottom_half.h" +#include "base/vmkapi_worldlet.h" +#include "base/vmkapi_entropy.h" +#include "base/vmkapi_proc.h" +#include "base/vmkapi_module_incompat.h" +#include "base/vmkapi_platform_incompat.h" +#endif + +#endif + +#endif + + +/* + * Device + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_DEVICE + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "device/vmkapi_device.h" +#include "device/vmkapi_pci.h" +#include "device/vmkapi_vector.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "device/vmkapi_acpi.h" +#include "device/vmkapi_isa.h" +#include "device/vmkapi_input.h" +#endif + +#endif + +#endif + +/* + * DVFilter + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_DVFILTER + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "dvfilter/vmkapi_dvfilter.h" +#endif + +#endif + +#endif + +/* + * VDS + * NOTE: The following vDS interfaces have version 1_1_0_0. + * They are *not* compatible with version 1_0_0_0. + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_VDS + +#if defined(VMK_DEVKIT_USES_PRIVATE_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + + +#if (defined(VMK_BUILDING_FOR_KERNEL_MODE) || \ + defined(VMK_BUILDING_FOR_USER_MODE)) +#include "vds/vmkapi_vds_respools.h" +#include "vds/vmkapi_vds_prop.h" +#endif + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "vds/vmkapi_vds_ether.h" +#include "vds/vmkapi_vds_portset.h" +#include "vds/vmkapi_vds_uplink.h" +#include "vds/vmkapi_vds_pkt.h" +#endif + +#endif + +#endif + +/* + * Net + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_NET + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "net/vmkapi_net_types.h" +#include "net/vmkapi_net_pkt.h" +#include "net/vmkapi_net_pktlist.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "net/vmkapi_net_netqueue.h" +#include "net/vmkapi_net_pt.h" +#include "net/vmkapi_net_uplink.h" +#include "net/vmkapi_net_debug.h" +#include "net/vmkapi_net_pkt_incompat.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PRIVATE_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if (defined(VMK_BUILDING_FOR_KERNEL_MODE) || \ + defined(VMK_BUILDING_FOR_USER_MODE)) +#include "net/vmkapi_net_overlay_ext.h" +#endif + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "net/vmkapi_net_vswitch.h" +#include "net/vmkapi_net_overlay.h" +#include "net/vmkapi_net_uplink_types.h" +#endif + +#endif + +#endif + +/* + * iSCSI Transport APIs + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_ISCSI + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "iscsi/vmkapi_iscsi_transport_compat.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "iscsi/vmkapi_iscsi_transport_incompat.h" +#endif + +#endif + +#endif + +/* + * Sockets + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_SOCKETS + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "sockets/vmkapi_socket.h" +#include "sockets/vmkapi_socket_ip.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "sockets/vmkapi_socket_priv.h" +#include "sockets/vmkapi_socket_ip6.h" +#include "sockets/vmkapi_socket_vmklink.h" +#endif + +#endif + +#endif + +/* + * SCSI + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_SCSI + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) || \ + defined(VMK_BUILDING_FOR_USER_MODE) +#include "scsi/vmkapi_scsi_ext.h" +#endif + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "scsi/vmkapi_scsi.h" +#include "scsi/vmkapi_scsi_mgmt_types.h" +#include "scsi/vmkapi_scsi_device.h" +#include "scsi/vmkapi_scsi_vmware.h" +#endif + +#endif + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "scsi/vmkapi_scsi_incompat.h" +#include "scsi/vmkapi_scsi_vmware_types.h" +#endif + +#endif + +#endif + +/* + * MPP + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_MPP + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "mpp/vmkapi_mpp.h" +#endif + +#endif + +#endif + +/* + * NMP + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_NMP + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "nmp/vmkapi_nmp.h" +#include "nmp/vmkapi_nmp_psp.h" +#include "nmp/vmkapi_nmp_satp.h" +#endif + +#endif + +#endif + +/* + * NPIV + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_NPIV + +#if defined(VMK_DEVKIT_USES_PUBLIC_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if (defined(VMK_BUILDING_FOR_KERNEL_MODE) || \ + defined(VMK_BUILDING_FOR_USER_MODE)) +#include "npiv/vmkapi_npiv_wwn.h" +#endif + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "npiv/vmkapi_npiv.h" +#endif + +#endif + +#endif + +/* + * Execmem + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_EXECMEM + +#if defined(VMK_DEVKIT_USES_PRIVATE_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "execmem/vmkapi_execmem.h" +#endif + +#endif + +#endif + +/* + * Experimental + */ +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_EXPERIMENTAL + +#if defined(VMK_DEVKIT_USES_PRIVATE_APIS) && \ + defined(VMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS) + +#if defined(VMK_BUILDING_FOR_KERNEL_MODE) +#include "experimental/base/vmkapi_world_exp.h" +#endif + +#endif + +#endif + +/* + *********************************************************************** + * "Top Level" documentation groups. + * + * These are documentation groups that don't necessarily have a single + * file that they can logically reside in. Most doc groups can simply + * be defined in a specific header. + * + *********************************************************************** + */ + +#if defined(VMK_DEVKIT_HAS_API_VMKAPI_SCSI) || \ + defined(VMK_DEVKIT_HAS_API_VMKAPI_MPP) || \ + defined(VMK_DEVKIT_HAS_API_VMKAPI_NMP) || \ + defined(VMK_DEVKIT_HAS_API_VMKAPI_NPIV) +/** + * \defgroup Storage Storage + * \{ \} + */ +#endif + +#ifdef VMK_DEVKIT_HAS_API_VMKAPI_NET +/** + * \defgroup Network Network + * \{ \} + */ +#endif + +/* + *********************************************************************** + * API Version information. + *********************************************************************** + */ +/** \cond never */ +#define VMKAPI_REVISION_MAJOR 1 +#define VMKAPI_REVISION_MINOR 1 +#define VMKAPI_REVISION_UPDATE 0 +#define VMKAPI_REVISION_PATCH_LEVEL 0 + +#define VMKAPI_REVISION VMK_REVISION_NUMBER(VMKAPI) +/** \endcond never */ + +/* + * Don't allow vmkapis to be included outside of vmkapi.h + * + * Don't include any further vmkapi headers in this file after this point. + */ +/** \cond never */ +#undef VMK_HEADER_INCLUDED_FROM_VMKAPI_H +/** \endcond never */ + +#if defined(__cplusplus) +} +#endif + +#endif /* _VMKAPI_H_ */ diff --git a/BLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release/includeCheck.h b/BLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release/includeCheck.h new file mode 100644 index 0000000..60cb567 --- /dev/null +++ b/BLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release/includeCheck.h @@ -0,0 +1,118 @@ +/* ********************************************************** + * Copyright 1998-2012 VMware, Inc. All rights reserved. -- VMware Confidential + * **********************************************************/ + +/* + * includeCheck.h -- + * + * Restrict include file use. + * + * In every .h file, define one or more of these + * + * INCLUDE_ALLOW_VMX + * INCLUDE_ALLOW_USERLEVEL + * INCLUDE_ALLOW_VMMEXT + * INCLUDE_ALLOW_VMCORE + * INCLUDE_ALLOW_MODULE + * INCLUDE_ALLOW_VMNIXMOD + * INCLUDE_ALLOW_VMKERNEL + * INCLUDE_ALLOW_DISTRIBUTE + * INCLUDE_ALLOW_VMK_MODULE + * INCLUDE_ALLOW_VMKDRIVERS + * INCLUDE_ALLOW_VMIROM + * + * Then include this file. + * + * Any file that has INCLUDE_ALLOW_DISTRIBUTE defined will potentially + * be distributed in source form along with GPLed code. Ensure + * that this is acceptable. + */ + + +/* + * Declare a VMCORE-only variable to help classify object + * files. The variable goes in the common block and does + * not create multiple definition link-time conflicts. + */ + +#if defined VMCORE && defined VMX86_DEVEL && defined VMX86_DEBUG && \ + defined linux && !defined MODULE && \ + !defined COMPILED_WITH_VMCORE +#define COMPILED_WITH_VMCORE compiled_with_vmcore +#ifdef ASM + .comm compiled_with_vmcore, 0 +#else + asm(".comm compiled_with_vmcore, 0"); +#endif /* ASM */ +#endif + + +#if defined VMCORE && \ + !(defined VMX86_VMX || defined VMM || \ + defined MONITOR_APP || defined VMMON) +#error "Makefile problem: VMCORE without VMX86_VMX or \ + VMM or MONITOR_APP or MODULE." +#endif + +#if defined VMCORE && !defined INCLUDE_ALLOW_VMCORE +#error "The surrounding include file is not allowed in vmcore." +#endif +#undef INCLUDE_ALLOW_VMCORE + +#if defined VMX86_VMX && !defined VMCORE && \ + !(defined INCLUDE_ALLOW_VMX || defined INCLUDE_ALLOW_USERLEVEL) +#error "The surrounding include file is not allowed in the VMX." +#endif +#undef INCLUDE_ALLOW_VMX + +#if defined USERLEVEL && !defined VMX86_VMX && !defined VMCORE && \ + !defined INCLUDE_ALLOW_USERLEVEL +#error "The surrounding include file is not allowed at userlevel." +#endif +#undef INCLUDE_ALLOW_USERLEVEL + +#if defined VMM && !defined VMCORE && \ + !defined INCLUDE_ALLOW_VMMEXT +#error "The surrounding include file is not allowed in the monitor." +#endif +#undef INCLUDE_ALLOW_VMMEXT + +#if defined MODULE && !defined VMKERNEL_MODULE && !defined VMNIXMOD && \ + !defined VMMON && !defined INCLUDE_ALLOW_MODULE +#error "The surrounding include file is not allowed in driver modules." +#endif +#undef INCLUDE_ALLOW_MODULE + +#if defined VMMON && !defined INCLUDE_ALLOW_VMMON +#error "The surrounding include file is not allowed in vmmon." +#endif +#undef INCLUDE_ALLOW_VMMON + +#if defined VMKERNEL && !defined INCLUDE_ALLOW_VMKERNEL +#error "The surrounding include file is not allowed in the vmkernel." +#endif +#undef INCLUDE_ALLOW_VMKERNEL + +#if defined GPLED_CODE && !defined INCLUDE_ALLOW_DISTRIBUTE +#error "The surrounding include file is not allowed in GPL code." +#endif +#undef INCLUDE_ALLOW_DISTRIBUTE + +#if defined VMKERNEL_MODULE && !defined VMKERNEL && \ + !defined INCLUDE_ALLOW_VMK_MODULE && !defined INCLUDE_ALLOW_VMKDRIVERS +#error "The surrounding include file is not allowed in vmkernel modules." +#endif +#undef INCLUDE_ALLOW_VMK_MODULE +#undef INCLUDE_ALLOW_VMKDRIVERS + +#if defined VMNIXMOD && !defined INCLUDE_ALLOW_VMNIXMOD +#ifndef VMNIXMOD_VM +#error "The surrounding include file is not allowed in vmnixmod." +#endif +#endif +#undef INCLUDE_ALLOW_VMNIXMOD + +#if defined VMIROM && ! defined INCLUDE_ALLOW_VMIROM +#error "The surrounding include file is not allowed in vmirom." +#endif +#undef INCLUDE_ALLOW_VMIROM diff --git a/BLD/build/version/buildNumber.h b/BLD/build/version/buildNumber.h new file mode 100644 index 0000000..0f90f80 --- /dev/null +++ b/BLD/build/version/buildNumber.h @@ -0,0 +1,5 @@ +#define BUILD_NUMBER "build-800380" +#define BUILD_NUMBER_NUMERIC 800380 +#define PRODUCT_BUILD_NUMBER "product-build-50249" +#define PRODUCT_BUILD_NUMBER_NUMERIC 50249 +#define PRODUCT_BUILD_NUMBER_NUMERIC_STRING "50249" diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..c641a77 --- /dev/null +++ b/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/README b/README new file mode 100644 index 0000000..496283e --- /dev/null +++ b/README @@ -0,0 +1,20 @@ +This package contains the source code for the drivers +that are included in the VMware ESX server product. + +To build the drivers, execute the 'build-vmkdrivers.sh' +script. + +The following program versions should be used to compile +the drivers: + + gcc version 4.1.2 + ld from binutils-2.17.50.0.15-1 + GNU grep 2.5.1 + GNU sed 4.5.1 + GNU xargs 4.2.27 + mkdir from GNU coreutils 5.97 + +Unless explicitly stated otherwise, all of the files in +this package are distributed under the GNU General +Public License - see the accompanying COPYING file for +more details. diff --git a/bora/vmkernel/distribute/push-hidden.h b/bora/vmkernel/distribute/push-hidden.h new file mode 100644 index 0000000..b3ceb07 --- /dev/null +++ b/bora/vmkernel/distribute/push-hidden.h @@ -0,0 +1,14 @@ +/* ********************************************************** + * Copyright 2008 VMware, Inc. All rights reserved. -- VMware Confidential + * **********************************************************/ + +/* + * GCC program to ensure nothing shows up in GOT/PLT + */ + +#ifndef _PUSH_HIDDEN_H +#define _PUSH_HIDDEN_H + +#pragma GCC visibility push(hidden) + +#endif diff --git a/build-vmkdrivers.sh b/build-vmkdrivers.sh new file mode 100755 index 0000000..65d279a --- /dev/null +++ b/build-vmkdrivers.sh @@ -0,0 +1,489 @@ +#!/bin/sh + +# Use gcc version 4.1.2-9 +CC=gcc +# Use ld from binutils-2.17.50.0.15-modcall +LD=ld +# Use GNU grep 2.5.1 +GREP=grep +# Use GNU sed 4.5.1 +SED=sed +# Use GNU xargs 4.2.27 +XARGS=xargs +# Use mkdir from GNU coreutils 5.97 +MKDIR=mkdir + +# Create output directories +$GREP -v -e "SED" build-vmkdrivers.sh \ +| $GREP -o -e "-o [^ ]*\." \ +| $SED -e 's?-o \(.*\)/[^/]*\.?\1?' \ +| $GREP -v -e "\*" \ +| $XARGS $MKDIR -p + +# Compiler flags assume being compiled natively on a x86-64 machine + +$CC -DASSEMBLY -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/thunk.o vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/thunk.S +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ahci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ahci -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ahci -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ahci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ahci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ahci -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ahci -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ahci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/ahci.o vmkdrivers/src_v4/drivers/ata/ahci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ata_piix\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ata_piix -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ata_piix -DLINUX_MODULE_VERSION=\"2.00ac6.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ata_piix-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ata_piix\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ata_piix -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ata_piix -DLINUX_MODULE_VERSION=\"2.00ac6.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ata_piix-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/ata_piix.o vmkdrivers/src_v4/drivers/ata/ata_piix.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-core.o vmkdrivers/src_v4/drivers/ata/libata-core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-eh.o vmkdrivers/src_v4/drivers/ata/libata-eh.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-scsi.o vmkdrivers/src_v4/drivers/ata/libata-scsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-sff.o vmkdrivers/src_v4/drivers/ata/libata-sff.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"libata\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_libata -DLINUX_MODULE_VERSION=\"2.00.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-vmklnx.o vmkdrivers/src_v4/drivers/ata/libata-vmklnx.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_amd\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_amd -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_amd -DLINUX_MODULE_VERSION=\"0.2.4.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_amd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_amd\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_amd -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_amd -DLINUX_MODULE_VERSION=\"0.2.4.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_amd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_amd.o vmkdrivers/src_v4/drivers/ata/pata_amd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_atiixp\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_atiixp -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_atiixp -DLINUX_MODULE_VERSION=\"0.4.3.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_atiixp-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_atiixp\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_atiixp -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_atiixp -DLINUX_MODULE_VERSION=\"0.4.3.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_atiixp-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_atiixp.o vmkdrivers/src_v4/drivers/ata/pata_atiixp.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_cmd64x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_cmd64x -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_cmd64x -DLINUX_MODULE_VERSION=\"0.2.1.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_cmd64x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_cmd64x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_cmd64x -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_cmd64x -DLINUX_MODULE_VERSION=\"0.2.1.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_cmd64x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_cmd64x.o vmkdrivers/src_v4/drivers/ata/pata_cmd64x.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_hpt3x2n\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_hpt3x2n -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_hpt3x2n -DLINUX_MODULE_VERSION=\"0.3.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_hpt3x2n-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_hpt3x2n\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_hpt3x2n -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_hpt3x2n -DLINUX_MODULE_VERSION=\"0.3.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_hpt3x2n-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_hpt3x2n.o vmkdrivers/src_v4/drivers/ata/pata_hpt3x2n.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_pdc2027x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_pdc2027x -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_pdc2027x -DLINUX_MODULE_VERSION=\"0.74ac5.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_pdc2027x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_pdc2027x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_pdc2027x -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_pdc2027x -DLINUX_MODULE_VERSION=\"0.74ac5.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_pdc2027x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_pdc2027x.o vmkdrivers/src_v4/drivers/ata/pata_pdc2027x.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_serverworks\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_serverworks -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_serverworks -DLINUX_MODULE_VERSION=\"0.3.7.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_serverworks-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_serverworks\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_serverworks -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_serverworks -DLINUX_MODULE_VERSION=\"0.3.7.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_serverworks-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_serverworks.o vmkdrivers/src_v4/drivers/ata/pata_serverworks.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_sil680\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_sil680 -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_sil680 -DLINUX_MODULE_VERSION=\"0.3.2.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_sil680-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_sil680\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_sil680 -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_sil680 -DLINUX_MODULE_VERSION=\"0.3.2.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_sil680-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_sil680.o vmkdrivers/src_v4/drivers/ata/pata_sil680.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_via\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_via -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_via -DLINUX_MODULE_VERSION=\"0.1.14.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_via-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"pata_via\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_pata_via -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_pata_via -DLINUX_MODULE_VERSION=\"0.1.14.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-pata_via-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_via.o vmkdrivers/src_v4/drivers/ata/pata_via.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2100_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2100_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2200_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2200_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2300_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2300_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2322_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2322_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2400_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2400_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2500_fw.o vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2500_fw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_attr.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_attr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_dbg.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_dbg.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_gs.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_gs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_inioct.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_inioct.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_init.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_iocb.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_iocb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_isr.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_isr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mbx.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mbx.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mid.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mid.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_os.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_os.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_sup.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_sup.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_xioct.o vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_xioct.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla2xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla2xxx -DLINUX_MODULE_VERSION=\"831.k1.27vmw.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla2xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_nv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_nv -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_nv -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_nv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_nv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_nv -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_nv -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_nv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_nv.o vmkdrivers/src_v4/drivers/ata/sata_nv.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_promise\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_promise -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_promise -DLINUX_MODULE_VERSION=\"1.04.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_promise-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_promise\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_promise -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_promise -DLINUX_MODULE_VERSION=\"1.04.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_promise-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_promise.o vmkdrivers/src_v4/drivers/ata/sata_promise.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_sil\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_sil -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_sil -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_sil-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_sil\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_sil -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_sil -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_sil-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_sil.o vmkdrivers/src_v4/drivers/ata/sata_sil.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_svw\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_svw -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_svw -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_svw-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"sata_svw\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_sata_svw -DLINUX_MODULE_HEAP_INITIAL=1*1024*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_sata_svw -DLINUX_MODULE_VERSION=\"2.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/ata -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-sata_svw-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_svw.o vmkdrivers/src_v4/drivers/ata/sata_svw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_discover.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_discover.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_hwi.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_hwi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_ioctl.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_osm.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_osm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_sata.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_sata.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_seq.o vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_seq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"adp94xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=3*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_adp94xx -DLINUX_MODULE_VERSION=\"1.0.8.12.1\" -DMODULE -DSCSI_DRIVER -DSEQUENCER_UPDATE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/adp94xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptsas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptsas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptsas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptsas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptsas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptsas -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=1 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptsas/mptsas.o vmkdrivers/src_current/drivers/scsi/mpt/mptsas/mptsas.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptspi\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptspi\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptspi\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.o vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptspi\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=0 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FUSION_LOGGING -DCPQ_CIM -DCPU=x86-64 -DDEBUG_STUB -DDIAG_BUFFER_SUPPORT -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mptspi\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mptspi -DLINUX_MODULE_VERSION=\"4.21.00.01.1\" -DLP6000 -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSE_THIS_MODULE_VERSION=1 -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt/mptcommon -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -Ivmkdrivers/src_current/drivers/scsi/mpt/mptsas -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptspi/mptspi.o vmkdrivers/src_current/drivers/scsi/mpt/mptspi/mptspi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_base.o vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_base.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_config.o vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_config.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_ctl.o vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_ctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_scsih.o vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_scsih.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_transport.o vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_transport.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_SCSI_MPT2SAS_LOGGING -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"mpt2sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_mpt2sas -DLINUX_MODULE_VERSION=\"04.255.03.00.1\" -DMODULE -DSAS_TRANSPORT_SUPPORT -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/mpt2sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"cdc_ether\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cdc_ether -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_cdc_ether -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/net -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cdc_ether-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/cdc_ether.o vmkdrivers/src_current/drivers/usb/net/cdc_ether.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"cdc_ether\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cdc_ether -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_cdc_ether -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/net -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cdc_ether-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usbnet\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/net -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/mii.o vmkdrivers/src_current/drivers/usb/net/mii.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usbnet\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/net -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/usbnet.o vmkdrivers/src_current/drivers/usb/net/usbnet.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usbnet\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usbnet -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/net -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=16384*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.9.36b.v45.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMWARE_ESX_DDK_VERSION=41000 -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2/bnx2.o vmkdrivers/src_current/drivers/net/bnx2/bnx2.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=16384*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.9.36b.v45.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMWARE_ESX_DDK_VERSION=41000 -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel/pci-nommu.o vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel/pci-nommu.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-partial.o vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-partial.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-wrappers.o vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-wrappers.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/bus.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/bus.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/class.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/class.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/core.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/dd.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/dd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/devres.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/devres.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/driver.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/driver.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/init.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/map.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/map.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/platform.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/platform.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/sys.o vmkdrivers/src_v4/vmklinux26/linux/drivers/base/sys.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/consolemap.o vmkdrivers/src_v4/vmklinux26/linux/drivers/char/consolemap.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/defkeymap.o vmkdrivers/src_v4/vmklinux26/linux/drivers/char/defkeymap.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/keyboard.o vmkdrivers/src_v4/vmklinux26/linux/drivers/char/keyboard.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/firmware/dmi_scan.o vmkdrivers/src_v4/vmklinux26/linux/drivers/firmware/dmi_scan.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-core.o vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-input.o vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-input.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/ff-core.o vmkdrivers/src_v4/vmklinux26/linux/drivers/input/ff-core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/input.o vmkdrivers/src_v4/vmklinux26/linux/drivers/input/input.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/mousedev.o vmkdrivers/src_v4/vmklinux26/linux/drivers/input/mousedev.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/constants.o vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/constants.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/scsi_error.o vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/scsi_error.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/fs/seq_file.o vmkdrivers/src_v4/vmklinux26/linux/fs/seq_file.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/kernel/softirq.o vmkdrivers/src_v4/vmklinux26/linux/kernel/softirq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/kernel/wait.o vmkdrivers/src_v4/vmklinux26/linux/kernel/wait.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/hweight.o vmkdrivers/src_v4/vmklinux26/linux/lib/hweight.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/idr.o vmkdrivers/src_v4/vmklinux26/linux/lib/idr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/klist.o vmkdrivers/src_v4/vmklinux26/linux/lib/klist.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/kobject.o vmkdrivers/src_v4/vmklinux26/linux/lib/kobject.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/kref.o vmkdrivers/src_v4/vmklinux26/linux/lib/kref.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/semaphore-sleepers.o vmkdrivers/src_v4/vmklinux26/linux/lib/semaphore-sleepers.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/sort.o vmkdrivers/src_v4/vmklinux26/linux/lib/sort.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/string.o vmkdrivers/src_v4/vmklinux26/linux/lib/string.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/vsprintf.o vmkdrivers/src_v4/vmklinux26/linux/lib/vsprintf.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inffast.o vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inffast.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate.o vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate_syms.o vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate_syms.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inftrees.o vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inftrees.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/infutil.o vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/infutil.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/mm/mempool.o vmkdrivers/src_v4/vmklinux26/linux/mm/mempool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/ethtool.o vmkdrivers/src_v4/vmklinux26/linux/net/ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/inet_lro.o vmkdrivers/src_v4/vmklinux26/linux/net/inet_lro.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/skbuff.o vmkdrivers/src_v4/vmklinux26/linux/net/skbuff.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/msi.o vmkdrivers/src_v4/vmklinux26/linux/pci/msi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/pci.o vmkdrivers/src_v4/vmklinux26/linux/pci/pci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/proc.o vmkdrivers/src_v4/vmklinux26/linux/pci/proc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/search.o vmkdrivers/src_v4/vmklinux26/linux/pci/search.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/scsi/scsi_proc.o vmkdrivers/src_v4/vmklinux26/linux/scsi/scsi_proc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_bincomp.o vmkdrivers/src_v4/vmklinux26/vmware/linux_bincomp.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_block.o vmkdrivers/src_v4/vmklinux26/vmware/linux_block.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_char.o vmkdrivers/src_v4/vmklinux26/vmware/linux_char.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_ctype.o vmkdrivers/src_v4/vmklinux26/vmware/linux_ctype.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_dma.o vmkdrivers/src_v4/vmklinux26/vmware/linux_dma.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_exports.o vmkdrivers/src_v4/vmklinux26/vmware/linux_exports.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_heap.o vmkdrivers/src_v4/vmklinux26/vmware/linux_heap.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_input.o vmkdrivers/src_v4/vmklinux26/vmware/linux_input.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_ioat.o vmkdrivers/src_v4/vmklinux26/vmware/linux_ioat.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_kthread.o vmkdrivers/src_v4/vmklinux26/vmware/linux_kthread.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_net.o vmkdrivers/src_v4/vmklinux26/vmware/linux_net.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_notifier.o vmkdrivers/src_v4/vmklinux26/vmware/linux_notifier.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_pci.o vmkdrivers/src_v4/vmklinux26/vmware/linux_pci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_proc.o vmkdrivers/src_v4/vmklinux26/vmware/linux_proc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_rcu.o vmkdrivers/src_v4/vmklinux26/vmware/linux_rcu.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_lld_if.o vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_lld_if.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi.o vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_transport.o vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_transport.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_vmk_if.o vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_vmk_if.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_signal.o vmkdrivers/src_v4/vmklinux26/vmware/linux_signal.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_stress.o vmkdrivers/src_v4/vmklinux26/vmware/linux_stress.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_stubs.o vmkdrivers/src_v4/vmklinux26/vmware/linux_stubs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_task.o vmkdrivers/src_v4/vmklinux26/vmware/linux_task.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_time.o vmkdrivers/src_v4/vmklinux26/vmware/linux_time.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_usb.o vmkdrivers/src_v4/vmklinux26/vmware/linux_usb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_waitqueue.o vmkdrivers/src_v4/vmklinux26/vmware/linux_waitqueue.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"vmklinux\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklinux -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklinux -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=7*1024*1024 -DLINUX_MODULE_VERSION=\"4.1.0\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLINUX -DVMKLINUX_MODULE_HEAP_ANY_MEM -DVMKLINUX_MODULE_HEAP_PHYS_ANY_CONTIGUITY -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_MPP -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_NPIV -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/vmklinux26/vmware -Ivmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/linux -Ivmkdrivers/src_v4/include/vmklinux26 -Ivmkdrivers/src_v4/vmklinux26/linux/drivers/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_workqueue.o vmkdrivers/src_v4/vmklinux26/vmware/linux_workqueue.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ehci-hcd\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ehci_hcd -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ehci_hcd -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/ehci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ehci-hcd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/ehci/ehci-hcd.o vmkdrivers/src_current/drivers/usb/host/ehci/ehci-hcd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ehci-hcd\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ehci_hcd -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ehci_hcd -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/ehci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ehci-hcd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"hid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=512*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_VERSION=\"2.6.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/input -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-core.o vmkdrivers/src_current/drivers/usb/input/hid-core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"hid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=512*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_VERSION=\"2.6.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/input -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-ff.o vmkdrivers/src_current/drivers/usb/input/hid-ff.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"hid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=512*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_VERSION=\"2.6.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/input -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-quirks.o vmkdrivers/src_current/drivers/usb/input/hid-quirks.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"hid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=512*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hid -DLINUX_MODULE_VERSION=\"2.6.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/input -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ips\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ips -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=10*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ips -DLINUX_MODULE_VERSION=\"7.12.06.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/ips -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ips-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/ips/ips.o vmkdrivers/src_current/drivers/scsi/ips/ips.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"ips\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ips -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=10*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ips -DLINUX_MODULE_VERSION=\"7.12.06.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/ips -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ips-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_attr.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_attr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth_access.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth_access.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ct.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ct.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debugfs.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debugfs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debug_ioctl.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debug_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_els.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_els.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbaapi_ioctl.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbaapi_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbadisc.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbadisc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_init.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ioctl.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mbox.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mbox.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mem.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mem.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_menlo.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_menlo.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_nportdisc.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_nportdisc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_scsi.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_scsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_security.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_security.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_sli.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_sli.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_vport.o vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_vport.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"lpfc820\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=45*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_lpfc820 -DLINUX_MODULE_VERSION=\"8.2.1.30.1\" -DMODULE -DNETLINK_FCTRANSPORT=19 -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/lpfc820 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/buffer.o vmkdrivers/src_current/drivers/usb/core/buffer.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/config.o vmkdrivers/src_current/drivers/usb/core/config.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/devices.o vmkdrivers/src_current/drivers/usb/core/devices.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/devio.o vmkdrivers/src_current/drivers/usb/core/devio.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/driver.o vmkdrivers/src_current/drivers/usb/core/driver.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/generic.o vmkdrivers/src_current/drivers/usb/core/generic.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hcd.o vmkdrivers/src_current/drivers/usb/core/hcd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hcd-pci.o vmkdrivers/src_current/drivers/usb/core/hcd-pci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hub.o vmkdrivers/src_current/drivers/usb/core/hub.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/message.o vmkdrivers/src_current/drivers/usb/core/message.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/notify.o vmkdrivers/src_current/drivers/usb/core/notify.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/passthrough.o vmkdrivers/src_current/drivers/usb/core/passthrough.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/pci-quirks.o vmkdrivers/src_current/drivers/usb/core/pci-quirks.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/quirks.o vmkdrivers/src_current/drivers/usb/core/quirks.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/urb.o vmkdrivers/src_current/drivers/usb/core/urb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/usb.o vmkdrivers/src_current/drivers/usb/core/usb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=8*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/core -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-ohci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_ohci -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_ohci -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/ohci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-ohci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/ohci/ohci-hcd.o vmkdrivers/src_current/drivers/usb/host/ohci/ohci-hcd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-ohci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_ohci -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_ohci -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/ohci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-ohci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/debug.o vmkdrivers/src_current/drivers/usb/storage/debug.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/initializers.o vmkdrivers/src_current/drivers/usb/storage/initializers.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/protocol.o vmkdrivers/src_current/drivers/usb/storage/protocol.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/scsiglue.o vmkdrivers/src_current/drivers/usb/storage/scsiglue.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/transport.o vmkdrivers/src_current/drivers/usb/storage/transport.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/usb.o vmkdrivers/src_current/drivers/usb/storage/usb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-storage\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_storage -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/storage -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-uhci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_uhci -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_uhci -DLINUX_MODULE_VERSION=\"3.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/uhci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-uhci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/uhci/uhci-hcd.o vmkdrivers/src_current/drivers/usb/host/uhci/uhci-hcd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"usb-uhci\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_usb_uhci -DLINUX_MODULE_HEAP_INITIAL=256*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_usb_uhci -DLINUX_MODULE_VERSION=\"3.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DUSB_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/usb/host/uhci -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/usb/core -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-usb-uhci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/crc32_le.o vmkdrivers/src_current/drivers/scsi/fnic/crc32_le.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/crc32_le_tab.o vmkdrivers/src_current/drivers/scsi/fnic/crc32_le_tab.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_disc_targ.o vmkdrivers/src_current/drivers/scsi/fnic/fc_disc_targ.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_exch.o vmkdrivers/src_current/drivers/scsi/fnic/fc_exch.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_frame.o vmkdrivers/src_current/drivers/scsi/fnic/fc_frame.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_local_port.o vmkdrivers/src_current/drivers/scsi/fnic/fc_local_port.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_port.o vmkdrivers/src_current/drivers/scsi/fnic/fc_port.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_print.o vmkdrivers/src_current/drivers/scsi/fnic/fc_print.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_remote_port.o vmkdrivers/src_current/drivers/scsi/fnic/fc_remote_port.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_attr.o vmkdrivers/src_current/drivers/scsi/fnic/fcs_attr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_cmd.o vmkdrivers/src_current/drivers/scsi/fnic/fcs_cmd.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_sess.o vmkdrivers/src_current/drivers/scsi/fnic/fc_sess.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_event.o vmkdrivers/src_current/drivers/scsi/fnic/fcs_event.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_state.o vmkdrivers/src_current/drivers/scsi/fnic/fcs_state.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_virt_fab.o vmkdrivers/src_current/drivers/scsi/fnic/fc_virt_fab.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_fcs.o vmkdrivers/src_current/drivers/scsi/fnic/fnic_fcs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_isr.o vmkdrivers/src_current/drivers/scsi/fnic/fnic_isr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_main.o vmkdrivers/src_current/drivers/scsi/fnic/fnic_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_res.o vmkdrivers/src_current/drivers/scsi/fnic/fnic_res.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_scsi.o vmkdrivers/src_current/drivers/scsi/fnic/fnic_scsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_attr.o vmkdrivers/src_current/drivers/scsi/fnic/openfc_attr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_if.o vmkdrivers/src_current/drivers/scsi/fnic/openfc_if.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_ioctl.o vmkdrivers/src_current/drivers/scsi/fnic/openfc_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_pkt.o vmkdrivers/src_current/drivers/scsi/fnic/openfc_pkt.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_scsi.o vmkdrivers/src_current/drivers/scsi/fnic/openfc_scsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_assert.o vmkdrivers/src_current/drivers/scsi/fnic/sa_assert.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_cons_linux.o vmkdrivers/src_current/drivers/scsi/fnic/sa_cons_linux.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_event.o vmkdrivers/src_current/drivers/scsi/fnic/sa_event.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_hash_kern.o vmkdrivers/src_current/drivers/scsi/fnic/sa_hash_kern.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_log.o vmkdrivers/src_current/drivers/scsi/fnic/sa_log.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_state.o vmkdrivers/src_current/drivers/scsi/fnic/sa_state.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_timer.o vmkdrivers/src_current/drivers/scsi/fnic/sa_timer.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_cq.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_cq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_dev.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_dev.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_intr.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_intr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_rq.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_rq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq_copy.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq_copy.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq.o vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wall -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_ASSERTS -DDEBUG_STUB -DEXPORT_SYMTAB -DFCOE_T11_AUG07 -DGPLED_CODE -DKBUILD_MODNAME=\"fnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_fnic -DLINUX_MODULE_VERSION=\"1.1.0.113.1\" -DMODULE -DOPENFC_LIB -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/fnic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82540.o vmkdrivers/src_current/drivers/net/e1000/e1000_82540.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82541.o vmkdrivers/src_current/drivers/net/e1000/e1000_82541.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82542.o vmkdrivers/src_current/drivers/net/e1000/e1000_82542.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82543.o vmkdrivers/src_current/drivers/net/e1000/e1000_82543.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_api.o vmkdrivers/src_current/drivers/net/e1000/e1000_api.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_ethtool.o vmkdrivers/src_current/drivers/net/e1000/e1000_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_mac.o vmkdrivers/src_current/drivers/net/e1000/e1000_mac.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_main.o vmkdrivers/src_current/drivers/net/e1000/e1000_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_manage.o vmkdrivers/src_current/drivers/net/e1000/e1000_manage.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_nvm.o vmkdrivers/src_current/drivers/net/e1000/e1000_nvm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_param.o vmkdrivers/src_current/drivers/net/e1000/e1000_param.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_phy.o vmkdrivers/src_current/drivers/net/e1000/e1000_phy.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/kcompat_ethtool.o vmkdrivers/src_current/drivers/net/e1000/kcompat_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/kcompat.o vmkdrivers/src_current/drivers/net/e1000/kcompat.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_E1000_DISABLE_PACKET_SPLIT -DCONFIG_E1000_NAPI -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000 -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"8.0.3.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_80003es2lan.o vmkdrivers/src_current/drivers/net/e1000e/e1000_80003es2lan.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_82571.o vmkdrivers/src_current/drivers/net/e1000e/e1000_82571.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_ich8lan.o vmkdrivers/src_current/drivers/net/e1000e/e1000_ich8lan.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_mac.o vmkdrivers/src_current/drivers/net/e1000e/e1000_mac.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_manage.o vmkdrivers/src_current/drivers/net/e1000e/e1000_manage.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_nvm.o vmkdrivers/src_current/drivers/net/e1000e/e1000_nvm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_phy.o vmkdrivers/src_current/drivers/net/e1000e/e1000_phy.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/ethtool.o vmkdrivers/src_current/drivers/net/e1000e/ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/kcompat_ethtool.o vmkdrivers/src_current/drivers/net/e1000e/kcompat_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/kcompat.o vmkdrivers/src_current/drivers/net/e1000e/kcompat.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/netdev.o vmkdrivers/src_current/drivers/net/e1000e/netdev.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/param.o vmkdrivers/src_current/drivers/net/e1000e/param.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_E1000E -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"e1000e\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_e1000e -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.4.1.7.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/e1000e -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/niu.o vmkdrivers/src_current/drivers/net/nx_nic/niu.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nxhal.o vmkdrivers/src_current/drivers/net/nx_nic/nxhal.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nxhal_v34.o vmkdrivers/src_current/drivers/net/nx_nic/nxhal_v34.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_hash_table.o vmkdrivers/src_current/drivers/net/nx_nic/nx_hash_table.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_mem_pool.o vmkdrivers/src_current/drivers/net/nx_nic/nx_mem_pool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_nic_vmk.o vmkdrivers/src_current/drivers/net/nx_nic/nx_nic_vmk.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_pexq.o vmkdrivers/src_current/drivers/net/nx_nic/nx_pexq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_ethtool.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_hw.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_hw.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_init.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_lro.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_lro.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_main.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_procfs.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_procfs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_snmp.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_snmp.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_tool.o vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_tool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/xge_mdio.o vmkdrivers/src_current/drivers/net/nx_nic/xge_mdio.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"nx_nic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=32*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_nx_nic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"4.0.550.1\" -DMODULE -DNET_DRIVER -DPEGNET_NIC -DSMP_CAPABLE_VMK_DRIVER -DUNM_CONF_OS=UNM_CONF_LINUX -DUNM_CONF_PROCESSOR=UNM_CONF_X86 -DUNM_HAL_NATIVE -DUNM_X_HARDWARE=UNM_X_ASIC -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/nx_nic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -Ivmkdrivers/src_current/drivers/net/nx_nic/include -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_core.o vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_core.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm.o vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm_pci.o vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm_pci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_pci.o vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_pci.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_proc.o vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_proc.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Werror -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"aic79xx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_HEAP_INITIAL=128*1024 -DLINUX_MODULE_HEAP_MAX=360*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_aic79xx -DLINUX_MODULE_VERSION=\"3.2.0.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aic79xx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_msghandler\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_msghandler -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_msghandler -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_msghandler-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_msghandler\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_msghandler -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_msghandler -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_msghandler-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_devintf\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_devintf -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_devintf -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_devintf-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_devintf\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_devintf -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_devintf -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_devintf-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_si_drv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/char/openipmi/includes -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_si_drv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/char/openipmi/includes -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_si_drv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/char/openipmi/includes -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_si_drv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/char/openipmi/includes -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.o vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DHP_G6_SUPPORT -DKBUILD_MODNAME=\"ipmi_si_drv\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_ipmi_si_drv -DLINUX_MODULE_VERSION=\"39.2.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_current/drivers/char/openipmi/includes -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FORCEDETH_NAPI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"forcedeth\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_forcedeth -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_forcedeth -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.61.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/forcedeth -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-forcedeth-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/forcedeth/forcedeth.o vmkdrivers/src_current/drivers/net/forcedeth/forcedeth.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_FORCEDETH_NAPI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"forcedeth\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_forcedeth -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_forcedeth -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"0.61.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/forcedeth -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-forcedeth-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_82575.o vmkdrivers/src_current/drivers/net/igb/e1000_82575.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_api.o vmkdrivers/src_current/drivers/net/igb/e1000_api.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_mac.o vmkdrivers/src_current/drivers/net/igb/e1000_mac.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_manage.o vmkdrivers/src_current/drivers/net/igb/e1000_manage.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_nvm.o vmkdrivers/src_current/drivers/net/igb/e1000_nvm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_phy.o vmkdrivers/src_current/drivers/net/igb/e1000_phy.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_ethtool.o vmkdrivers/src_current/drivers/net/igb/igb_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_main.o vmkdrivers/src_current/drivers/net/igb/igb_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_param.o vmkdrivers/src_current/drivers/net/igb/igb_param.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/kcompat_ethtool.o vmkdrivers/src_current/drivers/net/igb/kcompat_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/kcompat.o vmkdrivers/src_current/drivers/net/igb/kcompat.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_IGB_DISABLE_PACKET_SPLIT -DCPU=x86-64 -DDEBUG_STUB -DDRIVER_IGB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"igb\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_HEAP_INITIAL=100*1024 -DLINUX_MODULE_HEAP_MAX=4*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_igb -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.3.19.12.2\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/igb -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_HEAP_INITIAL=4096*1024 -DLINUX_MODULE_HEAP_MAX=8192*8192 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.48.113.v45.7.rc2.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMWARE_ESX_DDK_VERSION=41000 -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2x -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_link.o vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_link.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_HEAP_INITIAL=4096*1024 -DLINUX_MODULE_HEAP_MAX=8192*8192 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.48.113.v45.7.rc2.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMWARE_ESX_DDK_VERSION=41000 -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2x -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_main.o vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2x\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_HEAP_INITIAL=4096*1024 -DLINUX_MODULE_HEAP_MAX=8192*8192 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2x -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.48.113.v45.7.rc2.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMWARE_ESX_DDK_VERSION=41000 -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2x -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_main.o vmkdrivers/src_current/drivers/net/enic/enic_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_res.o vmkdrivers/src_current/drivers/net/enic/enic_res.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_upt.o vmkdrivers/src_current/drivers/net/enic/enic_upt.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_cq.o vmkdrivers/src_current/drivers/net/enic/vnic_cq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_dev.o vmkdrivers/src_current/drivers/net/enic/vnic_dev.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_intr.o vmkdrivers/src_current/drivers/net/enic/vnic_intr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_rq.o vmkdrivers/src_current/drivers/net/enic/vnic_rq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_wq.o vmkdrivers/src_current/drivers/net/enic/vnic_wq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"enic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=4*1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_enic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.1.0.157.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_BINARY_INCOMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/enic -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"tg3\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_tg3 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_tg3 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"3.86.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/tg3 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-tg3-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/tg3/tg3.o vmkdrivers/src_current/drivers/net/tg3/tg3.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"tg3\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_tg3 -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_tg3 -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"3.86.0.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/tg3 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-tg3-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"cnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cnic -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=16*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_cnic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.9.7d.rc2.3.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2/cnic.o vmkdrivers/src_current/drivers/net/bnx2/cnic.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"cnic\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cnic -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=16*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_cnic -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"1.9.7d.rc2.3.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/bnx2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/aachba.o vmkdrivers/src_current/drivers/scsi/aacraid2/aachba.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/commctrl.o vmkdrivers/src_current/drivers/scsi/aacraid2/commctrl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/comminit.o vmkdrivers/src_current/drivers/scsi/aacraid2/comminit.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/commsup.o vmkdrivers/src_current/drivers/scsi/aacraid2/commsup.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/csmi.o vmkdrivers/src_current/drivers/scsi/aacraid2/csmi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/dpcsup.o vmkdrivers/src_current/drivers/scsi/aacraid2/dpcsup.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/linit.o vmkdrivers/src_current/drivers/scsi/aacraid2/linit.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/nark.o vmkdrivers/src_current/drivers/scsi/aacraid2/nark.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/rkt.o vmkdrivers/src_current/drivers/scsi/aacraid2/rkt.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/rx.o vmkdrivers/src_current/drivers/scsi/aacraid2/rx.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/sa.o vmkdrivers/src_current/drivers/scsi/aacraid2/sa.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"aacraid\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_aacraid -DLINUX_MODULE_VERSION=\"4.1.1.5.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/aacraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid2\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid2 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid2 -DLINUX_MODULE_VERSION=\"2.00.4.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid2/megaraid.o vmkdrivers/src_current/drivers/scsi/megaraid2/megaraid.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid2\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid2 -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid2 -DLINUX_MODULE_VERSION=\"2.00.4.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid2 -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid_mbox\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_VERSION=\"2.20.5.1.4\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mbox.o vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mbox.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid_mbox\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_VERSION=\"2.20.5.1.4\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mm.o vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mm.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid_mbox\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid_mbox -DLINUX_MODULE_VERSION=\"2.20.5.1.4\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid_sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid_sas -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid_sas -DLINUX_MODULE_VERSION=\"4.0.14.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid_sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid_sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid_sas/megaraid_sas.o vmkdrivers/src_current/drivers/scsi/megaraid_sas/megaraid_sas.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"megaraid_sas\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_megaraid_sas -DLINUX_MODULE_HEAP_INITIAL=8*1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_megaraid_sas -DLINUX_MODULE_VERSION=\"4.0.14.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/megaraid_sas -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-megaraid_sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2i\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=64*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_VERSION=\"1.8.11t5.rc2.8.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/bnx2i -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_hwi.o vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_hwi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2i\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=64*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_VERSION=\"1.8.11t5.rc2.8.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/bnx2i -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_init.o vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2i\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=64*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_VERSION=\"1.8.11t5.rc2.8.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/bnx2i -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_iscsi.o vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_iscsi.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2i\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=64*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_VERSION=\"1.8.11t5.rc2.8.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/bnx2i -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_sysfs.o vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_sysfs.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"bnx2i\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=64*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_bnx2i -DLINUX_MODULE_VERSION=\"1.8.11t5.rc2.8.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/bnx2i -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"hpsa\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hpsa -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=30*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hpsa -DLINUX_MODULE_VERSION=\"3.6.14.45\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/hpsa -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hpsa-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/hpsa/hpsa.o vmkdrivers/src_current/drivers/scsi/hpsa/hpsa.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DGPLED_CODE -DKBUILD_MODNAME=\"hpsa\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_hpsa -DLINUX_MODULE_HEAP_INITIAL=2*1024*1024 -DLINUX_MODULE_HEAP_MAX=30*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_hpsa -DLINUX_MODULE_VERSION=\"3.6.14.45\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMKLNX_VMKSGARRAY_SUPPORTED -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/hpsa -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-hpsa-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wno-sign-compare -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"random\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_random -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_random -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/random -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/halfmd4.o vmkdrivers/src_current/drivers/char/random/halfmd4.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wno-sign-compare -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"random\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_random -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_random -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/random -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/random.o vmkdrivers/src_current/drivers/char/random/random.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wno-sign-compare -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"random\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_random -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_random -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/random -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/sha1.o vmkdrivers/src_current/drivers/char/random/sha1.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -Wno-error -Wno-sign-compare -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCHAR_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"random\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_random -DLINUX_MODULE_HEAP_INITIAL=1024*1024 -DLINUX_MODULE_HEAP_MAX=20*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_random -DLINUX_MODULE_VERSION=\"1.0.0.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/char/random -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DBLOCK_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"cciss\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cciss -DLINUX_MODULE_HEAP_INITIAL=1024*256 -DLINUX_MODULE_HEAP_MAX=1024*1024*10 -DLINUX_MODULE_HEAP_NAME=vmklnx_cciss -DLINUX_MODULE_VERSION=\"3.6.14.10.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/block/cciss -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/block -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cciss-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/block/cciss/cciss.o vmkdrivers/src_current/drivers/block/cciss/cciss.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DBLOCK_DRIVER -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"cciss\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_cciss -DLINUX_MODULE_HEAP_INITIAL=1024*256 -DLINUX_MODULE_HEAP_MAX=1024*1024*10 -DLINUX_MODULE_HEAP_NAME=vmklnx_cciss -DLINUX_MODULE_VERSION=\"3.6.14.10.1\" -DMODULE -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/block/cciss -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/block -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-cciss-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82598.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82598.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82599.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82599.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_api.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_api.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_common.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_common.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_ethtool.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_main.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_main.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_param.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_param.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_phy.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_phy.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_vmdq.o vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_vmdq.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/kcompat_ethtool.o vmkdrivers/src_v4/drivers/net/ixgbe/kcompat_ethtool.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_INET_LRO -DCONFIG_IXGBE_MQ -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PCI_MSI -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DDISABLE_PACKET_SPLIT -DDRIVER_IXGBE -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DIXGBE_MQ -DIXGBE_NO_TX_NAPI -DIXGBE_VMDQ -DKBUILD_MODNAME=\"ixgbe\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_HEAP_INITIAL=1024*100 -DLINUX_MODULE_HEAP_MAX=1024*4096 -DLINUX_MODULE_HEAP_NAME=vmklnx_ixgbe -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.0.38.2.5.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_v4/drivers/net/ixgbe -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/kcompat.o vmkdrivers/src_v4/drivers/net/ixgbe/kcompat.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"s2io\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_s2io -DLINUX_MODULE_HEAP_INITIAL=10*1024*1024 -DLINUX_MODULE_HEAP_MAX=40*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_s2io -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.1.4.13427.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/s2io -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-s2io-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/s2io/s2io.o vmkdrivers/src_current/drivers/net/s2io/s2io.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCONFIG_NETDEVICES_MULTIQUEUE -DCONFIG_PROC_FS -DCPU=x86-64 -DDEBUG_STUB -DESX3_NETWORKING_NOT_DONE_YET -DGPLED_CODE -DKBUILD_MODNAME=\"s2io\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_s2io -DLINUX_MODULE_HEAP_INITIAL=10*1024*1024 -DLINUX_MODULE_HEAP_MAX=40*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_s2io -DLINUX_MODULE_SKB_HEAP -DLINUX_MODULE_SKB_HEAP_INITIAL=512*1024 -DLINUX_MODULE_SKB_HEAP_MAX=22*1024*1024 -DLINUX_MODULE_VERSION=\"2.1.4.13427.1\" -DMODULE -DNET_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__USE_COMPAT_LAYER_2_6_18_PLUS__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/net/s2io -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/drivers/net -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-s2io-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_dbg.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_dbg.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dbg.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dbg.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dump.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dump.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_ioctl.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_ioctl.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_os.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_os.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_init.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_init.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_iocb.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_iocb.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_isr.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_isr.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_mbx.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_mbx.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_nvram.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_nvram.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_os.o vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_os.c +$CC -fno-working-directory -gdwarf-2 -g3 -O2 -fno-strict-aliasing -Wall -Werror -Wstrict-prototypes -fPIE -falign-functions=4 -falign-jumps=4 -falign-loops=4 -ffreestanding -fno-common -fno-omit-frame-pointer -fno-strength-reduce -march=x86-64 -mcmodel=small -minline-all-stringops -mno-red-zone -nostartfiles -nostdlib -w -Wno-error -Wdeclaration-after-statement -Wno-unused-value -Wno-pointer-sign -Wno-strict-prototypes -Wno-declaration-after-statement -DCONFIG_COMPAT -DCPU=x86-64 -DDEBUG_STUB -DEXPORT_SYMTAB -DGPLED_CODE -DKBUILD_MODNAME=\"qla4xxx\" -DLINUX_MODULE_AUX_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_HEAP_INITIAL=4*1024*1024 -DLINUX_MODULE_HEAP_MAX=35*1024*1024 -DLINUX_MODULE_HEAP_NAME=vmklnx_qla4xxx -DLINUX_MODULE_VERSION=\"5.01.03.1\" -DMODULE -DSCSI_DRIVER -DSMP_CAPABLE_VMK_DRIVER -DVMKERNEL_MODULE -DVMK_DEVKIT_HAS_API_VMKAPI_BASE -DVMK_DEVKIT_HAS_API_VMKAPI_DEVICE -DVMK_DEVKIT_HAS_API_VMKAPI_ISCSI -DVMK_DEVKIT_HAS_API_VMKAPI_NET -DVMK_DEVKIT_HAS_API_VMKAPI_SCSI -DVMK_DEVKIT_IS_DDK -DVMK_DEVKIT_USES_BINARY_COMPATIBLE_APIS -DVMK_DEVKIT_USES_PUBLIC_APIS -DVMNIX -DVMX86_RELEASE -DVMX86_SERVER -DVMX86_VPROBES -D_LINUX -D__COMPAT_LAYER_2_6_18_PLUS__ -D__KERNEL__ -D__VMKERNEL_MODULE__ -D__VMKERNEL__ -D__VMKLNX__ -D__VMK_GCC_BUG_ALIGNMENT_PADDING__ -D__VMWARE__ -Ivmkdrivers/src_current/drivers/scsi/qla4xxx -IBLD/build/version -IBLD/build/HEADERS/vmkapi-current/vmkernel64/release -Ivmkdrivers/src_v4/include -Ivmkdrivers/src_v4/include/vmklinux26 -IBLD/build/HEADERS/KLnext-vmkdrivers-asm-x64/vmkernel64/release -IBLD/build/HEADERS/vmkdrivers-vmkernel/vmkernel64/release -Ivmkdrivers/src_v4/include/scsi/drivers -Ivmkdrivers/src_v4/include/scsi -include bora/vmkernel/distribute/push-hidden.h -include vmkdrivers/src_v4/include/linux/autoconf.h -c -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o vmkdrivers/src_v4/common/vmklinux_module.c + +$LD -r -o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/aacraid.o --whole-archive BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/aachba.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/commctrl.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/comminit.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/commsup.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/csmi.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/dpcsup.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/rkt.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/rx.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/linit.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/sa.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aacraid2/nark.o BLD/build/vmkdriver-aacraid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/adp94xx.o --whole-archive BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_discover.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_osm.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_hwi.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_seq.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_ioctl.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/adp94xx/adp94xx_sata.o BLD/build/vmkdriver-adp94xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ahci-KLnext/release/vmkernel64/ahci.o --whole-archive BLD/build/vmkdriver-ahci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/ahci.o BLD/build/vmkdriver-ahci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/aic79xx.o --whole-archive BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_core.o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm.o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_osm_pci.o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_pci.o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/aic79xx/aic79xx_proc.o BLD/build/vmkdriver-aic79xx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ata_piix-KLnext/release/vmkernel64/ata_piix.o --whole-archive BLD/build/vmkdriver-ata_piix-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/ata_piix.o BLD/build/vmkdriver-ata_piix-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/bnx2i.o --whole-archive BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_init.o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_iscsi.o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_hwi.o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/bnx2i/bnx2i_sysfs.o BLD/build/vmkdriver-bnx2i-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-bnx2-KLnext/release/vmkernel64/bnx2.o --whole-archive BLD/build/vmkdriver-bnx2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2/bnx2.o BLD/build/vmkdriver-bnx2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/bnx2x.o --whole-archive BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_main.o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2x/bnx2x_link.o BLD/build/vmkdriver-bnx2x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-cciss-KLnext/release/vmkernel64/cciss.o --whole-archive BLD/build/vmkdriver-cciss-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/block/cciss/cciss.o BLD/build/vmkdriver-cciss-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-cdc_ether-KLnext/release/vmkernel64/cdc_ether.o --whole-archive BLD/build/vmkdriver-cdc_ether-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/cdc_ether.o BLD/build/vmkdriver-cdc_ether-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-cnic-KLnext/release/vmkernel64/cnic.o --whole-archive BLD/build/vmkdriver-cnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/bnx2/cnic.o BLD/build/vmkdriver-cnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/e1000e.o --whole-archive BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_80003es2lan.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_82571.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_ich8lan.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_mac.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_manage.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_nvm.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/e1000_phy.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/ethtool.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/kcompat.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/kcompat_ethtool.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/netdev.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000e/param.o BLD/build/vmkdriver-e1000e-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/e1000.o --whole-archive BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82540.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82541.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82542.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_82543.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_api.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_ethtool.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_mac.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_main.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_manage.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_nvm.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_param.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/e1000_phy.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/kcompat.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/e1000/kcompat_ethtool.o BLD/build/vmkdriver-e1000-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ehci-hcd-KLnext/release/vmkernel64/ehci-hcd.o --whole-archive BLD/build/vmkdriver-ehci-hcd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/ehci/ehci-hcd.o BLD/build/vmkdriver-ehci-hcd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/enic.o --whole-archive BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_upt.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_main.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/enic_res.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_dev.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_wq.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_rq.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_cq.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/enic/vnic_intr.o BLD/build/vmkdriver-enic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/fnic.o --whole-archive BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_main.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_res.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_dev.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_rq.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_cq.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_fcs.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_scsi.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fnic_isr.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_intr.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/vnic_wq_copy.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_scsi.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_pkt.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_if.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_attr.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/openfc_ioctl.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_attr.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_cmd.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_event.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fcs_state.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_exch.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_disc_targ.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_frame.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_local_port.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_print.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_remote_port.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_sess.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_virt_fab.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/fc_port.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_assert.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_cons_linux.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_event.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_hash_kern.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_log.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_state.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/sa_timer.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/crc32_le.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/fnic/crc32_le_tab.o BLD/build/vmkdriver-fnic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-forcedeth-KLnext/release/vmkernel64/forcedeth.o --whole-archive BLD/build/vmkdriver-forcedeth-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/forcedeth/forcedeth.o BLD/build/vmkdriver-forcedeth-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/hid.o --whole-archive BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-core.o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-ff.o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/input/hid-quirks.o BLD/build/vmkdriver-hid-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-hpsa-KLnext/release/vmkernel64/hpsa.o --whole-archive BLD/build/vmkdriver-hpsa-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/hpsa/hpsa.o BLD/build/vmkdriver-hpsa-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/igb.o --whole-archive BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_82575.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_api.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_mac.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_manage.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_nvm.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/e1000_phy.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_ethtool.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_main.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/igb_param.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/kcompat.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/igb/kcompat_ethtool.o BLD/build/vmkdriver-igb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ipmi_devintf-KLnext/release/vmkernel64/ipmi_devintf.o --whole-archive BLD/build/vmkdriver-ipmi_devintf-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.o BLD/build/vmkdriver-ipmi_devintf-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ipmi_msghandler-KLnext/release/vmkernel64/ipmi_msghandler.o --whole-archive BLD/build/vmkdriver-ipmi_msghandler-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.o BLD/build/vmkdriver-ipmi_msghandler-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/ipmi_si_drv.o --whole-archive BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.o BLD/build/vmkdriver-ipmi_si_drv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ips-KLnext/release/vmkernel64/ips.o --whole-archive BLD/build/vmkdriver-ips-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/ips/ips.o BLD/build/vmkdriver-ips-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/ixgbe.o --whole-archive BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82598.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_82599.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_api.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_common.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_ethtool.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_main.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_vmdq.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_param.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/ixgbe_phy.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/kcompat.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/net/ixgbe/kcompat_ethtool.o BLD/build/vmkdriver-ixgbe-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/libata.o --whole-archive BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-core.o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-eh.o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-scsi.o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-sff.o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/libata-vmklnx.o BLD/build/vmkdriver-libata-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/lpfc820.o --whole-archive BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_attr.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth_access.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_auth.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ct.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debugfs.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_els.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbadisc.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_init.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_ioctl.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mbox.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_mem.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_nportdisc.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_scsi.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_security.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_sli.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_vport.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_menlo.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_debug_ioctl.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/lpfc820/lpfc_hbaapi_ioctl.o BLD/build/vmkdriver-lpfc820-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-megaraid2-KLnext/release/vmkernel64/megaraid2.o --whole-archive BLD/build/vmkdriver-megaraid2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid2/megaraid.o BLD/build/vmkdriver-megaraid2-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/megaraid_mbox.o --whole-archive BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mm.o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid/megaraid_mbox.o BLD/build/vmkdriver-megaraid_mbox-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-megaraid_sas-KLnext/release/vmkernel64/megaraid_sas.o --whole-archive BLD/build/vmkdriver-megaraid_sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/megaraid_sas/megaraid_sas.o BLD/build/vmkdriver-megaraid_sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/mpt2sas.o --whole-archive BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_base.o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_config.o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_ctl.o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_scsih.o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt2sas/mpt2sas_transport.o BLD/build/vmkdriver-mpt2sas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/mptsas.o --whole-archive BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptsas/mptsas.o BLD/build/vmkdriver-mptsas-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/mptspi.o --whole-archive BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptbase.o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptctl.o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptcommon/mptscsih.o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/mpt/mptspi/mptspi.o BLD/build/vmkdriver-mptspi-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/nx_nic.o --whole-archive BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_hw.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_main.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_init.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_ethtool.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_lro.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_procfs.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_snmp.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/unm_nic_tool.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_nic_vmk.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nxhal.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nxhal_v34.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_mem_pool.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_hash_table.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/xge_mdio.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/niu.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/nx_nic/nx_pexq.o BLD/build/vmkdriver-nx_nic-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_amd-KLnext/release/vmkernel64/pata_amd.o --whole-archive BLD/build/vmkdriver-pata_amd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_amd.o BLD/build/vmkdriver-pata_amd-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_atiixp-KLnext/release/vmkernel64/pata_atiixp.o --whole-archive BLD/build/vmkdriver-pata_atiixp-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_atiixp.o BLD/build/vmkdriver-pata_atiixp-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_cmd64x-KLnext/release/vmkernel64/pata_cmd64x.o --whole-archive BLD/build/vmkdriver-pata_cmd64x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_cmd64x.o BLD/build/vmkdriver-pata_cmd64x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_hpt3x2n-KLnext/release/vmkernel64/pata_hpt3x2n.o --whole-archive BLD/build/vmkdriver-pata_hpt3x2n-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_hpt3x2n.o BLD/build/vmkdriver-pata_hpt3x2n-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_pdc2027x-KLnext/release/vmkernel64/pata_pdc2027x.o --whole-archive BLD/build/vmkdriver-pata_pdc2027x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_pdc2027x.o BLD/build/vmkdriver-pata_pdc2027x-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_serverworks-KLnext/release/vmkernel64/pata_serverworks.o --whole-archive BLD/build/vmkdriver-pata_serverworks-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_serverworks.o BLD/build/vmkdriver-pata_serverworks-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_sil680-KLnext/release/vmkernel64/pata_sil680.o --whole-archive BLD/build/vmkdriver-pata_sil680-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_sil680.o BLD/build/vmkdriver-pata_sil680-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-pata_via-KLnext/release/vmkernel64/pata_via.o --whole-archive BLD/build/vmkdriver-pata_via-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/pata_via.o BLD/build/vmkdriver-pata_via-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/qla2xxx.o --whole-archive BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2100_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2200_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2300_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2322_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2400_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/ql2500_fw.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_attr.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_dbg.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_gs.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_inioct.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_init.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_iocb.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_isr.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mbx.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_mid.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_os.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_sup.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla2xxx/qla_xioct.o BLD/build/vmkdriver-qla2xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/qla4xxx.o --whole-archive BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_dbg.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_init.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_iocb.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_isr.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_mbx.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_nvram.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4_os.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dbg.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_dump.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_ioctl.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/scsi/qla4xxx/ql4im_os.o BLD/build/vmkdriver-qla4xxx-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/random.o --whole-archive BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/random.o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/halfmd4.o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/char/random/sha1.o BLD/build/vmkdriver-random-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-s2io-KLnext/release/vmkernel64/s2io.o --whole-archive BLD/build/vmkdriver-s2io-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/s2io/s2io.o BLD/build/vmkdriver-s2io-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-sata_nv-KLnext/release/vmkernel64/sata_nv.o --whole-archive BLD/build/vmkdriver-sata_nv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_nv.o BLD/build/vmkdriver-sata_nv-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-sata_promise-KLnext/release/vmkernel64/sata_promise.o --whole-archive BLD/build/vmkdriver-sata_promise-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_promise.o BLD/build/vmkdriver-sata_promise-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-sata_sil-KLnext/release/vmkernel64/sata_sil.o --whole-archive BLD/build/vmkdriver-sata_sil-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_sil.o BLD/build/vmkdriver-sata_sil-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-sata_svw-KLnext/release/vmkernel64/sata_svw.o --whole-archive BLD/build/vmkdriver-sata_svw-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/drivers/ata/sata_svw.o BLD/build/vmkdriver-sata_svw-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-tg3-KLnext/release/vmkernel64/tg3.o --whole-archive BLD/build/vmkdriver-tg3-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/net/tg3/tg3.o BLD/build/vmkdriver-tg3-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/usb.o --whole-archive BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hcd-pci.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/buffer.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/config.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/devices.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/devio.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/driver.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/generic.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hcd.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/hub.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/message.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/notify.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/passthrough.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/pci-quirks.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/quirks.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/urb.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/core/usb.o BLD/build/vmkdriver-usb-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/usbnet.o --whole-archive BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/usbnet.o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/net/mii.o BLD/build/vmkdriver-usbnet-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-usb-ohci-KLnext/release/vmkernel64/usb-ohci.o --whole-archive BLD/build/vmkdriver-usb-ohci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/ohci/ohci-hcd.o BLD/build/vmkdriver-usb-ohci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/usb-storage.o --whole-archive BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/scsiglue.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/protocol.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/transport.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/usb.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/initializers.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/storage/debug.o BLD/build/vmkdriver-usb-storage-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-usb-uhci-KLnext/release/vmkernel64/usb-uhci.o --whole-archive BLD/build/vmkdriver-usb-uhci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_current/drivers/usb/host/uhci/uhci-hcd.o BLD/build/vmkdriver-usb-uhci-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o +$LD -r -o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/vmklinux.o --whole-archive BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/kernel/softirq.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/kernel/wait.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/klist.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/kref.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/sort.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/vsprintf.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/kobject.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/string.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/idr.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/hweight.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/semaphore-sleepers.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inftrees.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inffast.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/inflate_syms.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/lib/zlib_inflate/infutil.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/mm/mempool.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/ethtool.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/skbuff.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/net/inet_lro.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/pci.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/search.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/msi.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/pci/proc.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/fs/seq_file.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/scsi/scsi_proc.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/core.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/sys.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/bus.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/dd.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/driver.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/class.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/map.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/init.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/devres.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/base/platform.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/keyboard.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/defkeymap.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/char/consolemap.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/input.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/ff-core.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/input/mousedev.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-core.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/hid/hid-input.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/constants.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/scsi/scsi_error.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/drivers/firmware/dmi_scan.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/kernel/pci-nommu.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-partial.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/csum-wrappers.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/linux/arch/x86_64/lib/thunk.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_block.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_char.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_ctype.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_dma.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_heap.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_ioat.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_net.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_pci.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_proc.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_rcu.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_lld_if.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_transport.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_scsi_vmk_if.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_signal.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_stress.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_stubs.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_task.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_time.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_usb.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_waitqueue.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_workqueue.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_notifier.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_kthread.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_input.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_exports.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/vmklinux26/vmware/linux_bincomp.o BLD/build/vmkdriver-vmklinux-KLnext/release/vmkernel64/SUBDIRS/vmkdrivers/src_v4/common/vmklinux_module.o + +echo "All done" diff --git a/vmkdrivers/src_current/drivers/block/cciss/cciss.c b/vmkdrivers/src_current/drivers/block/cciss/cciss.c new file mode 100644 index 0000000..2c8e213 --- /dev/null +++ b/vmkdrivers/src_current/drivers/block/cciss/cciss.c @@ -0,0 +1,3796 @@ +/* + * Portions Copyright 2008, 2009 VMware, Inc. + */ +/* + * Disk Array driver for HP SA 5xxx and 6xxx Controllers + * Copyright 2000, 2008 Hewlett-Packard Development Company, L.P. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Questions/Comments/Bugfixes to iss_storagedev@hp.com + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin)) +#define DRIVER_NAME "HP CISS Driver (v 3.6.14.10.1-1vmw)" +#define DRIVER_VERSION CCISS_DRIVER_VERSION(3,6,14) + +/* Embedded module documentation macros - see modules.h */ +MODULE_AUTHOR("Hewlett-Packard Company"); +MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 3.6.14.10.1-1vmw"); +MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400" + " SA6i P600 P400 E200 E200i P800 E500"); +MODULE_VERSION("3.6.14.10.1-1vmw"); +MODULE_LICENSE("GPL"); + +#include "cciss_cmd.h" +#include "cciss.h" +#include + +/* define the PCI info for the cards we can control */ +static const struct pci_device_id cciss_pci_device_id[] = { + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISS, 0x0E11, 0x4070}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB, 0x0E11, 0x4080}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB, 0x0E11, 0x4082}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB, 0x0E11, 0x4083}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x409A}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x409B}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x409C}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x409D}, + {PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC, 0x0E11, 0x4091}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSA, 0x103C, 0x3225}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3234}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3235}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3211}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3212}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3213}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3214}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD, 0x103C, 0x3215}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3223}, + {PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC, 0x103C, 0x3237}, + {0,} +}; + +MODULE_DEVICE_TABLE(pci, cciss_pci_device_id); + +/* board_id = Subsystem Device ID & Vendor ID + * product = Marketing Name for the board + * access = Address of the struct of function pointers + * nr_cmds = Number of commands supported by controller + */ + +static struct board_type products[] = { + {0x40700E11, "Smart Array 5300", &SA5_access}, + {0x40800E11, "Smart Array 5i", &SA5B_access}, + {0x40820E11, "Smart Array 532", &SA5B_access}, + {0x40830E11, "Smart Array 5312", &SA5B_access}, + {0x409A0E11, "Smart Array 641", &SA5_access}, + {0x409B0E11, "Smart Array 642", &SA5_access}, + {0x409C0E11, "Smart Array 6400", &SA5_access}, + {0x409D0E11, "Smart Array 6400 EM", &SA5_access}, + {0x40910E11, "Smart Array 6i", &SA5_access}, + {0x3225103C, "Smart Array P600", &SA5_access}, + {0x3234103C, "Smart Array P400", &SA5_access}, + {0x3235103C, "Smart Array P400i", &SA5_access}, + {0x3211103C, "Smart Array E200i", &SA5_access}, + {0x3212103C, "Smart Array E200", &SA5_access}, + {0x3213103C, "Smart Array E200i", &SA5_access}, + {0x3214103C, "Smart Array E200i", &SA5_access}, + {0x3215103C, "Smart Array E200i", &SA5_access}, + {0x3223103C, "Smart Array P800", &SA5_access}, + {0x3237103C, "Smart Array E500", &SA5_access}, +}; + +/* How long to wait (in milliseconds) for board to go into simple mode */ +#define MAX_CONFIG_WAIT 30000 +#define MAX_IOCTL_CONFIG_WAIT 1000 + +/*define how many times we will try a command because of bus resets */ +#define MAX_CMD_RETRIES 3 + +#define READ_AHEAD 1024 +#define MAX_CTLR 32 + +/* Originally cciss driver only supports 8 major numbers */ +#define MAX_CTLR_ORIG 8 + +static ctlr_info_t *hba[MAX_CTLR]; + +static void do_cciss_request(request_queue_t *q); +static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs); +static int cciss_open(struct inode *inode, struct file *filep); +static int cciss_release(struct inode *inode, struct file *filep); +static int cciss_ioctl(struct inode *inode, struct file *filep, + unsigned int cmd, unsigned long arg); +static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); + +static int revalidate_allvol(ctlr_info_t *host); +static int cciss_revalidate(struct gendisk *disk); +static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk); +static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, + int clear_all); + +static void cciss_read_capacity(int ctlr, int logvol, ReadCapdata_struct *buf, + int withirq, unsigned int *total_size, + unsigned int *block_size); +static void cciss_geometry_inquiry(int ctlr, int logvol, int withirq, + unsigned int total_size, + unsigned int block_size, + InquiryData_struct *inq_buff, + drive_info_struct *drv); +static void cciss_getgeometry(int cntl_num); +static void __devinit cciss_interrupt_mode(ctlr_info_t *, struct pci_dev *, + __u32); +static void start_io(ctlr_info_t *h); +static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, + unsigned int use_unit_num, unsigned int log_unit, + __u8 page_code, unsigned char *scsi3addr, int cmd_type); +static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size, + unsigned int use_unit_num, unsigned int log_unit, + __u8 page_code, int cmd_type); + +static void fail_all_cmds(unsigned long ctlr); +static void cciss_shutdown(struct pci_dev *); + +#ifdef CONFIG_PROC_FS +static int cciss_proc_get_info(char *buffer, char **start, off_t offset, + int length, int *eof, void *data); +static void cciss_procinit(int i); +#else +static void cciss_procinit(int i) +{ +} +#endif /* CONFIG_PROC_FS */ + +#ifdef CONFIG_COMPAT +static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg); +#endif + +#if defined (__VMKLNX__) + +static long cciss_char_ioctl(struct inode *inode, struct file *filep, + unsigned int cmd, unsigned long arg); +#ifdef CONFIG_COMPAT +static long cciss_char_compat_ioctl(struct file *f, unsigned cmd, + unsigned long arg); +#endif + +struct _devmajors { + int char_major; + int block_major; + int block_minor; + struct gendisk *bd_disk; +}; + +static struct _devmajors devmajors[MAX_CTLR][NWD]; /* hold the major numbers of the char + and block interfaces; per adapter */ + +/** + * cciss_char_open() + * @inode - unused + * @filep - unused + * + * Routines for the character/ioctl interface to the driver. Find out if this + * is a valid open. + */ +static int +cciss_char_open (struct inode *inode, struct file *filep) +{ + /* + * Only allow superuser to access private ioctl interface + */ + if( !capable(CAP_SYS_ADMIN) ) return -EACCES; + + return 0; +} + +/* + * The File Operations structure for the serial/ioctl interface of the driver + */ +static const struct file_operations cciss_char_fops = { + .owner = THIS_MODULE, + .open = cciss_char_open, + .ioctl = cciss_char_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = cciss_char_compat_ioctl, +#endif +}; + +#endif /* defined(__VMKLNX__) */ + +static struct block_device_operations cciss_fops = { + .owner = THIS_MODULE, + .open = cciss_open, + .release = cciss_release, + .ioctl = cciss_ioctl, + .getgeo = cciss_getgeo, +#ifdef CONFIG_COMPAT + .compat_ioctl = cciss_compat_ioctl, +#endif + .revalidate_disk = cciss_revalidate, +}; + +/* + * Enqueuing and dequeuing functions for cmdlists. + */ +static inline void addQ(CommandList_struct **Qptr, CommandList_struct *c) +{ + if (*Qptr == NULL) { + *Qptr = c; + c->next = c->prev = c; + } else { + c->prev = (*Qptr)->prev; + c->next = (*Qptr); + (*Qptr)->prev->next = c; + (*Qptr)->prev = c; + } +} + +static inline CommandList_struct *removeQ(CommandList_struct **Qptr, + CommandList_struct *c) +{ + if (c && c->next != c) { + if (*Qptr == c) + *Qptr = c->next; + c->prev->next = c->next; + c->next->prev = c->prev; + } else { + *Qptr = NULL; + } + return c; +} + +#include "cciss_scsi.c" /* For SCSI tape support */ + +#ifdef CONFIG_PROC_FS + +/* + * Report information about this controller. + */ +#define ENG_GIG 1000000000 +#define ENG_GIG_FACTOR (ENG_GIG/512) +#define RAID_UNKNOWN 6 +static const char *raid_label[] = { "0", "4", "1(1+0)", "5", "5+1", "ADG", + "UNKNOWN" +}; + +static struct proc_dir_entry *proc_cciss; + +static int cciss_proc_get_info(char *buffer, char **start, off_t offset, + int length, int *eof, void *data) +{ + off_t pos = 0; + off_t len = 0; + int size, i, ctlr; + ctlr_info_t *h = (ctlr_info_t *) data; + drive_info_struct *drv; + unsigned long flags; + sector_t vol_sz, vol_sz_frac; + + ctlr = h->ctlr; + + /* prevent displaying bogus info during configuration + * or deconfiguration of a logical volume + */ + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + if (h->busy_configuring) { + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + return -EBUSY; + } + h->busy_configuring = 1; + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + size = sprintf(buffer, "%s: HP %s Controller\n" + "Board ID: 0x%08lx\n" + "Firmware Version: %c%c%c%c\n" + "IRQ: %d\n" + "Logical drives: %d\n" + "Current Q depth: %d\n" + "Current # commands on controller: %d\n" + "Max Q depth since init: %d\n" + "Max # commands on controller since init: %d\n" + "Max SG entries since init: %d\n\n", + h->devname, + h->product_name, + (unsigned long)h->board_id, + h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], + h->firm_ver[3], (unsigned int)h->intr[SIMPLE_MODE_INT], + h->num_luns, h->Qdepth, h->commands_outstanding, + h->maxQsinceinit, h->max_outstanding, h->maxSG); + + pos += size; + len += size; + cciss_proc_tape_report(ctlr, buffer, &pos, &len); + for (i = 0; i <= h->highest_lun; i++) { + + drv = &h->drv[i]; + if (drv->heads == 0) + continue; + + vol_sz = drv->nr_blocks; + vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR); + vol_sz_frac *= 100; + sector_div(vol_sz_frac, ENG_GIG_FACTOR); + + if (drv->raid_level > 5) + drv->raid_level = RAID_UNKNOWN; + size = sprintf(buffer + len, "cciss/c%dd%d:" + "\t%4u.%02uGB\tRAID %s\n", + ctlr, i, (int)vol_sz, (int)vol_sz_frac, + raid_label[drv->raid_level]); + pos += size; + len += size; + } + + *eof = 1; + *start = buffer + offset; + len -= offset; + if (len > length) + len = length; + h->busy_configuring = 0; + return len; +} + +static int +cciss_proc_write(struct file *file, const char __user *buffer, + unsigned long count, void *data) +{ + unsigned char cmd[80]; + int len; +#ifdef CONFIG_CISS_SCSI_TAPE + ctlr_info_t *h = (ctlr_info_t *) data; + int rc; +#endif + + if (count > sizeof(cmd) - 1) + return -EINVAL; + if (copy_from_user(cmd, buffer, count)) + return -EFAULT; + cmd[count] = '\0'; + len = strlen(cmd); // above 3 lines ensure safety + if (len && cmd[len - 1] == '\n') + cmd[--len] = '\0'; +# ifdef CONFIG_CISS_SCSI_TAPE + if (strcmp("engage scsi", cmd) == 0) { + rc = cciss_engage_scsi(h->ctlr); + if (rc != 0) + return -rc; + return count; + } + /* might be nice to have "disengage" too, but it's not + safely possible. (only 1 module use count, lock issues.) */ +# endif + return -EINVAL; +} + +/* + * Get us a file in /proc/cciss that says something about each controller. + * Create /proc/cciss if it doesn't exist yet. + */ +static void __devinit cciss_procinit(int i) +{ + struct proc_dir_entry *pde; + + if (proc_cciss == NULL) { + proc_cciss = proc_mkdir("cciss", proc_root_driver); + if (!proc_cciss) + return; + } + + pde = create_proc_read_entry(hba[i]->devname, + S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH, + proc_cciss, cciss_proc_get_info, hba[i]); + pde->write_proc = cciss_proc_write; +} +#endif /* CONFIG_PROC_FS */ + +/* + * For operations that cannot sleep, a command block is allocated at init, + * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track + * which ones are free or in use. For operations that can wait for kmalloc + * to possible sleep, this routine can be called with get_from_pool set to 0. + * cmd_free() MUST be called with a got_from_pool set to 0 if cmd_alloc was. + */ +static CommandList_struct *cmd_alloc(ctlr_info_t *h, int get_from_pool) +{ + CommandList_struct *c; + int i; + u64bit temp64; + dma_addr_t cmd_dma_handle, err_dma_handle; + + if (!get_from_pool) { + c = (CommandList_struct *) pci_alloc_consistent(h->pdev, + sizeof(CommandList_struct), &cmd_dma_handle); + if (c == NULL) + return NULL; + memset(c, 0, sizeof(CommandList_struct)); + + c->cmdindex = -1; + + c->err_info = (ErrorInfo_struct *) + pci_alloc_consistent(h->pdev, sizeof(ErrorInfo_struct), + &err_dma_handle); + + if (c->err_info == NULL) { + pci_free_consistent(h->pdev, + sizeof(CommandList_struct), c, cmd_dma_handle); + return NULL; + } + memset(c->err_info, 0, sizeof(ErrorInfo_struct)); + } else { /* get it out of the controllers pool */ + + do { + i = find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds); + if (i == h->nr_cmds) + return NULL; + } while (test_and_set_bit + (i & (BITS_PER_LONG - 1), + h->cmd_pool_bits + (i / BITS_PER_LONG)) != 0); +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss: using command buffer %d\n", i); +#endif + c = h->cmd_pool + i; + memset(c, 0, sizeof(CommandList_struct)); + cmd_dma_handle = h->cmd_pool_dhandle + + i * sizeof(CommandList_struct); + c->err_info = h->errinfo_pool + i; + memset(c->err_info, 0, sizeof(ErrorInfo_struct)); + err_dma_handle = h->errinfo_pool_dhandle + + i * sizeof(ErrorInfo_struct); + h->nr_allocs++; + + c->cmdindex = i; + } + + c->busaddr = (__u32) cmd_dma_handle; + temp64.val = (__u64) err_dma_handle; + c->ErrDesc.Addr.lower = temp64.val32.lower; + c->ErrDesc.Addr.upper = temp64.val32.upper; + c->ErrDesc.Len = sizeof(ErrorInfo_struct); + + c->ctlr = h->ctlr; + return c; +} + +/* + * Frees a command block that was previously allocated with cmd_alloc(). + */ +static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool) +{ + int i; + u64bit temp64; + + if (!got_from_pool) { + temp64.val32.lower = c->ErrDesc.Addr.lower; + temp64.val32.upper = c->ErrDesc.Addr.upper; + pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct), + c->err_info, (dma_addr_t) temp64.val); + pci_free_consistent(h->pdev, sizeof(CommandList_struct), + c, (dma_addr_t) c->busaddr); + } else { + i = c - h->cmd_pool; + clear_bit(i & (BITS_PER_LONG - 1), + h->cmd_pool_bits + (i / BITS_PER_LONG)); + h->nr_frees++; + } +} + +static inline ctlr_info_t *get_host(struct gendisk *disk) +{ + return disk->queue->queuedata; +} + +static inline drive_info_struct *get_drv(struct gendisk *disk) +{ + return disk->private_data; +} + +/* + * Open. Make sure the device is really there. + */ +static int cciss_open(struct inode *inode, struct file *filep) +{ + ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); + drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name); +#endif /* CCISS_DEBUG */ + + if (host->busy_initializing || drv->busy_configuring) + return -EBUSY; + /* + * Root is allowed to open raw volume zero even if it's not configured + * so array config can still work. Root is also allowed to open any + * volume that has a LUN ID, so it can issue IOCTL to reread the + * disk information. I don't think I really like this + * but I'm already using way to many device nodes to claim another one + * for "raw controller". + */ + if (drv->nr_blocks == 0) { + if (iminor(inode) != 0) { /* not node 0? */ + /* if not node 0 make sure it is a partition = 0 */ + if (iminor(inode) & 0x0f) { + return -ENXIO; + /* if it is, make sure we have a LUN ID */ + } else if (drv->LunID == 0) { + return -ENXIO; + } + } + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + } + drv->usage_count++; + host->usage_count++; + return 0; +} + +/* + * Close. Sync first. + */ +static int cciss_release(struct inode *inode, struct file *filep) +{ + ctlr_info_t *host = get_host(inode->i_bdev->bd_disk); + drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk); + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss_release %s\n", + inode->i_bdev->bd_disk->disk_name); +#endif /* CCISS_DEBUG */ + + drv->usage_count--; + host->usage_count--; + return 0; +} + +#if defined (__VMKLNX__) +static long cciss_char_ioctl(struct inode *inode, struct file *f, + unsigned cmd, unsigned long arg) +{ +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "Called with cmd=%x %lx\n", cmd, arg); +#endif + int blkmajor = 0, blkminor = 0, chrmajor = 0; + int i, j; + struct gendisk *bd_disk; + + /* + * for the char device, get the corresponding block device + */ + + chrmajor = MAJOR(inode->i_rdev); + + if ( !chrmajor) { + printk(KERN_WARNING "Invalid Char Device. major: %d", + MAJOR(inode->i_rdev)); + return -ENODEV; + } + + for (i = 0; i < MAX_CTLR; i++) { + for (j = 0; j < NWD; j++) { + if ( devmajors[i][j].char_major == chrmajor ) { + blkmajor = devmajors[i][j].block_major; + blkminor = devmajors[i][j].block_minor; + bd_disk = devmajors[i][j].bd_disk; + } + } + } + + if ( !blkmajor) { + printk(KERN_WARNING "No block device corresponding to this char device: %d\n", + MAJOR(inode->i_rdev)); + return -ENODEV; + } + + /* + * inode->i_bdev and f->f_dentry are used by the driver in the ioctl + * path. + */ + + inode->i_bdev = bdget(MKDEV(blkmajor, blkminor)); + if (!inode->i_bdev->bd_disk) { + inode->i_bdev->bd_disk = bd_disk; + } + + /* + * make the actual ioctl call + */ + + return cciss_ioctl(inode, f, cmd, arg); + +} + +#ifdef CONFIG_COMPAT +static long cciss_char_compat_ioctl(struct file *f, unsigned cmd, + unsigned long arg) +{ +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "Called with cmd=%x %lx\n", cmd, arg); +#endif + int blkmajor = 0, blkminor = 0, chrmajor = 0; + //struct dentry d_entry; + struct inode* inode = f->f_dentry->d_inode; + int i, j; + struct gendisk *bd_disk; + + /* + * for the char device, get the corresponding block device + */ + + chrmajor = MAJOR(inode->i_rdev); + + if ( !chrmajor) { + printk(KERN_WARNING "Invalid Char Device. major: %d", + MAJOR(inode->i_rdev)); + return -ENODEV; + } + + for (i = 0; i < MAX_CTLR; i++) { + for (j = 0; j < NWD; j++) { + if ( devmajors[i][j].char_major == chrmajor ) { + blkmajor = devmajors[i][j].block_major; + blkminor = devmajors[i][j].block_minor; + bd_disk = devmajors[i][j].bd_disk; + } + } + } + + if ( !blkmajor) { + printk(KERN_WARNING "No block device corresponding to this char device: %d\n", + MAJOR(inode->i_rdev)); + return -ENODEV; + } + + /* + * inode->i_bdev and f->f_dentry are used by the driver in the ioctl + * path. + */ + + inode->i_bdev = bdget(MKDEV(blkmajor, blkminor)); + if (!inode->i_bdev->bd_disk) { + inode->i_bdev->bd_disk = bd_disk; + } + + /* + * make the actual ioctl call + */ + + return cciss_compat_ioctl(f, cmd, arg); + +} +#endif /* defined(__VMKLNX__) */ +#endif /* CONFIG_COMPAT */ + +#ifdef CONFIG_COMPAT + +static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg) +{ + int ret; + lock_kernel(); + ret = cciss_ioctl(f->f_dentry->d_inode, f, cmd, arg); + unlock_kernel(); + return ret; +} + +static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, + unsigned long arg); +static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd, + unsigned long arg); + +static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg) +{ + switch (cmd) { +#if !defined (__VMKLNX__) + case CCISS_GETPCIINFO: + case CCISS_GETINTINFO: + case CCISS_SETINTINFO: + case CCISS_GETNODENAME: + case CCISS_SETNODENAME: + case CCISS_GETHEARTBEAT: + case CCISS_GETBUSTYPES: + case CCISS_GETFIRMVER: + case CCISS_GETDRIVVER: + case CCISS_REVALIDVOLS: + case CCISS_DEREGDISK: +#endif /* !defined(__VMKLNX__) */ +#if defined (__VMKLNX__) + return -EBUSY; +#endif /* defined(__VMKLNX__) */ + case CCISS_REGNEWDISK: +#if defined (__VMKLNX__) + return -EPERM; +#endif /* defined(__VMKLNX__) */ + case CCISS_REGNEWD: +#if defined (__VMKLNX__) + return -EPERM; +#endif /* defined(__VMKLNX__) */ + case CCISS_RESCANDISK: +#if defined (__VMKLNX__) + return -EPERM; + case CCISS_GETPCIINFO: + case CCISS_GETINTINFO: + case CCISS_SETINTINFO: + case CCISS_GETNODENAME: + case CCISS_SETNODENAME: + case CCISS_GETHEARTBEAT: + case CCISS_GETBUSTYPES: + case CCISS_GETFIRMVER: + case CCISS_GETDRIVVER: + case CCISS_REVALIDVOLS: +#endif /* defined(__VMKLNX__) */ + case CCISS_GETLUNINFO: + return do_ioctl(f, cmd, arg); + + case CCISS_PASSTHRU32: + return cciss_ioctl32_passthru(f, cmd, arg); + case CCISS_BIG_PASSTHRU32: + return cciss_ioctl32_big_passthru(f, cmd, arg); + + default: + return -ENOIOCTLCMD; + } +} + +static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, + unsigned long arg) +{ + IOCTL32_Command_struct __user *arg32 = + (IOCTL32_Command_struct __user *) arg; + IOCTL_Command_struct arg64; + IOCTL_Command_struct __user *p = compat_alloc_user_space(sizeof(arg64)); + int err; + u32 cp; + + err = 0; + err |= + copy_from_user(&arg64.LUN_info, &arg32->LUN_info, + sizeof(arg64.LUN_info)); + err |= + copy_from_user(&arg64.Request, &arg32->Request, + sizeof(arg64.Request)); + err |= + copy_from_user(&arg64.error_info, &arg32->error_info, + sizeof(arg64.error_info)); + err |= get_user(arg64.buf_size, &arg32->buf_size); + err |= get_user(cp, &arg32->buf); + arg64.buf = compat_ptr(cp); + err |= copy_to_user(p, &arg64, sizeof(arg64)); + + if (err) + return -EFAULT; + + err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long)p); + if (err) + return err; + err |= + copy_in_user(&arg32->error_info, &p->error_info, + sizeof(arg32->error_info)); + if (err) + return -EFAULT; + return err; +} + +static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, + unsigned long arg) +{ + BIG_IOCTL32_Command_struct __user *arg32 = + (BIG_IOCTL32_Command_struct __user *) arg; + BIG_IOCTL_Command_struct arg64; + BIG_IOCTL_Command_struct __user *p = + compat_alloc_user_space(sizeof(arg64)); + int err; + u32 cp; + + err = 0; + err |= + copy_from_user(&arg64.LUN_info, &arg32->LUN_info, + sizeof(arg64.LUN_info)); + err |= + copy_from_user(&arg64.Request, &arg32->Request, + sizeof(arg64.Request)); + err |= + copy_from_user(&arg64.error_info, &arg32->error_info, + sizeof(arg64.error_info)); + err |= get_user(arg64.buf_size, &arg32->buf_size); + err |= get_user(arg64.malloc_size, &arg32->malloc_size); + err |= get_user(cp, &arg32->buf); + arg64.buf = compat_ptr(cp); + err |= copy_to_user(p, &arg64, sizeof(arg64)); + + if (err) + return -EFAULT; + + err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long)p); + if (err) + return err; + err |= + copy_in_user(&arg32->error_info, &p->error_info, + sizeof(arg32->error_info)); + if (err) + return -EFAULT; + return err; +} +#endif + +static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo) +{ + drive_info_struct *drv = get_drv(bdev->bd_disk); + + if (!drv->cylinders) + return -ENXIO; + + geo->heads = drv->heads; + geo->sectors = drv->sectors; + geo->cylinders = drv->cylinders; + return 0; +} + +/* + * ioctl + */ +static int cciss_ioctl(struct inode *inode, struct file *filep, + unsigned int cmd, unsigned long arg) +{ + struct block_device *bdev = inode->i_bdev; + struct gendisk *disk = bdev->bd_disk; + ctlr_info_t *host = get_host(disk); + drive_info_struct *drv = get_drv(disk); + int ctlr = host->ctlr; + void __user *argp = (void __user *)arg; + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss_ioctl: Called with cmd=%x %lx\n", cmd, arg); +#endif /* CCISS_DEBUG */ + + switch (cmd) { + case CCISS_GETPCIINFO: + { + cciss_pci_info_struct pciinfo; + + if (!arg) + return -EINVAL; + pciinfo.domain = pci_domain_nr(host->pdev->bus); + pciinfo.bus = host->pdev->bus->number; + pciinfo.dev_fn = host->pdev->devfn; + pciinfo.board_id = host->board_id; + if (copy_to_user + (argp, &pciinfo, sizeof(cciss_pci_info_struct))) + return -EFAULT; + return 0; + } + case CCISS_GETINTINFO: + { + cciss_coalint_struct intinfo; + if (!arg) + return -EINVAL; + intinfo.delay = + readl(&host->cfgtable->HostWrite.CoalIntDelay); + intinfo.count = + readl(&host->cfgtable->HostWrite.CoalIntCount); + if (copy_to_user + (argp, &intinfo, sizeof(cciss_coalint_struct))) + return -EFAULT; + return 0; + } + case CCISS_SETINTINFO: + { + cciss_coalint_struct intinfo; + unsigned long flags; + int i; + + if (!arg) + return -EINVAL; + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (copy_from_user + (&intinfo, argp, sizeof(cciss_coalint_struct))) + return -EFAULT; + if ((intinfo.delay == 0) && (intinfo.count == 0)) + { +// printk("cciss_ioctl: delay and count cannot be 0\n"); + return -EINVAL; + } + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + /* Update the field, and then ring the doorbell */ + writel(intinfo.delay, + &(host->cfgtable->HostWrite.CoalIntDelay)); + writel(intinfo.count, + &(host->cfgtable->HostWrite.CoalIntCount)); + writel(CFGTBL_ChangeReq, host->vaddr + SA5_DOORBELL); + + for (i = 0; i < MAX_IOCTL_CONFIG_WAIT; i++) { + if (!(readl(host->vaddr + SA5_DOORBELL) + & CFGTBL_ChangeReq)) + break; + /* delay and try again */ + udelay(1000); + } + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + if (i >= MAX_IOCTL_CONFIG_WAIT) + return -EAGAIN; + return 0; + } + case CCISS_GETNODENAME: + { + NodeName_type NodeName; + int i; + + if (!arg) + return -EINVAL; + for (i = 0; i < 16; i++) + NodeName[i] = + readb(&host->cfgtable->ServerName[i]); + if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) + return -EFAULT; + return 0; + } + case CCISS_SETNODENAME: + { + NodeName_type NodeName; + unsigned long flags; + int i; + + if (!arg) + return -EINVAL; + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user + (NodeName, argp, sizeof(NodeName_type))) + return -EFAULT; + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + + /* Update the field, and then ring the doorbell */ + for (i = 0; i < 16; i++) + writeb(NodeName[i], + &host->cfgtable->ServerName[i]); + + writel(CFGTBL_ChangeReq, host->vaddr + SA5_DOORBELL); + + for (i = 0; i < MAX_IOCTL_CONFIG_WAIT; i++) { + if (!(readl(host->vaddr + SA5_DOORBELL) + & CFGTBL_ChangeReq)) + break; + /* delay and try again */ + udelay(1000); + } + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + if (i >= MAX_IOCTL_CONFIG_WAIT) + return -EAGAIN; + return 0; + } + + case CCISS_GETHEARTBEAT: + { + Heartbeat_type heartbeat; + + if (!arg) + return -EINVAL; + heartbeat = readl(&host->cfgtable->HeartBeat); + if (copy_to_user + (argp, &heartbeat, sizeof(Heartbeat_type))) + return -EFAULT; + return 0; + } + case CCISS_GETBUSTYPES: + { + BusTypes_type BusTypes; + + if (!arg) + return -EINVAL; + BusTypes = readl(&host->cfgtable->BusTypes); + if (copy_to_user + (argp, &BusTypes, sizeof(BusTypes_type))) + return -EFAULT; + return 0; + } + case CCISS_GETFIRMVER: + { + FirmwareVer_type firmware; + + if (!arg) + return -EINVAL; + memcpy(firmware, host->firm_ver, 4); + + if (copy_to_user + (argp, firmware, sizeof(FirmwareVer_type))) + return -EFAULT; + return 0; + } + case CCISS_GETDRIVVER: + { + DriverVer_type DriverVer = DRIVER_VERSION; + + if (!arg) + return -EINVAL; + + if (copy_to_user + (argp, &DriverVer, sizeof(DriverVer_type))) + return -EFAULT; + return 0; + } + + case CCISS_REVALIDVOLS: + if (bdev != bdev->bd_contains || drv != host->drv) + return -ENXIO; + return revalidate_allvol(host); + + case CCISS_GETLUNINFO:{ + LogvolInfo_struct luninfo; + + luninfo.LunID = drv->LunID; + luninfo.num_opens = drv->usage_count; + luninfo.num_parts = 0; + if (copy_to_user(argp, &luninfo, + sizeof(LogvolInfo_struct))) + return -EFAULT; + return 0; + } + case CCISS_DEREGDISK: +#if defined (__VMKLNX__) + return -EBUSY; +#else /* !defined(__VMKLNX__) */ + return rebuild_lun_table(host, disk); +#endif /* defined(__VMKLNX__) */ + + case CCISS_REGNEWD: +#if defined (__VMKLNX__) + return -EPERM; +#else /* !defined(__VMKLNX__) */ + return rebuild_lun_table(host, NULL); +#endif /* defined(__VMKLNX__) */ + + case CCISS_PASSTHRU: + { + IOCTL_Command_struct iocommand; + CommandList_struct *c; + char *buff = NULL; + u64bit temp64; + unsigned long flags; + DECLARE_COMPLETION_ONSTACK(wait); + + if (!arg) + return -EINVAL; + + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + + if (copy_from_user + (&iocommand, argp, sizeof(IOCTL_Command_struct))) + return -EFAULT; + if ((iocommand.buf_size < 1) && + (iocommand.Request.Type.Direction != XFER_NONE)) { + return -EINVAL; + } +#if 0 /* 'buf_size' member is 16-bits, and always smaller than kmalloc limit */ + /* Check kmalloc limits */ + if (iocommand.buf_size > 128000) + return -EINVAL; +#endif + if (iocommand.buf_size > 0) { + buff = kmalloc(iocommand.buf_size, GFP_KERNEL); + if (buff == NULL) + return -EFAULT; + } + if (iocommand.Request.Type.Direction == XFER_WRITE) { + /* Copy the data into the buffer we created */ + if (copy_from_user + (buff, iocommand.buf, iocommand.buf_size)) { + kfree(buff); + return -EFAULT; + } + } else { + memset(buff, 0, iocommand.buf_size); + } + if ((c = cmd_alloc(host, 0)) == NULL) { + kfree(buff); + return -ENOMEM; + } + // Fill in the command type + c->cmd_type = CMD_IOCTL_PEND; + // Fill in Command Header + c->Header.ReplyQueue = 0; // unused in simple mode + if (iocommand.buf_size > 0) // buffer to fill + { + c->Header.SGList = 1; + c->Header.SGTotal = 1; + } else // no buffers to fill + { + c->Header.SGList = 0; + c->Header.SGTotal = 0; + } + c->Header.LUN = iocommand.LUN_info; + c->Header.Tag.lower = c->busaddr; // use the kernel address the cmd block for tag + + // Fill in Request block + c->Request = iocommand.Request; + + // Fill in the scatter gather information + if (iocommand.buf_size > 0) { + temp64.val = pci_map_single(host->pdev, buff, + iocommand.buf_size, + PCI_DMA_BIDIRECTIONAL); + c->SG[0].Addr.lower = temp64.val32.lower; + c->SG[0].Addr.upper = temp64.val32.upper; + c->SG[0].Len = iocommand.buf_size; + c->SG[0].Ext = 0; // we are not chaining + } + c->waiting = &wait; + + /* Put the request on the tail of the request queue */ + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + addQ(&host->reqQ, c); + host->Qdepth++; + start_io(host); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + wait_for_completion(&wait); + + /* unlock the buffers from DMA */ + temp64.val32.lower = c->SG[0].Addr.lower; + temp64.val32.upper = c->SG[0].Addr.upper; + pci_unmap_single(host->pdev, (dma_addr_t) temp64.val, + iocommand.buf_size, + PCI_DMA_BIDIRECTIONAL); + + /* Copy the error information out */ + iocommand.error_info = *(c->err_info); + if (copy_to_user + (argp, &iocommand, sizeof(IOCTL_Command_struct))) { + kfree(buff); + cmd_free(host, c, 0); + return -EFAULT; + } + + if (iocommand.Request.Type.Direction == XFER_READ) { + /* Copy the data out of the buffer we created */ + if (copy_to_user + (iocommand.buf, buff, iocommand.buf_size)) { + kfree(buff); + cmd_free(host, c, 0); + return -EFAULT; + } + } + kfree(buff); + cmd_free(host, c, 0); + return 0; + } + case CCISS_BIG_PASSTHRU:{ + BIG_IOCTL_Command_struct *ioc; + CommandList_struct *c; + unsigned char **buff = NULL; + int *buff_size = NULL; + u64bit temp64; + unsigned long flags; + BYTE sg_used = 0; + int status = 0; + int i; + DECLARE_COMPLETION_ONSTACK(wait); + __u32 left; + __u32 sz; + BYTE __user *data_ptr; + + if (!arg) + return -EINVAL; + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + ioc = (BIG_IOCTL_Command_struct *) + kmalloc(sizeof(*ioc), GFP_KERNEL); + if (!ioc) { + status = -ENOMEM; + goto cleanup1; + } + if (copy_from_user(ioc, argp, sizeof(*ioc))) { + status = -EFAULT; + goto cleanup1; + } + if ((ioc->buf_size < 1) && + (ioc->Request.Type.Direction != XFER_NONE)) { + status = -EINVAL; + goto cleanup1; + } + /* Check kmalloc limits using all SGs */ + if (ioc->malloc_size > MAX_KMALLOC_SIZE) { + status = -EINVAL; + goto cleanup1; + } + if (ioc->buf_size > ioc->malloc_size * MAXSGENTRIES) { + status = -EINVAL; + goto cleanup1; + } + buff = + kzalloc(MAXSGENTRIES * sizeof(char *), GFP_KERNEL); + if (!buff) { + status = -ENOMEM; + goto cleanup1; + } + buff_size = (int *)kmalloc(MAXSGENTRIES * sizeof(int), + GFP_KERNEL); + if (!buff_size) { + status = -ENOMEM; + goto cleanup1; + } + left = ioc->buf_size; + data_ptr = ioc->buf; + while (left) { + sz = (left > + ioc->malloc_size) ? ioc-> + malloc_size : left; + buff_size[sg_used] = sz; + buff[sg_used] = kmalloc(sz, GFP_KERNEL); + if (buff[sg_used] == NULL) { + status = -ENOMEM; + goto cleanup1; + } + if (ioc->Request.Type.Direction == XFER_WRITE) { + if (copy_from_user + (buff[sg_used], data_ptr, sz)) { + status = -ENOMEM; + goto cleanup1; + } + } else { + memset(buff[sg_used], 0, sz); + } + left -= sz; + data_ptr += sz; + sg_used++; + } + if ((c = cmd_alloc(host, 0)) == NULL) { + status = -ENOMEM; + goto cleanup1; + } + c->cmd_type = CMD_IOCTL_PEND; + c->Header.ReplyQueue = 0; + + if (ioc->buf_size > 0) { + c->Header.SGList = sg_used; + c->Header.SGTotal = sg_used; + } else { + c->Header.SGList = 0; + c->Header.SGTotal = 0; + } + c->Header.LUN = ioc->LUN_info; + c->Header.Tag.lower = c->busaddr; + + c->Request = ioc->Request; + if (ioc->buf_size > 0) { + int i; + for (i = 0; i < sg_used; i++) { + temp64.val = + pci_map_single(host->pdev, buff[i], + buff_size[i], + PCI_DMA_BIDIRECTIONAL); + c->SG[i].Addr.lower = + temp64.val32.lower; + c->SG[i].Addr.upper = + temp64.val32.upper; + c->SG[i].Len = buff_size[i]; + c->SG[i].Ext = 0; /* we are not chaining */ + } + } + c->waiting = &wait; + /* Put the request on the tail of the request queue */ + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + addQ(&host->reqQ, c); + host->Qdepth++; + start_io(host); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + wait_for_completion(&wait); + /* unlock the buffers from DMA */ + for (i = 0; i < sg_used; i++) { + temp64.val32.lower = c->SG[i].Addr.lower; + temp64.val32.upper = c->SG[i].Addr.upper; + pci_unmap_single(host->pdev, + (dma_addr_t) temp64.val, buff_size[i], + PCI_DMA_BIDIRECTIONAL); + } + /* Copy the error information out */ + ioc->error_info = *(c->err_info); + if (copy_to_user(argp, ioc, sizeof(*ioc))) { + cmd_free(host, c, 0); + status = -EFAULT; + goto cleanup1; + } + if (ioc->Request.Type.Direction == XFER_READ) { + /* Copy the data out of the buffer we created */ + BYTE __user *ptr = ioc->buf; + for (i = 0; i < sg_used; i++) { + if (copy_to_user + (ptr, buff[i], buff_size[i])) { + cmd_free(host, c, 0); + status = -EFAULT; + goto cleanup1; + } + ptr += buff_size[i]; + } + } + cmd_free(host, c, 0); + status = 0; + cleanup1: + if (buff) { + for (i = 0; i < sg_used; i++) + kfree(buff[i]); + kfree(buff); + } + kfree(buff_size); + kfree(ioc); + return status; + } + default: + return -ENOTTY; + } +} + +/* + * revalidate_allvol is for online array config utilities. After a + * utility reconfigures the drives in the array, it can use this function + * (through an ioctl) to make the driver zap any previous disk structs for + * that controller and get new ones. + * + * Right now I'm using the getgeometry() function to do this, but this + * function should probably be finer grained and allow you to revalidate one + * particular logical volume (instead of all of them on a particular + * controller). + */ +static int revalidate_allvol(ctlr_info_t *host) +{ + int ctlr = host->ctlr, i; + unsigned long flags; + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + if (host->usage_count > 1) { + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + printk(KERN_WARNING "cciss: Device busy for volume" + " revalidation (usage=%d)\n", host->usage_count); + return -EBUSY; + } + host->usage_count++; + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + for (i = 0; i < NWD; i++) { + struct gendisk *disk = host->gendisk[i]; + if (disk) { + request_queue_t *q = disk->queue; + + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) + blk_cleanup_queue(q); + } + } + + /* + * Set the partition and block size structures for all volumes + * on this controller to zero. We will reread all of this data + */ + memset(host->drv, 0, sizeof(drive_info_struct) + * CISS_MAX_LUN); + /* + * Tell the array controller not to give us any interrupts while + * we check the new geometry. Then turn interrupts back on when + * we're done. + */ + host->access.set_intr_mask(host, CCISS_INTR_OFF); + cciss_getgeometry(ctlr); + host->access.set_intr_mask(host, CCISS_INTR_ON); + + /* Loop through each real device */ + for (i = 0; i < NWD; i++) { + struct gendisk *disk = host->gendisk[i]; + drive_info_struct *drv = &(host->drv[i]); + /* we must register the controller even if no disks exist */ + /* this is for the online array utilities */ + if (!drv->heads && i) + continue; + blk_queue_hardsect_size(drv->queue, drv->block_size); + set_capacity(disk, drv->nr_blocks); + add_disk(disk); + } + host->usage_count--; + return 0; +} + +static inline void complete_buffers(struct bio *bio, int status) +{ + while (bio) { + struct bio *xbh = bio->bi_next; + int nr_sectors = bio_sectors(bio); + + bio->bi_next = NULL; + blk_finished_io(len); + bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO); + bio = xbh; + } +} + +static void cciss_check_queues(ctlr_info_t *h) +{ + int start_queue = h->next_to_run; + int i; + + /* check to see if we have maxed out the number of commands that can + * be placed on the queue. If so then exit. We do this check here + * in case the interrupt we serviced was from an ioctl and did not + * free any new commands. + */ + if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) + return; + + /* We have room on the queue for more commands. Now we need to queue + * them up. We will also keep track of the next queue to run so + * that every queue gets a chance to be started first. + */ + for (i = 0; i < h->highest_lun + 1; i++) { + int curr_queue = (start_queue + i) % (h->highest_lun + 1); + /* make sure the disk has been added and the drive is real + * because this can be called from the middle of init_one. + */ + if (!(h->drv[curr_queue].queue) || + !(h->drv[curr_queue].heads) || + h->drv[curr_queue].busy_configuring) + continue; + + blk_start_queue(h->gendisk[curr_queue]->queue); + + /* check to see if we have maxed out the number of commands + * that can be placed on the queue. + */ + if ((find_first_zero_bit(h->cmd_pool_bits, h->nr_cmds)) == h->nr_cmds) { + if (curr_queue == start_queue) { + h->next_to_run = + (start_queue + 1) % (h->highest_lun + 1); + break; + } else { + h->next_to_run = curr_queue; + break; + } + } else { + curr_queue = (curr_queue + 1) % (h->highest_lun + 1); + } + } +} + +static void cciss_softirq_done(struct request *rq) +{ + CommandList_struct *cmd = rq->completion_data; + ctlr_info_t *h = hba[cmd->ctlr]; + unsigned long flags; + u64bit temp64; + int i, ddir; + + if (cmd->Request.Type.Direction == XFER_READ) + ddir = PCI_DMA_FROMDEVICE; + else + ddir = PCI_DMA_TODEVICE; + + /* command did not need to be retried */ + /* unmap the DMA mapping for all the scatter gather elements */ + for (i = 0; i < cmd->Header.SGList; i++) { + temp64.val32.lower = cmd->SG[i].Addr.lower; + temp64.val32.upper = cmd->SG[i].Addr.upper; + pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); + } + + complete_buffers(rq->bio, rq->errors); + +#if !defined(__VMKLNX__) + if (blk_fs_request(rq)) { + const int rw = rq_data_dir(rq); + + disk_stat_add(rq->rq_disk, sectors[rw], rq->nr_sectors); + } +#endif /* !defined(__VMKLNX__) */ + +#ifdef CCISS_DEBUG + printk("Done with %p\n", rq); +#endif /* CCISS_DEBUG */ + + add_disk_randomness(rq->rq_disk); + spin_lock_irqsave(&h->lock, flags); + end_that_request_last(rq, rq->errors); + cmd_free(h, cmd, 1); + cciss_check_queues(h); + spin_unlock_irqrestore(&h->lock, flags); +} + +/* This function will check the usage_count of the drive to be updated/added. + * If the usage_count is zero then the drive information will be updated and + * the disk will be re-registered with the kernel. If not then it will be + * left alone for the next reboot. The exception to this is disk 0 which + * will always be left registered with the kernel since it is also the + * controller node. Any changes to disk 0 will show up on the next + * reboot. + */ +static void cciss_update_drive_info(int ctlr, int drv_index) +{ + ctlr_info_t *h = hba[ctlr]; + struct gendisk *disk; + ReadCapdata_struct *size_buff = NULL; + InquiryData_struct *inq_buff = NULL; + unsigned int block_size; + unsigned int total_size; + unsigned long flags = 0; + int ret = 0; + + /* if the disk already exists then deregister it before proceeding */ + if (h->drv[drv_index].raid_level != -1) { + spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); + h->drv[drv_index].busy_configuring = 1; + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + ret = deregister_disk(h->gendisk[drv_index], + &h->drv[drv_index], 0); + h->drv[drv_index].busy_configuring = 0; + } + + /* If the disk is in use return */ + if (ret) + return; + + /* Get information about the disk and modify the driver structure */ + size_buff = kmalloc(sizeof(ReadCapdata_struct), GFP_KERNEL); + if (size_buff == NULL) + goto mem_msg; + inq_buff = kmalloc(sizeof(InquiryData_struct), GFP_KERNEL); + if (inq_buff == NULL) + goto mem_msg; + + cciss_read_capacity(ctlr, drv_index, size_buff, 1, + &total_size, &block_size); + cciss_geometry_inquiry(ctlr, drv_index, 1, total_size, block_size, + inq_buff, &h->drv[drv_index]); + + ++h->num_luns; + disk = h->gendisk[drv_index]; + set_capacity(disk, h->drv[drv_index].nr_blocks); + + /* if it's the controller it's already added */ + if (drv_index) { + disk->queue = blk_init_queue(do_cciss_request, &h->lock); + + /* Set up queue information */ + disk->queue->backing_dev_info.ra_pages = READ_AHEAD; + blk_queue_bounce_limit(disk->queue, hba[ctlr]->pdev->dma_mask); + + /* This is a hardware imposed limit. */ + blk_queue_max_hw_segments(disk->queue, MAXSGENTRIES); + + /* This is a limit in the driver and could be eliminated. */ + blk_queue_max_phys_segments(disk->queue, MAXSGENTRIES); + +#if defined(__VMKLNX__) + disk->maxXfer = 512 * VMK_SECTOR_SIZE; + vmklnx_block_register_disk_maxXfer(h->major, drv_index, disk->maxXfer); +#else + blk_queue_max_sectors(disk->queue, 512); +#endif + + blk_queue_softirq_done(disk->queue, cciss_softirq_done); + + disk->queue->queuedata = hba[ctlr]; + + blk_queue_hardsect_size(disk->queue, + hba[ctlr]->drv[drv_index].block_size); + + h->drv[drv_index].queue = disk->queue; + add_disk(disk); + } + + freeret: + kfree(size_buff); + kfree(inq_buff); + return; + mem_msg: + printk(KERN_ERR "cciss: out of memory\n"); + goto freeret; +} + +/* This function will find the first index of the controllers drive array + * that has a -1 for the raid_level and will return that index. This is + * where new drives will be added. If the index to be returned is greater + * than the highest_lun index for the controller then highest_lun is set + * to this new index. If there are no available indexes then -1 is returned. + */ +static int cciss_find_free_drive_index(int ctlr) +{ + int i; + + for (i = 0; i < CISS_MAX_LUN; i++) { + if (hba[ctlr]->drv[i].raid_level == -1) { + if (i > hba[ctlr]->highest_lun) + hba[ctlr]->highest_lun = i; + return i; + } + } + return -1; +} + +/* This function will add and remove logical drives from the Logical + * drive array of the controller and maintain persistency of ordering + * so that mount points are preserved until the next reboot. This allows + * for the removal of logical drives in the middle of the drive array + * without a re-ordering of those drives. + * INPUT + * h = The controller to perform the operations on + * del_disk = The disk to remove if specified. If the value given + * is NULL then no disk is removed. + */ +static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk) +{ + int ctlr = h->ctlr; + int num_luns; + ReportLunData_struct *ld_buff = NULL; + drive_info_struct *drv = NULL; + int return_code; + int listlength = 0; + int i; + int drv_found; + int drv_index = 0; + __u32 lunid = 0; + unsigned long flags; + + /* Set busy_configuring flag for this operation */ + spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); + if (h->num_luns >= CISS_MAX_LUN) { + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + return -EINVAL; + } + + if (h->busy_configuring) { + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + return -EBUSY; + } + h->busy_configuring = 1; + + /* if del_disk is NULL then we are being called to add a new disk + * and update the logical drive table. If it is not NULL then + * we will check if the disk is in use or not. + */ + if (del_disk != NULL) { + drv = get_drv(del_disk); + drv->busy_configuring = 1; + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + return_code = deregister_disk(del_disk, drv, 1); + drv->busy_configuring = 0; + h->busy_configuring = 0; + return return_code; + } else { + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + + ld_buff = kzalloc(sizeof(ReportLunData_struct), GFP_KERNEL); + if (ld_buff == NULL) + goto mem_msg; + + return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff, + sizeof(ReportLunData_struct), 0, + 0, 0, TYPE_CMD); + + if (return_code == IO_OK) { + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[0])) + << 24; + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[1])) + << 16; + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[2])) + << 8; + listlength |= + 0xff & (unsigned int)(ld_buff->LUNListLength[3]); + } else { /* reading number of logical volumes failed */ + printk(KERN_WARNING "cciss: report logical volume" + " command failed\n"); + listlength = 0; + goto freeret; + } + + num_luns = listlength / 8; /* 8 bytes per entry */ + if (num_luns > CISS_MAX_LUN) { + num_luns = CISS_MAX_LUN; + printk(KERN_WARNING "cciss: more luns configured" + " on controller than can be handled by" + " this driver.\n"); + } + + /* Compare controller drive array to drivers drive array. + * Check for updates in the drive information and any new drives + * on the controller. + */ + for (i = 0; i < num_luns; i++) { + int j; + + drv_found = 0; + + lunid = (0xff & + (unsigned int)(ld_buff->LUN[i][3])) << 24; + lunid |= (0xff & + (unsigned int)(ld_buff->LUN[i][2])) << 16; + lunid |= (0xff & + (unsigned int)(ld_buff->LUN[i][1])) << 8; + lunid |= 0xff & (unsigned int)(ld_buff->LUN[i][0]); + + /* Find if the LUN is already in the drive array + * of the controller. If so then update its info + * if not is use. If it does not exist then find + * the first free index and add it. + */ + for (j = 0; j <= h->highest_lun; j++) { + if (h->drv[j].LunID == lunid) { + drv_index = j; + drv_found = 1; + } + } + + /* check if the drive was found already in the array */ + if (!drv_found) { + drv_index = cciss_find_free_drive_index(ctlr); + if (drv_index == -1) + goto freeret; + + } + h->drv[drv_index].LunID = lunid; + cciss_update_drive_info(ctlr, drv_index); + } /* end for */ + } /* end else */ + + freeret: + kfree(ld_buff); + h->busy_configuring = 0; + /* We return -1 here to tell the ACU that we have registered/updated + * all of the drives that we can and to keep it from calling us + * additional times. + */ + return -1; + mem_msg: + printk(KERN_ERR "cciss: out of memory\n"); + goto freeret; +} + +/* This function will deregister the disk and it's queue from the + * kernel. It must be called with the controller lock held and the + * drv structures busy_configuring flag set. It's parameters are: + * + * disk = This is the disk to be deregistered + * drv = This is the drive_info_struct associated with the disk to be + * deregistered. It contains information about the disk used + * by the driver. + * clear_all = This flag determines whether or not the disk information + * is going to be completely cleared out and the highest_lun + * reset. Sometimes we want to clear out information about + * the disk in preparation for re-adding it. In this case + * the highest_lun should be left unchanged and the LunID + * should not be cleared. +*/ +static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, + int clear_all) +{ + ctlr_info_t *h = get_host(disk); + + if (!capable(CAP_SYS_RAWIO)) + return -EPERM; + + /* make sure logical volume is NOT is use */ + if (clear_all || (h->gendisk[0] == disk)) { + if (drv->usage_count > 1) + return -EBUSY; + } else if (drv->usage_count > 0) + return -EBUSY; + + /* invalidate the devices and deregister the disk. If it is disk + * zero do not deregister it but just zero out it's values. This + * allows us to delete disk zero but keep the controller registered. + */ + if (h->gendisk[0] != disk) { + if (disk) { + request_queue_t *q = disk->queue; + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) { + blk_cleanup_queue(q); + drv->queue = NULL; + } + } + } + + --h->num_luns; + /* zero out the disk size info */ + drv->nr_blocks = 0; + drv->block_size = 0; + drv->heads = 0; + drv->sectors = 0; + drv->cylinders = 0; + drv->raid_level = -1; /* This can be used as a flag variable to + * indicate that this element of the drive + * array is free. + */ + + if (clear_all) { + /* check to see if it was the last disk */ + if (drv == h->drv + h->highest_lun) { + /* if so, find the new hightest lun */ + int i, newhighest = -1; + for (i = 0; i < h->highest_lun; i++) { + /* if the disk has size > 0, it is available */ + if (h->drv[i].heads) + newhighest = i; + } + h->highest_lun = newhighest; + } + + drv->LunID = 0; + } + return 0; +} + +static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff, size_t size, unsigned int use_unit_num, /* 0: address the controller, + 1: address logical volume log_unit, + 2: periph device address is scsi3addr */ + unsigned int log_unit, __u8 page_code, + unsigned char *scsi3addr, int cmd_type) +{ + ctlr_info_t *h = hba[ctlr]; + u64bit buff_dma_handle; + int status = IO_OK; + + c->cmd_type = CMD_IOCTL_PEND; + c->Header.ReplyQueue = 0; + if (buff != NULL) { + c->Header.SGList = 1; + c->Header.SGTotal = 1; + } else { + c->Header.SGList = 0; + c->Header.SGTotal = 0; + } + c->Header.Tag.lower = c->busaddr; + + c->Request.Type.Type = cmd_type; + if (cmd_type == TYPE_CMD) { + switch (cmd) { + case CISS_INQUIRY: + /* If the logical unit number is 0 then, this is going + to controller so It's a physical command + mode = 0 target = 0. So we have nothing to write. + otherwise, if use_unit_num == 1, + mode = 1(volume set addressing) target = LUNID + otherwise, if use_unit_num == 2, + mode = 0(periph dev addr) target = scsi3addr */ + if (use_unit_num == 1) { + c->Header.LUN.LogDev.VolId = + h->drv[log_unit].LunID; + c->Header.LUN.LogDev.Mode = 1; + } else if (use_unit_num == 2) { + memcpy(c->Header.LUN.LunAddrBytes, scsi3addr, + 8); + c->Header.LUN.LogDev.Mode = 0; + } + /* are we trying to read a vital product page */ + if (page_code != 0) { + c->Request.CDB[1] = 0x01; + c->Request.CDB[2] = page_code; + } + c->Request.CDBLen = 6; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_READ; + c->Request.Timeout = 0; + c->Request.CDB[0] = CISS_INQUIRY; + c->Request.CDB[4] = size & 0xFF; + break; + case CISS_REPORT_LOG: + case CISS_REPORT_PHYS: + /* Talking to controller so It's a physical command + mode = 00 target = 0. Nothing to write. + */ + c->Request.CDBLen = 12; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_READ; + c->Request.Timeout = 0; + c->Request.CDB[0] = cmd; + c->Request.CDB[6] = (size >> 24) & 0xFF; //MSB + c->Request.CDB[7] = (size >> 16) & 0xFF; + c->Request.CDB[8] = (size >> 8) & 0xFF; + c->Request.CDB[9] = size & 0xFF; + break; + + case CCISS_READ_CAPACITY: + c->Header.LUN.LogDev.VolId = h->drv[log_unit].LunID; + c->Header.LUN.LogDev.Mode = 1; + c->Request.CDBLen = 10; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_READ; + c->Request.Timeout = 0; + c->Request.CDB[0] = cmd; + break; + case CCISS_CACHE_FLUSH: + c->Request.CDBLen = 12; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_WRITE; + c->Request.Timeout = 0; + c->Request.CDB[0] = BMIC_WRITE; + c->Request.CDB[6] = BMIC_CACHE_FLUSH; + break; + default: + printk(KERN_WARNING + "cciss%d: Unknown Command 0x%c\n", ctlr, cmd); + return IO_ERROR; + } + } else if (cmd_type == TYPE_MSG) { + switch (cmd) { + case 0: /* ABORT message */ + c->Request.CDBLen = 12; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_WRITE; + c->Request.Timeout = 0; + c->Request.CDB[0] = cmd; /* abort */ + c->Request.CDB[1] = 0; /* abort a command */ + /* buff contains the tag of the command to abort */ + memcpy(&c->Request.CDB[4], buff, 8); + break; + case 1: /* RESET message */ + c->Request.CDBLen = 12; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_WRITE; + c->Request.Timeout = 0; + memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB)); + c->Request.CDB[0] = cmd; /* reset */ + c->Request.CDB[1] = 0x04; /* reset a LUN */ + case 3: /* No-Op message */ + c->Request.CDBLen = 1; + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = XFER_WRITE; + c->Request.Timeout = 0; + c->Request.CDB[0] = cmd; + break; + default: + printk(KERN_WARNING + "cciss%d: unknown message type %d\n", ctlr, cmd); + return IO_ERROR; + } + } else { + printk(KERN_WARNING + "cciss%d: unknown command type %d\n", ctlr, cmd_type); + return IO_ERROR; + } + /* Fill in the scatter gather information */ + if (size > 0) { + buff_dma_handle.val = (__u64) pci_map_single(h->pdev, + buff, size, + PCI_DMA_BIDIRECTIONAL); + c->SG[0].Addr.lower = buff_dma_handle.val32.lower; + c->SG[0].Addr.upper = buff_dma_handle.val32.upper; + c->SG[0].Len = size; + c->SG[0].Ext = 0; /* we are not chaining */ + } + return status; +} + +static int sendcmd_withirq(__u8 cmd, + int ctlr, + void *buff, + size_t size, + unsigned int use_unit_num, + unsigned int log_unit, __u8 page_code, int cmd_type) +{ + ctlr_info_t *h = hba[ctlr]; + CommandList_struct *c; + u64bit buff_dma_handle; + unsigned long flags; + int return_status; + DECLARE_COMPLETION_ONSTACK(wait); + + if ((c = cmd_alloc(h, 0)) == NULL) + return -ENOMEM; + return_status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num, + log_unit, page_code, NULL, cmd_type); + if (return_status != IO_OK) { + cmd_free(h, c, 0); + return return_status; + } + resend_cmd2: + c->waiting = &wait; + + /* Put the request on the tail of the queue and send it */ + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + addQ(&h->reqQ, c); + h->Qdepth++; + start_io(h); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + wait_for_completion(&wait); + + if (c->err_info->CommandStatus != 0) { /* an error has occurred */ + switch (c->err_info->CommandStatus) { + case CMD_TARGET_STATUS: + printk(KERN_WARNING "cciss: cmd %p has " + " completed with errors\n", c); + if (c->err_info->ScsiStatus) { + printk(KERN_WARNING "cciss: cmd %p " + "has SCSI Status = %x\n", + c, c->err_info->ScsiStatus); + } + + break; + case CMD_DATA_UNDERRUN: + case CMD_DATA_OVERRUN: + /* expected for inquire and report lun commands */ + break; + case CMD_INVALID: + printk(KERN_WARNING "cciss: Cmd %p is " + "reported invalid\n", c); + return_status = IO_ERROR; + break; + case CMD_PROTOCOL_ERR: + printk(KERN_WARNING "cciss: cmd %p has " + "protocol error \n", c); + return_status = IO_ERROR; + break; + case CMD_HARDWARE_ERR: + printk(KERN_WARNING "cciss: cmd %p had " + " hardware error\n", c); + return_status = IO_ERROR; + break; + case CMD_CONNECTION_LOST: + printk(KERN_WARNING "cciss: cmd %p had " + "connection lost\n", c); + return_status = IO_ERROR; + break; + case CMD_ABORTED: + printk(KERN_WARNING "cciss: cmd %p was " + "aborted\n", c); + return_status = IO_ERROR; + break; + case CMD_ABORT_FAILED: + printk(KERN_WARNING "cciss: cmd %p reports " + "abort failed\n", c); + return_status = IO_ERROR; + break; + case CMD_UNSOLICITED_ABORT: + printk(KERN_WARNING + "cciss%d: unsolicited abort %p\n", ctlr, c); + if (c->retry_count < MAX_CMD_RETRIES) { + printk(KERN_WARNING + "cciss%d: retrying %p\n", ctlr, c); + c->retry_count++; + /* erase the old error information */ + memset(c->err_info, 0, + sizeof(ErrorInfo_struct)); + return_status = IO_OK; + INIT_COMPLETION(wait); + goto resend_cmd2; + } + return_status = IO_ERROR; + break; + default: + printk(KERN_WARNING "cciss: cmd %p returned " + "unknown status %x\n", c, + c->err_info->CommandStatus); + return_status = IO_ERROR; + } + } + /* unlock the buffers from DMA */ + buff_dma_handle.val32.lower = c->SG[0].Addr.lower; + buff_dma_handle.val32.upper = c->SG[0].Addr.upper; + pci_unmap_single(h->pdev, (dma_addr_t) buff_dma_handle.val, + c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); + cmd_free(h, c, 0); + return return_status; +} + +static void cciss_geometry_inquiry(int ctlr, int logvol, + int withirq, unsigned int total_size, + unsigned int block_size, + InquiryData_struct *inq_buff, + drive_info_struct *drv) +{ + int return_code; + memset(inq_buff, 0, sizeof(InquiryData_struct)); + if (withirq) + return_code = sendcmd_withirq(CISS_INQUIRY, ctlr, + inq_buff, sizeof(*inq_buff), 1, + logvol, 0xC1, TYPE_CMD); + else + return_code = sendcmd(CISS_INQUIRY, ctlr, inq_buff, + sizeof(*inq_buff), 1, logvol, 0xC1, NULL, + TYPE_CMD); + if (return_code == IO_OK) { + if (inq_buff->data_byte[8] == 0xFF) { + printk(KERN_WARNING + "cciss: reading geometry failed, volume " + "does not support reading geometry\n"); + drv->block_size = block_size; + drv->nr_blocks = total_size; + drv->heads = 255; + drv->sectors = 32; // Sectors per track + drv->cylinders = total_size / 255 / 32; + } else { + unsigned int t; + + drv->block_size = block_size; + drv->nr_blocks = total_size; + drv->heads = inq_buff->data_byte[6]; + drv->sectors = inq_buff->data_byte[7]; + drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8; + drv->cylinders += inq_buff->data_byte[5]; + drv->raid_level = inq_buff->data_byte[8]; + t = drv->heads * drv->sectors; + if (t > 1) { + drv->cylinders = total_size / t; + } + } + } else { /* Get geometry failed */ + printk(KERN_WARNING "cciss: reading geometry failed\n"); + } + printk(KERN_INFO " heads= %d, sectors= %d, cylinders= %d\n\n", + drv->heads, drv->sectors, drv->cylinders); +} + +static void +cciss_read_capacity(int ctlr, int logvol, ReadCapdata_struct *buf, + int withirq, unsigned int *total_size, + unsigned int *block_size) +{ + int return_code; + memset(buf, 0, sizeof(*buf)); + if (withirq) + return_code = sendcmd_withirq(CCISS_READ_CAPACITY, + ctlr, buf, sizeof(*buf), 1, + logvol, 0, TYPE_CMD); + else + return_code = sendcmd(CCISS_READ_CAPACITY, + ctlr, buf, sizeof(*buf), 1, logvol, 0, + NULL, TYPE_CMD); + if (return_code == IO_OK) { + *total_size = + be32_to_cpu(*((__be32 *) & buf->total_size[0])) + 1; + *block_size = be32_to_cpu(*((__be32 *) & buf->block_size[0])); + } else { /* read capacity command failed */ + printk(KERN_WARNING "cciss: read capacity failed\n"); + *total_size = 0; + *block_size = BLOCK_SIZE; + } + printk(KERN_INFO " blocks= %u block_size= %d\n", + *total_size, *block_size); + return; +} + +static int cciss_revalidate(struct gendisk *disk) +{ + ctlr_info_t *h = get_host(disk); + drive_info_struct *drv = get_drv(disk); + int logvol; + int FOUND = 0; + unsigned int block_size; + unsigned int total_size; + ReadCapdata_struct *size_buff = NULL; + InquiryData_struct *inq_buff = NULL; + + for (logvol = 0; logvol < CISS_MAX_LUN; logvol++) { + if (h->drv[logvol].LunID == drv->LunID) { + FOUND = 1; + break; + } + } + + if (!FOUND) + return 1; + + size_buff = kmalloc(sizeof(ReadCapdata_struct), GFP_KERNEL); + if (size_buff == NULL) { + printk(KERN_WARNING "cciss: out of memory\n"); + return 1; + } + inq_buff = kmalloc(sizeof(InquiryData_struct), GFP_KERNEL); + if (inq_buff == NULL) { + printk(KERN_WARNING "cciss: out of memory\n"); + kfree(size_buff); + return 1; + } + + cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, + &block_size); + cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, + inq_buff, drv); + + blk_queue_hardsect_size(drv->queue, drv->block_size); + set_capacity(disk, drv->nr_blocks); + + kfree(size_buff); + kfree(inq_buff); + return 0; +} + +/* + * Wait polling for a command to complete. + * The memory mapped FIFO is polled for the completion. + * Used only at init time, interrupts from the HBA are disabled. + */ +static unsigned long pollcomplete(int ctlr) +{ + unsigned long done; + int i; + + /* Wait (up to 20 seconds) for a command to complete */ + + for (i = 20 * HZ; i > 0; i--) { + done = hba[ctlr]->access.command_completed(hba[ctlr]); + if (done == FIFO_EMPTY) + schedule_timeout_uninterruptible(1); + else + return done; + } + /* Invalid address to tell caller we ran out of time */ + return 1; +} + +static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete) +{ + /* We get in here if sendcmd() is polling for completions + and gets some command back that it wasn't expecting -- + something other than that which it just sent down. + Ordinarily, that shouldn't happen, but it can happen when + the scsi tape stuff gets into error handling mode, and + starts using sendcmd() to try to abort commands and + reset tape drives. In that case, sendcmd may pick up + completions of commands that were sent to logical drives + through the block i/o system, or cciss ioctls completing, etc. + In that case, we need to save those completions for later + processing by the interrupt handler. + */ + +#ifdef CONFIG_CISS_SCSI_TAPE + struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects; + + /* If it's not the scsi tape stuff doing error handling, (abort */ + /* or reset) then we don't expect anything weird. */ + if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) { +#endif + printk(KERN_WARNING "cciss cciss%d: SendCmd " + "Invalid command list address returned! (%lx)\n", + ctlr, complete); + /* not much we can do. */ +#ifdef CONFIG_CISS_SCSI_TAPE + return 1; + } + + /* We've sent down an abort or reset, but something else + has completed */ + if (srl->ncompletions >= (hba[ctlr]->nr_cmds + 2)) { + /* Uh oh. No room to save it for later... */ + printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, " + "reject list overflow, command lost!\n", ctlr); + return 1; + } + /* Save it for later */ + srl->complete[srl->ncompletions] = complete; + srl->ncompletions++; +#endif + return 0; +} + +/* + * Send a command to the controller, and wait for it to complete. + * Only used at init time. + */ +static int sendcmd(__u8 cmd, int ctlr, void *buff, size_t size, unsigned int use_unit_num, /* 0: address the controller, + 1: address logical volume log_unit, + 2: periph device address is scsi3addr */ + unsigned int log_unit, + __u8 page_code, unsigned char *scsi3addr, int cmd_type) +{ + CommandList_struct *c; + int i; + unsigned long complete; + ctlr_info_t *info_p = hba[ctlr]; + u64bit buff_dma_handle; + int status, done = 0; + + if ((c = cmd_alloc(info_p, 1)) == NULL) { + printk(KERN_WARNING "cciss: unable to get memory"); + return IO_ERROR; + } + status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num, + log_unit, page_code, scsi3addr, cmd_type); + if (status != IO_OK) { + cmd_free(info_p, c, 1); + return status; + } + resend_cmd1: + /* + * Disable interrupt + */ +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss: turning intr off\n"); +#endif /* CCISS_DEBUG */ + info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF); + + /* Make sure there is room in the command FIFO */ + /* Actually it should be completely empty at this time */ + /* unless we are in here doing error handling for the scsi */ + /* tape side of the driver. */ + for (i = 200000; i > 0; i--) { + /* if fifo isn't full go */ + if (!(info_p->access.fifo_full(info_p))) { + + break; + } + udelay(10); + printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full," + " waiting!\n", ctlr); + } + /* + * Send the cmd + */ + info_p->access.submit_command(info_p, c); + done = 0; + do { + complete = pollcomplete(ctlr); + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss: command completed\n"); +#endif /* CCISS_DEBUG */ + + if (complete == 1) { + printk(KERN_WARNING + "cciss cciss%d: SendCmd Timeout out, " + "No command list address returned!\n", ctlr); + status = IO_ERROR; + done = 1; + break; + } + + /* This will need to change for direct lookup completions */ + if ((complete & CISS_ERROR_BIT) + && (complete & ~CISS_ERROR_BIT) == c->busaddr) { + /* if data overrun or underun on Report command + ignore it + */ + if (((c->Request.CDB[0] == CISS_REPORT_LOG) || + (c->Request.CDB[0] == CISS_REPORT_PHYS) || + (c->Request.CDB[0] == CISS_INQUIRY)) && + ((c->err_info->CommandStatus == + CMD_DATA_OVERRUN) || + (c->err_info->CommandStatus == CMD_DATA_UNDERRUN) + )) { + complete = c->busaddr; + } else { + if (c->err_info->CommandStatus == + CMD_UNSOLICITED_ABORT) { + printk(KERN_WARNING "cciss%d: " + "unsolicited abort %p\n", + ctlr, c); + if (c->retry_count < MAX_CMD_RETRIES) { + printk(KERN_WARNING + "cciss%d: retrying %p\n", + ctlr, c); + c->retry_count++; + /* erase the old error */ + /* information */ + memset(c->err_info, 0, + sizeof + (ErrorInfo_struct)); + goto resend_cmd1; + } else { + printk(KERN_WARNING + "cciss%d: retried %p too " + "many times\n", ctlr, c); + status = IO_ERROR; + goto cleanup1; + } + } else if (c->err_info->CommandStatus == + CMD_UNABORTABLE) { + printk(KERN_WARNING + "cciss%d: command could not be aborted.\n", + ctlr); + status = IO_ERROR; + goto cleanup1; + } + printk(KERN_WARNING "ciss ciss%d: sendcmd" + " Error %x \n", ctlr, + c->err_info->CommandStatus); + printk(KERN_WARNING "ciss ciss%d: sendcmd" + " offensive info\n" + " size %x\n num %x value %x\n", + ctlr, + c->err_info->MoreErrInfo.Invalid_Cmd. + offense_size, + c->err_info->MoreErrInfo.Invalid_Cmd. + offense_num, + c->err_info->MoreErrInfo.Invalid_Cmd. + offense_value); + status = IO_ERROR; + goto cleanup1; + } + } + /* This will need changing for direct lookup completions */ + if (complete != c->busaddr) { + if (add_sendcmd_reject(cmd, ctlr, complete) != 0) { + BUG(); /* we are pretty much hosed if we get here. */ + } + continue; + } else + done = 1; + } while (!done); + + cleanup1: + /* unlock the data buffer from DMA */ + buff_dma_handle.val32.lower = c->SG[0].Addr.lower; + buff_dma_handle.val32.upper = c->SG[0].Addr.upper; + pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val, + c->SG[0].Len, PCI_DMA_BIDIRECTIONAL); +#ifdef CONFIG_CISS_SCSI_TAPE + /* if we saved some commands for later, process them now. */ + if (info_p->scsi_rejects.ncompletions > 0) + do_cciss_intr(0, info_p, NULL); +#endif + cmd_free(info_p, c, 1); + return status; +} + +/* + * Map (physical) PCI mem into (virtual) kernel space + */ +static void __iomem *remap_pci_mem(ulong base, ulong size) +{ + ulong page_base = ((ulong) base) & PAGE_MASK; + ulong page_offs = ((ulong) base) - page_base; + void __iomem *page_remapped = ioremap(page_base, page_offs + size); + + return page_remapped ? (page_remapped + page_offs) : NULL; +} + +/* + * Takes jobs of the Q and sends them to the hardware, then puts it on + * the Q to wait for completion. + */ +static void start_io(ctlr_info_t *h) +{ + CommandList_struct *c; + + while ((c = h->reqQ) != NULL) { + /* can't do anything if fifo is full */ + if ((h->access.fifo_full(h))) { + printk(KERN_WARNING "cciss: fifo full\n"); + break; + } + + /* Get the first entry from the Request Q */ + removeQ(&(h->reqQ), c); + h->Qdepth--; + + /* Tell the controller execute command */ + h->access.submit_command(h, c); + + /* Put job onto the completed Q */ + addQ(&(h->cmpQ), c); + } +} + +/* Assumes that CCISS_LOCK(h->ctlr) is held. */ +/* Zeros out the error record and then resends the command back */ +/* to the controller */ +static inline void resend_cciss_cmd(ctlr_info_t *h, CommandList_struct *c) +{ + /* erase the old error information */ + memset(c->err_info, 0, sizeof(ErrorInfo_struct)); + + /* add it to software queue and then send it to the controller */ + addQ(&(h->reqQ), c); + h->Qdepth++; + if (h->Qdepth > h->maxQsinceinit) + h->maxQsinceinit = h->Qdepth; + + start_io(h); +} + +/* checks the status of the job and calls complete buffers to mark all + * buffers for the completed job. Note that this function does not need + * to hold the hba/queue lock. + */ +static inline void complete_command(ctlr_info_t *h, CommandList_struct *cmd, + int timeout) +{ + int status = 1; + int retry_cmd = 0; + + if (timeout) + status = 0; + + if (cmd->err_info->CommandStatus != 0) { /* an error has occurred */ + switch (cmd->err_info->CommandStatus) { + unsigned char sense_key; + case CMD_TARGET_STATUS: + status = 0; + + if (cmd->err_info->ScsiStatus == 0x02) { + printk(KERN_WARNING "cciss: cmd %p " + "has CHECK CONDITION " + " byte 2 = 0x%x\n", cmd, + cmd->err_info->SenseInfo[2] + ); + /* check the sense key */ + sense_key = 0xf & cmd->err_info->SenseInfo[2]; + /* no status or recovered error */ + if ((sense_key == 0x0) || (sense_key == 0x1)) { + status = 1; + } + } else { + printk(KERN_WARNING "cciss: cmd %p " + "has SCSI Status 0x%x\n", + cmd, cmd->err_info->ScsiStatus); + } + break; + case CMD_DATA_UNDERRUN: + printk(KERN_WARNING "cciss: cmd %p has" + " completed with data underrun " + "reported\n", cmd); + break; + case CMD_DATA_OVERRUN: + printk(KERN_WARNING "cciss: cmd %p has" + " completed with data overrun " + "reported\n", cmd); + break; + case CMD_INVALID: + printk(KERN_WARNING "cciss: cmd %p is " + "reported invalid\n", cmd); + status = 0; + break; + case CMD_PROTOCOL_ERR: + printk(KERN_WARNING "cciss: cmd %p has " + "protocol error \n", cmd); + status = 0; + break; + case CMD_HARDWARE_ERR: + printk(KERN_WARNING "cciss: cmd %p had " + " hardware error\n", cmd); + status = 0; + break; + case CMD_CONNECTION_LOST: + printk(KERN_WARNING "cciss: cmd %p had " + "connection lost\n", cmd); + status = 0; + break; + case CMD_ABORTED: + printk(KERN_WARNING "cciss: cmd %p was " + "aborted\n", cmd); + status = 0; + break; + case CMD_ABORT_FAILED: + printk(KERN_WARNING "cciss: cmd %p reports " + "abort failed\n", cmd); + status = 0; + break; + case CMD_UNSOLICITED_ABORT: + printk(KERN_WARNING "cciss%d: unsolicited " + "abort %p\n", h->ctlr, cmd); + if (cmd->retry_count < MAX_CMD_RETRIES) { + retry_cmd = 1; + printk(KERN_WARNING + "cciss%d: retrying %p\n", h->ctlr, cmd); + cmd->retry_count++; + } else + printk(KERN_WARNING + "cciss%d: %p retried too " + "many times\n", h->ctlr, cmd); + status = 0; + break; + case CMD_TIMEOUT: + printk(KERN_WARNING "cciss: cmd %p timedout\n", cmd); + status = 0; + break; + default: + printk(KERN_WARNING "cciss: cmd %p returned " + "unknown status %x\n", cmd, + cmd->err_info->CommandStatus); + status = 0; + } + } + /* We need to return this command */ + if (retry_cmd) { + resend_cciss_cmd(h, cmd); + return; + } + + cmd->rq->completion_data = cmd; + cmd->rq->errors = status; + blk_add_trace_rq(cmd->rq->q, cmd->rq, BLK_TA_COMPLETE); + blk_complete_request(cmd->rq); +} + +/* + * Get a request and submit it to the controller. + */ +static void do_cciss_request(request_queue_t *q) +{ + ctlr_info_t *h = q->queuedata; + CommandList_struct *c; + int start_blk, seg; + struct request *creq; + u64bit temp64; + struct scatterlist tmp_sg[MAXSGENTRIES]; + drive_info_struct *drv; + int i, dir; + + /* We call start_io here in case there is a command waiting on the + * queue that has not been sent. + */ + if (blk_queue_plugged(q)) + goto startio; + + queue: + creq = elv_next_request(q); + if (!creq) + goto startio; + + BUG_ON(creq->nr_phys_segments > MAXSGENTRIES); + + if ((c = cmd_alloc(h, 1)) == NULL) + goto full; + + blkdev_dequeue_request(creq); + + spin_unlock_irq(q->queue_lock); + + c->cmd_type = CMD_RWREQ; + c->rq = creq; + + /* fill in the request */ + drv = creq->rq_disk->private_data; + c->Header.ReplyQueue = 0; // unused in simple mode + /* got command from pool, so use the command block index instead */ + /* for direct lookups. */ + /* The first 2 bits are reserved for controller error reporting. */ + c->Header.Tag.lower = (c->cmdindex << 3); + c->Header.Tag.lower |= 0x04; /* flag for direct lookup. */ + c->Header.LUN.LogDev.VolId = drv->LunID; + c->Header.LUN.LogDev.Mode = 1; + c->Request.CDBLen = 10; // 12 byte commands not in FW yet; + c->Request.Type.Type = TYPE_CMD; // It is a command. + c->Request.Type.Attribute = ATTR_SIMPLE; + c->Request.Type.Direction = + (rq_data_dir(creq) == READ) ? XFER_READ : XFER_WRITE; + c->Request.Timeout = 0; // Don't time out + c->Request.CDB[0] = + (rq_data_dir(creq) == READ) ? CCISS_READ : CCISS_WRITE; + start_blk = creq->sector; +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%d\n", (int)creq->sector, + (int)creq->nr_sectors); +#endif /* CCISS_DEBUG */ + + seg = blk_rq_map_sg(q, creq, tmp_sg); + + /* get the DMA records for the setup */ + if (c->Request.Type.Direction == XFER_READ) + dir = PCI_DMA_FROMDEVICE; + else + dir = PCI_DMA_TODEVICE; + + for (i = 0; i < seg; i++) { + c->SG[i].Len = tmp_sg[i].length; + temp64.val = (__u64) pci_map_page(h->pdev, tmp_sg[i].page, + tmp_sg[i].offset, + tmp_sg[i].length, dir); + c->SG[i].Addr.lower = temp64.val32.lower; + c->SG[i].Addr.upper = temp64.val32.upper; + c->SG[i].Ext = 0; // we are not chaining + } + /* track how many SG entries we are using */ + if (seg > h->maxSG) + h->maxSG = seg; + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", + creq->nr_sectors, seg); +#endif /* CCISS_DEBUG */ + + c->Header.SGList = c->Header.SGTotal = seg; + c->Request.CDB[1] = 0; + c->Request.CDB[2] = (start_blk >> 24) & 0xff; //MSB + c->Request.CDB[3] = (start_blk >> 16) & 0xff; + c->Request.CDB[4] = (start_blk >> 8) & 0xff; + c->Request.CDB[5] = start_blk & 0xff; + c->Request.CDB[6] = 0; // (sect >> 24) & 0xff; MSB + c->Request.CDB[7] = (creq->nr_sectors >> 8) & 0xff; + c->Request.CDB[8] = creq->nr_sectors & 0xff; + c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0; + + spin_lock_irq(q->queue_lock); + + addQ(&(h->reqQ), c); + h->Qdepth++; + if (h->Qdepth > h->maxQsinceinit) + h->maxQsinceinit = h->Qdepth; + + goto queue; + full: + blk_stop_queue(q); + startio: + /* We will already have the driver lock here so not need + * to lock it. + */ + start_io(h); +} + +static inline unsigned long get_next_completion(ctlr_info_t *h) +{ +#ifdef CONFIG_CISS_SCSI_TAPE + /* Any rejects from sendcmd() lying around? Process them first */ + if (h->scsi_rejects.ncompletions == 0) + return h->access.command_completed(h); + else { + struct sendcmd_reject_list *srl; + int n; + srl = &h->scsi_rejects; + n = --srl->ncompletions; + /* printk("cciss%d: processing saved reject\n", h->ctlr); */ + printk("p"); + return srl->complete[n]; + } +#else + return h->access.command_completed(h); +#endif +} + +static inline int interrupt_pending(ctlr_info_t *h) +{ +#ifdef CONFIG_CISS_SCSI_TAPE + return (h->access.intr_pending(h) + || (h->scsi_rejects.ncompletions > 0)); +#else + return h->access.intr_pending(h); +#endif +} + +static inline long interrupt_not_for_us(ctlr_info_t *h) +{ +#ifdef CONFIG_CISS_SCSI_TAPE + return (((h->access.intr_pending(h) == 0) || + (h->interrupts_enabled == 0)) + && (h->scsi_rejects.ncompletions == 0)); +#else + return (((h->access.intr_pending(h) == 0) || + (h->interrupts_enabled == 0))); +#endif +} + +static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs) +{ + ctlr_info_t *h = dev_id; + CommandList_struct *c; + unsigned long flags; + __u32 a, a1, a2; + + if (interrupt_not_for_us(h)) + return IRQ_NONE; + /* + * If there are completed commands in the completion queue, + * we had better do something about it. + */ + spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags); + while (interrupt_pending(h)) { + while ((a = get_next_completion(h)) != FIFO_EMPTY) { + a1 = a; + if ((a & 0x04)) { + a2 = (a >> 3); + if (a2 >= h->nr_cmds) { + printk(KERN_WARNING + "cciss: controller cciss%d failed, stopping.\n", + h->ctlr); + fail_all_cmds(h->ctlr); + return IRQ_HANDLED; + } + + c = h->cmd_pool + a2; + a = c->busaddr; + + } else { + a &= ~3; + if ((c = h->cmpQ) == NULL) { + printk(KERN_WARNING + "cciss: Completion of %08x ignored\n", + a1); + continue; + } + while (c->busaddr != a) { + c = c->next; + if (c == h->cmpQ) + break; + } + } + /* + * If we've found the command, take it off the + * completion Q and free it + */ + if (c->busaddr == a) { + removeQ(&h->cmpQ, c); + if (c->cmd_type == CMD_RWREQ) { + complete_command(h, c, 0); + } else if (c->cmd_type == CMD_IOCTL_PEND) { + complete(c->waiting); + } +# ifdef CONFIG_CISS_SCSI_TAPE + else if (c->cmd_type == CMD_SCSI) + complete_scsi_command(c, 0, a1); +# endif + continue; + } + } + } + + spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags); + return IRQ_HANDLED; +} + +/* + * We cannot read the structure directly, for portability we must use + * the io functions. + * This is for debug only. + */ +#ifdef CCISS_DEBUG +static void print_cfg_table(CfgTable_struct *tb) +{ + int i; + char temp_name[17]; + + printk("Controller Configuration information\n"); + printk("------------------------------------\n"); + for (i = 0; i < 4; i++) + temp_name[i] = readb(&(tb->Signature[i])); + temp_name[4] = '\0'; + printk(" Signature = %s\n", temp_name); + printk(" Spec Number = %d\n", readl(&(tb->SpecValence))); + printk(" Transport methods supported = 0x%x\n", + readl(&(tb->TransportSupport))); + printk(" Transport methods active = 0x%x\n", + readl(&(tb->TransportActive))); + printk(" Requested transport Method = 0x%x\n", + readl(&(tb->HostWrite.TransportRequest))); + printk(" Coalesce Interrupt Delay = 0x%x\n", + readl(&(tb->HostWrite.CoalIntDelay))); + printk(" Coalesce Interrupt Count = 0x%x\n", + readl(&(tb->HostWrite.CoalIntCount))); + printk(" Max outstanding commands = 0x%d\n", + readl(&(tb->CmdsOutMax))); + printk(" Bus Types = 0x%x\n", readl(&(tb->BusTypes))); + for (i = 0; i < 16; i++) + temp_name[i] = readb(&(tb->ServerName[i])); + temp_name[16] = '\0'; + printk(" Server Name = %s\n", temp_name); + printk(" Heartbeat Counter = 0x%x\n\n\n", readl(&(tb->HeartBeat))); +} +#endif /* CCISS_DEBUG */ + +static int find_PCI_BAR_index(struct pci_dev *pdev, unsigned long pci_bar_addr) +{ + int i, offset, mem_type, bar_type; + if (pci_bar_addr == PCI_BASE_ADDRESS_0) /* looking for BAR zero? */ + return 0; + offset = 0; + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { + bar_type = pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE; + if (bar_type == PCI_BASE_ADDRESS_SPACE_IO) + offset += 4; + else { + mem_type = pci_resource_flags(pdev, i) & + PCI_BASE_ADDRESS_MEM_TYPE_MASK; + switch (mem_type) { + case PCI_BASE_ADDRESS_MEM_TYPE_32: + case PCI_BASE_ADDRESS_MEM_TYPE_1M: + offset += 4; /* 32 bit */ + break; + case PCI_BASE_ADDRESS_MEM_TYPE_64: + offset += 8; + break; + default: /* reserved in PCI 2.2 */ + printk(KERN_WARNING + "Base address is invalid\n"); + return -1; + break; + } + } + if (offset == pci_bar_addr - PCI_BASE_ADDRESS_0) + return i + 1; + } + return -1; +} + +/* If MSI/MSI-X is supported by the kernel we will try to enable it on + * controllers that are capable. If not, we use IO-APIC mode. + */ + +static void __devinit cciss_interrupt_mode(ctlr_info_t *c, + struct pci_dev *pdev, __u32 board_id) +{ +#ifdef CONFIG_PCI_MSI + int err; + struct msix_entry cciss_msix_entries[4] = { {0, 0}, {0, 1}, + {0, 2}, {0, 3} + }; + + /* Some boards advertise MSI but don't really support it */ + if ((board_id == 0x40700E11) || + (board_id == 0x40800E11) || + (board_id == 0x40820E11) || (board_id == 0x40830E11)) + goto default_int_mode; + if (pci_find_capability(pdev, PCI_CAP_ID_MSIX)) { + printk(KERN_WARNING "cciss: MSIX\n"); + err = pci_enable_msix(pdev, cciss_msix_entries, 4); + if (!err) { + c->intr[0] = cciss_msix_entries[0].vector; + c->intr[1] = cciss_msix_entries[1].vector; + c->intr[2] = cciss_msix_entries[2].vector; + c->intr[3] = cciss_msix_entries[3].vector; + c->msix_vector = 1; + return; + } + if (err > 0) { + printk(KERN_WARNING "cciss: only %d MSI-X vectors " + "available\n", err); + goto default_int_mode; + } else { + printk(KERN_WARNING "cciss: MSI-X init failed %d\n", + err); + goto default_int_mode; + } + } + if (pci_find_capability(pdev, PCI_CAP_ID_MSI)) { + printk(KERN_WARNING "cciss: MSI\n"); + if (!pci_enable_msi(pdev)) { + c->msi_vector = 1; + } else { + printk(KERN_WARNING "cciss: MSI init failed\n"); + } + } +default_int_mode: +#endif /* CONFIG_PCI_MSI */ + /* if we get here we're going to use the default interrupt mode */ + c->intr[SIMPLE_MODE_INT] = pdev->irq; + return; +} + +static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev) +{ + ushort subsystem_vendor_id, subsystem_device_id, command; + __u32 board_id, scratchpad = 0; + __u64 cfg_offset; + __u32 cfg_base_addr; + __u64 cfg_base_addr_index; + int i, err; + + /* check to see if controller has been disabled */ + /* BEFORE trying to enable it */ + (void)pci_read_config_word(pdev, PCI_COMMAND, &command); + if (!(command & 0x02)) { + printk(KERN_WARNING + "cciss: controller appears to be disabled\n"); + return -ENODEV; + } + + err = pci_enable_device(pdev); + if (err) { + printk(KERN_ERR "cciss: Unable to Enable PCI device\n"); + return err; + } + + err = pci_request_regions(pdev, "cciss"); + if (err) { + printk(KERN_ERR "cciss: Cannot obtain PCI resources, " + "aborting\n"); + return err; + } + + subsystem_vendor_id = pdev->subsystem_vendor; + subsystem_device_id = pdev->subsystem_device; + board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) | + subsystem_vendor_id); + +#ifdef CCISS_DEBUG + printk("command = %x\n", command); + printk("irq = %x\n", pdev->irq); + printk("board_id = %x\n", board_id); +#endif /* CCISS_DEBUG */ + +/* If the kernel supports MSI/MSI-X we will try to enable that functionality, + * else we use the IO-APIC interrupt assigned to us by system ROM. + */ + cciss_interrupt_mode(c, pdev, board_id); + + /* + * Memory base addr is first addr , the second points to the config + * table + */ + + c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */ +#ifdef CCISS_DEBUG + printk("address 0 = %x\n", c->paddr); +#endif /* CCISS_DEBUG */ + c->vaddr = remap_pci_mem(c->paddr, 0x250); + + /* Wait for the board to become ready. (PCI hotplug needs this.) + * We poll for up to 120 secs, once per 100ms. */ + for (i = 0; i < 1200; i++) { + scratchpad = readl(c->vaddr + SA5_SCRATCHPAD_OFFSET); + if (scratchpad == CCISS_FIRMWARE_READY) + break; + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ / 10); /* wait 100ms */ + } + if (scratchpad != CCISS_FIRMWARE_READY) { + printk(KERN_WARNING "cciss: Board not ready. Timed out.\n"); + err = -ENODEV; + goto err_out_free_res; + } + + /* get the address index number */ + cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET); + cfg_base_addr &= (__u32) 0x0000ffff; +#ifdef CCISS_DEBUG + printk("cfg base address = %x\n", cfg_base_addr); +#endif /* CCISS_DEBUG */ + cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr); +#ifdef CCISS_DEBUG + printk("cfg base address index = %x\n", cfg_base_addr_index); +#endif /* CCISS_DEBUG */ + if (cfg_base_addr_index == -1) { + printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n"); + err = -ENODEV; + goto err_out_free_res; + } + + cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET); +#ifdef CCISS_DEBUG + printk("cfg offset = %x\n", cfg_offset); +#endif /* CCISS_DEBUG */ + c->cfgtable = remap_pci_mem(pci_resource_start(pdev, + cfg_base_addr_index) + + cfg_offset, sizeof(CfgTable_struct)); + c->board_id = board_id; + +#ifdef CCISS_DEBUG + print_cfg_table(c->cfgtable); +#endif /* CCISS_DEBUG */ + + /* Some controllers support Zero Memory RAID (ZMR). + * When configured in ZMR mode, these controllers + * reduce the number of supported commands to 64. + * Instead of setting a hardcoded value, we read + * the config table to discover how many commands the + * controller is supporting, then reduce that by 4 to + * allow for ioctl calls. + */ + c->max_commands = readl(&(c->cfgtable->CmdsOutMax)); + for (i = 0; i < ARRAY_SIZE(products); i++) { + if (board_id == products[i].board_id) { + c->product_name = products[i].product_name; + c->access = *(products[i].access); + c->nr_cmds = c->max_commands - 4; + break; + } + } + if (i == ARRAY_SIZE(products)) { + printk(KERN_WARNING "cciss: Sorry, I don't know how" + " to access the Smart Array controller %08lx\n", + (unsigned long)board_id); + err = -ENODEV; + goto err_out_free_res; + } + if ((readb(&c->cfgtable->Signature[0]) != 'C') || + (readb(&c->cfgtable->Signature[1]) != 'I') || + (readb(&c->cfgtable->Signature[2]) != 'S') || + (readb(&c->cfgtable->Signature[3]) != 'S')) { + printk("Does not appear to be a valid CISS config table\n"); + err = -ENODEV; + goto err_out_free_res; + } +#ifdef CONFIG_X86 + { + /* Need to enable prefetch in the SCSI core for 6400 in x86 */ + __u32 prefetch; + prefetch = readl(&(c->cfgtable->SCSI_Prefetch)); + prefetch |= 0x100; + writel(prefetch, &(c->cfgtable->SCSI_Prefetch)); + } +#endif + + /* Disabling DMA prefetch for the P600 + * An ASIC bug may result in a prefetch beyond + * physical memory. + */ + if(board_id == 0x3225103C) { + __u32 dma_prefetch; + dma_prefetch = readl(c->vaddr + I2O_DMA1_CFG); + dma_prefetch |= 0x8000; + writel(dma_prefetch, c->vaddr + I2O_DMA1_CFG); + } + +#ifdef CCISS_DEBUG + printk("Trying to put board into Simple mode\n"); +#endif /* CCISS_DEBUG */ + c->max_commands = readl(&(c->cfgtable->CmdsOutMax)); + /* Update the field, and then ring the doorbell */ + writel(CFGTBL_Trans_Simple, &(c->cfgtable->HostWrite.TransportRequest)); + writel(CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL); + + /* under certain very rare conditions, this can take awhile. + * (e.g.: hot replace a failed 144GB drive in a RAID 5 set right + * as we enter this code.) */ + for (i = 0; i < MAX_CONFIG_WAIT; i++) { + if (!(readl(c->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq)) + break; + /* delay and try again */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(10); + } + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "I counter got to %d %x\n", i, + readl(c->vaddr + SA5_DOORBELL)); +#endif /* CCISS_DEBUG */ +#ifdef CCISS_DEBUG + print_cfg_table(c->cfgtable); +#endif /* CCISS_DEBUG */ + + if (!(readl(&(c->cfgtable->TransportActive)) & CFGTBL_Trans_Simple)) { + printk(KERN_WARNING "cciss: unable to get board into" + " simple mode\n"); + err = -ENODEV; + goto err_out_free_res; + } + return 0; + + err_out_free_res: + /* + * Deliberately omit pci_disable_device(): it does something nasty to + * Smart Array controllers that pci_enable_device does not undo + */ + pci_release_regions(pdev); + return err; +} + +/* + * Gets information about the local volumes attached to the controller. + */ +static void cciss_getgeometry(int cntl_num) +{ + ReportLunData_struct *ld_buff; + ReadCapdata_struct *size_buff; + InquiryData_struct *inq_buff; + int return_code; + int i; + int listlength = 0; + __u32 lunid = 0; + int block_size; + int total_size; + + ld_buff = kzalloc(sizeof(ReportLunData_struct), GFP_KERNEL); + if (ld_buff == NULL) { + printk(KERN_ERR "cciss: out of memory\n"); + return; + } + size_buff = kmalloc(sizeof(ReadCapdata_struct), GFP_KERNEL); + if (size_buff == NULL) { + printk(KERN_ERR "cciss: out of memory\n"); + kfree(ld_buff); + return; + } + inq_buff = kmalloc(sizeof(InquiryData_struct), GFP_KERNEL); + if (inq_buff == NULL) { + printk(KERN_ERR "cciss: out of memory\n"); + kfree(ld_buff); + kfree(size_buff); + return; + } + /* Get the firmware version */ + return_code = sendcmd(CISS_INQUIRY, cntl_num, inq_buff, + sizeof(InquiryData_struct), 0, 0, 0, NULL, + TYPE_CMD); + if (return_code == IO_OK) { + hba[cntl_num]->firm_ver[0] = inq_buff->data_byte[32]; + hba[cntl_num]->firm_ver[1] = inq_buff->data_byte[33]; + hba[cntl_num]->firm_ver[2] = inq_buff->data_byte[34]; + hba[cntl_num]->firm_ver[3] = inq_buff->data_byte[35]; + } else { /* send command failed */ + + printk(KERN_WARNING "cciss: unable to determine firmware" + " version of controller\n"); + } + /* Get the number of logical volumes */ + return_code = sendcmd(CISS_REPORT_LOG, cntl_num, ld_buff, + sizeof(ReportLunData_struct), 0, 0, 0, NULL, + TYPE_CMD); + + if (return_code == IO_OK) { +#ifdef CCISS_DEBUG + printk("LUN Data\n--------------------------\n"); +#endif /* CCISS_DEBUG */ + + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24; + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16; + listlength |= + (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8; + listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]); + } else { /* reading number of logical volumes failed */ + + printk(KERN_WARNING "cciss: report logical volume" + " command failed\n"); + listlength = 0; + } + hba[cntl_num]->num_luns = listlength / 8; // 8 bytes pre entry + if (hba[cntl_num]->num_luns > CISS_MAX_LUN) { + printk(KERN_ERR + "ciss: only %d number of logical volumes supported\n", + CISS_MAX_LUN); + hba[cntl_num]->num_luns = CISS_MAX_LUN; + } +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "Length = %x %x %x %x = %d\n", + ld_buff->LUNListLength[0], ld_buff->LUNListLength[1], + ld_buff->LUNListLength[2], ld_buff->LUNListLength[3], + hba[cntl_num]->num_luns); +#endif /* CCISS_DEBUG */ + + hba[cntl_num]->highest_lun = hba[cntl_num]->num_luns - 1; +// for(i=0; i< hba[cntl_num]->num_luns; i++) + for (i = 0; i < CISS_MAX_LUN; i++) { + if (i < hba[cntl_num]->num_luns) { + lunid = (0xff & (unsigned int)(ld_buff->LUN[i][3])) + << 24; + lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][2])) + << 16; + lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][1])) + << 8; + lunid |= 0xff & (unsigned int)(ld_buff->LUN[i][0]); + + hba[cntl_num]->drv[i].LunID = lunid; + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "LUN[%d]: %x %x %x %x = %x\n", i, + ld_buff->LUN[i][0], ld_buff->LUN[i][1], + ld_buff->LUN[i][2], ld_buff->LUN[i][3], + hba[cntl_num]->drv[i].LunID); +#endif /* CCISS_DEBUG */ + cciss_read_capacity(cntl_num, i, size_buff, 0, + &total_size, &block_size); + cciss_geometry_inquiry(cntl_num, i, 0, total_size, + block_size, inq_buff, + &hba[cntl_num]->drv[i]); + } else { + /* initialize raid_level to indicate a free space */ + hba[cntl_num]->drv[i].raid_level = -1; + } + } + kfree(ld_buff); + kfree(size_buff); + kfree(inq_buff); +} + +/* Function to find the first free pointer into our hba[] array */ +/* Returns -1 if no free entries are left. */ +static int alloc_cciss_hba(void) +{ + struct gendisk *disk[NWD]; + int i, n; + for (n = 0; n < NWD; n++) { + disk[n] = alloc_disk(1 << NWD_SHIFT); + if (!disk[n]) + goto out; + } + + for (i = 0; i < MAX_CTLR; i++) { + if (!hba[i]) { + ctlr_info_t *p; + p = kzalloc(sizeof(ctlr_info_t), GFP_KERNEL); + if (!p) + goto Enomem; + for (n = 0; n < NWD; n++) + p->gendisk[n] = disk[n]; + hba[i] = p; + return i; + } + } + printk(KERN_WARNING "cciss: This driver supports a maximum" + " of %d controllers.\n", MAX_CTLR); + goto out; + Enomem: + printk(KERN_ERR "cciss: out of memory.\n"); + out: + while (n--) + put_disk(disk[n]); + return -1; +} + +static void free_hba(int i) +{ + ctlr_info_t *p = hba[i]; + int n; + + hba[i] = NULL; + for (n = 0; n < NWD; n++) + put_disk(p->gendisk[n]); + kfree(p); +} + +#if defined(__VMKLNX__) +static void unregister_chrdevs(int ctlr) +{ + int j; + char* charname = (char*) kmalloc (sizeof(char) * 15, GFP_KERNEL); + + for (j = 0; j < NWD; j++) { + if (devmajors[ctlr][j].char_major) { + sprintf(charname, "cciss-c%dd%d", ctlr, j); + unregister_chrdev(devmajors[ctlr][j].char_major, charname); + } + } + kfree(charname); +} +#endif /* defined(__VMKLNX__) */ + +/* + * This is it. Find all the controllers and register them. I really hate + * stealing all these major device numbers. + * returns the number of block devices registered. + */ +static int __devinit cciss_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + request_queue_t *q; + int i; + int j; + int rc; + int dac; + + i = alloc_cciss_hba(); + if (i < 0) + return -1; + + hba[i]->busy_initializing = 1; + + if (cciss_pci_init(hba[i], pdev) != 0) + goto clean1; + + sprintf(hba[i]->devname, "cciss%d", i); + hba[i]->ctlr = i; + hba[i]->pdev = pdev; + + /* configure PCI DMA stuff */ + if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) + dac = 1; + else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK)) + dac = 0; + else { + printk(KERN_ERR "cciss: no suitable DMA available\n"); + goto clean1; + } + + /* + * register with the major number, or get a dynamic major number + * by passing 0 as argument. This is done for greater than + * 8 controller support. + */ + if (i < MAX_CTLR_ORIG) + hba[i]->major = COMPAQ_CISS_MAJOR + i; +#if defined(__VMKLNX__) + /* + * TODO: kalyanc; try to avoid this + */ + rc = 0; // Never used + // we really need a way for return code to return dynamic major number here. + if (vmklnx_register_blkdev(hba[i]->major, "cciss", +#if VMKLNX_DDI_VERSION >= VMKLNX_MAKE_VERSION(10,0) + pci_domain_nr(pdev->bus), +#endif /* VMKLNX_DDI_VERSION >= VMKLNX_MAKE_VERSION(10,0) */ + pdev->bus->number, pdev->devfn, + hba[i])) +#else /* !defined(__VMKLNX__) */ + rc = register_blkdev(hba[i]->major, hba[i]->devname); +#endif /* defined(__VMKLNX__) */ + if (rc == -EBUSY || rc == -EINVAL) { + printk(KERN_ERR + "cciss: Unable to get major number %d for %s " + "on hba %d\n", hba[i]->major, hba[i]->devname, i); + goto clean1; + } else { + if (i >= MAX_CTLR_ORIG) + hba[i]->major = rc; + } + + /* make sure the board interrupts are off */ + hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_OFF); + if (request_irq(hba[i]->intr[SIMPLE_MODE_INT], do_cciss_intr, + IRQF_DISABLED | IRQF_SHARED, hba[i]->devname, hba[i])) { + printk(KERN_ERR "cciss: Unable to get irq %d for %s\n", + hba[i]->intr[SIMPLE_MODE_INT], hba[i]->devname); + goto clean2; + } + + printk(KERN_INFO "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n", + hba[i]->devname, pdev->device, pci_name(pdev), + hba[i]->intr[SIMPLE_MODE_INT], dac ? "" : " not"); + + hba[i]->cmd_pool_bits = + kmalloc(((hba[i]->nr_cmds + BITS_PER_LONG - + 1) / BITS_PER_LONG) * sizeof(unsigned long), GFP_KERNEL); + hba[i]->cmd_pool = (CommandList_struct *) + pci_alloc_consistent(hba[i]->pdev, + hba[i]->nr_cmds * sizeof(CommandList_struct), + &(hba[i]->cmd_pool_dhandle)); + hba[i]->errinfo_pool = (ErrorInfo_struct *) + pci_alloc_consistent(hba[i]->pdev, + hba[i]->nr_cmds * sizeof(ErrorInfo_struct), + &(hba[i]->errinfo_pool_dhandle)); + if ((hba[i]->cmd_pool_bits == NULL) + || (hba[i]->cmd_pool == NULL) + || (hba[i]->errinfo_pool == NULL)) { + printk(KERN_ERR "cciss: out of memory"); + goto clean4; + } +#ifdef CONFIG_CISS_SCSI_TAPE + hba[i]->scsi_rejects.complete = + kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) * + (hba[i]->nr_cmds + 5), GFP_KERNEL); + if (hba[i]->scsi_rejects.complete == NULL) { + printk(KERN_ERR "cciss: out of memory"); + goto clean4; + } +#endif + spin_lock_init(&hba[i]->lock); + + /* Initialize the pdev driver private data. + have it point to hba[i]. */ + pci_set_drvdata(pdev, hba[i]); + /* command and error info recs zeroed out before + they are used */ + memset(hba[i]->cmd_pool_bits, 0, + ((hba[i]->nr_cmds + BITS_PER_LONG - + 1) / BITS_PER_LONG) * sizeof(unsigned long)); + +#ifdef CCISS_DEBUG + printk(KERN_DEBUG "Scanning for drives on controller cciss%d\n", i); +#endif /* CCISS_DEBUG */ + + cciss_getgeometry(i); + + cciss_scsi_setup(i); + + /* Turn the interrupts on so we can service requests */ + hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_ON); + + cciss_procinit(i); + hba[i]->busy_initializing = 0; + + for (j = 0; j < NWD; j++) { /* mfm */ + drive_info_struct *drv = &(hba[i]->drv[j]); + struct gendisk *disk = hba[i]->gendisk[j]; + + q = blk_init_queue(do_cciss_request, &hba[i]->lock); + if (!q) { + printk(KERN_ERR + "cciss: unable to allocate queue for disk %d\n", + j); + break; + } + drv->queue = q; + + q->backing_dev_info.ra_pages = READ_AHEAD; + blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask); + + /* This is a hardware imposed limit. */ + blk_queue_max_hw_segments(q, MAXSGENTRIES); + + /* This is a limit in the driver and could be eliminated. */ + blk_queue_max_phys_segments(q, MAXSGENTRIES); + +#if defined(__VMKLNX__) + disk->maxXfer = 512 * VMK_SECTOR_SIZE; +#else + blk_queue_max_sectors(q, 512); +#endif + + blk_queue_softirq_done(q, cciss_softirq_done); + + q->queuedata = hba[i]; + sprintf(disk->disk_name, "cciss/c%dd%d", i, j); + disk->major = hba[i]->major; + disk->first_minor = j << NWD_SHIFT; + disk->fops = &cciss_fops; + disk->queue = q; + disk->private_data = drv; + disk->driverfs_dev = &pdev->dev; + /* we must register the controller even if no disks exist */ + /* this is for the online array utilities */ + if (!drv->heads && j) + continue; + +#if defined(__VMKLNX__) + /* + * the management interface + */ + char* charname = (char*) kmalloc (sizeof(char) * 15, GFP_KERNEL); + sprintf(charname, "cciss-c%dd%d", i, j); + devmajors[i][j].char_major = register_chrdev(0, charname, &cciss_char_fops); + if (devmajors[i][j].char_major < 0) { + printk(KERN_WARNING + "cciss: failed to register char device %s\n", + charname); + } + kfree(charname); + devmajors[i][j].block_major = hba[i]->major; + devmajors[i][j].block_minor = disk->first_minor; + devmajors[i][j].bd_disk = disk; +#endif + + blk_queue_hardsect_size(q, drv->block_size); + set_capacity(disk, drv->nr_blocks); + add_disk(disk); +#if defined(__VMKLNX__) + disk->maxXfer = 4096*31; +#endif /* defined(__VMKLNX__) */ + } +#if defined(__VMKLNX__) + vmklnx_block_register_sglimit(hba[i]->major, MAXSGENTRIES); + vmklnx_block_init_done(hba[i]->major); +#endif /* defined(__VMKLNX__) */ + + return 1; + + clean4: +#ifdef CONFIG_CISS_SCSI_TAPE + kfree(hba[i]->scsi_rejects.complete); +#endif + kfree(hba[i]->cmd_pool_bits); + if (hba[i]->cmd_pool) + pci_free_consistent(hba[i]->pdev, + hba[i]->nr_cmds * sizeof(CommandList_struct), + hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle); + if (hba[i]->errinfo_pool) + pci_free_consistent(hba[i]->pdev, + hba[i]->nr_cmds * sizeof(ErrorInfo_struct), + hba[i]->errinfo_pool, + hba[i]->errinfo_pool_dhandle); + free_irq(hba[i]->intr[SIMPLE_MODE_INT], hba[i]); + clean2: + unregister_blkdev(hba[i]->major, hba[i]->devname); + clean1: + hba[i]->busy_initializing = 0; + free_hba(i); + return -1; +} + +static void cciss_shutdown(struct pci_dev *pdev) +{ + ctlr_info_t *tmp_ptr; + int i; + char flush_buf[4]; + int return_code; + + printk(KERN_INFO "cciss_shutdown: flushing cache on controller\n"); + + tmp_ptr = pci_get_drvdata(pdev); + if (tmp_ptr == NULL) + return; + i = tmp_ptr->ctlr; + if (hba[i] == NULL) + return; + + /* Turn board interrupts off and send the flush cache command */ + /* sendcmd will turn off interrupt, and send the flush... + * To write all data in the battery backed cache to disks */ + memset(flush_buf, 0, 4); + return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL, + TYPE_CMD); + if (return_code == IO_OK) { + printk(KERN_INFO "Completed flushing cache on controller %d\n", i); + } else { + printk(KERN_WARNING "Error flushing cache on controller %d\n", i); + } + free_irq(hba[i]->intr[2], hba[i]); +} + +static void __devexit cciss_remove_one(struct pci_dev *pdev) +{ + ctlr_info_t *tmp_ptr; + int i, j; + char flush_buf[4]; + int return_code; + + if (pci_get_drvdata(pdev) == NULL) { + printk(KERN_ERR "cciss: Unable to remove device \n"); + return; + } + tmp_ptr = pci_get_drvdata(pdev); + i = tmp_ptr->ctlr; + if (hba[i] == NULL) { + printk(KERN_ERR "cciss: device appears to " + "already be removed \n"); + return; + } + /* Turn board interrupts off and send the flush cache command */ + /* sendcmd will turn off interrupt, and send the flush... + * To write all data in the battery backed cache to disks */ + memset(flush_buf, 0, 4); + return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL, + TYPE_CMD); + if (return_code != IO_OK) { + printk(KERN_WARNING "Error Flushing cache on controller %d\n", + i); + } + free_irq(hba[i]->intr[2], hba[i]); +#ifdef CONFIG_PCI_MSI + if (hba[i]->msix_vector) + pci_disable_msix(hba[i]->pdev); + else if (hba[i]->msi_vector) + pci_disable_msi(hba[i]->pdev); +#endif /* CONFIG_PCI_MSI */ + + iounmap(hba[i]->vaddr); + cciss_unregister_scsi(i); /* unhook from SCSI subsystem */ +#if defined(__VMKLNX__) + unregister_chrdevs(i); +#endif /* defined(__VMKLNX__) */ + unregister_blkdev(hba[i]->major, hba[i]->devname); + remove_proc_entry(hba[i]->devname, proc_cciss); + + /* remove it from the disk list */ + for (j = 0; j < NWD; j++) { + struct gendisk *disk = hba[i]->gendisk[j]; + if (disk) { + request_queue_t *q = disk->queue; + + if (disk->flags & GENHD_FL_UP) + del_gendisk(disk); + if (q) + blk_cleanup_queue(q); + } + } + + pci_free_consistent(hba[i]->pdev, hba[i]->nr_cmds * sizeof(CommandList_struct), + hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle); + pci_free_consistent(hba[i]->pdev, hba[i]->nr_cmds * sizeof(ErrorInfo_struct), + hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle); + kfree(hba[i]->cmd_pool_bits); +#ifdef CONFIG_CISS_SCSI_TAPE + kfree(hba[i]->scsi_rejects.complete); +#endif + /* + * Deliberately omit pci_disable_device(): it does something nasty to + * Smart Array controllers that pci_enable_device does not undo + */ + pci_release_regions(pdev); + pci_set_drvdata(pdev, NULL); + free_hba(i); +} + +static struct pci_driver cciss_pci_driver = { + .name = "cciss", + .probe = cciss_init_one, + .remove = __devexit_p(cciss_remove_one), + .id_table = cciss_pci_device_id, /* id_table */ + .shutdown = cciss_shutdown, +}; + +/* + * This is it. Register the PCI driver information for the cards we control + * the OS will call our registered routines when it finds one of our cards. + */ +static int __init cciss_init(void) +{ + printk(KERN_INFO DRIVER_NAME "\n"); + + /* Register for our PCI devices */ + return pci_register_driver(&cciss_pci_driver); +} + +#if defined (__VMKLNX__) +static int __init init_cciss_module(void) +{ + int status; + + printk(KERN_INFO DRIVER_NAME "VMKLNX\n"); + vmklnx_block_init_start(); + status = cciss_init(); + return status; +} +#endif /* defined(__VMKLNX__) */ + +static void __exit cciss_cleanup(void) +{ + int i; + + pci_unregister_driver(&cciss_pci_driver); + /* double check that all controller entrys have been removed */ + for (i = 0; i < MAX_CTLR; i++) { + if (hba[i] != NULL) { + printk(KERN_WARNING "cciss: had to remove" + " controller %d\n", i); + cciss_remove_one(hba[i]->pdev); + } + } + remove_proc_entry("cciss", proc_root_driver); +} + +static void fail_all_cmds(unsigned long ctlr) +{ + /* If we get here, the board is apparently dead. */ + ctlr_info_t *h = hba[ctlr]; + CommandList_struct *c; + unsigned long flags; + + printk(KERN_WARNING "cciss%d: controller not responding.\n", h->ctlr); + h->alive = 0; /* the controller apparently died... */ + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + + pci_disable_device(h->pdev); /* Make sure it is really dead. */ + + /* move everything off the request queue onto the completed queue */ + while ((c = h->reqQ) != NULL) { + removeQ(&(h->reqQ), c); + h->Qdepth--; + addQ(&(h->cmpQ), c); + } + + /* Now, fail everything on the completed queue with a HW error */ + while ((c = h->cmpQ) != NULL) { + removeQ(&h->cmpQ, c); + c->err_info->CommandStatus = CMD_HARDWARE_ERR; + if (c->cmd_type == CMD_RWREQ) { + complete_command(h, c, 0); + } else if (c->cmd_type == CMD_IOCTL_PEND) + complete(c->waiting); +#ifdef CONFIG_CISS_SCSI_TAPE + else if (c->cmd_type == CMD_SCSI) + complete_scsi_command(c, 0, 0); +#endif + } + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + return; +} + +#if defined (__VMKLNX__) +module_init(init_cciss_module); +#else /* !defined(__VMKLNX__) */ +module_init(cciss_init); +#endif /* defined(__VMKLNX__) */ +module_exit(cciss_cleanup); diff --git a/vmkdrivers/src_current/drivers/block/cciss/cciss.h b/vmkdrivers/src_current/drivers/block/cciss/cciss.h new file mode 100644 index 0000000..c04a46a --- /dev/null +++ b/vmkdrivers/src_current/drivers/block/cciss/cciss.h @@ -0,0 +1,289 @@ +#ifndef CCISS_H +#define CCISS_H + +#include + +#include "cciss_cmd.h" + + +#define NWD 16 +#define NWD_SHIFT 4 +#define MAX_PART (1 << NWD_SHIFT) + +#define IO_OK 0 +#define IO_ERROR 1 + +struct ctlr_info; +typedef struct ctlr_info ctlr_info_t; + +struct access_method { + void (*submit_command)(ctlr_info_t *h, CommandList_struct *c); + void (*set_intr_mask)(ctlr_info_t *h, unsigned long val); + unsigned long (*fifo_full)(ctlr_info_t *h); + unsigned long (*intr_pending)(ctlr_info_t *h); + unsigned long (*command_completed)(ctlr_info_t *h); +}; +typedef struct _drive_info_struct +{ + __u32 LunID; + int usage_count; + struct request_queue *queue; + sector_t nr_blocks; + int block_size; + int heads; + int sectors; + int cylinders; + int raid_level; /* set to -1 to indicate that + * the drive is not in use/configured + */ + int busy_configuring; /*This is set when the drive is being removed + *to prevent it from being opened or it's queue + *from being started. + */ +} drive_info_struct; + +#ifdef CONFIG_CISS_SCSI_TAPE + +struct sendcmd_reject_list { + int ncompletions; + unsigned long *complete; /* array of NR_CMDS tags */ +}; + +#endif +struct ctlr_info +{ + int ctlr; + char devname[8]; + char *product_name; + char firm_ver[4]; // Firmware version + struct pci_dev *pdev; + __u32 board_id; + void __iomem *vaddr; + unsigned long paddr; + int nr_cmds; /* Number of commands allowed on this controller */ + CfgTable_struct __iomem *cfgtable; + int interrupts_enabled; + int major; + int max_commands; + int commands_outstanding; + int max_outstanding; /* Debug */ + int num_luns; + int highest_lun; + int usage_count; /* number of opens all all minor devices */ +# define DOORBELL_INT 0 +# define PERF_MODE_INT 1 +# define SIMPLE_MODE_INT 2 +# define MEMQ_MODE_INT 3 + unsigned int intr[4]; + unsigned int msix_vector; + unsigned int msi_vector; + + // information about each logical volume + drive_info_struct drv[CISS_MAX_LUN]; + + struct access_method access; + + /* queue and queue Info */ + CommandList_struct *reqQ; + CommandList_struct *cmpQ; + unsigned int Qdepth; + unsigned int maxQsinceinit; + unsigned int maxSG; + spinlock_t lock; + + //* pointers to command and error info pool */ + CommandList_struct *cmd_pool; + dma_addr_t cmd_pool_dhandle; + ErrorInfo_struct *errinfo_pool; + dma_addr_t errinfo_pool_dhandle; + unsigned long *cmd_pool_bits; + int nr_allocs; + int nr_frees; + int busy_configuring; + int busy_initializing; + + /* This element holds the zero based queue number of the last + * queue to be started. It is used for fairness. + */ + int next_to_run; + + // Disk structures we need to pass back + struct gendisk *gendisk[NWD]; +#ifdef CONFIG_CISS_SCSI_TAPE + void *scsi_ctlr; /* ptr to structure containing scsi related stuff */ + /* list of block side commands the scsi error handling sucked up */ + /* and saved for later processing */ + struct sendcmd_reject_list scsi_rejects; +#endif + unsigned char alive; +}; + +/* Defining the diffent access_menthods */ +/* + * Memory mapped FIFO interface (SMART 53xx cards) + */ +#define SA5_DOORBELL 0x20 +#define SA5_REQUEST_PORT_OFFSET 0x40 +#define SA5_REPLY_INTR_MASK_OFFSET 0x34 +#define SA5_REPLY_PORT_OFFSET 0x44 +#define SA5_INTR_STATUS 0x30 +#define SA5_SCRATCHPAD_OFFSET 0xB0 + +#define SA5_CTCFG_OFFSET 0xB4 +#define SA5_CTMEM_OFFSET 0xB8 + +#define SA5_INTR_OFF 0x08 +#define SA5B_INTR_OFF 0x04 +#define SA5_INTR_PENDING 0x08 +#define SA5B_INTR_PENDING 0x04 +#define FIFO_EMPTY 0xffffffff +#define CCISS_FIRMWARE_READY 0xffff0000 /* value in scratchpad register */ + +#define CISS_ERROR_BIT 0x02 + +#define CCISS_INTR_ON 1 +#define CCISS_INTR_OFF 0 +/* + Send the command to the hardware +*/ +static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c) +{ +#ifdef CCISS_DEBUG + printk("Sending %x - down to controller\n", c->busaddr ); +#endif /* CCISS_DEBUG */ + writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); + h->commands_outstanding++; + if ( h->commands_outstanding > h->max_outstanding) + h->max_outstanding = h->commands_outstanding; +} + +/* + * This card is the opposite of the other cards. + * 0 turns interrupts on... + * 0x08 turns them off... + */ +static void SA5_intr_mask(ctlr_info_t *h, unsigned long val) +{ + if (val) + { /* Turn interrupts on */ + h->interrupts_enabled = 1; + writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); + } else /* Turn them off */ + { + h->interrupts_enabled = 0; + writel( SA5_INTR_OFF, + h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); + } +} +/* + * This card is the opposite of the other cards. + * 0 turns interrupts on... + * 0x04 turns them off... + */ +static void SA5B_intr_mask(ctlr_info_t *h, unsigned long val) +{ + if (val) + { /* Turn interrupts on */ + h->interrupts_enabled = 1; + writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); + } else /* Turn them off */ + { + h->interrupts_enabled = 0; + writel( SA5B_INTR_OFF, + h->vaddr + SA5_REPLY_INTR_MASK_OFFSET); + } +} +/* + * Returns true if fifo is full. + * + */ +static unsigned long SA5_fifo_full(ctlr_info_t *h) +{ + if( h->commands_outstanding >= h->max_commands) + return(1); + else + return(0); + +} +/* + * returns value read from hardware. + * returns FIFO_EMPTY if there is nothing to read + */ +static unsigned long SA5_completed(ctlr_info_t *h) +{ + unsigned long register_value + = readl(h->vaddr + SA5_REPLY_PORT_OFFSET); + if(register_value != FIFO_EMPTY) + { + h->commands_outstanding--; +#ifdef CCISS_DEBUG + printk("cciss: Read %lx back from board\n", register_value); +#endif /* CCISS_DEBUG */ + } +#ifdef CCISS_DEBUG + else + { + printk("cciss: FIFO Empty read\n"); + } +#endif + return ( register_value); + +} +/* + * Returns true if an interrupt is pending.. + */ +static unsigned long SA5_intr_pending(ctlr_info_t *h) +{ + unsigned long register_value = + readl(h->vaddr + SA5_INTR_STATUS); +#ifdef CCISS_DEBUG + printk("cciss: intr_pending %lx\n", register_value); +#endif /* CCISS_DEBUG */ + if( register_value & SA5_INTR_PENDING) + return 1; + return 0 ; +} + +/* + * Returns true if an interrupt is pending.. + */ +static unsigned long SA5B_intr_pending(ctlr_info_t *h) +{ + unsigned long register_value = + readl(h->vaddr + SA5_INTR_STATUS); +#ifdef CCISS_DEBUG + printk("cciss: intr_pending %lx\n", register_value); +#endif /* CCISS_DEBUG */ + if( register_value & SA5B_INTR_PENDING) + return 1; + return 0 ; +} + + +static struct access_method SA5_access = { + SA5_submit_command, + SA5_intr_mask, + SA5_fifo_full, + SA5_intr_pending, + SA5_completed, +}; + +static struct access_method SA5B_access = { + SA5_submit_command, + SA5B_intr_mask, + SA5_fifo_full, + SA5B_intr_pending, + SA5_completed, +}; + +struct board_type { + __u32 board_id; + char *product_name; + struct access_method *access; + int nr_cmds; /* Max cmds this kind of ctlr can handle. */ +}; + +#define CCISS_LOCK(i) (&hba[i]->lock) + +#endif /* CCISS_H */ + diff --git a/vmkdrivers/src_current/drivers/block/cciss/cciss_cmd.h b/vmkdrivers/src_current/drivers/block/cciss/cciss_cmd.h new file mode 100644 index 0000000..5ecc073 --- /dev/null +++ b/vmkdrivers/src_current/drivers/block/cciss/cciss_cmd.h @@ -0,0 +1,276 @@ +#ifndef CCISS_CMD_H +#define CCISS_CMD_H +//########################################################################### +//DEFINES +//########################################################################### +#define CISS_VERSION "1.00" + +//general boundary defintions +#define SENSEINFOBYTES 32//note that this value may vary between host implementations +#define MAXSGENTRIES 31 +#define MAXREPLYQS 256 + +//Command Status value +#define CMD_SUCCESS 0x0000 +#define CMD_TARGET_STATUS 0x0001 +#define CMD_DATA_UNDERRUN 0x0002 +#define CMD_DATA_OVERRUN 0x0003 +#define CMD_INVALID 0x0004 +#define CMD_PROTOCOL_ERR 0x0005 +#define CMD_HARDWARE_ERR 0x0006 +#define CMD_CONNECTION_LOST 0x0007 +#define CMD_ABORTED 0x0008 +#define CMD_ABORT_FAILED 0x0009 +#define CMD_UNSOLICITED_ABORT 0x000A +#define CMD_TIMEOUT 0x000B +#define CMD_UNABORTABLE 0x000C + +//transfer direction +#define XFER_NONE 0x00 +#define XFER_WRITE 0x01 +#define XFER_READ 0x02 +#define XFER_RSVD 0x03 + +//task attribute +#define ATTR_UNTAGGED 0x00 +#define ATTR_SIMPLE 0x04 +#define ATTR_HEADOFQUEUE 0x05 +#define ATTR_ORDERED 0x06 +#define ATTR_ACA 0x07 + +//cdb type +#define TYPE_CMD 0x00 +#define TYPE_MSG 0x01 + +//config space register offsets +#define CFG_VENDORID 0x00 +#define CFG_DEVICEID 0x02 +#define CFG_I2OBAR 0x10 +#define CFG_MEM1BAR 0x14 + +//i2o space register offsets +#define I2O_IBDB_SET 0x20 +#define I2O_IBDB_CLEAR 0x70 +#define I2O_INT_STATUS 0x30 +#define I2O_INT_MASK 0x34 +#define I2O_IBPOST_Q 0x40 +#define I2O_OBPOST_Q 0x44 +#define I2O_DMA1_CFG 0x214 + +//Configuration Table +#define CFGTBL_ChangeReq 0x00000001l +#define CFGTBL_AccCmds 0x00000001l + +#define CFGTBL_Trans_Simple 0x00000002l + +#define CFGTBL_BusType_Ultra2 0x00000001l +#define CFGTBL_BusType_Ultra3 0x00000002l +#define CFGTBL_BusType_Fibre1G 0x00000100l +#define CFGTBL_BusType_Fibre2G 0x00000200l +typedef struct _vals32 +{ + __u32 lower; + __u32 upper; +} vals32; + +typedef union _u64bit +{ + vals32 val32; + __u64 val; +} u64bit; + +// Type defs used in the following structs +#define BYTE __u8 +#define WORD __u16 +#define HWORD __u16 +#define DWORD __u32 +#define QWORD vals32 + +//########################################################################### +//STRUCTURES +//########################################################################### +#define CISS_MAX_LUN 16 +#define CISS_MAX_PHYS_LUN 1024 +// SCSI-3 Cmmands + +#pragma pack(1) + +#define CISS_INQUIRY 0x12 +//Date returned +typedef struct _InquiryData_struct +{ + BYTE data_byte[36]; +} InquiryData_struct; + +#define CISS_REPORT_LOG 0xc2 /* Report Logical LUNs */ +#define CISS_REPORT_PHYS 0xc3 /* Report Physical LUNs */ +// Data returned +typedef struct _ReportLUNdata_struct +{ + BYTE LUNListLength[4]; + DWORD reserved; + BYTE LUN[CISS_MAX_LUN][8]; +} ReportLunData_struct; + +#define CCISS_READ_CAPACITY 0x25 /* Read Capacity */ +typedef struct _ReadCapdata_struct +{ + BYTE total_size[4]; // Total size in blocks + BYTE block_size[4]; // Size of blocks in bytes +} ReadCapdata_struct; + +// 12 byte commands not implemented in firmware yet. +// #define CCISS_READ 0xa8 // Read(12) +// #define CCISS_WRITE 0xaa // Write(12) + #define CCISS_READ 0x28 // Read(10) + #define CCISS_WRITE 0x2a // Write(10) + +// BMIC commands +#define BMIC_READ 0x26 +#define BMIC_WRITE 0x27 +#define BMIC_CACHE_FLUSH 0xc2 +#define CCISS_CACHE_FLUSH 0x01 //C2 was already being used by CCISS + +//Command List Structure +typedef union _SCSI3Addr_struct { + struct { + BYTE Dev; + BYTE Bus:6; + BYTE Mode:2; // b00 + } PeripDev; + struct { + BYTE DevLSB; + BYTE DevMSB:6; + BYTE Mode:2; // b01 + } LogDev; + struct { + BYTE Dev:5; + BYTE Bus:3; + BYTE Targ:6; + BYTE Mode:2; // b10 + } LogUnit; +} SCSI3Addr_struct; + +typedef struct _PhysDevAddr_struct { + DWORD TargetId:24; + DWORD Bus:6; + DWORD Mode:2; + SCSI3Addr_struct Target[2]; //2 level target device addr +} PhysDevAddr_struct; + +typedef struct _LogDevAddr_struct { + DWORD VolId:30; + DWORD Mode:2; + BYTE reserved[4]; +} LogDevAddr_struct; + +typedef union _LUNAddr_struct { + BYTE LunAddrBytes[8]; + SCSI3Addr_struct SCSI3Lun[4]; + PhysDevAddr_struct PhysDev; + LogDevAddr_struct LogDev; +} LUNAddr_struct; + +typedef struct _CommandListHeader_struct { + BYTE ReplyQueue; + BYTE SGList; + HWORD SGTotal; + QWORD Tag; + LUNAddr_struct LUN; +} CommandListHeader_struct; +typedef struct _RequestBlock_struct { + BYTE CDBLen; + struct { + BYTE Type:3; + BYTE Attribute:3; + BYTE Direction:2; + } Type; + HWORD Timeout; + BYTE CDB[16]; +} RequestBlock_struct; +typedef struct _ErrDescriptor_struct { + QWORD Addr; + DWORD Len; +} ErrDescriptor_struct; +typedef struct _SGDescriptor_struct { + QWORD Addr; + DWORD Len; + DWORD Ext; +} SGDescriptor_struct; + +typedef union _MoreErrInfo_struct{ + struct { + BYTE Reserved[3]; + BYTE Type; + DWORD ErrorInfo; + }Common_Info; + struct{ + BYTE Reserved[2]; + BYTE offense_size;//size of offending entry + BYTE offense_num; //byte # of offense 0-base + DWORD offense_value; + }Invalid_Cmd; +}MoreErrInfo_struct; +typedef struct _ErrorInfo_struct { + BYTE ScsiStatus; + BYTE SenseLen; + HWORD CommandStatus; + DWORD ResidualCnt; + MoreErrInfo_struct MoreErrInfo; + BYTE SenseInfo[SENSEINFOBYTES]; +} ErrorInfo_struct; + +/* Command types */ +#define CMD_RWREQ 0x00 +#define CMD_IOCTL_PEND 0x01 +#define CMD_SCSI 0x03 +#define CMD_MSG_DONE 0x04 +#define CMD_MSG_TIMEOUT 0x05 + +/* This structure needs to be divisible by 8 for new + * indexing method. + */ +#define PADSIZE (sizeof(long) - 4) +typedef struct _CommandList_struct { + CommandListHeader_struct Header; + RequestBlock_struct Request; + ErrDescriptor_struct ErrDesc; + SGDescriptor_struct SG[MAXSGENTRIES]; + /* information associated with the command */ + __u32 busaddr; /* physical address of this record */ + ErrorInfo_struct * err_info; /* pointer to the allocated mem */ + int ctlr; + int cmd_type; + long cmdindex; + struct _CommandList_struct *prev; + struct _CommandList_struct *next; + struct request * rq; + struct completion *waiting; + int retry_count; + void * scsi_cmd; + char pad[PADSIZE]; +} CommandList_struct; + +//Configuration Table Structure +typedef struct _HostWrite_struct { + DWORD TransportRequest; + DWORD Reserved; + DWORD CoalIntDelay; + DWORD CoalIntCount; +} HostWrite_struct; + +typedef struct _CfgTable_struct { + BYTE Signature[4]; + DWORD SpecValence; + DWORD TransportSupport; + DWORD TransportActive; + HostWrite_struct HostWrite; + DWORD CmdsOutMax; + DWORD BusTypes; + DWORD Reserved; + BYTE ServerName[16]; + DWORD HeartBeat; + DWORD SCSI_Prefetch; +} CfgTable_struct; +#pragma pack() +#endif // CCISS_CMD_H diff --git a/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.c b/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.c new file mode 100644 index 0000000..ae1a756 --- /dev/null +++ b/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.c @@ -0,0 +1,1539 @@ +/* + * Disk Array driver for Compaq SA53xx Controllers, SCSI Tape module + * Copyright 2001 Compaq Computer Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Questions/Comments/Bugfixes to iss_storagedev@hp.com + * + * Author: Stephen M. Cameron + */ +#ifdef CONFIG_CISS_SCSI_TAPE + +/* Here we have code to present the driver as a scsi driver + as it is simultaneously presented as a block driver. The + reason for doing this is to allow access to SCSI tape drives + through the array controller. Note in particular, neither + physical nor logical disks are presented through the scsi layer. */ + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "cciss_scsi.h" + +#define CCISS_ABORT_MSG 0x00 +#define CCISS_RESET_MSG 0x01 + +/* some prototypes... */ +static int sendcmd( + __u8 cmd, + int ctlr, + void *buff, + size_t size, + unsigned int use_unit_num, /* 0: address the controller, + 1: address logical volume log_unit, + 2: address is in scsi3addr */ + unsigned int log_unit, + __u8 page_code, + unsigned char *scsi3addr, + int cmd_type); + + +static int cciss_scsi_proc_info( + struct Scsi_Host *sh, + char *buffer, /* data buffer */ + char **start, /* where data in buffer starts */ + off_t offset, /* offset from start of imaginary file */ + int length, /* length of data in buffer */ + int func); /* 0 == read, 1 == write */ + +static int cciss_scsi_queue_command (struct scsi_cmnd *cmd, + void (* done)(struct scsi_cmnd *)); +static int cciss_eh_device_reset_handler(struct scsi_cmnd *); +static int cciss_eh_abort_handler(struct scsi_cmnd *); + +static struct cciss_scsi_hba_t ccissscsi[MAX_CTLR] = { + { .name = "cciss0", .ndevices = 0 }, + { .name = "cciss1", .ndevices = 0 }, + { .name = "cciss2", .ndevices = 0 }, + { .name = "cciss3", .ndevices = 0 }, + { .name = "cciss4", .ndevices = 0 }, + { .name = "cciss5", .ndevices = 0 }, + { .name = "cciss6", .ndevices = 0 }, + { .name = "cciss7", .ndevices = 0 }, +}; + +static struct scsi_host_template cciss_driver_template = { + .module = THIS_MODULE, + .name = "cciss", + .proc_name = "cciss", + .proc_info = cciss_scsi_proc_info, + .queuecommand = cciss_scsi_queue_command, + .can_queue = SCSI_CCISS_CAN_QUEUE, + .this_id = 7, + .sg_tablesize = MAXSGENTRIES, + .cmd_per_lun = 1, + .use_clustering = DISABLE_CLUSTERING, + /* Can't have eh_bus_reset_handler or eh_host_reset_handler for cciss */ + .eh_device_reset_handler= cciss_eh_device_reset_handler, + .eh_abort_handler = cciss_eh_abort_handler, +}; + +#pragma pack(1) +struct cciss_scsi_cmd_stack_elem_t { + CommandList_struct cmd; + ErrorInfo_struct Err; + __u32 busaddr; + __u32 pad; +}; + +#pragma pack() + +#define CMD_STACK_SIZE (SCSI_CCISS_CAN_QUEUE * \ + CCISS_MAX_SCSI_DEVS_PER_HBA + 2) + // plus two for init time usage + +#pragma pack(1) +struct cciss_scsi_cmd_stack_t { + struct cciss_scsi_cmd_stack_elem_t *pool; + struct cciss_scsi_cmd_stack_elem_t *elem[CMD_STACK_SIZE]; + dma_addr_t cmd_pool_handle; + int top; +}; +#pragma pack() + +struct cciss_scsi_adapter_data_t { + struct Scsi_Host *scsi_host; + struct cciss_scsi_cmd_stack_t cmd_stack; + int registered; + spinlock_t lock; // to protect ccissscsi[ctlr]; +}; + +#define CPQ_TAPE_LOCK(ctlr, flags) spin_lock_irqsave( \ + &(((struct cciss_scsi_adapter_data_t *) \ + hba[ctlr]->scsi_ctlr)->lock), flags); +#define CPQ_TAPE_UNLOCK(ctlr, flags) spin_unlock_irqrestore( \ + &(((struct cciss_scsi_adapter_data_t *) \ + hba[ctlr]->scsi_ctlr)->lock), flags); + +static CommandList_struct * +scsi_cmd_alloc(ctlr_info_t *h) +{ + /* assume only one process in here at a time, locking done by caller. */ + /* use CCISS_LOCK(ctlr) */ + /* might be better to rewrite how we allocate scsi commands in a way that */ + /* needs no locking at all. */ + + /* take the top memory chunk off the stack and return it, if any. */ + struct cciss_scsi_cmd_stack_elem_t *c; + struct cciss_scsi_adapter_data_t *sa; + struct cciss_scsi_cmd_stack_t *stk; + u64bit temp64; + + sa = (struct cciss_scsi_adapter_data_t *) h->scsi_ctlr; + stk = &sa->cmd_stack; + + if (stk->top < 0) + return NULL; + c = stk->elem[stk->top]; + /* memset(c, 0, sizeof(*c)); */ + memset(&c->cmd, 0, sizeof(c->cmd)); + memset(&c->Err, 0, sizeof(c->Err)); + /* set physical addr of cmd and addr of scsi parameters */ + c->cmd.busaddr = c->busaddr; + /* (__u32) (stk->cmd_pool_handle + + (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top)); */ + + temp64.val = (__u64) (c->busaddr + sizeof(CommandList_struct)); + /* (__u64) (stk->cmd_pool_handle + + (sizeof(struct cciss_scsi_cmd_stack_elem_t)*stk->top) + + sizeof(CommandList_struct)); */ + stk->top--; + c->cmd.ErrDesc.Addr.lower = temp64.val32.lower; + c->cmd.ErrDesc.Addr.upper = temp64.val32.upper; + c->cmd.ErrDesc.Len = sizeof(ErrorInfo_struct); + + c->cmd.ctlr = h->ctlr; + c->cmd.err_info = &c->Err; + + return (CommandList_struct *) c; +} + +static void +scsi_cmd_free(ctlr_info_t *h, CommandList_struct *cmd) +{ + /* assume only one process in here at a time, locking done by caller. */ + /* use CCISS_LOCK(ctlr) */ + /* drop the free memory chunk on top of the stack. */ + + struct cciss_scsi_adapter_data_t *sa; + struct cciss_scsi_cmd_stack_t *stk; + + sa = (struct cciss_scsi_adapter_data_t *) h->scsi_ctlr; + stk = &sa->cmd_stack; + if (stk->top >= CMD_STACK_SIZE) { + printk("cciss: scsi_cmd_free called too many times.\n"); + BUG(); + } + stk->top++; + stk->elem[stk->top] = (struct cciss_scsi_cmd_stack_elem_t *) cmd; +} + +static int +scsi_cmd_stack_setup(int ctlr, struct cciss_scsi_adapter_data_t *sa) +{ + int i; + struct cciss_scsi_cmd_stack_t *stk; + size_t size; + + stk = &sa->cmd_stack; + size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE; + + // pci_alloc_consistent guarantees 32-bit DMA address will + // be used + + stk->pool = (struct cciss_scsi_cmd_stack_elem_t *) + pci_alloc_consistent(hba[ctlr]->pdev, size, &stk->cmd_pool_handle); + + if (stk->pool == NULL) { + printk("stk->pool is null\n"); + return -1; + } + + for (i=0; ielem[i] = &stk->pool[i]; + stk->elem[i]->busaddr = (__u32) (stk->cmd_pool_handle + + (sizeof(struct cciss_scsi_cmd_stack_elem_t) * i)); + } + stk->top = CMD_STACK_SIZE-1; + return 0; +} + +static void +scsi_cmd_stack_free(int ctlr) +{ + struct cciss_scsi_adapter_data_t *sa; + struct cciss_scsi_cmd_stack_t *stk; + size_t size; + + sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr; + stk = &sa->cmd_stack; + if (stk->top != CMD_STACK_SIZE-1) { + printk( "cciss: %d scsi commands are still outstanding.\n", + CMD_STACK_SIZE - stk->top); + // BUG(); + printk("WE HAVE A BUG HERE!!! stk=0x%p\n", stk); + } + size = sizeof(struct cciss_scsi_cmd_stack_elem_t) * CMD_STACK_SIZE; + + pci_free_consistent(hba[ctlr]->pdev, size, stk->pool, stk->cmd_pool_handle); + stk->pool = NULL; +} + +/* scsi_device_types comes from scsi.h */ +#define DEVICETYPE(n) (n<0 || n>MAX_SCSI_DEVICE_CODE) ? \ + "Unknown" : scsi_device_types[n] + +#if 0 +static int xmargin=8; +static int amargin=60; + +static void +print_bytes (unsigned char *c, int len, int hex, int ascii) +{ + + int i; + unsigned char *x; + + if (hex) + { + x = c; + for (i=0;i0) printk("\n"); + if ((i % xmargin) == 0) printk("0x%04x:", i); + printk(" %02x", *x); + x++; + } + printk("\n"); + } + if (ascii) + { + x = c; + for (i=0;i0) printk("\n"); + if ((i % amargin) == 0) printk("0x%04x:", i); + if (*x > 26 && *x < 128) printk("%c", *x); + else printk("."); + x++; + } + printk("\n"); + } +} + +static void +print_cmd(CommandList_struct *cp) +{ + printk("queue:%d\n", cp->Header.ReplyQueue); + printk("sglist:%d\n", cp->Header.SGList); + printk("sgtot:%d\n", cp->Header.SGTotal); + printk("Tag:0x%08x/0x%08x\n", cp->Header.Tag.upper, + cp->Header.Tag.lower); + printk("LUN:0x%02x%02x%02x%02x%02x%02x%02x%02x\n", + cp->Header.LUN.LunAddrBytes[0], + cp->Header.LUN.LunAddrBytes[1], + cp->Header.LUN.LunAddrBytes[2], + cp->Header.LUN.LunAddrBytes[3], + cp->Header.LUN.LunAddrBytes[4], + cp->Header.LUN.LunAddrBytes[5], + cp->Header.LUN.LunAddrBytes[6], + cp->Header.LUN.LunAddrBytes[7]); + printk("CDBLen:%d\n", cp->Request.CDBLen); + printk("Type:%d\n",cp->Request.Type.Type); + printk("Attr:%d\n",cp->Request.Type.Attribute); + printk(" Dir:%d\n",cp->Request.Type.Direction); + printk("Timeout:%d\n",cp->Request.Timeout); + printk( "CDB: %02x %02x %02x %02x %02x %02x %02x %02x" + " %02x %02x %02x %02x %02x %02x %02x %02x\n", + cp->Request.CDB[0], cp->Request.CDB[1], + cp->Request.CDB[2], cp->Request.CDB[3], + cp->Request.CDB[4], cp->Request.CDB[5], + cp->Request.CDB[6], cp->Request.CDB[7], + cp->Request.CDB[8], cp->Request.CDB[9], + cp->Request.CDB[10], cp->Request.CDB[11], + cp->Request.CDB[12], cp->Request.CDB[13], + cp->Request.CDB[14], cp->Request.CDB[15]), + printk("edesc.Addr: 0x%08x/0%08x, Len = %d\n", + cp->ErrDesc.Addr.upper, cp->ErrDesc.Addr.lower, + cp->ErrDesc.Len); + printk("sgs..........Errorinfo:\n"); + printk("scsistatus:%d\n", cp->err_info->ScsiStatus); + printk("senselen:%d\n", cp->err_info->SenseLen); + printk("cmd status:%d\n", cp->err_info->CommandStatus); + printk("resid cnt:%d\n", cp->err_info->ResidualCnt); + printk("offense size:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_size); + printk("offense byte:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_num); + printk("offense value:%d\n", cp->err_info->MoreErrInfo.Invalid_Cmd.offense_value); + +} + +#endif + +static int +find_bus_target_lun(int ctlr, int *bus, int *target, int *lun) +{ + /* finds an unused bus, target, lun for a new device */ + /* assumes hba[ctlr]->scsi_ctlr->lock is held */ + int i, found=0; + unsigned char target_taken[CCISS_MAX_SCSI_DEVS_PER_HBA]; + + memset(&target_taken[0], 0, CCISS_MAX_SCSI_DEVS_PER_HBA); + + target_taken[SELF_SCSI_ID] = 1; + for (i=0;iscsi_ctlr->lock is held */ + int n = ccissscsi[ctlr].ndevices; + struct cciss_scsi_dev_t *sd; + + if (n >= CCISS_MAX_SCSI_DEVS_PER_HBA) { + printk("cciss%d: Too many devices, " + "some will be inaccessible.\n", ctlr); + return -1; + } + sd = &ccissscsi[ctlr].dev[n]; + if (find_bus_target_lun(ctlr, &sd->bus, &sd->target, &sd->lun) != 0) + return -1; + memcpy(&sd->scsi3addr[0], scsi3addr, 8); + sd->devtype = devtype; + ccissscsi[ctlr].ndevices++; + + /* initially, (before registering with scsi layer) we don't + know our hostno and we don't want to print anything first + time anyway (the scsi layer's inquiries will show that info) */ + if (hostno != -1) + printk("cciss%d: %s device c%db%dt%dl%d added.\n", + ctlr, DEVICETYPE(sd->devtype), hostno, + sd->bus, sd->target, sd->lun); + return 0; +} + +static void +cciss_scsi_remove_entry(int ctlr, int hostno, int entry) +{ + /* assumes hba[ctlr]->scsi_ctlr->lock is held */ + int i; + struct cciss_scsi_dev_t sd; + + if (entry < 0 || entry >= CCISS_MAX_SCSI_DEVS_PER_HBA) return; + sd = ccissscsi[ctlr].dev[entry]; + for (i=entry;iscsi3addr)) { + if (sd[j].devtype == csd->devtype) + found=2; + else + found=1; + break; + } + } + + if (found == 0) { /* device no longer present. */ + changes++; + /* printk("cciss%d: %s device c%db%dt%dl%d removed.\n", + ctlr, DEVICETYPE(csd->devtype), hostno, + csd->bus, csd->target, csd->lun); */ + cciss_scsi_remove_entry(ctlr, hostno, i); + /* note, i not incremented */ + } + else if (found == 1) { /* device is different kind */ + changes++; + printk("cciss%d: device c%db%dt%dl%d type changed " + "(device type now %s).\n", + ctlr, hostno, csd->bus, csd->target, csd->lun, + DEVICETYPE(csd->devtype)); + csd->devtype = sd[j].devtype; + i++; /* so just move along. */ + } else /* device is same as it ever was, */ + i++; /* so just move along. */ + } + + /* Now, make sure every device listed in sd[] is also + listed in ccissscsi[], adding them if they aren't found */ + + for (i=0;iscsi3addr)) { + if (sd[i].devtype == csd->devtype) + found=2; /* found device */ + else + found=1; /* found a bug. */ + break; + } + } + if (!found) { + changes++; + if (cciss_scsi_add_entry(ctlr, hostno, + &sd[i].scsi3addr[0], sd[i].devtype) != 0) + break; + } else if (found == 1) { + /* should never happen... */ + changes++; + printk("cciss%d: device unexpectedly changed type\n", + ctlr); + /* but if it does happen, we just ignore that device */ + } + } + CPQ_TAPE_UNLOCK(ctlr, flags); + + if (!changes) + printk("cciss%d: No device changes detected.\n", ctlr); + + return 0; +} + +static int +lookup_scsi3addr(int ctlr, int bus, int target, int lun, char *scsi3addr) +{ + int i; + struct cciss_scsi_dev_t *sd; + unsigned long flags; + + CPQ_TAPE_LOCK(ctlr, flags); + for (i=0;ibus == bus && + sd->target == target && + sd->lun == lun) { + memcpy(scsi3addr, &sd->scsi3addr[0], 8); + CPQ_TAPE_UNLOCK(ctlr, flags); + return 0; + } + } + CPQ_TAPE_UNLOCK(ctlr, flags); + return -1; +} + +static void +cciss_scsi_setup(int cntl_num) +{ + struct cciss_scsi_adapter_data_t * shba; + + ccissscsi[cntl_num].ndevices = 0; + shba = (struct cciss_scsi_adapter_data_t *) + kmalloc(sizeof(*shba), GFP_KERNEL); + if (shba == NULL) + return; + shba->scsi_host = NULL; + spin_lock_init(&shba->lock); + shba->registered = 0; + if (scsi_cmd_stack_setup(cntl_num, shba) != 0) { + kfree(shba); + shba = NULL; + } + hba[cntl_num]->scsi_ctlr = (void *) shba; + return; +} + +static void +complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag) +{ + struct scsi_cmnd *cmd; + ctlr_info_t *ctlr; + u64bit addr64; + ErrorInfo_struct *ei; + + ei = cp->err_info; + + /* First, see if it was a message rather than a command */ + if (cp->Request.Type.Type == TYPE_MSG) { + cp->cmd_type = CMD_MSG_DONE; + return; + } + + cmd = (struct scsi_cmnd *) cp->scsi_cmd; + ctlr = hba[cp->ctlr]; + + /* undo the DMA mappings */ + + if (cmd->use_sg) { + pci_unmap_sg(ctlr->pdev, + cmd->request_buffer, cmd->use_sg, + cmd->sc_data_direction); + } + else if (cmd->request_bufflen) { + addr64.val32.lower = cp->SG[0].Addr.lower; + addr64.val32.upper = cp->SG[0].Addr.upper; + pci_unmap_single(ctlr->pdev, (dma_addr_t) addr64.val, + cmd->request_bufflen, + cmd->sc_data_direction); + } + + cmd->result = (DID_OK << 16); /* host byte */ + cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */ + /* cmd->result |= (GOOD < 1); */ /* status byte */ + + cmd->result |= (ei->ScsiStatus); + /* printk("Scsistatus is 0x%02x\n", ei->ScsiStatus); */ + + /* copy the sense data whether we need to or not. */ + + memcpy(cmd->sense_buffer, ei->SenseInfo, + ei->SenseLen > SCSI_SENSE_BUFFERSIZE ? + SCSI_SENSE_BUFFERSIZE : + ei->SenseLen); + cmd->resid = ei->ResidualCnt; + + if(ei->CommandStatus != 0) + { /* an error has occurred */ + switch(ei->CommandStatus) + { + case CMD_TARGET_STATUS: + /* Pass it up to the upper layers... */ + if( ei->ScsiStatus) + { +#if 0 + printk(KERN_WARNING "cciss: cmd %p " + "has SCSI Status = %x\n", + cp, + ei->ScsiStatus); +#endif + cmd->result |= (ei->ScsiStatus < 1); + } + else { /* scsi status is zero??? How??? */ + + /* Ordinarily, this case should never happen, but there is a bug + in some released firmware revisions that allows it to happen + if, for example, a 4100 backplane loses power and the tape + drive is in it. We assume that it's a fatal error of some + kind because we can't show that it wasn't. We will make it + look like selection timeout since that is the most common + reason for this to occur, and it's severe enough. */ + + cmd->result = DID_NO_CONNECT << 16; + } + break; + case CMD_DATA_UNDERRUN: /* let mid layer handle it. */ + break; + case CMD_DATA_OVERRUN: + printk(KERN_WARNING "cciss: cp %p has" + " completed with data overrun " + "reported\n", cp); + break; + case CMD_INVALID: { + /* print_bytes(cp, sizeof(*cp), 1, 0); + print_cmd(cp); */ + /* We get CMD_INVALID if you address a non-existent tape drive instead + of a selection timeout (no response). You will see this if you yank + out a tape drive, then try to access it. This is kind of a shame + because it means that any other CMD_INVALID (e.g. driver bug) will + get interpreted as a missing target. */ + cmd->result = DID_NO_CONNECT << 16; + } + break; + case CMD_PROTOCOL_ERR: + printk(KERN_WARNING "cciss: cp %p has " + "protocol error \n", cp); + break; + case CMD_HARDWARE_ERR: + cmd->result = DID_ERROR << 16; + printk(KERN_WARNING "cciss: cp %p had " + " hardware error\n", cp); + break; + case CMD_CONNECTION_LOST: + cmd->result = DID_ERROR << 16; + printk(KERN_WARNING "cciss: cp %p had " + "connection lost\n", cp); + break; + case CMD_ABORTED: + cmd->result = DID_ABORT << 16; + printk(KERN_WARNING "cciss: cp %p was " + "aborted\n", cp); + break; + case CMD_ABORT_FAILED: + cmd->result = DID_ERROR << 16; + printk(KERN_WARNING "cciss: cp %p reports " + "abort failed\n", cp); + break; + case CMD_UNSOLICITED_ABORT: + cmd->result = DID_ABORT << 16; + printk(KERN_WARNING "cciss: cp %p aborted " + "do to an unsolicited abort\n", cp); + break; + case CMD_TIMEOUT: + cmd->result = DID_TIME_OUT << 16; + printk(KERN_WARNING "cciss: cp %p timedout\n", + cp); + break; + default: + cmd->result = DID_ERROR << 16; + printk(KERN_WARNING "cciss: cp %p returned " + "unknown status %x\n", cp, + ei->CommandStatus); + } + } + // printk("c:%p:c%db%dt%dl%d ", cmd, ctlr->ctlr, cmd->channel, + // cmd->target, cmd->lun); + cmd->scsi_done(cmd); + scsi_cmd_free(ctlr, cp); +} + +static int +cciss_scsi_detect(int ctlr) +{ + struct Scsi_Host *sh; + int error; + + sh = scsi_host_alloc(&cciss_driver_template, sizeof(struct ctlr_info *)); + if (sh == NULL) + goto fail; + sh->io_port = 0; // good enough? FIXME, + sh->n_io_port = 0; // I don't think we use these two... + sh->this_id = SELF_SCSI_ID; + + ((struct cciss_scsi_adapter_data_t *) + hba[ctlr]->scsi_ctlr)->scsi_host = (void *) sh; + sh->hostdata[0] = (unsigned long) hba[ctlr]; + sh->irq = hba[ctlr]->intr[SIMPLE_MODE_INT]; + sh->unique_id = sh->irq; + error = scsi_add_host(sh, &hba[ctlr]->pdev->dev); + if (error) + goto fail_host_put; + scsi_scan_host(sh); + return 1; + + fail_host_put: + scsi_host_put(sh); + fail: + return 0; +} + +static void +cciss_unmap_one(struct pci_dev *pdev, + CommandList_struct *cp, + size_t buflen, + int data_direction) +{ + u64bit addr64; + + addr64.val32.lower = cp->SG[0].Addr.lower; + addr64.val32.upper = cp->SG[0].Addr.upper; + pci_unmap_single(pdev, (dma_addr_t) addr64.val, buflen, data_direction); +} + +static void +cciss_map_one(struct pci_dev *pdev, + CommandList_struct *cp, + unsigned char *buf, + size_t buflen, + int data_direction) +{ + __u64 addr64; + + addr64 = (__u64) pci_map_single(pdev, buf, buflen, data_direction); + cp->SG[0].Addr.lower = + (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF); + cp->SG[0].Addr.upper = + (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF); + cp->SG[0].Len = buflen; + cp->Header.SGList = (__u8) 1; /* no. SGs contig in this cmd */ + cp->Header.SGTotal = (__u16) 1; /* total sgs in this cmd list */ +} + +static int +cciss_scsi_do_simple_cmd(ctlr_info_t *c, + CommandList_struct *cp, + unsigned char *scsi3addr, + unsigned char *cdb, + unsigned char cdblen, + unsigned char *buf, int bufsize, + int direction) +{ + unsigned long flags; + DECLARE_COMPLETION_ONSTACK(wait); + + cp->cmd_type = CMD_IOCTL_PEND; // treat this like an ioctl + cp->scsi_cmd = NULL; + cp->Header.ReplyQueue = 0; // unused in simple mode + memcpy(&cp->Header.LUN, scsi3addr, sizeof(cp->Header.LUN)); + cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag + // Fill in the request block... + + /* printk("Using scsi3addr 0x%02x%0x2%0x2%0x2%0x2%0x2%0x2%0x2\n", + scsi3addr[0], scsi3addr[1], scsi3addr[2], scsi3addr[3], + scsi3addr[4], scsi3addr[5], scsi3addr[6], scsi3addr[7]); */ + + memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB)); + memcpy(cp->Request.CDB, cdb, cdblen); + cp->Request.Timeout = 0; + cp->Request.CDBLen = cdblen; + cp->Request.Type.Type = TYPE_CMD; + cp->Request.Type.Attribute = ATTR_SIMPLE; + cp->Request.Type.Direction = direction; + + /* Fill in the SG list and do dma mapping */ + cciss_map_one(c->pdev, cp, (unsigned char *) buf, + bufsize, DMA_FROM_DEVICE); + + cp->waiting = &wait; + + /* Put the request on the tail of the request queue */ + spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); + addQ(&c->reqQ, cp); + c->Qdepth++; + start_io(c); + spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); + + wait_for_completion(&wait); + + /* undo the dma mapping */ + cciss_unmap_one(c->pdev, cp, bufsize, DMA_FROM_DEVICE); + return(0); +} + +static void +cciss_scsi_interpret_error(CommandList_struct *cp) +{ + ErrorInfo_struct *ei; + + ei = cp->err_info; + switch(ei->CommandStatus) + { + case CMD_TARGET_STATUS: + printk(KERN_WARNING "cciss: cmd %p has " + "completed with errors\n", cp); + printk(KERN_WARNING "cciss: cmd %p " + "has SCSI Status = %x\n", + cp, + ei->ScsiStatus); + if (ei->ScsiStatus == 0) + printk(KERN_WARNING + "cciss:SCSI status is abnormally zero. " + "(probably indicates selection timeout " + "reported incorrectly due to a known " + "firmware bug, circa July, 2001.)\n"); + break; + case CMD_DATA_UNDERRUN: /* let mid layer handle it. */ + printk("UNDERRUN\n"); + break; + case CMD_DATA_OVERRUN: + printk(KERN_WARNING "cciss: cp %p has" + " completed with data overrun " + "reported\n", cp); + break; + case CMD_INVALID: { + /* controller unfortunately reports SCSI passthru's */ + /* to non-existent targets as invalid commands. */ + printk(KERN_WARNING "cciss: cp %p is " + "reported invalid (probably means " + "target device no longer present)\n", + cp); + /* print_bytes((unsigned char *) cp, sizeof(*cp), 1, 0); + print_cmd(cp); */ + } + break; + case CMD_PROTOCOL_ERR: + printk(KERN_WARNING "cciss: cp %p has " + "protocol error \n", cp); + break; + case CMD_HARDWARE_ERR: + /* cmd->result = DID_ERROR << 16; */ + printk(KERN_WARNING "cciss: cp %p had " + " hardware error\n", cp); + break; + case CMD_CONNECTION_LOST: + printk(KERN_WARNING "cciss: cp %p had " + "connection lost\n", cp); + break; + case CMD_ABORTED: + printk(KERN_WARNING "cciss: cp %p was " + "aborted\n", cp); + break; + case CMD_ABORT_FAILED: + printk(KERN_WARNING "cciss: cp %p reports " + "abort failed\n", cp); + break; + case CMD_UNSOLICITED_ABORT: + printk(KERN_WARNING "cciss: cp %p aborted " + "do to an unsolicited abort\n", cp); + break; + case CMD_TIMEOUT: + printk(KERN_WARNING "cciss: cp %p timedout\n", + cp); + break; + default: + printk(KERN_WARNING "cciss: cp %p returned " + "unknown status %x\n", cp, + ei->CommandStatus); + } +} + +static int +cciss_scsi_do_inquiry(ctlr_info_t *c, unsigned char *scsi3addr, + unsigned char *buf, unsigned char bufsize) +{ + int rc; + CommandList_struct *cp; + char cdb[6]; + ErrorInfo_struct *ei; + unsigned long flags; + + spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); + cp = scsi_cmd_alloc(c); + spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); + + if (cp == NULL) { /* trouble... */ + printk("cmd_alloc returned NULL!\n"); + return -1; + } + + ei = cp->err_info; + + cdb[0] = CISS_INQUIRY; + cdb[1] = 0; + cdb[2] = 0; + cdb[3] = 0; + cdb[4] = bufsize; + cdb[5] = 0; + rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr, cdb, + 6, buf, bufsize, XFER_READ); + + if (rc != 0) return rc; /* something went wrong */ + + if (ei->CommandStatus != 0 && + ei->CommandStatus != CMD_DATA_UNDERRUN) { + cciss_scsi_interpret_error(cp); + rc = -1; + } + spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); + scsi_cmd_free(c, cp); + spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); + return rc; +} + +static int +cciss_scsi_do_report_phys_luns(ctlr_info_t *c, + ReportLunData_struct *buf, int bufsize) +{ + int rc; + CommandList_struct *cp; + unsigned char cdb[12]; + unsigned char scsi3addr[8]; + ErrorInfo_struct *ei; + unsigned long flags; + + spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); + cp = scsi_cmd_alloc(c); + spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); + if (cp == NULL) { /* trouble... */ + printk("cmd_alloc returned NULL!\n"); + return -1; + } + + memset(&scsi3addr[0], 0, 8); /* address the controller */ + cdb[0] = CISS_REPORT_PHYS; + cdb[1] = 0; + cdb[2] = 0; + cdb[3] = 0; + cdb[4] = 0; + cdb[5] = 0; + cdb[6] = (bufsize >> 24) & 0xFF; //MSB + cdb[7] = (bufsize >> 16) & 0xFF; + cdb[8] = (bufsize >> 8) & 0xFF; + cdb[9] = bufsize & 0xFF; + cdb[10] = 0; + cdb[11] = 0; + + rc = cciss_scsi_do_simple_cmd(c, cp, scsi3addr, + cdb, 12, + (unsigned char *) buf, + bufsize, XFER_READ); + + if (rc != 0) return rc; /* something went wrong */ + + ei = cp->err_info; + if (ei->CommandStatus != 0 && + ei->CommandStatus != CMD_DATA_UNDERRUN) { + cciss_scsi_interpret_error(cp); + rc = -1; + } + spin_lock_irqsave(CCISS_LOCK(c->ctlr), flags); + scsi_cmd_free(c, cp); + spin_unlock_irqrestore(CCISS_LOCK(c->ctlr), flags); + return rc; +} + +static void +cciss_update_non_disk_devices(int cntl_num, int hostno) +{ + /* the idea here is we could get notified from /proc + that some devices have changed, so we do a report + physical luns cmd, and adjust our list of devices + accordingly. (We can't rely on the scsi-mid layer just + doing inquiries, because the "busses" that the scsi + mid-layer probes are totally fabricated by this driver, + so new devices wouldn't show up. + + the scsi3addr's of devices won't change so long as the + adapter is not reset. That means we can rescan and + tell which devices we already know about, vs. new + devices, vs. disappearing devices. + + Also, if you yank out a tape drive, then put in a disk + in it's place, (say, a configured volume from another + array controller for instance) _don't_ poke this driver + (so it thinks it's still a tape, but _do_ poke the scsi + mid layer, so it does an inquiry... the scsi mid layer + will see the physical disk. This would be bad. Need to + think about how to prevent that. One idea would be to + snoop all scsi responses and if an inquiry repsonse comes + back that reports a disk, chuck it an return selection + timeout instead and adjust our table... Not sure i like + that though. + + */ +#define OBDR_TAPE_INQ_SIZE 49 +#define OBDR_TAPE_SIG "$DR-10" + ReportLunData_struct *ld_buff; + unsigned char *inq_buff; + unsigned char scsi3addr[8]; + ctlr_info_t *c; + __u32 num_luns=0; + unsigned char *ch; + /* unsigned char found[CCISS_MAX_SCSI_DEVS_PER_HBA]; */ + struct cciss_scsi_dev_t currentsd[CCISS_MAX_SCSI_DEVS_PER_HBA]; + int ncurrent=0; + int reportlunsize = sizeof(*ld_buff) + CISS_MAX_PHYS_LUN * 8; + int i; + + c = (ctlr_info_t *) hba[cntl_num]; + ld_buff = kzalloc(reportlunsize, GFP_KERNEL); + if (ld_buff == NULL) { + printk(KERN_ERR "cciss: out of memory\n"); + return; + } + inq_buff = kmalloc(OBDR_TAPE_INQ_SIZE, GFP_KERNEL); + if (inq_buff == NULL) { + printk(KERN_ERR "cciss: out of memory\n"); + kfree(ld_buff); + return; + } + + if (cciss_scsi_do_report_phys_luns(c, ld_buff, reportlunsize) == 0) { + ch = &ld_buff->LUNListLength[0]; + num_luns = ((ch[0]<<24) | (ch[1]<<16) | (ch[2]<<8) | ch[3]) / 8; + if (num_luns > CISS_MAX_PHYS_LUN) { + printk(KERN_WARNING + "cciss: Maximum physical LUNs (%d) exceeded. " + "%d LUNs ignored.\n", CISS_MAX_PHYS_LUN, + num_luns - CISS_MAX_PHYS_LUN); + num_luns = CISS_MAX_PHYS_LUN; + } + } + else { + printk(KERN_ERR "cciss: Report physical LUNs failed.\n"); + goto out; + } + + + /* adjust our table of devices */ + for(i=0; iLUN[i][3] & 0xC0) continue; + memset(inq_buff, 0, OBDR_TAPE_INQ_SIZE); + memcpy(&scsi3addr[0], &ld_buff->LUN[i][0], 8); + + if (cciss_scsi_do_inquiry(hba[cntl_num], scsi3addr, inq_buff, + (unsigned char) OBDR_TAPE_INQ_SIZE) != 0) { + /* Inquiry failed (msg printed already) */ + devtype = 0; /* so we will skip this device. */ + } else /* what kind of device is this? */ + devtype = (inq_buff[0] & 0x1f); + + switch (devtype) + { + case 0x05: /* CD-ROM */ { + + /* We don't *really* support actual CD-ROM devices, + * just this "One Button Disaster Recovery" tape drive + * which temporarily pretends to be a CD-ROM drive. + * So we check that the device is really an OBDR tape + * device by checking for "$DR-10" in bytes 43-48 of + * the inquiry data. + */ + char obdr_sig[7]; + + strncpy(obdr_sig, &inq_buff[43], 6); + obdr_sig[6] = '\0'; + if (strncmp(obdr_sig, OBDR_TAPE_SIG, 6) != 0) + /* Not OBDR device, ignore it. */ + break; + } + /* fall through . . . */ + case 0x01: /* sequential access, (tape) */ + case 0x08: /* medium changer */ + if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) { + printk(KERN_INFO "cciss%d: %s ignored, " + "too many devices.\n", cntl_num, + DEVICETYPE(devtype)); + break; + } + memcpy(¤tsd[ncurrent].scsi3addr[0], + &scsi3addr[0], 8); + currentsd[ncurrent].devtype = devtype; + currentsd[ncurrent].bus = -1; + currentsd[ncurrent].target = -1; + currentsd[ncurrent].lun = -1; + ncurrent++; + break; + default: + break; + } + } + + adjust_cciss_scsi_table(cntl_num, hostno, currentsd, ncurrent); +out: + kfree(inq_buff); + kfree(ld_buff); + return; +} + +static int +is_keyword(char *ptr, int len, char *verb) // Thanks to ncr53c8xx.c +{ + int verb_len = strlen(verb); + if (len >= verb_len && !memcmp(verb,ptr,verb_len)) + return verb_len; + else + return 0; +} + +static int +cciss_scsi_user_command(int ctlr, int hostno, char *buffer, int length) +{ + int arg_len; + + if ((arg_len = is_keyword(buffer, length, "rescan")) != 0) + cciss_update_non_disk_devices(ctlr, hostno); + else + return -EINVAL; + return length; +} + + +static int +cciss_scsi_proc_info(struct Scsi_Host *sh, + char *buffer, /* data buffer */ + char **start, /* where data in buffer starts */ + off_t offset, /* offset from start of imaginary file */ + int length, /* length of data in buffer */ + int func) /* 0 == read, 1 == write */ +{ + + int buflen, datalen; + ctlr_info_t *ci; + int i; + int cntl_num; + + + ci = (ctlr_info_t *) sh->hostdata[0]; + if (ci == NULL) /* This really shouldn't ever happen. */ + return -EINVAL; + + cntl_num = ci->ctlr; /* Get our index into the hba[] array */ + + if (func == 0) { /* User is reading from /proc/scsi/ciss*?/?* */ + buflen = sprintf(buffer, "cciss%d: SCSI host: %d\n", + cntl_num, sh->host_no); + + /* this information is needed by apps to know which cciss + device corresponds to which scsi host number without + having to open a scsi target device node. The device + information is not a duplicate of /proc/scsi/scsi because + the two may be out of sync due to scsi hotplug, rather + this info is for an app to be able to use to know how to + get them back in sync. */ + + for (i=0;ihost_no, sd->bus, sd->target, sd->lun, + sd->devtype, + sd->scsi3addr[0], sd->scsi3addr[1], + sd->scsi3addr[2], sd->scsi3addr[3], + sd->scsi3addr[4], sd->scsi3addr[5], + sd->scsi3addr[6], sd->scsi3addr[7]); + } + datalen = buflen - offset; + if (datalen < 0) { /* they're reading past EOF. */ + datalen = 0; + *start = buffer+buflen; + } else + *start = buffer + offset; + return(datalen); + } else /* User is writing to /proc/scsi/cciss*?/?* ... */ + return cciss_scsi_user_command(cntl_num, sh->host_no, + buffer, length); +} + +/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci + dma mapping and fills in the scatter gather entries of the + cciss command, cp. */ + +static void +cciss_scatter_gather(struct pci_dev *pdev, + CommandList_struct *cp, + struct scsi_cmnd *cmd) +{ + unsigned int use_sg, nsegs=0, len; + struct scatterlist *scatter = (struct scatterlist *) cmd->request_buffer; + __u64 addr64; + + /* is it just one virtual address? */ + if (!cmd->use_sg) { + if (cmd->request_bufflen) { /* anything to xfer? */ + + addr64 = (__u64) pci_map_single(pdev, + cmd->request_buffer, + cmd->request_bufflen, + cmd->sc_data_direction); + + cp->SG[0].Addr.lower = + (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF); + cp->SG[0].Addr.upper = + (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF); + cp->SG[0].Len = cmd->request_bufflen; + nsegs=1; + } + } /* else, must be a list of virtual addresses.... */ + else if (cmd->use_sg <= MAXSGENTRIES) { /* not too many addrs? */ + + use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg, + cmd->sc_data_direction); + + for (nsegs=0; nsegs < use_sg; nsegs++) { + addr64 = (__u64) sg_dma_address(&scatter[nsegs]); + len = sg_dma_len(&scatter[nsegs]); + cp->SG[nsegs].Addr.lower = + (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF); + cp->SG[nsegs].Addr.upper = + (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF); + cp->SG[nsegs].Len = len; + cp->SG[nsegs].Ext = 0; // we are not chaining + } + } else BUG(); + + cp->Header.SGList = (__u8) nsegs; /* no. SGs contig in this cmd */ + cp->Header.SGTotal = (__u16) nsegs; /* total sgs in this cmd list */ + return; +} + + +static int +cciss_scsi_queue_command (struct scsi_cmnd *cmd, void (* done)(struct scsi_cmnd *)) +{ + ctlr_info_t **c; + int ctlr, rc; + unsigned char scsi3addr[8]; + CommandList_struct *cp; + unsigned long flags; + + // Get the ptr to our adapter structure (hba[i]) out of cmd->host. + // We violate cmd->host privacy here. (Is there another way?) + c = (ctlr_info_t **) &cmd->device->host->hostdata[0]; + ctlr = (*c)->ctlr; + + rc = lookup_scsi3addr(ctlr, cmd->device->channel, cmd->device->id, + cmd->device->lun, scsi3addr); + if (rc != 0) { + /* the scsi nexus does not match any that we presented... */ + /* pretend to mid layer that we got selection timeout */ + cmd->result = DID_NO_CONNECT << 16; + done(cmd); + /* we might want to think about registering controller itself + as a processor device on the bus so sg binds to it. */ + return 0; + } + + /* printk("cciss_queue_command, p=%p, cmd=0x%02x, c%db%dt%dl%d\n", + cmd, cmd->cmnd[0], ctlr, cmd->channel, cmd->target, cmd->lun);*/ + // printk("q:%p:c%db%dt%dl%d ", cmd, ctlr, cmd->channel, + // cmd->target, cmd->lun); + + /* Ok, we have a reasonable scsi nexus, so send the cmd down, and + see what the device thinks of it. */ + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + cp = scsi_cmd_alloc(*c); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + if (cp == NULL) { /* trouble... */ + printk("scsi_cmd_alloc returned NULL!\n"); + /* FIXME: next 3 lines are -> BAD! <- */ + cmd->result = DID_NO_CONNECT << 16; + done(cmd); + return 0; + } + + // Fill in the command list header + + cmd->scsi_done = done; // save this for use by completion code + + // save cp in case we have to abort it + cmd->host_scribble = (unsigned char *) cp; + + cp->cmd_type = CMD_SCSI; + cp->scsi_cmd = cmd; + cp->Header.ReplyQueue = 0; // unused in simple mode + memcpy(&cp->Header.LUN.LunAddrBytes[0], &scsi3addr[0], 8); + cp->Header.Tag.lower = cp->busaddr; // Use k. address of cmd as tag + + // Fill in the request block... + + cp->Request.Timeout = 0; + memset(cp->Request.CDB, 0, sizeof(cp->Request.CDB)); + BUG_ON(cmd->cmd_len > sizeof(cp->Request.CDB)); + cp->Request.CDBLen = cmd->cmd_len; + memcpy(cp->Request.CDB, cmd->cmnd, cmd->cmd_len); + cp->Request.Type.Type = TYPE_CMD; + cp->Request.Type.Attribute = ATTR_SIMPLE; + switch(cmd->sc_data_direction) + { + case DMA_TO_DEVICE: cp->Request.Type.Direction = XFER_WRITE; break; + case DMA_FROM_DEVICE: cp->Request.Type.Direction = XFER_READ; break; + case DMA_NONE: cp->Request.Type.Direction = XFER_NONE; break; + case DMA_BIDIRECTIONAL: + // This can happen if a buggy application does a scsi passthru + // and sets both inlen and outlen to non-zero. ( see + // ../scsi/scsi_ioctl.c:scsi_ioctl_send_command() ) + + cp->Request.Type.Direction = XFER_RSVD; + // This is technically wrong, and cciss controllers should + // reject it with CMD_INVALID, which is the most correct + // response, but non-fibre backends appear to let it + // slide by, and give the same results as if this field + // were set correctly. Either way is acceptable for + // our purposes here. + + break; + + default: + printk("cciss: unknown data direction: %d\n", + cmd->sc_data_direction); + BUG(); + break; + } + + cciss_scatter_gather((*c)->pdev, cp, cmd); // Fill the SG list + + /* Put the request on the tail of the request queue */ + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + addQ(&(*c)->reqQ, cp); + (*c)->Qdepth++; + start_io(*c); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + + /* the cmd'll come back via intr handler in complete_scsi_command() */ + return 0; +} + +static void +cciss_unregister_scsi(int ctlr) +{ + struct cciss_scsi_adapter_data_t *sa; + struct cciss_scsi_cmd_stack_t *stk; + unsigned long flags; + + /* we are being forcibly unloaded, and may not refuse. */ + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr; + stk = &sa->cmd_stack; + + /* if we weren't ever actually registered, don't unregister */ + if (sa->registered) { + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + scsi_remove_host(sa->scsi_host); + scsi_host_put(sa->scsi_host); + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + } + + /* set scsi_host to NULL so our detect routine will + find us on register */ + sa->scsi_host = NULL; + scsi_cmd_stack_free(ctlr); + kfree(sa); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); +} + +static int +cciss_register_scsi(int ctlr) +{ + unsigned long flags; + + CPQ_TAPE_LOCK(ctlr, flags); + + /* Since this is really a block driver, the SCSI core may not be + initialized at init time, in which case, calling scsi_register_host + would hang. Instead, we do it later, via /proc filesystem + and rc scripts, when we know SCSI core is good to go. */ + + /* Only register if SCSI devices are detected. */ + if (ccissscsi[ctlr].ndevices != 0) { + ((struct cciss_scsi_adapter_data_t *) + hba[ctlr]->scsi_ctlr)->registered = 1; + CPQ_TAPE_UNLOCK(ctlr, flags); + return cciss_scsi_detect(ctlr); + } + CPQ_TAPE_UNLOCK(ctlr, flags); + printk(KERN_INFO + "cciss%d: No appropriate SCSI device detected, " + "SCSI subsystem not engaged.\n", ctlr); + return 0; +} + +static int +cciss_engage_scsi(int ctlr) +{ + struct cciss_scsi_adapter_data_t *sa; + struct cciss_scsi_cmd_stack_t *stk; + unsigned long flags; + + spin_lock_irqsave(CCISS_LOCK(ctlr), flags); + sa = (struct cciss_scsi_adapter_data_t *) hba[ctlr]->scsi_ctlr; + stk = &sa->cmd_stack; + + if (((struct cciss_scsi_adapter_data_t *) + hba[ctlr]->scsi_ctlr)->registered) { + printk("cciss%d: SCSI subsystem already engaged.\n", ctlr); + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + return ENXIO; + } + spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags); + cciss_update_non_disk_devices(ctlr, -1); + cciss_register_scsi(ctlr); + return 0; +} + +static void +cciss_proc_tape_report(int ctlr, unsigned char *buffer, off_t *pos, off_t *len) +{ + unsigned long flags; + int size; + + *pos = *pos -1; *len = *len - 1; // cut off the last trailing newline + + CPQ_TAPE_LOCK(ctlr, flags); + size = sprintf(buffer + *len, + "Sequential access devices: %d\n\n", + ccissscsi[ctlr].ndevices); + CPQ_TAPE_UNLOCK(ctlr, flags); + *pos += size; *len += size; +} + +/* Need at least one of these error handlers to keep ../scsi/hosts.c from + * complaining. Doing a host- or bus-reset can't do anything good here. + * Despite what it might say in scsi_error.c, there may well be commands + * on the controller, as the cciss driver registers twice, once as a block + * device for the logical drives, and once as a scsi device, for any tape + * drives. So we know there are no commands out on the tape drives, but we + * don't know there are no commands on the controller, and it is likely + * that there probably are, as the cciss block device is most commonly used + * as a boot device (embedded controller on HP/Compaq systems.) +*/ + +static int cciss_eh_device_reset_handler(struct scsi_cmnd *scsicmd) +{ + int rc; + CommandList_struct *cmd_in_trouble; + ctlr_info_t **c; + int ctlr; + + /* find the controller to which the command to be aborted was sent */ + c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0]; + if (c == NULL) /* paranoia */ + return FAILED; + ctlr = (*c)->ctlr; + printk(KERN_WARNING "cciss%d: resetting tape drive or medium changer.\n", ctlr); + + /* find the command that's giving us trouble */ + cmd_in_trouble = (CommandList_struct *) scsicmd->host_scribble; + if (cmd_in_trouble == NULL) { /* paranoia */ + return FAILED; + } + /* send a reset to the SCSI LUN which the command was sent to */ + rc = sendcmd(CCISS_RESET_MSG, ctlr, NULL, 0, 2, 0, 0, + (unsigned char *) &cmd_in_trouble->Header.LUN.LunAddrBytes[0], + TYPE_MSG); + /* sendcmd turned off interrputs on the board, turn 'em back on. */ + (*c)->access.set_intr_mask(*c, CCISS_INTR_ON); + if (rc == 0) + return SUCCESS; + printk(KERN_WARNING "cciss%d: resetting device failed.\n", ctlr); + return FAILED; +} + +static int cciss_eh_abort_handler(struct scsi_cmnd *scsicmd) +{ + int rc; + CommandList_struct *cmd_to_abort; + ctlr_info_t **c; + int ctlr; + + /* find the controller to which the command to be aborted was sent */ + c = (ctlr_info_t **) &scsicmd->device->host->hostdata[0]; + if (c == NULL) /* paranoia */ + return FAILED; + ctlr = (*c)->ctlr; + printk(KERN_WARNING "cciss%d: aborting tardy SCSI cmd\n", ctlr); + + /* find the command to be aborted */ + cmd_to_abort = (CommandList_struct *) scsicmd->host_scribble; + if (cmd_to_abort == NULL) /* paranoia */ + return FAILED; + rc = sendcmd(CCISS_ABORT_MSG, ctlr, &cmd_to_abort->Header.Tag, + 0, 2, 0, 0, + (unsigned char *) &cmd_to_abort->Header.LUN.LunAddrBytes[0], + TYPE_MSG); + /* sendcmd turned off interrputs on the board, turn 'em back on. */ + (*c)->access.set_intr_mask(*c, CCISS_INTR_ON); + if (rc == 0) + return SUCCESS; + return FAILED; + +} + +#else /* no CONFIG_CISS_SCSI_TAPE */ + +/* If no tape support, then these become defined out of existence */ + +#define cciss_scsi_setup(cntl_num) +#define cciss_unregister_scsi(ctlr) +#define cciss_register_scsi(ctlr) +#define cciss_proc_tape_report(ctlr, buffer, pos, len) + +#endif /* CONFIG_CISS_SCSI_TAPE */ diff --git a/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.h b/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.h new file mode 100644 index 0000000..5e7e06c --- /dev/null +++ b/vmkdrivers/src_current/drivers/block/cciss/cciss_scsi.h @@ -0,0 +1,79 @@ +/* + * Disk Array driver for Compaq SA53xx Controllers, SCSI Tape module + * Copyright 2001 Compaq Computer Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Questions/Comments/Bugfixes to iss_storagedev@hp.com + * + */ +#ifdef CONFIG_CISS_SCSI_TAPE +#ifndef _CCISS_SCSI_H_ +#define _CCISS_SCSI_H_ + +#include /* possibly irrelevant, since we don't show disks */ + + // the scsi id of the adapter... +#define SELF_SCSI_ID 15 + // 15 is somewhat arbitrary, since the scsi-2 bus + // that's presented by the driver to the OS is + // fabricated. The "real" scsi-3 bus the + // hardware presents is fabricated too. + // The actual, honest-to-goodness physical + // bus that the devices are attached to is not + // addressible natively, and may in fact turn + // out to be not scsi at all. + +#define SCSI_CCISS_CAN_QUEUE 2 + +/* + +Note, cmd_per_lun could give us some trouble, so I'm setting it very low. +Likewise, SCSI_CCISS_CAN_QUEUE is set very conservatively. + +If the upper scsi layer tries to track how many commands we have +outstanding, it will be operating under the misapprehension that it is +the only one sending us requests. We also have the block interface, +which is where most requests must surely come from, so the upper layer's +notion of how many requests we have outstanding will be wrong most or +all of the time. + +Note, the normal SCSI mid-layer error handling doesn't work well +for this driver because 1) it takes the io_request_lock before +calling error handlers and uses a local variable to store flags, +so the io_request_lock cannot be released and interrupts enabled +inside the error handlers, and, the error handlers cannot poll +for command completion because they might get commands from the +block half of the driver completing, and not know what to do +with them. That's what we get for making a hybrid scsi/block +driver, I suppose. + +*/ + +struct cciss_scsi_dev_t { + int devtype; + int bus, target, lun; /* as presented to the OS */ + unsigned char scsi3addr[8]; /* as presented to the HW */ +}; + +struct cciss_scsi_hba_t { + char *name; + int ndevices; +#define CCISS_MAX_SCSI_DEVS_PER_HBA 16 + struct cciss_scsi_dev_t dev[CCISS_MAX_SCSI_DEVS_PER_HBA]; +}; + +#endif /* _CCISS_SCSI_H_ */ +#endif /* CONFIG_CISS_SCSI_TAPE */ diff --git a/vmkdrivers/src_current/drivers/char/openipmi/includes/ipmi_si_sm.h b/vmkdrivers/src_current/drivers/char/openipmi/includes/ipmi_si_sm.h new file mode 100644 index 0000000..4b731b2 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/includes/ipmi_si_sm.h @@ -0,0 +1,122 @@ +/* + * ipmi_si_sm.h + * + * State machine interface for low-level IPMI system management + * interface state machines. This code is the interface between + * the ipmi_smi code (that handles the policy of a KCS, SMIC, or + * BT interface) and the actual low-level state machine. + * + * Author: MontaVista Software, Inc. + * Corey Minyard + * source@mvista.com + * + * Copyright 2002 MontaVista Software Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* This is defined by the state machines themselves, it is an opaque + data type for them to use. */ +struct si_sm_data; + +/* The structure for doing I/O in the state machine. The state + machine doesn't have the actual I/O routines, they are done through + this interface. */ +struct si_sm_io +{ + unsigned char (*inputb)(struct si_sm_io *io, unsigned int offset); + void (*outputb)(struct si_sm_io *io, + unsigned int offset, + unsigned char b); + + /* Generic info used by the actual handling routines, the + state machine shouldn't touch these. */ + void __iomem *addr; + int regspacing; + int regsize; + int regshift; + int addr_type; + long addr_data; +}; + +/* Results of SMI events. */ +enum si_sm_result +{ + SI_SM_CALL_WITHOUT_DELAY, /* Call the driver again immediately */ + SI_SM_CALL_WITH_DELAY, /* Delay some before calling again. */ + SI_SM_CALL_WITH_TICK_DELAY, /* Delay at least 1 tick before calling again. */ + SI_SM_TRANSACTION_COMPLETE, /* A transaction is finished. */ + SI_SM_IDLE, /* The SM is in idle state. */ + SI_SM_HOSED, /* The hardware violated the state machine. */ + SI_SM_ATTN /* The hardware is asserting attn and the + state machine is idle. */ +}; + +/* Handlers for the SMI state machine. */ +struct si_sm_handlers +{ + /* Put the version number of the state machine here so the + upper layer can print it. */ + char *version; + + /* Initialize the data and return the amount of I/O space to + reserve for the space. */ + unsigned int (*init_data)(struct si_sm_data *smi, + struct si_sm_io *io); + + /* Start a new transaction in the state machine. This will + return -2 if the state machine is not idle, -1 if the size + is invalid (to large or too small), or 0 if the transaction + is successfully completed. */ + int (*start_transaction)(struct si_sm_data *smi, + unsigned char *data, unsigned int size); + + /* Return the results after the transaction. This will return + -1 if the buffer is too small, zero if no transaction is + present, or the actual length of the result data. */ + int (*get_result)(struct si_sm_data *smi, + unsigned char *data, unsigned int length); + + /* Call this periodically (for a polled interface) or upon + receiving an interrupt (for a interrupt-driven interface). + If interrupt driven, you should probably poll this + periodically when not in idle state. This should be called + with the time that passed since the last call, if it is + significant. Time is in microseconds. */ + enum si_sm_result (*event)(struct si_sm_data *smi, long time); + + /* Attempt to detect an SMI. Returns 0 on success or nonzero + on failure. */ + int (*detect)(struct si_sm_data *smi); + + /* The interface is shutting down, so clean it up. */ + void (*cleanup)(struct si_sm_data *smi); + + /* Return the size of the SMI structure in bytes. */ + int (*size)(void); +}; + +/* Current state machines that we can use. */ +extern struct si_sm_handlers kcs_smi_handlers; +extern struct si_sm_handlers smic_smi_handlers; +extern struct si_sm_handlers bt_smi_handlers; + diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.c new file mode 100644 index 0000000..46854c1 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_devintf/ipmi_devintf.c @@ -0,0 +1,1131 @@ +/* + * ipmi_devintf.c + * + * Linux device interface for the IPMI message handler. + * + * Author: MontaVista Software, Inc. + * Corey Minyard + * source@mvista.com + * + * Copyright 2002 MontaVista Software Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__VMKLNX__) + +#define IPMI_DRIVER_VERSION "39.2.0.1-1vmw" + +#define MAX_DEVICES 10 +static int majors[MAX_DEVICES]; +#endif /* #if defined(__VMKLNX__) */ + +struct ipmi_file_private +{ + ipmi_user_t user; + spinlock_t recv_msg_lock; + struct list_head recv_msgs; + struct file *file; + struct fasync_struct *fasync_queue; + wait_queue_head_t wait; + struct mutex recv_mutex; + int default_retries; + unsigned int default_retry_time_ms; +}; + +static void file_receive_handler(struct ipmi_recv_msg *msg, + void *handler_data) +{ + struct ipmi_file_private *priv = handler_data; + int was_empty; + unsigned long flags; + + spin_lock_irqsave(&(priv->recv_msg_lock), flags); + + was_empty = list_empty(&(priv->recv_msgs)); + list_add_tail(&(msg->link), &(priv->recv_msgs)); + + if (was_empty) { + wake_up_interruptible(&priv->wait); + kill_fasync(&priv->fasync_queue, SIGIO, POLL_IN); + } + + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); +} + +static unsigned int ipmi_poll(struct file *file, poll_table *wait) +{ + struct ipmi_file_private *priv = file->private_data; + unsigned int mask = 0; + unsigned long flags; + + poll_wait(file, &priv->wait, wait); + + spin_lock_irqsave(&priv->recv_msg_lock, flags); + + if (!list_empty(&(priv->recv_msgs))) + mask |= (POLLIN | POLLRDNORM); + + spin_unlock_irqrestore(&priv->recv_msg_lock, flags); + + return mask; +} + +static int ipmi_fasync(int fd, struct file *file, int on) +{ + struct ipmi_file_private *priv = file->private_data; + int result; + + result = fasync_helper(fd, file, on, &priv->fasync_queue); + + return (result); +} + +static struct ipmi_user_hndl ipmi_hndlrs = +{ + .ipmi_recv_hndl = file_receive_handler, +}; + +static int ipmi_open(struct inode *inode, struct file *file) +{ +#if !defined(__VMKLNX__) + int if_num = iminor(inode); + int rv; + struct ipmi_file_private *priv; +#else + int rv; + struct ipmi_file_private *priv; + int if_num; + for (if_num = 0; if_num < MAX_DEVICES; if_num++) { + if (majors[if_num] == imajor(inode)) { + break; + } + } + if (if_num == MAX_DEVICES) { + return -ENODEV; + } +#endif //__VMKLNX__ + + priv = kmalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->file = file; + + rv = ipmi_create_user(if_num, + &ipmi_hndlrs, + priv, + &(priv->user)); + if (rv) { + kfree(priv); + return rv; + } + + file->private_data = priv; + + spin_lock_init(&(priv->recv_msg_lock)); + INIT_LIST_HEAD(&(priv->recv_msgs)); + init_waitqueue_head(&priv->wait); + priv->fasync_queue = NULL; + mutex_init(&priv->recv_mutex); + + /* Use the low-level defaults. */ + priv->default_retries = -1; + priv->default_retry_time_ms = 0; + + return 0; +} + +static int ipmi_release(struct inode *inode, struct file *file) +{ + struct ipmi_file_private *priv = file->private_data; + int rv; + + rv = ipmi_destroy_user(priv->user); + if (rv) + return rv; + + ipmi_fasync (-1, file, 0); + + /* FIXME - free the messages in the list. */ + kfree(priv); + + return 0; +} + +static int handle_send_req(ipmi_user_t user, + struct ipmi_req *req, + int retries, + unsigned int retry_time_ms) +{ + int rv; + struct ipmi_addr addr; + struct kernel_ipmi_msg msg; + + if (req->addr_len > sizeof(struct ipmi_addr)) + return -EINVAL; + + if (copy_from_user(&addr, req->addr, req->addr_len)) + return -EFAULT; + + msg.netfn = req->msg.netfn; + msg.cmd = req->msg.cmd; + msg.data_len = req->msg.data_len; + msg.data = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL); + if (!msg.data) + return -ENOMEM; + + /* From here out we cannot return, we must jump to "out" for + error exits to free msgdata. */ + + rv = ipmi_validate_addr(&addr, req->addr_len); + if (rv) + goto out; + + if (req->msg.data != NULL) { + if (req->msg.data_len > IPMI_MAX_MSG_LENGTH) { + rv = -EMSGSIZE; + goto out; + } + + if (copy_from_user(msg.data, + req->msg.data, + req->msg.data_len)) + { + rv = -EFAULT; + goto out; + } + } else { + msg.data_len = 0; + } + + rv = ipmi_request_settime(user, + &addr, + req->msgid, + &msg, + NULL, + 0, + retries, + retry_time_ms); + out: + kfree(msg.data); + return rv; +} + +static int ipmi_ioctl(struct inode *inode, + struct file *file, + unsigned int cmd, + unsigned long data) +{ + int rv = -EINVAL; + struct ipmi_file_private *priv = file->private_data; + void __user *arg = (void __user *)data; + + switch (cmd) + { + case IPMICTL_SEND_COMMAND: + { + struct ipmi_req req; + + if (copy_from_user(&req, arg, sizeof(req))) { + rv = -EFAULT; + break; + } + + rv = handle_send_req(priv->user, + &req, + priv->default_retries, + priv->default_retry_time_ms); + break; + } + + case IPMICTL_SEND_COMMAND_SETTIME: + { + struct ipmi_req_settime req; + + if (copy_from_user(&req, arg, sizeof(req))) { + rv = -EFAULT; + break; + } + + rv = handle_send_req(priv->user, + &req.req, + req.retries, + req.retry_time_ms); + break; + } + + case IPMICTL_RECEIVE_MSG: + case IPMICTL_RECEIVE_MSG_TRUNC: + { + struct ipmi_recv rsp; + int addr_len; + struct list_head *entry; + struct ipmi_recv_msg *msg; + unsigned long flags; + + + rv = 0; + if (copy_from_user(&rsp, arg, sizeof(rsp))) { + rv = -EFAULT; + break; + } + + /* We claim a mutex because we don't want two + users getting something from the queue at a time. + Since we have to release the spinlock before we can + copy the data to the user, it's possible another + user will grab something from the queue, too. Then + the messages might get out of order if something + fails and the message gets put back onto the + queue. This mutex prevents that problem. */ + mutex_lock(&priv->recv_mutex); + + /* Grab the message off the list. */ + spin_lock_irqsave(&(priv->recv_msg_lock), flags); + if (list_empty(&(priv->recv_msgs))) { + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + rv = -EAGAIN; + goto recv_err; + } + entry = priv->recv_msgs.next; + msg = list_entry(entry, struct ipmi_recv_msg, link); + list_del(entry); + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + + addr_len = ipmi_addr_length(msg->addr.addr_type); + if (rsp.addr_len < addr_len) + { + rv = -EINVAL; + goto recv_putback_on_err; + } + + if (copy_to_user(rsp.addr, &(msg->addr), addr_len)) { + rv = -EFAULT; + goto recv_putback_on_err; + } + rsp.addr_len = addr_len; + + rsp.recv_type = msg->recv_type; + rsp.msgid = msg->msgid; + rsp.msg.netfn = msg->msg.netfn; + rsp.msg.cmd = msg->msg.cmd; + + if (msg->msg.data_len > 0) { + if (rsp.msg.data_len < msg->msg.data_len) { + rv = -EMSGSIZE; + if (cmd == IPMICTL_RECEIVE_MSG_TRUNC) { + msg->msg.data_len = rsp.msg.data_len; + } else { + goto recv_putback_on_err; + } + } + + if (copy_to_user(rsp.msg.data, + msg->msg.data, + msg->msg.data_len)) + { + rv = -EFAULT; + goto recv_putback_on_err; + } + rsp.msg.data_len = msg->msg.data_len; + } else { + rsp.msg.data_len = 0; + } + + if (copy_to_user(arg, &rsp, sizeof(rsp))) { + rv = -EFAULT; + goto recv_putback_on_err; + } + + mutex_unlock(&priv->recv_mutex); + ipmi_free_recv_msg(msg); + break; + + recv_putback_on_err: + /* If we got an error, put the message back onto + the head of the queue. */ + spin_lock_irqsave(&(priv->recv_msg_lock), flags); + list_add(entry, &(priv->recv_msgs)); + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + mutex_unlock(&priv->recv_mutex); + break; + + recv_err: + mutex_unlock(&priv->recv_mutex); + break; + } + + case IPMICTL_REGISTER_FOR_CMD: + { + struct ipmi_cmdspec val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_register_for_cmd(priv->user, val.netfn, val.cmd, + IPMI_CHAN_ALL); + break; + } + + case IPMICTL_UNREGISTER_FOR_CMD: + { + struct ipmi_cmdspec val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_unregister_for_cmd(priv->user, val.netfn, val.cmd, + IPMI_CHAN_ALL); + break; + } + + case IPMICTL_REGISTER_FOR_CMD_CHANS: + { + struct ipmi_cmdspec_chans val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_register_for_cmd(priv->user, val.netfn, val.cmd, + val.chans); + break; + } + + case IPMICTL_UNREGISTER_FOR_CMD_CHANS: + { + struct ipmi_cmdspec_chans val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_unregister_for_cmd(priv->user, val.netfn, val.cmd, + val.chans); + break; + } + + case IPMICTL_SET_GETS_EVENTS_CMD: + { + int val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_set_gets_events(priv->user, val); + break; + } + + /* The next four are legacy, not per-channel. */ + case IPMICTL_SET_MY_ADDRESS_CMD: + { + unsigned int val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_set_my_address(priv->user, 0, val); + break; + } + + case IPMICTL_GET_MY_ADDRESS_CMD: + { + unsigned int val; + unsigned char rval; + + rv = ipmi_get_my_address(priv->user, 0, &rval); + if (rv) + break; + + val = rval; + + if (copy_to_user(arg, &val, sizeof(val))) { + rv = -EFAULT; + break; + } + break; + } + + case IPMICTL_SET_MY_LUN_CMD: + { + unsigned int val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_set_my_LUN(priv->user, 0, val); + break; + } + + case IPMICTL_GET_MY_LUN_CMD: + { + unsigned int val; + unsigned char rval; + + rv = ipmi_get_my_LUN(priv->user, 0, &rval); + if (rv) + break; + + val = rval; + + if (copy_to_user(arg, &val, sizeof(val))) { + rv = -EFAULT; + break; + } + break; + } + + case IPMICTL_SET_MY_CHANNEL_ADDRESS_CMD: + { + struct ipmi_channel_lun_address_set val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + return ipmi_set_my_address(priv->user, val.channel, val.value); + break; + } + + case IPMICTL_GET_MY_CHANNEL_ADDRESS_CMD: + { + struct ipmi_channel_lun_address_set val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_get_my_address(priv->user, val.channel, &val.value); + if (rv) + break; + + if (copy_to_user(arg, &val, sizeof(val))) { + rv = -EFAULT; + break; + } + break; + } + + case IPMICTL_SET_MY_CHANNEL_LUN_CMD: + { + struct ipmi_channel_lun_address_set val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_set_my_LUN(priv->user, val.channel, val.value); + break; + } + + case IPMICTL_GET_MY_CHANNEL_LUN_CMD: + { + struct ipmi_channel_lun_address_set val; + + if (copy_from_user(&val, arg, sizeof(val))) { + rv = -EFAULT; + break; + } + + rv = ipmi_get_my_LUN(priv->user, val.channel, &val.value); + if (rv) + break; + + if (copy_to_user(arg, &val, sizeof(val))) { + rv = -EFAULT; + break; + } + break; + } + + case IPMICTL_SET_TIMING_PARMS_CMD: + { + struct ipmi_timing_parms parms; + + if (copy_from_user(&parms, arg, sizeof(parms))) { + rv = -EFAULT; + break; + } + + priv->default_retries = parms.retries; + priv->default_retry_time_ms = parms.retry_time_ms; + rv = 0; + break; + } + + case IPMICTL_GET_TIMING_PARMS_CMD: + { + struct ipmi_timing_parms parms; + + parms.retries = priv->default_retries; + parms.retry_time_ms = priv->default_retry_time_ms; + + if (copy_to_user(arg, &parms, sizeof(parms))) { + rv = -EFAULT; + break; + } + + rv = 0; + break; + } + + case IPMICTL_GET_MAINTENANCE_MODE_CMD: + { + int mode; + + mode = ipmi_get_maintenance_mode(priv->user); + if (copy_to_user(arg, &mode, sizeof(mode))) { + rv = -EFAULT; + break; + } + rv = 0; + break; + } + + case IPMICTL_SET_MAINTENANCE_MODE_CMD: + { + int mode; + + if (copy_from_user(&mode, arg, sizeof(mode))) { + rv = -EFAULT; + break; + } + rv = ipmi_set_maintenance_mode(priv->user, mode); + break; + } + } + + return rv; +} + +#ifdef CONFIG_COMPAT + +/* + * The following code contains code for supporting 32-bit compatible + * ioctls on 64-bit kernels. This allows running 32-bit apps on the + * 64-bit kernel + */ +#define COMPAT_IPMICTL_SEND_COMMAND \ + _IOR(IPMI_IOC_MAGIC, 13, struct compat_ipmi_req) +#define COMPAT_IPMICTL_SEND_COMMAND_SETTIME \ + _IOR(IPMI_IOC_MAGIC, 21, struct compat_ipmi_req_settime) +#define COMPAT_IPMICTL_RECEIVE_MSG \ + _IOWR(IPMI_IOC_MAGIC, 12, struct compat_ipmi_recv) +#define COMPAT_IPMICTL_RECEIVE_MSG_TRUNC \ + _IOWR(IPMI_IOC_MAGIC, 11, struct compat_ipmi_recv) + +struct compat_ipmi_msg { + u8 netfn; + u8 cmd; + u16 data_len; + compat_uptr_t data; +}; + +struct compat_ipmi_req { + compat_uptr_t addr; + compat_uint_t addr_len; + compat_long_t msgid; + struct compat_ipmi_msg msg; +}; + +struct compat_ipmi_recv { + compat_int_t recv_type; + compat_uptr_t addr; + compat_uint_t addr_len; + compat_long_t msgid; + struct compat_ipmi_msg msg; +}; + +struct compat_ipmi_req_settime { + struct compat_ipmi_req req; + compat_int_t retries; + compat_uint_t retry_time_ms; +}; + +/* + * Define some helper functions for copying IPMI data + */ +static long get_compat_ipmi_msg(struct ipmi_msg *p64, + struct compat_ipmi_msg __user *p32) +{ + compat_uptr_t tmp; + + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || + __get_user(p64->netfn, &p32->netfn) || + __get_user(p64->cmd, &p32->cmd) || + __get_user(p64->data_len, &p32->data_len) || + __get_user(tmp, &p32->data)) + return -EFAULT; + p64->data = compat_ptr(tmp); + return 0; +} + +static long put_compat_ipmi_msg(struct ipmi_msg *p64, + struct compat_ipmi_msg __user *p32) +{ + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || + __put_user(p64->netfn, &p32->netfn) || + __put_user(p64->cmd, &p32->cmd) || + __put_user(p64->data_len, &p32->data_len)) + return -EFAULT; + return 0; +} + +static long get_compat_ipmi_req(struct ipmi_req *p64, + struct compat_ipmi_req __user *p32) +{ + + compat_uptr_t tmp; + + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || + __get_user(tmp, &p32->addr) || + __get_user(p64->addr_len, &p32->addr_len) || + __get_user(p64->msgid, &p32->msgid) || + get_compat_ipmi_msg(&p64->msg, &p32->msg)) + return -EFAULT; + p64->addr = compat_ptr(tmp); + return 0; +} + +static long get_compat_ipmi_req_settime(struct ipmi_req_settime *p64, + struct compat_ipmi_req_settime __user *p32) +{ + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || + get_compat_ipmi_req(&p64->req, &p32->req) || + __get_user(p64->retries, &p32->retries) || + __get_user(p64->retry_time_ms, &p32->retry_time_ms)) + return -EFAULT; + return 0; +} + +static long get_compat_ipmi_recv(struct ipmi_recv *p64, + struct compat_ipmi_recv __user *p32) +{ + compat_uptr_t tmp; + + if (!access_ok(VERIFY_READ, p32, sizeof(*p32)) || + __get_user(p64->recv_type, &p32->recv_type) || + __get_user(tmp, &p32->addr) || + __get_user(p64->addr_len, &p32->addr_len) || + __get_user(p64->msgid, &p32->msgid) || + get_compat_ipmi_msg(&p64->msg, &p32->msg)) + return -EFAULT; + p64->addr = compat_ptr(tmp); + return 0; +} + +static long put_compat_ipmi_recv(struct ipmi_recv *p64, + struct compat_ipmi_recv __user *p32) +{ + if (!access_ok(VERIFY_WRITE, p32, sizeof(*p32)) || + __put_user(p64->recv_type, &p32->recv_type) || + __put_user(p64->addr_len, &p32->addr_len) || + __put_user(p64->msgid, &p32->msgid) || + put_compat_ipmi_msg(&p64->msg, &p32->msg)) + return -EFAULT; + return 0; +} + +#if defined(__VMKLNX__) +/* + * This function is to workaround the compat_alloc_user_space() API. + * It's in the old 2.4 ipmi driver as well. + */ +static long compat_ipmi_receive(struct file *file, unsigned int cmd, struct ipmi_recv *data) +{ + int rv = -EINVAL; + struct ipmi_recv rsp; + struct ipmi_file_private *priv = file->private_data; + int addr_len; + struct list_head *entry; + struct ipmi_recv_msg *msg; + unsigned long flags; + + rv = 0; + rsp = *data; + + /* We claim a mutex because we don't want two + users getting something from the queue at a time. + Since we have to release the spinlock before we can + copy the data to the user, it's possible another + user will grab something from the queue, too. Then + the messages might get out of order if something + fails and the message gets put back onto the + queue. This mutex prevents that problem. */ + mutex_lock(&priv->recv_mutex); + + /* Grab the message off the list. */ + spin_lock_irqsave(&(priv->recv_msg_lock), flags); + if (list_empty(&(priv->recv_msgs))) { + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + rv = -EAGAIN; + goto recv_err; + } + entry = priv->recv_msgs.next; + msg = list_entry(entry, struct ipmi_recv_msg, link); + list_del(entry); + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + + addr_len = ipmi_addr_length(msg->addr.addr_type); + if (rsp.addr_len < addr_len) + { + rv = -EINVAL; + goto recv_putback_on_err; + } + + if (copy_to_user(rsp.addr, &(msg->addr), addr_len)) { + rv = -EFAULT; + goto recv_putback_on_err; + } + rsp.addr_len = addr_len; + + rsp.recv_type = msg->recv_type; + rsp.msgid = msg->msgid; + rsp.msg.netfn = msg->msg.netfn; + rsp.msg.cmd = msg->msg.cmd; + + if (msg->msg.data_len > 0) { + if (rsp.msg.data_len < msg->msg.data_len) { + rv = -EMSGSIZE; + if (cmd == COMPAT_IPMICTL_RECEIVE_MSG_TRUNC) { + msg->msg.data_len = rsp.msg.data_len; + } else { + goto recv_putback_on_err; + } + } + + if (copy_to_user(rsp.msg.data, + msg->msg.data, + msg->msg.data_len)) + { + rv = -EFAULT; + goto recv_putback_on_err; + } + rsp.msg.data_len = msg->msg.data_len; + } else { + rsp.msg.data_len = 0; + } + + *data = rsp; + + mutex_unlock(&priv->recv_mutex); + ipmi_free_recv_msg(msg); + return rv; + +recv_putback_on_err: + /* If we got an error, put the message back onto + the head of the queue. */ + spin_lock_irqsave(&(priv->recv_msg_lock), flags); + list_add(entry, &(priv->recv_msgs)); + spin_unlock_irqrestore(&(priv->recv_msg_lock), flags); + mutex_unlock(&priv->recv_mutex); + return rv; + +recv_err: + mutex_unlock(&priv->recv_mutex); + return rv; +} +#endif /* if defined(__VMKLNX__) */ + +/* + * Handle compatibility ioctls + */ +static long compat_ipmi_ioctl(struct file *filep, unsigned int cmd, + unsigned long arg) +{ + int rc; + struct ipmi_file_private *priv = filep->private_data; + + switch(cmd) { + case COMPAT_IPMICTL_SEND_COMMAND: + { + struct ipmi_req rp; + + if (get_compat_ipmi_req(&rp, compat_ptr(arg))) + return -EFAULT; + + return handle_send_req(priv->user, &rp, + priv->default_retries, + priv->default_retry_time_ms); + } + case COMPAT_IPMICTL_SEND_COMMAND_SETTIME: + { + struct ipmi_req_settime sp; + + if (get_compat_ipmi_req_settime(&sp, compat_ptr(arg))) + return -EFAULT; + + return handle_send_req(priv->user, &sp.req, + sp.retries, sp.retry_time_ms); + } + case COMPAT_IPMICTL_RECEIVE_MSG: + case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC: + { + struct ipmi_recv __user *precv64; + struct ipmi_recv recv64; + + if (get_compat_ipmi_recv(&recv64, compat_ptr(arg))) + return -EFAULT; + +#if defined(__VMKLNX__) + precv64 = &recv64; + rc = compat_ipmi_receive(filep, cmd, precv64); +#else + precv64 = compat_alloc_user_space(sizeof(recv64)); + if (copy_to_user(precv64, &recv64, sizeof(recv64))) + return -EFAULT; + + rc = ipmi_ioctl(filep->f_path.dentry->d_inode, filep, + ((cmd == COMPAT_IPMICTL_RECEIVE_MSG) + ? IPMICTL_RECEIVE_MSG + : IPMICTL_RECEIVE_MSG_TRUNC), + (unsigned long) precv64); +#endif /* #if defined(__VMKLNX__) */ + +#if defined(__VMKLNX__) + if (rc != 0 && + (cmd != COMPAT_IPMICTL_RECEIVE_MSG_TRUNC || + rc != -EMSGSIZE)) { + return rc; + } +#else + if (rc != 0) + return rc; +#endif + +#if !defined(__VMKLNX__) + if (copy_from_user(&recv64, precv64, sizeof(recv64))) + return -EFAULT; +#endif + + if (put_compat_ipmi_recv(&recv64, compat_ptr(arg))) + return -EFAULT; + + return rc; + } + default: +#if defined(__VMKLNX__) + /* + * The inode information is not referenced in that function. + * This is just to make the interface happy. + * The original code wont compile with vmklinux. + */ + return ipmi_ioctl(NULL, filep, cmd, arg); +#else + return ipmi_ioctl(filep->f_path.dentry->d_inode, filep, cmd, arg); +#endif /* #if defined(__VMKLNX__) */ + + } +} +#endif + +static const struct file_operations ipmi_fops = { + .owner = THIS_MODULE, + .ioctl = ipmi_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = compat_ipmi_ioctl, +#endif + .open = ipmi_open, + .release = ipmi_release, + .fasync = ipmi_fasync, + .poll = ipmi_poll, +}; + +#if defined(__VMKLNX__) +#define DEVICE_NAME "ipmi0" +#else /* #if !defined(__VMKLNX__) */ +#define DEVICE_NAME "ipmidev" +#endif /* #if defined(__VMKLNX__) */ + +static int ipmi_major; +module_param(ipmi_major, int, 0); +MODULE_PARM_DESC(ipmi_major, "Sets the major number of the IPMI device. By" + " default, or if you set it to zero, it will choose the next" + " available device. Setting it to -1 will disable the" + " interface. Other values will set the major device number" + " to that value."); + +/* Keep track of the devices that are registered. */ +struct ipmi_reg_list { + dev_t dev; + struct list_head link; +}; +static LIST_HEAD(reg_list); +static DEFINE_MUTEX(reg_list_mutex); + +static struct class *ipmi_class; + +static void ipmi_new_smi(int if_num, struct device *device) +{ + dev_t dev = MKDEV(ipmi_major, if_num); + struct ipmi_reg_list *entry; + + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) { + printk(KERN_ERR "ipmi_devintf: Unable to create the" + " ipmi class device link\n"); + return; + } + entry->dev = dev; + + mutex_lock(®_list_mutex); + device_create(ipmi_class, device, dev, "ipmi%d", if_num); + list_add(&entry->link, ®_list); +#if defined(__VMKLNX__) + { + char name[6]; + if (if_num <= MAX_DEVICES) { + snprintf(name, sizeof name, "ipmi%d", if_num); + majors[if_num] = register_chrdev(0, name, &ipmi_fops); + } + } +#endif //__VMKLNX__ + mutex_unlock(®_list_mutex); +} + +static void ipmi_smi_gone(int if_num) +{ + dev_t dev = MKDEV(ipmi_major, if_num); + struct ipmi_reg_list *entry; + + mutex_lock(®_list_mutex); + list_for_each_entry(entry, ®_list, link) { + if (entry->dev == dev) { + list_del(&entry->link); + kfree(entry); + break; + } + } + device_destroy(ipmi_class, dev); +#if defined(__VMKLNX__) + if (majors[if_num] > 0) { + char name[6]; + snprintf(name, sizeof name, "ipmi%d", if_num); + majors[if_num] = unregister_chrdev(majors[if_num], name); + } +#endif //__VMKLNX__ + mutex_unlock(®_list_mutex); +} + +static struct ipmi_smi_watcher smi_watcher = +{ + .owner = THIS_MODULE, + .new_smi = ipmi_new_smi, + .smi_gone = ipmi_smi_gone, +}; + +static __init int init_ipmi_devintf(void) +{ + int rv; + + if (ipmi_major < 0) + return -EINVAL; + + printk(KERN_INFO "ipmi device interface\n"); + + ipmi_class = class_create(THIS_MODULE, "ipmi"); + if (IS_ERR(ipmi_class)) { + printk(KERN_ERR "ipmi: can't register device class\n"); + return PTR_ERR(ipmi_class); + } + +#if !defined(__VMKLNX__) + rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops); + if (rv < 0) { + class_destroy(ipmi_class); + printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major); + return rv; + } + + if (ipmi_major == 0) { + ipmi_major = rv; + } +#endif //!__VMKLNX__ + + rv = ipmi_smi_watcher_register(&smi_watcher); + if (rv) { +#if !defined(__VMKLNX__) + unregister_chrdev(ipmi_major, DEVICE_NAME); +#endif //!__VMKLNX__ + class_destroy(ipmi_class); + printk(KERN_WARNING "ipmi: can't register smi watcher\n"); + return rv; + } + + return 0; +} +module_init(init_ipmi_devintf); + +static __exit void cleanup_ipmi(void) +{ + struct ipmi_reg_list *entry, *entry2; + mutex_lock(®_list_mutex); + list_for_each_entry_safe(entry, entry2, ®_list, link) { + list_del(&entry->link); + device_destroy(ipmi_class, entry->dev); + kfree(entry); + } + mutex_unlock(®_list_mutex); + class_destroy(ipmi_class); + ipmi_smi_watcher_unregister(&smi_watcher); + +#if !defined(__VMKLNX__) + unregister_chrdev(ipmi_major, DEVICE_NAME); +#endif //!__VMKLNX__ +} +module_exit(cleanup_ipmi); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Corey Minyard "); +MODULE_DESCRIPTION("Linux device interface for the IPMI message handler."); +#if defined(__VMKLNX__) +MODULE_VERSION(IPMI_DRIVER_VERSION); +#endif diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.c new file mode 100644 index 0000000..1161c42 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/ipmi_msghandler.c @@ -0,0 +1,4428 @@ +/* + * ipmi_msghandler.c + * + * Incoming and outgoing message routing for an IPMI interface. + * + * Author: MontaVista Software, Inc. + * Corey Minyard + * source@mvista.com + * + * Copyright 2002 MontaVista Software Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__VMKLNX__) +#include +#include "kcompat.h" +#endif /* #if defined(__VMKLNX__) */ + +#define PFX "IPMI message handler: " + +#define IPMI_DRIVER_VERSION "39.2.0.1-1vmw" + +static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void); +static int ipmi_init_msghandler(void); + +static int initialized; + +#ifdef CONFIG_PROC_FS +static struct proc_dir_entry *proc_ipmi_root; +#endif /* CONFIG_PROC_FS */ + +/* Remain in auto-maintenance mode for this amount of time (in ms). */ +#define IPMI_MAINTENANCE_MODE_TIMEOUT 30000 + +#define MAX_EVENTS_IN_QUEUE 25 + +/* Don't let a message sit in a queue forever, always time it with at lest + the max message timer. This is in milliseconds. */ +#define MAX_MSG_TIMEOUT 60000 + + +/* + * The main "user" data structure. + */ +struct ipmi_user +{ + struct list_head link; + + /* Set to "0" when the user is destroyed. */ + int valid; + + struct kref refcount; + + /* The upper layer that handles receive messages. */ + struct ipmi_user_hndl *handler; + void *handler_data; + + /* The interface this user is bound to. */ + ipmi_smi_t intf; + + /* Does this interface receive IPMI events? */ + int gets_events; +}; + +struct cmd_rcvr +{ + struct list_head link; + + ipmi_user_t user; + unsigned char netfn; + unsigned char cmd; + unsigned int chans; + + /* + * This is used to form a linked lised during mass deletion. + * Since this is in an RCU list, we cannot use the link above + * or change any data until the RCU period completes. So we + * use this next variable during mass deletion so we can have + * a list and don't have to wait and restart the search on + * every individual deletion of a command. */ + struct cmd_rcvr *next; +}; + +struct seq_table +{ + unsigned int inuse : 1; + unsigned int broadcast : 1; +#if defined (__VMKLNX__) + long timeout; +#else + unsigned long timeout; +#endif + unsigned long orig_timeout; + unsigned int retries_left; + + /* To verify on an incoming send message response that this is + the message that the response is for, we keep a sequence id + and increment it every time we send a message. */ + long seqid; + + /* This is held so we can properly respond to the message on a + timeout, and it is used to hold the temporary data for + retransmission, too. */ + struct ipmi_recv_msg *recv_msg; +}; + +/* Store the information in a msgid (long) to allow us to find a + sequence table entry from the msgid. */ +#define STORE_SEQ_IN_MSGID(seq, seqid) (((seq&0xff)<<26) | (seqid&0x3ffffff)) + +#define GET_SEQ_FROM_MSGID(msgid, seq, seqid) \ + do { \ + seq = ((msgid >> 26) & 0x3f); \ + seqid = (msgid & 0x3fffff); \ + } while (0) + +#define NEXT_SEQID(seqid) (((seqid) + 1) & 0x3fffff) + +struct ipmi_channel +{ + unsigned char medium; + unsigned char protocol; + + /* My slave address. This is initialized to IPMI_BMC_SLAVE_ADDR, + but may be changed by the user. */ + unsigned char address; + + /* My LUN. This should generally stay the SMS LUN, but just in + case... */ + unsigned char lun; +}; + +#ifdef CONFIG_PROC_FS +struct ipmi_proc_entry +{ + char *name; + struct ipmi_proc_entry *next; +}; +#endif + +struct bmc_device +{ + struct platform_device *dev; + struct ipmi_device_id id; + unsigned char guid[16]; + int guid_set; + + struct kref refcount; + + /* bmc device attributes */ + struct device_attribute device_id_attr; + struct device_attribute provides_dev_sdrs_attr; + struct device_attribute revision_attr; + struct device_attribute firmware_rev_attr; + struct device_attribute version_attr; + struct device_attribute add_dev_support_attr; + struct device_attribute manufacturer_id_attr; + struct device_attribute product_id_attr; + struct device_attribute guid_attr; + struct device_attribute aux_firmware_rev_attr; +}; + +#define IPMI_IPMB_NUM_SEQ 64 +#define IPMI_MAX_CHANNELS 16 +struct ipmi_smi +{ + /* What interface number are we? */ + int intf_num; + + struct kref refcount; + + /* Used for a list of interfaces. */ + struct list_head link; + + /* The list of upper layers that are using me. seq_lock + * protects this. */ + struct list_head users; + + /* Information to supply to users. */ + unsigned char ipmi_version_major; + unsigned char ipmi_version_minor; + + /* Used for wake ups at startup. */ + wait_queue_head_t waitq; + + struct bmc_device *bmc; + char *my_dev_name; + char *sysfs_name; + + /* This is the lower-layer's sender routine. Note that you + * must either be holding the ipmi_interfaces_mutex or be in + * an umpreemptible region to use this. You must fetch the + * value into a local variable and make sure it is not NULL. */ + struct ipmi_smi_handlers *handlers; + void *send_info; + +#ifdef CONFIG_PROC_FS + /* A list of proc entries for this interface. */ + struct mutex proc_entry_lock; + struct ipmi_proc_entry *proc_entries; +#endif + + /* Driver-model device for the system interface. */ + struct device *si_dev; + + /* A table of sequence numbers for this interface. We use the + sequence numbers for IPMB messages that go out of the + interface to match them up with their responses. A routine + is called periodically to time the items in this list. */ + spinlock_t seq_lock; + struct seq_table seq_table[IPMI_IPMB_NUM_SEQ]; + int curr_seq; + + /* Messages that were delayed for some reason (out of memory, + for instance), will go in here to be processed later in a + periodic timer interrupt. */ + spinlock_t waiting_msgs_lock; + struct list_head waiting_msgs; + + /* The list of command receivers that are registered for commands + on this interface. */ + struct mutex cmd_rcvrs_mutex; + struct list_head cmd_rcvrs; + + /* Events that were queues because no one was there to receive + them. */ + spinlock_t events_lock; /* For dealing with event stuff. */ + struct list_head waiting_events; + unsigned int waiting_events_count; /* How many events in queue? */ + int delivering_events; + + /* The event receiver for my BMC, only really used at panic + shutdown as a place to store this. */ + unsigned char event_receiver; + unsigned char event_receiver_lun; + unsigned char local_sel_device; + unsigned char local_event_generator; + + /* For handling of maintenance mode. */ + int maintenance_mode; + int maintenance_mode_enable; + int auto_maintenance_timeout; + spinlock_t maintenance_mode_lock; /* Used in a timer... */ + + /* A cheap hack, if this is non-null and a message to an + interface comes in with a NULL user, call this routine with + it. Note that the message will still be freed by the + caller. This only works on the system interface. */ + void (*null_user_handler)(ipmi_smi_t intf, struct ipmi_recv_msg *msg); + + /* When we are scanning the channels for an SMI, this will + tell which channel we are scanning. */ + int curr_channel; + + /* Channel information */ + struct ipmi_channel channels[IPMI_MAX_CHANNELS]; + + /* Proc FS stuff. */ + struct proc_dir_entry *proc_dir; + char proc_dir_name[10]; + + spinlock_t counter_lock; /* For making counters atomic. */ + + /* Commands we got that were invalid. */ + unsigned int sent_invalid_commands; + + /* Commands we sent to the MC. */ + unsigned int sent_local_commands; + /* Responses from the MC that were delivered to a user. */ + unsigned int handled_local_responses; + /* Responses from the MC that were not delivered to a user. */ + unsigned int unhandled_local_responses; + + /* Commands we sent out to the IPMB bus. */ + unsigned int sent_ipmb_commands; + /* Commands sent on the IPMB that had errors on the SEND CMD */ + unsigned int sent_ipmb_command_errs; + /* Each retransmit increments this count. */ + unsigned int retransmitted_ipmb_commands; + /* When a message times out (runs out of retransmits) this is + incremented. */ + unsigned int timed_out_ipmb_commands; + + /* This is like above, but for broadcasts. Broadcasts are + *not* included in the above count (they are expected to + time out). */ + unsigned int timed_out_ipmb_broadcasts; + + /* Responses I have sent to the IPMB bus. */ + unsigned int sent_ipmb_responses; + + /* The response was delivered to the user. */ + unsigned int handled_ipmb_responses; + /* The response had invalid data in it. */ + unsigned int invalid_ipmb_responses; + /* The response didn't have anyone waiting for it. */ + unsigned int unhandled_ipmb_responses; + + /* Commands we sent out to the IPMB bus. */ + unsigned int sent_lan_commands; + /* Commands sent on the IPMB that had errors on the SEND CMD */ + unsigned int sent_lan_command_errs; + /* Each retransmit increments this count. */ + unsigned int retransmitted_lan_commands; + /* When a message times out (runs out of retransmits) this is + incremented. */ + unsigned int timed_out_lan_commands; + + /* Responses I have sent to the IPMB bus. */ + unsigned int sent_lan_responses; + + /* The response was delivered to the user. */ + unsigned int handled_lan_responses; + /* The response had invalid data in it. */ + unsigned int invalid_lan_responses; + /* The response didn't have anyone waiting for it. */ + unsigned int unhandled_lan_responses; + + /* The command was delivered to the user. */ + unsigned int handled_commands; + /* The command had invalid data in it. */ + unsigned int invalid_commands; + /* The command didn't have anyone waiting for it. */ + unsigned int unhandled_commands; + + /* Invalid data in an event. */ + unsigned int invalid_events; + /* Events that were received with the proper format. */ + unsigned int events; +}; +#define to_si_intf_from_dev(device) container_of(device, struct ipmi_smi, dev) + +/** + * The driver model view of the IPMI messaging driver. + */ +static struct device_driver ipmidriver = { +#if defined(__VMKLNX__) + .owner = THIS_MODULE, +#endif + .name = "ipmi", + .bus = &platform_bus_type +}; +static DEFINE_MUTEX(ipmidriver_mutex); + +static struct list_head ipmi_interfaces = LIST_HEAD_INIT(ipmi_interfaces); +static DEFINE_MUTEX(ipmi_interfaces_mutex); + +/* List of watchers that want to know when smi's are added and + deleted. */ +static struct list_head smi_watchers = LIST_HEAD_INIT(smi_watchers); +static DEFINE_MUTEX(smi_watchers_mutex); + + +static void free_recv_msg_list(struct list_head *q) +{ + struct ipmi_recv_msg *msg, *msg2; + + list_for_each_entry_safe(msg, msg2, q, link) { + list_del(&msg->link); + ipmi_free_recv_msg(msg); + } +} + +static void free_smi_msg_list(struct list_head *q) +{ + struct ipmi_smi_msg *msg, *msg2; + + list_for_each_entry_safe(msg, msg2, q, link) { + list_del(&msg->link); + ipmi_free_smi_msg(msg); + } +} + +static void clean_up_interface_data(ipmi_smi_t intf) +{ + int i; + struct cmd_rcvr *rcvr, *rcvr2; + struct list_head list; + + free_smi_msg_list(&intf->waiting_msgs); + free_recv_msg_list(&intf->waiting_events); + + /* + * Wholesale remove all the entries from the list in the + * interface and wait for RCU to know that none are in use. + */ + mutex_lock(&intf->cmd_rcvrs_mutex); + INIT_LIST_HEAD(&list); + list_splice_init_rcu(&intf->cmd_rcvrs, &list, synchronize_rcu); + mutex_unlock(&intf->cmd_rcvrs_mutex); + + list_for_each_entry_safe(rcvr, rcvr2, &list, link) + kfree(rcvr); + + for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { + if ((intf->seq_table[i].inuse) + && (intf->seq_table[i].recv_msg)) + { + ipmi_free_recv_msg(intf->seq_table[i].recv_msg); + } + } +} + +static void intf_free(struct kref *ref) +{ + ipmi_smi_t intf = container_of(ref, struct ipmi_smi, refcount); + + clean_up_interface_data(intf); + kfree(intf); +} + +struct watcher_entry { + int intf_num; + ipmi_smi_t intf; + struct list_head link; +}; + +int ipmi_smi_watcher_register(struct ipmi_smi_watcher *watcher) +{ + ipmi_smi_t intf; + struct list_head to_deliver = LIST_HEAD_INIT(to_deliver); + struct watcher_entry *e, *e2; + + mutex_lock(&smi_watchers_mutex); + + mutex_lock(&ipmi_interfaces_mutex); + + /* Build a list of things to deliver. */ + list_for_each_entry(intf, &ipmi_interfaces, link) { + if (intf->intf_num == -1) + continue; + e = kmalloc(sizeof(*e), GFP_KERNEL); + if (!e) + goto out_err; + kref_get(&intf->refcount); + e->intf = intf; + e->intf_num = intf->intf_num; + list_add_tail(&e->link, &to_deliver); + } + + /* We will succeed, so add it to the list. */ + list_add(&watcher->link, &smi_watchers); + + mutex_unlock(&ipmi_interfaces_mutex); + + list_for_each_entry_safe(e, e2, &to_deliver, link) { + list_del(&e->link); + watcher->new_smi(e->intf_num, e->intf->si_dev); + kref_put(&e->intf->refcount, intf_free); + kfree(e); + } + + mutex_unlock(&smi_watchers_mutex); + + return 0; + + out_err: + mutex_unlock(&ipmi_interfaces_mutex); + mutex_unlock(&smi_watchers_mutex); + list_for_each_entry_safe(e, e2, &to_deliver, link) { + list_del(&e->link); + kref_put(&e->intf->refcount, intf_free); + kfree(e); + } + return -ENOMEM; +} + +int ipmi_smi_watcher_unregister(struct ipmi_smi_watcher *watcher) +{ + mutex_lock(&smi_watchers_mutex); + list_del(&(watcher->link)); + mutex_unlock(&smi_watchers_mutex); + return 0; +} + +/* + * Must be called with smi_watchers_mutex held. + */ +static void +call_smi_watchers(int i, struct device *dev) +{ + struct ipmi_smi_watcher *w; + + list_for_each_entry(w, &smi_watchers, link) { + if (try_module_get(w->owner)) { + w->new_smi(i, dev); + module_put(w->owner); + } + } +} + +static int +ipmi_addr_equal(struct ipmi_addr *addr1, struct ipmi_addr *addr2) +{ + if (addr1->addr_type != addr2->addr_type) + return 0; + + if (addr1->channel != addr2->channel) + return 0; + + if (addr1->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { + struct ipmi_system_interface_addr *smi_addr1 + = (struct ipmi_system_interface_addr *) addr1; + struct ipmi_system_interface_addr *smi_addr2 + = (struct ipmi_system_interface_addr *) addr2; + return (smi_addr1->lun == smi_addr2->lun); + } + + if ((addr1->addr_type == IPMI_IPMB_ADDR_TYPE) + || (addr1->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) + { + struct ipmi_ipmb_addr *ipmb_addr1 + = (struct ipmi_ipmb_addr *) addr1; + struct ipmi_ipmb_addr *ipmb_addr2 + = (struct ipmi_ipmb_addr *) addr2; + + return ((ipmb_addr1->slave_addr == ipmb_addr2->slave_addr) + && (ipmb_addr1->lun == ipmb_addr2->lun)); + } + + if (addr1->addr_type == IPMI_LAN_ADDR_TYPE) { + struct ipmi_lan_addr *lan_addr1 + = (struct ipmi_lan_addr *) addr1; + struct ipmi_lan_addr *lan_addr2 + = (struct ipmi_lan_addr *) addr2; + + return ((lan_addr1->remote_SWID == lan_addr2->remote_SWID) + && (lan_addr1->local_SWID == lan_addr2->local_SWID) + && (lan_addr1->session_handle + == lan_addr2->session_handle) + && (lan_addr1->lun == lan_addr2->lun)); + } + + return 1; +} + +int ipmi_validate_addr(struct ipmi_addr *addr, int len) +{ + if (len < sizeof(struct ipmi_system_interface_addr)) { + return -EINVAL; + } + + if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { + if (addr->channel != IPMI_BMC_CHANNEL) + return -EINVAL; + return 0; + } + + if ((addr->channel == IPMI_BMC_CHANNEL) + || (addr->channel >= IPMI_MAX_CHANNELS) + || (addr->channel < 0)) + return -EINVAL; + + if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) + || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) + { + if (len < sizeof(struct ipmi_ipmb_addr)) { + return -EINVAL; + } + return 0; + } + + if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { + if (len < sizeof(struct ipmi_lan_addr)) { + return -EINVAL; + } + return 0; + } + + return -EINVAL; +} + +unsigned int ipmi_addr_length(int addr_type) +{ + if (addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) + return sizeof(struct ipmi_system_interface_addr); + + if ((addr_type == IPMI_IPMB_ADDR_TYPE) + || (addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) + { + return sizeof(struct ipmi_ipmb_addr); + } + + if (addr_type == IPMI_LAN_ADDR_TYPE) + return sizeof(struct ipmi_lan_addr); + + return 0; +} + +static void deliver_response(struct ipmi_recv_msg *msg) +{ + if (!msg->user) { + ipmi_smi_t intf = msg->user_msg_data; + unsigned long flags; + + /* Special handling for NULL users. */ + if (intf->null_user_handler) { + intf->null_user_handler(intf, msg); + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_local_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + } else { + /* No handler, so give up. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_local_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + } + ipmi_free_recv_msg(msg); + } else { + ipmi_user_t user = msg->user; + user->handler->ipmi_recv_hndl(msg, user->handler_data); + } +} + +static void +deliver_err_response(struct ipmi_recv_msg *msg, int err) +{ + msg->recv_type = IPMI_RESPONSE_RECV_TYPE; + msg->msg_data[0] = err; + msg->msg.netfn |= 1; /* Convert to a response. */ + msg->msg.data_len = 1; + msg->msg.data = msg->msg_data; + deliver_response(msg); +} + +/* Find the next sequence number not being used and add the given + message with the given timeout to the sequence table. This must be + called with the interface's seq_lock held. */ +static int intf_next_seq(ipmi_smi_t intf, + struct ipmi_recv_msg *recv_msg, + unsigned long timeout, + int retries, + int broadcast, + unsigned char *seq, + long *seqid) +{ + int rv = 0; + unsigned int i; + + for (i = intf->curr_seq; + (i+1)%IPMI_IPMB_NUM_SEQ != intf->curr_seq; + i = (i+1)%IPMI_IPMB_NUM_SEQ) + { + if (!intf->seq_table[i].inuse) + break; + } + + if (!intf->seq_table[i].inuse) { + intf->seq_table[i].recv_msg = recv_msg; + + /* Start with the maximum timeout, when the send response + comes in we will start the real timer. */ + intf->seq_table[i].timeout = MAX_MSG_TIMEOUT; + intf->seq_table[i].orig_timeout = timeout; + intf->seq_table[i].retries_left = retries; + intf->seq_table[i].broadcast = broadcast; + intf->seq_table[i].inuse = 1; + intf->seq_table[i].seqid = NEXT_SEQID(intf->seq_table[i].seqid); + *seq = i; + *seqid = intf->seq_table[i].seqid; + intf->curr_seq = (i+1)%IPMI_IPMB_NUM_SEQ; + } else { + rv = -EAGAIN; + } + + return rv; +} + +/* Return the receive message for the given sequence number and + release the sequence number so it can be reused. Some other data + is passed in to be sure the message matches up correctly (to help + guard against message coming in after their timeout and the + sequence number being reused). */ +static int intf_find_seq(ipmi_smi_t intf, + unsigned char seq, + short channel, + unsigned char cmd, + unsigned char netfn, + struct ipmi_addr *addr, + struct ipmi_recv_msg **recv_msg) +{ + int rv = -ENODEV; + unsigned long flags; + + if (seq >= IPMI_IPMB_NUM_SEQ) + return -EINVAL; + + spin_lock_irqsave(&(intf->seq_lock), flags); + if (intf->seq_table[seq].inuse) { + struct ipmi_recv_msg *msg = intf->seq_table[seq].recv_msg; + + if ((msg->addr.channel == channel) + && (msg->msg.cmd == cmd) + && (msg->msg.netfn == netfn) + && (ipmi_addr_equal(addr, &(msg->addr)))) + { + *recv_msg = msg; + intf->seq_table[seq].inuse = 0; + rv = 0; + } + } + spin_unlock_irqrestore(&(intf->seq_lock), flags); + + return rv; +} + + +/* Start the timer for a specific sequence table entry. */ +static int intf_start_seq_timer(ipmi_smi_t intf, + long msgid) +{ + int rv = -ENODEV; + unsigned long flags; + unsigned char seq; + unsigned long seqid; + + + GET_SEQ_FROM_MSGID(msgid, seq, seqid); + + spin_lock_irqsave(&(intf->seq_lock), flags); + /* We do this verification because the user can be deleted + while a message is outstanding. */ + if ((intf->seq_table[seq].inuse) + && (intf->seq_table[seq].seqid == seqid)) + { + struct seq_table *ent = &(intf->seq_table[seq]); + ent->timeout = ent->orig_timeout; + rv = 0; + } + spin_unlock_irqrestore(&(intf->seq_lock), flags); + + return rv; +} + +/* Got an error for the send message for a specific sequence number. */ +static int intf_err_seq(ipmi_smi_t intf, + long msgid, + unsigned int err) +{ + int rv = -ENODEV; + unsigned long flags; + unsigned char seq; + unsigned long seqid; + struct ipmi_recv_msg *msg = NULL; + + + GET_SEQ_FROM_MSGID(msgid, seq, seqid); + + spin_lock_irqsave(&(intf->seq_lock), flags); + /* We do this verification because the user can be deleted + while a message is outstanding. */ + if ((intf->seq_table[seq].inuse) + && (intf->seq_table[seq].seqid == seqid)) + { + struct seq_table *ent = &(intf->seq_table[seq]); + + ent->inuse = 0; + msg = ent->recv_msg; + rv = 0; + } + spin_unlock_irqrestore(&(intf->seq_lock), flags); + + if (msg) + deliver_err_response(msg, err); + + return rv; +} + + +int ipmi_create_user(unsigned int if_num, + struct ipmi_user_hndl *handler, + void *handler_data, + ipmi_user_t *user) +{ + unsigned long flags; + ipmi_user_t new_user; + int rv = 0; + ipmi_smi_t intf; + + /* There is no module usecount here, because it's not + required. Since this can only be used by and called from + other modules, they will implicitly use this module, and + thus this can't be removed unless the other modules are + removed. */ + + if (handler == NULL) + return -EINVAL; + + /* Make sure the driver is actually initialized, this handles + problems with initialization order. */ + if (!initialized) { + rv = ipmi_init_msghandler(); + if (rv) + return rv; + + /* The init code doesn't return an error if it was turned + off, but it won't initialize. Check that. */ + if (!initialized) + return -ENODEV; + } + + new_user = kmalloc(sizeof(*new_user), GFP_KERNEL); + if (!new_user) + return -ENOMEM; + + mutex_lock(&ipmi_interfaces_mutex); + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + if (intf->intf_num == if_num) + goto found; + } + /* Not found, return an error */ + rv = -EINVAL; + goto out_kfree; + + found: + /* Note that each existing user holds a refcount to the interface. */ + kref_get(&intf->refcount); + + kref_init(&new_user->refcount); + new_user->handler = handler; + new_user->handler_data = handler_data; + new_user->intf = intf; + new_user->gets_events = 0; + +#if !defined(__VMKLNX__) + if (!try_module_get(intf->handlers->owner)) { + rv = -ENODEV; + goto out_kref; + } + + if (intf->handlers->inc_usecount) { + rv = intf->handlers->inc_usecount(intf->send_info); + if (rv) { + module_put(intf->handlers->owner); + goto out_kref; + } + } +#endif /* #if !defined(__VMKLNX__) */ + + /* Hold the lock so intf->handlers is guaranteed to be good + * until now */ + mutex_unlock(&ipmi_interfaces_mutex); + + new_user->valid = 1; + spin_lock_irqsave(&intf->seq_lock, flags); + list_add_rcu(&new_user->link, &intf->users); + spin_unlock_irqrestore(&intf->seq_lock, flags); + *user = new_user; + return 0; + +#if !defined(__VMKLNX__) +out_kref: +#endif /* #if !defined(__VMKLNX__) */ + kref_put(&intf->refcount, intf_free); +out_kfree: + mutex_unlock(&ipmi_interfaces_mutex); + kfree(new_user); + return rv; +} + +static void free_user(struct kref *ref) +{ + ipmi_user_t user = container_of(ref, struct ipmi_user, refcount); + kfree(user); +} + +int ipmi_destroy_user(ipmi_user_t user) +{ + ipmi_smi_t intf = user->intf; + int i; + unsigned long flags; + struct cmd_rcvr *rcvr; + struct cmd_rcvr *rcvrs = NULL; + + user->valid = 0; + + /* Remove the user from the interface's sequence table. */ + spin_lock_irqsave(&intf->seq_lock, flags); + list_del_rcu(&user->link); + + for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { + if (intf->seq_table[i].inuse + && (intf->seq_table[i].recv_msg->user == user)) + { + intf->seq_table[i].inuse = 0; + ipmi_free_recv_msg(intf->seq_table[i].recv_msg); + } + } + spin_unlock_irqrestore(&intf->seq_lock, flags); + + /* + * Remove the user from the command receiver's table. First + * we build a list of everything (not using the standard link, + * since other things may be using it till we do + * synchronize_rcu()) then free everything in that list. + */ + mutex_lock(&intf->cmd_rcvrs_mutex); + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { + if (rcvr->user == user) { + list_del_rcu(&rcvr->link); + rcvr->next = rcvrs; + rcvrs = rcvr; + } + } + mutex_unlock(&intf->cmd_rcvrs_mutex); + synchronize_rcu(); + while (rcvrs) { + rcvr = rcvrs; + rcvrs = rcvr->next; + kfree(rcvr); + } + +#if !defined(__VMKLNX__) + mutex_lock(&ipmi_interfaces_mutex); + if (intf->handlers) { + module_put(intf->handlers->owner); + if (intf->handlers->dec_usecount) + intf->handlers->dec_usecount(intf->send_info); + } + mutex_unlock(&ipmi_interfaces_mutex); +#endif /* #if !defined(__VMKLNX__) */ + + kref_put(&intf->refcount, intf_free); + + kref_put(&user->refcount, free_user); + + return 0; +} + +void ipmi_get_version(ipmi_user_t user, + unsigned char *major, + unsigned char *minor) +{ + *major = user->intf->ipmi_version_major; + *minor = user->intf->ipmi_version_minor; +} + +int ipmi_set_my_address(ipmi_user_t user, + unsigned int channel, + unsigned char address) +{ + if (channel >= IPMI_MAX_CHANNELS) + return -EINVAL; + user->intf->channels[channel].address = address; + return 0; +} + +int ipmi_get_my_address(ipmi_user_t user, + unsigned int channel, + unsigned char *address) +{ + if (channel >= IPMI_MAX_CHANNELS) + return -EINVAL; + *address = user->intf->channels[channel].address; + return 0; +} + +int ipmi_set_my_LUN(ipmi_user_t user, + unsigned int channel, + unsigned char LUN) +{ + if (channel >= IPMI_MAX_CHANNELS) + return -EINVAL; + user->intf->channels[channel].lun = LUN & 0x3; + return 0; +} + +int ipmi_get_my_LUN(ipmi_user_t user, + unsigned int channel, + unsigned char *address) +{ + if (channel >= IPMI_MAX_CHANNELS) + return -EINVAL; + *address = user->intf->channels[channel].lun; + return 0; +} + +int ipmi_get_maintenance_mode(ipmi_user_t user) +{ + int mode; + unsigned long flags; + + spin_lock_irqsave(&user->intf->maintenance_mode_lock, flags); + mode = user->intf->maintenance_mode; + spin_unlock_irqrestore(&user->intf->maintenance_mode_lock, flags); + + return mode; +} +EXPORT_SYMBOL(ipmi_get_maintenance_mode); + +static void maintenance_mode_update(ipmi_smi_t intf) +{ + if (intf->handlers->set_maintenance_mode) + intf->handlers->set_maintenance_mode( + intf->send_info, intf->maintenance_mode_enable); +} + +int ipmi_set_maintenance_mode(ipmi_user_t user, int mode) +{ + int rv = 0; + unsigned long flags; + ipmi_smi_t intf = user->intf; + + spin_lock_irqsave(&intf->maintenance_mode_lock, flags); + if (intf->maintenance_mode != mode) { + switch (mode) { + case IPMI_MAINTENANCE_MODE_AUTO: + intf->maintenance_mode = mode; + intf->maintenance_mode_enable + = (intf->auto_maintenance_timeout > 0); + break; + + case IPMI_MAINTENANCE_MODE_OFF: + intf->maintenance_mode = mode; + intf->maintenance_mode_enable = 0; + break; + + case IPMI_MAINTENANCE_MODE_ON: + intf->maintenance_mode = mode; + intf->maintenance_mode_enable = 1; + break; + + default: + rv = -EINVAL; + goto out_unlock; + } + + maintenance_mode_update(intf); + } + out_unlock: + spin_unlock_irqrestore(&intf->maintenance_mode_lock, flags); + + return rv; +} +EXPORT_SYMBOL(ipmi_set_maintenance_mode); + +int ipmi_set_gets_events(ipmi_user_t user, int val) +{ + unsigned long flags; + ipmi_smi_t intf = user->intf; + struct ipmi_recv_msg *msg, *msg2; + struct list_head msgs; + + INIT_LIST_HEAD(&msgs); + + spin_lock_irqsave(&intf->events_lock, flags); + user->gets_events = val; + + if (intf->delivering_events) + /* + * Another thread is delivering events for this, so + * let it handle any new events. + */ + goto out; + + /* Deliver any queued events. */ + while (user->gets_events && !list_empty(&intf->waiting_events)) { + list_for_each_entry_safe(msg, msg2, &intf->waiting_events, link) + list_move_tail(&msg->link, &msgs); + intf->waiting_events_count = 0; + + intf->delivering_events = 1; + spin_unlock_irqrestore(&intf->events_lock, flags); + + list_for_each_entry_safe(msg, msg2, &msgs, link) { + msg->user = user; + kref_get(&user->refcount); + deliver_response(msg); + } + + spin_lock_irqsave(&intf->events_lock, flags); + intf->delivering_events = 0; + } + + out: + spin_unlock_irqrestore(&intf->events_lock, flags); + + return 0; +} + +static struct cmd_rcvr *find_cmd_rcvr(ipmi_smi_t intf, + unsigned char netfn, + unsigned char cmd, + unsigned char chan) +{ + struct cmd_rcvr *rcvr; + + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { + if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd) + && (rcvr->chans & (1 << chan))) + return rcvr; + } + return NULL; +} + +static int is_cmd_rcvr_exclusive(ipmi_smi_t intf, + unsigned char netfn, + unsigned char cmd, + unsigned int chans) +{ + struct cmd_rcvr *rcvr; + + list_for_each_entry_rcu(rcvr, &intf->cmd_rcvrs, link) { + if ((rcvr->netfn == netfn) && (rcvr->cmd == cmd) + && (rcvr->chans & chans)) + return 0; + } + return 1; +} + +int ipmi_register_for_cmd(ipmi_user_t user, + unsigned char netfn, + unsigned char cmd, + unsigned int chans) +{ + ipmi_smi_t intf = user->intf; + struct cmd_rcvr *rcvr; + int rv = 0; + + + rcvr = kmalloc(sizeof(*rcvr), GFP_KERNEL); + if (!rcvr) + return -ENOMEM; + rcvr->cmd = cmd; + rcvr->netfn = netfn; + rcvr->chans = chans; + rcvr->user = user; + + mutex_lock(&intf->cmd_rcvrs_mutex); + /* Make sure the command/netfn is not already registered. */ + if (!is_cmd_rcvr_exclusive(intf, netfn, cmd, chans)) { + rv = -EBUSY; + goto out_unlock; + } + + list_add_rcu(&rcvr->link, &intf->cmd_rcvrs); + + out_unlock: + mutex_unlock(&intf->cmd_rcvrs_mutex); + if (rv) + kfree(rcvr); + + return rv; +} + +int ipmi_unregister_for_cmd(ipmi_user_t user, + unsigned char netfn, + unsigned char cmd, + unsigned int chans) +{ + ipmi_smi_t intf = user->intf; + struct cmd_rcvr *rcvr; + struct cmd_rcvr *rcvrs = NULL; + int i, rv = -ENOENT; + + mutex_lock(&intf->cmd_rcvrs_mutex); + for (i = 0; i < IPMI_NUM_CHANNELS; i++) { + if (((1 << i) & chans) == 0) + continue; + rcvr = find_cmd_rcvr(intf, netfn, cmd, i); + if (rcvr == NULL) + continue; + if (rcvr->user == user) { + rv = 0; + rcvr->chans &= ~chans; + if (rcvr->chans == 0) { + list_del_rcu(&rcvr->link); + rcvr->next = rcvrs; + rcvrs = rcvr; + } + } + } + mutex_unlock(&intf->cmd_rcvrs_mutex); + synchronize_rcu(); + while (rcvrs) { + rcvr = rcvrs; + rcvrs = rcvr->next; + kfree(rcvr); + } + return rv; +} + +void ipmi_user_set_run_to_completion(ipmi_user_t user, int val) +{ + ipmi_smi_t intf = user->intf; + if (intf->handlers) + intf->handlers->set_run_to_completion(intf->send_info, val); +} + +static unsigned char +ipmb_checksum(unsigned char *data, int size) +{ + unsigned char csum = 0; + + for (; size > 0; size--, data++) + csum += *data; + + return -csum; +} + +static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg, + struct kernel_ipmi_msg *msg, + struct ipmi_ipmb_addr *ipmb_addr, + long msgid, + unsigned char ipmb_seq, + int broadcast, + unsigned char source_address, + unsigned char source_lun) +{ + int i = broadcast; + + /* Format the IPMB header data. */ + smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + smi_msg->data[1] = IPMI_SEND_MSG_CMD; + smi_msg->data[2] = ipmb_addr->channel; + if (broadcast) + smi_msg->data[3] = 0; + smi_msg->data[i+3] = ipmb_addr->slave_addr; + smi_msg->data[i+4] = (msg->netfn << 2) | (ipmb_addr->lun & 0x3); + smi_msg->data[i+5] = ipmb_checksum(&(smi_msg->data[i+3]), 2); + smi_msg->data[i+6] = source_address; + smi_msg->data[i+7] = (ipmb_seq << 2) | source_lun; + smi_msg->data[i+8] = msg->cmd; + + /* Now tack on the data to the message. */ + if (msg->data_len > 0) + memcpy(&(smi_msg->data[i+9]), msg->data, + msg->data_len); + smi_msg->data_size = msg->data_len + 9; + + /* Now calculate the checksum and tack it on. */ + smi_msg->data[i+smi_msg->data_size] + = ipmb_checksum(&(smi_msg->data[i+6]), + smi_msg->data_size-6); + + /* Add on the checksum size and the offset from the + broadcast. */ + smi_msg->data_size += 1 + i; + + smi_msg->msgid = msgid; +} + +static inline void format_lan_msg(struct ipmi_smi_msg *smi_msg, + struct kernel_ipmi_msg *msg, + struct ipmi_lan_addr *lan_addr, + long msgid, + unsigned char ipmb_seq, + unsigned char source_lun) +{ + /* Format the IPMB header data. */ + smi_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + smi_msg->data[1] = IPMI_SEND_MSG_CMD; + smi_msg->data[2] = lan_addr->channel; + smi_msg->data[3] = lan_addr->session_handle; + smi_msg->data[4] = lan_addr->remote_SWID; + smi_msg->data[5] = (msg->netfn << 2) | (lan_addr->lun & 0x3); + smi_msg->data[6] = ipmb_checksum(&(smi_msg->data[4]), 2); + smi_msg->data[7] = lan_addr->local_SWID; + smi_msg->data[8] = (ipmb_seq << 2) | source_lun; + smi_msg->data[9] = msg->cmd; + + /* Now tack on the data to the message. */ + if (msg->data_len > 0) + memcpy(&(smi_msg->data[10]), msg->data, + msg->data_len); + smi_msg->data_size = msg->data_len + 10; + + /* Now calculate the checksum and tack it on. */ + smi_msg->data[smi_msg->data_size] + = ipmb_checksum(&(smi_msg->data[7]), + smi_msg->data_size-7); + + /* Add on the checksum size and the offset from the + broadcast. */ + smi_msg->data_size += 1; + + smi_msg->msgid = msgid; +} + +/* Separate from ipmi_request so that the user does not have to be + supplied in certain circumstances (mainly at panic time). If + messages are supplied, they will be freed, even if an error + occurs. */ +static int i_ipmi_request(ipmi_user_t user, + ipmi_smi_t intf, + struct ipmi_addr *addr, + long msgid, + struct kernel_ipmi_msg *msg, + void *user_msg_data, + void *supplied_smi, + struct ipmi_recv_msg *supplied_recv, + int priority, + unsigned char source_address, + unsigned char source_lun, + int retries, + unsigned int retry_time_ms) +{ + int rv = 0; + struct ipmi_smi_msg *smi_msg; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + struct ipmi_smi_handlers *handlers; + + + if (supplied_recv) { + recv_msg = supplied_recv; + } else { + recv_msg = ipmi_alloc_recv_msg(); + if (recv_msg == NULL) { + return -ENOMEM; + } + } + recv_msg->user_msg_data = user_msg_data; + + if (supplied_smi) { + smi_msg = (struct ipmi_smi_msg *) supplied_smi; + } else { + smi_msg = ipmi_alloc_smi_msg(); + if (smi_msg == NULL) { + ipmi_free_recv_msg(recv_msg); + return -ENOMEM; + } + } + + rcu_read_lock(); + handlers = intf->handlers; + if (!handlers) { + rv = -ENODEV; + goto out_err; + } + + recv_msg->user = user; + if (user) + kref_get(&user->refcount); + recv_msg->msgid = msgid; + /* Store the message to send in the receive message so timeout + responses can get the proper response data. */ + recv_msg->msg = *msg; + + if (addr->addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) { + struct ipmi_system_interface_addr *smi_addr; + + if (msg->netfn & 1) { + /* Responses are not allowed to the SMI. */ + rv = -EINVAL; + goto out_err; + } + + smi_addr = (struct ipmi_system_interface_addr *) addr; + if (smi_addr->lun > 3) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + memcpy(&recv_msg->addr, smi_addr, sizeof(*smi_addr)); + + if ((msg->netfn == IPMI_NETFN_APP_REQUEST) + && ((msg->cmd == IPMI_SEND_MSG_CMD) + || (msg->cmd == IPMI_GET_MSG_CMD) + || (msg->cmd == IPMI_READ_EVENT_MSG_BUFFER_CMD))) + { + /* We don't let the user do these, since we manage + the sequence numbers. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + if (((msg->netfn == IPMI_NETFN_APP_REQUEST) + && ((msg->cmd == IPMI_COLD_RESET_CMD) + || (msg->cmd == IPMI_WARM_RESET_CMD))) + || (msg->netfn == IPMI_NETFN_FIRMWARE_REQUEST)) + { + spin_lock_irqsave(&intf->maintenance_mode_lock, flags); + intf->auto_maintenance_timeout + = IPMI_MAINTENANCE_MODE_TIMEOUT; + if (!intf->maintenance_mode + && !intf->maintenance_mode_enable) + { + intf->maintenance_mode_enable = 1; + maintenance_mode_update(intf); + } + spin_unlock_irqrestore(&intf->maintenance_mode_lock, + flags); + } + + if ((msg->data_len + 2) > IPMI_MAX_MSG_LENGTH) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EMSGSIZE; + goto out_err; + } + + smi_msg->data[0] = (msg->netfn << 2) | (smi_addr->lun & 0x3); + smi_msg->data[1] = msg->cmd; + smi_msg->msgid = msgid; + smi_msg->user_data = recv_msg; + if (msg->data_len > 0) + memcpy(&(smi_msg->data[2]), msg->data, msg->data_len); + smi_msg->data_size = msg->data_len + 2; + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_local_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + } else if ((addr->addr_type == IPMI_IPMB_ADDR_TYPE) + || (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE)) + { + struct ipmi_ipmb_addr *ipmb_addr; + unsigned char ipmb_seq; + long seqid; + int broadcast = 0; + + if (addr->channel >= IPMI_MAX_CHANNELS) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + if (intf->channels[addr->channel].medium + != IPMI_CHANNEL_MEDIUM_IPMB) + { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + if (retries < 0) { +#if defined (__VMKLNX__) + if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) + retries = 0; /* Don't retry broadcasts. */ + else + if (msg->netfn == IPMI_NETFN_SENSOR_EVENT_REQUEST || + msg->netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) { + retries = 1; + } else { + retries = 4; + } +#else + if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) + retries = 0; /* Don't retry broadcasts. */ + else + retries = 4; +#endif + } + if (addr->addr_type == IPMI_IPMB_BROADCAST_ADDR_TYPE) { + /* Broadcasts add a zero at the beginning of the + message, but otherwise is the same as an IPMB + address. */ + addr->addr_type = IPMI_IPMB_ADDR_TYPE; + broadcast = 1; + } + + + /* Default to 1 second retries. */ +#if defined (__VMKLNX__) + if (retry_time_ms == 0) { + if (msg->netfn == IPMI_NETFN_SENSOR_EVENT_REQUEST || + msg->netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) { + retry_time_ms = 100; + } else { + retry_time_ms = 1000; + } + } +#else + if (retry_time_ms == 0) + retry_time_ms = 1000; +#endif + + /* 9 for the header and 1 for the checksum, plus + possibly one for the broadcast. */ + if ((msg->data_len + 10 + broadcast) > IPMI_MAX_MSG_LENGTH) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EMSGSIZE; + goto out_err; + } + + ipmb_addr = (struct ipmi_ipmb_addr *) addr; + if (ipmb_addr->lun > 3) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + memcpy(&recv_msg->addr, ipmb_addr, sizeof(*ipmb_addr)); + + if (recv_msg->msg.netfn & 0x1) { + /* It's a response, so use the user's sequence + from msgid. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_ipmb_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + format_ipmb_msg(smi_msg, msg, ipmb_addr, msgid, + msgid, broadcast, + source_address, source_lun); + + /* Save the receive message so we can use it + to deliver the response. */ + smi_msg->user_data = recv_msg; + } else { + /* It's a command, so get a sequence for it. */ + + spin_lock_irqsave(&(intf->seq_lock), flags); + + spin_lock(&intf->counter_lock); + intf->sent_ipmb_commands++; + spin_unlock(&intf->counter_lock); + + /* Create a sequence number with a 1 second + timeout and 4 retries. */ + rv = intf_next_seq(intf, + recv_msg, + retry_time_ms, + retries, + broadcast, + &ipmb_seq, + &seqid); + if (rv) { + /* We have used up all the sequence numbers, + probably, so abort. */ + spin_unlock_irqrestore(&(intf->seq_lock), + flags); + goto out_err; + } + + /* Store the sequence number in the message, + so that when the send message response + comes back we can start the timer. */ + format_ipmb_msg(smi_msg, msg, ipmb_addr, + STORE_SEQ_IN_MSGID(ipmb_seq, seqid), + ipmb_seq, broadcast, + source_address, source_lun); + + /* Copy the message into the recv message data, so we + can retransmit it later if necessary. */ + memcpy(recv_msg->msg_data, smi_msg->data, + smi_msg->data_size); + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = smi_msg->data_size; + + /* We don't unlock until here, because we need + to copy the completed message into the + recv_msg before we release the lock. + Otherwise, race conditions may bite us. I + know that's pretty paranoid, but I prefer + to be correct. */ + spin_unlock_irqrestore(&(intf->seq_lock), flags); + } + } else if (addr->addr_type == IPMI_LAN_ADDR_TYPE) { + struct ipmi_lan_addr *lan_addr; + unsigned char ipmb_seq; + long seqid; + + if (addr->channel >= IPMI_MAX_CHANNELS) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + if ((intf->channels[addr->channel].medium + != IPMI_CHANNEL_MEDIUM_8023LAN) + && (intf->channels[addr->channel].medium + != IPMI_CHANNEL_MEDIUM_ASYNC)) + { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + +#if defined (__VMKLNX__) + retries = 1; +#else + retries = 4; +#endif + +#if defined (__VMKLNX__) + if (retry_time_ms == 0) + retry_time_ms = 100; +#else + /* Default to 1 second retries. */ + if (retry_time_ms == 0) + retry_time_ms = 1000; +#endif + + /* 11 for the header and 1 for the checksum. */ + if ((msg->data_len + 12) > IPMI_MAX_MSG_LENGTH) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EMSGSIZE; + goto out_err; + } + + lan_addr = (struct ipmi_lan_addr *) addr; + if (lan_addr->lun > 3) { + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + + memcpy(&recv_msg->addr, lan_addr, sizeof(*lan_addr)); + + if (recv_msg->msg.netfn & 0x1) { + /* It's a response, so use the user's sequence + from msgid. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_lan_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + format_lan_msg(smi_msg, msg, lan_addr, msgid, + msgid, source_lun); + + /* Save the receive message so we can use it + to deliver the response. */ + smi_msg->user_data = recv_msg; + } else { + /* It's a command, so get a sequence for it. */ + + spin_lock_irqsave(&(intf->seq_lock), flags); + + spin_lock(&intf->counter_lock); + intf->sent_lan_commands++; + spin_unlock(&intf->counter_lock); + + /* Create a sequence number with a 1 second + timeout and 4 retries. */ + rv = intf_next_seq(intf, + recv_msg, + retry_time_ms, + retries, + 0, + &ipmb_seq, + &seqid); + if (rv) { + /* We have used up all the sequence numbers, + probably, so abort. */ + spin_unlock_irqrestore(&(intf->seq_lock), + flags); + goto out_err; + } + + /* Store the sequence number in the message, + so that when the send message response + comes back we can start the timer. */ + format_lan_msg(smi_msg, msg, lan_addr, + STORE_SEQ_IN_MSGID(ipmb_seq, seqid), + ipmb_seq, source_lun); + + /* Copy the message into the recv message data, so we + can retransmit it later if necessary. */ + memcpy(recv_msg->msg_data, smi_msg->data, + smi_msg->data_size); + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = smi_msg->data_size; + + /* We don't unlock until here, because we need + to copy the completed message into the + recv_msg before we release the lock. + Otherwise, race conditions may bite us. I + know that's pretty paranoid, but I prefer + to be correct. */ + spin_unlock_irqrestore(&(intf->seq_lock), flags); + } + } else { + /* Unknown address type. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->sent_invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + rv = -EINVAL; + goto out_err; + } + +#ifdef DEBUG_MSGING + { + int m; + for (m = 0; m < smi_msg->data_size; m++) + printk(" %2.2x", smi_msg->data[m]); + printk("\n"); + } +#endif + + handlers->sender(intf->send_info, smi_msg, priority); + rcu_read_unlock(); + + return 0; + + out_err: + rcu_read_unlock(); + ipmi_free_smi_msg(smi_msg); + ipmi_free_recv_msg(recv_msg); + return rv; +} + +static int check_addr(ipmi_smi_t intf, + struct ipmi_addr *addr, + unsigned char *saddr, + unsigned char *lun) +{ + if (addr->channel >= IPMI_MAX_CHANNELS) + return -EINVAL; + *lun = intf->channels[addr->channel].lun; + *saddr = intf->channels[addr->channel].address; + return 0; +} + +int ipmi_request_settime(ipmi_user_t user, + struct ipmi_addr *addr, + long msgid, + struct kernel_ipmi_msg *msg, + void *user_msg_data, + int priority, + int retries, + unsigned int retry_time_ms) +{ + unsigned char saddr, lun; + int rv; + + if (!user) + return -EINVAL; + rv = check_addr(user->intf, addr, &saddr, &lun); + if (rv) + return rv; + return i_ipmi_request(user, + user->intf, + addr, + msgid, + msg, + user_msg_data, + NULL, NULL, + priority, + saddr, + lun, + retries, + retry_time_ms); +} + +int ipmi_request_supply_msgs(ipmi_user_t user, + struct ipmi_addr *addr, + long msgid, + struct kernel_ipmi_msg *msg, + void *user_msg_data, + void *supplied_smi, + struct ipmi_recv_msg *supplied_recv, + int priority) +{ + unsigned char saddr, lun; + int rv; + + if (!user) + return -EINVAL; + rv = check_addr(user->intf, addr, &saddr, &lun); + if (rv) + return rv; + return i_ipmi_request(user, + user->intf, + addr, + msgid, + msg, + user_msg_data, + supplied_smi, + supplied_recv, + priority, + saddr, + lun, + -1, 0); +} + +#ifdef CONFIG_PROC_FS +static int ipmb_file_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + char *out = (char *) page; + ipmi_smi_t intf = data; + int i; + int rv = 0; + + for (i = 0; i < IPMI_MAX_CHANNELS; i++) + rv += sprintf(out+rv, "%x ", intf->channels[i].address); + out[rv-1] = '\n'; /* Replace the final space with a newline */ + out[rv] = '\0'; + rv++; + return rv; +} + +static int version_file_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + char *out = (char *) page; + ipmi_smi_t intf = data; + + return sprintf(out, "%d.%d\n", + ipmi_version_major(&intf->bmc->id), + ipmi_version_minor(&intf->bmc->id)); +} + +static int stat_file_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + char *out = (char *) page; + ipmi_smi_t intf = data; + + out += sprintf(out, "sent_invalid_commands: %d\n", + intf->sent_invalid_commands); + out += sprintf(out, "sent_local_commands: %d\n", + intf->sent_local_commands); + out += sprintf(out, "handled_local_responses: %d\n", + intf->handled_local_responses); + out += sprintf(out, "unhandled_local_responses: %d\n", + intf->unhandled_local_responses); + out += sprintf(out, "sent_ipmb_commands: %d\n", + intf->sent_ipmb_commands); + out += sprintf(out, "sent_ipmb_command_errs: %d\n", + intf->sent_ipmb_command_errs); + out += sprintf(out, "retransmitted_ipmb_commands: %d\n", + intf->retransmitted_ipmb_commands); + out += sprintf(out, "timed_out_ipmb_commands: %d\n", + intf->timed_out_ipmb_commands); + out += sprintf(out, "timed_out_ipmb_broadcasts: %d\n", + intf->timed_out_ipmb_broadcasts); + out += sprintf(out, "sent_ipmb_responses: %d\n", + intf->sent_ipmb_responses); + out += sprintf(out, "handled_ipmb_responses: %d\n", + intf->handled_ipmb_responses); + out += sprintf(out, "invalid_ipmb_responses: %d\n", + intf->invalid_ipmb_responses); + out += sprintf(out, "unhandled_ipmb_responses: %d\n", + intf->unhandled_ipmb_responses); + out += sprintf(out, "sent_lan_commands: %d\n", + intf->sent_lan_commands); + out += sprintf(out, "sent_lan_command_errs: %d\n", + intf->sent_lan_command_errs); + out += sprintf(out, "retransmitted_lan_commands: %d\n", + intf->retransmitted_lan_commands); + out += sprintf(out, "timed_out_lan_commands: %d\n", + intf->timed_out_lan_commands); + out += sprintf(out, "sent_lan_responses: %d\n", + intf->sent_lan_responses); + out += sprintf(out, "handled_lan_responses: %d\n", + intf->handled_lan_responses); + out += sprintf(out, "invalid_lan_responses: %d\n", + intf->invalid_lan_responses); + out += sprintf(out, "unhandled_lan_responses: %d\n", + intf->unhandled_lan_responses); + out += sprintf(out, "handled_commands: %d\n", + intf->handled_commands); + out += sprintf(out, "invalid_commands: %d\n", + intf->invalid_commands); + out += sprintf(out, "unhandled_commands: %d\n", + intf->unhandled_commands); + out += sprintf(out, "invalid_events: %d\n", + intf->invalid_events); + out += sprintf(out, "events: %d\n", + intf->events); + + return (out - ((char *) page)); +} +#endif /* CONFIG_PROC_FS */ + +int ipmi_smi_add_proc_entry(ipmi_smi_t smi, char *name, + read_proc_t *read_proc, write_proc_t *write_proc, + void *data, struct module *owner) +{ + int rv = 0; +#ifdef CONFIG_PROC_FS + struct proc_dir_entry *file; + struct ipmi_proc_entry *entry; + + /* Create a list element. */ + entry = kmalloc(sizeof(*entry), GFP_KERNEL); + if (!entry) + return -ENOMEM; + entry->name = kmalloc(strlen(name)+1, GFP_KERNEL); + if (!entry->name) { + kfree(entry); + return -ENOMEM; + } + strcpy(entry->name, name); + + file = create_proc_entry(name, 0, smi->proc_dir); + if (!file) { + kfree(entry->name); + kfree(entry); + rv = -ENOMEM; + } else { + file->data = data; + file->read_proc = read_proc; + file->write_proc = write_proc; + file->owner = owner; + + mutex_lock(&smi->proc_entry_lock); + /* Stick it on the list. */ + entry->next = smi->proc_entries; + smi->proc_entries = entry; + mutex_unlock(&smi->proc_entry_lock); + } +#endif /* CONFIG_PROC_FS */ + + return rv; +} + +static int add_proc_entries(ipmi_smi_t smi, int num) +{ + int rv = 0; + +#ifdef CONFIG_PROC_FS + sprintf(smi->proc_dir_name, "%d", num); + smi->proc_dir = proc_mkdir(smi->proc_dir_name, proc_ipmi_root); + if (!smi->proc_dir) + rv = -ENOMEM; + else { + smi->proc_dir->owner = THIS_MODULE; + } + + if (rv == 0) + rv = ipmi_smi_add_proc_entry(smi, "stats", + stat_file_read_proc, NULL, + smi, THIS_MODULE); + + if (rv == 0) + rv = ipmi_smi_add_proc_entry(smi, "ipmb", + ipmb_file_read_proc, NULL, + smi, THIS_MODULE); + + if (rv == 0) + rv = ipmi_smi_add_proc_entry(smi, "version", + version_file_read_proc, NULL, + smi, THIS_MODULE); +#endif /* CONFIG_PROC_FS */ + + return rv; +} + +static void remove_proc_entries(ipmi_smi_t smi) +{ +#ifdef CONFIG_PROC_FS + struct ipmi_proc_entry *entry; + + mutex_lock(&smi->proc_entry_lock); + while (smi->proc_entries) { + entry = smi->proc_entries; + smi->proc_entries = entry->next; + + remove_proc_entry(entry->name, smi->proc_dir); + kfree(entry->name); + kfree(entry); + } + mutex_unlock(&smi->proc_entry_lock); + remove_proc_entry(smi->proc_dir_name, proc_ipmi_root); +#endif /* CONFIG_PROC_FS */ +} + +static int __find_bmc_guid(struct device *dev, void *data) +{ + unsigned char *id = data; + struct bmc_device *bmc = dev_get_drvdata(dev); + return memcmp(bmc->guid, id, 16) == 0; +} + +static struct bmc_device *ipmi_find_bmc_guid(struct device_driver *drv, + unsigned char *guid) +{ + struct device *dev; + + dev = driver_find_device(drv, NULL, guid, __find_bmc_guid); + if (dev) + return dev_get_drvdata(dev); + else + return NULL; +} + +struct prod_dev_id { + unsigned int product_id; + unsigned char device_id; +}; + +static int __find_bmc_prod_dev_id(struct device *dev, void *data) +{ + struct prod_dev_id *id = data; + struct bmc_device *bmc = dev_get_drvdata(dev); + + return (bmc->id.product_id == id->product_id + && bmc->id.device_id == id->device_id); +} + +static struct bmc_device *ipmi_find_bmc_prod_dev_id( + struct device_driver *drv, + unsigned int product_id, unsigned char device_id) +{ + struct prod_dev_id id = { + .product_id = product_id, + .device_id = device_id, + }; + struct device *dev; + + dev = driver_find_device(drv, NULL, &id, __find_bmc_prod_dev_id); + if (dev) + return dev_get_drvdata(dev); + else + return NULL; +} + +static ssize_t device_id_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 10, "%u\n", bmc->id.device_id); +} + +static ssize_t provides_dev_sdrs_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 10, "%u\n", + (bmc->id.device_revision & 0x80) >> 7); +} + +static ssize_t revision_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 20, "%u\n", + bmc->id.device_revision & 0x0F); +} + +static ssize_t firmware_rev_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 20, "%u.%x\n", bmc->id.firmware_revision_1, + bmc->id.firmware_revision_2); +} + +static ssize_t ipmi_version_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 20, "%u.%u\n", + ipmi_version_major(&bmc->id), + ipmi_version_minor(&bmc->id)); +} + +static ssize_t add_dev_support_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 10, "0x%02x\n", + bmc->id.additional_device_support); +} + +static ssize_t manufacturer_id_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 20, "0x%6.6x\n", bmc->id.manufacturer_id); +} + +static ssize_t product_id_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 10, "0x%4.4x\n", bmc->id.product_id); +} + +static ssize_t aux_firmware_rev_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 21, "0x%02x 0x%02x 0x%02x 0x%02x\n", + bmc->id.aux_firmware_revision[3], + bmc->id.aux_firmware_revision[2], + bmc->id.aux_firmware_revision[1], + bmc->id.aux_firmware_revision[0]); +} + +static ssize_t guid_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct bmc_device *bmc = dev_get_drvdata(dev); + + return snprintf(buf, 100, "%Lx%Lx\n", + (long long) bmc->guid[0], + (long long) bmc->guid[8]); +} + +static void remove_files(struct bmc_device *bmc) +{ + if (!bmc->dev) + return; + + device_remove_file(&bmc->dev->dev, + &bmc->device_id_attr); + device_remove_file(&bmc->dev->dev, + &bmc->provides_dev_sdrs_attr); + device_remove_file(&bmc->dev->dev, + &bmc->revision_attr); + device_remove_file(&bmc->dev->dev, + &bmc->firmware_rev_attr); + device_remove_file(&bmc->dev->dev, + &bmc->version_attr); + device_remove_file(&bmc->dev->dev, + &bmc->add_dev_support_attr); + device_remove_file(&bmc->dev->dev, + &bmc->manufacturer_id_attr); + device_remove_file(&bmc->dev->dev, + &bmc->product_id_attr); + + if (bmc->id.aux_firmware_revision_set) + device_remove_file(&bmc->dev->dev, + &bmc->aux_firmware_rev_attr); + if (bmc->guid_set) + device_remove_file(&bmc->dev->dev, + &bmc->guid_attr); +} + +static void +cleanup_bmc_device(struct kref *ref) +{ + struct bmc_device *bmc; + + bmc = container_of(ref, struct bmc_device, refcount); + + remove_files(bmc); + platform_device_unregister(bmc->dev); + kfree(bmc); +} + +static void ipmi_bmc_unregister(ipmi_smi_t intf) +{ + struct bmc_device *bmc = intf->bmc; + + if (intf->sysfs_name) { + sysfs_remove_link(&intf->si_dev->kobj, intf->sysfs_name); + kfree(intf->sysfs_name); + intf->sysfs_name = NULL; + } + if (intf->my_dev_name) { + sysfs_remove_link(&bmc->dev->dev.kobj, intf->my_dev_name); + kfree(intf->my_dev_name); + intf->my_dev_name = NULL; + } + + mutex_lock(&ipmidriver_mutex); + kref_put(&bmc->refcount, cleanup_bmc_device); + intf->bmc = NULL; + mutex_unlock(&ipmidriver_mutex); +} + +static int create_files(struct bmc_device *bmc) +{ + int err; + + bmc->device_id_attr.attr.name = "device_id"; + bmc->device_id_attr.attr.mode = S_IRUGO; + bmc->device_id_attr.show = device_id_show; + + bmc->provides_dev_sdrs_attr.attr.name = "provides_device_sdrs"; + bmc->provides_dev_sdrs_attr.attr.mode = S_IRUGO; + bmc->provides_dev_sdrs_attr.show = provides_dev_sdrs_show; + + bmc->revision_attr.attr.name = "revision"; + bmc->revision_attr.attr.mode = S_IRUGO; + bmc->revision_attr.show = revision_show; + + bmc->firmware_rev_attr.attr.name = "firmware_revision"; + bmc->firmware_rev_attr.attr.mode = S_IRUGO; + bmc->firmware_rev_attr.show = firmware_rev_show; + + bmc->version_attr.attr.name = "ipmi_version"; + bmc->version_attr.attr.mode = S_IRUGO; + bmc->version_attr.show = ipmi_version_show; + + bmc->add_dev_support_attr.attr.name = "additional_device_support"; + bmc->add_dev_support_attr.attr.mode = S_IRUGO; + bmc->add_dev_support_attr.show = add_dev_support_show; + + bmc->manufacturer_id_attr.attr.name = "manufacturer_id"; + bmc->manufacturer_id_attr.attr.mode = S_IRUGO; + bmc->manufacturer_id_attr.show = manufacturer_id_show; + + bmc->product_id_attr.attr.name = "product_id"; + bmc->product_id_attr.attr.mode = S_IRUGO; + bmc->product_id_attr.show = product_id_show; + + bmc->guid_attr.attr.name = "guid"; + bmc->guid_attr.attr.mode = S_IRUGO; + bmc->guid_attr.show = guid_show; + + bmc->aux_firmware_rev_attr.attr.name = "aux_firmware_revision"; + bmc->aux_firmware_rev_attr.attr.mode = S_IRUGO; + bmc->aux_firmware_rev_attr.show = aux_firmware_rev_show; + + err = device_create_file(&bmc->dev->dev, + &bmc->device_id_attr); + if (err) goto out; + err = device_create_file(&bmc->dev->dev, + &bmc->provides_dev_sdrs_attr); + if (err) goto out_devid; + err = device_create_file(&bmc->dev->dev, + &bmc->revision_attr); + if (err) goto out_sdrs; + err = device_create_file(&bmc->dev->dev, + &bmc->firmware_rev_attr); + if (err) goto out_rev; + err = device_create_file(&bmc->dev->dev, + &bmc->version_attr); + if (err) goto out_firm; + err = device_create_file(&bmc->dev->dev, + &bmc->add_dev_support_attr); + if (err) goto out_version; + err = device_create_file(&bmc->dev->dev, + &bmc->manufacturer_id_attr); + if (err) goto out_add_dev; + err = device_create_file(&bmc->dev->dev, + &bmc->product_id_attr); + if (err) goto out_manu; + if (bmc->id.aux_firmware_revision_set) { + err = device_create_file(&bmc->dev->dev, + &bmc->aux_firmware_rev_attr); + if (err) goto out_prod_id; + } + if (bmc->guid_set) { + err = device_create_file(&bmc->dev->dev, + &bmc->guid_attr); + if (err) goto out_aux_firm; + } + + return 0; + +out_aux_firm: + if (bmc->id.aux_firmware_revision_set) + device_remove_file(&bmc->dev->dev, + &bmc->aux_firmware_rev_attr); +out_prod_id: + device_remove_file(&bmc->dev->dev, + &bmc->product_id_attr); +out_manu: + device_remove_file(&bmc->dev->dev, + &bmc->manufacturer_id_attr); +out_add_dev: + device_remove_file(&bmc->dev->dev, + &bmc->add_dev_support_attr); +out_version: + device_remove_file(&bmc->dev->dev, + &bmc->version_attr); +out_firm: + device_remove_file(&bmc->dev->dev, + &bmc->firmware_rev_attr); +out_rev: + device_remove_file(&bmc->dev->dev, + &bmc->revision_attr); +out_sdrs: + device_remove_file(&bmc->dev->dev, + &bmc->provides_dev_sdrs_attr); +out_devid: + device_remove_file(&bmc->dev->dev, + &bmc->device_id_attr); +out: + return err; +} + +static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum, + const char *sysfs_name) +{ + int rv; + struct bmc_device *bmc = intf->bmc; + struct bmc_device *old_bmc; + int size; + char dummy[1]; + + mutex_lock(&ipmidriver_mutex); + + /* + * Try to find if there is an bmc_device struct + * representing the interfaced BMC already + */ + if (bmc->guid_set) + old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid); + else + old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver, + bmc->id.product_id, + bmc->id.device_id); + + /* + * If there is already an bmc_device, free the new one, + * otherwise register the new BMC device + */ + if (old_bmc) { + kfree(bmc); + intf->bmc = old_bmc; + bmc = old_bmc; + + kref_get(&bmc->refcount); + mutex_unlock(&ipmidriver_mutex); + + printk(KERN_INFO + "ipmi: interfacing existing BMC (man_id: 0x%6.6x," + " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n", + bmc->id.manufacturer_id, + bmc->id.product_id, + bmc->id.device_id); + } else { + char name[14]; + unsigned char orig_dev_id = bmc->id.device_id; + int warn_printed = 0; + + snprintf(name, sizeof(name), + "ipmi_bmc.%4.4x", bmc->id.product_id); + + while (ipmi_find_bmc_prod_dev_id(&ipmidriver, + bmc->id.product_id, + bmc->id.device_id)) { + if (!warn_printed) { + printk(KERN_WARNING PFX + "This machine has two different BMCs" + " with the same product id and device" + " id. This is an error in the" + " firmware, but incrementing the" + " device id to work around the problem." + " Prod ID = 0x%x, Dev ID = 0x%x\n", + bmc->id.product_id, bmc->id.device_id); + warn_printed = 1; + } + bmc->id.device_id++; /* Wraps at 255 */ + if (bmc->id.device_id == orig_dev_id) { + printk(KERN_ERR PFX + "Out of device ids!\n"); + break; + } + } + + bmc->dev = platform_device_alloc(name, bmc->id.device_id); + if (!bmc->dev) { + mutex_unlock(&ipmidriver_mutex); + printk(KERN_ERR + "ipmi_msghandler:" + " Unable to allocate platform device\n"); + return -ENOMEM; + } + bmc->dev->dev.driver = &ipmidriver; + dev_set_drvdata(&bmc->dev->dev, bmc); + kref_init(&bmc->refcount); + + rv = platform_device_add(bmc->dev); + mutex_unlock(&ipmidriver_mutex); + if (rv) { + platform_device_put(bmc->dev); + bmc->dev = NULL; + printk(KERN_ERR + "ipmi_msghandler:" + " Unable to register bmc device: %d\n", + rv); + /* Don't go to out_err, you can only do that if + the device is registered already. */ + return rv; + } + + rv = create_files(bmc); + if (rv) { + mutex_lock(&ipmidriver_mutex); + platform_device_unregister(bmc->dev); + mutex_unlock(&ipmidriver_mutex); + + return rv; + } + + printk(KERN_INFO + "ipmi: Found new BMC (man_id: 0x%6.6x, " + " prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n", + bmc->id.manufacturer_id, + bmc->id.product_id, + bmc->id.device_id); + } + + /* + * create symlink from system interface device to bmc device + * and back. + */ + intf->sysfs_name = kstrdup(sysfs_name, GFP_KERNEL); + if (!intf->sysfs_name) { + rv = -ENOMEM; + printk(KERN_ERR + "ipmi_msghandler: allocate link to BMC: %d\n", + rv); + goto out_err; + } + + rv = sysfs_create_link(&intf->si_dev->kobj, + &bmc->dev->dev.kobj, intf->sysfs_name); + if (rv) { + kfree(intf->sysfs_name); + intf->sysfs_name = NULL; + printk(KERN_ERR + "ipmi_msghandler: Unable to create bmc symlink: %d\n", + rv); + goto out_err; + } + + size = snprintf(dummy, 0, "ipmi%d", ifnum); + intf->my_dev_name = kmalloc(size+1, GFP_KERNEL); + if (!intf->my_dev_name) { + kfree(intf->sysfs_name); + intf->sysfs_name = NULL; + rv = -ENOMEM; + printk(KERN_ERR + "ipmi_msghandler: allocate link from BMC: %d\n", + rv); + goto out_err; + } + snprintf(intf->my_dev_name, size+1, "ipmi%d", ifnum); + + rv = sysfs_create_link(&bmc->dev->dev.kobj, &intf->si_dev->kobj, + intf->my_dev_name); + if (rv) { + kfree(intf->sysfs_name); + intf->sysfs_name = NULL; + kfree(intf->my_dev_name); + intf->my_dev_name = NULL; + printk(KERN_ERR + "ipmi_msghandler:" + " Unable to create symlink to bmc: %d\n", + rv); + goto out_err; + } + + return 0; + +out_err: + ipmi_bmc_unregister(intf); + return rv; +} + +static int +send_guid_cmd(ipmi_smi_t intf, int chan) +{ + struct kernel_ipmi_msg msg; + struct ipmi_system_interface_addr si; + + si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + si.channel = IPMI_BMC_CHANNEL; + si.lun = 0; + + msg.netfn = IPMI_NETFN_APP_REQUEST; + msg.cmd = IPMI_GET_DEVICE_GUID_CMD; + msg.data = NULL; + msg.data_len = 0; + return i_ipmi_request(NULL, + intf, + (struct ipmi_addr *) &si, + 0, + &msg, + intf, + NULL, + NULL, + 0, + intf->channels[0].address, + intf->channels[0].lun, + -1, 0); +} + +static void +guid_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) +{ + if ((msg->addr.addr_type != IPMI_SYSTEM_INTERFACE_ADDR_TYPE) + || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) + || (msg->msg.cmd != IPMI_GET_DEVICE_GUID_CMD)) + /* Not for me */ + return; + + if (msg->msg.data[0] != 0) { + /* Error from getting the GUID, the BMC doesn't have one. */ + intf->bmc->guid_set = 0; + goto out; + } + + if (msg->msg.data_len < 17) { + intf->bmc->guid_set = 0; + printk(KERN_WARNING PFX + "guid_handler: The GUID response from the BMC was too" + " short, it was %d but should have been 17. Assuming" + " GUID is not available.\n", + msg->msg.data_len); + goto out; + } + + memcpy(intf->bmc->guid, msg->msg.data, 16); + intf->bmc->guid_set = 1; + out: + wake_up(&intf->waitq); +} + +static void +get_guid(ipmi_smi_t intf) +{ + int rv; + + intf->bmc->guid_set = 0x2; + intf->null_user_handler = guid_handler; + rv = send_guid_cmd(intf, 0); + if (rv) + /* Send failed, no GUID available. */ + intf->bmc->guid_set = 0; + wait_event(intf->waitq, intf->bmc->guid_set != 2); + intf->null_user_handler = NULL; +} + +static int +send_channel_info_cmd(ipmi_smi_t intf, int chan) +{ + struct kernel_ipmi_msg msg; + unsigned char data[1]; + struct ipmi_system_interface_addr si; + + si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + si.channel = IPMI_BMC_CHANNEL; + si.lun = 0; + + msg.netfn = IPMI_NETFN_APP_REQUEST; + msg.cmd = IPMI_GET_CHANNEL_INFO_CMD; + msg.data = data; + msg.data_len = 1; + data[0] = chan; + return i_ipmi_request(NULL, + intf, + (struct ipmi_addr *) &si, + 0, + &msg, + intf, + NULL, + NULL, + 0, + intf->channels[0].address, + intf->channels[0].lun, + -1, 0); +} + +static void +channel_handler(ipmi_smi_t intf, struct ipmi_recv_msg *msg) +{ + int rv = 0; + int chan; + + if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) + && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) + && (msg->msg.cmd == IPMI_GET_CHANNEL_INFO_CMD)) + { + /* It's the one we want */ + if (msg->msg.data[0] != 0) { + /* Got an error from the channel, just go on. */ + + if (msg->msg.data[0] == IPMI_INVALID_COMMAND_ERR) { + /* If the MC does not support this + command, that is legal. We just + assume it has one IPMB at channel + zero. */ + intf->channels[0].medium + = IPMI_CHANNEL_MEDIUM_IPMB; + intf->channels[0].protocol + = IPMI_CHANNEL_PROTOCOL_IPMB; + rv = -ENOSYS; + + intf->curr_channel = IPMI_MAX_CHANNELS; + wake_up(&intf->waitq); + goto out; + } + goto next_channel; + } + if (msg->msg.data_len < 4) { + /* Message not big enough, just go on. */ + goto next_channel; + } + chan = intf->curr_channel; + intf->channels[chan].medium = msg->msg.data[2] & 0x7f; + intf->channels[chan].protocol = msg->msg.data[3] & 0x1f; + + next_channel: + intf->curr_channel++; + if (intf->curr_channel >= IPMI_MAX_CHANNELS) + wake_up(&intf->waitq); + else + rv = send_channel_info_cmd(intf, intf->curr_channel); + + if (rv) { + /* Got an error somehow, just give up. */ + intf->curr_channel = IPMI_MAX_CHANNELS; + wake_up(&intf->waitq); + + printk(KERN_WARNING PFX + "Error sending channel information: %d\n", + rv); + } + } + out: + return; +} + +void ipmi_poll_interface(ipmi_user_t user) +{ + ipmi_smi_t intf = user->intf; + + if (intf->handlers->poll) + intf->handlers->poll(intf->send_info); +} + +int ipmi_register_smi(struct ipmi_smi_handlers *handlers, + void *send_info, + struct ipmi_device_id *device_id, + struct device *si_dev, + const char *sysfs_name, + unsigned char slave_addr) +{ + int i, j; + int rv; + ipmi_smi_t intf; + ipmi_smi_t tintf; + struct list_head *link; + + /* Make sure the driver is actually initialized, this handles + problems with initialization order. */ + if (!initialized) { + rv = ipmi_init_msghandler(); + if (rv) + return rv; + /* The init code doesn't return an error if it was turned + off, but it won't initialize. Check that. */ + if (!initialized) + return -ENODEV; + } + + intf = kzalloc(sizeof(*intf), GFP_KERNEL); + if (!intf) + return -ENOMEM; + + intf->ipmi_version_major = ipmi_version_major(device_id); + intf->ipmi_version_minor = ipmi_version_minor(device_id); + + intf->bmc = kzalloc(sizeof(*intf->bmc), GFP_KERNEL); + if (!intf->bmc) { + kfree(intf); + return -ENOMEM; + } + intf->intf_num = -1; /* Mark it invalid for now. */ + kref_init(&intf->refcount); + intf->bmc->id = *device_id; + intf->si_dev = si_dev; + for (j = 0; j < IPMI_MAX_CHANNELS; j++) { + intf->channels[j].address = IPMI_BMC_SLAVE_ADDR; + intf->channels[j].lun = 2; + } + if (slave_addr != 0) + intf->channels[0].address = slave_addr; + INIT_LIST_HEAD(&intf->users); + intf->handlers = handlers; + intf->send_info = send_info; + spin_lock_init(&intf->seq_lock); + for (j = 0; j < IPMI_IPMB_NUM_SEQ; j++) { + intf->seq_table[j].inuse = 0; + intf->seq_table[j].seqid = 0; + } + intf->curr_seq = 0; +#ifdef CONFIG_PROC_FS + mutex_init(&intf->proc_entry_lock); +#endif + spin_lock_init(&intf->waiting_msgs_lock); + INIT_LIST_HEAD(&intf->waiting_msgs); + spin_lock_init(&intf->events_lock); + INIT_LIST_HEAD(&intf->waiting_events); + intf->waiting_events_count = 0; + mutex_init(&intf->cmd_rcvrs_mutex); + spin_lock_init(&intf->maintenance_mode_lock); + INIT_LIST_HEAD(&intf->cmd_rcvrs); + init_waitqueue_head(&intf->waitq); + + spin_lock_init(&intf->counter_lock); + intf->proc_dir = NULL; + + mutex_lock(&smi_watchers_mutex); + mutex_lock(&ipmi_interfaces_mutex); + /* Look for a hole in the numbers. */ + i = 0; + link = &ipmi_interfaces; + list_for_each_entry_rcu(tintf, &ipmi_interfaces, link) { + if (tintf->intf_num != i) { + link = &tintf->link; + break; + } + i++; + } + /* Add the new interface in numeric order. */ + if (i == 0) + list_add_rcu(&intf->link, &ipmi_interfaces); + else + list_add_tail_rcu(&intf->link, link); + + rv = handlers->start_processing(send_info, intf); + if (rv) + goto out; + + get_guid(intf); + + if ((intf->ipmi_version_major > 1) + || ((intf->ipmi_version_major == 1) + && (intf->ipmi_version_minor >= 5))) + { + /* Start scanning the channels to see what is + available. */ + intf->null_user_handler = channel_handler; + intf->curr_channel = 0; + rv = send_channel_info_cmd(intf, 0); + if (rv) + goto out; + + /* Wait for the channel info to be read. */ + wait_event(intf->waitq, + intf->curr_channel >= IPMI_MAX_CHANNELS); + intf->null_user_handler = NULL; + } else { + /* Assume a single IPMB channel at zero. */ + intf->channels[0].medium = IPMI_CHANNEL_MEDIUM_IPMB; + intf->channels[0].protocol = IPMI_CHANNEL_PROTOCOL_IPMB; + } + + if (rv == 0) + rv = add_proc_entries(intf, i); + + rv = ipmi_bmc_register(intf, i, sysfs_name); + + out: + if (rv) { + if (intf->proc_dir) + remove_proc_entries(intf); + intf->handlers = NULL; + list_del_rcu(&intf->link); + mutex_unlock(&ipmi_interfaces_mutex); + mutex_unlock(&smi_watchers_mutex); + synchronize_rcu(); + kref_put(&intf->refcount, intf_free); + } else { + /* + * Keep memory order straight for RCU readers. Make + * sure everything else is committed to memory before + * setting intf_num to mark the interface valid. + */ + smp_wmb(); + intf->intf_num = i; + mutex_unlock(&ipmi_interfaces_mutex); + /* After this point the interface is legal to use. */ + call_smi_watchers(i, intf->si_dev); + mutex_unlock(&smi_watchers_mutex); + } + + return rv; +} + +static void cleanup_smi_msgs(ipmi_smi_t intf) +{ + int i; + struct seq_table *ent; + + /* No need for locks, the interface is down. */ + for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) { + ent = &(intf->seq_table[i]); + if (!ent->inuse) + continue; + deliver_err_response(ent->recv_msg, IPMI_ERR_UNSPECIFIED); + } +} + +int ipmi_unregister_smi(ipmi_smi_t intf) +{ + struct ipmi_smi_watcher *w; + int intf_num = intf->intf_num; + + ipmi_bmc_unregister(intf); + + mutex_lock(&smi_watchers_mutex); + mutex_lock(&ipmi_interfaces_mutex); + intf->intf_num = -1; + intf->handlers = NULL; + list_del_rcu(&intf->link); + mutex_unlock(&ipmi_interfaces_mutex); + synchronize_rcu(); + + cleanup_smi_msgs(intf); + + remove_proc_entries(intf); + + /* Call all the watcher interfaces to tell them that + an interface is gone. */ + list_for_each_entry(w, &smi_watchers, link) + w->smi_gone(intf_num); + mutex_unlock(&smi_watchers_mutex); + + kref_put(&intf->refcount, intf_free); + return 0; +} + +static int handle_ipmb_get_msg_rsp(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct ipmi_ipmb_addr ipmb_addr; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + + + /* This is 11, not 10, because the response must contain a + * completion code. */ + if (msg->rsp_size < 11) { + /* Message not big enough, just ignore it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_ipmb_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the response, just ignore it. */ + return 0; + } + + ipmb_addr.addr_type = IPMI_IPMB_ADDR_TYPE; + ipmb_addr.slave_addr = msg->rsp[6]; + ipmb_addr.channel = msg->rsp[3] & 0x0f; + ipmb_addr.lun = msg->rsp[7] & 3; + + /* It's a response from a remote entity. Look up the sequence + number and handle the response. */ + if (intf_find_seq(intf, + msg->rsp[7] >> 2, + msg->rsp[3] & 0x0f, + msg->rsp[8], + (msg->rsp[4] >> 2) & (~1), + (struct ipmi_addr *) &(ipmb_addr), + &recv_msg)) + { + /* We were unable to find the sequence number, + so just nuke the message. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_ipmb_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + memcpy(recv_msg->msg_data, + &(msg->rsp[9]), + msg->rsp_size - 9); + /* THe other fields matched, so no need to set them, except + for netfn, which needs to be the response that was + returned, not the request value. */ + recv_msg->msg.netfn = msg->rsp[4] >> 2; + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = msg->rsp_size - 10; + recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_ipmb_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + deliver_response(recv_msg); + + return 0; +} + +static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct cmd_rcvr *rcvr; + int rv = 0; + unsigned char netfn; + unsigned char cmd; + unsigned char chan; + ipmi_user_t user = NULL; + struct ipmi_ipmb_addr *ipmb_addr; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + struct ipmi_smi_handlers *handlers; + + if (msg->rsp_size < 10) { + /* Message not big enough, just ignore it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the response, just ignore it. */ + return 0; + } + + netfn = msg->rsp[4] >> 2; + cmd = msg->rsp[8]; + chan = msg->rsp[3] & 0xf; + + rcu_read_lock(); + rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); + if (rcvr) { + user = rcvr->user; + kref_get(&user->refcount); + } else + user = NULL; + rcu_read_unlock(); + + if (user == NULL) { + /* We didn't find a user, deliver an error response. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + + msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg->data[1] = IPMI_SEND_MSG_CMD; + msg->data[2] = msg->rsp[3]; + msg->data[3] = msg->rsp[6]; + msg->data[4] = ((netfn + 1) << 2) | (msg->rsp[7] & 0x3); + msg->data[5] = ipmb_checksum(&(msg->data[3]), 2); + msg->data[6] = intf->channels[msg->rsp[3] & 0xf].address; + /* rqseq/lun */ + msg->data[7] = (msg->rsp[7] & 0xfc) | (msg->rsp[4] & 0x3); + msg->data[8] = msg->rsp[8]; /* cmd */ + msg->data[9] = IPMI_INVALID_CMD_COMPLETION_CODE; + msg->data[10] = ipmb_checksum(&(msg->data[6]), 4); + msg->data_size = 11; + +#ifdef DEBUG_MSGING + { + int m; + printk("Invalid command:"); + for (m = 0; m < msg->data_size; m++) + printk(" %2.2x", msg->data[m]); + printk("\n"); + } +#endif + rcu_read_lock(); + handlers = intf->handlers; + if (handlers) { + handlers->sender(intf->send_info, msg, 0); + /* We used the message, so return the value + that causes it to not be freed or + queued. */ + rv = -1; + } + rcu_read_unlock(); + } else { + /* Deliver the message to the user. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + + recv_msg = ipmi_alloc_recv_msg(); + if (!recv_msg) { + /* We couldn't allocate memory for the + message, so requeue it for handling + later. */ + rv = 1; + kref_put(&user->refcount, free_user); + } else { + /* Extract the source address from the data. */ + ipmb_addr = (struct ipmi_ipmb_addr *) &recv_msg->addr; + ipmb_addr->addr_type = IPMI_IPMB_ADDR_TYPE; + ipmb_addr->slave_addr = msg->rsp[6]; + ipmb_addr->lun = msg->rsp[7] & 3; + ipmb_addr->channel = msg->rsp[3] & 0xf; + + /* Extract the rest of the message information + from the IPMB header.*/ + recv_msg->user = user; + recv_msg->recv_type = IPMI_CMD_RECV_TYPE; + recv_msg->msgid = msg->rsp[7] >> 2; + recv_msg->msg.netfn = msg->rsp[4] >> 2; + recv_msg->msg.cmd = msg->rsp[8]; + recv_msg->msg.data = recv_msg->msg_data; + + /* We chop off 10, not 9 bytes because the checksum + at the end also needs to be removed. */ + recv_msg->msg.data_len = msg->rsp_size - 10; + memcpy(recv_msg->msg_data, + &(msg->rsp[9]), + msg->rsp_size - 10); + deliver_response(recv_msg); + } + } + + return rv; +} + +static int handle_lan_get_msg_rsp(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct ipmi_lan_addr lan_addr; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + + + /* This is 13, not 12, because the response must contain a + * completion code. */ + if (msg->rsp_size < 13) { + /* Message not big enough, just ignore it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_lan_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the response, just ignore it. */ + return 0; + } + + lan_addr.addr_type = IPMI_LAN_ADDR_TYPE; + lan_addr.session_handle = msg->rsp[4]; + lan_addr.remote_SWID = msg->rsp[8]; + lan_addr.local_SWID = msg->rsp[5]; + lan_addr.channel = msg->rsp[3] & 0x0f; + lan_addr.privilege = msg->rsp[3] >> 4; + lan_addr.lun = msg->rsp[9] & 3; + + /* It's a response from a remote entity. Look up the sequence + number and handle the response. */ + if (intf_find_seq(intf, + msg->rsp[9] >> 2, + msg->rsp[3] & 0x0f, + msg->rsp[10], + (msg->rsp[6] >> 2) & (~1), + (struct ipmi_addr *) &(lan_addr), + &recv_msg)) + { + /* We were unable to find the sequence number, + so just nuke the message. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_lan_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + memcpy(recv_msg->msg_data, + &(msg->rsp[11]), + msg->rsp_size - 11); + /* The other fields matched, so no need to set them, except + for netfn, which needs to be the response that was + returned, not the request value. */ + recv_msg->msg.netfn = msg->rsp[6] >> 2; + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = msg->rsp_size - 12; + recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_lan_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + deliver_response(recv_msg); + + return 0; +} + +static int handle_lan_get_msg_cmd(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct cmd_rcvr *rcvr; + int rv = 0; + unsigned char netfn; + unsigned char cmd; + unsigned char chan; + ipmi_user_t user = NULL; + struct ipmi_lan_addr *lan_addr; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + + if (msg->rsp_size < 12) { + /* Message not big enough, just ignore it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the response, just ignore it. */ + return 0; + } + + netfn = msg->rsp[6] >> 2; + cmd = msg->rsp[10]; + chan = msg->rsp[3] & 0xf; + + rcu_read_lock(); + rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); + if (rcvr) { + user = rcvr->user; + kref_get(&user->refcount); + } else + user = NULL; + rcu_read_unlock(); + + if (user == NULL) { + /* We didn't find a user, just give up. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + + rv = 0; /* Don't do anything with these messages, just + allow them to be freed. */ + } else { + /* Deliver the message to the user. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + + recv_msg = ipmi_alloc_recv_msg(); + if (!recv_msg) { + /* We couldn't allocate memory for the + message, so requeue it for handling + later. */ + rv = 1; + kref_put(&user->refcount, free_user); + } else { + /* Extract the source address from the data. */ + lan_addr = (struct ipmi_lan_addr *) &recv_msg->addr; + lan_addr->addr_type = IPMI_LAN_ADDR_TYPE; + lan_addr->session_handle = msg->rsp[4]; + lan_addr->remote_SWID = msg->rsp[8]; + lan_addr->local_SWID = msg->rsp[5]; + lan_addr->lun = msg->rsp[9] & 3; + lan_addr->channel = msg->rsp[3] & 0xf; + lan_addr->privilege = msg->rsp[3] >> 4; + + /* Extract the rest of the message information + from the IPMB header.*/ + recv_msg->user = user; + recv_msg->recv_type = IPMI_CMD_RECV_TYPE; + recv_msg->msgid = msg->rsp[9] >> 2; + recv_msg->msg.netfn = msg->rsp[6] >> 2; + recv_msg->msg.cmd = msg->rsp[10]; + recv_msg->msg.data = recv_msg->msg_data; + + /* We chop off 12, not 11 bytes because the checksum + at the end also needs to be removed. */ + recv_msg->msg.data_len = msg->rsp_size - 12; + memcpy(recv_msg->msg_data, + &(msg->rsp[11]), + msg->rsp_size - 12); + deliver_response(recv_msg); + } + } + + return rv; +} + +static void copy_event_into_recv_msg(struct ipmi_recv_msg *recv_msg, + struct ipmi_smi_msg *msg) +{ + struct ipmi_system_interface_addr *smi_addr; + + recv_msg->msgid = 0; + smi_addr = (struct ipmi_system_interface_addr *) &(recv_msg->addr); + smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + smi_addr->channel = IPMI_BMC_CHANNEL; + smi_addr->lun = msg->rsp[0] & 3; + recv_msg->recv_type = IPMI_ASYNC_EVENT_RECV_TYPE; + recv_msg->msg.netfn = msg->rsp[0] >> 2; + recv_msg->msg.cmd = msg->rsp[1]; + memcpy(recv_msg->msg_data, &(msg->rsp[3]), msg->rsp_size - 3); + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = msg->rsp_size - 3; +} + +static int handle_read_event_rsp(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct ipmi_recv_msg *recv_msg, *recv_msg2; + struct list_head msgs; + ipmi_user_t user; + int rv = 0; + int deliver_count = 0; + unsigned long flags; + + if (msg->rsp_size < 19) { + /* Message is too small to be an IPMB event. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_events++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the event, just ignore it. */ + return 0; + } + + INIT_LIST_HEAD(&msgs); + + spin_lock_irqsave(&intf->events_lock, flags); + + spin_lock(&intf->counter_lock); + intf->events++; + spin_unlock(&intf->counter_lock); + + /* Allocate and fill in one message for every user that is getting + events. */ + rcu_read_lock(); + list_for_each_entry_rcu(user, &intf->users, link) { + if (!user->gets_events) + continue; + + recv_msg = ipmi_alloc_recv_msg(); + if (!recv_msg) { + rcu_read_unlock(); + list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, + link) { + list_del(&recv_msg->link); + ipmi_free_recv_msg(recv_msg); + } + /* We couldn't allocate memory for the + message, so requeue it for handling + later. */ + rv = 1; + goto out; + } + + deliver_count++; + + copy_event_into_recv_msg(recv_msg, msg); + recv_msg->user = user; + kref_get(&user->refcount); + list_add_tail(&(recv_msg->link), &msgs); + } + rcu_read_unlock(); + + if (deliver_count) { + /* Now deliver all the messages. */ + list_for_each_entry_safe(recv_msg, recv_msg2, &msgs, link) { + list_del(&recv_msg->link); + deliver_response(recv_msg); + } + } else if (intf->waiting_events_count < MAX_EVENTS_IN_QUEUE) { + /* No one to receive the message, put it in queue if there's + not already too many things in the queue. */ + recv_msg = ipmi_alloc_recv_msg(); + if (!recv_msg) { + /* We couldn't allocate memory for the + message, so requeue it for handling + later. */ + rv = 1; + goto out; + } + + copy_event_into_recv_msg(recv_msg, msg); + list_add_tail(&(recv_msg->link), &(intf->waiting_events)); + intf->waiting_events_count++; + } else { + /* There's too many things in the queue, discard this + message. */ + printk(KERN_WARNING PFX "Event queue full, discarding an" + " incoming event\n"); + } + + out: + spin_unlock_irqrestore(&(intf->events_lock), flags); + + return rv; +} + +static int handle_bmc_rsp(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + struct ipmi_user *user; + + recv_msg = (struct ipmi_recv_msg *) msg->user_data; + if (recv_msg == NULL) + { + printk(KERN_WARNING"IPMI message received with no owner. This\n" + "could be because of a malformed message, or\n" + "because of a hardware error. Contact your\n" + "hardware vender for assistance\n"); + return 0; + } + + user = recv_msg->user; + /* Make sure the user still exists. */ + if (user && !user->valid) { + /* The user for the message went away, so give up. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_local_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + ipmi_free_recv_msg(recv_msg); + } else { + struct ipmi_system_interface_addr *smi_addr; + + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_local_responses++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + recv_msg->recv_type = IPMI_RESPONSE_RECV_TYPE; + recv_msg->msgid = msg->msgid; + smi_addr = ((struct ipmi_system_interface_addr *) + &(recv_msg->addr)); + smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + smi_addr->channel = IPMI_BMC_CHANNEL; + smi_addr->lun = msg->rsp[0] & 3; + recv_msg->msg.netfn = msg->rsp[0] >> 2; + recv_msg->msg.cmd = msg->rsp[1]; + memcpy(recv_msg->msg_data, + &(msg->rsp[2]), + msg->rsp_size - 2); + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = msg->rsp_size - 2; + deliver_response(recv_msg); + } + + return 0; +} + +#if defined(__VMKLNX__) && defined(HP_G6_SUPPORT) +/* +** This routine will handle "Get Message" command responses with +** channels that use an OEM Medium. We will queue these messages +** until an application comes and retrieves them. The message format +** belongs to the OEM. See IPMI 2.0 specification, Chapter 6 and +** Chapter 22, sections 22.6 and 22.24 for more details. +*/ +static int handle_oem_get_msg_cmd(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + struct cmd_rcvr *rcvr; + int rv = 0; + unsigned char netfn; + unsigned char cmd; + ipmi_user_t user = NULL; + struct ipmi_system_interface_addr *smi_addr; + struct ipmi_recv_msg *recv_msg; + unsigned long flags; + unsigned char chan ; + + /* We expect the OEM SW to perform error checking + so we just do some basic sanity checks */ + if (msg->rsp_size < 4) { + /* Message not big enough, just ignore it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->invalid_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + return 0; + } + + if (msg->rsp[2] != 0) { + /* An error getting the response, just ignore it. */ + return 0; + } + + /* This is an OEM Message so the OEM needs to know how + handle the message. We do no interpretation. */ + + netfn = msg->rsp[0] >> 2; + cmd = msg->rsp[1]; + chan = msg->rsp[3] & 0xf; + + rcu_read_lock(); + rcvr = find_cmd_rcvr(intf, netfn, cmd, chan); + if (rcvr) { + user = rcvr->user; + kref_get(&user->refcount); + } else + user = NULL; + + rcu_read_unlock(); + + if (user == NULL) { + /* We didn't find a user but we will queue this message + until a user registers to get it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->unhandled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + +#ifdef DEBUG_MSGING + { + int m; + for (m=0; mdata_size; m++) + printk(" %2.2x", msg->data[m]); + printk("\n"); + } +#endif + rv = 1; /* Queue the message and wait for a user to + come and fetch it. OEM Messages could + be sent from the BMC before an application + has loaded to receive them. */ + + } else { + /* Deliver the message to the user. */ + spin_lock_irqsave(&intf->counter_lock, flags); + intf->handled_commands++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + + recv_msg = ipmi_alloc_recv_msg(); + if (! recv_msg) { + /* We couldn't allocate memory for the + message, so requeue it for handling + later. */ + rv = 1; + } else { + /* OEM Messages are expected to be delivered via + the system interface to SMS software. We might + need to visit this again depending on OEM + requirements */ + smi_addr = ((struct ipmi_system_interface_addr *) + &(recv_msg->addr)); + smi_addr->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + smi_addr->channel = IPMI_BMC_CHANNEL; + smi_addr->lun = msg->rsp[0] & 3; + + /* Make sure we have the user data in the recv_msg + or things will get ugly soon. I think the IPMB + code is also broken but I have no way to prove + this. */ + recv_msg->user = user; + recv_msg->user_msg_data = NULL; + + recv_msg->msg.netfn = msg->rsp[0] >> 2; + recv_msg->msg.cmd = msg->rsp[1]; + recv_msg->recv_type = IPMI_OEM_RECV_TYPE; + + /* The message starts at byte 4 which follows the + the Channel Byte in the "GET MESSAGE" command */ + + memcpy(&(recv_msg->msg_data[0]), + &(msg->rsp[4]), + msg->rsp_size - 4); + recv_msg->msg.data = &(recv_msg->msg_data[0]); + recv_msg->msg.data_len = msg->rsp_size - 4; + deliver_response(recv_msg); + } + } + + return rv; +} +#endif /* defined(__VMKLNX__) && defined(HP_G6_SUPPORT) */ + + +/* Handle a new message. Return 1 if the message should be requeued, + 0 if the message should be freed, or -1 if the message should not + be freed or requeued. */ +static int handle_new_recv_msg(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + int requeue; + int chan; + +#ifdef DEBUG_MSGING + int m; + printk("Recv:"); + for (m = 0; m < msg->rsp_size; m++) + printk(" %2.2x", msg->rsp[m]); + printk("\n"); +#endif + if (msg->rsp_size < 2) { + /* Message is too small to be correct. */ + printk(KERN_WARNING PFX "BMC returned to small a message" + " for netfn %x cmd %x, got %d bytes\n", + (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size); + + /* Generate an error response for the message. */ + msg->rsp[0] = msg->data[0] | (1 << 2); + msg->rsp[1] = msg->data[1]; + msg->rsp[2] = IPMI_ERR_UNSPECIFIED; + msg->rsp_size = 3; + } else if (((msg->rsp[0] >> 2) != ((msg->data[0] >> 2) | 1))/* Netfn */ + || (msg->rsp[1] != msg->data[1])) /* Command */ + { + /* The response is not even marginally correct. */ + printk(KERN_WARNING PFX "BMC returned incorrect response," + " expected netfn %x cmd %x, got netfn %x cmd %x\n", + (msg->data[0] >> 2) | 1, msg->data[1], + msg->rsp[0] >> 2, msg->rsp[1]); + + /* Generate an error response for the message. */ + msg->rsp[0] = msg->data[0] | (1 << 2); + msg->rsp[1] = msg->data[1]; + msg->rsp[2] = IPMI_ERR_UNSPECIFIED; + msg->rsp_size = 3; + } + + if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) + && (msg->rsp[1] == IPMI_SEND_MSG_CMD) + && (msg->user_data != NULL)) + { + /* It's a response to a response we sent. For this we + deliver a send message response to the user. */ + struct ipmi_recv_msg *recv_msg = msg->user_data; + + requeue = 0; + if (msg->rsp_size < 2) + /* Message is too small to be correct. */ + goto out; + + chan = msg->data[2] & 0x0f; + if (chan >= IPMI_MAX_CHANNELS) + /* Invalid channel number */ + goto out; + + if (!recv_msg) + goto out; + + /* Make sure the user still exists. */ + if (!recv_msg->user || !recv_msg->user->valid) + goto out; + + recv_msg->recv_type = IPMI_RESPONSE_RESPONSE_TYPE; + recv_msg->msg.data = recv_msg->msg_data; + recv_msg->msg.data_len = 1; + recv_msg->msg_data[0] = msg->rsp[2]; + deliver_response(recv_msg); + } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) + && (msg->rsp[1] == IPMI_GET_MSG_CMD)) + { + /* It's from the receive queue. */ + chan = msg->rsp[3] & 0xf; + if (chan >= IPMI_MAX_CHANNELS) { + /* Invalid channel number */ + requeue = 0; + goto out; + } + + switch (intf->channels[chan].medium) { + case IPMI_CHANNEL_MEDIUM_IPMB: + if (msg->rsp[4] & 0x04) { + /* It's a response, so find the + requesting message and send it up. */ + requeue = handle_ipmb_get_msg_rsp(intf, msg); + } else { + /* It's a command to the SMS from some other + entity. Handle that. */ + requeue = handle_ipmb_get_msg_cmd(intf, msg); + } + break; + + case IPMI_CHANNEL_MEDIUM_8023LAN: + case IPMI_CHANNEL_MEDIUM_ASYNC: + if (msg->rsp[6] & 0x04) { + /* It's a response, so find the + requesting message and send it up. */ + requeue = handle_lan_get_msg_rsp(intf, msg); + } else { + /* It's a command to the SMS from some other + entity. Handle that. */ + requeue = handle_lan_get_msg_cmd(intf, msg); + } + break; + + default: +#if defined(__VMKLNX__) && defined(HP_G6_SUPPORT) + /* Check for OEM Channels. Clients had better + register for these commands. */ + if (intf->intf_num < 0) /* Interface no longer valid */ + requeue = 0; + else if ( (intf->channels[chan].medium >= 0x60) && + (intf->channels[chan].medium <= 0x7F) ) { + requeue = handle_oem_get_msg_cmd(intf, msg); + + /* + ** We may receive an OEM channel message before + ** all channels are initialized. We don't want + ** to lose such messages, but if no user is set + ** to receive them, we must put them at the end + ** of the queue so they do not block processing + ** of channel initialization messages. We know + ** the interface's channels are all initialized + ** by channel_handler() setting curr_channel to + ** IPMI_MAX_CHANNELS. + */ + if (requeue && + intf->curr_channel < IPMI_MAX_CHANNELS) { + requeue = 2; /* Requeue at tail */ + } + } + else + /* free the message. */ + requeue = 0; +#else + /* We don't handle the channel type, so just + * free the message. */ + requeue = 0; +#endif /* defined(__VMKLNX__) && defined(HP_G6_SUPPORT) */ + + } + + } else if ((msg->rsp[0] == ((IPMI_NETFN_APP_REQUEST|1) << 2)) + && (msg->rsp[1] == IPMI_READ_EVENT_MSG_BUFFER_CMD)) + { + /* It's an asyncronous event. */ + requeue = handle_read_event_rsp(intf, msg); + } else { + /* It's a response from the local BMC. */ + requeue = handle_bmc_rsp(intf, msg); + } + + out: + return requeue; +} + +/* Handle a new message from the lower layer. */ +void ipmi_smi_msg_received(ipmi_smi_t intf, + struct ipmi_smi_msg *msg) +{ + unsigned long flags; + int rv; + + + if ((msg->data_size >= 2) + && (msg->data[0] == (IPMI_NETFN_APP_REQUEST << 2)) + && (msg->data[1] == IPMI_SEND_MSG_CMD) + && (msg->user_data == NULL)) + { + /* This is the local response to a command send, start + the timer for these. The user_data will not be + NULL if this is a response send, and we will let + response sends just go through. */ + + /* Check for errors, if we get certain errors (ones + that mean basically we can try again later), we + ignore them and start the timer. Otherwise we + report the error immediately. */ + if ((msg->rsp_size >= 3) && (msg->rsp[2] != 0) + && (msg->rsp[2] != IPMI_NODE_BUSY_ERR) + && (msg->rsp[2] != IPMI_LOST_ARBITRATION_ERR) + && (msg->rsp[2] != IPMI_BUS_ERR) + && (msg->rsp[2] != IPMI_NAK_ON_WRITE_ERR)) + { + int chan = msg->rsp[3] & 0xf; + + /* Got an error sending the message, handle it. */ + spin_lock_irqsave(&intf->counter_lock, flags); + if (chan >= IPMI_MAX_CHANNELS) + ; /* This shouldn't happen */ + else if ((intf->channels[chan].medium + == IPMI_CHANNEL_MEDIUM_8023LAN) + || (intf->channels[chan].medium + == IPMI_CHANNEL_MEDIUM_ASYNC)) + intf->sent_lan_command_errs++; + else + intf->sent_ipmb_command_errs++; + spin_unlock_irqrestore(&intf->counter_lock, flags); + intf_err_seq(intf, msg->msgid, msg->rsp[2]); + } else { + /* The message was sent, start the timer. */ + intf_start_seq_timer(intf, msg->msgid); + } + + ipmi_free_smi_msg(msg); + goto out; + } + + /* To preserve message order, if the list is not empty, we + tack this message onto the end of the list. */ + spin_lock_irqsave(&intf->waiting_msgs_lock, flags); + if (!list_empty(&intf->waiting_msgs)) { + list_add_tail(&msg->link, &intf->waiting_msgs); + spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); + goto out; + } + spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); + + rv = handle_new_recv_msg(intf, msg); + if (rv > 0) { + /* Could not handle the message now, just add it to a + list to handle later. */ + spin_lock_irqsave(&intf->waiting_msgs_lock, flags); + list_add_tail(&msg->link, &intf->waiting_msgs); + spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); + } else if (rv == 0) { + ipmi_free_smi_msg(msg); + } + + out: + return; +} + +void ipmi_smi_watchdog_pretimeout(ipmi_smi_t intf) +{ + ipmi_user_t user; + + rcu_read_lock(); + list_for_each_entry_rcu(user, &intf->users, link) { + if (!user->handler->ipmi_watchdog_pretimeout) + continue; + + user->handler->ipmi_watchdog_pretimeout(user->handler_data); + } + rcu_read_unlock(); +} + + +static struct ipmi_smi_msg * +smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, + unsigned char seq, long seqid) +{ + struct ipmi_smi_msg *smi_msg = ipmi_alloc_smi_msg(); + if (!smi_msg) + /* If we can't allocate the message, then just return, we + get 4 retries, so this should be ok. */ + return NULL; + + memcpy(smi_msg->data, recv_msg->msg.data, recv_msg->msg.data_len); + smi_msg->data_size = recv_msg->msg.data_len; + smi_msg->msgid = STORE_SEQ_IN_MSGID(seq, seqid); + +#ifdef DEBUG_MSGING + { + int m; + printk("Resend: "); + for (m = 0; m < smi_msg->data_size; m++) + printk(" %2.2x", smi_msg->data[m]); + printk("\n"); + } +#endif + return smi_msg; +} + +static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent, + struct list_head *timeouts, long timeout_period, + int slot, unsigned long *flags) +{ + struct ipmi_recv_msg *msg; + struct ipmi_smi_handlers *handlers; + + if (intf->intf_num == -1) + return; + + if (!ent->inuse) + return; + + ent->timeout -= timeout_period; + if (ent->timeout > 0) + return; + + if (ent->retries_left == 0) { + /* The message has used all its retries. */ + ent->inuse = 0; + msg = ent->recv_msg; + list_add_tail(&msg->link, timeouts); + spin_lock(&intf->counter_lock); + if (ent->broadcast) + intf->timed_out_ipmb_broadcasts++; + else if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE) + intf->timed_out_lan_commands++; + else + intf->timed_out_ipmb_commands++; + spin_unlock(&intf->counter_lock); + } else { + struct ipmi_smi_msg *smi_msg; + /* More retries, send again. */ + + /* Start with the max timer, set to normal + timer after the message is sent. */ + ent->timeout = MAX_MSG_TIMEOUT; + ent->retries_left--; + spin_lock(&intf->counter_lock); + if (ent->recv_msg->addr.addr_type == IPMI_LAN_ADDR_TYPE) + intf->retransmitted_lan_commands++; + else + intf->retransmitted_ipmb_commands++; + spin_unlock(&intf->counter_lock); + + smi_msg = smi_from_recv_msg(intf, ent->recv_msg, slot, + ent->seqid); + if (!smi_msg) + return; + + spin_unlock_irqrestore(&intf->seq_lock, *flags); + + /* Send the new message. We send with a zero + * priority. It timed out, I doubt time is + * that critical now, and high priority + * messages are really only for messages to the + * local MC, which don't get resent. */ + handlers = intf->handlers; + if (handlers) + intf->handlers->sender(intf->send_info, + smi_msg, 0); + else + ipmi_free_smi_msg(smi_msg); + + spin_lock_irqsave(&intf->seq_lock, *flags); + } +} + +static void ipmi_timeout_handler(long timeout_period) +{ + ipmi_smi_t intf; + struct list_head timeouts; + struct ipmi_recv_msg *msg, *msg2; + struct ipmi_smi_msg *smi_msg, *smi_msg2; + unsigned long flags; + int i; + + rcu_read_lock(); + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + /* See if any waiting messages need to be processed. */ + spin_lock_irqsave(&intf->waiting_msgs_lock, flags); + list_for_each_entry_safe(smi_msg, smi_msg2, + &intf->waiting_msgs, link) { +#if defined(__VMKLNX__) && defined(HP_G6_SUPPORT) + int rv; + + rv = handle_new_recv_msg(intf, smi_msg); + if (rv == 0) { + /* 0: msg handled: free it */ + list_del(&smi_msg->link); + ipmi_free_smi_msg(smi_msg); + } else if (rv == 1) { + /* 1: requeue: to preserve message order, + quit if we can't handle a message. */ + break; + } else { + /* -2: msg handled and freed: do nothing; + 2: skip msg, leaving it on the queue: + this is to defer early OEM channel + msgs until after channel init; + Anything else: surprise, do nothing. */ + continue; + } +#else + if (!handle_new_recv_msg(intf, smi_msg)) { + list_del(&smi_msg->link); + ipmi_free_smi_msg(smi_msg); + } else { + /* To preserve message order, quit if we + can't handle a message. */ + break; + } +#endif + } + spin_unlock_irqrestore(&intf->waiting_msgs_lock, flags); + + /* Go through the seq table and find any messages that + have timed out, putting them in the timeouts + list. */ + INIT_LIST_HEAD(&timeouts); + spin_lock_irqsave(&intf->seq_lock, flags); + for (i = 0; i < IPMI_IPMB_NUM_SEQ; i++) + check_msg_timeout(intf, &(intf->seq_table[i]), + &timeouts, timeout_period, i, + &flags); + spin_unlock_irqrestore(&intf->seq_lock, flags); + + list_for_each_entry_safe(msg, msg2, &timeouts, link) + deliver_err_response(msg, IPMI_TIMEOUT_COMPLETION_CODE); + + /* + * Maintenance mode handling. Check the timeout + * optimistically before we claim the lock. It may + * mean a timeout gets missed occasionally, but that + * only means the timeout gets extended by one period + * in that case. No big deal, and it avoids the lock + * most of the time. + */ + if (intf->auto_maintenance_timeout > 0) { + spin_lock_irqsave(&intf->maintenance_mode_lock, flags); + if (intf->auto_maintenance_timeout > 0) { + intf->auto_maintenance_timeout + -= timeout_period; + if (!intf->maintenance_mode + && (intf->auto_maintenance_timeout <= 0)) + { + intf->maintenance_mode_enable = 0; + maintenance_mode_update(intf); + } + } + spin_unlock_irqrestore(&intf->maintenance_mode_lock, + flags); + } + } + rcu_read_unlock(); +} + +static void ipmi_request_event(void) +{ + ipmi_smi_t intf; + struct ipmi_smi_handlers *handlers; + + rcu_read_lock(); + /* Called from the timer, no need to check if handlers is + * valid. */ + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + /* No event requests when in maintenance mode. */ + if (intf->maintenance_mode_enable) + continue; + + handlers = intf->handlers; + if (handlers) + handlers->request_events(intf->send_info); + } + rcu_read_unlock(); +} + +static struct timer_list ipmi_timer; + +/* Call every ~100 ms. */ +#define IPMI_TIMEOUT_TIME 100 + +/* How many jiffies does it take to get to the timeout time. */ +#define IPMI_TIMEOUT_JIFFIES ((IPMI_TIMEOUT_TIME * HZ) / 1000) + +/* Request events from the queue every second (this is the number of + IPMI_TIMEOUT_TIMES between event requests). Hopefully, in the + future, IPMI will add a way to know immediately if an event is in + the queue and this silliness can go away. */ +#define IPMI_REQUEST_EV_TIME (1000 / (IPMI_TIMEOUT_TIME)) + +static atomic_t stop_operation; +static unsigned int ticks_to_req_ev = IPMI_REQUEST_EV_TIME; + +static void ipmi_timeout(unsigned long data) +{ + if (atomic_read(&stop_operation)) + return; + + ticks_to_req_ev--; + if (ticks_to_req_ev == 0) { + ipmi_request_event(); + ticks_to_req_ev = IPMI_REQUEST_EV_TIME; + } + + ipmi_timeout_handler(IPMI_TIMEOUT_TIME); + + mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); +} + + +static atomic_t smi_msg_inuse_count = ATOMIC_INIT(0); +static atomic_t recv_msg_inuse_count = ATOMIC_INIT(0); + +/* FIXME - convert these to slabs. */ +static void free_smi_msg(struct ipmi_smi_msg *msg) +{ + atomic_dec(&smi_msg_inuse_count); + kfree(msg); +} + +struct ipmi_smi_msg *ipmi_alloc_smi_msg(void) +{ + struct ipmi_smi_msg *rv; + rv = kmalloc(sizeof(struct ipmi_smi_msg), GFP_ATOMIC); + if (rv) { + rv->done = free_smi_msg; + rv->user_data = NULL; + atomic_inc(&smi_msg_inuse_count); +#if defined(__VMKLNX__) + rv->tagged = 0; +#endif + } + return rv; +} + +static void free_recv_msg(struct ipmi_recv_msg *msg) +{ + atomic_dec(&recv_msg_inuse_count); + kfree(msg); +} + +struct ipmi_recv_msg *ipmi_alloc_recv_msg(void) +{ + struct ipmi_recv_msg *rv; + + rv = kmalloc(sizeof(struct ipmi_recv_msg), GFP_ATOMIC); + if (rv) { + rv->user = NULL; + rv->done = free_recv_msg; + atomic_inc(&recv_msg_inuse_count); + } + return rv; +} + +void ipmi_free_recv_msg(struct ipmi_recv_msg *msg) +{ + if (msg->user) + kref_put(&msg->user->refcount, free_user); + msg->done(msg); +} + +#ifdef CONFIG_IPMI_PANIC_EVENT + +static void dummy_smi_done_handler(struct ipmi_smi_msg *msg) +{ +} + +static void dummy_recv_done_handler(struct ipmi_recv_msg *msg) +{ +} + +#ifdef CONFIG_IPMI_PANIC_STRING +static void event_receiver_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) +{ + if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) + && (msg->msg.netfn == IPMI_NETFN_SENSOR_EVENT_RESPONSE) + && (msg->msg.cmd == IPMI_GET_EVENT_RECEIVER_CMD) + && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) + { + /* A get event receiver command, save it. */ + intf->event_receiver = msg->msg.data[1]; + intf->event_receiver_lun = msg->msg.data[2] & 0x3; + } +} + +static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_recv_msg *msg) +{ + if ((msg->addr.addr_type == IPMI_SYSTEM_INTERFACE_ADDR_TYPE) + && (msg->msg.netfn == IPMI_NETFN_APP_RESPONSE) + && (msg->msg.cmd == IPMI_GET_DEVICE_ID_CMD) + && (msg->msg.data[0] == IPMI_CC_NO_ERROR)) + { + /* A get device id command, save if we are an event + receiver or generator. */ + intf->local_sel_device = (msg->msg.data[6] >> 2) & 1; + intf->local_event_generator = (msg->msg.data[6] >> 5) & 1; + } +} +#endif + +static void send_panic_events(char *str) +{ + struct kernel_ipmi_msg msg; + ipmi_smi_t intf; + unsigned char data[16]; + struct ipmi_system_interface_addr *si; + struct ipmi_addr addr; + struct ipmi_smi_msg smi_msg; + struct ipmi_recv_msg recv_msg; + + si = (struct ipmi_system_interface_addr *) &addr; + si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + si->channel = IPMI_BMC_CHANNEL; + si->lun = 0; + + /* Fill in an event telling that we have failed. */ + msg.netfn = 0x04; /* Sensor or Event. */ + msg.cmd = 2; /* Platform event command. */ + msg.data = data; + msg.data_len = 8; + data[0] = 0x41; /* Kernel generator ID, IPMI table 5-4 */ + data[1] = 0x03; /* This is for IPMI 1.0. */ + data[2] = 0x20; /* OS Critical Stop, IPMI table 36-3 */ + data[4] = 0x6f; /* Sensor specific, IPMI table 36-1 */ + data[5] = 0xa1; /* Runtime stop OEM bytes 2 & 3. */ + + /* Put a few breadcrumbs in. Hopefully later we can add more things + to make the panic events more useful. */ + if (str) { + data[3] = str[0]; + data[6] = str[1]; + data[7] = str[2]; + } + + smi_msg.done = dummy_smi_done_handler; + recv_msg.done = dummy_recv_done_handler; + + /* For every registered interface, send the event. */ + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + if (!intf->handlers) + /* Interface is not ready. */ + continue; + + /* Send the event announcing the panic. */ + intf->handlers->set_run_to_completion(intf->send_info, 1); + i_ipmi_request(NULL, + intf, + &addr, + 0, + &msg, + intf, + &smi_msg, + &recv_msg, + 0, + intf->channels[0].address, + intf->channels[0].lun, + 0, 1); /* Don't retry, and don't wait. */ + } + +#ifdef CONFIG_IPMI_PANIC_STRING + /* On every interface, dump a bunch of OEM event holding the + string. */ + if (!str) + return; + + /* For every registered interface, send the event. */ + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + char *p = str; + struct ipmi_ipmb_addr *ipmb; + int j; + + if (intf->intf_num == -1) + /* Interface was not ready yet. */ + continue; + + /* + * intf_num is used as an marker to tell if the + * interface is valid. Thus we need a read barrier to + * make sure data fetched before checking intf_num + * won't be used. + */ + smp_rmb(); + + /* First job here is to figure out where to send the + OEM events. There's no way in IPMI to send OEM + events using an event send command, so we have to + find the SEL to put them in and stick them in + there. */ + + /* Get capabilities from the get device id. */ + intf->local_sel_device = 0; + intf->local_event_generator = 0; + intf->event_receiver = 0; + + /* Request the device info from the local MC. */ + msg.netfn = IPMI_NETFN_APP_REQUEST; + msg.cmd = IPMI_GET_DEVICE_ID_CMD; + msg.data = NULL; + msg.data_len = 0; + intf->null_user_handler = device_id_fetcher; + i_ipmi_request(NULL, + intf, + &addr, + 0, + &msg, + intf, + &smi_msg, + &recv_msg, + 0, + intf->channels[0].address, + intf->channels[0].lun, + 0, 1); /* Don't retry, and don't wait. */ + + if (intf->local_event_generator) { + /* Request the event receiver from the local MC. */ + msg.netfn = IPMI_NETFN_SENSOR_EVENT_REQUEST; + msg.cmd = IPMI_GET_EVENT_RECEIVER_CMD; + msg.data = NULL; + msg.data_len = 0; + intf->null_user_handler = event_receiver_fetcher; + i_ipmi_request(NULL, + intf, + &addr, + 0, + &msg, + intf, + &smi_msg, + &recv_msg, + 0, + intf->channels[0].address, + intf->channels[0].lun, + 0, 1); /* no retry, and no wait. */ + } + intf->null_user_handler = NULL; + + /* Validate the event receiver. The low bit must not + be 1 (it must be a valid IPMB address), it cannot + be zero, and it must not be my address. */ + if (((intf->event_receiver & 1) == 0) + && (intf->event_receiver != 0) + && (intf->event_receiver != intf->channels[0].address)) + { + /* The event receiver is valid, send an IPMB + message. */ + ipmb = (struct ipmi_ipmb_addr *) &addr; + ipmb->addr_type = IPMI_IPMB_ADDR_TYPE; + ipmb->channel = 0; /* FIXME - is this right? */ + ipmb->lun = intf->event_receiver_lun; + ipmb->slave_addr = intf->event_receiver; + } else if (intf->local_sel_device) { + /* The event receiver was not valid (or was + me), but I am an SEL device, just dump it + in my SEL. */ + si = (struct ipmi_system_interface_addr *) &addr; + si->addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + si->channel = IPMI_BMC_CHANNEL; + si->lun = 0; + } else + continue; /* No where to send the event. */ + + + msg.netfn = IPMI_NETFN_STORAGE_REQUEST; /* Storage. */ + msg.cmd = IPMI_ADD_SEL_ENTRY_CMD; + msg.data = data; + msg.data_len = 16; + + j = 0; + while (*p) { + int size = strlen(p); + + if (size > 11) + size = 11; + data[0] = 0; + data[1] = 0; + data[2] = 0xf0; /* OEM event without timestamp. */ + data[3] = intf->channels[0].address; + data[4] = j++; /* sequence # */ + /* Always give 11 bytes, so strncpy will fill + it with zeroes for me. */ + strncpy(data+5, p, 11); + p += size; + + i_ipmi_request(NULL, + intf, + &addr, + 0, + &msg, + intf, + &smi_msg, + &recv_msg, + 0, + intf->channels[0].address, + intf->channels[0].lun, + 0, 1); /* no retry, and no wait. */ + } + } +#endif /* CONFIG_IPMI_PANIC_STRING */ +} +#endif /* CONFIG_IPMI_PANIC_EVENT */ + +#if !defined(__VMKLNX__) +static int has_panicked; + +static int panic_event(struct notifier_block *this, + unsigned long event, + void *ptr) +{ + ipmi_smi_t intf; + + if (has_panicked) + return NOTIFY_DONE; + has_panicked = 1; + + /* For every registered interface, set it to run to completion. */ + list_for_each_entry_rcu(intf, &ipmi_interfaces, link) { + if (!intf->handlers) + /* Interface is not ready. */ + continue; + + intf->handlers->set_run_to_completion(intf->send_info, 1); + } + +#ifdef CONFIG_IPMI_PANIC_EVENT + send_panic_events(ptr); +#endif + + return NOTIFY_DONE; +} + +static struct notifier_block panic_block = { + .notifier_call = panic_event, + .next = NULL, + .priority = 200 /* priority: INT_MAX >= x >= 0 */ +}; +#endif /* #if !defined(__VMKLNX__) */ + +static int ipmi_init_msghandler(void) +{ + int rv; + + if (initialized) + return 0; + + rv = driver_register(&ipmidriver); + if (rv) { + printk(KERN_ERR PFX "Could not register IPMI driver\n"); + return rv; + } + + printk(KERN_INFO "ipmi message handler version " + IPMI_DRIVER_VERSION "\n"); + +#ifdef CONFIG_PROC_FS + proc_ipmi_root = proc_mkdir("ipmi", NULL); + if (!proc_ipmi_root) { + printk(KERN_ERR PFX "Unable to create IPMI proc dir"); + return -ENOMEM; + } + + proc_ipmi_root->owner = THIS_MODULE; +#endif /* CONFIG_PROC_FS */ + + setup_timer(&ipmi_timer, ipmi_timeout, 0); + mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); + +#if !defined(__VMKLNX__) + atomic_notifier_chain_register(&panic_notifier_list, &panic_block); +#endif /* #if !defined(__VMKLNX__) */ + + initialized = 1; + + return 0; +} + +static __init int ipmi_init_msghandler_mod(void) +{ + ipmi_init_msghandler(); + return 0; +} + +static __exit void cleanup_ipmi(void) +{ + int count; + + if (!initialized) + return; + +#if !defined(__VMKLNX__) + atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block); +#endif /* #if !defined(__VMKLNX__) */ + + /* This can't be called if any interfaces exist, so no worry about + shutting down the interfaces. */ + + /* Tell the timer to stop, then wait for it to stop. This avoids + problems with race conditions removing the timer here. */ + atomic_inc(&stop_operation); + del_timer_sync(&ipmi_timer); + +#ifdef CONFIG_PROC_FS + remove_proc_entry(proc_ipmi_root->name, NULL); +#endif /* CONFIG_PROC_FS */ + + driver_unregister(&ipmidriver); + + initialized = 0; + + /* Check for buffer leaks. */ + count = atomic_read(&smi_msg_inuse_count); + if (count != 0) + printk(KERN_WARNING PFX "SMI message count %d at exit\n", + count); + count = atomic_read(&recv_msg_inuse_count); + if (count != 0) + printk(KERN_WARNING PFX "recv message count %d at exit\n", + count); +} +module_exit(cleanup_ipmi); + +module_init(ipmi_init_msghandler_mod); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Corey Minyard "); +MODULE_DESCRIPTION("Incoming and outgoing message routing for an IPMI interface."); +MODULE_VERSION(IPMI_DRIVER_VERSION); + +EXPORT_SYMBOL(ipmi_create_user); +EXPORT_SYMBOL(ipmi_destroy_user); +EXPORT_SYMBOL(ipmi_get_version); +EXPORT_SYMBOL(ipmi_request_settime); +EXPORT_SYMBOL(ipmi_request_supply_msgs); +EXPORT_SYMBOL(ipmi_poll_interface); +EXPORT_SYMBOL(ipmi_register_smi); +EXPORT_SYMBOL(ipmi_unregister_smi); +EXPORT_SYMBOL(ipmi_register_for_cmd); +EXPORT_SYMBOL(ipmi_unregister_for_cmd); +EXPORT_SYMBOL(ipmi_smi_msg_received); +EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout); +EXPORT_SYMBOL(ipmi_alloc_smi_msg); +EXPORT_SYMBOL(ipmi_addr_length); +EXPORT_SYMBOL(ipmi_validate_addr); +EXPORT_SYMBOL(ipmi_set_gets_events); +EXPORT_SYMBOL(ipmi_smi_watcher_register); +EXPORT_SYMBOL(ipmi_smi_watcher_unregister); +EXPORT_SYMBOL(ipmi_set_my_address); +EXPORT_SYMBOL(ipmi_get_my_address); +EXPORT_SYMBOL(ipmi_set_my_LUN); +EXPORT_SYMBOL(ipmi_get_my_LUN); +EXPORT_SYMBOL(ipmi_smi_add_proc_entry); +EXPORT_SYMBOL(ipmi_user_set_run_to_completion); +EXPORT_SYMBOL(ipmi_free_recv_msg); diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/kcompat.h b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/kcompat.h new file mode 100644 index 0000000..171b1b5 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_msghandler/kcompat.h @@ -0,0 +1,6 @@ +#ifndef __KCOMPAT_H__ +#define __KCOMPAT_H__ + +#undef CONFIG_PROC_FS /* Disable the use of PROC_FS */ + +#endif /* #ifndef __KCOMPAT_H__ */ diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.c new file mode 100644 index 0000000..e736119 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_bt_sm.c @@ -0,0 +1,670 @@ +/* + * ipmi_bt_sm.c + * + * The state machine for an Open IPMI BT sub-driver under ipmi_si.c, part + * of the driver architecture at http://sourceforge.net/project/openipmi + * + * Author: Rocky Craig + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include /* For printk. */ +#include +#include +#include +#include /* for completion codes */ +#include "ipmi_si_sm.h" + +#define BT_DEBUG_OFF 0 /* Used in production */ +#define BT_DEBUG_ENABLE 1 /* Generic messages */ +#define BT_DEBUG_MSG 2 /* Prints all request/response buffers */ +#define BT_DEBUG_STATES 4 /* Verbose look at state changes */ +/* BT_DEBUG_OFF must be zero to correspond to the default uninitialized + value */ + +static int bt_debug; /* 0 == BT_DEBUG_OFF */ + +module_param(bt_debug, int, 0644); +MODULE_PARM_DESC(bt_debug, "debug bitmask, 1=enable, 2=messages, 4=states"); + +/* Typical "Get BT Capabilities" values are 2-3 retries, 5-10 seconds, + and 64 byte buffers. However, one HP implementation wants 255 bytes of + buffer (with a documented message of 160 bytes) so go for the max. + Since the Open IPMI architecture is single-message oriented at this + stage, the queue depth of BT is of no concern. */ + +#define BT_NORMAL_TIMEOUT 5 /* seconds */ +#define BT_NORMAL_RETRY_LIMIT 2 +#define BT_RESET_DELAY 6 /* seconds after warm reset */ + +/* States are written in chronological order and usually cover + multiple rows of the state table discussion in the IPMI spec. */ + +enum bt_states { + BT_STATE_IDLE = 0, /* Order is critical in this list */ + BT_STATE_XACTION_START, + BT_STATE_WRITE_BYTES, + BT_STATE_WRITE_CONSUME, + BT_STATE_READ_WAIT, + BT_STATE_CLEAR_B2H, + BT_STATE_READ_BYTES, + BT_STATE_RESET1, /* These must come last */ + BT_STATE_RESET2, + BT_STATE_RESET3, + BT_STATE_RESTART, + BT_STATE_PRINTME, + BT_STATE_CAPABILITIES_BEGIN, + BT_STATE_CAPABILITIES_END, + BT_STATE_LONG_BUSY /* BT doesn't get hosed :-) */ +}; + +/* Macros seen at the end of state "case" blocks. They help with legibility + and debugging. */ + +#define BT_STATE_CHANGE(X,Y) { bt->state = X; return Y; } + +#define BT_SI_SM_RETURN(Y) { last_printed = BT_STATE_PRINTME; return Y; } + +struct si_sm_data { + enum bt_states state; + unsigned char seq; /* BT sequence number */ + struct si_sm_io *io; + unsigned char write_data[IPMI_MAX_MSG_LENGTH]; + int write_count; + unsigned char read_data[IPMI_MAX_MSG_LENGTH]; + int read_count; + int truncated; + long timeout; /* microseconds countdown */ + int error_retries; /* end of "common" fields */ + int nonzero_status; /* hung BMCs stay all 0 */ + enum bt_states complete; /* to divert the state machine */ + int BT_CAP_outreqs; + long BT_CAP_req2rsp; + int BT_CAP_retries; /* Recommended retries */ +}; + +#define BT_CLR_WR_PTR 0x01 /* See IPMI 1.5 table 11.6.4 */ +#define BT_CLR_RD_PTR 0x02 +#define BT_H2B_ATN 0x04 +#define BT_B2H_ATN 0x08 +#define BT_SMS_ATN 0x10 +#define BT_OEM0 0x20 +#define BT_H_BUSY 0x40 +#define BT_B_BUSY 0x80 + +/* Some bits are toggled on each write: write once to set it, once + more to clear it; writing a zero does nothing. To absolutely + clear it, check its state and write if set. This avoids the "get + current then use as mask" scheme to modify one bit. Note that the + variable "bt" is hardcoded into these macros. */ + +#define BT_STATUS bt->io->inputb(bt->io, 0) +#define BT_CONTROL(x) bt->io->outputb(bt->io, 0, x) + +#define BMC2HOST bt->io->inputb(bt->io, 1) +#define HOST2BMC(x) bt->io->outputb(bt->io, 1, x) + +#define BT_INTMASK_R bt->io->inputb(bt->io, 2) +#define BT_INTMASK_W(x) bt->io->outputb(bt->io, 2, x) + +/* Convenience routines for debugging. These are not multi-open safe! + Note the macros have hardcoded variables in them. */ + +static char *state2txt(unsigned char state) +{ + switch (state) { + case BT_STATE_IDLE: return("IDLE"); + case BT_STATE_XACTION_START: return("XACTION"); + case BT_STATE_WRITE_BYTES: return("WR_BYTES"); + case BT_STATE_WRITE_CONSUME: return("WR_CONSUME"); + case BT_STATE_READ_WAIT: return("RD_WAIT"); + case BT_STATE_CLEAR_B2H: return("CLEAR_B2H"); + case BT_STATE_READ_BYTES: return("RD_BYTES"); + case BT_STATE_RESET1: return("RESET1"); + case BT_STATE_RESET2: return("RESET2"); + case BT_STATE_RESET3: return("RESET3"); + case BT_STATE_RESTART: return("RESTART"); + case BT_STATE_LONG_BUSY: return("LONG_BUSY"); + case BT_STATE_CAPABILITIES_BEGIN: return("CAP_BEGIN"); + case BT_STATE_CAPABILITIES_END: return("CAP_END"); + } + return("BAD STATE"); +} +#define STATE2TXT state2txt(bt->state) + +static char *status2txt(unsigned char status) +{ + /* + * This cannot be called by two threads at the same time and + * the buffer is always consumed immediately, so the static is + * safe to use. + */ + static char buf[40]; + + strcpy(buf, "[ "); + if (status & BT_B_BUSY) + strcat(buf, "B_BUSY "); + if (status & BT_H_BUSY) + strcat(buf, "H_BUSY "); + if (status & BT_OEM0) + strcat(buf, "OEM0 "); + if (status & BT_SMS_ATN) + strcat(buf, "SMS "); + if (status & BT_B2H_ATN) + strcat(buf, "B2H "); + if (status & BT_H2B_ATN) + strcat(buf, "H2B "); + strcat(buf, "]"); + return buf; +} +#define STATUS2TXT status2txt(status) + +/* called externally at insmod time, and internally on cleanup */ + +static unsigned int bt_init_data(struct si_sm_data *bt, struct si_sm_io *io) +{ + memset(bt, 0, sizeof(struct si_sm_data)); + if (bt->io != io) { /* external: one-time only things */ + bt->io = io; + bt->seq = 0; + } + bt->state = BT_STATE_IDLE; /* start here */ + bt->complete = BT_STATE_IDLE; /* end here */ + bt->BT_CAP_req2rsp = BT_NORMAL_TIMEOUT * 1000000; + bt->BT_CAP_retries = BT_NORMAL_RETRY_LIMIT; + /* BT_CAP_outreqs == zero is a flag to read BT Capabilities */ + return 3; /* We claim 3 bytes of space; ought to check SPMI table */ +} + +/* Jam a completion code (probably an error) into a response */ + +static void force_result(struct si_sm_data *bt, unsigned char completion_code) +{ + bt->read_data[0] = 4; /* # following bytes */ + bt->read_data[1] = bt->write_data[1] | 4; /* Odd NetFn/LUN */ + bt->read_data[2] = bt->write_data[2]; /* seq (ignored) */ + bt->read_data[3] = bt->write_data[3]; /* Command */ + bt->read_data[4] = completion_code; + bt->read_count = 5; +} + +/* The upper state machine starts here */ + +static int bt_start_transaction(struct si_sm_data *bt, + unsigned char *data, + unsigned int size) +{ + unsigned int i; + + if (size < 2) + return IPMI_REQ_LEN_INVALID_ERR; + if (size > IPMI_MAX_MSG_LENGTH) + return IPMI_REQ_LEN_EXCEEDED_ERR; + + if (bt->state == BT_STATE_LONG_BUSY) + return IPMI_NODE_BUSY_ERR; + + if (bt->state != BT_STATE_IDLE) + return IPMI_NOT_IN_MY_STATE_ERR; + + if (bt_debug & BT_DEBUG_MSG) { + printk(KERN_WARNING "BT: +++++++++++++++++ New command\n"); + printk(KERN_WARNING "BT: NetFn/LUN CMD [%d data]:", size - 2); + for (i = 0; i < size; i ++) + printk (" %02x", data[i]); + printk("\n"); + } + bt->write_data[0] = size + 1; /* all data plus seq byte */ + bt->write_data[1] = *data; /* NetFn/LUN */ + bt->write_data[2] = bt->seq++; + memcpy(bt->write_data + 3, data + 1, size - 1); + bt->write_count = size + 2; + bt->error_retries = 0; + bt->nonzero_status = 0; + bt->truncated = 0; + bt->state = BT_STATE_XACTION_START; + bt->timeout = bt->BT_CAP_req2rsp; + force_result(bt, IPMI_ERR_UNSPECIFIED); + return 0; +} + +/* After the upper state machine has been told SI_SM_TRANSACTION_COMPLETE + it calls this. Strip out the length and seq bytes. */ + +static int bt_get_result(struct si_sm_data *bt, + unsigned char *data, + unsigned int length) +{ + int i, msg_len; + + msg_len = bt->read_count - 2; /* account for length & seq */ + if (msg_len < 3 || msg_len > IPMI_MAX_MSG_LENGTH) { + force_result(bt, IPMI_ERR_UNSPECIFIED); + msg_len = 3; + } + data[0] = bt->read_data[1]; + data[1] = bt->read_data[3]; + if (length < msg_len || bt->truncated) { + data[2] = IPMI_ERR_MSG_TRUNCATED; + msg_len = 3; + } else + memcpy(data + 2, bt->read_data + 4, msg_len - 2); + + if (bt_debug & BT_DEBUG_MSG) { + printk (KERN_WARNING "BT: result %d bytes:", msg_len); + for (i = 0; i < msg_len; i++) + printk(" %02x", data[i]); + printk ("\n"); + } + return msg_len; +} + +/* This bit's functionality is optional */ +#define BT_BMC_HWRST 0x80 + +static void reset_flags(struct si_sm_data *bt) +{ + if (bt_debug) + printk(KERN_WARNING "IPMI BT: flag reset %s\n", + status2txt(BT_STATUS)); + if (BT_STATUS & BT_H_BUSY) + BT_CONTROL(BT_H_BUSY); /* force clear */ + BT_CONTROL(BT_CLR_WR_PTR); /* always reset */ + BT_CONTROL(BT_SMS_ATN); /* always clear */ + BT_INTMASK_W(BT_BMC_HWRST); +} + +/* Get rid of an unwanted/stale response. This should only be needed for + BMCs that support multiple outstanding requests. */ + +static void drain_BMC2HOST(struct si_sm_data *bt) +{ + int i, size; + + if (!(BT_STATUS & BT_B2H_ATN)) /* Not signalling a response */ + return; + + BT_CONTROL(BT_H_BUSY); /* now set */ + BT_CONTROL(BT_B2H_ATN); /* always clear */ + BT_STATUS; /* pause */ + BT_CONTROL(BT_B2H_ATN); /* some BMCs are stubborn */ + BT_CONTROL(BT_CLR_RD_PTR); /* always reset */ + if (bt_debug) + printk(KERN_WARNING "IPMI BT: stale response %s; ", + status2txt(BT_STATUS)); + size = BMC2HOST; + for (i = 0; i < size ; i++) + BMC2HOST; + BT_CONTROL(BT_H_BUSY); /* now clear */ + if (bt_debug) + printk("drained %d bytes\n", size + 1); +} + +static inline void write_all_bytes(struct si_sm_data *bt) +{ + int i; + + if (bt_debug & BT_DEBUG_MSG) { + printk(KERN_WARNING "BT: write %d bytes seq=0x%02X", + bt->write_count, bt->seq); + for (i = 0; i < bt->write_count; i++) + printk (" %02x", bt->write_data[i]); + printk ("\n"); + } + for (i = 0; i < bt->write_count; i++) + HOST2BMC(bt->write_data[i]); +} + +static inline int read_all_bytes(struct si_sm_data *bt) +{ + unsigned char i; + + /* length is "framing info", minimum = 4: NetFn, Seq, Cmd, cCode. + Keep layout of first four bytes aligned with write_data[] */ + + bt->read_data[0] = BMC2HOST; + bt->read_count = bt->read_data[0]; + + if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) { + if (bt_debug & BT_DEBUG_MSG) + printk(KERN_WARNING "BT: bad raw rsp len=%d\n", + bt->read_count); + bt->truncated = 1; + return 1; /* let next XACTION START clean it up */ + } + for (i = 1; i <= bt->read_count; i++) + bt->read_data[i] = BMC2HOST; + bt->read_count++; /* Account internally for length byte */ + + if (bt_debug & BT_DEBUG_MSG) { + int max = bt->read_count; + + printk(KERN_WARNING "BT: got %d bytes seq=0x%02X", + max, bt->read_data[2]); + if (max > 16) + max = 16; + for (i = 0; i < max; i++) + printk (" %02x", bt->read_data[i]); + printk ("%s\n", bt->read_count == max ? "" : " ..."); + } + + /* per the spec, the (NetFn[1], Seq[2], Cmd[3]) tuples must match */ + if ((bt->read_data[3] == bt->write_data[3]) && + (bt->read_data[2] == bt->write_data[2]) && + ((bt->read_data[1] & 0xF8) == (bt->write_data[1] & 0xF8))) + return 1; + + if (bt_debug & BT_DEBUG_MSG) + printk(KERN_WARNING "IPMI BT: bad packet: " + "want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n", + bt->write_data[1] | 0x04, bt->write_data[2], bt->write_data[3], + bt->read_data[1], bt->read_data[2], bt->read_data[3]); + return 0; +} + +/* Restart if retries are left, or return an error completion code */ + +static enum si_sm_result error_recovery(struct si_sm_data *bt, + unsigned char status, + unsigned char cCode) +{ + char *reason; + + bt->timeout = bt->BT_CAP_req2rsp; + + switch (cCode) { + case IPMI_TIMEOUT_ERR: + reason = "timeout"; + break; + default: + reason = "internal error"; + break; + } + + printk(KERN_WARNING "IPMI BT: %s in %s %s ", /* open-ended line */ + reason, STATE2TXT, STATUS2TXT); + + /* Per the IPMI spec, retries are based on the sequence number + known only to this module, so manage a restart here. */ + (bt->error_retries)++; + if (bt->error_retries < bt->BT_CAP_retries) { + printk("%d retries left\n", + bt->BT_CAP_retries - bt->error_retries); + bt->state = BT_STATE_RESTART; + return SI_SM_CALL_WITHOUT_DELAY; + } + + printk("failed %d retries, sending error response\n", + bt->BT_CAP_retries); + if (!bt->nonzero_status) + printk(KERN_ERR "IPMI BT: stuck, try power cycle\n"); + + /* this is most likely during insmod */ + else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) { + printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n"); + bt->state = BT_STATE_RESET1; + return SI_SM_CALL_WITHOUT_DELAY; + } + + /* Concoct a useful error message, set up the next state, and + be done with this sequence. */ + + bt->state = BT_STATE_IDLE; + switch (cCode) { + case IPMI_TIMEOUT_ERR: + if (status & BT_B_BUSY) { + cCode = IPMI_NODE_BUSY_ERR; + bt->state = BT_STATE_LONG_BUSY; + } + break; + default: + break; + } + force_result(bt, cCode); + return SI_SM_TRANSACTION_COMPLETE; +} + +/* Check status and (usually) take action and change this state machine. */ + +static enum si_sm_result bt_event(struct si_sm_data *bt, long time) +{ + unsigned char status, BT_CAP[8]; + static enum bt_states last_printed = BT_STATE_PRINTME; + int i; + + status = BT_STATUS; + bt->nonzero_status |= status; + if ((bt_debug & BT_DEBUG_STATES) && (bt->state != last_printed)) { + printk(KERN_WARNING "BT: %s %s TO=%ld - %ld \n", + STATE2TXT, + STATUS2TXT, + bt->timeout, + time); + last_printed = bt->state; + } + + /* Commands that time out may still (eventually) provide a response. + This stale response will get in the way of a new response so remove + it if possible (hopefully during IDLE). Even if it comes up later + it will be rejected by its (now-forgotten) seq number. */ + + if ((bt->state < BT_STATE_WRITE_BYTES) && (status & BT_B2H_ATN)) { + drain_BMC2HOST(bt); + BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY); + } + + if ((bt->state != BT_STATE_IDLE) && + (bt->state < BT_STATE_PRINTME)) { /* check timeout */ + bt->timeout -= time; + if ((bt->timeout < 0) && (bt->state < BT_STATE_RESET1)) + return error_recovery(bt, + status, + IPMI_TIMEOUT_ERR); + } + + switch (bt->state) { + + /* Idle state first checks for asynchronous messages from another + channel, then does some opportunistic housekeeping. */ + + case BT_STATE_IDLE: + if (status & BT_SMS_ATN) { + BT_CONTROL(BT_SMS_ATN); /* clear it */ + return SI_SM_ATTN; + } + + if (status & BT_H_BUSY) /* clear a leftover H_BUSY */ + BT_CONTROL(BT_H_BUSY); + + /* Read BT capabilities if it hasn't been done yet */ + if (!bt->BT_CAP_outreqs) + BT_STATE_CHANGE(BT_STATE_CAPABILITIES_BEGIN, + SI_SM_CALL_WITHOUT_DELAY); + bt->timeout = bt->BT_CAP_req2rsp; + BT_SI_SM_RETURN(SI_SM_IDLE); + + case BT_STATE_XACTION_START: + if (status & (BT_B_BUSY | BT_H2B_ATN)) + BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY); + if (BT_STATUS & BT_H_BUSY) + BT_CONTROL(BT_H_BUSY); /* force clear */ + BT_STATE_CHANGE(BT_STATE_WRITE_BYTES, + SI_SM_CALL_WITHOUT_DELAY); + + case BT_STATE_WRITE_BYTES: + if (status & BT_H_BUSY) + BT_CONTROL(BT_H_BUSY); /* clear */ + BT_CONTROL(BT_CLR_WR_PTR); + write_all_bytes(bt); + BT_CONTROL(BT_H2B_ATN); /* can clear too fast to catch */ + BT_STATE_CHANGE(BT_STATE_WRITE_CONSUME, + SI_SM_CALL_WITHOUT_DELAY); + + case BT_STATE_WRITE_CONSUME: + if (status & (BT_B_BUSY | BT_H2B_ATN)) + BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY); + BT_STATE_CHANGE(BT_STATE_READ_WAIT, + SI_SM_CALL_WITHOUT_DELAY); + + /* Spinning hard can suppress B2H_ATN and force a timeout */ + + case BT_STATE_READ_WAIT: + if (!(status & BT_B2H_ATN)) + BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY); + BT_CONTROL(BT_H_BUSY); /* set */ + + /* Uncached, ordered writes should just proceeed serially but + some BMCs don't clear B2H_ATN with one hit. Fast-path a + workaround without too much penalty to the general case. */ + + BT_CONTROL(BT_B2H_ATN); /* clear it to ACK the BMC */ + BT_STATE_CHANGE(BT_STATE_CLEAR_B2H, + SI_SM_CALL_WITHOUT_DELAY); + + case BT_STATE_CLEAR_B2H: + if (status & BT_B2H_ATN) { /* keep hitting it */ + BT_CONTROL(BT_B2H_ATN); + BT_SI_SM_RETURN(SI_SM_CALL_WITH_DELAY); + } + BT_STATE_CHANGE(BT_STATE_READ_BYTES, + SI_SM_CALL_WITHOUT_DELAY); + + case BT_STATE_READ_BYTES: + if (!(status & BT_H_BUSY)) /* check in case of retry */ + BT_CONTROL(BT_H_BUSY); + BT_CONTROL(BT_CLR_RD_PTR); /* start of BMC2HOST buffer */ + i = read_all_bytes(bt); /* true == packet seq match */ + BT_CONTROL(BT_H_BUSY); /* NOW clear */ + if (!i) /* Not my message */ + BT_STATE_CHANGE(BT_STATE_READ_WAIT, + SI_SM_CALL_WITHOUT_DELAY); + bt->state = bt->complete; + return bt->state == BT_STATE_IDLE ? /* where to next? */ + SI_SM_TRANSACTION_COMPLETE : /* normal */ + SI_SM_CALL_WITHOUT_DELAY; /* Startup magic */ + + case BT_STATE_LONG_BUSY: /* For example: after FW update */ + if (!(status & BT_B_BUSY)) { + reset_flags(bt); /* next state is now IDLE */ + bt_init_data(bt, bt->io); + } + return SI_SM_CALL_WITH_DELAY; /* No repeat printing */ + + case BT_STATE_RESET1: + reset_flags(bt); + drain_BMC2HOST(bt); + BT_STATE_CHANGE(BT_STATE_RESET2, + SI_SM_CALL_WITH_DELAY); + + case BT_STATE_RESET2: /* Send a soft reset */ + BT_CONTROL(BT_CLR_WR_PTR); + HOST2BMC(3); /* number of bytes following */ + HOST2BMC(0x18); /* NetFn/LUN == Application, LUN 0 */ + HOST2BMC(42); /* Sequence number */ + HOST2BMC(3); /* Cmd == Soft reset */ + BT_CONTROL(BT_H2B_ATN); + bt->timeout = BT_RESET_DELAY * 1000000; + BT_STATE_CHANGE(BT_STATE_RESET3, + SI_SM_CALL_WITH_DELAY); + + case BT_STATE_RESET3: /* Hold off everything for a bit */ + if (bt->timeout > 0) + return SI_SM_CALL_WITH_DELAY; + drain_BMC2HOST(bt); + BT_STATE_CHANGE(BT_STATE_RESTART, + SI_SM_CALL_WITH_DELAY); + + case BT_STATE_RESTART: /* don't reset retries or seq! */ + bt->read_count = 0; + bt->nonzero_status = 0; + bt->timeout = bt->BT_CAP_req2rsp; + BT_STATE_CHANGE(BT_STATE_XACTION_START, + SI_SM_CALL_WITH_DELAY); + + /* Get BT Capabilities, using timing of upper level state machine. + Set outreqs to prevent infinite loop on timeout. */ + case BT_STATE_CAPABILITIES_BEGIN: + bt->BT_CAP_outreqs = 1; + { + unsigned char GetBT_CAP[] = { 0x18, 0x36 }; + bt->state = BT_STATE_IDLE; + bt_start_transaction(bt, GetBT_CAP, sizeof(GetBT_CAP)); + } + bt->complete = BT_STATE_CAPABILITIES_END; + BT_STATE_CHANGE(BT_STATE_XACTION_START, + SI_SM_CALL_WITH_DELAY); + + case BT_STATE_CAPABILITIES_END: + i = bt_get_result(bt, BT_CAP, sizeof(BT_CAP)); + bt_init_data(bt, bt->io); + if ((i == 8) && !BT_CAP[2]) { + bt->BT_CAP_outreqs = BT_CAP[3]; + bt->BT_CAP_req2rsp = BT_CAP[6] * 1000000; + bt->BT_CAP_retries = BT_CAP[7]; + } else + printk(KERN_WARNING "IPMI BT: using default values\n"); + if (!bt->BT_CAP_outreqs) + bt->BT_CAP_outreqs = 1; + printk(KERN_WARNING "IPMI BT: req2rsp=%ld secs retries=%d\n", + bt->BT_CAP_req2rsp / 1000000L, bt->BT_CAP_retries); + bt->timeout = bt->BT_CAP_req2rsp; + return SI_SM_CALL_WITHOUT_DELAY; + + default: /* should never occur */ + return error_recovery(bt, + status, + IPMI_ERR_UNSPECIFIED); + } + return SI_SM_CALL_WITH_DELAY; +} + +static int bt_detect(struct si_sm_data *bt) +{ + /* It's impossible for the BT status and interrupt registers to be + all 1's, (assuming a properly functioning, self-initialized BMC) + but that's what you get from reading a bogus address, so we + test that first. The calling routine uses negative logic. */ + + if ((BT_STATUS == 0xFF) && (BT_INTMASK_R == 0xFF)) + return 1; + reset_flags(bt); + return 0; +} + +static void bt_cleanup(struct si_sm_data *bt) +{ +} + +static int bt_size(void) +{ + return sizeof(struct si_sm_data); +} + +struct si_sm_handlers bt_smi_handlers = +{ + .init_data = bt_init_data, + .start_transaction = bt_start_transaction, + .get_result = bt_get_result, + .event = bt_event, + .detect = bt_detect, + .cleanup = bt_cleanup, + .size = bt_size, +}; diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.c new file mode 100644 index 0000000..c1b8228 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_kcs_sm.c @@ -0,0 +1,521 @@ +/* + * ipmi_kcs_sm.c + * + * State machine for handling IPMI KCS interfaces. + * + * Author: MontaVista Software, Inc. + * Corey Minyard + * source@mvista.com + * + * Copyright 2002 MontaVista Software Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This state machine is taken from the state machine in the IPMI spec, + * pretty much verbatim. If you have questions about the states, see + * that document. + */ + +#include /* For printk. */ +#include +#include +#include +#include +#include /* for completion codes */ +#include "ipmi_si_sm.h" + +/* kcs_debug is a bit-field + * KCS_DEBUG_ENABLE - turned on for now + * KCS_DEBUG_MSG - commands and their responses + * KCS_DEBUG_STATES - state machine + */ +#define KCS_DEBUG_STATES 4 +#define KCS_DEBUG_MSG 2 +#define KCS_DEBUG_ENABLE 1 + +static int kcs_debug; +module_param(kcs_debug, int, 0644); +MODULE_PARM_DESC(kcs_debug, "debug bitmask, 1=enable, 2=messages, 4=states"); + +/* The states the KCS driver may be in. */ +enum kcs_states { + KCS_IDLE, /* The KCS interface is currently + doing nothing. */ + KCS_START_OP, /* We are starting an operation. The + data is in the output buffer, but + nothing has been done to the + interface yet. This was added to + the state machine in the spec to + wait for the initial IBF. */ + KCS_WAIT_WRITE_START, /* We have written a write cmd to the + interface. */ + KCS_WAIT_WRITE, /* We are writing bytes to the + interface. */ + KCS_WAIT_WRITE_END, /* We have written the write end cmd + to the interface, and still need to + write the last byte. */ + KCS_WAIT_READ, /* We are waiting to read data from + the interface. */ + KCS_ERROR0, /* State to transition to the error + handler, this was added to the + state machine in the spec to be + sure IBF was there. */ + KCS_ERROR1, /* First stage error handler, wait for + the interface to respond. */ + KCS_ERROR2, /* The abort cmd has been written, + wait for the interface to + respond. */ + KCS_ERROR3, /* We wrote some data to the + interface, wait for it to switch to + read mode. */ + KCS_HOSED /* The hardware failed to follow the + state machine. */ +}; + +#define MAX_KCS_READ_SIZE IPMI_MAX_MSG_LENGTH +#define MAX_KCS_WRITE_SIZE IPMI_MAX_MSG_LENGTH + +/* Timeouts in microseconds. */ +#define IBF_RETRY_TIMEOUT 1000000 +#define OBF_RETRY_TIMEOUT 1000000 +#define MAX_ERROR_RETRIES 10 +#define ERROR0_OBF_WAIT_JIFFIES (2*HZ) + +struct si_sm_data +{ + enum kcs_states state; + struct si_sm_io *io; + unsigned char write_data[MAX_KCS_WRITE_SIZE]; + int write_pos; + int write_count; + int orig_write_count; + unsigned char read_data[MAX_KCS_READ_SIZE]; + int read_pos; + int truncated; + + unsigned int error_retries; + long ibf_timeout; + long obf_timeout; + unsigned long error0_timeout; +}; + +static unsigned int init_kcs_data(struct si_sm_data *kcs, + struct si_sm_io *io) +{ + kcs->state = KCS_IDLE; + kcs->io = io; + kcs->write_pos = 0; + kcs->write_count = 0; + kcs->orig_write_count = 0; + kcs->read_pos = 0; + kcs->error_retries = 0; + kcs->truncated = 0; + kcs->ibf_timeout = IBF_RETRY_TIMEOUT; + kcs->obf_timeout = OBF_RETRY_TIMEOUT; + + /* Reserve 2 I/O bytes. */ + return 2; +} + +static inline unsigned char read_status(struct si_sm_data *kcs) +{ + return kcs->io->inputb(kcs->io, 1); +} + +static inline unsigned char read_data(struct si_sm_data *kcs) +{ + return kcs->io->inputb(kcs->io, 0); +} + +static inline void write_cmd(struct si_sm_data *kcs, unsigned char data) +{ + kcs->io->outputb(kcs->io, 1, data); +} + +static inline void write_data(struct si_sm_data *kcs, unsigned char data) +{ + kcs->io->outputb(kcs->io, 0, data); +} + +/* Control codes. */ +#define KCS_GET_STATUS_ABORT 0x60 +#define KCS_WRITE_START 0x61 +#define KCS_WRITE_END 0x62 +#define KCS_READ_BYTE 0x68 + +/* Status bits. */ +#define GET_STATUS_STATE(status) (((status) >> 6) & 0x03) +#define KCS_IDLE_STATE 0 +#define KCS_READ_STATE 1 +#define KCS_WRITE_STATE 2 +#define KCS_ERROR_STATE 3 +#define GET_STATUS_ATN(status) ((status) & 0x04) +#define GET_STATUS_IBF(status) ((status) & 0x02) +#define GET_STATUS_OBF(status) ((status) & 0x01) + + +static inline void write_next_byte(struct si_sm_data *kcs) +{ + write_data(kcs, kcs->write_data[kcs->write_pos]); + (kcs->write_pos)++; + (kcs->write_count)--; +} + +static inline void start_error_recovery(struct si_sm_data *kcs, char *reason) +{ + (kcs->error_retries)++; + if (kcs->error_retries > MAX_ERROR_RETRIES) { + if (kcs_debug & KCS_DEBUG_ENABLE) + printk(KERN_DEBUG "ipmi_kcs_sm: kcs hosed: %s\n", reason); + kcs->state = KCS_HOSED; + } else { + kcs->error0_timeout = jiffies + ERROR0_OBF_WAIT_JIFFIES; + kcs->state = KCS_ERROR0; + } +} + +static inline void read_next_byte(struct si_sm_data *kcs) +{ + if (kcs->read_pos >= MAX_KCS_READ_SIZE) { + /* Throw the data away and mark it truncated. */ + read_data(kcs); + kcs->truncated = 1; + } else { + kcs->read_data[kcs->read_pos] = read_data(kcs); + (kcs->read_pos)++; + } + write_data(kcs, KCS_READ_BYTE); +} + +static inline int check_ibf(struct si_sm_data *kcs, unsigned char status, + long time) +{ + if (GET_STATUS_IBF(status)) { + kcs->ibf_timeout -= time; + if (kcs->ibf_timeout < 0) { + start_error_recovery(kcs, "IBF not ready in time"); + kcs->ibf_timeout = IBF_RETRY_TIMEOUT; + return 1; + } + return 0; + } + kcs->ibf_timeout = IBF_RETRY_TIMEOUT; + return 1; +} + +static inline int check_obf(struct si_sm_data *kcs, unsigned char status, + long time) +{ + if (!GET_STATUS_OBF(status)) { + kcs->obf_timeout -= time; + if (kcs->obf_timeout < 0) { + start_error_recovery(kcs, "OBF not ready in time"); + return 1; + } + return 0; + } + kcs->obf_timeout = OBF_RETRY_TIMEOUT; + return 1; +} + +static void clear_obf(struct si_sm_data *kcs, unsigned char status) +{ + if (GET_STATUS_OBF(status)) + read_data(kcs); +} + +static void restart_kcs_transaction(struct si_sm_data *kcs) +{ + kcs->write_count = kcs->orig_write_count; + kcs->write_pos = 0; + kcs->read_pos = 0; + kcs->state = KCS_WAIT_WRITE_START; + kcs->ibf_timeout = IBF_RETRY_TIMEOUT; + kcs->obf_timeout = OBF_RETRY_TIMEOUT; + write_cmd(kcs, KCS_WRITE_START); +} + +static int start_kcs_transaction(struct si_sm_data *kcs, unsigned char *data, + unsigned int size) +{ + unsigned int i; + + if (size < 2) + return IPMI_REQ_LEN_INVALID_ERR; + if (size > MAX_KCS_WRITE_SIZE) + return IPMI_REQ_LEN_EXCEEDED_ERR; + + if ((kcs->state != KCS_IDLE) && (kcs->state != KCS_HOSED)) + return IPMI_NOT_IN_MY_STATE_ERR; + + if (kcs_debug & KCS_DEBUG_MSG) { + printk(KERN_DEBUG "start_kcs_transaction -"); + for (i = 0; i < size; i ++) { + printk(" %02x", (unsigned char) (data [i])); + } + printk ("\n"); + } + kcs->error_retries = 0; + memcpy(kcs->write_data, data, size); + kcs->write_count = size; + kcs->orig_write_count = size; + kcs->write_pos = 0; + kcs->read_pos = 0; + kcs->state = KCS_START_OP; + kcs->ibf_timeout = IBF_RETRY_TIMEOUT; + kcs->obf_timeout = OBF_RETRY_TIMEOUT; + return 0; +} + +static int get_kcs_result(struct si_sm_data *kcs, unsigned char *data, + unsigned int length) +{ + if (length < kcs->read_pos) { + kcs->read_pos = length; + kcs->truncated = 1; + } + + memcpy(data, kcs->read_data, kcs->read_pos); + + if ((length >= 3) && (kcs->read_pos < 3)) { + /* Guarantee that we return at least 3 bytes, with an + error in the third byte if it is too short. */ + data[2] = IPMI_ERR_UNSPECIFIED; + kcs->read_pos = 3; + } + if (kcs->truncated) { + /* Report a truncated error. We might overwrite + another error, but that's too bad, the user needs + to know it was truncated. */ + data[2] = IPMI_ERR_MSG_TRUNCATED; + kcs->truncated = 0; + } + + return kcs->read_pos; +} + +/* This implements the state machine defined in the IPMI manual, see + that for details on how this works. Divide that flowchart into + sections delimited by "Wait for IBF" and this will become clear. */ +static enum si_sm_result kcs_event(struct si_sm_data *kcs, long time) +{ + unsigned char status; + unsigned char state; + + status = read_status(kcs); + + if (kcs_debug & KCS_DEBUG_STATES) + printk(KERN_DEBUG "KCS: State = %d, %x\n", kcs->state, status); + + /* All states wait for ibf, so just do it here. */ + if (!check_ibf(kcs, status, time)) + return SI_SM_CALL_WITH_DELAY; + + /* Just about everything looks at the KCS state, so grab that, too. */ + state = GET_STATUS_STATE(status); + + switch (kcs->state) { + case KCS_IDLE: + /* If there's and interrupt source, turn it off. */ + clear_obf(kcs, status); + + if (GET_STATUS_ATN(status)) + return SI_SM_ATTN; + else + return SI_SM_IDLE; + + case KCS_START_OP: + if (state != KCS_IDLE) { + start_error_recovery(kcs, + "State machine not idle at start"); + break; + } + + clear_obf(kcs, status); + write_cmd(kcs, KCS_WRITE_START); + kcs->state = KCS_WAIT_WRITE_START; + break; + + case KCS_WAIT_WRITE_START: + if (state != KCS_WRITE_STATE) { + start_error_recovery( + kcs, + "Not in write state at write start"); + break; + } + read_data(kcs); + if (kcs->write_count == 1) { + write_cmd(kcs, KCS_WRITE_END); + kcs->state = KCS_WAIT_WRITE_END; + } else { + write_next_byte(kcs); + kcs->state = KCS_WAIT_WRITE; + } + break; + + case KCS_WAIT_WRITE: + if (state != KCS_WRITE_STATE) { + start_error_recovery(kcs, + "Not in write state for write"); + break; + } + clear_obf(kcs, status); + if (kcs->write_count == 1) { + write_cmd(kcs, KCS_WRITE_END); + kcs->state = KCS_WAIT_WRITE_END; + } else { + write_next_byte(kcs); + } + break; + + case KCS_WAIT_WRITE_END: + if (state != KCS_WRITE_STATE) { + start_error_recovery(kcs, + "Not in write state for write end"); + break; + } + clear_obf(kcs, status); + write_next_byte(kcs); + kcs->state = KCS_WAIT_READ; + break; + + case KCS_WAIT_READ: + if ((state != KCS_READ_STATE) && (state != KCS_IDLE_STATE)) { + start_error_recovery( + kcs, + "Not in read or idle in read state"); + break; + } + + if (state == KCS_READ_STATE) { + if (!check_obf(kcs, status, time)) + return SI_SM_CALL_WITH_DELAY; + read_next_byte(kcs); + } else { + /* We don't implement this exactly like the state + machine in the spec. Some broken hardware + does not write the final dummy byte to the + read register. Thus obf will never go high + here. We just go straight to idle, and we + handle clearing out obf in idle state if it + happens to come in. */ + clear_obf(kcs, status); + kcs->orig_write_count = 0; + kcs->state = KCS_IDLE; + return SI_SM_TRANSACTION_COMPLETE; + } + break; + + case KCS_ERROR0: + clear_obf(kcs, status); + status = read_status(kcs); + if (GET_STATUS_OBF(status)) /* controller isn't responding */ + if (time_before(jiffies, kcs->error0_timeout)) + return SI_SM_CALL_WITH_TICK_DELAY; + write_cmd(kcs, KCS_GET_STATUS_ABORT); + kcs->state = KCS_ERROR1; + break; + + case KCS_ERROR1: + clear_obf(kcs, status); + write_data(kcs, 0); + kcs->state = KCS_ERROR2; + break; + + case KCS_ERROR2: + if (state != KCS_READ_STATE) { + start_error_recovery(kcs, + "Not in read state for error2"); + break; + } + if (!check_obf(kcs, status, time)) + return SI_SM_CALL_WITH_DELAY; + + clear_obf(kcs, status); + write_data(kcs, KCS_READ_BYTE); + kcs->state = KCS_ERROR3; + break; + + case KCS_ERROR3: + if (state != KCS_IDLE_STATE) { + start_error_recovery(kcs, + "Not in idle state for error3"); + break; + } + + if (!check_obf(kcs, status, time)) + return SI_SM_CALL_WITH_DELAY; + + clear_obf(kcs, status); + if (kcs->orig_write_count) { + restart_kcs_transaction(kcs); + } else { + kcs->state = KCS_IDLE; + return SI_SM_TRANSACTION_COMPLETE; + } + break; + + case KCS_HOSED: + break; + } + + if (kcs->state == KCS_HOSED) { + init_kcs_data(kcs, kcs->io); + return SI_SM_HOSED; + } + + return SI_SM_CALL_WITHOUT_DELAY; +} + +static int kcs_size(void) +{ + return sizeof(struct si_sm_data); +} + +static int kcs_detect(struct si_sm_data *kcs) +{ + /* It's impossible for the KCS status register to be all 1's, + (assuming a properly functioning, self-initialized BMC) + but that's what you get from reading a bogus address, so we + test that first. */ + if (read_status(kcs) == 0xff) + return 1; + + return 0; +} + +static void kcs_cleanup(struct si_sm_data *kcs) +{ +} + +struct si_sm_handlers kcs_smi_handlers = +{ + .init_data = init_kcs_data, + .start_transaction = start_kcs_transaction, + .get_result = get_kcs_result, + .event = kcs_event, + .detect = kcs_detect, + .cleanup = kcs_cleanup, + .size = kcs_size, +}; diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.c new file mode 100644 index 0000000..7b4c607 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_si_intf.c @@ -0,0 +1,3213 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +/* + * ipmi_si.c + * + * The interface to the IPMI driver for the system interfaces (KCS, SMIC, + * BT). + * + * Author: MontaVista Software, Inc. + * Corey Minyard + * source@mvista.com + * + * Copyright 2002 MontaVista Software Inc. + * Copyright 2006 IBM Corp., Christian Krafft + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * This file holds the "policy" for the interface to the SMI state + * machine. It does the configuration, handles timers and interrupts, + * and drives the real SMI state machine. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ipmi_si_sm.h" +#include +#include +#include +#include + +#ifdef CONFIG_PPC_OF +#include +#include +#endif + +#if defined(__VMKLNX__) +#include "kcompat.h" +#define IPMI_DRIVER_VERSION "39.2.0.1-1vmw" +#endif /* #if defined(__VMKLNX__) */ + +#define PFX "ipmi_si: " + +/* Measure times between events in the driver. */ +#undef DEBUG_TIMING + +/* Call every 10 ms. */ +#define SI_TIMEOUT_TIME_USEC 10000 +#define SI_USEC_PER_JIFFY (1000000/HZ) +#define SI_TIMEOUT_JIFFIES (SI_TIMEOUT_TIME_USEC/SI_USEC_PER_JIFFY) +#define SI_SHORT_TIMEOUT_USEC 250 /* .25ms when the SM request a + short timeout */ + +/* Bit for BMC global enables. */ +#define IPMI_BMC_RCV_MSG_INTR 0x01 +#define IPMI_BMC_EVT_MSG_INTR 0x02 +#define IPMI_BMC_EVT_MSG_BUFF 0x04 +#define IPMI_BMC_SYS_LOG 0x08 + +enum si_intf_state { + SI_NORMAL, + SI_GETTING_FLAGS, + SI_GETTING_EVENTS, + SI_CLEARING_FLAGS, + SI_CLEARING_FLAGS_THEN_SET_IRQ, + SI_GETTING_MESSAGES, + SI_ENABLE_INTERRUPTS1, + SI_ENABLE_INTERRUPTS2, + SI_DISABLE_INTERRUPTS1, + SI_DISABLE_INTERRUPTS2 + /* FIXME - add watchdog stuff. */ +}; + +/* Some BT-specific defines we need here. */ +#define IPMI_BT_INTMASK_REG 2 +#define IPMI_BT_INTMASK_CLEAR_IRQ_BIT 2 +#define IPMI_BT_INTMASK_ENABLE_IRQ_BIT 1 + +enum si_type { + SI_KCS, SI_SMIC, SI_BT +}; +static char *si_to_str[] = { "kcs", "smic", "bt" }; + +#define DEVICE_NAME "ipmi_si" + +static struct device_driver ipmi_driver = +{ +#if defined(__VMKLNX__) + .owner = THIS_MODULE, +#endif + .name = DEVICE_NAME, + .bus = &platform_bus_type +}; + +struct smi_info +{ + int intf_num; + ipmi_smi_t intf; + struct si_sm_data *si_sm; + struct si_sm_handlers *handlers; + enum si_type si_type; + spinlock_t si_lock; + spinlock_t msg_lock; + struct list_head xmit_msgs; + struct list_head hp_xmit_msgs; + struct ipmi_smi_msg *curr_msg; + enum si_intf_state si_state; + + /* Used to handle the various types of I/O that can occur with + IPMI */ + struct si_sm_io io; + int (*io_setup)(struct smi_info *info); + void (*io_cleanup)(struct smi_info *info); + int (*irq_setup)(struct smi_info *info); + void (*irq_cleanup)(struct smi_info *info); + unsigned int io_size; + char *addr_source; /* ACPI, PCI, SMBIOS, hardcode, default. */ + void (*addr_source_cleanup)(struct smi_info *info); + void *addr_source_data; + + /* Per-OEM handler, called from handle_flags(). + Returns 1 when handle_flags() needs to be re-run + or 0 indicating it set si_state itself. + */ + int (*oem_data_avail_handler)(struct smi_info *smi_info); + + /* Flags from the last GET_MSG_FLAGS command, used when an ATTN + is set to hold the flags until we are done handling everything + from the flags. */ +#define RECEIVE_MSG_AVAIL 0x01 +#define EVENT_MSG_BUFFER_FULL 0x02 +#define WDT_PRE_TIMEOUT_INT 0x08 +#define OEM0_DATA_AVAIL 0x20 +#define OEM1_DATA_AVAIL 0x40 +#define OEM2_DATA_AVAIL 0x80 +#define OEM_DATA_AVAIL (OEM0_DATA_AVAIL | \ + OEM1_DATA_AVAIL | \ + OEM2_DATA_AVAIL) + unsigned char msg_flags; + + /* If set to true, this will request events the next time the + state machine is idle. */ + atomic_t req_events; + + /* If true, run the state machine to completion on every send + call. Generally used after a panic to make sure stuff goes + out. */ + int run_to_completion; + + /* The I/O port of an SI interface. */ + int port; + + /* The space between start addresses of the two ports. For + instance, if the first port is 0xca2 and the spacing is 4, then + the second port is 0xca6. */ + unsigned int spacing; + + /* zero if no irq; */ + int irq; + + /* The timer for this si. */ + struct timer_list si_timer; + + /* The time (in jiffies) the last timeout occurred at. */ + unsigned long last_timeout_jiffies; + + /* Used to gracefully stop the timer without race conditions. */ + atomic_t stop_operation; + + /* The driver will disable interrupts when it gets into a + situation where it cannot handle messages due to lack of + memory. Once that situation clears up, it will re-enable + interrupts. */ + int interrupt_disabled; + + /* From the get device id response... */ + struct ipmi_device_id device_id; + + /* Driver model stuff. */ + struct device *dev; + struct platform_device *pdev; + + /* True if we allocated the device, false if it came from + * someplace else (like PCI). */ + int dev_registered; + + /* Slave address, could be reported from DMI. */ + unsigned char slave_addr; + + /* Counters and things for the proc filesystem. */ + spinlock_t count_lock; + unsigned long short_timeouts; + unsigned long long_timeouts; + unsigned long timeout_restarts; + unsigned long idles; + unsigned long interrupts; + unsigned long attentions; + unsigned long flag_fetches; + unsigned long hosed_count; + unsigned long complete_transactions; + unsigned long events; + unsigned long watchdog_pretimeouts; + unsigned long incoming_messages; + + struct task_struct *thread; + + struct list_head link; +#if defined(__VMKLNX__) + atomic_t pendingRequests; + vmk_atomic64 vmkEvent; +#endif +}; + +#define SI_MAX_PARMS 4 + +static int force_kipmid[SI_MAX_PARMS]; +static int num_force_kipmid; + +static int unload_when_empty = 1; + +static int try_smi_init(struct smi_info *smi); +static void cleanup_one_si(struct smi_info *to_clean); + +static ATOMIC_NOTIFIER_HEAD(xaction_notifier_list); +static int register_xaction_notifier(struct notifier_block * nb) +{ + return atomic_notifier_chain_register(&xaction_notifier_list, nb); +} + +static void deliver_recv_msg(struct smi_info *smi_info, + struct ipmi_smi_msg *msg) +{ + /* Deliver the message to the upper layer with the lock + released. */ + spin_unlock(&(smi_info->si_lock)); + ipmi_smi_msg_received(smi_info->intf, msg); + spin_lock(&(smi_info->si_lock)); +} + +static void return_hosed_msg(struct smi_info *smi_info, int cCode) +{ + struct ipmi_smi_msg *msg = smi_info->curr_msg; +#if defined(__VMKLNX__) + if (msg->tagged) { + msg->tagged = 0; + atomic_dec(&smi_info->pendingRequests); + } +#endif + + if (cCode < 0 || cCode > IPMI_ERR_UNSPECIFIED) + cCode = IPMI_ERR_UNSPECIFIED; + /* else use it as is */ + + /* Make it a reponse */ + msg->rsp[0] = msg->data[0] | 4; + msg->rsp[1] = msg->data[1]; + msg->rsp[2] = cCode; + msg->rsp_size = 3; + + smi_info->curr_msg = NULL; + deliver_recv_msg(smi_info, msg); +} + +static enum si_sm_result start_next_msg(struct smi_info *smi_info) +{ + int rv; + struct list_head *entry = NULL; +#ifdef DEBUG_TIMING + struct timeval t; +#endif + + /* No need to save flags, we aleady have interrupts off and we + already hold the SMI lock. */ + spin_lock(&(smi_info->msg_lock)); + + /* Pick the high priority queue first. */ + if (!list_empty(&(smi_info->hp_xmit_msgs))) { + entry = smi_info->hp_xmit_msgs.next; + } else if (!list_empty(&(smi_info->xmit_msgs))) { + entry = smi_info->xmit_msgs.next; + } + + if (!entry) { + smi_info->curr_msg = NULL; + rv = SI_SM_IDLE; + } else { + int err; + + list_del(entry); + smi_info->curr_msg = list_entry(entry, + struct ipmi_smi_msg, + link); +#ifdef DEBUG_TIMING + do_gettimeofday(&t); + printk("**Start2: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + err = atomic_notifier_call_chain(&xaction_notifier_list, + 0, smi_info); + if (err & NOTIFY_STOP_MASK) { + rv = SI_SM_CALL_WITHOUT_DELAY; + goto out; + } + err = smi_info->handlers->start_transaction( + smi_info->si_sm, + smi_info->curr_msg->data, + smi_info->curr_msg->data_size); + if (err) { + return_hosed_msg(smi_info, err); + } + + rv = SI_SM_CALL_WITHOUT_DELAY; + } + out: + spin_unlock(&(smi_info->msg_lock)); + + return rv; +} + +static void start_enable_irq(struct smi_info *smi_info) +{ + unsigned char msg[2]; + + /* If we are enabling interrupts, we have to tell the + BMC to use them. */ + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD; + + smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); + smi_info->si_state = SI_ENABLE_INTERRUPTS1; +} + +static void start_disable_irq(struct smi_info *smi_info) +{ + unsigned char msg[2]; + + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_GET_BMC_GLOBAL_ENABLES_CMD; + + smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); + smi_info->si_state = SI_DISABLE_INTERRUPTS1; +} + +static void start_clear_flags(struct smi_info *smi_info) +{ + unsigned char msg[3]; + + /* Make sure the watchdog pre-timeout flag is not set at startup. */ + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_CLEAR_MSG_FLAGS_CMD; + msg[2] = WDT_PRE_TIMEOUT_INT; + + smi_info->handlers->start_transaction(smi_info->si_sm, msg, 3); + smi_info->si_state = SI_CLEARING_FLAGS; +} + +/* When we have a situtaion where we run out of memory and cannot + allocate messages, we just leave them in the BMC and run the system + polled until we can allocate some memory. Once we have some + memory, we will re-enable the interrupt. */ +static inline void disable_si_irq(struct smi_info *smi_info) +{ + if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { + start_disable_irq(smi_info); + smi_info->interrupt_disabled = 1; + } +} + +static inline void enable_si_irq(struct smi_info *smi_info) +{ + if ((smi_info->irq) && (smi_info->interrupt_disabled)) { + start_enable_irq(smi_info); + smi_info->interrupt_disabled = 0; + } +} + +static void handle_flags(struct smi_info *smi_info) +{ + retry: + if (smi_info->msg_flags & WDT_PRE_TIMEOUT_INT) { + /* Watchdog pre-timeout */ + spin_lock(&smi_info->count_lock); + smi_info->watchdog_pretimeouts++; + spin_unlock(&smi_info->count_lock); + + start_clear_flags(smi_info); + smi_info->msg_flags &= ~WDT_PRE_TIMEOUT_INT; + spin_unlock(&(smi_info->si_lock)); + ipmi_smi_watchdog_pretimeout(smi_info->intf); + spin_lock(&(smi_info->si_lock)); + } else if (smi_info->msg_flags & RECEIVE_MSG_AVAIL) { + /* Messages available. */ + smi_info->curr_msg = ipmi_alloc_smi_msg(); + if (!smi_info->curr_msg) { + disable_si_irq(smi_info); + smi_info->si_state = SI_NORMAL; + return; + } + enable_si_irq(smi_info); + + smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + smi_info->curr_msg->data[1] = IPMI_GET_MSG_CMD; + smi_info->curr_msg->data_size = 2; + + smi_info->handlers->start_transaction( + smi_info->si_sm, + smi_info->curr_msg->data, + smi_info->curr_msg->data_size); + smi_info->si_state = SI_GETTING_MESSAGES; + } else if (smi_info->msg_flags & EVENT_MSG_BUFFER_FULL) { + /* Events available. */ + smi_info->curr_msg = ipmi_alloc_smi_msg(); + if (!smi_info->curr_msg) { + disable_si_irq(smi_info); + smi_info->si_state = SI_NORMAL; + return; + } + enable_si_irq(smi_info); + + smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; + smi_info->curr_msg->data_size = 2; + + smi_info->handlers->start_transaction( + smi_info->si_sm, + smi_info->curr_msg->data, + smi_info->curr_msg->data_size); + smi_info->si_state = SI_GETTING_EVENTS; + } else if (smi_info->msg_flags & OEM_DATA_AVAIL && + smi_info->oem_data_avail_handler) { + if (smi_info->oem_data_avail_handler(smi_info)) + goto retry; + } else { + smi_info->si_state = SI_NORMAL; + } +} + +static void handle_transaction_done(struct smi_info *smi_info) +{ + struct ipmi_smi_msg *msg; +#ifdef DEBUG_TIMING + struct timeval t; + + do_gettimeofday(&t); + printk("**Done: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + switch (smi_info->si_state) { + case SI_NORMAL: + if (!smi_info->curr_msg) + break; + + smi_info->curr_msg->rsp_size + = smi_info->handlers->get_result( + smi_info->si_sm, + smi_info->curr_msg->rsp, + IPMI_MAX_MSG_LENGTH); + + /* Do this here becase deliver_recv_msg() releases the + lock, and a new message can be put in during the + time the lock is released. */ + msg = smi_info->curr_msg; +#if defined(__VMKLNX__) + if (msg->tagged) { + msg->tagged = 0; + atomic_dec(&smi_info->pendingRequests); + } +#endif + smi_info->curr_msg = NULL; + deliver_recv_msg(smi_info, msg); + break; + + case SI_GETTING_FLAGS: + { + unsigned char msg[4]; + unsigned int len; + + /* We got the flags from the SMI, now handle them. */ + len = smi_info->handlers->get_result(smi_info->si_sm, msg, 4); + if (msg[2] != 0) { + /* Error fetching flags, just give up for + now. */ + smi_info->si_state = SI_NORMAL; + } else if (len < 4) { + /* Hmm, no flags. That's technically illegal, but + don't use uninitialized data. */ + smi_info->si_state = SI_NORMAL; + } else { + smi_info->msg_flags = msg[3]; + handle_flags(smi_info); + } + break; + } + + case SI_CLEARING_FLAGS: + case SI_CLEARING_FLAGS_THEN_SET_IRQ: + { + unsigned char msg[3]; + + /* We cleared the flags. */ + smi_info->handlers->get_result(smi_info->si_sm, msg, 3); + if (msg[2] != 0) { + /* Error clearing flags */ + printk(KERN_WARNING + "ipmi_si: Error clearing flags: %2.2x\n", + msg[2]); + } + if (smi_info->si_state == SI_CLEARING_FLAGS_THEN_SET_IRQ) + start_enable_irq(smi_info); + else + smi_info->si_state = SI_NORMAL; + break; + } + + case SI_GETTING_EVENTS: + { + smi_info->curr_msg->rsp_size + = smi_info->handlers->get_result( + smi_info->si_sm, + smi_info->curr_msg->rsp, + IPMI_MAX_MSG_LENGTH); + + /* Do this here becase deliver_recv_msg() releases the + lock, and a new message can be put in during the + time the lock is released. */ + msg = smi_info->curr_msg; +#if defined(__VMKLNX__) + if (msg->tagged) { + msg->tagged = 0; + atomic_dec(&smi_info->pendingRequests); + } +#endif + smi_info->curr_msg = NULL; + if (msg->rsp[2] != 0) { + /* Error getting event, probably done. */ + msg->done(msg); + + /* Take off the event flag. */ + smi_info->msg_flags &= ~EVENT_MSG_BUFFER_FULL; + handle_flags(smi_info); + } else { + spin_lock(&smi_info->count_lock); + smi_info->events++; + spin_unlock(&smi_info->count_lock); + + /* Do this before we deliver the message + because delivering the message releases the + lock and something else can mess with the + state. */ + handle_flags(smi_info); + + deliver_recv_msg(smi_info, msg); + } + break; + } + + case SI_GETTING_MESSAGES: + { + smi_info->curr_msg->rsp_size + = smi_info->handlers->get_result( + smi_info->si_sm, + smi_info->curr_msg->rsp, + IPMI_MAX_MSG_LENGTH); + + /* Do this here becase deliver_recv_msg() releases the + lock, and a new message can be put in during the + time the lock is released. */ + msg = smi_info->curr_msg; +#if defined(__VMKLNX__) + if (msg->tagged) { + msg->tagged = 0; + atomic_dec(&smi_info->pendingRequests); + } +#endif + smi_info->curr_msg = NULL; + if (msg->rsp[2] != 0) { + /* Error getting event, probably done. */ + msg->done(msg); + + /* Take off the msg flag. */ + smi_info->msg_flags &= ~RECEIVE_MSG_AVAIL; + handle_flags(smi_info); + } else { + spin_lock(&smi_info->count_lock); + smi_info->incoming_messages++; + spin_unlock(&smi_info->count_lock); + + /* Do this before we deliver the message + because delivering the message releases the + lock and something else can mess with the + state. */ + handle_flags(smi_info); + + deliver_recv_msg(smi_info, msg); + } + break; + } + + case SI_ENABLE_INTERRUPTS1: + { + unsigned char msg[4]; + + /* We got the flags from the SMI, now handle them. */ + smi_info->handlers->get_result(smi_info->si_sm, msg, 4); + if (msg[2] != 0) { + printk(KERN_WARNING + "ipmi_si: Could not enable interrupts" + ", failed get, using polled mode.\n"); + smi_info->si_state = SI_NORMAL; + } else { + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD; + msg[2] = (msg[3] | + IPMI_BMC_RCV_MSG_INTR | + IPMI_BMC_EVT_MSG_INTR); + smi_info->handlers->start_transaction( + smi_info->si_sm, msg, 3); + smi_info->si_state = SI_ENABLE_INTERRUPTS2; + } + break; + } + + case SI_ENABLE_INTERRUPTS2: + { + unsigned char msg[4]; + + /* We got the flags from the SMI, now handle them. */ + smi_info->handlers->get_result(smi_info->si_sm, msg, 4); + if (msg[2] != 0) { + printk(KERN_WARNING + "ipmi_si: Could not enable interrupts" + ", failed set, using polled mode.\n"); + } + smi_info->si_state = SI_NORMAL; + break; + } + + case SI_DISABLE_INTERRUPTS1: + { + unsigned char msg[4]; + + /* We got the flags from the SMI, now handle them. */ + smi_info->handlers->get_result(smi_info->si_sm, msg, 4); + if (msg[2] != 0) { + printk(KERN_WARNING + "ipmi_si: Could not disable interrupts" + ", failed get.\n"); + smi_info->si_state = SI_NORMAL; + } else { + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_SET_BMC_GLOBAL_ENABLES_CMD; + msg[2] = (msg[3] & + ~(IPMI_BMC_RCV_MSG_INTR | + IPMI_BMC_EVT_MSG_INTR)); + smi_info->handlers->start_transaction( + smi_info->si_sm, msg, 3); + smi_info->si_state = SI_DISABLE_INTERRUPTS2; + } + break; + } + + case SI_DISABLE_INTERRUPTS2: + { + unsigned char msg[4]; + + /* We got the flags from the SMI, now handle them. */ + smi_info->handlers->get_result(smi_info->si_sm, msg, 4); + if (msg[2] != 0) { + printk(KERN_WARNING + "ipmi_si: Could not disable interrupts" + ", failed set.\n"); + } + smi_info->si_state = SI_NORMAL; + break; + } + } +} + +/* Called on timeouts and events. Timeouts should pass the elapsed + time, interrupts should pass in zero. Must be called with + si_lock held and interrupts disabled. */ +static enum si_sm_result smi_event_handler(struct smi_info *smi_info, + int time) +{ + enum si_sm_result si_sm_result; + + restart: + /* There used to be a loop here that waited a little while + (around 25us) before giving up. That turned out to be + pointless, the minimum delays I was seeing were in the 300us + range, which is far too long to wait in an interrupt. So + we just run until the state machine tells us something + happened or it needs a delay. */ + si_sm_result = smi_info->handlers->event(smi_info->si_sm, time); + time = 0; + while (si_sm_result == SI_SM_CALL_WITHOUT_DELAY) + { + si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); + } + + if (si_sm_result == SI_SM_TRANSACTION_COMPLETE) + { + spin_lock(&smi_info->count_lock); + smi_info->complete_transactions++; + spin_unlock(&smi_info->count_lock); + + handle_transaction_done(smi_info); + si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); + } + else if (si_sm_result == SI_SM_HOSED) + { + spin_lock(&smi_info->count_lock); + smi_info->hosed_count++; + spin_unlock(&smi_info->count_lock); + + /* Do the before return_hosed_msg, because that + releases the lock. */ + smi_info->si_state = SI_NORMAL; + if (smi_info->curr_msg != NULL) { + /* If we were handling a user message, format + a response to send to the upper layer to + tell it about the error. */ + return_hosed_msg(smi_info, IPMI_ERR_UNSPECIFIED); + } + si_sm_result = smi_info->handlers->event(smi_info->si_sm, 0); + } + + /* We prefer handling attn over new messages. */ + if (si_sm_result == SI_SM_ATTN) + { + unsigned char msg[2]; + + spin_lock(&smi_info->count_lock); + smi_info->attentions++; + spin_unlock(&smi_info->count_lock); + + /* Got a attn, send down a get message flags to see + what's causing it. It would be better to handle + this in the upper layer, but due to the way + interrupts work with the SMI, that's not really + possible. */ + msg[0] = (IPMI_NETFN_APP_REQUEST << 2); + msg[1] = IPMI_GET_MSG_FLAGS_CMD; + + smi_info->handlers->start_transaction( + smi_info->si_sm, msg, 2); + smi_info->si_state = SI_GETTING_FLAGS; + goto restart; + } + + /* If we are currently idle, try to start the next message. */ + if (si_sm_result == SI_SM_IDLE) { + spin_lock(&smi_info->count_lock); + smi_info->idles++; + spin_unlock(&smi_info->count_lock); + + si_sm_result = start_next_msg(smi_info); + if (si_sm_result != SI_SM_IDLE) + goto restart; + } + + if ((si_sm_result == SI_SM_IDLE) + && (atomic_read(&smi_info->req_events))) + { + /* We are idle and the upper layer requested that I fetch + events, so do so. */ + atomic_set(&smi_info->req_events, 0); + + smi_info->curr_msg = ipmi_alloc_smi_msg(); + if (!smi_info->curr_msg) + goto out; + + smi_info->curr_msg->data[0] = (IPMI_NETFN_APP_REQUEST << 2); + smi_info->curr_msg->data[1] = IPMI_READ_EVENT_MSG_BUFFER_CMD; + smi_info->curr_msg->data_size = 2; + + smi_info->handlers->start_transaction( + smi_info->si_sm, + smi_info->curr_msg->data, + smi_info->curr_msg->data_size); + smi_info->si_state = SI_GETTING_EVENTS; + goto restart; + } + out: + return si_sm_result; +} + +static void sender(void *send_info, + struct ipmi_smi_msg *msg, + int priority) +{ + struct smi_info *smi_info = send_info; + enum si_sm_result result; + unsigned long flags; +#ifdef DEBUG_TIMING + struct timeval t; +#endif + + if (atomic_read(&smi_info->stop_operation)) { + msg->rsp[0] = msg->data[0] | 4; + msg->rsp[1] = msg->data[1]; + msg->rsp[2] = IPMI_ERR_UNSPECIFIED; + msg->rsp_size = 3; + deliver_recv_msg(smi_info, msg); + return; + } + + spin_lock_irqsave(&(smi_info->msg_lock), flags); +#ifdef DEBUG_TIMING + do_gettimeofday(&t); + printk("**Enqueue: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + + if (smi_info->run_to_completion) { + /* If we are running to completion, then throw it in + the list and run transactions until everything is + clear. Priority doesn't matter here. */ + list_add_tail(&(msg->link), &(smi_info->xmit_msgs)); + + /* We have to release the msg lock and claim the smi + lock in this case, because of race conditions. */ + spin_unlock_irqrestore(&(smi_info->msg_lock), flags); + + spin_lock_irqsave(&(smi_info->si_lock), flags); + result = smi_event_handler(smi_info, 0); + while (result != SI_SM_IDLE) { + udelay(SI_SHORT_TIMEOUT_USEC); + result = smi_event_handler(smi_info, + SI_SHORT_TIMEOUT_USEC); + } + spin_unlock_irqrestore(&(smi_info->si_lock), flags); + return; + } else { +#if defined(__VMKLNX__) + msg->tagged = 1; + atomic_inc(&smi_info->pendingRequests); + vmk_WorldWakeup((vmk_WorldEventId *)&smi_info->vmkEvent); +#endif + if (priority > 0) { + list_add_tail(&(msg->link), &(smi_info->hp_xmit_msgs)); + } else { + list_add_tail(&(msg->link), &(smi_info->xmit_msgs)); + } + } + spin_unlock_irqrestore(&(smi_info->msg_lock), flags); + + spin_lock_irqsave(&(smi_info->si_lock), flags); + if ((smi_info->si_state == SI_NORMAL) + && (smi_info->curr_msg == NULL)) + { + start_next_msg(smi_info); + } + spin_unlock_irqrestore(&(smi_info->si_lock), flags); +} + +static void set_run_to_completion(void *send_info, int i_run_to_completion) +{ + struct smi_info *smi_info = send_info; + enum si_sm_result result; + unsigned long flags; + + spin_lock_irqsave(&(smi_info->si_lock), flags); + + smi_info->run_to_completion = i_run_to_completion; + if (i_run_to_completion) { + result = smi_event_handler(smi_info, 0); + while (result != SI_SM_IDLE) { + udelay(SI_SHORT_TIMEOUT_USEC); + result = smi_event_handler(smi_info, + SI_SHORT_TIMEOUT_USEC); + } + } + + spin_unlock_irqrestore(&(smi_info->si_lock), flags); +} + +static int ipmi_thread(void *data) +{ + struct smi_info *smi_info = data; + unsigned long flags; + enum si_sm_result smi_result; + + set_user_nice(current, 19); + while (!kthread_should_stop()) { + spin_lock_irqsave(&(smi_info->si_lock), flags); + smi_result = smi_event_handler(smi_info, 0); + spin_unlock_irqrestore(&(smi_info->si_lock), flags); + if (smi_result == SI_SM_CALL_WITHOUT_DELAY) { + /* do nothing */ + } +#if defined(__VMKLNX__) + else if(atomic_read(&smi_info->pendingRequests) != 0) { + vmk_WorldYield(); + } else { + vmk_Bool timedOut; + vmk_WorldTimedWait((vmk_WorldEventId *)&smi_info->vmkEvent, + NULL, VMK_WORLD_WAIT_MISC, 5000000, + &timedOut); + } +#else + else if (smi_result == SI_SM_CALL_WITH_DELAY) + schedule(); + else + schedule_timeout_interruptible(1); +#endif + } + return 0; +} + + +static void poll(void *send_info) +{ + struct smi_info *smi_info = send_info; + unsigned long flags; + + /* + * Make sure there is some delay in the poll loop so we can + * drive time forward and timeout things. + */ + udelay(10); + spin_lock_irqsave(&smi_info->si_lock, flags); + smi_event_handler(smi_info, 10); + spin_unlock_irqrestore(&smi_info->si_lock, flags); +} + +static void request_events(void *send_info) +{ + struct smi_info *smi_info = send_info; + + if (atomic_read(&smi_info->stop_operation)) + return; + + atomic_set(&smi_info->req_events, 1); +} + +static int initialized; + +static void smi_timeout(unsigned long data) +{ + struct smi_info *smi_info = (struct smi_info *) data; + enum si_sm_result smi_result; + unsigned long flags; + unsigned long jiffies_now; + long time_diff; +#ifdef DEBUG_TIMING + struct timeval t; +#endif + + spin_lock_irqsave(&(smi_info->si_lock), flags); +#ifdef DEBUG_TIMING + do_gettimeofday(&t); + printk("**Timer: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + jiffies_now = jiffies; + time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies) + * SI_USEC_PER_JIFFY); + smi_result = smi_event_handler(smi_info, time_diff); + + spin_unlock_irqrestore(&(smi_info->si_lock), flags); + + smi_info->last_timeout_jiffies = jiffies_now; + + if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { + /* Running with interrupts, only do long timeouts. */ + smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; + spin_lock_irqsave(&smi_info->count_lock, flags); + smi_info->long_timeouts++; + spin_unlock_irqrestore(&smi_info->count_lock, flags); + goto do_add_timer; + } + + /* If the state machine asks for a short delay, then shorten + the timer timeout. */ + if (smi_result == SI_SM_CALL_WITH_DELAY) { + spin_lock_irqsave(&smi_info->count_lock, flags); + smi_info->short_timeouts++; + spin_unlock_irqrestore(&smi_info->count_lock, flags); + smi_info->si_timer.expires = jiffies + 1; + } else { + spin_lock_irqsave(&smi_info->count_lock, flags); + smi_info->long_timeouts++; + spin_unlock_irqrestore(&smi_info->count_lock, flags); + smi_info->si_timer.expires = jiffies + SI_TIMEOUT_JIFFIES; + } + + do_add_timer: + add_timer(&(smi_info->si_timer)); +} + +#if defined(__VMKLNX__) +static irqreturn_t si_irq_handler(int irq, void *data, struct pt_regs * regs) +#else +static irqreturn_t si_irq_handler(int irq, void *data) +#endif /* #if defined(__VMKLNX__) */ +{ + struct smi_info *smi_info = data; + unsigned long flags; +#ifdef DEBUG_TIMING + struct timeval t; +#endif + + spin_lock_irqsave(&(smi_info->si_lock), flags); + + spin_lock(&smi_info->count_lock); + smi_info->interrupts++; + spin_unlock(&smi_info->count_lock); + +#ifdef DEBUG_TIMING + do_gettimeofday(&t); + printk("**Interrupt: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + smi_event_handler(smi_info, 0); + spin_unlock_irqrestore(&(smi_info->si_lock), flags); + return IRQ_HANDLED; +} + +#if defined(__VMKLNX__) +static irqreturn_t si_bt_irq_handler(int irq, void *data, struct pt_regs * regs) +#else +static irqreturn_t si_bt_irq_handler(int irq, void *data) +#endif /* #if defined(__VMKLNX__) */ +{ + struct smi_info *smi_info = data; + /* We need to clear the IRQ flag for the BT interface. */ + smi_info->io.outputb(&smi_info->io, IPMI_BT_INTMASK_REG, + IPMI_BT_INTMASK_CLEAR_IRQ_BIT + | IPMI_BT_INTMASK_ENABLE_IRQ_BIT); + +#if defined(__VMKLNX__) + return si_irq_handler(irq, data, NULL); +#else + return si_irq_handler(irq, data); +#endif /* #if defined(__VMKLNX__) */ +} + +static int smi_start_processing(void *send_info, + ipmi_smi_t intf) +{ + struct smi_info *new_smi = send_info; + int enable = 0; + + new_smi->intf = intf; + + /* Try to claim any interrupts. */ + if (new_smi->irq_setup) + new_smi->irq_setup(new_smi); + + /* Set up the timer that drives the interface. */ + setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); + new_smi->last_timeout_jiffies = jiffies; + mod_timer(&new_smi->si_timer, jiffies + SI_TIMEOUT_JIFFIES); + + /* + * Check if the user forcefully enabled the daemon. + */ + if (new_smi->intf_num < num_force_kipmid) + enable = force_kipmid[new_smi->intf_num]; + /* + * The BT interface is efficient enough to not need a thread, + * and there is no need for a thread if we have interrupts. + */ + else if ((new_smi->si_type != SI_BT) && (!new_smi->irq)) + enable = 1; + + if (enable) { + new_smi->thread = kthread_run(ipmi_thread, new_smi, + "kipmi%d", new_smi->intf_num); + if (IS_ERR(new_smi->thread)) { + printk(KERN_NOTICE "ipmi_si_intf: Could not start" + " kernel thread due to error %ld, only using" + " timers to drive the interface\n", + PTR_ERR(new_smi->thread)); + new_smi->thread = NULL; + } + } +#if defined(__VMKLNX__) + atomic_set(&new_smi->pendingRequests, 0); +#endif + + return 0; +} + +static void set_maintenance_mode(void *send_info, int enable) +{ + struct smi_info *smi_info = send_info; + + if (!enable) + atomic_set(&smi_info->req_events, 0); +} + +static struct ipmi_smi_handlers handlers = +{ + .owner = THIS_MODULE, + .start_processing = smi_start_processing, + .sender = sender, + .request_events = request_events, + .set_maintenance_mode = set_maintenance_mode, + .set_run_to_completion = set_run_to_completion, + .poll = poll, +}; + +/* There can be 4 IO ports passed in (with or without IRQs), 4 addresses, + a default IO port, and 1 ACPI/SPMI address. That sets SI_MAX_DRIVERS */ + +static LIST_HEAD(smi_infos); +static DEFINE_MUTEX(smi_infos_lock); +static int smi_num; /* Used to sequence the SMIs */ + +#define DEFAULT_REGSPACING 1 +#define DEFAULT_REGSIZE 1 + +static int si_trydefaults = 1; +static char *si_type[SI_MAX_PARMS]; +#define MAX_SI_TYPE_STR 30 +static char si_type_str[MAX_SI_TYPE_STR]; +static unsigned long addrs[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +/* for disabling compiler warnings */ +static int num_addrs; +#else +static unsigned int num_addrs; +#endif /* #if defined (__VMKLNX__) */ +static unsigned int ports[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_ports; +#else +static unsigned int num_ports; +#endif /* #if defined (__VMKLNX__) */ +static int irqs[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_irqs; +#else +static unsigned int num_irqs; +#endif /* #if defined (__VMKLNX__) */ +static int regspacings[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_regspacings; +#else +static unsigned int num_regspacings; +#endif /* #if defined (__VMKLNX__) */ +static int regsizes[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_regsizes; +#else +static unsigned int num_regsizes; +#endif /* #if defined (__VMKLNX__) */ +static int regshifts[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_regshifts; +#else +static unsigned int num_regshifts; +#endif /* #if defined (__VMKLNX__) */ +static int slave_addrs[SI_MAX_PARMS]; +#if defined (__VMKLNX__) +static int num_slave_addrs; +#else +static unsigned int num_slave_addrs; +#endif /* #if defined (__VMKLNX__) */ + +#define IPMI_IO_ADDR_SPACE 0 +#define IPMI_MEM_ADDR_SPACE 1 +static char *addr_space_to_str[] = { "i/o", "mem" }; + +static int hotmod_handler(const char *val, struct kernel_param *kp); + +module_param_call(hotmod, hotmod_handler, NULL, NULL, 0200); +MODULE_PARM_DESC(hotmod, "Add and remove interfaces. See" + " Documentation/IPMI.txt in the kernel sources for the" + " gory details."); + +module_param_named(trydefaults, si_trydefaults, bool, 0); +MODULE_PARM_DESC(trydefaults, "Setting this to 'false' will disable the" + " default scan of the KCS and SMIC interface at the standard" + " address"); +module_param_string(type, si_type_str, MAX_SI_TYPE_STR, 0); +MODULE_PARM_DESC(type, "Defines the type of each interface, each" + " interface separated by commas. The types are 'kcs'," + " 'smic', and 'bt'. For example si_type=kcs,bt will set" + " the first interface to kcs and the second to bt"); +module_param_array(addrs, ulong, &num_addrs, 0); +MODULE_PARM_DESC(addrs, "Sets the memory address of each interface, the" + " addresses separated by commas. Only use if an interface" + " is in memory. Otherwise, set it to zero or leave" + " it blank."); +module_param_array(ports, uint, &num_ports, 0); +MODULE_PARM_DESC(ports, "Sets the port address of each interface, the" + " addresses separated by commas. Only use if an interface" + " is a port. Otherwise, set it to zero or leave" + " it blank."); +module_param_array(irqs, int, &num_irqs, 0); +MODULE_PARM_DESC(irqs, "Sets the interrupt of each interface, the" + " addresses separated by commas. Only use if an interface" + " has an interrupt. Otherwise, set it to zero or leave" + " it blank."); +module_param_array(regspacings, int, &num_regspacings, 0); +MODULE_PARM_DESC(regspacings, "The number of bytes between the start address" + " and each successive register used by the interface. For" + " instance, if the start address is 0xca2 and the spacing" + " is 2, then the second address is at 0xca4. Defaults" + " to 1."); +module_param_array(regsizes, int, &num_regsizes, 0); +MODULE_PARM_DESC(regsizes, "The size of the specific IPMI register in bytes." + " This should generally be 1, 2, 4, or 8 for an 8-bit," + " 16-bit, 32-bit, or 64-bit register. Use this if you" + " the 8-bit IPMI register has to be read from a larger" + " register."); +module_param_array(regshifts, int, &num_regshifts, 0); +MODULE_PARM_DESC(regshifts, "The amount to shift the data read from the." + " IPMI register, in bits. For instance, if the data" + " is read from a 32-bit word and the IPMI data is in" + " bit 8-15, then the shift would be 8"); +module_param_array(slave_addrs, int, &num_slave_addrs, 0); +MODULE_PARM_DESC(slave_addrs, "Set the default IPMB slave address for" + " the controller. Normally this is 0x20, but can be" + " overridden by this parm. This is an array indexed" + " by interface number."); +module_param_array(force_kipmid, int, &num_force_kipmid, 0); +MODULE_PARM_DESC(force_kipmid, "Force the kipmi daemon to be enabled (1) or" + " disabled(0). Normally the IPMI driver auto-detects" + " this, but the value may be overridden by this parm."); +module_param(unload_when_empty, int, 0); +MODULE_PARM_DESC(unload_when_empty, "Unload the module if no interfaces are" + " specified or found, default is 1. Setting to 0" + " is useful for hot add of devices using hotmod."); + + +static void std_irq_cleanup(struct smi_info *info) +{ + if (info->si_type == SI_BT) + /* Disable the interrupt in the BT interface. */ + info->io.outputb(&info->io, IPMI_BT_INTMASK_REG, 0); + free_irq(info->irq, info); +} + +#if defined(__VMKLNX__) && defined(HP_G6_SUPPORT) +static int pci_irq_setup(struct smi_info *info) +{ + int rv; + + if (!info->irq) + return 0; + + rv = request_irq(info->irq, + si_irq_handler, + (SA_SHIRQ|SA_INTERRUPT), + DEVICE_NAME, + info); + if (rv) { + printk(KERN_WARNING + "ipmi_si: %s unable to claim PCI interrupt %d," + " running polled\n", + DEVICE_NAME, info->irq); + info->irq = 0; + info->interrupt_disabled = 1; + } else { + info->irq_cleanup = std_irq_cleanup; + printk("ipmi_si: Using PCI Plug and Play interrupt %d\n", info->irq); + } + + return rv; +} +#endif /* defined(__VMKLNX__) && defined(HP_G6_SUPPORT) */ + +static int std_irq_setup(struct smi_info *info) +{ + int rv; + + if (!info->irq) + return 0; + + if (info->si_type == SI_BT) { + rv = request_irq(info->irq, + si_bt_irq_handler, + IRQF_SHARED | IRQF_DISABLED, + DEVICE_NAME, + info); + if (!rv) + /* Enable the interrupt in the BT interface. */ + info->io.outputb(&info->io, IPMI_BT_INTMASK_REG, + IPMI_BT_INTMASK_ENABLE_IRQ_BIT); + } else + rv = request_irq(info->irq, + si_irq_handler, + IRQF_SHARED | IRQF_DISABLED, + DEVICE_NAME, + info); + if (rv) { + printk(KERN_WARNING + "ipmi_si: %s unable to claim interrupt %d," + " running polled\n", + DEVICE_NAME, info->irq); + info->irq = 0; + } else { + info->irq_cleanup = std_irq_cleanup; + printk(" Using irq %d\n", info->irq); + } + + return rv; +} + +static unsigned char port_inb(struct si_sm_io *io, unsigned int offset) +{ + unsigned int addr = io->addr_data; + + return inb(addr + (offset * io->regspacing)); +} + +static void port_outb(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + unsigned int addr = io->addr_data; + + outb(b, addr + (offset * io->regspacing)); +} + +static unsigned char port_inw(struct si_sm_io *io, unsigned int offset) +{ + unsigned int addr = io->addr_data; + + return (inw(addr + (offset * io->regspacing)) >> io->regshift) & 0xff; +} + +static void port_outw(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + unsigned int addr = io->addr_data; + + outw(b << io->regshift, addr + (offset * io->regspacing)); +} + +static unsigned char port_inl(struct si_sm_io *io, unsigned int offset) +{ + unsigned int addr = io->addr_data; + + return (inl(addr + (offset * io->regspacing)) >> io->regshift) & 0xff; +} + +static void port_outl(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + unsigned int addr = io->addr_data; + + outl(b << io->regshift, addr+(offset * io->regspacing)); +} + +static void port_cleanup(struct smi_info *info) +{ + unsigned int addr = info->io.addr_data; + int idx; + + if (addr) { + for (idx = 0; idx < info->io_size; idx++) { + release_region(addr + idx * info->io.regspacing, + info->io.regsize); + } + } +} + +static int port_setup(struct smi_info *info) +{ + unsigned int addr = info->io.addr_data; + int idx; + + if (!addr) + return -ENODEV; + + info->io_cleanup = port_cleanup; + + /* Figure out the actual inb/inw/inl/etc routine to use based + upon the register size. */ + switch (info->io.regsize) { + case 1: + info->io.inputb = port_inb; + info->io.outputb = port_outb; + break; + case 2: + info->io.inputb = port_inw; + info->io.outputb = port_outw; + break; + case 4: + info->io.inputb = port_inl; + info->io.outputb = port_outl; + break; + default: + printk("ipmi_si: Invalid register size: %d\n", + info->io.regsize); + return -EINVAL; + } + + /* Some BIOSes reserve disjoint I/O regions in their ACPI + * tables. This causes problems when trying to register the + * entire I/O region. Therefore we must register each I/O + * port separately. + */ + for (idx = 0; idx < info->io_size; idx++) { + if (request_region(addr + idx * info->io.regspacing, + info->io.regsize, DEVICE_NAME) == NULL) { + /* Undo allocations */ + while (idx--) { + release_region(addr + idx * info->io.regspacing, + info->io.regsize); + } + return -EIO; + } + } + return 0; +} + +static unsigned char intf_mem_inb(struct si_sm_io *io, unsigned int offset) +{ + return readb((io->addr)+(offset * io->regspacing)); +} + +static void intf_mem_outb(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + writeb(b, (io->addr)+(offset * io->regspacing)); +} + +static unsigned char intf_mem_inw(struct si_sm_io *io, unsigned int offset) +{ + return (readw((io->addr)+(offset * io->regspacing)) >> io->regshift) + & 0xff; +} + +static void intf_mem_outw(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + writeb(b << io->regshift, (io->addr)+(offset * io->regspacing)); +} + +static unsigned char intf_mem_inl(struct si_sm_io *io, unsigned int offset) +{ + return (readl((io->addr)+(offset * io->regspacing)) >> io->regshift) + & 0xff; +} + +static void intf_mem_outl(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + writel(b << io->regshift, (io->addr)+(offset * io->regspacing)); +} + +#ifdef readq +static unsigned char mem_inq(struct si_sm_io *io, unsigned int offset) +{ + return (readq((io->addr)+(offset * io->regspacing)) >> io->regshift) + & 0xff; +} + +static void mem_outq(struct si_sm_io *io, unsigned int offset, + unsigned char b) +{ + writeq(b << io->regshift, (io->addr)+(offset * io->regspacing)); +} +#endif + +static void mem_cleanup(struct smi_info *info) +{ + unsigned long addr = info->io.addr_data; + int mapsize; + + if (info->io.addr) { + iounmap(info->io.addr); + + mapsize = ((info->io_size * info->io.regspacing) + - (info->io.regspacing - info->io.regsize)); + + release_mem_region(addr, mapsize); + } +} + +static int mem_setup(struct smi_info *info) +{ + unsigned long addr = info->io.addr_data; + int mapsize; + + if (!addr) + return -ENODEV; + + info->io_cleanup = mem_cleanup; + + /* Figure out the actual readb/readw/readl/etc routine to use based + upon the register size. */ + switch (info->io.regsize) { + case 1: + info->io.inputb = intf_mem_inb; + info->io.outputb = intf_mem_outb; + break; + case 2: + info->io.inputb = intf_mem_inw; + info->io.outputb = intf_mem_outw; + break; + case 4: + info->io.inputb = intf_mem_inl; + info->io.outputb = intf_mem_outl; + break; +#ifdef readq + case 8: + info->io.inputb = mem_inq; + info->io.outputb = mem_outq; + break; +#endif + default: + printk("ipmi_si: Invalid register size: %d\n", + info->io.regsize); + return -EINVAL; + } + + /* Calculate the total amount of memory to claim. This is an + * unusual looking calculation, but it avoids claiming any + * more memory than it has to. It will claim everything + * between the first address to the end of the last full + * register. */ + mapsize = ((info->io_size * info->io.regspacing) + - (info->io.regspacing - info->io.regsize)); + + if (request_mem_region(addr, mapsize, DEVICE_NAME) == NULL) + return -EIO; + + info->io.addr = ioremap(addr, mapsize); + if (info->io.addr == NULL) { + release_mem_region(addr, mapsize); + return -EIO; + } + return 0; +} + +/* + * Parms come in as [:op2[:op3...]]. ops are: + * add|remove,kcs|bt|smic,mem|i/o,
[,[,[,...]]] + * Options are: + * rsp= + * rsi= + * rsh= + * irq= + * ipmb= + */ +enum hotmod_op { HM_ADD, HM_REMOVE }; +struct hotmod_vals { + char *name; + int val; +}; +static struct hotmod_vals hotmod_ops[] = { + { "add", HM_ADD }, + { "remove", HM_REMOVE }, + { NULL } +}; +static struct hotmod_vals hotmod_si[] = { + { "kcs", SI_KCS }, + { "smic", SI_SMIC }, + { "bt", SI_BT }, + { NULL } +}; +static struct hotmod_vals hotmod_as[] = { + { "mem", IPMI_MEM_ADDR_SPACE }, + { "i/o", IPMI_IO_ADDR_SPACE }, + { NULL } +}; + +static int parse_str(struct hotmod_vals *v, int *val, char *name, char **curr) +{ + char *s; + int i; + + s = strchr(*curr, ','); + if (!s) { + printk(KERN_WARNING PFX "No hotmod %s given.\n", name); + return -EINVAL; + } + *s = '\0'; + s++; + for (i = 0; hotmod_ops[i].name; i++) { + if (strcmp(*curr, v[i].name) == 0) { + *val = v[i].val; + *curr = s; + return 0; + } + } + + printk(KERN_WARNING PFX "Invalid hotmod %s '%s'\n", name, *curr); + return -EINVAL; +} + +static int check_hotmod_int_op(const char *curr, const char *option, + const char *name, int *val) +{ + char *n; + + if (strcmp(curr, name) == 0) { + if (!option) { + printk(KERN_WARNING PFX + "No option given for '%s'\n", + curr); + return -EINVAL; + } + *val = simple_strtoul(option, &n, 0); + if ((*n != '\0') || (*option == '\0')) { + printk(KERN_WARNING PFX + "Bad option given for '%s'\n", + curr); + return -EINVAL; + } + return 1; + } + return 0; +} + +static int hotmod_handler(const char *val, struct kernel_param *kp) +{ + char *str = kstrdup(val, GFP_KERNEL); + int rv; + char *next, *curr, *s, *n, *o; + enum hotmod_op op; + enum si_type si_type; + int addr_space; + unsigned long addr; + int regspacing; + int regsize; + int regshift; + int irq; + int ipmb; + int ival; + int len; + struct smi_info *info; + + if (!str) + return -ENOMEM; + + /* Kill any trailing spaces, as we can get a "\n" from echo. */ + len = strlen(str); + ival = len - 1; + while ((ival >= 0) && isspace(str[ival])) { + str[ival] = '\0'; + ival--; + } + + for (curr = str; curr; curr = next) { + regspacing = 1; + regsize = 1; + regshift = 0; + irq = 0; + ipmb = 0x20; + + next = strchr(curr, ':'); + if (next) { + *next = '\0'; + next++; + } + + rv = parse_str(hotmod_ops, &ival, "operation", &curr); + if (rv) + break; + op = ival; + + rv = parse_str(hotmod_si, &ival, "interface type", &curr); + if (rv) + break; + si_type = ival; + + rv = parse_str(hotmod_as, &addr_space, "address space", &curr); + if (rv) + break; + + s = strchr(curr, ','); + if (s) { + *s = '\0'; + s++; + } + addr = simple_strtoul(curr, &n, 0); + if ((*n != '\0') || (*curr == '\0')) { + printk(KERN_WARNING PFX "Invalid hotmod address" + " '%s'\n", curr); + break; + } + + while (s) { + curr = s; + s = strchr(curr, ','); + if (s) { + *s = '\0'; + s++; + } + o = strchr(curr, '='); + if (o) { + *o = '\0'; + o++; + } + rv = check_hotmod_int_op(curr, o, "rsp", ®spacing); + if (rv < 0) + goto out; + else if (rv) + continue; + rv = check_hotmod_int_op(curr, o, "rsi", ®size); + if (rv < 0) + goto out; + else if (rv) + continue; + rv = check_hotmod_int_op(curr, o, "rsh", ®shift); + if (rv < 0) + goto out; + else if (rv) + continue; + rv = check_hotmod_int_op(curr, o, "irq", &irq); + if (rv < 0) + goto out; + else if (rv) + continue; + rv = check_hotmod_int_op(curr, o, "ipmb", &ipmb); + if (rv < 0) + goto out; + else if (rv) + continue; + + rv = -EINVAL; + printk(KERN_WARNING PFX + "Invalid hotmod option '%s'\n", + curr); + goto out; + } + + if (op == HM_ADD) { + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + rv = -ENOMEM; + goto out; + } + + info->addr_source = "hotmod"; + info->si_type = si_type; + info->io.addr_data = addr; + info->io.addr_type = addr_space; + if (addr_space == IPMI_MEM_ADDR_SPACE) + info->io_setup = mem_setup; + else + info->io_setup = port_setup; + + info->io.addr = NULL; + info->io.regspacing = regspacing; + if (!info->io.regspacing) + info->io.regspacing = DEFAULT_REGSPACING; + info->io.regsize = regsize; + if (!info->io.regsize) + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = regshift; + info->irq = irq; + if (info->irq) + info->irq_setup = std_irq_setup; + info->slave_addr = ipmb; + + try_smi_init(info); + } else { + /* remove */ + struct smi_info *e, *tmp_e; + + mutex_lock(&smi_infos_lock); + list_for_each_entry_safe(e, tmp_e, &smi_infos, link) { + if (e->io.addr_type != addr_space) + continue; + if (e->si_type != si_type) + continue; + if (e->io.addr_data == addr) + cleanup_one_si(e); + } + mutex_unlock(&smi_infos_lock); + } + } + rv = len; + out: + kfree(str); + return rv; +} + +static __devinit void hardcode_find_bmc(void) +{ + int i; + struct smi_info *info; + + for (i = 0; i < SI_MAX_PARMS; i++) { + if (!ports[i] && !addrs[i]) + continue; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return; + + info->addr_source = "hardcoded"; + + if (!si_type[i] || strcmp(si_type[i], "kcs") == 0) { + info->si_type = SI_KCS; + } else if (strcmp(si_type[i], "smic") == 0) { + info->si_type = SI_SMIC; + } else if (strcmp(si_type[i], "bt") == 0) { + info->si_type = SI_BT; + } else { + printk(KERN_WARNING + "ipmi_si: Interface type specified " + "for interface %d, was invalid: %s\n", + i, si_type[i]); + kfree(info); + continue; + } + + if (ports[i]) { + /* An I/O port */ + info->io_setup = port_setup; + info->io.addr_data = ports[i]; + info->io.addr_type = IPMI_IO_ADDR_SPACE; + } else if (addrs[i]) { + /* A memory port */ + info->io_setup = mem_setup; + info->io.addr_data = addrs[i]; + info->io.addr_type = IPMI_MEM_ADDR_SPACE; + } else { + printk(KERN_WARNING + "ipmi_si: Interface type specified " + "for interface %d, " + "but port and address were not set or " + "set to zero.\n", i); + kfree(info); + continue; + } + + info->io.addr = NULL; + info->io.regspacing = regspacings[i]; + if (!info->io.regspacing) + info->io.regspacing = DEFAULT_REGSPACING; + info->io.regsize = regsizes[i]; + if (!info->io.regsize) + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = regshifts[i]; + info->irq = irqs[i]; + if (info->irq) + info->irq_setup = std_irq_setup; + + try_smi_init(info); + } +} + +#ifdef CONFIG_ACPI + +#include + +/* Once we get an ACPI failure, we don't try any more, because we go + through the tables sequentially. Once we don't find a table, there + are no more. */ +static int acpi_failure; + +/* For GPE-type interrupts. */ +static u32 ipmi_acpi_gpe(void *context) +{ + struct smi_info *smi_info = context; + unsigned long flags; +#ifdef DEBUG_TIMING + struct timeval t; +#endif + + spin_lock_irqsave(&(smi_info->si_lock), flags); + + spin_lock(&smi_info->count_lock); + smi_info->interrupts++; + spin_unlock(&smi_info->count_lock); + +#ifdef DEBUG_TIMING + do_gettimeofday(&t); + printk("**ACPI_GPE: %d.%9.9d\n", t.tv_sec, t.tv_usec); +#endif + smi_event_handler(smi_info, 0); + spin_unlock_irqrestore(&(smi_info->si_lock), flags); + + return ACPI_INTERRUPT_HANDLED; +} + +static void acpi_gpe_irq_cleanup(struct smi_info *info) +{ + if (!info->irq) + return; + + acpi_remove_gpe_handler(NULL, info->irq, &ipmi_acpi_gpe); +} + +static int acpi_gpe_irq_setup(struct smi_info *info) +{ + acpi_status status; + + if (!info->irq) + return 0; + + /* FIXME - is level triggered right? */ + status = acpi_install_gpe_handler(NULL, + info->irq, + ACPI_GPE_LEVEL_TRIGGERED, + &ipmi_acpi_gpe, + info); + if (status != AE_OK) { + printk(KERN_WARNING + "ipmi_si: %s unable to claim ACPI GPE %d," + " running polled\n", + DEVICE_NAME, info->irq); + info->irq = 0; + return -EINVAL; + } else { + info->irq_cleanup = acpi_gpe_irq_cleanup; + printk(" Using ACPI GPE %d\n", info->irq); + return 0; + } +} + +/* + * Defined at + * http://h21007.www2.hp.com/dspp/files/unprotected/devresource/Docs/TechPapers/IA64/hpspmi.pdf + */ +struct SPMITable { + s8 Signature[4]; + u32 Length; + u8 Revision; + u8 Checksum; + s8 OEMID[6]; + s8 OEMTableID[8]; + s8 OEMRevision[4]; + s8 CreatorID[4]; + s8 CreatorRevision[4]; + u8 InterfaceType; + u8 IPMIlegacy; + s16 SpecificationRevision; + + /* + * Bit 0 - SCI interrupt supported + * Bit 1 - I/O APIC/SAPIC + */ + u8 InterruptType; + + /* If bit 0 of InterruptType is set, then this is the SCI + interrupt in the GPEx_STS register. */ + u8 GPE; + + s16 Reserved; + + /* If bit 1 of InterruptType is set, then this is the I/O + APIC/SAPIC interrupt. */ + u32 GlobalSystemInterrupt; + + /* The actual register address. */ + struct acpi_generic_address addr; + + u8 UID[4]; + + s8 spmi_id[1]; /* A '\0' terminated array starts here. */ +}; + +static __devinit int try_init_acpi(struct SPMITable *spmi) +{ + struct smi_info *info; + u8 addr_space; + + if (spmi->IPMIlegacy != 1) { + printk(KERN_INFO "IPMI: Bad SPMI legacy %d\n", spmi->IPMIlegacy); + return -ENODEV; + } + + if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) + addr_space = IPMI_MEM_ADDR_SPACE; + else + addr_space = IPMI_IO_ADDR_SPACE; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + printk(KERN_ERR "ipmi_si: Could not allocate SI data (3)\n"); + return -ENOMEM; + } + + info->addr_source = "ACPI"; + + /* Figure out the interface type. */ + switch (spmi->InterfaceType) + { + case 1: /* KCS */ + info->si_type = SI_KCS; + break; + case 2: /* SMIC */ + info->si_type = SI_SMIC; + break; + case 3: /* BT */ + info->si_type = SI_BT; + break; + default: + printk(KERN_INFO "ipmi_si: Unknown ACPI/SPMI SI type %d\n", + spmi->InterfaceType); + kfree(info); + return -EIO; + } + + if (spmi->InterruptType & 1) { + /* We've got a GPE interrupt. */ + info->irq = spmi->GPE; + info->irq_setup = acpi_gpe_irq_setup; + } else if (spmi->InterruptType & 2) { + /* We've got an APIC/SAPIC interrupt. */ + info->irq = spmi->GlobalSystemInterrupt; + info->irq_setup = std_irq_setup; + } else { + /* Use the default interrupt setting. */ + info->irq = 0; + info->irq_setup = NULL; + } + + if (spmi->addr.bit_width) { + /* A (hopefully) properly formed register bit width. */ + info->io.regspacing = spmi->addr.bit_width / 8; + } else { + info->io.regspacing = DEFAULT_REGSPACING; + } + info->io.regsize = info->io.regspacing; + info->io.regshift = spmi->addr.bit_offset; + + if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { + info->io_setup = mem_setup; + info->io.addr_type = IPMI_MEM_ADDR_SPACE; + } else if (spmi->addr.space_id == ACPI_ADR_SPACE_SYSTEM_IO) { + info->io_setup = port_setup; + info->io.addr_type = IPMI_IO_ADDR_SPACE; + } else { + kfree(info); + printk("ipmi_si: Unknown ACPI I/O Address type\n"); + return -EIO; + } + info->io.addr_data = spmi->addr.address; + + try_smi_init(info); + + return 0; +} + +static __devinit void acpi_find_bmc(void) +{ + acpi_status status; + struct SPMITable *spmi; + int i; + + if (acpi_disabled) + return; + + if (acpi_failure) + return; + + for (i = 0; ; i++) { + status = acpi_get_table(ACPI_SIG_SPMI, i+1, + (struct acpi_table_header **)&spmi); + if (status != AE_OK) + return; + + try_init_acpi(spmi); + } +} +#endif + +#ifdef CONFIG_DMI +struct dmi_ipmi_data +{ + u8 type; + u8 addr_space; + unsigned long base_addr; + u8 irq; + u8 offset; + u8 slave_addr; +}; + +static int __devinit decode_dmi(const struct dmi_header *dm, + struct dmi_ipmi_data *dmi) +{ + const u8 *data = (const u8 *)dm; + unsigned long base_addr; + u8 reg_spacing; + u8 len = dm->length; + + dmi->type = data[4]; + + memcpy(&base_addr, data+8, sizeof(unsigned long)); + if (len >= 0x11) { + if (base_addr & 1) { + /* I/O */ + base_addr &= 0xFFFE; + dmi->addr_space = IPMI_IO_ADDR_SPACE; + } + else { + /* Memory */ + dmi->addr_space = IPMI_MEM_ADDR_SPACE; + } + /* If bit 4 of byte 0x10 is set, then the lsb for the address + is odd. */ + dmi->base_addr = base_addr | ((data[0x10] & 0x10) >> 4); + + dmi->irq = data[0x11]; + + /* The top two bits of byte 0x10 hold the register spacing. */ + reg_spacing = (data[0x10] & 0xC0) >> 6; + switch(reg_spacing){ + case 0x00: /* Byte boundaries */ + dmi->offset = 1; + break; + case 0x01: /* 32-bit boundaries */ + dmi->offset = 4; + break; + case 0x02: /* 16-byte boundaries */ + dmi->offset = 16; + break; + default: + /* Some other interface, just ignore it. */ + return -EIO; + } + } else { + /* Old DMI spec. */ + /* Note that technically, the lower bit of the base + * address should be 1 if the address is I/O and 0 if + * the address is in memory. So many systems get that + * wrong (and all that I have seen are I/O) so we just + * ignore that bit and assume I/O. Systems that use + * memory should use the newer spec, anyway. */ + dmi->base_addr = base_addr & 0xfffe; + dmi->addr_space = IPMI_IO_ADDR_SPACE; + dmi->offset = 1; + } + + dmi->slave_addr = data[6]; + + return 0; +} + +static __devinit void try_init_dmi(struct dmi_ipmi_data *ipmi_data) +{ + struct smi_info *info; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + printk(KERN_ERR + "ipmi_si: Could not allocate SI data\n"); + return; + } + + info->addr_source = "SMBIOS"; + + switch (ipmi_data->type) { + case 0x01: /* KCS */ + info->si_type = SI_KCS; + break; + case 0x02: /* SMIC */ + info->si_type = SI_SMIC; + break; + case 0x03: /* BT */ + info->si_type = SI_BT; + break; + default: + kfree(info); + return; + } + + switch (ipmi_data->addr_space) { + case IPMI_MEM_ADDR_SPACE: + info->io_setup = mem_setup; + info->io.addr_type = IPMI_MEM_ADDR_SPACE; + break; + + case IPMI_IO_ADDR_SPACE: + info->io_setup = port_setup; + info->io.addr_type = IPMI_IO_ADDR_SPACE; + break; + + default: + kfree(info); + printk(KERN_WARNING + "ipmi_si: Unknown SMBIOS I/O Address type: %d.\n", + ipmi_data->addr_space); + return; + } + info->io.addr_data = ipmi_data->base_addr; + + info->io.regspacing = ipmi_data->offset; + if (!info->io.regspacing) + info->io.regspacing = DEFAULT_REGSPACING; + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = 0; + + info->slave_addr = ipmi_data->slave_addr; + + info->irq = ipmi_data->irq; + if (info->irq) + info->irq_setup = std_irq_setup; + + try_smi_init(info); +} + +static void __devinit dmi_find_bmc(void) +{ + const struct dmi_device *dev = NULL; + struct dmi_ipmi_data data; + int rv; + + while ((dev = dmi_find_device(DMI_DEV_TYPE_IPMI, NULL, dev))) { + memset(&data, 0, sizeof(data)); + rv = decode_dmi((const struct dmi_header *) dev->device_data, + &data); + if (!rv) + try_init_dmi(&data); + } +} +#endif /* CONFIG_DMI */ + +#ifdef CONFIG_PCI + +#define PCI_ERMC_CLASSCODE 0x0C0700 +#define PCI_ERMC_CLASSCODE_MASK 0xffffff00 +#define PCI_ERMC_CLASSCODE_TYPE_MASK 0xff +#define PCI_ERMC_CLASSCODE_TYPE_SMIC 0x00 +#define PCI_ERMC_CLASSCODE_TYPE_KCS 0x01 +#define PCI_ERMC_CLASSCODE_TYPE_BT 0x02 + +#define PCI_HP_VENDOR_ID 0x103C +#define PCI_MMC_DEVICE_ID 0x121A +#define PCI_MMC_ADDR_CW 0x10 + +static void ipmi_pci_cleanup(struct smi_info *info) +{ + struct pci_dev *pdev = info->addr_source_data; + + pci_disable_device(pdev); +} + +static int __devinit ipmi_pci_probe(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + int rv; + int class_type = pdev->class & PCI_ERMC_CLASSCODE_TYPE_MASK; + struct smi_info *info; + int first_reg_offset = 0; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + info->addr_source = "PCI"; + + switch (class_type) { + case PCI_ERMC_CLASSCODE_TYPE_SMIC: + info->si_type = SI_SMIC; + break; + + case PCI_ERMC_CLASSCODE_TYPE_KCS: + info->si_type = SI_KCS; + break; + + case PCI_ERMC_CLASSCODE_TYPE_BT: + info->si_type = SI_BT; + break; + + default: + kfree(info); + printk(KERN_INFO "ipmi_si: %s: Unknown IPMI type: %d\n", + pci_name(pdev), class_type); + return -ENOMEM; + } + + rv = pci_enable_device(pdev); + if (rv) { + printk(KERN_ERR "ipmi_si: %s: couldn't enable PCI device\n", + pci_name(pdev)); + kfree(info); + return rv; + } + + info->addr_source_cleanup = ipmi_pci_cleanup; + info->addr_source_data = pdev; + + if (pdev->subsystem_vendor == PCI_HP_VENDOR_ID) + first_reg_offset = 1; + + if (pci_resource_flags(pdev, 0) & IORESOURCE_IO) { + info->io_setup = port_setup; + info->io.addr_type = IPMI_IO_ADDR_SPACE; + } else { + info->io_setup = mem_setup; + info->io.addr_type = IPMI_MEM_ADDR_SPACE; + } + info->io.addr_data = pci_resource_start(pdev, 0); + + info->io.regspacing = DEFAULT_REGSPACING; + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = 0; + + info->irq = pdev->irq; + if (info->irq) +#if defined(__VMKLNX__) && defined(HP_G6_SUPPORT) + info->irq_setup = pci_irq_setup; +#else + info->irq_setup = std_irq_setup; +#endif /* defined(__VMKLNX__) && defined(HP_G6_SUPPORT) */ + + info->dev = &pdev->dev; + pci_set_drvdata(pdev, info); + + return try_smi_init(info); +} + +static void __devexit ipmi_pci_remove(struct pci_dev *pdev) +{ + struct smi_info *info = pci_get_drvdata(pdev); + cleanup_one_si(info); +} + +#ifdef CONFIG_PM +static int ipmi_pci_suspend(struct pci_dev *pdev, pm_message_t state) +{ + return 0; +} + +static int ipmi_pci_resume(struct pci_dev *pdev) +{ + return 0; +} +#endif + +static struct pci_device_id ipmi_pci_devices[] = { + { PCI_DEVICE(PCI_HP_VENDOR_ID, PCI_MMC_DEVICE_ID) }, + { PCI_DEVICE_CLASS(PCI_ERMC_CLASSCODE, PCI_ERMC_CLASSCODE_MASK) }, + { 0, } +}; +MODULE_DEVICE_TABLE(pci, ipmi_pci_devices); + +static struct pci_driver ipmi_pci_driver = { + .name = DEVICE_NAME, + .id_table = ipmi_pci_devices, + .probe = ipmi_pci_probe, + .remove = __devexit_p(ipmi_pci_remove), +#ifdef CONFIG_PM + .suspend = ipmi_pci_suspend, + .resume = ipmi_pci_resume, +#endif +}; +#endif /* CONFIG_PCI */ + + +#ifdef CONFIG_PPC_OF +static int __devinit ipmi_of_probe(struct of_device *dev, + const struct of_device_id *match) +{ + struct smi_info *info; + struct resource resource; + const int *regsize, *regspacing, *regshift; + struct device_node *np = dev->node; + int ret; + int proplen; + + dev_info(&dev->dev, PFX "probing via device tree\n"); + + ret = of_address_to_resource(np, 0, &resource); + if (ret) { + dev_warn(&dev->dev, PFX "invalid address from OF\n"); + return ret; + } + + regsize = of_get_property(np, "reg-size", &proplen); + if (regsize && proplen != 4) { + dev_warn(&dev->dev, PFX "invalid regsize from OF\n"); + return -EINVAL; + } + + regspacing = of_get_property(np, "reg-spacing", &proplen); + if (regspacing && proplen != 4) { + dev_warn(&dev->dev, PFX "invalid regspacing from OF\n"); + return -EINVAL; + } + + regshift = of_get_property(np, "reg-shift", &proplen); + if (regshift && proplen != 4) { + dev_warn(&dev->dev, PFX "invalid regshift from OF\n"); + return -EINVAL; + } + + info = kzalloc(sizeof(*info), GFP_KERNEL); + + if (!info) { + dev_err(&dev->dev, + PFX "could not allocate memory for OF probe\n"); + return -ENOMEM; + } + + info->si_type = (enum si_type) match->data; + info->addr_source = "device-tree"; + info->io_setup = mem_setup; + info->irq_setup = std_irq_setup; + + info->io.addr_type = IPMI_MEM_ADDR_SPACE; + info->io.addr_data = resource.start; + + info->io.regsize = regsize ? *regsize : DEFAULT_REGSIZE; + info->io.regspacing = regspacing ? *regspacing : DEFAULT_REGSPACING; + info->io.regshift = regshift ? *regshift : 0; + + info->irq = irq_of_parse_and_map(dev->node, 0); + info->dev = &dev->dev; + + dev_dbg(&dev->dev, "addr 0x%lx regsize %d spacing %d irq %x\n", + info->io.addr_data, info->io.regsize, info->io.regspacing, + info->irq); + + dev->dev.driver_data = (void*) info; + + return try_smi_init(info); +} + +static int __devexit ipmi_of_remove(struct of_device *dev) +{ + cleanup_one_si(dev->dev.driver_data); + return 0; +} + +static struct of_device_id ipmi_match[] = +{ + { .type = "ipmi", .compatible = "ipmi-kcs", .data = (void *)(unsigned long) SI_KCS }, + { .type = "ipmi", .compatible = "ipmi-smic", .data = (void *)(unsigned long) SI_SMIC }, + { .type = "ipmi", .compatible = "ipmi-bt", .data = (void *)(unsigned long) SI_BT }, + {}, +}; + +static struct of_platform_driver ipmi_of_platform_driver = +{ + .name = "ipmi", + .match_table = ipmi_match, + .probe = ipmi_of_probe, + .remove = __devexit_p(ipmi_of_remove), +}; +#endif /* CONFIG_PPC_OF */ + + +static int try_get_dev_id(struct smi_info *smi_info) +{ + unsigned char msg[2]; + unsigned char *resp; + unsigned long resp_len; + enum si_sm_result smi_result; + int rv = 0; + + resp = kmalloc(IPMI_MAX_MSG_LENGTH, GFP_KERNEL); + if (!resp) + return -ENOMEM; + + /* Do a Get Device ID command, since it comes back with some + useful info. */ + msg[0] = IPMI_NETFN_APP_REQUEST << 2; + msg[1] = IPMI_GET_DEVICE_ID_CMD; + smi_info->handlers->start_transaction(smi_info->si_sm, msg, 2); + + smi_result = smi_info->handlers->event(smi_info->si_sm, 0); + for (;;) + { + if (smi_result == SI_SM_CALL_WITH_DELAY || + smi_result == SI_SM_CALL_WITH_TICK_DELAY) { + schedule_timeout_uninterruptible(1); + smi_result = smi_info->handlers->event( + smi_info->si_sm, 100); + } + else if (smi_result == SI_SM_CALL_WITHOUT_DELAY) + { + smi_result = smi_info->handlers->event( + smi_info->si_sm, 0); + } + else + break; + } + if (smi_result == SI_SM_HOSED) { + /* We couldn't get the state machine to run, so whatever's at + the port is probably not an IPMI SMI interface. */ + rv = -ENODEV; + goto out; + } + + /* Otherwise, we got some data. */ + resp_len = smi_info->handlers->get_result(smi_info->si_sm, + resp, IPMI_MAX_MSG_LENGTH); + + /* Check and record info from the get device id, in case we need it. */ + rv = ipmi_demangle_device_id(resp, resp_len, &smi_info->device_id); + + out: + kfree(resp); + return rv; +} + +static int type_file_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct smi_info *smi = data; + + return sprintf(page, "%s\n", si_to_str[smi->si_type]); +} + +static int stat_file_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + char *out = (char *) page; + struct smi_info *smi = data; + + out += sprintf(out, "interrupts_enabled: %d\n", + smi->irq && !smi->interrupt_disabled); + out += sprintf(out, "short_timeouts: %ld\n", + smi->short_timeouts); + out += sprintf(out, "long_timeouts: %ld\n", + smi->long_timeouts); + out += sprintf(out, "timeout_restarts: %ld\n", + smi->timeout_restarts); + out += sprintf(out, "idles: %ld\n", + smi->idles); + out += sprintf(out, "interrupts: %ld\n", + smi->interrupts); + out += sprintf(out, "attentions: %ld\n", + smi->attentions); + out += sprintf(out, "flag_fetches: %ld\n", + smi->flag_fetches); + out += sprintf(out, "hosed_count: %ld\n", + smi->hosed_count); + out += sprintf(out, "complete_transactions: %ld\n", + smi->complete_transactions); + out += sprintf(out, "events: %ld\n", + smi->events); + out += sprintf(out, "watchdog_pretimeouts: %ld\n", + smi->watchdog_pretimeouts); + out += sprintf(out, "incoming_messages: %ld\n", + smi->incoming_messages); + + return out - page; +} + +static int param_read_proc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct smi_info *smi = data; + + return sprintf(page, + "%s,%s,0x%lx,rsp=%d,rsi=%d,rsh=%d,irq=%d,ipmb=%d\n", + si_to_str[smi->si_type], + addr_space_to_str[smi->io.addr_type], + smi->io.addr_data, + smi->io.regspacing, + smi->io.regsize, + smi->io.regshift, + smi->irq, + smi->slave_addr); +} + +/* + * oem_data_avail_to_receive_msg_avail + * @info - smi_info structure with msg_flags set + * + * Converts flags from OEM_DATA_AVAIL to RECEIVE_MSG_AVAIL + * Returns 1 indicating need to re-run handle_flags(). + */ +static int oem_data_avail_to_receive_msg_avail(struct smi_info *smi_info) +{ + smi_info->msg_flags = ((smi_info->msg_flags & ~OEM_DATA_AVAIL) | + RECEIVE_MSG_AVAIL); + return 1; +} + +/* + * setup_dell_poweredge_oem_data_handler + * @info - smi_info.device_id must be populated + * + * Systems that match, but have firmware version < 1.40 may assert + * OEM0_DATA_AVAIL on their own, without being told via Set Flags that + * it's safe to do so. Such systems will de-assert OEM1_DATA_AVAIL + * upon receipt of IPMI_GET_MSG_CMD, so we should treat these flags + * as RECEIVE_MSG_AVAIL instead. + * + * As Dell has no plans to release IPMI 1.5 firmware that *ever* + * assert the OEM[012] bits, and if it did, the driver would have to + * change to handle that properly, we don't actually check for the + * firmware version. + * Device ID = 0x20 BMC on PowerEdge 8G servers + * Device Revision = 0x80 + * Firmware Revision1 = 0x01 BMC version 1.40 + * Firmware Revision2 = 0x40 BCD encoded + * IPMI Version = 0x51 IPMI 1.5 + * Manufacturer ID = A2 02 00 Dell IANA + * + * Additionally, PowerEdge systems with IPMI < 1.5 may also assert + * OEM0_DATA_AVAIL and needs to be treated as RECEIVE_MSG_AVAIL. + * + */ +#define DELL_POWEREDGE_8G_BMC_DEVICE_ID 0x20 +#define DELL_POWEREDGE_8G_BMC_DEVICE_REV 0x80 +#define DELL_POWEREDGE_8G_BMC_IPMI_VERSION 0x51 +#define DELL_IANA_MFR_ID 0x0002a2 +static void setup_dell_poweredge_oem_data_handler(struct smi_info *smi_info) +{ + struct ipmi_device_id *id = &smi_info->device_id; + if (id->manufacturer_id == DELL_IANA_MFR_ID) { + if (id->device_id == DELL_POWEREDGE_8G_BMC_DEVICE_ID && + id->device_revision == DELL_POWEREDGE_8G_BMC_DEVICE_REV && + id->ipmi_version == DELL_POWEREDGE_8G_BMC_IPMI_VERSION) { + smi_info->oem_data_avail_handler = + oem_data_avail_to_receive_msg_avail; + } + else if (ipmi_version_major(id) < 1 || + (ipmi_version_major(id) == 1 && + ipmi_version_minor(id) < 5)) { + smi_info->oem_data_avail_handler = + oem_data_avail_to_receive_msg_avail; + } + } +} + +#define CANNOT_RETURN_REQUESTED_LENGTH 0xCA +static void return_hosed_msg_badsize(struct smi_info *smi_info) +{ + struct ipmi_smi_msg *msg = smi_info->curr_msg; + + /* Make it a reponse */ + msg->rsp[0] = msg->data[0] | 4; + msg->rsp[1] = msg->data[1]; + msg->rsp[2] = CANNOT_RETURN_REQUESTED_LENGTH; + msg->rsp_size = 3; + smi_info->curr_msg = NULL; + deliver_recv_msg(smi_info, msg); +} + +/* + * dell_poweredge_bt_xaction_handler + * @info - smi_info.device_id must be populated + * + * Dell PowerEdge servers with the BT interface (x6xx and 1750) will + * not respond to a Get SDR command if the length of the data + * requested is exactly 0x3A, which leads to command timeouts and no + * data returned. This intercepts such commands, and causes userspace + * callers to try again with a different-sized buffer, which succeeds. + */ + +#define STORAGE_NETFN 0x0A +#define STORAGE_CMD_GET_SDR 0x23 +static int dell_poweredge_bt_xaction_handler(struct notifier_block *self, + unsigned long unused, + void *in) +{ + struct smi_info *smi_info = in; + unsigned char *data = smi_info->curr_msg->data; + unsigned int size = smi_info->curr_msg->data_size; + if (size >= 8 && + (data[0]>>2) == STORAGE_NETFN && + data[1] == STORAGE_CMD_GET_SDR && + data[7] == 0x3A) { + return_hosed_msg_badsize(smi_info); + return NOTIFY_STOP; + } + return NOTIFY_DONE; +} + +static struct notifier_block dell_poweredge_bt_xaction_notifier = { + .notifier_call = dell_poweredge_bt_xaction_handler, +}; + +/* + * setup_dell_poweredge_bt_xaction_handler + * @info - smi_info.device_id must be filled in already + * + * Fills in smi_info.device_id.start_transaction_pre_hook + * when we know what function to use there. + */ +static void +setup_dell_poweredge_bt_xaction_handler(struct smi_info *smi_info) +{ + struct ipmi_device_id *id = &smi_info->device_id; + if (id->manufacturer_id == DELL_IANA_MFR_ID && + smi_info->si_type == SI_BT) + register_xaction_notifier(&dell_poweredge_bt_xaction_notifier); +} + +/* + * setup_oem_data_handler + * @info - smi_info.device_id must be filled in already + * + * Fills in smi_info.device_id.oem_data_available_handler + * when we know what function to use there. + */ + +static void setup_oem_data_handler(struct smi_info *smi_info) +{ + setup_dell_poweredge_oem_data_handler(smi_info); +} + +static void setup_xaction_handlers(struct smi_info *smi_info) +{ + setup_dell_poweredge_bt_xaction_handler(smi_info); +} + +static inline void wait_for_timer_and_thread(struct smi_info *smi_info) +{ + if (smi_info->intf) { + /* The timer and thread are only running if the + interface has been started up and registered. */ + if (smi_info->thread != NULL) + kthread_stop(smi_info->thread); + del_timer_sync(&smi_info->si_timer); + } +} + +static __devinitdata struct ipmi_default_vals +{ + int type; + int port; +} ipmi_defaults[] = +{ + { .type = SI_KCS, .port = 0xca2 }, + { .type = SI_SMIC, .port = 0xca9 }, + { .type = SI_BT, .port = 0xe4 }, + { .port = 0 } +}; + +static __devinit void default_find_bmc(void) +{ + struct smi_info *info; + int i; + + for (i = 0; ; i++) { + if (!ipmi_defaults[i].port) + break; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return; + +#ifdef CONFIG_PPC_MERGE + if (check_legacy_ioport(ipmi_defaults[i].port)) + continue; +#endif + + info->addr_source = NULL; + + info->si_type = ipmi_defaults[i].type; + info->io_setup = port_setup; + info->io.addr_data = ipmi_defaults[i].port; + info->io.addr_type = IPMI_IO_ADDR_SPACE; + + info->io.addr = NULL; + info->io.regspacing = DEFAULT_REGSPACING; + info->io.regsize = DEFAULT_REGSPACING; + info->io.regshift = 0; + + if (try_smi_init(info) == 0) { + /* Found one... */ + printk(KERN_INFO "ipmi_si: Found default %s state" + " machine at %s address 0x%lx\n", + si_to_str[info->si_type], + addr_space_to_str[info->io.addr_type], + info->io.addr_data); + return; + } + } +} + +static int is_new_interface(struct smi_info *info) +{ + struct smi_info *e; + + list_for_each_entry(e, &smi_infos, link) { + if (e->io.addr_type != info->io.addr_type) + continue; + if (e->io.addr_data == info->io.addr_data) + return 0; + } + + return 1; +} + +static int try_smi_init(struct smi_info *new_smi) +{ + int rv; + + if (new_smi->addr_source) { + printk(KERN_INFO "ipmi_si: Trying %s-specified %s state" + " machine at %s address 0x%lx, slave address 0x%x," + " irq %d\n", + new_smi->addr_source, + si_to_str[new_smi->si_type], + addr_space_to_str[new_smi->io.addr_type], + new_smi->io.addr_data, + new_smi->slave_addr, new_smi->irq); + } + + mutex_lock(&smi_infos_lock); + if (!is_new_interface(new_smi)) { + printk(KERN_WARNING "ipmi_si: duplicate interface\n"); + rv = -EBUSY; + goto out_err; + } + + /* So we know not to free it unless we have allocated one. */ + new_smi->intf = NULL; + new_smi->si_sm = NULL; + new_smi->handlers = NULL; + + switch (new_smi->si_type) { + case SI_KCS: + new_smi->handlers = &kcs_smi_handlers; + break; + + case SI_SMIC: + new_smi->handlers = &smic_smi_handlers; + break; + + case SI_BT: + new_smi->handlers = &bt_smi_handlers; + break; + + default: + /* No support for anything else yet. */ + rv = -EIO; + goto out_err; + } + + /* Allocate the state machine's data and initialize it. */ + new_smi->si_sm = kmalloc(new_smi->handlers->size(), GFP_KERNEL); + if (!new_smi->si_sm) { + printk(" Could not allocate state machine memory\n"); + rv = -ENOMEM; + goto out_err; + } + new_smi->io_size = new_smi->handlers->init_data(new_smi->si_sm, + &new_smi->io); + + /* Now that we know the I/O size, we can set up the I/O. */ + rv = new_smi->io_setup(new_smi); + if (rv) { + printk(" Could not set up I/O space\n"); + goto out_err; + } + + spin_lock_init(&(new_smi->si_lock)); + spin_lock_init(&(new_smi->msg_lock)); + spin_lock_init(&(new_smi->count_lock)); + + /* Do low-level detection first. */ + if (new_smi->handlers->detect(new_smi->si_sm)) { + if (new_smi->addr_source) + printk(KERN_INFO "ipmi_si: Interface detection" + " failed\n"); + rv = -ENODEV; + goto out_err; + } + + /* Attempt a get device id command. If it fails, we probably + don't have a BMC here. */ + rv = try_get_dev_id(new_smi); + if (rv) { + if (new_smi->addr_source) + printk(KERN_INFO "ipmi_si: There appears to be no BMC" + " at this location\n"); + goto out_err; + } + + setup_oem_data_handler(new_smi); + setup_xaction_handlers(new_smi); + + INIT_LIST_HEAD(&(new_smi->xmit_msgs)); + INIT_LIST_HEAD(&(new_smi->hp_xmit_msgs)); + new_smi->curr_msg = NULL; + atomic_set(&new_smi->req_events, 0); + new_smi->run_to_completion = 0; + + new_smi->interrupt_disabled = 0; + atomic_set(&new_smi->stop_operation, 0); + new_smi->intf_num = smi_num; + smi_num++; + + /* Start clearing the flags before we enable interrupts or the + timer to avoid racing with the timer. */ + start_clear_flags(new_smi); + /* IRQ is defined to be set when non-zero. */ + if (new_smi->irq) + new_smi->si_state = SI_CLEARING_FLAGS_THEN_SET_IRQ; + + if (!new_smi->dev) { + /* If we don't already have a device from something + * else (like PCI), then register a new one. */ + new_smi->pdev = platform_device_alloc("ipmi_si", + new_smi->intf_num); + if (rv) { + printk(KERN_ERR + "ipmi_si_intf:" + " Unable to allocate platform device\n"); + goto out_err; + } + new_smi->dev = &new_smi->pdev->dev; + new_smi->dev->driver = &ipmi_driver; + + rv = platform_device_add(new_smi->pdev); + if (rv) { + printk(KERN_ERR + "ipmi_si_intf:" + " Unable to register system interface device:" + " %d\n", + rv); + goto out_err; + } + new_smi->dev_registered = 1; + } + + rv = ipmi_register_smi(&handlers, + new_smi, + &new_smi->device_id, + new_smi->dev, + "bmc", + new_smi->slave_addr); + if (rv) { + printk(KERN_ERR + "ipmi_si: Unable to register device: error %d\n", + rv); + goto out_err_stop_timer; + } + + rv = ipmi_smi_add_proc_entry(new_smi->intf, "type", + type_file_read_proc, NULL, + new_smi, THIS_MODULE); + if (rv) { + printk(KERN_ERR + "ipmi_si: Unable to create proc entry: %d\n", + rv); + goto out_err_stop_timer; + } + + rv = ipmi_smi_add_proc_entry(new_smi->intf, "si_stats", + stat_file_read_proc, NULL, + new_smi, THIS_MODULE); + if (rv) { + printk(KERN_ERR + "ipmi_si: Unable to create proc entry: %d\n", + rv); + goto out_err_stop_timer; + } + + rv = ipmi_smi_add_proc_entry(new_smi->intf, "params", + param_read_proc, NULL, + new_smi, THIS_MODULE); + if (rv) { + printk(KERN_ERR + "ipmi_si: Unable to create proc entry: %d\n", + rv); + goto out_err_stop_timer; + } + + list_add_tail(&new_smi->link, &smi_infos); + + mutex_unlock(&smi_infos_lock); + + printk(KERN_INFO "IPMI %s interface initialized\n",si_to_str[new_smi->si_type]); + + return 0; + + out_err_stop_timer: + atomic_inc(&new_smi->stop_operation); + wait_for_timer_and_thread(new_smi); + + out_err: + if (new_smi->intf) + ipmi_unregister_smi(new_smi->intf); + + if (new_smi->irq_cleanup) + new_smi->irq_cleanup(new_smi); + + /* Wait until we know that we are out of any interrupt + handlers might have been running before we freed the + interrupt. */ + synchronize_sched(); + + if (new_smi->si_sm) { + if (new_smi->handlers) + new_smi->handlers->cleanup(new_smi->si_sm); + kfree(new_smi->si_sm); + } + if (new_smi->addr_source_cleanup) + new_smi->addr_source_cleanup(new_smi); + if (new_smi->io_cleanup) + new_smi->io_cleanup(new_smi); + + if (new_smi->dev_registered) + platform_device_unregister(new_smi->pdev); + + kfree(new_smi); + + mutex_unlock(&smi_infos_lock); + + return rv; +} + +static __devinit int init_ipmi_si(void) +{ + int i; + char *str; + int rv; + + if (initialized) + return 0; + initialized = 1; + + /* Register the device drivers. */ + rv = driver_register(&ipmi_driver); + if (rv) { + printk(KERN_ERR + "init_ipmi_si: Unable to register driver: %d\n", + rv); + return rv; + } + + + /* Parse out the si_type string into its components. */ + str = si_type_str; + if (*str != '\0') { + for (i = 0; (i < SI_MAX_PARMS) && (*str != '\0'); i++) { + si_type[i] = str; + str = strchr(str, ','); + if (str) { + *str = '\0'; + str++; + } else { + break; + } + } + } + + printk(KERN_INFO "IPMI System Interface driver.\n"); + + hardcode_find_bmc(); + +#ifdef CONFIG_DMI + dmi_find_bmc(); +#endif + +#ifdef CONFIG_ACPI + acpi_find_bmc(); +#endif + +#ifdef CONFIG_PCI + rv = pci_register_driver(&ipmi_pci_driver); + if (rv){ + printk(KERN_ERR + "init_ipmi_si: Unable to register PCI driver: %d\n", + rv); + } +#endif + +#ifdef CONFIG_PPC_OF + of_register_platform_driver(&ipmi_of_platform_driver); +#endif + + if (si_trydefaults) { + mutex_lock(&smi_infos_lock); + if (list_empty(&smi_infos)) { + /* No BMC was found, try defaults. */ + mutex_unlock(&smi_infos_lock); + default_find_bmc(); + } else { + mutex_unlock(&smi_infos_lock); + } + } + + mutex_lock(&smi_infos_lock); + if (unload_when_empty && list_empty(&smi_infos)) { + mutex_unlock(&smi_infos_lock); +#ifdef CONFIG_PCI + pci_unregister_driver(&ipmi_pci_driver); +#endif + +#ifdef CONFIG_PPC_OF + of_unregister_platform_driver(&ipmi_of_platform_driver); +#endif + driver_unregister(&ipmi_driver); + printk("ipmi_si: Unable to find any System Interface(s)\n"); + return -ENODEV; + } else { + mutex_unlock(&smi_infos_lock); + return 0; + } +} +module_init(init_ipmi_si); + +static void cleanup_one_si(struct smi_info *to_clean) +{ + int rv; + unsigned long flags; + + if (!to_clean) + return; + + list_del(&to_clean->link); + + /* Tell the driver that we are shutting down. */ + atomic_inc(&to_clean->stop_operation); + + /* Make sure the timer and thread are stopped and will not run + again. */ + wait_for_timer_and_thread(to_clean); + + /* Timeouts are stopped, now make sure the interrupts are off + for the device. A little tricky with locks to make sure + there are no races. */ + spin_lock_irqsave(&to_clean->si_lock, flags); + while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { + spin_unlock_irqrestore(&to_clean->si_lock, flags); + poll(to_clean); + schedule_timeout_uninterruptible(1); + spin_lock_irqsave(&to_clean->si_lock, flags); + } + disable_si_irq(to_clean); + spin_unlock_irqrestore(&to_clean->si_lock, flags); + while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { + poll(to_clean); + schedule_timeout_uninterruptible(1); + } + + /* Clean up interrupts and make sure that everything is done. */ + if (to_clean->irq_cleanup) + to_clean->irq_cleanup(to_clean); + while (to_clean->curr_msg || (to_clean->si_state != SI_NORMAL)) { + poll(to_clean); + schedule_timeout_uninterruptible(1); + } + + rv = ipmi_unregister_smi(to_clean->intf); + if (rv) { + printk(KERN_ERR + "ipmi_si: Unable to unregister device: errno=%d\n", + rv); + } + + to_clean->handlers->cleanup(to_clean->si_sm); + + kfree(to_clean->si_sm); + + if (to_clean->addr_source_cleanup) + to_clean->addr_source_cleanup(to_clean); + if (to_clean->io_cleanup) + to_clean->io_cleanup(to_clean); + + if (to_clean->dev_registered) + platform_device_unregister(to_clean->pdev); + + kfree(to_clean); +} + +static __exit void cleanup_ipmi_si(void) +{ + struct smi_info *e, *tmp_e; + + if (!initialized) + return; + +#ifdef CONFIG_PCI + pci_unregister_driver(&ipmi_pci_driver); +#endif + +#ifdef CONFIG_PPC_OF + of_unregister_platform_driver(&ipmi_of_platform_driver); +#endif + + mutex_lock(&smi_infos_lock); + list_for_each_entry_safe(e, tmp_e, &smi_infos, link) + cleanup_one_si(e); + mutex_unlock(&smi_infos_lock); + + driver_unregister(&ipmi_driver); +} +module_exit(cleanup_ipmi_si); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Corey Minyard "); +MODULE_DESCRIPTION("Interface to the IPMI driver for the KCS, SMIC, and BT system interfaces."); +#if defined(__VMKLNX__) +MODULE_VERSION(IPMI_DRIVER_VERSION); +#endif diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.c b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.c new file mode 100644 index 0000000..e64ea7d --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/ipmi_smic_sm.c @@ -0,0 +1,607 @@ +/* + * ipmi_smic_sm.c + * + * The state-machine driver for an IPMI SMIC driver + * + * It started as a copy of Corey Minyard's driver for the KSC interface + * and the kernel patch "mmcdev-patch-245" by HP + * + * modified by: Hannes Schulz + * ipmi@schwaar.com + * + * + * Corey Minyard's driver for the KSC interface has the following + * copyright notice: + * Copyright 2002 MontaVista Software Inc. + * + * the kernel patch "mmcdev-patch-245" by HP has the following + * copyright notice: + * (c) Copyright 2001 Grant Grundler (c) Copyright + * 2001 Hewlett-Packard Company + * + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include /* For printk. */ +#include +#include +#include +#include /* for completion codes */ +#include "ipmi_si_sm.h" + +/* smic_debug is a bit-field + * SMIC_DEBUG_ENABLE - turned on for now + * SMIC_DEBUG_MSG - commands and their responses + * SMIC_DEBUG_STATES - state machine +*/ +#define SMIC_DEBUG_STATES 4 +#define SMIC_DEBUG_MSG 2 +#define SMIC_DEBUG_ENABLE 1 + +static int smic_debug = 1; +module_param(smic_debug, int, 0644); +MODULE_PARM_DESC(smic_debug, "debug bitmask, 1=enable, 2=messages, 4=states"); + +enum smic_states { + SMIC_IDLE, + SMIC_START_OP, + SMIC_OP_OK, + SMIC_WRITE_START, + SMIC_WRITE_NEXT, + SMIC_WRITE_END, + SMIC_WRITE2READ, + SMIC_READ_START, + SMIC_READ_NEXT, + SMIC_READ_END, + SMIC_HOSED +}; + +#define MAX_SMIC_READ_SIZE 80 +#define MAX_SMIC_WRITE_SIZE 80 +#define SMIC_MAX_ERROR_RETRIES 3 + +/* Timeouts in microseconds. */ +#define SMIC_RETRY_TIMEOUT 2000000 + +/* SMIC Flags Register Bits */ +#define SMIC_RX_DATA_READY 0x80 +#define SMIC_TX_DATA_READY 0x40 +/* + * SMIC_SMI and SMIC_EVM_DATA_AVAIL are only used by + * a few systems, and then only by Systems Management + * Interrupts, not by the OS. Always ignore these bits. + * + */ +#define SMIC_SMI 0x10 +#define SMIC_EVM_DATA_AVAIL 0x08 +#define SMIC_SMS_DATA_AVAIL 0x04 +#define SMIC_FLAG_BSY 0x01 + +/* SMIC Error Codes */ +#define EC_NO_ERROR 0x00 +#define EC_ABORTED 0x01 +#define EC_ILLEGAL_CONTROL 0x02 +#define EC_NO_RESPONSE 0x03 +#define EC_ILLEGAL_COMMAND 0x04 +#define EC_BUFFER_FULL 0x05 + +struct si_sm_data +{ + enum smic_states state; + struct si_sm_io *io; + unsigned char write_data[MAX_SMIC_WRITE_SIZE]; + int write_pos; + int write_count; + int orig_write_count; + unsigned char read_data[MAX_SMIC_READ_SIZE]; + int read_pos; + int truncated; + unsigned int error_retries; + long smic_timeout; +}; + +static unsigned int init_smic_data (struct si_sm_data *smic, + struct si_sm_io *io) +{ + smic->state = SMIC_IDLE; + smic->io = io; + smic->write_pos = 0; + smic->write_count = 0; + smic->orig_write_count = 0; + smic->read_pos = 0; + smic->error_retries = 0; + smic->truncated = 0; + smic->smic_timeout = SMIC_RETRY_TIMEOUT; + + /* We use 3 bytes of I/O. */ + return 3; +} + +static int start_smic_transaction(struct si_sm_data *smic, + unsigned char *data, unsigned int size) +{ + unsigned int i; + + if (size < 2) + return IPMI_REQ_LEN_INVALID_ERR; + if (size > MAX_SMIC_WRITE_SIZE) + return IPMI_REQ_LEN_EXCEEDED_ERR; + + if ((smic->state != SMIC_IDLE) && (smic->state != SMIC_HOSED)) + return IPMI_NOT_IN_MY_STATE_ERR; + + if (smic_debug & SMIC_DEBUG_MSG) { + printk(KERN_INFO "start_smic_transaction -"); + for (i = 0; i < size; i ++) { + printk (" %02x", (unsigned char) (data [i])); + } + printk ("\n"); + } + smic->error_retries = 0; + memcpy(smic->write_data, data, size); + smic->write_count = size; + smic->orig_write_count = size; + smic->write_pos = 0; + smic->read_pos = 0; + smic->state = SMIC_START_OP; + smic->smic_timeout = SMIC_RETRY_TIMEOUT; + return 0; +} + +static int smic_get_result(struct si_sm_data *smic, + unsigned char *data, unsigned int length) +{ + int i; + + if (smic_debug & SMIC_DEBUG_MSG) { + printk (KERN_INFO "smic_get result -"); + for (i = 0; i < smic->read_pos; i ++) { + printk (" %02x", (smic->read_data [i])); + } + printk ("\n"); + } + if (length < smic->read_pos) { + smic->read_pos = length; + smic->truncated = 1; + } + memcpy(data, smic->read_data, smic->read_pos); + + if ((length >= 3) && (smic->read_pos < 3)) { + data[2] = IPMI_ERR_UNSPECIFIED; + smic->read_pos = 3; + } + if (smic->truncated) { + data[2] = IPMI_ERR_MSG_TRUNCATED; + smic->truncated = 0; + } + return smic->read_pos; +} + +static inline unsigned char read_smic_flags(struct si_sm_data *smic) +{ + return smic->io->inputb(smic->io, 2); +} + +static inline unsigned char read_smic_status(struct si_sm_data *smic) +{ + return smic->io->inputb(smic->io, 1); +} + +static inline unsigned char read_smic_data(struct si_sm_data *smic) +{ + return smic->io->inputb(smic->io, 0); +} + +static inline void write_smic_flags(struct si_sm_data *smic, + unsigned char flags) +{ + smic->io->outputb(smic->io, 2, flags); +} + +static inline void write_smic_control(struct si_sm_data *smic, + unsigned char control) +{ + smic->io->outputb(smic->io, 1, control); +} + +static inline void write_si_sm_data (struct si_sm_data *smic, + unsigned char data) +{ + smic->io->outputb(smic->io, 0, data); +} + +static inline void start_error_recovery(struct si_sm_data *smic, char *reason) +{ + (smic->error_retries)++; + if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) { + if (smic_debug & SMIC_DEBUG_ENABLE) { + printk(KERN_WARNING + "ipmi_smic_drv: smic hosed: %s\n", reason); + } + smic->state = SMIC_HOSED; + } else { + smic->write_count = smic->orig_write_count; + smic->write_pos = 0; + smic->read_pos = 0; + smic->state = SMIC_START_OP; + smic->smic_timeout = SMIC_RETRY_TIMEOUT; + } +} + +static inline void write_next_byte(struct si_sm_data *smic) +{ + write_si_sm_data(smic, smic->write_data[smic->write_pos]); + (smic->write_pos)++; + (smic->write_count)--; +} + +static inline void read_next_byte (struct si_sm_data *smic) +{ + if (smic->read_pos >= MAX_SMIC_READ_SIZE) { + read_smic_data (smic); + smic->truncated = 1; + } else { + smic->read_data[smic->read_pos] = read_smic_data(smic); + (smic->read_pos)++; + } +} + +/* SMIC Control/Status Code Components */ +#define SMIC_GET_STATUS 0x00 /* Control form's name */ +#define SMIC_READY 0x00 /* Status form's name */ +#define SMIC_WR_START 0x01 /* Unified Control/Status names... */ +#define SMIC_WR_NEXT 0x02 +#define SMIC_WR_END 0x03 +#define SMIC_RD_START 0x04 +#define SMIC_RD_NEXT 0x05 +#define SMIC_RD_END 0x06 +#define SMIC_CODE_MASK 0x0f + +#define SMIC_CONTROL 0x00 +#define SMIC_STATUS 0x80 +#define SMIC_CS_MASK 0x80 + +#define SMIC_SMS 0x40 +#define SMIC_SMM 0x60 +#define SMIC_STREAM_MASK 0x60 + +/* SMIC Control Codes */ +#define SMIC_CC_SMS_GET_STATUS (SMIC_CONTROL|SMIC_SMS|SMIC_GET_STATUS) +#define SMIC_CC_SMS_WR_START (SMIC_CONTROL|SMIC_SMS|SMIC_WR_START) +#define SMIC_CC_SMS_WR_NEXT (SMIC_CONTROL|SMIC_SMS|SMIC_WR_NEXT) +#define SMIC_CC_SMS_WR_END (SMIC_CONTROL|SMIC_SMS|SMIC_WR_END) +#define SMIC_CC_SMS_RD_START (SMIC_CONTROL|SMIC_SMS|SMIC_RD_START) +#define SMIC_CC_SMS_RD_NEXT (SMIC_CONTROL|SMIC_SMS|SMIC_RD_NEXT) +#define SMIC_CC_SMS_RD_END (SMIC_CONTROL|SMIC_SMS|SMIC_RD_END) + +#define SMIC_CC_SMM_GET_STATUS (SMIC_CONTROL|SMIC_SMM|SMIC_GET_STATUS) +#define SMIC_CC_SMM_WR_START (SMIC_CONTROL|SMIC_SMM|SMIC_WR_START) +#define SMIC_CC_SMM_WR_NEXT (SMIC_CONTROL|SMIC_SMM|SMIC_WR_NEXT) +#define SMIC_CC_SMM_WR_END (SMIC_CONTROL|SMIC_SMM|SMIC_WR_END) +#define SMIC_CC_SMM_RD_START (SMIC_CONTROL|SMIC_SMM|SMIC_RD_START) +#define SMIC_CC_SMM_RD_NEXT (SMIC_CONTROL|SMIC_SMM|SMIC_RD_NEXT) +#define SMIC_CC_SMM_RD_END (SMIC_CONTROL|SMIC_SMM|SMIC_RD_END) + +/* SMIC Status Codes */ +#define SMIC_SC_SMS_READY (SMIC_STATUS|SMIC_SMS|SMIC_READY) +#define SMIC_SC_SMS_WR_START (SMIC_STATUS|SMIC_SMS|SMIC_WR_START) +#define SMIC_SC_SMS_WR_NEXT (SMIC_STATUS|SMIC_SMS|SMIC_WR_NEXT) +#define SMIC_SC_SMS_WR_END (SMIC_STATUS|SMIC_SMS|SMIC_WR_END) +#define SMIC_SC_SMS_RD_START (SMIC_STATUS|SMIC_SMS|SMIC_RD_START) +#define SMIC_SC_SMS_RD_NEXT (SMIC_STATUS|SMIC_SMS|SMIC_RD_NEXT) +#define SMIC_SC_SMS_RD_END (SMIC_STATUS|SMIC_SMS|SMIC_RD_END) + +#define SMIC_SC_SMM_READY (SMIC_STATUS|SMIC_SMM|SMIC_READY) +#define SMIC_SC_SMM_WR_START (SMIC_STATUS|SMIC_SMM|SMIC_WR_START) +#define SMIC_SC_SMM_WR_NEXT (SMIC_STATUS|SMIC_SMM|SMIC_WR_NEXT) +#define SMIC_SC_SMM_WR_END (SMIC_STATUS|SMIC_SMM|SMIC_WR_END) +#define SMIC_SC_SMM_RD_START (SMIC_STATUS|SMIC_SMM|SMIC_RD_START) +#define SMIC_SC_SMM_RD_NEXT (SMIC_STATUS|SMIC_SMM|SMIC_RD_NEXT) +#define SMIC_SC_SMM_RD_END (SMIC_STATUS|SMIC_SMM|SMIC_RD_END) + +/* these are the control/status codes we actually use + SMIC_CC_SMS_GET_STATUS 0x40 + SMIC_CC_SMS_WR_START 0x41 + SMIC_CC_SMS_WR_NEXT 0x42 + SMIC_CC_SMS_WR_END 0x43 + SMIC_CC_SMS_RD_START 0x44 + SMIC_CC_SMS_RD_NEXT 0x45 + SMIC_CC_SMS_RD_END 0x46 + + SMIC_SC_SMS_READY 0xC0 + SMIC_SC_SMS_WR_START 0xC1 + SMIC_SC_SMS_WR_NEXT 0xC2 + SMIC_SC_SMS_WR_END 0xC3 + SMIC_SC_SMS_RD_START 0xC4 + SMIC_SC_SMS_RD_NEXT 0xC5 + SMIC_SC_SMS_RD_END 0xC6 +*/ + +static enum si_sm_result smic_event (struct si_sm_data *smic, long time) +{ + unsigned char status; + unsigned char flags; + unsigned char data; + + if (smic->state == SMIC_HOSED) { + init_smic_data(smic, smic->io); + return SI_SM_HOSED; + } + if (smic->state != SMIC_IDLE) { + if (smic_debug & SMIC_DEBUG_STATES) { + printk(KERN_INFO + "smic_event - smic->smic_timeout = %ld," + " time = %ld\n", + smic->smic_timeout, time); + } +/* FIXME: smic_event is sometimes called with time > SMIC_RETRY_TIMEOUT */ + if (time < SMIC_RETRY_TIMEOUT) { + smic->smic_timeout -= time; + if (smic->smic_timeout < 0) { + start_error_recovery(smic, "smic timed out."); + return SI_SM_CALL_WITH_DELAY; + } + } + } + flags = read_smic_flags(smic); + if (flags & SMIC_FLAG_BSY) + return SI_SM_CALL_WITH_DELAY; + + status = read_smic_status (smic); + if (smic_debug & SMIC_DEBUG_STATES) + printk(KERN_INFO + "smic_event - state = %d, flags = 0x%02x," + " status = 0x%02x\n", + smic->state, flags, status); + + switch (smic->state) { + case SMIC_IDLE: + /* in IDLE we check for available messages */ + if (flags & SMIC_SMS_DATA_AVAIL) + { + return SI_SM_ATTN; + } + return SI_SM_IDLE; + + case SMIC_START_OP: + /* sanity check whether smic is really idle */ + write_smic_control(smic, SMIC_CC_SMS_GET_STATUS); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_OP_OK; + break; + + case SMIC_OP_OK: + if (status != SMIC_SC_SMS_READY) { + /* this should not happen */ + start_error_recovery(smic, + "state = SMIC_OP_OK," + " status != SMIC_SC_SMS_READY"); + return SI_SM_CALL_WITH_DELAY; + } + /* OK so far; smic is idle let us start ... */ + write_smic_control(smic, SMIC_CC_SMS_WR_START); + write_next_byte(smic); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_WRITE_START; + break; + + case SMIC_WRITE_START: + if (status != SMIC_SC_SMS_WR_START) { + start_error_recovery(smic, + "state = SMIC_WRITE_START, " + "status != SMIC_SC_SMS_WR_START"); + return SI_SM_CALL_WITH_DELAY; + } + /* we must not issue WR_(NEXT|END) unless + TX_DATA_READY is set */ + if (flags & SMIC_TX_DATA_READY) { + if (smic->write_count == 1) { + /* last byte */ + write_smic_control(smic, SMIC_CC_SMS_WR_END); + smic->state = SMIC_WRITE_END; + } else { + write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); + smic->state = SMIC_WRITE_NEXT; + } + write_next_byte(smic); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + } + else { + return SI_SM_CALL_WITH_DELAY; + } + break; + + case SMIC_WRITE_NEXT: + if (status != SMIC_SC_SMS_WR_NEXT) { + start_error_recovery(smic, + "state = SMIC_WRITE_NEXT, " + "status != SMIC_SC_SMS_WR_NEXT"); + return SI_SM_CALL_WITH_DELAY; + } + /* this is the same code as in SMIC_WRITE_START */ + if (flags & SMIC_TX_DATA_READY) { + if (smic->write_count == 1) { + write_smic_control(smic, SMIC_CC_SMS_WR_END); + smic->state = SMIC_WRITE_END; + } + else { + write_smic_control(smic, SMIC_CC_SMS_WR_NEXT); + smic->state = SMIC_WRITE_NEXT; + } + write_next_byte(smic); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + } + else { + return SI_SM_CALL_WITH_DELAY; + } + break; + + case SMIC_WRITE_END: + if (status != SMIC_SC_SMS_WR_END) { + start_error_recovery (smic, + "state = SMIC_WRITE_END, " + "status != SMIC_SC_SMS_WR_END"); + return SI_SM_CALL_WITH_DELAY; + } + /* data register holds an error code */ + data = read_smic_data(smic); + if (data != 0) { + if (smic_debug & SMIC_DEBUG_ENABLE) { + printk(KERN_INFO + "SMIC_WRITE_END: data = %02x\n", data); + } + start_error_recovery(smic, + "state = SMIC_WRITE_END, " + "data != SUCCESS"); + return SI_SM_CALL_WITH_DELAY; + } else { + smic->state = SMIC_WRITE2READ; + } + break; + + case SMIC_WRITE2READ: + /* we must wait for RX_DATA_READY to be set before we + can continue */ + if (flags & SMIC_RX_DATA_READY) { + write_smic_control(smic, SMIC_CC_SMS_RD_START); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_READ_START; + } else { + return SI_SM_CALL_WITH_DELAY; + } + break; + + case SMIC_READ_START: + if (status != SMIC_SC_SMS_RD_START) { + start_error_recovery(smic, + "state = SMIC_READ_START, " + "status != SMIC_SC_SMS_RD_START"); + return SI_SM_CALL_WITH_DELAY; + } + if (flags & SMIC_RX_DATA_READY) { + read_next_byte(smic); + write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_READ_NEXT; + } else { + return SI_SM_CALL_WITH_DELAY; + } + break; + + case SMIC_READ_NEXT: + switch (status) { + /* smic tells us that this is the last byte to be read + --> clean up */ + case SMIC_SC_SMS_RD_END: + read_next_byte(smic); + write_smic_control(smic, SMIC_CC_SMS_RD_END); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_READ_END; + break; + case SMIC_SC_SMS_RD_NEXT: + if (flags & SMIC_RX_DATA_READY) { + read_next_byte(smic); + write_smic_control(smic, SMIC_CC_SMS_RD_NEXT); + write_smic_flags(smic, flags | SMIC_FLAG_BSY); + smic->state = SMIC_READ_NEXT; + } else { + return SI_SM_CALL_WITH_DELAY; + } + break; + default: + start_error_recovery( + smic, + "state = SMIC_READ_NEXT, " + "status != SMIC_SC_SMS_RD_(NEXT|END)"); + return SI_SM_CALL_WITH_DELAY; + } + break; + + case SMIC_READ_END: + if (status != SMIC_SC_SMS_READY) { + start_error_recovery(smic, + "state = SMIC_READ_END, " + "status != SMIC_SC_SMS_READY"); + return SI_SM_CALL_WITH_DELAY; + } + data = read_smic_data(smic); + /* data register holds an error code */ + if (data != 0) { + if (smic_debug & SMIC_DEBUG_ENABLE) { + printk(KERN_INFO + "SMIC_READ_END: data = %02x\n", data); + } + start_error_recovery(smic, + "state = SMIC_READ_END, " + "data != SUCCESS"); + return SI_SM_CALL_WITH_DELAY; + } else { + smic->state = SMIC_IDLE; + return SI_SM_TRANSACTION_COMPLETE; + } + + case SMIC_HOSED: + init_smic_data(smic, smic->io); + return SI_SM_HOSED; + + default: + if (smic_debug & SMIC_DEBUG_ENABLE) { + printk(KERN_WARNING "smic->state = %d\n", smic->state); + start_error_recovery(smic, "state = UNKNOWN"); + return SI_SM_CALL_WITH_DELAY; + } + } + smic->smic_timeout = SMIC_RETRY_TIMEOUT; + return SI_SM_CALL_WITHOUT_DELAY; +} + +static int smic_detect(struct si_sm_data *smic) +{ + /* It's impossible for the SMIC fnags register to be all 1's, + (assuming a properly functioning, self-initialized BMC) + but that's what you get from reading a bogus address, so we + test that first. */ + if (read_smic_flags(smic) == 0xff) + return 1; + + return 0; +} + +static void smic_cleanup(struct si_sm_data *kcs) +{ +} + +static int smic_size(void) +{ + return sizeof(struct si_sm_data); +} + +struct si_sm_handlers smic_smi_handlers = +{ + .init_data = init_smic_data, + .start_transaction = start_smic_transaction, + .get_result = smic_get_result, + .event = smic_event, + .detect = smic_detect, + .cleanup = smic_cleanup, + .size = smic_size, +}; diff --git a/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/kcompat.h b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/kcompat.h new file mode 100644 index 0000000..51557a5 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/openipmi/ipmi_si_drv/kcompat.h @@ -0,0 +1,6 @@ +#ifndef __KCOMPAT_H__ +#define __KCOMPAT_H__ + +#undef CONFIG_ACPI /* Disable the use of CONFIG_ACPI */ + +#endif /* #ifndef __KCOMPAT_H__ */ diff --git a/vmkdrivers/src_current/drivers/char/random/halfmd4.c b/vmkdrivers/src_current/drivers/char/random/halfmd4.c new file mode 100644 index 0000000..67c6a0c --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/random/halfmd4.c @@ -0,0 +1,71 @@ +#include +#include +#include + +/* F, G and H are basic MD4 functions: selection, majority, parity */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* + * The generic round function. The application is so specific that + * we don't bother protecting all the arguments with parens, as is generally + * good macro practice, in favor of extra legibility. + * Rotation is separate from addition to prevent recomputation + */ +#define ROUND(f, a, b, c, d, x, s) \ + (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) +#define K1 0 +#define K2 013240474631UL +#define K3 015666365641UL + +#if defined(__VMKLNX__) +#undef EXPORT_SYMBOL +#define EXPORT_SYMBOL(x) +#endif /* __VMKLNX__ */ + +/* + * Basic cut-down MD4 transform. Returns only 32 bits of result. + */ +__u32 half_md4_transform(__u32 buf[4], __u32 const in[8]) +{ + __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + /* Round 1 */ + ROUND(F, a, b, c, d, in[0] + K1, 3); + ROUND(F, d, a, b, c, in[1] + K1, 7); + ROUND(F, c, d, a, b, in[2] + K1, 11); + ROUND(F, b, c, d, a, in[3] + K1, 19); + ROUND(F, a, b, c, d, in[4] + K1, 3); + ROUND(F, d, a, b, c, in[5] + K1, 7); + ROUND(F, c, d, a, b, in[6] + K1, 11); + ROUND(F, b, c, d, a, in[7] + K1, 19); + + /* Round 2 */ + ROUND(G, a, b, c, d, in[1] + K2, 3); + ROUND(G, d, a, b, c, in[3] + K2, 5); + ROUND(G, c, d, a, b, in[5] + K2, 9); + ROUND(G, b, c, d, a, in[7] + K2, 13); + ROUND(G, a, b, c, d, in[0] + K2, 3); + ROUND(G, d, a, b, c, in[2] + K2, 5); + ROUND(G, c, d, a, b, in[4] + K2, 9); + ROUND(G, b, c, d, a, in[6] + K2, 13); + + /* Round 3 */ + ROUND(H, a, b, c, d, in[3] + K3, 3); + ROUND(H, d, a, b, c, in[7] + K3, 9); + ROUND(H, c, d, a, b, in[2] + K3, 11); + ROUND(H, b, c, d, a, in[6] + K3, 15); + ROUND(H, a, b, c, d, in[1] + K3, 3); + ROUND(H, d, a, b, c, in[5] + K3, 9); + ROUND(H, c, d, a, b, in[0] + K3, 11); + ROUND(H, b, c, d, a, in[4] + K3, 15); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; + + return buf[1]; /* "most hashed" word */ +} +EXPORT_SYMBOL(half_md4_transform); diff --git a/vmkdrivers/src_current/drivers/char/random/random.c b/vmkdrivers/src_current/drivers/char/random/random.c new file mode 100644 index 0000000..3f9e8ba --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/random/random.c @@ -0,0 +1,2000 @@ +/* + * Portions Copyright 2008 VMware, Inc. + */ +/* + * random.c -- A strong random number generator + * + * Copyright Matt Mackall , 2003, 2004, 2005 + * + * Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All + * rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, and the entire permission notice in its entirety, + * including the disclaimer of warranties. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * ALTERNATIVELY, this product may be distributed under the terms of + * the GNU General Public License, in which case the provisions of the GPL are + * required INSTEAD OF the above restrictions. (This clause is + * necessary due to a potential bad interaction between the GPL and + * the restrictions contained in a BSD-style copyright.) + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF + * WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + */ + +/* + * (now, with legal B.S. out of the way.....) + * + * This routine gathers environmental noise from device drivers, etc., + * and returns good random numbers, suitable for cryptographic use. + * Besides the obvious cryptographic uses, these numbers are also good + * for seeding TCP sequence numbers, and other places where it is + * desirable to have numbers which are not only random, but hard to + * predict by an attacker. + * + * Theory of operation + * =================== + * + * Computers are very predictable devices. Hence it is extremely hard + * to produce truly random numbers on a computer --- as opposed to + * pseudo-random numbers, which can easily generated by using a + * algorithm. Unfortunately, it is very easy for attackers to guess + * the sequence of pseudo-random number generators, and for some + * applications this is not acceptable. So instead, we must try to + * gather "environmental noise" from the computer's environment, which + * must be hard for outside attackers to observe, and use that to + * generate random numbers. In a Unix environment, this is best done + * from inside the kernel. + * + * Sources of randomness from the environment include inter-keyboard + * timings, inter-interrupt timings from some interrupts, and other + * events which are both (a) non-deterministic and (b) hard for an + * outside observer to measure. Randomness from these sources are + * added to an "entropy pool", which is mixed using a CRC-like function. + * This is not cryptographically strong, but it is adequate assuming + * the randomness is not chosen maliciously, and it is fast enough that + * the overhead of doing it on every interrupt is very reasonable. + * As random bytes are mixed into the entropy pool, the routines keep + * an *estimate* of how many bits of randomness have been stored into + * the random number generator's internal state. + * + * When random bytes are desired, they are obtained by taking the SHA + * hash of the contents of the "entropy pool". The SHA hash avoids + * exposing the internal state of the entropy pool. It is believed to + * be computationally infeasible to derive any useful information + * about the input of SHA from its output. Even if it is possible to + * analyze SHA in some clever way, as long as the amount of data + * returned from the generator is less than the inherent entropy in + * the pool, the output data is totally unpredictable. For this + * reason, the routine decreases its internal estimate of how many + * bits of "true randomness" are contained in the entropy pool as it + * outputs random numbers. + * + * If this estimate goes to zero, the routine can still generate + * random numbers; however, an attacker may (at least in theory) be + * able to infer the future output of the generator from prior + * outputs. This requires successful cryptanalysis of SHA, which is + * not believed to be feasible, but there is a remote possibility. + * Nonetheless, these numbers should be useful for the vast majority + * of purposes. + * + * Exported interfaces ---- output + * =============================== + * + * There are three exported interfaces; the first is one designed to + * be used from within the kernel: + * + * void get_random_bytes(void *buf, int nbytes); + * + * This interface will return the requested number of random bytes, + * and place it in the requested buffer. + * + * The two other interfaces are two character devices /dev/random and + * /dev/urandom. /dev/random is suitable for use when very high + * quality randomness is desired (for example, for key generation or + * one-time pads), as it will only return a maximum of the number of + * bits of randomness (as estimated by the random number generator) + * contained in the entropy pool. + * + * The /dev/urandom device does not have this limit, and will return + * as many bytes as are requested. As more and more random bytes are + * requested without giving time for the entropy pool to recharge, + * this will result in random numbers that are merely cryptographically + * strong. For many applications, however, this is acceptable. + * + * Exported interfaces ---- input + * ============================== + * + * The current exported interfaces for gathering environmental noise + * from the devices are: + * + * void add_input_randomness(unsigned int type, unsigned int code, + * unsigned int value); + * void add_interrupt_randomness(int irq); + * + * add_input_randomness() uses the input layer interrupt timing, as well as + * the event type information from the hardware. + * + * add_interrupt_randomness() uses the inter-interrupt timing as random + * inputs to the entropy pool. Note that not all interrupts are good + * sources of randomness! For example, the timer interrupts is not a + * good choice, because the periodicity of the interrupts is too + * regular, and hence predictable to an attacker. Disk interrupts are + * a better measure, since the timing of the disk interrupts are more + * unpredictable. + * + * All of these routines try to estimate how many bits of randomness a + * particular randomness source. They do this by keeping track of the + * first and second order deltas of the event timings. + * + * Ensuring unpredictability at system startup + * ============================================ + * + * When any operating system starts up, it will go through a sequence + * of actions that are fairly predictable by an adversary, especially + * if the start-up does not involve interaction with a human operator. + * This reduces the actual number of bits of unpredictability in the + * entropy pool below the value in entropy_count. In order to + * counteract this effect, it helps to carry information in the + * entropy pool across shut-downs and start-ups. To do this, put the + * following lines an appropriate script which is run during the boot + * sequence: + * + * echo "Initializing random number generator..." + * random_seed=/var/run/random-seed + * # Carry a random seed from start-up to start-up + * # Load and then save the whole entropy pool + * if [ -f $random_seed ]; then + * cat $random_seed >/dev/urandom + * else + * touch $random_seed + * fi + * chmod 600 $random_seed + * dd if=/dev/urandom of=$random_seed count=1 bs=512 + * + * and the following lines in an appropriate script which is run as + * the system is shutdown: + * + * # Carry a random seed from shut-down to start-up + * # Save the whole entropy pool + * echo "Saving random seed..." + * random_seed=/var/run/random-seed + * touch $random_seed + * chmod 600 $random_seed + * dd if=/dev/urandom of=$random_seed count=1 bs=512 + * + * For example, on most modern systems using the System V init + * scripts, such code fragments would be found in + * /etc/rc.d/init.d/random. On older Linux systems, the correct script + * location might be in /etc/rcb.d/rc.local or /etc/rc.d/rc.0. + * + * Effectively, these commands cause the contents of the entropy pool + * to be saved at shut-down time and reloaded into the entropy pool at + * start-up. (The 'dd' in the addition to the bootup script is to + * make sure that /etc/random-seed is different for every start-up, + * even if the system crashes without executing rc.0.) Even with + * complete knowledge of the start-up activities, predicting the state + * of the entropy pool requires knowledge of the previous history of + * the system. + * + * Configuring the /dev/random driver under Linux + * ============================================== + * + * The /dev/random driver under Linux uses minor numbers 8 and 9 of + * the /dev/mem major number (#1). So if your system does not have + * /dev/random and /dev/urandom created already, they can be created + * by using the commands: + * + * mknod /dev/random c 1 8 + * mknod /dev/urandom c 1 9 + * + * Acknowledgements: + * ================= + * + * Ideas for constructing this random number generator were derived + * from Pretty Good Privacy's random number generator, and from private + * discussions with Phil Karn. Colin Plumb provided a faster random + * number generator, which speed up the mixing function of the entropy + * pool, taken from PGPfone. Dale Worley has also contributed many + * useful ideas and suggestions to improve this driver. + * + * Any flaws in the design are solely my responsibility, and should + * not be attributed to the Phil, Colin, or any of authors of PGP. + * + * Further background information on this topic may be obtained from + * RFC 1750, "Randomness Recommendations for Security", by Donald + * Eastlake, Steve Crocker, and Jeff Schiller. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#if defined(__VMKLNX__) +#include +#include + +// Default version stamp +MODULE_VERSION(LINUX_MODULE_VERSION); +// License +MODULE_LICENSE("GPL"); +#endif /* __VMKLNX__ */ +/* + * Configuration information + */ +#define INPUT_POOL_WORDS 128 +#define OUTPUT_POOL_WORDS 32 +#define SEC_XFER_SIZE 512 + + +/* + * The minimum number of bits of entropy before we wake up a read on + * /dev/random. Should be enough to do a significant reseed. + */ +static int random_read_wakeup_thresh = 64; + +/* + * If the entropy count falls under this number of bits, then we + * should wake up processes which are selecting or polling on write + * access to /dev/random. + */ +static int random_write_wakeup_thresh = 128; + +/* + * When the input pool goes over trickle_thresh, start dropping most + * samples to avoid wasting CPU time and reduce lock contention. + */ + +static int trickle_thresh __read_mostly = INPUT_POOL_WORDS * 28; + +#if !defined(__VMKLNX__) +/* + * TODO: Per kalyanc, per CPU variable is not supported in vmklinux + * PR TBD: we really need this (massive cache contention on trickle_count) + */ +static DEFINE_PER_CPU(int, trickle_count) = 0; +#else +/* + * Roll our own per PCPU variable for this release + */ +static char *trickle_count = NULL; +#undef __get_cpu_var +#define __get_cpu_var(var) (*(int *)&var[smp_processor_id() * VMK_L1_CACHELINE_SIZE]) + +//XXX Define a few no-op functions here to reduce #ifdefs below +void touch_atime(struct vfsmount *f_vfsmnt, struct dentry *f_dentry) +{ + return; +} +struct timespec current_fs_time(struct super_block *sb) +{ + struct timespec notime; + + return notime; +} + +// XXX Predeclare this here to avoid an extra ifdef +static int rand_init_uninit(int init); + +// XXX Predeclare this here because functions exported to vmkapi use it +static ssize_t +random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos); +#endif /* __VMKLNX__ */ + +/* + * A pool of size .poolwords is stirred with a primitive polynomial + * of degree .poolwords over GF(2). The taps for various sizes are + * defined below. They are chosen to be evenly spaced (minimum RMS + * distance from evenly spaced; the numbers in the comments are a + * scaled squared error sum) except for the last tap, which is 1 to + * get the twisting happening as fast as possible. + */ +static struct poolinfo { + int poolwords; + int tap1, tap2, tap3, tap4, tap5; +} poolinfo_table[] = { + /* x^128 + x^103 + x^76 + x^51 +x^25 + x + 1 -- 105 */ + { 128, 103, 76, 51, 25, 1 }, + /* x^32 + x^26 + x^20 + x^14 + x^7 + x + 1 -- 15 */ + { 32, 26, 20, 14, 7, 1 }, +#if 0 + /* x^2048 + x^1638 + x^1231 + x^819 + x^411 + x + 1 -- 115 */ + { 2048, 1638, 1231, 819, 411, 1 }, + + /* x^1024 + x^817 + x^615 + x^412 + x^204 + x + 1 -- 290 */ + { 1024, 817, 615, 412, 204, 1 }, + + /* x^1024 + x^819 + x^616 + x^410 + x^207 + x^2 + 1 -- 115 */ + { 1024, 819, 616, 410, 207, 2 }, + + /* x^512 + x^411 + x^308 + x^208 + x^104 + x + 1 -- 225 */ + { 512, 411, 308, 208, 104, 1 }, + + /* x^512 + x^409 + x^307 + x^206 + x^102 + x^2 + 1 -- 95 */ + { 512, 409, 307, 206, 102, 2 }, + /* x^512 + x^409 + x^309 + x^205 + x^103 + x^2 + 1 -- 95 */ + { 512, 409, 309, 205, 103, 2 }, + + /* x^256 + x^205 + x^155 + x^101 + x^52 + x + 1 -- 125 */ + { 256, 205, 155, 101, 52, 1 }, + + /* x^128 + x^103 + x^78 + x^51 + x^27 + x^2 + 1 -- 70 */ + { 128, 103, 78, 51, 27, 2 }, + + /* x^64 + x^52 + x^39 + x^26 + x^14 + x + 1 -- 15 */ + { 64, 52, 39, 26, 14, 1 }, +#endif +}; + +#define POOLBITS poolwords*32 +#define POOLBYTES poolwords*4 + +/* + * For the purposes of better mixing, we use the CRC-32 polynomial as + * well to make a twisted Generalized Feedback Shift Reigster + * + * (See M. Matsumoto & Y. Kurita, 1992. Twisted GFSR generators. ACM + * Transactions on Modeling and Computer Simulation 2(3):179-194. + * Also see M. Matsumoto & Y. Kurita, 1994. Twisted GFSR generators + * II. ACM Transactions on Mdeling and Computer Simulation 4:254-266) + * + * Thanks to Colin Plumb for suggesting this. + * + * We have not analyzed the resultant polynomial to prove it primitive; + * in fact it almost certainly isn't. Nonetheless, the irreducible factors + * of a random large-degree polynomial over GF(2) are more than large enough + * that periodicity is not a concern. + * + * The input hash is much less sensitive than the output hash. All + * that we want of it is that it be a good non-cryptographic hash; + * i.e. it not produce collisions when fed "random" data of the sort + * we expect to see. As long as the pool state differs for different + * inputs, we have preserved the input entropy and done a good job. + * The fact that an intelligent attacker can construct inputs that + * will produce controlled alterations to the pool's state is not + * important because we don't consider such inputs to contribute any + * randomness. The only property we need with respect to them is that + * the attacker can't increase his/her knowledge of the pool's state. + * Since all additions are reversible (knowing the final state and the + * input, you can reconstruct the initial state), if an attacker has + * any uncertainty about the initial state, he/she can only shuffle + * that uncertainty about, but never cause any collisions (which would + * decrease the uncertainty). + * + * The chosen system lets the state of the pool be (essentially) the input + * modulo the generator polymnomial. Now, for random primitive polynomials, + * this is a universal class of hash functions, meaning that the chance + * of a collision is limited by the attacker's knowledge of the generator + * polynomail, so if it is chosen at random, an attacker can never force + * a collision. Here, we use a fixed polynomial, but we *can* assume that + * ###--> it is unknown to the processes generating the input entropy. <-### + * Because of this important property, this is a good, collision-resistant + * hash; hash collisions will occur no more often than chance. + */ + +/* + * Static global variables + */ +static DECLARE_WAIT_QUEUE_HEAD(random_read_wait); +static DECLARE_WAIT_QUEUE_HEAD(random_write_wait); + +#if 0 +#if defined(__VMKLNX__) +static int debug = 1; +#else +static int debug = 0; +module_param(debug, bool, 0644); +#endif /* __VMKLNX__ */ +#define DEBUG_ENT(fmt, arg...) do { if (debug) \ + printk(KERN_DEBUG "random %04d %04d %04d: " \ + fmt,\ + input_pool.entropy_count,\ + blocking_pool.entropy_count,\ + nonblocking_pool.entropy_count,\ + ## arg); } while (0) +#else +#define DEBUG_ENT(fmt, arg...) do {} while (0) +#endif + + +/********************************************************************** + * + * OS independent entropy store. Here are the functions which handle + * storing entropy in an entropy pool. + * + **********************************************************************/ + +struct entropy_store; +struct entropy_store { + /* mostly-read data: */ + struct poolinfo *poolinfo; + __u32 *pool; + const char *name; + int limit; + struct entropy_store *pull; + + /* read-write data: */ + spinlock_t lock ____cacheline_aligned_in_smp; + unsigned add_ptr; + int entropy_count; + int input_rotate; +}; + +static __u32 input_pool_data[INPUT_POOL_WORDS]; +static __u32 blocking_pool_data[OUTPUT_POOL_WORDS]; +static __u32 nonblocking_pool_data[OUTPUT_POOL_WORDS]; + +static struct entropy_store input_pool = { + .poolinfo = &poolinfo_table[0], + .name = "input", + .limit = 1, + .lock = __SPIN_LOCK_UNLOCKED(&input_pool.lock), + .pool = input_pool_data +}; + +static struct entropy_store blocking_pool = { + .poolinfo = &poolinfo_table[1], + .name = "blocking", + .limit = 1, + .pull = &input_pool, + .lock = __SPIN_LOCK_UNLOCKED(&blocking_pool.lock), + .pool = blocking_pool_data +}; + +static struct entropy_store nonblocking_pool = { + .poolinfo = &poolinfo_table[1], + .name = "nonblocking", + .pull = &input_pool, + .lock = __SPIN_LOCK_UNLOCKED(&nonblocking_pool.lock), + .pool = nonblocking_pool_data +}; + +/* + * This function adds a byte into the entropy "pool". It does not + * update the entropy estimate. The caller should call + * credit_entropy_store if this is appropriate. + * + * The pool is stirred with a primitive polynomial of the appropriate + * degree, and then twisted. We twist by three bits at a time because + * it's cheap to do so and helps slightly in the expected case where + * the entropy is concentrated in the low-order bits. + */ +static void __add_entropy_words(struct entropy_store *r, const __u32 *in, + int nwords, __u32 out[16]) +{ + static __u32 const twist_table[8] = { + 0x00000000, 0x3b6e20c8, 0x76dc4190, 0x4db26158, + 0xedb88320, 0xd6d6a3e8, 0x9b64c2b0, 0xa00ae278 }; + unsigned long i, add_ptr, tap1, tap2, tap3, tap4, tap5; + int new_rotate, input_rotate; + int wordmask = r->poolinfo->poolwords - 1; + __u32 w, next_w; + unsigned long flags; + + /* Taps are constant, so we can load them without holding r->lock. */ + tap1 = r->poolinfo->tap1; + tap2 = r->poolinfo->tap2; + tap3 = r->poolinfo->tap3; + tap4 = r->poolinfo->tap4; + tap5 = r->poolinfo->tap5; + next_w = *in++; + + spin_lock_irqsave(&r->lock, flags); + prefetch_range(r->pool, wordmask); + input_rotate = r->input_rotate; + add_ptr = r->add_ptr; + + while (nwords--) { + w = rol32(next_w, input_rotate); + if (nwords > 0) + next_w = *in++; + i = add_ptr = (add_ptr - 1) & wordmask; + /* + * Normally, we add 7 bits of rotation to the pool. + * At the beginning of the pool, add an extra 7 bits + * rotation, so that successive passes spread the + * input bits across the pool evenly. + */ + new_rotate = input_rotate + 14; + if (i) + new_rotate = input_rotate + 7; + input_rotate = new_rotate & 31; + + /* XOR in the various taps */ + w ^= r->pool[(i + tap1) & wordmask]; + w ^= r->pool[(i + tap2) & wordmask]; + w ^= r->pool[(i + tap3) & wordmask]; + w ^= r->pool[(i + tap4) & wordmask]; + w ^= r->pool[(i + tap5) & wordmask]; + w ^= r->pool[i]; + r->pool[i] = (w >> 3) ^ twist_table[w & 7]; + } + + r->input_rotate = input_rotate; + r->add_ptr = add_ptr; + + if (out) { + for (i = 0; i < 16; i++) { + out[i] = r->pool[add_ptr]; + add_ptr = (add_ptr - 1) & wordmask; + } + } + + spin_unlock_irqrestore(&r->lock, flags); +} + +static inline void add_entropy_words(struct entropy_store *r, const __u32 *in, + int nwords) +{ + __add_entropy_words(r, in, nwords, NULL); +} + +/* + * Credit (or debit) the entropy store with n bits of entropy + */ +static void credit_entropy_store(struct entropy_store *r, int nbits) +{ + unsigned long flags; + + spin_lock_irqsave(&r->lock, flags); + + if (r->entropy_count + nbits < 0) { + DEBUG_ENT("negative entropy/overflow (%d+%d)\n", + r->entropy_count, nbits); + r->entropy_count = 0; + } else if (r->entropy_count + nbits > r->poolinfo->POOLBITS) { + r->entropy_count = r->poolinfo->POOLBITS; + } else { + r->entropy_count += nbits; + if (nbits) + DEBUG_ENT("added %d entropy credits to %s\n", + nbits, r->name); + } + + spin_unlock_irqrestore(&r->lock, flags); +} + +/********************************************************************* + * + * Entropy input management + * + *********************************************************************/ + +/* There is one of these per entropy source */ +struct timer_rand_state { + cycles_t last_time; + long last_delta,last_delta2; + unsigned dont_count_entropy:1; +}; + +static struct timer_rand_state input_timer_state; +static struct timer_rand_state *irq_timer_state[NR_IRQS]; +#if defined(__VMKLNX__) +static struct timer_rand_state extract_timer_state; +static struct timer_rand_state _irq_timer_state[NR_IRQS]; +#endif /* __VMKLNX__ */ + +/* + * This function adds entropy to the entropy "pool" by using timing + * delays. It uses the timer_rand_state structure to make an estimate + * of how many bits of entropy this call has added to the pool. + * + * The number "num" is also added to the pool - it should somehow describe + * the type of event which just happened. This is currently 0-255 for + * keyboard scan codes, and 256 upwards for interrupts. + * + */ +static void add_timer_randomness(struct timer_rand_state *state, unsigned num) +{ + struct { + cycles_t cycles; + long jiffies; + unsigned num; + } sample; + long delta, delta2, delta3; + + preempt_disable(); + /* if over the trickle threshold, use only 1 in 4096 samples */ + if (input_pool.entropy_count > trickle_thresh && +#if defined(__VMKLNX__) + trickle_count && +#endif + (__get_cpu_var(trickle_count)++ & 0xfff)) + goto out; + + sample.jiffies = jiffies; + sample.cycles = get_cycles(); + sample.num = num; + add_entropy_words(&input_pool, (u32 *)&sample, sizeof(sample)/4); + + /* + * Calculate number of bits of randomness we probably added. + * We take into account the first, second and third-order deltas + * in order to make our estimate. + */ + + if (!state->dont_count_entropy) { + delta = sample.jiffies - state->last_time; + state->last_time = sample.jiffies; + + delta2 = delta - state->last_delta; + state->last_delta = delta; + + delta3 = delta2 - state->last_delta2; + state->last_delta2 = delta2; + + if (delta < 0) + delta = -delta; + if (delta2 < 0) + delta2 = -delta2; + if (delta3 < 0) + delta3 = -delta3; + if (delta > delta2) + delta = delta2; + if (delta > delta3) + delta = delta3; + + /* + * delta is now minimum absolute delta. + * Round down by 1 bit on general principles, + * and limit entropy entimate to 12 bits. + */ + credit_entropy_store(&input_pool, + min_t(int, fls(delta>>1), 11)); + } + + if(input_pool.entropy_count >= random_read_wakeup_thresh) + wake_up_interruptible(&random_read_wait); + +out: + preempt_enable(); +} + +void add_input_randomness(unsigned int type, unsigned int code, + unsigned int value) +{ + static unsigned char last_value; + + /* ignore autorepeat and the like */ + if (value == last_value) + return; + + DEBUG_ENT("input event\n"); + last_value = value; + add_timer_randomness(&input_timer_state, + (type << 4) ^ code ^ (code >> 4) ^ value); +} + +void add_interrupt_randomness(int irq) +{ + if (irq >= NR_IRQS || irq_timer_state[irq] == 0) + return; + + DEBUG_ENT("irq event %d\n", irq); + add_timer_randomness(irq_timer_state[irq], 0x100 + irq); +} + +void add_disk_randomness(struct gendisk *disk) +{ + if (!disk || !disk->random) + return; + /* first major is 1, so we get >= 0x200 here */ + DEBUG_ENT("disk event %d:%d\n", disk->major, disk->first_minor); + + add_timer_randomness(disk->random, + 0x100 + MKDEV(disk->major, disk->first_minor)); +} + +EXPORT_SYMBOL(add_disk_randomness); + +#if defined(__VMKLNX__) +/********************************************************************* + * + * VMKAPI expects add_xxx_randomness functions to take a single int + * + *********************************************************************/ + +void add_keyboard_randomness(int scancode) +{ + static unsigned int last_scancode; + static unsigned int last_value = 0; + + if ((unsigned int)scancode != last_scancode) { + last_scancode = (unsigned int)scancode; + add_input_randomness(EV_KEY, scancode, ++last_value); + last_value %= 2; + } +} + +EXPORT_SYMBOL(add_keyboard_randomness); + +void add_mouse_randomness(int mouse_data) +{ + static unsigned int last_value = 0; + + add_input_randomness(EV_REL, mouse_data, ++last_value); + last_value %= 2; +} + +EXPORT_SYMBOL(add_mouse_randomness); + +#define VMK_GENDISK_ARRAY_MAX 16 +struct gendisk *disks[VMK_GENDISK_ARRAY_MAX]; + +void add_storage_randomness(int disk) +{ + if (unlikely(disk < 0 || disk >= VMK_GENDISK_ARRAY_MAX)) { + DEBUG_ENT("add_storage_randomness disk %d out of range\n",disk); + return; + } + + /* + * If kmalloc returns null or rand_initialize_disk fails, + * we just won't use this disk as an entropy source. + */ + if (unlikely(!disks[disk])) { + struct gendisk *newdisk; + + newdisk = kmalloc(sizeof(struct gendisk), GFP_KERNEL); + if (!newdisk) + return; + + newdisk->major = disk; + newdisk->first_minor = 0; + + rand_initialize_disk(newdisk); + + if (unlikely(cmpxchg(&disks[disk], NULL, newdisk) != NULL)) { + if (likely(newdisk->random)) { + kfree(newdisk->random); + } + kfree(newdisk); + return; + } + } + add_disk_randomness(disks[disk]); +} + +EXPORT_SYMBOL(add_storage_randomness); + +#endif /* __VMKLNX__ */ + +#define EXTRACT_SIZE 10 + +/********************************************************************* + * + * Entropy extraction routines + * + *********************************************************************/ + +static ssize_t extract_entropy(struct entropy_store *r, void * buf, + size_t nbytes, int min, int rsvd); + +/* + * This utility inline function is responsible for transfering entropy + * from the primary pool to the secondary extraction pool. We make + * sure we pull enough for a 'catastrophic reseed'. + */ +static void xfer_secondary_pool(struct entropy_store *r, size_t nbytes) +{ + __u32 tmp[OUTPUT_POOL_WORDS]; + + if (r->pull && r->entropy_count < nbytes * 8 && + r->entropy_count < r->poolinfo->POOLBITS) { + int bytes = max_t(int, random_read_wakeup_thresh / 8, + min_t(int, nbytes, sizeof(tmp))); + int rsvd = r->limit ? 0 : random_read_wakeup_thresh/4; + + DEBUG_ENT("going to reseed %s with %d bits " + "(%d of %d requested)\n", + r->name, bytes * 8, nbytes * 8, r->entropy_count); + + bytes=extract_entropy(r->pull, tmp, bytes, + random_read_wakeup_thresh / 8, rsvd); + add_entropy_words(r, tmp, (bytes + 3) / 4); + credit_entropy_store(r, bytes*8); + } +} + +/* + * These functions extracts randomness from the "entropy pool", and + * returns it in a buffer. + * + * The min parameter specifies the minimum amount we can pull before + * failing to avoid races that defeat catastrophic reseeding while the + * reserved parameter indicates how much entropy we must leave in the + * pool after each pull to avoid starving other readers. + * + * Note: extract_entropy() assumes that .poolwords is a multiple of 16 words. + */ + +static size_t account(struct entropy_store *r, size_t nbytes, int min, + int reserved) +{ + unsigned long flags; + + BUG_ON(r->entropy_count > r->poolinfo->POOLBITS); + + /* Hold lock while accounting */ + spin_lock_irqsave(&r->lock, flags); + + DEBUG_ENT("trying to extract %d bits from %s\n", + nbytes * 8, r->name); + + /* Can we pull enough? */ + if (r->entropy_count / 8 < min + reserved) { + nbytes = 0; + } else { + /* If limited, never pull more than available */ + if (r->limit && nbytes + reserved >= r->entropy_count / 8) + nbytes = r->entropy_count/8 - reserved; + + if(r->entropy_count / 8 >= nbytes + reserved) + r->entropy_count -= nbytes*8; + else + r->entropy_count = reserved; + + if (r->entropy_count < random_write_wakeup_thresh) + wake_up_interruptible(&random_write_wait); + } + + DEBUG_ENT("debiting %d entropy credits from %s%s\n", + nbytes * 8, r->name, r->limit ? "" : " (unlimited)"); + + spin_unlock_irqrestore(&r->lock, flags); + + return nbytes; +} + +static void extract_buf(struct entropy_store *r, __u8 *out) +{ + int i, x; + __u32 data[16], buf[5 + SHA_WORKSPACE_WORDS]; + + sha_init(buf); + /* + * As we hash the pool, we mix intermediate values of + * the hash back into the pool. This eliminates + * backtracking attacks (where the attacker knows + * the state of the pool plus the current outputs, and + * attempts to find previous ouputs), unless the hash + * function can be inverted. + */ + for (i = 0, x = 0; i < r->poolinfo->poolwords; i += 16, x+=2) { + sha_transform(buf, (char *)r->pool+i, buf + 5); + add_entropy_words(r, &buf[x % 5], 1); + } + + /* + * To avoid duplicates, we atomically extract a + * portion of the pool while mixing, and hash one + * final time. + */ + __add_entropy_words(r, &buf[x % 5], 1, data); + sha_transform(buf, (char *)data, buf + 5); + + /* + * In case the hash function has some recognizable + * output pattern, we fold it in half. + */ + + buf[0] ^= buf[3]; + buf[1] ^= buf[4]; + buf[0] ^= rol32(buf[3], 16); + memcpy(out, buf, EXTRACT_SIZE); + memset(buf, 0, sizeof(buf)); +} + +static ssize_t extract_entropy(struct entropy_store *r, void * buf, + size_t nbytes, int min, int reserved) +{ + ssize_t ret = 0, i; + __u8 tmp[EXTRACT_SIZE]; + + add_timer_randomness(&extract_timer_state, nbytes); + + xfer_secondary_pool(r, nbytes); + nbytes = account(r, nbytes, min, reserved); + + while (nbytes) { + extract_buf(r, tmp); + i = min_t(int, nbytes, EXTRACT_SIZE); + memcpy(buf, tmp, i); + nbytes -= i; + buf += i; + ret += i; + } + + /* Wipe data just returned from memory */ + memset(tmp, 0, sizeof(tmp)); + + return ret; +} + +static ssize_t extract_entropy_user(struct entropy_store *r, void __user *buf, + size_t nbytes) +{ + ssize_t ret = 0, i; + __u8 tmp[EXTRACT_SIZE]; + + xfer_secondary_pool(r, nbytes); + nbytes = account(r, nbytes, 0, 0); + + while (nbytes) { + if (need_resched()) { + if (signal_pending(current)) { + if (ret == 0) + ret = -ERESTARTSYS; + break; + } + schedule(); + } + + extract_buf(r, tmp); + i = min_t(int, nbytes, EXTRACT_SIZE); + if (copy_to_user(buf, tmp, i)) { + ret = -EFAULT; + break; + } + + nbytes -= i; + buf += i; + ret += i; + } + + /* Wipe data just returned from memory */ + memset(tmp, 0, sizeof(tmp)); + + return ret; +} + +/* + * This function is the exported kernel interface. It returns some + * number of good random numbers, suitable for seeding TCP sequence + * numbers, etc. + */ +void get_random_bytes(void *buf, int nbytes) +{ + extract_entropy(&nonblocking_pool, buf, nbytes, 0, 0); +} + +#if !defined(__VMKLNX__) +/* vmklinux exports this, so we don't */ +EXPORT_SYMBOL(get_random_bytes); + +#else +/* + * The above function is exported to other Linux drivers. The below + * functions are exported via the vmk_api to the VMkernel. They return, + * respectively, hardware entropy with and without blocking, and software + * entropy which may contain (and thereby consume) hardware entropy. + * The latter is sufficient for most purposes and should be used if in doubt. + */ +VMK_ReturnStatus get_hardware_random_bytes(void *buf, int nbytes, int *rbytes) +{ + struct file afile; + afile.f_flags = O_RDONLY | O_NOATIME; + + *rbytes = random_read(&afile, buf, nbytes, 0); + + return 0; +} + +VMK_ReturnStatus get_hardware_non_blocking_random_bytes(void *buf, int nbytes, int *rbytes) +{ + struct file afile; + afile.f_flags = O_RDONLY | O_NONBLOCK | O_NOATIME; + + *rbytes = random_read(&afile, buf, nbytes, 0); + + return (*rbytes == nbytes ? 1 : 0); +} + +VMK_ReturnStatus get_software_random_bytes(void *buf, int nbytes, int *rbytes) +{ + get_random_bytes(buf, nbytes); + *rbytes = nbytes; + + return 0; +} + +#endif /* __VMKLNX__ */ + +/* + * init_std_data - initialize pool with system data + * + * @r: pool to initialize + * + * This function clears the pool's entropy count and mixes some system + * data into the pool to prepare it for use. The pool is not cleared + * as that can only decrease the entropy in the pool. + */ +static void init_std_data(struct entropy_store *r) +{ + struct timeval tv; + unsigned long flags; + + spin_lock_irqsave(&r->lock, flags); + r->entropy_count = 0; + spin_unlock_irqrestore(&r->lock, flags); + + do_gettimeofday(&tv); + add_entropy_words(r, (__u32 *)&tv, sizeof(tv)/4); + add_entropy_words(r, (__u32 *)&system_utsname, + sizeof(system_utsname)/4); +} + +static int __init rand_initialize(void) +{ + init_std_data(&input_pool); + init_std_data(&blocking_pool); + init_std_data(&nonblocking_pool); + +#if defined(__VMKLNX__) + return rand_init_uninit(1); +#else + return 0; +#endif /* __VMKLNX__ */ +} +module_init(rand_initialize); + +#if defined(__VMKLNX__) +static int seqgen_init(void); + +static void __exit rand_cleanup(void) +{ + DEBUG_ENT("rand_cleanup() done\n"); + + rand_init_uninit(0); + + return; +} +module_exit(rand_cleanup); + +#else +void rand_initialize_irq(int irq) +{ + struct timer_rand_state *state; + + if (irq >= NR_IRQS || irq_timer_state[irq]) + return; + + /* + * If kmalloc returns null, we just won't use that entropy + * source. + */ + state = kmalloc(sizeof(struct timer_rand_state), GFP_KERNEL); + if (state) { + memset(state, 0, sizeof(struct timer_rand_state)); + irq_timer_state[irq] = state; + } +} +#endif /* __VMKLNX__ */ + +void rand_initialize_disk(struct gendisk *disk) +{ + struct timer_rand_state *state; + + /* + * If kmalloc returns null, we just won't use that entropy + * source. + */ + state = kmalloc(sizeof(struct timer_rand_state), GFP_KERNEL); + if (state) { + memset(state, 0, sizeof(struct timer_rand_state)); + disk->random = state; + } +#if defined(__VMKLNX__) + else { + disk->random = NULL; + } +#endif /* __VMKLNX__ */ +} + +static ssize_t +random_read(struct file * file, char __user * buf, size_t nbytes, loff_t *ppos) +{ + ssize_t n, retval = 0, count = 0; + + if (nbytes == 0) + return 0; + + while (nbytes > 0) { + n = nbytes; + if (n > SEC_XFER_SIZE) + n = SEC_XFER_SIZE; + + DEBUG_ENT("reading %d bits\n", n*8); + + n = extract_entropy_user(&blocking_pool, buf, n); + + DEBUG_ENT("read got %d bits (%d still needed)\n", + n*8, (nbytes-n)*8); + + if (n == 0) { + if (file->f_flags & O_NONBLOCK) { + retval = -EAGAIN; + break; + } + + DEBUG_ENT("sleeping?\n"); + + wait_event_interruptible(random_read_wait, + input_pool.entropy_count >= + random_read_wakeup_thresh); + + DEBUG_ENT("awake\n"); + + if (signal_pending(current)) { + retval = -ERESTARTSYS; + break; + } + + continue; + } + + if (n < 0) { + retval = n; + break; + } + count += n; + buf += n; + nbytes -= n; + break; /* This break makes the device work */ + /* like a named pipe */ + } + + /* + * If we gave the user some bytes, update the access time. + */ + if (count) + file_accessed(file); + + return (count ? count : retval); +} + +static ssize_t +urandom_read(struct file * file, char __user * buf, + size_t nbytes, loff_t *ppos) +{ + return extract_entropy_user(&nonblocking_pool, buf, nbytes); +} + +static unsigned int +random_poll(struct file *file, poll_table * wait) +{ + unsigned int mask; + + poll_wait(file, &random_read_wait, wait); + poll_wait(file, &random_write_wait, wait); + mask = 0; + if (input_pool.entropy_count >= random_read_wakeup_thresh) + mask |= POLLIN | POLLRDNORM; + if (input_pool.entropy_count < random_write_wakeup_thresh) + mask |= POLLOUT | POLLWRNORM; + return mask; +} + + +static ssize_t +random_write(struct file * file, const char __user * buffer, + size_t count, loff_t *ppos) +{ + int ret = 0; + size_t bytes; + __u32 buf[16]; + const char __user *p = buffer; + size_t c = count; + + while (c > 0) { + bytes = min(c, sizeof(buf)); + + bytes -= copy_from_user(&buf, p, bytes); + if (!bytes) { + ret = -EFAULT; + break; + } + c -= bytes; + p += bytes; + + add_entropy_words(&input_pool, buf, (bytes + 3) / 4); + } + if (p == buffer) { + return (ssize_t)ret; + } else { +#if !defined(__VMKLNX__) + //XXX When PR 345516 is fixed we can remove this ifdef + struct inode *inode = file->f_dentry->d_inode; + inode->i_mtime = current_fs_time(inode->i_sb); + mark_inode_dirty(inode); +#endif /* __VMKLNX__ */ + return (ssize_t)(p - buffer); + } +} + +static int +random_ioctl(struct inode * inode, struct file * file, + unsigned int cmd, unsigned long arg) +{ + int size, ent_count; + int __user *p = (int __user *)arg; + int retval; + + switch (cmd) { + case RNDGETENTCNT: + ent_count = input_pool.entropy_count; + if (put_user(ent_count, p)) + return -EFAULT; + return 0; + case RNDADDTOENTCNT: + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (get_user(ent_count, p)) + return -EFAULT; + credit_entropy_store(&input_pool, ent_count); + /* + * Wake up waiting processes if we have enough + * entropy. + */ + if (input_pool.entropy_count >= random_read_wakeup_thresh) + wake_up_interruptible(&random_read_wait); + return 0; + case RNDADDENTROPY: + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + if (get_user(ent_count, p++)) + return -EFAULT; + if (ent_count < 0) + return -EINVAL; + if (get_user(size, p++)) + return -EFAULT; + retval = random_write(file, (const char __user *) p, + size, &file->f_pos); + if (retval < 0) + return retval; + credit_entropy_store(&input_pool, ent_count); + /* + * Wake up waiting processes if we have enough + * entropy. + */ + if (input_pool.entropy_count >= random_read_wakeup_thresh) + wake_up_interruptible(&random_read_wait); + return 0; + case RNDZAPENTCNT: + case RNDCLEARPOOL: + /* Clear the entropy pool counters. */ + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + init_std_data(&input_pool); + init_std_data(&blocking_pool); + init_std_data(&nonblocking_pool); + return 0; + default: + return -EINVAL; + } +} + +struct file_operations random_fops = { + .read = random_read, + .write = random_write, + .poll = random_poll, + .ioctl = random_ioctl, +}; + +struct file_operations urandom_fops = { + .read = urandom_read, + .write = random_write, + .ioctl = random_ioctl, +}; + +#if defined(__VMKLNX__) +static int random_major; +module_param(random_major, int, 0); +MODULE_PARM_DESC(random_major, "Sets the major number of the random device. By" + " default, or if you set it to zero, it will choose the next" + " available device. Setting it to -1 will disable the" + " interface. Other values will set the major device number" + " to that value."); +static int urandom_major; +module_param(urandom_major, int, 0); +MODULE_PARM_DESC(urandom_major, "Sets the major number of the urandom device." + "By default, or if you set it to zero, it will choose the next" + " available device. Setting it to -1 will disable the" + " interface. Other values will set the major device number" + " to that value."); + + +static int rand_init_uninit(int init) +{ + static int module_ID = 0; + int status = 0; + + if (init) { + if (random_major < 0 || urandom_major < 0) { + printk("Warning: random_major %d urandom_major %d, " + "failing load\n", random_major, urandom_major); + return -EINVAL; + } + + seqgen_init(); + + // Failure to kmalloc trickle_count is not fatal + trickle_count = kzalloc(VMK_L1_CACHELINE_SIZE * smp_num_cpus, + GFP_KERNEL); + + do { + uint32_t i; + + for (i = 0; i < NR_IRQS; i++) { + irq_timer_state[i] = &_irq_timer_state[i]; + } + } while (0); + + // Make sure disks[1] exists (see PR 343543) + add_storage_randomness(1); + + // XXX Ignore failures for now + module_ID = vmklnx_register_add_randomness_functions( + add_interrupt_randomness, + NULL, // No HW RNG device support + add_keyboard_randomness, + add_mouse_randomness, + NULL, // No other hid device support + add_storage_randomness); + + if (vmklnx_register_get_random_byte_functions( + get_hardware_random_bytes, + get_hardware_non_blocking_random_bytes, + get_software_random_bytes, + NULL) != module_ID) { + printk("Warning: get_random_byte_functions registration" + " failed\n"); + status = -1; + } + + if (status == 0) { + status = register_chrdev(random_major, "random", + &random_fops); + + if (status < 0) { + printk("Warning: registration of chardev random" + "failed with status %d\n", status); + } else { + random_major = status; + status = register_chrdev(urandom_major, + "urandom", + &urandom_fops); + if (status < 0) { + printk("Warning: registration of " + "chardev urandom failed with " + "status %d\n", status); + } else { + urandom_major = status; + status = 0; + } + } + } + if (!status) { + printk("Info: load complete with random_major %d " + "urandom_major %d\n", random_major, urandom_major); + } + } + + if ((status < 0 || !init) && module_ID) { + vmklnx_unregister_add_randomness_functions( + add_interrupt_randomness, + NULL, // No HW RNG device support + add_keyboard_randomness, + add_mouse_randomness, + NULL, // No other hid device support + add_storage_randomness, + module_ID); + + vmklnx_unregister_get_random_byte_functions( + get_hardware_random_bytes, + get_hardware_non_blocking_random_bytes, + get_software_random_bytes, + NULL, + module_ID); + if (random_major) { + unregister_chrdev(random_major, "random"); + } + if (urandom_major) { + unregister_chrdev(urandom_major, "urandom"); + } + module_ID = 0; + kfree(trickle_count); + } + + if (status < 0) { + return status; + } + return 0; +} +#endif /* __VMKLNX__ */ + + +/*************************************************************** + * Random UUID interface + * + * Used here for a Boot ID, but can be useful for other kernel + * drivers. + ***************************************************************/ + +/* + * Generate random UUID + */ +void generate_random_uuid(unsigned char uuid_out[16]) +{ + get_random_bytes(uuid_out, 16); + /* Set UUID version to 4 --- truely random generation */ + uuid_out[6] = (uuid_out[6] & 0x0F) | 0x40; + /* Set the UUID variant to DCE */ + uuid_out[8] = (uuid_out[8] & 0x3F) | 0x80; +} + +EXPORT_SYMBOL(generate_random_uuid); + +/******************************************************************** + * + * Sysctl interface + * + ********************************************************************/ + +#if defined(__VMKLNX__) +#undef CONFIG_SYSCTL +#endif /* __VMKLNX__ */ +#ifdef CONFIG_SYSCTL + +#include + +static int min_read_thresh = 8, min_write_thresh; +static int max_read_thresh = INPUT_POOL_WORDS * 32; +static int max_write_thresh = INPUT_POOL_WORDS * 32; +static char sysctl_bootid[16]; + +/* + * These functions is used to return both the bootid UUID, and random + * UUID. The difference is in whether table->data is NULL; if it is, + * then a new UUID is generated and returned to the user. + * + * If the user accesses this via the proc interface, it will be returned + * as an ASCII string in the standard UUID format. If accesses via the + * sysctl system call, it is returned as 16 bytes of binary data. + */ +static int proc_do_uuid(ctl_table *table, int write, struct file *filp, + void __user *buffer, size_t *lenp, loff_t *ppos) +{ + ctl_table fake_table; + unsigned char buf[64], tmp_uuid[16], *uuid; + + uuid = table->data; + if (!uuid) { + uuid = tmp_uuid; + uuid[8] = 0; + } + if (uuid[8] == 0) + generate_random_uuid(uuid); + + sprintf(buf, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" + "%02x%02x%02x%02x%02x%02x", + uuid[0], uuid[1], uuid[2], uuid[3], + uuid[4], uuid[5], uuid[6], uuid[7], + uuid[8], uuid[9], uuid[10], uuid[11], + uuid[12], uuid[13], uuid[14], uuid[15]); + fake_table.data = buf; + fake_table.maxlen = sizeof(buf); + + return proc_dostring(&fake_table, write, filp, buffer, lenp, ppos); +} + +static int uuid_strategy(ctl_table *table, int __user *name, int nlen, + void __user *oldval, size_t __user *oldlenp, + void __user *newval, size_t newlen, void **context) +{ + unsigned char tmp_uuid[16], *uuid; + unsigned int len; + + if (!oldval || !oldlenp) + return 1; + + uuid = table->data; + if (!uuid) { + uuid = tmp_uuid; + uuid[8] = 0; + } + if (uuid[8] == 0) + generate_random_uuid(uuid); + + if (get_user(len, oldlenp)) + return -EFAULT; + if (len) { + if (len > 16) + len = 16; + if (copy_to_user(oldval, uuid, len) || + put_user(len, oldlenp)) + return -EFAULT; + } + return 1; +} + +static int sysctl_poolsize = INPUT_POOL_WORDS * 32; +ctl_table random_table[] = { + { + .ctl_name = RANDOM_POOLSIZE, + .procname = "poolsize", + .data = &sysctl_poolsize, + .maxlen = sizeof(int), + .mode = 0444, + .proc_handler = &proc_dointvec, + }, + { + .ctl_name = RANDOM_ENTROPY_COUNT, + .procname = "entropy_avail", + .maxlen = sizeof(int), + .mode = 0444, + .proc_handler = &proc_dointvec, + .data = &input_pool.entropy_count, + }, + { + .ctl_name = RANDOM_READ_THRESH, + .procname = "read_wakeup_threshold", + .data = &random_read_wakeup_thresh, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_minmax, + .strategy = &sysctl_intvec, + .extra1 = &min_read_thresh, + .extra2 = &max_read_thresh, + }, + { + .ctl_name = RANDOM_WRITE_THRESH, + .procname = "write_wakeup_threshold", + .data = &random_write_wakeup_thresh, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = &proc_dointvec_minmax, + .strategy = &sysctl_intvec, + .extra1 = &min_write_thresh, + .extra2 = &max_write_thresh, + }, + { + .ctl_name = RANDOM_BOOT_ID, + .procname = "boot_id", + .data = &sysctl_bootid, + .maxlen = 16, + .mode = 0444, + .proc_handler = &proc_do_uuid, + .strategy = &uuid_strategy, + }, + { + .ctl_name = RANDOM_UUID, + .procname = "uuid", + .maxlen = 16, + .mode = 0444, + .proc_handler = &proc_do_uuid, + .strategy = &uuid_strategy, + }, + { .ctl_name = 0 } +}; +#endif /* CONFIG_SYSCTL */ + +/******************************************************************** + * + * Random funtions for networking + * + ********************************************************************/ + +/* + * TCP initial sequence number picking. This uses the random number + * generator to pick an initial secret value. This value is hashed + * along with the TCP endpoint information to provide a unique + * starting point for each pair of TCP endpoints. This defeats + * attacks which rely on guessing the initial TCP sequence number. + * This algorithm was suggested by Steve Bellovin. + * + * Using a very strong hash was taking an appreciable amount of the total + * TCP connection establishment time, so this is a weaker hash, + * compensated for by changing the secret periodically. + */ + +/* F, G and H are basic MD4 functions: selection, majority, parity */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) + +/* + * The generic round function. The application is so specific that + * we don't bother protecting all the arguments with parens, as is generally + * good macro practice, in favor of extra legibility. + * Rotation is separate from addition to prevent recomputation + */ +#define ROUND(f, a, b, c, d, x, s) \ + (a += f(b, c, d) + x, a = (a << s) | (a >> (32 - s))) +#define K1 0 +#define K2 013240474631UL +#define K3 015666365641UL + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + +static __u32 twothirdsMD4Transform (__u32 const buf[4], __u32 const in[12]) +{ + __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + /* Round 1 */ + ROUND(F, a, b, c, d, in[ 0] + K1, 3); + ROUND(F, d, a, b, c, in[ 1] + K1, 7); + ROUND(F, c, d, a, b, in[ 2] + K1, 11); + ROUND(F, b, c, d, a, in[ 3] + K1, 19); + ROUND(F, a, b, c, d, in[ 4] + K1, 3); + ROUND(F, d, a, b, c, in[ 5] + K1, 7); + ROUND(F, c, d, a, b, in[ 6] + K1, 11); + ROUND(F, b, c, d, a, in[ 7] + K1, 19); + ROUND(F, a, b, c, d, in[ 8] + K1, 3); + ROUND(F, d, a, b, c, in[ 9] + K1, 7); + ROUND(F, c, d, a, b, in[10] + K1, 11); + ROUND(F, b, c, d, a, in[11] + K1, 19); + + /* Round 2 */ + ROUND(G, a, b, c, d, in[ 1] + K2, 3); + ROUND(G, d, a, b, c, in[ 3] + K2, 5); + ROUND(G, c, d, a, b, in[ 5] + K2, 9); + ROUND(G, b, c, d, a, in[ 7] + K2, 13); + ROUND(G, a, b, c, d, in[ 9] + K2, 3); + ROUND(G, d, a, b, c, in[11] + K2, 5); + ROUND(G, c, d, a, b, in[ 0] + K2, 9); + ROUND(G, b, c, d, a, in[ 2] + K2, 13); + ROUND(G, a, b, c, d, in[ 4] + K2, 3); + ROUND(G, d, a, b, c, in[ 6] + K2, 5); + ROUND(G, c, d, a, b, in[ 8] + K2, 9); + ROUND(G, b, c, d, a, in[10] + K2, 13); + + /* Round 3 */ + ROUND(H, a, b, c, d, in[ 3] + K3, 3); + ROUND(H, d, a, b, c, in[ 7] + K3, 9); + ROUND(H, c, d, a, b, in[11] + K3, 11); + ROUND(H, b, c, d, a, in[ 2] + K3, 15); + ROUND(H, a, b, c, d, in[ 6] + K3, 3); + ROUND(H, d, a, b, c, in[10] + K3, 9); + ROUND(H, c, d, a, b, in[ 1] + K3, 11); + ROUND(H, b, c, d, a, in[ 5] + K3, 15); + ROUND(H, a, b, c, d, in[ 9] + K3, 3); + ROUND(H, d, a, b, c, in[ 0] + K3, 9); + ROUND(H, c, d, a, b, in[ 4] + K3, 11); + ROUND(H, b, c, d, a, in[ 8] + K3, 15); + + return buf[1] + b; /* "most hashed" word */ + /* Alternative: return sum of all words? */ +} +#endif + +#undef ROUND +#undef F +#undef G +#undef H +#undef K1 +#undef K2 +#undef K3 + +/* This should not be decreased so low that ISNs wrap too fast. */ +#define REKEY_INTERVAL (300 * HZ) +/* + * Bit layout of the tcp sequence numbers (before adding current time): + * bit 24-31: increased after every key exchange + * bit 0-23: hash(source,dest) + * + * The implementation is similar to the algorithm described + * in the Appendix of RFC 1185, except that + * - it uses a 1 MHz clock instead of a 250 kHz clock + * - it performs a rekey every 5 minutes, which is equivalent + * to a (source,dest) tulple dependent forward jump of the + * clock by 0..2^(HASH_BITS+1) + * + * Thus the average ISN wraparound time is 68 minutes instead of + * 4.55 hours. + * + * SMP cleanup and lock avoidance with poor man's RCU. + * Manfred Spraul + * + */ +#define COUNT_BITS 8 +#define COUNT_MASK ((1 << COUNT_BITS) - 1) +#define HASH_BITS 24 +#define HASH_MASK ((1 << HASH_BITS) - 1) + +static struct keydata { + __u32 count; /* already shifted to the final position */ + __u32 secret[12]; +} ____cacheline_aligned ip_keydata[2]; + +static unsigned int ip_cnt; + +static void rekey_seq_generator(void *private_); + +static DECLARE_WORK(rekey_work, rekey_seq_generator, NULL); + +/* + * Lock avoidance: + * The ISN generation runs lockless - it's just a hash over random data. + * State changes happen every 5 minutes when the random key is replaced. + * Synchronization is performed by having two copies of the hash function + * state and rekey_seq_generator always updates the inactive copy. + * The copy is then activated by updating ip_cnt. + * The implementation breaks down if someone blocks the thread + * that processes SYN requests for more than 5 minutes. Should never + * happen, and even if that happens only a not perfectly compliant + * ISN is generated, nothing fatal. + */ +static void rekey_seq_generator(void *private_) +{ + struct keydata *keyptr = &ip_keydata[1 ^ (ip_cnt & 1)]; + + get_random_bytes(keyptr->secret, sizeof(keyptr->secret)); + keyptr->count = (ip_cnt & COUNT_MASK) << HASH_BITS; + smp_wmb(); + ip_cnt++; + schedule_delayed_work(&rekey_work, REKEY_INTERVAL); +} + +static inline struct keydata *get_keyptr(void) +{ + struct keydata *keyptr = &ip_keydata[ip_cnt & 1]; + + smp_rmb(); + + return keyptr; +} + +#if defined(__VMKLNX__) +static int seqgen_init(void) +#else +static __init int seqgen_init(void) +#endif /* __VMKLNX__ */ +{ + rekey_seq_generator(NULL); + return 0; +} +#if !defined(__VMKLNX__) +late_initcall(seqgen_init); +#endif /* __VMKLNX__ */ + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +__u32 secure_tcpv6_sequence_number(__u32 *saddr, __u32 *daddr, + __u16 sport, __u16 dport) +{ + struct timeval tv; + __u32 seq; + __u32 hash[12]; + struct keydata *keyptr = get_keyptr(); + + /* The procedure is the same as for IPv4, but addresses are longer. + * Thus we must use twothirdsMD4Transform. + */ + + memcpy(hash, saddr, 16); + hash[4]=(sport << 16) + dport; + memcpy(&hash[5],keyptr->secret,sizeof(__u32) * 7); + + seq = twothirdsMD4Transform(daddr, hash) & HASH_MASK; + seq += keyptr->count; + + do_gettimeofday(&tv); + seq += tv.tv_usec + tv.tv_sec * 1000000; + + return seq; +} +EXPORT_SYMBOL(secure_tcpv6_sequence_number); +#endif + +/* The code below is shamelessly stolen from secure_tcp_sequence_number(). + * All blames to Andrey V. Savochkin . + */ +__u32 secure_ip_id(__u32 daddr) +{ + struct keydata *keyptr; + __u32 hash[4]; + + keyptr = get_keyptr(); + + /* + * Pick a unique starting offset for each IP destination. + * The dest ip address is placed in the starting vector, + * which is then hashed with random data. + */ + hash[0] = daddr; + hash[1] = keyptr->secret[9]; + hash[2] = keyptr->secret[10]; + hash[3] = keyptr->secret[11]; + + return half_md4_transform(hash, keyptr->secret); +} + +#ifdef CONFIG_INET + +__u32 secure_tcp_sequence_number(__u32 saddr, __u32 daddr, + __u16 sport, __u16 dport) +{ + struct timeval tv; + __u32 seq; + __u32 hash[4]; + struct keydata *keyptr = get_keyptr(); + + /* + * Pick a unique starting offset for each TCP connection endpoints + * (saddr, daddr, sport, dport). + * Note that the words are placed into the starting vector, which is + * then mixed with a partial MD4 over random data. + */ + hash[0]=saddr; + hash[1]=daddr; + hash[2]=(sport << 16) + dport; + hash[3]=keyptr->secret[11]; + + seq = half_md4_transform(hash, keyptr->secret) & HASH_MASK; + seq += keyptr->count; + /* + * As close as possible to RFC 793, which + * suggests using a 250 kHz clock. + * Further reading shows this assumes 2 Mb/s networks. + * For 10 Mb/s Ethernet, a 1 MHz clock is appropriate. + * That's funny, Linux has one built in! Use it! + * (Networks are faster now - should this be increased?) + */ + do_gettimeofday(&tv); + seq += tv.tv_usec + tv.tv_sec * 1000000; +#if 0 + printk("init_seq(%lx, %lx, %d, %d) = %d\n", + saddr, daddr, sport, dport, seq); +#endif + return seq; +} + +EXPORT_SYMBOL(secure_tcp_sequence_number); + +/* Generate secure starting point for ephemeral IPV4 transport port search */ +u32 secure_ipv4_port_ephemeral(__u32 saddr, __u32 daddr, __u16 dport) +{ + struct keydata *keyptr = get_keyptr(); + u32 hash[4]; + + /* + * Pick a unique starting offset for each ephemeral port search + * (saddr, daddr, dport) and 48bits of random data. + */ + hash[0] = saddr; + hash[1] = daddr; + hash[2] = dport ^ keyptr->secret[10]; + hash[3] = keyptr->secret[11]; + + return half_md4_transform(hash, keyptr->secret); +} + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +u32 secure_ipv6_port_ephemeral(const __u32 *saddr, const __u32 *daddr, __u16 dport) +{ + struct keydata *keyptr = get_keyptr(); + u32 hash[12]; + + memcpy(hash, saddr, 16); + hash[4] = dport; + memcpy(&hash[5],keyptr->secret,sizeof(__u32) * 7); + + return twothirdsMD4Transform(daddr, hash); +} +#endif + +#if defined(CONFIG_IP_DCCP) || defined(CONFIG_IP_DCCP_MODULE) +/* Similar to secure_tcp_sequence_number but generate a 48 bit value + * bit's 32-47 increase every key exchange + * 0-31 hash(source, dest) + */ +u64 secure_dccp_sequence_number(__u32 saddr, __u32 daddr, + __u16 sport, __u16 dport) +{ + struct timeval tv; + u64 seq; + __u32 hash[4]; + struct keydata *keyptr = get_keyptr(); + + hash[0] = saddr; + hash[1] = daddr; + hash[2] = (sport << 16) + dport; + hash[3] = keyptr->secret[11]; + + seq = half_md4_transform(hash, keyptr->secret); + seq |= ((u64)keyptr->count) << (32 - HASH_BITS); + + do_gettimeofday(&tv); + seq += tv.tv_usec + tv.tv_sec * 1000000; + seq &= (1ull << 48) - 1; +#if 0 + printk("dccp init_seq(%lx, %lx, %d, %d) = %d\n", + saddr, daddr, sport, dport, seq); +#endif + return seq; +} + +EXPORT_SYMBOL(secure_dccp_sequence_number); +#endif + +#endif /* CONFIG_INET */ + + +/* + * Get a random word for internal kernel use only. Similar to urandom but + * with the goal of minimal entropy pool depletion. As a result, the random + * value is not cryptographically secure but for several uses the cost of + * depleting entropy is too high + */ +unsigned int get_random_int(void) +{ + unsigned int val = 0; + +#ifdef CONFIG_X86_HAS_TSC + rdtscl(val); +#endif + /* + * Use IP's RNG. It suits our purpose perfectly: it re-keys itself + * every second, from the entropy pool (and thus creates a limited + * drain on it), and uses halfMD4Transform within the second. We + * also mix it with jiffies and the PID: + */ + return secure_ip_id(current->pid + jiffies + (int)val); +} + +/* + * randomize_range() returns a start address such that + * + * [...... .....] + * start end + * + * a with size "len" starting at the return value is inside in the + * area defined by [start, end], but is otherwise randomized. + */ +unsigned long +randomize_range(unsigned long start, unsigned long end, unsigned long len) +{ + unsigned long range = end - len - start; + + if (end <= start + len) + return 0; + return PAGE_ALIGN(get_random_int() % range + start); +} diff --git a/vmkdrivers/src_current/drivers/char/random/sha1.c b/vmkdrivers/src_current/drivers/char/random/sha1.c new file mode 100644 index 0000000..17e72f1 --- /dev/null +++ b/vmkdrivers/src_current/drivers/char/random/sha1.c @@ -0,0 +1,102 @@ +/* + * SHA transform algorithm, originally taken from code written by + * Peter Gutmann, and placed in the public domain. + */ + +#include +#include +#include +#include + +/* The SHA f()-functions. */ + +#define f1(x,y,z) (z ^ (x & (y ^ z))) /* x ? y : z */ +#define f2(x,y,z) (x ^ y ^ z) /* XOR */ +#define f3(x,y,z) ((x & y) + (z & (x ^ y))) /* majority */ + +/* The SHA Mysterious Constants */ + +#define K1 0x5A827999L /* Rounds 0-19: sqrt(2) * 2^30 */ +#define K2 0x6ED9EBA1L /* Rounds 20-39: sqrt(3) * 2^30 */ +#define K3 0x8F1BBCDCL /* Rounds 40-59: sqrt(5) * 2^30 */ +#define K4 0xCA62C1D6L /* Rounds 60-79: sqrt(10) * 2^30 */ + +#if defined(__VMKLNX__) +#undef EXPORT_SYMBOL +#define EXPORT_SYMBOL(x) +#endif /* __VMKLNX__ */ + +/* + * sha_transform: single block SHA1 transform + * + * @digest: 160 bit digest to update + * @data: 512 bits of data to hash + * @W: 80 words of workspace (see note) + * + * This function generates a SHA1 digest for a single 512-bit block. + * Be warned, it does not handle padding and message digest, do not + * confuse it with the full FIPS 180-1 digest algorithm for variable + * length messages. + * + * Note: If the hash is security sensitive, the caller should be sure + * to clear the workspace. This is left to the caller to avoid + * unnecessary clears between chained hashing operations. + */ +void sha_transform(__u32 *digest, const char *in, __u32 *W) +{ + __u32 a, b, c, d, e, t, i; + + for (i = 0; i < 16; i++) + W[i] = be32_to_cpu(get_unaligned((const __be32 *)in+i)); + + for (i = 0; i < 64; i++) + W[i+16] = rol32(W[i+13] ^ W[i+8] ^ W[i+2] ^ W[i], 1); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + for (i = 0; i < 20; i++) { + t = f1(b, c, d) + K1 + rol32(a, 5) + e + W[i]; + e = d; d = c; c = rol32(b, 30); b = a; a = t; + } + + for (; i < 40; i ++) { + t = f2(b, c, d) + K2 + rol32(a, 5) + e + W[i]; + e = d; d = c; c = rol32(b, 30); b = a; a = t; + } + + for (; i < 60; i ++) { + t = f3(b, c, d) + K3 + rol32(a, 5) + e + W[i]; + e = d; d = c; c = rol32(b, 30); b = a; a = t; + } + + for (; i < 80; i ++) { + t = f2(b, c, d) + K4 + rol32(a, 5) + e + W[i]; + e = d; d = c; c = rol32(b, 30); b = a; a = t; + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; +} +EXPORT_SYMBOL(sha_transform); + +/* + * sha_init: initialize the vectors for a SHA1 digest + * + * @buf: vector to initialize + */ +void sha_init(__u32 *buf) +{ + buf[0] = 0x67452301; + buf[1] = 0xefcdab89; + buf[2] = 0x98badcfe; + buf[3] = 0x10325476; + buf[4] = 0xc3d2e1f0; +} + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/5710_hsi_cnic.h b/vmkdrivers/src_current/drivers/net/bnx2/5710_hsi_cnic.h new file mode 100644 index 0000000..88e936b --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/5710_hsi_cnic.h @@ -0,0 +1,2936 @@ +#ifndef __5710_HSI_CNIC_LE__ +#define __5710_HSI_CNIC_LE__ + +/* + * common data for all protocols + */ +struct b577xx_doorbell_hdr { + u8 header; +#define B577XX_DOORBELL_HDR_RX (0x1<<0) +#define B577XX_DOORBELL_HDR_RX_SHIFT 0 +#define B577XX_DOORBELL_HDR_DB_TYPE (0x1<<1) +#define B577XX_DOORBELL_HDR_DB_TYPE_SHIFT 1 +#define B577XX_DOORBELL_HDR_DPM_SIZE (0x3<<2) +#define B577XX_DOORBELL_HDR_DPM_SIZE_SHIFT 2 +#define B577XX_DOORBELL_HDR_CONN_TYPE (0xF<<4) +#define B577XX_DOORBELL_HDR_CONN_TYPE_SHIFT 4 +}; + +/* + * doorbell message sent to the chip + */ +struct b577xx_doorbell { +#if defined(__BIG_ENDIAN) + u16 zero_fill2; + u8 zero_fill1; + struct b577xx_doorbell_hdr header; +#elif defined(__LITTLE_ENDIAN) + struct b577xx_doorbell_hdr header; + u8 zero_fill1; + u16 zero_fill2; +#endif +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct ustorm_iscsi_rq_db { + struct regpair pbl_base; + struct regpair curr_pbe; +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct ustorm_iscsi_r2tq_db { + struct regpair pbl_base; + struct regpair curr_pbe; +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct ustorm_iscsi_cq_db { +#if defined(__BIG_ENDIAN) + u16 cq_sn; + u16 prod; +#elif defined(__LITTLE_ENDIAN) + u16 prod; + u16 cq_sn; +#endif + struct regpair curr_pbe; +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct rings_db { + struct ustorm_iscsi_rq_db rq; + struct ustorm_iscsi_r2tq_db r2tq; + struct ustorm_iscsi_cq_db cq[8]; +#if defined(__BIG_ENDIAN) + u16 rq_prod; + u16 r2tq_prod; +#elif defined(__LITTLE_ENDIAN) + u16 r2tq_prod; + u16 rq_prod; +#endif + struct regpair cq_pbl_base; +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct ustorm_iscsi_placement_db { + u32 sgl_base_lo; + u32 sgl_base_hi; + u32 local_sge_0_address_hi; + u32 local_sge_0_address_lo; +#if defined(__BIG_ENDIAN) + u16 curr_sge_offset; + u16 local_sge_0_size; +#elif defined(__LITTLE_ENDIAN) + u16 local_sge_0_size; + u16 curr_sge_offset; +#endif + u32 local_sge_1_address_hi; + u32 local_sge_1_address_lo; +#if defined(__BIG_ENDIAN) + u16 reserved6; + u16 local_sge_1_size; +#elif defined(__LITTLE_ENDIAN) + u16 local_sge_1_size; + u16 reserved6; +#endif +#if defined(__BIG_ENDIAN) + u8 sgl_size; + u8 local_sge_index_2b; + u16 reserved7; +#elif defined(__LITTLE_ENDIAN) + u16 reserved7; + u8 local_sge_index_2b; + u8 sgl_size; +#endif + u32 rem_pdu; + u32 place_db_bitfield_1; +#define USTORM_ISCSI_PLACEMENT_DB_REM_PDU_PAYLOAD (0xFFFFFF<<0) +#define USTORM_ISCSI_PLACEMENT_DB_REM_PDU_PAYLOAD_SHIFT 0 +#define USTORM_ISCSI_PLACEMENT_DB_CQ_ID (0xFF<<24) +#define USTORM_ISCSI_PLACEMENT_DB_CQ_ID_SHIFT 24 + u32 place_db_bitfield_2; +#define USTORM_ISCSI_PLACEMENT_DB_BYTES_2_TRUNCATE (0xFFFFFF<<0) +#define USTORM_ISCSI_PLACEMENT_DB_BYTES_2_TRUNCATE_SHIFT 0 +#define USTORM_ISCSI_PLACEMENT_DB_HOST_SGE_INDEX (0xFF<<24) +#define USTORM_ISCSI_PLACEMENT_DB_HOST_SGE_INDEX_SHIFT 24 + u32 nal; +#define USTORM_ISCSI_PLACEMENT_DB_REM_SGE_SIZE (0xFFFFFF<<0) +#define USTORM_ISCSI_PLACEMENT_DB_REM_SGE_SIZE_SHIFT 0 +#define USTORM_ISCSI_PLACEMENT_DB_EXP_PADDING_2B (0x3<<24) +#define USTORM_ISCSI_PLACEMENT_DB_EXP_PADDING_2B_SHIFT 24 +#define USTORM_ISCSI_PLACEMENT_DB_EXP_DIGEST_3B (0x7<<26) +#define USTORM_ISCSI_PLACEMENT_DB_EXP_DIGEST_3B_SHIFT 26 +#define USTORM_ISCSI_PLACEMENT_DB_NAL_LEN_3B (0x7<<29) +#define USTORM_ISCSI_PLACEMENT_DB_NAL_LEN_3B_SHIFT 29 +}; + +/* + * Ustorm iSCSI Storm Context + */ +struct ustorm_iscsi_st_context { + u32 exp_stat_sn; + u32 exp_data_sn; + struct rings_db ring; + struct regpair task_pbl_base; + struct regpair tce_phy_addr; + struct ustorm_iscsi_placement_db place_db; + u32 data_rcv_seq; + u32 rem_rcv_len; +#if defined(__BIG_ENDIAN) + u16 hdr_itt; + u16 iscsi_conn_id; +#elif defined(__LITTLE_ENDIAN) + u16 iscsi_conn_id; + u16 hdr_itt; +#endif + u32 nal_bytes; +#if defined(__BIG_ENDIAN) + u8 hdr_second_byte_union; + u8 bitfield_0; +#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU (0x1<<0) +#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU_SHIFT 0 +#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE (0x1<<1) +#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE_SHIFT 1 +#define USTORM_ISCSI_ST_CONTEXT_RESERVED1 (0x3F<<2) +#define USTORM_ISCSI_ST_CONTEXT_RESERVED1_SHIFT 2 + u8 task_pdu_cache_index; + u8 task_pbe_cache_index; +#elif defined(__LITTLE_ENDIAN) + u8 task_pbe_cache_index; + u8 task_pdu_cache_index; + u8 bitfield_0; +#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU (0x1<<0) +#define USTORM_ISCSI_ST_CONTEXT_BMIDDLEOFPDU_SHIFT 0 +#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE (0x1<<1) +#define USTORM_ISCSI_ST_CONTEXT_BFENCECQE_SHIFT 1 +#define USTORM_ISCSI_ST_CONTEXT_RESERVED1 (0x3F<<2) +#define USTORM_ISCSI_ST_CONTEXT_RESERVED1_SHIFT 2 + u8 hdr_second_byte_union; +#endif +#if defined(__BIG_ENDIAN) + u16 reserved3; + u8 reserved2; + u8 acDecrement; +#elif defined(__LITTLE_ENDIAN) + u8 acDecrement; + u8 reserved2; + u16 reserved3; +#endif + u32 task_stat; +#if defined(__BIG_ENDIAN) + u8 hdr_opcode; + u8 num_cqs; + u16 reserved5; +#elif defined(__LITTLE_ENDIAN) + u16 reserved5; + u8 num_cqs; + u8 hdr_opcode; +#endif + u32 negotiated_rx; +#define USTORM_ISCSI_ST_CONTEXT_MAX_RECV_PDU_LENGTH (0xFFFFFF<<0) +#define USTORM_ISCSI_ST_CONTEXT_MAX_RECV_PDU_LENGTH_SHIFT 0 +#define USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS (0xFF<<24) +#define USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS_SHIFT 24 + u32 negotiated_rx_and_flags; +#define USTORM_ISCSI_ST_CONTEXT_MAX_BURST_LENGTH (0xFFFFFF<<0) +#define USTORM_ISCSI_ST_CONTEXT_MAX_BURST_LENGTH_SHIFT 0 +#define USTORM_ISCSI_ST_CONTEXT_B_CQE_POSTED_OR_HEADER_CACHED (0x1<<24) +#define USTORM_ISCSI_ST_CONTEXT_B_CQE_POSTED_OR_HEADER_CACHED_SHIFT 24 +#define USTORM_ISCSI_ST_CONTEXT_B_HDR_DIGEST_EN (0x1<<25) +#define USTORM_ISCSI_ST_CONTEXT_B_HDR_DIGEST_EN_SHIFT 25 +#define USTORM_ISCSI_ST_CONTEXT_B_DATA_DIGEST_EN (0x1<<26) +#define USTORM_ISCSI_ST_CONTEXT_B_DATA_DIGEST_EN_SHIFT 26 +#define USTORM_ISCSI_ST_CONTEXT_B_PROTOCOL_ERROR (0x1<<27) +#define USTORM_ISCSI_ST_CONTEXT_B_PROTOCOL_ERROR_SHIFT 27 +#define USTORM_ISCSI_ST_CONTEXT_B_TASK_VALID (0x1<<28) +#define USTORM_ISCSI_ST_CONTEXT_B_TASK_VALID_SHIFT 28 +#define USTORM_ISCSI_ST_CONTEXT_TASK_TYPE (0x3<<29) +#define USTORM_ISCSI_ST_CONTEXT_TASK_TYPE_SHIFT 29 +#define USTORM_ISCSI_ST_CONTEXT_B_ALL_DATA_ACKED (0x1<<31) +#define USTORM_ISCSI_ST_CONTEXT_B_ALL_DATA_ACKED_SHIFT 31 +}; + +/* + * TCP context region, shared in TOE, RDMA and ISCSI + */ +struct tstorm_tcp_st_context_section { + u32 flags1; +#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_20B (0xFFFFFF<<0) +#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_SRTT_20B_SHIFT 0 +#define TSTORM_TCP_ST_CONTEXT_SECTION_PAWS_INVALID (0x1<<24) +#define TSTORM_TCP_ST_CONTEXT_SECTION_PAWS_INVALID_SHIFT 24 +#define TSTORM_TCP_ST_CONTEXT_SECTION_TIMESTAMP_EXISTS (0x1<<25) +#define TSTORM_TCP_ST_CONTEXT_SECTION_TIMESTAMP_EXISTS_SHIFT 25 +#define TSTORM_TCP_ST_CONTEXT_SECTION_ISLE_EXISTS (0x1<<26) +#define TSTORM_TCP_ST_CONTEXT_SECTION_ISLE_EXISTS_SHIFT 26 +#define TSTORM_TCP_ST_CONTEXT_SECTION_STOP_RX_PAYLOAD (0x1<<27) +#define TSTORM_TCP_ST_CONTEXT_SECTION_STOP_RX_PAYLOAD_SHIFT 27 +#define TSTORM_TCP_ST_CONTEXT_SECTION_KA_ENABLED (0x1<<28) +#define TSTORM_TCP_ST_CONTEXT_SECTION_KA_ENABLED_SHIFT 28 +#define TSTORM_TCP_ST_CONTEXT_SECTION_FIRST_RTO_ESTIMATE (0x1<<29) +#define TSTORM_TCP_ST_CONTEXT_SECTION_FIRST_RTO_ESTIMATE_SHIFT 29 +#define TSTORM_TCP_ST_CONTEXT_SECTION_MAX_SEG_RETRANSMIT_EN (0x1<<30) +#define TSTORM_TCP_ST_CONTEXT_SECTION_MAX_SEG_RETRANSMIT_EN_SHIFT 30 +#define TSTORM_TCP_ST_CONTEXT_SECTION_RESERVED3 (0x1<<31) +#define TSTORM_TCP_ST_CONTEXT_SECTION_RESERVED3_SHIFT 31 + u32 flags2; +#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_20B (0xFFFFFF<<0) +#define TSTORM_TCP_ST_CONTEXT_SECTION_RTT_VARIATION_20B_SHIFT 0 +#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN (0x1<<24) +#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN_SHIFT 24 +#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_COUNTER_EN (0x1<<25) +#define TSTORM_TCP_ST_CONTEXT_SECTION_DA_COUNTER_EN_SHIFT 25 +#define __TSTORM_TCP_ST_CONTEXT_SECTION_KA_PROBE_SENT (0x1<<26) +#define __TSTORM_TCP_ST_CONTEXT_SECTION_KA_PROBE_SENT_SHIFT 26 +#define __TSTORM_TCP_ST_CONTEXT_SECTION_PERSIST_PROBE_SENT (0x1<<27) +#define __TSTORM_TCP_ST_CONTEXT_SECTION_PERSIST_PROBE_SENT_SHIFT 27 +#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<28) +#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 28 +#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<29) +#define TSTORM_TCP_ST_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 29 +#define __TSTORM_TCP_ST_CONTEXT_SECTION_SECOND_ISLE_DROPPED (0x1<<30) +#define __TSTORM_TCP_ST_CONTEXT_SECTION_SECOND_ISLE_DROPPED_SHIFT 30 +#define __TSTORM_TCP_ST_CONTEXT_SECTION_DONT_SUPPORT_OOO (0x1<<31) +#define __TSTORM_TCP_ST_CONTEXT_SECTION_DONT_SUPPORT_OOO_SHIFT 31 +#if defined(__BIG_ENDIAN) + u16 reserved_slowpath; + u8 tcp_sm_state_3b; + u8 rto_exp_3b; +#elif defined(__LITTLE_ENDIAN) + u8 rto_exp_3b; + u8 tcp_sm_state_3b; + u16 reserved_slowpath; +#endif + u32 rcv_nxt; + u32 timestamp_recent; + u32 timestamp_recent_time; + u32 cwnd; + u32 ss_thresh; + u32 cwnd_accum; + u32 prev_seg_seq; + u32 expected_rel_seq; + u32 recover; +#if defined(__BIG_ENDIAN) + u8 retransmit_count; + u8 ka_max_probe_count; + u8 persist_probe_count; + u8 ka_probe_count; +#elif defined(__LITTLE_ENDIAN) + u8 ka_probe_count; + u8 persist_probe_count; + u8 ka_max_probe_count; + u8 retransmit_count; +#endif +#if defined(__BIG_ENDIAN) + u8 statistics_counter_id; + u8 ooo_support_mode; + u8 snd_wnd_scale_4b; + u8 dup_ack_count; +#elif defined(__LITTLE_ENDIAN) + u8 dup_ack_count; + u8 snd_wnd_scale_4b; + u8 ooo_support_mode; + u8 statistics_counter_id; +#endif + u32 retransmit_start_time; + u32 ka_timeout; + u32 ka_interval; + u32 isle_start_seq; + u32 isle_end_seq; +#if defined(__BIG_ENDIAN) + u16 mss; + u16 recent_seg_wnd; +#elif defined(__LITTLE_ENDIAN) + u16 recent_seg_wnd; + u16 mss; +#endif + u32 reserved4; + u32 max_rt_time; +#if defined(__BIG_ENDIAN) + u16 lsb_mac_address; + u16 vlan_id; +#elif defined(__LITTLE_ENDIAN) + u16 vlan_id; + u16 lsb_mac_address; +#endif + u32 msb_mac_address; + u32 reserved2; +}; + +/* + * Termination variables + */ +struct iscsi_term_vars { + u8 BitMap; +#define ISCSI_TERM_VARS_TCP_STATE (0xF<<0) +#define ISCSI_TERM_VARS_TCP_STATE_SHIFT 0 +#define ISCSI_TERM_VARS_FIN_RECEIVED_SBIT (0x1<<4) +#define ISCSI_TERM_VARS_FIN_RECEIVED_SBIT_SHIFT 4 +#define ISCSI_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT (0x1<<5) +#define ISCSI_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT_SHIFT 5 +#define ISCSI_TERM_VARS_TERM_ON_CHIP (0x1<<6) +#define ISCSI_TERM_VARS_TERM_ON_CHIP_SHIFT 6 +#define ISCSI_TERM_VARS_RSRV (0x1<<7) +#define ISCSI_TERM_VARS_RSRV_SHIFT 7 +}; + +/* + * iSCSI context region, used only in iSCSI + */ +struct tstorm_iscsi_st_context_section { +#if defined(__BIG_ENDIAN) + u16 rem_tcp_data_len; + u16 brb_offset; +#elif defined(__LITTLE_ENDIAN) + u16 brb_offset; + u16 rem_tcp_data_len; +#endif + u32 b2nh; +#if defined(__BIG_ENDIAN) + u16 rq_cons; + u8 flags; +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN (0x1<<0) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN_SHIFT 0 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN (0x1<<1) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN_SHIFT 1 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER (0x1<<2) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER_SHIFT 2 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE (0x1<<3) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE_SHIFT 3 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS (0x1<<4) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS_SHIFT 4 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV (0x7<<5) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV_SHIFT 5 + u8 hdr_bytes_2_fetch; +#elif defined(__LITTLE_ENDIAN) + u8 hdr_bytes_2_fetch; + u8 flags; +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN (0x1<<0) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_HDR_DIGEST_EN_SHIFT 0 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN (0x1<<1) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DATA_DIGEST_EN_SHIFT 1 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER (0x1<<2) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_PARTIAL_HEADER_SHIFT 2 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE (0x1<<3) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_FULL_FEATURE_SHIFT 3 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS (0x1<<4) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_B_DROP_ALL_PDUS_SHIFT 4 +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV (0x7<<5) +#define TSTORM_ISCSI_ST_CONTEXT_SECTION_FLAGS_RSRV_SHIFT 5 + u16 rq_cons; +#endif + struct regpair rq_db_phy_addr; +#if defined(__BIG_ENDIAN) + struct iscsi_term_vars term_vars; + u8 scratchpad_idx; + u16 iscsi_conn_id; +#elif defined(__LITTLE_ENDIAN) + u16 iscsi_conn_id; + u8 scratchpad_idx; + struct iscsi_term_vars term_vars; +#endif + u32 reserved2; +}; + +/* + * The iSCSI non-aggregative context of Tstorm + */ +struct tstorm_iscsi_st_context { + struct tstorm_tcp_st_context_section tcp; + struct tstorm_iscsi_st_context_section iscsi; +}; + +/* + * The tcp aggregative context section of Xstorm + */ +struct xstorm_tcp_tcp_ag_context_section { +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars1; + u8 __da_cnt; + u16 mss; +#elif defined(__LITTLE_ENDIAN) + u16 mss; + u8 __da_cnt; + u8 __tcp_agg_vars1; +#endif + u32 snd_nxt; + u32 tx_wnd; + u32 snd_una; + u32 local_adv_wnd; +#if defined(__BIG_ENDIAN) + u8 __agg_val8_th; + u8 __agg_val8; + u16 tcp_agg_vars2; +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG (0x1<<0) +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_SHIFT 0 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED (0x1<<1) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED_SHIFT 1 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE (0x1<<2) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE_SHIFT 2 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG (0x1<<3) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG_SHIFT 3 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG (0x1<<4) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG_SHIFT 4 +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE (0x1<<5) +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE_SHIFT 5 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN (0x1<<6) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN_SHIFT 6 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN (0x1<<7) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN_SHIFT 7 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN (0x1<<8) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN_SHIFT 8 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<9) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 9 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF (0x3<<10) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF_SHIFT 10 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF (0x3<<12) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF_SHIFT 12 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF (0x3<<14) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_SHIFT 14 +#elif defined(__LITTLE_ENDIAN) + u16 tcp_agg_vars2; +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG (0x1<<0) +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_SHIFT 0 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED (0x1<<1) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_UNBLOCKED_SHIFT 1 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE (0x1<<2) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_TIMER_ACTIVE_SHIFT 2 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG (0x1<<3) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_FLAG_SHIFT 3 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG (0x1<<4) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX4_FLAG_SHIFT 4 +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE (0x1<<5) +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DA_ENABLE_SHIFT 5 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN (0x1<<6) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ACK_TO_FE_UPDATED_EN_SHIFT 6 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN (0x1<<7) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX3_CF_EN_SHIFT 7 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN (0x1<<8) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_FIN_FLAG_EN_SHIFT 8 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<9) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 9 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF (0x3<<10) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_SET_RTO_CF_SHIFT 10 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF (0x3<<12) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_UPDATED_CF_SHIFT 12 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF (0x3<<14) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_SHIFT 14 + u8 __agg_val8; + u8 __agg_val8_th; +#endif + u32 ack_to_far_end; + u32 rto_timer; + u32 ka_timer; + u32 ts_to_echo; +#if defined(__BIG_ENDIAN) + u16 __agg_val7_th; + u16 __agg_val7; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val7; + u16 __agg_val7_th; +#endif +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars5; + u8 __tcp_agg_vars4; + u8 __tcp_agg_vars3; + u8 __force_pure_ack_cnt; +#elif defined(__LITTLE_ENDIAN) + u8 __force_pure_ack_cnt; + u8 __tcp_agg_vars3; + u8 __tcp_agg_vars4; + u8 __tcp_agg_vars5; +#endif + u32 tcp_agg_vars6; +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_CF_EN (0x1<<0) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TS_TO_ECHO_CF_EN_SHIFT 0 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_EN (0x1<<1) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX8_CF_EN_SHIFT 1 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_EN (0x1<<2) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_EN_SHIFT 2 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN (0x1<<3) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN_SHIFT 3 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX6_FLAG (0x1<<4) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX6_FLAG_SHIFT 4 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX7_FLAG (0x1<<5) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX7_FLAG_SHIFT 5 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX5_CF (0x3<<6) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX5_CF_SHIFT 6 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF (0x3<<8) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX9_CF_SHIFT 8 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF (0x3<<10) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_SHIFT 10 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF (0x3<<12) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_SHIFT 12 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF (0x3<<14) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_SHIFT 14 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX13_CF (0x3<<16) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX13_CF_SHIFT 16 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX14_CF (0x3<<18) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX14_CF_SHIFT 18 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX15_CF (0x3<<20) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX15_CF_SHIFT 20 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX16_CF (0x3<<22) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX16_CF_SHIFT 22 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX17_CF (0x3<<24) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX17_CF_SHIFT 24 +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ECE_FLAG (0x1<<26) +#define XSTORM_TCP_TCP_AG_CONTEXT_SECTION_ECE_FLAG_SHIFT 26 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED71 (0x1<<27) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED71_SHIFT 27 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_FORCE_PURE_ACK_CNT_DIRTY (0x1<<28) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_FORCE_PURE_ACK_CNT_DIRTY_SHIFT 28 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TCP_AUTO_STOP_FLAG (0x1<<29) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_TCP_AUTO_STOP_FLAG_SHIFT 29 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DO_TS_UPDATE_FLAG (0x1<<30) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_DO_TS_UPDATE_FLAG_SHIFT 30 +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_CANCEL_RETRANSMIT_FLAG (0x1<<31) +#define __XSTORM_TCP_TCP_AG_CONTEXT_SECTION_CANCEL_RETRANSMIT_FLAG_SHIFT 31 +#if defined(__BIG_ENDIAN) + u16 __agg_misc6; + u16 __tcp_agg_vars7; +#elif defined(__LITTLE_ENDIAN) + u16 __tcp_agg_vars7; + u16 __agg_misc6; +#endif + u32 __agg_val10; + u32 __agg_val10_th; +#if defined(__BIG_ENDIAN) + u16 __reserved3; + u8 __reserved2; + u8 __da_only_cnt; +#elif defined(__LITTLE_ENDIAN) + u8 __da_only_cnt; + u8 __reserved2; + u16 __reserved3; +#endif +}; + +/* + * The iscsi aggregative context of Xstorm + */ +struct xstorm_iscsi_ag_context { +#if defined(__BIG_ENDIAN) + u16 agg_val1; + u8 agg_vars1; +#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN (0x1<<5) +#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG (0x1<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_SHIFT 6 +#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN_SHIFT 7 + u8 state; +#elif defined(__LITTLE_ENDIAN) + u8 state; + u8 agg_vars1; +#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define XSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_MORE_TO_SEND_EN_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN (0x1<<5) +#define XSTORM_ISCSI_AG_CONTEXT_NAGLE_EN_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG (0x1<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_SHIFT 6 +#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_UNA_GT_NXT_EN_SHIFT 7 + u16 agg_val1; +#endif +#if defined(__BIG_ENDIAN) + u8 cdu_reserved; + u8 agg_vars4; +#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF (0x3<<0) +#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF (0x3<<2) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_SHIFT 2 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN_SHIFT 4 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN (0x1<<5) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN (0x1<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN_SHIFT 6 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN_SHIFT 7 + u8 agg_vars3; +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2 (0x3F<<0) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF (0x3<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_SHIFT 6 + u8 agg_vars2; +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF (0x3<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN (0x1<<2) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN_SHIFT 2 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG (0x1<<3) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG_SHIFT 3 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1 (0x3<<5) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 +#elif defined(__LITTLE_ENDIAN) + u8 agg_vars2; +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF (0x3<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN (0x1<<2) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_SPARE_FLAG_EN_SHIFT 2 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG (0x1<<3) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX8_FLAG_SHIFT 3 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX9_FLAG_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1 (0x3<<5) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE1_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 + u8 agg_vars3; +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2 (0x3F<<0) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM2_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF (0x3<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_SHIFT 6 + u8 agg_vars4; +#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF (0x3<<0) +#define XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF (0x3<<2) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_SHIFT 2 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN (0x1<<4) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_EN_SHIFT 4 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN (0x1<<5) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX19_CF_EN_SHIFT 5 +#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN (0x1<<6) +#define __XSTORM_ISCSI_AG_CONTEXT_R2TQ_PROD_CF_EN_SHIFT 6 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN (0x1<<7) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX21_CF_EN_SHIFT 7 + u8 cdu_reserved; +#endif + u32 more_to_send; +#if defined(__BIG_ENDIAN) + u16 agg_vars5; +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5 (0x3<<0) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0 (0x3F<<2) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0_SHIFT 2 +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1 (0x3F<<8) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1_SHIFT 8 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2 (0x3<<14) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2_SHIFT 14 + u16 sq_cons; +#elif defined(__LITTLE_ENDIAN) + u16 sq_cons; + u16 agg_vars5; +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5 (0x3<<0) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE5_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0 (0x3F<<2) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM0_SHIFT 2 +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1 (0x3F<<8) +#define XSTORM_ISCSI_AG_CONTEXT_PHYSICAL_QUEUE_NUM1_SHIFT 8 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2 (0x3<<14) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE2_SHIFT 14 +#endif + struct xstorm_tcp_tcp_ag_context_section tcp; +#if defined(__BIG_ENDIAN) + u16 agg_vars7; +#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE (0x7<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG (0x1<<3) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG_SHIFT 3 +#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF (0x3<<4) +#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3 (0x3<<6) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3_SHIFT 6 +#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF (0x3<<8) +#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_SHIFT 8 +#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK (0x1<<10) +#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK_SHIFT 10 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN (0x1<<11) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN_SHIFT 11 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG (0x1<<12) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG_SHIFT 12 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG (0x1<<13) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG_SHIFT 13 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG (0x1<<14) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG_SHIFT 14 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG (0x1<<15) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG_SHIFT 15 + u8 agg_val3_th; + u8 agg_vars6; +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6 (0x7<<0) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7 (0x7<<3) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7_SHIFT 3 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4 (0x3<<6) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4_SHIFT 6 +#elif defined(__LITTLE_ENDIAN) + u8 agg_vars6; +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6 (0x7<<0) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE6_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7 (0x7<<3) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE7_SHIFT 3 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4 (0x3<<6) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE4_SHIFT 6 + u8 agg_val3_th; + u16 agg_vars7; +#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE (0x7<<0) +#define __XSTORM_ISCSI_AG_CONTEXT_AGG_VAL11_DECISION_RULE_SHIFT 0 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG (0x1<<3) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX13_FLAG_SHIFT 3 +#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF (0x3<<4) +#define XSTORM_ISCSI_AG_CONTEXT_AUX18_CF_SHIFT 4 +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3 (0x3<<6) +#define XSTORM_ISCSI_AG_CONTEXT_DECISION_RULE3_SHIFT 6 +#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF (0x3<<8) +#define XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_SHIFT 8 +#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK (0x1<<10) +#define __XSTORM_ISCSI_AG_CONTEXT_COMPLETION_SEQ_DECISION_MASK_SHIFT 10 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN (0x1<<11) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX1_CF_EN_SHIFT 11 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG (0x1<<12) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX10_FLAG_SHIFT 12 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG (0x1<<13) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX11_FLAG_SHIFT 13 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG (0x1<<14) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX12_FLAG_SHIFT 14 +#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG (0x1<<15) +#define __XSTORM_ISCSI_AG_CONTEXT_AUX2_FLAG_SHIFT 15 +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val11_th; + u16 __agg_val11; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val11; + u16 __agg_val11_th; +#endif +#if defined(__BIG_ENDIAN) + u8 __reserved1; + u8 __agg_val6_th; + u16 __agg_val9; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val9; + u8 __agg_val6_th; + u8 __reserved1; +#endif +#if defined(__BIG_ENDIAN) + u16 hq_prod; + u16 hq_cons; +#elif defined(__LITTLE_ENDIAN) + u16 hq_cons; + u16 hq_prod; +#endif + u32 agg_vars8; +#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC2 (0xFFFFFF<<0) +#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC2_SHIFT 0 +#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC3 (0xFF<<24) +#define XSTORM_ISCSI_AG_CONTEXT_AGG_MISC3_SHIFT 24 +#if defined(__BIG_ENDIAN) + u16 r2tq_prod; + u16 sq_prod; +#elif defined(__LITTLE_ENDIAN) + u16 sq_prod; + u16 r2tq_prod; +#endif +#if defined(__BIG_ENDIAN) + u8 agg_val3; + u8 agg_val6; + u8 agg_val5_th; + u8 agg_val5; +#elif defined(__LITTLE_ENDIAN) + u8 agg_val5; + u8 agg_val5_th; + u8 agg_val6; + u8 agg_val3; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_misc1; + u16 agg_limit1; +#elif defined(__LITTLE_ENDIAN) + u16 agg_limit1; + u16 __agg_misc1; +#endif + u32 hq_cons_tcp_seq; + u32 exp_stat_sn; + u32 agg_misc5; +}; + +/* + * The tcp aggregative context section of Tstorm + */ +struct tstorm_tcp_tcp_ag_context_section { + u32 __agg_val1; +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars2; + u8 __agg_val3; + u16 __agg_val2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val2; + u8 __agg_val3; + u8 __tcp_agg_vars2; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val5; + u8 __agg_val6; + u8 __tcp_agg_vars3; +#elif defined(__LITTLE_ENDIAN) + u8 __tcp_agg_vars3; + u8 __agg_val6; + u16 __agg_val5; +#endif + u32 snd_nxt; + u32 rtt_seq; + u32 rtt_time; + u32 __reserved66; + u32 wnd_right_edge; + u32 tcp_agg_vars1; +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<0) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 0 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_LAST_PACKET_FIN_FLAG (0x1<<1) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_LAST_PACKET_FIN_FLAG_SHIFT 1 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF (0x3<<2) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_SHIFT 2 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF (0x3<<4) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_SHIFT 4 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_EN (0x1<<6) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_WND_UPD_CF_EN_SHIFT 6 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_EN (0x1<<7) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TIMEOUT_CF_EN_SHIFT 7 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_SEQ_EN (0x1<<8) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_SEQ_EN_SHIFT 8 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_SND_NXT_EN (0x1<<9) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_SND_NXT_EN_SHIFT 9 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG (0x1<<10) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_FLAG_SHIFT 10 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_FLAG (0x1<<11) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_FLAG_SHIFT 11 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_EN (0x1<<12) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_EN_SHIFT 12 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_EN (0x1<<13) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_EN_SHIFT 13 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF (0x3<<14) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX1_CF_SHIFT 14 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF (0x3<<16) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX2_CF_SHIFT 16 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_BLOCKED (0x1<<18) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_TX_BLOCKED_SHIFT 18 +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN (0x1<<19) +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX10_CF_EN_SHIFT 19 +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_EN (0x1<<20) +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX11_CF_EN_SHIFT 20 +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_EN (0x1<<21) +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_AUX12_CF_EN_SHIFT 21 +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED1 (0x3<<22) +#define __TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RESERVED1_SHIFT 22 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_PEND_SEQ (0xF<<24) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_PEND_SEQ_SHIFT 24 +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_DONE_SEQ (0xF<<28) +#define TSTORM_TCP_TCP_AG_CONTEXT_SECTION_RETRANSMIT_DONE_SEQ_SHIFT 28 + u32 snd_max; + u32 snd_una; + u32 __reserved2; +}; + +/* + * The iscsi aggregative context of Tstorm + */ +struct tstorm_iscsi_ag_context { +#if defined(__BIG_ENDIAN) + u16 ulp_credit; + u8 agg_vars1; +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF (0x3<<4) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_SHIFT 4 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG (0x1<<6) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG_SHIFT 6 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG (0x1<<7) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG_SHIFT 7 + u8 state; +#elif defined(__LITTLE_ENDIAN) + u8 state; + u8 agg_vars1; +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define TSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF (0x3<<4) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_SHIFT 4 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG (0x1<<6) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX3_FLAG_SHIFT 6 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG (0x1<<7) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_FLAG_SHIFT 7 + u16 ulp_credit; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val4; + u16 agg_vars2; +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG (0x1<<0) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG_SHIFT 0 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG (0x1<<1) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG_SHIFT 1 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF (0x3<<2) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_SHIFT 2 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF (0x3<<4) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_SHIFT 4 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF (0x3<<6) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_SHIFT 6 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF (0x3<<8) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_SHIFT 8 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG (0x1<<10) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG_SHIFT 10 +#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<11) +#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 11 +#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN (0x1<<12) +#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN_SHIFT 12 +#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN (0x1<<13) +#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN_SHIFT 13 +#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN (0x1<<14) +#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN_SHIFT 14 +#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN (0x1<<15) +#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN_SHIFT 15 +#elif defined(__LITTLE_ENDIAN) + u16 agg_vars2; +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG (0x1<<0) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_FLAG_SHIFT 0 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG (0x1<<1) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_FLAG_SHIFT 1 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF (0x3<<2) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_SHIFT 2 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF (0x3<<4) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_SHIFT 4 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF (0x3<<6) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_SHIFT 6 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF (0x3<<8) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_SHIFT 8 +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG (0x1<<10) +#define __TSTORM_ISCSI_AG_CONTEXT_AUX7_FLAG_SHIFT 10 +#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<11) +#define TSTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 11 +#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN (0x1<<12) +#define TSTORM_ISCSI_AG_CONTEXT_AUX4_CF_EN_SHIFT 12 +#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN (0x1<<13) +#define TSTORM_ISCSI_AG_CONTEXT_AUX5_CF_EN_SHIFT 13 +#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN (0x1<<14) +#define TSTORM_ISCSI_AG_CONTEXT_AUX6_CF_EN_SHIFT 14 +#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN (0x1<<15) +#define TSTORM_ISCSI_AG_CONTEXT_AUX7_CF_EN_SHIFT 15 + u16 __agg_val4; +#endif + struct tstorm_tcp_tcp_ag_context_section tcp; +}; + +/* + * The iscsi aggregative context of Cstorm + */ +struct cstorm_iscsi_ag_context { + u32 agg_vars1; +#define CSTORM_ISCSI_AG_CONTEXT_STATE (0xFF<<0) +#define CSTORM_ISCSI_AG_CONTEXT_STATE_SHIFT 0 +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<8) +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 8 +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<9) +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 9 +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<10) +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 10 +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<11) +#define __CSTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 11 +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_SE_CF_EN (0x1<<12) +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_SE_CF_EN_SHIFT 12 +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_INV_CF_EN (0x1<<13) +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED_ULP_RX_INV_CF_EN_SHIFT 13 +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF (0x3<<14) +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_SHIFT 14 +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED66 (0x3<<16) +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED66_SHIFT 16 +#define __CSTORM_ISCSI_AG_CONTEXT_FIN_RECEIVED_CF_EN (0x1<<18) +#define __CSTORM_ISCSI_AG_CONTEXT_FIN_RECEIVED_CF_EN_SHIFT 18 +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION0_CF_EN (0x1<<19) +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION0_CF_EN_SHIFT 19 +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION1_CF_EN (0x1<<20) +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION1_CF_EN_SHIFT 20 +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION2_CF_EN (0x1<<21) +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION2_CF_EN_SHIFT 21 +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_EN (0x1<<22) +#define __CSTORM_ISCSI_AG_CONTEXT_PENDING_COMPLETION3_CF_EN_SHIFT 22 +#define __CSTORM_ISCSI_AG_CONTEXT_REL_SEQ_RULE (0x7<<23) +#define __CSTORM_ISCSI_AG_CONTEXT_REL_SEQ_RULE_SHIFT 23 +#define CSTORM_ISCSI_AG_CONTEXT_HQ_PROD_RULE (0x3<<26) +#define CSTORM_ISCSI_AG_CONTEXT_HQ_PROD_RULE_SHIFT 26 +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED52 (0x3<<28) +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED52_SHIFT 28 +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED53 (0x3<<30) +#define __CSTORM_ISCSI_AG_CONTEXT_RESERVED53_SHIFT 30 +#if defined(__BIG_ENDIAN) + u8 __aux1_th; + u8 __aux1_val; + u16 __agg_vars2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_vars2; + u8 __aux1_val; + u8 __aux1_th; +#endif + u32 rel_seq; + u32 rel_seq_th; +#if defined(__BIG_ENDIAN) + u16 hq_cons; + u16 hq_prod; +#elif defined(__LITTLE_ENDIAN) + u16 hq_prod; + u16 hq_cons; +#endif +#if defined(__BIG_ENDIAN) + u8 __reserved62; + u8 __reserved61; + u8 __reserved60; + u8 __reserved59; +#elif defined(__LITTLE_ENDIAN) + u8 __reserved59; + u8 __reserved60; + u8 __reserved61; + u8 __reserved62; +#endif +#if defined(__BIG_ENDIAN) + u16 __reserved64; + u16 __cq_u_prod0; +#elif defined(__LITTLE_ENDIAN) + u16 __cq_u_prod0; + u16 __reserved64; +#endif + u32 __cq_u_prod1; +#if defined(__BIG_ENDIAN) + u16 __agg_vars3; + u16 __cq_u_prod2; +#elif defined(__LITTLE_ENDIAN) + u16 __cq_u_prod2; + u16 __agg_vars3; +#endif +#if defined(__BIG_ENDIAN) + u16 __aux2_th; + u16 __cq_u_prod3; +#elif defined(__LITTLE_ENDIAN) + u16 __cq_u_prod3; + u16 __aux2_th; +#endif +}; + +/* + * The iscsi aggregative context of Ustorm + */ +struct ustorm_iscsi_ag_context { +#if defined(__BIG_ENDIAN) + u8 __aux_counter_flags; + u8 agg_vars2; +#define USTORM_ISCSI_AG_CONTEXT_TX_CF (0x3<<0) +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_SHIFT 0 +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF (0x3<<2) +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_SHIFT 2 +#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE (0x7<<4) +#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE_SHIFT 4 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK_SHIFT 7 + u8 agg_vars1; +#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define USTORM_ISCSI_AG_CONTEXT_INV_CF (0x3<<4) +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_SHIFT 4 +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF (0x3<<6) +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_SHIFT 6 + u8 state; +#elif defined(__LITTLE_ENDIAN) + u8 state; + u8 agg_vars1; +#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0 (0x1<<0) +#define __USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM0_SHIFT 0 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1 (0x1<<1) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM1_SHIFT 1 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2 (0x1<<2) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM2_SHIFT 2 +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3 (0x1<<3) +#define USTORM_ISCSI_AG_CONTEXT_EXISTS_IN_QM3_SHIFT 3 +#define USTORM_ISCSI_AG_CONTEXT_INV_CF (0x3<<4) +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_SHIFT 4 +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF (0x3<<6) +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_SHIFT 6 + u8 agg_vars2; +#define USTORM_ISCSI_AG_CONTEXT_TX_CF (0x3<<0) +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_SHIFT 0 +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF (0x3<<2) +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_SHIFT 2 +#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE (0x7<<4) +#define USTORM_ISCSI_AG_CONTEXT_AGG_MISC4_RULE_SHIFT 4 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_MASK_SHIFT 7 + u8 __aux_counter_flags; +#endif +#if defined(__BIG_ENDIAN) + u8 cdu_usage; + u8 agg_misc2; + u16 __cq_local_comp_itt_val; +#elif defined(__LITTLE_ENDIAN) + u16 __cq_local_comp_itt_val; + u8 agg_misc2; + u8 cdu_usage; +#endif + u32 agg_misc4; +#if defined(__BIG_ENDIAN) + u8 agg_val3_th; + u8 agg_val3; + u16 agg_misc3; +#elif defined(__LITTLE_ENDIAN) + u16 agg_misc3; + u8 agg_val3; + u8 agg_val3_th; +#endif + u32 agg_val1; + u32 agg_misc4_th; +#if defined(__BIG_ENDIAN) + u16 agg_val2_th; + u16 agg_val2; +#elif defined(__LITTLE_ENDIAN) + u16 agg_val2; + u16 agg_val2_th; +#endif +#if defined(__BIG_ENDIAN) + u16 __reserved2; + u8 decision_rules; +#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE (0x7<<0) +#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE_SHIFT 0 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE (0x7<<3) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE_SHIFT 3 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG (0x1<<6) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG_SHIFT 6 +#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1 (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1_SHIFT 7 + u8 decision_rule_enable_bits; +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN (0x1<<0) +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN_SHIFT 0 +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN (0x1<<1) +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN_SHIFT 1 +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN (0x1<<2) +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN_SHIFT 2 +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN (0x1<<3) +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN_SHIFT 3 +#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN (0x1<<4) +#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN_SHIFT 4 +#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN (0x1<<5) +#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN_SHIFT 5 +#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<6) +#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 6 +#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 +#elif defined(__LITTLE_ENDIAN) + u8 decision_rule_enable_bits; +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN (0x1<<0) +#define USTORM_ISCSI_AG_CONTEXT_INV_CF_EN_SHIFT 0 +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN (0x1<<1) +#define USTORM_ISCSI_AG_CONTEXT_COMPLETION_CF_EN_SHIFT 1 +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN (0x1<<2) +#define USTORM_ISCSI_AG_CONTEXT_TX_CF_EN_SHIFT 2 +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN (0x1<<3) +#define __USTORM_ISCSI_AG_CONTEXT_TIMER_CF_EN_SHIFT 3 +#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN (0x1<<4) +#define __USTORM_ISCSI_AG_CONTEXT_CQ_LOCAL_COMP_CF_EN_SHIFT 4 +#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN (0x1<<5) +#define __USTORM_ISCSI_AG_CONTEXT_QUEUES_FLUSH_Q0_CF_EN_SHIFT 5 +#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN (0x1<<6) +#define __USTORM_ISCSI_AG_CONTEXT_AUX3_CF_EN_SHIFT 6 +#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_DQ_CF_EN_SHIFT 7 + u8 decision_rules; +#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE (0x7<<0) +#define USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_RULE_SHIFT 0 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE (0x7<<3) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL3_RULE_SHIFT 3 +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG (0x1<<6) +#define __USTORM_ISCSI_AG_CONTEXT_AGG_VAL2_ARM_N_FLAG_SHIFT 6 +#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1 (0x1<<7) +#define __USTORM_ISCSI_AG_CONTEXT_RESERVED1_SHIFT 7 + u16 __reserved2; +#endif +}; + +/* + * Timers connection context + */ +struct iscsi_timers_block_context { + u32 __reserved_0; + u32 __reserved_1; + u32 __reserved_2; + u32 flags; +#define __ISCSI_TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS (0x3<<0) +#define __ISCSI_TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS_SHIFT 0 +#define ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG (0x1<<2) +#define ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG_SHIFT 2 +#define __ISCSI_TIMERS_BLOCK_CONTEXT_RESERVED0 (0x1FFFFFFF<<3) +#define __ISCSI_TIMERS_BLOCK_CONTEXT_RESERVED0_SHIFT 3 +}; + +/* + * Ethernet context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_eth_context_section { +#if defined(__BIG_ENDIAN) + u8 remote_addr_4; + u8 remote_addr_5; + u8 local_addr_0; + u8 local_addr_1; +#elif defined(__LITTLE_ENDIAN) + u8 local_addr_1; + u8 local_addr_0; + u8 remote_addr_5; + u8 remote_addr_4; +#endif +#if defined(__BIG_ENDIAN) + u8 remote_addr_0; + u8 remote_addr_1; + u8 remote_addr_2; + u8 remote_addr_3; +#elif defined(__LITTLE_ENDIAN) + u8 remote_addr_3; + u8 remote_addr_2; + u8 remote_addr_1; + u8 remote_addr_0; +#endif +#if defined(__BIG_ENDIAN) + u16 reserved_vlan_type; + u16 params; +#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0) +#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0 +#define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12) +#define XSTORM_ETH_CONTEXT_SECTION_CFI_SHIFT 12 +#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY (0x7<<13) +#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT 13 +#elif defined(__LITTLE_ENDIAN) + u16 params; +#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID (0xFFF<<0) +#define XSTORM_ETH_CONTEXT_SECTION_VLAN_ID_SHIFT 0 +#define XSTORM_ETH_CONTEXT_SECTION_CFI (0x1<<12) +#define XSTORM_ETH_CONTEXT_SECTION_CFI_SHIFT 12 +#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY (0x7<<13) +#define XSTORM_ETH_CONTEXT_SECTION_PRIORITY_SHIFT 13 + u16 reserved_vlan_type; +#endif +#if defined(__BIG_ENDIAN) + u8 local_addr_2; + u8 local_addr_3; + u8 local_addr_4; + u8 local_addr_5; +#elif defined(__LITTLE_ENDIAN) + u8 local_addr_5; + u8 local_addr_4; + u8 local_addr_3; + u8 local_addr_2; +#endif +}; + +/* + * IpV4 context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_ip_v4_context_section { +#if defined(__BIG_ENDIAN) + u16 __pbf_hdr_cmd_rsvd_id; + u16 __pbf_hdr_cmd_rsvd_flags_offset; +#elif defined(__LITTLE_ENDIAN) + u16 __pbf_hdr_cmd_rsvd_flags_offset; + u16 __pbf_hdr_cmd_rsvd_id; +#endif +#if defined(__BIG_ENDIAN) + u8 __pbf_hdr_cmd_rsvd_ver_ihl; + u8 tos; + u16 __pbf_hdr_cmd_rsvd_length; +#elif defined(__LITTLE_ENDIAN) + u16 __pbf_hdr_cmd_rsvd_length; + u8 tos; + u8 __pbf_hdr_cmd_rsvd_ver_ihl; +#endif + u32 ip_local_addr; +#if defined(__BIG_ENDIAN) + u8 ttl; + u8 __pbf_hdr_cmd_rsvd_protocol; + u16 __pbf_hdr_cmd_rsvd_csum; +#elif defined(__LITTLE_ENDIAN) + u16 __pbf_hdr_cmd_rsvd_csum; + u8 __pbf_hdr_cmd_rsvd_protocol; + u8 ttl; +#endif + u32 __pbf_hdr_cmd_rsvd_1; + u32 ip_remote_addr; +}; + +/* + * context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_padded_ip_v4_context_section { + struct xstorm_ip_v4_context_section ip_v4; + u32 reserved1[4]; +}; + +/* + * IpV6 context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_ip_v6_context_section { +#if defined(__BIG_ENDIAN) + u16 pbf_hdr_cmd_rsvd_payload_len; + u8 pbf_hdr_cmd_rsvd_nxt_hdr; + u8 hop_limit; +#elif defined(__LITTLE_ENDIAN) + u8 hop_limit; + u8 pbf_hdr_cmd_rsvd_nxt_hdr; + u16 pbf_hdr_cmd_rsvd_payload_len; +#endif + u32 priority_flow_label; +#define XSTORM_IP_V6_CONTEXT_SECTION_FLOW_LABEL (0xFFFFF<<0) +#define XSTORM_IP_V6_CONTEXT_SECTION_FLOW_LABEL_SHIFT 0 +#define XSTORM_IP_V6_CONTEXT_SECTION_TRAFFIC_CLASS (0xFF<<20) +#define XSTORM_IP_V6_CONTEXT_SECTION_TRAFFIC_CLASS_SHIFT 20 +#define XSTORM_IP_V6_CONTEXT_SECTION_PBF_HDR_CMD_RSVD_VER (0xF<<28) +#define XSTORM_IP_V6_CONTEXT_SECTION_PBF_HDR_CMD_RSVD_VER_SHIFT 28 + u32 ip_local_addr_lo_hi; + u32 ip_local_addr_lo_lo; + u32 ip_local_addr_hi_hi; + u32 ip_local_addr_hi_lo; + u32 ip_remote_addr_lo_hi; + u32 ip_remote_addr_lo_lo; + u32 ip_remote_addr_hi_hi; + u32 ip_remote_addr_hi_lo; +}; + +union xstorm_ip_context_section_types { + struct xstorm_padded_ip_v4_context_section padded_ip_v4; + struct xstorm_ip_v6_context_section ip_v6; +}; + +/* + * TCP context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_tcp_context_section { + u32 snd_max; +#if defined(__BIG_ENDIAN) + u16 remote_port; + u16 local_port; +#elif defined(__LITTLE_ENDIAN) + u16 local_port; + u16 remote_port; +#endif +#if defined(__BIG_ENDIAN) + u8 original_nagle_1b; + u8 ts_enabled_1b; + u16 tcp_params; +#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE (0xFF<<0) +#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE_SHIFT 0 +#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT (0x1<<8) +#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT_SHIFT 8 +#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED (0x1<<9) +#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED_SHIFT 9 +#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED (0x1<<10) +#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED_SHIFT 10 +#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE (0x1<<11) +#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE_SHIFT 11 +#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<12) +#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 12 +#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED (0x1<<13) +#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED_SHIFT 13 +#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER (0x3<<14) +#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER_SHIFT 14 +#elif defined(__LITTLE_ENDIAN) + u16 tcp_params; +#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE (0xFF<<0) +#define XSTORM_TCP_CONTEXT_SECTION_TOTAL_HEADER_SIZE_SHIFT 0 +#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT (0x1<<8) +#define __XSTORM_TCP_CONTEXT_SECTION_ECT_BIT_SHIFT 8 +#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED (0x1<<9) +#define __XSTORM_TCP_CONTEXT_SECTION_ECN_ENABLED_SHIFT 9 +#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED (0x1<<10) +#define XSTORM_TCP_CONTEXT_SECTION_SACK_ENABLED_SHIFT 10 +#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE (0x1<<11) +#define XSTORM_TCP_CONTEXT_SECTION_KA_STATE_SHIFT 11 +#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG (0x1<<12) +#define XSTORM_TCP_CONTEXT_SECTION_FIN_SENT_FLAG_SHIFT 12 +#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED (0x1<<13) +#define XSTORM_TCP_CONTEXT_SECTION_WINDOW_SATURATED_SHIFT 13 +#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER (0x3<<14) +#define XSTORM_TCP_CONTEXT_SECTION_SLOWPATH_QUEUES_FLUSH_COUNTER_SHIFT 14 + u8 ts_enabled_1b; + u8 original_nagle_1b; +#endif +#if defined(__BIG_ENDIAN) + u16 pseudo_csum; + u16 window_scaling_factor; +#elif defined(__LITTLE_ENDIAN) + u16 window_scaling_factor; + u16 pseudo_csum; +#endif + u32 reserved2; + u32 ts_time_diff; + u32 __next_timer_expir; +}; + +/* + * Common context section, shared in TOE, RDMA and ISCSI + */ +struct xstorm_common_context_section { + struct xstorm_eth_context_section ethernet; + union xstorm_ip_context_section_types ip_union; + struct xstorm_tcp_context_section tcp; +#if defined(__BIG_ENDIAN) + u16 reserved; + u8 statistics_params; +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<0) +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 0 +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<1) +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 1 +#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID (0x1F<<2) +#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID_SHIFT 2 +#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0 (0x1<<7) +#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0_SHIFT 7 + u8 ip_version_1b; +#elif defined(__LITTLE_ENDIAN) + u8 ip_version_1b; + u8 statistics_params; +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS (0x1<<0) +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L2_STATSTICS_SHIFT 0 +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS (0x1<<1) +#define XSTORM_COMMON_CONTEXT_SECTION_UPDATE_L4_STATSTICS_SHIFT 1 +#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID (0x1F<<2) +#define XSTORM_COMMON_CONTEXT_SECTION_STATISTICS_COUNTER_ID_SHIFT 2 +#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0 (0x1<<7) +#define XSTORM_COMMON_CONTEXT_SECTION_RESERVED0_SHIFT 7 + u16 reserved; +#endif +}; + +/* + * Flags used in ISCSI context section + */ +struct xstorm_iscsi_context_flags { + u8 flags; +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA (0x1<<0) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA_SHIFT 0 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T (0x1<<1) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T_SHIFT 1 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_HEADER_DIGEST (0x1<<2) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_HEADER_DIGEST_SHIFT 2 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_DATA_DIGEST (0x1<<3) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_EN_DATA_DIGEST_SHIFT 3 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_HQ_BD_WRITTEN (0x1<<4) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_HQ_BD_WRITTEN_SHIFT 4 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_LAST_OP_SQ (0x1<<5) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_LAST_OP_SQ_SHIFT 5 +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_UPDATE_SND_NXT (0x1<<6) +#define XSTORM_ISCSI_CONTEXT_FLAGS_B_UPDATE_SND_NXT_SHIFT 6 +#define XSTORM_ISCSI_CONTEXT_FLAGS_RESERVED4 (0x1<<7) +#define XSTORM_ISCSI_CONTEXT_FLAGS_RESERVED4_SHIFT 7 +}; + +struct iscsi_task_context_entry_x { + u32 data_out_buffer_offset; + u32 itt; + u32 data_sn; +}; + +struct iscsi_task_context_entry_xuc_x_write_only { + u32 tx_r2t_sn; +}; + +struct iscsi_task_context_entry_xuc_xu_write_both { + u32 sgl_base_lo; + u32 sgl_base_hi; +#if defined(__BIG_ENDIAN) + u8 sgl_size; + u8 sge_index; + u16 sge_offset; +#elif defined(__LITTLE_ENDIAN) + u16 sge_offset; + u8 sge_index; + u8 sgl_size; +#endif +}; + +/* + * iSCSI context section + */ +struct xstorm_iscsi_context_section { + u32 first_burst_length; + u32 max_send_pdu_length; + struct regpair sq_pbl_base; + struct regpair sq_curr_pbe; + struct regpair hq_pbl_base; + struct regpair hq_curr_pbe_base; + struct regpair r2tq_pbl_base; + struct regpair r2tq_curr_pbe_base; + struct regpair task_pbl_base; +#if defined(__BIG_ENDIAN) + u16 data_out_count; + struct xstorm_iscsi_context_flags flags; + u8 task_pbl_cache_idx; +#elif defined(__LITTLE_ENDIAN) + u8 task_pbl_cache_idx; + struct xstorm_iscsi_context_flags flags; + u16 data_out_count; +#endif + u32 seq_more_2_send; + u32 pdu_more_2_send; + struct iscsi_task_context_entry_x temp_tce_x; + struct iscsi_task_context_entry_xuc_x_write_only temp_tce_x_wr; + struct iscsi_task_context_entry_xuc_xu_write_both temp_tce_xu_wr; + struct regpair lun; + u32 exp_data_transfer_len_ttt; + u32 pdu_data_2_rxmit; + u32 rxmit_bytes_2_dr; +#if defined(__BIG_ENDIAN) + u16 rxmit_sge_offset; + u16 hq_rxmit_cons; +#elif defined(__LITTLE_ENDIAN) + u16 hq_rxmit_cons; + u16 rxmit_sge_offset; +#endif +#if defined(__BIG_ENDIAN) + u16 r2tq_cons; + u8 rxmit_flags; +#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD (0x1<<0) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD_SHIFT 0 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR (0x1<<1) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR_SHIFT 1 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU (0x1<<2) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU_SHIFT 2 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR (0x1<<3) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR_SHIFT 3 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR (0x1<<4) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR_SHIFT 4 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING (0x3<<5) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING_SHIFT 5 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT (0x1<<7) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT_SHIFT 7 + u8 rxmit_sge_idx; +#elif defined(__LITTLE_ENDIAN) + u8 rxmit_sge_idx; + u8 rxmit_flags; +#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD (0x1<<0) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_NEW_HQ_BD_SHIFT 0 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR (0x1<<1) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PDU_HDR_SHIFT 1 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU (0x1<<2) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_END_PDU_SHIFT 2 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR (0x1<<3) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_DR_SHIFT 3 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR (0x1<<4) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_START_DR_SHIFT 4 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING (0x3<<5) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_RXMIT_PADDING_SHIFT 5 +#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT (0x1<<7) +#define XSTORM_ISCSI_CONTEXT_SECTION_B_ISCSI_CONT_FAST_RXMIT_SHIFT 7 + u16 r2tq_cons; +#endif + u32 hq_rxmit_tcp_seq; +}; + +/* + * Xstorm iSCSI Storm Context + */ +struct xstorm_iscsi_st_context { + struct xstorm_common_context_section common; + struct xstorm_iscsi_context_section iscsi; +}; + +/* + * CQ DB CQ producer and pending completion counter + */ +struct iscsi_cq_db_prod_pnd_cmpltn_cnt { +#if defined(__BIG_ENDIAN) + u16 cntr; + u16 prod; +#elif defined(__LITTLE_ENDIAN) + u16 prod; + u16 cntr; +#endif +}; + +/* + * CQ DB pending completion ITT array + */ +struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr { + struct iscsi_cq_db_prod_pnd_cmpltn_cnt prod_pend_comp[8]; +}; + +/* + * Cstorm CQ sequence to notify array, updated by driver + */ +struct iscsi_cq_db_sqn_2_notify_arr { + u16 sqn[8]; +}; + +/* + * Cstorm iSCSI Storm Context + */ +struct cstorm_iscsi_st_context { + struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr cq_c_prod_pend_comp_ctr_arr; + struct iscsi_cq_db_sqn_2_notify_arr cq_c_prod_sqn_arr; + struct iscsi_cq_db_sqn_2_notify_arr cq_c_sqn_2_notify_arr; + struct regpair hq_pbl_base; + struct regpair hq_curr_pbe; + struct regpair task_pbl_base; + struct regpair cq_db_base; +#if defined(__BIG_ENDIAN) + u16 hq_bd_itt; + u16 iscsi_conn_id; +#elif defined(__LITTLE_ENDIAN) + u16 iscsi_conn_id; + u16 hq_bd_itt; +#endif + u32 hq_bd_data_segment_len; + u32 hq_bd_buffer_offset; +#if defined(__BIG_ENDIAN) + u8 timer_entry_idx; + u8 cq_proc_en_bit_map; + u8 cq_pend_comp_itt_valid_bit_map; + u8 hq_bd_opcode; +#elif defined(__LITTLE_ENDIAN) + u8 hq_bd_opcode; + u8 cq_pend_comp_itt_valid_bit_map; + u8 cq_proc_en_bit_map; + u8 timer_entry_idx; +#endif + u32 hq_tcp_seq; +#if defined(__BIG_ENDIAN) + u16 flags; +#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN (0x1<<0) +#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN_SHIFT 0 +#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN (0x1<<1) +#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN_SHIFT 1 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID (0x1<<2) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID_SHIFT 2 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG (0x1<<3) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG_SHIFT 3 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK (0x1<<4) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK_SHIFT 4 +#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV (0x7FF<<5) +#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV_SHIFT 5 + u16 hq_cons; +#elif defined(__LITTLE_ENDIAN) + u16 hq_cons; + u16 flags; +#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN (0x1<<0) +#define CSTORM_ISCSI_ST_CONTEXT_DATA_DIGEST_EN_SHIFT 0 +#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN (0x1<<1) +#define CSTORM_ISCSI_ST_CONTEXT_HDR_DIGEST_EN_SHIFT 1 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID (0x1<<2) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_CTXT_VALID_SHIFT 2 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG (0x1<<3) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_LCL_CMPLN_FLG_SHIFT 3 +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK (0x1<<4) +#define CSTORM_ISCSI_ST_CONTEXT_HQ_BD_WRITE_TASK_SHIFT 4 +#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV (0x7FF<<5) +#define CSTORM_ISCSI_ST_CONTEXT_CTRL_FLAGS_RSRV_SHIFT 5 +#endif + struct regpair rsrv1; +}; + +/* + * Iscsi connection context + */ +struct iscsi_context { + struct ustorm_iscsi_st_context ustorm_st_context; + struct tstorm_iscsi_st_context tstorm_st_context; + struct xstorm_iscsi_ag_context xstorm_ag_context; + struct tstorm_iscsi_ag_context tstorm_ag_context; + struct cstorm_iscsi_ag_context cstorm_ag_context; + struct ustorm_iscsi_ag_context ustorm_ag_context; + struct iscsi_timers_block_context timers_context; + struct regpair upb_context; + struct xstorm_iscsi_st_context xstorm_st_context; + struct regpair xpb_context; + struct cstorm_iscsi_st_context cstorm_st_context; +}; + + + +/* + * CQ DB pending completion ITT array + */ +struct iscsi_cq_db_pnd_comp_itt_arr { + u16 itt[8]; +}; + +/* + * CQ DB + */ +struct iscsi_cq_db { + struct iscsi_cq_db_prod_pnd_cmpltn_cnt_arr cq_u_prod_pend_comp_ctr_arr; + struct iscsi_cq_db_pnd_comp_itt_arr cq_c_pend_comp_itt_arr; + struct iscsi_cq_db_sqn_2_notify_arr cq_drv_sqn_2_notify_arr; + u32 reserved[4]; +}; + + + + + + +/* + * iSCSI KCQ CQE parameters + */ +union iscsi_kcqe_params { + u32 reserved0[4]; +}; + +/* + * iSCSI KCQ CQE + */ +struct iscsi_kcqe { + u32 iscsi_conn_id; + u32 completion_status; + u32 iscsi_conn_context_id; + union iscsi_kcqe_params params; +#if defined(__BIG_ENDIAN) + u8 flags; +#define ISCSI_KCQE_RESERVED0 (0x7<<0) +#define ISCSI_KCQE_RESERVED0_SHIFT 0 +#define ISCSI_KCQE_RAMROD_COMPLETION (0x1<<3) +#define ISCSI_KCQE_RAMROD_COMPLETION_SHIFT 3 +#define ISCSI_KCQE_LAYER_CODE (0x7<<4) +#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 +#define ISCSI_KCQE_LINKED_WITH_NEXT (0x1<<7) +#define ISCSI_KCQE_LINKED_WITH_NEXT_SHIFT 7 + u8 op_code; + u16 qe_self_seq; +#elif defined(__LITTLE_ENDIAN) + u16 qe_self_seq; + u8 op_code; + u8 flags; +#define ISCSI_KCQE_RESERVED0 (0x7<<0) +#define ISCSI_KCQE_RESERVED0_SHIFT 0 +#define ISCSI_KCQE_RAMROD_COMPLETION (0x1<<3) +#define ISCSI_KCQE_RAMROD_COMPLETION_SHIFT 3 +#define ISCSI_KCQE_LAYER_CODE (0x7<<4) +#define ISCSI_KCQE_LAYER_CODE_SHIFT 4 +#define ISCSI_KCQE_LINKED_WITH_NEXT (0x1<<7) +#define ISCSI_KCQE_LINKED_WITH_NEXT_SHIFT 7 +#endif +}; + + + +/* + * iSCSI KWQE header + */ +struct iscsi_kwqe_header { +#if defined(__BIG_ENDIAN) + u8 flags; +#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) +#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 +#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) +#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 +#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) +#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 + u8 op_code; +#elif defined(__LITTLE_ENDIAN) + u8 op_code; + u8 flags; +#define ISCSI_KWQE_HEADER_RESERVED0 (0xF<<0) +#define ISCSI_KWQE_HEADER_RESERVED0_SHIFT 0 +#define ISCSI_KWQE_HEADER_LAYER_CODE (0x7<<4) +#define ISCSI_KWQE_HEADER_LAYER_CODE_SHIFT 4 +#define ISCSI_KWQE_HEADER_RESERVED1 (0x1<<7) +#define ISCSI_KWQE_HEADER_RESERVED1_SHIFT 7 +#endif +}; + +/* + * iSCSI firmware init request 1 + */ +struct iscsi_kwqe_init1 { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u8 reserved0; + u8 num_cqs; +#elif defined(__LITTLE_ENDIAN) + u8 num_cqs; + u8 reserved0; + struct iscsi_kwqe_header hdr; +#endif + u32 dummy_buffer_addr_lo; + u32 dummy_buffer_addr_hi; +#if defined(__BIG_ENDIAN) + u16 num_ccells_per_conn; + u16 num_tasks_per_conn; +#elif defined(__LITTLE_ENDIAN) + u16 num_tasks_per_conn; + u16 num_ccells_per_conn; +#endif +#if defined(__BIG_ENDIAN) + u16 sq_wqes_per_page; + u16 sq_num_wqes; +#elif defined(__LITTLE_ENDIAN) + u16 sq_num_wqes; + u16 sq_wqes_per_page; +#endif +#if defined(__BIG_ENDIAN) + u8 cq_log_wqes_per_page; + u8 flags; +#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) +#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 +#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) +#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 +#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) +#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 +#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) +#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 + u16 cq_num_wqes; +#elif defined(__LITTLE_ENDIAN) + u16 cq_num_wqes; + u8 flags; +#define ISCSI_KWQE_INIT1_PAGE_SIZE (0xF<<0) +#define ISCSI_KWQE_INIT1_PAGE_SIZE_SHIFT 0 +#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE (0x1<<4) +#define ISCSI_KWQE_INIT1_DELAYED_ACK_ENABLE_SHIFT 4 +#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE (0x1<<5) +#define ISCSI_KWQE_INIT1_KEEP_ALIVE_ENABLE_SHIFT 5 +#define ISCSI_KWQE_INIT1_RESERVED1 (0x3<<6) +#define ISCSI_KWQE_INIT1_RESERVED1_SHIFT 6 + u8 cq_log_wqes_per_page; +#endif +#if defined(__BIG_ENDIAN) + u16 cq_num_pages; + u16 sq_num_pages; +#elif defined(__LITTLE_ENDIAN) + u16 sq_num_pages; + u16 cq_num_pages; +#endif +#if defined(__BIG_ENDIAN) + u16 rq_buffer_size; + u16 rq_num_wqes; +#elif defined(__LITTLE_ENDIAN) + u16 rq_num_wqes; + u16 rq_buffer_size; +#endif +}; + +/* + * iSCSI firmware init request 2 + */ +struct iscsi_kwqe_init2 { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 max_cq_sqn; +#elif defined(__LITTLE_ENDIAN) + u16 max_cq_sqn; + struct iscsi_kwqe_header hdr; +#endif + u32 error_bit_map[2]; + u32 tcp_keepalive; + u32 reserved1[4]; +}; + +/* + * Initial iSCSI connection offload request 1 + */ +struct iscsi_kwqe_conn_offload1 { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 iscsi_conn_id; +#elif defined(__LITTLE_ENDIAN) + u16 iscsi_conn_id; + struct iscsi_kwqe_header hdr; +#endif + u32 sq_page_table_addr_lo; + u32 sq_page_table_addr_hi; + u32 cq_page_table_addr_lo; + u32 cq_page_table_addr_hi; + u32 reserved0[3]; +}; + +/* + * iSCSI Page Table Entry (PTE) + */ +struct iscsi_pte { + u32 hi; + u32 lo; +}; + +/* + * Initial iSCSI connection offload request 2 + */ +struct iscsi_kwqe_conn_offload2 { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 reserved0; +#elif defined(__LITTLE_ENDIAN) + u16 reserved0; + struct iscsi_kwqe_header hdr; +#endif + u32 rq_page_table_addr_lo; + u32 rq_page_table_addr_hi; + struct iscsi_pte sq_first_pte; + struct iscsi_pte cq_first_pte; + u32 num_additional_wqes; +}; + +/* + * Everest specific - Initial iSCSI connection offload request 3 + */ +struct iscsi_kwqe_conn_offload3 { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 reserved0; +#elif defined(__LITTLE_ENDIAN) + u16 reserved0; + struct iscsi_kwqe_header hdr; +#endif + u32 reserved1; + struct iscsi_pte qp_first_pte[3]; +}; + +/* + * iSCSI connection update request + */ +struct iscsi_kwqe_conn_update { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 reserved0; +#elif defined(__LITTLE_ENDIAN) + u16 reserved0; + struct iscsi_kwqe_header hdr; +#endif +#if defined(__BIG_ENDIAN) + u8 session_error_recovery_level; + u8 max_outstanding_r2ts; + u8 reserved2; + u8 conn_flags; +#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) +#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 +#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) +#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 +#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) +#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 +#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) +#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 +#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) +#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 +#elif defined(__LITTLE_ENDIAN) + u8 conn_flags; +#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST (0x1<<0) +#define ISCSI_KWQE_CONN_UPDATE_HEADER_DIGEST_SHIFT 0 +#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST (0x1<<1) +#define ISCSI_KWQE_CONN_UPDATE_DATA_DIGEST_SHIFT 1 +#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T (0x1<<2) +#define ISCSI_KWQE_CONN_UPDATE_INITIAL_R2T_SHIFT 2 +#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA (0x1<<3) +#define ISCSI_KWQE_CONN_UPDATE_IMMEDIATE_DATA_SHIFT 3 +#define ISCSI_KWQE_CONN_UPDATE_RESERVED1 (0xF<<4) +#define ISCSI_KWQE_CONN_UPDATE_RESERVED1_SHIFT 4 + u8 reserved2; + u8 max_outstanding_r2ts; + u8 session_error_recovery_level; +#endif + u32 context_id; + u32 max_send_pdu_length; + u32 max_recv_pdu_length; + u32 first_burst_length; + u32 max_burst_length; + u32 exp_stat_sn; +}; + +/* + * iSCSI destroy connection request + */ +struct iscsi_kwqe_conn_destroy { +#if defined(__BIG_ENDIAN) + struct iscsi_kwqe_header hdr; + u16 iscsi_conn_id; +#elif defined(__LITTLE_ENDIAN) + u16 iscsi_conn_id; + struct iscsi_kwqe_header hdr; +#endif + u32 context_id; + u32 reserved1[6]; +}; + +/* + * iSCSI KWQ WQE + */ +union iscsi_kwqe { + struct iscsi_kwqe_init1 init1; + struct iscsi_kwqe_init2 init2; + struct iscsi_kwqe_conn_offload1 conn_offload1; + struct iscsi_kwqe_conn_offload2 conn_offload2; + struct iscsi_kwqe_conn_offload3 conn_offload3; + struct iscsi_kwqe_conn_update conn_update; + struct iscsi_kwqe_conn_destroy conn_destroy; +}; + + + + + + + + + + + +struct iscsi_rq_db { +#if defined(__BIG_ENDIAN) + u16 reserved0; + u16 rq_prod; +#elif defined(__LITTLE_ENDIAN) + u16 rq_prod; + u16 reserved0; +#endif + u32 reserved1[3]; +}; + + +struct iscsi_sq_db { +#if defined(__BIG_ENDIAN) + u16 reserved0; + u16 sq_prod; +#elif defined(__LITTLE_ENDIAN) + u16 sq_prod; + u16 reserved0; +#endif + u32 reserved1[3]; +}; + + + +/* + * SCSI read/write SQ WQE + */ +struct iscsi_cmd_pdu_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES (0x7<<0) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES_SHIFT 0 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x3<<3) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 3 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG (0x1<<5) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG_SHIFT 5 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG (0x1<<6) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG_SHIFT 6 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES (0x7<<0) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_ATTRIBUTES_SHIFT 0 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x3<<3) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 3 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG (0x1<<5) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_WRITE_FLAG_SHIFT 5 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG (0x1<<6) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_READ_FLAG_SHIFT 6 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_CMD_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + struct regpair lun; + u32 itt; + u32 expected_data_transfer_length; + u32 cmd_sn; + u32 exp_stat_sn; + u32 scsi_command_block[4]; +}; + + +/* + * Buffer per connection, used in Tstorm + */ +struct iscsi_conn_buf { + struct regpair reserved[8]; +}; + + +/* + * PDU header of an iSCSI DATA-OUT + */ +struct iscsi_data_pdu_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG (0x1<<7) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_FINAL_FLAG_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_DATA_PDU_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + struct regpair lun; + u32 itt; + u32 ttt; + u32 rsrv2; + u32 exp_stat_sn; + u32 rsrv3; + u32 data_sn; + u32 buffer_offset; + u32 rsrv4; +}; + + +/* + * PDU header of an iSCSI login request + */ +struct iscsi_login_req_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG (0x3<<0) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG_SHIFT 0 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG (0x3<<2) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG_SHIFT 2 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0 (0x3<<4) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0_SHIFT 4 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT (0x1<<7) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT_SHIFT 7 + u8 version_max; + u8 version_min; +#elif defined(__LITTLE_ENDIAN) + u8 version_min; + u8 version_max; + u8 op_attr; +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG (0x3<<0) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_NSG_SHIFT 0 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG (0x3<<2) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CSG_SHIFT 2 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0 (0x3<<4) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_RSRV0_SHIFT 4 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT (0x1<<7) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TRANSIT_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_LOGIN_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + u32 isid_lo; +#if defined(__BIG_ENDIAN) + u16 isid_hi; + u16 tsih; +#elif defined(__LITTLE_ENDIAN) + u16 tsih; + u16 isid_hi; +#endif + u32 itt; +#if defined(__BIG_ENDIAN) + u16 cid; + u16 rsrv1; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv1; + u16 cid; +#endif + u32 cmd_sn; + u32 exp_stat_sn; + u32 rsrv2[4]; +}; + +/* + * PDU header of an iSCSI logout request + */ +struct iscsi_logout_req_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE (0x7F<<0) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE_SHIFT 0 +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE (0x7F<<0) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_REASON_CODE_SHIFT 0 +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_LOGOUT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + u32 rsrv2[2]; + u32 itt; +#if defined(__BIG_ENDIAN) + u16 cid; + u16 rsrv1; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv1; + u16 cid; +#endif + u32 cmd_sn; + u32 exp_stat_sn; + u32 rsrv3[4]; +}; + +/* + * PDU header of an iSCSI TMF request + */ +struct iscsi_tmf_req_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION (0x7F<<0) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION_SHIFT 0 +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION (0x7F<<0) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_FUNCTION_SHIFT 0 +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1 (0x1<<7) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_RSRV1_1_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_TMF_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + struct regpair lun; + u32 itt; + u32 referenced_task_tag; + u32 cmd_sn; + u32 exp_stat_sn; + u32 ref_cmd_sn; + u32 exp_data_sn; + u32 rsrv2[2]; +}; + +/* + * PDU header of an iSCSI Text request + */ +struct iscsi_text_req_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1 (0x3F<<0) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL (0x1<<7) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1 (0x3F<<0) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG (0x1<<6) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_CONTINUE_FLG_SHIFT 6 +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL (0x1<<7) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_FINAL_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_TEXT_REQ_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + struct regpair lun; + u32 itt; + u32 ttt; + u32 cmd_sn; + u32 exp_stat_sn; + u32 rsrv3[4]; +}; + +/* + * PDU header of an iSCSI Nop-Out + */ +struct iscsi_nop_out_hdr_little_endian { +#if defined(__BIG_ENDIAN) + u8 opcode; + u8 op_attr; +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1 (0x1<<7) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1_SHIFT 7 + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u8 op_attr; +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1 (0x7F<<0) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV1_SHIFT 0 +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1 (0x1<<7) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_RSRV2_1_SHIFT 7 + u8 opcode; +#endif + u32 data_fields; +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH (0xFFFFFF<<0) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_DATA_SEGMENT_LENGTH_SHIFT 0 +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH (0xFF<<24) +#define ISCSI_NOP_OUT_HDR_LITTLE_ENDIAN_TOTAL_AHS_LENGTH_SHIFT 24 + struct regpair lun; + u32 itt; + u32 ttt; + u32 cmd_sn; + u32 exp_stat_sn; + u32 rsrv3[4]; +}; + +/* + * iscsi pdu headers in little endian form. + */ +union iscsi_pdu_headers_little_endian { + u32 fullHeaderSize[12]; + struct iscsi_cmd_pdu_hdr_little_endian command_pdu_hdr; + struct iscsi_data_pdu_hdr_little_endian data_out_pdu_hdr; + struct iscsi_login_req_hdr_little_endian login_req_pdu_hdr; + struct iscsi_logout_req_hdr_little_endian logout_req_pdu_hdr; + struct iscsi_tmf_req_hdr_little_endian tmf_req_pdu_hdr; + struct iscsi_text_req_hdr_little_endian text_req_pdu_hdr; + struct iscsi_nop_out_hdr_little_endian nop_out_pdu_hdr; +}; + +struct iscsi_hq_bd { + union iscsi_pdu_headers_little_endian pdu_header; +#if defined(__BIG_ENDIAN) + u16 reserved1; + u16 lcl_cmp_flg; +#elif defined(__LITTLE_ENDIAN) + u16 lcl_cmp_flg; + u16 reserved1; +#endif + u32 sgl_base_lo; + u32 sgl_base_hi; +#if defined(__BIG_ENDIAN) + u8 sgl_size; + u8 sge_index; + u16 sge_offset; +#elif defined(__LITTLE_ENDIAN) + u16 sge_offset; + u8 sge_index; + u8 sgl_size; +#endif +}; + + + + + + +struct iscsi_task_context_entry_xuc_c_write_only { + u32 total_data_acked; +}; + +struct iscsi_task_context_r2t_table_entry { + u32 ttt; + u32 desired_data_len; +}; + +struct iscsi_task_context_entry_xuc_u_write_only { + u32 exp_r2t_sn; + struct iscsi_task_context_r2t_table_entry r2t_table[4]; +#if defined(__BIG_ENDIAN) + u16 data_in_count; + u8 cq_id; + u8 valid_1b; +#elif defined(__LITTLE_ENDIAN) + u8 valid_1b; + u8 cq_id; + u16 data_in_count; +#endif +}; + +struct iscsi_task_context_entry_xuc { + struct iscsi_task_context_entry_xuc_c_write_only write_c; + u32 exp_data_transfer_len; + struct iscsi_task_context_entry_xuc_x_write_only write_x; + u32 lun_lo; + struct iscsi_task_context_entry_xuc_xu_write_both write_xu; + u32 lun_hi; + struct iscsi_task_context_entry_xuc_u_write_only write_u; +}; + +struct iscsi_task_context_entry_u { + u32 exp_r2t_buff_offset; + u32 rem_rcv_len; + u32 exp_data_sn; +}; + +struct iscsi_task_context_entry { + struct iscsi_task_context_entry_x tce_x; +#if defined(__BIG_ENDIAN) + u16 data_out_count; + u16 rsrv0; +#elif defined(__LITTLE_ENDIAN) + u16 rsrv0; + u16 data_out_count; +#endif + struct iscsi_task_context_entry_xuc tce_xuc; + struct iscsi_task_context_entry_u tce_u; + u32 rsrv1[7]; +}; + + + + + + + + +struct iscsi_task_context_entry_xuc_x_init_only { + struct regpair lun; + u32 exp_data_transfer_len; +}; + + + + + + + + + + + + + + + + + +/* + * ipv6 structure + */ +struct ip_v6_addr { + u32 ip_addr_lo_lo; + u32 ip_addr_lo_hi; + u32 ip_addr_hi_lo; + u32 ip_addr_hi_hi; +}; + + + +/* + * l5cm- connection identification params + */ +struct l5cm_conn_addr_params { + u32 pmtu; +#if defined(__BIG_ENDIAN) + u8 remote_addr_3; + u8 remote_addr_2; + u8 remote_addr_1; + u8 remote_addr_0; +#elif defined(__LITTLE_ENDIAN) + u8 remote_addr_0; + u8 remote_addr_1; + u8 remote_addr_2; + u8 remote_addr_3; +#endif +#if defined(__BIG_ENDIAN) + u16 params; +#define L5CM_CONN_ADDR_PARAMS_IP_VERSION (0x1<<0) +#define L5CM_CONN_ADDR_PARAMS_IP_VERSION_SHIFT 0 +#define L5CM_CONN_ADDR_PARAMS_RSRV (0x7FFF<<1) +#define L5CM_CONN_ADDR_PARAMS_RSRV_SHIFT 1 + u8 remote_addr_5; + u8 remote_addr_4; +#elif defined(__LITTLE_ENDIAN) + u8 remote_addr_4; + u8 remote_addr_5; + u16 params; +#define L5CM_CONN_ADDR_PARAMS_IP_VERSION (0x1<<0) +#define L5CM_CONN_ADDR_PARAMS_IP_VERSION_SHIFT 0 +#define L5CM_CONN_ADDR_PARAMS_RSRV (0x7FFF<<1) +#define L5CM_CONN_ADDR_PARAMS_RSRV_SHIFT 1 +#endif + struct ip_v6_addr local_ip_addr; + struct ip_v6_addr remote_ip_addr; + u32 ipv6_flow_label_20b; + u32 reserved1; +#if defined(__BIG_ENDIAN) + u16 remote_tcp_port; + u16 local_tcp_port; +#elif defined(__LITTLE_ENDIAN) + u16 local_tcp_port; + u16 remote_tcp_port; +#endif +}; + +/* + * l5cm-xstorm connection buffer + */ +struct l5cm_xstorm_conn_buffer { +#if defined(__BIG_ENDIAN) + u16 rsrv1; + u16 params; +#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE (0x1<<0) +#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE_SHIFT 0 +#define L5CM_XSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) +#define L5CM_XSTORM_CONN_BUFFER_RSRV_SHIFT 1 +#elif defined(__LITTLE_ENDIAN) + u16 params; +#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE (0x1<<0) +#define L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE_SHIFT 0 +#define L5CM_XSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) +#define L5CM_XSTORM_CONN_BUFFER_RSRV_SHIFT 1 + u16 rsrv1; +#endif +#if defined(__BIG_ENDIAN) + u16 mss; + u16 pseudo_header_checksum; +#elif defined(__LITTLE_ENDIAN) + u16 pseudo_header_checksum; + u16 mss; +#endif + u32 rcv_buf; + u32 rsrv2; + struct regpair context_addr; +}; + +/* + * l5cm-tstorm connection buffer + */ +struct l5cm_tstorm_conn_buffer { + u32 snd_buf; + u32 rcv_buf; +#if defined(__BIG_ENDIAN) + u16 params; +#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE (0x1<<0) +#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE_SHIFT 0 +#define L5CM_TSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) +#define L5CM_TSTORM_CONN_BUFFER_RSRV_SHIFT 1 + u8 ka_max_probe_count; + u8 ka_enable; +#elif defined(__LITTLE_ENDIAN) + u8 ka_enable; + u8 ka_max_probe_count; + u16 params; +#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE (0x1<<0) +#define L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE_SHIFT 0 +#define L5CM_TSTORM_CONN_BUFFER_RSRV (0x7FFF<<1) +#define L5CM_TSTORM_CONN_BUFFER_RSRV_SHIFT 1 +#endif + u32 ka_timeout; + u32 ka_interval; + u32 max_rt_time; +}; + +/* + * l5cm connection buffer for active side + */ +struct l5cm_active_conn_buffer { + struct l5cm_conn_addr_params conn_addr_buf; + struct l5cm_xstorm_conn_buffer xstorm_conn_buffer; + struct l5cm_tstorm_conn_buffer tstorm_conn_buffer; +}; + + + +/* + * The l5cm opaque buffer passed in add new connection ramrod passive side + */ +struct l5cm_hash_input_string { + u32 seed; +#if defined(__BIG_ENDIAN) + u16 remote_tcp_port; + u16 local_tcp_port; +#elif defined(__LITTLE_ENDIAN) + u16 local_tcp_port; + u16 remote_tcp_port; +#endif + struct ip_v6_addr local_ip_addr; + struct ip_v6_addr remote_ip_addr; + u32 remote_isn; + u32 zero_padded[5]; +}; + + +/* + * syn cookie component + */ +struct l5cm_syn_cookie_comp { + u32 syn_cookie_chip_comp; +#define L5CM_SYN_COOKIE_COMP_SEED_INDEX (0x7<<0) +#define L5CM_SYN_COOKIE_COMP_SEED_INDEX_SHIFT 0 +#define L5CM_SYN_COOKIE_COMP_RX_MSS_INDEX (0x7<<3) +#define L5CM_SYN_COOKIE_COMP_RX_MSS_INDEX_SHIFT 3 +#define L5CM_SYN_COOKIE_COMP_RX_WND_SCL_EN (0x1<<6) +#define L5CM_SYN_COOKIE_COMP_RX_WND_SCL_EN_SHIFT 6 +#define L5CM_SYN_COOKIE_COMP_RX_TS_EN (0x1<<7) +#define L5CM_SYN_COOKIE_COMP_RX_TS_EN_SHIFT 7 +#define L5CM_SYN_COOKIE_COMP_RX_WND_SCALE (0xF<<8) +#define L5CM_SYN_COOKIE_COMP_RX_WND_SCALE_SHIFT 8 +#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE (0xF<<12) +#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE_SHIFT 12 +#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE1 (0xFFFF<<16) +#define L5CM_SYN_COOKIE_COMP_DO_NOT_USE1_SHIFT 16 +}; + +/* + * data related to listeners of a TCP port + */ +struct l5cm_port_listener_data { + u8 params; +#define L5CM_PORT_LISTENER_DATA_ENABLE (0x1<<0) +#define L5CM_PORT_LISTENER_DATA_ENABLE_SHIFT 0 +#define L5CM_PORT_LISTENER_DATA_IP_INDEX (0xF<<1) +#define L5CM_PORT_LISTENER_DATA_IP_INDEX_SHIFT 1 +#define L5CM_PORT_LISTENER_DATA_NET_FILTER (0x1<<5) +#define L5CM_PORT_LISTENER_DATA_NET_FILTER_SHIFT 5 +#define L5CM_PORT_LISTENER_DATA_DEFFERED_MODE (0x1<<6) +#define L5CM_PORT_LISTENER_DATA_DEFFERED_MODE_SHIFT 6 +#define L5CM_PORT_LISTENER_DATA_MPA_MODE (0x1<<7) +#define L5CM_PORT_LISTENER_DATA_MPA_MODE_SHIFT 7 +}; + +/* + * Opaque structure passed from U to X when final ack arrives + */ +struct l5cm_opaque_buf { + u32 rcv_nxt; + u32 snd_nxt; + u32 ts_to_echo; + u32 snd_wnd; + struct l5cm_syn_cookie_comp syn_cookie; +#if defined(__BIG_ENDIAN) + u16 rsrv2; + u8 rsrv; + struct l5cm_port_listener_data listener_data; +#elif defined(__LITTLE_ENDIAN) + struct l5cm_port_listener_data listener_data; + u8 rsrv; + u16 rsrv2; +#endif +}; + + +/* + * l5cm slow path element + */ +struct l5cm_packet_size { + u32 size; + u32 rsrv; +}; + + +/* + * The final-ack union structure in PCS entry after final ack arrived + */ +struct l5cm_pcse_ack { + struct l5cm_xstorm_conn_buffer tx_socket_params; + struct l5cm_opaque_buf opaque_buf; + struct l5cm_tstorm_conn_buffer rx_socket_params; +}; + + +/* + * The syn union structure in PCS entry after syn arrived + */ +struct l5cm_pcse_syn { + struct l5cm_opaque_buf opaque_buf; + u32 rsrv[12]; +}; + + +/* + * pcs entry data for passive connections + */ +struct l5cm_pcs_attributes { +#if defined(__BIG_ENDIAN) + u16 pcs_id; + u8 status; + u8 flags; +#define L5CM_PCS_ATTRIBUTES_NET_FILTER (0x1<<0) +#define L5CM_PCS_ATTRIBUTES_NET_FILTER_SHIFT 0 +#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH (0x1<<1) +#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH_SHIFT 1 +#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT (0x1<<2) +#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT_SHIFT 2 +#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT (0x1<<3) +#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT_SHIFT 3 +#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC (0x1<<4) +#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC_SHIFT 4 +#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD (0x1<<5) +#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD_SHIFT 5 +#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET (0x1<<6) +#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET_SHIFT 6 +#define L5CM_PCS_ATTRIBUTES_RSRV (0x1<<7) +#define L5CM_PCS_ATTRIBUTES_RSRV_SHIFT 7 +#elif defined(__LITTLE_ENDIAN) + u8 flags; +#define L5CM_PCS_ATTRIBUTES_NET_FILTER (0x1<<0) +#define L5CM_PCS_ATTRIBUTES_NET_FILTER_SHIFT 0 +#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH (0x1<<1) +#define L5CM_PCS_ATTRIBUTES_CALCULATE_HASH_SHIFT 1 +#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT (0x1<<2) +#define L5CM_PCS_ATTRIBUTES_COMPARE_HASH_RESULT_SHIFT 2 +#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT (0x1<<3) +#define L5CM_PCS_ATTRIBUTES_QUERY_ULP_ACCEPT_SHIFT 3 +#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC (0x1<<4) +#define L5CM_PCS_ATTRIBUTES_FIND_DEST_MAC_SHIFT 4 +#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD (0x1<<5) +#define L5CM_PCS_ATTRIBUTES_L4_OFFLOAD_SHIFT 5 +#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET (0x1<<6) +#define L5CM_PCS_ATTRIBUTES_FORWARD_PACKET_SHIFT 6 +#define L5CM_PCS_ATTRIBUTES_RSRV (0x1<<7) +#define L5CM_PCS_ATTRIBUTES_RSRV_SHIFT 7 + u8 status; + u16 pcs_id; +#endif +}; + + +union l5cm_seg_params { + struct l5cm_pcse_syn syn_seg_params; + struct l5cm_pcse_ack ack_seg_params; +}; + +/* + * pcs entry data for passive connections + */ +struct l5cm_pcs_hdr { + struct l5cm_hash_input_string hash_input_string; + struct l5cm_conn_addr_params conn_addr_buf; + u32 cid; + u32 hash_result; + union l5cm_seg_params seg_params; + struct l5cm_pcs_attributes att; +#if defined(__BIG_ENDIAN) + u16 rsrv; + u16 rx_seg_size; +#elif defined(__LITTLE_ENDIAN) + u16 rx_seg_size; + u16 rsrv; +#endif +}; + +/* + * pcs entry for passive connections + */ +struct l5cm_pcs_entry { + struct l5cm_pcs_hdr hdr; + u8 rx_segment[1516]; +}; + + + + +/* + * l5cm connection parameters + */ +union l5cm_reduce_param_union { + u32 passive_side_scramble_key; + u32 pcs_id; +}; + +/* + * l5cm connection parameters + */ +struct l5cm_reduce_conn { + union l5cm_reduce_param_union param; + u32 isn; +}; + +/* + * l5cm slow path element + */ +union l5cm_specific_data { + u8 protocol_data[8]; + struct regpair phy_address; + struct l5cm_packet_size packet_size; + struct l5cm_reduce_conn reduced_conn; +}; + +/* + * l5 slow path element + */ +struct l5cm_spe { + struct spe_hdr hdr; + union l5cm_specific_data data; +}; + + + + +/* + * Termination variables + */ +struct l5cm_term_vars { + u8 BitMap; +#define L5CM_TERM_VARS_TCP_STATE (0xF<<0) +#define L5CM_TERM_VARS_TCP_STATE_SHIFT 0 +#define L5CM_TERM_VARS_FIN_RECEIVED_SBIT (0x1<<4) +#define L5CM_TERM_VARS_FIN_RECEIVED_SBIT_SHIFT 4 +#define L5CM_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT (0x1<<5) +#define L5CM_TERM_VARS_ACK_ON_FIN_RECEIVED_SBIT_SHIFT 5 +#define L5CM_TERM_VARS_TERM_ON_CHIP (0x1<<6) +#define L5CM_TERM_VARS_TERM_ON_CHIP_SHIFT 6 +#define L5CM_TERM_VARS_RSRV (0x1<<7) +#define L5CM_TERM_VARS_RSRV_SHIFT 7 +}; + + + + +/* + * Tstorm Tcp flags + */ +struct tstorm_l5cm_tcp_flags { + u16 flags; +#define TSTORM_L5CM_TCP_FLAGS_VLAN_ID (0xFFF<<0) +#define TSTORM_L5CM_TCP_FLAGS_VLAN_ID_SHIFT 0 +#define TSTORM_L5CM_TCP_FLAGS_RSRV0 (0x1<<12) +#define TSTORM_L5CM_TCP_FLAGS_RSRV0_SHIFT 12 +#define TSTORM_L5CM_TCP_FLAGS_TS_ENABLED (0x1<<13) +#define TSTORM_L5CM_TCP_FLAGS_TS_ENABLED_SHIFT 13 +#define TSTORM_L5CM_TCP_FLAGS_RSRV1 (0x3<<14) +#define TSTORM_L5CM_TCP_FLAGS_RSRV1_SHIFT 14 +}; + + +/* + * Xstorm Tcp flags + */ +struct xstorm_l5cm_tcp_flags { + u8 flags; +#define XSTORM_L5CM_TCP_FLAGS_ENC_ENABLED (0x1<<0) +#define XSTORM_L5CM_TCP_FLAGS_ENC_ENABLED_SHIFT 0 +#define XSTORM_L5CM_TCP_FLAGS_TS_ENABLED (0x1<<1) +#define XSTORM_L5CM_TCP_FLAGS_TS_ENABLED_SHIFT 1 +#define XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN (0x1<<2) +#define XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN_SHIFT 2 +#define XSTORM_L5CM_TCP_FLAGS_RSRV (0x1F<<3) +#define XSTORM_L5CM_TCP_FLAGS_RSRV_SHIFT 3 +}; + + + + + + + + + + + + + + + + +#endif /* __5710_HSI_CNIC_LE__ */ diff --git a/vmkdrivers/src_current/drivers/net/bnx2/57xx_iscsi_constants.h b/vmkdrivers/src_current/drivers/net/bnx2/57xx_iscsi_constants.h new file mode 100644 index 0000000..09b00a6 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/57xx_iscsi_constants.h @@ -0,0 +1,214 @@ +#ifndef __57XX_ISCSI_CONSTANTS_H_ +#define __57XX_ISCSI_CONSTANTS_H_ + +/** +* This file defines HSI constants for the iSCSI flows +*/ + +/* iSCSI request op codes */ +#define ISCSI_OPCODE_NOP_OUT (0 | 0x40) +#define ISCSI_OPCODE_SCSI_CMD (1) +#define ISCSI_OPCODE_TMF_REQUEST (2 | 0x40) +#define ISCSI_OPCODE_LOGIN_REQUEST (3 | 0x40) +#define ISCSI_OPCODE_TEXT_REQUEST (4 | 0x40) +#define ISCSI_OPCODE_DATA_OUT (5) +#define ISCSI_OPCODE_LOGOUT_REQUEST (6 | 0x00) +#define ISCSI_OPCODE_CLEANUP_REQUEST (7) + +/* iSCSI response/messages op codes */ +#define ISCSI_OPCODE_NOP_IN (0x20) +#define ISCSI_OPCODE_SCSI_RESPONSE (0x21) +#define ISCSI_OPCODE_TMF_RESPONSE (0x22) +#define ISCSI_OPCODE_LOGIN_RESPONSE (0x23) +#define ISCSI_OPCODE_TEXT_RESPONSE (0x24) +#define ISCSI_OPCODE_DATA_IN (0x25) +#define ISCSI_OPCODE_LOGOUT_RESPONSE (0x26) +#define ISCSI_OPCODE_CLEANUP_RESPONSE (0x27) +#define ISCSI_OPCODE_R2T (0x31) +#define ISCSI_OPCODE_ASYNC_MSG (0x32) +#define ISCSI_OPCODE_REJECT (0x3f) +#define ISCSI_OPCODE_NOPOUT_LOCAL_COMPLETION (0) + +/* iSCSI stages */ +#define ISCSI_STAGE_SECURITY_NEGOTIATION (0) +#define ISCSI_STAGE_LOGIN_OPERATIONAL_NEGOTIATION (1) +#define ISCSI_STAGE_FULL_FEATURE_PHASE (3) + +/* iSCSI parameter defaults */ +#define ISCSI_DEFAULT_HEADER_DIGEST (0) +#define ISCSI_DEFAULT_DATA_DIGEST (0) +#define ISCSI_DEFAULT_INITIAL_R2T (1) +#define ISCSI_DEFAULT_IMMEDIATE_DATA (1) +#define ISCSI_DEFAULT_MAX_PDU_LENGTH (0x2000) +#define ISCSI_DEFAULT_FIRST_BURST_LENGTH (0x10000) +#define ISCSI_DEFAULT_MAX_BURST_LENGTH (0x40000) +#define ISCSI_DEFAULT_MAX_OUTSTANDING_R2T (1) + +/* iSCSI parameter limits */ +#define ISCSI_MIN_VAL_MAX_PDU_LENGTH (0x200) +#define ISCSI_MAX_VAL_MAX_PDU_LENGTH (0xffffff) +#define ISCSI_MIN_VAL_BURST_LENGTH (0x200) +#define ISCSI_MAX_VAL_BURST_LENGTH (0xffffff) +#define ISCSI_MIN_VAL_MAX_OUTSTANDING_R2T (1) +#define ISCSI_MAX_VAL_MAX_OUTSTANDING_R2T (0xff) /* 0x10000 according to RFC */ + +/* SCSI command response codes */ +#define ISCSI_SCSI_CMD_RESPONSE_CMD_COMPLETED (0x00) +#define ISCSI_SCSI_CMD_RESPONSE_TARGET_FAILURE (0x01) + +/* SCSI command status codes */ +#define ISCSI_SCSI_CMD_STATUS_GOOD (0x00) +#define ISCSI_SCSI_CMD_STATUS_CHECK_CONDITION (0x02) +#define ISCSI_SCSI_CMD_STATUS_INTERMIDIATE (0x10) + +/* TMF codes */ +#define ISCSI_TMF_ABORT_TASK (1) +#define ISCSI_TMF_LOGICAL_UNIT_RESET (5) + +/* TMF response codes */ +#define ISCSI_TMF_RESPONSE_FUNCTION_COMPLETE (0x00) +#define ISCSI_TMF_RESPONSE_TASK_DOESNT_EXIST (0x01) +#define ISCSI_TMF_RESPONSE_LUN_DOESNT_EXIST (0x02) +#define ISCSI_TMF_RESPONSE_TASK_STILL_ALLEGIANT (0x03) +#define ISCSI_TMF_RESPONSE_FUNCTION_NOT_SUPPORTED (0x05) +#define ISCSI_TMF_RESPONSE_FUNCTION_AUTHORIZATION_FAILED (0x06) +#define ISCSI_TMF_RESPONSE_FUNCTION_REJECTED (0xff) + +/* Logout reason codes */ +/*#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION (1) */ + +/* Logout response codes */ +#define ISCSI_LOGOUT_RESPONSE_CONNECTION_CLOSED (0) +#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND (1) +#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED (3) + +/* iSCSI task types */ +#define ISCSI_TASK_TYPE_READ (0) +#define ISCSI_TASK_TYPE_WRITE (1) +#define ISCSI_TASK_TYPE_MPATH (2) + +/* initial CQ sequence numbers */ +#define ISCSI_INITIAL_SN (1) + +/* KWQ (kernel work queue) layer codes */ +#define ISCSI_KWQE_LAYER_CODE (6) + +/* KWQ (kernel work queue) request op codes */ +#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN1 (0) +#define ISCSI_KWQE_OPCODE_OFFLOAD_CONN2 (1) +#define ISCSI_KWQE_OPCODE_UPDATE_CONN (2) +#define ISCSI_KWQE_OPCODE_DESTROY_CONN (3) +#define ISCSI_KWQE_OPCODE_INIT1 (4) +#define ISCSI_KWQE_OPCODE_INIT2 (5) + +/* KCQ (kernel completion queue) response op codes */ +#define ISCSI_KCQE_OPCODE_OFFLOAD_CONN (0x10) +#define ISCSI_KCQE_OPCODE_UPDATE_CONN (0x12) +#define ISCSI_KCQE_OPCODE_DESTROY_CONN (0x13) +#define ISCSI_KCQE_OPCODE_INIT (0x14) +#define ISCSI_KCQE_OPCODE_CLEAN_TASK (0x15) +#define ISCSI_KCQE_OPCODE_TCP_RESET (0x16) +#define ISCSI_KCQE_OPCODE_TCP_SYN (0x17) +#define ISCSI_KCQE_OPCODE_TCP_FIN (0X18) +#define ISCSI_KCQE_OPCODE_TCP_ERROR (0x19) +#define ISCSI_KCQE_OPCODE_CQ_EVENT_NOTIFICATION (0x20) +#define ISCSI_KCQE_OPCODE_ISCSI_ERROR (0x21) + +/* KCQ (kernel completion queue) completion status */ +#define ISCSI_KCQE_COMPLETION_STATUS_SUCCESS (0) +#define ISCSI_KCQE_COMPLETION_STATUS_INVALID_OPCODE (1) +#define ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE (2) +#define ISCSI_KCQE_COMPLETION_STATUS_CTX_FREE_FAILURE (3) +#define ISCSI_KCQE_COMPLETION_STATUS_NIC_ERROR (4) + +#define ISCSI_KCQE_COMPLETION_STATUS_HDR_DIG_ERR (0x5) +#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR (0x6) +/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_DATA_IN (0x6) */ +/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_RESPONSE (0x7) */ +/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_REJECT (0x8) */ +/*#define ISCSI_KCQE_COMPLETION_STATUS_DATA_DIG_ERR_ASYNC (0x9) */ + +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_UNEXPECTED_OPCODE (0xa) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_OPCODE (0xb) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_AHS_LEN (0xc) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ITT (0xd) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_STATSN (0xe) + /* Response */ +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_EXP_DATASN (0xf) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T (0x10) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_IS_ZERO (0x2c) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG (0x2d) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_0 (0x11) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_1 (0x12) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_2 (0x13) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_3 (0x14) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_4 (0x15) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_5 (0x16) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_O_U_6 (0x17) + /* Data-In */ +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_RCV_LEN (0x18) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_RCV_PDU_LEN (0x19) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_F_BIT_ZERO (0x1a) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_NOT_RSRV (0x1b) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATASN (0x1c) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REMAIN_BURST_LEN (0x1d) + + /* R2T */ +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_BUFFER_OFF (0x1f) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_LUN (0x20) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_R2TSN (0x21) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0 (0x22) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1 (0x23) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_EXCEED (0x24) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_TTT_IS_RSRV (0x25) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_MAX_BURST_LEN (0x26) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_DATA_SEG_LEN_NOT_ZERO (0x27) + /* TMF */ +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_REJECT_PDU_LEN (0x28) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_ASYNC_PDU_LEN (0x29) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_NOPIN_PDU_LEN (0x2a) +#define ISCSI_KCQE_COMPLETION_STATUS_PROTOCOL_ERR_PEND_R2T_IN_CLEANUP (0x2b) + +/* IP/TCP processing errors: */ +#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_FRAGMENT (0x40) +#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_IP_OPTIONS (0x41) +#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_URGENT_FLAG (0x42) +#define ISCI_KCQE_COMPLETION_STATUS_TCP_ERROR_MAX_RTRANS (0x43) + +/* iSCSI licensing errors */ +/* general iSCSI license not installed */ +#define ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED (0x50) +/* additional LOM specific iSCSI license not installed */ +#define ISCSI_KCQE_COMPLETION_STATUS_LOM_ISCSI_NOT_ENABLED (0x51) + +#define ISCSI_KCQE_COMPLETION_STATUS_CID_BUSY (0x80) + +/* SQ/RQ/CQ DB structure sizes */ +#define ISCSI_SQ_DB_SIZE (16) +#define ISCSI_RQ_DB_SIZE (16) +#define ISCSI_CQ_DB_SIZE (80) + +/* Page size codes (for l5_wqe_flags in connection offload request) */ +#define ISCSI_PAGE_SIZE_256 (0) +#define ISCSI_PAGE_SIZE_512 (1) +#define ISCSI_PAGE_SIZE_1K (2) +#define ISCSI_PAGE_SIZE_2K (3) +#define ISCSI_PAGE_SIZE_4K (4) +#define ISCSI_PAGE_SIZE_8K (5) +#define ISCSI_PAGE_SIZE_16K (6) +#define ISCSI_PAGE_SIZE_32K (7) +#define ISCSI_PAGE_SIZE_64K (8) +#define ISCSI_PAGE_SIZE_128K (9) +#define ISCSI_PAGE_SIZE_256K (10) +#define ISCSI_PAGE_SIZE_512K (11) +#define ISCSI_PAGE_SIZE_1M (12) +#define ISCSI_PAGE_SIZE_2M (13) +#define ISCSI_PAGE_SIZE_4M (14) +#define ISCSI_PAGE_SIZE_8M (15) + +/* Iscsi PDU related defines */ +#define ISCSI_HEADER_SIZE (48) +#define ISCSI_DIGEST_SHIFT (2) +#define ISCSI_DIGEST_SIZE (4) + +#endif /*__57XX_ISCSI_CONSTANTS_H_ */ diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2.c b/vmkdrivers/src_current/drivers/net/bnx2/bnx2.c new file mode 100644 index 0000000..c0a774c --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2.c @@ -0,0 +1,11216 @@ +/* + * Portions Copyright (c) 2011 VMware, Inc. All rights reserved. + */ + +/* bnx2.c: Broadcom NX2 network driver. + * + * Copyright (c) 2004-2010 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * Written by: Michael Chan (mchan@broadcom.com) + */ + +#include + +#if (LINUX_VERSION_CODE < 0x020612) +#include +#endif + +#if (LINUX_VERSION_CODE < 0x020500) +#if defined(CONFIG_MODVERSIONS) && defined(MODULE) && ! defined(MODVERSIONS) +#define MODVERSIONS +#include +#endif +#endif + +#include +#if (LINUX_VERSION_CODE >= 0x020600) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if (LINUX_VERSION_CODE >= 0x020600) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +#define BCM_VLAN 1 +#endif + +#ifdef NETIF_F_TSO +#include +#include +#include +#define BCM_TSO 1 +#endif +#if (LINUX_VERSION_CODE >= 0x020600) +#include +#endif +#ifndef BNX2_BOOT_DISK +#include +#endif +#include +#include +#include +#if (LINUX_VERSION_CODE >= 0x20617) && !defined(NETIF_F_MULTI_QUEUE) +#include +#endif + +#include "cnic_drv.h" +#include "bnx2.h" +#include "bnx2_fw.h" +#include "bnx2_fw2.h" + +#define DRV_MODULE_NAME "bnx2" +#define PFX DRV_MODULE_NAME ": " +#define DRV_MODULE_VERSION "2.0.7d-6vmw" +#define DRV_MODULE_RELDATE "Feb 18, 2011" + +#define RUN_AT(x) (jiffies + (x)) + +/* Time in jiffies before concluding the transmitter is hung. */ +#if defined(__VMKLNX__) +/* On VMware ESX there is a possibility that that netdev watchdog thread + * runs before the reset task if the machine is loaded. If this occurs + * too many times, these premature watchdog triggers will cause a PSOD + * on a VMware ESX beta build */ +#define TX_TIMEOUT (20*HZ) +#else /* !defined(__VMKLNX__) */ +#define TX_TIMEOUT (5*HZ) +#endif /* defined(__VMKLNX__) */ + +static char version[] __devinitdata = + "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; + +MODULE_AUTHOR("Michael Chan "); +MODULE_DESCRIPTION("Broadcom NetXtreme II BCM5706/5708/5709/5716 Driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRV_MODULE_VERSION); + +static int disable_msi = 0; + +#if (LINUX_VERSION_CODE >= 0x20600) +module_param(disable_msi, int, 0); +MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); +#endif + +static int stop_on_tx_timeout = 0; + +module_param(stop_on_tx_timeout, int, 0); +MODULE_PARM_DESC(stop_on_tx_timeout, "For debugging purposes, prevent a chip " + " reset when a tx timeout occurs"); + +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) +//#define BNX2_ENABLE_NETQUEUE 1 +/* + * turning off netqueues in the in-box driver + */ +#undef BNX2_ENABLE_NETQUEUE +#endif /* defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) */ + +#ifdef BNX2_ENABLE_NETQUEUE +#define BNX2_MAX_NIC 32 +#define BNX2_OPTION_UNSET -1 +#define BNX2_OPTION_ZERO 0 + +#define BNX2_NETQUEUE_ENABLED(bp) ((force_netq_param[bp->index] > 1) || \ + (force_netq_param[bp->index] == \ + BNX2_OPTION_UNSET)) +#define BNX2_NETQUEUE_DISABLED(bp) (force_netq_param[bp->index] == 0) + +static int __devinitdata force_netq_param[BNX2_MAX_NIC+1] = + { [0 ... BNX2_MAX_NIC] = BNX2_OPTION_UNSET }; + +static unsigned int num_force_netq; +module_param_array_named(force_netq, force_netq_param, int, + &num_force_netq, 0); +MODULE_PARM_DESC(force_netq, "Option used for 5709/5716 only: " + "Enforce the number of NetQueues per port " + "(allowed values: -1 to 7 queues: " + "1-7 will force the number of NetQueues for the " + " given device, " + "0 to disable NetQueue, " + "-1 to use the default driver NetQueues value) " + "[Maximum supported NIC's = 32] " + "[example usage: force_net=-1,0,1,2: " + "This corresponds to the first 5709/5716 to use " + "the default number of NetQueues, " + "disable NetQueue on the second 5709/5716, " + "use 1 NetQueue on the third 5709/5716" + "use 2 NetQueues on the fourth 5709/5716]"); + +#endif /* BNX2_ENABLE_NETQUEUE */ + +typedef enum { + BCM5706 = 0, + NC370T, + NC370I, + BCM5706S, + NC370F, + BCM5708, + BCM5708S, + BCM5709, + BCM5709S, + BCM5716, + BCM5716S, +} board_t; + +/* indexed by board_t, above */ +static struct { + char *name; +} board_info[] __devinitdata = { + { "Broadcom NetXtreme II BCM5706 1000Base-T" }, + { "HP NC370T Multifunction Gigabit Server Adapter" }, + { "HP NC370i Multifunction Gigabit Server Adapter" }, + { "Broadcom NetXtreme II BCM5706 1000Base-SX" }, + { "HP NC370F Multifunction Gigabit Server Adapter" }, + { "Broadcom NetXtreme II BCM5708 1000Base-T" }, + { "Broadcom NetXtreme II BCM5708 1000Base-SX" }, + { "Broadcom NetXtreme II BCM5709 1000Base-T" }, + { "Broadcom NetXtreme II BCM5709 1000Base-SX" }, + { "Broadcom NetXtreme II BCM5716 1000Base-T" }, + { "Broadcom NetXtreme II BCM5716 1000Base-SX" }, + }; + +static DEFINE_PCI_DEVICE_TABLE(bnx2_pci_tbl) = { + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, + PCI_VENDOR_ID_HP, 0x3101, 0, 0, NC370T }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, + PCI_VENDOR_ID_HP, 0x3106, 0, 0, NC370I }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706 }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708 }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, + PCI_VENDOR_ID_HP, 0x3102, 0, 0, NC370F }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5706S, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5706S }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5708S, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5708S }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709 }, + { PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_NX2_5709S, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5709S }, + { PCI_VENDOR_ID_BROADCOM, 0x163b, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716 }, + { PCI_VENDOR_ID_BROADCOM, 0x163c, + PCI_ANY_ID, PCI_ANY_ID, 0, 0, BCM5716S }, + { 0, } +}; + +static const struct flash_spec flash_table[] = +{ +#define BUFFERED_FLAGS (BNX2_NV_BUFFERED | BNX2_NV_TRANSLATE) +#define NONBUFFERED_FLAGS (BNX2_NV_WREN) + /* Slow EEPROM */ + {0x00000000, 0x40830380, 0x009f0081, 0xa184a053, 0xaf000400, + BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE, + SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE, + "EEPROM - slow"}, + /* Expansion entry 0001 */ + {0x08000002, 0x4b808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 0001"}, + /* Saifun SA25F010 (non-buffered flash) */ + /* strap, cfg1, & write1 need updates */ + {0x04000001, 0x47808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*2, + "Non-buffered flash (128kB)"}, + /* Saifun SA25F020 (non-buffered flash) */ + /* strap, cfg1, & write1 need updates */ + {0x0c000003, 0x4f808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE*4, + "Non-buffered flash (256kB)"}, + /* Expansion entry 0100 */ + {0x11000000, 0x53808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 0100"}, + /* Entry 0101: ST M45PE10 (non-buffered flash, TetonII B0) */ + {0x19000002, 0x5b808201, 0x000500db, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE, + ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*2, + "Entry 0101: ST M45PE10 (128kB non-bufferred)"}, + /* Entry 0110: ST M45PE20 (non-buffered flash)*/ + {0x15000001, 0x57808201, 0x000500db, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, ST_MICRO_FLASH_PAGE_BITS, ST_MICRO_FLASH_PAGE_SIZE, + ST_MICRO_FLASH_BYTE_ADDR_MASK, ST_MICRO_FLASH_BASE_TOTAL_SIZE*4, + "Entry 0110: ST M45PE20 (256kB non-bufferred)"}, + /* Saifun SA25F005 (non-buffered flash) */ + /* strap, cfg1, & write1 need updates */ + {0x1d000003, 0x5f808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, SAIFUN_FLASH_BASE_TOTAL_SIZE, + "Non-buffered flash (64kB)"}, + /* Fast EEPROM */ + {0x22000000, 0x62808380, 0x009f0081, 0xa184a053, 0xaf000400, + BUFFERED_FLAGS, SEEPROM_PAGE_BITS, SEEPROM_PAGE_SIZE, + SEEPROM_BYTE_ADDR_MASK, SEEPROM_TOTAL_SIZE, + "EEPROM - fast"}, + /* Expansion entry 1001 */ + {0x2a000002, 0x6b808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 1001"}, + /* Expansion entry 1010 */ + {0x26000001, 0x67808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 1010"}, + /* ATMEL AT45DB011B (buffered flash) */ + {0x2e000003, 0x6e808273, 0x00570081, 0x68848353, 0xaf000400, + BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, + BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE, + "Buffered flash (128kB)"}, + /* Expansion entry 1100 */ + {0x33000000, 0x73808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 1100"}, + /* Expansion entry 1101 */ + {0x3b000002, 0x7b808201, 0x00050081, 0x03840253, 0xaf020406, + NONBUFFERED_FLAGS, SAIFUN_FLASH_PAGE_BITS, SAIFUN_FLASH_PAGE_SIZE, + SAIFUN_FLASH_BYTE_ADDR_MASK, 0, + "Entry 1101"}, + /* Ateml Expansion entry 1110 */ + {0x37000001, 0x76808273, 0x00570081, 0x68848353, 0xaf000400, + BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, + BUFFERED_FLASH_BYTE_ADDR_MASK, 0, + "Entry 1110 (Atmel)"}, + /* ATMEL AT45DB021B (buffered flash) */ + {0x3f000003, 0x7e808273, 0x00570081, 0x68848353, 0xaf000400, + BUFFERED_FLAGS, BUFFERED_FLASH_PAGE_BITS, BUFFERED_FLASH_PAGE_SIZE, + BUFFERED_FLASH_BYTE_ADDR_MASK, BUFFERED_FLASH_TOTAL_SIZE*2, + "Buffered flash (256kB)"}, +}; + +static const struct flash_spec flash_5709 = { + .flags = BNX2_NV_BUFFERED, + .page_bits = BCM5709_FLASH_PAGE_BITS, + .page_size = BCM5709_FLASH_PAGE_SIZE, + .addr_mask = BCM5709_FLASH_BYTE_ADDR_MASK, + .total_size = BUFFERED_FLASH_TOTAL_SIZE*2, + .name = "5709 Buffered flash (256kB)", +}; + +MODULE_DEVICE_TABLE(pci, bnx2_pci_tbl); + +static void bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size); + +#if defined(__VMKLNX__) +static int +bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget, + int check_queue); +#endif /* defined(__VMKLNX__) */ + +#if defined(__VMKLNX__) +static void bnx2_init_napi(struct bnx2 *bp); +#else +static void __devinit bnx2_init_napi(struct bnx2 *bp); +#endif + +#if BNX2_ENABLE_NETQUEUE +static int bnx2_netqueue_ops(vmknetddi_queueops_op_t op, void *args); +static void bnx2_stop_netqueue_hw(struct bnx2 *bp); +static void bnx2_start_netqueue_hw(struct bnx2 *bp); +static void bnx2_netqueue_service_bnx2_msix(struct bnx2_napi *bnapi); +static int bnx2_netqueue_is_avail(struct bnx2 *bp); +static void bnx2_close_netqueue_hw(struct bnx2 *bp); +static void bnx2_init_netqueue_hw(struct bnx2 *bp); +static int bnx2_open_netqueue_hw(struct bnx2 *bp); +static void bnx2_netqueue_flush_all(struct bnx2 *bp); +static int bnx2_netqueue_open_started(struct bnx2 *bp); + +static inline u16 bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi); +static inline u16 bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi); + +#ifdef BNX2_DEBUG +static u32 bnx2_read_ctx(struct bnx2 *bp, u32 offset); +#endif + +#define TRUE 1 +#define FALSE 0 + +#define for_each_nondefault_rx_queue(bp, var) \ + for (var = 1; var < bp->num_rx_rings; var++) +#define for_each_nondefault_tx_queue(bp, var) \ + for (var = 1; var < bp->num_tx_rings; var++) +#define is_multi(bp) (bp->num_rx_ring > 1) +#endif /* defined(BNX2_ENABLE_NETQUEUE) */ + +#ifdef BNX2_BOOT_DISK +u32 ether_crc_le(size_t len, unsigned char const *p) +{ + u32 crc = ~0; + int i; +#define CRCPOLY_LE 0xedb88320 + + while (len--) { + crc ^= *p++; + for (i = 0; i < 8; i++) + crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0); + } + return crc; +} +#endif + +static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) +{ + u32 diff; + + smp_mb(); + + /* The ring uses 256 indices for 255 entries, one of them + * needs to be skipped. + */ + diff = txr->tx_prod - txr->tx_cons; + if (unlikely(diff >= TX_DESC_CNT)) { + diff &= 0xffff; + if (diff == TX_DESC_CNT) + diff = MAX_TX_DESC_CNT; + } + return (bp->tx_ring_size - diff); +} + +static u32 +bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset) +{ + u32 val; + + spin_lock_bh(&bp->indirect_lock); + REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); + val = REG_RD(bp, BNX2_PCICFG_REG_WINDOW); + spin_unlock_bh(&bp->indirect_lock); + return val; +} + +static void +bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val) +{ + spin_lock_bh(&bp->indirect_lock); + REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); + REG_WR(bp, BNX2_PCICFG_REG_WINDOW, val); + spin_unlock_bh(&bp->indirect_lock); +} + +static void +bnx2_reg_wr_ind_cfg(struct bnx2 *bp, u32 offset, u32 val) +{ + struct pci_dev *pdev = bp->pdev; + + spin_lock_bh(&bp->indirect_lock); + pci_write_config_dword(pdev, BNX2_PCICFG_REG_WINDOW_ADDRESS, offset); + pci_write_config_dword(pdev, BNX2_PCICFG_REG_WINDOW, val); + spin_unlock_bh(&bp->indirect_lock); +} + +static void +bnx2_shmem_wr(struct bnx2 *bp, u32 offset, u32 val) +{ + bnx2_reg_wr_ind(bp, bp->shmem_base + offset, val); +} + +static u32 +bnx2_shmem_rd(struct bnx2 *bp, u32 offset) +{ + return (bnx2_reg_rd_ind(bp, bp->shmem_base + offset)); +} + +static void +bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val) +{ + offset += cid_addr; + spin_lock_bh(&bp->indirect_lock); + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + int i; + + REG_WR(bp, BNX2_CTX_CTX_DATA, val); + REG_WR(bp, BNX2_CTX_CTX_CTRL, + offset | BNX2_CTX_CTX_CTRL_WRITE_REQ); + for (i = 0; i < 5; i++) { + val = REG_RD(bp, BNX2_CTX_CTX_CTRL); + if ((val & BNX2_CTX_CTX_CTRL_WRITE_REQ) == 0) + break; + udelay(5); + } + } else { + REG_WR(bp, BNX2_CTX_DATA_ADR, offset); + REG_WR(bp, BNX2_CTX_DATA, val); + } + spin_unlock_bh(&bp->indirect_lock); +} + +#ifdef BCM_CNIC +static int +bnx2_drv_ctl(struct net_device *dev, struct drv_ctl_info *info) +{ + struct bnx2 *bp = netdev_priv(dev); + struct drv_ctl_io *io = &info->data.io; + + switch (info->cmd) { + case DRV_CTL_IO_WR_CMD: + bnx2_reg_wr_ind(bp, io->offset, io->data); + break; + case DRV_CTL_IO_RD_CMD: + io->data = bnx2_reg_rd_ind(bp, io->offset); + break; + case DRV_CTL_CTX_WR_CMD: + bnx2_ctx_wr(bp, io->cid_addr, io->offset, io->data); + break; + default: + return -EINVAL; + } + return 0; +} + +static void bnx2_setup_cnic_irq_info(struct bnx2 *bp) +{ + struct cnic_ops *c_ops; + struct cnic_eth_dev *cp = &bp->cnic_eth_dev; + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + int sb_id; + + rcu_read_lock(); + c_ops = rcu_dereference(bp->cnic_ops); + if (!c_ops) + goto done; + + if (bp->flags & BNX2_FLAG_USING_MSIX) { + cp->drv_state |= CNIC_DRV_STATE_USING_MSIX; + bnapi->cnic_present = 0; + sb_id = bp->irq_nvecs; + cp->irq_arr[0].irq_flags |= CNIC_IRQ_FL_MSIX; + } else { + cp->drv_state &= ~CNIC_DRV_STATE_USING_MSIX; + bnapi->cnic_tag = bnapi->last_status_idx; + bnapi->cnic_present = 1; + sb_id = 0; + cp->irq_arr[0].irq_flags &= ~CNIC_IRQ_FL_MSIX; + } + + cp->irq_arr[0].vector = bp->irq_tbl[sb_id].vector; + cp->irq_arr[0].status_blk = (void *) + ((unsigned long) bnapi->status_blk.msi + + (BNX2_SBLK_MSIX_ALIGN_SIZE * sb_id)); + cp->irq_arr[0].status_blk_num = sb_id; + cp->num_irq = 1; + +done: + rcu_read_unlock(); +} + +static int bnx2_register_cnic(struct net_device *dev, struct cnic_ops *ops, + void *data) +{ + struct bnx2 *bp = netdev_priv(dev); + struct cnic_eth_dev *cp = &bp->cnic_eth_dev; + + if (ops == NULL) + return -EINVAL; + +#if !defined(__VMKLNX__) + if (!try_module_get(ops->cnic_owner)) + return -EBUSY; +#endif + if (atomic_read(&bp->intr_sem) != 0) + return -EBUSY; + + mutex_lock(&bp->cnic_lock); + if (cp->drv_state & CNIC_DRV_STATE_REGD) { + mutex_unlock(&bp->cnic_lock); + return -EBUSY; + } + bp->cnic_data = data; + rcu_assign_pointer(bp->cnic_ops, ops); + + cp->num_irq = 0; + cp->drv_state = CNIC_DRV_STATE_REGD; + + bnx2_setup_cnic_irq_info(bp); + mutex_unlock(&bp->cnic_lock); + + return 0; +} + +static int bnx2_unregister_cnic(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + struct cnic_eth_dev *cp = &bp->cnic_eth_dev; + + mutex_lock(&bp->cnic_lock); + cp->drv_state = 0; +#if !defined(__VMKLNX__) + module_put(bp->cnic_ops->cnic_owner); +#endif + bnapi->cnic_present = 0; + rcu_assign_pointer(bp->cnic_ops, NULL); + mutex_unlock(&bp->cnic_lock); + synchronize_rcu(); + return 0; +} + +struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + struct cnic_eth_dev *cp = &bp->cnic_eth_dev; + + cp->drv_owner = THIS_MODULE; + cp->chip_id = bp->chip_id; + cp->pdev = bp->pdev; + cp->io_base = bp->regview; + cp->drv_ctl = bnx2_drv_ctl; + cp->drv_register_cnic = bnx2_register_cnic; + cp->drv_unregister_cnic = bnx2_unregister_cnic; + + return cp; +} +EXPORT_SYMBOL(bnx2_cnic_probe); + +static void +bnx2_cnic_stop(struct bnx2 *bp) +{ + struct cnic_ops *c_ops; + struct cnic_ctl_info info; + + mutex_lock(&bp->cnic_lock); + c_ops = bp->cnic_ops; + if (c_ops) { + info.cmd = CNIC_CTL_STOP_CMD; + c_ops->cnic_ctl(bp->cnic_data, &info); + } + mutex_unlock(&bp->cnic_lock); +} + +static void +bnx2_cnic_start(struct bnx2 *bp) +{ + struct cnic_ops *c_ops; + struct cnic_ctl_info info; + + mutex_lock(&bp->cnic_lock); + c_ops = bp->cnic_ops; + if (c_ops) { + if (!(bp->flags & BNX2_FLAG_USING_MSIX)) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + + bnapi->cnic_tag = bnapi->last_status_idx; + } + info.cmd = CNIC_CTL_START_CMD; + c_ops->cnic_ctl(bp->cnic_data, &info); + } + mutex_unlock(&bp->cnic_lock); +} + +#else + +static void +bnx2_cnic_stop(struct bnx2 *bp) +{ +} + +static void +bnx2_cnic_start(struct bnx2 *bp) +{ +} + +#endif + +static int +bnx2_read_phy(struct bnx2 *bp, u32 reg, u32 *val) +{ + u32 val1; + int i, ret; + + if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { + val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); + val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL; + + REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); + REG_RD(bp, BNX2_EMAC_MDIO_MODE); + + udelay(40); + } + + val1 = (bp->phy_addr << 21) | (reg << 16) | + BNX2_EMAC_MDIO_COMM_COMMAND_READ | BNX2_EMAC_MDIO_COMM_DISEXT | + BNX2_EMAC_MDIO_COMM_START_BUSY; + REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1); + + for (i = 0; i < 50; i++) { + udelay(10); + + val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); + if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) { + udelay(5); + + val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); + val1 &= BNX2_EMAC_MDIO_COMM_DATA; + + break; + } + } + + if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) { + *val = 0x0; + ret = -EBUSY; + } + else { + *val = val1; + ret = 0; + } + + if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { + val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); + val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL; + + REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); + REG_RD(bp, BNX2_EMAC_MDIO_MODE); + + udelay(40); + } + + return ret; +} + +static int +bnx2_write_phy(struct bnx2 *bp, u32 reg, u32 val) +{ + u32 val1; + int i, ret; + + if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { + val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); + val1 &= ~BNX2_EMAC_MDIO_MODE_AUTO_POLL; + + REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); + REG_RD(bp, BNX2_EMAC_MDIO_MODE); + + udelay(40); + } + + val1 = (bp->phy_addr << 21) | (reg << 16) | val | + BNX2_EMAC_MDIO_COMM_COMMAND_WRITE | + BNX2_EMAC_MDIO_COMM_START_BUSY | BNX2_EMAC_MDIO_COMM_DISEXT; + REG_WR(bp, BNX2_EMAC_MDIO_COMM, val1); + + for (i = 0; i < 50; i++) { + udelay(10); + + val1 = REG_RD(bp, BNX2_EMAC_MDIO_COMM); + if (!(val1 & BNX2_EMAC_MDIO_COMM_START_BUSY)) { + udelay(5); + break; + } + } + + if (val1 & BNX2_EMAC_MDIO_COMM_START_BUSY) + ret = -EBUSY; + else + ret = 0; + + if (bp->phy_flags & BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING) { + val1 = REG_RD(bp, BNX2_EMAC_MDIO_MODE); + val1 |= BNX2_EMAC_MDIO_MODE_AUTO_POLL; + + REG_WR(bp, BNX2_EMAC_MDIO_MODE, val1); + REG_RD(bp, BNX2_EMAC_MDIO_MODE); + + udelay(40); + } + + return ret; +} + +static void +bnx2_disable_int(struct bnx2 *bp) +{ + int i; + struct bnx2_napi *bnapi; + + for (i = 0; i < bp->irq_nvecs; i++) { + bnapi = &bp->bnx2_napi[i]; + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT); + } + + barrier(); + REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD); +} + +static void +bnx2_enable_int(struct bnx2 *bp) +{ + int i; + struct bnx2_napi *bnapi; + + for (i = 0; i < bp->irq_nvecs; i++) { + bnapi = &bp->bnx2_napi[i]; + + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT | + bnapi->last_status_idx); + + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + } + + barrier(); + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); +} + +static void +bnx2_disable_int_sync(struct bnx2 *bp) +{ + int i; + + atomic_inc(&bp->intr_sem); + if (!netif_running(bp->dev)) + return; + + bnx2_disable_int(bp); + for (i = 0; i < bp->irq_nvecs; i++) +#if (LINUX_VERSION_CODE >= 0x2051c) + synchronize_irq(bp->irq_tbl[i].vector); +#else + synchronize_irq(); +#endif +} + +static void +bnx2_napi_disable(struct bnx2 *bp) +{ +#ifdef BNX2_NEW_NAPI + int i; + + for (i = 0; i < bp->irq_nvecs; i++) + napi_disable(&bp->bnx2_napi[i].napi); +#else + netif_poll_disable(bp->dev); +#endif +} + +static void +bnx2_napi_enable(struct bnx2 *bp) +{ +#ifdef BNX2_NEW_NAPI + int i; + + for (i = 0; i < bp->irq_nvecs; i++) + napi_enable(&bp->bnx2_napi[i].napi); +#else + netif_poll_enable(bp->dev); +#endif +} + +#if defined(BNX2_ENABLE_NETQUEUE) +static void +bnx2_netqueue_tx_flush_queue(struct bnx2_napi *bnapi, + struct bnx2_tx_ring_info *txr) +{ + struct bnx2 *bp = bnapi->bp; + + rmb(); + if ((bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons) || + (bnapi->tx_packets_sent != bnapi->tx_packets_processed)) { + bnx2_tx_int(bp, bnapi, 100, 0); + msleep(1); + + rmb(); + } +} + + +static void +bnx2_netqueue_tx_flush(struct bnx2 *bp) +{ + int i; + struct bnx2_napi *bnapi; + struct bnx2_tx_ring_info *txr; + + /* Flush default ring */ + bnapi = &bp->bnx2_napi[0]; + txr = &bnapi->tx_ring; + + bnx2_netqueue_tx_flush_queue(bnapi, txr); + printk(KERN_ALERT PFX "%s: flushed default TX queue\n", + bp->dev->name); + + /* Flush NetQ rings */ + for_each_nondefault_tx_queue(bp, i) { + bnapi = &bp->bnx2_napi[i]; + txr = &bnapi->tx_ring; + + rmb(); + + bnx2_netqueue_tx_flush_queue(bnapi, txr); + printk(KERN_ALERT PFX "%s: flushed TX queue %d\n", + bp->dev->name, i); + } +} + +static void +bnx2_netif_stop(struct bnx2 *bp) +{ + bnx2_cnic_stop(bp); + if (netif_running(bp->dev)) { + bnx2_napi_disable(bp); + netif_tx_disable(bp->dev); + bp->dev->trans_start = jiffies; /* prevent tx timeout */ + } + + bnx2_disable_int_sync(bp); + + /* Give some settling time */ + msleep(250); + + rmb(); + + if(bnx2_netqueue_open_started(bp)) { + bnx2_netqueue_tx_flush(bp); + } +} +#else +static void +bnx2_netif_stop(struct bnx2 *bp) +{ + +#if defined(__VMKLNX__) + /* if netif has already been stopped, will not stop it once more.*/ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) { + return; + } +#endif + + bnx2_cnic_stop(bp); + bnx2_disable_int_sync(bp); + if (netif_running(bp->dev)) { + bnx2_napi_disable(bp); + netif_tx_disable(bp->dev); + bp->dev->trans_start = jiffies; /* prevent tx timeout */ + } +} +#endif + +static void +bnx2_netif_start(struct bnx2 *bp) +{ + if (atomic_dec_and_test(&bp->intr_sem)) { + if (netif_running(bp->dev)) { + netif_tx_wake_all_queues(bp->dev); + bnx2_napi_enable(bp); + bnx2_enable_int(bp); + bnx2_cnic_start(bp); + } + } +} + +static void +bnx2_free_tx_mem(struct bnx2 *bp) +{ + int i; + +#if defined(__VMKLNX__) + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { +#else + for (i = 0; i < bp->num_tx_rings; i++) { +#endif /* defined(__VMKLNX__) */ + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + + if (txr->tx_desc_ring) { + pci_free_consistent(bp->pdev, TXBD_RING_SIZE, + txr->tx_desc_ring, + txr->tx_desc_mapping); + txr->tx_desc_ring = NULL; + } + kfree(txr->tx_buf_ring); + txr->tx_buf_ring = NULL; + } +} + +static void +bnx2_free_rx_mem(struct bnx2 *bp) +{ + int i; + +#if defined(__VMKLNX__) + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { +#else + for (i = 0; i < bp->num_rx_rings; i++) { +#endif /* defined(__VMKLNX__) */ + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + int j; + +#if defined(__VMKLNX__) + for (j = 0; j < MAX_RX_RINGS; j++) { +#else + for (j = 0; j < bp->rx_max_ring; j++) { +#endif /* defined(__VMKLNX__) */ + if (rxr->rx_desc_ring[j]) + pci_free_consistent(bp->pdev, RXBD_RING_SIZE, + rxr->rx_desc_ring[j], + rxr->rx_desc_mapping[j]); + rxr->rx_desc_ring[j] = NULL; + } + if (rxr->rx_buf_ring) + vfree(rxr->rx_buf_ring); + rxr->rx_buf_ring = NULL; + + for (j = 0; j < bp->rx_max_pg_ring; j++) { + if (rxr->rx_pg_desc_ring[j]) + pci_free_consistent(bp->pdev, RXBD_RING_SIZE, + rxr->rx_pg_desc_ring[j], + rxr->rx_pg_desc_mapping[j]); + rxr->rx_pg_desc_ring[j] = NULL; + } + if (rxr->rx_pg_ring) + vfree(rxr->rx_pg_ring); + rxr->rx_pg_ring = NULL; + } +} + +static int +bnx2_alloc_tx_mem(struct bnx2 *bp) +{ + int i; + + for (i = 0; i < bp->num_tx_rings; i++) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + + txr->tx_buf_ring = kmalloc(SW_TXBD_RING_SIZE, GFP_KERNEL); + if (txr->tx_buf_ring == NULL) + return -ENOMEM; + + memset(txr->tx_buf_ring, 0, SW_TXBD_RING_SIZE); + txr->tx_desc_ring = + pci_alloc_consistent(bp->pdev, TXBD_RING_SIZE, + &txr->tx_desc_mapping); + if (txr->tx_desc_ring == NULL) + return -ENOMEM; + } + return 0; +} + +static int +bnx2_alloc_rx_mem(struct bnx2 *bp) +{ + int i; + + for (i = 0; i < bp->num_rx_rings; i++) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + int j; + + rxr->rx_buf_ring = + vmalloc(SW_RXBD_RING_SIZE * bp->rx_max_ring); + if (rxr->rx_buf_ring == NULL) + return -ENOMEM; + + memset(rxr->rx_buf_ring, 0, + SW_RXBD_RING_SIZE * bp->rx_max_ring); + + for (j = 0; j < bp->rx_max_ring; j++) { + rxr->rx_desc_ring[j] = + pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE, + &rxr->rx_desc_mapping[j]); + if (rxr->rx_desc_ring[j] == NULL) + return -ENOMEM; + + } + + if (bp->rx_pg_ring_size) { + rxr->rx_pg_ring = vmalloc(SW_RXPG_RING_SIZE * + bp->rx_max_pg_ring); + if (rxr->rx_pg_ring == NULL) + return -ENOMEM; + + memset(rxr->rx_pg_ring, 0, SW_RXPG_RING_SIZE * + bp->rx_max_pg_ring); + } + + for (j = 0; j < bp->rx_max_pg_ring; j++) { + rxr->rx_pg_desc_ring[j] = + pci_alloc_consistent(bp->pdev, RXBD_RING_SIZE, + &rxr->rx_pg_desc_mapping[j]); + if (rxr->rx_pg_desc_ring[j] == NULL) + return -ENOMEM; + + } + } + return 0; +} + +static void +bnx2_free_mem(struct bnx2 *bp) +{ + int i; + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + + bnx2_free_tx_mem(bp); + bnx2_free_rx_mem(bp); + + for (i = 0; i < bp->ctx_pages; i++) { + if (bp->ctx_blk[i]) { + pci_free_consistent(bp->pdev, BCM_PAGE_SIZE, + bp->ctx_blk[i], + bp->ctx_blk_mapping[i]); + bp->ctx_blk[i] = NULL; + } + } + if (bnapi->status_blk.msi) { + pci_free_consistent(bp->pdev, bp->status_stats_size, + bnapi->status_blk.msi, + bp->status_blk_mapping); + bnapi->status_blk.msi = NULL; + bp->stats_blk = NULL; + } +} + +static int +bnx2_alloc_mem(struct bnx2 *bp) +{ + int i, status_blk_size, err; + struct bnx2_napi *bnapi; + void *status_blk; + + /* Combine status and statistics blocks into one allocation. */ + status_blk_size = L1_CACHE_ALIGN(sizeof(struct status_block)); +#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_MSIX_CAP) + status_blk_size = L1_CACHE_ALIGN(BNX2_MAX_MSIX_HW_VEC * + BNX2_SBLK_MSIX_ALIGN_SIZE); +#endif + bp->status_stats_size = status_blk_size + + sizeof(struct statistics_block); + + status_blk = pci_alloc_consistent(bp->pdev, bp->status_stats_size, + &bp->status_blk_mapping); + if (status_blk == NULL) + goto alloc_mem_err; + + memset(status_blk, 0, bp->status_stats_size); + + bnapi = &bp->bnx2_napi[0]; + bnapi->status_blk.msi = status_blk; + bnapi->hw_tx_cons_ptr = + &bnapi->status_blk.msi->status_tx_quick_consumer_index0; + bnapi->hw_rx_cons_ptr = + &bnapi->status_blk.msi->status_rx_quick_consumer_index0; + if (bp->flags & BNX2_FLAG_MSIX_CAP) { + for (i = 1; i < BNX2_MAX_MSIX_VEC; i++) { + struct status_block_msix *sblk; + + bnapi = &bp->bnx2_napi[i]; + + sblk = (void *) (status_blk + + BNX2_SBLK_MSIX_ALIGN_SIZE * i); + bnapi->status_blk.msix = sblk; + bnapi->hw_tx_cons_ptr = + &sblk->status_tx_quick_consumer_index; + bnapi->hw_rx_cons_ptr = + &sblk->status_rx_quick_consumer_index; + bnapi->int_num = i << 24; + } + } + + bp->stats_blk = status_blk + status_blk_size; + + bp->stats_blk_mapping = bp->status_blk_mapping + status_blk_size; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + /* NetQ uses CID 100, so we need 16K of context memory */ +#if defined(BNX2_ENABLE_NETQUEUE) + bp->ctx_pages = 0x4000 / BCM_PAGE_SIZE; +#else /* !defined(__VMKLNX__) */ + bp->ctx_pages = 0x2000 / BCM_PAGE_SIZE; +#endif /* defined(__VMKLNX__) */ + if (bp->ctx_pages == 0) + bp->ctx_pages = 1; + for (i = 0; i < bp->ctx_pages; i++) { + bp->ctx_blk[i] = pci_alloc_consistent(bp->pdev, + BCM_PAGE_SIZE, + &bp->ctx_blk_mapping[i]); + if (bp->ctx_blk[i] == NULL) + goto alloc_mem_err; + } + } + + err = bnx2_alloc_rx_mem(bp); + if (err) + goto alloc_mem_err; + + err = bnx2_alloc_tx_mem(bp); + if (err) + goto alloc_mem_err; + + return 0; + +alloc_mem_err: + bnx2_free_mem(bp); + return -ENOMEM; +} + +static void +bnx2_report_fw_link(struct bnx2 *bp) +{ + u32 fw_link_status = 0; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return; + + if (bp->link_up) { + u32 bmsr; + + switch (bp->line_speed) { + case SPEED_10: + if (bp->duplex == DUPLEX_HALF) + fw_link_status = BNX2_LINK_STATUS_10HALF; + else + fw_link_status = BNX2_LINK_STATUS_10FULL; + break; + case SPEED_100: + if (bp->duplex == DUPLEX_HALF) + fw_link_status = BNX2_LINK_STATUS_100HALF; + else + fw_link_status = BNX2_LINK_STATUS_100FULL; + break; + case SPEED_1000: + if (bp->duplex == DUPLEX_HALF) + fw_link_status = BNX2_LINK_STATUS_1000HALF; + else + fw_link_status = BNX2_LINK_STATUS_1000FULL; + break; + case SPEED_2500: + if (bp->duplex == DUPLEX_HALF) + fw_link_status = BNX2_LINK_STATUS_2500HALF; + else + fw_link_status = BNX2_LINK_STATUS_2500FULL; + break; + } + + fw_link_status |= BNX2_LINK_STATUS_LINK_UP; + + if (bp->autoneg) { + fw_link_status |= BNX2_LINK_STATUS_AN_ENABLED; + + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + + if (!(bmsr & BMSR_ANEGCOMPLETE) || + bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT) + fw_link_status |= BNX2_LINK_STATUS_PARALLEL_DET; + else + fw_link_status |= BNX2_LINK_STATUS_AN_COMPLETE; + } + } + else + fw_link_status = BNX2_LINK_STATUS_LINK_DOWN; + + bnx2_shmem_wr(bp, BNX2_LINK_STATUS, fw_link_status); +} + +static char * +bnx2_xceiver_str(struct bnx2 *bp) +{ + return ((bp->phy_port == PORT_FIBRE) ? "SerDes" : + ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) ? "Remote Copper" : + "Copper")); +} + +static void +bnx2_report_link(struct bnx2 *bp) +{ + if (bp->link_up) { + netif_carrier_on(bp->dev); + printk(KERN_INFO PFX "%s NIC %s Link is Up, ", bp->dev->name, + bnx2_xceiver_str(bp)); + + printk("%d Mbps ", bp->line_speed); + + if (bp->duplex == DUPLEX_FULL) + printk("full duplex"); + else + printk("half duplex"); + + if (bp->flow_ctrl) { + if (bp->flow_ctrl & FLOW_CTRL_RX) { + printk(", receive "); + if (bp->flow_ctrl & FLOW_CTRL_TX) + printk("& transmit "); + } + else { + printk(", transmit "); + } + printk("flow control ON"); + } + printk("\n"); + } + else { + netif_carrier_off(bp->dev); + printk(KERN_ERR PFX "%s NIC %s Link is Down\n", bp->dev->name, + bnx2_xceiver_str(bp)); + } + + bnx2_report_fw_link(bp); +} + +static void +bnx2_resolve_flow_ctrl(struct bnx2 *bp) +{ + u32 local_adv, remote_adv; + + bp->flow_ctrl = 0; + if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) != + (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) { + + if (bp->duplex == DUPLEX_FULL) { + bp->flow_ctrl = bp->req_flow_ctrl; + } + return; + } + + if (bp->duplex != DUPLEX_FULL) { + return; + } + + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (CHIP_NUM(bp) == CHIP_NUM_5708)) { + u32 val; + + bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val); + if (val & BCM5708S_1000X_STAT1_TX_PAUSE) + bp->flow_ctrl |= FLOW_CTRL_TX; + if (val & BCM5708S_1000X_STAT1_RX_PAUSE) + bp->flow_ctrl |= FLOW_CTRL_RX; + return; + } + + bnx2_read_phy(bp, bp->mii_adv, &local_adv); + bnx2_read_phy(bp, bp->mii_lpa, &remote_adv); + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + u32 new_local_adv = 0; + u32 new_remote_adv = 0; + + if (local_adv & ADVERTISE_1000XPAUSE) + new_local_adv |= ADVERTISE_PAUSE_CAP; + if (local_adv & ADVERTISE_1000XPSE_ASYM) + new_local_adv |= ADVERTISE_PAUSE_ASYM; + if (remote_adv & ADVERTISE_1000XPAUSE) + new_remote_adv |= ADVERTISE_PAUSE_CAP; + if (remote_adv & ADVERTISE_1000XPSE_ASYM) + new_remote_adv |= ADVERTISE_PAUSE_ASYM; + + local_adv = new_local_adv; + remote_adv = new_remote_adv; + } + + /* See Table 28B-3 of 802.3ab-1999 spec. */ + if (local_adv & ADVERTISE_PAUSE_CAP) { + if(local_adv & ADVERTISE_PAUSE_ASYM) { + if (remote_adv & ADVERTISE_PAUSE_CAP) { + bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX; + } + else if (remote_adv & ADVERTISE_PAUSE_ASYM) { + bp->flow_ctrl = FLOW_CTRL_RX; + } + } + else { + if (remote_adv & ADVERTISE_PAUSE_CAP) { + bp->flow_ctrl = FLOW_CTRL_TX | FLOW_CTRL_RX; + } + } + } + else if (local_adv & ADVERTISE_PAUSE_ASYM) { + if ((remote_adv & ADVERTISE_PAUSE_CAP) && + (remote_adv & ADVERTISE_PAUSE_ASYM)) { + + bp->flow_ctrl = FLOW_CTRL_TX; + } + } +} + +static int +bnx2_5709s_linkup(struct bnx2 *bp) +{ + u32 val, speed; + + bp->link_up = 1; + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_GP_STATUS); + bnx2_read_phy(bp, MII_BNX2_GP_TOP_AN_STATUS1, &val); + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + + if ((bp->autoneg & AUTONEG_SPEED) == 0) { + bp->line_speed = bp->req_line_speed; + bp->duplex = bp->req_duplex; + return 0; + } + speed = val & MII_BNX2_GP_TOP_AN_SPEED_MSK; + switch (speed) { + case MII_BNX2_GP_TOP_AN_SPEED_10: + bp->line_speed = SPEED_10; + break; + case MII_BNX2_GP_TOP_AN_SPEED_100: + bp->line_speed = SPEED_100; + break; + case MII_BNX2_GP_TOP_AN_SPEED_1G: + case MII_BNX2_GP_TOP_AN_SPEED_1GKV: + bp->line_speed = SPEED_1000; + break; + case MII_BNX2_GP_TOP_AN_SPEED_2_5G: + bp->line_speed = SPEED_2500; + break; + } + if (val & MII_BNX2_GP_TOP_AN_FD) + bp->duplex = DUPLEX_FULL; + else + bp->duplex = DUPLEX_HALF; + return 0; +} + +static int +bnx2_5708s_linkup(struct bnx2 *bp) +{ + u32 val; + + bp->link_up = 1; + bnx2_read_phy(bp, BCM5708S_1000X_STAT1, &val); + switch (val & BCM5708S_1000X_STAT1_SPEED_MASK) { + case BCM5708S_1000X_STAT1_SPEED_10: + bp->line_speed = SPEED_10; + break; + case BCM5708S_1000X_STAT1_SPEED_100: + bp->line_speed = SPEED_100; + break; + case BCM5708S_1000X_STAT1_SPEED_1G: + bp->line_speed = SPEED_1000; + break; + case BCM5708S_1000X_STAT1_SPEED_2G5: + bp->line_speed = SPEED_2500; + break; + } + if (val & BCM5708S_1000X_STAT1_FD) + bp->duplex = DUPLEX_FULL; + else + bp->duplex = DUPLEX_HALF; + + return 0; +} + +static int +bnx2_5706s_linkup(struct bnx2 *bp) +{ + u32 bmcr, local_adv, remote_adv, common; + + bp->link_up = 1; + bp->line_speed = SPEED_1000; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + if (bmcr & BMCR_FULLDPLX) { + bp->duplex = DUPLEX_FULL; + } + else { + bp->duplex = DUPLEX_HALF; + } + + if (!(bmcr & BMCR_ANENABLE)) { + return 0; + } + + bnx2_read_phy(bp, bp->mii_adv, &local_adv); + bnx2_read_phy(bp, bp->mii_lpa, &remote_adv); + + common = local_adv & remote_adv; + if (common & (ADVERTISE_1000XHALF | ADVERTISE_1000XFULL)) { + + if (common & ADVERTISE_1000XFULL) { + bp->duplex = DUPLEX_FULL; + } + else { + bp->duplex = DUPLEX_HALF; + } + } + + return 0; +} + +static int +bnx2_copper_linkup(struct bnx2 *bp) +{ + u32 bmcr; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + if (bmcr & BMCR_ANENABLE) { + u32 local_adv, remote_adv, common; + + bnx2_read_phy(bp, MII_CTRL1000, &local_adv); + bnx2_read_phy(bp, MII_STAT1000, &remote_adv); + + common = local_adv & (remote_adv >> 2); + if (common & ADVERTISE_1000FULL) { + bp->line_speed = SPEED_1000; + bp->duplex = DUPLEX_FULL; + } + else if (common & ADVERTISE_1000HALF) { + bp->line_speed = SPEED_1000; + bp->duplex = DUPLEX_HALF; + } + else { + bnx2_read_phy(bp, bp->mii_adv, &local_adv); + bnx2_read_phy(bp, bp->mii_lpa, &remote_adv); + + common = local_adv & remote_adv; + if (common & ADVERTISE_100FULL) { + bp->line_speed = SPEED_100; + bp->duplex = DUPLEX_FULL; + } + else if (common & ADVERTISE_100HALF) { + bp->line_speed = SPEED_100; + bp->duplex = DUPLEX_HALF; + } + else if (common & ADVERTISE_10FULL) { + bp->line_speed = SPEED_10; + bp->duplex = DUPLEX_FULL; + } + else if (common & ADVERTISE_10HALF) { + bp->line_speed = SPEED_10; + bp->duplex = DUPLEX_HALF; + } + else { + bp->line_speed = 0; + bp->link_up = 0; + } + } + } + else { + if (bmcr & BMCR_SPEED100) { + bp->line_speed = SPEED_100; + } + else { + bp->line_speed = SPEED_10; + } + if (bmcr & BMCR_FULLDPLX) { + bp->duplex = DUPLEX_FULL; + } + else { + bp->duplex = DUPLEX_HALF; + } + } + + return 0; +} + +static void +bnx2_init_rx_context(struct bnx2 *bp, u32 cid) +{ + u32 val, rx_cid_addr = GET_CID_ADDR(cid); + + val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE; + val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2; + val |= 0x02 << 8; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + u32 lo_water, hi_water; + + if (bp->flow_ctrl & FLOW_CTRL_TX) + lo_water = BNX2_L2CTX_LO_WATER_MARK_DEFAULT; + else + lo_water = BNX2_L2CTX_LO_WATER_MARK_DIS; + if (lo_water >= bp->rx_ring_size) + lo_water = 0; + + hi_water = bp->rx_ring_size / 4; + + if (hi_water <= lo_water) + lo_water = 0; + + hi_water /= BNX2_L2CTX_HI_WATER_MARK_SCALE; + lo_water /= BNX2_L2CTX_LO_WATER_MARK_SCALE; + + if (hi_water > 0xf) + hi_water = 0xf; + else if (hi_water == 0) + lo_water = 0; + val |= lo_water | (hi_water << BNX2_L2CTX_HI_WATER_MARK_SHIFT); + } + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val); + +} + +static void +bnx2_init_all_rx_contexts(struct bnx2 *bp) +{ + int i; + u32 cid; + + for (i = 0, cid = RX_CID; i < bp->num_rx_rings; i++, cid++) { + if (i == 1) + cid = RX_RSS_CID; + bnx2_init_rx_context(bp, cid); + } +} + +static void +bnx2_set_mac_link(struct bnx2 *bp) +{ + u32 val; + + REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x2620); + if (bp->link_up && (bp->line_speed == SPEED_1000) && + (bp->duplex == DUPLEX_HALF)) { + REG_WR(bp, BNX2_EMAC_TX_LENGTHS, 0x26ff); + } + + /* Configure the EMAC mode register. */ + val = REG_RD(bp, BNX2_EMAC_MODE); + + val &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX | + BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK | + BNX2_EMAC_MODE_25G_MODE); + + if (bp->link_up) { + switch (bp->line_speed) { + case SPEED_10: + if (CHIP_NUM(bp) != CHIP_NUM_5706) { + val |= BNX2_EMAC_MODE_PORT_MII_10M; + break; + } + /* fall through */ + case SPEED_100: + val |= BNX2_EMAC_MODE_PORT_MII; + break; + case SPEED_2500: + val |= BNX2_EMAC_MODE_25G_MODE; + /* fall through */ + case SPEED_1000: + val |= BNX2_EMAC_MODE_PORT_GMII; + break; + } + } + else { + val |= BNX2_EMAC_MODE_PORT_GMII; + } + + /* Set the MAC to operate in the appropriate duplex mode. */ + if (bp->duplex == DUPLEX_HALF) + val |= BNX2_EMAC_MODE_HALF_DUPLEX; + REG_WR(bp, BNX2_EMAC_MODE, val); + + /* Enable/disable rx PAUSE. */ + bp->rx_mode &= ~BNX2_EMAC_RX_MODE_FLOW_EN; + + if (bp->flow_ctrl & FLOW_CTRL_RX) + bp->rx_mode |= BNX2_EMAC_RX_MODE_FLOW_EN; + REG_WR(bp, BNX2_EMAC_RX_MODE, bp->rx_mode); + + /* Enable/disable tx PAUSE. */ + val = REG_RD(bp, BNX2_EMAC_TX_MODE); + val &= ~BNX2_EMAC_TX_MODE_FLOW_EN; + + if (bp->flow_ctrl & FLOW_CTRL_TX) + val |= BNX2_EMAC_TX_MODE_FLOW_EN; + REG_WR(bp, BNX2_EMAC_TX_MODE, val); + + /* Acknowledge the interrupt. */ + REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_init_all_rx_contexts(bp); +} + +static void +bnx2_enable_bmsr1(struct bnx2 *bp) +{ + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (CHIP_NUM(bp) == CHIP_NUM_5709)) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_GP_STATUS); +} + +static void +bnx2_disable_bmsr1(struct bnx2 *bp) +{ + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (CHIP_NUM(bp) == CHIP_NUM_5709)) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_COMBO_IEEEB0); +} + +static int +bnx2_test_and_enable_2g5(struct bnx2 *bp) +{ + u32 up1; + int ret = 1; + + if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)) + return 0; + + if (bp->autoneg & AUTONEG_SPEED) + bp->advertising |= ADVERTISED_2500baseX_Full; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G); + + bnx2_read_phy(bp, bp->mii_up1, &up1); + if (!(up1 & BCM5708S_UP1_2G5)) { + up1 |= BCM5708S_UP1_2G5; + bnx2_write_phy(bp, bp->mii_up1, up1); + ret = 0; + } + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + + return ret; +} + +static int +bnx2_test_and_disable_2g5(struct bnx2 *bp) +{ + u32 up1; + int ret = 0; + + if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)) + return 0; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G); + + bnx2_read_phy(bp, bp->mii_up1, &up1); + if (up1 & BCM5708S_UP1_2G5) { + up1 &= ~BCM5708S_UP1_2G5; + bnx2_write_phy(bp, bp->mii_up1, up1); + ret = 1; + } + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + + return ret; +} + +static void +bnx2_enable_forced_2g5(struct bnx2 *bp) +{ + u32 bmcr; + + if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)) + return; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + u32 val; + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_SERDES_DIG); + bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val); + val &= ~MII_BNX2_SD_MISC1_FORCE_MSK; + val |= MII_BNX2_SD_MISC1_FORCE | MII_BNX2_SD_MISC1_FORCE_2_5G; + bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + + } else if (CHIP_NUM(bp) == CHIP_NUM_5708) { + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + bmcr |= BCM5708S_BMCR_FORCE_2500; + } + + if (bp->autoneg & AUTONEG_SPEED) { + bmcr &= ~BMCR_ANENABLE; + if (bp->req_duplex == DUPLEX_FULL) + bmcr |= BMCR_FULLDPLX; + } + bnx2_write_phy(bp, bp->mii_bmcr, bmcr); +} + +static void +bnx2_disable_forced_2g5(struct bnx2 *bp) +{ + u32 bmcr; + + if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)) + return; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + u32 val; + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_SERDES_DIG); + bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_MISC1, &val); + val &= ~MII_BNX2_SD_MISC1_FORCE; + bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_MISC1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, + MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + + } else if (CHIP_NUM(bp) == CHIP_NUM_5708) { + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + bmcr &= ~BCM5708S_BMCR_FORCE_2500; + } + + if (bp->autoneg & AUTONEG_SPEED) + bmcr |= BMCR_SPEED1000 | BMCR_ANENABLE | BMCR_ANRESTART; + bnx2_write_phy(bp, bp->mii_bmcr, bmcr); +} + +static void +bnx2_5706s_force_link_dn(struct bnx2 *bp, int start) +{ + u32 val; + + bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_SERDES_CTL); + bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val); + if (start) + bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val & 0xff0f); + else + bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val | 0xc0); +} + +static int +bnx2_set_link(struct bnx2 *bp) +{ + u32 bmsr; + u8 link_up; + + if (bp->loopback == MAC_LOOPBACK || bp->loopback == PHY_LOOPBACK) { + bp->link_up = 1; + return 0; + } + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return 0; + + link_up = bp->link_up; + + bnx2_enable_bmsr1(bp); + bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr); + bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr); + bnx2_disable_bmsr1(bp); + + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (CHIP_NUM(bp) == CHIP_NUM_5706)) { + u32 val, an_dbg; + + if (bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN) { + bnx2_5706s_force_link_dn(bp, 0); + bp->phy_flags &= ~BNX2_PHY_FLAG_FORCED_DOWN; + } + val = REG_RD(bp, BNX2_EMAC_STATUS); + + bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); + + if ((val & BNX2_EMAC_STATUS_LINK) && + !(an_dbg & MISC_SHDW_AN_DBG_NOSYNC)) + bmsr |= BMSR_LSTATUS; + else + bmsr &= ~BMSR_LSTATUS; + } + + if (bmsr & BMSR_LSTATUS) { + bp->link_up = 1; + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + if (CHIP_NUM(bp) == CHIP_NUM_5706) + bnx2_5706s_linkup(bp); + else if (CHIP_NUM(bp) == CHIP_NUM_5708) + bnx2_5708s_linkup(bp); + else if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_5709s_linkup(bp); + } + else { + bnx2_copper_linkup(bp); + } + bnx2_resolve_flow_ctrl(bp); + } + else { + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (bp->autoneg & AUTONEG_SPEED)) + bnx2_disable_forced_2g5(bp); + + if (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT) { + u32 bmcr; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + bmcr |= BMCR_ANENABLE; + bnx2_write_phy(bp, bp->mii_bmcr, bmcr); + + bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT; + } + bp->link_up = 0; + } + + if (bp->link_up != link_up) { + bnx2_report_link(bp); + } + + bnx2_set_mac_link(bp); + + return 0; +} + +static int +bnx2_reset_phy(struct bnx2 *bp) +{ + int i; + u32 reg; + + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_RESET); + +#define PHY_RESET_MAX_WAIT 100 + for (i = 0; i < PHY_RESET_MAX_WAIT; i++) { + udelay(10); + + bnx2_read_phy(bp, bp->mii_bmcr, ®); + if (!(reg & BMCR_RESET)) { + udelay(20); + break; + } + } + if (i == PHY_RESET_MAX_WAIT) { + return -EBUSY; + } + return 0; +} + +static u32 +bnx2_phy_get_pause_adv(struct bnx2 *bp) +{ + u32 adv = 0; + + if ((bp->req_flow_ctrl & (FLOW_CTRL_RX | FLOW_CTRL_TX)) == + (FLOW_CTRL_RX | FLOW_CTRL_TX)) { + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + adv = ADVERTISE_1000XPAUSE; + } + else { + adv = ADVERTISE_PAUSE_CAP; + } + } + else if (bp->req_flow_ctrl & FLOW_CTRL_TX) { + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + adv = ADVERTISE_1000XPSE_ASYM; + } + else { + adv = ADVERTISE_PAUSE_ASYM; + } + } + else if (bp->req_flow_ctrl & FLOW_CTRL_RX) { + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + adv = ADVERTISE_1000XPAUSE | ADVERTISE_1000XPSE_ASYM; + } + else { + adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM; + } + } + return adv; +} + +static int bnx2_fw_sync(struct bnx2 *, u32, int, int); + +static int +bnx2_setup_remote_phy(struct bnx2 *bp, u8 port) +__releases(&bp->phy_lock) +__acquires(&bp->phy_lock) +{ + u32 speed_arg = 0, pause_adv; + + pause_adv = bnx2_phy_get_pause_adv(bp); + + if (bp->autoneg & AUTONEG_SPEED) { + speed_arg |= BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG; + if (bp->advertising & ADVERTISED_10baseT_Half) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10HALF; + if (bp->advertising & ADVERTISED_10baseT_Full) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_10FULL; + if (bp->advertising & ADVERTISED_100baseT_Half) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100HALF; + if (bp->advertising & ADVERTISED_100baseT_Full) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_100FULL; + if (bp->advertising & ADVERTISED_1000baseT_Full) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_1GFULL; + if (bp->advertising & ADVERTISED_2500baseX_Full) + speed_arg |= BNX2_NETLINK_SET_LINK_SPEED_2G5FULL; + } else { + if (bp->req_line_speed == SPEED_2500) + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_2G5FULL; + else if (bp->req_line_speed == SPEED_1000) + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_1GFULL; + else if (bp->req_line_speed == SPEED_100) { + if (bp->req_duplex == DUPLEX_FULL) + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100FULL; + else + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_100HALF; + } else if (bp->req_line_speed == SPEED_10) { + if (bp->req_duplex == DUPLEX_FULL) + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10FULL; + else + speed_arg = BNX2_NETLINK_SET_LINK_SPEED_10HALF; + } + } + + if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP)) + speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE; + if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_PAUSE_ASYM)) + speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE; + + if (port == PORT_TP) + speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE | + BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED; + + bnx2_shmem_wr(bp, BNX2_DRV_MB_ARG0, speed_arg); + + spin_unlock_bh(&bp->phy_lock); + bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 1, 0); + spin_lock_bh(&bp->phy_lock); + + return 0; +} + +static int +bnx2_setup_serdes_phy(struct bnx2 *bp, u8 port) +__releases(&bp->phy_lock) +__acquires(&bp->phy_lock) +{ + u32 adv, bmcr; + u32 new_adv = 0; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return (bnx2_setup_remote_phy(bp, port)); + + if (!(bp->autoneg & AUTONEG_SPEED)) { + u32 new_bmcr; + int force_link_down = 0; + + if (bp->req_line_speed == SPEED_2500) { + if (!bnx2_test_and_enable_2g5(bp)) + force_link_down = 1; + } else if (bp->req_line_speed == SPEED_1000) { + if (bnx2_test_and_disable_2g5(bp)) + force_link_down = 1; + } + bnx2_read_phy(bp, bp->mii_adv, &adv); + adv &= ~(ADVERTISE_1000XFULL | ADVERTISE_1000XHALF); + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + new_bmcr = bmcr & ~BMCR_ANENABLE; + new_bmcr |= BMCR_SPEED1000; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + if (bp->req_line_speed == SPEED_2500) + bnx2_enable_forced_2g5(bp); + else if (bp->req_line_speed == SPEED_1000) { + bnx2_disable_forced_2g5(bp); + new_bmcr &= ~0x2000; + } + + } else if (CHIP_NUM(bp) == CHIP_NUM_5708) { + if (bp->req_line_speed == SPEED_2500) + new_bmcr |= BCM5708S_BMCR_FORCE_2500; + else + new_bmcr = bmcr & ~BCM5708S_BMCR_FORCE_2500; + } + + if (bp->req_duplex == DUPLEX_FULL) { + adv |= ADVERTISE_1000XFULL; + new_bmcr |= BMCR_FULLDPLX; + } + else { + adv |= ADVERTISE_1000XHALF; + new_bmcr &= ~BMCR_FULLDPLX; + } + if ((new_bmcr != bmcr) || (force_link_down)) { + /* Force a link down visible on the other side */ + if (bp->link_up) { + bnx2_write_phy(bp, bp->mii_adv, adv & + ~(ADVERTISE_1000XFULL | + ADVERTISE_1000XHALF)); + bnx2_write_phy(bp, bp->mii_bmcr, bmcr | + BMCR_ANRESTART | BMCR_ANENABLE); + + bp->link_up = 0; + netif_carrier_off(bp->dev); + bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr); + bnx2_report_link(bp); + } + bnx2_write_phy(bp, bp->mii_adv, adv); + bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr); + } else { + bnx2_resolve_flow_ctrl(bp); + bnx2_set_mac_link(bp); + } + return 0; + } + + bnx2_test_and_enable_2g5(bp); + + if (bp->advertising & ADVERTISED_1000baseT_Full) + new_adv |= ADVERTISE_1000XFULL; + + new_adv |= bnx2_phy_get_pause_adv(bp); + + bnx2_read_phy(bp, bp->mii_adv, &adv); + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + + bp->serdes_an_pending = 0; + if ((adv != new_adv) || ((bmcr & BMCR_ANENABLE) == 0)) { + /* Force a link down visible on the other side */ + if (bp->link_up) { + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); + bnx2_msleep(20); + spin_lock_bh(&bp->phy_lock); + } + + bnx2_write_phy(bp, bp->mii_adv, new_adv); + bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART | + BMCR_ANENABLE); + /* Speed up link-up time when the link partner + * does not autonegotiate which is very common + * in blade servers. Some blade servers use + * IPMI for kerboard input and it's important + * to minimize link disruptions. Autoneg. involves + * exchanging base pages plus 3 next pages and + * normally completes in about 120 msec. + */ + bp->current_interval = BNX2_SERDES_AN_TIMEOUT; + bp->serdes_an_pending = 1; + mod_timer(&bp->timer, jiffies + bp->current_interval); + } else { + bnx2_resolve_flow_ctrl(bp); + bnx2_set_mac_link(bp); + } + + return 0; +} + +#define ETHTOOL_ALL_FIBRE_SPEED \ + (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) ? \ + (ADVERTISED_2500baseX_Full | ADVERTISED_1000baseT_Full) :\ + (ADVERTISED_1000baseT_Full) + +#define ETHTOOL_ALL_COPPER_SPEED \ + (ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | \ + ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | \ + ADVERTISED_1000baseT_Full) + +#define PHY_ALL_10_100_SPEED (ADVERTISE_10HALF | ADVERTISE_10FULL | \ + ADVERTISE_100HALF | ADVERTISE_100FULL | ADVERTISE_CSMA) + +#define PHY_ALL_1000_SPEED (ADVERTISE_1000HALF | ADVERTISE_1000FULL) + +static void +bnx2_set_default_remote_link(struct bnx2 *bp) +{ + u32 link; + + if (bp->phy_port == PORT_TP) + link = bnx2_shmem_rd(bp, BNX2_RPHY_COPPER_LINK); + else + link = bnx2_shmem_rd(bp, BNX2_RPHY_SERDES_LINK); + + if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) { + bp->req_line_speed = 0; + bp->autoneg |= AUTONEG_SPEED; + bp->advertising = ADVERTISED_Autoneg; + if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF) + bp->advertising |= ADVERTISED_10baseT_Half; + if (link & BNX2_NETLINK_SET_LINK_SPEED_10FULL) + bp->advertising |= ADVERTISED_10baseT_Full; + if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF) + bp->advertising |= ADVERTISED_100baseT_Half; + if (link & BNX2_NETLINK_SET_LINK_SPEED_100FULL) + bp->advertising |= ADVERTISED_100baseT_Full; + if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL) + bp->advertising |= ADVERTISED_1000baseT_Full; + if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL) + bp->advertising |= ADVERTISED_2500baseX_Full; + } else { + bp->autoneg = 0; + bp->advertising = 0; + bp->req_duplex = DUPLEX_FULL; + if (link & BNX2_NETLINK_SET_LINK_SPEED_10) { + bp->req_line_speed = SPEED_10; + if (link & BNX2_NETLINK_SET_LINK_SPEED_10HALF) + bp->req_duplex = DUPLEX_HALF; + } + if (link & BNX2_NETLINK_SET_LINK_SPEED_100) { + bp->req_line_speed = SPEED_100; + if (link & BNX2_NETLINK_SET_LINK_SPEED_100HALF) + bp->req_duplex = DUPLEX_HALF; + } + if (link & BNX2_NETLINK_SET_LINK_SPEED_1GFULL) + bp->req_line_speed = SPEED_1000; + if (link & BNX2_NETLINK_SET_LINK_SPEED_2G5FULL) + bp->req_line_speed = SPEED_2500; + } +} + +static void +bnx2_set_default_link(struct bnx2 *bp) +{ + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { + bnx2_set_default_remote_link(bp); + return; + } + + bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL; + bp->req_line_speed = 0; + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + u32 reg; + + bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg; + + reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG); + reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK; + if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) { + bp->autoneg = 0; + bp->req_line_speed = bp->line_speed = SPEED_1000; + bp->req_duplex = DUPLEX_FULL; + } + } else + bp->advertising = ETHTOOL_ALL_COPPER_SPEED | ADVERTISED_Autoneg; +} + +static void +bnx2_send_heart_beat(struct bnx2 *bp) +{ + u32 msg; + u32 addr; + + spin_lock(&bp->indirect_lock); + msg = (u32) (++bp->fw_drv_pulse_wr_seq & BNX2_DRV_PULSE_SEQ_MASK); + addr = bp->shmem_base + BNX2_DRV_PULSE_MB; + REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, addr); + REG_WR(bp, BNX2_PCICFG_REG_WINDOW, msg); + spin_unlock(&bp->indirect_lock); +} + +static void +bnx2_remote_phy_event(struct bnx2 *bp) +{ + u32 msg; + u8 link_up = bp->link_up; + u8 old_port; + + msg = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); + + if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED) + bnx2_send_heart_beat(bp); + + msg &= ~BNX2_LINK_STATUS_HEART_BEAT_EXPIRED; + + if ((msg & BNX2_LINK_STATUS_LINK_UP) == BNX2_LINK_STATUS_LINK_DOWN) + bp->link_up = 0; + else { + u32 speed; + + bp->link_up = 1; + speed = msg & BNX2_LINK_STATUS_SPEED_MASK; + bp->duplex = DUPLEX_FULL; + switch (speed) { + case BNX2_LINK_STATUS_10HALF: + bp->duplex = DUPLEX_HALF; + case BNX2_LINK_STATUS_10FULL: + bp->line_speed = SPEED_10; + break; + case BNX2_LINK_STATUS_100HALF: + bp->duplex = DUPLEX_HALF; + case BNX2_LINK_STATUS_100BASE_T4: + case BNX2_LINK_STATUS_100FULL: + bp->line_speed = SPEED_100; + break; + case BNX2_LINK_STATUS_1000HALF: + bp->duplex = DUPLEX_HALF; + case BNX2_LINK_STATUS_1000FULL: + bp->line_speed = SPEED_1000; + break; + case BNX2_LINK_STATUS_2500HALF: + bp->duplex = DUPLEX_HALF; + case BNX2_LINK_STATUS_2500FULL: + bp->line_speed = SPEED_2500; + break; + default: + bp->line_speed = 0; + break; + } + + bp->flow_ctrl = 0; + if ((bp->autoneg & (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) != + (AUTONEG_SPEED | AUTONEG_FLOW_CTRL)) { + if (bp->duplex == DUPLEX_FULL) + bp->flow_ctrl = bp->req_flow_ctrl; + } else { + if (msg & BNX2_LINK_STATUS_TX_FC_ENABLED) + bp->flow_ctrl |= FLOW_CTRL_TX; + if (msg & BNX2_LINK_STATUS_RX_FC_ENABLED) + bp->flow_ctrl |= FLOW_CTRL_RX; + } + + old_port = bp->phy_port; + if (msg & BNX2_LINK_STATUS_SERDES_LINK) + bp->phy_port = PORT_FIBRE; + else + bp->phy_port = PORT_TP; + + if (old_port != bp->phy_port) + bnx2_set_default_link(bp); + + } + if (bp->link_up != link_up) + bnx2_report_link(bp); + + bnx2_set_mac_link(bp); +} + +static int +bnx2_set_remote_link(struct bnx2 *bp) +{ + u32 evt_code; + + spin_lock(&bp->indirect_lock); + REG_WR(bp, BNX2_PCICFG_REG_WINDOW_ADDRESS, + bp->shmem_base + BNX2_FW_EVT_CODE_MB); + evt_code = REG_RD(bp, BNX2_PCICFG_REG_WINDOW); + spin_unlock(&bp->indirect_lock); + switch (evt_code) { + case BNX2_FW_EVT_CODE_LINK_EVENT: + bnx2_remote_phy_event(bp); + break; + case BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT: + default: + bnx2_send_heart_beat(bp); + break; + } + return 0; +} + +static int +bnx2_setup_copper_phy(struct bnx2 *bp) +__releases(&bp->phy_lock) +__acquires(&bp->phy_lock) +{ + u32 bmcr; + u32 new_bmcr; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + + if (bp->autoneg & AUTONEG_SPEED) { + u32 adv_reg, adv1000_reg; + u32 new_adv_reg = 0; + u32 new_adv1000_reg = 0; + + bnx2_read_phy(bp, bp->mii_adv, &adv_reg); + adv_reg &= (PHY_ALL_10_100_SPEED | ADVERTISE_PAUSE_CAP | + ADVERTISE_PAUSE_ASYM); + + bnx2_read_phy(bp, MII_CTRL1000, &adv1000_reg); + adv1000_reg &= PHY_ALL_1000_SPEED; + + if (bp->advertising & ADVERTISED_10baseT_Half) + new_adv_reg |= ADVERTISE_10HALF; + if (bp->advertising & ADVERTISED_10baseT_Full) + new_adv_reg |= ADVERTISE_10FULL; + if (bp->advertising & ADVERTISED_100baseT_Half) + new_adv_reg |= ADVERTISE_100HALF; + if (bp->advertising & ADVERTISED_100baseT_Full) + new_adv_reg |= ADVERTISE_100FULL; + if (bp->advertising & ADVERTISED_1000baseT_Full) + new_adv1000_reg |= ADVERTISE_1000FULL; + + new_adv_reg |= ADVERTISE_CSMA; + + new_adv_reg |= bnx2_phy_get_pause_adv(bp); + + if ((adv1000_reg != new_adv1000_reg) || + (adv_reg != new_adv_reg) || + ((bmcr & BMCR_ANENABLE) == 0)) { + + bnx2_write_phy(bp, bp->mii_adv, new_adv_reg); + bnx2_write_phy(bp, MII_CTRL1000, new_adv1000_reg); + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_ANRESTART | + BMCR_ANENABLE); + } + else if (bp->link_up) { + /* Flow ctrl may have changed from auto to forced */ + /* or vice-versa. */ + + bnx2_resolve_flow_ctrl(bp); + bnx2_set_mac_link(bp); + } + return 0; + } + + new_bmcr = 0; + if (bp->req_line_speed == SPEED_100) { + new_bmcr |= BMCR_SPEED100; + } + if (bp->req_duplex == DUPLEX_FULL) { + new_bmcr |= BMCR_FULLDPLX; + } + if (new_bmcr != bmcr) { + u32 bmsr; + + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + + if (bmsr & BMSR_LSTATUS) { + /* Force link down */ + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); + bnx2_msleep(50); + spin_lock_bh(&bp->phy_lock); + + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + bnx2_read_phy(bp, bp->mii_bmsr, &bmsr); + } + + bnx2_write_phy(bp, bp->mii_bmcr, new_bmcr); + + /* Normally, the new speed is setup after the link has + * gone down and up again. In some cases, link will not go + * down so we need to set up the new speed here. + */ + if (bmsr & BMSR_LSTATUS) { + bp->line_speed = bp->req_line_speed; + bp->duplex = bp->req_duplex; + bnx2_resolve_flow_ctrl(bp); + bnx2_set_mac_link(bp); + } + } else { + bnx2_resolve_flow_ctrl(bp); + bnx2_set_mac_link(bp); + } + return 0; +} + +static int +bnx2_setup_phy(struct bnx2 *bp, u8 port) +__releases(&bp->phy_lock) +__acquires(&bp->phy_lock) +{ + if (bp->loopback == MAC_LOOPBACK) + return 0; + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + return (bnx2_setup_serdes_phy(bp, port)); + } + else { + return (bnx2_setup_copper_phy(bp)); + } +} + +static int +bnx2_init_5709s_phy(struct bnx2 *bp, int reset_phy) +{ + u32 val; + + bp->mii_bmcr = MII_BMCR + 0x10; + bp->mii_bmsr = MII_BMSR + 0x10; + bp->mii_bmsr1 = MII_BNX2_GP_TOP_AN_STATUS1; + bp->mii_adv = MII_ADVERTISE + 0x10; + bp->mii_lpa = MII_LPA + 0x10; + bp->mii_up1 = MII_BNX2_OVER1G_UP1; + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_AER); + bnx2_write_phy(bp, MII_BNX2_AER_AER, MII_BNX2_AER_AER_AN_MMD); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + if (reset_phy) + bnx2_reset_phy(bp); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_SERDES_DIG); + + bnx2_read_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, &val); + val &= ~MII_BNX2_SD_1000XCTL1_AUTODET; + val |= MII_BNX2_SD_1000XCTL1_FIBER; + /* NEMO temp. FIX */ + if (bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG) & 0x80000000) + val |= (1 << 3); + bnx2_write_phy(bp, MII_BNX2_SERDES_DIG_1000XCTL1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_OVER1G); + bnx2_read_phy(bp, MII_BNX2_OVER1G_UP1, &val); + if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) + val |= BCM5708S_UP1_2G5; + else + val &= ~BCM5708S_UP1_2G5; + bnx2_write_phy(bp, MII_BNX2_OVER1G_UP1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_BAM_NXTPG); + bnx2_read_phy(bp, MII_BNX2_BAM_NXTPG_CTL, &val); + val |= MII_BNX2_NXTPG_CTL_T2 | MII_BNX2_NXTPG_CTL_BAM; + bnx2_write_phy(bp, MII_BNX2_BAM_NXTPG_CTL, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_CL73_USERB0); + + val = MII_BNX2_CL73_BAM_EN | MII_BNX2_CL73_BAM_STA_MGR_EN | + MII_BNX2_CL73_BAM_NP_AFT_BP_EN; + bnx2_write_phy(bp, MII_BNX2_CL73_BAM_CTL1, val); + + bnx2_write_phy(bp, MII_BNX2_BLK_ADDR, MII_BNX2_BLK_ADDR_COMBO_IEEEB0); + + return 0; +} + +static int +bnx2_init_5708s_phy(struct bnx2 *bp, int reset_phy) +{ + u32 val; + + if (reset_phy) + bnx2_reset_phy(bp); + + bp->mii_up1 = BCM5708S_UP1; + + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG3); + bnx2_write_phy(bp, BCM5708S_DIG_3_0, BCM5708S_DIG_3_0_USE_IEEE); + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG); + + bnx2_read_phy(bp, BCM5708S_1000X_CTL1, &val); + val |= BCM5708S_1000X_CTL1_FIBER_MODE | BCM5708S_1000X_CTL1_AUTODET_EN; + bnx2_write_phy(bp, BCM5708S_1000X_CTL1, val); + + bnx2_read_phy(bp, BCM5708S_1000X_CTL2, &val); + val |= BCM5708S_1000X_CTL2_PLLEL_DET_EN; + bnx2_write_phy(bp, BCM5708S_1000X_CTL2, val); + + if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) { + bnx2_read_phy(bp, BCM5708S_UP1, &val); + val |= BCM5708S_UP1_2G5; + bnx2_write_phy(bp, BCM5708S_UP1, val); + } + + if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || + (CHIP_ID(bp) == CHIP_ID_5708_B0) || + (CHIP_ID(bp) == CHIP_ID_5708_B1)) { + /* increase tx signal amplitude */ + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, + BCM5708S_BLK_ADDR_TX_MISC); + bnx2_read_phy(bp, BCM5708S_TX_ACTL1, &val); + val &= ~BCM5708S_TX_ACTL1_DRIVER_VCM; + bnx2_write_phy(bp, BCM5708S_TX_ACTL1, val); + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG); + } + + val = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG) & + BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK; + + if (val) { + u32 is_backplane; + + is_backplane = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG); + if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) { + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, + BCM5708S_BLK_ADDR_TX_MISC); + bnx2_write_phy(bp, BCM5708S_TX_ACTL3, val); + bnx2_write_phy(bp, BCM5708S_BLK_ADDR, + BCM5708S_BLK_ADDR_DIG); + } + } + return 0; +} + +static int +bnx2_init_5706s_phy(struct bnx2 *bp, int reset_phy) +{ + if (reset_phy) + bnx2_reset_phy(bp); + + bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT; + + if (CHIP_NUM(bp) == CHIP_NUM_5706) + REG_WR(bp, BNX2_MISC_GP_HW_CTL0, 0x300); + + if (bp->dev->mtu > 1500) { + u32 val; + + /* Set extended packet length bit */ + bnx2_write_phy(bp, 0x18, 0x7); + bnx2_read_phy(bp, 0x18, &val); + bnx2_write_phy(bp, 0x18, (val & 0xfff8) | 0x4000); + + bnx2_write_phy(bp, 0x1c, 0x6c00); + bnx2_read_phy(bp, 0x1c, &val); + bnx2_write_phy(bp, 0x1c, (val & 0x3ff) | 0xec02); + } + else { + u32 val; + + bnx2_write_phy(bp, 0x18, 0x7); + bnx2_read_phy(bp, 0x18, &val); + bnx2_write_phy(bp, 0x18, val & ~0x4007); + + bnx2_write_phy(bp, 0x1c, 0x6c00); + bnx2_read_phy(bp, 0x1c, &val); + bnx2_write_phy(bp, 0x1c, (val & 0x3fd) | 0xec00); + } + + return 0; +} + +static int +bnx2_init_copper_phy(struct bnx2 *bp, int reset_phy) +{ + u32 val; + + if (reset_phy) + bnx2_reset_phy(bp); + + if (bp->phy_flags & BNX2_PHY_FLAG_CRC_FIX) { + bnx2_write_phy(bp, 0x18, 0x0c00); + bnx2_write_phy(bp, 0x17, 0x000a); + bnx2_write_phy(bp, 0x15, 0x310b); + bnx2_write_phy(bp, 0x17, 0x201f); + bnx2_write_phy(bp, 0x15, 0x9506); + bnx2_write_phy(bp, 0x17, 0x401f); + bnx2_write_phy(bp, 0x15, 0x14e2); + bnx2_write_phy(bp, 0x18, 0x0400); + } + + if (bp->phy_flags & BNX2_PHY_FLAG_DIS_EARLY_DAC) { + bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, + MII_BNX2_DSP_EXPAND_REG | 0x8); + bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &val); + val &= ~(1 << 8); + bnx2_write_phy(bp, MII_BNX2_DSP_RW_PORT, val); + } + + if (bp->dev->mtu > 1500) { + /* Set extended packet length bit */ + bnx2_write_phy(bp, 0x18, 0x7); + bnx2_read_phy(bp, 0x18, &val); + bnx2_write_phy(bp, 0x18, val | 0x4000); + + bnx2_read_phy(bp, 0x10, &val); + bnx2_write_phy(bp, 0x10, val | 0x1); + } + else { + bnx2_write_phy(bp, 0x18, 0x7); + bnx2_read_phy(bp, 0x18, &val); + bnx2_write_phy(bp, 0x18, val & ~0x4007); + + bnx2_read_phy(bp, 0x10, &val); + bnx2_write_phy(bp, 0x10, val & ~0x1); + } + + /* ethernet@wirespeed */ + bnx2_write_phy(bp, 0x18, 0x7007); + bnx2_read_phy(bp, 0x18, &val); + bnx2_write_phy(bp, 0x18, val | (1 << 15) | (1 << 4)); + return 0; +} + + +static int +bnx2_init_phy(struct bnx2 *bp, int reset_phy) +__releases(&bp->phy_lock) +__acquires(&bp->phy_lock) +{ + u32 val; + int rc = 0; + + bp->phy_flags &= ~BNX2_PHY_FLAG_INT_MODE_MASK; + bp->phy_flags |= BNX2_PHY_FLAG_INT_MODE_LINK_READY; + + bp->mii_bmcr = MII_BMCR; + bp->mii_bmsr = MII_BMSR; + bp->mii_bmsr1 = MII_BMSR; + bp->mii_adv = MII_ADVERTISE; + bp->mii_lpa = MII_LPA; + + REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK); + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + goto setup_phy; + + bnx2_read_phy(bp, MII_PHYSID1, &val); + bp->phy_id = val << 16; + bnx2_read_phy(bp, MII_PHYSID2, &val); + bp->phy_id |= val & 0xffff; + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + if (CHIP_NUM(bp) == CHIP_NUM_5706) + rc = bnx2_init_5706s_phy(bp, reset_phy); + else if (CHIP_NUM(bp) == CHIP_NUM_5708) + rc = bnx2_init_5708s_phy(bp, reset_phy); + else if (CHIP_NUM(bp) == CHIP_NUM_5709) + rc = bnx2_init_5709s_phy(bp, reset_phy); + } + else { + rc = bnx2_init_copper_phy(bp, reset_phy); + } + +setup_phy: + if (!rc) + rc = bnx2_setup_phy(bp, bp->phy_port); + + return rc; +} + +static int +bnx2_set_mac_loopback(struct bnx2 *bp) +{ + u32 mac_mode; + + mac_mode = REG_RD(bp, BNX2_EMAC_MODE); + mac_mode &= ~BNX2_EMAC_MODE_PORT; + mac_mode |= BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK; + REG_WR(bp, BNX2_EMAC_MODE, mac_mode); + bp->link_up = 1; + return 0; +} + +static int bnx2_test_link(struct bnx2 *); + +static int +bnx2_set_phy_loopback(struct bnx2 *bp) +{ + u32 mac_mode; + int rc, i; + + spin_lock_bh(&bp->phy_lock); + rc = bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK | BMCR_FULLDPLX | + BMCR_SPEED1000); + spin_unlock_bh(&bp->phy_lock); + if (rc) + return rc; + + for (i = 0; i < 10; i++) { + if (bnx2_test_link(bp) == 0) + break; + bnx2_msleep(100); + } + + mac_mode = REG_RD(bp, BNX2_EMAC_MODE); + mac_mode &= ~(BNX2_EMAC_MODE_PORT | BNX2_EMAC_MODE_HALF_DUPLEX | + BNX2_EMAC_MODE_MAC_LOOP | BNX2_EMAC_MODE_FORCE_LINK | + BNX2_EMAC_MODE_25G_MODE); + + mac_mode |= BNX2_EMAC_MODE_PORT_GMII; + REG_WR(bp, BNX2_EMAC_MODE, mac_mode); + bp->link_up = 1; + return 0; +} + +static int +bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int ack, int silent) +{ + int i; + u32 val; + + bp->fw_wr_seq++; + msg_data |= bp->fw_wr_seq; + + bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); + + if (!ack) + return 0; + + /* wait for an acknowledgement. */ + for (i = 0; i < (BNX2_FW_ACK_TIME_OUT_MS / 10); i++) { + bnx2_msleep(10); + + val = bnx2_shmem_rd(bp, BNX2_FW_MB); + + if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ)) + break; + } + if ((msg_data & BNX2_DRV_MSG_DATA) == BNX2_DRV_MSG_DATA_WAIT0) + return 0; + + /* If we timed out, inform the firmware that this is the case. */ + if ((val & BNX2_FW_MSG_ACK) != (msg_data & BNX2_DRV_MSG_SEQ)) { + if (!silent) + printk(KERN_ERR PFX "fw sync timeout, reset code = " + "%x\n", msg_data); + + msg_data &= ~BNX2_DRV_MSG_CODE; + msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT; + + bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); + + return -EBUSY; + } + + if ((val & BNX2_FW_MSG_STATUS_MASK) != BNX2_FW_MSG_STATUS_OK) + return -EIO; + + return 0; +} + +static int +bnx2_init_5709_context(struct bnx2 *bp) +{ + int i, ret = 0; + u32 val; + + val = BNX2_CTX_COMMAND_ENABLED | BNX2_CTX_COMMAND_MEM_INIT | (1 << 12); + val |= (BCM_PAGE_BITS - 8) << 16; + REG_WR(bp, BNX2_CTX_COMMAND, val); + for (i = 0; i < 10; i++) { + val = REG_RD(bp, BNX2_CTX_COMMAND); + if (!(val & BNX2_CTX_COMMAND_MEM_INIT)) + break; + udelay(2); + } + if (val & BNX2_CTX_COMMAND_MEM_INIT) + return -EBUSY; + + for (i = 0; i < bp->ctx_pages; i++) { + int j; + + if (bp->ctx_blk[i]) + memset(bp->ctx_blk[i], 0, BCM_PAGE_SIZE); + else + return -ENOMEM; + + REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA0, + (bp->ctx_blk_mapping[i] & 0xffffffff) | + BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID); + REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_DATA1, + (u64) bp->ctx_blk_mapping[i] >> 32); + REG_WR(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL, i | + BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ); + for (j = 0; j < 10; j++) { + + val = REG_RD(bp, BNX2_CTX_HOST_PAGE_TBL_CTRL); + if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ)) + break; + udelay(5); + } + if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) { + ret = -EBUSY; + break; + } + } + return ret; +} + +static void +bnx2_init_context(struct bnx2 *bp) +{ + u32 vcid; + + vcid = 96; + while (vcid) { + u32 vcid_addr, pcid_addr, offset; + int i; + + vcid--; + + if (CHIP_ID(bp) == CHIP_ID_5706_A0) { + u32 new_vcid; + + vcid_addr = GET_PCID_ADDR(vcid); + if (vcid & 0x8) { + new_vcid = 0x60 + (vcid & 0xf0) + (vcid & 0x7); + } + else { + new_vcid = vcid; + } + pcid_addr = GET_PCID_ADDR(new_vcid); + } + else { + vcid_addr = GET_CID_ADDR(vcid); + pcid_addr = vcid_addr; + } + + for (i = 0; i < (CTX_SIZE / PHY_CTX_SIZE); i++) { + vcid_addr += (i << PHY_CTX_SHIFT); + pcid_addr += (i << PHY_CTX_SHIFT); + + REG_WR(bp, BNX2_CTX_VIRT_ADDR, vcid_addr); + REG_WR(bp, BNX2_CTX_PAGE_TBL, pcid_addr); + + /* Zero out the context. */ + for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) + bnx2_ctx_wr(bp, vcid_addr, offset, 0); + } + } +} + +static int +bnx2_alloc_bad_rbuf(struct bnx2 *bp) +{ + u16 *good_mbuf; + u32 good_mbuf_cnt; + u32 val; + + good_mbuf = kmalloc(512 * sizeof(u16), GFP_KERNEL); + if (good_mbuf == NULL) { + printk(KERN_ERR PFX "Failed to allocate memory in " + "bnx2_alloc_bad_rbuf\n"); + return -ENOMEM; + } + + REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, + BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE); + + good_mbuf_cnt = 0; + + /* Allocate a bunch of mbufs and save the good ones in an array. */ + val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1); + while (val & BNX2_RBUF_STATUS1_FREE_COUNT) { + bnx2_reg_wr_ind(bp, BNX2_RBUF_COMMAND, + BNX2_RBUF_COMMAND_ALLOC_REQ); + + val = bnx2_reg_rd_ind(bp, BNX2_RBUF_FW_BUF_ALLOC); + + val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE; + + /* The addresses with Bit 9 set are bad memory blocks. */ + if (!(val & (1 << 9))) { + good_mbuf[good_mbuf_cnt] = (u16) val; + good_mbuf_cnt++; + } + + val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1); + } + + /* Free the good ones back to the mbuf pool thus discarding + * all the bad ones. */ + while (good_mbuf_cnt) { + good_mbuf_cnt--; + + val = good_mbuf[good_mbuf_cnt]; + val = (val << 9) | val | 1; + + bnx2_reg_wr_ind(bp, BNX2_RBUF_FW_BUF_FREE, val); + } + kfree(good_mbuf); + return 0; +} + +static void +bnx2_set_mac_addr(struct bnx2 *bp, u8 *mac_addr, u32 pos) +{ + u32 val; + + val = (mac_addr[0] << 8) | mac_addr[1]; + + REG_WR(bp, BNX2_EMAC_MAC_MATCH0 + (pos * 8), val); + + val = (mac_addr[2] << 24) | (mac_addr[3] << 16) | + (mac_addr[4] << 8) | mac_addr[5]; + + REG_WR(bp, BNX2_EMAC_MAC_MATCH1 + (pos * 8), val); +} + +static inline int +bnx2_alloc_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index) +{ + dma_addr_t mapping; + struct sw_pg *rx_pg = &rxr->rx_pg_ring[index]; + struct rx_bd *rxbd = + &rxr->rx_pg_desc_ring[RX_RING(index)][RX_IDX(index)]; + struct page *page = alloc_page(GFP_ATOMIC); + + if (!page) + return -ENOMEM; + mapping = pci_map_page(bp->pdev, page, 0, PAGE_SIZE, + PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE >= 0x02061b) + if (pci_dma_mapping_error(bp->pdev, mapping)) { +#else + if (pci_dma_mapping_error(mapping)) { +#endif + __free_page(page); + return -EIO; + } + + rx_pg->page = page; + pci_unmap_addr_set(rx_pg, mapping, mapping); + rxbd->rx_bd_haddr_hi = (u64) mapping >> 32; + rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff; + return 0; +} + +static void +bnx2_free_rx_page(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index) +{ + struct sw_pg *rx_pg = &rxr->rx_pg_ring[index]; + struct page *page = rx_pg->page; + + if (!page) + return; + + pci_unmap_page(bp->pdev, pci_unmap_addr(rx_pg, mapping), PAGE_SIZE, + PCI_DMA_FROMDEVICE); + + __free_page(page); + rx_pg->page = NULL; +} + +static inline int +bnx2_alloc_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, u16 index) +{ + struct sk_buff *skb; + struct sw_bd *rx_buf = &rxr->rx_buf_ring[index]; + dma_addr_t mapping; + struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(index)][RX_IDX(index)]; + unsigned long align; + + skb = netdev_alloc_skb(bp->dev, bp->rx_buf_size); + if (skb == NULL) { + return -ENOMEM; + } + + if (unlikely((align = (unsigned long) skb->data & (BNX2_RX_ALIGN - 1)))) + skb_reserve(skb, BNX2_RX_ALIGN - align); + + mapping = pci_map_single(bp->pdev, skb->data, bp->rx_buf_use_size, + PCI_DMA_FROMDEVICE); +#if (LINUX_VERSION_CODE >= 0x02061b) + if (pci_dma_mapping_error(bp->pdev, mapping)) { +#else + if (pci_dma_mapping_error(mapping)) { +#endif + dev_kfree_skb(skb); + return -EIO; + } + + rx_buf->skb = skb; + pci_unmap_addr_set(rx_buf, mapping, mapping); + + rxbd->rx_bd_haddr_hi = (u64) mapping >> 32; + rxbd->rx_bd_haddr_lo = (u64) mapping & 0xffffffff; + + rxr->rx_prod_bseq += bp->rx_buf_use_size; + + return 0; +} + +static int +bnx2_phy_event_is_set(struct bnx2 *bp, struct bnx2_napi *bnapi, u32 event) +{ + struct status_block *sblk = bnapi->status_blk.msi; + u32 new_link_state, old_link_state; + int is_set = 1; + + new_link_state = sblk->status_attn_bits & event; + old_link_state = sblk->status_attn_bits_ack & event; + if (new_link_state != old_link_state) { + if (new_link_state) + REG_WR(bp, BNX2_PCICFG_STATUS_BIT_SET_CMD, event); + else + REG_WR(bp, BNX2_PCICFG_STATUS_BIT_CLEAR_CMD, event); + } else + is_set = 0; + + return is_set; +} + +static void +bnx2_phy_int(struct bnx2 *bp, struct bnx2_napi *bnapi) +{ + spin_lock(&bp->phy_lock); + + if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_LINK_STATE)) + bnx2_set_link(bp); + if (bnx2_phy_event_is_set(bp, bnapi, STATUS_ATTN_BITS_TIMER_ABORT)) + bnx2_set_remote_link(bp); + + spin_unlock(&bp->phy_lock); + +} + +static inline u16 +bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi) +{ + u16 cons; + + /* Tell compiler that status block fields can change. */ + barrier(); + cons = *bnapi->hw_tx_cons_ptr; + barrier(); + if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT)) + cons++; + return cons; +} + +#if defined(__VMKLNX__) +static int +bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget, + int check_queue) +#else +bnx2_tx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) +#endif +{ + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + u16 hw_cons, sw_cons, sw_ring_cons; +#ifndef BCM_HAVE_MULTI_QUEUE + int tx_pkt = 0; +#else + int tx_pkt = 0, index; + struct netdev_queue *txq; + + index = (bnapi - bp->bnx2_napi); + txq = netdev_get_tx_queue(bp->dev, index); +#endif + + hw_cons = bnx2_get_hw_tx_cons(bnapi); + sw_cons = txr->tx_cons; + + while (sw_cons != hw_cons) { + struct sw_tx_bd *tx_buf; + struct sk_buff *skb; + int i, last; + + sw_ring_cons = TX_RING_IDX(sw_cons); + + tx_buf = &txr->tx_buf_ring[sw_ring_cons]; + skb = tx_buf->skb; + + /* prefetch skb_end_pointer() to speedup skb_shinfo(skb) */ + prefetch(&skb->end); + +#ifdef BCM_TSO + /* partial BD completions possible with TSO packets */ + if (tx_buf->is_gso) { + u16 last_idx, last_ring_idx; + + last_idx = sw_cons + tx_buf->nr_frags + 1; + last_ring_idx = sw_ring_cons + tx_buf->nr_frags + 1; + if (unlikely(last_ring_idx >= MAX_TX_DESC_CNT)) { + last_idx++; + } + if (((s16) ((s16) last_idx - (s16) hw_cons)) > 0) { + break; + } + } +#endif + pci_unmap_single(bp->pdev, pci_unmap_addr(tx_buf, mapping), + skb_headlen(skb), PCI_DMA_TODEVICE); + + tx_buf->skb = NULL; + last = tx_buf->nr_frags; + + for (i = 0; i < last; i++) { + sw_cons = NEXT_TX_BD(sw_cons); + + pci_unmap_page(bp->pdev, + pci_unmap_addr( + &txr->tx_buf_ring[TX_RING_IDX(sw_cons)], + mapping), + skb_shinfo(skb)->frags[i].size, + PCI_DMA_TODEVICE); + } + + sw_cons = NEXT_TX_BD(sw_cons); + barrier(); + + dev_kfree_skb(skb); +#if defined(BNX2_ENABLE_NETQUEUE) + bnapi->stats.tx_packets++; + bnapi->stats.tx_bytes += skb->len; + bnapi->tx_packets_processed++; + wmb(); +#endif + tx_pkt++; + if (tx_pkt == budget) + break; + + if (hw_cons == sw_cons) + hw_cons = bnx2_get_hw_tx_cons(bnapi); + } + + txr->hw_tx_cons = hw_cons; + txr->tx_cons = sw_cons; + + /* Need to make the tx_cons update visible to bnx2_start_xmit() + * before checking for netif_tx_queue_stopped(). Without the + * memory barrier, there is a small possibility that bnx2_start_xmit() + * will miss it and cause the queue to be stopped forever. + */ + smp_mb(); + +#if defined(BNX2_ENABLE_NETQUEUE) + if ((!check_queue) || (bp->netq_state & BNX2_NETQ_SUSPENDED)) + return tx_pkt; +#endif + +#ifndef BCM_HAVE_MULTI_QUEUE + if (unlikely(netif_queue_stopped(bp->dev)) && + (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) { + netif_tx_lock(bp->dev); + if ((netif_queue_stopped(bp->dev)) && + (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) + netif_wake_queue(bp->dev); + netif_tx_unlock(bp->dev); + } +#else + if (unlikely(netif_tx_queue_stopped(txq)) && + (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) { + __netif_tx_lock(txq, smp_processor_id()); + if ((netif_tx_queue_stopped(txq)) && + (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh)) + netif_tx_wake_queue(txq); + __netif_tx_unlock(txq); + } +#endif + return tx_pkt; +} + +static void +bnx2_reuse_rx_skb_pages(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, + struct sk_buff *skb, int count) +{ + struct sw_pg *cons_rx_pg, *prod_rx_pg; + struct rx_bd *cons_bd, *prod_bd; + int i; + u16 hw_prod, prod; + u16 cons = rxr->rx_pg_cons; + + cons_rx_pg = &rxr->rx_pg_ring[cons]; + + /* The caller was unable to allocate a new page to replace the + * last one in the frags array, so we need to recycle that page + * and then free the skb. + */ + if (skb) { + struct page *page; + struct skb_shared_info *shinfo; + + shinfo = skb_shinfo(skb); + shinfo->nr_frags--; + page = shinfo->frags[shinfo->nr_frags].page; + shinfo->frags[shinfo->nr_frags].page = NULL; + + cons_rx_pg->page = page; + dev_kfree_skb(skb); + } + + hw_prod = rxr->rx_pg_prod; + + for (i = 0; i < count; i++) { + prod = RX_PG_RING_IDX(hw_prod); + + prod_rx_pg = &rxr->rx_pg_ring[prod]; + cons_rx_pg = &rxr->rx_pg_ring[cons]; + cons_bd = &rxr->rx_pg_desc_ring[RX_RING(cons)][RX_IDX(cons)]; + prod_bd = &rxr->rx_pg_desc_ring[RX_RING(prod)][RX_IDX(prod)]; + + if (prod != cons) { + prod_rx_pg->page = cons_rx_pg->page; + cons_rx_pg->page = NULL; + pci_unmap_addr_set(prod_rx_pg, mapping, + pci_unmap_addr(cons_rx_pg, mapping)); + + prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi; + prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo; + + } + cons = RX_PG_RING_IDX(NEXT_RX_BD(cons)); + hw_prod = NEXT_RX_BD(hw_prod); + } + rxr->rx_pg_prod = hw_prod; + rxr->rx_pg_cons = cons; +} + +static inline void +bnx2_reuse_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, + struct sk_buff *skb, u16 cons, u16 prod) +{ + struct sw_bd *cons_rx_buf, *prod_rx_buf; + struct rx_bd *cons_bd, *prod_bd; + + cons_rx_buf = &rxr->rx_buf_ring[cons]; + prod_rx_buf = &rxr->rx_buf_ring[prod]; + + pci_dma_sync_single_for_device(bp->pdev, + pci_unmap_addr(cons_rx_buf, mapping), + BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, PCI_DMA_FROMDEVICE); + + rxr->rx_prod_bseq += bp->rx_buf_use_size; + + prod_rx_buf->skb = skb; + + if (cons == prod) + return; + + pci_unmap_addr_set(prod_rx_buf, mapping, + pci_unmap_addr(cons_rx_buf, mapping)); + + cons_bd = &rxr->rx_desc_ring[RX_RING(cons)][RX_IDX(cons)]; + prod_bd = &rxr->rx_desc_ring[RX_RING(prod)][RX_IDX(prod)]; + prod_bd->rx_bd_haddr_hi = cons_bd->rx_bd_haddr_hi; + prod_bd->rx_bd_haddr_lo = cons_bd->rx_bd_haddr_lo; +} + +static int +bnx2_rx_skb(struct bnx2 *bp, struct bnx2_rx_ring_info *rxr, struct sk_buff *skb, + unsigned int len, unsigned int hdr_len, dma_addr_t dma_addr, + u32 ring_idx) +{ + int err; + u16 prod = ring_idx & 0xffff; + + err = bnx2_alloc_rx_skb(bp, rxr, prod); + if (unlikely(err)) { + bnx2_reuse_rx_skb(bp, rxr, skb, (u16) (ring_idx >> 16), prod); + if (hdr_len) { + unsigned int raw_len = len + 4; + int pages = PAGE_ALIGN(raw_len - hdr_len) >> PAGE_SHIFT; + + bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages); + } + return err; + } + + skb_reserve(skb, BNX2_RX_OFFSET); + pci_unmap_single(bp->pdev, dma_addr, bp->rx_buf_use_size, + PCI_DMA_FROMDEVICE); + + if (hdr_len == 0) { + skb_put(skb, len); + return 0; + } else { + unsigned int i, frag_len, frag_size, pages; + struct sw_pg *rx_pg; + u16 pg_cons = rxr->rx_pg_cons; + u16 pg_prod = rxr->rx_pg_prod; + + frag_size = len + 4 - hdr_len; + pages = PAGE_ALIGN(frag_size) >> PAGE_SHIFT; + skb_put(skb, hdr_len); + + for (i = 0; i < pages; i++) { + dma_addr_t mapping_old; + + frag_len = min(frag_size, (unsigned int) PAGE_SIZE); + if (unlikely(frag_len <= 4)) { + unsigned int tail = 4 - frag_len; + + rxr->rx_pg_cons = pg_cons; + rxr->rx_pg_prod = pg_prod; + bnx2_reuse_rx_skb_pages(bp, rxr, NULL, + pages - i); + skb->len -= tail; + if (i == 0) { + skb->tail -= tail; + } else { + skb_frag_t *frag = + &skb_shinfo(skb)->frags[i - 1]; + frag->size -= tail; + skb->data_len -= tail; + skb->truesize -= tail; + } + return 0; + } + rx_pg = &rxr->rx_pg_ring[pg_cons]; + + /* Don't unmap yet. If we're unable to allocate a new + * page, we need to recycle the page and the DMA addr. + */ + mapping_old = pci_unmap_addr(rx_pg, mapping); + if (i == pages - 1) + frag_len -= 4; + + bnx2_skb_fill_page_desc(skb, i, rx_pg->page, 0, + frag_len); + rx_pg->page = NULL; + + err = bnx2_alloc_rx_page(bp, rxr, + RX_PG_RING_IDX(pg_prod)); + if (unlikely(err)) { + rxr->rx_pg_cons = pg_cons; + rxr->rx_pg_prod = pg_prod; + bnx2_reuse_rx_skb_pages(bp, rxr, skb, + pages - i); + return err; + } + + pci_unmap_page(bp->pdev, mapping_old, + PAGE_SIZE, PCI_DMA_FROMDEVICE); + + frag_size -= frag_len; + skb->data_len += frag_len; + skb->truesize += frag_len; + skb->len += frag_len; + + pg_prod = NEXT_RX_BD(pg_prod); + pg_cons = RX_PG_RING_IDX(NEXT_RX_BD(pg_cons)); + } + rxr->rx_pg_prod = pg_prod; + rxr->rx_pg_cons = pg_cons; + } + return 0; +} + +static inline u16 +bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi) +{ + u16 cons; + + /* Tell compiler that status block fields can change. */ + barrier(); + cons = *bnapi->hw_rx_cons_ptr; + barrier(); + if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT)) + cons++; + return cons; +} + +static int +bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) +{ + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + u16 hw_cons, sw_cons, sw_ring_cons, sw_prod, sw_ring_prod; + struct l2_fhdr *rx_hdr; + int rx_pkt = 0, pg_ring_used = 0; +#if defined(BNX2_ENABLE_NETQUEUE) + int index = (bnapi - bp->bnx2_napi); +#endif + + hw_cons = bnx2_get_hw_rx_cons(bnapi); + sw_cons = rxr->rx_cons; + sw_prod = rxr->rx_prod; + + /* Memory barrier necessary as speculative reads of the rx + * buffer can be ahead of the index in the status block + */ + rmb(); + while (sw_cons != hw_cons) { + unsigned int len, hdr_len; + u32 status; + struct sw_bd *rx_buf; + struct sk_buff *skb; + dma_addr_t dma_addr; + u16 vtag = 0; + int hw_vlan __maybe_unused = 0; + + sw_ring_cons = RX_RING_IDX(sw_cons); + sw_ring_prod = RX_RING_IDX(sw_prod); + + rx_buf = &rxr->rx_buf_ring[sw_ring_cons]; + skb = rx_buf->skb; + + rx_buf->skb = NULL; + + dma_addr = pci_unmap_addr(rx_buf, mapping); + + pci_dma_sync_single_for_cpu(bp->pdev, dma_addr, + BNX2_RX_OFFSET + BNX2_RX_COPY_THRESH, + PCI_DMA_FROMDEVICE); + + rx_hdr = (struct l2_fhdr *) skb->data; + len = rx_hdr->l2_fhdr_pkt_len; + status = rx_hdr->l2_fhdr_status; + + hdr_len = 0; + if (status & L2_FHDR_STATUS_SPLIT) { + hdr_len = rx_hdr->l2_fhdr_ip_xsum; + pg_ring_used = 1; + } else if (len > bp->rx_jumbo_thresh) { + hdr_len = bp->rx_jumbo_thresh; + pg_ring_used = 1; + } + + if (unlikely(status & (L2_FHDR_ERRORS_BAD_CRC | + L2_FHDR_ERRORS_PHY_DECODE | + L2_FHDR_ERRORS_ALIGNMENT | + L2_FHDR_ERRORS_TOO_SHORT | + L2_FHDR_ERRORS_GIANT_FRAME))) { + +#if defined(BNX2_ENABLE_NETQUEUE) + bnapi->stats.rx_errors++; + + if (status & L2_FHDR_ERRORS_BAD_CRC) + bnapi->stats.rx_crc_errors++; + + if (status & + (L2_FHDR_ERRORS_TOO_SHORT | + L2_FHDR_ERRORS_GIANT_FRAME)) + bnapi->stats.rx_frame_errors++; +#endif + + bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, + sw_ring_prod); + if (pg_ring_used) { + int pages; + + pages = PAGE_ALIGN(len - hdr_len) >> PAGE_SHIFT; + + bnx2_reuse_rx_skb_pages(bp, rxr, NULL, pages); + } + goto next_rx; + } + + len -= 4; + + if (len <= bp->rx_copy_thresh) { + struct sk_buff *new_skb; + + new_skb = netdev_alloc_skb(bp->dev, len + 6); + if (new_skb == NULL) { + bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, + sw_ring_prod); + goto next_rx; + } + + /* aligned copy */ +#if (LINUX_VERSION_CODE >= 0x20616) + skb_copy_from_linear_data_offset(skb, + BNX2_RX_OFFSET - 6, + new_skb->data, len + 6); +#else + memcpy(new_skb->data, skb->data + BNX2_RX_OFFSET - 6, + len + 6); +#endif + + skb_reserve(new_skb, 6); + skb_put(new_skb, len); + + bnx2_reuse_rx_skb(bp, rxr, skb, + sw_ring_cons, sw_ring_prod); + + skb = new_skb; + } else if (unlikely(bnx2_rx_skb(bp, rxr, skb, len, hdr_len, + dma_addr, (sw_ring_cons << 16) | sw_ring_prod))) + goto next_rx; + + if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && + !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) { + vtag = rx_hdr->l2_fhdr_vlan_tag; +#ifdef BCM_VLAN + if (bp->vlgrp) + hw_vlan = 1; + else +#endif + { + struct vlan_ethhdr *ve = (struct vlan_ethhdr *) + __skb_push(skb, 4); + + bcm_memmove(ve, skb->data + 4, ETH_ALEN * 2); + ve->h_vlan_proto = htons(ETH_P_8021Q); + ve->h_vlan_TCI = htons(vtag); + len += 4; + } + } + + skb->protocol = eth_type_trans(skb, bp->dev); + + if ((len > (bp->dev->mtu + ETH_HLEN)) && + (ntohs(skb->protocol) != 0x8100)) { + + dev_kfree_skb(skb); + goto next_rx; + + } + + skb->ip_summed = CHECKSUM_NONE; + if (bp->rx_csum && + (status & (L2_FHDR_STATUS_TCP_SEGMENT | + L2_FHDR_STATUS_UDP_DATAGRAM))) { + + if (likely((status & (L2_FHDR_ERRORS_TCP_XSUM | + L2_FHDR_ERRORS_UDP_XSUM)) == 0)) + skb->ip_summed = CHECKSUM_UNNECESSARY; + } + + skb_record_rx_queue(skb, bnapi - &bp->bnx2_napi[0]); + +#if defined(BNX2_ENABLE_NETQUEUE) + vmknetddi_queueops_set_skb_queueid(skb, + VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(index)); +#endif + +#ifdef BCM_VLAN + if (hw_vlan) + vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag); + else +#endif + netif_receive_skb(skb); + +#if (LINUX_VERSION_CODE < 0x02061b) || defined(__VMKLNX__) + bp->dev->last_rx = jiffies; +#endif + rx_pkt++; + +#if defined(BNX2_ENABLE_NETQUEUE) + /* Update queue specific stats */ + bnapi->stats.rx_packets++; + bnapi->stats.rx_bytes += len; +#endif + +next_rx: + sw_cons = NEXT_RX_BD(sw_cons); + sw_prod = NEXT_RX_BD(sw_prod); + + if ((rx_pkt == budget)) + break; + + /* Refresh hw_cons to see if there is new work */ + if (sw_cons == hw_cons) { + hw_cons = bnx2_get_hw_rx_cons(bnapi); + rmb(); + } + } + rxr->rx_cons = sw_cons; + rxr->rx_prod = sw_prod; + + if (pg_ring_used) + REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); + + REG_WR16(bp, rxr->rx_bidx_addr, sw_prod); + + REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq); + + mmiowb(); + + return rx_pkt; + +} + +#ifdef CONFIG_PCI_MSI +/* MSI ISR - The only difference between this and the INTx ISR + * is that the MSI interrupt is always serviced. + */ +static irqreturn_t +#if (LINUX_VERSION_CODE >= 0x20613) +bnx2_msi(int irq, void *dev_instance) +#else +bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs) +#endif +{ + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; + + prefetch(bnapi->status_blk.msi); + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT); + + /* Return here if interrupt is disabled. */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +#ifdef BNX2_NEW_NAPI + napi_schedule(&bnapi->napi); +#else + netif_rx_schedule(bp->dev); +#endif + + return IRQ_HANDLED; +} + +static irqreturn_t +#if (LINUX_VERSION_CODE >= 0x20613) +bnx2_msi_1shot(int irq, void *dev_instance) +#else +bnx2_msi_1shot(int irq, void *dev_instance, struct pt_regs *regs) +#endif +{ + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; + + prefetch(bnapi->status_blk.msi); + + /* Return here if interrupt is disabled. */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +#ifdef BNX2_NEW_NAPI + napi_schedule(&bnapi->napi); +#else + netif_rx_schedule(bp->dev); +#endif + + return IRQ_HANDLED; +} +#endif + +static irqreturn_t +#if (LINUX_VERSION_CODE >= 0x20613) +bnx2_interrupt(int irq, void *dev_instance) +#else +bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +#endif +{ + struct bnx2_napi *bnapi = dev_instance; + struct bnx2 *bp = bnapi->bp; + struct status_block *sblk = bnapi->status_blk.msi; + + /* When using INTx, it is possible for the interrupt to arrive + * at the CPU before the status block posted prior to the + * interrupt. Reading a register will flush the status block. + * When using MSI, the MSI message will always complete after + * the status block write. + */ + if ((sblk->status_idx == bnapi->last_status_idx) && + (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & + BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) + return IRQ_NONE; + + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT); + + /* Read back to deassert IRQ immediately to avoid too many + * spurious interrupts. + */ + REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD); + + /* Return here if interrupt is shared and is disabled. */ + if (unlikely(atomic_read(&bp->intr_sem) != 0)) + return IRQ_HANDLED; + +#ifdef BNX2_NEW_NAPI + if (napi_schedule_prep(&bnapi->napi)) { + bnapi->last_status_idx = sblk->status_idx; + __napi_schedule(&bnapi->napi); + } +#else + if (netif_rx_schedule_prep(bp->dev)) { + bnapi->last_status_idx = sblk->status_idx; + __netif_rx_schedule(bp->dev); + } +#endif + + return IRQ_HANDLED; +} + +static inline int +bnx2_has_fast_work(struct bnx2_napi *bnapi) +{ + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + + if ((bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) || + (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons)) + return 1; + return 0; +} + +#define STATUS_ATTN_EVENTS (STATUS_ATTN_BITS_LINK_STATE | \ + STATUS_ATTN_BITS_TIMER_ABORT) + +static inline int +bnx2_has_work(struct bnx2_napi *bnapi) +{ + struct status_block *sblk = bnapi->status_blk.msi; + + if (bnx2_has_fast_work(bnapi)) + return 1; + +#ifdef BCM_CNIC + if (bnapi->cnic_present && (bnapi->cnic_tag != sblk->status_idx)) + return 1; +#endif + + if ((sblk->status_attn_bits & STATUS_ATTN_EVENTS) != + (sblk->status_attn_bits_ack & STATUS_ATTN_EVENTS)) + return 1; + + return 0; +} + +#ifdef CONFIG_PCI_MSI +static void +bnx2_chk_missed_msi(struct bnx2 *bp) +{ + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + u32 msi_ctrl; + + if (bnx2_has_work(bnapi)) { + msi_ctrl = REG_RD(bp, BNX2_PCICFG_MSI_CONTROL); + if (!(msi_ctrl & BNX2_PCICFG_MSI_CONTROL_ENABLE)) + return; + + if (bnapi->last_status_idx == bp->idle_chk_status_idx) { + REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl & + ~BNX2_PCICFG_MSI_CONTROL_ENABLE); + REG_WR(bp, BNX2_PCICFG_MSI_CONTROL, msi_ctrl); +#if (LINUX_VERSION_CODE >= 0x20613) + bnx2_msi(bp->irq_tbl[0].vector, bnapi); +#else + bnx2_msi(bp->irq_tbl[0].vector, bnapi, NULL); +#endif + } + } + + bp->idle_chk_status_idx = bnapi->last_status_idx; +} +#endif + +#ifdef BCM_CNIC +static void bnx2_poll_cnic(struct bnx2 *bp, struct bnx2_napi *bnapi) +{ + struct cnic_ops *c_ops; + + if (!bnapi->cnic_present) + return; + + rcu_read_lock(); + c_ops = rcu_dereference(bp->cnic_ops); + if (c_ops) + bnapi->cnic_tag = c_ops->cnic_handler(bp->cnic_data, + bnapi->status_blk.msi); + rcu_read_unlock(); +} +#endif + +#ifdef BNX2_NEW_NAPI +static void bnx2_poll_link(struct bnx2 *bp, struct bnx2_napi *bnapi) +{ + struct status_block *sblk = bnapi->status_blk.msi; + u32 status_attn_bits = sblk->status_attn_bits; + u32 status_attn_bits_ack = sblk->status_attn_bits_ack; + + if ((status_attn_bits & STATUS_ATTN_EVENTS) != + (status_attn_bits_ack & STATUS_ATTN_EVENTS)) { + + bnx2_phy_int(bp, bnapi); + + /* This is needed to take care of transient status + * during link changes. + */ + REG_WR(bp, BNX2_HC_COMMAND, + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); + REG_RD(bp, BNX2_HC_COMMAND); + } +} + +static int bnx2_poll_work(struct bnx2 *bp, struct bnx2_napi *bnapi, + int work_done, int budget) +{ + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + + if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons) +#if defined(__VMKLNX__) + bnx2_tx_int(bp, bnapi, 0, 1); +#else + bnx2_tx_int(bp, bnapi, 0); +#endif + + if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) + work_done += bnx2_rx_int(bp, bnapi, budget - work_done); + + wmb(); + return work_done; +} + +static int bnx2_poll_msix(struct napi_struct *napi, int budget) +{ + struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi); + struct bnx2 *bp = bnapi->bp; + int work_done = 0; + struct status_block_msix *sblk = bnapi->status_blk.msix; + + while (1) { + work_done = bnx2_poll_work(bp, bnapi, work_done, budget); + if (unlikely(work_done >= budget)) + break; + + bnapi->last_status_idx = sblk->status_idx; + /* status idx must be read before checking for more work. */ + rmb(); + if (likely(!bnx2_has_fast_work(bnapi))) { + + napi_complete(napi); + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, bnapi->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + break; + } + } + return work_done; +} + +static int bnx2_poll(struct napi_struct *napi, int budget) +{ + struct bnx2_napi *bnapi = container_of(napi, struct bnx2_napi, napi); + struct bnx2 *bp = bnapi->bp; + int work_done = 0; + struct status_block *sblk = bnapi->status_blk.msi; + + while (1) { + bnx2_poll_link(bp, bnapi); + + work_done = bnx2_poll_work(bp, bnapi, work_done, budget); + +#if defined(BNX2_ENABLE_NETQUEUE) + if (bnx2_netqueue_is_avail(bp) && + (bp->netq_state & BNX2_NETQ_HW_STARTED)) + bnx2_netqueue_service_bnx2_msix(bnapi); +#endif + +#ifdef BCM_CNIC + bnx2_poll_cnic(bp, bnapi); +#endif + + /* bnapi->last_status_idx is used below to tell the hw how + * much work has been processed, so we must read it before + * checking for more work. + */ + bnapi->last_status_idx = sblk->status_idx; + + if (unlikely(work_done >= budget)) + break; + + rmb(); + if (likely(!bnx2_has_work(bnapi))) { + napi_complete(napi); + if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) { + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + break; + } + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT | + bnapi->last_status_idx); + + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + break; + } + } + + return work_done; +} + +#else + +static int +bnx2_poll(struct net_device *dev, int *budget) +{ + struct bnx2 *bp = netdev_priv(dev); + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + struct status_block *sblk = bnapi->status_blk.msi; + u32 status_attn_bits = sblk->status_attn_bits; + u32 status_attn_bits_ack = sblk->status_attn_bits_ack; + + if ((status_attn_bits & STATUS_ATTN_EVENTS) != + (status_attn_bits_ack & STATUS_ATTN_EVENTS)) { + + bnx2_phy_int(bp, bnapi); + + /* This is needed to take care of transient status + * during link changes. + */ + REG_WR(bp, BNX2_HC_COMMAND, + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); + REG_RD(bp, BNX2_HC_COMMAND); + } + + if (bnx2_get_hw_tx_cons(bnapi) != txr->hw_tx_cons) +#if defined(__VMKLNX__) + bnx2_tx_int(bp, bnapi, 0, 1); +#else + bnx2_tx_int(bp, bnapi, 0); +#endif + + if (bnx2_get_hw_rx_cons(bnapi) != rxr->rx_cons) { + int orig_budget = *budget; + int work_done; + + if (orig_budget > dev->quota) + orig_budget = dev->quota; + + work_done = bnx2_rx_int(bp, bnapi, orig_budget); + *budget -= work_done; + dev->quota -= work_done; + } + +#ifdef BCM_CNIC + bnx2_poll_cnic(bp, bnapi); +#endif + + bnapi->last_status_idx = sblk->status_idx; + rmb(); + + if (!bnx2_has_work(bnapi)) { + netif_rx_complete(dev); + if (likely(bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX)) { + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + return 0; + } + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT | + bnapi->last_status_idx); + + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | + bnapi->last_status_idx); + return 0; + } + + return 1; +} +#endif + +/* Called with rtnl_lock from vlan functions and also netif_tx_lock + * from set_multicast. + */ +static void +bnx2_set_rx_mode(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + u32 rx_mode, sort_mode; +#ifdef HAVE_SET_RX_MODE +#if (LINUX_VERSION_CODE >= 0x2061f) + struct netdev_hw_addr *ha; +#else + struct dev_addr_list *uc_ptr; +#endif +#endif + int i; + + if (!netif_running(dev)) + return; + + spin_lock_bh(&bp->phy_lock); + + rx_mode = bp->rx_mode & ~(BNX2_EMAC_RX_MODE_PROMISCUOUS | + BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); + sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; +#ifdef BCM_VLAN + if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)) + rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; +#else + if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) + rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; +#endif + if (dev->flags & IFF_PROMISC) { + /* Promiscuous mode. */ + rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; + sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN | + BNX2_RPM_SORT_USER0_PROM_VLAN; + } + else if (dev->flags & IFF_ALLMULTI) { + for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { + REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), + 0xffffffff); + } + sort_mode |= BNX2_RPM_SORT_USER0_MC_EN; + } + else { + /* Accept one or more multicast(s). */ + struct dev_mc_list *mclist; + u32 mc_filter[NUM_MC_HASH_REGISTERS]; + u32 regidx; + u32 bit; + u32 crc; + + memset(mc_filter, 0, 4 * NUM_MC_HASH_REGISTERS); + + for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; + i++, mclist = mclist->next) { + + crc = ether_crc_le(ETH_ALEN, mclist->dmi_addr); + bit = crc & 0xff; + regidx = (bit & 0xe0) >> 5; + bit &= 0x1f; + mc_filter[regidx] |= (1 << bit); + } + + for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { + REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), + mc_filter[i]); + } + + sort_mode |= BNX2_RPM_SORT_USER0_MC_HSH_EN; + } + +#ifdef HAVE_SET_RX_MODE +#if (LINUX_VERSION_CODE < 0x2061f) + if (dev->uc_count > BNX2_MAX_UNICAST_ADDRESSES) { +#else + if (dev->uc.count > BNX2_MAX_UNICAST_ADDRESSES) { +#endif + rx_mode |= BNX2_EMAC_RX_MODE_PROMISCUOUS; + sort_mode |= BNX2_RPM_SORT_USER0_PROM_EN | + BNX2_RPM_SORT_USER0_PROM_VLAN; + } else if (!(dev->flags & IFF_PROMISC)) { +#if (LINUX_VERSION_CODE < 0x2061f) + uc_ptr = dev->uc_list; + + /* Add all entries into to the match filter list */ + for (i = 0; i < dev->uc_count; i++) { + bnx2_set_mac_addr(bp, uc_ptr->da_addr, + i + BNX2_START_UNICAST_ADDRESS_INDEX); + sort_mode |= (1 << + (i + BNX2_START_UNICAST_ADDRESS_INDEX)); + uc_ptr = uc_ptr->next; + } +#else + i = 0; + list_for_each_entry(ha, &dev->uc.list, list) { + bnx2_set_mac_addr(bp, ha->addr, + i + BNX2_START_UNICAST_ADDRESS_INDEX); + sort_mode |= (1 << + (i + BNX2_START_UNICAST_ADDRESS_INDEX)); + i++; + } +#endif + } +#endif + + if (rx_mode != bp->rx_mode) { + bp->rx_mode = rx_mode; + REG_WR(bp, BNX2_EMAC_RX_MODE, rx_mode); + } + + REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0); + REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode); + REG_WR(bp, BNX2_RPM_SORT_USER0, sort_mode | BNX2_RPM_SORT_USER0_ENA); + + spin_unlock_bh(&bp->phy_lock); +} + +#define FW_BUF_SIZE 0x10000 + +static int +bnx2_gunzip_init(struct bnx2 *bp) +{ + if ((bp->gunzip_buf = vmalloc(FW_BUF_SIZE)) == NULL) + goto gunzip_nomem1; + + if ((bp->strm = kmalloc(sizeof(*bp->strm), GFP_KERNEL)) == NULL) + goto gunzip_nomem2; + + bp->strm->workspace = kmalloc(zlib_inflate_workspacesize(), GFP_KERNEL); + if (bp->strm->workspace == NULL) + goto gunzip_nomem3; + + return 0; + +gunzip_nomem3: + kfree(bp->strm); + bp->strm = NULL; + +gunzip_nomem2: + vfree(bp->gunzip_buf); + bp->gunzip_buf = NULL; + +gunzip_nomem1: + printk(KERN_ERR PFX "%s: Cannot allocate firmware buffer for " + "uncompression.\n", bp->dev->name); + return -ENOMEM; +} + +static void +bnx2_gunzip_end(struct bnx2 *bp) +{ + kfree(bp->strm->workspace); + + kfree(bp->strm); + bp->strm = NULL; + + if (bp->gunzip_buf) { + vfree(bp->gunzip_buf); + bp->gunzip_buf = NULL; + } +} + +static int +bnx2_gunzip(struct bnx2 *bp, const u8 *zbuf, + int len, void **outbuf, int *outlen) +{ + int rc; + + bp->strm->next_in = zbuf; + bp->strm->avail_in = len; + bp->strm->next_out = bp->gunzip_buf; + bp->strm->avail_out = FW_BUF_SIZE; + + rc = zlib_inflateInit2(bp->strm, -MAX_WBITS); + if (rc != Z_OK) + return rc; + + rc = zlib_inflate(bp->strm, Z_FINISH); + + *outlen = FW_BUF_SIZE - bp->strm->avail_out; + *outbuf = bp->gunzip_buf; + + if ((rc != Z_OK) && (rc != Z_STREAM_END)) + printk(KERN_ERR PFX "%s: Firmware decompression error: %s\n", + bp->dev->name, bp->strm->msg); + + zlib_inflateEnd(bp->strm); + + if (rc == Z_STREAM_END) + return 0; + + return rc; +} + +#if defined(__VMKLNX__) +struct bnx2_cpus_scratch_debug { + u32 offset; /* Scratch pad offset to firmware version */ + char *name; /* Name of the CPU */ +}; + +#define BNX2_SCRATCH_FW_VERSION_OFFSET 0x10 +#define BNX2_TPAT_SCRATCH_FW_VERSION_OFFSET 0x410 + +static void +bnx2_print_fw_versions(struct bnx2 *bp) +{ + /* Array of the firmware offset's + CPU strings */ + const struct bnx2_cpus_scratch_debug cpus_scratch[] = { + { .offset = BNX2_TXP_SCRATCH + BNX2_SCRATCH_FW_VERSION_OFFSET, + .name = "TXP" }, + { .offset = BNX2_TPAT_SCRATCH + + BNX2_TPAT_SCRATCH_FW_VERSION_OFFSET, + .name = "TPAT" }, + { .offset = BNX2_RXP_SCRATCH + BNX2_SCRATCH_FW_VERSION_OFFSET, + .name = "RXP" }, + { .offset = BNX2_COM_SCRATCH + BNX2_SCRATCH_FW_VERSION_OFFSET, + .name = "COM" }, + { .offset = BNX2_CP_SCRATCH + BNX2_SCRATCH_FW_VERSION_OFFSET, + .name = "CP" }, + /* There is no versioning for MCP firmware */ + }; + int i; + + printk(KERN_INFO "bnx2 %s: CPU fw versions: ", + bp->dev->name); + for (i = 0; i < ARRAY_SIZE(cpus_scratch); i++) { + /* The FW versions are 11 bytes long + 1 extra byte for + * the NULL termination */ + char version[12]; + int j; + + /* Copy 4 bytes at a time */ + for (j = 0; j < sizeof(version); j += 4) { + u32 val; + + val = bnx2_reg_rd_ind(bp, cpus_scratch[i].offset + j); + val = be32_to_cpu(val); + memcpy(&version[j], &val, sizeof(val)); + } + + /* Force a NULL terminiated string */ + version[11] = '\0'; + + printk("%s: '%s' ", cpus_scratch[i].name, version); + } + printk("\n"); +} +#endif + +static u32 +rv2p_fw_fixup(u32 rv2p_proc, int idx, u32 loc, u32 rv2p_code) +{ + switch (idx) { + case RV2P_P1_FIXUP_PAGE_SIZE_IDX: + rv2p_code &= ~RV2P_BD_PAGE_SIZE_MSK; + rv2p_code |= RV2P_BD_PAGE_SIZE; + break; + } + return rv2p_code; +} + +static void +load_rv2p_fw(struct bnx2 *bp, __le32 *rv2p_code, u32 rv2p_code_len, + u32 rv2p_proc, u32 fixup_loc) +{ + __le32 *rv2p_code_start = rv2p_code; + int i; + u32 val, cmd, addr; + + if (rv2p_proc == RV2P_PROC1) { + cmd = BNX2_RV2P_PROC1_ADDR_CMD_RDWR; + addr = BNX2_RV2P_PROC1_ADDR_CMD; + } else { + cmd = BNX2_RV2P_PROC2_ADDR_CMD_RDWR; + addr = BNX2_RV2P_PROC2_ADDR_CMD; + } + + for (i = 0; i < rv2p_code_len; i += 8) { + REG_WR(bp, BNX2_RV2P_INSTR_HIGH, le32_to_cpu(*rv2p_code)); + rv2p_code++; + REG_WR(bp, BNX2_RV2P_INSTR_LOW, le32_to_cpu(*rv2p_code)); + rv2p_code++; + + val = (i / 8) | cmd; + REG_WR(bp, addr, val); + } + + rv2p_code = rv2p_code_start; + if (fixup_loc && ((fixup_loc * 4) < rv2p_code_len)) { + u32 code; + + code = le32_to_cpu(*(rv2p_code + fixup_loc - 1)); + REG_WR(bp, BNX2_RV2P_INSTR_HIGH, code); + code = le32_to_cpu(*(rv2p_code + fixup_loc)); + code = rv2p_fw_fixup(rv2p_proc, 0, fixup_loc, code); + REG_WR(bp, BNX2_RV2P_INSTR_LOW, code); + + val = (fixup_loc / 2) | cmd; + REG_WR(bp, addr, val); + } + + /* Reset the processor, un-stall is done later. */ + if (rv2p_proc == RV2P_PROC1) { + REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC1_RESET); + } + else { + REG_WR(bp, BNX2_RV2P_COMMAND, BNX2_RV2P_COMMAND_PROC2_RESET); + } +} + +static int +load_cpu_fw(struct bnx2 *bp, const struct cpu_reg *cpu_reg, struct fw_info *fw) +{ + u32 offset; + u32 val; + int rc; + + /* Halt the CPU. */ + val = bnx2_reg_rd_ind(bp, cpu_reg->mode); + val |= cpu_reg->mode_value_halt; + bnx2_reg_wr_ind(bp, cpu_reg->mode, val); + bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear); + + /* Load the Text area. */ + offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); + + if (fw->gz_text) { + u32 text_len; + void *text; + + rc = bnx2_gunzip(bp, fw->gz_text, fw->gz_text_len, &text, + &text_len); + if (rc) + return rc; + + fw->text = text; + } + if (fw->text) { + int j; + for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, le32_to_cpu(fw->text[j])); + } + } + + /* Load the Data area. */ + offset = cpu_reg->spad_base + (fw->data_addr - cpu_reg->mips_view_base); + if (fw->data) { + int j; + + for (j = 0; j < (fw->data_len / 4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, fw->data[j]); + } + } + + /* Load the SBSS area. */ + offset = cpu_reg->spad_base + (fw->sbss_addr - cpu_reg->mips_view_base); + if (fw->sbss_len) { + int j; + + for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, 0); + } + } + + /* Load the BSS area. */ + offset = cpu_reg->spad_base + (fw->bss_addr - cpu_reg->mips_view_base); + if (fw->bss_len) { + int j; + + for (j = 0; j < (fw->bss_len/4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, 0); + } + } + + /* Load the Read-Only area. */ + offset = cpu_reg->spad_base + + (fw->rodata_addr - cpu_reg->mips_view_base); + if (fw->rodata) { + int j; + + for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) { + bnx2_reg_wr_ind(bp, offset, fw->rodata[j]); + } + } + + /* Clear the pre-fetch instruction. */ + bnx2_reg_wr_ind(bp, cpu_reg->inst, 0); + bnx2_reg_wr_ind(bp, cpu_reg->pc, fw->start_addr); + + /* Start the CPU. */ + val = bnx2_reg_rd_ind(bp, cpu_reg->mode); + val &= ~cpu_reg->mode_value_halt; + bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear); + bnx2_reg_wr_ind(bp, cpu_reg->mode, val); + + return 0; +} + +static int +bnx2_init_cpus(struct bnx2 *bp) +{ + struct fw_info *fw; + int rc = 0, rv2p_len; + void *text; + const void *rv2p; + u32 text_len, fixup_loc; + + if ((rc = bnx2_gunzip_init(bp)) != 0) + return rc; + + /* Initialize the RV2P processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + if ((CHIP_ID(bp) == CHIP_ID_5709_A0) || + (CHIP_ID(bp) == CHIP_ID_5709_A1)) { + rv2p = bnx2_xi90_rv2p_proc1; + rv2p_len = sizeof(bnx2_xi90_rv2p_proc1); + fixup_loc = XI90_RV2P_PROC1_MAX_BD_PAGE_LOC; + } else { + rv2p = bnx2_xi_rv2p_proc1; + rv2p_len = sizeof(bnx2_xi_rv2p_proc1); + fixup_loc = XI_RV2P_PROC1_MAX_BD_PAGE_LOC; + } + } else { + rv2p = bnx2_rv2p_proc1; + rv2p_len = sizeof(bnx2_rv2p_proc1); + fixup_loc = RV2P_PROC1_MAX_BD_PAGE_LOC; + } + rc = bnx2_gunzip(bp, rv2p, rv2p_len, &text, &text_len); + if (rc) + goto init_cpu_err; + + load_rv2p_fw(bp, text, text_len, RV2P_PROC1, fixup_loc); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + if ((CHIP_ID(bp) == CHIP_ID_5709_A0) || + (CHIP_ID(bp) == CHIP_ID_5709_A1)) { + rv2p = bnx2_xi90_rv2p_proc2; + rv2p_len = sizeof(bnx2_xi90_rv2p_proc2); + fixup_loc = XI90_RV2P_PROC2_MAX_BD_PAGE_LOC; + } else { + rv2p = bnx2_xi_rv2p_proc2; + rv2p_len = sizeof(bnx2_xi_rv2p_proc2); + fixup_loc = XI_RV2P_PROC2_MAX_BD_PAGE_LOC; + } + } else { + rv2p = bnx2_rv2p_proc2; + rv2p_len = sizeof(bnx2_rv2p_proc2); + fixup_loc = RV2P_PROC2_MAX_BD_PAGE_LOC; + } + rc = bnx2_gunzip(bp, rv2p, rv2p_len, &text, &text_len); + if (rc) + goto init_cpu_err; + + load_rv2p_fw(bp, text, text_len, RV2P_PROC2, fixup_loc); + + /* Initialize the RX Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + fw = &bnx2_rxp_fw_09; + else + fw = &bnx2_rxp_fw_06; + + rc = load_cpu_fw(bp, &cpu_reg_rxp, fw); + if (rc) + goto init_cpu_err; + + /* Initialize the TX Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + fw = &bnx2_txp_fw_09; + else + fw = &bnx2_txp_fw_06; + + rc = load_cpu_fw(bp, &cpu_reg_txp, fw); + if (rc) + goto init_cpu_err; + + /* Initialize the TX Patch-up Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + fw = &bnx2_tpat_fw_09; + else + fw = &bnx2_tpat_fw_06; + + rc = load_cpu_fw(bp, &cpu_reg_tpat, fw); + if (rc) + goto init_cpu_err; + + /* Initialize the Completion Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + fw = &bnx2_com_fw_09; + else + fw = &bnx2_com_fw_06; + + rc = load_cpu_fw(bp, &cpu_reg_com, fw); + if (rc) + goto init_cpu_err; + + /* Initialize the Command Processor. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + fw = &bnx2_cp_fw_09; + else + fw = &bnx2_cp_fw_06; + + rc = load_cpu_fw(bp, &cpu_reg_cp, fw); + if (rc) + goto init_cpu_err; + +#if defined(__VMKLNX__) + bnx2_print_fw_versions(bp); +#endif + +init_cpu_err: + bnx2_gunzip_end(bp); + return rc; +} + +static int +bnx2_set_power_state(struct bnx2 *bp, pci_power_t state) +{ + u16 pmcsr; + + pci_read_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, &pmcsr); + + switch (state) { + case PCI_D0: { + u32 val; + + pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, + (pmcsr & ~PCI_PM_CTRL_STATE_MASK) | + PCI_PM_CTRL_PME_STATUS); + + if (pmcsr & PCI_PM_CTRL_STATE_MASK) + /* delay required during transition out of D3hot */ + bnx2_msleep(20); + + val = REG_RD(bp, BNX2_EMAC_MODE); + val |= BNX2_EMAC_MODE_MPKT_RCVD | BNX2_EMAC_MODE_ACPI_RCVD; + val &= ~BNX2_EMAC_MODE_MPKT; + REG_WR(bp, BNX2_EMAC_MODE, val); + + val = REG_RD(bp, BNX2_RPM_CONFIG); + val &= ~BNX2_RPM_CONFIG_ACPI_ENA; + REG_WR(bp, BNX2_RPM_CONFIG, val); + break; + } + case PCI_D3hot: { + int i; + u32 val, wol_msg; + + if (bp->wol) { + u32 advertising; + u8 autoneg; + + autoneg = bp->autoneg; + advertising = bp->advertising; + + if (bp->phy_port == PORT_TP) { + bp->autoneg = AUTONEG_SPEED; + bp->advertising = ADVERTISED_10baseT_Half | + ADVERTISED_10baseT_Full | + ADVERTISED_100baseT_Half | + ADVERTISED_100baseT_Full | + ADVERTISED_Autoneg; + } + + spin_lock_bh(&bp->phy_lock); + bnx2_setup_phy(bp, bp->phy_port); + spin_unlock_bh(&bp->phy_lock); + + bp->autoneg = autoneg; + bp->advertising = advertising; + + bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0); + + val = REG_RD(bp, BNX2_EMAC_MODE); + + /* Enable port mode. */ + val &= ~BNX2_EMAC_MODE_PORT; + val |= BNX2_EMAC_MODE_MPKT_RCVD | + BNX2_EMAC_MODE_ACPI_RCVD | + BNX2_EMAC_MODE_MPKT; + if (bp->phy_port == PORT_TP) + val |= BNX2_EMAC_MODE_PORT_MII; + else { + val |= BNX2_EMAC_MODE_PORT_GMII; + if (bp->line_speed == SPEED_2500) + val |= BNX2_EMAC_MODE_25G_MODE; + } + + REG_WR(bp, BNX2_EMAC_MODE, val); + + /* receive all multicast */ + for (i = 0; i < NUM_MC_HASH_REGISTERS; i++) { + REG_WR(bp, BNX2_EMAC_MULTICAST_HASH0 + (i * 4), + 0xffffffff); + } + REG_WR(bp, BNX2_EMAC_RX_MODE, + BNX2_EMAC_RX_MODE_SORT_MODE); + + val = 1 | BNX2_RPM_SORT_USER0_BC_EN | + BNX2_RPM_SORT_USER0_MC_EN; + REG_WR(bp, BNX2_RPM_SORT_USER0, 0x0); + REG_WR(bp, BNX2_RPM_SORT_USER0, val); + REG_WR(bp, BNX2_RPM_SORT_USER0, val | + BNX2_RPM_SORT_USER0_ENA); + + /* Need to enable EMAC and RPM for WOL. */ + REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, + BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE | + BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE | + BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE); + + val = REG_RD(bp, BNX2_RPM_CONFIG); + val &= ~BNX2_RPM_CONFIG_ACPI_ENA; + REG_WR(bp, BNX2_RPM_CONFIG, val); + + wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_WOL; + } + else { + wol_msg = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL; + } + + if (!(bp->flags & BNX2_FLAG_NO_WOL)) + bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT3 | wol_msg, + 1, 0); + + pmcsr &= ~PCI_PM_CTRL_STATE_MASK; + if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || + (CHIP_ID(bp) == CHIP_ID_5706_A1)) { + + if (bp->wol) + pmcsr |= 3; + } + else { + pmcsr |= 3; + } + if (bp->wol) { + pmcsr |= PCI_PM_CTRL_PME_ENABLE; + } + pci_write_config_word(bp->pdev, bp->pm_cap + PCI_PM_CTRL, + pmcsr); + + /* No more memory access after this point until + * device is brought back to D0. + */ + udelay(50); + break; + } + default: + return -EINVAL; + } + return 0; +} + +static int +bnx2_acquire_nvram_lock(struct bnx2 *bp) +{ + u32 val; + int j; + + /* Request access to the flash interface. */ + REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_SET2); + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + val = REG_RD(bp, BNX2_NVM_SW_ARB); + if (val & BNX2_NVM_SW_ARB_ARB_ARB2) + break; + + udelay(5); + } + + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + + return 0; +} + +static int +bnx2_release_nvram_lock(struct bnx2 *bp) +{ + int j; + u32 val; + + /* Relinquish nvram interface. */ + REG_WR(bp, BNX2_NVM_SW_ARB, BNX2_NVM_SW_ARB_ARB_REQ_CLR2); + + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + val = REG_RD(bp, BNX2_NVM_SW_ARB); + if (!(val & BNX2_NVM_SW_ARB_ARB_ARB2)) + break; + + udelay(5); + } + + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + + return 0; +} + + +static int +bnx2_enable_nvram_write(struct bnx2 *bp) +{ + u32 val; + + val = REG_RD(bp, BNX2_MISC_CFG); + REG_WR(bp, BNX2_MISC_CFG, val | BNX2_MISC_CFG_NVM_WR_EN_PCI); + + if (bp->flash_info->flags & BNX2_NV_WREN) { + int j; + + REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); + REG_WR(bp, BNX2_NVM_COMMAND, + BNX2_NVM_COMMAND_WREN | BNX2_NVM_COMMAND_DOIT); + + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + udelay(5); + + val = REG_RD(bp, BNX2_NVM_COMMAND); + if (val & BNX2_NVM_COMMAND_DONE) + break; + } + + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + } + return 0; +} + +static void +bnx2_disable_nvram_write(struct bnx2 *bp) +{ + u32 val; + + val = REG_RD(bp, BNX2_MISC_CFG); + REG_WR(bp, BNX2_MISC_CFG, val & ~BNX2_MISC_CFG_NVM_WR_EN); +} + + +static void +bnx2_enable_nvram_access(struct bnx2 *bp) +{ + u32 val; + + val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE); + /* Enable both bits, even on read. */ + REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, + val | BNX2_NVM_ACCESS_ENABLE_EN | BNX2_NVM_ACCESS_ENABLE_WR_EN); +} + +static void +bnx2_disable_nvram_access(struct bnx2 *bp) +{ + u32 val; + + val = REG_RD(bp, BNX2_NVM_ACCESS_ENABLE); + /* Disable both bits, even after read. */ + REG_WR(bp, BNX2_NVM_ACCESS_ENABLE, + val & ~(BNX2_NVM_ACCESS_ENABLE_EN | + BNX2_NVM_ACCESS_ENABLE_WR_EN)); +} + +static int +bnx2_nvram_erase_page(struct bnx2 *bp, u32 offset) +{ + u32 cmd; + int j; + + if (bp->flash_info->flags & BNX2_NV_BUFFERED) + /* Buffered flash, no erase needed */ + return 0; + + /* Build an erase command */ + cmd = BNX2_NVM_COMMAND_ERASE | BNX2_NVM_COMMAND_WR | + BNX2_NVM_COMMAND_DOIT; + + /* Need to clear DONE bit separately. */ + REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); + + /* Address of the NVRAM to read from. */ + REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); + + /* Issue an erase command. */ + REG_WR(bp, BNX2_NVM_COMMAND, cmd); + + /* Wait for completion. */ + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + u32 val; + + udelay(5); + + val = REG_RD(bp, BNX2_NVM_COMMAND); + if (val & BNX2_NVM_COMMAND_DONE) + break; + } + + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + + return 0; +} + +static int +bnx2_nvram_read_dword(struct bnx2 *bp, u32 offset, u8 *ret_val, u32 cmd_flags) +{ + u32 cmd; + int j; + + /* Build the command word. */ + cmd = BNX2_NVM_COMMAND_DOIT | cmd_flags; + + /* Calculate an offset of a buffered flash, not needed for 5709. */ + if (bp->flash_info->flags & BNX2_NV_TRANSLATE) { + offset = ((offset / bp->flash_info->page_size) << + bp->flash_info->page_bits) + + (offset % bp->flash_info->page_size); + } + + /* Need to clear DONE bit separately. */ + REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); + + /* Address of the NVRAM to read from. */ + REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); + + /* Issue a read command. */ + REG_WR(bp, BNX2_NVM_COMMAND, cmd); + + /* Wait for completion. */ + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + u32 val; + + udelay(5); + + val = REG_RD(bp, BNX2_NVM_COMMAND); + if (val & BNX2_NVM_COMMAND_DONE) { + __be32 v = cpu_to_be32(REG_RD(bp, BNX2_NVM_READ)); + memcpy(ret_val, &v, 4); + break; + } + } + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + + return 0; +} + + +static int +bnx2_nvram_write_dword(struct bnx2 *bp, u32 offset, u8 *val, u32 cmd_flags) +{ + u32 cmd; + __be32 val32; + int j; + + /* Build the command word. */ + cmd = BNX2_NVM_COMMAND_DOIT | BNX2_NVM_COMMAND_WR | cmd_flags; + + /* Calculate an offset of a buffered flash, not needed for 5709. */ + if (bp->flash_info->flags & BNX2_NV_TRANSLATE) { + offset = ((offset / bp->flash_info->page_size) << + bp->flash_info->page_bits) + + (offset % bp->flash_info->page_size); + } + + /* Need to clear DONE bit separately. */ + REG_WR(bp, BNX2_NVM_COMMAND, BNX2_NVM_COMMAND_DONE); + + memcpy(&val32, val, 4); + + /* Write the data. */ + REG_WR(bp, BNX2_NVM_WRITE, be32_to_cpu(val32)); + + /* Address of the NVRAM to write to. */ + REG_WR(bp, BNX2_NVM_ADDR, offset & BNX2_NVM_ADDR_NVM_ADDR_VALUE); + + /* Issue the write command. */ + REG_WR(bp, BNX2_NVM_COMMAND, cmd); + + /* Wait for completion. */ + for (j = 0; j < NVRAM_TIMEOUT_COUNT; j++) { + udelay(5); + + if (REG_RD(bp, BNX2_NVM_COMMAND) & BNX2_NVM_COMMAND_DONE) + break; + } + if (j >= NVRAM_TIMEOUT_COUNT) + return -EBUSY; + + return 0; +} + +static int +bnx2_init_nvram(struct bnx2 *bp) +{ + u32 val; + int j, entry_count, rc = 0; + const struct flash_spec *flash; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + bp->flash_info = &flash_5709; + goto get_flash_size; + } + + /* Determine the selected interface. */ + val = REG_RD(bp, BNX2_NVM_CFG1); + + entry_count = ARRAY_SIZE(flash_table); + + if (val & 0x40000000) { + + /* Flash interface has been reconfigured */ + for (j = 0, flash = &flash_table[0]; j < entry_count; + j++, flash++) { + if ((val & FLASH_BACKUP_STRAP_MASK) == + (flash->config1 & FLASH_BACKUP_STRAP_MASK)) { + bp->flash_info = flash; + break; + } + } + } + else { + u32 mask; + /* Not yet been reconfigured */ + + if (val & (1 << 23)) + mask = FLASH_BACKUP_STRAP_MASK; + else + mask = FLASH_STRAP_MASK; + + for (j = 0, flash = &flash_table[0]; j < entry_count; + j++, flash++) { + + if ((val & mask) == (flash->strapping & mask)) { + bp->flash_info = flash; + + /* Request access to the flash interface. */ + if ((rc = bnx2_acquire_nvram_lock(bp)) != 0) + return rc; + + /* Enable access to flash interface */ + bnx2_enable_nvram_access(bp); + + /* Reconfigure the flash interface */ + REG_WR(bp, BNX2_NVM_CFG1, flash->config1); + REG_WR(bp, BNX2_NVM_CFG2, flash->config2); + REG_WR(bp, BNX2_NVM_CFG3, flash->config3); + REG_WR(bp, BNX2_NVM_WRITE1, flash->write1); + + /* Disable access to flash interface */ + bnx2_disable_nvram_access(bp); + bnx2_release_nvram_lock(bp); + + break; + } + } + } /* if (val & 0x40000000) */ + + if (j == entry_count) { + bp->flash_info = NULL; + printk(KERN_ALERT PFX "Unknown flash/EEPROM type.\n"); + return -ENODEV; + } + +get_flash_size: + val = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG2); + val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK; + if (val) + bp->flash_size = val; + else + bp->flash_size = bp->flash_info->total_size; + + return rc; +} + +static int +bnx2_nvram_read(struct bnx2 *bp, u32 offset, u8 *ret_buf, + int buf_size) +{ + int rc = 0; + u32 cmd_flags, offset32, len32, extra; + + if (buf_size == 0) + return 0; + + /* Request access to the flash interface. */ + if ((rc = bnx2_acquire_nvram_lock(bp)) != 0) + return rc; + + /* Enable access to flash interface */ + bnx2_enable_nvram_access(bp); + + len32 = buf_size; + offset32 = offset; + extra = 0; + + cmd_flags = 0; + + if (offset32 & 3) { + u8 buf[4]; + u32 pre_len; + + offset32 &= ~3; + pre_len = 4 - (offset & 3); + + if (pre_len >= len32) { + pre_len = len32; + cmd_flags = BNX2_NVM_COMMAND_FIRST | + BNX2_NVM_COMMAND_LAST; + } + else { + cmd_flags = BNX2_NVM_COMMAND_FIRST; + } + + rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags); + + if (rc) + return rc; + + memcpy(ret_buf, buf + (offset & 3), pre_len); + + offset32 += 4; + ret_buf += pre_len; + len32 -= pre_len; + } + if (len32 & 3) { + extra = 4 - (len32 & 3); + len32 = (len32 + 4) & ~3; + } + + if (len32 == 4) { + u8 buf[4]; + + if (cmd_flags) + cmd_flags = BNX2_NVM_COMMAND_LAST; + else + cmd_flags = BNX2_NVM_COMMAND_FIRST | + BNX2_NVM_COMMAND_LAST; + + rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags); + + memcpy(ret_buf, buf, 4 - extra); + } + else if (len32 > 0) { + u8 buf[4]; + + /* Read the first word. */ + if (cmd_flags) + cmd_flags = 0; + else + cmd_flags = BNX2_NVM_COMMAND_FIRST; + + rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, cmd_flags); + + /* Advance to the next dword. */ + offset32 += 4; + ret_buf += 4; + len32 -= 4; + + while (len32 > 4 && rc == 0) { + rc = bnx2_nvram_read_dword(bp, offset32, ret_buf, 0); + + /* Advance to the next dword. */ + offset32 += 4; + ret_buf += 4; + len32 -= 4; + } + + if (rc) + return rc; + + cmd_flags = BNX2_NVM_COMMAND_LAST; + rc = bnx2_nvram_read_dword(bp, offset32, buf, cmd_flags); + + memcpy(ret_buf, buf, 4 - extra); + } + + /* Disable access to flash interface */ + bnx2_disable_nvram_access(bp); + + bnx2_release_nvram_lock(bp); + + return rc; +} + +static int +bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, + int buf_size) +{ + u32 written, offset32, len32; + u8 *buf, start[4], end[4], *align_buf = NULL, *flash_buffer = NULL; + int rc = 0; + int align_start, align_end; + + buf = data_buf; + offset32 = offset; + len32 = buf_size; + align_start = align_end = 0; + + if ((align_start = (offset32 & 3))) { + offset32 &= ~3; + len32 += align_start; + if (len32 < 4) + len32 = 4; + if ((rc = bnx2_nvram_read(bp, offset32, start, 4))) + return rc; + } + + if (len32 & 3) { + align_end = 4 - (len32 & 3); + len32 += align_end; + if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4, end, 4))) + return rc; + } + + if (align_start || align_end) { + align_buf = kmalloc(len32, GFP_KERNEL); + if (align_buf == NULL) + return -ENOMEM; + if (align_start) { + memcpy(align_buf, start, 4); + } + if (align_end) { + memcpy(align_buf + len32 - 4, end, 4); + } + memcpy(align_buf + align_start, data_buf, buf_size); + buf = align_buf; + } + + if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) { + flash_buffer = kmalloc(264, GFP_KERNEL); + if (flash_buffer == NULL) { + rc = -ENOMEM; + goto nvram_write_end; + } + } + + written = 0; + while ((written < len32) && (rc == 0)) { + u32 page_start, page_end, data_start, data_end; + u32 addr, cmd_flags; + int i; + + /* Find the page_start addr */ + page_start = offset32 + written; + page_start -= (page_start % bp->flash_info->page_size); + /* Find the page_end addr */ + page_end = page_start + bp->flash_info->page_size; + /* Find the data_start addr */ + data_start = (written == 0) ? offset32 : page_start; + /* Find the data_end addr */ + data_end = (page_end > offset32 + len32) ? + (offset32 + len32) : page_end; + + /* Request access to the flash interface. */ + if ((rc = bnx2_acquire_nvram_lock(bp)) != 0) + goto nvram_write_end; + + /* Enable access to flash interface */ + bnx2_enable_nvram_access(bp); + + cmd_flags = BNX2_NVM_COMMAND_FIRST; + if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) { + int j; + + /* Read the whole page into the buffer + * (non-buffer flash only) */ + for (j = 0; j < bp->flash_info->page_size; j += 4) { + if (j == (bp->flash_info->page_size - 4)) { + cmd_flags |= BNX2_NVM_COMMAND_LAST; + } + rc = bnx2_nvram_read_dword(bp, + page_start + j, + &flash_buffer[j], + cmd_flags); + + if (rc) + goto nvram_write_end; + + cmd_flags = 0; + } + } + + /* Enable writes to flash interface (unlock write-protect) */ + if ((rc = bnx2_enable_nvram_write(bp)) != 0) + goto nvram_write_end; + + /* Loop to write back the buffer data from page_start to + * data_start */ + i = 0; + if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) { + /* Erase the page */ + if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0) + goto nvram_write_end; + + /* Re-enable the write again for the actual write */ + bnx2_enable_nvram_write(bp); + + for (addr = page_start; addr < data_start; + addr += 4, i += 4) { + + rc = bnx2_nvram_write_dword(bp, addr, + &flash_buffer[i], cmd_flags); + + if (rc != 0) + goto nvram_write_end; + + cmd_flags = 0; + } + } + + /* Loop to write the new data from data_start to data_end */ + for (addr = data_start; addr < data_end; addr += 4, i += 4) { + if ((addr == page_end - 4) || + ((bp->flash_info->flags & BNX2_NV_BUFFERED) && + (addr == data_end - 4))) { + + cmd_flags |= BNX2_NVM_COMMAND_LAST; + } + rc = bnx2_nvram_write_dword(bp, addr, buf, + cmd_flags); + + if (rc != 0) + goto nvram_write_end; + + cmd_flags = 0; + buf += 4; + } + + /* Loop to write back the buffer data from data_end + * to page_end */ + if (!(bp->flash_info->flags & BNX2_NV_BUFFERED)) { + for (addr = data_end; addr < page_end; + addr += 4, i += 4) { + + if (addr == page_end-4) { + cmd_flags = BNX2_NVM_COMMAND_LAST; + } + rc = bnx2_nvram_write_dword(bp, addr, + &flash_buffer[i], cmd_flags); + + if (rc != 0) + goto nvram_write_end; + + cmd_flags = 0; + } + } + + /* Disable writes to flash interface (lock write-protect) */ + bnx2_disable_nvram_write(bp); + + /* Disable access to flash interface */ + bnx2_disable_nvram_access(bp); + bnx2_release_nvram_lock(bp); + + /* Increment written */ + written += data_end - data_start; + } + +nvram_write_end: + kfree(flash_buffer); + kfree(align_buf); + return rc; +} + +static void +bnx2_init_fw_cap(struct bnx2 *bp) +{ + u32 val, sig = 0; + + bp->phy_flags &= ~BNX2_PHY_FLAG_REMOTE_PHY_CAP; + bp->flags &= ~BNX2_FLAG_CAN_KEEP_VLAN; + + if (!(bp->flags & BNX2_FLAG_ASF_ENABLE)) + bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN; + + val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB); + if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE) + return; + + if ((val & BNX2_FW_CAP_CAN_KEEP_VLAN) == BNX2_FW_CAP_CAN_KEEP_VLAN) { + bp->flags |= BNX2_FLAG_CAN_KEEP_VLAN; + sig |= BNX2_DRV_ACK_CAP_SIGNATURE | BNX2_FW_CAP_CAN_KEEP_VLAN; + } + + if ((bp->phy_flags & BNX2_PHY_FLAG_SERDES) && + (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE)) { + u32 link; + + bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP; + + link = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); + if (link & BNX2_LINK_STATUS_SERDES_LINK) + bp->phy_port = PORT_FIBRE; + else + bp->phy_port = PORT_TP; + + sig |= BNX2_DRV_ACK_CAP_SIGNATURE | + BNX2_FW_CAP_REMOTE_PHY_CAPABLE; + } + + if (netif_running(bp->dev) && sig) + bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig); +} + +static void +bnx2_setup_msix_tbl_cfg(struct bnx2 *bp) +{ + bnx2_reg_wr_ind_cfg(bp, BNX2_PCI_GRC_WINDOW_ADDR, + BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN); + + bnx2_reg_wr_ind_cfg(bp, BNX2_PCI_GRC_WINDOW2_ADDR, + BNX2_MSIX_TABLE_ADDR); + bnx2_reg_wr_ind_cfg(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR); +} + +static void +bnx2_setup_msix_tbl(struct bnx2 *bp) +{ + REG_WR(bp, BNX2_PCI_GRC_WINDOW_ADDR, BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN); + + REG_WR(bp, BNX2_PCI_GRC_WINDOW2_ADDR, BNX2_MSIX_TABLE_ADDR); + REG_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR); +} + +static int +bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) +{ + u32 val; + int i, rc = 0; + u8 old_port; + + /* Wait for the current PCI transaction to complete before + * issuing a reset. */ + REG_WR(bp, BNX2_MISC_ENABLE_CLR_BITS, + BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE | + BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE | + BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE | + BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE); + val = REG_RD(bp, BNX2_MISC_ENABLE_CLR_BITS); + udelay(5); + barrier(); + + /* Wait for the firmware to tell us it is ok to issue a reset. */ + bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1); + + /* Deposit a driver reset signature so the firmware knows that + * this is a soft reset. */ + bnx2_shmem_wr(bp, BNX2_DRV_RESET_SIGNATURE, + BNX2_DRV_RESET_SIGNATURE_MAGIC); + + pci_save_state(bp->pdev); + + /* Do a dummy read to force the chip to complete all current transaction + * before we issue a reset. */ + val = REG_RD(bp, BNX2_MISC_ID); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + REG_WR(bp, BNX2_MISC_COMMAND, BNX2_MISC_COMMAND_SW_RESET); + REG_RD(bp, BNX2_MISC_COMMAND); + udelay(5); + + val = BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | + BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP; + + pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG, val); + + } else { + val = BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ | + BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | + BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP; + + /* Chip reset. */ + REG_WR(bp, BNX2_PCICFG_MISC_CONFIG, val); + + /* Reading back any register after chip reset will hang the + * bus on 5706 A0 and A1. The msleep below provides plenty + * of margin for write posting. + */ + if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || + (CHIP_ID(bp) == CHIP_ID_5706_A1)) + bnx2_msleep(20); + + /* Reset takes approximate 30 usec */ + for (i = 0; i < 10; i++) { + val = REG_RD(bp, BNX2_PCICFG_MISC_CONFIG); + if ((val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ | + BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) == 0) + break; + udelay(10); + } + + if (val & (BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ | + BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY)) { + printk(KERN_ERR PFX "Chip reset did not complete\n"); + return -EBUSY; + } + } + + if (bp->flags & BNX2_FLAG_USING_MSIX) + bnx2_setup_msix_tbl_cfg(bp); + + pci_restore_state(bp->pdev); + + /* Make sure byte swapping is properly configured. */ + val = REG_RD(bp, BNX2_PCI_SWAP_DIAG0); + if (val != 0x01020304) { + printk(KERN_ERR PFX "Chip not in correct endian mode\n"); + return -ENODEV; + } + + /* Wait for the firmware to finish its initialization. */ + rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT1 | reset_code, 1, 0); + if (rc) + return rc; + + spin_lock_bh(&bp->phy_lock); + old_port = bp->phy_port; + bnx2_init_fw_cap(bp); + if ((bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) && + old_port != bp->phy_port) + bnx2_set_default_remote_link(bp); + spin_unlock_bh(&bp->phy_lock); + + if (CHIP_ID(bp) == CHIP_ID_5706_A0) { + /* Adjust the voltage regular to two steps lower. The default + * of this register is 0x0000000e. */ + REG_WR(bp, BNX2_MISC_VREG_CONTROL, 0x000000fa); + + /* Remove bad rbuf memory from the free pool. */ + rc = bnx2_alloc_bad_rbuf(bp); + } + + if (bp->flags & BNX2_FLAG_USING_MSIX) { + bnx2_setup_msix_tbl(bp); + /* Prevent MSIX table reads and write from timing out */ + REG_WR(bp, BNX2_MISC_ECO_HW_CTL, + BNX2_MISC_ECO_HW_CTL_LARGE_GRC_TMOUT_EN); + } + + return rc; +} + +static int +bnx2_init_chip(struct bnx2 *bp) +{ + u32 val, mtu; + int rc, i; + + /* Make sure the interrupt is not active. */ + REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, BNX2_PCICFG_INT_ACK_CMD_MASK_INT); + + val = BNX2_DMA_CONFIG_DATA_BYTE_SWAP | + BNX2_DMA_CONFIG_DATA_WORD_SWAP | +#ifdef __BIG_ENDIAN + BNX2_DMA_CONFIG_CNTL_BYTE_SWAP | +#endif + BNX2_DMA_CONFIG_CNTL_WORD_SWAP | + DMA_READ_CHANS << 12 | + DMA_WRITE_CHANS << 16; + + val |= (0x2 << 20) | (1 << 11); + + if ((bp->flags & BNX2_FLAG_PCIX) && (bp->bus_speed_mhz == 133)) + val |= (1 << 23); + + if ((CHIP_NUM(bp) == CHIP_NUM_5706) && + (CHIP_ID(bp) != CHIP_ID_5706_A0) && !(bp->flags & BNX2_FLAG_PCIX)) + val |= BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA; + + REG_WR(bp, BNX2_DMA_CONFIG, val); + + if (CHIP_ID(bp) == CHIP_ID_5706_A0) { + val = REG_RD(bp, BNX2_TDMA_CONFIG); + val |= BNX2_TDMA_CONFIG_ONE_DMA; + REG_WR(bp, BNX2_TDMA_CONFIG, val); + } + + if (bp->flags & BNX2_FLAG_PCIX) { + u16 val16; + + pci_read_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD, + &val16); + pci_write_config_word(bp->pdev, bp->pcix_cap + PCI_X_CMD, + val16 & ~PCI_X_CMD_ERO); + } + + REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, + BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE | + BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE | + BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE); + + /* Initialize context mapping and zero out the quick contexts. The + * context block must have already been enabled. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + rc = bnx2_init_5709_context(bp); + if (rc) + return rc; + } else + bnx2_init_context(bp); + + if ((rc = bnx2_init_cpus(bp)) != 0) + return rc; + + bnx2_init_nvram(bp); + + bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0); + + val = REG_RD(bp, BNX2_MQ_CONFIG); + val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; + val |= BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256; + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + val |= BNX2_MQ_CONFIG_BIN_MQ_MODE; + if (CHIP_REV(bp) == CHIP_REV_Ax) + val |= BNX2_MQ_CONFIG_HALT_DIS; + } + + REG_WR(bp, BNX2_MQ_CONFIG, val); + + val = 0x10000 + (MAX_CID_CNT * MB_KERNEL_CTX_SIZE); + REG_WR(bp, BNX2_MQ_KNL_BYP_WIND_START, val); + REG_WR(bp, BNX2_MQ_KNL_WIND_END, val); + + val = (BCM_PAGE_BITS - 8) << 24; + REG_WR(bp, BNX2_RV2P_CONFIG, val); + + /* Configure page size. */ + val = REG_RD(bp, BNX2_TBDR_CONFIG); + val &= ~BNX2_TBDR_CONFIG_PAGE_SIZE; + val |= (BCM_PAGE_BITS - 8) << 24 | 0x40; + REG_WR(bp, BNX2_TBDR_CONFIG, val); + + val = bp->mac_addr[0] + + (bp->mac_addr[1] << 8) + + (bp->mac_addr[2] << 16) + + bp->mac_addr[3] + + (bp->mac_addr[4] << 8) + + (bp->mac_addr[5] << 16); + REG_WR(bp, BNX2_EMAC_BACKOFF_SEED, val); + + /* Program the MTU. Also include 4 bytes for CRC32. */ + mtu = bp->dev->mtu; + val = mtu + ETH_HLEN + ETH_FCS_LEN; + if (val > (MAX_ETHERNET_PACKET_SIZE + 4)) + val |= BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA; + REG_WR(bp, BNX2_EMAC_RX_MTU_SIZE, val); + + if (mtu < 1500) + mtu = 1500; + + bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG, BNX2_RBUF_CONFIG_VAL(mtu)); + bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG2, BNX2_RBUF_CONFIG2_VAL(mtu)); + bnx2_reg_wr_ind(bp, BNX2_RBUF_CONFIG3, BNX2_RBUF_CONFIG3_VAL(mtu)); + + memset(bp->bnx2_napi[0].status_blk.msi, 0, bp->status_stats_size); + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) + bp->bnx2_napi[i].last_status_idx = 0; + + bp->idle_chk_status_idx = 0xffff; + + bp->rx_mode = BNX2_EMAC_RX_MODE_SORT_MODE; + + /* Set up how to generate a link change interrupt. */ + REG_WR(bp, BNX2_EMAC_ATTENTION_ENA, BNX2_EMAC_ATTENTION_ENA_LINK); + + REG_WR(bp, BNX2_HC_STATUS_ADDR_L, + (u64) bp->status_blk_mapping & 0xffffffff); + REG_WR(bp, BNX2_HC_STATUS_ADDR_H, (u64) bp->status_blk_mapping >> 32); + + REG_WR(bp, BNX2_HC_STATISTICS_ADDR_L, + (u64) bp->stats_blk_mapping & 0xffffffff); + REG_WR(bp, BNX2_HC_STATISTICS_ADDR_H, + (u64) bp->stats_blk_mapping >> 32); + + REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP, + (bp->tx_quick_cons_trip_int << 16) | bp->tx_quick_cons_trip); + + REG_WR(bp, BNX2_HC_RX_QUICK_CONS_TRIP, + (bp->rx_quick_cons_trip_int << 16) | bp->rx_quick_cons_trip); + + REG_WR(bp, BNX2_HC_COMP_PROD_TRIP, + (bp->comp_prod_trip_int << 16) | bp->comp_prod_trip); + + REG_WR(bp, BNX2_HC_TX_TICKS, (bp->tx_ticks_int << 16) | bp->tx_ticks); + + REG_WR(bp, BNX2_HC_RX_TICKS, (bp->rx_ticks_int << 16) | bp->rx_ticks); + + REG_WR(bp, BNX2_HC_COM_TICKS, + (bp->com_ticks_int << 16) | bp->com_ticks); + + REG_WR(bp, BNX2_HC_CMD_TICKS, + (bp->cmd_ticks_int << 16) | bp->cmd_ticks); + + if (bp->flags & BNX2_FLAG_BROKEN_STATS) + REG_WR(bp, BNX2_HC_STATS_TICKS, 0); + else + REG_WR(bp, BNX2_HC_STATS_TICKS, bp->stats_ticks); + REG_WR(bp, BNX2_HC_STAT_COLLECT_TICKS, 0xbb8); /* 3ms */ + + if (CHIP_ID(bp) == CHIP_ID_5706_A1) + val = BNX2_HC_CONFIG_COLLECT_STATS; + else { + val = BNX2_HC_CONFIG_RX_TMR_MODE | BNX2_HC_CONFIG_TX_TMR_MODE | + BNX2_HC_CONFIG_COLLECT_STATS; + } + + if (bp->flags & BNX2_FLAG_USING_MSIX) { + REG_WR(bp, BNX2_HC_MSIX_BIT_VECTOR, + BNX2_HC_MSIX_BIT_VECTOR_VAL); + + val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B; + } + + if (bp->flags & BNX2_FLAG_ONE_SHOT_MSI) + val |= BNX2_HC_CONFIG_ONE_SHOT | BNX2_HC_CONFIG_USE_INT_PARAM; + + REG_WR(bp, BNX2_HC_CONFIG, val); + + for (i = 1; i < bp->irq_nvecs; i++) { + u32 base = ((i - 1) * BNX2_HC_SB_CONFIG_SIZE) + + BNX2_HC_SB_CONFIG_1; + + REG_WR(bp, base, + BNX2_HC_SB_CONFIG_1_TX_TMR_MODE | + BNX2_HC_SB_CONFIG_1_RX_TMR_MODE | + BNX2_HC_SB_CONFIG_1_ONE_SHOT); + + REG_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF, + (bp->tx_quick_cons_trip_int << 16) | + bp->tx_quick_cons_trip); + + REG_WR(bp, base + BNX2_HC_TX_TICKS_OFF, + (bp->tx_ticks_int << 16) | bp->tx_ticks); + + REG_WR(bp, base + BNX2_HC_RX_QUICK_CONS_TRIP_OFF, + (bp->rx_quick_cons_trip_int << 16) | + bp->rx_quick_cons_trip); + + REG_WR(bp, base + BNX2_HC_RX_TICKS_OFF, + (bp->rx_ticks_int << 16) | bp->rx_ticks); + } + + /* Clear internal stats counters. */ + REG_WR(bp, BNX2_HC_COMMAND, BNX2_HC_COMMAND_CLR_STAT_NOW); + + REG_WR(bp, BNX2_HC_ATTN_BITS_ENABLE, STATUS_ATTN_EVENTS); + + /* Initialize the receive filter. */ + bnx2_set_rx_mode(bp->dev); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + val = REG_RD(bp, BNX2_MISC_NEW_CORE_CTL); + val |= BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE; + REG_WR(bp, BNX2_MISC_NEW_CORE_CTL, val); + } + rc = bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT2 | BNX2_DRV_MSG_CODE_RESET, + 1, 0); + + REG_WR(bp, BNX2_MISC_ENABLE_SET_BITS, BNX2_MISC_ENABLE_DEFAULT); + REG_RD(bp, BNX2_MISC_ENABLE_SET_BITS); + + udelay(20); + + bp->hc_cmd = REG_RD(bp, BNX2_HC_COMMAND); + + return rc; +} + +static void +bnx2_clear_ring_states(struct bnx2 *bp) +{ + struct bnx2_napi *bnapi; + struct bnx2_tx_ring_info *txr; + struct bnx2_rx_ring_info *rxr; + int i; + + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + bnapi = &bp->bnx2_napi[i]; + txr = &bnapi->tx_ring; + rxr = &bnapi->rx_ring; + + txr->tx_cons = 0; + txr->hw_tx_cons = 0; + rxr->rx_prod_bseq = 0; + rxr->rx_prod = 0; + rxr->rx_cons = 0; + rxr->rx_pg_prod = 0; + rxr->rx_pg_cons = 0; + } +} + +static void +bnx2_init_tx_context(struct bnx2 *bp, u32 cid, struct bnx2_tx_ring_info *txr) +{ + u32 val, offset0, offset1, offset2, offset3; + u32 cid_addr = GET_CID_ADDR(cid); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + offset0 = BNX2_L2CTX_TYPE_XI; + offset1 = BNX2_L2CTX_CMD_TYPE_XI; + offset2 = BNX2_L2CTX_TBDR_BHADDR_HI_XI; + offset3 = BNX2_L2CTX_TBDR_BHADDR_LO_XI; + } else { + offset0 = BNX2_L2CTX_TYPE; + offset1 = BNX2_L2CTX_CMD_TYPE; + offset2 = BNX2_L2CTX_TBDR_BHADDR_HI; + offset3 = BNX2_L2CTX_TBDR_BHADDR_LO; + } + val = BNX2_L2CTX_TYPE_TYPE_L2 | BNX2_L2CTX_TYPE_SIZE_L2; + bnx2_ctx_wr(bp, cid_addr, offset0, val); + + val = BNX2_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16); + bnx2_ctx_wr(bp, cid_addr, offset1, val); + + val = (u64) txr->tx_desc_mapping >> 32; + bnx2_ctx_wr(bp, cid_addr, offset2, val); + + val = (u64) txr->tx_desc_mapping & 0xffffffff; + bnx2_ctx_wr(bp, cid_addr, offset3, val); +} + +static void +bnx2_init_tx_ring(struct bnx2 *bp, int ring_num) +{ + struct tx_bd *txbd; + u32 cid = TX_CID; + struct bnx2_napi *bnapi; + struct bnx2_tx_ring_info *txr; + + bnapi = &bp->bnx2_napi[ring_num]; + txr = &bnapi->tx_ring; + + if (ring_num == 0) + cid = TX_CID; + else + cid = TX_TSS_CID + ring_num - 1; + + bp->tx_wake_thresh = bp->tx_ring_size / 2; + + txbd = &txr->tx_desc_ring[MAX_TX_DESC_CNT]; + + txbd->tx_bd_haddr_hi = (u64) txr->tx_desc_mapping >> 32; + txbd->tx_bd_haddr_lo = (u64) txr->tx_desc_mapping & 0xffffffff; + + txr->tx_prod = 0; + txr->tx_prod_bseq = 0; + + txr->tx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BIDX; + txr->tx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_TX_HOST_BSEQ; + + bnx2_init_tx_context(bp, cid, txr); +} + +static void +bnx2_init_rxbd_rings(struct rx_bd *rx_ring[], dma_addr_t dma[], u32 buf_size, + int num_rings) +{ + int i; + struct rx_bd *rxbd; + + for (i = 0; i < num_rings; i++) { + int j; + + rxbd = &rx_ring[i][0]; + for (j = 0; j < MAX_RX_DESC_CNT; j++, rxbd++) { + rxbd->rx_bd_len = buf_size; + rxbd->rx_bd_flags = RX_BD_FLAGS_START | RX_BD_FLAGS_END; + } + if (i == (num_rings - 1)) + j = 0; + else + j = i + 1; + rxbd->rx_bd_haddr_hi = (u64) dma[j] >> 32; + rxbd->rx_bd_haddr_lo = (u64) dma[j] & 0xffffffff; + } +} + +static void +bnx2_init_rx_ring(struct bnx2 *bp, int ring_num) +{ + int i; + u16 prev_prod, prod, ring_prod; + u32 cid, rx_cid_addr, val; + struct bnx2_napi *bnapi = &bp->bnx2_napi[ring_num]; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + + if (ring_num == 0) + cid = RX_CID; + else + cid = RX_RSS_CID + ring_num - 1; + + rx_cid_addr = GET_CID_ADDR(cid); + + bnx2_init_rxbd_rings(rxr->rx_desc_ring, rxr->rx_desc_mapping, + bp->rx_buf_use_size, bp->rx_max_ring); + + bnx2_init_rx_context(bp, cid); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + val = REG_RD(bp, BNX2_MQ_MAP_L2_5); + REG_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM); + +#if defined(BNX2_ENABLE_NETQUEUE) + /* Set in the RX context the proper CID location + * for the completion + */ + if(BNX2_NETQUEUE_ENABLED(bp)) + bnx2_ctx_wr(bp, rx_cid_addr, 0x04, 1 << 16); +#endif + } + + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0); + if (bp->rx_pg_ring_size) { + bnx2_init_rxbd_rings(rxr->rx_pg_desc_ring, + rxr->rx_pg_desc_mapping, + PAGE_SIZE, bp->rx_max_pg_ring); + val = (bp->rx_buf_use_size << 16) | PAGE_SIZE; + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, val); + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_RBDC_KEY, + BNX2_L2CTX_RBDC_JUMBO_KEY - ring_num); + + val = (u64) rxr->rx_pg_desc_mapping[0] >> 32; + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_HI, val); + + val = (u64) rxr->rx_pg_desc_mapping[0] & 0xffffffff; + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + REG_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT); + } + + val = (u64) rxr->rx_desc_mapping[0] >> 32; + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val); + + val = (u64) rxr->rx_desc_mapping[0] & 0xffffffff; + bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val); + + ring_prod = prod = rxr->rx_pg_prod; + for (i = 0; i < bp->rx_pg_ring_size; i++) { + if (bnx2_alloc_rx_page(bp, rxr, ring_prod) < 0) + break; + prod = NEXT_RX_BD(prod); + ring_prod = RX_PG_RING_IDX(prod); + } + rxr->rx_pg_prod = prod; + + ring_prod = prod = prev_prod = rxr->rx_prod; + for (i = 0; i < bp->rx_ring_size; i++) { + if (bnx2_alloc_rx_skb(bp, rxr, ring_prod) < 0) { + printk(KERN_ERR PFX "%s: init'ed rx ring %d with " + "%d/%d skb's only\n", + bp->dev->name, ring_num, i, bp->rx_ring_size); + prod = prev_prod; + break; + } + prev_prod = prod; + prod = NEXT_RX_BD(prod); + ring_prod = RX_RING_IDX(prod); + } + rxr->rx_prod = prod; + + rxr->rx_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BDIDX; + rxr->rx_bseq_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_BSEQ; + rxr->rx_pg_bidx_addr = MB_GET_CID_ADDR(cid) + BNX2_L2CTX_HOST_PG_BDIDX; + + REG_WR16(bp, rxr->rx_pg_bidx_addr, rxr->rx_pg_prod); + REG_WR16(bp, rxr->rx_bidx_addr, prod); + + REG_WR(bp, rxr->rx_bseq_addr, rxr->rx_prod_bseq); +} + +static void +bnx2_init_all_rings(struct bnx2 *bp) +{ + int i; + u32 val; + + bnx2_clear_ring_states(bp); + + REG_WR(bp, BNX2_TSCH_TSS_CFG, 0); + for (i = 0; i < bp->num_tx_rings; i++) + bnx2_init_tx_ring(bp, i); + + if (bp->num_tx_rings > 1) + REG_WR(bp, BNX2_TSCH_TSS_CFG, ((bp->num_tx_rings - 1) << 24) | + (TX_TSS_CID << 7)); + + REG_WR(bp, BNX2_RLUP_RSS_CONFIG, 0); + bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ, 0); + + for (i = 0; i < bp->num_rx_rings; i++) + bnx2_init_rx_ring(bp, i); + + if (bp->num_rx_rings > 1) { + u32 tbl_32; + u8 *tbl = (u8 *) &tbl_32; + + bnx2_reg_wr_ind(bp, BNX2_RXP_SCRATCH_RSS_TBL_SZ, + BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES); + + for (i = 0; i < BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES; i++) { + tbl[i % 4] = i % (bp->num_rx_rings - 1); + if ((i % 4) == 3) + bnx2_reg_wr_ind(bp, + BNX2_RXP_SCRATCH_RSS_TBL + i, + cpu_to_be32(tbl_32)); + } + + val = BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI | + BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI; + + REG_WR(bp, BNX2_RLUP_RSS_CONFIG, val); + + } +} + +static u32 bnx2_find_max_ring(u32 ring_size, u32 max_size) +{ + u32 max, num_rings = 1; + + while (ring_size > MAX_RX_DESC_CNT) { + ring_size -= MAX_RX_DESC_CNT; + num_rings++; + } + /* round to next power of 2 */ + max = max_size; + while ((max & num_rings) == 0) + max >>= 1; + + if (num_rings != max) + max <<= 1; + + return max; +} + +static void +bnx2_set_rx_ring_size(struct bnx2 *bp, u32 size) +{ + u32 rx_size, rx_space; + + /* 8 for CRC and VLAN */ + rx_size = bp->dev->mtu + ETH_HLEN + BNX2_RX_OFFSET + 8; + + rx_space = SKB_DATA_ALIGN(rx_size + BNX2_RX_ALIGN) + NET_SKB_PAD + + sizeof(struct skb_shared_info); + + bp->rx_copy_thresh = BNX2_RX_COPY_THRESH; + bp->rx_pg_ring_size = 0; + bp->rx_max_pg_ring = 0; + bp->rx_max_pg_ring_idx = 0; +#if !defined(__VMKLNX__) + if ((rx_space > PAGE_SIZE) && !(bp->flags & BNX2_FLAG_JUMBO_BROKEN)) { + int pages = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT; + + u32 jumbo_size = size * pages; + if (jumbo_size > MAX_TOTAL_RX_PG_DESC_CNT) + jumbo_size = MAX_TOTAL_RX_PG_DESC_CNT; + + bp->rx_pg_ring_size = jumbo_size; + bp->rx_max_pg_ring = bnx2_find_max_ring(jumbo_size, + MAX_RX_PG_RINGS); + bp->rx_max_pg_ring_idx = (bp->rx_max_pg_ring * RX_DESC_CNT) - 1; + rx_size = BNX2_RX_COPY_THRESH + BNX2_RX_OFFSET; + bp->rx_copy_thresh = 0; + } +#endif + + bp->rx_buf_use_size = rx_size; + /* hw alignment */ + bp->rx_buf_size = bp->rx_buf_use_size + BNX2_RX_ALIGN; + bp->rx_jumbo_thresh = rx_size - BNX2_RX_OFFSET; + bp->rx_ring_size = size; + bp->rx_max_ring = bnx2_find_max_ring(size, MAX_RX_RINGS); + bp->rx_max_ring_idx = (bp->rx_max_ring * RX_DESC_CNT) - 1; +} + +static void +bnx2_free_tx_skbs(struct bnx2 *bp) +{ + int i; + +#if defined(__VMKLNX__) + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { +#else + for (i = 0; i < bp->num_tx_rings; i++) { +#endif + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + int j; + + if (txr->tx_buf_ring == NULL) + continue; + + for (j = 0; j < TX_DESC_CNT; ) { + struct sw_tx_bd *tx_buf = &txr->tx_buf_ring[j]; + struct sk_buff *skb = tx_buf->skb; + int k, last; + + if (skb == NULL) { + j++; + continue; + } + + pci_unmap_single(bp->pdev, + pci_unmap_addr(tx_buf, mapping), + skb_headlen(skb), PCI_DMA_TODEVICE); + + tx_buf->skb = NULL; + + last = skb_shinfo(skb)->nr_frags; + for (k = 0; k < last; k++) { + tx_buf = &txr->tx_buf_ring[j + k + 1]; + pci_unmap_page(bp->pdev, + pci_unmap_addr(tx_buf, mapping), + skb_shinfo(skb)->frags[j].size, + PCI_DMA_TODEVICE); + } + j += last + 1; + dev_kfree_skb(skb); + } + } +} + +static void +bnx2_free_rx_skbs(struct bnx2 *bp) +{ + int i; + +#if defined(__VMKLNX__) + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { +#else + for (i = 0; i < bp->num_rx_rings; i++) { +#endif /* defined(__VMKLNX__) */ + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + int j; + +#if defined(__VMKLNX__) + if (rxr->rx_buf_ring == NULL) + continue; +#else + return; +#endif + +#if defined(__VMKLNX__) + for (j = 0; j < bp->rx_ring_size; j++) { +#else + for (j = 0; j < bp->rx_max_ring_idx; j++) { +#endif /* defined(__VMKLNX__) */ + struct sw_bd *rx_buf = &rxr->rx_buf_ring[j]; + struct sk_buff *skb = rx_buf->skb; + + if (skb == NULL) + continue; + + pci_unmap_single(bp->pdev, + pci_unmap_addr(rx_buf, mapping), + bp->rx_buf_use_size, + PCI_DMA_FROMDEVICE); + + rx_buf->skb = NULL; + + dev_kfree_skb(skb); + } + for (j = 0; j < bp->rx_max_pg_ring_idx; j++) + bnx2_free_rx_page(bp, rxr, j); + } +} + +static void +bnx2_free_skbs(struct bnx2 *bp) +{ + bnx2_free_tx_skbs(bp); + bnx2_free_rx_skbs(bp); +} + +static int +bnx2_reset_nic(struct bnx2 *bp, u32 reset_code) +{ + int rc; + + rc = bnx2_reset_chip(bp, reset_code); + bnx2_free_skbs(bp); + if (rc) + return rc; + + if ((rc = bnx2_init_chip(bp)) != 0) + return rc; + + bnx2_init_all_rings(bp); + return 0; +} + +static int +bnx2_init_nic(struct bnx2 *bp, int reset_phy) +{ + int rc; + + if ((rc = bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET)) != 0) + return rc; + + spin_lock_bh(&bp->phy_lock); + bnx2_init_phy(bp, reset_phy); + bnx2_set_link(bp); + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + bnx2_remote_phy_event(bp); + spin_unlock_bh(&bp->phy_lock); + return 0; +} + +static int +bnx2_shutdown_chip(struct bnx2 *bp) +{ + u32 reset_code; + + if (bp->flags & BNX2_FLAG_NO_WOL) + reset_code = BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN; + else if (bp->wol) + reset_code = BNX2_DRV_MSG_CODE_SUSPEND_WOL; + else + reset_code = BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL; + + return bnx2_reset_chip(bp, reset_code); +} + +static int +bnx2_test_registers(struct bnx2 *bp) +{ + int ret; + int i, is_5709; + static const struct { + u16 offset; + u16 flags; +#define BNX2_FL_NOT_5709 1 + u32 rw_mask; + u32 ro_mask; + } reg_tbl[] = { + { 0x006c, 0, 0x00000000, 0x0000003f }, + { 0x0090, 0, 0xffffffff, 0x00000000 }, + { 0x0094, 0, 0x00000000, 0x00000000 }, + + { 0x0404, BNX2_FL_NOT_5709, 0x00003f00, 0x00000000 }, + { 0x0418, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + { 0x041c, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + { 0x0420, BNX2_FL_NOT_5709, 0x00000000, 0x80ffffff }, + { 0x0424, BNX2_FL_NOT_5709, 0x00000000, 0x00000000 }, + { 0x0428, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 }, + { 0x0450, BNX2_FL_NOT_5709, 0x00000000, 0x0000ffff }, + { 0x0454, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + { 0x0458, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + + { 0x0808, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + { 0x0854, BNX2_FL_NOT_5709, 0x00000000, 0xffffffff }, + { 0x0868, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 }, + { 0x086c, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 }, + { 0x0870, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 }, + { 0x0874, BNX2_FL_NOT_5709, 0x00000000, 0x77777777 }, + + { 0x0c00, BNX2_FL_NOT_5709, 0x00000000, 0x00000001 }, + { 0x0c04, BNX2_FL_NOT_5709, 0x00000000, 0x03ff0001 }, + { 0x0c08, BNX2_FL_NOT_5709, 0x0f0ff073, 0x00000000 }, + + { 0x1000, 0, 0x00000000, 0x00000001 }, + { 0x1004, BNX2_FL_NOT_5709, 0x00000000, 0x000f0001 }, + + { 0x1408, 0, 0x01c00800, 0x00000000 }, + { 0x149c, 0, 0x8000ffff, 0x00000000 }, + { 0x14a8, 0, 0x00000000, 0x000001ff }, + { 0x14ac, 0, 0x0fffffff, 0x10000000 }, + { 0x14b0, 0, 0x00000002, 0x00000001 }, + { 0x14b8, 0, 0x00000000, 0x00000000 }, + { 0x14c0, 0, 0x00000000, 0x00000009 }, + { 0x14c4, 0, 0x00003fff, 0x00000000 }, + { 0x14cc, 0, 0x00000000, 0x00000001 }, + { 0x14d0, 0, 0xffffffff, 0x00000000 }, + + { 0x1800, 0, 0x00000000, 0x00000001 }, + { 0x1804, 0, 0x00000000, 0x00000003 }, + + { 0x2800, 0, 0x00000000, 0x00000001 }, + { 0x2804, 0, 0x00000000, 0x00003f01 }, + { 0x2808, 0, 0x0f3f3f03, 0x00000000 }, + { 0x2810, 0, 0xffff0000, 0x00000000 }, + { 0x2814, 0, 0xffff0000, 0x00000000 }, + { 0x2818, 0, 0xffff0000, 0x00000000 }, + { 0x281c, 0, 0xffff0000, 0x00000000 }, + { 0x2834, 0, 0xffffffff, 0x00000000 }, + { 0x2840, 0, 0x00000000, 0xffffffff }, + { 0x2844, 0, 0x00000000, 0xffffffff }, + { 0x2848, 0, 0xffffffff, 0x00000000 }, + { 0x284c, 0, 0xf800f800, 0x07ff07ff }, + + { 0x2c00, 0, 0x00000000, 0x00000011 }, + { 0x2c04, 0, 0x00000000, 0x00030007 }, + + { 0x3c00, 0, 0x00000000, 0x00000001 }, + { 0x3c04, 0, 0x00000000, 0x00070000 }, + { 0x3c08, 0, 0x00007f71, 0x07f00000 }, + { 0x3c0c, 0, 0x1f3ffffc, 0x00000000 }, + { 0x3c10, 0, 0xffffffff, 0x00000000 }, + { 0x3c14, 0, 0x00000000, 0xffffffff }, + { 0x3c18, 0, 0x00000000, 0xffffffff }, + { 0x3c1c, 0, 0xfffff000, 0x00000000 }, + { 0x3c20, 0, 0xffffff00, 0x00000000 }, + + { 0x5004, 0, 0x00000000, 0x0000007f }, + { 0x5008, 0, 0x0f0007ff, 0x00000000 }, + + { 0x5c00, 0, 0x00000000, 0x00000001 }, + { 0x5c04, 0, 0x00000000, 0x0003000f }, + { 0x5c08, 0, 0x00000003, 0x00000000 }, + { 0x5c0c, 0, 0x0000fff8, 0x00000000 }, + { 0x5c10, 0, 0x00000000, 0xffffffff }, + { 0x5c80, 0, 0x00000000, 0x0f7113f1 }, + { 0x5c84, 0, 0x00000000, 0x0000f333 }, + { 0x5c88, 0, 0x00000000, 0x00077373 }, + { 0x5c8c, 0, 0x00000000, 0x0007f737 }, + + { 0x6808, 0, 0x0000ff7f, 0x00000000 }, + { 0x680c, 0, 0xffffffff, 0x00000000 }, + { 0x6810, 0, 0xffffffff, 0x00000000 }, + { 0x6814, 0, 0xffffffff, 0x00000000 }, + { 0x6818, 0, 0xffffffff, 0x00000000 }, + { 0x681c, 0, 0xffffffff, 0x00000000 }, + { 0x6820, 0, 0x00ff00ff, 0x00000000 }, + { 0x6824, 0, 0x00ff00ff, 0x00000000 }, + { 0x6828, 0, 0x00ff00ff, 0x00000000 }, + { 0x682c, 0, 0x03ff03ff, 0x00000000 }, + { 0x6830, 0, 0x03ff03ff, 0x00000000 }, + { 0x6834, 0, 0x03ff03ff, 0x00000000 }, + { 0x6838, 0, 0x03ff03ff, 0x00000000 }, + { 0x683c, 0, 0x0000ffff, 0x00000000 }, + { 0x6840, 0, 0x00000ff0, 0x00000000 }, + { 0x6844, 0, 0x00ffff00, 0x00000000 }, + { 0x684c, 0, 0xffffffff, 0x00000000 }, + { 0x6850, 0, 0x7f7f7f7f, 0x00000000 }, + { 0x6854, 0, 0x7f7f7f7f, 0x00000000 }, + { 0x6858, 0, 0x7f7f7f7f, 0x00000000 }, + { 0x685c, 0, 0x7f7f7f7f, 0x00000000 }, + { 0x6908, 0, 0x00000000, 0x0001ff0f }, + { 0x690c, 0, 0x00000000, 0x0ffe00f0 }, + + { 0xffff, 0, 0x00000000, 0x00000000 }, + }; + + ret = 0; + is_5709 = 0; + if (CHIP_NUM(bp) == CHIP_NUM_5709) + is_5709 = 1; + + for (i = 0; reg_tbl[i].offset != 0xffff; i++) { + u32 offset, rw_mask, ro_mask, save_val, val; + u16 flags = reg_tbl[i].flags; + + if (is_5709 && (flags & BNX2_FL_NOT_5709)) + continue; + + offset = (u32) reg_tbl[i].offset; + rw_mask = reg_tbl[i].rw_mask; + ro_mask = reg_tbl[i].ro_mask; + + save_val = readl(bp->regview + offset); + + writel(0, bp->regview + offset); + + val = readl(bp->regview + offset); + if ((val & rw_mask) != 0) { + goto reg_test_err; + } + + if ((val & ro_mask) != (save_val & ro_mask)) { + goto reg_test_err; + } + + writel(0xffffffff, bp->regview + offset); + + val = readl(bp->regview + offset); + if ((val & rw_mask) != rw_mask) { + goto reg_test_err; + } + + if ((val & ro_mask) != (save_val & ro_mask)) { + goto reg_test_err; + } + + writel(save_val, bp->regview + offset); + continue; + +reg_test_err: + writel(save_val, bp->regview + offset); + ret = -ENODEV; + break; + } + return ret; +} + +static int +bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size) +{ + static const u32 test_pattern[] = { 0x00000000, 0xffffffff, 0x55555555, + 0xaaaaaaaa , 0xaa55aa55, 0x55aa55aa }; + int i; + + for (i = 0; i < sizeof(test_pattern) / 4; i++) { + u32 offset; + + for (offset = 0; offset < size; offset += 4) { + + bnx2_reg_wr_ind(bp, start + offset, test_pattern[i]); + + if (bnx2_reg_rd_ind(bp, start + offset) != + test_pattern[i]) { + return -ENODEV; + } + } + } + return 0; +} + +static int +bnx2_test_memory(struct bnx2 *bp) +{ + int ret = 0; + int i; + static struct mem_entry { + u32 offset; + u32 len; + } mem_tbl_5706[] = { + { 0x60000, 0x4000 }, + { 0xa0000, 0x3000 }, + { 0xe0000, 0x4000 }, + { 0x120000, 0x4000 }, + { 0x1a0000, 0x4000 }, + { 0x160000, 0x4000 }, + { 0xffffffff, 0 }, + }, + mem_tbl_5709[] = { + { 0x60000, 0x4000 }, + { 0xa0000, 0x3000 }, + { 0xe0000, 0x4000 }, + { 0x120000, 0x4000 }, + { 0x1a0000, 0x4000 }, + { 0xffffffff, 0 }, + }; + struct mem_entry *mem_tbl; + + if (CHIP_NUM(bp) == CHIP_NUM_5709) + mem_tbl = mem_tbl_5709; + else + mem_tbl = mem_tbl_5706; + + for (i = 0; mem_tbl[i].offset != 0xffffffff; i++) { + if ((ret = bnx2_do_mem_test(bp, mem_tbl[i].offset, + mem_tbl[i].len)) != 0) { + return ret; + } + } + + return ret; +} + +#define BNX2_MAC_LOOPBACK 0 +#define BNX2_PHY_LOOPBACK 1 + +static int +bnx2_run_loopback(struct bnx2 *bp, int loopback_mode) +{ + unsigned int pkt_size, num_pkts, i; + struct sk_buff *skb, *rx_skb; + unsigned char *packet; + u16 rx_start_idx, rx_idx; + dma_addr_t map; + struct tx_bd *txbd; + struct sw_bd *rx_buf; + struct l2_fhdr *rx_hdr; + int ret = -ENODEV; + struct bnx2_napi *bnapi = &bp->bnx2_napi[0], *tx_napi; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + + tx_napi = bnapi; + + txr = &tx_napi->tx_ring; + rxr = &bnapi->rx_ring; + if (loopback_mode == BNX2_MAC_LOOPBACK) { + bp->loopback = MAC_LOOPBACK; + bnx2_set_mac_loopback(bp); + } + else if (loopback_mode == BNX2_PHY_LOOPBACK) { + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return 0; + + bp->loopback = PHY_LOOPBACK; + bnx2_set_phy_loopback(bp); + } + else + return -EINVAL; + + pkt_size = min(bp->dev->mtu + ETH_HLEN, bp->rx_jumbo_thresh - 4); + skb = netdev_alloc_skb(bp->dev, pkt_size); + if (!skb) + return -ENOMEM; + packet = skb_put(skb, pkt_size); + memcpy(packet, bp->dev->dev_addr, 6); + memset(packet + 6, 0x0, 8); + for (i = 14; i < pkt_size; i++) + packet[i] = (unsigned char) (i & 0xff); + + map = pci_map_single(bp->pdev, skb->data, pkt_size, + PCI_DMA_TODEVICE); + + REG_WR(bp, BNX2_HC_COMMAND, + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); + + REG_RD(bp, BNX2_HC_COMMAND); + + udelay(5); + rx_start_idx = bnx2_get_hw_rx_cons(bnapi); + + num_pkts = 0; + + txbd = &txr->tx_desc_ring[TX_RING_IDX(txr->tx_prod)]; + + txbd->tx_bd_haddr_hi = (u64) map >> 32; + txbd->tx_bd_haddr_lo = (u64) map & 0xffffffff; + txbd->tx_bd_mss_nbytes = pkt_size; + txbd->tx_bd_vlan_tag_flags = TX_BD_FLAGS_START | TX_BD_FLAGS_END; + + num_pkts++; + txr->tx_prod = NEXT_TX_BD(txr->tx_prod); + txr->tx_prod_bseq += pkt_size; + + REG_WR16(bp, txr->tx_bidx_addr, txr->tx_prod); + REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq); + + udelay(100); + + REG_WR(bp, BNX2_HC_COMMAND, + bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); + + REG_RD(bp, BNX2_HC_COMMAND); + + udelay(5); + + pci_unmap_single(bp->pdev, map, pkt_size, PCI_DMA_TODEVICE); + dev_kfree_skb(skb); + + if (bnx2_get_hw_tx_cons(tx_napi) != txr->tx_prod) + goto loopback_test_done; + + rx_idx = bnx2_get_hw_rx_cons(bnapi); + if (rx_idx != rx_start_idx + num_pkts) { + goto loopback_test_done; + } + + rx_buf = &rxr->rx_buf_ring[rx_start_idx]; + rx_skb = rx_buf->skb; + + rx_hdr = (struct l2_fhdr *) rx_skb->data; + skb_reserve(rx_skb, BNX2_RX_OFFSET); + + pci_dma_sync_single_for_cpu(bp->pdev, + pci_unmap_addr(rx_buf, mapping), + bp->rx_buf_size, PCI_DMA_FROMDEVICE); + + if (rx_hdr->l2_fhdr_status & + (L2_FHDR_ERRORS_BAD_CRC | + L2_FHDR_ERRORS_PHY_DECODE | + L2_FHDR_ERRORS_ALIGNMENT | + L2_FHDR_ERRORS_TOO_SHORT | + L2_FHDR_ERRORS_GIANT_FRAME)) { + + goto loopback_test_done; + } + + if ((rx_hdr->l2_fhdr_pkt_len - 4) != pkt_size) { + goto loopback_test_done; + } + + for (i = 14; i < pkt_size; i++) { + if (*(rx_skb->data + i) != (unsigned char) (i & 0xff)) { + goto loopback_test_done; + } + } + + ret = 0; + +loopback_test_done: + bp->loopback = 0; + return ret; +} + +#define BNX2_MAC_LOOPBACK_FAILED 1 +#define BNX2_PHY_LOOPBACK_FAILED 2 +#define BNX2_LOOPBACK_FAILED (BNX2_MAC_LOOPBACK_FAILED | \ + BNX2_PHY_LOOPBACK_FAILED) + +static int +bnx2_test_loopback(struct bnx2 *bp) +{ + int rc = 0; + + if (!netif_running(bp->dev)) + return BNX2_LOOPBACK_FAILED; + + bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET); + spin_lock_bh(&bp->phy_lock); + bnx2_init_phy(bp, 1); + spin_unlock_bh(&bp->phy_lock); + if (bnx2_run_loopback(bp, BNX2_MAC_LOOPBACK)) + rc |= BNX2_MAC_LOOPBACK_FAILED; + if (bnx2_run_loopback(bp, BNX2_PHY_LOOPBACK)) + rc |= BNX2_PHY_LOOPBACK_FAILED; + return rc; +} + +#define NVRAM_SIZE 0x200 +#define CRC32_RESIDUAL 0xdebb20e3 + +static int +bnx2_test_nvram(struct bnx2 *bp) +{ + __be32 buf[NVRAM_SIZE / 4]; + u8 *data = (u8 *) buf; + int rc = 0; + u32 magic, csum; + + if ((rc = bnx2_nvram_read(bp, 0, data, 4)) != 0) + goto test_nvram_done; + + magic = be32_to_cpu(buf[0]); + if (magic != 0x669955aa) { + rc = -ENODEV; + goto test_nvram_done; + } + + if ((rc = bnx2_nvram_read(bp, 0x100, data, NVRAM_SIZE)) != 0) + goto test_nvram_done; + + csum = ether_crc_le(0x100, data); + if (csum != CRC32_RESIDUAL) { + rc = -ENODEV; + goto test_nvram_done; + } + + csum = ether_crc_le(0x100, data + 0x100); + if (csum != CRC32_RESIDUAL) { + rc = -ENODEV; + } + +test_nvram_done: + return rc; +} + +static int +bnx2_test_link(struct bnx2 *bp) +{ + u32 bmsr; + + if (!netif_running(bp->dev)) + return -ENODEV; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { + int i; + + for (i = 0; i < 6 && !bp->link_up; i++) { + if (bnx2_msleep_interruptible(500)) + break; + } + if (bp->link_up) + return 0; + return -ENODEV; + } + spin_lock_bh(&bp->phy_lock); + bnx2_enable_bmsr1(bp); + bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr); + bnx2_read_phy(bp, bp->mii_bmsr1, &bmsr); + bnx2_disable_bmsr1(bp); + spin_unlock_bh(&bp->phy_lock); + + if (bmsr & BMSR_LSTATUS) { + return 0; + } + return -ENODEV; +} + +static int +bnx2_test_intr(struct bnx2 *bp) +{ + int i; + u16 status_idx; + + if (!netif_running(bp->dev)) + return -ENODEV; + + status_idx = REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff; + + /* This register is not touched during run-time. */ + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | BNX2_HC_COMMAND_COAL_NOW); + REG_RD(bp, BNX2_HC_COMMAND); + + for (i = 0; i < 10; i++) { + if ((REG_RD(bp, BNX2_PCICFG_INT_ACK_CMD) & 0xffff) != + status_idx) { + + break; + } + + bnx2_msleep_interruptible(10); + } + if (i < 10) + return 0; + + return -ENODEV; +} + +/* Determining link for parallel detection. */ +static int +bnx2_5706_serdes_has_link(struct bnx2 *bp) +{ + u32 mode_ctl, an_dbg, exp; + + if (bp->phy_flags & BNX2_PHY_FLAG_NO_PARALLEL) + return 0; + + bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_MODE_CTL); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &mode_ctl); + + if (!(mode_ctl & MISC_SHDW_MODE_CTL_SIG_DET)) + return 0; + + bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); + + if (an_dbg & (MISC_SHDW_AN_DBG_NOSYNC | MISC_SHDW_AN_DBG_RUDI_INVALID)) + return 0; + + bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_REG1); + bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp); + bnx2_read_phy(bp, MII_BNX2_DSP_RW_PORT, &exp); + + if (exp & MII_EXPAND_REG1_RUDI_C) /* receiving CONFIG */ + return 0; + + return 1; +} + +static void +bnx2_5706_serdes_timer(struct bnx2 *bp) +{ + int check_link = 1; + + spin_lock(&bp->phy_lock); + if (bp->serdes_an_pending) { + bp->serdes_an_pending--; + check_link = 0; + } else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) { + u32 bmcr; + + bp->current_interval = BNX2_TIMER_INTERVAL; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + + if (bmcr & BMCR_ANENABLE) { + if (bnx2_5706_serdes_has_link(bp)) { + bmcr &= ~BMCR_ANENABLE; + bmcr |= BMCR_SPEED1000 | BMCR_FULLDPLX; + bnx2_write_phy(bp, bp->mii_bmcr, bmcr); + bp->phy_flags |= BNX2_PHY_FLAG_PARALLEL_DETECT; + } + } + } + else if ((bp->link_up) && (bp->autoneg & AUTONEG_SPEED) && + (bp->phy_flags & BNX2_PHY_FLAG_PARALLEL_DETECT)) { + u32 phy2; + + bnx2_write_phy(bp, 0x17, 0x0f01); + bnx2_read_phy(bp, 0x15, &phy2); + if (phy2 & 0x20) { + u32 bmcr; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + bmcr |= BMCR_ANENABLE; + bnx2_write_phy(bp, bp->mii_bmcr, bmcr); + + bp->phy_flags &= ~BNX2_PHY_FLAG_PARALLEL_DETECT; + } + } else + bp->current_interval = BNX2_TIMER_INTERVAL; + + if (check_link) { + u32 val; + + bnx2_write_phy(bp, MII_BNX2_MISC_SHADOW, MISC_SHDW_AN_DBG); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val); + bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &val); + + if (bp->link_up && (val & MISC_SHDW_AN_DBG_NOSYNC)) { + if (!(bp->phy_flags & BNX2_PHY_FLAG_FORCED_DOWN)) { + bnx2_5706s_force_link_dn(bp, 1); + bp->phy_flags |= BNX2_PHY_FLAG_FORCED_DOWN; + } else + bnx2_set_link(bp); + } else if (!bp->link_up && !(val & MISC_SHDW_AN_DBG_NOSYNC)) + bnx2_set_link(bp); + } + spin_unlock(&bp->phy_lock); +} + +static void +bnx2_5708_serdes_timer(struct bnx2 *bp) +{ + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return; + + if ((bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) == 0) { + bp->serdes_an_pending = 0; + return; + } + + spin_lock(&bp->phy_lock); + if (bp->serdes_an_pending) + bp->serdes_an_pending--; + else if ((bp->link_up == 0) && (bp->autoneg & AUTONEG_SPEED)) { + u32 bmcr; + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + if (bmcr & BMCR_ANENABLE) { + bnx2_enable_forced_2g5(bp); + bp->current_interval = BNX2_SERDES_FORCED_TIMEOUT; + } else { + bnx2_disable_forced_2g5(bp); + bp->serdes_an_pending = 2; + bp->current_interval = BNX2_TIMER_INTERVAL; + } + + } else + bp->current_interval = BNX2_TIMER_INTERVAL; + + spin_unlock(&bp->phy_lock); +} + +static void +bnx2_timer(unsigned long data) +{ + struct bnx2 *bp = (struct bnx2 *) data; + + if (!netif_running(bp->dev)) + return; + + if (atomic_read(&bp->intr_sem) != 0) + goto bnx2_restart_timer; + +#ifdef CONFIG_PCI_MSI + if ((bp->flags & (BNX2_FLAG_USING_MSI | BNX2_FLAG_ONE_SHOT_MSI)) == + BNX2_FLAG_USING_MSI) + bnx2_chk_missed_msi(bp); +#endif + + bnx2_send_heart_beat(bp); + + bp->stats_blk->stat_FwRxDrop = + bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT); + + /* workaround occasional corrupted counters */ + if ((bp->flags & BNX2_FLAG_BROKEN_STATS) && bp->stats_ticks) + REG_WR(bp, BNX2_HC_COMMAND, bp->hc_cmd | + BNX2_HC_COMMAND_STATS_NOW); + + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + if (CHIP_NUM(bp) == CHIP_NUM_5706) + bnx2_5706_serdes_timer(bp); + else + bnx2_5708_serdes_timer(bp); + } + +bnx2_restart_timer: + mod_timer(&bp->timer, jiffies + bp->current_interval); +} + +static int +bnx2_request_irq(struct bnx2 *bp) +{ + unsigned long flags; + struct bnx2_irq *irq; + int rc = 0, i; + + if (bp->flags & BNX2_FLAG_USING_MSI_OR_MSIX) + flags = 0; + else + flags = IRQF_SHARED; + + for (i = 0; i < bp->irq_nvecs; i++) { + irq = &bp->irq_tbl[i]; + rc = request_irq(irq->vector, irq->handler, flags, irq->name, + &bp->bnx2_napi[i]); + if (rc) + break; + irq->requested = 1; + } + return rc; +} + +static void +bnx2_free_irq(struct bnx2 *bp) +{ + struct bnx2_irq *irq; + int i; + + for (i = 0; i < bp->irq_nvecs; i++) { + irq = &bp->irq_tbl[i]; + if (irq->requested) + free_irq(irq->vector, &bp->bnx2_napi[i]); + irq->requested = 0; + } +#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_USING_MSI) + pci_disable_msi(bp->pdev); + else if (bp->flags & BNX2_FLAG_USING_MSIX) + pci_disable_msix(bp->pdev); + + bp->flags &= ~(BNX2_FLAG_USING_MSI_OR_MSIX | BNX2_FLAG_ONE_SHOT_MSI); +#endif +} + +#ifdef CONFIG_PCI_MSI +static void +bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) +{ +#ifdef BNX2_NEW_NAPI + int i, rc; + struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC]; + struct net_device *dev = bp->dev; + const int len = sizeof(bp->irq_tbl[0].name); + + bnx2_setup_msix_tbl(bp); + REG_WR(bp, BNX2_PCI_MSIX_CONTROL, BNX2_MAX_MSIX_HW_VEC - 1); + REG_WR(bp, BNX2_PCI_MSIX_TBL_OFF_BIR, BNX2_PCI_GRC_WINDOW2_BASE); + REG_WR(bp, BNX2_PCI_MSIX_PBA_OFF_BIT, BNX2_PCI_GRC_WINDOW3_BASE); + + /* Need to flush the previous three writes to ensure MSI-X + * is setup properly */ + REG_RD(bp, BNX2_PCI_MSIX_CONTROL); + + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + msix_ent[i].entry = i; + msix_ent[i].vector = 0; + } + + rc = pci_enable_msix(bp->pdev, msix_ent, BNX2_MAX_MSIX_VEC); + if (rc != 0) + return; + + bp->irq_nvecs = msix_vecs; + bp->flags |= BNX2_FLAG_USING_MSIX | BNX2_FLAG_ONE_SHOT_MSI; + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { + bp->irq_tbl[i].vector = msix_ent[i].vector; + snprintf(bp->irq_tbl[i].name, len, "%s-%d", dev->name, i); + bp->irq_tbl[i].handler = bnx2_msi_1shot; + } +#endif +} +#endif + +static void +bnx2_setup_int_mode(struct bnx2 *bp, int dis_msi) +{ +#ifdef CONFIG_PCI_MSI + int cpus = num_online_cpus(); +#if defined(BNX2_ENABLE_NETQUEUE) + int msix_vecs = min(cpus, 4); + if(force_netq_param[bp->index] != BNX2_OPTION_UNSET) + msix_vecs = min(force_netq_param[bp->index], RX_MAX_RSS_RINGS); + + /* Once is for the default queuue */ + msix_vecs += 1; +#else +#if defined(__VMKLNX__) + /* If NetQueue is not enable then force the number of queues to 1 */ + int msix_vecs = 1; +#else + int msix_vecs = min(cpus + 1, RX_MAX_RINGS); +#endif /* defined(__VMKLNX__) */ +#endif +#endif + + bp->irq_tbl[0].handler = bnx2_interrupt; + strcpy(bp->irq_tbl[0].name, bp->dev->name); + bp->irq_nvecs = 1; + bp->irq_tbl[0].vector = bp->pdev->irq; + +#ifdef CONFIG_PCI_MSI + if ((bp->flags & BNX2_FLAG_MSIX_CAP) && !dis_msi && cpus > 1) + bnx2_enable_msix(bp, msix_vecs); + + if ((bp->flags & BNX2_FLAG_MSI_CAP) && !dis_msi && + !(bp->flags & BNX2_FLAG_USING_MSIX)) { + if (pci_enable_msi(bp->pdev) == 0) { + bp->flags |= BNX2_FLAG_USING_MSI; + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + bp->flags |= BNX2_FLAG_ONE_SHOT_MSI; + bp->irq_tbl[0].handler = bnx2_msi_1shot; + } else + bp->irq_tbl[0].handler = bnx2_msi; + + bp->irq_tbl[0].vector = bp->pdev->irq; + } + } +#endif +#ifdef BCM_CNIC + mutex_lock(&bp->cnic_lock); + bnx2_setup_cnic_irq_info(bp); + mutex_unlock(&bp->cnic_lock); +#endif + +#ifndef BCM_HAVE_MULTI_QUEUE + bp->num_tx_rings = 1; +#else +#if defined(__VMKLNX__) +#if defined(BNX2_ENABLE_NETQUEUE) + bp->num_tx_rings = bp->irq_nvecs; + bp->dev->real_num_tx_queues = bp->num_tx_rings; +#else + bp->num_tx_rings = 1; +#endif +#else + bp->num_tx_rings = rounddown_pow_of_two(bp->irq_nvecs); +#endif + bp->dev->real_num_tx_queues = bp->num_tx_rings; +#endif + bp->num_rx_rings = bp->irq_nvecs; +} + +/* Called with rtnl_lock */ +static int +bnx2_open(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + int rc; + + netif_carrier_off(dev); + + bnx2_set_power_state(bp, PCI_D0); + bnx2_disable_int(bp); + +#if !defined(__VMKLNX__) + bnx2_setup_int_mode(bp, disable_msi); +#endif /* !defined(__VMKLNX__) */ + +#ifdef BNX2_NEW_NAPI + bnx2_napi_enable(bp); +#endif + rc = bnx2_alloc_mem(bp); + if (rc) + goto open_err; + + rc = bnx2_request_irq(bp); + if (rc) + goto open_err; + + rc = bnx2_init_nic(bp, 1); + if (rc) + goto open_err; + + mod_timer(&bp->timer, jiffies + bp->current_interval); + + atomic_set(&bp->intr_sem, 0); + + bnx2_enable_int(bp); + +#ifdef CONFIG_PCI_MSI + if (bp->flags & BNX2_FLAG_USING_MSI) { + /* Test MSI to make sure it is working + * If MSI test fails, go back to INTx mode + */ + if (bnx2_test_intr(bp) != 0) { + printk(KERN_WARNING PFX "%s: No interrupt was generated" + " using MSI, switching to INTx mode. Please" + " report this failure to the PCI maintainer" + " and include system chipset information.\n", + bp->dev->name); + + bnx2_disable_int(bp); + bnx2_free_irq(bp); + + bnx2_setup_int_mode(bp, 1); + + rc = bnx2_init_nic(bp, 0); + + if (!rc) + rc = bnx2_request_irq(bp); + + if (rc) { + del_timer_sync(&bp->timer); + goto open_err; + } + bnx2_enable_int(bp); + } + } + + if (bp->flags & BNX2_FLAG_USING_MSI) + printk(KERN_INFO PFX "%s: using MSI\n", dev->name); + else if (bp->flags & BNX2_FLAG_USING_MSIX) + printk(KERN_INFO PFX "%s: using MSIX\n", dev->name); +#endif +#if defined(BNX2_ENABLE_NETQUEUE) + if (bnx2_netqueue_is_avail(bp)) + bnx2_open_netqueue_hw(bp); +#endif + + netif_tx_start_all_queues(dev); + + return 0; + +open_err: +#ifdef BNX2_NEW_NAPI + bnx2_napi_disable(bp); +#endif + bnx2_free_skbs(bp); + bnx2_free_irq(bp); + bnx2_free_mem(bp); + return rc; +} + +#if defined(__VMKLNX__) +static void +bnx2_init_nic_err_handler(struct bnx2 *bp) +{ + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; + struct bnx2_rx_ring_info *rxr = &bnapi->rx_ring; + + /* Turn off carrier and initialize the counters to prevent the Watchdog from keep resetting the nic + * and driver from accessing invalid buffers. + */ + bp->link_up = 0; + netif_carrier_off(bp->dev); + txr->tx_cons = bnx2_get_hw_tx_cons(bnapi); + rxr->rx_cons = bnx2_get_hw_rx_cons(bnapi); + bp->reset_failed = 1; +} +#endif + +static void +#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) +bnx2_reset_task(struct work_struct *work) +#else +bnx2_reset_task(void *data) +#endif +{ +#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) + struct bnx2 *bp = container_of(work, struct bnx2, reset_task); +#else + struct bnx2 *bp = data; +#endif +#if defined(__VMKLNX__) + int rc; +#endif + + if (!netif_running(bp->dev)) + return; + + mutex_lock(&bp->reset_lock); + + bnx2_netif_stop(bp); + +#if defined(__VMKLNX__) + rc = bnx2_init_nic(bp, 1); + if (rc) { + bnx2_init_nic_err_handler(bp); + printk(KERN_ERR PFX "Resetting... NIC initialization failed: " + "%s\n", bp->dev->name); + } else { + atomic_set(&bp->intr_sem, 1); + bnx2_netif_start(bp); + } +#else /* original code */ + bnx2_init_nic(bp, 1); + atomic_set(&bp->intr_sem, 1); + bnx2_netif_start(bp); +#endif + + mutex_unlock(&bp->reset_lock); +} + +static void bnx2_dump_ftq(struct bnx2 *bp) +{ + printk(KERN_ERR PFX "<--- start FTQ dump on %s --->\n", bp->dev->name); + printk(KERN_ERR PFX "%s: BNX2_RV2P_PFTQ_CTL %x\n", bp->dev->name, + REG_RD(bp, BNX2_RV2P_PFTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_RV2P_TFTQ_CTL %x\n", bp->dev->name, + REG_RD(bp, BNX2_RV2P_TFTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_RV2P_MFTQ_CTL %x\n", bp->dev->name, + REG_RD(bp, BNX2_RV2P_MFTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_TBDR_FTQ_CTL %x\n", bp->dev->name, + REG_RD(bp, BNX2_TBDR_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_TDMA_FTQ_CTL %x\n", bp->dev->name, + REG_RD(bp, BNX2_TDMA_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_TXP_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_TXP_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_TPAT_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_TPAT_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_RXP_CFTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_RXP_CFTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_RXP_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_RXP_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_COM_COMXQ_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_COM_COMXQ_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_COM_COMTQ_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_COM_COMTQ_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_COM_COMQ_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_COM_COMQ_FTQ_CTL)); + printk(KERN_ERR PFX "%s: BNX2_CP_CPQ_FTQ_CTL %x\n", bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_CP_CPQ_FTQ_CTL)); + printk(KERN_ERR PFX + "%s: TXP mode %x state %x evt_mask %x pc %x pc %x instr %x\n", + bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_MODE), + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_STATE), + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_EVENT_MASK), + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_TXP_CPU_INSTRUCTION)); + printk(KERN_ERR PFX + "%s: TPAT mode %x state %x evt_mask %x pc %x pc %x instr %x\n", + bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_MODE), + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_STATE), + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_EVENT_MASK), + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_TPAT_CPU_INSTRUCTION)); + printk(KERN_ERR PFX + "%s: RXP mode %x state %x evt_mask %x pc %x pc %x instr %x\n", + bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_MODE), + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_STATE), + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_EVENT_MASK), + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_RXP_CPU_INSTRUCTION)); + printk(KERN_ERR PFX + "%s: COM mode %x state %x evt_mask %x pc %x pc %x instr %x\n", + bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_MODE), + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_STATE), + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_EVENT_MASK), + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_COM_CPU_INSTRUCTION)); + printk(KERN_ERR PFX + "%s: CP mode %x state %x evt_mask %x pc %x pc %x instr %x\n", + bp->dev->name, + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_MODE), + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_STATE), + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_EVENT_MASK), + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_PROGRAM_COUNTER), + bnx2_reg_rd_ind(bp, BNX2_CP_CPU_INSTRUCTION)); + printk(KERN_ERR PFX "<--- end FTQ dump on %s --->\n", bp->dev->name); +} + +static void +bnx2_dump_state(struct bnx2 *bp) +{ + printk(KERN_ERR PFX "DEBUG: intr_sem[%x]\n", + atomic_read(&bp->intr_sem)); + printk(KERN_ERR PFX "DEBUG: EMAC_TX_STATUS[%08x] RPM_MGMT_PKT_CTRL[%08x]\n", + REG_RD(bp, BNX2_EMAC_TX_STATUS), + REG_RD(bp, BNX2_RPM_MGMT_PKT_CTRL)); + printk(KERN_ERR PFX "DEBUG: MCP_STATE_P0[%08x] MCP_STATE_P1[%08x]\n", + bnx2_reg_rd_ind(bp, BNX2_MCP_STATE_P0), + bnx2_reg_rd_ind(bp, BNX2_MCP_STATE_P1)); + printk(KERN_ERR PFX "DEBUG: HC_STATS_INTERRUPT_STATUS[%08x]\n", + REG_RD(bp, BNX2_HC_STATS_INTERRUPT_STATUS)); + if (bp->flags & BNX2_FLAG_USING_MSIX) + printk(KERN_ERR PFX "DEBUG: PBA[%08x]\n", + REG_RD(bp, BNX2_PCI_GRC_WINDOW3_BASE)); +} + +static void +bnx2_tx_timeout(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + + bnx2_dump_ftq(bp); + bnx2_dump_state(bp); + + if (stop_on_tx_timeout) { + printk(KERN_WARNING PFX + "%s: prevent chip reset during tx timeout\n", + bp->dev->name); + return; + } + + /* This allows the netif to be shutdown gracefully before resetting */ +#if (LINUX_VERSION_CODE >= 0x20600) + schedule_work(&bp->reset_task); +#else + schedule_task(&bp->reset_task); +#endif +} + +#ifdef BCM_VLAN +/* Called with rtnl_lock */ +static void +bnx2_vlan_rx_register(struct net_device *dev, struct vlan_group *vlgrp) +{ + struct bnx2 *bp = netdev_priv(dev); + +#if defined(__VMKLNX__) + if(bp->reset_failed) { + printk(KERN_ERR "%s: Previous error detected preventing vlan " + "register\n", bp->dev->name); + return; + } +#endif /* defined(__VMKLNX__) */ + + if (netif_running(dev)) + bnx2_netif_stop(bp); + + bp->vlgrp = vlgrp; + + if (!netif_running(dev)) + return; + + bnx2_set_rx_mode(dev); + if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) + bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); + + bnx2_netif_start(bp); +} + +#if (LINUX_VERSION_CODE < 0x20616) +/* Called with rtnl_lock */ +static void +bnx2_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) +{ + struct bnx2 *bp = netdev_priv(dev); + +#if defined(__VMKLNX__) + if(bp->reset_failed) { + printk(KERN_ERR "%s: Previous error detected preventing vid " + "change\n", bp->dev->name); + return; + } +#endif /* defined(__VMKLNX__) */ + + if (netif_running(dev)) + bnx2_netif_stop(bp); + + vlan_group_set_device(bp->vlgrp, vid, NULL); + + if (!netif_running(dev)) + return; + + bnx2_set_rx_mode(dev); + if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) + bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE, 0, 1); + + bnx2_netif_start(bp); +} +#endif +#endif + +/* Called with netif_tx_lock. + * bnx2_tx_int() runs without netif_tx_lock unless it needs to call + * netif_wake_queue(). + */ +static int +bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + dma_addr_t mapping; + struct tx_bd *txbd; + struct sw_tx_bd *tx_buf; + u32 len, vlan_tag_flags, last_frag, mss; + u16 prod, ring_prod; + int i; +#ifndef BCM_HAVE_MULTI_QUEUE + struct bnx2_napi *bnapi = &bp->bnx2_napi[0]; + struct bnx2_tx_ring_info *txr = &bnapi->tx_ring; +#else + struct bnx2_napi *bnapi; + struct bnx2_tx_ring_info *txr; + struct netdev_queue *txq; + + /* Determine which tx ring we will be placed on */ + i = skb_get_queue_mapping(skb); + bnapi = &bp->bnx2_napi[i]; + txr = &bnapi->tx_ring; + txq = netdev_get_tx_queue(dev, i); +#endif + + if (unlikely(bnx2_tx_avail(bp, txr) < + (skb_shinfo(skb)->nr_frags + 1))) { +#ifndef BCM_HAVE_MULTI_QUEUE + netif_stop_queue(dev); +#else + netif_tx_stop_queue(txq); +#endif + printk(KERN_ERR PFX "%s: BUG! Tx ring full when queue awake!\n", + dev->name); + + return NETDEV_TX_BUSY; + } + len = skb_headlen(skb); + prod = txr->tx_prod; + ring_prod = TX_RING_IDX(prod); + + vlan_tag_flags = 0; + if (skb->ip_summed == CHECKSUM_PARTIAL) { + vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; + } + +#ifdef BCM_VLAN + if (bp->vlgrp && vlan_tx_tag_present(skb)) { + vlan_tag_flags |= + (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); + } +#endif +#ifdef BCM_TSO + if ((mss = skb_shinfo(skb)->gso_size)) { + u32 tcp_opt_len; + struct iphdr *iph; + + tcp_opt_len = tcp_optlen(skb); + + if (skb_transport_offset(skb) + tcp_opt_len + + sizeof(struct tcphdr) + mss >= skb->len) + goto abort_tso; + + vlan_tag_flags |= TX_BD_FLAGS_SW_LSO; + +#ifndef BCM_NO_TSO6 + if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) { + u32 tcp_off = skb_transport_offset(skb) - + sizeof(struct ipv6hdr) - ETH_HLEN; + + vlan_tag_flags |= ((tcp_opt_len >> 2) << 8) | + TX_BD_FLAGS_SW_FLAGS; + if (likely(tcp_off == 0)) + vlan_tag_flags &= ~TX_BD_FLAGS_TCP6_OFF0_MSK; + else { + tcp_off >>= 3; + vlan_tag_flags |= ((tcp_off & 0x3) << + TX_BD_FLAGS_TCP6_OFF0_SHL) | + ((tcp_off & 0x10) << + TX_BD_FLAGS_TCP6_OFF4_SHL); + mss |= (tcp_off & 0xc) << TX_BD_TCP6_OFF2_SHL; + } + } else +#endif + { + iph = ip_hdr(skb); + if (tcp_opt_len || (iph->ihl > 5)) { + vlan_tag_flags |= ((iph->ihl - 5) + + (tcp_opt_len >> 2)) << 8; + } + } + } + else +abort_tso: +#endif + { + mss = 0; + } + + mapping = pci_map_single(bp->pdev, skb->data, len, PCI_DMA_TODEVICE); +#if (LINUX_VERSION_CODE >= 0x02061b) + if (pci_dma_mapping_error(bp->pdev, mapping)) { +#else + if (pci_dma_mapping_error(mapping)) { +#endif + dev_kfree_skb(skb); + return NETDEV_TX_OK; + } + + tx_buf = &txr->tx_buf_ring[ring_prod]; + tx_buf->skb = skb; + pci_unmap_addr_set(tx_buf, mapping, mapping); + + txbd = &txr->tx_desc_ring[ring_prod]; + + txbd->tx_bd_haddr_hi = (u64) mapping >> 32; + txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff; + txbd->tx_bd_mss_nbytes = len | (mss << 16); + txbd->tx_bd_vlan_tag_flags = vlan_tag_flags | TX_BD_FLAGS_START; + + last_frag = skb_shinfo(skb)->nr_frags; + tx_buf->nr_frags = last_frag; + tx_buf->is_gso = skb_is_gso(skb); + + for (i = 0; i < last_frag; i++) { + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + prod = NEXT_TX_BD(prod); + ring_prod = TX_RING_IDX(prod); + txbd = &txr->tx_desc_ring[ring_prod]; + + len = frag->size; + mapping = pci_map_page(bp->pdev, frag->page, frag->page_offset, + len, PCI_DMA_TODEVICE); + pci_unmap_addr_set(&txr->tx_buf_ring[ring_prod], + mapping, mapping); + + txbd->tx_bd_haddr_hi = (u64) mapping >> 32; + txbd->tx_bd_haddr_lo = (u64) mapping & 0xffffffff; + txbd->tx_bd_mss_nbytes = len | (mss << 16); + txbd->tx_bd_vlan_tag_flags = vlan_tag_flags; + + } + txbd->tx_bd_vlan_tag_flags |= TX_BD_FLAGS_END; + + prod = NEXT_TX_BD(prod); + txr->tx_prod_bseq += skb->len; + + barrier(); + REG_WR16(bp, txr->tx_bidx_addr, prod); + REG_WR(bp, txr->tx_bseq_addr, txr->tx_prod_bseq); + + mmiowb(); + + txr->tx_prod = prod; + dev->trans_start = jiffies; + +#if defined(BNX2_ENABLE_NETQUEUE) + bnapi->tx_packets_sent++; + wmb(); +#endif + + if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) { +#ifndef BCM_HAVE_MULTI_QUEUE + netif_stop_queue(dev); +#else + netif_tx_stop_queue(txq); +#endif + if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh) +#ifndef BCM_HAVE_MULTI_QUEUE + netif_wake_queue(dev); +#else + netif_tx_wake_queue(txq); +#endif + } + + return NETDEV_TX_OK; +} + +#if defined(BNX2_ENABLE_NETQUEUE) +/* Called with rtnl_lock */ +static int +bnx2_close(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + +#if (LINUX_VERSION_CODE >= 0x20616) + cancel_work_sync(&bp->reset_task); +#endif + + mutex_lock(&bp->reset_lock); + netif_tx_disable(bp->dev); + bp->dev->trans_start = jiffies; /* prevent tx timeout */ + + if (bnx2_netqueue_is_avail(bp) && + (bp->netq_state == BNX2_NETQ_HW_STARTED)) + bnx2_netqueue_flush_all(bp); + bnx2_netif_stop(bp); + + if (bnx2_netqueue_is_avail(bp)) + bnx2_close_netqueue_hw(bp); + + del_timer_sync(&bp->timer); + if (bp->reset_failed == 0) + bnx2_shutdown_chip(bp); + bnx2_free_irq(bp); + bnx2_free_skbs(bp); + bnx2_free_mem(bp); + bp->link_up = 0; + netif_carrier_off(bp->dev); + bnx2_set_power_state(bp, PCI_D3hot); + + mutex_unlock(&bp->reset_lock); + return 0; +} +#else +/* Called with rtnl_lock */ +static int +bnx2_close(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + +#if (LINUX_VERSION_CODE >= 0x20616) + cancel_work_sync(&bp->reset_task); +#endif + + bnx2_disable_int_sync(bp); +#ifdef BNX2_NEW_NAPI +#if defined(__VMKLNX__) + /* Prevent napi_disable from being called continuously */ + if (atomic_read(&bp->intr_sem) == 1) { + bnx2_napi_disable(bp); + } +#else + bnx2_napi_disable(bp); +#endif +#endif + del_timer_sync(&bp->timer); + bnx2_shutdown_chip(bp); + bnx2_free_irq(bp); + bnx2_free_skbs(bp); + bnx2_free_mem(bp); + bp->link_up = 0; + netif_carrier_off(bp->dev); + bnx2_set_power_state(bp, PCI_D3hot); + return 0; +} +#endif /* defined(BNX2_ENABLE_NETQUEUE) */ + +#define GET_NET_STATS64(ctr) \ + (unsigned long) ((unsigned long) (ctr##_hi) << 32) + \ + (unsigned long) (ctr##_lo) + +#define GET_NET_STATS32(ctr) \ + (ctr##_lo) + +#if (BITS_PER_LONG == 64) +#define GET_NET_STATS GET_NET_STATS64 +#else +#define GET_NET_STATS GET_NET_STATS32 +#endif + +static struct net_device_stats * +bnx2_get_stats(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + struct statistics_block *stats_blk = bp->stats_blk; + struct net_device_stats *net_stats = &bp->net_stats; + + if (bp->stats_blk == NULL) { + return net_stats; + } + net_stats->rx_packets = + GET_NET_STATS(stats_blk->stat_IfHCInUcastPkts) + + GET_NET_STATS(stats_blk->stat_IfHCInMulticastPkts) + + GET_NET_STATS(stats_blk->stat_IfHCInBroadcastPkts); + + net_stats->tx_packets = + GET_NET_STATS(stats_blk->stat_IfHCOutUcastPkts) + + GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts) + + GET_NET_STATS(stats_blk->stat_IfHCOutBroadcastPkts); + + net_stats->rx_bytes = + GET_NET_STATS(stats_blk->stat_IfHCInOctets); + + net_stats->tx_bytes = + GET_NET_STATS(stats_blk->stat_IfHCOutOctets); + + net_stats->multicast = + GET_NET_STATS(stats_blk->stat_IfHCOutMulticastPkts); + + net_stats->collisions = + (unsigned long) stats_blk->stat_EtherStatsCollisions; + + net_stats->rx_length_errors = + (unsigned long) (stats_blk->stat_EtherStatsUndersizePkts + + stats_blk->stat_EtherStatsOverrsizePkts); + + net_stats->rx_over_errors = + (unsigned long) (stats_blk->stat_IfInFTQDiscards + + stats_blk->stat_IfInMBUFDiscards); + + net_stats->rx_frame_errors = + (unsigned long) stats_blk->stat_Dot3StatsAlignmentErrors; + + net_stats->rx_crc_errors = + (unsigned long) stats_blk->stat_Dot3StatsFCSErrors; + + net_stats->rx_errors = net_stats->rx_length_errors + + net_stats->rx_over_errors + net_stats->rx_frame_errors + + net_stats->rx_crc_errors; + + net_stats->tx_aborted_errors = + (unsigned long) (stats_blk->stat_Dot3StatsExcessiveCollisions + + stats_blk->stat_Dot3StatsLateCollisions); + + if ((CHIP_NUM(bp) == CHIP_NUM_5706) || + (CHIP_ID(bp) == CHIP_ID_5708_A0)) + net_stats->tx_carrier_errors = 0; + else { + net_stats->tx_carrier_errors = + (unsigned long) + stats_blk->stat_Dot3StatsCarrierSenseErrors; + } + + net_stats->tx_errors = + (unsigned long) + stats_blk->stat_emac_tx_stat_dot3statsinternalmactransmiterrors + + + net_stats->tx_aborted_errors + + net_stats->tx_carrier_errors; + + net_stats->rx_missed_errors = + (unsigned long) (stats_blk->stat_IfInFTQDiscards + + stats_blk->stat_IfInMBUFDiscards + stats_blk->stat_FwRxDrop); + + return net_stats; +} + +/* All ethtool functions called with rtnl_lock */ + +static int +bnx2_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct bnx2 *bp = netdev_priv(dev); + int support_serdes = 0, support_copper = 0; + + cmd->supported = SUPPORTED_Autoneg; + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { + support_serdes = 1; + support_copper = 1; + } else if (bp->phy_port == PORT_FIBRE) + support_serdes = 1; + else + support_copper = 1; + + if (support_serdes) { + cmd->supported |= SUPPORTED_1000baseT_Full | + SUPPORTED_FIBRE; + if (bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) + cmd->supported |= SUPPORTED_2500baseX_Full; + + } + if (support_copper) { + cmd->supported |= SUPPORTED_10baseT_Half | + SUPPORTED_10baseT_Full | + SUPPORTED_100baseT_Half | + SUPPORTED_100baseT_Full | + SUPPORTED_1000baseT_Full | + SUPPORTED_TP; + + } + + spin_lock_bh(&bp->phy_lock); + cmd->port = bp->phy_port; + cmd->advertising = bp->advertising; + + if (bp->autoneg & AUTONEG_SPEED) { + cmd->autoneg = AUTONEG_ENABLE; + } + else { + cmd->autoneg = AUTONEG_DISABLE; + } + + if (netif_carrier_ok(dev)) { + cmd->speed = bp->line_speed; + cmd->duplex = bp->duplex; + } + else { + cmd->speed = -1; + cmd->duplex = -1; + } + spin_unlock_bh(&bp->phy_lock); + + cmd->transceiver = XCVR_INTERNAL; + cmd->phy_address = bp->phy_addr; + + return 0; +} + +static int +bnx2_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct bnx2 *bp = netdev_priv(dev); + u8 autoneg = bp->autoneg; + u8 req_duplex = bp->req_duplex; + u16 req_line_speed = bp->req_line_speed; + u32 advertising = bp->advertising; + int err = -EINVAL; + + spin_lock_bh(&bp->phy_lock); + + if (cmd->port != PORT_TP && cmd->port != PORT_FIBRE) + goto err_out_unlock; + + if (cmd->port != bp->phy_port && + !(bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP)) + goto err_out_unlock; + + /* If device is down, we can store the settings only if the user + * is setting the currently active port. + */ + if (!netif_running(dev) && cmd->port != bp->phy_port) + goto err_out_unlock; + + if (cmd->autoneg == AUTONEG_ENABLE) { + autoneg |= AUTONEG_SPEED; + + cmd->advertising &= ETHTOOL_ALL_COPPER_SPEED; + + /* allow advertising 1 speed */ + if ((cmd->advertising == ADVERTISED_10baseT_Half) || + (cmd->advertising == ADVERTISED_10baseT_Full) || + (cmd->advertising == ADVERTISED_100baseT_Half) || + (cmd->advertising == ADVERTISED_100baseT_Full)) { + + if (cmd->port == PORT_FIBRE) + goto err_out_unlock; + + advertising = cmd->advertising; + + } else if (cmd->advertising == ADVERTISED_2500baseX_Full) { + if (!(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE) || + (cmd->port == PORT_TP)) + goto err_out_unlock; + } else if (cmd->advertising == ADVERTISED_1000baseT_Full) + advertising = cmd->advertising; + else if (cmd->advertising == ADVERTISED_1000baseT_Half) + goto err_out_unlock; + else { + if (cmd->port == PORT_FIBRE) + advertising = ETHTOOL_ALL_FIBRE_SPEED; + else + advertising = ETHTOOL_ALL_COPPER_SPEED; + } + advertising |= ADVERTISED_Autoneg; + } + else { + if (cmd->port == PORT_FIBRE) { + if ((cmd->speed != SPEED_1000 && + cmd->speed != SPEED_2500) || + (cmd->duplex != DUPLEX_FULL)) + goto err_out_unlock; + + if (cmd->speed == SPEED_2500 && + !(bp->phy_flags & BNX2_PHY_FLAG_2_5G_CAPABLE)) + goto err_out_unlock; + } + else if (cmd->speed == SPEED_1000 || cmd->speed == SPEED_2500) + goto err_out_unlock; + + autoneg &= ~AUTONEG_SPEED; + req_line_speed = cmd->speed; + req_duplex = cmd->duplex; + advertising = 0; + } + + bp->autoneg = autoneg; + bp->advertising = advertising; + bp->req_line_speed = req_line_speed; + bp->req_duplex = req_duplex; + + err = 0; + /* If device is down, the new settings will be picked up when it is + * brought up. + */ + if (netif_running(dev)) + err = bnx2_setup_phy(bp, cmd->port); + +err_out_unlock: + spin_unlock_bh(&bp->phy_lock); + + return err; +} + +static void +bnx2_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) +{ + struct bnx2 *bp = netdev_priv(dev); + + strcpy(info->driver, DRV_MODULE_NAME); + strcpy(info->version, DRV_MODULE_VERSION); + strcpy(info->bus_info, pci_name(bp->pdev)); + strcpy(info->fw_version, bp->fw_version); + +#if defined(VMWARE_ESX_DDK_VERSION) && \ + (VMWARE_ESX_DDK_VERSION >= 35000) && (VMWARE_ESX_DDK_VERSION < 40000) + info->eedump_len = bnx2_get_eeprom_len(dev); +#endif +} + +#define BNX2_REGDUMP_LEN (32 * 1024) + +static int +bnx2_get_regs_len(struct net_device *dev) +{ + return BNX2_REGDUMP_LEN; +} + +static void +bnx2_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *_p) +{ + u32 *p = _p, i, offset; + u8 *orig_p = _p; + struct bnx2 *bp = netdev_priv(dev); + u32 reg_boundaries[] = { 0x0000, 0x0098, 0x0400, 0x045c, + 0x0800, 0x0880, 0x0c00, 0x0c10, + 0x0c30, 0x0d08, 0x1000, 0x101c, + 0x1040, 0x1048, 0x1080, 0x10a4, + 0x1400, 0x1490, 0x1498, 0x14f0, + 0x1500, 0x155c, 0x1580, 0x15dc, + 0x1600, 0x1658, 0x1680, 0x16d8, + 0x1800, 0x1820, 0x1840, 0x1854, + 0x1880, 0x1894, 0x1900, 0x1984, + 0x1c00, 0x1c0c, 0x1c40, 0x1c54, + 0x1c80, 0x1c94, 0x1d00, 0x1d84, + 0x2000, 0x2030, 0x23c0, 0x2400, + 0x2800, 0x2820, 0x2830, 0x2850, + 0x2b40, 0x2c10, 0x2fc0, 0x3058, + 0x3c00, 0x3c94, 0x4000, 0x4010, + 0x4080, 0x4090, 0x43c0, 0x4458, + 0x4c00, 0x4c18, 0x4c40, 0x4c54, + 0x4fc0, 0x5010, 0x53c0, 0x5444, + 0x5c00, 0x5c18, 0x5c80, 0x5c90, + 0x5fc0, 0x6000, 0x6400, 0x6428, + 0x6800, 0x6848, 0x684c, 0x6860, + 0x6888, 0x6910, 0x8000 }; + + regs->version = 0; + + memset(p, 0, BNX2_REGDUMP_LEN); + + if (!netif_running(bp->dev)) + return; + + i = 0; + offset = reg_boundaries[0]; + p += offset; + while (offset < BNX2_REGDUMP_LEN) { + *p++ = REG_RD(bp, offset); + offset += 4; + if (offset == reg_boundaries[i + 1]) { + offset = reg_boundaries[i + 2]; + p = (u32 *) (orig_p + offset); + i += 2; + } + } +} + +static void +bnx2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (bp->flags & BNX2_FLAG_NO_WOL) { + wol->supported = 0; + wol->wolopts = 0; + } + else { + wol->supported = WAKE_MAGIC; + if (bp->wol) + wol->wolopts = WAKE_MAGIC; + else + wol->wolopts = 0; + } + memset(&wol->sopass, 0, sizeof(wol->sopass)); +} + +static int +bnx2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (wol->wolopts & ~WAKE_MAGIC) + return -EINVAL; + + if (wol->wolopts & WAKE_MAGIC) { + if (bp->flags & BNX2_FLAG_NO_WOL) + return -EINVAL; + + bp->wol = 1; + } + else { + bp->wol = 0; + } + return 0; +} + +static int +bnx2_nway_reset(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + u32 bmcr; + + if (!netif_running(dev)) + return -EAGAIN; + + if (!(bp->autoneg & AUTONEG_SPEED)) { + return -EINVAL; + } + + spin_lock_bh(&bp->phy_lock); + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) { + int rc; + + rc = bnx2_setup_remote_phy(bp, bp->phy_port); + spin_unlock_bh(&bp->phy_lock); + return rc; + } + + /* Force a link down visible on the other side */ + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + bnx2_write_phy(bp, bp->mii_bmcr, BMCR_LOOPBACK); + spin_unlock_bh(&bp->phy_lock); + + bnx2_msleep(20); + + spin_lock_bh(&bp->phy_lock); + + bp->current_interval = BNX2_SERDES_AN_TIMEOUT; + bp->serdes_an_pending = 1; + mod_timer(&bp->timer, jiffies + bp->current_interval); + } + + bnx2_read_phy(bp, bp->mii_bmcr, &bmcr); + bmcr &= ~BMCR_LOOPBACK; + bnx2_write_phy(bp, bp->mii_bmcr, bmcr | BMCR_ANRESTART | BMCR_ANENABLE); + + spin_unlock_bh(&bp->phy_lock); + + return 0; +} + +static u32 +bnx2_get_link(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + + return bp->link_up; +} + +#if (LINUX_VERSION_CODE >= 0x20418) || \ + (defined(VMWARE_ESX_DDK_VERSION) && \ + ((VMWARE_ESX_DDK_VERSION >= 35000) && (VMWARE_ESX_DDK_VERSION < 40000))) +static int +bnx2_get_eeprom_len(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (bp->flash_info == NULL) + return 0; + + return (int) bp->flash_size; +} +#endif + +#ifdef ETHTOOL_GEEPROM +static int +bnx2_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, + u8 *eebuf) +{ + struct bnx2 *bp = netdev_priv(dev); + int rc; + + if (!netif_running(dev)) + return -EAGAIN; + + /* parameters already validated in ethtool_get_eeprom */ + + rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len); + + return rc; +} +#endif + +#ifdef ETHTOOL_SEEPROM +static int +bnx2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, + u8 *eebuf) +{ + struct bnx2 *bp = netdev_priv(dev); + int rc; + + if (!netif_running(dev)) + return -EAGAIN; + + /* parameters already validated in ethtool_set_eeprom */ + + rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len); + + return rc; +} +#endif + +static int +bnx2_get_coalesce(struct net_device *dev, struct ethtool_coalesce *coal) +{ + struct bnx2 *bp = netdev_priv(dev); + + memset(coal, 0, sizeof(struct ethtool_coalesce)); + + coal->rx_coalesce_usecs = bp->rx_ticks; + coal->rx_max_coalesced_frames = bp->rx_quick_cons_trip; + coal->rx_coalesce_usecs_irq = bp->rx_ticks_int; + coal->rx_max_coalesced_frames_irq = bp->rx_quick_cons_trip_int; + + coal->tx_coalesce_usecs = bp->tx_ticks; + coal->tx_max_coalesced_frames = bp->tx_quick_cons_trip; + coal->tx_coalesce_usecs_irq = bp->tx_ticks_int; + coal->tx_max_coalesced_frames_irq = bp->tx_quick_cons_trip_int; + + coal->stats_block_coalesce_usecs = bp->stats_ticks; + + return 0; +} + +static int +bnx2_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal) +{ + struct bnx2 *bp = netdev_priv(dev); +#if defined(__VMKLNX__) + int rc; +#endif + + bp->rx_ticks = (u16) coal->rx_coalesce_usecs; + if (bp->rx_ticks > 0x3ff) bp->rx_ticks = 0x3ff; + + bp->rx_quick_cons_trip = (u16) coal->rx_max_coalesced_frames; + if (bp->rx_quick_cons_trip > 0xff) bp->rx_quick_cons_trip = 0xff; + + bp->rx_ticks_int = (u16) coal->rx_coalesce_usecs_irq; + if (bp->rx_ticks_int > 0x3ff) bp->rx_ticks_int = 0x3ff; + + bp->rx_quick_cons_trip_int = (u16) coal->rx_max_coalesced_frames_irq; + if (bp->rx_quick_cons_trip_int > 0xff) + bp->rx_quick_cons_trip_int = 0xff; + + bp->tx_ticks = (u16) coal->tx_coalesce_usecs; + if (bp->tx_ticks > 0x3ff) bp->tx_ticks = 0x3ff; + + bp->tx_quick_cons_trip = (u16) coal->tx_max_coalesced_frames; + if (bp->tx_quick_cons_trip > 0xff) bp->tx_quick_cons_trip = 0xff; + + bp->tx_ticks_int = (u16) coal->tx_coalesce_usecs_irq; + if (bp->tx_ticks_int > 0x3ff) bp->tx_ticks_int = 0x3ff; + + bp->tx_quick_cons_trip_int = (u16) coal->tx_max_coalesced_frames_irq; + if (bp->tx_quick_cons_trip_int > 0xff) bp->tx_quick_cons_trip_int = + 0xff; + + bp->stats_ticks = coal->stats_block_coalesce_usecs; + if (bp->flags & BNX2_FLAG_BROKEN_STATS) { + if (bp->stats_ticks != 0 && bp->stats_ticks != USEC_PER_SEC) + bp->stats_ticks = USEC_PER_SEC; + } + if (bp->stats_ticks > BNX2_HC_STATS_TICKS_HC_STAT_TICKS) + bp->stats_ticks = BNX2_HC_STATS_TICKS_HC_STAT_TICKS; + bp->stats_ticks &= BNX2_HC_STATS_TICKS_HC_STAT_TICKS; + + if (netif_running(bp->dev)) { + bnx2_netif_stop(bp); +#if defined(__VMKLNX__) + rc = bnx2_init_nic(bp, 0); + if (rc) { + bnx2_init_nic_err_handler(bp); + printk(KERN_ERR PFX "Setting coalesce... NIC initialization failed: " + "%s\n", bp->dev->name); + return rc; + } + +#else + bnx2_init_nic(bp, 0); +#endif + bnx2_netif_start(bp); + } + + return 0; +} + +static void +bnx2_get_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) +{ + struct bnx2 *bp = netdev_priv(dev); + + ering->rx_max_pending = MAX_TOTAL_RX_DESC_CNT; + ering->rx_mini_max_pending = 0; + ering->rx_jumbo_max_pending = MAX_TOTAL_RX_PG_DESC_CNT; + + ering->rx_pending = bp->rx_ring_size; + ering->rx_mini_pending = 0; + ering->rx_jumbo_pending = bp->rx_pg_ring_size; + + ering->tx_max_pending = MAX_TX_DESC_CNT; + ering->tx_pending = bp->tx_ring_size; +} + +static int +bnx2_change_ring_size(struct bnx2 *bp, u32 rx, u32 tx) +{ + int rc; + +#if defined(__VMKLNX__) + if(bp->reset_failed) { + printk(KERN_ERR "%s: Previous error detected preventing MTU " + "change\n", bp->dev->name); + return -EIO; + } +#endif /* defined(__VMKLNX__) */ + + mutex_lock(&bp->reset_lock); + if (netif_running(bp->dev)) { + +#if defined(BNX2_ENABLE_NETQUEUE) + netif_tx_disable(bp->dev); + bp->dev->trans_start = jiffies; /* prevent tx timeout */ + + if (bnx2_netqueue_is_avail(bp) && + (bp->netq_state & BNX2_NETQ_HW_STARTED)) { + bnx2_netqueue_flush_all(bp); + } + bnx2_stop_netqueue_hw(bp); +#endif /* defined(BNX2_ENABLE_NETQUEUE) */ + + bnx2_netif_stop(bp); + +#if defined(__VMKLNX__) +#if defined(BNX2_ENABLE_NETQUEUE) && (VMWARE_ESX_DDK_VERSION >= 41000) + vmknetddi_queueops_invalidate_state(bp->dev); +#endif /* defined(BNX2_ENABLE_NETQUEUE) && (VMWARE_ESX_DDK_VERSION >= 41000) */ + + rc = bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); + + /* Did the chip reset fail ? */ + if (rc != 0) { + printk(KERN_ERR PFX "%s: chip reset failed during MTU " + "change\n", + bp->dev->name); + + bp->reset_failed = 1; + + goto error; + } +#else /* !defined(__VMKLNX__) */ + bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET); +#endif /* defined(__VMKLNX__) */ + bnx2_free_skbs(bp); + bnx2_free_mem(bp); + } + + bnx2_set_rx_ring_size(bp, rx); + bp->tx_ring_size = tx; + + if (netif_running(bp->dev)) { + rc = bnx2_alloc_mem(bp); +#if defined(BNX2_ENABLE_NETQUEUE) + if (rc) { + printk(KERN_ERR PFX "%s: failed alloc mem during MTU " + "change\n", + bp->dev->name); + goto error; + } + rc = bnx2_init_nic(bp, 0); + if (rc) { + printk(KERN_ERR PFX "%s: failed init nic during MTU " + "change\n", + bp->dev->name); + goto error; + } + bnx2_init_netqueue_hw(bp); + bnx2_start_netqueue_hw(bp); +#else /* !defined(BNX2_ENABLE_NETQUEUE) */ + if (!rc) + rc = bnx2_init_nic(bp, 0); + + if (rc) { + bnx2_init_nic_err_handler(bp); + printk(KERN_ERR PFX "%s: failed init nic during MTU " + "change\n", + bp->dev->name); + mutex_unlock(&bp->reset_lock); + return rc; + } +#endif /* defined(BNX2_ENABLE_NETQUEUE) */ + +#ifdef BCM_CNIC + mutex_lock(&bp->cnic_lock); + bnx2_setup_cnic_irq_info(bp); + mutex_unlock(&bp->cnic_lock); +#endif + + bnx2_netif_start(bp); + } + + mutex_unlock(&bp->reset_lock); + return 0; +#if defined(__VMKLNX__) +error: + netif_carrier_off(bp->dev); + mutex_unlock(&bp->reset_lock); + + return rc; +#endif +} + +static int +bnx2_set_ringparam(struct net_device *dev, struct ethtool_ringparam *ering) +{ + struct bnx2 *bp = netdev_priv(dev); + int rc; + + if ((ering->rx_pending > MAX_TOTAL_RX_DESC_CNT) || + (ering->tx_pending > MAX_TX_DESC_CNT) || + (ering->tx_pending <= MAX_SKB_FRAGS)) { + + return -EINVAL; + } + rc = bnx2_change_ring_size(bp, ering->rx_pending, ering->tx_pending); + return rc; +} + +static void +bnx2_get_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) +{ + struct bnx2 *bp = netdev_priv(dev); + + epause->autoneg = ((bp->autoneg & AUTONEG_FLOW_CTRL) != 0); + epause->rx_pause = ((bp->flow_ctrl & FLOW_CTRL_RX) != 0); + epause->tx_pause = ((bp->flow_ctrl & FLOW_CTRL_TX) != 0); +} + +static int +bnx2_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam *epause) +{ + struct bnx2 *bp = netdev_priv(dev); + + bp->req_flow_ctrl = 0; + if (epause->rx_pause) + bp->req_flow_ctrl |= FLOW_CTRL_RX; + if (epause->tx_pause) + bp->req_flow_ctrl |= FLOW_CTRL_TX; + + if (epause->autoneg) { + bp->autoneg |= AUTONEG_FLOW_CTRL; + } + else { + bp->autoneg &= ~AUTONEG_FLOW_CTRL; + } + + if (netif_running(dev)) { + spin_lock_bh(&bp->phy_lock); + bnx2_setup_phy(bp, bp->phy_port); + spin_unlock_bh(&bp->phy_lock); + } + + return 0; +} + +static u32 +bnx2_get_rx_csum(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + + return bp->rx_csum; +} + +static int +bnx2_set_rx_csum(struct net_device *dev, u32 data) +{ + struct bnx2 *bp = netdev_priv(dev); + + bp->rx_csum = data; + return 0; +} + +#ifdef BCM_TSO +static int +bnx2_set_tso(struct net_device *dev, u32 data) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (data) { + dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; + if (CHIP_NUM(bp) == CHIP_NUM_5709) + dev->features |= NETIF_F_TSO6; + } else + dev->features &= ~(NETIF_F_TSO | NETIF_F_TSO6 | + NETIF_F_TSO_ECN); + return 0; +} +#endif + +static struct { + char string[ETH_GSTRING_LEN]; +} bnx2_stats_str_arr[] = { + { "rx_bytes" }, + { "rx_error_bytes" }, + { "tx_bytes" }, + { "tx_error_bytes" }, + { "rx_ucast_packets" }, + { "rx_mcast_packets" }, + { "rx_bcast_packets" }, + { "tx_ucast_packets" }, + { "tx_mcast_packets" }, + { "tx_bcast_packets" }, + { "tx_mac_errors" }, + { "tx_carrier_errors" }, + { "rx_crc_errors" }, + { "rx_align_errors" }, + { "tx_single_collisions" }, + { "tx_multi_collisions" }, + { "tx_deferred" }, + { "tx_excess_collisions" }, + { "tx_late_collisions" }, + { "tx_total_collisions" }, + { "rx_fragments" }, + { "rx_jabbers" }, + { "rx_undersize_packets" }, + { "rx_oversize_packets" }, + { "rx_64_byte_packets" }, + { "rx_65_to_127_byte_packets" }, + { "rx_128_to_255_byte_packets" }, + { "rx_256_to_511_byte_packets" }, + { "rx_512_to_1023_byte_packets" }, + { "rx_1024_to_1522_byte_packets" }, + { "rx_1523_to_9022_byte_packets" }, + { "tx_64_byte_packets" }, + { "tx_65_to_127_byte_packets" }, + { "tx_128_to_255_byte_packets" }, + { "tx_256_to_511_byte_packets" }, + { "tx_512_to_1023_byte_packets" }, + { "tx_1024_to_1522_byte_packets" }, + { "tx_1523_to_9022_byte_packets" }, + { "rx_xon_frames" }, + { "rx_xoff_frames" }, + { "tx_xon_frames" }, + { "tx_xoff_frames" }, + { "rx_mac_ctrl_frames" }, + { "rx_filtered_packets" }, + { "rx_ftq_discards" }, + { "rx_discards" }, + { "rx_fw_discards" }, +#if defined(BNX2_ENABLE_NETQUEUE) + { "[0] rx_packets" }, + { "[0] rx_bytes" }, + { "[0] rx_errors" }, + { "[0] tx_packets" }, + { "[0] tx_bytes" }, + { "[1] rx_packets" }, + { "[1] rx_bytes" }, + { "[1] rx_errors" }, + { "[1] tx_packets" }, + { "[1] tx_bytes" }, + { "[2] rx_packets" }, + { "[2] rx_bytes" }, + { "[2] rx_errors" }, + { "[2] tx_packets" }, + { "[2] tx_bytes" }, + { "[3] rx_packets" }, + { "[3] rx_bytes" }, + { "[3] rx_errors" }, + { "[3] tx_packets" }, + { "[3] tx_bytes" }, + { "[4] rx_packets" }, + { "[4] rx_bytes" }, + { "[4] rx_errors" }, + { "[4] tx_packets" }, + { "[4] tx_bytes" }, + { "[5] rx_packets" }, + { "[5] rx_bytes" }, + { "[5] rx_errors" }, + { "[5] tx_packets" }, + { "[5] tx_bytes" }, + { "[6] rx_packets" }, + { "[6] rx_bytes" }, + { "[6] rx_errors" }, + { "[6] tx_packets" }, + { "[6] tx_bytes" }, + { "[7] rx_packets" }, + { "[7] rx_bytes" }, + { "[7] rx_errors" }, + { "[7] tx_packets" }, + { "[7] tx_bytes" }, + { "[8] rx_packets" }, + { "[8] rx_bytes" }, + { "[8] rx_errors" }, + { "[8] tx_packets" }, + { "[8] tx_bytes" }, +#endif +}; + +#define BNX2_NUM_STATS (sizeof(bnx2_stats_str_arr)/\ + sizeof(bnx2_stats_str_arr[0])) + +#if defined(BNX2_ENABLE_NETQUEUE) +#define BNX2_NUM_NETQ_STATS 45 +#endif + +#define STATS_OFFSET32(offset_name) (offsetof(struct statistics_block, offset_name) / 4) + +static const unsigned long bnx2_stats_offset_arr[BNX2_NUM_STATS] = { + STATS_OFFSET32(stat_IfHCInOctets_hi), + STATS_OFFSET32(stat_IfHCInBadOctets_hi), + STATS_OFFSET32(stat_IfHCOutOctets_hi), + STATS_OFFSET32(stat_IfHCOutBadOctets_hi), + STATS_OFFSET32(stat_IfHCInUcastPkts_hi), + STATS_OFFSET32(stat_IfHCInMulticastPkts_hi), + STATS_OFFSET32(stat_IfHCInBroadcastPkts_hi), + STATS_OFFSET32(stat_IfHCOutUcastPkts_hi), + STATS_OFFSET32(stat_IfHCOutMulticastPkts_hi), + STATS_OFFSET32(stat_IfHCOutBroadcastPkts_hi), + STATS_OFFSET32(stat_emac_tx_stat_dot3statsinternalmactransmiterrors), + STATS_OFFSET32(stat_Dot3StatsCarrierSenseErrors), + STATS_OFFSET32(stat_Dot3StatsFCSErrors), + STATS_OFFSET32(stat_Dot3StatsAlignmentErrors), + STATS_OFFSET32(stat_Dot3StatsSingleCollisionFrames), + STATS_OFFSET32(stat_Dot3StatsMultipleCollisionFrames), + STATS_OFFSET32(stat_Dot3StatsDeferredTransmissions), + STATS_OFFSET32(stat_Dot3StatsExcessiveCollisions), + STATS_OFFSET32(stat_Dot3StatsLateCollisions), + STATS_OFFSET32(stat_EtherStatsCollisions), + STATS_OFFSET32(stat_EtherStatsFragments), + STATS_OFFSET32(stat_EtherStatsJabbers), + STATS_OFFSET32(stat_EtherStatsUndersizePkts), + STATS_OFFSET32(stat_EtherStatsOverrsizePkts), + STATS_OFFSET32(stat_EtherStatsPktsRx64Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx65Octetsto127Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx128Octetsto255Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx256Octetsto511Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx512Octetsto1023Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx1024Octetsto1522Octets), + STATS_OFFSET32(stat_EtherStatsPktsRx1523Octetsto9022Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx64Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx65Octetsto127Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx128Octetsto255Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx256Octetsto511Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx512Octetsto1023Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx1024Octetsto1522Octets), + STATS_OFFSET32(stat_EtherStatsPktsTx1523Octetsto9022Octets), + STATS_OFFSET32(stat_XonPauseFramesReceived), + STATS_OFFSET32(stat_XoffPauseFramesReceived), + STATS_OFFSET32(stat_OutXonSent), + STATS_OFFSET32(stat_OutXoffSent), + STATS_OFFSET32(stat_MacControlFramesReceived), + STATS_OFFSET32(stat_IfInFramesL2FilterDiscards), + STATS_OFFSET32(stat_IfInFTQDiscards), + STATS_OFFSET32(stat_IfInMBUFDiscards), + STATS_OFFSET32(stat_FwRxDrop), +}; + +/* stat_IfHCInBadOctets and stat_Dot3StatsCarrierSenseErrors are + * skipped because of errata. + */ +static u8 bnx2_5706_stats_len_arr[BNX2_NUM_STATS] = { + 8,0,8,8,8,8,8,8,8,8, + 4,0,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4, +}; + +static u8 bnx2_5708_stats_len_arr[BNX2_NUM_STATS] = { + 8,0,8,8,8,8,8,8,8,8, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4, +}; + +#define BNX2_NUM_TESTS 6 + +static struct { + char string[ETH_GSTRING_LEN]; +} bnx2_tests_str_arr[BNX2_NUM_TESTS] = { + { "register_test (offline)" }, + { "memory_test (offline)" }, + { "loopback_test (offline)" }, + { "nvram_test (online)" }, + { "interrupt_test (online)" }, + { "link_test (online)" }, +}; + +#ifdef ETHTOOL_GFLAGS +static int +bnx2_get_sset_count(struct net_device *dev, int sset) +{ + switch (sset) { + case ETH_SS_TEST: + return BNX2_NUM_TESTS; + case ETH_SS_STATS: + return BNX2_NUM_STATS; + default: + return -EOPNOTSUPP; + } +} +#else +static int +bnx2_self_test_count(struct net_device *dev) +{ + return BNX2_NUM_TESTS; +} +#endif + +static void +bnx2_self_test(struct net_device *dev, struct ethtool_test *etest, u64 *buf) +{ + struct bnx2 *bp = netdev_priv(dev); + + bnx2_set_power_state(bp, PCI_D0); + + memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS); + if (etest->flags & ETH_TEST_FL_OFFLINE) { + int i; + + bnx2_netif_stop(bp); + bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_DIAG); + bnx2_free_skbs(bp); + + if (bnx2_test_registers(bp) != 0) { + buf[0] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } + if (bnx2_test_memory(bp) != 0) { + buf[1] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } + if ((buf[2] = bnx2_test_loopback(bp)) != 0) + etest->flags |= ETH_TEST_FL_FAILED; + + if (!netif_running(bp->dev)) + bnx2_shutdown_chip(bp); + else { + bnx2_init_nic(bp, 1); + bnx2_netif_start(bp); + } + + /* wait for link up */ + for (i = 0; i < 7; i++) { + if (bp->link_up) + break; + bnx2_msleep_interruptible(1000); + } + } + + if (bnx2_test_nvram(bp) != 0) { + buf[3] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } + if (bnx2_test_intr(bp) != 0) { + buf[4] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + } + + if (bnx2_test_link(bp) != 0) { + buf[5] = 1; + etest->flags |= ETH_TEST_FL_FAILED; + + } + if (!netif_running(bp->dev)) + bnx2_set_power_state(bp, PCI_D3hot); +} + +static void +bnx2_get_strings(struct net_device *dev, u32 stringset, u8 *buf) +{ + switch (stringset) { + case ETH_SS_STATS: + memcpy(buf, bnx2_stats_str_arr, + sizeof(bnx2_stats_str_arr)); + break; + case ETH_SS_TEST: + memcpy(buf, bnx2_tests_str_arr, + sizeof(bnx2_tests_str_arr)); + break; + } +} + +#ifndef ETHTOOL_GFLAGS +static int +bnx2_get_stats_count(struct net_device *dev) +{ + return BNX2_NUM_STATS; +} +#endif + +static void +bnx2_get_ethtool_stats(struct net_device *dev, + struct ethtool_stats *stats, u64 *buf) +{ + struct bnx2 *bp = netdev_priv(dev); + int i; + u32 *hw_stats = (u32 *) bp->stats_blk; + u8 *stats_len_arr = NULL; + + if (hw_stats == NULL) { + memset(buf, 0, sizeof(u64) * BNX2_NUM_STATS); + return; + } + + if ((CHIP_ID(bp) == CHIP_ID_5706_A0) || + (CHIP_ID(bp) == CHIP_ID_5706_A1) || + (CHIP_ID(bp) == CHIP_ID_5706_A2) || + (CHIP_ID(bp) == CHIP_ID_5708_A0)) + stats_len_arr = bnx2_5706_stats_len_arr; + else + stats_len_arr = bnx2_5708_stats_len_arr; +#if defined(BNX2_ENABLE_NETQUEUE) + for (i = 0; i < BNX2_NUM_STATS - BNX2_NUM_NETQ_STATS; i++) { +#else + for (i = 0; i < BNX2_NUM_STATS; i++) { +#endif + if (stats_len_arr[i] == 0) { + /* skip this counter */ + buf[i] = 0; + continue; + } + if (stats_len_arr[i] == 4) { + /* 4-byte counter */ + buf[i] = (u64) + *(hw_stats + bnx2_stats_offset_arr[i]); + continue; + } + /* 8-byte counter */ + buf[i] = (((u64) *(hw_stats + + bnx2_stats_offset_arr[i])) << 32) + + *(hw_stats + bnx2_stats_offset_arr[i] + 1); + } + +#if defined(BNX2_ENABLE_NETQUEUE) + /* Copy over the NetQ specific statistics */ + { + int j; + + for (j = 0; j < BNX2_MAX_MSIX_VEC; j++) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[j]; + + buf[i + (j*5) + 0] = (u64) (bnapi->stats.rx_packets); + buf[i + (j*5) + 1] = (u64) (bnapi->stats.rx_bytes); + buf[i + (j*5) + 2] = (u64) (bnapi->stats.rx_errors); + buf[i + (j*5) + 3] = (u64) (bnapi->stats.tx_packets); + buf[i + (j*5) + 4] = (u64) (bnapi->stats.tx_bytes); + } + } +#endif +} + +static int +bnx2_phys_id(struct net_device *dev, u32 data) +{ + struct bnx2 *bp = netdev_priv(dev); + int i; + u32 save; + + bnx2_set_power_state(bp, PCI_D0); + + if (data == 0) + data = 2; + + save = REG_RD(bp, BNX2_MISC_CFG); + REG_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC); + + for (i = 0; i < (data * 2); i++) { + if ((i % 2) == 0) { + REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE); + } + else { + REG_WR(bp, BNX2_EMAC_LED, BNX2_EMAC_LED_OVERRIDE | + BNX2_EMAC_LED_1000MB_OVERRIDE | + BNX2_EMAC_LED_100MB_OVERRIDE | + BNX2_EMAC_LED_10MB_OVERRIDE | + BNX2_EMAC_LED_TRAFFIC_OVERRIDE | + BNX2_EMAC_LED_TRAFFIC); + } + bnx2_msleep_interruptible(500); + if (signal_pending(current)) + break; + } + REG_WR(bp, BNX2_EMAC_LED, 0); + REG_WR(bp, BNX2_MISC_CFG, save); + + if (!netif_running(dev)) + bnx2_set_power_state(bp, PCI_D3hot); + + return 0; +} + +#if (LINUX_VERSION_CODE >= 0x20418) +static int +bnx2_set_tx_csum(struct net_device *dev, u32 data) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) +#if (LINUX_VERSION_CODE < 0x2060c) + return (bnx2_set_tx_hw_csum(dev, data)); +#elif (LINUX_VERSION_CODE >= 0x20617) + return (ethtool_op_set_tx_ipv6_csum(dev, data)); +#else + return (ethtool_op_set_tx_hw_csum(dev, data)); +#endif + else + return (ethtool_op_set_tx_csum(dev, data)); +} +#endif + +static struct ethtool_ops bnx2_ethtool_ops = { + .get_settings = bnx2_get_settings, + .set_settings = bnx2_set_settings, + .get_drvinfo = bnx2_get_drvinfo, + .get_regs_len = bnx2_get_regs_len, + .get_regs = bnx2_get_regs, + .get_wol = bnx2_get_wol, + .set_wol = bnx2_set_wol, + .nway_reset = bnx2_nway_reset, + .get_link = bnx2_get_link, +#if (LINUX_VERSION_CODE >= 0x20418) + .get_eeprom_len = bnx2_get_eeprom_len, +#endif +#ifdef ETHTOOL_GEEPROM + .get_eeprom = bnx2_get_eeprom, +#endif +#ifdef ETHTOOL_SEEPROM + .set_eeprom = bnx2_set_eeprom, +#endif + .get_coalesce = bnx2_get_coalesce, + .set_coalesce = bnx2_set_coalesce, + .get_ringparam = bnx2_get_ringparam, + .set_ringparam = bnx2_set_ringparam, + .get_pauseparam = bnx2_get_pauseparam, + .set_pauseparam = bnx2_set_pauseparam, + .get_rx_csum = bnx2_get_rx_csum, + .set_rx_csum = bnx2_set_rx_csum, + .get_tx_csum = ethtool_op_get_tx_csum, +#if (LINUX_VERSION_CODE >= 0x20418) + .set_tx_csum = bnx2_set_tx_csum, +#endif + .get_sg = ethtool_op_get_sg, + .set_sg = ethtool_op_set_sg, +#ifdef BCM_TSO + .get_tso = ethtool_op_get_tso, + .set_tso = bnx2_set_tso, +#endif +#ifndef ETHTOOL_GFLAGS + .self_test_count = bnx2_self_test_count, +#endif + .self_test = bnx2_self_test, + .get_strings = bnx2_get_strings, + .phys_id = bnx2_phys_id, +#ifndef ETHTOOL_GFLAGS + .get_stats_count = bnx2_get_stats_count, +#endif + .get_ethtool_stats = bnx2_get_ethtool_stats, +#ifdef ETHTOOL_GPERMADDR +#if (LINUX_VERSION_CODE < 0x020617) + .get_perm_addr = ethtool_op_get_perm_addr, +#endif +#endif +#ifdef ETHTOOL_GFLAGS + .get_sset_count = bnx2_get_sset_count, +#endif +}; + +/* Called with rtnl_lock */ +static int +bnx2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) +{ +#if (LINUX_VERSION_CODE >= 0x020607) + struct mii_ioctl_data *data = if_mii(ifr); +#else + struct mii_ioctl_data *data = (struct mii_ioctl_data *) &ifr->ifr_ifru; +#endif + struct bnx2 *bp = netdev_priv(dev); + int err; + + switch(cmd) { + case SIOCGMIIPHY: + data->phy_id = bp->phy_addr; + + /* fallthru */ + case SIOCGMIIREG: { + u32 mii_regval; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return -EOPNOTSUPP; + + if (!netif_running(dev)) + return -EAGAIN; + + spin_lock_bh(&bp->phy_lock); + err = bnx2_read_phy(bp, data->reg_num & 0x1f, &mii_regval); + spin_unlock_bh(&bp->phy_lock); + + data->val_out = mii_regval; + + return err; + } + + case SIOCSMIIREG: + if (!capable(CAP_NET_ADMIN)) + return -EPERM; + + if (bp->phy_flags & BNX2_PHY_FLAG_REMOTE_PHY_CAP) + return -EOPNOTSUPP; + + if (!netif_running(dev)) + return -EAGAIN; + + spin_lock_bh(&bp->phy_lock); + err = bnx2_write_phy(bp, data->reg_num & 0x1f, data->val_in); + spin_unlock_bh(&bp->phy_lock); + + return err; + + default: + /* do nothing */ + break; + } + return -EOPNOTSUPP; +} + +/* Called with rtnl_lock */ +static int +bnx2_change_mac_addr(struct net_device *dev, void *p) +{ + struct sockaddr *addr = p; + struct bnx2 *bp = netdev_priv(dev); + + if (!is_valid_ether_addr(addr->sa_data)) + return -EINVAL; + + memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); + if (netif_running(dev)) + bnx2_set_mac_addr(bp, bp->dev->dev_addr, 0); + + return 0; +} + +/* Called with rtnl_lock */ +static int +bnx2_change_mtu(struct net_device *dev, int new_mtu) +{ + struct bnx2 *bp = netdev_priv(dev); + + if (((new_mtu + ETH_HLEN) > MAX_ETHERNET_JUMBO_PACKET_SIZE) || + ((new_mtu + ETH_HLEN) < MIN_ETHERNET_PACKET_SIZE)) + return -EINVAL; + + dev->mtu = new_mtu; + return (bnx2_change_ring_size(bp, bp->rx_ring_size, bp->tx_ring_size)); +} + +#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) +static void +poll_bnx2(struct net_device *dev) +{ + struct bnx2 *bp = netdev_priv(dev); + +#if defined(RED_HAT_LINUX_KERNEL) && (LINUX_VERSION_CODE < 0x020600) + if (netdump_mode) { + bnx2_interrupt(bp->pdev->irq, &bp->bnx2_napi[0], NULL); + if (dev->poll_list.prev) { + int budget = 64; + + bnx2_poll(dev, &budget); + } + } + else +#endif + { + int i; + + for (i = 0; i < bp->irq_nvecs; i++) { + unsigned int irq = bp->irq_tbl[i].vector; + + disable_irq(irq); +#if (LINUX_VERSION_CODE >= 0x20613) + bnx2_interrupt(irq, &bp->bnx2_napi[i]); +#else + bnx2_interrupt(irq, &bp->bnx2_napi[i], NULL); +#endif + enable_irq(irq); + } + } +} +#endif + +static void __devinit +bnx2_get_5709_media(struct bnx2 *bp) +{ + u32 val = REG_RD(bp, BNX2_MISC_DUAL_MEDIA_CTRL); + u32 bond_id = val & BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID; + u32 strap; + + if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C) + return; + else if (bond_id == BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_S) { + bp->phy_flags |= BNX2_PHY_FLAG_SERDES; + return; + } + + if (val & BNX2_MISC_DUAL_MEDIA_CTRL_STRAP_OVERRIDE) + strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL) >> 21; + else + strap = (val & BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL_STRAP) >> 8; + + if (PCI_FUNC(bp->pdev->devfn) == 0) { + switch (strap) { + case 0x4: + case 0x5: + case 0x6: + bp->phy_flags |= BNX2_PHY_FLAG_SERDES; + return; + } + } else { + switch (strap) { + case 0x1: + case 0x2: + case 0x4: + bp->phy_flags |= BNX2_PHY_FLAG_SERDES; + return; + } + } +} + +static void __devinit +bnx2_get_pci_speed(struct bnx2 *bp) +{ + u32 reg; + + reg = REG_RD(bp, BNX2_PCICFG_MISC_STATUS); + if (reg & BNX2_PCICFG_MISC_STATUS_PCIX_DET) { + u32 clkreg; + + bp->flags |= BNX2_FLAG_PCIX; + + clkreg = REG_RD(bp, BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS); + + clkreg &= BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET; + switch (clkreg) { + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ: + bp->bus_speed_mhz = 133; + break; + + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ: + bp->bus_speed_mhz = 100; + break; + + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ: + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ: + bp->bus_speed_mhz = 66; + break; + + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ: + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ: + bp->bus_speed_mhz = 50; + break; + + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW: + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ: + case BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ: + bp->bus_speed_mhz = 33; + break; + } + } + else { + if (reg & BNX2_PCICFG_MISC_STATUS_M66EN) + bp->bus_speed_mhz = 66; + else + bp->bus_speed_mhz = 33; + } + + if (reg & BNX2_PCICFG_MISC_STATUS_32BIT_DET) + bp->flags |= BNX2_FLAG_PCI_32BIT; + +} + +static int __devinit +bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) +{ + struct bnx2 *bp; + unsigned long mem_len; + int rc, i, j; + u32 reg; + u64 dma_mask, persist_dma_mask; + +#if (LINUX_VERSION_CODE < 0x20610) + SET_MODULE_OWNER(dev); +#endif +#if (LINUX_VERSION_CODE >= 0x20419) + SET_NETDEV_DEV(dev, &pdev->dev); +#endif + bp = netdev_priv(dev); + + bp->flags = 0; + bp->phy_flags = 0; + + /* enable device (incl. PCI PM wakeup), and bus-mastering */ + rc = pci_enable_device(pdev); + if (rc) { + dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n"); + goto err_out; + } + + if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { + dev_err(&pdev->dev, + "Cannot find PCI device base address, aborting.\n"); + rc = -ENODEV; + goto err_out_disable; + } + + rc = pci_request_regions(pdev, DRV_MODULE_NAME); + if (rc) { + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); + goto err_out_disable; + } + + pci_set_master(pdev); +#if (LINUX_VERSION_CODE >= 0x020611) + pci_save_state(pdev); +#endif + + bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); + if (bp->pm_cap == 0) { + dev_err(&pdev->dev, + "Cannot find power management capability, aborting.\n"); + rc = -EIO; + goto err_out_release; + } + + bp->dev = dev; + bp->pdev = pdev; + + spin_lock_init(&bp->phy_lock); + spin_lock_init(&bp->indirect_lock); +#ifdef BCM_CNIC + mutex_init(&bp->cnic_lock); +#endif + mutex_init(&bp->reset_lock); +#if (LINUX_VERSION_CODE >= 0x20600) +#if defined(INIT_DELAYED_WORK_DEFERRABLE) || defined(INIT_WORK_NAR) + INIT_WORK(&bp->reset_task, bnx2_reset_task); +#else + INIT_WORK(&bp->reset_task, bnx2_reset_task, bp); +#endif +#else + INIT_TQUEUE(&bp->reset_task, bnx2_reset_task, bp); +#endif + + dev->base_addr = dev->mem_start = pci_resource_start(pdev, 0); +#if defined(BNX2_ENABLE_NETQUEUE) + mem_len = MB_GET_CID_ADDR(NETQUEUE_KCQ_CID + 2); +#else + mem_len = MB_GET_CID_ADDR(TX_TSS_CID + TX_MAX_TSS_RINGS + 1); +#endif + dev->mem_end = dev->mem_start + mem_len; + dev->irq = pdev->irq; + + bp->regview = ioremap_nocache(dev->base_addr, mem_len); + + if (!bp->regview) { + dev_err(&pdev->dev, "Cannot map register space, aborting.\n"); + rc = -ENOMEM; + goto err_out_release; + } + + /* Configure byte swap and enable write to the reg_window registers. + * Rely on CPU to do target byte swapping on big endian systems + * The chip's target access swapping will not swap all accesses + */ + pci_write_config_dword(bp->pdev, BNX2_PCICFG_MISC_CONFIG, + BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA | + BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP); + + bnx2_set_power_state(bp, PCI_D0); + + bp->chip_id = REG_RD(bp, BNX2_MISC_ID); + + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + if (pci_find_capability(pdev, PCI_CAP_ID_EXP) == 0) { + dev_err(&pdev->dev, + "Cannot find PCIE capability, aborting.\n"); + rc = -EIO; + goto err_out_unmap; + } + bp->flags |= BNX2_FLAG_PCIE; + if (CHIP_REV(bp) == CHIP_REV_Ax) + bp->flags |= BNX2_FLAG_JUMBO_BROKEN; + } else { + bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); + if (bp->pcix_cap == 0) { + dev_err(&pdev->dev, + "Cannot find PCIX capability, aborting.\n"); + rc = -EIO; + goto err_out_unmap; + } + bp->flags |= BNX2_FLAG_BROKEN_STATS; + } + +#ifdef CONFIG_PCI_MSI + if (CHIP_NUM(bp) == CHIP_NUM_5709 && CHIP_REV(bp) != CHIP_REV_Ax) { + if (pci_find_capability(pdev, PCI_CAP_ID_MSIX)) + bp->flags |= BNX2_FLAG_MSIX_CAP; + } +#endif + + if (CHIP_ID(bp) != CHIP_ID_5706_A0 && CHIP_ID(bp) != CHIP_ID_5706_A1) { + if (pci_find_capability(pdev, PCI_CAP_ID_MSI)) + bp->flags |= BNX2_FLAG_MSI_CAP; + } + + /* 5708 cannot support DMA addresses > 40-bit. */ + if (CHIP_NUM(bp) == CHIP_NUM_5708) + persist_dma_mask = dma_mask = DMA_BIT_MASK(40); + else + persist_dma_mask = dma_mask = DMA_BIT_MASK(64); + + /* Configure DMA attributes. */ + if (pci_set_dma_mask(pdev, dma_mask) == 0) { + dev->features |= NETIF_F_HIGHDMA; + rc = pci_set_consistent_dma_mask(pdev, persist_dma_mask); + if (rc) { + dev_err(&pdev->dev, + "pci_set_consistent_dma_mask failed, aborting.\n"); + goto err_out_unmap; + } + } else if ((rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) != 0) { + dev_err(&pdev->dev, "System does not support DMA, aborting.\n"); + goto err_out_unmap; + } + + if (!(bp->flags & BNX2_FLAG_PCIE)) + bnx2_get_pci_speed(bp); + + /* 5706A0 may falsely detect SERR and PERR. */ + if (CHIP_ID(bp) == CHIP_ID_5706_A0) { + reg = REG_RD(bp, PCI_COMMAND); + reg &= ~(PCI_COMMAND_SERR | PCI_COMMAND_PARITY); + REG_WR(bp, PCI_COMMAND, reg); + } + else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && + !(bp->flags & BNX2_FLAG_PCIX)) { + + dev_err(&pdev->dev, + "5706 A1 can only be used in a PCIX bus, aborting.\n"); + goto err_out_unmap; + } + + bnx2_init_nvram(bp); + + reg = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_SIGNATURE); + + if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) == + BNX2_SHM_HDR_SIGNATURE_SIG) { + u32 off = PCI_FUNC(pdev->devfn) << 2; + + bp->shmem_base = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_ADDR_0 + off); + } else + bp->shmem_base = HOST_VIEW_SHMEM_BASE; + + /* Get the permanent MAC address. First we need to make sure the + * firmware is actually running. + */ + reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE); + + if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != + BNX2_DEV_INFO_SIGNATURE_MAGIC) { + dev_err(&pdev->dev, "Firmware not running, aborting.\n"); + rc = -ENODEV; + goto err_out_unmap; + } + + reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_BC_REV); + for (i = 0, j = 0; i < 3; i++) { + u8 num, k, skip0; + + num = (u8) (reg >> (24 - (i * 8))); + for (k = 100, skip0 = 1; k >= 1; num %= k, k /= 10) { + if (num >= k || !skip0 || k == 1) { + bp->fw_version[j++] = (num / k) + '0'; + skip0 = 0; + } + } + if (i != 2) + bp->fw_version[j++] = '.'; + } + reg = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE); + if (reg & BNX2_PORT_FEATURE_WOL_ENABLED) + bp->wol = 1; + + if (reg & BNX2_PORT_FEATURE_ASF_ENABLED) { + bp->flags |= BNX2_FLAG_ASF_ENABLE; + + for (i = 0; i < 30; i++) { + reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); + if (reg & BNX2_CONDITION_MFW_RUN_MASK) + break; + bnx2_msleep(10); + } + } + reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); + reg &= BNX2_CONDITION_MFW_RUN_MASK; + if (reg != BNX2_CONDITION_MFW_RUN_UNKNOWN && + reg != BNX2_CONDITION_MFW_RUN_NONE) { + u32 addr = bnx2_shmem_rd(bp, BNX2_MFW_VER_PTR); + + bp->fw_version[j++] = ' '; + for (i = 0; i < 3; i++) { + reg = bnx2_reg_rd_ind(bp, addr + i * 4); + reg = swab32(reg); + memcpy(&bp->fw_version[j], ®, 4); + j += 4; + } + } + + reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_UPPER); + bp->mac_addr[0] = (u8) (reg >> 8); + bp->mac_addr[1] = (u8) reg; + + reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_LOWER); + bp->mac_addr[2] = (u8) (reg >> 24); + bp->mac_addr[3] = (u8) (reg >> 16); + bp->mac_addr[4] = (u8) (reg >> 8); + bp->mac_addr[5] = (u8) reg; + + bp->tx_ring_size = MAX_TX_DESC_CNT; + bnx2_set_rx_ring_size(bp, 255); + + bp->rx_csum = 1; + + bp->tx_quick_cons_trip_int = 2; + bp->tx_quick_cons_trip = 20; + bp->tx_ticks_int = 18; + bp->tx_ticks = 80; + + bp->rx_quick_cons_trip_int = 2; + bp->rx_quick_cons_trip = 12; + bp->rx_ticks_int = 18; + bp->rx_ticks = 18; + + bp->stats_ticks = USEC_PER_SEC & BNX2_HC_STATS_TICKS_HC_STAT_TICKS; + + bp->current_interval = BNX2_TIMER_INTERVAL; + + bp->phy_addr = 1; + + /* Disable WOL support if we are running on a SERDES chip. */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) + bnx2_get_5709_media(bp); + else if (CHIP_BOND_ID(bp) & CHIP_BOND_ID_SERDES_BIT) + bp->phy_flags |= BNX2_PHY_FLAG_SERDES; + + bp->phy_port = PORT_TP; + if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { + bp->phy_port = PORT_FIBRE; + reg = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG); + if (!(reg & BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX)) { + bp->flags |= BNX2_FLAG_NO_WOL; + bp->wol = 0; + } + if (CHIP_NUM(bp) == CHIP_NUM_5706) { + /* Don't do parallel detect on this board because of + * some board problems. The link will not go down + * if we do parallel detect. + */ + if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP && + pdev->subsystem_device == 0x310c) + bp->phy_flags |= BNX2_PHY_FLAG_NO_PARALLEL; + } else { + bp->phy_addr = 2; + if (reg & BNX2_SHARED_HW_CFG_PHY_2_5G) + bp->phy_flags |= BNX2_PHY_FLAG_2_5G_CAPABLE; + } + } else if (CHIP_NUM(bp) == CHIP_NUM_5706 || + CHIP_NUM(bp) == CHIP_NUM_5708) + bp->phy_flags |= BNX2_PHY_FLAG_CRC_FIX; + else if (CHIP_NUM(bp) == CHIP_NUM_5709 && + (CHIP_REV(bp) == CHIP_REV_Ax || + CHIP_REV(bp) == CHIP_REV_Bx)) + bp->phy_flags |= BNX2_PHY_FLAG_DIS_EARLY_DAC; + + bnx2_init_fw_cap(bp); + + if ((CHIP_ID(bp) == CHIP_ID_5708_A0) || + (CHIP_ID(bp) == CHIP_ID_5708_B0) || + (CHIP_ID(bp) == CHIP_ID_5708_B1) || + !(REG_RD(bp, BNX2_PCI_CONFIG_3) & BNX2_PCI_CONFIG_3_VAUX_PRESET)) { + bp->flags |= BNX2_FLAG_NO_WOL; + bp->wol = 0; + } + + if (CHIP_ID(bp) == CHIP_ID_5706_A0) { + bp->tx_quick_cons_trip_int = + bp->tx_quick_cons_trip; + bp->tx_ticks_int = bp->tx_ticks; + bp->rx_quick_cons_trip_int = + bp->rx_quick_cons_trip; + bp->rx_ticks_int = bp->rx_ticks; + bp->comp_prod_trip_int = bp->comp_prod_trip; + bp->com_ticks_int = bp->com_ticks; + bp->cmd_ticks_int = bp->cmd_ticks; + } + +#ifdef CONFIG_PCI_MSI +#if defined(__VMKLNX__) + /* PR496996: There is some additional setup needed for the P2P ServerWorks + * bridge with VID/DID of 0x1666/0x0036 when 5706 is plugged into + * an IBM system x3655 server and MSI is used. + * Since that workaround cannot be done using vmklinux api, we + * are disabling MSI on 5706 to avoid PSOD. + */ + if (CHIP_NUM(bp) == CHIP_NUM_5706) + disable_msi = 1; +#else /* !defined(__VMKLNX__) */ + /* Disable MSI on 5706 if AMD 8132 bridge is found. + * + * MSI is defined to be 32-bit write. The 5706 does 64-bit MSI writes + * with byte enables disabled on the unused 32-bit word. This is legal + * but causes problems on the AMD 8132 which will eventually stop + * responding after a while. + * + * AMD believes this incompatibility is unique to the 5706, and + * prefers to locally disable MSI rather than globally disabling it. + */ + if (CHIP_NUM(bp) == CHIP_NUM_5706 && disable_msi == 0) { + struct pci_dev *amd_8132 = NULL; + + while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD, + PCI_DEVICE_ID_AMD_8132_BRIDGE, + amd_8132))) { + u8 rev; + + pci_read_config_byte(amd_8132, PCI_REVISION_ID, &rev); + if (rev >= 0x10 && rev <= 0x13) { + disable_msi = 1; + pci_dev_put(amd_8132); + break; + } + } + } +#endif /* defined(__VMKLNX__) */ +#endif + bnx2_set_default_link(bp); + bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX; + + init_timer(&bp->timer); + bp->timer.expires = RUN_AT(BNX2_TIMER_INTERVAL); + bp->timer.data = (unsigned long) bp; + bp->timer.function = bnx2_timer; + + return 0; + +err_out_unmap: + if (bp->regview) { + iounmap(bp->regview); + bp->regview = NULL; + } + +err_out_release: + pci_release_regions(pdev); + +err_out_disable: + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); + +err_out: + return rc; +} + +static char * __devinit +bnx2_bus_string(struct bnx2 *bp, char *str) +{ + char *s = str; + + if (bp->flags & BNX2_FLAG_PCIE) { + s += sprintf(s, "PCI Express"); + } else { + s += sprintf(s, "PCI"); + if (bp->flags & BNX2_FLAG_PCIX) + s += sprintf(s, "-X"); + if (bp->flags & BNX2_FLAG_PCI_32BIT) + s += sprintf(s, " 32-bit"); + else + s += sprintf(s, " 64-bit"); + s += sprintf(s, " %dMHz", bp->bus_speed_mhz); + } + return str; +} + +#if defined(__VMKLNX__) +static void +bnx2_init_napi(struct bnx2 *bp) +#else +static void __devinit +bnx2_init_napi(struct bnx2 *bp) +#endif +{ + int i; + +#if defined(__VMKLNX__) + for (i = 0; i < bp->irq_nvecs; i++) { +#else + for (i = 0; i < BNX2_MAX_MSIX_VEC; i++) { +#endif + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; +#ifdef BNX2_NEW_NAPI + int (*poll)(struct napi_struct *, int); + + if (i == 0) + poll = bnx2_poll; + else + poll = bnx2_poll_msix; + + netif_napi_add(bp->dev, &bp->bnx2_napi[i].napi, poll, 64); +#endif + + bnapi->bp = bp; + } +#ifndef BNX2_NEW_NAPI + bp->dev->poll = bnx2_poll; + bp->dev->weight = 64; +#endif +} + +#ifdef HAVE_NET_DEVICE_OPS +static const struct net_device_ops bnx2_netdev_ops = { + .ndo_open = bnx2_open, + .ndo_start_xmit = bnx2_start_xmit, + .ndo_stop = bnx2_close, + .ndo_get_stats = bnx2_get_stats, + .ndo_set_rx_mode = bnx2_set_rx_mode, + .ndo_do_ioctl = bnx2_ioctl, + .ndo_validate_addr = eth_validate_addr, + .ndo_set_mac_address = bnx2_change_mac_addr, + .ndo_change_mtu = bnx2_change_mtu, + .ndo_tx_timeout = bnx2_tx_timeout, +#ifdef BCM_VLAN + .ndo_vlan_rx_register = bnx2_vlan_rx_register, +#endif +#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) + .ndo_poll_controller = poll_bnx2, +#endif +}; +#endif + +static void inline vlan_features_add(struct net_device *dev, unsigned long flags) +{ +#if (LINUX_VERSION_CODE >= 0x2061a) +#ifdef BCM_VLAN + dev->vlan_features |= flags; +#endif +#endif +} + +static int __devinit +bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + static int version_printed = 0; + struct net_device *dev = NULL; + struct bnx2 *bp; + int rc; + char str[40]; + DECLARE_MAC_BUF(mac); +#if defined(BNX2_ENABLE_NETQUEUE) + static int index = 0; +#endif + + if (version_printed++ == 0) + printk(KERN_INFO "%s", version); + + /* dev zeroed in init_etherdev */ +#if (LINUX_VERSION_CODE >= 0x20418) +#ifndef BCM_HAVE_MULTI_QUEUE + dev = alloc_etherdev(sizeof(*bp)); +#else + dev = alloc_etherdev_mq(sizeof(*bp), TX_MAX_RINGS); +#endif +#else + dev = init_etherdev(NULL, sizeof(*bp)); +#endif + + if (!dev) + return -ENOMEM; + + rc = bnx2_init_board(pdev, dev); + if (rc < 0) { +#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); +#else + unregister_netdev(dev); + kfree(dev); +#endif + return rc; + } + +#ifndef HAVE_NET_DEVICE_OPS + dev->open = bnx2_open; + dev->hard_start_xmit = bnx2_start_xmit; + dev->stop = bnx2_close; + dev->get_stats = bnx2_get_stats; +#ifdef HAVE_SET_RX_MODE + dev->set_rx_mode = bnx2_set_rx_mode; +#else + dev->set_multicast_list = bnx2_set_rx_mode; +#endif + dev->do_ioctl = bnx2_ioctl; + dev->set_mac_address = bnx2_change_mac_addr; + dev->change_mtu = bnx2_change_mtu; + dev->tx_timeout = bnx2_tx_timeout; +#ifdef BCM_VLAN + dev->vlan_rx_register = bnx2_vlan_rx_register; +#if (LINUX_VERSION_CODE < 0x20616) + dev->vlan_rx_kill_vid = bnx2_vlan_rx_kill_vid; +#endif +#endif +#if defined(HAVE_POLL_CONTROLLER) || defined(CONFIG_NET_POLL_CONTROLLER) + dev->poll_controller = poll_bnx2; +#endif +#else + dev->netdev_ops = &bnx2_netdev_ops; +#endif + dev->watchdog_timeo = TX_TIMEOUT; + dev->ethtool_ops = &bnx2_ethtool_ops; + + bp = netdev_priv(dev); + /* NAPI add must be called in bnx2_init_one() on ESX so that the + * proper affinity will be assigned */ +#if defined(__VMKLNX__) + bnx2_setup_int_mode(bp, disable_msi); +#endif /* (__VMKLNX__)*/ + bnx2_init_napi(bp); + + pci_set_drvdata(pdev, dev); + + memcpy(dev->dev_addr, bp->mac_addr, 6); +#ifdef ETHTOOL_GPERMADDR + memcpy(dev->perm_addr, bp->mac_addr, 6); +#endif + +#ifdef NETIF_F_IPV6_CSUM + dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG; + vlan_features_add(dev, NETIF_F_IP_CSUM | NETIF_F_SG); + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + dev->features |= NETIF_F_IPV6_CSUM; + vlan_features_add(dev, NETIF_F_IPV6_CSUM); + } +#else + dev->features |= NETIF_F_SG; + if (CHIP_NUM(bp) == CHIP_NUM_5709) + dev->features |= NETIF_F_HW_CSUM; + else + dev->features |= NETIF_F_IP_CSUM; +#endif +#ifdef BCM_VLAN + dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; +#endif +#ifdef BCM_TSO + dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN; + vlan_features_add(dev, NETIF_F_TSO | NETIF_F_TSO_ECN); + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + dev->features |= NETIF_F_TSO6; + vlan_features_add(dev, NETIF_F_TSO6); + } +#endif + +#if defined(BNX2_ENABLE_NETQUEUE) + /* If enabled register the NetQueue callbacks */ + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + bp->index = index; + index++; + if (BNX2_NETQUEUE_ENABLED(bp)) + VMKNETDDI_REGISTER_QUEUEOPS(dev, bnx2_netqueue_ops); + } +#endif + +#if (LINUX_VERSION_CODE >= 0x20418) + if ((rc = register_netdev(dev))) { + dev_err(&pdev->dev, "Cannot register net device\n"); + if (bp->regview) + iounmap(bp->regview); + pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); + free_netdev(dev); + return rc; + } +#endif + printk(KERN_INFO "%s: %s (%c%d) %s found at mem %lx, " + "IRQ %d, node addr %s\n", + dev->name, + board_info[ent->driver_data].name, + ((CHIP_ID(bp) & 0xf000) >> 12) + 'A', + ((CHIP_ID(bp) & 0x0ff0) >> 4), + bnx2_bus_string(bp, str), + dev->base_addr, + bp->pdev->irq, print_mac(mac, dev->dev_addr)); + +#if defined(BNX2_ENABLE_NETQUEUE) + if (CHIP_NUM(bp) == CHIP_NUM_5709) { + if (BNX2_NETQUEUE_ENABLED(bp)) { + printk(KERN_INFO "%s: NetQueue Ops registered [%d]\n", + dev->name, bp->index); + } else + printk(KERN_INFO "%s: NetQueue Ops not registered " + "[%d]\n", + dev->name, bp->index); + } +#endif + + return 0; +} + +static void __devexit +bnx2_remove_one(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + +#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); +#endif + + unregister_netdev(dev); + + if (bp->regview) + iounmap(bp->regview); + +#if (LINUX_VERSION_CODE >= 0x20418) + free_netdev(dev); +#else + kfree(dev); +#endif + pci_release_regions(pdev); + pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); +} + +static int +bnx2_suspend(struct pci_dev *pdev, pm_message_t state) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + +#if (LINUX_VERSION_CODE >= 0x2060b) + /* PCI register 4 needs to be saved whether netif_running() or not. + * MSI address and data need to be saved if using MSI and + * netif_running(). + */ + pci_save_state(pdev); +#endif + if (!netif_running(dev)) + return 0; + +#if (LINUX_VERSION_CODE >= 0x20600) + flush_scheduled_work(); +#endif + bnx2_netif_stop(bp); + netif_device_detach(dev); + del_timer_sync(&bp->timer); + bnx2_shutdown_chip(bp); + bnx2_free_skbs(bp); +#if (LINUX_VERSION_CODE < 0x2060b) + bnx2_set_power_state(bp, state); +#else + bnx2_set_power_state(bp, pci_choose_state(pdev, state)); +#endif + return 0; +} + +static int +bnx2_resume(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + +#if (LINUX_VERSION_CODE >= 0x2060b) + pci_restore_state(pdev); +#endif + if (!netif_running(dev)) + return 0; + + bnx2_set_power_state(bp, PCI_D0); + netif_device_attach(dev); + bnx2_init_nic(bp, 1); + bnx2_netif_start(bp); + return 0; +} + +#if !defined(__VMKLNX__) +#if (LINUX_VERSION_CODE >= 0x020611) +/** + * bnx2_io_error_detected - called when PCI error is detected + * @pdev: Pointer to PCI device + * @state: The current pci connection state + * + * This function is called after a PCI bus error affecting + * this device has been detected. + */ +static pci_ers_result_t bnx2_io_error_detected(struct pci_dev *pdev, + pci_channel_state_t state) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + + rtnl_lock(); + netif_device_detach(dev); + + if (state == pci_channel_io_perm_failure) { + rtnl_unlock(); + return PCI_ERS_RESULT_DISCONNECT; + } + + if (netif_running(dev)) { + bnx2_netif_stop(bp); + del_timer_sync(&bp->timer); + bnx2_reset_nic(bp, BNX2_DRV_MSG_CODE_RESET); + } + + pci_disable_device(pdev); + rtnl_unlock(); + + /* Request a slot slot reset. */ + return PCI_ERS_RESULT_NEED_RESET; +} + +/** + * bnx2_io_slot_reset - called after the pci bus has been reset. + * @pdev: Pointer to PCI device + * + * Restart the card from scratch, as if from a cold-boot. + */ +static pci_ers_result_t bnx2_io_slot_reset(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + + rtnl_lock(); + if (pci_enable_device(pdev)) { + dev_err(&pdev->dev, + "Cannot re-enable PCI device after reset.\n"); + rtnl_unlock(); + return PCI_ERS_RESULT_DISCONNECT; + } + pci_set_master(pdev); + pci_restore_state(pdev); + + if (netif_running(dev)) { + bnx2_set_power_state(bp, PCI_D0); + bnx2_init_nic(bp, 1); + } + + rtnl_unlock(); + return PCI_ERS_RESULT_RECOVERED; +} + +/** + * bnx2_io_resume - called when traffic can start flowing again. + * @pdev: Pointer to PCI device + * + * This callback is called when the error recovery driver tells us that + * its OK to resume normal operation. + */ +static void bnx2_io_resume(struct pci_dev *pdev) +{ + struct net_device *dev = pci_get_drvdata(pdev); + struct bnx2 *bp = netdev_priv(dev); + + rtnl_lock(); + if (netif_running(dev)) + bnx2_netif_start(bp); + + netif_device_attach(dev); + rtnl_unlock(); +} + +static struct pci_error_handlers bnx2_err_handler = { + .error_detected = bnx2_io_error_detected, + .slot_reset = bnx2_io_slot_reset, + .resume = bnx2_io_resume, +}; + +#endif +#endif + +static struct pci_driver bnx2_pci_driver = { + .name = DRV_MODULE_NAME, + .id_table = bnx2_pci_tbl, + .probe = bnx2_init_one, + .remove = __devexit_p(bnx2_remove_one), + .suspend = bnx2_suspend, + .resume = bnx2_resume, +#if !defined(__VMKLNX__) +#if (LINUX_VERSION_CODE >= 0x020611) + .err_handler = &bnx2_err_handler, +#endif +#endif +}; + +static int __init bnx2_init(void) +{ + int rc = 0; +#if defined(BNX2_ENABLE_NETQUEUE) + int i; + + /* sanity check the force_netq parameter */ + for (i = 0; i < BNX2_MAX_NIC; i++) { + if((force_netq_param[i] < BNX2_OPTION_UNSET) || + (force_netq_param[i] > 7)) { + printk(KERN_ERR "bnx2x: please use a 'force_netq' " + "value between (-1 to 7), " + "0 to disable NetQueue, " + "-1 to use the default value " + "failure at index %d val: %d\n", + i, force_netq_param[i]); + rc = -EINVAL; + } + } + + if(rc != 0) + return rc; +#endif + +#if (LINUX_VERSION_CODE < 0x020613) + rc = pci_module_init(&bnx2_pci_driver); +#else + rc = pci_register_driver(&bnx2_pci_driver); +#endif + return rc; +} + +static void __exit bnx2_cleanup(void) +{ + pci_unregister_driver(&bnx2_pci_driver); +} + +module_init(bnx2_init); +module_exit(bnx2_cleanup); + + +#if defined(BNX2_ENABLE_NETQUEUE) + +#ifdef BNX2_DEBUG +static u32 bnx2_read_ctx(struct bnx2 *bp, u32 offset) +{ + int i; + + if (CHIP_NUM(bp) != CHIP_NUM_5709) { + REG_WR(bp, BNX2_CTX_DATA_ADR, offset); + return REG_RD(bp, BNX2_CTX_DATA); + } + + REG_WR(bp, BNX2_CTX_CTX_CTRL, offset | BNX2_CTX_CTX_CTRL_READ_REQ); + for (i = 0; i < 5; i++) { + udelay(5); + if (REG_RD(bp, BNX2_CTX_CTX_CTRL) & BNX2_CTX_CTX_CTRL_READ_REQ) + continue; + break; + } + + return REG_RD(bp, BNX2_CTX_CTX_DATA); +} + +static void dump_ctx(struct bnx2 *bp, u32 cid) +{ + u32 addr = cid * 128; + int i; + + for (i = 0; i < 8; i++) { + u32 val, val1, val2, val3; + + val = bnx2_read_ctx(bp, addr); + val1 = bnx2_read_ctx(bp, addr+4); + val2 = bnx2_read_ctx(bp, addr+8); + val3 = bnx2_read_ctx(bp, addr+0xc); + printk(KERN_ALERT "ctx %08x: %08x %08x %08x %08x\n", + addr, val, val1, val2, val3); + addr += 0x10; + } +} +#endif + +#define BNX2_NETQ_WAIT_EVENT_TIMEOUT msecs_to_jiffies(1000) + +#define L2_KWQ_PAGE_CNT 1 +#define L2_KCQ_PAGE_CNT 1 + +#define L2_KWQE_CNT (BCM_PAGE_SIZE / sizeof(struct l2_kwqe)) +#define L2_KCQE_CNT (BCM_PAGE_SIZE / sizeof(struct l2_kcqe)) +#define MAX_L2_KWQE_CNT (L2_KWQE_CNT - 1) +#define MAX_L2_KCQE_CNT (L2_KCQE_CNT - 1) + +#define MAX_L2_KWQ_IDX ((L2_KWQ_PAGE_CNT * L2_KWQE_CNT) - 1) +#define MAX_L2_KCQ_IDX ((L2_KCQ_PAGE_CNT * L2_KCQE_CNT) - 1) + +#define L2_KWQ_PG(x) (((x) & ~MAX_L2_KWQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define L2_KWQ_IDX(x) ((x) & MAX_L2_KWQE_CNT) + +#define L2_KCQ_PG(x) (((x) & ~MAX_L2_KCQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define L2_KCQ_IDX(x) ((x) & MAX_L2_KCQE_CNT) + +/* + * krnlq_context definition + */ +#define L2_KRNLQ_FLAGS 0x00000000 +#define L2_KRNLQ_SIZE 0x00000000 +#define L2_KRNLQ_TYPE 0x00000000 +#define KRNLQ_FLAGS_PG_SZ (0xf<<0) +#define KRNLQ_FLAGS_PG_SZ_256 (0<<0) +#define KRNLQ_FLAGS_PG_SZ_512 (1<<0) +#define KRNLQ_FLAGS_PG_SZ_1K (2<<0) +#define KRNLQ_FLAGS_PG_SZ_2K (3<<0) +#define KRNLQ_FLAGS_PG_SZ_4K (4<<0) +#define KRNLQ_FLAGS_PG_SZ_8K (5<<0) +#define KRNLQ_FLAGS_PG_SZ_16K (6<<0) +#define KRNLQ_FLAGS_PG_SZ_32K (7<<0) +#define KRNLQ_FLAGS_PG_SZ_64K (8<<0) +#define KRNLQ_FLAGS_PG_SZ_128K (9<<0) +#define KRNLQ_FLAGS_PG_SZ_256K (10<<0) +#define KRNLQ_FLAGS_PG_SZ_512K (11<<0) +#define KRNLQ_FLAGS_PG_SZ_1M (12<<0) +#define KRNLQ_FLAGS_PG_SZ_2M (13<<0) +#define KRNLQ_FLAGS_QE_SELF_SEQ (1<<15) +#define KRNLQ_SIZE_TYPE_SIZE ((((0x28 + 0x1f) & ~0x1f) / 0x20) << 16) +#define KRNLQ_TYPE_TYPE (0xf<<28) +#define KRNLQ_TYPE_TYPE_EMPTY (0<<28) +#define KRNLQ_TYPE_TYPE_KRNLQ (6<<28) + +#define L2_KRNLQ_HOST_QIDX 0x00000004 +#define L2_KRNLQ_HOST_FW_QIDX 0x00000008 +#define L2_KRNLQ_NX_QE_SELF_SEQ 0x0000000c +#define L2_KRNLQ_QE_SELF_SEQ_MAX 0x0000000c +#define L2_KRNLQ_NX_QE_HADDR_HI 0x00000010 +#define L2_KRNLQ_NX_QE_HADDR_LO 0x00000014 +#define L2_KRNLQ_PGTBL_PGIDX 0x00000018 +#define L2_KRNLQ_NX_PG_QIDX 0x00000018 +#define L2_KRNLQ_PGTBL_NPAGES 0x0000001c +#define L2_KRNLQ_QIDX_INCR 0x0000001c +#define L2_KRNLQ_PGTBL_HADDR_HI 0x00000020 +#define L2_KRNLQ_PGTBL_HADDR_LO 0x00000024 + +#define BNX2_PG_CTX_MAP 0x1a0034 + +static int +bnx2_netq_free_rx_queue_update(struct net_device *netdev, + int index, + int update); + +static int +bnx2_netqueue_is_avail(struct bnx2 *bp) +{ + rmb(); + + return ((BNX2_NETQUEUE_ENABLED(bp)) && + (bp->flags & BNX2_FLAG_USING_MSIX) && + (CHIP_NUM(bp) == CHIP_NUM_5709)); +} + +static inline u32 +bnx2_netqueue_kwq_avail(struct bnx2 *bp) +{ + return MAX_L2_KWQ_IDX - + ((bp->netq_kwq_prod_idx - bp->netq_kwq_con_idx) & + MAX_L2_KWQ_IDX); +} + +static int +bnx2_netqueue_submit_kwqes(struct bnx2 *bp, struct l2_kwqe *wqes) +{ + struct l2_kwqe *prod_qe; + u16 prod, sw_prod; + + if (1 > bnx2_netqueue_kwq_avail(bp)) { + printk(KERN_WARNING "%s: No kwq's available\n", bp->dev->name); + return -EAGAIN; + } + + prod = bp->netq_kwq_prod_idx; + sw_prod = prod & MAX_L2_KWQ_IDX; + + prod_qe = &bp->netq_kwq[L2_KWQ_PG(sw_prod)][L2_KWQ_IDX(sw_prod)]; + memcpy(prod_qe, wqes, sizeof(struct l2_kwqe)); + prod++; + sw_prod = prod & MAX_L2_KWQ_IDX; + + bp->netq_kwq_prod_idx = prod; + + barrier(); + REG_WR16(bp, bp->netq_kwq_io_addr, bp->netq_kwq_prod_idx); + wmb(); + mmiowb(); + + return 0; +} + +static void +bnx2_netqueue_free_dma(struct bnx2 *bp, struct netq_dma *dma) +{ + int i; + + if (dma->pg_arr) { + for (i = 0; i < dma->num_pages; i++) { + if (dma->pg_arr[i]) { + pci_free_consistent(bp->pdev, BCM_PAGE_SIZE, + dma->pg_arr[i], + dma->pg_map_arr[i]); + dma->pg_arr[i] = NULL; + } + } + } + if (dma->pgtbl) { + pci_free_consistent(bp->pdev, dma->pgtbl_size, + dma->pgtbl, dma->pgtbl_map); + dma->pgtbl = NULL; + } + kfree(dma->pg_arr); + dma->pg_arr = NULL; + dma->num_pages = 0; +} + +static void +bnx2_netqueue_free_resc(struct bnx2 *bp) +{ + bnx2_netqueue_free_dma(bp, &bp->netq_kwq_info); + bnx2_netqueue_free_dma(bp, &bp->netq_kcq_info); +} + +static void +bnx2_netqueue_setup_page_tbl(struct bnx2 *bp, + struct netq_dma *dma) +{ + int i; + u32 *page_table = dma->pgtbl; + + for (i = 0; i < dma->num_pages; i++) { + /* Each entry needs to be in big endian format. */ + *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); + page_table++; + *page_table = (u32) dma->pg_map_arr[i]; + page_table++; + } +} + +static int +bnx2_netqueue_alloc_dma(struct bnx2 *bp, struct netq_dma *dma, + int pages) +{ + int i, size; + + size = pages * (sizeof(void *) + sizeof(dma_addr_t)); + dma->pg_arr = kzalloc(size, GFP_ATOMIC); + if (dma->pg_arr == NULL) { + printk(KERN_ERR "%s: Couldn't alloc space for dma page array\n", + bp->dev->name); + return -ENOMEM; + } + + dma->pg_map_arr = (dma_addr_t *) (dma->pg_arr + pages); + dma->num_pages = pages; + + for (i = 0; i < pages; i++) { + dma->pg_arr[i] = pci_alloc_consistent(bp->pdev, + BCM_PAGE_SIZE, + &dma->pg_map_arr[i]); + if (dma->pg_arr[i] == NULL) { + printk(KERN_ERR "%s: Couldn't alloc dma page\n", + bp->dev->name); + + goto error; + } + } + + dma->pgtbl_size = ((pages * 8) + BCM_PAGE_SIZE - 1) & + ~(BCM_PAGE_SIZE - 1); + dma->pgtbl = pci_alloc_consistent(bp->pdev, dma->pgtbl_size, + &dma->pgtbl_map); + if (dma->pgtbl == NULL) + goto error; + + bnx2_netqueue_setup_page_tbl(bp, dma); + + return 0; + +error: + bnx2_netqueue_free_dma(bp, dma); + return -ENOMEM; +} + +static int +bnx2_netqueue_alloc_resc(struct bnx2 *bp) +{ + int ret; + + ret = bnx2_netqueue_alloc_dma(bp, &bp->netq_kwq_info, + L2_KWQ_PAGE_CNT); + if (ret) { + printk(KERN_ERR "%s: Couldn't alloc space for kwq\n", + bp->dev->name); + goto error; + } + bp->netq_kwq = (struct l2_kwqe **) bp->netq_kwq_info.pg_arr; + + ret = bnx2_netqueue_alloc_dma(bp, &bp->netq_kcq_info, + L2_KCQ_PAGE_CNT); + if (ret) { + printk(KERN_ERR "%s: Couldn't alloc space for kwq\n", + bp->dev->name); + goto error; + } + bp->netq_kcq = (struct l2_kcqe **) bp->netq_kcq_info.pg_arr; + + return 0; + +error: + bnx2_netqueue_free_resc(bp); + bp->netq_kwq = NULL; + bp->netq_kcq = NULL; + + return ret; +} + +static void +bnx2_init_netqueue_context(struct bnx2 *bp, u32 cid) +{ + u32 cid_addr; + int i; + + cid_addr = GET_CID_ADDR(cid); + + for (i = 0; i < CTX_SIZE; i += 4) + bnx2_ctx_wr(bp, cid_addr, i, 0); +} + +static int +bnx2_netqueue_get_kcqes(struct bnx2 *bp, u16 hw_prod, u16 *sw_prod) +{ + u16 i, ri, last; + struct l2_kcqe *kcqe; + int kcqe_cnt = 0, last_cnt = 0; + + i = ri = last = *sw_prod; + ri &= MAX_L2_KCQ_IDX; + + while ((i != hw_prod) && (kcqe_cnt < BNX2_NETQ_MAX_COMPLETED_KCQE)) { + kcqe = &bp->netq_kcq[L2_KCQ_PG(ri)][L2_KCQ_IDX(ri)]; + bp->netq_completed_kcq[kcqe_cnt++] = kcqe; + i = (i + 1); + ri = i & MAX_L2_KCQ_IDX; + if (likely(!(kcqe->flags & L2_KCQE_FLAGS_NEXT))) { + last_cnt = kcqe_cnt; + last = i; + } + } + + *sw_prod = last; + return last_cnt; +} + + +static void +bnx2_service_netq_kcqes(struct bnx2_napi *bnapi, int num_cqes) +{ + struct bnx2 *bp = bnapi->bp; + int i, j; + + i = 0; + j = 1; + while (num_cqes) { + u32 kcqe_op_flag = bp->netq_completed_kcq[i]->opcode; + u32 kcqe_layer = bp->netq_completed_kcq[i]->flags & + L2_KCQE_FLAGS_LAYER_MASK; + + printk(KERN_INFO PFX "%s: kcwe service [reserved: 0x%x, status: 0x%x, qid: 0x%x, qe_self_seq: 0x%x, opcode: 0x%x, flags: 0x%x]\n", + bp->dev->name, + bp->netq_completed_kcq[i]->reserved, + bp->netq_completed_kcq[i]->status, + bp->netq_completed_kcq[i]->qid, + bp->netq_completed_kcq[i]->qe_self_seq, + bp->netq_completed_kcq[i]->opcode, + bp->netq_completed_kcq[i]->flags); + + while (j < num_cqes) { + u32 next_op = bp->netq_completed_kcq[i + j]->opcode; + + if ((next_op & L2_KCQE_FLAGS_LAYER_MASK) != kcqe_layer) + break; + j++; + } + + if (kcqe_layer != L2_KCQE_FLAGS_LAYER_MASK_L2) { + printk(KERN_ERR PFX "%s: Unknown type of KCQE(0x%x)\n", + bp->dev->name, kcqe_op_flag); + goto end; + } + + bp->netq_flags = kcqe_op_flag; + wake_up(&bp->netq_wait); + wmb(); + +end: + num_cqes -= j; + i += j; + j = 1; + } + + + return; +} + +static void +bnx2_netqueue_service_bnx2_msix(struct bnx2_napi *bnapi) +{ + struct bnx2 *bp = bnapi->bp; + struct status_block *status_blk = bp->bnx2_napi[0].status_blk.msi; + u32 status_idx = status_blk->status_idx; + u16 hw_prod, sw_prod; + int kcqe_cnt; + + bp->netq_kwq_con_idx = status_blk->status_cmd_consumer_index; + + hw_prod = status_blk->status_completion_producer_index; + sw_prod = bp->netq_kcq_prod_idx; + + /* Ensure that there is a NetQ kcq avaliable */ + if (sw_prod == hw_prod) + return; + + while (sw_prod != hw_prod) { + kcqe_cnt = bnx2_netqueue_get_kcqes(bp, hw_prod, &sw_prod); + if (kcqe_cnt == 0) + goto done; + + bnx2_service_netq_kcqes(bnapi, kcqe_cnt); + + /* Tell compiler that status_blk fields can change. */ + barrier(); + if (status_idx != status_blk->status_idx) { + status_idx = status_blk->status_idx; + bp->netq_kwq_con_idx = status_blk->status_cmd_consumer_index; + hw_prod = status_blk->status_completion_producer_index; + } else + break; + } + + barrier(); +done: + REG_WR16(bp, bp->netq_kcq_io_addr, sw_prod); + + bp->netq_kcq_prod_idx = sw_prod; + bp->netq_last_status_idx = status_idx; +} + +static int +bnx2_netqueue_open_started(struct bnx2 *bp) +{ + return (((bp->netq_state & BNX2_NETQ_HW_STARTED) == + BNX2_NETQ_HW_STARTED) && + ((bp->netq_state & BNX2_NETQ_HW_OPENED) == + BNX2_NETQ_HW_OPENED)); +} + +static void +bnx2_stop_netqueue_hw(struct bnx2 *bp) +{ + u32 val; + + /* Disable the CP and COM doorbells. These two processors polls the + * doorbell for a non zero value before running. This must be done + * after setting up the kernel queue contexts. This is for + * KQW/KCQ #1. */ + + val = bnx2_reg_rd_ind(bp, BNX2_CP_SCRATCH + 0x20); + val &= ~KWQ1_READY; + bnx2_reg_wr_ind(bp, BNX2_CP_SCRATCH + 0x20, val); + + val = bnx2_reg_rd_ind(bp, BNX2_COM_SCRATCH + 0x20); + val &= ~KCQ1_READY; + bnx2_reg_wr_ind(bp, BNX2_COM_SCRATCH + 0x20, val); + + barrier(); + + bp->netq_state &= ~BNX2_NETQ_HW_STARTED; + wmb(); +} + +static void +bnx2_close_netqueue_hw(struct bnx2 *bp) +{ + bnx2_stop_netqueue_hw(bp); + bnx2_netqueue_free_resc(bp); + + bp->netq_state &= ~BNX2_NETQ_HW_OPENED; + wmb(); +} + +static void +bnx2_start_netqueue_hw(struct bnx2 *bp) +{ + + /* Set the CP and COM doorbells. These two processors polls the + * doorbell for a non zero value before running. This must be done + * after setting up the kernel queue contexts. This is for + * KQW/KCQ 1. */ + bnx2_reg_wr_ind(bp, BNX2_CP_SCRATCH + 0x20, KWQ1_READY); + bnx2_reg_wr_ind(bp, BNX2_COM_SCRATCH + 0x20, KCQ1_READY); + + bp->netq_state |= BNX2_NETQ_HW_STARTED; + wmb(); +} + +static void +bnx2_init_netqueue_hw(struct bnx2 *bp) +{ + u32 val; + + /* Initialize the bnx2 netqueue structures */ + init_waitqueue_head(&bp->netq_wait); + + val = REG_RD(bp, BNX2_MQ_CONFIG); + val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; + if (BCM_PAGE_BITS > 12) + val |= (12 - 8) << 4; + else + val |= (BCM_PAGE_BITS - 8) << 4; + + REG_WR(bp, BNX2_MQ_CONFIG, val); + + REG_WR(bp, BNX2_HC_COMP_PROD_TRIP, (2 << 16) | 8); + REG_WR(bp, BNX2_HC_COM_TICKS, (64 << 16) | 220); + REG_WR(bp, BNX2_HC_CMD_TICKS, (64 << 16) | 220); + + bnx2_init_netqueue_context(bp, NETQUEUE_KWQ_CID); + bnx2_init_netqueue_context(bp, NETQUEUE_KCQ_CID); + + bp->netq_kwq_cid_addr = GET_CID_ADDR(NETQUEUE_KWQ_CID); + bp->netq_kwq_io_addr = MB_GET_CID_ADDR(NETQUEUE_KWQ_CID) + + L2_KRNLQ_HOST_QIDX; + + bp->netq_kwq_prod_idx = 0; + bp->netq_kwq_con_idx = 0; + + /* Initialize the kernel work queue context. */ + val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | + (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; + bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_TYPE, val); + + val = (BCM_PAGE_SIZE / sizeof(struct l2_kwqe) - 1) << 16; + bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_QE_SELF_SEQ_MAX, val); + + val = ((BCM_PAGE_SIZE / sizeof(struct l2_kwqe)) << 16) | L2_KWQ_PAGE_CNT; + bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_NPAGES, val); + + val = (u32) ((u64) bp->netq_kwq_info.pgtbl_map >> 32); + bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_HADDR_HI, val); + + val = (u32) bp->netq_kwq_info.pgtbl_map; + bnx2_ctx_wr(bp, bp->netq_kwq_cid_addr, L2_KRNLQ_PGTBL_HADDR_LO, val); + + bp->netq_kcq_cid_addr = GET_CID_ADDR(NETQUEUE_KCQ_CID); + bp->netq_kcq_io_addr = MB_GET_CID_ADDR(NETQUEUE_KCQ_CID) + + L2_KRNLQ_HOST_QIDX; + bp->netq_kcq_prod_idx = 0; + + /* Initialize the kernel complete queue context. */ + val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | + (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; + bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_TYPE, val); + + val = (BCM_PAGE_SIZE / sizeof(struct l2_kcqe) - 1) << 16; + bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_QE_SELF_SEQ_MAX, val); + + val = ((BCM_PAGE_SIZE / sizeof(struct l2_kcqe)) << 16)|L2_KCQ_PAGE_CNT; + bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_NPAGES, val); + + val = (u32) ((u64) bp->netq_kcq_info.pgtbl_map >> 32); + bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_HADDR_HI, val); + + val = (u32) bp->netq_kcq_info.pgtbl_map; + bnx2_ctx_wr(bp, bp->netq_kcq_cid_addr, L2_KRNLQ_PGTBL_HADDR_LO, val); + + /* Enable Commnad Scheduler notification when we write to the + * host producer index of the kernel contexts. */ + REG_WR(bp, BNX2_MQ_KNL_CMD_MASK1, 2); + + /* Enable Command Scheduler notification when we write to either + * the Send Queue or Receive Queue producer indexes of the kernel + * bypass contexts. */ + REG_WR(bp, BNX2_MQ_KNL_BYP_CMD_MASK1, 7); + REG_WR(bp, BNX2_MQ_KNL_BYP_WRITE_MASK1, 7); + + /* Notify COM when the driver post an application buffer. */ + REG_WR(bp, BNX2_MQ_KNL_RX_V2P_MASK2, 0x2000); + + barrier(); +} + +static int +bnx2_open_netqueue_hw(struct bnx2 *bp) +{ + int err; + + err = bnx2_netqueue_alloc_resc(bp); + if (err != 0) { + printk(KERN_ERR "%s: Couldn't allocate netq resources\n", + bp->dev->name); + return err; + } + + bnx2_init_netqueue_hw(bp); + bnx2_start_netqueue_hw(bp); + + bp->netq_state |= BNX2_NETQ_HW_STARTED; + wmb(); + + printk(KERN_INFO "%s: NetQueue hardware support is enabled\n", + bp->dev->name); + + return 0; +} + + + +static int +bnx2_netq_get_netqueue_features(vmknetddi_queueop_get_features_args_t *args) +{ + args->features = VMKNETDDI_QUEUEOPS_FEATURE_NONE; + args->features |= VMKNETDDI_QUEUEOPS_FEATURE_RXQUEUES; + args->features |= VMKNETDDI_QUEUEOPS_FEATURE_TXQUEUES; + return VMKNETDDI_QUEUEOPS_OK; +} + +static int +bnx2_netq_get_queue_count(vmknetddi_queueop_get_queue_count_args_t *args) +{ + struct bnx2 *bp = netdev_priv(args->netdev); + + /* workaround for packets duplicated */ + if (bp->num_tx_rings + bp->num_rx_rings > 1) + bp->netq_enabled = 1; + + if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { + args->count = max_t(u16, bp->num_rx_rings - 1, 0); + + printk(KERN_INFO "%s: Using %d RX NetQ rings\n", + args->netdev->name, args->count); + + return VMKNETDDI_QUEUEOPS_OK; + } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { + args->count = max_t(u16, bp->num_tx_rings - 1, 0); + + printk(KERN_INFO "%s: Using %d TX NetQ rings\n", + args->netdev->name, args->count); + + return VMKNETDDI_QUEUEOPS_OK; + } else { + printk(KERN_ERR "%s: Counting queue: invalid queue type\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_get_filter_count(vmknetddi_queueop_get_filter_count_args_t *args) +{ + /* Only support 1 Mac filter per queue */ + args->count = 1; + return VMKNETDDI_QUEUEOPS_OK; +} + +static int +bnx2_netq_alloc_rx_queue(struct bnx2 *bp, + struct bnx2_napi *bnapi, + int queue_id) +{ + /* We need to count the default ring as part of the number of RX rings + avaliable */ + if (bp->n_rx_queues_allocated >= (bp->num_rx_rings - 1)) + return VMKNETDDI_QUEUEOPS_ERR; + + if((bp->netq_state & BNX2_NETQ_HW_STARTED) != BNX2_NETQ_HW_STARTED) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (!bnapi->rx_queue_allocated) { + int rc; + struct l2_kwqe_vm_alloc_rx_queue kwqe_alloc_rx; + + /* Ensure that the NetQueue is freed */ + rc = bnx2_netq_free_rx_queue_update(bp->dev, queue_id, 1); + if(rc == VMKNETDDI_QUEUEOPS_ERR) { + printk(KERN_ERR "%s: Couldn't clean/free RX " + "queue during RX alloc\n", + bp->dev->name); + + return VMKNETDDI_QUEUEOPS_ERR; + } + + /* Prepare the kwqe to be passed to the firmware */ + memset(&kwqe_alloc_rx, 0, sizeof(kwqe_alloc_rx)); + + kwqe_alloc_rx.kwqe_flags = KWQE_FLAGS_LAYER_MASK_L2; + kwqe_alloc_rx.kwqe_opcode = L2_KWQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE; + kwqe_alloc_rx.queue_type = L2_NET_QUEUE; + kwqe_alloc_rx.qid = queue_id; + + rc = bnx2_netqueue_submit_kwqes(bp, + (struct l2_kwqe *)&kwqe_alloc_rx); + if (rc != 0) { + printk(KERN_ERR "%s: Couldn't submit alloc rx kwqe\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bp->netq_flags = 0; + wmb(); + rc = wait_event_timeout(bp->netq_wait, + (bp->netq_flags & + L2_KCQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE), + BNX2_NETQ_WAIT_EVENT_TIMEOUT); + + if (rc != 0) { + bnapi->rx_queue_allocated = TRUE; + + printk(KERN_INFO "%s: RX NetQ allocated on %d\n", + bp->dev->name, kwqe_alloc_rx.qid); + return VMKNETDDI_QUEUEOPS_OK; + } else { + printk(KERN_INFO "%s: Timeout RX NetQ allocate on %d\n", + bp->dev->name, kwqe_alloc_rx.qid); + + return VMKNETDDI_QUEUEOPS_ERR; + } + } + + printk(KERN_ERR "%s: No RX NetQueues already allocated!\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; +} + +static int +bnx2_netq_alloc_rx_queue_vmk(struct net_device *netdev, + vmknetddi_queueops_queueid_t *p_qid, + struct napi_struct **napi_p) +{ + int i; + struct bnx2 *bp = netdev_priv(netdev); + + /* We need to count the default ring as part of the number of RX rings + avaliable */ + if (bp->n_rx_queues_allocated >= (bp->num_rx_rings - 1)) + return VMKNETDDI_QUEUEOPS_ERR; + + for_each_nondefault_rx_queue(bp, i) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + if (!bnapi->rx_queue_allocated) { + int queue_id = i - 1; + int rc; + + rc = bnx2_netq_alloc_rx_queue(bp, bnapi, queue_id); + + if (rc == VMKNETDDI_QUEUEOPS_OK) { + bp->n_rx_queues_allocated++; + *p_qid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(queue_id); + *napi_p = &bnapi->napi; + + return VMKNETDDI_QUEUEOPS_OK; + } else + return VMKNETDDI_QUEUEOPS_ERR; + } + } + + printk(KERN_ERR "%s: No free RX NetQueues found!\n", bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; +} + + +static int +bnx2_netq_alloc_tx_queue(struct bnx2 *bp, + struct bnx2_napi *bnapi, + int queue_id) +{ + if (bp->n_tx_queues_allocated >= (bp->num_tx_rings - 1)) + return VMKNETDDI_QUEUEOPS_ERR; + + if (!bnapi->tx_queue_allocated) { + bnapi->tx_queue_allocated = TRUE; + bp->n_tx_queues_allocated++; + + printk(KERN_INFO "%s: TX NetQ allocated on %d\n", + bp->dev->name, queue_id); + return VMKNETDDI_QUEUEOPS_OK; + } + printk(KERN_ERR "%s: tx queue already allocated!\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; +} + +static int +bnx2_netq_alloc_tx_queue_vmk(struct net_device *netdev, + vmknetddi_queueops_queueid_t *p_qid, + u16 *queue_mapping) +{ + int i; + struct bnx2 *bp = netdev_priv(netdev); + + if (bp->n_tx_queues_allocated >= (bp->num_tx_rings - 1)) + return VMKNETDDI_QUEUEOPS_ERR; + + for_each_nondefault_tx_queue(bp, i) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + if (!bnapi->tx_queue_allocated) { + int rc = bnx2_netq_alloc_tx_queue(bp, bnapi, i); + + *p_qid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(i); + *queue_mapping = i; + + return rc; + } + } + + printk(KERN_ERR "%s: no free tx queues found!\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; +} + +static int +bnx2_netq_alloc_queue(vmknetddi_queueop_alloc_queue_args_t *args) +{ + struct net_device *netdev = args->netdev; + struct bnx2 *bp = netdev_priv(netdev); + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to alloc NetQueue on failed reset " + "device\n", + netdev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { + return bnx2_netq_alloc_tx_queue_vmk(args->netdev, + &args->queueid, + &args->queue_mapping); + } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { + return bnx2_netq_alloc_rx_queue_vmk(args->netdev, + &args->queueid, + &args->napi); + } else { + printk(KERN_ERR "%s: Trying to alloc invalid queue type: %x\n", + bp->dev->name, args->type); + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_free_tx_queue(struct net_device *netdev, + vmknetddi_queueops_queueid_t qid) +{ + struct bnx2 *bp = netdev_priv(netdev); + struct bnx2_napi *bnapi; + + u16 index = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid); + if (index > bp->num_tx_rings) + return VMKNETDDI_QUEUEOPS_ERR; + + bnapi = &bp->bnx2_napi[index]; + if (bnapi->tx_queue_allocated != TRUE) + return VMKNETDDI_QUEUEOPS_ERR; + + bnapi->tx_queue_allocated = FALSE; + bp->n_tx_queues_allocated--; + + printk(KERN_INFO "%s: Free NetQ TX Queue: %x\n", + bp->dev->name, index); + + return VMKNETDDI_QUEUEOPS_OK; +} + +static int +bnx2_netq_free_rx_queue_update(struct net_device *netdev, + int index, + int force) +{ + int rc; + struct bnx2 *bp = netdev_priv(netdev); + struct bnx2_napi *bnapi; + struct l2_kwqe_vm_free_rx_queue kwqe_free_rx; + + if (index > bp->num_rx_rings) { + printk(KERN_INFO "%s: Error Free NetQ RX Queue: " + "index(%d) > bp->num_rx_rings(%d)\n", + bp->dev->name, index, bp->num_rx_rings); + + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bnapi = &bp->bnx2_napi[index]; + if ((bnapi->rx_queue_allocated != TRUE) && (force == 0)) { + printk(KERN_INFO "%s: Error Free NetQ RX Queue %d " + "already freed\n", + bp->dev->name, index); + + return VMKNETDDI_QUEUEOPS_OK; + } + + memset(&kwqe_free_rx, 0, sizeof(kwqe_free_rx)); + + kwqe_free_rx.flags = KWQE_FLAGS_LAYER_MASK_L2; + kwqe_free_rx.opcode = L2_KWQE_OPCODE_VALUE_VM_FREE_RX_QUEUE; + kwqe_free_rx.qid = index; + + rc = bnx2_netqueue_submit_kwqes(bp, + (struct l2_kwqe *) &kwqe_free_rx); + if (rc != 0) { + printk(KERN_ERR "%s: Couldn't submit free rx kwqe\n", + bp->dev->name); + + return VMKNETDDI_QUEUEOPS_ERR; + } + + bp->netq_flags = 0; + wmb(); + rc = wait_event_timeout(bp->netq_wait, + (bp->netq_flags & + L2_KCQE_OPCODE_VALUE_VM_FREE_RX_QUEUE), + BNX2_NETQ_WAIT_EVENT_TIMEOUT); + if (rc != 0) { + bnapi->rx_queue_allocated = FALSE; + + if(force != 1) + bp->n_rx_queues_allocated--; + + printk(KERN_INFO "%s: Free NetQ RX Queue (forced: %d): %x\n", + bp->dev->name, force, index); + + return VMKNETDDI_QUEUEOPS_OK; + } else { + printk(KERN_INFO "%s: Timeout free NetQ RX Queue " + "(force: %d): %x\n", + bp->dev->name, force, index); + + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_free_rx_queue(struct net_device *netdev, + vmknetddi_queueops_queueid_t qid) +{ + return bnx2_netq_free_rx_queue_update(netdev, + VMKNETDDI_QUEUEOPS_QUEUEID_VAL(qid), 0); +} + +static int +bnx2_netq_free_queue(vmknetddi_queueop_free_queue_args_t *args) +{ + struct bnx2 *bp = netdev_priv(args->netdev); + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to free NetQueue on failed reset " + "device\n", + args->netdev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (VMKNETDDI_QUEUEOPS_IS_TX_QUEUEID(args->queueid)) { + return bnx2_netq_free_tx_queue(args->netdev, args->queueid); + } else if (VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) { + return bnx2_netq_free_rx_queue(args->netdev, args->queueid); + } else { + printk(KERN_ERR "%s: free netq: invalid queue type\n", + args->netdev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_get_queue_vector(vmknetddi_queueop_get_queue_vector_args_t *args) +{ + int qid; + struct bnx2 *bp = netdev_priv(args->netdev); + qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); + if (qid > bp->num_rx_rings) + return VMKNETDDI_QUEUEOPS_ERR; + +#ifdef CONFIG_PCI_MSI + args->vector = bp->bnx2_napi[qid].int_num; +#endif + return VMKNETDDI_QUEUEOPS_OK; +} + +static int +bnx2_netq_get_default_queue(vmknetddi_queueop_get_default_queue_args_t *args) +{ + struct bnx2 *bp = netdev_priv(args->netdev); + + if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_RX) { + args->queueid = VMKNETDDI_QUEUEOPS_MK_RX_QUEUEID(0); + args->napi = &bp->bnx2_napi[0].napi; + return VMKNETDDI_QUEUEOPS_OK; + } else if (args->type == VMKNETDDI_QUEUEOPS_QUEUE_TYPE_TX) { + args->queueid = VMKNETDDI_QUEUEOPS_MK_TX_QUEUEID(0); + args->queue_mapping = 0; + return VMKNETDDI_QUEUEOPS_OK; + } else + return VMKNETDDI_QUEUEOPS_ERR; +} + +static int +bnx2_netq_remove_rx_filter(struct bnx2 *bp, int qid) +{ + u16 fw_qid = qid; + struct bnx2_napi *bnapi; + struct l2_kwqe_vm_remove_rx_filter kwqe_remove_rx_filter; + int rc; + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to remove RX filter NetQueue on " + "failed reset device\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bnapi = &bp->bnx2_napi[qid + 1]; + + if (qid > bp->num_rx_rings) { + printk(KERN_INFO "%s: Free RX Filter NetQ: failed " + "qid(%d) > bp->num_rx_rings(%d)\n", + bp->dev->name, qid, bp->num_rx_rings); + return VMKNETDDI_QUEUEOPS_ERR; + } + + memset(&kwqe_remove_rx_filter, 0, sizeof(kwqe_remove_rx_filter)); + + kwqe_remove_rx_filter.flags = KWQE_FLAGS_LAYER_MASK_L2; + kwqe_remove_rx_filter.opcode = L2_KWQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER; + kwqe_remove_rx_filter.filter_type = L2_VM_FILTER_MAC; + kwqe_remove_rx_filter.qid = fw_qid; + + rc = bnx2_netqueue_submit_kwqes(bp, + (struct l2_kwqe *) &kwqe_remove_rx_filter); + if (rc != 0) { + printk(KERN_ERR "Couldn't submit rx filter kwqe\n"); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bp->netq_flags = 0; + wmb(); + rc = wait_event_timeout(bp->netq_wait, + (bp->netq_flags & + L2_KCQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER), + BNX2_NETQ_WAIT_EVENT_TIMEOUT); + if (rc != 0) { + bnapi->rx_queue_active = FALSE; + bnapi->netq_state &= ~BNX2_NETQ_RX_FILTER_APPLIED; + + printk(KERN_INFO "%s: NetQ remove RX filter: %d\n", + bp->dev->name, qid); + + return VMKNETDDI_QUEUEOPS_OK; + } else { + printk(KERN_INFO "%s: Timeout NetQ remove RX filter: %d\n", + bp->dev->name, qid); + + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_remove_rx_filter_vmk(vmknetddi_queueop_remove_rx_filter_args_t *args) +{ + struct bnx2 *bp = netdev_priv(args->netdev); + u16 qid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); + struct bnx2_napi *bnapi; + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to remove RX filter NetQueue on " + "failed reset device\n", + args->netdev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bnapi = &bp->bnx2_napi[qid + 1]; + + if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) { + printk(KERN_INFO "%s: !VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID: " + "qid: %d)\n", + bp->dev->name, qid); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (qid > bp->num_rx_rings) { + printk(KERN_INFO "%s: qid(%d) > bp->num_rx_rings(%d)\n", + bp->dev->name, qid, bp->num_rx_rings); + return VMKNETDDI_QUEUEOPS_ERR; + } + + /* Only support one Mac filter per queue */ + if (bnapi->rx_queue_active == 0) { + printk(KERN_INFO "%s: bnapi->rx_queue_active(%d) == 0\n", + bp->dev->name, bnapi->rx_queue_active); + return VMKNETDDI_QUEUEOPS_ERR; + } + + return bnx2_netq_remove_rx_filter(bp, qid); +} + + +static int +bnx2_netq_apply_rx_filter(struct bnx2 *bp, struct bnx2_napi *bnapi, + int queueid) +{ + u16 fw_queueid = queueid; + struct l2_kwqe_vm_set_rx_filter kwqe_set_rx_filter; + int rc; + DECLARE_MAC_BUF(mac); + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to apply RX filter NetQueue on " + "failed reset device\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (bnapi->rx_queue_active == TRUE || !bnapi->rx_queue_allocated) { + printk(KERN_ERR "%s: apply filter: RX NetQ %d already active" + "bnapi->rx_queue_active(%d) || " + "!bnapi->rx_queue_allocated(%d)\n", + bp->dev->name, queueid, bnapi->rx_queue_active, + bnapi->rx_queue_allocated); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bnx2_set_mac_addr(bp, bnapi->mac_filter_addr, + fw_queueid + QID_TO_PM_OFFSET); + + + memset(&kwqe_set_rx_filter, 0, sizeof(&kwqe_set_rx_filter)); + + kwqe_set_rx_filter.flags = KWQE_FLAGS_LAYER_MASK_L2; + kwqe_set_rx_filter.opcode = L2_KWQE_OPCODE_VALUE_VM_SET_RX_FILTER; + +#if defined(__LITTLE_ENDIAN) + memcpy(&kwqe_set_rx_filter.mac_addr_hi, bnapi->mac_filter_addr, 2); + memcpy(&kwqe_set_rx_filter.mac_addr_lo, bnapi->mac_filter_addr + 2, 4); +#else + memcpy(&kwqe_set_rx_filter.mac_addr, bnapi->mac_filter_addr, 6); +#endif + + if (bnapi->class == VMKNETDDI_QUEUEOPS_FILTER_MACADDR) { + kwqe_set_rx_filter.filter_type = L2_VM_FILTER_MAC; + } else { + kwqe_set_rx_filter.filter_type = L2_VM_FILTER_MAC_VLAN; + kwqe_set_rx_filter.vlan = bnapi->vlan_id; + } + kwqe_set_rx_filter.qid = fw_queueid; + + rc = bnx2_netqueue_submit_kwqes(bp, + (struct l2_kwqe *) &kwqe_set_rx_filter); + if (rc != 0) { + printk(KERN_ERR "Couldn't submit rx filter kwqe\n"); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bp->netq_flags = 0; + wmb(); + rc = wait_event_timeout(bp->netq_wait, + (bp->netq_flags & + L2_KCQE_OPCODE_VALUE_VM_SET_RX_FILTER), + BNX2_NETQ_WAIT_EVENT_TIMEOUT); + + if (rc != 0) { + bnapi->rx_queue_active = TRUE; + bnapi->netq_state |= BNX2_NETQ_RX_FILTER_APPLIED; + + printk(KERN_INFO "%s: NetQ set RX Filter: %d [%s %d]\n", + bp->dev->name, + queueid, print_mac(mac, bnapi->mac_filter_addr), + bnapi->vlan_id); + + return VMKNETDDI_QUEUEOPS_OK; + } else { + printk(KERN_INFO "%s: Timeout submitting NetQ set RX Filter: %d [%s]\n", + bp->dev->name, queueid, + print_mac(mac, bnapi->mac_filter_addr)); + + return VMKNETDDI_QUEUEOPS_ERR; + } +} + +static int +bnx2_netq_apply_rx_filter_vmk(vmknetddi_queueop_apply_rx_filter_args_t *args) +{ + u8 *macaddr; + struct bnx2_napi *bnapi; + struct bnx2 *bp = netdev_priv(args->netdev); + u16 queueid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); + vmknetddi_queueops_filter_class_t class; + DECLARE_MAC_BUF(mac); + + if(bp->reset_failed == 1) { + printk(KERN_ERR "%s: Trying to apply RX filter NetQueue on " + "failed reset device\n", + args->netdev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if(bnx2_netqueue_open_started(bp)) { + printk(KERN_INFO "%s: NetQueue hardware not running yet\n", + bp->dev->name); + return VMKNETDDI_QUEUEOPS_ERR; + } + + if (!VMKNETDDI_QUEUEOPS_IS_RX_QUEUEID(args->queueid)) { + printk(KERN_ERR "%s: invalid NetQ RX ID: %x\n", + args->netdev->name, args->queueid); + return VMKNETDDI_QUEUEOPS_ERR; + } + + class = vmknetddi_queueops_get_filter_class(&args->filter); + if ((class != VMKNETDDI_QUEUEOPS_FILTER_MACADDR) && + (class != VMKNETDDI_QUEUEOPS_FILTER_VLANMACADDR)) { + printk(KERN_ERR "%s: recieved invalid RX NetQ filter: %x\n", + args->netdev->name, class); + return VMKNETDDI_QUEUEOPS_ERR; + } + if (queueid > bp->num_rx_rings) { + printk(KERN_ERR "%s: applying filter with invalid RX NetQ %d ID\n", + args->netdev->name, queueid); + return VMKNETDDI_QUEUEOPS_ERR; + } + + bnapi = &bp->bnx2_napi[queueid + 1]; + + if (bnapi->rx_queue_active || !bnapi->rx_queue_allocated) { + printk(KERN_ERR "%s: RX NetQ %d already active\n", + args->netdev->name, queueid); + return VMKNETDDI_QUEUEOPS_ERR; + } + + macaddr = (void *)vmknetddi_queueops_get_filter_macaddr(&args->filter); + memcpy(bnapi->mac_filter_addr, macaddr, ETH_ALEN); + bnapi->vlan_id = vmknetddi_queueops_get_filter_vlanid(&args->filter); + bnapi->class = class; + + /* Apply RX filter code here */ + args->filterid = VMKNETDDI_QUEUEOPS_MK_FILTERID(queueid); + + return bnx2_netq_apply_rx_filter(bp, bnapi, queueid); +} + +static int +bnx2_netq_get_queue_stats(vmknetddi_queueop_get_stats_args_t *args) +{ + u16 queueid = VMKNETDDI_QUEUEOPS_QUEUEID_VAL(args->queueid); + struct bnx2_napi *bnapi; + struct bnx2 *bp = netdev_priv(args->netdev); + + bnapi = &bp->bnx2_napi[queueid]; + + args->stats = &bnapi->stats; + + return VMKNETDDI_QUEUEOPS_OK; +} + +static int +bnx2_netq_get_netqueue_version(vmknetddi_queueop_get_version_args_t *args) +{ + return vmknetddi_queueops_version(args); +} + +static void +bnx2_netqueue_flush_all(struct bnx2 *bp) +{ + int i; + u16 num_tx = 0, num_rx = 0; + + printk(KERN_INFO PFX "%s: Flushing NetQueues\n", bp->dev->name); + + for_each_nondefault_rx_queue(bp, i) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + + if(bnapi->netq_state & BNX2_NETQ_RX_FILTER_APPLIED) { + int rc = bnx2_netq_remove_rx_filter(bp, i); + if (rc == VMKNETDDI_QUEUEOPS_ERR) { + printk(KERN_ERR PFX "%s: could not remove RX " + "filter during flush\n", + bp->dev->name); + } + + if(bnapi->rx_queue_allocated == TRUE) { + rc = bnx2_netq_free_rx_queue_update(bp->dev, + i, 1); + if (rc == VMKNETDDI_QUEUEOPS_OK) { + num_rx++; + } else { + printk(KERN_ERR PFX "%s: could " + "not free RX " + "queue during flush\n", + bp->dev->name); + } + } + } + } + + for_each_nondefault_tx_queue(bp, i) { + struct bnx2_napi *bnapi = &bp->bnx2_napi[i]; + + if(bnapi->tx_queue_allocated == TRUE) { + bnx2_netq_free_tx_queue(bp->dev, i); + } + + num_tx++; + } + + printk(KERN_ERR PFX "%s: finished saving NetQueues: rx: %d tx: %d\n", + bp->dev->name, num_rx, num_tx); +} + + +static int +bnx2_netqueue_ops(vmknetddi_queueops_op_t op, void *args) +{ + int rc; + struct bnx2 *bp; + + if (op == VMKNETDDI_QUEUEOPS_OP_GET_VERSION) + return bnx2_netq_get_netqueue_version( + (vmknetddi_queueop_get_version_args_t *)args); + + bp = netdev_priv(((vmknetddi_queueop_get_features_args_t *)args)->netdev); + + if (!bnx2_netqueue_is_avail(bp)) + return VMKNETDDI_QUEUEOPS_ERR; + + mutex_lock(&bp->reset_lock); + + switch (op) { + case VMKNETDDI_QUEUEOPS_OP_GET_FEATURES: + rc = bnx2_netq_get_netqueue_features( + (vmknetddi_queueop_get_features_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_COUNT: + rc = bnx2_netq_get_queue_count( + (vmknetddi_queueop_get_queue_count_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_GET_FILTER_COUNT: + rc = bnx2_netq_get_filter_count( + (vmknetddi_queueop_get_filter_count_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_ALLOC_QUEUE: + rc = bnx2_netq_alloc_queue( + (vmknetddi_queueop_alloc_queue_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_FREE_QUEUE: + rc = bnx2_netq_free_queue( + (vmknetddi_queueop_free_queue_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_GET_QUEUE_VECTOR: + rc = bnx2_netq_get_queue_vector( + (vmknetddi_queueop_get_queue_vector_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_GET_DEFAULT_QUEUE: + rc = bnx2_netq_get_default_queue( + (vmknetddi_queueop_get_default_queue_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_APPLY_RX_FILTER: + rc = bnx2_netq_apply_rx_filter_vmk( + (vmknetddi_queueop_apply_rx_filter_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_REMOVE_RX_FILTER: + rc = bnx2_netq_remove_rx_filter_vmk( + (vmknetddi_queueop_remove_rx_filter_args_t *)args); + break; + + case VMKNETDDI_QUEUEOPS_OP_GET_STATS: + rc = bnx2_netq_get_queue_stats( + (vmknetddi_queueop_get_stats_args_t *)args); + break; + + /* Unsupported for now */ + case VMKNETDDI_QUEUEOPS_OP_SET_TX_PRIORITY: + rc = VMKNETDDI_QUEUEOPS_ERR; + break; + + default: + printk(KERN_WARNING "Unhandled NETQUEUE OP %d\n", op); + rc = VMKNETDDI_QUEUEOPS_ERR; + } + mutex_unlock(&bp->reset_lock); + + return rc; +} +#endif /* defined(BNX2_ENABLE_NETQUEUE) */ + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2.h new file mode 100644 index 0000000..e0aba1e --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2.h @@ -0,0 +1,8348 @@ +/* bnx2.h: Broadcom NX2 network driver. + * + * Copyright (c) 2004-2009 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * Written by: Michael Chan (mchan@broadcom.com) + */ + + +#ifndef BNX2_H +#define BNX2_H + +#if (LINUX_VERSION_CODE >= 0x020610) +#define BCM_CNIC 1 +#endif + +#if defined(__VMKLNX__) && (VMWARE_ESX_DDK_VERSION >= 41000) +#define VMWARE_ISCSI +#endif + +#if defined(__VMKLNX__) +#define HAVE_LE32 1 +#define HAVE_IP_HDR 1 +#define NEW_SKB 1 +#define BNX2_NEW_NAPI 1 +#endif + +#ifndef ADVERTISE_1000XFULL +#define ADVERTISE_1000XFULL 0x0020 +#define ADVERTISE_1000XHALF 0x0040 +#define ADVERTISE_1000XPAUSE 0x0080 +#define ADVERTISE_1000XPSE_ASYM 0x0100 +#endif + +#ifndef ADVERTISE_PAUSE_CAP +#define ADVERTISE_PAUSE_CAP 0x0400 +#define ADVERTISE_PAUSE_ASYM 0x0800 +#endif + +#ifndef MII_CTRL1000 +#define MII_CTRL1000 0x9 +#define MII_STAT1000 0xa +#endif + +#ifndef BMCR_SPEED1000 +#define BMCR_SPEED1000 0x0040 +#endif + +#ifndef ADVERTISE_1000FULL +#define ADVERTISE_1000FULL 0x0200 +#define ADVERTISE_1000HALF 0x0100 +#endif + +#ifndef SPEED_2500 +#define SPEED_2500 2500 +#endif + +#ifndef SUPPORTED_2500baseX_Full +#define SUPPORTED_2500baseX_Full (1 << 15) +#define ADVERTISED_2500baseX_Full (1 << 15) +#endif + +#ifndef ETH_FCS_LEN +#define ETH_FCS_LEN 4 +#endif + +#ifndef PCI_DEVICE_ID_NX2_5706 +#define PCI_DEVICE_ID_NX2_5706 0x164a +#define PCI_DEVICE_ID_NX2_5706S 0x16aa +#endif + +#ifndef PCI_DEVICE_ID_NX2_5708 +#define PCI_DEVICE_ID_NX2_5708 0x164c +#define PCI_DEVICE_ID_NX2_5708S 0x16ac +#endif + +#ifndef PCI_DEVICE_ID_NX2_5709 +#define PCI_DEVICE_ID_NX2_5709 0x1639 +#endif + +#ifndef PCI_DEVICE_ID_NX2_5709S +#define PCI_DEVICE_ID_NX2_5709S 0x163a +#endif + +#ifndef PCI_DEVICE_ID_AMD_8132_BRIDGE +#define PCI_DEVICE_ID_AMD_8132_BRIDGE 0x7458 +#endif + +#ifndef IRQ_RETVAL +typedef void irqreturn_t; +#define IRQ_RETVAL(x) +#define IRQ_HANDLED +#define IRQ_NONE +#endif + +#ifndef IRQF_SHARED +#define IRQF_SHARED SA_SHIRQ +#endif + +#ifndef NETDEV_TX_OK +#define NETDEV_TX_OK 0 +#endif + +#ifndef NETDEV_TX_BUSY +#define NETDEV_TX_BUSY 1 +#endif + +#if (LINUX_VERSION_CODE < 0x020547) +#define pci_set_consistent_dma_mask(pdev, mask) (0) +#endif + +#ifndef PCI_CAP_ID_EXP +#define PCI_CAP_ID_EXP 0x10 +#endif + +#ifndef DEFINE_PCI_DEVICE_TABLE +#define DEFINE_PCI_DEVICE_TABLE(_table) \ + struct pci_device_id _table[] +#endif + +#if (LINUX_VERSION_CODE < 0x020604) +#define MODULE_VERSION(version) +#endif + +#ifndef SET_MODULE_OWNER +#define SET_MODULE_OWNER(dev) do { } while (0) +#endif + +#ifndef CHECKSUM_PARTIAL +#define CHECKSUM_PARTIAL CHECKSUM_HW +#endif + +#ifndef DMA_BIT_MASK +#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) +#endif + +#ifndef mmiowb +#define mmiowb() +#endif + +#if !defined(__iomem) +#define __iomem +#endif + +#if !defined(__rcquires) +#define __acquires(x) +#define __releases(x) +#endif + +#ifndef HAVE_LE32 +typedef u32 __le32; +typedef u32 __be32; +#endif + +#ifndef USEC_PER_SEC +#define USEC_PER_SEC 1000000L +#endif + +#ifndef __maybe_unused +#define __maybe_unused +#endif + +#if (LINUX_VERSION_CODE < 0x2060b) +typedef u32 pm_message_t; +typedef u32 pci_power_t; +#define PCI_D0 0 +#define PCI_D3hot 3 +#endif + +#if (LINUX_VERSION_CODE < 0x020605) +#define pci_dma_sync_single_for_cpu(pdev, map, len, dir) \ + pci_dma_sync_single(pdev, map, len, dir) + +#define pci_dma_sync_single_for_device(pdev, map, len, dir) +#endif + +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) + +#define QID_TO_PM_OFFSET 4 + +/* u32 fw_doorbell_ready */ +#define KWQ_READY (1<<0) +#define KWQ1_READY (1<<1) +#define KWQ2_READY (1<<2) +#define KWQ3_READY (1<<3) + +#define KCQ_READY (1<<0) +#define KCQ1_READY (1<<1) +#define KCQ2_READY (1<<2) +#define KCQ3_READY (1<<3) + +typedef u16 l2_kcqe_errors_t; + #define L2_KCQE_ERRORS_BAD_CRC (1<<1) + #define L2_KCQE_ERRORS_PHY_DECODE (1<<2) + #define L2_KCQE_ERRORS_ALIGNMENT (1<<3) + #define L2_KCQE_ERRORS_TOO_SHORT (1<<4) + #define L2_KCQE_ERRORS_GIANT_FRAME (1<<5) + +typedef u16 l2_kcqe_status_t; + #define L2_KCQE_STATUS_RULE_CLASS (0x7<<0) + #define L2_KCQE_STATUS_RULE_P2 (1<<3) + #define L2_KCQE_STATUS_RULE_P3 (1<<4) + #define L2_KCQE_STATUS_RULE_P4 (1<<5) + #define L2_KCQE_STATUS_L2_VLAN_TAG (1<<6) + #define L2_KCQE_STATUS_L2_LLC_SNAP (1<<7) + #define L2_KCQE_STATUS_L2_HASH (0x1f<<8) + #define L2_KCQE_STATUS_IP_DATAGRAM (1<<13) + #define L2_KCQE_STATUS_TCP_SEGMENT (1<<14) + #define L2_KCQE_STATUS_UDP_DATAGRAM (1<<15) + +typedef u8 l2_kcqe_opcode_t; + #define L2_KCQE_OPCODE_VALUE (0xff<<0) + #define L2_KCQE_OPCODE_VALUE_RX_PACKET (0<<0) + #define L2_KCQE_OPCODE_VALUE_ENABLE_RSS (1<<0) + #define L2_KCQE_OPCODE_VALUE_DISABLE_RSS (2<<0) + #define L2_KCQE_OPCODE_VALUE_UPDATE_RSS (3<<0) + #define L2_KCQE_OPCODE_VALUE_FLUSH_BD_CHAIN (4<<0) + #define L2_KCQE_OPCODE_VALUE_DEBUG (5<<0) + #define L2_KCQE_OPCODE_VALUE_VM_ALLOC_TX_QUEUE (6<<0) + #define L2_KCQE_OPCODE_VALUE_VM_FREE_TX_QUEUE (7<<0) + #define L2_KCQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE (8<<0) + #define L2_KCQE_OPCODE_VALUE_VM_FREE_RX_QUEUE (9<<0) + #define L2_KCQE_OPCODE_VALUE_VM_SET_RX_FILTER (10<<0) + #define L2_KCQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER (11<<0) + +typedef u8 l2_kcqe_flags_t; + #define L2_KCQE_FLAGS_LAYER_MASK (0x7<<4) + #define L2_KCQE_FLAGS_LAYER_MASK_MISC (0<<4) + #define L2_KCQE_FLAGS_LAYER_MASK_L2 (2<<4) + #define L2_KCQE_FLAGS_LAYER_MASK_L3 (3<<4) + #define L2_KCQE_FLAGS_LAYER_MASK_L4 (4<<4) + #define L2_KCQE_FLAGS_LAYER_MASK_L5 (5<<4) + #define L2_KCQE_FLAGS_NEXT (1<<7) + +/* + * l2_kcqe_l definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kcqe { + u8 qid; + u8 status; + u16 reserved; + u32 reserved1[6]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kcqe { + u8 qid; + u8 status; + u16 reserved; + u32 reserved1[6]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_alloc_tx_queue definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_alloc_tx_queue { + u8 qid; + u8 status; + u16 reserved; + u32 reserved1[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_alloc_tx_queue { + u16 reserved; + u8 status; + u8 qid; + u32 reserved1[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_free_tx_queue definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_free_tx_queue { + u8 qid; + u8 status; + u16 nx_bidx; + u32 reserved1[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_free_tx_queue { + u16 nx_bidx; + u8 status; + u8 qid; + u32 reserved1[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_alloc_rx_queue definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_alloc_rx_queue_b { + u8 qid; + u8 status; + u16 reserved; + u32 reserved1[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_alloc_rx_queue_l { + u16 reserved; + u8 status; + u8 qid; + u32 reserved1[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_free_rx_queue definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_free_rx_queue { + u8 qid; + u8 status; + u16 nx_bidx; + u32 reserved1[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_free_rx_queue { + u16 nx_bidx; + u8 status; + u8 qid; + u32 reserved1[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_set_rx_filter definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_set_rx_filter { + u8 qid; + u8 status; + u16 reserved1; + u32 reserved2[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_set_rx_filter { + u16 reserved1; + u8 status; + u8 qid; + u32 reserved2[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * l2_kcqe_vm_remove_rx_filter definition + */ +#if defined(BIG_ENDIAN) +struct l2_kcqe_vm_remove_rx_filter { + u8 qid; + u8 status; + u16 reserved1; + u32 reserved2[5]; + + l2_kcqe_flags_t flags; + l2_kcqe_opcode_t opcode; + u16 qe_self_seq; +}; +#elif defined(LITTLE_ENDIAN) +struct l2_kcqe_vm_remove_rx_filter { + u16 reserved1; + u8 status; + u8 qid; + u32 reserved2[5]; + + u16 qe_self_seq; + l2_kcqe_opcode_t opcode; + l2_kcqe_flags_t flags; +}; +#endif + +/* + * kwqe definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe { + u8 kwqe_flags; + #define KWQE_FLAGS_LAYER_MASK (0x7<<4) + #define KWQE_FLAGS_LAYER_MASK_MISC (0<<4) + #define KWQE_FLAGS_LAYER_MASK_L2 (2<<4) + #define KWQE_FLAGS_LAYER_MASK_L3 (3<<4) + #define KWQE_FLAGS_LAYER_MASK_L4 (4<<4) + #define KWQE_FLAGS_LAYER_MASK_L5 (5<<4) + #define KWQE_FLAGS_NEXT (1<<7) + u8 kwqe_opcode; + u16 kwqe_info; + u32 kwqe_info0; + u32 kwqe_info1; + u32 kwqe_info2; + u32 kwqe_info3; + u32 kwqe_info4; + u32 kwqe_info5; + u32 kwqe_info6; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe { + u16 kwqe_info; + u8 kwqe_opcode; + u8 kwqe_flags; + #define KWQE_FLAGS_LAYER_MASK (0x7<<4) + #define KWQE_FLAGS_LAYER_MASK_MISC (0<<4) + #define KWQE_FLAGS_LAYER_MASK_L2 (2<<4) + #define KWQE_FLAGS_LAYER_MASK_L3 (3<<4) + #define KWQE_FLAGS_LAYER_MASK_L4 (4<<4) + #define KWQE_FLAGS_LAYER_MASK_L5 (5<<4) + #define KWQE_FLAGS_GET_DEBUG_TRACE (7<<4) + #define KWQE_FLAGS_NEXT (1<<7) + u32 kwqe_info0; + u32 kwqe_info1; + u32 kwqe_info2; + u32 kwqe_info3; + u32 kwqe_info4; + u32 kwqe_info5; + u32 kwqe_info6; +}; +#endif + +typedef u8 l2_kwqe_flags_t; + #define L2_KWQE_FLAGS_LAYER_MASK (0x7<<4) + #define L2_KWQE_FLAGS_LAYER_MASK_MISC (0<<4) + #define L2_KWQE_FLAGS_LAYER_MASK_L2 (2<<4) + #define L2_KWQE_FLAGS_LAYER_MASK_L3 (3<<4) + #define L2_KWQE_FLAGS_LAYER_MASK_L4 (4<<4) + #define L2_KWQE_FLAGS_LAYER_MASK_L5 (5<<4) + #define L2_KWQE_FLAGS_NEXT (1<<7) + +typedef u8 l2_kwqe_opcode_t; + #define L2_KWQE_OPCODE_VALUE (0xff<<0) + #define L2_KWQE_OPCODE_VALUE_NOP (0<<0) + #define L2_KWQE_OPCODE_VALUE_ENABLE_RSS (1<<0) + #define L2_KWQE_OPCODE_VALUE_DISABLE_RSS (2<<0) + #define L2_KWQE_OPCODE_VALUE_UPDATE_RSS (3<<0) + #define L2_KWQE_OPCODE_VALUE_FLUSH_BD_CHAIN (4<<0) + #define L2_KWQE_OPCODE_VALUE_VM_ALLOC_TX_QUEUE (5<<0) + #define L2_KWQE_OPCODE_VALUE_VM_FREE_TX_QUEUE (6<<0) + #define L2_KWQE_OPCODE_VALUE_VM_ALLOC_RX_QUEUE (7<<0) + #define L2_KWQE_OPCODE_VALUE_VM_FREE_RX_QUEUE (8<<0) + #define L2_KWQE_OPCODE_VALUE_VM_SET_RX_FILTER (9<<0) + #define L2_KWQE_OPCODE_VALUE_VM_REMOVE_RX_FILTER (10<<0) + +typedef u8 l2_kwqe_vm_filter_t; + #define L2_VM_FILTER_UNDEFINED 0 + #define L2_VM_FILTER_MAC 1 + #define L2_VM_FILTER_MAC_VLAN 2 + #define L2_VM_FILTER_VLAN 3 + +typedef u8 l2_kwqe_queue_t; + #define L2_NORMAL_QUEUE 0 + #define L2_NET_QUEUE 1 + #define L2_VM_QUEUE 2 + #define L2_VM_DROP_QUEUE 3 + +/* + * l2_kwqe_vm_alloc_tx_queue definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe_vm_alloc_tx_queue { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 queue_type; + u8 qid; + u32 reserved1[6]; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_alloc_tx_queue { + u8 qid; + u8 queue_type; + l2_kwqe_opcode_t opcode; + l2_kwqe_flags_t flags; + u32 reserved1[6]; +}; +#endif + +/* + * l2_kwqe_vm_free_tx_queue definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe_vm_free_tx_queue { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 qid; + u8 reserved; + u32 reserved1[6]; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_free_tx_queue { + u8 reserved; + u8 qid; + l2_kwqe_opcode_t opcode; + l2_kwqe_flags_t flags; + u32 reserved1[6]; +}; +#endif + +/* + * l2_kwqe_vm_alloc_rx_queue definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe_vm_alloc_rx_queue { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 queue_type; + u8 qid; + u32 reserved1[6]; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_alloc_rx_queue { + u8 qid; + u8 queue_type; + l2_kwqe_opcode_t kwqe_opcode; + l2_kwqe_flags_t kwqe_flags; + u32 reserved1[6]; +}; +#endif + +/* + * l2_kwqe_vm_free_rx_queue definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe_vm_free_rx_queue { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 qid; + u8 reserved; + u32 reserved1[6]; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_free_rx_queue { + u8 reserved; + u8 qid; + l2_kwqe_opcode_t opcode; + l2_kwqe_flags_t flags; + u32 reserved1[6]; +}; +#endif + +/* + * l2_kwqe_vm_set_rx_filter definition + */ +#if defined(__BIG_ENDIAN) +struct l2_kwqe_vm_set_rx_filter { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 qid; + l2_kwqe_vm_filter_t filter_type; + u16 vlan; + u8 mac_addr[6]; + u32 reserved1[4]; +} l2_kwqe_vm_set_rx_filter_b_t; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_set_rx_filter { + l2_kwqe_vm_filter_t filter_type; + u8 qid; + l2_kwqe_opcode_t opcode; + l2_kwqe_flags_t flags; + + u16 mac_addr_hi; + u16 vlan; + u32 mac_addr_lo; + u32 reserved1[4]; +}; +#endif + +/* + * l2_kwqe_vm_remove_rx_filter + */ +#if defined(BIG_ENDIAN) +struct l2_kwqe_vm_remove_rx_filter { + l2_kwqe_flags_t flags; + l2_kwqe_opcode_t opcode; + u8 qid; + l2_kwqe_vm_filter_t filter_type; + u32 reserved1[6]; +}; +#elif defined(__LITTLE_ENDIAN) +struct l2_kwqe_vm_remove_rx_filter { + l2_kwqe_vm_filter_t filter_type; + u8 qid; + l2_kwqe_opcode_t opcode; + l2_kwqe_flags_t flags; + u32 reserved1[6]; +}; +#endif +#endif + +#if (LINUX_VERSION_CODE < 0x020612) +static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, + unsigned int length) +{ + struct sk_buff *skb = dev_alloc_skb(length); + if (skb) + skb->dev = dev; + return skb; +} +#endif + +static inline void bnx2_skb_fill_page_desc(struct sk_buff *skb, int i, + struct page *page, int off, int size) +{ +#if (LINUX_VERSION_CODE < 0x020600) + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + + frag->page = page; + frag->page_offset = off; + frag->size = size; + skb_shinfo(skb)->nr_frags = i + 1; +#else + skb_fill_page_desc(skb, i, page, off, size); +#endif +} + +#ifndef NETIF_F_GSO +static inline void netif_tx_lock(struct net_device *dev) +{ + spin_lock(&dev->xmit_lock); + dev->xmit_lock_owner = smp_processor_id(); +} + +static inline void netif_tx_unlock(struct net_device *dev) +{ + dev->xmit_lock_owner = -1; + spin_unlock(&dev->xmit_lock); +} +#endif + +#if !defined(HAVE_NETDEV_PRIV) && (LINUX_VERSION_CODE != 0x020603) && (LINUX_VERSION_CODE != 0x020604) && (LINUX_VERSION_CODE != 0x20605) +static inline void *netdev_priv(struct net_device *dev) +{ + return dev->priv; +} +#endif + +#ifdef OLD_NETIF +static inline void netif_poll_disable(struct net_device *dev) +{ + while (test_and_set_bit(__LINK_STATE_RX_SCHED, &dev->state)) { + /* No hurry. */ + current->state = TASK_INTERRUPTIBLE; + schedule_timeout(1); + } +} + +static inline void netif_poll_enable(struct net_device *dev) +{ + clear_bit(__LINK_STATE_RX_SCHED, &dev->state); +} + +static inline void netif_tx_disable(struct net_device *dev) +{ + spin_lock_bh(&dev->xmit_lock); + netif_stop_queue(dev); + spin_unlock_bh(&dev->xmit_lock); +} + +#endif + +#if (LINUX_VERSION_CODE >= 0x20418) && (LINUX_VERSION_CODE < 0x2060c) +static inline int bnx2_set_tx_hw_csum(struct net_device *dev, u32 data) +{ + if (data) + dev->features |= NETIF_F_HW_CSUM; + else + dev->features &= ~NETIF_F_HW_CSUM; + + return 0; +} +#endif + +#ifndef VLAN_GROUP_ARRAY_SPLIT_PARTS +static inline void vlan_group_set_device(struct vlan_group *vg, int vlan_id, + struct net_device *dev) +{ + if (vg) + vg->vlan_devices[vlan_id] = dev; +} +#endif + +#ifdef NETIF_F_TSO +#ifndef NETIF_F_GSO +static inline int skb_is_gso(const struct sk_buff *skb) +{ + return skb_shinfo(skb)->tso_size; +} +#define gso_size tso_size +#define gso_segs tso_segs +#endif +#ifndef NETIF_F_TSO6 +#define NETIF_F_TSO6 0 +#define BCM_NO_TSO6 1 +#endif +#ifndef NETIF_F_TSO_ECN +#define NETIF_F_TSO_ECN 0 +#endif + +#ifndef HAVE_IP_HDR +static inline struct iphdr *ip_hdr(const struct sk_buff *skb) +{ + return skb->nh.iph; +} +#endif + +#ifndef NEW_SKB +static inline int skb_transport_offset(const struct sk_buff *skb) +{ + return (int) (skb->h.raw - skb->data); +} + +static inline unsigned int ip_hdrlen(const struct sk_buff *skb) +{ + return ip_hdr(skb)->ihl * 4; +} + +static inline struct tcphdr *tcp_hdr(const struct sk_buff *skb) +{ + return skb->h.th; +} + +static inline unsigned int tcp_optlen(const struct sk_buff *skb) +{ + return (tcp_hdr(skb)->doff - 5) * 4; +} + +#endif +#endif /* #ifdef NETIF_F_TSO */ + +#ifndef VMWARE_ESX_40_DDK +#if ((LINUX_VERSION_CODE >= 0x20617) && !defined(NETIF_F_MULTI_QUEUE)) || defined(__VMKLNX__) + +#define BCM_HAVE_MULTI_QUEUE + +#else + +static inline void netif_tx_wake_all_queues(struct net_device *dev) +{ + netif_wake_queue(dev); +} + +static inline void netif_tx_start_all_queues(struct net_device *dev) +{ + netif_start_queue(dev); +} + +#endif +#else +#define BCM_HAVE_MULTI_QUEUE +#endif + + +#ifndef NET_SKB_PAD +#define NET_SKB_PAD 16 +#endif + +#if (LINUX_VERSION_CODE < 0x02061e) +static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue) +{ +} +#endif + +#if (defined(HAVE_SET_RX_MODE) && (LINUX_VERSION_CODE >= 0x02061f)) +#define BCM_HAVE_SET_RX_MODE 1 +#endif + +#if (LINUX_VERSION_CODE < 0x020600) +#define dev_err(unused, format, arg...) \ + printk(KERN_ERR "bnx2: " format , ## arg) +#else +#ifndef dev_err +#ifndef dev_printk +#define dev_printk(level, dev, format, arg...) \ + printk(level "bnx2 %s: " format , (dev)->bus_id , ## arg) +#endif +#define dev_err(dev, format, arg...) \ + dev_printk(KERN_ERR , dev , format , ## arg) +#endif +#endif + +#ifndef DECLARE_MAC_BUF +#define DECLARE_MAC_BUF(var) char var[18] +#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x" +static inline char *print_mac(char *buf, const u8 *addr) +{ + sprintf(buf, MAC_FMT, + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); + return buf; +} +#endif + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + +#if (LINUX_VERSION_CODE >= 0x020618) +#define BNX2_NEW_NAPI 1 +#endif + +static inline void bnx2_msleep(unsigned int msecs) +{ +#if (LINUX_VERSION_CODE < 0x20607) + current->state = TASK_UNINTERRUPTIBLE; + schedule_timeout((msecs * HZ / 1000) + 1); +#else + msleep(msecs); +#endif +} + +static inline unsigned long bnx2_msleep_interruptible(unsigned int msecs) +{ +#if (LINUX_VERSION_CODE < 0x20609) + current->state = TASK_INTERRUPTIBLE; + return schedule_timeout((msecs * HZ / 1000) + 1); +#else + return msleep_interruptible(msecs); +#endif +} + +#if defined (__VMKLNX__) +/** + * THIS FUNCTION SHOULD BE REMOVED ONCE PR 379263 IS RESOLVED + */ +static void *bcm_memmove(void *dest, const void *src, size_t count) +{ + char *tmp; + const char *s; + + if (dest <= src) { + tmp = dest; + s = src; + while (count--) + *tmp++ = *s++; + } else { + tmp = dest; + tmp += count; + s = src; + s += count; + while (count--) + *--tmp = *--s; + } + return dest; +} +#else /* !defined (__VMKLNX__) */ +#define bcm_memmove memmove +#endif /* defined (__VMKLNX__) */ + +/* Hardware data structures and register definitions automatically + * generated from RTL code. Do not modify. + */ + +/* + * tx_bd definition + */ +struct tx_bd { + u32 tx_bd_haddr_hi; + u32 tx_bd_haddr_lo; + u32 tx_bd_mss_nbytes; + #define TX_BD_TCP6_OFF2_SHL (14) + u32 tx_bd_vlan_tag_flags; + #define TX_BD_FLAGS_CONN_FAULT (1<<0) + #define TX_BD_FLAGS_TCP6_OFF0_MSK (3<<1) + #define TX_BD_FLAGS_TCP6_OFF0_SHL (1) + #define TX_BD_FLAGS_TCP_UDP_CKSUM (1<<1) + #define TX_BD_FLAGS_IP_CKSUM (1<<2) + #define TX_BD_FLAGS_VLAN_TAG (1<<3) + #define TX_BD_FLAGS_COAL_NOW (1<<4) + #define TX_BD_FLAGS_DONT_GEN_CRC (1<<5) + #define TX_BD_FLAGS_END (1<<6) + #define TX_BD_FLAGS_START (1<<7) + #define TX_BD_FLAGS_SW_OPTION_WORD (0x1f<<8) + #define TX_BD_FLAGS_TCP6_OFF4_SHL (12) + #define TX_BD_FLAGS_SW_FLAGS (1<<13) + #define TX_BD_FLAGS_SW_SNAP (1<<14) + #define TX_BD_FLAGS_SW_LSO (1<<15) + +}; + + +/* + * rx_bd definition + */ +struct rx_bd { + u32 rx_bd_haddr_hi; + u32 rx_bd_haddr_lo; + u32 rx_bd_len; + u32 rx_bd_flags; + #define RX_BD_FLAGS_NOPUSH (1<<0) + #define RX_BD_FLAGS_DUMMY (1<<1) + #define RX_BD_FLAGS_END (1<<2) + #define RX_BD_FLAGS_START (1<<3) + +}; + +#define BNX2_RX_ALIGN 16 + +/* + * status_block definition + */ +struct status_block { + volatile u32 status_attn_bits; + #define STATUS_ATTN_BITS_LINK_STATE (1L<<0) + #define STATUS_ATTN_BITS_TX_SCHEDULER_ABORT (1L<<1) + #define STATUS_ATTN_BITS_TX_BD_READ_ABORT (1L<<2) + #define STATUS_ATTN_BITS_TX_BD_CACHE_ABORT (1L<<3) + #define STATUS_ATTN_BITS_TX_PROCESSOR_ABORT (1L<<4) + #define STATUS_ATTN_BITS_TX_DMA_ABORT (1L<<5) + #define STATUS_ATTN_BITS_TX_PATCHUP_ABORT (1L<<6) + #define STATUS_ATTN_BITS_TX_ASSEMBLER_ABORT (1L<<7) + #define STATUS_ATTN_BITS_RX_PARSER_MAC_ABORT (1L<<8) + #define STATUS_ATTN_BITS_RX_PARSER_CATCHUP_ABORT (1L<<9) + #define STATUS_ATTN_BITS_RX_MBUF_ABORT (1L<<10) + #define STATUS_ATTN_BITS_RX_LOOKUP_ABORT (1L<<11) + #define STATUS_ATTN_BITS_RX_PROCESSOR_ABORT (1L<<12) + #define STATUS_ATTN_BITS_RX_V2P_ABORT (1L<<13) + #define STATUS_ATTN_BITS_RX_BD_CACHE_ABORT (1L<<14) + #define STATUS_ATTN_BITS_RX_DMA_ABORT (1L<<15) + #define STATUS_ATTN_BITS_COMPLETION_ABORT (1L<<16) + #define STATUS_ATTN_BITS_HOST_COALESCE_ABORT (1L<<17) + #define STATUS_ATTN_BITS_MAILBOX_QUEUE_ABORT (1L<<18) + #define STATUS_ATTN_BITS_CONTEXT_ABORT (1L<<19) + #define STATUS_ATTN_BITS_CMD_SCHEDULER_ABORT (1L<<20) + #define STATUS_ATTN_BITS_CMD_PROCESSOR_ABORT (1L<<21) + #define STATUS_ATTN_BITS_MGMT_PROCESSOR_ABORT (1L<<22) + #define STATUS_ATTN_BITS_MAC_ABORT (1L<<23) + #define STATUS_ATTN_BITS_TIMER_ABORT (1L<<24) + #define STATUS_ATTN_BITS_DMAE_ABORT (1L<<25) + #define STATUS_ATTN_BITS_FLSH_ABORT (1L<<26) + #define STATUS_ATTN_BITS_GRC_ABORT (1L<<27) + #define STATUS_ATTN_BITS_EPB_ERROR (1L<<30) + #define STATUS_ATTN_BITS_PARITY_ERROR (1L<<31) + + volatile u32 status_attn_bits_ack; +#if defined(__BIG_ENDIAN) + volatile u16 status_tx_quick_consumer_index0; + volatile u16 status_tx_quick_consumer_index1; + volatile u16 status_tx_quick_consumer_index2; + volatile u16 status_tx_quick_consumer_index3; + volatile u16 status_rx_quick_consumer_index0; + volatile u16 status_rx_quick_consumer_index1; + volatile u16 status_rx_quick_consumer_index2; + volatile u16 status_rx_quick_consumer_index3; + volatile u16 status_rx_quick_consumer_index4; + volatile u16 status_rx_quick_consumer_index5; + volatile u16 status_rx_quick_consumer_index6; + volatile u16 status_rx_quick_consumer_index7; + volatile u16 status_rx_quick_consumer_index8; + volatile u16 status_rx_quick_consumer_index9; + volatile u16 status_rx_quick_consumer_index10; + volatile u16 status_rx_quick_consumer_index11; + volatile u16 status_rx_quick_consumer_index12; + volatile u16 status_rx_quick_consumer_index13; + volatile u16 status_rx_quick_consumer_index14; + volatile u16 status_rx_quick_consumer_index15; + volatile u16 status_completion_producer_index; + volatile u16 status_cmd_consumer_index; + volatile u16 status_idx; + volatile u8 status_unused; + volatile u8 status_blk_num; +#elif defined(__LITTLE_ENDIAN) + volatile u16 status_tx_quick_consumer_index1; + volatile u16 status_tx_quick_consumer_index0; + volatile u16 status_tx_quick_consumer_index3; + volatile u16 status_tx_quick_consumer_index2; + volatile u16 status_rx_quick_consumer_index1; + volatile u16 status_rx_quick_consumer_index0; + volatile u16 status_rx_quick_consumer_index3; + volatile u16 status_rx_quick_consumer_index2; + volatile u16 status_rx_quick_consumer_index5; + volatile u16 status_rx_quick_consumer_index4; + volatile u16 status_rx_quick_consumer_index7; + volatile u16 status_rx_quick_consumer_index6; + volatile u16 status_rx_quick_consumer_index9; + volatile u16 status_rx_quick_consumer_index8; + volatile u16 status_rx_quick_consumer_index11; + volatile u16 status_rx_quick_consumer_index10; + volatile u16 status_rx_quick_consumer_index13; + volatile u16 status_rx_quick_consumer_index12; + volatile u16 status_rx_quick_consumer_index15; + volatile u16 status_rx_quick_consumer_index14; + volatile u16 status_cmd_consumer_index; + volatile u16 status_completion_producer_index; + volatile u8 status_blk_num; + volatile u8 status_unused; + volatile u16 status_idx; +#endif +}; + + +/* + * status_block definition + */ +struct status_block_msix { +#if defined(__BIG_ENDIAN) + volatile u16 status_tx_quick_consumer_index; + volatile u16 status_rx_quick_consumer_index; + volatile u16 status_completion_producer_index; + volatile u16 status_cmd_consumer_index; + volatile u32 status_unused; + volatile u16 status_idx; + volatile u8 status_unused2; + volatile u8 status_blk_num; +#elif defined(__LITTLE_ENDIAN) + volatile u16 status_rx_quick_consumer_index; + volatile u16 status_tx_quick_consumer_index; + volatile u16 status_cmd_consumer_index; + volatile u16 status_completion_producer_index; + volatile u32 status_unused; + volatile u8 status_blk_num; + volatile u8 status_unused2; + volatile u16 status_idx; +#endif +}; + +#define BNX2_SBLK_MSIX_ALIGN_SIZE 128 + + +/* + * statistics_block definition + */ +struct statistics_block { + u32 stat_IfHCInOctets_hi; + u32 stat_IfHCInOctets_lo; + u32 stat_IfHCInBadOctets_hi; + u32 stat_IfHCInBadOctets_lo; + u32 stat_IfHCOutOctets_hi; + u32 stat_IfHCOutOctets_lo; + u32 stat_IfHCOutBadOctets_hi; + u32 stat_IfHCOutBadOctets_lo; + u32 stat_IfHCInUcastPkts_hi; + u32 stat_IfHCInUcastPkts_lo; + u32 stat_IfHCInMulticastPkts_hi; + u32 stat_IfHCInMulticastPkts_lo; + u32 stat_IfHCInBroadcastPkts_hi; + u32 stat_IfHCInBroadcastPkts_lo; + u32 stat_IfHCOutUcastPkts_hi; + u32 stat_IfHCOutUcastPkts_lo; + u32 stat_IfHCOutMulticastPkts_hi; + u32 stat_IfHCOutMulticastPkts_lo; + u32 stat_IfHCOutBroadcastPkts_hi; + u32 stat_IfHCOutBroadcastPkts_lo; + u32 stat_emac_tx_stat_dot3statsinternalmactransmiterrors; + u32 stat_Dot3StatsCarrierSenseErrors; + u32 stat_Dot3StatsFCSErrors; + u32 stat_Dot3StatsAlignmentErrors; + u32 stat_Dot3StatsSingleCollisionFrames; + u32 stat_Dot3StatsMultipleCollisionFrames; + u32 stat_Dot3StatsDeferredTransmissions; + u32 stat_Dot3StatsExcessiveCollisions; + u32 stat_Dot3StatsLateCollisions; + u32 stat_EtherStatsCollisions; + u32 stat_EtherStatsFragments; + u32 stat_EtherStatsJabbers; + u32 stat_EtherStatsUndersizePkts; + u32 stat_EtherStatsOverrsizePkts; + u32 stat_EtherStatsPktsRx64Octets; + u32 stat_EtherStatsPktsRx65Octetsto127Octets; + u32 stat_EtherStatsPktsRx128Octetsto255Octets; + u32 stat_EtherStatsPktsRx256Octetsto511Octets; + u32 stat_EtherStatsPktsRx512Octetsto1023Octets; + u32 stat_EtherStatsPktsRx1024Octetsto1522Octets; + u32 stat_EtherStatsPktsRx1523Octetsto9022Octets; + u32 stat_EtherStatsPktsTx64Octets; + u32 stat_EtherStatsPktsTx65Octetsto127Octets; + u32 stat_EtherStatsPktsTx128Octetsto255Octets; + u32 stat_EtherStatsPktsTx256Octetsto511Octets; + u32 stat_EtherStatsPktsTx512Octetsto1023Octets; + u32 stat_EtherStatsPktsTx1024Octetsto1522Octets; + u32 stat_EtherStatsPktsTx1523Octetsto9022Octets; + u32 stat_XonPauseFramesReceived; + u32 stat_XoffPauseFramesReceived; + u32 stat_OutXonSent; + u32 stat_OutXoffSent; + u32 stat_FlowControlDone; + u32 stat_MacControlFramesReceived; + u32 stat_XoffStateEntered; + u32 stat_IfInFramesL2FilterDiscards; + u32 stat_IfInRuleCheckerDiscards; + u32 stat_IfInFTQDiscards; + u32 stat_IfInMBUFDiscards; + u32 stat_IfInRuleCheckerP4Hit; + u32 stat_CatchupInRuleCheckerDiscards; + u32 stat_CatchupInFTQDiscards; + u32 stat_CatchupInMBUFDiscards; + u32 stat_CatchupInRuleCheckerP4Hit; + u32 stat_GenStat00; + u32 stat_GenStat01; + u32 stat_GenStat02; + u32 stat_GenStat03; + u32 stat_GenStat04; + u32 stat_GenStat05; + u32 stat_GenStat06; + u32 stat_GenStat07; + u32 stat_GenStat08; + u32 stat_GenStat09; + u32 stat_GenStat10; + u32 stat_GenStat11; + u32 stat_GenStat12; + u32 stat_GenStat13; + u32 stat_GenStat14; + u32 stat_GenStat15; + u32 stat_FwRxDrop; +}; + + +/* + * l2_fhdr definition + */ +struct l2_fhdr { + u32 l2_fhdr_status; + #define L2_FHDR_STATUS_RULE_CLASS (0x7<<0) + #define L2_FHDR_STATUS_RULE_P2 (1<<3) + #define L2_FHDR_STATUS_RULE_P3 (1<<4) + #define L2_FHDR_STATUS_RULE_P4 (1<<5) + #define L2_FHDR_STATUS_L2_VLAN_TAG (1<<6) + #define L2_FHDR_STATUS_L2_LLC_SNAP (1<<7) + #define L2_FHDR_STATUS_RSS_HASH (1<<8) + #define L2_FHDR_STATUS_IP_DATAGRAM (1<<13) + #define L2_FHDR_STATUS_TCP_SEGMENT (1<<14) + #define L2_FHDR_STATUS_UDP_DATAGRAM (1<<15) + + #define L2_FHDR_STATUS_SPLIT (1<<16) + #define L2_FHDR_ERRORS_BAD_CRC (1<<17) + #define L2_FHDR_ERRORS_PHY_DECODE (1<<18) + #define L2_FHDR_ERRORS_ALIGNMENT (1<<19) + #define L2_FHDR_ERRORS_TOO_SHORT (1<<20) + #define L2_FHDR_ERRORS_GIANT_FRAME (1<<21) + #define L2_FHDR_ERRORS_TCP_XSUM (1<<28) + #define L2_FHDR_ERRORS_UDP_XSUM (1<<31) + + u32 l2_fhdr_hash; +#if defined(__BIG_ENDIAN) + u16 l2_fhdr_pkt_len; + u16 l2_fhdr_vlan_tag; + u16 l2_fhdr_ip_xsum; + u16 l2_fhdr_tcp_udp_xsum; +#elif defined(__LITTLE_ENDIAN) + u16 l2_fhdr_vlan_tag; + u16 l2_fhdr_pkt_len; + u16 l2_fhdr_tcp_udp_xsum; + u16 l2_fhdr_ip_xsum; +#endif +}; + +#define BNX2_RX_OFFSET (sizeof(struct l2_fhdr) + 2) + +/* + * l2_context definition + */ +#define BNX2_L2CTX_TYPE 0x00000000 +#define BNX2_L2CTX_TYPE_SIZE_L2 ((0xc0/0x20)<<16) +#define BNX2_L2CTX_TYPE_TYPE (0xf<<28) +#define BNX2_L2CTX_TYPE_TYPE_EMPTY (0<<28) +#define BNX2_L2CTX_TYPE_TYPE_L2 (1<<28) + +#define BNX2_L2CTX_TX_HOST_BIDX 0x00000088 +#define BNX2_L2CTX_EST_NBD 0x00000088 +#define BNX2_L2CTX_CMD_TYPE 0x00000088 +#define BNX2_L2CTX_CMD_TYPE_TYPE (0xf<<24) +#define BNX2_L2CTX_CMD_TYPE_TYPE_L2 (0<<24) +#define BNX2_L2CTX_CMD_TYPE_TYPE_TCP (1<<24) + +#define BNX2_L2CTX_TX_HOST_BSEQ 0x00000090 +#define BNX2_L2CTX_TSCH_BSEQ 0x00000094 +#define BNX2_L2CTX_TBDR_BSEQ 0x00000098 +#define BNX2_L2CTX_TBDR_BOFF 0x0000009c +#define BNX2_L2CTX_TBDR_BIDX 0x0000009c +#define BNX2_L2CTX_TBDR_BHADDR_HI 0x000000a0 +#define BNX2_L2CTX_TBDR_BHADDR_LO 0x000000a4 +#define BNX2_L2CTX_TXP_BOFF 0x000000a8 +#define BNX2_L2CTX_TXP_BIDX 0x000000a8 +#define BNX2_L2CTX_TXP_BSEQ 0x000000ac + +#define BNX2_L2CTX_TYPE_XI 0x00000080 +#define BNX2_L2CTX_CMD_TYPE_XI 0x00000240 +#define BNX2_L2CTX_TBDR_BHADDR_HI_XI 0x00000258 +#define BNX2_L2CTX_TBDR_BHADDR_LO_XI 0x0000025c + +/* + * l2_bd_chain_context definition + */ +#define BNX2_L2CTX_BD_PRE_READ 0x00000000 +#define BNX2_L2CTX_CTX_SIZE 0x00000000 +#define BNX2_L2CTX_CTX_TYPE 0x00000000 +#define BNX2_L2CTX_LO_WATER_MARK_DEFAULT 32 +#define BNX2_L2CTX_LO_WATER_MARK_SCALE 4 +#define BNX2_L2CTX_LO_WATER_MARK_DIS 0 +#define BNX2_L2CTX_HI_WATER_MARK_SHIFT 4 +#define BNX2_L2CTX_HI_WATER_MARK_SCALE 16 +#define BNX2_L2CTX_WATER_MARKS_MSK 0x000000ff +#define BNX2_L2CTX_CTX_TYPE_SIZE_L2 ((0x20/20)<<16) +#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE (0xf<<28) +#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_UNDEFINED (0<<28) +#define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE (1<<28) + +#define BNX2_L2CTX_HOST_BDIDX 0x00000004 +#define BNX2_L2CTX_STATUSB_NUM_SHIFT 16 +#define BNX2_L2CTX_STATUSB_NUM(sb_id) \ + (((sb_id) > 0) ? (((sb_id) + 7) << BNX2_L2CTX_STATUSB_NUM_SHIFT) : 0) +#define BNX2_L2CTX_HOST_BSEQ 0x00000008 +#define BNX2_L2CTX_NX_BSEQ 0x0000000c +#define BNX2_L2CTX_NX_BDHADDR_HI 0x00000010 +#define BNX2_L2CTX_NX_BDHADDR_LO 0x00000014 +#define BNX2_L2CTX_NX_BDIDX 0x00000018 + +#define BNX2_L2CTX_HOST_PG_BDIDX 0x00000044 +#define BNX2_L2CTX_PG_BUF_SIZE 0x00000048 +#define BNX2_L2CTX_RBDC_KEY 0x0000004c +#define BNX2_L2CTX_RBDC_JUMBO_KEY 0x3ffe +#define BNX2_L2CTX_NX_PG_BDHADDR_HI 0x00000050 +#define BNX2_L2CTX_NX_PG_BDHADDR_LO 0x00000054 + +/* + * pci_config_l definition + * offset: 0000 + */ +#define BNX2_PCICFG_MSI_CONTROL 0x00000058 +#define BNX2_PCICFG_MSI_CONTROL_ENABLE (1L<<16) + +#define BNX2_PCICFG_MISC_CONFIG 0x00000068 +#define BNX2_PCICFG_MISC_CONFIG_TARGET_BYTE_SWAP (1L<<2) +#define BNX2_PCICFG_MISC_CONFIG_TARGET_MB_WORD_SWAP (1L<<3) +#define BNX2_PCICFG_MISC_CONFIG_RESERVED1 (1L<<4) +#define BNX2_PCICFG_MISC_CONFIG_CLOCK_CTL_ENA (1L<<5) +#define BNX2_PCICFG_MISC_CONFIG_TARGET_GRC_WORD_SWAP (1L<<6) +#define BNX2_PCICFG_MISC_CONFIG_REG_WINDOW_ENA (1L<<7) +#define BNX2_PCICFG_MISC_CONFIG_CORE_RST_REQ (1L<<8) +#define BNX2_PCICFG_MISC_CONFIG_CORE_RST_BSY (1L<<9) +#define BNX2_PCICFG_MISC_CONFIG_GRC_WIN1_SWAP_EN (1L<<10) +#define BNX2_PCICFG_MISC_CONFIG_GRC_WIN2_SWAP_EN (1L<<11) +#define BNX2_PCICFG_MISC_CONFIG_GRC_WIN3_SWAP_EN (1L<<12) +#define BNX2_PCICFG_MISC_CONFIG_ASIC_METAL_REV (0xffL<<16) +#define BNX2_PCICFG_MISC_CONFIG_ASIC_BASE_REV (0xfL<<24) +#define BNX2_PCICFG_MISC_CONFIG_ASIC_ID (0xfL<<28) + +#define BNX2_PCICFG_MISC_STATUS 0x0000006c +#define BNX2_PCICFG_MISC_STATUS_INTA_VALUE (1L<<0) +#define BNX2_PCICFG_MISC_STATUS_32BIT_DET (1L<<1) +#define BNX2_PCICFG_MISC_STATUS_M66EN (1L<<2) +#define BNX2_PCICFG_MISC_STATUS_PCIX_DET (1L<<3) +#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED (0x3L<<4) +#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_66 (0L<<4) +#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_100 (1L<<4) +#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_133 (2L<<4) +#define BNX2_PCICFG_MISC_STATUS_PCIX_SPEED_PCI_MODE (3L<<4) +#define BNX2_PCICFG_MISC_STATUS_BAD_MEM_WRITE_BE (1L<<8) + +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS 0x00000070 +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET (0xfL<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ (0L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ (1L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ (2L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ (3L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ (4L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ (5L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ (6L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ (7L<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW (0xfL<<0) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_DISABLE (1L<<6) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT (1L<<7) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC (0x7L<<8) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_UNDEF (0L<<8) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_12 (1L<<8) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_6 (2L<<8) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_62 (4L<<8) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_MIN_POWER (1L<<11) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED (0xfL<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_100 (0L<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_80 (1L<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_50 (2L<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_40 (4L<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_25 (8L<<12) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_CORE_CLK_PLL_STOP (1L<<16) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED_17 (1L<<17) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED_18 (1L<<18) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED_19 (1L<<19) +#define BNX2_PCICFG_PCI_CLOCK_CONTROL_BITS_RESERVED (0xfffL<<20) + +#define BNX2_PCICFG_REG_WINDOW_ADDRESS 0x00000078 +#define BNX2_PCICFG_REG_WINDOW_ADDRESS_VAL (0xfffffL<<2) + +#define BNX2_PCICFG_REG_WINDOW 0x00000080 +#define BNX2_PCICFG_INT_ACK_CMD 0x00000084 +#define BNX2_PCICFG_INT_ACK_CMD_INDEX (0xffffL<<0) +#define BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID (1L<<16) +#define BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM (1L<<17) +#define BNX2_PCICFG_INT_ACK_CMD_MASK_INT (1L<<18) +#define BNX2_PCICFG_INT_ACK_CMD_INTERRUPT_NUM (0xfL<<24) +#define BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT 24 + +#define BNX2_PCICFG_STATUS_BIT_SET_CMD 0x00000088 +#define BNX2_PCICFG_STATUS_BIT_CLEAR_CMD 0x0000008c +#define BNX2_PCICFG_MAILBOX_QUEUE_ADDR 0x00000090 +#define BNX2_PCICFG_MAILBOX_QUEUE_DATA 0x00000094 + + +/* + * pci_reg definition + * offset: 0x400 + */ +#define BNX2_PCI_GRC_WINDOW_ADDR 0x00000400 +#define BNX2_PCI_GRC_WINDOW_ADDR_VALUE (0x1ffL<<13) +#define BNX2_PCI_GRC_WINDOW_ADDR_SEP_WIN (1L<<31) + +#define BNX2_PCI_GRC_WINDOW2_BASE 0xc000 +#define BNX2_PCI_GRC_WINDOW3_BASE 0xe000 + +#define BNX2_PCI_CONFIG_1 0x00000404 +#define BNX2_PCI_CONFIG_1_RESERVED0 (0xffL<<0) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY (0x7L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_OFF (0L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_16 (1L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_32 (2L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_64 (3L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_128 (4L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_256 (5L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_512 (6L<<8) +#define BNX2_PCI_CONFIG_1_READ_BOUNDARY_1024 (7L<<8) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY (0x7L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_OFF (0L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_16 (1L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_32 (2L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_64 (3L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_128 (4L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_256 (5L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_512 (6L<<11) +#define BNX2_PCI_CONFIG_1_WRITE_BOUNDARY_1024 (7L<<11) +#define BNX2_PCI_CONFIG_1_RESERVED1 (0x3ffffL<<14) + +#define BNX2_PCI_CONFIG_2 0x00000408 +#define BNX2_PCI_CONFIG_2_BAR1_SIZE (0xfL<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_DISABLED (0L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_64K (1L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_128K (2L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_256K (3L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_512K (4L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_1M (5L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_2M (6L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_4M (7L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_8M (8L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_16M (9L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_32M (10L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_64M (11L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_128M (12L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_256M (13L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_512M (14L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_SIZE_1G (15L<<0) +#define BNX2_PCI_CONFIG_2_BAR1_64ENA (1L<<4) +#define BNX2_PCI_CONFIG_2_EXP_ROM_RETRY (1L<<5) +#define BNX2_PCI_CONFIG_2_CFG_CYCLE_RETRY (1L<<6) +#define BNX2_PCI_CONFIG_2_FIRST_CFG_DONE (1L<<7) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE (0xffL<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_DISABLED (0L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_1K (1L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_2K (2L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_4K (3L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_8K (4L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_16K (5L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_32K (6L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_64K (7L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_128K (8L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_256K (9L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_512K (10L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_1M (11L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_2M (12L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_4M (13L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_8M (14L<<8) +#define BNX2_PCI_CONFIG_2_EXP_ROM_SIZE_16M (15L<<8) +#define BNX2_PCI_CONFIG_2_MAX_SPLIT_LIMIT (0x1fL<<16) +#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT (0x3L<<21) +#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_512 (0L<<21) +#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_1K (1L<<21) +#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_2K (2L<<21) +#define BNX2_PCI_CONFIG_2_MAX_READ_LIMIT_4K (3L<<21) +#define BNX2_PCI_CONFIG_2_FORCE_32_BIT_MSTR (1L<<23) +#define BNX2_PCI_CONFIG_2_FORCE_32_BIT_TGT (1L<<24) +#define BNX2_PCI_CONFIG_2_KEEP_REQ_ASSERT (1L<<25) +#define BNX2_PCI_CONFIG_2_RESERVED0 (0x3fL<<26) +#define BNX2_PCI_CONFIG_2_BAR_PREFETCH_XI (1L<<16) +#define BNX2_PCI_CONFIG_2_RESERVED0_XI (0x7fffL<<17) + +#define BNX2_PCI_CONFIG_3 0x0000040c +#define BNX2_PCI_CONFIG_3_STICKY_BYTE (0xffL<<0) +#define BNX2_PCI_CONFIG_3_REG_STICKY_BYTE (0xffL<<8) +#define BNX2_PCI_CONFIG_3_FORCE_PME (1L<<24) +#define BNX2_PCI_CONFIG_3_PME_STATUS (1L<<25) +#define BNX2_PCI_CONFIG_3_PME_ENABLE (1L<<26) +#define BNX2_PCI_CONFIG_3_PM_STATE (0x3L<<27) +#define BNX2_PCI_CONFIG_3_VAUX_PRESET (1L<<30) +#define BNX2_PCI_CONFIG_3_PCI_POWER (1L<<31) + +#define BNX2_PCI_PM_DATA_A 0x00000410 +#define BNX2_PCI_PM_DATA_A_PM_DATA_0_PRG (0xffL<<0) +#define BNX2_PCI_PM_DATA_A_PM_DATA_1_PRG (0xffL<<8) +#define BNX2_PCI_PM_DATA_A_PM_DATA_2_PRG (0xffL<<16) +#define BNX2_PCI_PM_DATA_A_PM_DATA_3_PRG (0xffL<<24) + +#define BNX2_PCI_PM_DATA_B 0x00000414 +#define BNX2_PCI_PM_DATA_B_PM_DATA_4_PRG (0xffL<<0) +#define BNX2_PCI_PM_DATA_B_PM_DATA_5_PRG (0xffL<<8) +#define BNX2_PCI_PM_DATA_B_PM_DATA_6_PRG (0xffL<<16) +#define BNX2_PCI_PM_DATA_B_PM_DATA_7_PRG (0xffL<<24) + +#define BNX2_PCI_SWAP_DIAG0 0x00000418 +#define BNX2_PCI_SWAP_DIAG1 0x0000041c +#define BNX2_PCI_EXP_ROM_ADDR 0x00000420 +#define BNX2_PCI_EXP_ROM_ADDR_ADDRESS (0x3fffffL<<2) +#define BNX2_PCI_EXP_ROM_ADDR_REQ (1L<<31) + +#define BNX2_PCI_EXP_ROM_DATA 0x00000424 +#define BNX2_PCI_VPD_INTF 0x00000428 +#define BNX2_PCI_VPD_INTF_INTF_REQ (1L<<0) + +#define BNX2_PCI_VPD_ADDR_FLAG 0x0000042c +#define BNX2_PCI_VPD_ADDR_FLAG_MSK 0x0000ffff +#define BNX2_PCI_VPD_ADDR_FLAG_SL 0L +#define BNX2_PCI_VPD_ADDR_FLAG_ADDRESS (0x1fffL<<2) +#define BNX2_PCI_VPD_ADDR_FLAG_WR (1L<<15) + +#define BNX2_PCI_VPD_DATA 0x00000430 +#define BNX2_PCI_ID_VAL1 0x00000434 +#define BNX2_PCI_ID_VAL1_DEVICE_ID (0xffffL<<0) +#define BNX2_PCI_ID_VAL1_VENDOR_ID (0xffffL<<16) + +#define BNX2_PCI_ID_VAL2 0x00000438 +#define BNX2_PCI_ID_VAL2_SUBSYSTEM_VENDOR_ID (0xffffL<<0) +#define BNX2_PCI_ID_VAL2_SUBSYSTEM_ID (0xffffL<<16) + +#define BNX2_PCI_ID_VAL3 0x0000043c +#define BNX2_PCI_ID_VAL3_CLASS_CODE (0xffffffL<<0) +#define BNX2_PCI_ID_VAL3_REVISION_ID (0xffL<<24) + +#define BNX2_PCI_ID_VAL4 0x00000440 +#define BNX2_PCI_ID_VAL4_CAP_ENA (0xfL<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_0 (0L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_1 (1L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_2 (2L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_3 (3L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_4 (4L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_5 (5L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_6 (6L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_7 (7L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_8 (8L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_9 (9L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_10 (10L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_11 (11L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_12 (12L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_13 (13L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_14 (14L<<0) +#define BNX2_PCI_ID_VAL4_CAP_ENA_15 (15L<<0) +#define BNX2_PCI_ID_VAL4_RESERVED0 (0x3L<<4) +#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG (0x3L<<6) +#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_0 (0L<<6) +#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_1 (1L<<6) +#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_2 (2L<<6) +#define BNX2_PCI_ID_VAL4_PM_SCALE_PRG_3 (3L<<6) +#define BNX2_PCI_ID_VAL4_MSI_PV_MASK_CAP (1L<<8) +#define BNX2_PCI_ID_VAL4_MSI_LIMIT (0x7L<<9) +#define BNX2_PCI_ID_VAL4_MULTI_MSG_CAP (0x7L<<12) +#define BNX2_PCI_ID_VAL4_MSI_ENABLE (1L<<15) +#define BNX2_PCI_ID_VAL4_MAX_64_ADVERTIZE (1L<<16) +#define BNX2_PCI_ID_VAL4_MAX_133_ADVERTIZE (1L<<17) +#define BNX2_PCI_ID_VAL4_RESERVED2 (0x7L<<18) +#define BNX2_PCI_ID_VAL4_MAX_CUMULATIVE_SIZE_B21 (0x3L<<21) +#define BNX2_PCI_ID_VAL4_MAX_SPLIT_SIZE_B21 (0x3L<<23) +#define BNX2_PCI_ID_VAL4_MAX_CUMULATIVE_SIZE_B0 (1L<<25) +#define BNX2_PCI_ID_VAL4_MAX_MEM_READ_SIZE_B10 (0x3L<<26) +#define BNX2_PCI_ID_VAL4_MAX_SPLIT_SIZE_B0 (1L<<28) +#define BNX2_PCI_ID_VAL4_RESERVED3 (0x7L<<29) +#define BNX2_PCI_ID_VAL4_RESERVED3_XI (0xffffL<<16) + +#define BNX2_PCI_ID_VAL5 0x00000444 +#define BNX2_PCI_ID_VAL5_D1_SUPPORT (1L<<0) +#define BNX2_PCI_ID_VAL5_D2_SUPPORT (1L<<1) +#define BNX2_PCI_ID_VAL5_PME_IN_D0 (1L<<2) +#define BNX2_PCI_ID_VAL5_PME_IN_D1 (1L<<3) +#define BNX2_PCI_ID_VAL5_PME_IN_D2 (1L<<4) +#define BNX2_PCI_ID_VAL5_PME_IN_D3_HOT (1L<<5) +#define BNX2_PCI_ID_VAL5_RESERVED0_TE (0x3ffffffL<<6) +#define BNX2_PCI_ID_VAL5_PM_VERSION_XI (0x7L<<6) +#define BNX2_PCI_ID_VAL5_NO_SOFT_RESET_XI (1L<<9) +#define BNX2_PCI_ID_VAL5_RESERVED0_XI (0x3fffffL<<10) + +#define BNX2_PCI_PCIX_EXTENDED_STATUS 0x00000448 +#define BNX2_PCI_PCIX_EXTENDED_STATUS_NO_SNOOP (1L<<8) +#define BNX2_PCI_PCIX_EXTENDED_STATUS_LONG_BURST (1L<<9) +#define BNX2_PCI_PCIX_EXTENDED_STATUS_SPLIT_COMP_MSG_CLASS (0xfL<<16) +#define BNX2_PCI_PCIX_EXTENDED_STATUS_SPLIT_COMP_MSG_IDX (0xffL<<24) + +#define BNX2_PCI_ID_VAL6 0x0000044c +#define BNX2_PCI_ID_VAL6_MAX_LAT (0xffL<<0) +#define BNX2_PCI_ID_VAL6_MIN_GNT (0xffL<<8) +#define BNX2_PCI_ID_VAL6_BIST (0xffL<<16) +#define BNX2_PCI_ID_VAL6_RESERVED0 (0xffL<<24) + +#define BNX2_PCI_MSI_DATA 0x00000450 +#define BNX2_PCI_MSI_DATA_MSI_DATA (0xffffL<<0) + +#define BNX2_PCI_MSI_ADDR_H 0x00000454 +#define BNX2_PCI_MSI_ADDR_L 0x00000458 +#define BNX2_PCI_MSI_ADDR_L_VAL (0x3fffffffL<<2) + +#define BNX2_PCI_CFG_ACCESS_CMD 0x0000045c +#define BNX2_PCI_CFG_ACCESS_CMD_ADR (0x3fL<<2) +#define BNX2_PCI_CFG_ACCESS_CMD_RD_REQ (1L<<27) +#define BNX2_PCI_CFG_ACCESS_CMD_WR_REQ (0xfL<<28) + +#define BNX2_PCI_CFG_ACCESS_DATA 0x00000460 +#define BNX2_PCI_MSI_MASK 0x00000464 +#define BNX2_PCI_MSI_MASK_MSI_MASK (0xffffffffL<<0) + +#define BNX2_PCI_MSI_PEND 0x00000468 +#define BNX2_PCI_MSI_PEND_MSI_PEND (0xffffffffL<<0) + +#define BNX2_PCI_PM_DATA_C 0x0000046c +#define BNX2_PCI_PM_DATA_C_PM_DATA_8_PRG (0xffL<<0) +#define BNX2_PCI_PM_DATA_C_RESERVED0 (0xffffffL<<8) + +#define BNX2_PCI_MSIX_CONTROL 0x000004c0 +#define BNX2_PCI_MSIX_CONTROL_MSIX_TBL_SIZ (0x7ffL<<0) +#define BNX2_PCI_MSIX_CONTROL_RESERVED0 (0x1fffffL<<11) + +#define BNX2_PCI_MSIX_TBL_OFF_BIR 0x000004c4 +#define BNX2_PCI_MSIX_TBL_OFF_BIR_MSIX_TBL_BIR (0x7L<<0) +#define BNX2_PCI_MSIX_TBL_OFF_BIR_MSIX_TBL_OFF (0x1fffffffL<<3) + +#define BNX2_PCI_MSIX_PBA_OFF_BIT 0x000004c8 +#define BNX2_PCI_MSIX_PBA_OFF_BIT_MSIX_PBA_BIR (0x7L<<0) +#define BNX2_PCI_MSIX_PBA_OFF_BIT_MSIX_PBA_OFF (0x1fffffffL<<3) + +#define BNX2_PCI_PCIE_CAPABILITY 0x000004d0 +#define BNX2_PCI_PCIE_CAPABILITY_INTERRUPT_MSG_NUM (0x1fL<<0) +#define BNX2_PCI_PCIE_CAPABILITY_COMPLY_PCIE_1_1 (1L<<5) + +#define BNX2_PCI_DEVICE_CAPABILITY 0x000004d4 +#define BNX2_PCI_DEVICE_CAPABILITY_MAX_PL_SIZ_SUPPORTED (0x7L<<0) +#define BNX2_PCI_DEVICE_CAPABILITY_EXTENDED_TAG_SUPPORT (1L<<5) +#define BNX2_PCI_DEVICE_CAPABILITY_L0S_ACCEPTABLE_LATENCY (0x7L<<6) +#define BNX2_PCI_DEVICE_CAPABILITY_L1_ACCEPTABLE_LATENCY (0x7L<<9) +#define BNX2_PCI_DEVICE_CAPABILITY_ROLE_BASED_ERR_RPT (1L<<15) + +#define BNX2_PCI_LINK_CAPABILITY 0x000004dc +#define BNX2_PCI_LINK_CAPABILITY_MAX_LINK_SPEED (0xfL<<0) +#define BNX2_PCI_LINK_CAPABILITY_MAX_LINK_SPEED_0001 (1L<<0) +#define BNX2_PCI_LINK_CAPABILITY_MAX_LINK_SPEED_0010 (1L<<0) +#define BNX2_PCI_LINK_CAPABILITY_MAX_LINK_WIDTH (0x1fL<<4) +#define BNX2_PCI_LINK_CAPABILITY_CLK_POWER_MGMT (1L<<9) +#define BNX2_PCI_LINK_CAPABILITY_ASPM_SUPPORT (0x3L<<10) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_LAT (0x7L<<12) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_LAT_101 (5L<<12) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_LAT_110 (6L<<12) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_LAT (0x7L<<15) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_LAT_001 (1L<<15) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_LAT_010 (2L<<15) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_COMM_LAT (0x7L<<18) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_COMM_LAT_101 (5L<<18) +#define BNX2_PCI_LINK_CAPABILITY_L0S_EXIT_COMM_LAT_110 (6L<<18) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_COMM_LAT (0x7L<<21) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_COMM_LAT_001 (1L<<21) +#define BNX2_PCI_LINK_CAPABILITY_L1_EXIT_COMM_LAT_010 (2L<<21) +#define BNX2_PCI_LINK_CAPABILITY_PORT_NUM (0xffL<<24) + +#define BNX2_PCI_PCIE_DEVICE_CAPABILITY_2 0x000004e4 +#define BNX2_PCI_PCIE_DEVICE_CAPABILITY_2_CMPL_TO_RANGE_SUPP (0xfL<<0) +#define BNX2_PCI_PCIE_DEVICE_CAPABILITY_2_CMPL_TO_DISABL_SUPP (1L<<4) +#define BNX2_PCI_PCIE_DEVICE_CAPABILITY_2_RESERVED (0x7ffffffL<<5) + +#define BNX2_PCI_PCIE_LINK_CAPABILITY_2 0x000004e8 +#define BNX2_PCI_PCIE_LINK_CAPABILITY_2_RESERVED (0xffffffffL<<0) + +#define BNX2_PCI_GRC_WINDOW1_ADDR 0x00000610 +#define BNX2_PCI_GRC_WINDOW1_ADDR_VALUE (0x1ffL<<13) + +#define BNX2_PCI_GRC_WINDOW2_ADDR 0x00000614 +#define BNX2_PCI_GRC_WINDOW2_ADDR_VALUE (0x1ffL<<13) + +#define BNX2_PCI_GRC_WINDOW3_ADDR 0x00000618 +#define BNX2_PCI_GRC_WINDOW3_ADDR_VALUE (0x1ffL<<13) + +#define BNX2_MSIX_TABLE_ADDR 0x318000 +#define BNX2_MSIX_PBA_ADDR 0x31c000 + +/* + * misc_reg definition + * offset: 0x800 + */ +#define BNX2_MISC_COMMAND 0x00000800 +#define BNX2_MISC_COMMAND_ENABLE_ALL (1L<<0) +#define BNX2_MISC_COMMAND_DISABLE_ALL (1L<<1) +#define BNX2_MISC_COMMAND_SW_RESET (1L<<4) +#define BNX2_MISC_COMMAND_POR_RESET (1L<<5) +#define BNX2_MISC_COMMAND_HD_RESET (1L<<6) +#define BNX2_MISC_COMMAND_CMN_SW_RESET (1L<<7) +#define BNX2_MISC_COMMAND_PAR_ERROR (1L<<8) +#define BNX2_MISC_COMMAND_CS16_ERR (1L<<9) +#define BNX2_MISC_COMMAND_CS16_ERR_LOC (0xfL<<12) +#define BNX2_MISC_COMMAND_PAR_ERR_RAM (0x7fL<<16) +#define BNX2_MISC_COMMAND_POWERDOWN_EVENT (1L<<23) +#define BNX2_MISC_COMMAND_SW_SHUTDOWN (1L<<24) +#define BNX2_MISC_COMMAND_SHUTDOWN_EN (1L<<25) +#define BNX2_MISC_COMMAND_DINTEG_ATTN_EN (1L<<26) +#define BNX2_MISC_COMMAND_PCIE_LINK_IN_L23 (1L<<27) +#define BNX2_MISC_COMMAND_PCIE_DIS (1L<<28) + +#define BNX2_MISC_CFG 0x00000804 +#define BNX2_MISC_CFG_GRC_TMOUT (1L<<0) +#define BNX2_MISC_CFG_NVM_WR_EN (0x3L<<1) +#define BNX2_MISC_CFG_NVM_WR_EN_PROTECT (0L<<1) +#define BNX2_MISC_CFG_NVM_WR_EN_PCI (1L<<1) +#define BNX2_MISC_CFG_NVM_WR_EN_ALLOW (2L<<1) +#define BNX2_MISC_CFG_NVM_WR_EN_ALLOW2 (3L<<1) +#define BNX2_MISC_CFG_BIST_EN (1L<<3) +#define BNX2_MISC_CFG_CK25_OUT_ALT_SRC (1L<<4) +#define BNX2_MISC_CFG_RESERVED5_TE (1L<<5) +#define BNX2_MISC_CFG_RESERVED6_TE (1L<<6) +#define BNX2_MISC_CFG_CLK_CTL_OVERRIDE (1L<<7) +#define BNX2_MISC_CFG_LEDMODE (0x7L<<8) +#define BNX2_MISC_CFG_LEDMODE_MAC (0L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY1_TE (1L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY2_TE (2L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY3_TE (3L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY4_TE (4L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY5_TE (5L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY6_TE (6L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY7_TE (7L<<8) +#define BNX2_MISC_CFG_MCP_GRC_TMOUT_TE (1L<<11) +#define BNX2_MISC_CFG_DBU_GRC_TMOUT_TE (1L<<12) +#define BNX2_MISC_CFG_LEDMODE_XI (0xfL<<8) +#define BNX2_MISC_CFG_LEDMODE_MAC_XI (0L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY1_XI (1L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY2_XI (2L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY3_XI (3L<<8) +#define BNX2_MISC_CFG_LEDMODE_MAC2_XI (4L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY4_XI (5L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY5_XI (6L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY6_XI (7L<<8) +#define BNX2_MISC_CFG_LEDMODE_MAC3_XI (8L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY7_XI (9L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY8_XI (10L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY9_XI (11L<<8) +#define BNX2_MISC_CFG_LEDMODE_MAC4_XI (12L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY10_XI (13L<<8) +#define BNX2_MISC_CFG_LEDMODE_PHY11_XI (14L<<8) +#define BNX2_MISC_CFG_LEDMODE_UNUSED_XI (15L<<8) +#define BNX2_MISC_CFG_PORT_SELECT_XI (1L<<13) +#define BNX2_MISC_CFG_PARITY_MODE_XI (1L<<14) + +#define BNX2_MISC_ID 0x00000808 +#define BNX2_MISC_ID_BOND_ID (0xfL<<0) +#define BNX2_MISC_ID_BOND_ID_X (0L<<0) +#define BNX2_MISC_ID_BOND_ID_C (3L<<0) +#define BNX2_MISC_ID_BOND_ID_S (12L<<0) +#define BNX2_MISC_ID_CHIP_METAL (0xffL<<4) +#define BNX2_MISC_ID_CHIP_REV (0xfL<<12) +#define BNX2_MISC_ID_CHIP_NUM (0xffffL<<16) + +#define BNX2_MISC_ENABLE_STATUS_BITS 0x0000080c +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_SCHEDULER_ENABLE (1L<<0) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_BD_READ_ENABLE (1L<<1) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_BD_CACHE_ENABLE (1L<<2) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PROCESSOR_ENABLE (1L<<3) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_DMA_ENABLE (1L<<4) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PATCHUP_ENABLE (1L<<5) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_PAYLOAD_Q_ENABLE (1L<<6) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_HEADER_Q_ENABLE (1L<<7) +#define BNX2_MISC_ENABLE_STATUS_BITS_TX_ASSEMBLER_ENABLE (1L<<8) +#define BNX2_MISC_ENABLE_STATUS_BITS_EMAC_ENABLE (1L<<9) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PARSER_MAC_ENABLE (1L<<10) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PARSER_CATCHUP_ENABLE (1L<<11) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_MBUF_ENABLE (1L<<12) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_LOOKUP_ENABLE (1L<<13) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_PROCESSOR_ENABLE (1L<<14) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_V2P_ENABLE (1L<<15) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_BD_CACHE_ENABLE (1L<<16) +#define BNX2_MISC_ENABLE_STATUS_BITS_RX_DMA_ENABLE (1L<<17) +#define BNX2_MISC_ENABLE_STATUS_BITS_COMPLETION_ENABLE (1L<<18) +#define BNX2_MISC_ENABLE_STATUS_BITS_HOST_COALESCE_ENABLE (1L<<19) +#define BNX2_MISC_ENABLE_STATUS_BITS_MAILBOX_QUEUE_ENABLE (1L<<20) +#define BNX2_MISC_ENABLE_STATUS_BITS_CONTEXT_ENABLE (1L<<21) +#define BNX2_MISC_ENABLE_STATUS_BITS_CMD_SCHEDULER_ENABLE (1L<<22) +#define BNX2_MISC_ENABLE_STATUS_BITS_CMD_PROCESSOR_ENABLE (1L<<23) +#define BNX2_MISC_ENABLE_STATUS_BITS_MGMT_PROCESSOR_ENABLE (1L<<24) +#define BNX2_MISC_ENABLE_STATUS_BITS_TIMER_ENABLE (1L<<25) +#define BNX2_MISC_ENABLE_STATUS_BITS_DMA_ENGINE_ENABLE (1L<<26) +#define BNX2_MISC_ENABLE_STATUS_BITS_UMP_ENABLE (1L<<27) +#define BNX2_MISC_ENABLE_STATUS_BITS_RV2P_CMD_SCHEDULER_ENABLE (1L<<28) +#define BNX2_MISC_ENABLE_STATUS_BITS_RSVD_FUTURE_ENABLE (0x7L<<29) + +#define BNX2_MISC_ENABLE_SET_BITS 0x00000810 +#define BNX2_MISC_ENABLE_SET_BITS_TX_SCHEDULER_ENABLE (1L<<0) +#define BNX2_MISC_ENABLE_SET_BITS_TX_BD_READ_ENABLE (1L<<1) +#define BNX2_MISC_ENABLE_SET_BITS_TX_BD_CACHE_ENABLE (1L<<2) +#define BNX2_MISC_ENABLE_SET_BITS_TX_PROCESSOR_ENABLE (1L<<3) +#define BNX2_MISC_ENABLE_SET_BITS_TX_DMA_ENABLE (1L<<4) +#define BNX2_MISC_ENABLE_SET_BITS_TX_PATCHUP_ENABLE (1L<<5) +#define BNX2_MISC_ENABLE_SET_BITS_TX_PAYLOAD_Q_ENABLE (1L<<6) +#define BNX2_MISC_ENABLE_SET_BITS_TX_HEADER_Q_ENABLE (1L<<7) +#define BNX2_MISC_ENABLE_SET_BITS_TX_ASSEMBLER_ENABLE (1L<<8) +#define BNX2_MISC_ENABLE_SET_BITS_EMAC_ENABLE (1L<<9) +#define BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_MAC_ENABLE (1L<<10) +#define BNX2_MISC_ENABLE_SET_BITS_RX_PARSER_CATCHUP_ENABLE (1L<<11) +#define BNX2_MISC_ENABLE_SET_BITS_RX_MBUF_ENABLE (1L<<12) +#define BNX2_MISC_ENABLE_SET_BITS_RX_LOOKUP_ENABLE (1L<<13) +#define BNX2_MISC_ENABLE_SET_BITS_RX_PROCESSOR_ENABLE (1L<<14) +#define BNX2_MISC_ENABLE_SET_BITS_RX_V2P_ENABLE (1L<<15) +#define BNX2_MISC_ENABLE_SET_BITS_RX_BD_CACHE_ENABLE (1L<<16) +#define BNX2_MISC_ENABLE_SET_BITS_RX_DMA_ENABLE (1L<<17) +#define BNX2_MISC_ENABLE_SET_BITS_COMPLETION_ENABLE (1L<<18) +#define BNX2_MISC_ENABLE_SET_BITS_HOST_COALESCE_ENABLE (1L<<19) +#define BNX2_MISC_ENABLE_SET_BITS_MAILBOX_QUEUE_ENABLE (1L<<20) +#define BNX2_MISC_ENABLE_SET_BITS_CONTEXT_ENABLE (1L<<21) +#define BNX2_MISC_ENABLE_SET_BITS_CMD_SCHEDULER_ENABLE (1L<<22) +#define BNX2_MISC_ENABLE_SET_BITS_CMD_PROCESSOR_ENABLE (1L<<23) +#define BNX2_MISC_ENABLE_SET_BITS_MGMT_PROCESSOR_ENABLE (1L<<24) +#define BNX2_MISC_ENABLE_SET_BITS_TIMER_ENABLE (1L<<25) +#define BNX2_MISC_ENABLE_SET_BITS_DMA_ENGINE_ENABLE (1L<<26) +#define BNX2_MISC_ENABLE_SET_BITS_UMP_ENABLE (1L<<27) +#define BNX2_MISC_ENABLE_SET_BITS_RV2P_CMD_SCHEDULER_ENABLE (1L<<28) +#define BNX2_MISC_ENABLE_SET_BITS_RSVD_FUTURE_ENABLE (0x7L<<29) + +#define BNX2_MISC_ENABLE_CLR_BITS 0x00000814 +#define BNX2_MISC_ENABLE_CLR_BITS_TX_SCHEDULER_ENABLE (1L<<0) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_BD_READ_ENABLE (1L<<1) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_BD_CACHE_ENABLE (1L<<2) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_PROCESSOR_ENABLE (1L<<3) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_DMA_ENABLE (1L<<4) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_PATCHUP_ENABLE (1L<<5) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_PAYLOAD_Q_ENABLE (1L<<6) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_HEADER_Q_ENABLE (1L<<7) +#define BNX2_MISC_ENABLE_CLR_BITS_TX_ASSEMBLER_ENABLE (1L<<8) +#define BNX2_MISC_ENABLE_CLR_BITS_EMAC_ENABLE (1L<<9) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_PARSER_MAC_ENABLE (1L<<10) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_PARSER_CATCHUP_ENABLE (1L<<11) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_MBUF_ENABLE (1L<<12) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_LOOKUP_ENABLE (1L<<13) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_PROCESSOR_ENABLE (1L<<14) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_V2P_ENABLE (1L<<15) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_BD_CACHE_ENABLE (1L<<16) +#define BNX2_MISC_ENABLE_CLR_BITS_RX_DMA_ENABLE (1L<<17) +#define BNX2_MISC_ENABLE_CLR_BITS_COMPLETION_ENABLE (1L<<18) +#define BNX2_MISC_ENABLE_CLR_BITS_HOST_COALESCE_ENABLE (1L<<19) +#define BNX2_MISC_ENABLE_CLR_BITS_MAILBOX_QUEUE_ENABLE (1L<<20) +#define BNX2_MISC_ENABLE_CLR_BITS_CONTEXT_ENABLE (1L<<21) +#define BNX2_MISC_ENABLE_CLR_BITS_CMD_SCHEDULER_ENABLE (1L<<22) +#define BNX2_MISC_ENABLE_CLR_BITS_CMD_PROCESSOR_ENABLE (1L<<23) +#define BNX2_MISC_ENABLE_CLR_BITS_MGMT_PROCESSOR_ENABLE (1L<<24) +#define BNX2_MISC_ENABLE_CLR_BITS_TIMER_ENABLE (1L<<25) +#define BNX2_MISC_ENABLE_CLR_BITS_DMA_ENGINE_ENABLE (1L<<26) +#define BNX2_MISC_ENABLE_CLR_BITS_UMP_ENABLE (1L<<27) +#define BNX2_MISC_ENABLE_CLR_BITS_RV2P_CMD_SCHEDULER_ENABLE (1L<<28) +#define BNX2_MISC_ENABLE_CLR_BITS_RSVD_FUTURE_ENABLE (0x7L<<29) + +#define BNX2_MISC_CLOCK_CONTROL_BITS 0x00000818 +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET (0xfL<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_32MHZ (0L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_38MHZ (1L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_48MHZ (2L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_55MHZ (3L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_66MHZ (4L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_80MHZ (5L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_95MHZ (6L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_133MHZ (7L<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_PCI_CLK_SPD_DET_LOW (0xfL<<0) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_DISABLE (1L<<6) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT (1L<<7) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC (0x7L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_UNDEF (0L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_12 (1L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_6 (2L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_SRC_62 (4L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED0_XI (0x7L<<8) +#define BNX2_MISC_CLOCK_CONTROL_BITS_MIN_POWER (1L<<11) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED (0xfL<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_100 (0L<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_80 (1L<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_50 (2L<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_40 (4L<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_25 (8L<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED1_XI (0xfL<<12) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_STOP (1L<<16) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED_17_TE (1L<<17) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED_18_TE (1L<<18) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED_19_TE (1L<<19) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED_TE (0xfffL<<20) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_ALT_MGMT_XI (1L<<17) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED2_XI (0x3fL<<18) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_VCO_XI (0x7L<<24) +#define BNX2_MISC_CLOCK_CONTROL_BITS_RESERVED3_XI (1L<<27) +#define BNX2_MISC_CLOCK_CONTROL_BITS_CORE_CLK_PLL_SPEED_XI (0xfL<<28) + +#define BNX2_MISC_SPIO 0x0000081c +#define BNX2_MISC_SPIO_VALUE (0xffL<<0) +#define BNX2_MISC_SPIO_SET (0xffL<<8) +#define BNX2_MISC_SPIO_CLR (0xffL<<16) +#define BNX2_MISC_SPIO_FLOAT (0xffL<<24) + +#define BNX2_MISC_SPIO_INT 0x00000820 +#define BNX2_MISC_SPIO_INT_INT_STATE_TE (0xfL<<0) +#define BNX2_MISC_SPIO_INT_OLD_VALUE_TE (0xfL<<8) +#define BNX2_MISC_SPIO_INT_OLD_SET_TE (0xfL<<16) +#define BNX2_MISC_SPIO_INT_OLD_CLR_TE (0xfL<<24) +#define BNX2_MISC_SPIO_INT_INT_STATE_XI (0xffL<<0) +#define BNX2_MISC_SPIO_INT_OLD_VALUE_XI (0xffL<<8) +#define BNX2_MISC_SPIO_INT_OLD_SET_XI (0xffL<<16) +#define BNX2_MISC_SPIO_INT_OLD_CLR_XI (0xffL<<24) + +#define BNX2_MISC_CONFIG_LFSR 0x00000824 +#define BNX2_MISC_CONFIG_LFSR_DIV (0xffffL<<0) + +#define BNX2_MISC_LFSR_MASK_BITS 0x00000828 +#define BNX2_MISC_LFSR_MASK_BITS_TX_SCHEDULER_ENABLE (1L<<0) +#define BNX2_MISC_LFSR_MASK_BITS_TX_BD_READ_ENABLE (1L<<1) +#define BNX2_MISC_LFSR_MASK_BITS_TX_BD_CACHE_ENABLE (1L<<2) +#define BNX2_MISC_LFSR_MASK_BITS_TX_PROCESSOR_ENABLE (1L<<3) +#define BNX2_MISC_LFSR_MASK_BITS_TX_DMA_ENABLE (1L<<4) +#define BNX2_MISC_LFSR_MASK_BITS_TX_PATCHUP_ENABLE (1L<<5) +#define BNX2_MISC_LFSR_MASK_BITS_TX_PAYLOAD_Q_ENABLE (1L<<6) +#define BNX2_MISC_LFSR_MASK_BITS_TX_HEADER_Q_ENABLE (1L<<7) +#define BNX2_MISC_LFSR_MASK_BITS_TX_ASSEMBLER_ENABLE (1L<<8) +#define BNX2_MISC_LFSR_MASK_BITS_EMAC_ENABLE (1L<<9) +#define BNX2_MISC_LFSR_MASK_BITS_RX_PARSER_MAC_ENABLE (1L<<10) +#define BNX2_MISC_LFSR_MASK_BITS_RX_PARSER_CATCHUP_ENABLE (1L<<11) +#define BNX2_MISC_LFSR_MASK_BITS_RX_MBUF_ENABLE (1L<<12) +#define BNX2_MISC_LFSR_MASK_BITS_RX_LOOKUP_ENABLE (1L<<13) +#define BNX2_MISC_LFSR_MASK_BITS_RX_PROCESSOR_ENABLE (1L<<14) +#define BNX2_MISC_LFSR_MASK_BITS_RX_V2P_ENABLE (1L<<15) +#define BNX2_MISC_LFSR_MASK_BITS_RX_BD_CACHE_ENABLE (1L<<16) +#define BNX2_MISC_LFSR_MASK_BITS_RX_DMA_ENABLE (1L<<17) +#define BNX2_MISC_LFSR_MASK_BITS_COMPLETION_ENABLE (1L<<18) +#define BNX2_MISC_LFSR_MASK_BITS_HOST_COALESCE_ENABLE (1L<<19) +#define BNX2_MISC_LFSR_MASK_BITS_MAILBOX_QUEUE_ENABLE (1L<<20) +#define BNX2_MISC_LFSR_MASK_BITS_CONTEXT_ENABLE (1L<<21) +#define BNX2_MISC_LFSR_MASK_BITS_CMD_SCHEDULER_ENABLE (1L<<22) +#define BNX2_MISC_LFSR_MASK_BITS_CMD_PROCESSOR_ENABLE (1L<<23) +#define BNX2_MISC_LFSR_MASK_BITS_MGMT_PROCESSOR_ENABLE (1L<<24) +#define BNX2_MISC_LFSR_MASK_BITS_TIMER_ENABLE (1L<<25) +#define BNX2_MISC_LFSR_MASK_BITS_DMA_ENGINE_ENABLE (1L<<26) +#define BNX2_MISC_LFSR_MASK_BITS_UMP_ENABLE (1L<<27) +#define BNX2_MISC_LFSR_MASK_BITS_RV2P_CMD_SCHEDULER_ENABLE (1L<<28) +#define BNX2_MISC_LFSR_MASK_BITS_RSVD_FUTURE_ENABLE (0x7L<<29) + +#define BNX2_MISC_ARB_REQ0 0x0000082c +#define BNX2_MISC_ARB_REQ1 0x00000830 +#define BNX2_MISC_ARB_REQ2 0x00000834 +#define BNX2_MISC_ARB_REQ3 0x00000838 +#define BNX2_MISC_ARB_REQ4 0x0000083c +#define BNX2_MISC_ARB_FREE0 0x00000840 +#define BNX2_MISC_ARB_FREE1 0x00000844 +#define BNX2_MISC_ARB_FREE2 0x00000848 +#define BNX2_MISC_ARB_FREE3 0x0000084c +#define BNX2_MISC_ARB_FREE4 0x00000850 +#define BNX2_MISC_ARB_REQ_STATUS0 0x00000854 +#define BNX2_MISC_ARB_REQ_STATUS1 0x00000858 +#define BNX2_MISC_ARB_REQ_STATUS2 0x0000085c +#define BNX2_MISC_ARB_REQ_STATUS3 0x00000860 +#define BNX2_MISC_ARB_REQ_STATUS4 0x00000864 +#define BNX2_MISC_ARB_GNT0 0x00000868 +#define BNX2_MISC_ARB_GNT0_0 (0x7L<<0) +#define BNX2_MISC_ARB_GNT0_1 (0x7L<<4) +#define BNX2_MISC_ARB_GNT0_2 (0x7L<<8) +#define BNX2_MISC_ARB_GNT0_3 (0x7L<<12) +#define BNX2_MISC_ARB_GNT0_4 (0x7L<<16) +#define BNX2_MISC_ARB_GNT0_5 (0x7L<<20) +#define BNX2_MISC_ARB_GNT0_6 (0x7L<<24) +#define BNX2_MISC_ARB_GNT0_7 (0x7L<<28) + +#define BNX2_MISC_ARB_GNT1 0x0000086c +#define BNX2_MISC_ARB_GNT1_8 (0x7L<<0) +#define BNX2_MISC_ARB_GNT1_9 (0x7L<<4) +#define BNX2_MISC_ARB_GNT1_10 (0x7L<<8) +#define BNX2_MISC_ARB_GNT1_11 (0x7L<<12) +#define BNX2_MISC_ARB_GNT1_12 (0x7L<<16) +#define BNX2_MISC_ARB_GNT1_13 (0x7L<<20) +#define BNX2_MISC_ARB_GNT1_14 (0x7L<<24) +#define BNX2_MISC_ARB_GNT1_15 (0x7L<<28) + +#define BNX2_MISC_ARB_GNT2 0x00000870 +#define BNX2_MISC_ARB_GNT2_16 (0x7L<<0) +#define BNX2_MISC_ARB_GNT2_17 (0x7L<<4) +#define BNX2_MISC_ARB_GNT2_18 (0x7L<<8) +#define BNX2_MISC_ARB_GNT2_19 (0x7L<<12) +#define BNX2_MISC_ARB_GNT2_20 (0x7L<<16) +#define BNX2_MISC_ARB_GNT2_21 (0x7L<<20) +#define BNX2_MISC_ARB_GNT2_22 (0x7L<<24) +#define BNX2_MISC_ARB_GNT2_23 (0x7L<<28) + +#define BNX2_MISC_ARB_GNT3 0x00000874 +#define BNX2_MISC_ARB_GNT3_24 (0x7L<<0) +#define BNX2_MISC_ARB_GNT3_25 (0x7L<<4) +#define BNX2_MISC_ARB_GNT3_26 (0x7L<<8) +#define BNX2_MISC_ARB_GNT3_27 (0x7L<<12) +#define BNX2_MISC_ARB_GNT3_28 (0x7L<<16) +#define BNX2_MISC_ARB_GNT3_29 (0x7L<<20) +#define BNX2_MISC_ARB_GNT3_30 (0x7L<<24) +#define BNX2_MISC_ARB_GNT3_31 (0x7L<<28) + +#define BNX2_MISC_RESERVED1 0x00000878 +#define BNX2_MISC_RESERVED1_MISC_RESERVED1_VALUE (0x3fL<<0) + +#define BNX2_MISC_RESERVED2 0x0000087c +#define BNX2_MISC_RESERVED2_PCIE_DIS (1L<<0) +#define BNX2_MISC_RESERVED2_LINK_IN_L23 (1L<<1) + +#define BNX2_MISC_SM_ASF_CONTROL 0x00000880 +#define BNX2_MISC_SM_ASF_CONTROL_ASF_RST (1L<<0) +#define BNX2_MISC_SM_ASF_CONTROL_TSC_EN (1L<<1) +#define BNX2_MISC_SM_ASF_CONTROL_WG_TO (1L<<2) +#define BNX2_MISC_SM_ASF_CONTROL_HB_TO (1L<<3) +#define BNX2_MISC_SM_ASF_CONTROL_PA_TO (1L<<4) +#define BNX2_MISC_SM_ASF_CONTROL_PL_TO (1L<<5) +#define BNX2_MISC_SM_ASF_CONTROL_RT_TO (1L<<6) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_EVENT (1L<<7) +#define BNX2_MISC_SM_ASF_CONTROL_STRETCH_EN (1L<<8) +#define BNX2_MISC_SM_ASF_CONTROL_STRETCH_PULSE (1L<<9) +#define BNX2_MISC_SM_ASF_CONTROL_RES (0x3L<<10) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_EN (1L<<12) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_BB_EN (1L<<13) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_NO_ADDR_FILT (1L<<14) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_AUTOREAD (1L<<15) +#define BNX2_MISC_SM_ASF_CONTROL_NIC_SMB_ADDR1 (0x7fL<<16) +#define BNX2_MISC_SM_ASF_CONTROL_NIC_SMB_ADDR2 (0x7fL<<23) +#define BNX2_MISC_SM_ASF_CONTROL_EN_NIC_SMB_ADDR_0 (1L<<30) +#define BNX2_MISC_SM_ASF_CONTROL_SMB_EARLY_ATTN (1L<<31) + +#define BNX2_MISC_SMB_IN 0x00000884 +#define BNX2_MISC_SMB_IN_DAT_IN (0xffL<<0) +#define BNX2_MISC_SMB_IN_RDY (1L<<8) +#define BNX2_MISC_SMB_IN_DONE (1L<<9) +#define BNX2_MISC_SMB_IN_FIRSTBYTE (1L<<10) +#define BNX2_MISC_SMB_IN_STATUS (0x7L<<11) +#define BNX2_MISC_SMB_IN_STATUS_OK (0x0L<<11) +#define BNX2_MISC_SMB_IN_STATUS_PEC (0x1L<<11) +#define BNX2_MISC_SMB_IN_STATUS_OFLOW (0x2L<<11) +#define BNX2_MISC_SMB_IN_STATUS_STOP (0x3L<<11) +#define BNX2_MISC_SMB_IN_STATUS_TIMEOUT (0x4L<<11) + +#define BNX2_MISC_SMB_OUT 0x00000888 +#define BNX2_MISC_SMB_OUT_DAT_OUT (0xffL<<0) +#define BNX2_MISC_SMB_OUT_RDY (1L<<8) +#define BNX2_MISC_SMB_OUT_START (1L<<9) +#define BNX2_MISC_SMB_OUT_LAST (1L<<10) +#define BNX2_MISC_SMB_OUT_ACC_TYPE (1L<<11) +#define BNX2_MISC_SMB_OUT_ENB_PEC (1L<<12) +#define BNX2_MISC_SMB_OUT_GET_RX_LEN (1L<<13) +#define BNX2_MISC_SMB_OUT_SMB_READ_LEN (0x3fL<<14) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS (0xfL<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_OK (0L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_FIRST_NACK (1L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_UFLOW (2L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_STOP (3L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_TIMEOUT (4L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_FIRST_LOST (5L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_BADACK (6L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_SUB_NACK (9L<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_STATUS_SUB_LOST (0xdL<<20) +#define BNX2_MISC_SMB_OUT_SMB_OUT_SLAVEMODE (1L<<24) +#define BNX2_MISC_SMB_OUT_SMB_OUT_DAT_EN (1L<<25) +#define BNX2_MISC_SMB_OUT_SMB_OUT_DAT_IN (1L<<26) +#define BNX2_MISC_SMB_OUT_SMB_OUT_CLK_EN (1L<<27) +#define BNX2_MISC_SMB_OUT_SMB_OUT_CLK_IN (1L<<28) + +#define BNX2_MISC_SMB_WATCHDOG 0x0000088c +#define BNX2_MISC_SMB_WATCHDOG_WATCHDOG (0xffffL<<0) + +#define BNX2_MISC_SMB_HEARTBEAT 0x00000890 +#define BNX2_MISC_SMB_HEARTBEAT_HEARTBEAT (0xffffL<<0) + +#define BNX2_MISC_SMB_POLL_ASF 0x00000894 +#define BNX2_MISC_SMB_POLL_ASF_POLL_ASF (0xffffL<<0) + +#define BNX2_MISC_SMB_POLL_LEGACY 0x00000898 +#define BNX2_MISC_SMB_POLL_LEGACY_POLL_LEGACY (0xffffL<<0) + +#define BNX2_MISC_SMB_RETRAN 0x0000089c +#define BNX2_MISC_SMB_RETRAN_RETRAN (0xffL<<0) + +#define BNX2_MISC_SMB_TIMESTAMP 0x000008a0 +#define BNX2_MISC_SMB_TIMESTAMP_TIMESTAMP (0xffffffffL<<0) + +#define BNX2_MISC_PERR_ENA0 0x000008a4 +#define BNX2_MISC_PERR_ENA0_COM_MISC_CTXC (1L<<0) +#define BNX2_MISC_PERR_ENA0_COM_MISC_REGF (1L<<1) +#define BNX2_MISC_PERR_ENA0_COM_MISC_SCPAD (1L<<2) +#define BNX2_MISC_PERR_ENA0_CP_MISC_CTXC (1L<<3) +#define BNX2_MISC_PERR_ENA0_CP_MISC_REGF (1L<<4) +#define BNX2_MISC_PERR_ENA0_CP_MISC_SCPAD (1L<<5) +#define BNX2_MISC_PERR_ENA0_CS_MISC_TMEM (1L<<6) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM0 (1L<<7) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM1 (1L<<8) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM2 (1L<<9) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM3 (1L<<10) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM4 (1L<<11) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_ACCM5 (1L<<12) +#define BNX2_MISC_PERR_ENA0_CTX_MISC_PGTBL (1L<<13) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR0 (1L<<14) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR1 (1L<<15) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR2 (1L<<16) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR3 (1L<<17) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DR4 (1L<<18) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW0 (1L<<19) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW1 (1L<<20) +#define BNX2_MISC_PERR_ENA0_DMAE_MISC_DW2 (1L<<21) +#define BNX2_MISC_PERR_ENA0_HC_MISC_DMA (1L<<22) +#define BNX2_MISC_PERR_ENA0_MCP_MISC_REGF (1L<<23) +#define BNX2_MISC_PERR_ENA0_MCP_MISC_SCPAD (1L<<24) +#define BNX2_MISC_PERR_ENA0_MQ_MISC_CTX (1L<<25) +#define BNX2_MISC_PERR_ENA0_RBDC_MISC (1L<<26) +#define BNX2_MISC_PERR_ENA0_RBUF_MISC_MB (1L<<27) +#define BNX2_MISC_PERR_ENA0_RBUF_MISC_PTR (1L<<28) +#define BNX2_MISC_PERR_ENA0_RDE_MISC_RPC (1L<<29) +#define BNX2_MISC_PERR_ENA0_RDE_MISC_RPM (1L<<30) +#define BNX2_MISC_PERR_ENA0_RV2P_MISC_CB0REGS (1L<<31) +#define BNX2_MISC_PERR_ENA0_COM_DMAE_PERR_EN_XI (1L<<0) +#define BNX2_MISC_PERR_ENA0_CP_DMAE_PERR_EN_XI (1L<<1) +#define BNX2_MISC_PERR_ENA0_RPM_ACPIBEMEM_PERR_EN_XI (1L<<2) +#define BNX2_MISC_PERR_ENA0_CTX_USAGE_CNT_PERR_EN_XI (1L<<3) +#define BNX2_MISC_PERR_ENA0_CTX_PGTBL_PERR_EN_XI (1L<<4) +#define BNX2_MISC_PERR_ENA0_CTX_CACHE_PERR_EN_XI (1L<<5) +#define BNX2_MISC_PERR_ENA0_CTX_MIRROR_PERR_EN_XI (1L<<6) +#define BNX2_MISC_PERR_ENA0_COM_CTXC_PERR_EN_XI (1L<<7) +#define BNX2_MISC_PERR_ENA0_COM_SCPAD_PERR_EN_XI (1L<<8) +#define BNX2_MISC_PERR_ENA0_CP_CTXC_PERR_EN_XI (1L<<9) +#define BNX2_MISC_PERR_ENA0_CP_SCPAD_PERR_EN_XI (1L<<10) +#define BNX2_MISC_PERR_ENA0_RXP_RBUFC_PERR_EN_XI (1L<<11) +#define BNX2_MISC_PERR_ENA0_RXP_CTXC_PERR_EN_XI (1L<<12) +#define BNX2_MISC_PERR_ENA0_RXP_SCPAD_PERR_EN_XI (1L<<13) +#define BNX2_MISC_PERR_ENA0_TPAT_SCPAD_PERR_EN_XI (1L<<14) +#define BNX2_MISC_PERR_ENA0_TXP_CTXC_PERR_EN_XI (1L<<15) +#define BNX2_MISC_PERR_ENA0_TXP_SCPAD_PERR_EN_XI (1L<<16) +#define BNX2_MISC_PERR_ENA0_CS_TMEM_PERR_EN_XI (1L<<17) +#define BNX2_MISC_PERR_ENA0_MQ_CTX_PERR_EN_XI (1L<<18) +#define BNX2_MISC_PERR_ENA0_RPM_DFIFOMEM_PERR_EN_XI (1L<<19) +#define BNX2_MISC_PERR_ENA0_RPC_DFIFOMEM_PERR_EN_XI (1L<<20) +#define BNX2_MISC_PERR_ENA0_RBUF_PTRMEM_PERR_EN_XI (1L<<21) +#define BNX2_MISC_PERR_ENA0_RBUF_DATAMEM_PERR_EN_XI (1L<<22) +#define BNX2_MISC_PERR_ENA0_RV2P_P2IRAM_PERR_EN_XI (1L<<23) +#define BNX2_MISC_PERR_ENA0_RV2P_P1IRAM_PERR_EN_XI (1L<<24) +#define BNX2_MISC_PERR_ENA0_RV2P_CB1REGS_PERR_EN_XI (1L<<25) +#define BNX2_MISC_PERR_ENA0_RV2P_CB0REGS_PERR_EN_XI (1L<<26) +#define BNX2_MISC_PERR_ENA0_TPBUF_PERR_EN_XI (1L<<27) +#define BNX2_MISC_PERR_ENA0_THBUF_PERR_EN_XI (1L<<28) +#define BNX2_MISC_PERR_ENA0_TDMA_PERR_EN_XI (1L<<29) +#define BNX2_MISC_PERR_ENA0_TBDC_PERR_EN_XI (1L<<30) +#define BNX2_MISC_PERR_ENA0_TSCH_LR_PERR_EN_XI (1L<<31) + +#define BNX2_MISC_PERR_ENA1 0x000008a8 +#define BNX2_MISC_PERR_ENA1_RV2P_MISC_CB1REGS (1L<<0) +#define BNX2_MISC_PERR_ENA1_RV2P_MISC_P1IRAM (1L<<1) +#define BNX2_MISC_PERR_ENA1_RV2P_MISC_P2IRAM (1L<<2) +#define BNX2_MISC_PERR_ENA1_RXP_MISC_CTXC (1L<<3) +#define BNX2_MISC_PERR_ENA1_RXP_MISC_REGF (1L<<4) +#define BNX2_MISC_PERR_ENA1_RXP_MISC_SCPAD (1L<<5) +#define BNX2_MISC_PERR_ENA1_RXP_MISC_RBUFC (1L<<6) +#define BNX2_MISC_PERR_ENA1_TBDC_MISC (1L<<7) +#define BNX2_MISC_PERR_ENA1_TDMA_MISC (1L<<8) +#define BNX2_MISC_PERR_ENA1_THBUF_MISC_MB0 (1L<<9) +#define BNX2_MISC_PERR_ENA1_THBUF_MISC_MB1 (1L<<10) +#define BNX2_MISC_PERR_ENA1_TPAT_MISC_REGF (1L<<11) +#define BNX2_MISC_PERR_ENA1_TPAT_MISC_SCPAD (1L<<12) +#define BNX2_MISC_PERR_ENA1_TPBUF_MISC_MB (1L<<13) +#define BNX2_MISC_PERR_ENA1_TSCH_MISC_LR (1L<<14) +#define BNX2_MISC_PERR_ENA1_TXP_MISC_CTXC (1L<<15) +#define BNX2_MISC_PERR_ENA1_TXP_MISC_REGF (1L<<16) +#define BNX2_MISC_PERR_ENA1_TXP_MISC_SCPAD (1L<<17) +#define BNX2_MISC_PERR_ENA1_UMP_MISC_FIORX (1L<<18) +#define BNX2_MISC_PERR_ENA1_UMP_MISC_FIOTX (1L<<19) +#define BNX2_MISC_PERR_ENA1_UMP_MISC_RX (1L<<20) +#define BNX2_MISC_PERR_ENA1_UMP_MISC_TX (1L<<21) +#define BNX2_MISC_PERR_ENA1_RDMAQ_MISC (1L<<22) +#define BNX2_MISC_PERR_ENA1_CSQ_MISC (1L<<23) +#define BNX2_MISC_PERR_ENA1_CPQ_MISC (1L<<24) +#define BNX2_MISC_PERR_ENA1_MCPQ_MISC (1L<<25) +#define BNX2_MISC_PERR_ENA1_RV2PMQ_MISC (1L<<26) +#define BNX2_MISC_PERR_ENA1_RV2PPQ_MISC (1L<<27) +#define BNX2_MISC_PERR_ENA1_RV2PTQ_MISC (1L<<28) +#define BNX2_MISC_PERR_ENA1_RXPQ_MISC (1L<<29) +#define BNX2_MISC_PERR_ENA1_RXPCQ_MISC (1L<<30) +#define BNX2_MISC_PERR_ENA1_RLUPQ_MISC (1L<<31) +#define BNX2_MISC_PERR_ENA1_RBDC_PERR_EN_XI (1L<<0) +#define BNX2_MISC_PERR_ENA1_RDMA_DFIFO_PERR_EN_XI (1L<<2) +#define BNX2_MISC_PERR_ENA1_HC_STATS_PERR_EN_XI (1L<<3) +#define BNX2_MISC_PERR_ENA1_HC_MSIX_PERR_EN_XI (1L<<4) +#define BNX2_MISC_PERR_ENA1_HC_PRODUCSTB_PERR_EN_XI (1L<<5) +#define BNX2_MISC_PERR_ENA1_HC_CONSUMSTB_PERR_EN_XI (1L<<6) +#define BNX2_MISC_PERR_ENA1_TPATQ_PERR_EN_XI (1L<<7) +#define BNX2_MISC_PERR_ENA1_MCPQ_PERR_EN_XI (1L<<8) +#define BNX2_MISC_PERR_ENA1_TDMAQ_PERR_EN_XI (1L<<9) +#define BNX2_MISC_PERR_ENA1_TXPQ_PERR_EN_XI (1L<<10) +#define BNX2_MISC_PERR_ENA1_COMTQ_PERR_EN_XI (1L<<11) +#define BNX2_MISC_PERR_ENA1_COMQ_PERR_EN_XI (1L<<12) +#define BNX2_MISC_PERR_ENA1_RLUPQ_PERR_EN_XI (1L<<13) +#define BNX2_MISC_PERR_ENA1_RXPQ_PERR_EN_XI (1L<<14) +#define BNX2_MISC_PERR_ENA1_RV2PPQ_PERR_EN_XI (1L<<15) +#define BNX2_MISC_PERR_ENA1_RDMAQ_PERR_EN_XI (1L<<16) +#define BNX2_MISC_PERR_ENA1_TASQ_PERR_EN_XI (1L<<17) +#define BNX2_MISC_PERR_ENA1_TBDRQ_PERR_EN_XI (1L<<18) +#define BNX2_MISC_PERR_ENA1_TSCHQ_PERR_EN_XI (1L<<19) +#define BNX2_MISC_PERR_ENA1_COMXQ_PERR_EN_XI (1L<<20) +#define BNX2_MISC_PERR_ENA1_RXPCQ_PERR_EN_XI (1L<<21) +#define BNX2_MISC_PERR_ENA1_RV2PTQ_PERR_EN_XI (1L<<22) +#define BNX2_MISC_PERR_ENA1_RV2PMQ_PERR_EN_XI (1L<<23) +#define BNX2_MISC_PERR_ENA1_CPQ_PERR_EN_XI (1L<<24) +#define BNX2_MISC_PERR_ENA1_CSQ_PERR_EN_XI (1L<<25) +#define BNX2_MISC_PERR_ENA1_RLUP_CID_PERR_EN_XI (1L<<26) +#define BNX2_MISC_PERR_ENA1_RV2PCS_TMEM_PERR_EN_XI (1L<<27) +#define BNX2_MISC_PERR_ENA1_RV2PCSQ_PERR_EN_XI (1L<<28) +#define BNX2_MISC_PERR_ENA1_MQ_IDX_PERR_EN_XI (1L<<29) + +#define BNX2_MISC_PERR_ENA2 0x000008ac +#define BNX2_MISC_PERR_ENA2_COMQ_MISC (1L<<0) +#define BNX2_MISC_PERR_ENA2_COMXQ_MISC (1L<<1) +#define BNX2_MISC_PERR_ENA2_COMTQ_MISC (1L<<2) +#define BNX2_MISC_PERR_ENA2_TSCHQ_MISC (1L<<3) +#define BNX2_MISC_PERR_ENA2_TBDRQ_MISC (1L<<4) +#define BNX2_MISC_PERR_ENA2_TXPQ_MISC (1L<<5) +#define BNX2_MISC_PERR_ENA2_TDMAQ_MISC (1L<<6) +#define BNX2_MISC_PERR_ENA2_TPATQ_MISC (1L<<7) +#define BNX2_MISC_PERR_ENA2_TASQ_MISC (1L<<8) +#define BNX2_MISC_PERR_ENA2_TGT_FIFO_PERR_EN_XI (1L<<0) +#define BNX2_MISC_PERR_ENA2_UMP_TX_PERR_EN_XI (1L<<1) +#define BNX2_MISC_PERR_ENA2_UMP_RX_PERR_EN_XI (1L<<2) +#define BNX2_MISC_PERR_ENA2_MCP_ROM_PERR_EN_XI (1L<<3) +#define BNX2_MISC_PERR_ENA2_MCP_SCPAD_PERR_EN_XI (1L<<4) +#define BNX2_MISC_PERR_ENA2_HB_MEM_PERR_EN_XI (1L<<5) +#define BNX2_MISC_PERR_ENA2_PCIE_REPLAY_PERR_EN_XI (1L<<6) + +#define BNX2_MISC_DEBUG_VECTOR_SEL 0x000008b0 +#define BNX2_MISC_DEBUG_VECTOR_SEL_0 (0xfffL<<0) +#define BNX2_MISC_DEBUG_VECTOR_SEL_1 (0xfffL<<12) +#define BNX2_MISC_DEBUG_VECTOR_SEL_1_XI (0xfffL<<15) + +#define BNX2_MISC_VREG_CONTROL 0x000008b4 +#define BNX2_MISC_VREG_CONTROL_1_2 (0xfL<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_XI (0xfL<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS14_XI (0L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS12_XI (1L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS10_XI (2L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS8_XI (3L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS6_XI (4L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS4_XI (5L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_PLUS2_XI (6L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_NOM_XI (7L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS2_XI (8L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS4_XI (9L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS6_XI (10L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS8_XI (11L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS10_XI (12L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS12_XI (13L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS14_XI (14L<<0) +#define BNX2_MISC_VREG_CONTROL_1_0_MAIN_MINUS16_XI (15L<<0) +#define BNX2_MISC_VREG_CONTROL_2_5 (0xfL<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS14 (0L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS12 (1L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS10 (2L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS8 (3L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS6 (4L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS4 (5L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_PLUS2 (6L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_NOM (7L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS2 (8L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS4 (9L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS6 (10L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS8 (11L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS10 (12L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS12 (13L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS14 (14L<<4) +#define BNX2_MISC_VREG_CONTROL_2_5_MINUS16 (15L<<4) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT (0xfL<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS14 (0L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS12 (1L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS10 (2L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS8 (3L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS6 (4L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS4 (5L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_PLUS2 (6L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_NOM (7L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS2 (8L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS4 (9L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS6 (10L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS8 (11L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS10 (12L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS12 (13L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS14 (14L<<8) +#define BNX2_MISC_VREG_CONTROL_1_0_MGMT_MINUS16 (15L<<8) + +#define BNX2_MISC_FINAL_CLK_CTL_VAL 0x000008b8 +#define BNX2_MISC_FINAL_CLK_CTL_VAL_MISC_FINAL_CLK_CTL_VAL (0x3ffffffL<<6) + +#define BNX2_MISC_GP_HW_CTL0 0x000008bc +#define BNX2_MISC_GP_HW_CTL0_TX_DRIVE (1L<<0) +#define BNX2_MISC_GP_HW_CTL0_RMII_MODE (1L<<1) +#define BNX2_MISC_GP_HW_CTL0_RMII_CRSDV_SEL (1L<<2) +#define BNX2_MISC_GP_HW_CTL0_RVMII_MODE (1L<<3) +#define BNX2_MISC_GP_HW_CTL0_FLASH_SAMP_SCLK_NEGEDGE_TE (1L<<4) +#define BNX2_MISC_GP_HW_CTL0_HIDDEN_REVISION_ID_TE (1L<<5) +#define BNX2_MISC_GP_HW_CTL0_HC_CNTL_TMOUT_CTR_RST_TE (1L<<6) +#define BNX2_MISC_GP_HW_CTL0_RESERVED1_XI (0x7L<<4) +#define BNX2_MISC_GP_HW_CTL0_ENA_CORE_RST_ON_MAIN_PWR_GOING_AWAY (1L<<7) +#define BNX2_MISC_GP_HW_CTL0_ENA_SEL_VAUX_B_IN_L2_TE (1L<<8) +#define BNX2_MISC_GP_HW_CTL0_GRC_BNK_FREE_FIX_TE (1L<<9) +#define BNX2_MISC_GP_HW_CTL0_LED_ACT_SEL_TE (1L<<10) +#define BNX2_MISC_GP_HW_CTL0_RESERVED2_XI (0x7L<<8) +#define BNX2_MISC_GP_HW_CTL0_UP1_DEF0 (1L<<11) +#define BNX2_MISC_GP_HW_CTL0_FIBER_MODE_DIS_DEF (1L<<12) +#define BNX2_MISC_GP_HW_CTL0_FORCE2500_DEF (1L<<13) +#define BNX2_MISC_GP_HW_CTL0_AUTODETECT_DIS_DEF (1L<<14) +#define BNX2_MISC_GP_HW_CTL0_PARALLEL_DETECT_DEF (1L<<15) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI (0xfL<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_3MA (0L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_2P5MA (1L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_2P0MA (3L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_1P5MA (5L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_1P0MA (7L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_DAI_PWRDN (15L<<16) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PRE2DIS (1L<<20) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PRE1DIS (1L<<21) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_CTAT (0x3L<<22) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_CTAT_M6P (0L<<22) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_CTAT_M0P (1L<<22) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_CTAT_P0P (2L<<22) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_CTAT_P6P (3L<<22) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PTAT (0x3L<<24) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PTAT_M6P (0L<<24) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PTAT_M0P (1L<<24) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PTAT_P0P (2L<<24) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_PTAT_P6P (3L<<24) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_IAMP_ADJ (0x3L<<26) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_IAMP_ADJ_240UA (0L<<26) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_IAMP_ADJ_160UA (1L<<26) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_IAMP_ADJ_400UA (2L<<26) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_IAMP_ADJ_320UA (3L<<26) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_ICBUF_ADJ (0x3L<<28) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_ICBUF_ADJ_240UA (0L<<28) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_ICBUF_ADJ_160UA (1L<<28) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_ICBUF_ADJ_400UA (2L<<28) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_ICBUF_ADJ_320UA (3L<<28) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_XTAL_ADJ (0x3L<<30) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_XTAL_ADJ_1P57 (0L<<30) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_XTAL_ADJ_1P45 (1L<<30) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_XTAL_ADJ_1P62 (2L<<30) +#define BNX2_MISC_GP_HW_CTL0_OSCCTRL_XTAL_ADJ_1P66 (3L<<30) + +#define BNX2_MISC_GP_HW_CTL1 0x000008c0 +#define BNX2_MISC_GP_HW_CTL1_1_ATTN_BTN_PRSNT_TE (1L<<0) +#define BNX2_MISC_GP_HW_CTL1_1_ATTN_IND_PRSNT_TE (1L<<1) +#define BNX2_MISC_GP_HW_CTL1_1_PWR_IND_PRSNT_TE (1L<<2) +#define BNX2_MISC_GP_HW_CTL1_0_PCIE_LOOPBACK_TE (1L<<3) +#define BNX2_MISC_GP_HW_CTL1_RESERVED_SOFT_XI (0xffffL<<0) +#define BNX2_MISC_GP_HW_CTL1_RESERVED_HARD_XI (0xffffL<<16) + +#define BNX2_MISC_NEW_HW_CTL 0x000008c4 +#define BNX2_MISC_NEW_HW_CTL_MAIN_POR_BYPASS (1L<<0) +#define BNX2_MISC_NEW_HW_CTL_RINGOSC_ENABLE (1L<<1) +#define BNX2_MISC_NEW_HW_CTL_RINGOSC_SEL0 (1L<<2) +#define BNX2_MISC_NEW_HW_CTL_RINGOSC_SEL1 (1L<<3) +#define BNX2_MISC_NEW_HW_CTL_RESERVED_SHARED (0xfffL<<4) +#define BNX2_MISC_NEW_HW_CTL_RESERVED_SPLIT (0xffffL<<16) + +#define BNX2_MISC_NEW_CORE_CTL 0x000008c8 +#define BNX2_MISC_NEW_CORE_CTL_LINK_HOLDOFF_SUCCESS (1L<<0) +#define BNX2_MISC_NEW_CORE_CTL_LINK_HOLDOFF_REQ (1L<<1) +#define BNX2_MISC_NEW_CORE_CTL_DMA_ENABLE (1L<<16) +#define BNX2_MISC_NEW_CORE_CTL_RESERVED_CMN (0x3fffL<<2) +#define BNX2_MISC_NEW_CORE_CTL_RESERVED_TC (0xffffL<<16) + +#define BNX2_MISC_ECO_HW_CTL 0x000008cc +#define BNX2_MISC_ECO_HW_CTL_LARGE_GRC_TMOUT_EN (1L<<0) +#define BNX2_MISC_ECO_HW_CTL_RESERVED_SOFT (0x7fffL<<1) +#define BNX2_MISC_ECO_HW_CTL_RESERVED_HARD (0xffffL<<16) + +#define BNX2_MISC_ECO_CORE_CTL 0x000008d0 +#define BNX2_MISC_ECO_CORE_CTL_RESERVED_SOFT (0xffffL<<0) +#define BNX2_MISC_ECO_CORE_CTL_RESERVED_HARD (0xffffL<<16) + +#define BNX2_MISC_PPIO 0x000008d4 +#define BNX2_MISC_PPIO_VALUE (0xfL<<0) +#define BNX2_MISC_PPIO_SET (0xfL<<8) +#define BNX2_MISC_PPIO_CLR (0xfL<<16) +#define BNX2_MISC_PPIO_FLOAT (0xfL<<24) + +#define BNX2_MISC_PPIO_INT 0x000008d8 +#define BNX2_MISC_PPIO_INT_INT_STATE (0xfL<<0) +#define BNX2_MISC_PPIO_INT_OLD_VALUE (0xfL<<8) +#define BNX2_MISC_PPIO_INT_OLD_SET (0xfL<<16) +#define BNX2_MISC_PPIO_INT_OLD_CLR (0xfL<<24) + +#define BNX2_MISC_RESET_NUMS 0x000008dc +#define BNX2_MISC_RESET_NUMS_NUM_HARD_RESETS (0x7L<<0) +#define BNX2_MISC_RESET_NUMS_NUM_PCIE_RESETS (0x7L<<4) +#define BNX2_MISC_RESET_NUMS_NUM_PERSTB_RESETS (0x7L<<8) +#define BNX2_MISC_RESET_NUMS_NUM_CMN_RESETS (0x7L<<12) +#define BNX2_MISC_RESET_NUMS_NUM_PORT_RESETS (0x7L<<16) + +#define BNX2_MISC_CS16_ERR 0x000008e0 +#define BNX2_MISC_CS16_ERR_ENA_PCI (1L<<0) +#define BNX2_MISC_CS16_ERR_ENA_RDMA (1L<<1) +#define BNX2_MISC_CS16_ERR_ENA_TDMA (1L<<2) +#define BNX2_MISC_CS16_ERR_ENA_EMAC (1L<<3) +#define BNX2_MISC_CS16_ERR_ENA_CTX (1L<<4) +#define BNX2_MISC_CS16_ERR_ENA_TBDR (1L<<5) +#define BNX2_MISC_CS16_ERR_ENA_RBDC (1L<<6) +#define BNX2_MISC_CS16_ERR_ENA_COM (1L<<7) +#define BNX2_MISC_CS16_ERR_ENA_CP (1L<<8) +#define BNX2_MISC_CS16_ERR_STA_PCI (1L<<16) +#define BNX2_MISC_CS16_ERR_STA_RDMA (1L<<17) +#define BNX2_MISC_CS16_ERR_STA_TDMA (1L<<18) +#define BNX2_MISC_CS16_ERR_STA_EMAC (1L<<19) +#define BNX2_MISC_CS16_ERR_STA_CTX (1L<<20) +#define BNX2_MISC_CS16_ERR_STA_TBDR (1L<<21) +#define BNX2_MISC_CS16_ERR_STA_RBDC (1L<<22) +#define BNX2_MISC_CS16_ERR_STA_COM (1L<<23) +#define BNX2_MISC_CS16_ERR_STA_CP (1L<<24) + +#define BNX2_MISC_SPIO_EVENT 0x000008e4 +#define BNX2_MISC_SPIO_EVENT_ENABLE (0xffL<<0) + +#define BNX2_MISC_PPIO_EVENT 0x000008e8 +#define BNX2_MISC_PPIO_EVENT_ENABLE (0xfL<<0) + +#define BNX2_MISC_DUAL_MEDIA_CTRL 0x000008ec +#define BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID (0xffL<<0) +#define BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_X (0L<<0) +#define BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_C (3L<<0) +#define BNX2_MISC_DUAL_MEDIA_CTRL_BOND_ID_S (12L<<0) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL_STRAP (0x7L<<8) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PORT_SWAP_PIN (1L<<11) +#define BNX2_MISC_DUAL_MEDIA_CTRL_SERDES1_SIGDET (1L<<12) +#define BNX2_MISC_DUAL_MEDIA_CTRL_SERDES0_SIGDET (1L<<13) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY1_SIGDET (1L<<14) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY0_SIGDET (1L<<15) +#define BNX2_MISC_DUAL_MEDIA_CTRL_LCPLL_RST (1L<<16) +#define BNX2_MISC_DUAL_MEDIA_CTRL_SERDES1_RST (1L<<17) +#define BNX2_MISC_DUAL_MEDIA_CTRL_SERDES0_RST (1L<<18) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY1_RST (1L<<19) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY0_RST (1L<<20) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_CTRL (0x7L<<21) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PORT_SWAP (1L<<24) +#define BNX2_MISC_DUAL_MEDIA_CTRL_STRAP_OVERRIDE (1L<<25) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ (0xfL<<26) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_SER1_IDDQ (1L<<26) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_SER0_IDDQ (2L<<26) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_PHY1_IDDQ (4L<<26) +#define BNX2_MISC_DUAL_MEDIA_CTRL_PHY_SERDES_IDDQ_PHY0_IDDQ (8L<<26) + +#define BNX2_MISC_OTP_CMD1 0x000008f0 +#define BNX2_MISC_OTP_CMD1_FMODE (0x7L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_IDLE (0L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_WRITE (1L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_INIT (2L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_SET (3L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_RST (4L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_VERIFY (5L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_RESERVED0 (6L<<0) +#define BNX2_MISC_OTP_CMD1_FMODE_RESERVED1 (7L<<0) +#define BNX2_MISC_OTP_CMD1_USEPINS (1L<<8) +#define BNX2_MISC_OTP_CMD1_PROGSEL (1L<<9) +#define BNX2_MISC_OTP_CMD1_PROGSTART (1L<<10) +#define BNX2_MISC_OTP_CMD1_PCOUNT (0x7L<<16) +#define BNX2_MISC_OTP_CMD1_PBYP (1L<<19) +#define BNX2_MISC_OTP_CMD1_VSEL (0xfL<<20) +#define BNX2_MISC_OTP_CMD1_TM (0x7L<<27) +#define BNX2_MISC_OTP_CMD1_SADBYP (1L<<30) +#define BNX2_MISC_OTP_CMD1_DEBUG (1L<<31) + +#define BNX2_MISC_OTP_CMD2 0x000008f4 +#define BNX2_MISC_OTP_CMD2_OTP_ROM_ADDR (0x3ffL<<0) +#define BNX2_MISC_OTP_CMD2_DOSEL (0x7fL<<16) +#define BNX2_MISC_OTP_CMD2_DOSEL_0 (0L<<16) +#define BNX2_MISC_OTP_CMD2_DOSEL_1 (1L<<16) +#define BNX2_MISC_OTP_CMD2_DOSEL_127 (127L<<16) + +#define BNX2_MISC_OTP_STATUS 0x000008f8 +#define BNX2_MISC_OTP_STATUS_DATA (0xffL<<0) +#define BNX2_MISC_OTP_STATUS_VALID (1L<<8) +#define BNX2_MISC_OTP_STATUS_BUSY (1L<<9) +#define BNX2_MISC_OTP_STATUS_BUSYSM (1L<<10) +#define BNX2_MISC_OTP_STATUS_DONE (1L<<11) + +#define BNX2_MISC_OTP_SHIFT1_CMD 0x000008fc +#define BNX2_MISC_OTP_SHIFT1_CMD_RESET_MODE_N (1L<<0) +#define BNX2_MISC_OTP_SHIFT1_CMD_SHIFT_DONE (1L<<1) +#define BNX2_MISC_OTP_SHIFT1_CMD_SHIFT_START (1L<<2) +#define BNX2_MISC_OTP_SHIFT1_CMD_LOAD_DATA (1L<<3) +#define BNX2_MISC_OTP_SHIFT1_CMD_SHIFT_SELECT (0x1fL<<8) + +#define BNX2_MISC_OTP_SHIFT1_DATA 0x00000900 +#define BNX2_MISC_OTP_SHIFT2_CMD 0x00000904 +#define BNX2_MISC_OTP_SHIFT2_CMD_RESET_MODE_N (1L<<0) +#define BNX2_MISC_OTP_SHIFT2_CMD_SHIFT_DONE (1L<<1) +#define BNX2_MISC_OTP_SHIFT2_CMD_SHIFT_START (1L<<2) +#define BNX2_MISC_OTP_SHIFT2_CMD_LOAD_DATA (1L<<3) +#define BNX2_MISC_OTP_SHIFT2_CMD_SHIFT_SELECT (0x1fL<<8) + +#define BNX2_MISC_OTP_SHIFT2_DATA 0x00000908 +#define BNX2_MISC_BIST_CS0 0x0000090c +#define BNX2_MISC_BIST_CS0_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS0_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS0_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS0_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS0_MBIST_GO (1L<<9) +#define BNX2_MISC_BIST_CS0_BIST_OVERRIDE (1L<<31) + +#define BNX2_MISC_BIST_MEMSTATUS0 0x00000910 +#define BNX2_MISC_BIST_CS1 0x00000914 +#define BNX2_MISC_BIST_CS1_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS1_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS1_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS1_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS1_MBIST_GO (1L<<9) + +#define BNX2_MISC_BIST_MEMSTATUS1 0x00000918 +#define BNX2_MISC_BIST_CS2 0x0000091c +#define BNX2_MISC_BIST_CS2_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS2_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS2_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS2_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS2_MBIST_GO (1L<<9) + +#define BNX2_MISC_BIST_MEMSTATUS2 0x00000920 +#define BNX2_MISC_BIST_CS3 0x00000924 +#define BNX2_MISC_BIST_CS3_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS3_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS3_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS3_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS3_MBIST_GO (1L<<9) + +#define BNX2_MISC_BIST_MEMSTATUS3 0x00000928 +#define BNX2_MISC_BIST_CS4 0x0000092c +#define BNX2_MISC_BIST_CS4_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS4_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS4_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS4_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS4_MBIST_GO (1L<<9) + +#define BNX2_MISC_BIST_MEMSTATUS4 0x00000930 +#define BNX2_MISC_BIST_CS5 0x00000934 +#define BNX2_MISC_BIST_CS5_MBIST_EN (1L<<0) +#define BNX2_MISC_BIST_CS5_BIST_SETUP (0x3L<<1) +#define BNX2_MISC_BIST_CS5_MBIST_ASYNC_RESET (1L<<3) +#define BNX2_MISC_BIST_CS5_MBIST_DONE (1L<<8) +#define BNX2_MISC_BIST_CS5_MBIST_GO (1L<<9) + +#define BNX2_MISC_BIST_MEMSTATUS5 0x00000938 +#define BNX2_MISC_MEM_TM0 0x0000093c +#define BNX2_MISC_MEM_TM0_PCIE_REPLAY_TM (0xfL<<0) +#define BNX2_MISC_MEM_TM0_MCP_SCPAD (0xfL<<8) +#define BNX2_MISC_MEM_TM0_UMP_TM (0xffL<<16) +#define BNX2_MISC_MEM_TM0_HB_MEM_TM (0xfL<<24) + +#define BNX2_MISC_USPLL_CTRL 0x00000940 +#define BNX2_MISC_USPLL_CTRL_PH_DET_DIS (1L<<0) +#define BNX2_MISC_USPLL_CTRL_FREQ_DET_DIS (1L<<1) +#define BNX2_MISC_USPLL_CTRL_LCPX (0x3fL<<2) +#define BNX2_MISC_USPLL_CTRL_RX (0x3L<<8) +#define BNX2_MISC_USPLL_CTRL_VC_EN (1L<<10) +#define BNX2_MISC_USPLL_CTRL_VCO_MG (0x3L<<11) +#define BNX2_MISC_USPLL_CTRL_KVCO_XF (0x7L<<13) +#define BNX2_MISC_USPLL_CTRL_KVCO_XS (0x7L<<16) +#define BNX2_MISC_USPLL_CTRL_TESTD_EN (1L<<19) +#define BNX2_MISC_USPLL_CTRL_TESTD_SEL (0x7L<<20) +#define BNX2_MISC_USPLL_CTRL_TESTA_EN (1L<<23) +#define BNX2_MISC_USPLL_CTRL_TESTA_SEL (0x3L<<24) +#define BNX2_MISC_USPLL_CTRL_ATTEN_FREF (1L<<26) +#define BNX2_MISC_USPLL_CTRL_DIGITAL_RST (1L<<27) +#define BNX2_MISC_USPLL_CTRL_ANALOG_RST (1L<<28) +#define BNX2_MISC_USPLL_CTRL_LOCK (1L<<29) + +#define BNX2_MISC_PERR_STATUS0 0x00000944 +#define BNX2_MISC_PERR_STATUS0_COM_DMAE_PERR (1L<<0) +#define BNX2_MISC_PERR_STATUS0_CP_DMAE_PERR (1L<<1) +#define BNX2_MISC_PERR_STATUS0_RPM_ACPIBEMEM_PERR (1L<<2) +#define BNX2_MISC_PERR_STATUS0_CTX_USAGE_CNT_PERR (1L<<3) +#define BNX2_MISC_PERR_STATUS0_CTX_PGTBL_PERR (1L<<4) +#define BNX2_MISC_PERR_STATUS0_CTX_CACHE_PERR (1L<<5) +#define BNX2_MISC_PERR_STATUS0_CTX_MIRROR_PERR (1L<<6) +#define BNX2_MISC_PERR_STATUS0_COM_CTXC_PERR (1L<<7) +#define BNX2_MISC_PERR_STATUS0_COM_SCPAD_PERR (1L<<8) +#define BNX2_MISC_PERR_STATUS0_CP_CTXC_PERR (1L<<9) +#define BNX2_MISC_PERR_STATUS0_CP_SCPAD_PERR (1L<<10) +#define BNX2_MISC_PERR_STATUS0_RXP_RBUFC_PERR (1L<<11) +#define BNX2_MISC_PERR_STATUS0_RXP_CTXC_PERR (1L<<12) +#define BNX2_MISC_PERR_STATUS0_RXP_SCPAD_PERR (1L<<13) +#define BNX2_MISC_PERR_STATUS0_TPAT_SCPAD_PERR (1L<<14) +#define BNX2_MISC_PERR_STATUS0_TXP_CTXC_PERR (1L<<15) +#define BNX2_MISC_PERR_STATUS0_TXP_SCPAD_PERR (1L<<16) +#define BNX2_MISC_PERR_STATUS0_CS_TMEM_PERR (1L<<17) +#define BNX2_MISC_PERR_STATUS0_MQ_CTX_PERR (1L<<18) +#define BNX2_MISC_PERR_STATUS0_RPM_DFIFOMEM_PERR (1L<<19) +#define BNX2_MISC_PERR_STATUS0_RPC_DFIFOMEM_PERR (1L<<20) +#define BNX2_MISC_PERR_STATUS0_RBUF_PTRMEM_PERR (1L<<21) +#define BNX2_MISC_PERR_STATUS0_RBUF_DATAMEM_PERR (1L<<22) +#define BNX2_MISC_PERR_STATUS0_RV2P_P2IRAM_PERR (1L<<23) +#define BNX2_MISC_PERR_STATUS0_RV2P_P1IRAM_PERR (1L<<24) +#define BNX2_MISC_PERR_STATUS0_RV2P_CB1REGS_PERR (1L<<25) +#define BNX2_MISC_PERR_STATUS0_RV2P_CB0REGS_PERR (1L<<26) +#define BNX2_MISC_PERR_STATUS0_TPBUF_PERR (1L<<27) +#define BNX2_MISC_PERR_STATUS0_THBUF_PERR (1L<<28) +#define BNX2_MISC_PERR_STATUS0_TDMA_PERR (1L<<29) +#define BNX2_MISC_PERR_STATUS0_TBDC_PERR (1L<<30) +#define BNX2_MISC_PERR_STATUS0_TSCH_LR_PERR (1L<<31) + +#define BNX2_MISC_PERR_STATUS1 0x00000948 +#define BNX2_MISC_PERR_STATUS1_RBDC_PERR (1L<<0) +#define BNX2_MISC_PERR_STATUS1_RDMA_DFIFO_PERR (1L<<2) +#define BNX2_MISC_PERR_STATUS1_HC_STATS_PERR (1L<<3) +#define BNX2_MISC_PERR_STATUS1_HC_MSIX_PERR (1L<<4) +#define BNX2_MISC_PERR_STATUS1_HC_PRODUCSTB_PERR (1L<<5) +#define BNX2_MISC_PERR_STATUS1_HC_CONSUMSTB_PERR (1L<<6) +#define BNX2_MISC_PERR_STATUS1_TPATQ_PERR (1L<<7) +#define BNX2_MISC_PERR_STATUS1_MCPQ_PERR (1L<<8) +#define BNX2_MISC_PERR_STATUS1_TDMAQ_PERR (1L<<9) +#define BNX2_MISC_PERR_STATUS1_TXPQ_PERR (1L<<10) +#define BNX2_MISC_PERR_STATUS1_COMTQ_PERR (1L<<11) +#define BNX2_MISC_PERR_STATUS1_COMQ_PERR (1L<<12) +#define BNX2_MISC_PERR_STATUS1_RLUPQ_PERR (1L<<13) +#define BNX2_MISC_PERR_STATUS1_RXPQ_PERR (1L<<14) +#define BNX2_MISC_PERR_STATUS1_RV2PPQ_PERR (1L<<15) +#define BNX2_MISC_PERR_STATUS1_RDMAQ_PERR (1L<<16) +#define BNX2_MISC_PERR_STATUS1_TASQ_PERR (1L<<17) +#define BNX2_MISC_PERR_STATUS1_TBDRQ_PERR (1L<<18) +#define BNX2_MISC_PERR_STATUS1_TSCHQ_PERR (1L<<19) +#define BNX2_MISC_PERR_STATUS1_COMXQ_PERR (1L<<20) +#define BNX2_MISC_PERR_STATUS1_RXPCQ_PERR (1L<<21) +#define BNX2_MISC_PERR_STATUS1_RV2PTQ_PERR (1L<<22) +#define BNX2_MISC_PERR_STATUS1_RV2PMQ_PERR (1L<<23) +#define BNX2_MISC_PERR_STATUS1_CPQ_PERR (1L<<24) +#define BNX2_MISC_PERR_STATUS1_CSQ_PERR (1L<<25) +#define BNX2_MISC_PERR_STATUS1_RLUP_CID_PERR (1L<<26) +#define BNX2_MISC_PERR_STATUS1_RV2PCS_TMEM_PERR (1L<<27) +#define BNX2_MISC_PERR_STATUS1_RV2PCSQ_PERR (1L<<28) +#define BNX2_MISC_PERR_STATUS1_MQ_IDX_PERR (1L<<29) + +#define BNX2_MISC_PERR_STATUS2 0x0000094c +#define BNX2_MISC_PERR_STATUS2_TGT_FIFO_PERR (1L<<0) +#define BNX2_MISC_PERR_STATUS2_UMP_TX_PERR (1L<<1) +#define BNX2_MISC_PERR_STATUS2_UMP_RX_PERR (1L<<2) +#define BNX2_MISC_PERR_STATUS2_MCP_ROM_PERR (1L<<3) +#define BNX2_MISC_PERR_STATUS2_MCP_SCPAD_PERR (1L<<4) +#define BNX2_MISC_PERR_STATUS2_HB_MEM_PERR (1L<<5) +#define BNX2_MISC_PERR_STATUS2_PCIE_REPLAY_PERR (1L<<6) + +#define BNX2_MISC_LCPLL_CTRL0 0x00000950 +#define BNX2_MISC_LCPLL_CTRL0_OAC (0x7L<<0) +#define BNX2_MISC_LCPLL_CTRL0_OAC_NEGTWENTY (0L<<0) +#define BNX2_MISC_LCPLL_CTRL0_OAC_ZERO (1L<<0) +#define BNX2_MISC_LCPLL_CTRL0_OAC_TWENTY (3L<<0) +#define BNX2_MISC_LCPLL_CTRL0_OAC_FORTY (7L<<0) +#define BNX2_MISC_LCPLL_CTRL0_ICP_CTRL (0x7L<<3) +#define BNX2_MISC_LCPLL_CTRL0_ICP_CTRL_360 (0L<<3) +#define BNX2_MISC_LCPLL_CTRL0_ICP_CTRL_480 (1L<<3) +#define BNX2_MISC_LCPLL_CTRL0_ICP_CTRL_600 (3L<<3) +#define BNX2_MISC_LCPLL_CTRL0_ICP_CTRL_720 (7L<<3) +#define BNX2_MISC_LCPLL_CTRL0_BIAS_CTRL (0x3L<<6) +#define BNX2_MISC_LCPLL_CTRL0_PLL_OBSERVE (0x7L<<8) +#define BNX2_MISC_LCPLL_CTRL0_VTH_CTRL (0x3L<<11) +#define BNX2_MISC_LCPLL_CTRL0_VTH_CTRL_0 (0L<<11) +#define BNX2_MISC_LCPLL_CTRL0_VTH_CTRL_1 (1L<<11) +#define BNX2_MISC_LCPLL_CTRL0_VTH_CTRL_2 (2L<<11) +#define BNX2_MISC_LCPLL_CTRL0_PLLSEQSTART (1L<<13) +#define BNX2_MISC_LCPLL_CTRL0_RESERVED (1L<<14) +#define BNX2_MISC_LCPLL_CTRL0_CAPRETRY_EN (1L<<15) +#define BNX2_MISC_LCPLL_CTRL0_FREQMONITOR_EN (1L<<16) +#define BNX2_MISC_LCPLL_CTRL0_FREQDETRESTART_EN (1L<<17) +#define BNX2_MISC_LCPLL_CTRL0_FREQDETRETRY_EN (1L<<18) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCEFDONE_EN (1L<<19) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCEFDONE (1L<<20) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCEFPASS (1L<<21) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCECAPDONE_EN (1L<<22) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCECAPDONE (1L<<23) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCECAPPASS_EN (1L<<24) +#define BNX2_MISC_LCPLL_CTRL0_PLLFORCECAPPASS (1L<<25) +#define BNX2_MISC_LCPLL_CTRL0_CAPRESTART (1L<<26) +#define BNX2_MISC_LCPLL_CTRL0_CAPSELECTM_EN (1L<<27) + +#define BNX2_MISC_LCPLL_CTRL1 0x00000954 +#define BNX2_MISC_LCPLL_CTRL1_CAPSELECTM (0x1fL<<0) +#define BNX2_MISC_LCPLL_CTRL1_CAPFORCESLOWDOWN_EN (1L<<5) +#define BNX2_MISC_LCPLL_CTRL1_CAPFORCESLOWDOWN (1L<<6) +#define BNX2_MISC_LCPLL_CTRL1_SLOWDN_XOR (1L<<7) + +#define BNX2_MISC_LCPLL_STATUS 0x00000958 +#define BNX2_MISC_LCPLL_STATUS_FREQDONE_SM (1L<<0) +#define BNX2_MISC_LCPLL_STATUS_FREQPASS_SM (1L<<1) +#define BNX2_MISC_LCPLL_STATUS_PLLSEQDONE (1L<<2) +#define BNX2_MISC_LCPLL_STATUS_PLLSEQPASS (1L<<3) +#define BNX2_MISC_LCPLL_STATUS_PLLSTATE (0x7L<<4) +#define BNX2_MISC_LCPLL_STATUS_CAPSTATE (0x7L<<7) +#define BNX2_MISC_LCPLL_STATUS_CAPSELECT (0x1fL<<10) +#define BNX2_MISC_LCPLL_STATUS_SLOWDN_INDICATOR (1L<<15) +#define BNX2_MISC_LCPLL_STATUS_SLOWDN_INDICATOR_0 (0L<<15) +#define BNX2_MISC_LCPLL_STATUS_SLOWDN_INDICATOR_1 (1L<<15) + +#define BNX2_MISC_OSCFUNDS_CTRL 0x0000095c +#define BNX2_MISC_OSCFUNDS_CTRL_FREQ_MON (1L<<5) +#define BNX2_MISC_OSCFUNDS_CTRL_FREQ_MON_OFF (0L<<5) +#define BNX2_MISC_OSCFUNDS_CTRL_FREQ_MON_ON (1L<<5) +#define BNX2_MISC_OSCFUNDS_CTRL_XTAL_ADJCM (0x3L<<6) +#define BNX2_MISC_OSCFUNDS_CTRL_XTAL_ADJCM_0 (0L<<6) +#define BNX2_MISC_OSCFUNDS_CTRL_XTAL_ADJCM_1 (1L<<6) +#define BNX2_MISC_OSCFUNDS_CTRL_XTAL_ADJCM_2 (2L<<6) +#define BNX2_MISC_OSCFUNDS_CTRL_XTAL_ADJCM_3 (3L<<6) +#define BNX2_MISC_OSCFUNDS_CTRL_ICBUF_ADJ (0x3L<<8) +#define BNX2_MISC_OSCFUNDS_CTRL_ICBUF_ADJ_0 (0L<<8) +#define BNX2_MISC_OSCFUNDS_CTRL_ICBUF_ADJ_1 (1L<<8) +#define BNX2_MISC_OSCFUNDS_CTRL_ICBUF_ADJ_2 (2L<<8) +#define BNX2_MISC_OSCFUNDS_CTRL_ICBUF_ADJ_3 (3L<<8) +#define BNX2_MISC_OSCFUNDS_CTRL_IAMP_ADJ (0x3L<<10) +#define BNX2_MISC_OSCFUNDS_CTRL_IAMP_ADJ_0 (0L<<10) +#define BNX2_MISC_OSCFUNDS_CTRL_IAMP_ADJ_1 (1L<<10) +#define BNX2_MISC_OSCFUNDS_CTRL_IAMP_ADJ_2 (2L<<10) +#define BNX2_MISC_OSCFUNDS_CTRL_IAMP_ADJ_3 (3L<<10) + + +/* + * nvm_reg definition + * offset: 0x6400 + */ +#define BNX2_NVM_COMMAND 0x00006400 +#define BNX2_NVM_COMMAND_RST (1L<<0) +#define BNX2_NVM_COMMAND_DONE (1L<<3) +#define BNX2_NVM_COMMAND_DOIT (1L<<4) +#define BNX2_NVM_COMMAND_WR (1L<<5) +#define BNX2_NVM_COMMAND_ERASE (1L<<6) +#define BNX2_NVM_COMMAND_FIRST (1L<<7) +#define BNX2_NVM_COMMAND_LAST (1L<<8) +#define BNX2_NVM_COMMAND_WREN (1L<<16) +#define BNX2_NVM_COMMAND_WRDI (1L<<17) +#define BNX2_NVM_COMMAND_EWSR (1L<<18) +#define BNX2_NVM_COMMAND_WRSR (1L<<19) +#define BNX2_NVM_COMMAND_RD_ID (1L<<20) +#define BNX2_NVM_COMMAND_RD_STATUS (1L<<21) +#define BNX2_NVM_COMMAND_MODE_256 (1L<<22) + +#define BNX2_NVM_STATUS 0x00006404 +#define BNX2_NVM_STATUS_PI_FSM_STATE (0xfL<<0) +#define BNX2_NVM_STATUS_EE_FSM_STATE (0xfL<<4) +#define BNX2_NVM_STATUS_EQ_FSM_STATE (0xfL<<8) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_XI (0x1fL<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_IDLE_XI (0L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_CMD0_XI (1L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_CMD1_XI (2L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_CMD_FINISH0_XI (3L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_CMD_FINISH1_XI (4L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_ADDR0_XI (5L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_WRITE_DATA0_XI (6L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_WRITE_DATA1_XI (7L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_WRITE_DATA2_XI (8L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_DATA0_XI (9L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_DATA1_XI (10L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_DATA2_XI (11L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_STATUS_RDID0_XI (12L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_STATUS_RDID1_XI (13L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_STATUS_RDID2_XI (14L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_STATUS_RDID3_XI (15L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_READ_STATUS_RDID4_XI (16L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_CHECK_BUSY0_XI (17L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_ST_WREN_XI (18L<<0) +#define BNX2_NVM_STATUS_SPI_FSM_STATE_SPI_WAIT_XI (19L<<0) + +#define BNX2_NVM_WRITE 0x00006408 +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE (0xffffffffL<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_BIT_BANG (0L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_EECLK (1L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_EEDATA (2L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SCLK (4L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_CS_B (8L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SO (16L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SI (32L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SI_XI (1L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SO_XI (2L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_CS_B_XI (4L<<0) +#define BNX2_NVM_WRITE_NVM_WRITE_VALUE_SCLK_XI (8L<<0) + +#define BNX2_NVM_ADDR 0x0000640c +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE (0xffffffL<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_BIT_BANG (0L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_EECLK (1L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_EEDATA (2L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SCLK (4L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_CS_B (8L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SO (16L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SI (32L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SI_XI (1L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SO_XI (2L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_CS_B_XI (4L<<0) +#define BNX2_NVM_ADDR_NVM_ADDR_VALUE_SCLK_XI (8L<<0) + +#define BNX2_NVM_READ 0x00006410 +#define BNX2_NVM_READ_NVM_READ_VALUE (0xffffffffL<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_BIT_BANG (0L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_EECLK (1L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_EEDATA (2L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SCLK (4L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_CS_B (8L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SO (16L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SI (32L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SI_XI (1L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SO_XI (2L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_CS_B_XI (4L<<0) +#define BNX2_NVM_READ_NVM_READ_VALUE_SCLK_XI (8L<<0) + +#define BNX2_NVM_CFG1 0x00006414 +#define BNX2_NVM_CFG1_FLASH_MODE (1L<<0) +#define BNX2_NVM_CFG1_BUFFER_MODE (1L<<1) +#define BNX2_NVM_CFG1_PASS_MODE (1L<<2) +#define BNX2_NVM_CFG1_BITBANG_MODE (1L<<3) +#define BNX2_NVM_CFG1_STATUS_BIT (0x7L<<4) +#define BNX2_NVM_CFG1_STATUS_BIT_FLASH_RDY (0L<<4) +#define BNX2_NVM_CFG1_STATUS_BIT_BUFFER_RDY (7L<<4) +#define BNX2_NVM_CFG1_SPI_CLK_DIV (0xfL<<7) +#define BNX2_NVM_CFG1_SEE_CLK_DIV (0x7ffL<<11) +#define BNX2_NVM_CFG1_STRAP_CONTROL_0 (1L<<23) +#define BNX2_NVM_CFG1_PROTECT_MODE (1L<<24) +#define BNX2_NVM_CFG1_FLASH_SIZE (1L<<25) +#define BNX2_NVM_CFG1_FW_USTRAP_1 (1L<<26) +#define BNX2_NVM_CFG1_FW_USTRAP_0 (1L<<27) +#define BNX2_NVM_CFG1_FW_USTRAP_2 (1L<<28) +#define BNX2_NVM_CFG1_FW_USTRAP_3 (1L<<29) +#define BNX2_NVM_CFG1_FW_FLASH_TYPE_EN (1L<<30) +#define BNX2_NVM_CFG1_COMPAT_BYPASSS (1L<<31) + +#define BNX2_NVM_CFG2 0x00006418 +#define BNX2_NVM_CFG2_ERASE_CMD (0xffL<<0) +#define BNX2_NVM_CFG2_DUMMY (0xffL<<8) +#define BNX2_NVM_CFG2_STATUS_CMD (0xffL<<16) +#define BNX2_NVM_CFG2_READ_ID (0xffL<<24) + +#define BNX2_NVM_CFG3 0x0000641c +#define BNX2_NVM_CFG3_BUFFER_RD_CMD (0xffL<<0) +#define BNX2_NVM_CFG3_WRITE_CMD (0xffL<<8) +#define BNX2_NVM_CFG3_BUFFER_WRITE_CMD (0xffL<<16) +#define BNX2_NVM_CFG3_READ_CMD (0xffL<<24) + +#define BNX2_NVM_SW_ARB 0x00006420 +#define BNX2_NVM_SW_ARB_ARB_REQ_SET0 (1L<<0) +#define BNX2_NVM_SW_ARB_ARB_REQ_SET1 (1L<<1) +#define BNX2_NVM_SW_ARB_ARB_REQ_SET2 (1L<<2) +#define BNX2_NVM_SW_ARB_ARB_REQ_SET3 (1L<<3) +#define BNX2_NVM_SW_ARB_ARB_REQ_CLR0 (1L<<4) +#define BNX2_NVM_SW_ARB_ARB_REQ_CLR1 (1L<<5) +#define BNX2_NVM_SW_ARB_ARB_REQ_CLR2 (1L<<6) +#define BNX2_NVM_SW_ARB_ARB_REQ_CLR3 (1L<<7) +#define BNX2_NVM_SW_ARB_ARB_ARB0 (1L<<8) +#define BNX2_NVM_SW_ARB_ARB_ARB1 (1L<<9) +#define BNX2_NVM_SW_ARB_ARB_ARB2 (1L<<10) +#define BNX2_NVM_SW_ARB_ARB_ARB3 (1L<<11) +#define BNX2_NVM_SW_ARB_REQ0 (1L<<12) +#define BNX2_NVM_SW_ARB_REQ1 (1L<<13) +#define BNX2_NVM_SW_ARB_REQ2 (1L<<14) +#define BNX2_NVM_SW_ARB_REQ3 (1L<<15) + +#define BNX2_NVM_ACCESS_ENABLE 0x00006424 +#define BNX2_NVM_ACCESS_ENABLE_EN (1L<<0) +#define BNX2_NVM_ACCESS_ENABLE_WR_EN (1L<<1) + +#define BNX2_NVM_WRITE1 0x00006428 +#define BNX2_NVM_WRITE1_WREN_CMD (0xffL<<0) +#define BNX2_NVM_WRITE1_WRDI_CMD (0xffL<<8) +#define BNX2_NVM_WRITE1_SR_DATA (0xffL<<16) + +#define BNX2_NVM_CFG4 0x0000642c +#define BNX2_NVM_CFG4_FLASH_SIZE (0x7L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_1MBIT (0L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_2MBIT (1L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_4MBIT (2L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_8MBIT (3L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_16MBIT (4L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_32MBIT (5L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_64MBIT (6L<<0) +#define BNX2_NVM_CFG4_FLASH_SIZE_128MBIT (7L<<0) +#define BNX2_NVM_CFG4_FLASH_VENDOR (1L<<3) +#define BNX2_NVM_CFG4_FLASH_VENDOR_ST (0L<<3) +#define BNX2_NVM_CFG4_FLASH_VENDOR_ATMEL (1L<<3) +#define BNX2_NVM_CFG4_MODE_256_EMPTY_BIT_LOC (0x3L<<4) +#define BNX2_NVM_CFG4_MODE_256_EMPTY_BIT_LOC_BIT8 (0L<<4) +#define BNX2_NVM_CFG4_MODE_256_EMPTY_BIT_LOC_BIT9 (1L<<4) +#define BNX2_NVM_CFG4_MODE_256_EMPTY_BIT_LOC_BIT10 (2L<<4) +#define BNX2_NVM_CFG4_MODE_256_EMPTY_BIT_LOC_BIT11 (3L<<4) +#define BNX2_NVM_CFG4_STATUS_BIT_POLARITY (1L<<6) +#define BNX2_NVM_CFG4_RESERVED (0x1ffffffL<<7) + +#define BNX2_NVM_RECONFIG 0x00006430 +#define BNX2_NVM_RECONFIG_ORIG_STRAP_VALUE (0xfL<<0) +#define BNX2_NVM_RECONFIG_ORIG_STRAP_VALUE_ST (0L<<0) +#define BNX2_NVM_RECONFIG_ORIG_STRAP_VALUE_ATMEL (1L<<0) +#define BNX2_NVM_RECONFIG_RECONFIG_STRAP_VALUE (0xfL<<4) +#define BNX2_NVM_RECONFIG_RESERVED (0x7fffffL<<8) +#define BNX2_NVM_RECONFIG_RECONFIG_DONE (1L<<31) + + + +/* + * dma_reg definition + * offset: 0xc00 + */ +#define BNX2_DMA_COMMAND 0x00000c00 +#define BNX2_DMA_COMMAND_ENABLE (1L<<0) + +#define BNX2_DMA_STATUS 0x00000c04 +#define BNX2_DMA_STATUS_PAR_ERROR_STATE (1L<<0) +#define BNX2_DMA_STATUS_READ_TRANSFERS_STAT (1L<<16) +#define BNX2_DMA_STATUS_READ_DELAY_PCI_CLKS_STAT (1L<<17) +#define BNX2_DMA_STATUS_BIG_READ_TRANSFERS_STAT (1L<<18) +#define BNX2_DMA_STATUS_BIG_READ_DELAY_PCI_CLKS_STAT (1L<<19) +#define BNX2_DMA_STATUS_BIG_READ_RETRY_AFTER_DATA_STAT (1L<<20) +#define BNX2_DMA_STATUS_WRITE_TRANSFERS_STAT (1L<<21) +#define BNX2_DMA_STATUS_WRITE_DELAY_PCI_CLKS_STAT (1L<<22) +#define BNX2_DMA_STATUS_BIG_WRITE_TRANSFERS_STAT (1L<<23) +#define BNX2_DMA_STATUS_BIG_WRITE_DELAY_PCI_CLKS_STAT (1L<<24) +#define BNX2_DMA_STATUS_BIG_WRITE_RETRY_AFTER_DATA_STAT (1L<<25) +#define BNX2_DMA_STATUS_GLOBAL_ERR_XI (1L<<0) +#define BNX2_DMA_STATUS_BME_XI (1L<<4) + +#define BNX2_DMA_CONFIG 0x00000c08 +#define BNX2_DMA_CONFIG_DATA_BYTE_SWAP (1L<<0) +#define BNX2_DMA_CONFIG_DATA_WORD_SWAP (1L<<1) +#define BNX2_DMA_CONFIG_CNTL_BYTE_SWAP (1L<<4) +#define BNX2_DMA_CONFIG_CNTL_WORD_SWAP (1L<<5) +#define BNX2_DMA_CONFIG_ONE_DMA (1L<<6) +#define BNX2_DMA_CONFIG_CNTL_TWO_DMA (1L<<7) +#define BNX2_DMA_CONFIG_CNTL_FPGA_MODE (1L<<8) +#define BNX2_DMA_CONFIG_CNTL_PING_PONG_DMA (1L<<10) +#define BNX2_DMA_CONFIG_CNTL_PCI_COMP_DLY (1L<<11) +#define BNX2_DMA_CONFIG_NO_RCHANS_IN_USE (0xfL<<12) +#define BNX2_DMA_CONFIG_NO_WCHANS_IN_USE (0xfL<<16) +#define BNX2_DMA_CONFIG_PCI_CLK_CMP_BITS (0x7L<<20) +#define BNX2_DMA_CONFIG_PCI_FAST_CLK_CMP (1L<<23) +#define BNX2_DMA_CONFIG_BIG_SIZE (0xfL<<24) +#define BNX2_DMA_CONFIG_BIG_SIZE_NONE (0x0L<<24) +#define BNX2_DMA_CONFIG_BIG_SIZE_64 (0x1L<<24) +#define BNX2_DMA_CONFIG_BIG_SIZE_128 (0x2L<<24) +#define BNX2_DMA_CONFIG_BIG_SIZE_256 (0x4L<<24) +#define BNX2_DMA_CONFIG_BIG_SIZE_512 (0x8L<<24) +#define BNX2_DMA_CONFIG_DAT_WBSWAP_MODE_XI (0x3L<<0) +#define BNX2_DMA_CONFIG_CTL_WBSWAP_MODE_XI (0x3L<<4) +#define BNX2_DMA_CONFIG_MAX_PL_XI (0x7L<<12) +#define BNX2_DMA_CONFIG_MAX_PL_128B_XI (0L<<12) +#define BNX2_DMA_CONFIG_MAX_PL_256B_XI (1L<<12) +#define BNX2_DMA_CONFIG_MAX_PL_512B_XI (2L<<12) +#define BNX2_DMA_CONFIG_MAX_PL_EN_XI (1L<<15) +#define BNX2_DMA_CONFIG_MAX_RRS_XI (0x7L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_128B_XI (0L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_256B_XI (1L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_512B_XI (2L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_1024B_XI (3L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_2048B_XI (4L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_4096B_XI (5L<<16) +#define BNX2_DMA_CONFIG_MAX_RRS_EN_XI (1L<<19) +#define BNX2_DMA_CONFIG_NO_64SWAP_EN_XI (1L<<31) + +#define BNX2_DMA_BLACKOUT 0x00000c0c +#define BNX2_DMA_BLACKOUT_RD_RETRY_BLACKOUT (0xffL<<0) +#define BNX2_DMA_BLACKOUT_2ND_RD_RETRY_BLACKOUT (0xffL<<8) +#define BNX2_DMA_BLACKOUT_WR_RETRY_BLACKOUT (0xffL<<16) + +#define BNX2_DMA_READ_MASTER_SETTING_0 0x00000c10 +#define BNX2_DMA_READ_MASTER_SETTING_0_TBDC_NO_SNOOP (1L<<0) +#define BNX2_DMA_READ_MASTER_SETTING_0_TBDC_RELAX_ORDER (1L<<1) +#define BNX2_DMA_READ_MASTER_SETTING_0_TBDC_PRIORITY (1L<<2) +#define BNX2_DMA_READ_MASTER_SETTING_0_TBDC_TRAFFIC_CLASS (0x7L<<4) +#define BNX2_DMA_READ_MASTER_SETTING_0_TBDC_PARAM_EN (1L<<7) +#define BNX2_DMA_READ_MASTER_SETTING_0_RBDC_NO_SNOOP (1L<<8) +#define BNX2_DMA_READ_MASTER_SETTING_0_RBDC_RELAX_ORDER (1L<<9) +#define BNX2_DMA_READ_MASTER_SETTING_0_RBDC_PRIORITY (1L<<10) +#define BNX2_DMA_READ_MASTER_SETTING_0_RBDC_TRAFFIC_CLASS (0x7L<<12) +#define BNX2_DMA_READ_MASTER_SETTING_0_RBDC_PARAM_EN (1L<<15) +#define BNX2_DMA_READ_MASTER_SETTING_0_TDMA_NO_SNOOP (1L<<16) +#define BNX2_DMA_READ_MASTER_SETTING_0_TDMA_RELAX_ORDER (1L<<17) +#define BNX2_DMA_READ_MASTER_SETTING_0_TDMA_PRIORITY (1L<<18) +#define BNX2_DMA_READ_MASTER_SETTING_0_TDMA_TRAFFIC_CLASS (0x7L<<20) +#define BNX2_DMA_READ_MASTER_SETTING_0_TDMA_PARAM_EN (1L<<23) +#define BNX2_DMA_READ_MASTER_SETTING_0_CTX_NO_SNOOP (1L<<24) +#define BNX2_DMA_READ_MASTER_SETTING_0_CTX_RELAX_ORDER (1L<<25) +#define BNX2_DMA_READ_MASTER_SETTING_0_CTX_PRIORITY (1L<<26) +#define BNX2_DMA_READ_MASTER_SETTING_0_CTX_TRAFFIC_CLASS (0x7L<<28) +#define BNX2_DMA_READ_MASTER_SETTING_0_CTX_PARAM_EN (1L<<31) + +#define BNX2_DMA_READ_MASTER_SETTING_1 0x00000c14 +#define BNX2_DMA_READ_MASTER_SETTING_1_COM_NO_SNOOP (1L<<0) +#define BNX2_DMA_READ_MASTER_SETTING_1_COM_RELAX_ORDER (1L<<1) +#define BNX2_DMA_READ_MASTER_SETTING_1_COM_PRIORITY (1L<<2) +#define BNX2_DMA_READ_MASTER_SETTING_1_COM_TRAFFIC_CLASS (0x7L<<4) +#define BNX2_DMA_READ_MASTER_SETTING_1_COM_PARAM_EN (1L<<7) +#define BNX2_DMA_READ_MASTER_SETTING_1_CP_NO_SNOOP (1L<<8) +#define BNX2_DMA_READ_MASTER_SETTING_1_CP_RELAX_ORDER (1L<<9) +#define BNX2_DMA_READ_MASTER_SETTING_1_CP_PRIORITY (1L<<10) +#define BNX2_DMA_READ_MASTER_SETTING_1_CP_TRAFFIC_CLASS (0x7L<<12) +#define BNX2_DMA_READ_MASTER_SETTING_1_CP_PARAM_EN (1L<<15) + +#define BNX2_DMA_WRITE_MASTER_SETTING_0 0x00000c18 +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_NO_SNOOP (1L<<0) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_RELAX_ORDER (1L<<1) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_PRIORITY (1L<<2) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_CS_VLD (1L<<3) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_TRAFFIC_CLASS (0x7L<<4) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_HC_PARAM_EN (1L<<7) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_NO_SNOOP (1L<<8) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_RELAX_ORDER (1L<<9) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_PRIORITY (1L<<10) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_CS_VLD (1L<<11) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_TRAFFIC_CLASS (0x7L<<12) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_RDMA_PARAM_EN (1L<<15) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_NO_SNOOP (1L<<24) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_RELAX_ORDER (1L<<25) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_PRIORITY (1L<<26) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_CS_VLD (1L<<27) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_TRAFFIC_CLASS (0x7L<<28) +#define BNX2_DMA_WRITE_MASTER_SETTING_0_CTX_PARAM_EN (1L<<31) + +#define BNX2_DMA_WRITE_MASTER_SETTING_1 0x00000c1c +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_NO_SNOOP (1L<<0) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_RELAX_ORDER (1L<<1) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_PRIORITY (1L<<2) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_CS_VLD (1L<<3) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_TRAFFIC_CLASS (0x7L<<4) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_COM_PARAM_EN (1L<<7) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_NO_SNOOP (1L<<8) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_RELAX_ORDER (1L<<9) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_PRIORITY (1L<<10) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_CS_VLD (1L<<11) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_TRAFFIC_CLASS (0x7L<<12) +#define BNX2_DMA_WRITE_MASTER_SETTING_1_CP_PARAM_EN (1L<<15) + +#define BNX2_DMA_ARBITER 0x00000c20 +#define BNX2_DMA_ARBITER_NUM_READS (0x7L<<0) +#define BNX2_DMA_ARBITER_WR_ARB_MODE (1L<<4) +#define BNX2_DMA_ARBITER_WR_ARB_MODE_STRICT (0L<<4) +#define BNX2_DMA_ARBITER_WR_ARB_MODE_RND_RBN (1L<<4) +#define BNX2_DMA_ARBITER_RD_ARB_MODE (0x3L<<5) +#define BNX2_DMA_ARBITER_RD_ARB_MODE_STRICT (0L<<5) +#define BNX2_DMA_ARBITER_RD_ARB_MODE_RND_RBN (1L<<5) +#define BNX2_DMA_ARBITER_RD_ARB_MODE_WGT_RND_RBN (2L<<5) +#define BNX2_DMA_ARBITER_ALT_MODE_EN (1L<<8) +#define BNX2_DMA_ARBITER_RR_MODE (1L<<9) +#define BNX2_DMA_ARBITER_TIMER_MODE (1L<<10) +#define BNX2_DMA_ARBITER_OUSTD_READ_REQ (0xfL<<12) + +#define BNX2_DMA_ARB_TIMERS 0x00000c24 +#define BNX2_DMA_ARB_TIMERS_RD_DRR_WAIT_TIME (0xffL<<0) +#define BNX2_DMA_ARB_TIMERS_TM_MIN_TIMEOUT (0xffL<<12) +#define BNX2_DMA_ARB_TIMERS_TM_MAX_TIMEOUT (0xfffL<<20) + +#define BNX2_DMA_DEBUG_VECT_PEEK 0x00000c2c +#define BNX2_DMA_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_DMA_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_DMA_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_DMA_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_DMA_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_DMA_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_DMA_TAG_RAM_00 0x00000c30 +#define BNX2_DMA_TAG_RAM_00_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_00_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_00_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_00_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_00_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_00_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_00_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_00_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_00_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_01 0x00000c34 +#define BNX2_DMA_TAG_RAM_01_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_01_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_01_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_01_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_01_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_01_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_01_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_01_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_01_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_02 0x00000c38 +#define BNX2_DMA_TAG_RAM_02_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_02_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_02_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_02_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_02_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_02_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_02_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_02_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_02_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_03 0x00000c3c +#define BNX2_DMA_TAG_RAM_03_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_03_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_03_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_03_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_03_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_03_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_03_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_03_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_03_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_04 0x00000c40 +#define BNX2_DMA_TAG_RAM_04_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_04_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_04_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_04_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_04_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_04_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_04_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_04_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_04_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_05 0x00000c44 +#define BNX2_DMA_TAG_RAM_05_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_05_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_05_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_05_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_05_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_05_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_05_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_05_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_05_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_06 0x00000c48 +#define BNX2_DMA_TAG_RAM_06_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_06_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_06_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_06_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_06_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_06_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_06_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_06_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_06_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_07 0x00000c4c +#define BNX2_DMA_TAG_RAM_07_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_07_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_07_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_07_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_07_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_07_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_07_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_07_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_07_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_08 0x00000c50 +#define BNX2_DMA_TAG_RAM_08_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_08_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_08_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_08_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_08_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_08_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_08_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_08_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_08_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_09 0x00000c54 +#define BNX2_DMA_TAG_RAM_09_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_09_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_09_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_09_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_09_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_09_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_09_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_09_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_09_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_10 0x00000c58 +#define BNX2_DMA_TAG_RAM_10_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_10_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_10_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_10_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_10_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_10_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_10_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_10_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_10_VALID (1L<<10) + +#define BNX2_DMA_TAG_RAM_11 0x00000c5c +#define BNX2_DMA_TAG_RAM_11_CHANNEL (0xfL<<0) +#define BNX2_DMA_TAG_RAM_11_MASTER (0x7L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_CTX (0L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_RBDC (1L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_TBDC (2L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_COM (3L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_CP (4L<<4) +#define BNX2_DMA_TAG_RAM_11_MASTER_TDMA (5L<<4) +#define BNX2_DMA_TAG_RAM_11_SWAP (0x3L<<7) +#define BNX2_DMA_TAG_RAM_11_SWAP_CONFIG (0L<<7) +#define BNX2_DMA_TAG_RAM_11_SWAP_DATA (1L<<7) +#define BNX2_DMA_TAG_RAM_11_SWAP_CONTROL (2L<<7) +#define BNX2_DMA_TAG_RAM_11_FUNCTION (1L<<9) +#define BNX2_DMA_TAG_RAM_11_VALID (1L<<10) + +#define BNX2_DMA_RCHAN_STAT_22 0x00000c60 +#define BNX2_DMA_RCHAN_STAT_30 0x00000c64 +#define BNX2_DMA_RCHAN_STAT_31 0x00000c68 +#define BNX2_DMA_RCHAN_STAT_32 0x00000c6c +#define BNX2_DMA_RCHAN_STAT_40 0x00000c70 +#define BNX2_DMA_RCHAN_STAT_41 0x00000c74 +#define BNX2_DMA_RCHAN_STAT_42 0x00000c78 +#define BNX2_DMA_RCHAN_STAT_50 0x00000c7c +#define BNX2_DMA_RCHAN_STAT_51 0x00000c80 +#define BNX2_DMA_RCHAN_STAT_52 0x00000c84 +#define BNX2_DMA_RCHAN_STAT_60 0x00000c88 +#define BNX2_DMA_RCHAN_STAT_61 0x00000c8c +#define BNX2_DMA_RCHAN_STAT_62 0x00000c90 +#define BNX2_DMA_RCHAN_STAT_70 0x00000c94 +#define BNX2_DMA_RCHAN_STAT_71 0x00000c98 +#define BNX2_DMA_RCHAN_STAT_72 0x00000c9c +#define BNX2_DMA_WCHAN_STAT_00 0x00000ca0 +#define BNX2_DMA_WCHAN_STAT_00_WCHAN_STA_HOST_ADDR_LOW (0xffffffffL<<0) + +#define BNX2_DMA_WCHAN_STAT_01 0x00000ca4 +#define BNX2_DMA_WCHAN_STAT_01_WCHAN_STA_HOST_ADDR_HIGH (0xffffffffL<<0) + +#define BNX2_DMA_WCHAN_STAT_02 0x00000ca8 +#define BNX2_DMA_WCHAN_STAT_02_LENGTH (0xffffL<<0) +#define BNX2_DMA_WCHAN_STAT_02_WORD_SWAP (1L<<16) +#define BNX2_DMA_WCHAN_STAT_02_BYTE_SWAP (1L<<17) +#define BNX2_DMA_WCHAN_STAT_02_PRIORITY_LVL (1L<<18) + +#define BNX2_DMA_WCHAN_STAT_10 0x00000cac +#define BNX2_DMA_WCHAN_STAT_11 0x00000cb0 +#define BNX2_DMA_WCHAN_STAT_12 0x00000cb4 +#define BNX2_DMA_WCHAN_STAT_20 0x00000cb8 +#define BNX2_DMA_WCHAN_STAT_21 0x00000cbc +#define BNX2_DMA_WCHAN_STAT_22 0x00000cc0 +#define BNX2_DMA_WCHAN_STAT_30 0x00000cc4 +#define BNX2_DMA_WCHAN_STAT_31 0x00000cc8 +#define BNX2_DMA_WCHAN_STAT_32 0x00000ccc +#define BNX2_DMA_WCHAN_STAT_40 0x00000cd0 +#define BNX2_DMA_WCHAN_STAT_41 0x00000cd4 +#define BNX2_DMA_WCHAN_STAT_42 0x00000cd8 +#define BNX2_DMA_WCHAN_STAT_50 0x00000cdc +#define BNX2_DMA_WCHAN_STAT_51 0x00000ce0 +#define BNX2_DMA_WCHAN_STAT_52 0x00000ce4 +#define BNX2_DMA_WCHAN_STAT_60 0x00000ce8 +#define BNX2_DMA_WCHAN_STAT_61 0x00000cec +#define BNX2_DMA_WCHAN_STAT_62 0x00000cf0 +#define BNX2_DMA_WCHAN_STAT_70 0x00000cf4 +#define BNX2_DMA_WCHAN_STAT_71 0x00000cf8 +#define BNX2_DMA_WCHAN_STAT_72 0x00000cfc +#define BNX2_DMA_ARB_STAT_00 0x00000d00 +#define BNX2_DMA_ARB_STAT_00_MASTER (0xffffL<<0) +#define BNX2_DMA_ARB_STAT_00_MASTER_ENC (0xffL<<16) +#define BNX2_DMA_ARB_STAT_00_CUR_BINMSTR (0xffL<<24) + +#define BNX2_DMA_ARB_STAT_01 0x00000d04 +#define BNX2_DMA_ARB_STAT_01_LPR_RPTR (0xfL<<0) +#define BNX2_DMA_ARB_STAT_01_LPR_WPTR (0xfL<<4) +#define BNX2_DMA_ARB_STAT_01_LPB_RPTR (0xfL<<8) +#define BNX2_DMA_ARB_STAT_01_LPB_WPTR (0xfL<<12) +#define BNX2_DMA_ARB_STAT_01_HPR_RPTR (0xfL<<16) +#define BNX2_DMA_ARB_STAT_01_HPR_WPTR (0xfL<<20) +#define BNX2_DMA_ARB_STAT_01_HPB_RPTR (0xfL<<24) +#define BNX2_DMA_ARB_STAT_01_HPB_WPTR (0xfL<<28) + +#define BNX2_DMA_FUSE_CTRL0_CMD 0x00000f00 +#define BNX2_DMA_FUSE_CTRL0_CMD_PWRUP_DONE (1L<<0) +#define BNX2_DMA_FUSE_CTRL0_CMD_SHIFT_DONE (1L<<1) +#define BNX2_DMA_FUSE_CTRL0_CMD_SHIFT (1L<<2) +#define BNX2_DMA_FUSE_CTRL0_CMD_LOAD (1L<<3) +#define BNX2_DMA_FUSE_CTRL0_CMD_SEL (0xfL<<8) + +#define BNX2_DMA_FUSE_CTRL0_DATA 0x00000f04 +#define BNX2_DMA_FUSE_CTRL1_CMD 0x00000f08 +#define BNX2_DMA_FUSE_CTRL1_CMD_PWRUP_DONE (1L<<0) +#define BNX2_DMA_FUSE_CTRL1_CMD_SHIFT_DONE (1L<<1) +#define BNX2_DMA_FUSE_CTRL1_CMD_SHIFT (1L<<2) +#define BNX2_DMA_FUSE_CTRL1_CMD_LOAD (1L<<3) +#define BNX2_DMA_FUSE_CTRL1_CMD_SEL (0xfL<<8) + +#define BNX2_DMA_FUSE_CTRL1_DATA 0x00000f0c +#define BNX2_DMA_FUSE_CTRL2_CMD 0x00000f10 +#define BNX2_DMA_FUSE_CTRL2_CMD_PWRUP_DONE (1L<<0) +#define BNX2_DMA_FUSE_CTRL2_CMD_SHIFT_DONE (1L<<1) +#define BNX2_DMA_FUSE_CTRL2_CMD_SHIFT (1L<<2) +#define BNX2_DMA_FUSE_CTRL2_CMD_LOAD (1L<<3) +#define BNX2_DMA_FUSE_CTRL2_CMD_SEL (0xfL<<8) + +#define BNX2_DMA_FUSE_CTRL2_DATA 0x00000f14 + + +/* + * context_reg definition + * offset: 0x1000 + */ +#define BNX2_CTX_COMMAND 0x00001000 +#define BNX2_CTX_COMMAND_ENABLED (1L<<0) +#define BNX2_CTX_COMMAND_DISABLE_USAGE_CNT (1L<<1) +#define BNX2_CTX_COMMAND_DISABLE_PLRU (1L<<2) +#define BNX2_CTX_COMMAND_DISABLE_COMBINE_READ (1L<<3) +#define BNX2_CTX_COMMAND_FLUSH_AHEAD (0x1fL<<8) +#define BNX2_CTX_COMMAND_MEM_INIT (1L<<13) +#define BNX2_CTX_COMMAND_PAGE_SIZE (0xfL<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_256 (0L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_512 (1L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_1K (2L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_2K (3L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_4K (4L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_8K (5L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_16K (6L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_32K (7L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_64K (8L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_128K (9L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_256K (10L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_512K (11L<<16) +#define BNX2_CTX_COMMAND_PAGE_SIZE_1M (12L<<16) + +#define BNX2_CTX_STATUS 0x00001004 +#define BNX2_CTX_STATUS_LOCK_WAIT (1L<<0) +#define BNX2_CTX_STATUS_READ_STAT (1L<<16) +#define BNX2_CTX_STATUS_WRITE_STAT (1L<<17) +#define BNX2_CTX_STATUS_ACC_STALL_STAT (1L<<18) +#define BNX2_CTX_STATUS_LOCK_STALL_STAT (1L<<19) +#define BNX2_CTX_STATUS_EXT_READ_STAT (1L<<20) +#define BNX2_CTX_STATUS_EXT_WRITE_STAT (1L<<21) +#define BNX2_CTX_STATUS_MISS_STAT (1L<<22) +#define BNX2_CTX_STATUS_HIT_STAT (1L<<23) +#define BNX2_CTX_STATUS_DEAD_LOCK (1L<<24) +#define BNX2_CTX_STATUS_USAGE_CNT_ERR (1L<<25) +#define BNX2_CTX_STATUS_INVALID_PAGE (1L<<26) + +#define BNX2_CTX_VIRT_ADDR 0x00001008 +#define BNX2_CTX_VIRT_ADDR_VIRT_ADDR (0x7fffL<<6) + +#define BNX2_CTX_PAGE_TBL 0x0000100c +#define BNX2_CTX_PAGE_TBL_PAGE_TBL (0x3fffL<<6) + +#define BNX2_CTX_DATA_ADR 0x00001010 +#define BNX2_CTX_DATA_ADR_DATA_ADR (0x7ffffL<<2) + +#define BNX2_CTX_DATA 0x00001014 +#define BNX2_CTX_LOCK 0x00001018 +#define BNX2_CTX_LOCK_TYPE (0x7L<<0) +#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_VOID (0x0L<<0) +#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_PROTOCOL (0x1L<<0) +#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_TX (0x2L<<0) +#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_TIMER (0x4L<<0) +#define BNX2_CTX_LOCK_TYPE_LOCK_TYPE_COMPLETE (0x7L<<0) +#define BNX2_CTX_LOCK_TYPE_VOID_XI (0L<<0) +#define BNX2_CTX_LOCK_TYPE_PROTOCOL_XI (1L<<0) +#define BNX2_CTX_LOCK_TYPE_TX_XI (2L<<0) +#define BNX2_CTX_LOCK_TYPE_TIMER_XI (4L<<0) +#define BNX2_CTX_LOCK_TYPE_COMPLETE_XI (7L<<0) +#define BNX2_CTX_LOCK_CID_VALUE (0x3fffL<<7) +#define BNX2_CTX_LOCK_GRANTED (1L<<26) +#define BNX2_CTX_LOCK_MODE (0x7L<<27) +#define BNX2_CTX_LOCK_MODE_UNLOCK (0x0L<<27) +#define BNX2_CTX_LOCK_MODE_IMMEDIATE (0x1L<<27) +#define BNX2_CTX_LOCK_MODE_SURE (0x2L<<27) +#define BNX2_CTX_LOCK_STATUS (1L<<30) +#define BNX2_CTX_LOCK_REQ (1L<<31) + +#define BNX2_CTX_CTX_CTRL 0x0000101c +#define BNX2_CTX_CTX_CTRL_CTX_ADDR (0x7ffffL<<2) +#define BNX2_CTX_CTX_CTRL_MOD_USAGE_CNT (0x3L<<21) +#define BNX2_CTX_CTX_CTRL_NO_RAM_ACC (1L<<23) +#define BNX2_CTX_CTX_CTRL_PREFETCH_SIZE (0x3L<<24) +#define BNX2_CTX_CTX_CTRL_ATTR (1L<<26) +#define BNX2_CTX_CTX_CTRL_WRITE_REQ (1L<<30) +#define BNX2_CTX_CTX_CTRL_READ_REQ (1L<<31) + +#define BNX2_CTX_CTX_DATA 0x00001020 +#define BNX2_CTX_ACCESS_STATUS 0x00001040 +#define BNX2_CTX_ACCESS_STATUS_MASTERENCODED (0xfL<<0) +#define BNX2_CTX_ACCESS_STATUS_ACCESSMEMORYSM (0x3L<<10) +#define BNX2_CTX_ACCESS_STATUS_PAGETABLEINITSM (0x3L<<12) +#define BNX2_CTX_ACCESS_STATUS_ACCESSMEMORYINITSM (0x3L<<14) +#define BNX2_CTX_ACCESS_STATUS_QUALIFIED_REQUEST (0x7ffL<<17) +#define BNX2_CTX_ACCESS_STATUS_CAMMASTERENCODED_XI (0x1fL<<0) +#define BNX2_CTX_ACCESS_STATUS_CACHEMASTERENCODED_XI (0x1fL<<5) +#define BNX2_CTX_ACCESS_STATUS_REQUEST_XI (0x3fffffL<<10) + +#define BNX2_CTX_DBG_LOCK_STATUS 0x00001044 +#define BNX2_CTX_DBG_LOCK_STATUS_SM (0x3ffL<<0) +#define BNX2_CTX_DBG_LOCK_STATUS_MATCH (0x3ffL<<22) + +#define BNX2_CTX_CACHE_CTRL_STATUS 0x00001048 +#define BNX2_CTX_CACHE_CTRL_STATUS_RFIFO_OVERFLOW (1L<<0) +#define BNX2_CTX_CACHE_CTRL_STATUS_INVALID_READ_COMP (1L<<1) +#define BNX2_CTX_CACHE_CTRL_STATUS_FLUSH_START (1L<<6) +#define BNX2_CTX_CACHE_CTRL_STATUS_FREE_ENTRY_CNT (0x3fL<<7) +#define BNX2_CTX_CACHE_CTRL_STATUS_CACHE_ENTRY_NEEDED (0x3fL<<13) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN0_ACTIVE (1L<<19) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN1_ACTIVE (1L<<20) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN2_ACTIVE (1L<<21) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN3_ACTIVE (1L<<22) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN4_ACTIVE (1L<<23) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN5_ACTIVE (1L<<24) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN6_ACTIVE (1L<<25) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN7_ACTIVE (1L<<26) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN8_ACTIVE (1L<<27) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN9_ACTIVE (1L<<28) +#define BNX2_CTX_CACHE_CTRL_STATUS_RD_CHAN10_ACTIVE (1L<<29) + +#define BNX2_CTX_CACHE_CTRL_SM_STATUS 0x0000104c +#define BNX2_CTX_CACHE_CTRL_SM_STATUS_CS_DWC (0x7L<<0) +#define BNX2_CTX_CACHE_CTRL_SM_STATUS_CS_WFIFOC (0x7L<<3) +#define BNX2_CTX_CACHE_CTRL_SM_STATUS_CS_RTAGC (0x7L<<6) +#define BNX2_CTX_CACHE_CTRL_SM_STATUS_CS_RFIFOC (0x7L<<9) +#define BNX2_CTX_CACHE_CTRL_SM_STATUS_INVALID_BLK_ADDR (0x7fffL<<16) + +#define BNX2_CTX_CACHE_STATUS 0x00001050 +#define BNX2_CTX_CACHE_STATUS_HELD_ENTRIES (0x3ffL<<0) +#define BNX2_CTX_CACHE_STATUS_MAX_HELD_ENTRIES (0x3ffL<<16) + +#define BNX2_CTX_DMA_STATUS 0x00001054 +#define BNX2_CTX_DMA_STATUS_RD_CHAN0_STATUS (0x3L<<0) +#define BNX2_CTX_DMA_STATUS_RD_CHAN1_STATUS (0x3L<<2) +#define BNX2_CTX_DMA_STATUS_RD_CHAN2_STATUS (0x3L<<4) +#define BNX2_CTX_DMA_STATUS_RD_CHAN3_STATUS (0x3L<<6) +#define BNX2_CTX_DMA_STATUS_RD_CHAN4_STATUS (0x3L<<8) +#define BNX2_CTX_DMA_STATUS_RD_CHAN5_STATUS (0x3L<<10) +#define BNX2_CTX_DMA_STATUS_RD_CHAN6_STATUS (0x3L<<12) +#define BNX2_CTX_DMA_STATUS_RD_CHAN7_STATUS (0x3L<<14) +#define BNX2_CTX_DMA_STATUS_RD_CHAN8_STATUS (0x3L<<16) +#define BNX2_CTX_DMA_STATUS_RD_CHAN9_STATUS (0x3L<<18) +#define BNX2_CTX_DMA_STATUS_RD_CHAN10_STATUS (0x3L<<20) + +#define BNX2_CTX_REP_STATUS 0x00001058 +#define BNX2_CTX_REP_STATUS_ERROR_ENTRY (0x3ffL<<0) +#define BNX2_CTX_REP_STATUS_ERROR_CLIENT_ID (0x1fL<<10) +#define BNX2_CTX_REP_STATUS_USAGE_CNT_MAX_ERR (1L<<16) +#define BNX2_CTX_REP_STATUS_USAGE_CNT_MIN_ERR (1L<<17) +#define BNX2_CTX_REP_STATUS_USAGE_CNT_MISS_ERR (1L<<18) + +#define BNX2_CTX_CKSUM_ERROR_STATUS 0x0000105c +#define BNX2_CTX_CKSUM_ERROR_STATUS_CALCULATED (0xffffL<<0) +#define BNX2_CTX_CKSUM_ERROR_STATUS_EXPECTED (0xffffL<<16) + +#define BNX2_CTX_CHNL_LOCK_STATUS_0 0x00001080 +#define BNX2_CTX_CHNL_LOCK_STATUS_0_CID (0x3fffL<<0) +#define BNX2_CTX_CHNL_LOCK_STATUS_0_TYPE (0x3L<<14) +#define BNX2_CTX_CHNL_LOCK_STATUS_0_MODE (1L<<16) +#define BNX2_CTX_CHNL_LOCK_STATUS_0_MODE_XI (1L<<14) +#define BNX2_CTX_CHNL_LOCK_STATUS_0_TYPE_XI (0x7L<<15) + +#define BNX2_CTX_CHNL_LOCK_STATUS_1 0x00001084 +#define BNX2_CTX_CHNL_LOCK_STATUS_2 0x00001088 +#define BNX2_CTX_CHNL_LOCK_STATUS_3 0x0000108c +#define BNX2_CTX_CHNL_LOCK_STATUS_4 0x00001090 +#define BNX2_CTX_CHNL_LOCK_STATUS_5 0x00001094 +#define BNX2_CTX_CHNL_LOCK_STATUS_6 0x00001098 +#define BNX2_CTX_CHNL_LOCK_STATUS_7 0x0000109c +#define BNX2_CTX_CHNL_LOCK_STATUS_8 0x000010a0 +#define BNX2_CTX_CHNL_LOCK_STATUS_9 0x000010a4 + +#define BNX2_CTX_CACHE_DATA 0x000010c4 +#define BNX2_CTX_HOST_PAGE_TBL_CTRL 0x000010c8 +#define BNX2_CTX_HOST_PAGE_TBL_CTRL_PAGE_TBL_ADDR (0x1ffL<<0) +#define BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ (1L<<30) +#define BNX2_CTX_HOST_PAGE_TBL_CTRL_READ_REQ (1L<<31) + +#define BNX2_CTX_HOST_PAGE_TBL_DATA0 0x000010cc +#define BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID (1L<<0) +#define BNX2_CTX_HOST_PAGE_TBL_DATA0_VALUE (0xffffffL<<8) + +#define BNX2_CTX_HOST_PAGE_TBL_DATA1 0x000010d0 +#define BNX2_CTX_CAM_CTRL 0x000010d4 +#define BNX2_CTX_CAM_CTRL_CAM_ADDR (0x3ffL<<0) +#define BNX2_CTX_CAM_CTRL_RESET (1L<<27) +#define BNX2_CTX_CAM_CTRL_INVALIDATE (1L<<28) +#define BNX2_CTX_CAM_CTRL_SEARCH (1L<<29) +#define BNX2_CTX_CAM_CTRL_WRITE_REQ (1L<<30) +#define BNX2_CTX_CAM_CTRL_READ_REQ (1L<<31) + + +/* + * emac_reg definition + * offset: 0x1400 + */ +#define BNX2_EMAC_MODE 0x00001400 +#define BNX2_EMAC_MODE_RESET (1L<<0) +#define BNX2_EMAC_MODE_HALF_DUPLEX (1L<<1) +#define BNX2_EMAC_MODE_PORT (0x3L<<2) +#define BNX2_EMAC_MODE_PORT_NONE (0L<<2) +#define BNX2_EMAC_MODE_PORT_MII (1L<<2) +#define BNX2_EMAC_MODE_PORT_GMII (2L<<2) +#define BNX2_EMAC_MODE_PORT_MII_10M (3L<<2) +#define BNX2_EMAC_MODE_MAC_LOOP (1L<<4) +#define BNX2_EMAC_MODE_25G_MODE (1L<<5) +#define BNX2_EMAC_MODE_TAGGED_MAC_CTL (1L<<7) +#define BNX2_EMAC_MODE_TX_BURST (1L<<8) +#define BNX2_EMAC_MODE_MAX_DEFER_DROP_ENA (1L<<9) +#define BNX2_EMAC_MODE_EXT_LINK_POL (1L<<10) +#define BNX2_EMAC_MODE_FORCE_LINK (1L<<11) +#define BNX2_EMAC_MODE_SERDES_MODE (1L<<12) +#define BNX2_EMAC_MODE_BOND_OVRD (1L<<13) +#define BNX2_EMAC_MODE_MPKT (1L<<18) +#define BNX2_EMAC_MODE_MPKT_RCVD (1L<<19) +#define BNX2_EMAC_MODE_ACPI_RCVD (1L<<20) + +#define BNX2_EMAC_STATUS 0x00001404 +#define BNX2_EMAC_STATUS_LINK (1L<<11) +#define BNX2_EMAC_STATUS_LINK_CHANGE (1L<<12) +#define BNX2_EMAC_STATUS_SERDES_AUTONEG_COMPLETE (1L<<13) +#define BNX2_EMAC_STATUS_SERDES_AUTONEG_CHANGE (1L<<14) +#define BNX2_EMAC_STATUS_SERDES_NXT_PG_CHANGE (1L<<16) +#define BNX2_EMAC_STATUS_SERDES_RX_CONFIG_IS_0 (1L<<17) +#define BNX2_EMAC_STATUS_SERDES_RX_CONFIG_IS_0_CHANGE (1L<<18) +#define BNX2_EMAC_STATUS_MI_COMPLETE (1L<<22) +#define BNX2_EMAC_STATUS_MI_INT (1L<<23) +#define BNX2_EMAC_STATUS_AP_ERROR (1L<<24) +#define BNX2_EMAC_STATUS_PARITY_ERROR_STATE (1L<<31) + +#define BNX2_EMAC_ATTENTION_ENA 0x00001408 +#define BNX2_EMAC_ATTENTION_ENA_LINK (1L<<11) +#define BNX2_EMAC_ATTENTION_ENA_AUTONEG_CHANGE (1L<<14) +#define BNX2_EMAC_ATTENTION_ENA_NXT_PG_CHANGE (1L<<16) +#define BNX2_EMAC_ATTENTION_ENA_SERDES_RX_CONFIG_IS_0_CHANGE (1L<<18) +#define BNX2_EMAC_ATTENTION_ENA_MI_COMPLETE (1L<<22) +#define BNX2_EMAC_ATTENTION_ENA_MI_INT (1L<<23) +#define BNX2_EMAC_ATTENTION_ENA_AP_ERROR (1L<<24) + +#define BNX2_EMAC_LED 0x0000140c +#define BNX2_EMAC_LED_OVERRIDE (1L<<0) +#define BNX2_EMAC_LED_1000MB_OVERRIDE (1L<<1) +#define BNX2_EMAC_LED_100MB_OVERRIDE (1L<<2) +#define BNX2_EMAC_LED_10MB_OVERRIDE (1L<<3) +#define BNX2_EMAC_LED_TRAFFIC_OVERRIDE (1L<<4) +#define BNX2_EMAC_LED_BLNK_TRAFFIC (1L<<5) +#define BNX2_EMAC_LED_TRAFFIC (1L<<6) +#define BNX2_EMAC_LED_1000MB (1L<<7) +#define BNX2_EMAC_LED_100MB (1L<<8) +#define BNX2_EMAC_LED_10MB (1L<<9) +#define BNX2_EMAC_LED_TRAFFIC_STAT (1L<<10) +#define BNX2_EMAC_LED_2500MB (1L<<11) +#define BNX2_EMAC_LED_2500MB_OVERRIDE (1L<<12) +#define BNX2_EMAC_LED_ACTIVITY_SEL (0x3L<<17) +#define BNX2_EMAC_LED_ACTIVITY_SEL_0 (0L<<17) +#define BNX2_EMAC_LED_ACTIVITY_SEL_1 (1L<<17) +#define BNX2_EMAC_LED_ACTIVITY_SEL_2 (2L<<17) +#define BNX2_EMAC_LED_ACTIVITY_SEL_3 (3L<<17) +#define BNX2_EMAC_LED_BLNK_RATE (0xfffL<<19) +#define BNX2_EMAC_LED_BLNK_RATE_ENA (1L<<31) + +#define BNX2_EMAC_MAC_MATCH0 0x00001410 +#define BNX2_EMAC_MAC_MATCH1 0x00001414 +#define BNX2_EMAC_MAC_MATCH2 0x00001418 +#define BNX2_EMAC_MAC_MATCH3 0x0000141c +#define BNX2_EMAC_MAC_MATCH4 0x00001420 +#define BNX2_EMAC_MAC_MATCH5 0x00001424 +#define BNX2_EMAC_MAC_MATCH6 0x00001428 +#define BNX2_EMAC_MAC_MATCH7 0x0000142c +#define BNX2_EMAC_MAC_MATCH8 0x00001430 +#define BNX2_EMAC_MAC_MATCH9 0x00001434 +#define BNX2_EMAC_MAC_MATCH10 0x00001438 +#define BNX2_EMAC_MAC_MATCH11 0x0000143c +#define BNX2_EMAC_MAC_MATCH12 0x00001440 +#define BNX2_EMAC_MAC_MATCH13 0x00001444 +#define BNX2_EMAC_MAC_MATCH14 0x00001448 +#define BNX2_EMAC_MAC_MATCH15 0x0000144c +#define BNX2_EMAC_MAC_MATCH16 0x00001450 +#define BNX2_EMAC_MAC_MATCH17 0x00001454 +#define BNX2_EMAC_MAC_MATCH18 0x00001458 +#define BNX2_EMAC_MAC_MATCH19 0x0000145c +#define BNX2_EMAC_MAC_MATCH20 0x00001460 +#define BNX2_EMAC_MAC_MATCH21 0x00001464 +#define BNX2_EMAC_MAC_MATCH22 0x00001468 +#define BNX2_EMAC_MAC_MATCH23 0x0000146c +#define BNX2_EMAC_MAC_MATCH24 0x00001470 +#define BNX2_EMAC_MAC_MATCH25 0x00001474 +#define BNX2_EMAC_MAC_MATCH26 0x00001478 +#define BNX2_EMAC_MAC_MATCH27 0x0000147c +#define BNX2_EMAC_MAC_MATCH28 0x00001480 +#define BNX2_EMAC_MAC_MATCH29 0x00001484 +#define BNX2_EMAC_MAC_MATCH30 0x00001488 +#define BNX2_EMAC_MAC_MATCH31 0x0000148c +#define BNX2_EMAC_BACKOFF_SEED 0x00001498 +#define BNX2_EMAC_BACKOFF_SEED_EMAC_BACKOFF_SEED (0x3ffL<<0) + +#define BNX2_EMAC_RX_MTU_SIZE 0x0000149c +#define BNX2_EMAC_RX_MTU_SIZE_MTU_SIZE (0xffffL<<0) +#define BNX2_EMAC_RX_MTU_SIZE_JUMBO_ENA (1L<<31) + +#define BNX2_EMAC_SERDES_CNTL 0x000014a4 +#define BNX2_EMAC_SERDES_CNTL_RXR (0x7L<<0) +#define BNX2_EMAC_SERDES_CNTL_RXG (0x3L<<3) +#define BNX2_EMAC_SERDES_CNTL_RXCKSEL (1L<<6) +#define BNX2_EMAC_SERDES_CNTL_TXBIAS (0x7L<<7) +#define BNX2_EMAC_SERDES_CNTL_BGMAX (1L<<10) +#define BNX2_EMAC_SERDES_CNTL_BGMIN (1L<<11) +#define BNX2_EMAC_SERDES_CNTL_TXMODE (1L<<12) +#define BNX2_EMAC_SERDES_CNTL_TXEDGE (1L<<13) +#define BNX2_EMAC_SERDES_CNTL_SERDES_MODE (1L<<14) +#define BNX2_EMAC_SERDES_CNTL_PLLTEST (1L<<15) +#define BNX2_EMAC_SERDES_CNTL_CDET_EN (1L<<16) +#define BNX2_EMAC_SERDES_CNTL_TBI_LBK (1L<<17) +#define BNX2_EMAC_SERDES_CNTL_REMOTE_LBK (1L<<18) +#define BNX2_EMAC_SERDES_CNTL_REV_PHASE (1L<<19) +#define BNX2_EMAC_SERDES_CNTL_REGCTL12 (0x3L<<20) +#define BNX2_EMAC_SERDES_CNTL_REGCTL25 (0x3L<<22) + +#define BNX2_EMAC_SERDES_STATUS 0x000014a8 +#define BNX2_EMAC_SERDES_STATUS_RX_STAT (0xffL<<0) +#define BNX2_EMAC_SERDES_STATUS_COMMA_DET (1L<<8) + +#define BNX2_EMAC_MDIO_COMM 0x000014ac +#define BNX2_EMAC_MDIO_COMM_DATA (0xffffL<<0) +#define BNX2_EMAC_MDIO_COMM_REG_ADDR (0x1fL<<16) +#define BNX2_EMAC_MDIO_COMM_PHY_ADDR (0x1fL<<21) +#define BNX2_EMAC_MDIO_COMM_COMMAND (0x3L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_UNDEFINED_0 (0L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_ADDRESS (0L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_WRITE (1L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_READ (2L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_WRITE_22_XI (1L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_WRITE_45_XI (1L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_READ_22_XI (2L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_READ_INC_45_XI (2L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_UNDEFINED_3 (3L<<26) +#define BNX2_EMAC_MDIO_COMM_COMMAND_READ_45 (3L<<26) +#define BNX2_EMAC_MDIO_COMM_FAIL (1L<<28) +#define BNX2_EMAC_MDIO_COMM_START_BUSY (1L<<29) +#define BNX2_EMAC_MDIO_COMM_DISEXT (1L<<30) + +#define BNX2_EMAC_MDIO_STATUS 0x000014b0 +#define BNX2_EMAC_MDIO_STATUS_LINK (1L<<0) +#define BNX2_EMAC_MDIO_STATUS_10MB (1L<<1) + +#define BNX2_EMAC_MDIO_MODE 0x000014b4 +#define BNX2_EMAC_MDIO_MODE_SHORT_PREAMBLE (1L<<1) +#define BNX2_EMAC_MDIO_MODE_AUTO_POLL (1L<<4) +#define BNX2_EMAC_MDIO_MODE_BIT_BANG (1L<<8) +#define BNX2_EMAC_MDIO_MODE_MDIO (1L<<9) +#define BNX2_EMAC_MDIO_MODE_MDIO_OE (1L<<10) +#define BNX2_EMAC_MDIO_MODE_MDC (1L<<11) +#define BNX2_EMAC_MDIO_MODE_MDINT (1L<<12) +#define BNX2_EMAC_MDIO_MODE_EXT_MDINT (1L<<13) +#define BNX2_EMAC_MDIO_MODE_CLOCK_CNT (0x1fL<<16) +#define BNX2_EMAC_MDIO_MODE_CLOCK_CNT_XI (0x3fL<<16) +#define BNX2_EMAC_MDIO_MODE_CLAUSE_45_XI (1L<<31) + +#define BNX2_EMAC_MDIO_AUTO_STATUS 0x000014b8 +#define BNX2_EMAC_MDIO_AUTO_STATUS_AUTO_ERR (1L<<0) + +#define BNX2_EMAC_TX_MODE 0x000014bc +#define BNX2_EMAC_TX_MODE_RESET (1L<<0) +#define BNX2_EMAC_TX_MODE_CS16_TEST (1L<<2) +#define BNX2_EMAC_TX_MODE_EXT_PAUSE_EN (1L<<3) +#define BNX2_EMAC_TX_MODE_FLOW_EN (1L<<4) +#define BNX2_EMAC_TX_MODE_BIG_BACKOFF (1L<<5) +#define BNX2_EMAC_TX_MODE_LONG_PAUSE (1L<<6) +#define BNX2_EMAC_TX_MODE_LINK_AWARE (1L<<7) + +#define BNX2_EMAC_TX_STATUS 0x000014c0 +#define BNX2_EMAC_TX_STATUS_XOFFED (1L<<0) +#define BNX2_EMAC_TX_STATUS_XOFF_SENT (1L<<1) +#define BNX2_EMAC_TX_STATUS_XON_SENT (1L<<2) +#define BNX2_EMAC_TX_STATUS_LINK_UP (1L<<3) +#define BNX2_EMAC_TX_STATUS_UNDERRUN (1L<<4) +#define BNX2_EMAC_TX_STATUS_CS16_ERROR (1L<<5) + +#define BNX2_EMAC_TX_LENGTHS 0x000014c4 +#define BNX2_EMAC_TX_LENGTHS_SLOT (0xffL<<0) +#define BNX2_EMAC_TX_LENGTHS_IPG (0xfL<<8) +#define BNX2_EMAC_TX_LENGTHS_IPG_CRS (0x3L<<12) + +#define BNX2_EMAC_RX_MODE 0x000014c8 +#define BNX2_EMAC_RX_MODE_RESET (1L<<0) +#define BNX2_EMAC_RX_MODE_FLOW_EN (1L<<2) +#define BNX2_EMAC_RX_MODE_KEEP_MAC_CONTROL (1L<<3) +#define BNX2_EMAC_RX_MODE_KEEP_PAUSE (1L<<4) +#define BNX2_EMAC_RX_MODE_ACCEPT_OVERSIZE (1L<<5) +#define BNX2_EMAC_RX_MODE_ACCEPT_RUNTS (1L<<6) +#define BNX2_EMAC_RX_MODE_LLC_CHK (1L<<7) +#define BNX2_EMAC_RX_MODE_PROMISCUOUS (1L<<8) +#define BNX2_EMAC_RX_MODE_NO_CRC_CHK (1L<<9) +#define BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG (1L<<10) +#define BNX2_EMAC_RX_MODE_FILT_BROADCAST (1L<<11) +#define BNX2_EMAC_RX_MODE_SORT_MODE (1L<<12) + +#define BNX2_EMAC_RX_STATUS 0x000014cc +#define BNX2_EMAC_RX_STATUS_FFED (1L<<0) +#define BNX2_EMAC_RX_STATUS_FF_RECEIVED (1L<<1) +#define BNX2_EMAC_RX_STATUS_N_RECEIVED (1L<<2) + +#define BNX2_EMAC_MULTICAST_HASH0 0x000014d0 +#define BNX2_EMAC_MULTICAST_HASH1 0x000014d4 +#define BNX2_EMAC_MULTICAST_HASH2 0x000014d8 +#define BNX2_EMAC_MULTICAST_HASH3 0x000014dc +#define BNX2_EMAC_MULTICAST_HASH4 0x000014e0 +#define BNX2_EMAC_MULTICAST_HASH5 0x000014e4 +#define BNX2_EMAC_MULTICAST_HASH6 0x000014e8 +#define BNX2_EMAC_MULTICAST_HASH7 0x000014ec +#define BNX2_EMAC_CKSUM_ERROR_STATUS 0x000014f0 +#define BNX2_EMAC_CKSUM_ERROR_STATUS_CALCULATED (0xffffL<<0) +#define BNX2_EMAC_CKSUM_ERROR_STATUS_EXPECTED (0xffffL<<16) + +#define BNX2_EMAC_RX_STAT_IFHCINOCTETS 0x00001500 +#define BNX2_EMAC_RX_STAT_IFHCINBADOCTETS 0x00001504 +#define BNX2_EMAC_RX_STAT_ETHERSTATSFRAGMENTS 0x00001508 +#define BNX2_EMAC_RX_STAT_IFHCINUCASTPKTS 0x0000150c +#define BNX2_EMAC_RX_STAT_IFHCINMULTICASTPKTS 0x00001510 +#define BNX2_EMAC_RX_STAT_IFHCINBROADCASTPKTS 0x00001514 +#define BNX2_EMAC_RX_STAT_DOT3STATSFCSERRORS 0x00001518 +#define BNX2_EMAC_RX_STAT_DOT3STATSALIGNMENTERRORS 0x0000151c +#define BNX2_EMAC_RX_STAT_DOT3STATSCARRIERSENSEERRORS 0x00001520 +#define BNX2_EMAC_RX_STAT_XONPAUSEFRAMESRECEIVED 0x00001524 +#define BNX2_EMAC_RX_STAT_XOFFPAUSEFRAMESRECEIVED 0x00001528 +#define BNX2_EMAC_RX_STAT_MACCONTROLFRAMESRECEIVED 0x0000152c +#define BNX2_EMAC_RX_STAT_XOFFSTATEENTERED 0x00001530 +#define BNX2_EMAC_RX_STAT_DOT3STATSFRAMESTOOLONG 0x00001534 +#define BNX2_EMAC_RX_STAT_ETHERSTATSJABBERS 0x00001538 +#define BNX2_EMAC_RX_STAT_ETHERSTATSUNDERSIZEPKTS 0x0000153c +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS64OCTETS 0x00001540 +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS65OCTETSTO127OCTETS 0x00001544 +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS128OCTETSTO255OCTETS 0x00001548 +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS256OCTETSTO511OCTETS 0x0000154c +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS512OCTETSTO1023OCTETS 0x00001550 +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTS1024OCTETSTO1522OCTETS 0x00001554 +#define BNX2_EMAC_RX_STAT_ETHERSTATSPKTSOVER1522OCTETS 0x00001558 +#define BNX2_EMAC_RXMAC_DEBUG0 0x0000155c +#define BNX2_EMAC_RXMAC_DEBUG1 0x00001560 +#define BNX2_EMAC_RXMAC_DEBUG1_LENGTH_NE_BYTE_COUNT (1L<<0) +#define BNX2_EMAC_RXMAC_DEBUG1_LENGTH_OUT_RANGE (1L<<1) +#define BNX2_EMAC_RXMAC_DEBUG1_BAD_CRC (1L<<2) +#define BNX2_EMAC_RXMAC_DEBUG1_RX_ERROR (1L<<3) +#define BNX2_EMAC_RXMAC_DEBUG1_ALIGN_ERROR (1L<<4) +#define BNX2_EMAC_RXMAC_DEBUG1_LAST_DATA (1L<<5) +#define BNX2_EMAC_RXMAC_DEBUG1_ODD_BYTE_START (1L<<6) +#define BNX2_EMAC_RXMAC_DEBUG1_BYTE_COUNT (0xffffL<<7) +#define BNX2_EMAC_RXMAC_DEBUG1_SLOT_TIME (0xffL<<23) + +#define BNX2_EMAC_RXMAC_DEBUG2 0x00001564 +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE (0x7L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_IDLE (0x0L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SFD (0x1L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_DATA (0x2L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SKEEP (0x3L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_EXT (0x4L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_DROP (0x5L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_SDROP (0x6L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_SM_STATE_FC (0x7L<<0) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE (0xfL<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_IDLE (0x0L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA0 (0x1L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA1 (0x2L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA2 (0x3L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_DATA3 (0x4L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_ABORT (0x5L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_WAIT (0x6L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_STATUS (0x7L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_IDI_STATE_LAST (0x8L<<3) +#define BNX2_EMAC_RXMAC_DEBUG2_BYTE_IN (0xffL<<7) +#define BNX2_EMAC_RXMAC_DEBUG2_FALSEC (1L<<15) +#define BNX2_EMAC_RXMAC_DEBUG2_TAGGED (1L<<16) +#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE (1L<<18) +#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE_IDLE (0L<<18) +#define BNX2_EMAC_RXMAC_DEBUG2_PAUSE_STATE_PAUSED (1L<<18) +#define BNX2_EMAC_RXMAC_DEBUG2_SE_COUNTER (0xfL<<19) +#define BNX2_EMAC_RXMAC_DEBUG2_QUANTA (0x1fL<<23) + +#define BNX2_EMAC_RXMAC_DEBUG3 0x00001568 +#define BNX2_EMAC_RXMAC_DEBUG3_PAUSE_CTR (0xffffL<<0) +#define BNX2_EMAC_RXMAC_DEBUG3_TMP_PAUSE_CTR (0xffffL<<16) + +#define BNX2_EMAC_RXMAC_DEBUG4 0x0000156c +#define BNX2_EMAC_RXMAC_DEBUG4_TYPE_FIELD (0xffffL<<0) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE (0x3fL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_IDLE (0x0L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UMAC2 (0x1L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UMAC3 (0x2L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UNI (0x3L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MMAC3 (0x5L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA1 (0x6L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MMAC2 (0x7L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA2 (0x7L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PSA3 (0x8L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC2 (0x9L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC3 (0xaL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MWAIT1 (0xeL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MWAIT2 (0xfL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MCHECK (0x10L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MC (0x11L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC2 (0x12L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC3 (0x13L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA1 (0x14L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA2 (0x15L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BSA3 (0x16L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BTYPE (0x17L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_BC (0x18L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PTYPE (0x19L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_CMD (0x1aL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MAC (0x1bL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_LATCH (0x1cL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_XOFF (0x1dL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_XON (0x1eL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_PAUSED (0x1fL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_NPAUSED (0x20L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_TTYPE (0x21L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_TVAL (0x22L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA1 (0x23L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA2 (0x24L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_USA3 (0x25L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTYPE (0x26L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTTYPE (0x27L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_UTVAL (0x28L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_MTYPE (0x29L<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_FILT_STATE_DROP (0x2aL<<16) +#define BNX2_EMAC_RXMAC_DEBUG4_DROP_PKT (1L<<22) +#define BNX2_EMAC_RXMAC_DEBUG4_SLOT_FILLED (1L<<23) +#define BNX2_EMAC_RXMAC_DEBUG4_FALSE_CARRIER (1L<<24) +#define BNX2_EMAC_RXMAC_DEBUG4_LAST_DATA (1L<<25) +#define BNX2_EMAC_RXMAC_DEBUG4_SFD_FOUND (1L<<26) +#define BNX2_EMAC_RXMAC_DEBUG4_ADVANCE (1L<<27) +#define BNX2_EMAC_RXMAC_DEBUG4_START (1L<<28) + +#define BNX2_EMAC_RXMAC_DEBUG5 0x00001570 +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM (0x7L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_IDLE (0L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_WAIT_EOF (1L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_WAIT_STAT (2L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4FCRC (3L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4RDE (4L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_SET_EOF4ALL (5L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_PS_IDISM_1WD_WAIT_STAT (6L<<0) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1 (0x7L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_VDW (0x0L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_STAT (0x1L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_AEOF (0x2L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_NEOF (0x3L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SOF (0x4L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SAEOF (0x6L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF1_SNEOF (0x7L<<4) +#define BNX2_EMAC_RXMAC_DEBUG5_EOF_DETECTED (1L<<7) +#define BNX2_EMAC_RXMAC_DEBUG5_CCODE_BUF0 (0x7L<<8) +#define BNX2_EMAC_RXMAC_DEBUG5_RPM_IDI_FIFO_FULL (1L<<11) +#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_CCODE (1L<<12) +#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_DATA (1L<<13) +#define BNX2_EMAC_RXMAC_DEBUG5_LOAD_STAT (1L<<14) +#define BNX2_EMAC_RXMAC_DEBUG5_CLR_STAT (1L<<15) +#define BNX2_EMAC_RXMAC_DEBUG5_IDI_RPM_CCODE (0x3L<<16) +#define BNX2_EMAC_RXMAC_DEBUG5_IDI_RPM_ACCEPT (1L<<19) +#define BNX2_EMAC_RXMAC_DEBUG5_FMLEN (0xfffL<<20) + +#define BNX2_EMAC_RX_STAT_FALSECARRIERERRORS 0x00001574 +#define BNX2_EMAC_RX_STAT_AC0 0x00001580 +#define BNX2_EMAC_RX_STAT_AC1 0x00001584 +#define BNX2_EMAC_RX_STAT_AC2 0x00001588 +#define BNX2_EMAC_RX_STAT_AC3 0x0000158c +#define BNX2_EMAC_RX_STAT_AC4 0x00001590 +#define BNX2_EMAC_RX_STAT_AC5 0x00001594 +#define BNX2_EMAC_RX_STAT_AC6 0x00001598 +#define BNX2_EMAC_RX_STAT_AC7 0x0000159c +#define BNX2_EMAC_RX_STAT_AC8 0x000015a0 +#define BNX2_EMAC_RX_STAT_AC9 0x000015a4 +#define BNX2_EMAC_RX_STAT_AC10 0x000015a8 +#define BNX2_EMAC_RX_STAT_AC11 0x000015ac +#define BNX2_EMAC_RX_STAT_AC12 0x000015b0 +#define BNX2_EMAC_RX_STAT_AC13 0x000015b4 +#define BNX2_EMAC_RX_STAT_AC14 0x000015b8 +#define BNX2_EMAC_RX_STAT_AC15 0x000015bc +#define BNX2_EMAC_RX_STAT_AC16 0x000015c0 +#define BNX2_EMAC_RX_STAT_AC17 0x000015c4 +#define BNX2_EMAC_RX_STAT_AC18 0x000015c8 +#define BNX2_EMAC_RX_STAT_AC19 0x000015cc +#define BNX2_EMAC_RX_STAT_AC20 0x000015d0 +#define BNX2_EMAC_RX_STAT_AC21 0x000015d4 +#define BNX2_EMAC_RX_STAT_AC22 0x000015d8 +#define BNX2_EMAC_RXMAC_SUC_DBG_OVERRUNVEC 0x000015dc +#define BNX2_EMAC_RX_STAT_AC_28 0x000015f4 +#define BNX2_EMAC_TX_STAT_IFHCOUTOCTETS 0x00001600 +#define BNX2_EMAC_TX_STAT_IFHCOUTBADOCTETS 0x00001604 +#define BNX2_EMAC_TX_STAT_ETHERSTATSCOLLISIONS 0x00001608 +#define BNX2_EMAC_TX_STAT_OUTXONSENT 0x0000160c +#define BNX2_EMAC_TX_STAT_OUTXOFFSENT 0x00001610 +#define BNX2_EMAC_TX_STAT_FLOWCONTROLDONE 0x00001614 +#define BNX2_EMAC_TX_STAT_DOT3STATSSINGLECOLLISIONFRAMES 0x00001618 +#define BNX2_EMAC_TX_STAT_DOT3STATSMULTIPLECOLLISIONFRAMES 0x0000161c +#define BNX2_EMAC_TX_STAT_DOT3STATSDEFERREDTRANSMISSIONS 0x00001620 +#define BNX2_EMAC_TX_STAT_DOT3STATSEXCESSIVECOLLISIONS 0x00001624 +#define BNX2_EMAC_TX_STAT_DOT3STATSLATECOLLISIONS 0x00001628 +#define BNX2_EMAC_TX_STAT_IFHCOUTUCASTPKTS 0x0000162c +#define BNX2_EMAC_TX_STAT_IFHCOUTMULTICASTPKTS 0x00001630 +#define BNX2_EMAC_TX_STAT_IFHCOUTBROADCASTPKTS 0x00001634 +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS64OCTETS 0x00001638 +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS65OCTETSTO127OCTETS 0x0000163c +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS128OCTETSTO255OCTETS 0x00001640 +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS256OCTETSTO511OCTETS 0x00001644 +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS512OCTETSTO1023OCTETS 0x00001648 +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTS1024OCTETSTO1522OCTETS 0x0000164c +#define BNX2_EMAC_TX_STAT_ETHERSTATSPKTSOVER1522OCTETS 0x00001650 +#define BNX2_EMAC_TX_STAT_DOT3STATSINTERNALMACTRANSMITERRORS 0x00001654 +#define BNX2_EMAC_TXMAC_DEBUG0 0x00001658 +#define BNX2_EMAC_TXMAC_DEBUG1 0x0000165c +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE (0xfL<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_IDLE (0x0L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_START0 (0x1L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA0 (0x4L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA1 (0x5L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA2 (0x6L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_DATA3 (0x7L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_WAIT0 (0x8L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_ODI_STATE_WAIT1 (0x9L<<0) +#define BNX2_EMAC_TXMAC_DEBUG1_CRS_ENABLE (1L<<4) +#define BNX2_EMAC_TXMAC_DEBUG1_BAD_CRC (1L<<5) +#define BNX2_EMAC_TXMAC_DEBUG1_SE_COUNTER (0xfL<<6) +#define BNX2_EMAC_TXMAC_DEBUG1_SEND_PAUSE (1L<<10) +#define BNX2_EMAC_TXMAC_DEBUG1_LATE_COLLISION (1L<<11) +#define BNX2_EMAC_TXMAC_DEBUG1_MAX_DEFER (1L<<12) +#define BNX2_EMAC_TXMAC_DEBUG1_DEFERRED (1L<<13) +#define BNX2_EMAC_TXMAC_DEBUG1_ONE_BYTE (1L<<14) +#define BNX2_EMAC_TXMAC_DEBUG1_IPG_TIME (0xfL<<15) +#define BNX2_EMAC_TXMAC_DEBUG1_SLOT_TIME (0xffL<<19) + +#define BNX2_EMAC_TXMAC_DEBUG2 0x00001660 +#define BNX2_EMAC_TXMAC_DEBUG2_BACK_OFF (0x3ffL<<0) +#define BNX2_EMAC_TXMAC_DEBUG2_BYTE_COUNT (0xffffL<<10) +#define BNX2_EMAC_TXMAC_DEBUG2_COL_COUNT (0x1fL<<26) +#define BNX2_EMAC_TXMAC_DEBUG2_COL_BIT (1L<<31) + +#define BNX2_EMAC_TXMAC_DEBUG3 0x00001664 +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE (0xfL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_IDLE (0x0L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_PRE1 (0x1L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_PRE2 (0x2L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_SFD (0x3L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_DATA (0x4L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_CRC1 (0x5L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_CRC2 (0x6L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_EXT (0x7L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_STATB (0x8L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_STATG (0x9L<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_JAM (0xaL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_EJAM (0xbL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_BJAM (0xcL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_SWAIT (0xdL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_SM_STATE_BACKOFF (0xeL<<0) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE (0x7L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_IDLE (0x0L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_WAIT (0x1L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_UNI (0x2L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_MC (0x3L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC2 (0x4L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC3 (0x5L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_FILT_STATE_BC (0x6L<<4) +#define BNX2_EMAC_TXMAC_DEBUG3_CRS_DONE (1L<<7) +#define BNX2_EMAC_TXMAC_DEBUG3_XOFF (1L<<8) +#define BNX2_EMAC_TXMAC_DEBUG3_SE_COUNTER (0xfL<<9) +#define BNX2_EMAC_TXMAC_DEBUG3_QUANTA_COUNTER (0x1fL<<13) + +#define BNX2_EMAC_TXMAC_DEBUG4 0x00001668 +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_COUNTER (0xffffL<<0) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE (0xfL<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_IDLE (0x0L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA1 (0x2L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA2 (0x3L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC3 (0x4L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC2 (0x5L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_MCA3 (0x6L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_SRC1 (0x7L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CRC1 (0x8L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CRC2 (0x9L<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_TIME (0xaL<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_TYPE (0xcL<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_WAIT (0xdL<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_PAUSE_STATE_CMD (0xeL<<16) +#define BNX2_EMAC_TXMAC_DEBUG4_STATS0_VALID (1L<<20) +#define BNX2_EMAC_TXMAC_DEBUG4_APPEND_CRC (1L<<21) +#define BNX2_EMAC_TXMAC_DEBUG4_SLOT_FILLED (1L<<22) +#define BNX2_EMAC_TXMAC_DEBUG4_MAX_DEFER (1L<<23) +#define BNX2_EMAC_TXMAC_DEBUG4_SEND_EXTEND (1L<<24) +#define BNX2_EMAC_TXMAC_DEBUG4_SEND_PADDING (1L<<25) +#define BNX2_EMAC_TXMAC_DEBUG4_EOF_LOC (1L<<26) +#define BNX2_EMAC_TXMAC_DEBUG4_COLLIDING (1L<<27) +#define BNX2_EMAC_TXMAC_DEBUG4_COL_IN (1L<<28) +#define BNX2_EMAC_TXMAC_DEBUG4_BURSTING (1L<<29) +#define BNX2_EMAC_TXMAC_DEBUG4_ADVANCE (1L<<30) +#define BNX2_EMAC_TXMAC_DEBUG4_GO (1L<<31) + +#define BNX2_EMAC_TX_STAT_AC0 0x00001680 +#define BNX2_EMAC_TX_STAT_AC1 0x00001684 +#define BNX2_EMAC_TX_STAT_AC2 0x00001688 +#define BNX2_EMAC_TX_STAT_AC3 0x0000168c +#define BNX2_EMAC_TX_STAT_AC4 0x00001690 +#define BNX2_EMAC_TX_STAT_AC5 0x00001694 +#define BNX2_EMAC_TX_STAT_AC6 0x00001698 +#define BNX2_EMAC_TX_STAT_AC7 0x0000169c +#define BNX2_EMAC_TX_STAT_AC8 0x000016a0 +#define BNX2_EMAC_TX_STAT_AC9 0x000016a4 +#define BNX2_EMAC_TX_STAT_AC10 0x000016a8 +#define BNX2_EMAC_TX_STAT_AC11 0x000016ac +#define BNX2_EMAC_TX_STAT_AC12 0x000016b0 +#define BNX2_EMAC_TX_STAT_AC13 0x000016b4 +#define BNX2_EMAC_TX_STAT_AC14 0x000016b8 +#define BNX2_EMAC_TX_STAT_AC15 0x000016bc +#define BNX2_EMAC_TX_STAT_AC16 0x000016c0 +#define BNX2_EMAC_TX_STAT_AC17 0x000016c4 +#define BNX2_EMAC_TX_STAT_AC18 0x000016c8 +#define BNX2_EMAC_TX_STAT_AC19 0x000016cc +#define BNX2_EMAC_TX_STAT_AC20 0x000016d0 +#define BNX2_EMAC_TXMAC_SUC_DBG_OVERRUNVEC 0x000016d8 +#define BNX2_EMAC_TX_RATE_LIMIT_CTRL 0x000016fc +#define BNX2_EMAC_TX_RATE_LIMIT_CTRL_TX_THROTTLE_INC (0x7fL<<0) +#define BNX2_EMAC_TX_RATE_LIMIT_CTRL_TX_THROTTLE_NUM (0x7fL<<16) +#define BNX2_EMAC_TX_RATE_LIMIT_CTRL_RATE_LIMITER_EN (1L<<31) + + +/* + * rpm_reg definition + * offset: 0x1800 + */ +#define BNX2_RPM_COMMAND 0x00001800 +#define BNX2_RPM_COMMAND_ENABLED (1L<<0) +#define BNX2_RPM_COMMAND_OVERRUN_ABORT (1L<<4) + +#define BNX2_RPM_STATUS 0x00001804 +#define BNX2_RPM_STATUS_MBUF_WAIT (1L<<0) +#define BNX2_RPM_STATUS_FREE_WAIT (1L<<1) + +#define BNX2_RPM_CONFIG 0x00001808 +#define BNX2_RPM_CONFIG_NO_PSD_HDR_CKSUM (1L<<0) +#define BNX2_RPM_CONFIG_ACPI_ENA (1L<<1) +#define BNX2_RPM_CONFIG_ACPI_KEEP (1L<<2) +#define BNX2_RPM_CONFIG_MP_KEEP (1L<<3) +#define BNX2_RPM_CONFIG_SORT_VECT_VAL (0xfL<<4) +#define BNX2_RPM_CONFIG_DISABLE_WOL_ASSERT (1L<<30) +#define BNX2_RPM_CONFIG_IGNORE_VLAN (1L<<31) + +#define BNX2_RPM_MGMT_PKT_CTRL 0x0000180c +#define BNX2_RPM_MGMT_PKT_CTRL_MGMT_SORT (0xfL<<0) +#define BNX2_RPM_MGMT_PKT_CTRL_MGMT_RULE (0xfL<<4) +#define BNX2_RPM_MGMT_PKT_CTRL_MGMT_DISCARD_EN (1L<<30) +#define BNX2_RPM_MGMT_PKT_CTRL_MGMT_EN (1L<<31) + +#define BNX2_RPM_VLAN_MATCH0 0x00001810 +#define BNX2_RPM_VLAN_MATCH0_RPM_VLAN_MTCH0_VALUE (0xfffL<<0) + +#define BNX2_RPM_VLAN_MATCH1 0x00001814 +#define BNX2_RPM_VLAN_MATCH1_RPM_VLAN_MTCH1_VALUE (0xfffL<<0) + +#define BNX2_RPM_VLAN_MATCH2 0x00001818 +#define BNX2_RPM_VLAN_MATCH2_RPM_VLAN_MTCH2_VALUE (0xfffL<<0) + +#define BNX2_RPM_VLAN_MATCH3 0x0000181c +#define BNX2_RPM_VLAN_MATCH3_RPM_VLAN_MTCH3_VALUE (0xfffL<<0) + +#define BNX2_RPM_SORT_USER0 0x00001820 +#define BNX2_RPM_SORT_USER0_PM_EN (0xffffL<<0) +#define BNX2_RPM_SORT_USER0_BC_EN (1L<<16) +#define BNX2_RPM_SORT_USER0_MC_EN (1L<<17) +#define BNX2_RPM_SORT_USER0_MC_HSH_EN (1L<<18) +#define BNX2_RPM_SORT_USER0_PROM_EN (1L<<19) +#define BNX2_RPM_SORT_USER0_VLAN_EN (0xfL<<20) +#define BNX2_RPM_SORT_USER0_PROM_VLAN (1L<<24) +#define BNX2_RPM_SORT_USER0_VLAN_NOTMATCH (1L<<25) +#define BNX2_RPM_SORT_USER0_ENA (1L<<31) + +#define BNX2_RPM_SORT_USER1 0x00001824 +#define BNX2_RPM_SORT_USER1_PM_EN (0xffffL<<0) +#define BNX2_RPM_SORT_USER1_BC_EN (1L<<16) +#define BNX2_RPM_SORT_USER1_MC_EN (1L<<17) +#define BNX2_RPM_SORT_USER1_MC_HSH_EN (1L<<18) +#define BNX2_RPM_SORT_USER1_PROM_EN (1L<<19) +#define BNX2_RPM_SORT_USER1_VLAN_EN (0xfL<<20) +#define BNX2_RPM_SORT_USER1_PROM_VLAN (1L<<24) +#define BNX2_RPM_SORT_USER1_ENA (1L<<31) + +#define BNX2_RPM_SORT_USER2 0x00001828 +#define BNX2_RPM_SORT_USER2_PM_EN (0xffffL<<0) +#define BNX2_RPM_SORT_USER2_BC_EN (1L<<16) +#define BNX2_RPM_SORT_USER2_MC_EN (1L<<17) +#define BNX2_RPM_SORT_USER2_MC_HSH_EN (1L<<18) +#define BNX2_RPM_SORT_USER2_PROM_EN (1L<<19) +#define BNX2_RPM_SORT_USER2_VLAN_EN (0xfL<<20) +#define BNX2_RPM_SORT_USER2_PROM_VLAN (1L<<24) +#define BNX2_RPM_SORT_USER2_ENA (1L<<31) + +#define BNX2_RPM_SORT_USER3 0x0000182c +#define BNX2_RPM_SORT_USER3_PM_EN (0xffffL<<0) +#define BNX2_RPM_SORT_USER3_BC_EN (1L<<16) +#define BNX2_RPM_SORT_USER3_MC_EN (1L<<17) +#define BNX2_RPM_SORT_USER3_MC_HSH_EN (1L<<18) +#define BNX2_RPM_SORT_USER3_PROM_EN (1L<<19) +#define BNX2_RPM_SORT_USER3_VLAN_EN (0xfL<<20) +#define BNX2_RPM_SORT_USER3_PROM_VLAN (1L<<24) +#define BNX2_RPM_SORT_USER3_ENA (1L<<31) + +#define BNX2_RPM_STAT_L2_FILTER_DISCARDS 0x00001840 +#define BNX2_RPM_STAT_RULE_CHECKER_DISCARDS 0x00001844 +#define BNX2_RPM_STAT_IFINFTQDISCARDS 0x00001848 +#define BNX2_RPM_STAT_IFINMBUFDISCARD 0x0000184c +#define BNX2_RPM_STAT_RULE_CHECKER_P4_HIT 0x00001850 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION0 0x00001854 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION0_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION0_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION0_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION0_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION1 0x00001858 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION1_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION1_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION1_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION1_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION2 0x0000185c +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION2_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION2_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION2_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION2_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION3 0x00001860 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION3_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION3_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION3_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION3_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION4 0x00001864 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION4_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION4_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION4_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION4_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION5 0x00001868 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION5_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION5_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION5_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION5_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION6 0x0000186c +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION6_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION6_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION6_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION6_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION7 0x00001870 +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION7_NEXT_HEADER_LEN (0xffL<<0) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION7_NEXT_HEADER (0xffL<<16) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION7_NEXT_HEADER_LEN_TYPE (1L<<30) +#define BNX2_RPM_IPV6_PROGRAMMABLE_EXTENSION7_NEXT_HEADER_EN (1L<<31) + +#define BNX2_RPM_STAT_AC0 0x00001880 +#define BNX2_RPM_STAT_AC1 0x00001884 +#define BNX2_RPM_STAT_AC2 0x00001888 +#define BNX2_RPM_STAT_AC3 0x0000188c +#define BNX2_RPM_STAT_AC4 0x00001890 +#define BNX2_RPM_RC_CNTL_16 0x000018e0 +#define BNX2_RPM_RC_CNTL_16_OFFSET (0xffL<<0) +#define BNX2_RPM_RC_CNTL_16_CLASS (0x7L<<8) +#define BNX2_RPM_RC_CNTL_16_PRIORITY (1L<<11) +#define BNX2_RPM_RC_CNTL_16_P4 (1L<<12) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE (0x7L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_START (0L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_IP (1L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_TCP (2L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_UDP (3L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_DATA (4L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_TCP_UDP (5L<<13) +#define BNX2_RPM_RC_CNTL_16_HDR_TYPE_ICMPV6 (6L<<13) +#define BNX2_RPM_RC_CNTL_16_COMP (0x3L<<16) +#define BNX2_RPM_RC_CNTL_16_COMP_EQUAL (0L<<16) +#define BNX2_RPM_RC_CNTL_16_COMP_NEQUAL (1L<<16) +#define BNX2_RPM_RC_CNTL_16_COMP_GREATER (2L<<16) +#define BNX2_RPM_RC_CNTL_16_COMP_LESS (3L<<16) +#define BNX2_RPM_RC_CNTL_16_MAP (1L<<18) +#define BNX2_RPM_RC_CNTL_16_SBIT (1L<<19) +#define BNX2_RPM_RC_CNTL_16_CMDSEL (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_16_DISCARD (1L<<25) +#define BNX2_RPM_RC_CNTL_16_MASK (1L<<26) +#define BNX2_RPM_RC_CNTL_16_P1 (1L<<27) +#define BNX2_RPM_RC_CNTL_16_P2 (1L<<28) +#define BNX2_RPM_RC_CNTL_16_P3 (1L<<29) +#define BNX2_RPM_RC_CNTL_16_NBIT (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_16 0x000018e4 +#define BNX2_RPM_RC_VALUE_MASK_16_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_16_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_17 0x000018e8 +#define BNX2_RPM_RC_CNTL_17_OFFSET (0xffL<<0) +#define BNX2_RPM_RC_CNTL_17_CLASS (0x7L<<8) +#define BNX2_RPM_RC_CNTL_17_PRIORITY (1L<<11) +#define BNX2_RPM_RC_CNTL_17_P4 (1L<<12) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE (0x7L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_START (0L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_IP (1L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_TCP (2L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_UDP (3L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_DATA (4L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_TCP_UDP (5L<<13) +#define BNX2_RPM_RC_CNTL_17_HDR_TYPE_ICMPV6 (6L<<13) +#define BNX2_RPM_RC_CNTL_17_COMP (0x3L<<16) +#define BNX2_RPM_RC_CNTL_17_COMP_EQUAL (0L<<16) +#define BNX2_RPM_RC_CNTL_17_COMP_NEQUAL (1L<<16) +#define BNX2_RPM_RC_CNTL_17_COMP_GREATER (2L<<16) +#define BNX2_RPM_RC_CNTL_17_COMP_LESS (3L<<16) +#define BNX2_RPM_RC_CNTL_17_MAP (1L<<18) +#define BNX2_RPM_RC_CNTL_17_SBIT (1L<<19) +#define BNX2_RPM_RC_CNTL_17_CMDSEL (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_17_DISCARD (1L<<25) +#define BNX2_RPM_RC_CNTL_17_MASK (1L<<26) +#define BNX2_RPM_RC_CNTL_17_P1 (1L<<27) +#define BNX2_RPM_RC_CNTL_17_P2 (1L<<28) +#define BNX2_RPM_RC_CNTL_17_P3 (1L<<29) +#define BNX2_RPM_RC_CNTL_17_NBIT (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_17 0x000018ec +#define BNX2_RPM_RC_VALUE_MASK_17_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_17_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_18 0x000018f0 +#define BNX2_RPM_RC_CNTL_18_OFFSET (0xffL<<0) +#define BNX2_RPM_RC_CNTL_18_CLASS (0x7L<<8) +#define BNX2_RPM_RC_CNTL_18_PRIORITY (1L<<11) +#define BNX2_RPM_RC_CNTL_18_P4 (1L<<12) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE (0x7L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_START (0L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_IP (1L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_TCP (2L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_UDP (3L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_DATA (4L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_TCP_UDP (5L<<13) +#define BNX2_RPM_RC_CNTL_18_HDR_TYPE_ICMPV6 (6L<<13) +#define BNX2_RPM_RC_CNTL_18_COMP (0x3L<<16) +#define BNX2_RPM_RC_CNTL_18_COMP_EQUAL (0L<<16) +#define BNX2_RPM_RC_CNTL_18_COMP_NEQUAL (1L<<16) +#define BNX2_RPM_RC_CNTL_18_COMP_GREATER (2L<<16) +#define BNX2_RPM_RC_CNTL_18_COMP_LESS (3L<<16) +#define BNX2_RPM_RC_CNTL_18_MAP (1L<<18) +#define BNX2_RPM_RC_CNTL_18_SBIT (1L<<19) +#define BNX2_RPM_RC_CNTL_18_CMDSEL (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_18_DISCARD (1L<<25) +#define BNX2_RPM_RC_CNTL_18_MASK (1L<<26) +#define BNX2_RPM_RC_CNTL_18_P1 (1L<<27) +#define BNX2_RPM_RC_CNTL_18_P2 (1L<<28) +#define BNX2_RPM_RC_CNTL_18_P3 (1L<<29) +#define BNX2_RPM_RC_CNTL_18_NBIT (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_18 0x000018f4 +#define BNX2_RPM_RC_VALUE_MASK_18_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_18_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_19 0x000018f8 +#define BNX2_RPM_RC_CNTL_19_OFFSET (0xffL<<0) +#define BNX2_RPM_RC_CNTL_19_CLASS (0x7L<<8) +#define BNX2_RPM_RC_CNTL_19_PRIORITY (1L<<11) +#define BNX2_RPM_RC_CNTL_19_P4 (1L<<12) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE (0x7L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_START (0L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_IP (1L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_TCP (2L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_UDP (3L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_DATA (4L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_TCP_UDP (5L<<13) +#define BNX2_RPM_RC_CNTL_19_HDR_TYPE_ICMPV6 (6L<<13) +#define BNX2_RPM_RC_CNTL_19_COMP (0x3L<<16) +#define BNX2_RPM_RC_CNTL_19_COMP_EQUAL (0L<<16) +#define BNX2_RPM_RC_CNTL_19_COMP_NEQUAL (1L<<16) +#define BNX2_RPM_RC_CNTL_19_COMP_GREATER (2L<<16) +#define BNX2_RPM_RC_CNTL_19_COMP_LESS (3L<<16) +#define BNX2_RPM_RC_CNTL_19_MAP (1L<<18) +#define BNX2_RPM_RC_CNTL_19_SBIT (1L<<19) +#define BNX2_RPM_RC_CNTL_19_CMDSEL (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_19_DISCARD (1L<<25) +#define BNX2_RPM_RC_CNTL_19_MASK (1L<<26) +#define BNX2_RPM_RC_CNTL_19_P1 (1L<<27) +#define BNX2_RPM_RC_CNTL_19_P2 (1L<<28) +#define BNX2_RPM_RC_CNTL_19_P3 (1L<<29) +#define BNX2_RPM_RC_CNTL_19_NBIT (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_19 0x000018fc +#define BNX2_RPM_RC_VALUE_MASK_19_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_19_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_0 0x00001900 +#define BNX2_RPM_RC_CNTL_0_OFFSET (0xffL<<0) +#define BNX2_RPM_RC_CNTL_0_CLASS (0x7L<<8) +#define BNX2_RPM_RC_CNTL_0_PRIORITY (1L<<11) +#define BNX2_RPM_RC_CNTL_0_P4 (1L<<12) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE (0x7L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_START (0L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_IP (1L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_TCP (2L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_UDP (3L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_DATA (4L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_TCP_UDP (5L<<13) +#define BNX2_RPM_RC_CNTL_0_HDR_TYPE_ICMPV6 (6L<<13) +#define BNX2_RPM_RC_CNTL_0_COMP (0x3L<<16) +#define BNX2_RPM_RC_CNTL_0_COMP_EQUAL (0L<<16) +#define BNX2_RPM_RC_CNTL_0_COMP_NEQUAL (1L<<16) +#define BNX2_RPM_RC_CNTL_0_COMP_GREATER (2L<<16) +#define BNX2_RPM_RC_CNTL_0_COMP_LESS (3L<<16) +#define BNX2_RPM_RC_CNTL_0_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_0_SBIT (1L<<19) +#define BNX2_RPM_RC_CNTL_0_CMDSEL (0xfL<<20) +#define BNX2_RPM_RC_CNTL_0_MAP (1L<<24) +#define BNX2_RPM_RC_CNTL_0_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_0_DISCARD (1L<<25) +#define BNX2_RPM_RC_CNTL_0_MASK (1L<<26) +#define BNX2_RPM_RC_CNTL_0_P1 (1L<<27) +#define BNX2_RPM_RC_CNTL_0_P2 (1L<<28) +#define BNX2_RPM_RC_CNTL_0_P3 (1L<<29) +#define BNX2_RPM_RC_CNTL_0_NBIT (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_0 0x00001904 +#define BNX2_RPM_RC_VALUE_MASK_0_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_0_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_1 0x00001908 +#define BNX2_RPM_RC_CNTL_1_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_1_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_1_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_1_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_1_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_1_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_1_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_1_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_1_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_1_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_1_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_1_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_1_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_1_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_1_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_1_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_1_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_1_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_1_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_1_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_1_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_1 0x0000190c +#define BNX2_RPM_RC_VALUE_MASK_1_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_1_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_2 0x00001910 +#define BNX2_RPM_RC_CNTL_2_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_2_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_2_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_2_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_2_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_2_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_2_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_2_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_2_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_2_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_2_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_2_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_2_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_2_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_2_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_2_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_2_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_2_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_2_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_2_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_2_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_2 0x00001914 +#define BNX2_RPM_RC_VALUE_MASK_2_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_2_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_3 0x00001918 +#define BNX2_RPM_RC_CNTL_3_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_3_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_3_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_3_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_3_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_3_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_3_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_3_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_3_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_3_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_3_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_3_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_3_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_3_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_3_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_3_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_3_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_3_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_3_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_3_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_3_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_3 0x0000191c +#define BNX2_RPM_RC_VALUE_MASK_3_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_3_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_4 0x00001920 +#define BNX2_RPM_RC_CNTL_4_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_4_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_4_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_4_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_4_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_4_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_4_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_4_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_4_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_4_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_4_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_4_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_4_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_4_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_4_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_4_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_4_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_4_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_4_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_4_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_4_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_4 0x00001924 +#define BNX2_RPM_RC_VALUE_MASK_4_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_4_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_5 0x00001928 +#define BNX2_RPM_RC_CNTL_5_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_5_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_5_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_5_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_5_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_5_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_5_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_5_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_5_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_5_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_5_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_5_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_5_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_5_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_5_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_5_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_5_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_5_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_5_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_5_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_5_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_5 0x0000192c +#define BNX2_RPM_RC_VALUE_MASK_5_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_5_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_6 0x00001930 +#define BNX2_RPM_RC_CNTL_6_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_6_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_6_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_6_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_6_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_6_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_6_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_6_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_6_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_6_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_6_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_6_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_6_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_6_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_6_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_6_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_6_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_6_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_6_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_6_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_6_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_6 0x00001934 +#define BNX2_RPM_RC_VALUE_MASK_6_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_6_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_7 0x00001938 +#define BNX2_RPM_RC_CNTL_7_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_7_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_7_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_7_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_7_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_7_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_7_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_7_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_7_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_7_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_7_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_7_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_7_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_7_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_7_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_7_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_7_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_7_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_7_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_7_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_7_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_7 0x0000193c +#define BNX2_RPM_RC_VALUE_MASK_7_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_7_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_8 0x00001940 +#define BNX2_RPM_RC_CNTL_8_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_8_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_8_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_8_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_8_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_8_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_8_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_8_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_8_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_8_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_8_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_8_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_8_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_8_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_8_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_8_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_8_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_8_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_8_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_8_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_8_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_8 0x00001944 +#define BNX2_RPM_RC_VALUE_MASK_8_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_8_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_9 0x00001948 +#define BNX2_RPM_RC_CNTL_9_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_9_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_9_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_9_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_9_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_9_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_9_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_9_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_9_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_9_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_9_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_9_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_9_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_9_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_9_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_9_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_9_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_9_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_9_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_9_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_9_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_9 0x0000194c +#define BNX2_RPM_RC_VALUE_MASK_9_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_9_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_10 0x00001950 +#define BNX2_RPM_RC_CNTL_10_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_10_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_10_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_10_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_10_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_10_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_10_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_10_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_10_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_10_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_10_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_10_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_10_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_10_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_10_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_10_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_10_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_10_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_10_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_10_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_10_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_10 0x00001954 +#define BNX2_RPM_RC_VALUE_MASK_10_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_10_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_11 0x00001958 +#define BNX2_RPM_RC_CNTL_11_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_11_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_11_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_11_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_11_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_11_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_11_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_11_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_11_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_11_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_11_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_11_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_11_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_11_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_11_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_11_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_11_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_11_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_11_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_11_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_11_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_11 0x0000195c +#define BNX2_RPM_RC_VALUE_MASK_11_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_11_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_12 0x00001960 +#define BNX2_RPM_RC_CNTL_12_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_12_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_12_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_12_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_12_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_12_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_12_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_12_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_12_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_12_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_12_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_12_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_12_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_12_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_12_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_12_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_12_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_12_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_12_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_12_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_12_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_12 0x00001964 +#define BNX2_RPM_RC_VALUE_MASK_12_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_12_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_13 0x00001968 +#define BNX2_RPM_RC_CNTL_13_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_13_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_13_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_13_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_13_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_13_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_13_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_13_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_13_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_13_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_13_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_13_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_13_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_13_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_13_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_13_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_13_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_13_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_13_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_13_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_13_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_13 0x0000196c +#define BNX2_RPM_RC_VALUE_MASK_13_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_13_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_14 0x00001970 +#define BNX2_RPM_RC_CNTL_14_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_14_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_14_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_14_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_14_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_14_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_14_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_14_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_14_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_14_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_14_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_14_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_14_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_14_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_14_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_14_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_14_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_14_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_14_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_14_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_14_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_14 0x00001974 +#define BNX2_RPM_RC_VALUE_MASK_14_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_14_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CNTL_15 0x00001978 +#define BNX2_RPM_RC_CNTL_15_A (0x3ffffL<<0) +#define BNX2_RPM_RC_CNTL_15_B (0xfffL<<19) +#define BNX2_RPM_RC_CNTL_15_OFFSET_XI (0xffL<<0) +#define BNX2_RPM_RC_CNTL_15_CLASS_XI (0x7L<<8) +#define BNX2_RPM_RC_CNTL_15_PRIORITY_XI (1L<<11) +#define BNX2_RPM_RC_CNTL_15_P4_XI (1L<<12) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_XI (0x7L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_START_XI (0L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_IP_XI (1L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_TCP_XI (2L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_UDP_XI (3L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_DATA_XI (4L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_TCP_UDP_XI (5L<<13) +#define BNX2_RPM_RC_CNTL_15_HDR_TYPE_ICMPV6_XI (6L<<13) +#define BNX2_RPM_RC_CNTL_15_COMP_XI (0x3L<<16) +#define BNX2_RPM_RC_CNTL_15_COMP_EQUAL_XI (0L<<16) +#define BNX2_RPM_RC_CNTL_15_COMP_NEQUAL_XI (1L<<16) +#define BNX2_RPM_RC_CNTL_15_COMP_GREATER_XI (2L<<16) +#define BNX2_RPM_RC_CNTL_15_COMP_LESS_XI (3L<<16) +#define BNX2_RPM_RC_CNTL_15_MAP_XI (1L<<18) +#define BNX2_RPM_RC_CNTL_15_SBIT_XI (1L<<19) +#define BNX2_RPM_RC_CNTL_15_CMDSEL_XI (0x1fL<<20) +#define BNX2_RPM_RC_CNTL_15_DISCARD_XI (1L<<25) +#define BNX2_RPM_RC_CNTL_15_MASK_XI (1L<<26) +#define BNX2_RPM_RC_CNTL_15_P1_XI (1L<<27) +#define BNX2_RPM_RC_CNTL_15_P2_XI (1L<<28) +#define BNX2_RPM_RC_CNTL_15_P3_XI (1L<<29) +#define BNX2_RPM_RC_CNTL_15_NBIT_XI (1L<<30) + +#define BNX2_RPM_RC_VALUE_MASK_15 0x0000197c +#define BNX2_RPM_RC_VALUE_MASK_15_VALUE (0xffffL<<0) +#define BNX2_RPM_RC_VALUE_MASK_15_MASK (0xffffL<<16) + +#define BNX2_RPM_RC_CONFIG 0x00001980 +#define BNX2_RPM_RC_CONFIG_RULE_ENABLE (0xffffL<<0) +#define BNX2_RPM_RC_CONFIG_RULE_ENABLE_XI (0xfffffL<<0) +#define BNX2_RPM_RC_CONFIG_DEF_CLASS (0x7L<<24) +#define BNX2_RPM_RC_CONFIG_KNUM_OVERWRITE (1L<<31) + +#define BNX2_RPM_DEBUG0 0x00001984 +#define BNX2_RPM_DEBUG0_FM_BCNT (0xffffL<<0) +#define BNX2_RPM_DEBUG0_T_DATA_OFST_VLD (1L<<16) +#define BNX2_RPM_DEBUG0_T_UDP_OFST_VLD (1L<<17) +#define BNX2_RPM_DEBUG0_T_TCP_OFST_VLD (1L<<18) +#define BNX2_RPM_DEBUG0_T_IP_OFST_VLD (1L<<19) +#define BNX2_RPM_DEBUG0_IP_MORE_FRGMT (1L<<20) +#define BNX2_RPM_DEBUG0_T_IP_NO_TCP_UDP_HDR (1L<<21) +#define BNX2_RPM_DEBUG0_LLC_SNAP (1L<<22) +#define BNX2_RPM_DEBUG0_FM_STARTED (1L<<23) +#define BNX2_RPM_DEBUG0_DONE (1L<<24) +#define BNX2_RPM_DEBUG0_WAIT_4_DONE (1L<<25) +#define BNX2_RPM_DEBUG0_USE_TPBUF_CKSUM (1L<<26) +#define BNX2_RPM_DEBUG0_RX_NO_PSD_HDR_CKSUM (1L<<27) +#define BNX2_RPM_DEBUG0_IGNORE_VLAN (1L<<28) +#define BNX2_RPM_DEBUG0_RP_ENA_ACTIVE (1L<<31) + +#define BNX2_RPM_DEBUG1 0x00001988 +#define BNX2_RPM_DEBUG1_FSM_CUR_ST (0xffffL<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IDLE (0L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B6_ALL (1L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B2_IPLLC (2L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B6_IP (4L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ETYPE_B2_IP (8L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IP_START (16L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_IP (32L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_TCP (64L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_UDP (128L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_AH (256L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ESP (512L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ESP_PAYLOAD (1024L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_DATA (2048L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ADD_CARRY (0x2000L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_ADD_CARRYOUT (0x4000L<<0) +#define BNX2_RPM_DEBUG1_FSM_CUR_ST_LATCH_RESULT (0x8000L<<0) +#define BNX2_RPM_DEBUG1_HDR_BCNT (0x7ffL<<16) +#define BNX2_RPM_DEBUG1_UNKNOWN_ETYPE_D (1L<<28) +#define BNX2_RPM_DEBUG1_VLAN_REMOVED_D2 (1L<<29) +#define BNX2_RPM_DEBUG1_VLAN_REMOVED_D1 (1L<<30) +#define BNX2_RPM_DEBUG1_EOF_0XTRA_WD (1L<<31) + +#define BNX2_RPM_DEBUG2 0x0000198c +#define BNX2_RPM_DEBUG2_CMD_HIT_VEC (0xffffL<<0) +#define BNX2_RPM_DEBUG2_IP_BCNT (0xffL<<16) +#define BNX2_RPM_DEBUG2_THIS_CMD_M4 (1L<<24) +#define BNX2_RPM_DEBUG2_THIS_CMD_M3 (1L<<25) +#define BNX2_RPM_DEBUG2_THIS_CMD_M2 (1L<<26) +#define BNX2_RPM_DEBUG2_THIS_CMD_M1 (1L<<27) +#define BNX2_RPM_DEBUG2_IPIPE_EMPTY (1L<<28) +#define BNX2_RPM_DEBUG2_FM_DISCARD (1L<<29) +#define BNX2_RPM_DEBUG2_LAST_RULE_IN_FM_D2 (1L<<30) +#define BNX2_RPM_DEBUG2_LAST_RULE_IN_FM_D1 (1L<<31) + +#define BNX2_RPM_DEBUG3 0x00001990 +#define BNX2_RPM_DEBUG3_AVAIL_MBUF_PTR (0x1ffL<<0) +#define BNX2_RPM_DEBUG3_RDE_RLUPQ_WR_REQ_INT (1L<<9) +#define BNX2_RPM_DEBUG3_RDE_RBUF_WR_LAST_INT (1L<<10) +#define BNX2_RPM_DEBUG3_RDE_RBUF_WR_REQ_INT (1L<<11) +#define BNX2_RPM_DEBUG3_RDE_RBUF_FREE_REQ (1L<<12) +#define BNX2_RPM_DEBUG3_RDE_RBUF_ALLOC_REQ (1L<<13) +#define BNX2_RPM_DEBUG3_DFSM_MBUF_NOTAVAIL (1L<<14) +#define BNX2_RPM_DEBUG3_RBUF_RDE_SOF_DROP (1L<<15) +#define BNX2_RPM_DEBUG3_DFIFO_VLD_ENTRY_CT (0xfL<<16) +#define BNX2_RPM_DEBUG3_RDE_SRC_FIFO_ALMFULL (1L<<21) +#define BNX2_RPM_DEBUG3_DROP_NXT_VLD (1L<<22) +#define BNX2_RPM_DEBUG3_DROP_NXT (1L<<23) +#define BNX2_RPM_DEBUG3_FTQ_FSM (0x3L<<24) +#define BNX2_RPM_DEBUG3_FTQ_FSM_IDLE (0x0L<<24) +#define BNX2_RPM_DEBUG3_FTQ_FSM_WAIT_ACK (0x1L<<24) +#define BNX2_RPM_DEBUG3_FTQ_FSM_WAIT_FREE (0x2L<<24) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM (0x3L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_SOF (0x0L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_GET_MBUF (0x1L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_DMA_DATA (0x2L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_DATA (0x3L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_EOF (0x4L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_MF_ACK (0x5L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_WAIT_DROP_NXT_VLD (0x6L<<26) +#define BNX2_RPM_DEBUG3_MBWRITE_FSM_DONE (0x7L<<26) +#define BNX2_RPM_DEBUG3_MBFREE_FSM (1L<<29) +#define BNX2_RPM_DEBUG3_MBFREE_FSM_IDLE (0L<<29) +#define BNX2_RPM_DEBUG3_MBFREE_FSM_WAIT_ACK (1L<<29) +#define BNX2_RPM_DEBUG3_MBALLOC_FSM (1L<<30) +#define BNX2_RPM_DEBUG3_MBALLOC_FSM_ET_MBUF (0x0L<<30) +#define BNX2_RPM_DEBUG3_MBALLOC_FSM_IVE_MBUF (0x1L<<30) +#define BNX2_RPM_DEBUG3_CCODE_EOF_ERROR (1L<<31) + +#define BNX2_RPM_DEBUG4 0x00001994 +#define BNX2_RPM_DEBUG4_DFSM_MBUF_CLUSTER (0x1ffffffL<<0) +#define BNX2_RPM_DEBUG4_DFIFO_CUR_CCODE (0x7L<<25) +#define BNX2_RPM_DEBUG4_MBWRITE_FSM (0x7L<<28) +#define BNX2_RPM_DEBUG4_DFIFO_EMPTY (1L<<31) + +#define BNX2_RPM_DEBUG5 0x00001998 +#define BNX2_RPM_DEBUG5_RDROP_WPTR (0x1fL<<0) +#define BNX2_RPM_DEBUG5_RDROP_ACPI_RPTR (0x1fL<<5) +#define BNX2_RPM_DEBUG5_RDROP_MC_RPTR (0x1fL<<10) +#define BNX2_RPM_DEBUG5_RDROP_RC_RPTR (0x1fL<<15) +#define BNX2_RPM_DEBUG5_RDROP_ACPI_EMPTY (1L<<20) +#define BNX2_RPM_DEBUG5_RDROP_MC_EMPTY (1L<<21) +#define BNX2_RPM_DEBUG5_RDROP_AEOF_VEC_AT_RDROP_MC_RPTR (1L<<22) +#define BNX2_RPM_DEBUG5_HOLDREG_WOL_DROP_INT (1L<<23) +#define BNX2_RPM_DEBUG5_HOLDREG_DISCARD (1L<<24) +#define BNX2_RPM_DEBUG5_HOLDREG_MBUF_NOTAVAIL (1L<<25) +#define BNX2_RPM_DEBUG5_HOLDREG_MC_EMPTY (1L<<26) +#define BNX2_RPM_DEBUG5_HOLDREG_RC_EMPTY (1L<<27) +#define BNX2_RPM_DEBUG5_HOLDREG_FC_EMPTY (1L<<28) +#define BNX2_RPM_DEBUG5_HOLDREG_ACPI_EMPTY (1L<<29) +#define BNX2_RPM_DEBUG5_HOLDREG_FULL_T (1L<<30) +#define BNX2_RPM_DEBUG5_HOLDREG_RD (1L<<31) + +#define BNX2_RPM_DEBUG6 0x0000199c +#define BNX2_RPM_DEBUG6_ACPI_VEC (0xffffL<<0) +#define BNX2_RPM_DEBUG6_VEC (0xffffL<<16) + +#define BNX2_RPM_DEBUG7 0x000019a0 +#define BNX2_RPM_DEBUG7_RPM_DBG7_LAST_CRC (0xffffffffL<<0) + +#define BNX2_RPM_DEBUG8 0x000019a4 +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM (0xfL<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_IDLE (0L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W1_ADDR (1L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W2_ADDR (2L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_W3_ADDR (3L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_SOF_WAIT_THBUF (4L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W3_DATA (5L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W0_ADDR (6L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W1_ADDR (7L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W2_ADDR (8L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_W3_ADDR (9L<<0) +#define BNX2_RPM_DEBUG8_PS_ACPI_FSM_WAIT_THBUF (10L<<0) +#define BNX2_RPM_DEBUG8_COMPARE_AT_W0 (1L<<4) +#define BNX2_RPM_DEBUG8_COMPARE_AT_W3_DATA (1L<<5) +#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_WAIT (1L<<6) +#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_W3 (1L<<7) +#define BNX2_RPM_DEBUG8_COMPARE_AT_SOF_W2 (1L<<8) +#define BNX2_RPM_DEBUG8_EOF_W_LTEQ6_VLDBYTES (1L<<9) +#define BNX2_RPM_DEBUG8_EOF_W_LTEQ4_VLDBYTES (1L<<10) +#define BNX2_RPM_DEBUG8_NXT_EOF_W_12_VLDBYTES (1L<<11) +#define BNX2_RPM_DEBUG8_EOF_DET (1L<<12) +#define BNX2_RPM_DEBUG8_SOF_DET (1L<<13) +#define BNX2_RPM_DEBUG8_WAIT_4_SOF (1L<<14) +#define BNX2_RPM_DEBUG8_ALL_DONE (1L<<15) +#define BNX2_RPM_DEBUG8_THBUF_ADDR (0x7fL<<16) +#define BNX2_RPM_DEBUG8_BYTE_CTR (0xffL<<24) + +#define BNX2_RPM_DEBUG9 0x000019a8 +#define BNX2_RPM_DEBUG9_OUTFIFO_COUNT (0x7L<<0) +#define BNX2_RPM_DEBUG9_RDE_ACPI_RDY (1L<<3) +#define BNX2_RPM_DEBUG9_VLD_RD_ENTRY_CT (0x7L<<4) +#define BNX2_RPM_DEBUG9_OUTFIFO_OVERRUN_OCCURRED (1L<<28) +#define BNX2_RPM_DEBUG9_INFIFO_OVERRUN_OCCURRED (1L<<29) +#define BNX2_RPM_DEBUG9_ACPI_MATCH_INT (1L<<30) +#define BNX2_RPM_DEBUG9_ACPI_ENABLE_SYN (1L<<31) +#define BNX2_RPM_DEBUG9_BEMEM_R_XI (0x1fL<<0) +#define BNX2_RPM_DEBUG9_EO_XI (1L<<5) +#define BNX2_RPM_DEBUG9_AEOF_DE_XI (1L<<6) +#define BNX2_RPM_DEBUG9_SO_XI (1L<<7) +#define BNX2_RPM_DEBUG9_WD64_CT_XI (0x1fL<<8) +#define BNX2_RPM_DEBUG9_EOF_VLDBYTE_XI (0x7L<<13) +#define BNX2_RPM_DEBUG9_ACPI_RDE_PAT_ID_XI (0xfL<<16) +#define BNX2_RPM_DEBUG9_CALCRC_RESULT_XI (0x3ffL<<20) +#define BNX2_RPM_DEBUG9_DATA_IN_VL_XI (1L<<30) +#define BNX2_RPM_DEBUG9_CALCRC_BUFFER_VLD_XI (1L<<31) + +#define BNX2_RPM_ACPI_DBG_BUF_W00 0x000019c0 +#define BNX2_RPM_ACPI_DBG_BUF_W01 0x000019c4 +#define BNX2_RPM_ACPI_DBG_BUF_W02 0x000019c8 +#define BNX2_RPM_ACPI_DBG_BUF_W03 0x000019cc +#define BNX2_RPM_ACPI_DBG_BUF_W10 0x000019d0 +#define BNX2_RPM_ACPI_DBG_BUF_W11 0x000019d4 +#define BNX2_RPM_ACPI_DBG_BUF_W12 0x000019d8 +#define BNX2_RPM_ACPI_DBG_BUF_W13 0x000019dc +#define BNX2_RPM_ACPI_DBG_BUF_W20 0x000019e0 +#define BNX2_RPM_ACPI_DBG_BUF_W21 0x000019e4 +#define BNX2_RPM_ACPI_DBG_BUF_W22 0x000019e8 +#define BNX2_RPM_ACPI_DBG_BUF_W23 0x000019ec +#define BNX2_RPM_ACPI_DBG_BUF_W30 0x000019f0 +#define BNX2_RPM_ACPI_DBG_BUF_W31 0x000019f4 +#define BNX2_RPM_ACPI_DBG_BUF_W32 0x000019f8 +#define BNX2_RPM_ACPI_DBG_BUF_W33 0x000019fc +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL 0x00001a00 +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL_BYTE_ADDRESS (0xffffL<<0) +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL_DEBUGRD (1L<<28) +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL_MODE (1L<<29) +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL_INIT (1L<<30) +#define BNX2_RPM_ACPI_BYTE_ENABLE_CTRL_WR (1L<<31) + +#define BNX2_RPM_ACPI_PATTERN_CTRL 0x00001a04 +#define BNX2_RPM_ACPI_PATTERN_CTRL_PATTERN_ID (0xfL<<0) +#define BNX2_RPM_ACPI_PATTERN_CTRL_CRC_SM_CLR (1L<<30) +#define BNX2_RPM_ACPI_PATTERN_CTRL_WR (1L<<31) + +#define BNX2_RPM_ACPI_DATA 0x00001a08 +#define BNX2_RPM_ACPI_DATA_PATTERN_BE (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_LEN0 0x00001a0c +#define BNX2_RPM_ACPI_PATTERN_LEN0_PATTERN_LEN3 (0xffL<<0) +#define BNX2_RPM_ACPI_PATTERN_LEN0_PATTERN_LEN2 (0xffL<<8) +#define BNX2_RPM_ACPI_PATTERN_LEN0_PATTERN_LEN1 (0xffL<<16) +#define BNX2_RPM_ACPI_PATTERN_LEN0_PATTERN_LEN0 (0xffL<<24) + +#define BNX2_RPM_ACPI_PATTERN_LEN1 0x00001a10 +#define BNX2_RPM_ACPI_PATTERN_LEN1_PATTERN_LEN7 (0xffL<<0) +#define BNX2_RPM_ACPI_PATTERN_LEN1_PATTERN_LEN6 (0xffL<<8) +#define BNX2_RPM_ACPI_PATTERN_LEN1_PATTERN_LEN5 (0xffL<<16) +#define BNX2_RPM_ACPI_PATTERN_LEN1_PATTERN_LEN4 (0xffL<<24) + +#define BNX2_RPM_ACPI_PATTERN_CRC0 0x00001a18 +#define BNX2_RPM_ACPI_PATTERN_CRC0_PATTERN_CRC0 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC1 0x00001a1c +#define BNX2_RPM_ACPI_PATTERN_CRC1_PATTERN_CRC1 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC2 0x00001a20 +#define BNX2_RPM_ACPI_PATTERN_CRC2_PATTERN_CRC2 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC3 0x00001a24 +#define BNX2_RPM_ACPI_PATTERN_CRC3_PATTERN_CRC3 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC4 0x00001a28 +#define BNX2_RPM_ACPI_PATTERN_CRC4_PATTERN_CRC4 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC5 0x00001a2c +#define BNX2_RPM_ACPI_PATTERN_CRC5_PATTERN_CRC5 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC6 0x00001a30 +#define BNX2_RPM_ACPI_PATTERN_CRC6_PATTERN_CRC6 (0xffffffffL<<0) + +#define BNX2_RPM_ACPI_PATTERN_CRC7 0x00001a34 +#define BNX2_RPM_ACPI_PATTERN_CRC7_PATTERN_CRC7 (0xffffffffL<<0) + + +/* + * rlup_reg definition + * offset: 0x2000 + */ +#define BNX2_RLUP_RSS_CONFIG 0x0000201c +#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_XI (0x3L<<0) +#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_OFF_XI (0L<<0) +#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_ALL_XI (1L<<0) +#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_IP_ONLY_XI (2L<<0) +#define BNX2_RLUP_RSS_CONFIG_IPV4_RSS_TYPE_RES_XI (3L<<0) +#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_XI (0x3L<<2) +#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_OFF_XI (0L<<2) +#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_ALL_XI (1L<<2) +#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_IP_ONLY_XI (2L<<2) +#define BNX2_RLUP_RSS_CONFIG_IPV6_RSS_TYPE_RES_XI (3L<<2) + + +/* + * rbuf_reg definition + * offset: 0x200000 + */ +#define BNX2_RBUF_COMMAND 0x00200000 +#define BNX2_RBUF_COMMAND_ENABLED (1L<<0) +#define BNX2_RBUF_COMMAND_FREE_INIT (1L<<1) +#define BNX2_RBUF_COMMAND_RAM_INIT (1L<<2) +#define BNX2_RBUF_COMMAND_PKT_OFFSET_OVFL (1L<<3) +#define BNX2_RBUF_COMMAND_OVER_FREE (1L<<4) +#define BNX2_RBUF_COMMAND_ALLOC_REQ (1L<<5) +#define BNX2_RBUF_COMMAND_EN_PRI_CHNGE_TE (1L<<6) +#define BNX2_RBUF_COMMAND_CU_ISOLATE_XI (1L<<5) +#define BNX2_RBUF_COMMAND_EN_PRI_CHANGE_XI (1L<<6) +#define BNX2_RBUF_COMMAND_GRC_ENDIAN_CONV_DIS_XI (1L<<7) + +#define BNX2_RBUF_STATUS1 0x00200004 +#define BNX2_RBUF_STATUS1_FREE_COUNT (0x3ffL<<0) + +#define BNX2_RBUF_STATUS2 0x00200008 +#define BNX2_RBUF_STATUS2_FREE_TAIL (0x1ffL<<0) +#define BNX2_RBUF_STATUS2_FREE_HEAD (0x1ffL<<16) + +#define BNX2_RBUF_CONFIG 0x0020000c +#define BNX2_RBUF_CONFIG_XOFF_TRIP (0x3ffL<<0) +#define BNX2_RBUF_CONFIG_XOFF_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 31 / 1000) + 54) +#define BNX2_RBUF_CONFIG_XON_TRIP (0x3ffL<<16) +#define BNX2_RBUF_CONFIG_XON_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 39 / 1000) + 66) +#define BNX2_RBUF_CONFIG_VAL(mtu) \ + (BNX2_RBUF_CONFIG_XOFF_TRIP_VAL(mtu) | \ + (BNX2_RBUF_CONFIG_XON_TRIP_VAL(mtu) << 16)) + +#define BNX2_RBUF_FW_BUF_ALLOC 0x00200010 +#define BNX2_RBUF_FW_BUF_ALLOC_VALUE (0x1ffL<<7) +#define BNX2_RBUF_FW_BUF_ALLOC_TYPE (1L<<16) +#define BNX2_RBUF_FW_BUF_ALLOC_ALLOC_REQ (1L<<31) + +#define BNX2_RBUF_FW_BUF_FREE 0x00200014 +#define BNX2_RBUF_FW_BUF_FREE_COUNT (0x7fL<<0) +#define BNX2_RBUF_FW_BUF_FREE_TAIL (0x1ffL<<7) +#define BNX2_RBUF_FW_BUF_FREE_HEAD (0x1ffL<<16) +#define BNX2_RBUF_FW_BUF_FREE_TYPE (1L<<25) +#define BNX2_RBUF_FW_BUF_FREE_FREE_REQ (1L<<31) + +#define BNX2_RBUF_FW_BUF_SEL 0x00200018 +#define BNX2_RBUF_FW_BUF_SEL_COUNT (0x7fL<<0) +#define BNX2_RBUF_FW_BUF_SEL_TAIL (0x1ffL<<7) +#define BNX2_RBUF_FW_BUF_SEL_HEAD (0x1ffL<<16) +#define BNX2_RBUF_FW_BUF_SEL_SEL_REQ (1L<<31) + +#define BNX2_RBUF_CONFIG2 0x0020001c +#define BNX2_RBUF_CONFIG2_MAC_DROP_TRIP (0x3ffL<<0) +#define BNX2_RBUF_CONFIG2_MAC_DROP_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 4 / 1000) + 5) +#define BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP (0x3ffL<<16) +#define BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 2 / 100) + 30) +#define BNX2_RBUF_CONFIG2_VAL(mtu) \ + (BNX2_RBUF_CONFIG2_MAC_DROP_TRIP_VAL(mtu) | \ + (BNX2_RBUF_CONFIG2_MAC_KEEP_TRIP_VAL(mtu) << 16)) + +#define BNX2_RBUF_CONFIG3 0x00200020 +#define BNX2_RBUF_CONFIG3_CU_DROP_TRIP (0x3ffL<<0) +#define BNX2_RBUF_CONFIG3_CU_DROP_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 12 / 1000) + 18) +#define BNX2_RBUF_CONFIG3_CU_KEEP_TRIP (0x3ffL<<16) +#define BNX2_RBUF_CONFIG3_CU_KEEP_TRIP_VAL(mtu) \ + ((((mtu) - 1500) * 2 / 100) + 30) +#define BNX2_RBUF_CONFIG3_VAL(mtu) \ + (BNX2_RBUF_CONFIG3_CU_DROP_TRIP_VAL(mtu) | \ + (BNX2_RBUF_CONFIG3_CU_KEEP_TRIP_VAL(mtu) << 16)) + +#define BNX2_RBUF_PKT_DATA 0x00208000 +#define BNX2_RBUF_CLIST_DATA 0x00210000 +#define BNX2_RBUF_BUF_DATA 0x00220000 + + +/* + * rv2p_reg definition + * offset: 0x2800 + */ +#define BNX2_RV2P_COMMAND 0x00002800 +#define BNX2_RV2P_COMMAND_ENABLED (1L<<0) +#define BNX2_RV2P_COMMAND_PROC1_INTRPT (1L<<1) +#define BNX2_RV2P_COMMAND_PROC2_INTRPT (1L<<2) +#define BNX2_RV2P_COMMAND_ABORT0 (1L<<4) +#define BNX2_RV2P_COMMAND_ABORT1 (1L<<5) +#define BNX2_RV2P_COMMAND_ABORT2 (1L<<6) +#define BNX2_RV2P_COMMAND_ABORT3 (1L<<7) +#define BNX2_RV2P_COMMAND_ABORT4 (1L<<8) +#define BNX2_RV2P_COMMAND_ABORT5 (1L<<9) +#define BNX2_RV2P_COMMAND_PROC1_RESET (1L<<16) +#define BNX2_RV2P_COMMAND_PROC2_RESET (1L<<17) +#define BNX2_RV2P_COMMAND_CTXIF_RESET (1L<<18) + +#define BNX2_RV2P_STATUS 0x00002804 +#define BNX2_RV2P_STATUS_ALWAYS_0 (1L<<0) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT0_CNT (1L<<8) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT1_CNT (1L<<9) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT2_CNT (1L<<10) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT3_CNT (1L<<11) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT4_CNT (1L<<12) +#define BNX2_RV2P_STATUS_RV2P_GEN_STAT5_CNT (1L<<13) + +#define BNX2_RV2P_CONFIG 0x00002808 +#define BNX2_RV2P_CONFIG_STALL_PROC1 (1L<<0) +#define BNX2_RV2P_CONFIG_STALL_PROC2 (1L<<1) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT0 (1L<<8) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT1 (1L<<9) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT2 (1L<<10) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT3 (1L<<11) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT4 (1L<<12) +#define BNX2_RV2P_CONFIG_PROC1_STALL_ON_ABORT5 (1L<<13) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT0 (1L<<16) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT1 (1L<<17) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT2 (1L<<18) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT3 (1L<<19) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT4 (1L<<20) +#define BNX2_RV2P_CONFIG_PROC2_STALL_ON_ABORT5 (1L<<21) +#define BNX2_RV2P_CONFIG_PAGE_SIZE (0xfL<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_256 (0L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_512 (1L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_1K (2L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_2K (3L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_4K (4L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_8K (5L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_16K (6L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_32K (7L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_64K (8L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_128K (9L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_256K (10L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_512K (11L<<24) +#define BNX2_RV2P_CONFIG_PAGE_SIZE_1M (12L<<24) + +#define BNX2_RV2P_GEN_BFR_ADDR_0 0x00002810 +#define BNX2_RV2P_GEN_BFR_ADDR_0_VALUE (0xffffL<<16) + +#define BNX2_RV2P_GEN_BFR_ADDR_1 0x00002814 +#define BNX2_RV2P_GEN_BFR_ADDR_1_VALUE (0xffffL<<16) + +#define BNX2_RV2P_GEN_BFR_ADDR_2 0x00002818 +#define BNX2_RV2P_GEN_BFR_ADDR_2_VALUE (0xffffL<<16) + +#define BNX2_RV2P_GEN_BFR_ADDR_3 0x0000281c +#define BNX2_RV2P_GEN_BFR_ADDR_3_VALUE (0xffffL<<16) + +#define BNX2_RV2P_INSTR_HIGH 0x00002830 +#define BNX2_RV2P_INSTR_HIGH_HIGH (0x1fL<<0) + +#define BNX2_RV2P_INSTR_LOW 0x00002834 +#define BNX2_RV2P_INSTR_LOW_LOW (0xffffffffL<<0) + +#define BNX2_RV2P_PROC1_ADDR_CMD 0x00002838 +#define BNX2_RV2P_PROC1_ADDR_CMD_ADD (0x3ffL<<0) +#define BNX2_RV2P_PROC1_ADDR_CMD_RDWR (1L<<31) + +#define BNX2_RV2P_PROC2_ADDR_CMD 0x0000283c +#define BNX2_RV2P_PROC2_ADDR_CMD_ADD (0x3ffL<<0) +#define BNX2_RV2P_PROC2_ADDR_CMD_RDWR (1L<<31) + +#define BNX2_RV2P_PROC1_GRC_DEBUG 0x00002840 +#define BNX2_RV2P_PROC2_GRC_DEBUG 0x00002844 +#define BNX2_RV2P_GRC_PROC_DEBUG 0x00002848 +#define BNX2_RV2P_DEBUG_VECT_PEEK 0x0000284c +#define BNX2_RV2P_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_RV2P_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_RV2P_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_RV2P_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_RV2P_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_RV2P_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_RV2P_MPFE_PFE_CTL 0x00002afc +#define BNX2_RV2P_MPFE_PFE_CTL_INC_USAGE_CNT (1L<<0) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE (0xfL<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_0 (0L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_1 (1L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_2 (2L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_3 (3L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_4 (4L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_5 (5L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_6 (6L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_7 (7L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_8 (8L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_9 (9L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_10 (10L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_11 (11L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_12 (12L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_13 (13L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_14 (14L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_SIZE_15 (15L<<4) +#define BNX2_RV2P_MPFE_PFE_CTL_PFE_COUNT (0xfL<<12) +#define BNX2_RV2P_MPFE_PFE_CTL_OFFSET (0x1ffL<<16) + +#define BNX2_RV2P_RV2PPQ 0x00002b40 +#define BNX2_RV2P_PFTQ_CMD 0x00002b78 +#define BNX2_RV2P_PFTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_RV2P_PFTQ_CMD_WR_TOP (1L<<10) +#define BNX2_RV2P_PFTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_RV2P_PFTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_RV2P_PFTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_RV2P_PFTQ_CMD_RD_DATA (1L<<26) +#define BNX2_RV2P_PFTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_RV2P_PFTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_RV2P_PFTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_RV2P_PFTQ_CMD_POP (1L<<30) +#define BNX2_RV2P_PFTQ_CMD_BUSY (1L<<31) + +#define BNX2_RV2P_PFTQ_CTL 0x00002b7c +#define BNX2_RV2P_PFTQ_CTL_INTERVENE (1L<<0) +#define BNX2_RV2P_PFTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_RV2P_PFTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_RV2P_PFTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_RV2P_PFTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_RV2P_RV2PTQ 0x00002b80 +#define BNX2_RV2P_TFTQ_CMD 0x00002bb8 +#define BNX2_RV2P_TFTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_RV2P_TFTQ_CMD_WR_TOP (1L<<10) +#define BNX2_RV2P_TFTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_RV2P_TFTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_RV2P_TFTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_RV2P_TFTQ_CMD_RD_DATA (1L<<26) +#define BNX2_RV2P_TFTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_RV2P_TFTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_RV2P_TFTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_RV2P_TFTQ_CMD_POP (1L<<30) +#define BNX2_RV2P_TFTQ_CMD_BUSY (1L<<31) + +#define BNX2_RV2P_TFTQ_CTL 0x00002bbc +#define BNX2_RV2P_TFTQ_CTL_INTERVENE (1L<<0) +#define BNX2_RV2P_TFTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_RV2P_TFTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_RV2P_TFTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_RV2P_TFTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_RV2P_RV2PMQ 0x00002bc0 +#define BNX2_RV2P_MFTQ_CMD 0x00002bf8 +#define BNX2_RV2P_MFTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_RV2P_MFTQ_CMD_WR_TOP (1L<<10) +#define BNX2_RV2P_MFTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_RV2P_MFTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_RV2P_MFTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_RV2P_MFTQ_CMD_RD_DATA (1L<<26) +#define BNX2_RV2P_MFTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_RV2P_MFTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_RV2P_MFTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_RV2P_MFTQ_CMD_POP (1L<<30) +#define BNX2_RV2P_MFTQ_CMD_BUSY (1L<<31) + +#define BNX2_RV2P_MFTQ_CTL 0x00002bfc +#define BNX2_RV2P_MFTQ_CTL_INTERVENE (1L<<0) +#define BNX2_RV2P_MFTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_RV2P_MFTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_RV2P_MFTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_RV2P_MFTQ_CTL_CUR_DEPTH (0x3ffL<<22) + + + +/* + * mq_reg definition + * offset: 0x3c00 + */ +#define BNX2_MQ_COMMAND 0x00003c00 +#define BNX2_MQ_COMMAND_ENABLED (1L<<0) +#define BNX2_MQ_COMMAND_INIT (1L<<1) +#define BNX2_MQ_COMMAND_OVERFLOW (1L<<4) +#define BNX2_MQ_COMMAND_WR_ERROR (1L<<5) +#define BNX2_MQ_COMMAND_RD_ERROR (1L<<6) +#define BNX2_MQ_COMMAND_IDB_CFG_ERROR (1L<<7) +#define BNX2_MQ_COMMAND_IDB_OVERFLOW (1L<<10) +#define BNX2_MQ_COMMAND_NO_BIN_ERROR (1L<<11) +#define BNX2_MQ_COMMAND_NO_MAP_ERROR (1L<<12) + +#define BNX2_MQ_STATUS 0x00003c04 +#define BNX2_MQ_STATUS_CTX_ACCESS_STAT (1L<<16) +#define BNX2_MQ_STATUS_CTX_ACCESS64_STAT (1L<<17) +#define BNX2_MQ_STATUS_PCI_STALL_STAT (1L<<18) +#define BNX2_MQ_STATUS_IDB_OFLOW_STAT (1L<<19) + +#define BNX2_MQ_CONFIG 0x00003c08 +#define BNX2_MQ_CONFIG_TX_HIGH_PRI (1L<<0) +#define BNX2_MQ_CONFIG_HALT_DIS (1L<<1) +#define BNX2_MQ_CONFIG_BIN_MQ_MODE (1L<<2) +#define BNX2_MQ_CONFIG_DIS_IDB_DROP (1L<<3) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE (0x7L<<4) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_256 (0L<<4) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_512 (1L<<4) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_1K (2L<<4) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_2K (3L<<4) +#define BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE_4K (4L<<4) +#define BNX2_MQ_CONFIG_MAX_DEPTH (0x7fL<<8) +#define BNX2_MQ_CONFIG_CUR_DEPTH (0x7fL<<20) + +#define BNX2_MQ_ENQUEUE1 0x00003c0c +#define BNX2_MQ_ENQUEUE1_OFFSET (0x3fL<<2) +#define BNX2_MQ_ENQUEUE1_CID (0x3fffL<<8) +#define BNX2_MQ_ENQUEUE1_BYTE_MASK (0xfL<<24) +#define BNX2_MQ_ENQUEUE1_KNL_MODE (1L<<28) + +#define BNX2_MQ_ENQUEUE2 0x00003c10 +#define BNX2_MQ_BAD_WR_ADDR 0x00003c14 +#define BNX2_MQ_BAD_RD_ADDR 0x00003c18 +#define BNX2_MQ_KNL_BYP_WIND_START 0x00003c1c +#define BNX2_MQ_KNL_BYP_WIND_START_VALUE (0xfffffL<<12) + +#define BNX2_MQ_KNL_WIND_END 0x00003c20 +#define BNX2_MQ_KNL_WIND_END_VALUE (0xffffffL<<8) + +#define BNX2_MQ_KNL_WRITE_MASK1 0x00003c24 +#define BNX2_MQ_KNL_TX_MASK1 0x00003c28 +#define BNX2_MQ_KNL_CMD_MASK1 0x00003c2c +#define BNX2_MQ_KNL_COND_ENQUEUE_MASK1 0x00003c30 +#define BNX2_MQ_KNL_RX_V2P_MASK1 0x00003c34 +#define BNX2_MQ_KNL_WRITE_MASK2 0x00003c38 +#define BNX2_MQ_KNL_TX_MASK2 0x00003c3c +#define BNX2_MQ_KNL_CMD_MASK2 0x00003c40 +#define BNX2_MQ_KNL_COND_ENQUEUE_MASK2 0x00003c44 +#define BNX2_MQ_KNL_RX_V2P_MASK2 0x00003c48 +#define BNX2_MQ_KNL_BYP_WRITE_MASK1 0x00003c4c +#define BNX2_MQ_KNL_BYP_TX_MASK1 0x00003c50 +#define BNX2_MQ_KNL_BYP_CMD_MASK1 0x00003c54 +#define BNX2_MQ_KNL_BYP_COND_ENQUEUE_MASK1 0x00003c58 +#define BNX2_MQ_KNL_BYP_RX_V2P_MASK1 0x00003c5c +#define BNX2_MQ_KNL_BYP_WRITE_MASK2 0x00003c60 +#define BNX2_MQ_KNL_BYP_TX_MASK2 0x00003c64 +#define BNX2_MQ_KNL_BYP_CMD_MASK2 0x00003c68 +#define BNX2_MQ_KNL_BYP_COND_ENQUEUE_MASK2 0x00003c6c +#define BNX2_MQ_KNL_BYP_RX_V2P_MASK2 0x00003c70 +#define BNX2_MQ_MEM_WR_ADDR 0x00003c74 +#define BNX2_MQ_MEM_WR_ADDR_VALUE (0x3fL<<0) + +#define BNX2_MQ_MEM_WR_DATA0 0x00003c78 +#define BNX2_MQ_MEM_WR_DATA0_VALUE (0xffffffffL<<0) + +#define BNX2_MQ_MEM_WR_DATA1 0x00003c7c +#define BNX2_MQ_MEM_WR_DATA1_VALUE (0xffffffffL<<0) + +#define BNX2_MQ_MEM_WR_DATA2 0x00003c80 +#define BNX2_MQ_MEM_WR_DATA2_VALUE (0x3fffffffL<<0) +#define BNX2_MQ_MEM_WR_DATA2_VALUE_XI (0x7fffffffL<<0) + +#define BNX2_MQ_MEM_RD_ADDR 0x00003c84 +#define BNX2_MQ_MEM_RD_ADDR_VALUE (0x3fL<<0) + +#define BNX2_MQ_MEM_RD_DATA0 0x00003c88 +#define BNX2_MQ_MEM_RD_DATA0_VALUE (0xffffffffL<<0) + +#define BNX2_MQ_MEM_RD_DATA1 0x00003c8c +#define BNX2_MQ_MEM_RD_DATA1_VALUE (0xffffffffL<<0) + +#define BNX2_MQ_MEM_RD_DATA2 0x00003c90 +#define BNX2_MQ_MEM_RD_DATA2_VALUE (0x3fffffffL<<0) +#define BNX2_MQ_MEM_RD_DATA2_VALUE_XI (0x7fffffffL<<0) + +#define BNX2_MQ_CONFIG2 0x00003d00 +#define BNX2_MQ_CONFIG2_CONT_SZ (0x7L<<4) +#define BNX2_MQ_CONFIG2_FIRST_L4L5 (0x1fL<<8) + +#define BNX2_MQ_MAP_L2_3 0x00003d2c +#define BNX2_MQ_MAP_L2_3_MQ_OFFSET (0xffL<<0) +#define BNX2_MQ_MAP_L2_3_SZ (0x3L<<8) +#define BNX2_MQ_MAP_L2_3_CTX_OFFSET (0x2ffL<<10) +#define BNX2_MQ_MAP_L2_3_BIN_OFFSET (0x7L<<23) +#define BNX2_MQ_MAP_L2_3_ARM (0x3L<<26) +#define BNX2_MQ_MAP_L2_3_ENA (0x1L<<31) +#define BNX2_MQ_MAP_L2_3_DEFAULT 0x82004646 + +#define BNX2_MQ_MAP_L2_5 0x00003d34 +#define BNX2_MQ_MAP_L2_5_ARM (0x3L<<26) + + +/* + * tsch_reg definition + * offset: 0x4c00 + */ +#define BNX2_TSCH_TSS_CFG 0x00004c1c +#define BNX2_TSCH_TSS_CFG_TSS_START_CID (0x7ffL<<8) +#define BNX2_TSCH_TSS_CFG_NUM_OF_TSS_CON (0xfL<<24) + + + +/* + * tbdr_reg definition + * offset: 0x5000 + */ +#define BNX2_TBDR_COMMAND 0x00005000 +#define BNX2_TBDR_COMMAND_ENABLE (1L<<0) +#define BNX2_TBDR_COMMAND_SOFT_RST (1L<<1) +#define BNX2_TBDR_COMMAND_MSTR_ABORT (1L<<4) + +#define BNX2_TBDR_STATUS 0x00005004 +#define BNX2_TBDR_STATUS_DMA_WAIT (1L<<0) +#define BNX2_TBDR_STATUS_FTQ_WAIT (1L<<1) +#define BNX2_TBDR_STATUS_FIFO_OVERFLOW (1L<<2) +#define BNX2_TBDR_STATUS_FIFO_UNDERFLOW (1L<<3) +#define BNX2_TBDR_STATUS_SEARCHMISS_ERROR (1L<<4) +#define BNX2_TBDR_STATUS_FTQ_ENTRY_CNT (1L<<5) +#define BNX2_TBDR_STATUS_BURST_CNT (1L<<6) + +#define BNX2_TBDR_CONFIG 0x00005008 +#define BNX2_TBDR_CONFIG_MAX_BDS (0xffL<<0) +#define BNX2_TBDR_CONFIG_SWAP_MODE (1L<<8) +#define BNX2_TBDR_CONFIG_PRIORITY (1L<<9) +#define BNX2_TBDR_CONFIG_CACHE_NEXT_PAGE_PTRS (1L<<10) +#define BNX2_TBDR_CONFIG_PAGE_SIZE (0xfL<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_256 (0L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_512 (1L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_1K (2L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_2K (3L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_4K (4L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_8K (5L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_16K (6L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_32K (7L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_64K (8L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_128K (9L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_256K (10L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_512K (11L<<24) +#define BNX2_TBDR_CONFIG_PAGE_SIZE_1M (12L<<24) + +#define BNX2_TBDR_DEBUG_VECT_PEEK 0x0000500c +#define BNX2_TBDR_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_TBDR_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_TBDR_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_TBDR_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_TBDR_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_TBDR_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_TBDR_CKSUM_ERROR_STATUS 0x00005010 +#define BNX2_TBDR_CKSUM_ERROR_STATUS_CALCULATED (0xffffL<<0) +#define BNX2_TBDR_CKSUM_ERROR_STATUS_EXPECTED (0xffffL<<16) + +#define BNX2_TBDR_TBDRQ 0x000053c0 +#define BNX2_TBDR_FTQ_CMD 0x000053f8 +#define BNX2_TBDR_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_TBDR_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_TBDR_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_TBDR_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_TBDR_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_TBDR_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_TBDR_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_TBDR_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_TBDR_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_TBDR_FTQ_CMD_POP (1L<<30) +#define BNX2_TBDR_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_TBDR_FTQ_CTL 0x000053fc +#define BNX2_TBDR_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_TBDR_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_TBDR_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_TBDR_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_TBDR_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + + + +/* + * tdma_reg definition + * offset: 0x5c00 + */ +#define BNX2_TDMA_COMMAND 0x00005c00 +#define BNX2_TDMA_COMMAND_ENABLED (1L<<0) +#define BNX2_TDMA_COMMAND_MASTER_ABORT (1L<<4) +#define BNX2_TDMA_COMMAND_CS16_ERR (1L<<5) +#define BNX2_TDMA_COMMAND_BAD_L2_LENGTH_ABORT (1L<<7) +#define BNX2_TDMA_COMMAND_MASK_CS1 (1L<<20) +#define BNX2_TDMA_COMMAND_MASK_CS2 (1L<<21) +#define BNX2_TDMA_COMMAND_MASK_CS3 (1L<<22) +#define BNX2_TDMA_COMMAND_MASK_CS4 (1L<<23) +#define BNX2_TDMA_COMMAND_FORCE_ILOCK_CKERR (1L<<24) +#define BNX2_TDMA_COMMAND_OFIFO_CLR (1L<<30) +#define BNX2_TDMA_COMMAND_IFIFO_CLR (1L<<31) + +#define BNX2_TDMA_STATUS 0x00005c04 +#define BNX2_TDMA_STATUS_DMA_WAIT (1L<<0) +#define BNX2_TDMA_STATUS_PAYLOAD_WAIT (1L<<1) +#define BNX2_TDMA_STATUS_PATCH_FTQ_WAIT (1L<<2) +#define BNX2_TDMA_STATUS_LOCK_WAIT (1L<<3) +#define BNX2_TDMA_STATUS_FTQ_ENTRY_CNT (1L<<16) +#define BNX2_TDMA_STATUS_BURST_CNT (1L<<17) +#define BNX2_TDMA_STATUS_MAX_IFIFO_DEPTH (0x3fL<<20) +#define BNX2_TDMA_STATUS_OFIFO_OVERFLOW (1L<<30) +#define BNX2_TDMA_STATUS_IFIFO_OVERFLOW (1L<<31) + +#define BNX2_TDMA_CONFIG 0x00005c08 +#define BNX2_TDMA_CONFIG_ONE_DMA (1L<<0) +#define BNX2_TDMA_CONFIG_ONE_RECORD (1L<<1) +#define BNX2_TDMA_CONFIG_NUM_DMA_CHAN (0x3L<<2) +#define BNX2_TDMA_CONFIG_NUM_DMA_CHAN_0 (0L<<2) +#define BNX2_TDMA_CONFIG_NUM_DMA_CHAN_1 (1L<<2) +#define BNX2_TDMA_CONFIG_NUM_DMA_CHAN_2 (2L<<2) +#define BNX2_TDMA_CONFIG_NUM_DMA_CHAN_3 (3L<<2) +#define BNX2_TDMA_CONFIG_LIMIT_SZ (0xfL<<4) +#define BNX2_TDMA_CONFIG_LIMIT_SZ_64 (0L<<4) +#define BNX2_TDMA_CONFIG_LIMIT_SZ_128 (0x4L<<4) +#define BNX2_TDMA_CONFIG_LIMIT_SZ_256 (0x6L<<4) +#define BNX2_TDMA_CONFIG_LIMIT_SZ_512 (0x8L<<4) +#define BNX2_TDMA_CONFIG_LINE_SZ (0xfL<<8) +#define BNX2_TDMA_CONFIG_LINE_SZ_64 (0L<<8) +#define BNX2_TDMA_CONFIG_LINE_SZ_128 (4L<<8) +#define BNX2_TDMA_CONFIG_LINE_SZ_256 (6L<<8) +#define BNX2_TDMA_CONFIG_LINE_SZ_512 (8L<<8) +#define BNX2_TDMA_CONFIG_ALIGN_ENA (1L<<15) +#define BNX2_TDMA_CONFIG_CHK_L2_BD (1L<<16) +#define BNX2_TDMA_CONFIG_CMPL_ENTRY (1L<<17) +#define BNX2_TDMA_CONFIG_OFIFO_CMP (1L<<19) +#define BNX2_TDMA_CONFIG_OFIFO_CMP_3 (0L<<19) +#define BNX2_TDMA_CONFIG_OFIFO_CMP_2 (1L<<19) +#define BNX2_TDMA_CONFIG_FIFO_CMP (0xfL<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_XI (0x7L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_0_XI (0L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_4_XI (1L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_8_XI (2L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_16_XI (3L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_32_XI (4L<<20) +#define BNX2_TDMA_CONFIG_IFIFO_DEPTH_64_XI (5L<<20) +#define BNX2_TDMA_CONFIG_FIFO_CMP_EN_XI (1L<<23) +#define BNX2_TDMA_CONFIG_BYTES_OST_XI (0x7L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_512_XI (0L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_1024_XI (1L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_2048_XI (2L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_4096_XI (3L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_8192_XI (4L<<24) +#define BNX2_TDMA_CONFIG_BYTES_OST_16384_XI (5L<<24) +#define BNX2_TDMA_CONFIG_HC_BYPASS_XI (1L<<27) +#define BNX2_TDMA_CONFIG_LCL_MRRS_XI (0x7L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_128_XI (0L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_256_XI (1L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_512_XI (2L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_1024_XI (3L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_2048_XI (4L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_4096_XI (5L<<28) +#define BNX2_TDMA_CONFIG_LCL_MRRS_EN_XI (1L<<31) + +#define BNX2_TDMA_PAYLOAD_PROD 0x00005c0c +#define BNX2_TDMA_PAYLOAD_PROD_VALUE (0x1fffL<<3) + +#define BNX2_TDMA_DBG_WATCHDOG 0x00005c10 +#define BNX2_TDMA_DBG_TRIGGER 0x00005c14 +#define BNX2_TDMA_DMAD_FSM 0x00005c80 +#define BNX2_TDMA_DMAD_FSM_BD_INVLD (1L<<0) +#define BNX2_TDMA_DMAD_FSM_PUSH (0xfL<<4) +#define BNX2_TDMA_DMAD_FSM_ARB_TBDC (0x3L<<8) +#define BNX2_TDMA_DMAD_FSM_ARB_CTX (1L<<12) +#define BNX2_TDMA_DMAD_FSM_DR_INTF (1L<<16) +#define BNX2_TDMA_DMAD_FSM_DMAD (0x7L<<20) +#define BNX2_TDMA_DMAD_FSM_BD (0xfL<<24) + +#define BNX2_TDMA_DMAD_STATUS 0x00005c84 +#define BNX2_TDMA_DMAD_STATUS_RHOLD_PUSH_ENTRY (0x3L<<0) +#define BNX2_TDMA_DMAD_STATUS_RHOLD_DMAD_ENTRY (0x3L<<4) +#define BNX2_TDMA_DMAD_STATUS_RHOLD_BD_ENTRY (0x3L<<8) +#define BNX2_TDMA_DMAD_STATUS_IFTQ_ENUM (0xfL<<12) + +#define BNX2_TDMA_DR_INTF_FSM 0x00005c88 +#define BNX2_TDMA_DR_INTF_FSM_L2_COMP (0x3L<<0) +#define BNX2_TDMA_DR_INTF_FSM_TPATQ (0x7L<<4) +#define BNX2_TDMA_DR_INTF_FSM_TPBUF (0x3L<<8) +#define BNX2_TDMA_DR_INTF_FSM_DR_BUF (0x7L<<12) +#define BNX2_TDMA_DR_INTF_FSM_DMAD (0x7L<<16) + +#define BNX2_TDMA_DR_INTF_STATUS 0x00005c8c +#define BNX2_TDMA_DR_INTF_STATUS_HOLE_PHASE (0x7L<<0) +#define BNX2_TDMA_DR_INTF_STATUS_DATA_AVAIL (0x3L<<4) +#define BNX2_TDMA_DR_INTF_STATUS_SHIFT_ADDR (0x7L<<8) +#define BNX2_TDMA_DR_INTF_STATUS_NXT_PNTR (0xfL<<12) +#define BNX2_TDMA_DR_INTF_STATUS_BYTE_COUNT (0x7L<<16) + +#define BNX2_TDMA_PUSH_FSM 0x00005c90 +#define BNX2_TDMA_BD_IF_DEBUG 0x00005c94 +#define BNX2_TDMA_DMAD_IF_DEBUG 0x00005c98 +#define BNX2_TDMA_CTX_IF_DEBUG 0x00005c9c +#define BNX2_TDMA_TPBUF_IF_DEBUG 0x00005ca0 +#define BNX2_TDMA_DR_IF_DEBUG 0x00005ca4 +#define BNX2_TDMA_TPATQ_IF_DEBUG 0x00005ca8 +#define BNX2_TDMA_TDMA_ILOCK_CKSUM 0x00005cac +#define BNX2_TDMA_TDMA_ILOCK_CKSUM_CALCULATED (0xffffL<<0) +#define BNX2_TDMA_TDMA_ILOCK_CKSUM_EXPECTED (0xffffL<<16) + +#define BNX2_TDMA_TDMA_PCIE_CKSUM 0x00005cb0 +#define BNX2_TDMA_TDMA_PCIE_CKSUM_CALCULATED (0xffffL<<0) +#define BNX2_TDMA_TDMA_PCIE_CKSUM_EXPECTED (0xffffL<<16) + +#define BNX2_TDMA_TDMAQ 0x00005fc0 +#define BNX2_TDMA_FTQ_CMD 0x00005ff8 +#define BNX2_TDMA_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_TDMA_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_TDMA_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_TDMA_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_TDMA_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_TDMA_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_TDMA_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_TDMA_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_TDMA_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_TDMA_FTQ_CMD_POP (1L<<30) +#define BNX2_TDMA_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_TDMA_FTQ_CTL 0x00005ffc +#define BNX2_TDMA_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_TDMA_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_TDMA_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_TDMA_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_TDMA_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + + + +/* + * hc_reg definition + * offset: 0x6800 + */ +#define BNX2_HC_COMMAND 0x00006800 +#define BNX2_HC_COMMAND_ENABLE (1L<<0) +#define BNX2_HC_COMMAND_SKIP_ABORT (1L<<4) +#define BNX2_HC_COMMAND_COAL_NOW (1L<<16) +#define BNX2_HC_COMMAND_COAL_NOW_WO_INT (1L<<17) +#define BNX2_HC_COMMAND_STATS_NOW (1L<<18) +#define BNX2_HC_COMMAND_FORCE_INT (0x3L<<19) +#define BNX2_HC_COMMAND_FORCE_INT_NULL (0L<<19) +#define BNX2_HC_COMMAND_FORCE_INT_HIGH (1L<<19) +#define BNX2_HC_COMMAND_FORCE_INT_LOW (2L<<19) +#define BNX2_HC_COMMAND_FORCE_INT_FREE (3L<<19) +#define BNX2_HC_COMMAND_CLR_STAT_NOW (1L<<21) +#define BNX2_HC_COMMAND_MAIN_PWR_INT (1L<<22) +#define BNX2_HC_COMMAND_COAL_ON_NEXT_EVENT (1L<<27) + +#define BNX2_HC_STATUS 0x00006804 +#define BNX2_HC_STATUS_MASTER_ABORT (1L<<0) +#define BNX2_HC_STATUS_PARITY_ERROR_STATE (1L<<1) +#define BNX2_HC_STATUS_PCI_CLK_CNT_STAT (1L<<16) +#define BNX2_HC_STATUS_CORE_CLK_CNT_STAT (1L<<17) +#define BNX2_HC_STATUS_NUM_STATUS_BLOCKS_STAT (1L<<18) +#define BNX2_HC_STATUS_NUM_INT_GEN_STAT (1L<<19) +#define BNX2_HC_STATUS_NUM_INT_MBOX_WR_STAT (1L<<20) +#define BNX2_HC_STATUS_CORE_CLKS_TO_HW_INTACK_STAT (1L<<23) +#define BNX2_HC_STATUS_CORE_CLKS_TO_SW_INTACK_STAT (1L<<24) +#define BNX2_HC_STATUS_CORE_CLKS_DURING_SW_INTACK_STAT (1L<<25) + +#define BNX2_HC_CONFIG 0x00006808 +#define BNX2_HC_CONFIG_COLLECT_STATS (1L<<0) +#define BNX2_HC_CONFIG_RX_TMR_MODE (1L<<1) +#define BNX2_HC_CONFIG_TX_TMR_MODE (1L<<2) +#define BNX2_HC_CONFIG_COM_TMR_MODE (1L<<3) +#define BNX2_HC_CONFIG_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_CONFIG_STATISTIC_PRIORITY (1L<<5) +#define BNX2_HC_CONFIG_STATUS_PRIORITY (1L<<6) +#define BNX2_HC_CONFIG_STAT_MEM_ADDR (0xffL<<8) +#define BNX2_HC_CONFIG_PER_MODE (1L<<16) +#define BNX2_HC_CONFIG_ONE_SHOT (1L<<17) +#define BNX2_HC_CONFIG_USE_INT_PARAM (1L<<18) +#define BNX2_HC_CONFIG_SET_MASK_AT_RD (1L<<19) +#define BNX2_HC_CONFIG_PER_COLLECT_LIMIT (0xfL<<20) +#define BNX2_HC_CONFIG_SB_ADDR_INC (0x7L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_64B (0L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_128B (1L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_256B (2L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_512B (3L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_1024B (4L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_2048B (5L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_4096B (6L<<24) +#define BNX2_HC_CONFIG_SB_ADDR_INC_8192B (7L<<24) +#define BNX2_HC_CONFIG_GEN_STAT_AVG_INTR (1L<<29) +#define BNX2_HC_CONFIG_UNMASK_ALL (1L<<30) +#define BNX2_HC_CONFIG_TX_SEL (1L<<31) + +#define BNX2_HC_ATTN_BITS_ENABLE 0x0000680c +#define BNX2_HC_STATUS_ADDR_L 0x00006810 +#define BNX2_HC_STATUS_ADDR_H 0x00006814 +#define BNX2_HC_STATISTICS_ADDR_L 0x00006818 +#define BNX2_HC_STATISTICS_ADDR_H 0x0000681c +#define BNX2_HC_TX_QUICK_CONS_TRIP 0x00006820 +#define BNX2_HC_TX_QUICK_CONS_TRIP_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP 0x00006824 +#define BNX2_HC_COMP_PROD_TRIP_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP 0x00006828 +#define BNX2_HC_RX_QUICK_CONS_TRIP_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS 0x0000682c +#define BNX2_HC_RX_TICKS_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS 0x00006830 +#define BNX2_HC_TX_TICKS_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS 0x00006834 +#define BNX2_HC_COM_TICKS_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS 0x00006838 +#define BNX2_HC_CMD_TICKS_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS 0x0000683c +#define BNX2_HC_PERIODIC_TICKS_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_STAT_COLLECT_TICKS 0x00006840 +#define BNX2_HC_STAT_COLLECT_TICKS_HC_STAT_COLL_TICKS (0xffL<<4) + +#define BNX2_HC_STATS_TICKS 0x00006844 +#define BNX2_HC_STATS_TICKS_HC_STAT_TICKS (0xffffL<<8) + +#define BNX2_HC_STATS_INTERRUPT_STATUS 0x00006848 +#define BNX2_HC_STATS_INTERRUPT_STATUS_SB_STATUS (0x1ffL<<0) +#define BNX2_HC_STATS_INTERRUPT_STATUS_INT_STATUS (0x1ffL<<16) + +#define BNX2_HC_STAT_MEM_DATA 0x0000684c +#define BNX2_HC_STAT_GEN_SEL_0 0x00006850 +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0 (0x7fL<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT0 (0L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT1 (1L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT2 (2L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT3 (3L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT4 (4L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT5 (5L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT6 (6L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT7 (7L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT8 (8L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT9 (9L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT10 (10L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXP_STAT11 (11L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT0 (12L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT1 (13L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT2 (14L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT3 (15L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT4 (16L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT5 (17L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT6 (18L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXP_STAT7 (19L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT0 (20L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT1 (21L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT2 (22L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT3 (23L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT4 (24L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT5 (25L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT6 (26L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT7 (27L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT8 (28L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT9 (29L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT10 (30L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COM_STAT11 (31L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT0 (32L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT1 (33L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT2 (34L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPAT_STAT3 (35L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT0 (36L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT1 (37L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT2 (38L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT3 (39L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT4 (40L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT5 (41L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT6 (42L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CP_STAT7 (43L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT0 (44L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT1 (45L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT2 (46L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT3 (47L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT4 (48L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT5 (49L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT6 (50L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MCP_STAT7 (51L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_PCI_CLK_CNT (52L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CORE_CLK_CNT (53L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS (54L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN (55L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR (56L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK (59L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK (60L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK (61L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCH_CMD_CNT (62L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCH_SLOT_CNT (63L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSCH_CMD_CNT (64L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSCH_SLOT_CNT (65L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RLUPQ_VALID_CNT (66L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXPQ_VALID_CNT (67L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RXPCQ_VALID_CNT (68L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PPQ_VALID_CNT (69L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PMQ_VALID_CNT (70L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PTQ_VALID_CNT (71L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMAQ_VALID_CNT (72L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TSCHQ_VALID_CNT (73L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDRQ_VALID_CNT (74L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TXPQ_VALID_CNT (75L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMAQ_VALID_CNT (76L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TPATQ_VALID_CNT (77L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TASQ_VALID_CNT (78L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CSQ_VALID_CNT (79L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CPQ_VALID_CNT (80L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMXQ_VALID_CNT (81L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMTQ_VALID_CNT (82L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_COMQ_VALID_CNT (83L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MGMQ_VALID_CNT (84L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_READ_TRANSFERS_CNT (85L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_READ_DELAY_PCI_CLKS_CNT (86L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_TRANSFERS_CNT (87L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_DELAY_PCI_CLKS_CNT (88L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_READ_RETRY_AFTER_DATA_CNT (89L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_WRITE_TRANSFERS_CNT (90L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_WRITE_DELAY_PCI_CLKS_CNT (91L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_TRANSFERS_CNT (92L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_DELAY_PCI_CLKS_CNT (93L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_DMAE_BIG_WRITE_RETRY_AFTER_DATA_CNT (94L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_WR_CNT64 (95L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_RD_CNT64 (96L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_ACC_STALL_CLKS (97L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_LOCK_STALL_CLKS (98L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_CTX_ACCESS_STAT (99L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_CTX_ACCESS64_STAT (100L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MBQ_PCI_STALL_STAT (101L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDR_FTQ_ENTRY_CNT (102L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TBDR_BURST_CNT (103L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMA_FTQ_ENTRY_CNT (104L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TDMA_BURST_CNT (105L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMA_FTQ_ENTRY_CNT (106L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RDMA_BURST_CNT (107L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RLUP_MATCH_CNT (108L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_POLL_PASS_CNT (109L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR1_CNT (110L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR2_CNT (111L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR3_CNT (112L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR4_CNT (113L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_TMR_TMR5_CNT (114L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT0 (115L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT1 (116L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT2 (117L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT3 (118L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT4 (119L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2P_STAT5 (120L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_PROC1_MISS (121L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_PROC2_MISS (122L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RBDC_BURST_CNT (127L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_1 (0x7fL<<8) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_2 (0x7fL<<16) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_3 (0x7fL<<24) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_XI (0xffL<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UMP_RX_FRAME_DROP_XI (52L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S0_XI (57L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S1_XI (58L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S2_XI (85L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S3_XI (86L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S4_XI (87L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S5_XI (88L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S6_XI (89L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S7_XI (90L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S8_XI (91L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S9_XI (92L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_UNUSED_S10_XI (93L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_MQ_IDB_OFLOW_XI (94L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_BLK_RD_CNT_XI (123L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_BLK_WR_CNT_XI (124L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_HITS_XI (125L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_CTX_MISSES_XI (126L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC1_XI (128L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC1_XI (129L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC1_XI (130L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC1_XI (131L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC1_XI (132L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC1_XI (133L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC2_XI (134L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC2_XI (135L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC2_XI (136L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC2_XI (137L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC2_XI (138L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC2_XI (139L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC3_XI (140L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC3_XI (141L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC3_XI (142L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC3_XI (143L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC3_XI (144L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC3_XI (145L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC4_XI (146L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC4_XI (147L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC4_XI (148L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC4_XI (149L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC4_XI (150L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC4_XI (151L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC5_XI (152L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC5_XI (153L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC5_XI (154L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC5_XI (155L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC5_XI (156L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC5_XI (157L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC6_XI (158L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC6_XI (159L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC6_XI (160L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC6_XI (161L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC6_XI (162L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC6_XI (163L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC7_XI (164L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC7_XI (165L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC7_XI (166L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC7_XI (167L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC7_XI (168L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC7_XI (169L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_STATUS_BLOCKS_VEC8_XI (170L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_GEN_VEC8_XI (171L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_NUM_INT_MBOX_WR_VEC8_XI (172L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_HW_INTACK_VEC8_XI (173L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_TO_SW_INTACK_VEC8_XI (174L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_HC_CORE_CLKS_DURING_SW_INTACK_VEC8_XI (175L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PCS_CMD_CNT_XI (176L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PCS_SLOT_CNT_XI (177L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_0_RV2PCSQ_VALID_CNT_XI (178L<<0) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_1_XI (0xffL<<8) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_2_XI (0xffL<<16) +#define BNX2_HC_STAT_GEN_SEL_0_GEN_SEL_3_XI (0xffL<<24) + +#define BNX2_HC_STAT_GEN_SEL_1 0x00006854 +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_4 (0x7fL<<0) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_5 (0x7fL<<8) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_6 (0x7fL<<16) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_7 (0x7fL<<24) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_4_XI (0xffL<<0) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_5_XI (0xffL<<8) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_6_XI (0xffL<<16) +#define BNX2_HC_STAT_GEN_SEL_1_GEN_SEL_7_XI (0xffL<<24) + +#define BNX2_HC_STAT_GEN_SEL_2 0x00006858 +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_8 (0x7fL<<0) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_9 (0x7fL<<8) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_10 (0x7fL<<16) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_11 (0x7fL<<24) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_8_XI (0xffL<<0) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_9_XI (0xffL<<8) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_10_XI (0xffL<<16) +#define BNX2_HC_STAT_GEN_SEL_2_GEN_SEL_11_XI (0xffL<<24) + +#define BNX2_HC_STAT_GEN_SEL_3 0x0000685c +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_12 (0x7fL<<0) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_13 (0x7fL<<8) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_14 (0x7fL<<16) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_15 (0x7fL<<24) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_12_XI (0xffL<<0) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_13_XI (0xffL<<8) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_14_XI (0xffL<<16) +#define BNX2_HC_STAT_GEN_SEL_3_GEN_SEL_15_XI (0xffL<<24) + +#define BNX2_HC_STAT_GEN_STAT0 0x00006888 +#define BNX2_HC_STAT_GEN_STAT1 0x0000688c +#define BNX2_HC_STAT_GEN_STAT2 0x00006890 +#define BNX2_HC_STAT_GEN_STAT3 0x00006894 +#define BNX2_HC_STAT_GEN_STAT4 0x00006898 +#define BNX2_HC_STAT_GEN_STAT5 0x0000689c +#define BNX2_HC_STAT_GEN_STAT6 0x000068a0 +#define BNX2_HC_STAT_GEN_STAT7 0x000068a4 +#define BNX2_HC_STAT_GEN_STAT8 0x000068a8 +#define BNX2_HC_STAT_GEN_STAT9 0x000068ac +#define BNX2_HC_STAT_GEN_STAT10 0x000068b0 +#define BNX2_HC_STAT_GEN_STAT11 0x000068b4 +#define BNX2_HC_STAT_GEN_STAT12 0x000068b8 +#define BNX2_HC_STAT_GEN_STAT13 0x000068bc +#define BNX2_HC_STAT_GEN_STAT14 0x000068c0 +#define BNX2_HC_STAT_GEN_STAT15 0x000068c4 +#define BNX2_HC_STAT_GEN_STAT_AC0 0x000068c8 +#define BNX2_HC_STAT_GEN_STAT_AC1 0x000068cc +#define BNX2_HC_STAT_GEN_STAT_AC2 0x000068d0 +#define BNX2_HC_STAT_GEN_STAT_AC3 0x000068d4 +#define BNX2_HC_STAT_GEN_STAT_AC4 0x000068d8 +#define BNX2_HC_STAT_GEN_STAT_AC5 0x000068dc +#define BNX2_HC_STAT_GEN_STAT_AC6 0x000068e0 +#define BNX2_HC_STAT_GEN_STAT_AC7 0x000068e4 +#define BNX2_HC_STAT_GEN_STAT_AC8 0x000068e8 +#define BNX2_HC_STAT_GEN_STAT_AC9 0x000068ec +#define BNX2_HC_STAT_GEN_STAT_AC10 0x000068f0 +#define BNX2_HC_STAT_GEN_STAT_AC11 0x000068f4 +#define BNX2_HC_STAT_GEN_STAT_AC12 0x000068f8 +#define BNX2_HC_STAT_GEN_STAT_AC13 0x000068fc +#define BNX2_HC_STAT_GEN_STAT_AC14 0x00006900 +#define BNX2_HC_STAT_GEN_STAT_AC15 0x00006904 +#define BNX2_HC_STAT_GEN_STAT_AC 0x000068c8 +#define BNX2_HC_VIS 0x00006908 +#define BNX2_HC_VIS_STAT_BUILD_STATE (0xfL<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_IDLE (0L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_START (1L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_REQUEST (2L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE64 (3L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE32 (4L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_UPDATE_DONE (5L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_DMA (6L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_CONTROL (7L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_LOW (8L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_HIGH (9L<<0) +#define BNX2_HC_VIS_STAT_BUILD_STATE_MSI_DATA (10L<<0) +#define BNX2_HC_VIS_DMA_STAT_STATE (0xfL<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_IDLE (0L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_STATUS_PARAM (1L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_STATUS_DMA (2L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP (3L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_COMP (4L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_STATISTIC_PARAM (5L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_STATISTIC_DMA (6L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP_1 (7L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_WRITE_COMP_2 (8L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_WAIT (9L<<8) +#define BNX2_HC_VIS_DMA_STAT_STATE_ABORT (15L<<8) +#define BNX2_HC_VIS_DMA_MSI_STATE (0x7L<<12) +#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE (0x3L<<15) +#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_IDLE (0L<<15) +#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_COUNT (1L<<15) +#define BNX2_HC_VIS_STATISTIC_DMA_EN_STATE_START (2L<<15) + +#define BNX2_HC_VIS_1 0x0000690c +#define BNX2_HC_VIS_1_HW_INTACK_STATE (1L<<4) +#define BNX2_HC_VIS_1_HW_INTACK_STATE_IDLE (0L<<4) +#define BNX2_HC_VIS_1_HW_INTACK_STATE_COUNT (1L<<4) +#define BNX2_HC_VIS_1_SW_INTACK_STATE (1L<<5) +#define BNX2_HC_VIS_1_SW_INTACK_STATE_IDLE (0L<<5) +#define BNX2_HC_VIS_1_SW_INTACK_STATE_COUNT (1L<<5) +#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE (1L<<6) +#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE_IDLE (0L<<6) +#define BNX2_HC_VIS_1_DURING_SW_INTACK_STATE_COUNT (1L<<6) +#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE (1L<<7) +#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE_IDLE (0L<<7) +#define BNX2_HC_VIS_1_MAILBOX_COUNT_STATE_COUNT (1L<<7) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE (0xfL<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_IDLE (0L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_DMA (1L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_UPDATE (2L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_ASSIGN (3L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_WAIT (4L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_UPDATE (5L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_ASSIGN (6L<<17) +#define BNX2_HC_VIS_1_RAM_RD_ARB_STATE_REG_WAIT (7L<<17) +#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE (0x3L<<21) +#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE_NORMAL (0L<<21) +#define BNX2_HC_VIS_1_RAM_WR_ARB_STATE_CLEAR (1L<<21) +#define BNX2_HC_VIS_1_INT_GEN_STATE (1L<<23) +#define BNX2_HC_VIS_1_INT_GEN_STATE_DLE (0L<<23) +#define BNX2_HC_VIS_1_INT_GEN_STATE_NTERRUPT (1L<<23) +#define BNX2_HC_VIS_1_STAT_CHAN_ID (0x7L<<24) +#define BNX2_HC_VIS_1_INT_B (1L<<27) + +#define BNX2_HC_DEBUG_VECT_PEEK 0x00006910 +#define BNX2_HC_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_HC_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_HC_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_HC_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_HC_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_HC_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_HC_COALESCE_NOW 0x00006914 +#define BNX2_HC_COALESCE_NOW_COAL_NOW (0x1ffL<<1) +#define BNX2_HC_COALESCE_NOW_COAL_NOW_WO_INT (0x1ffL<<11) +#define BNX2_HC_COALESCE_NOW_COAL_ON_NXT_EVENT (0x1ffL<<21) + +#define BNX2_HC_MSIX_BIT_VECTOR 0x00006918 +#define BNX2_HC_MSIX_BIT_VECTOR_VAL (0x1ffL<<0) + +#define BNX2_HC_SB_CONFIG_1 0x00006a00 +#define BNX2_HC_SB_CONFIG_1_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_1_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_1_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_1_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_1_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_1_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_1_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_1_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_1 0x00006a04 +#define BNX2_HC_TX_QUICK_CONS_TRIP_1_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_1_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_1 0x00006a08 +#define BNX2_HC_COMP_PROD_TRIP_1_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_1_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_1 0x00006a0c +#define BNX2_HC_RX_QUICK_CONS_TRIP_1_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_1_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_1 0x00006a10 +#define BNX2_HC_RX_TICKS_1_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_1_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_1 0x00006a14 +#define BNX2_HC_TX_TICKS_1_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_1_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_1 0x00006a18 +#define BNX2_HC_COM_TICKS_1_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_1_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_1 0x00006a1c +#define BNX2_HC_CMD_TICKS_1_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_1_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_1 0x00006a20 +#define BNX2_HC_PERIODIC_TICKS_1_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_1_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_2 0x00006a24 +#define BNX2_HC_SB_CONFIG_2_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_2_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_2_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_2_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_2_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_2_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_2_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_2_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_2 0x00006a28 +#define BNX2_HC_TX_QUICK_CONS_TRIP_2_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_2_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_2 0x00006a2c +#define BNX2_HC_COMP_PROD_TRIP_2_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_2_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_2 0x00006a30 +#define BNX2_HC_RX_QUICK_CONS_TRIP_2_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_2_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_2 0x00006a34 +#define BNX2_HC_RX_TICKS_2_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_2_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_2 0x00006a38 +#define BNX2_HC_TX_TICKS_2_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_2_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_2 0x00006a3c +#define BNX2_HC_COM_TICKS_2_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_2_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_2 0x00006a40 +#define BNX2_HC_CMD_TICKS_2_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_2_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_2 0x00006a44 +#define BNX2_HC_PERIODIC_TICKS_2_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_2_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_3 0x00006a48 +#define BNX2_HC_SB_CONFIG_3_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_3_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_3_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_3_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_3_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_3_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_3_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_3_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_3 0x00006a4c +#define BNX2_HC_TX_QUICK_CONS_TRIP_3_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_3_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_3 0x00006a50 +#define BNX2_HC_COMP_PROD_TRIP_3_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_3_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_3 0x00006a54 +#define BNX2_HC_RX_QUICK_CONS_TRIP_3_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_3_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_3 0x00006a58 +#define BNX2_HC_RX_TICKS_3_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_3_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_3 0x00006a5c +#define BNX2_HC_TX_TICKS_3_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_3_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_3 0x00006a60 +#define BNX2_HC_COM_TICKS_3_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_3_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_3 0x00006a64 +#define BNX2_HC_CMD_TICKS_3_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_3_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_3 0x00006a68 +#define BNX2_HC_PERIODIC_TICKS_3_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_3_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_4 0x00006a6c +#define BNX2_HC_SB_CONFIG_4_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_4_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_4_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_4_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_4_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_4_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_4_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_4_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_4 0x00006a70 +#define BNX2_HC_TX_QUICK_CONS_TRIP_4_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_4_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_4 0x00006a74 +#define BNX2_HC_COMP_PROD_TRIP_4_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_4_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_4 0x00006a78 +#define BNX2_HC_RX_QUICK_CONS_TRIP_4_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_4_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_4 0x00006a7c +#define BNX2_HC_RX_TICKS_4_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_4_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_4 0x00006a80 +#define BNX2_HC_TX_TICKS_4_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_4_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_4 0x00006a84 +#define BNX2_HC_COM_TICKS_4_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_4_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_4 0x00006a88 +#define BNX2_HC_CMD_TICKS_4_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_4_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_4 0x00006a8c +#define BNX2_HC_PERIODIC_TICKS_4_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_4_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_5 0x00006a90 +#define BNX2_HC_SB_CONFIG_5_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_5_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_5_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_5_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_5_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_5_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_5_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_5_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_5 0x00006a94 +#define BNX2_HC_TX_QUICK_CONS_TRIP_5_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_5_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_5 0x00006a98 +#define BNX2_HC_COMP_PROD_TRIP_5_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_5_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_5 0x00006a9c +#define BNX2_HC_RX_QUICK_CONS_TRIP_5_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_5_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_5 0x00006aa0 +#define BNX2_HC_RX_TICKS_5_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_5_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_5 0x00006aa4 +#define BNX2_HC_TX_TICKS_5_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_5_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_5 0x00006aa8 +#define BNX2_HC_COM_TICKS_5_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_5_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_5 0x00006aac +#define BNX2_HC_CMD_TICKS_5_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_5_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_5 0x00006ab0 +#define BNX2_HC_PERIODIC_TICKS_5_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_5_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_6 0x00006ab4 +#define BNX2_HC_SB_CONFIG_6_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_6_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_6_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_6_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_6_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_6_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_6_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_6_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_6 0x00006ab8 +#define BNX2_HC_TX_QUICK_CONS_TRIP_6_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_6_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_6 0x00006abc +#define BNX2_HC_COMP_PROD_TRIP_6_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_6_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_6 0x00006ac0 +#define BNX2_HC_RX_QUICK_CONS_TRIP_6_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_6_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_6 0x00006ac4 +#define BNX2_HC_RX_TICKS_6_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_6_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_6 0x00006ac8 +#define BNX2_HC_TX_TICKS_6_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_6_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_6 0x00006acc +#define BNX2_HC_COM_TICKS_6_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_6_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_6 0x00006ad0 +#define BNX2_HC_CMD_TICKS_6_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_6_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_6 0x00006ad4 +#define BNX2_HC_PERIODIC_TICKS_6_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_6_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_7 0x00006ad8 +#define BNX2_HC_SB_CONFIG_7_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_7_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_7_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_7_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_7_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_7_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_7_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_7_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_7 0x00006adc +#define BNX2_HC_TX_QUICK_CONS_TRIP_7_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_7_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_7 0x00006ae0 +#define BNX2_HC_COMP_PROD_TRIP_7_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_7_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_7 0x00006ae4 +#define BNX2_HC_RX_QUICK_CONS_TRIP_7_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_7_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_7 0x00006ae8 +#define BNX2_HC_RX_TICKS_7_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_7_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_7 0x00006aec +#define BNX2_HC_TX_TICKS_7_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_7_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_7 0x00006af0 +#define BNX2_HC_COM_TICKS_7_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_7_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_7 0x00006af4 +#define BNX2_HC_CMD_TICKS_7_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_7_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_7 0x00006af8 +#define BNX2_HC_PERIODIC_TICKS_7_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_7_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_8 0x00006afc +#define BNX2_HC_SB_CONFIG_8_RX_TMR_MODE (1L<<1) +#define BNX2_HC_SB_CONFIG_8_TX_TMR_MODE (1L<<2) +#define BNX2_HC_SB_CONFIG_8_COM_TMR_MODE (1L<<3) +#define BNX2_HC_SB_CONFIG_8_CMD_TMR_MODE (1L<<4) +#define BNX2_HC_SB_CONFIG_8_PER_MODE (1L<<16) +#define BNX2_HC_SB_CONFIG_8_ONE_SHOT (1L<<17) +#define BNX2_HC_SB_CONFIG_8_USE_INT_PARAM (1L<<18) +#define BNX2_HC_SB_CONFIG_8_PER_COLLECT_LIMIT (0xfL<<20) + +#define BNX2_HC_TX_QUICK_CONS_TRIP_8 0x00006b00 +#define BNX2_HC_TX_QUICK_CONS_TRIP_8_VALUE (0xffL<<0) +#define BNX2_HC_TX_QUICK_CONS_TRIP_8_INT (0xffL<<16) + +#define BNX2_HC_COMP_PROD_TRIP_8 0x00006b04 +#define BNX2_HC_COMP_PROD_TRIP_8_VALUE (0xffL<<0) +#define BNX2_HC_COMP_PROD_TRIP_8_INT (0xffL<<16) + +#define BNX2_HC_RX_QUICK_CONS_TRIP_8 0x00006b08 +#define BNX2_HC_RX_QUICK_CONS_TRIP_8_VALUE (0xffL<<0) +#define BNX2_HC_RX_QUICK_CONS_TRIP_8_INT (0xffL<<16) + +#define BNX2_HC_RX_TICKS_8 0x00006b0c +#define BNX2_HC_RX_TICKS_8_VALUE (0x3ffL<<0) +#define BNX2_HC_RX_TICKS_8_INT (0x3ffL<<16) + +#define BNX2_HC_TX_TICKS_8 0x00006b10 +#define BNX2_HC_TX_TICKS_8_VALUE (0x3ffL<<0) +#define BNX2_HC_TX_TICKS_8_INT (0x3ffL<<16) + +#define BNX2_HC_COM_TICKS_8 0x00006b14 +#define BNX2_HC_COM_TICKS_8_VALUE (0x3ffL<<0) +#define BNX2_HC_COM_TICKS_8_INT (0x3ffL<<16) + +#define BNX2_HC_CMD_TICKS_8 0x00006b18 +#define BNX2_HC_CMD_TICKS_8_VALUE (0x3ffL<<0) +#define BNX2_HC_CMD_TICKS_8_INT (0x3ffL<<16) + +#define BNX2_HC_PERIODIC_TICKS_8 0x00006b1c +#define BNX2_HC_PERIODIC_TICKS_8_HC_PERIODIC_TICKS (0xffffL<<0) +#define BNX2_HC_PERIODIC_TICKS_8_HC_INT_PERIODIC_TICKS (0xffffL<<16) + +#define BNX2_HC_SB_CONFIG_SIZE (BNX2_HC_SB_CONFIG_2 - BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_COMP_PROD_TRIP_OFF (BNX2_HC_COMP_PROD_TRIP_1 - \ + BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_COM_TICKS_OFF (BNX2_HC_COM_TICKS_1 - BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_CMD_TICKS_OFF (BNX2_HC_CMD_TICKS_1 - BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_TX_QUICK_CONS_TRIP_OFF (BNX2_HC_TX_QUICK_CONS_TRIP_1 - \ + BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_TX_TICKS_OFF (BNX2_HC_TX_TICKS_1 - BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_RX_QUICK_CONS_TRIP_OFF (BNX2_HC_RX_QUICK_CONS_TRIP_1 - \ + BNX2_HC_SB_CONFIG_1) +#define BNX2_HC_RX_TICKS_OFF (BNX2_HC_RX_TICKS_1 - BNX2_HC_SB_CONFIG_1) + + +/* + * txp_reg definition + * offset: 0x40000 + */ +#define BNX2_TXP_CPU_MODE 0x00045000 +#define BNX2_TXP_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_TXP_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_TXP_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_TXP_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_TXP_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_TXP_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_TXP_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_TXP_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_TXP_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_TXP_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_TXP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_TXP_CPU_STATE 0x00045004 +#define BNX2_TXP_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_TXP_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_TXP_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_TXP_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_TXP_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_TXP_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_TXP_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_TXP_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_TXP_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_TXP_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_TXP_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_TXP_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_TXP_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_TXP_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_TXP_CPU_EVENT_MASK 0x00045008 +#define BNX2_TXP_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_TXP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_TXP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_TXP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_TXP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_TXP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_TXP_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_TXP_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_TXP_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_TXP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_TXP_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_TXP_CPU_PROGRAM_COUNTER 0x0004501c +#define BNX2_TXP_CPU_INSTRUCTION 0x00045020 +#define BNX2_TXP_CPU_DATA_ACCESS 0x00045024 +#define BNX2_TXP_CPU_INTERRUPT_ENABLE 0x00045028 +#define BNX2_TXP_CPU_INTERRUPT_VECTOR 0x0004502c +#define BNX2_TXP_CPU_INTERRUPT_SAVED_PC 0x00045030 +#define BNX2_TXP_CPU_HW_BREAKPOINT 0x00045034 +#define BNX2_TXP_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_TXP_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK 0x00045038 +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_TXP_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_TXP_CPU_LAST_BRANCH_ADDR 0x00045048 +#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_TXP_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_TXP_CPU_REG_FILE 0x00045200 +#define BNX2_TXP_TXPQ 0x000453c0 +#define BNX2_TXP_FTQ_CMD 0x000453f8 +#define BNX2_TXP_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_TXP_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_TXP_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_TXP_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_TXP_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_TXP_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_TXP_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_TXP_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_TXP_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_TXP_FTQ_CMD_POP (1L<<30) +#define BNX2_TXP_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_TXP_FTQ_CTL 0x000453fc +#define BNX2_TXP_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_TXP_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_TXP_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_TXP_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_TXP_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_TXP_SCRATCH 0x00060000 + + +/* + * tpat_reg definition + * offset: 0x80000 + */ +#define BNX2_TPAT_CPU_MODE 0x00085000 +#define BNX2_TPAT_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_TPAT_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_TPAT_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_TPAT_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_TPAT_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_TPAT_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_TPAT_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_TPAT_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_TPAT_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_TPAT_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_TPAT_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_TPAT_CPU_STATE 0x00085004 +#define BNX2_TPAT_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_TPAT_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_TPAT_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_TPAT_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_TPAT_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_TPAT_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_TPAT_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_TPAT_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_TPAT_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_TPAT_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_TPAT_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_TPAT_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_TPAT_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_TPAT_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_TPAT_CPU_EVENT_MASK 0x00085008 +#define BNX2_TPAT_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_TPAT_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_TPAT_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_TPAT_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_TPAT_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_TPAT_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_TPAT_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_TPAT_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_TPAT_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_TPAT_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_TPAT_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_TPAT_CPU_PROGRAM_COUNTER 0x0008501c +#define BNX2_TPAT_CPU_INSTRUCTION 0x00085020 +#define BNX2_TPAT_CPU_DATA_ACCESS 0x00085024 +#define BNX2_TPAT_CPU_INTERRUPT_ENABLE 0x00085028 +#define BNX2_TPAT_CPU_INTERRUPT_VECTOR 0x0008502c +#define BNX2_TPAT_CPU_INTERRUPT_SAVED_PC 0x00085030 +#define BNX2_TPAT_CPU_HW_BREAKPOINT 0x00085034 +#define BNX2_TPAT_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_TPAT_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK 0x00085038 +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_TPAT_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR 0x00085048 +#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_TPAT_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_TPAT_CPU_REG_FILE 0x00085200 +#define BNX2_TPAT_TPATQ 0x000853c0 +#define BNX2_TPAT_FTQ_CMD 0x000853f8 +#define BNX2_TPAT_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_TPAT_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_TPAT_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_TPAT_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_TPAT_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_TPAT_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_TPAT_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_TPAT_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_TPAT_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_TPAT_FTQ_CMD_POP (1L<<30) +#define BNX2_TPAT_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_TPAT_FTQ_CTL 0x000853fc +#define BNX2_TPAT_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_TPAT_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_TPAT_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_TPAT_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_TPAT_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_TPAT_SCRATCH 0x000a0000 + + +/* + * rxp_reg definition + * offset: 0xc0000 + */ +#define BNX2_RXP_CPU_MODE 0x000c5000 +#define BNX2_RXP_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_RXP_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_RXP_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_RXP_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_RXP_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_RXP_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_RXP_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_RXP_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_RXP_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_RXP_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_RXP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_RXP_CPU_STATE 0x000c5004 +#define BNX2_RXP_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_RXP_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_RXP_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_RXP_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_RXP_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_RXP_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_RXP_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_RXP_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_RXP_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_RXP_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_RXP_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_RXP_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_RXP_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_RXP_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_RXP_CPU_EVENT_MASK 0x000c5008 +#define BNX2_RXP_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_RXP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_RXP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_RXP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_RXP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_RXP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_RXP_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_RXP_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_RXP_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_RXP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_RXP_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_RXP_CPU_PROGRAM_COUNTER 0x000c501c +#define BNX2_RXP_CPU_INSTRUCTION 0x000c5020 +#define BNX2_RXP_CPU_DATA_ACCESS 0x000c5024 +#define BNX2_RXP_CPU_INTERRUPT_ENABLE 0x000c5028 +#define BNX2_RXP_CPU_INTERRUPT_VECTOR 0x000c502c +#define BNX2_RXP_CPU_INTERRUPT_SAVED_PC 0x000c5030 +#define BNX2_RXP_CPU_HW_BREAKPOINT 0x000c5034 +#define BNX2_RXP_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_RXP_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK 0x000c5038 +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_RXP_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_RXP_CPU_LAST_BRANCH_ADDR 0x000c5048 +#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_RXP_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_RXP_CPU_REG_FILE 0x000c5200 +#define BNX2_RXP_PFE_PFE_CTL 0x000c537c +#define BNX2_RXP_PFE_PFE_CTL_INC_USAGE_CNT (1L<<0) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE (0xfL<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_0 (0L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_1 (1L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_2 (2L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_3 (3L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_4 (4L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_5 (5L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_6 (6L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_7 (7L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_8 (8L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_9 (9L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_10 (10L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_11 (11L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_12 (12L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_13 (13L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_14 (14L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_SIZE_15 (15L<<4) +#define BNX2_RXP_PFE_PFE_CTL_PFE_COUNT (0xfL<<12) +#define BNX2_RXP_PFE_PFE_CTL_OFFSET (0x1ffL<<16) + +#define BNX2_RXP_RXPCQ 0x000c5380 +#define BNX2_RXP_CFTQ_CMD 0x000c53b8 +#define BNX2_RXP_CFTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_RXP_CFTQ_CMD_WR_TOP (1L<<10) +#define BNX2_RXP_CFTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_RXP_CFTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_RXP_CFTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_RXP_CFTQ_CMD_RD_DATA (1L<<26) +#define BNX2_RXP_CFTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_RXP_CFTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_RXP_CFTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_RXP_CFTQ_CMD_POP (1L<<30) +#define BNX2_RXP_CFTQ_CMD_BUSY (1L<<31) + +#define BNX2_RXP_CFTQ_CTL 0x000c53bc +#define BNX2_RXP_CFTQ_CTL_INTERVENE (1L<<0) +#define BNX2_RXP_CFTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_RXP_CFTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_RXP_CFTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_RXP_CFTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_RXP_RXPQ 0x000c53c0 +#define BNX2_RXP_FTQ_CMD 0x000c53f8 +#define BNX2_RXP_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_RXP_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_RXP_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_RXP_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_RXP_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_RXP_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_RXP_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_RXP_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_RXP_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_RXP_FTQ_CMD_POP (1L<<30) +#define BNX2_RXP_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_RXP_FTQ_CTL 0x000c53fc +#define BNX2_RXP_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_RXP_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_RXP_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_RXP_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_RXP_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_RXP_SCRATCH 0x000e0000 +#define BNX2_RXP_SCRATCH_RXP_FLOOD 0x000e0024 +#define BNX2_RXP_SCRATCH_RSS_TBL_SZ 0x000e0038 +#define BNX2_RXP_SCRATCH_RSS_TBL 0x000e003c +#define BNX2_RXP_SCRATCH_RSS_TBL_MAX_ENTRIES 128 + + +/* + * com_reg definition + * offset: 0x100000 + */ +#define BNX2_COM_CKSUM_ERROR_STATUS 0x00100000 +#define BNX2_COM_CKSUM_ERROR_STATUS_CALCULATED (0xffffL<<0) +#define BNX2_COM_CKSUM_ERROR_STATUS_EXPECTED (0xffffL<<16) + +#define BNX2_COM_CPU_MODE 0x00105000 +#define BNX2_COM_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_COM_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_COM_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_COM_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_COM_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_COM_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_COM_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_COM_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_COM_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_COM_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_COM_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_COM_CPU_STATE 0x00105004 +#define BNX2_COM_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_COM_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_COM_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_COM_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_COM_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_COM_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_COM_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_COM_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_COM_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_COM_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_COM_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_COM_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_COM_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_COM_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_COM_CPU_EVENT_MASK 0x00105008 +#define BNX2_COM_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_COM_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_COM_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_COM_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_COM_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_COM_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_COM_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_COM_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_COM_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_COM_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_COM_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_COM_CPU_PROGRAM_COUNTER 0x0010501c +#define BNX2_COM_CPU_INSTRUCTION 0x00105020 +#define BNX2_COM_CPU_DATA_ACCESS 0x00105024 +#define BNX2_COM_CPU_INTERRUPT_ENABLE 0x00105028 +#define BNX2_COM_CPU_INTERRUPT_VECTOR 0x0010502c +#define BNX2_COM_CPU_INTERRUPT_SAVED_PC 0x00105030 +#define BNX2_COM_CPU_HW_BREAKPOINT 0x00105034 +#define BNX2_COM_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_COM_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_COM_CPU_DEBUG_VECT_PEEK 0x00105038 +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_COM_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_COM_CPU_LAST_BRANCH_ADDR 0x00105048 +#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_COM_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_COM_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_COM_CPU_REG_FILE 0x00105200 +#define BNX2_COM_COMTQ_PFE_PFE_CTL 0x001052bc +#define BNX2_COM_COMTQ_PFE_PFE_CTL_INC_USAGE_CNT (1L<<0) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE (0xfL<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_0 (0L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_1 (1L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_2 (2L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_3 (3L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_4 (4L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_5 (5L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_6 (6L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_7 (7L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_8 (8L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_9 (9L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_10 (10L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_11 (11L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_12 (12L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_13 (13L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_14 (14L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_SIZE_15 (15L<<4) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_PFE_COUNT (0xfL<<12) +#define BNX2_COM_COMTQ_PFE_PFE_CTL_OFFSET (0x1ffL<<16) + +#define BNX2_COM_COMXQ 0x00105340 +#define BNX2_COM_COMXQ_FTQ_CMD 0x00105378 +#define BNX2_COM_COMXQ_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_COM_COMXQ_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_COM_COMXQ_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_COM_COMXQ_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_COM_COMXQ_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_COM_COMXQ_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_COM_COMXQ_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_COM_COMXQ_FTQ_CMD_POP (1L<<30) +#define BNX2_COM_COMXQ_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_COM_COMXQ_FTQ_CTL 0x0010537c +#define BNX2_COM_COMXQ_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_COM_COMXQ_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_COM_COMXQ_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_COM_COMXQ_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_COM_COMXQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_COM_COMTQ 0x00105380 +#define BNX2_COM_COMTQ_FTQ_CMD 0x001053b8 +#define BNX2_COM_COMTQ_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_COM_COMTQ_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_COM_COMTQ_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_COM_COMTQ_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_COM_COMTQ_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_COM_COMTQ_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_COM_COMTQ_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_COM_COMTQ_FTQ_CMD_POP (1L<<30) +#define BNX2_COM_COMTQ_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_COM_COMTQ_FTQ_CTL 0x001053bc +#define BNX2_COM_COMTQ_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_COM_COMTQ_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_COM_COMTQ_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_COM_COMTQ_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_COM_COMTQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_COM_COMQ 0x001053c0 +#define BNX2_COM_COMQ_FTQ_CMD 0x001053f8 +#define BNX2_COM_COMQ_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_COM_COMQ_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_COM_COMQ_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_COM_COMQ_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_COM_COMQ_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_COM_COMQ_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_COM_COMQ_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_COM_COMQ_FTQ_CMD_POP (1L<<30) +#define BNX2_COM_COMQ_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_COM_COMQ_FTQ_CTL 0x001053fc +#define BNX2_COM_COMQ_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_COM_COMQ_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_COM_COMQ_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_COM_COMQ_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_COM_COMQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_COM_SCRATCH 0x00120000 + +#define BNX2_FW_RX_DROP_COUNT 0x00120084 + + +/* + * cp_reg definition + * offset: 0x180000 + */ +#define BNX2_CP_CKSUM_ERROR_STATUS 0x00180000 +#define BNX2_CP_CKSUM_ERROR_STATUS_CALCULATED (0xffffL<<0) +#define BNX2_CP_CKSUM_ERROR_STATUS_EXPECTED (0xffffL<<16) + +#define BNX2_CP_CPU_MODE 0x00185000 +#define BNX2_CP_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_CP_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_CP_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_CP_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_CP_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_CP_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_CP_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_CP_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_CP_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_CP_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_CP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_CP_CPU_STATE 0x00185004 +#define BNX2_CP_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_CP_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_CP_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_CP_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_CP_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_CP_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_CP_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_CP_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_CP_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_CP_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_CP_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_CP_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_CP_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_CP_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_CP_CPU_EVENT_MASK 0x00185008 +#define BNX2_CP_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_CP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_CP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_CP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_CP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_CP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_CP_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_CP_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_CP_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_CP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_CP_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_CP_CPU_PROGRAM_COUNTER 0x0018501c +#define BNX2_CP_CPU_INSTRUCTION 0x00185020 +#define BNX2_CP_CPU_DATA_ACCESS 0x00185024 +#define BNX2_CP_CPU_INTERRUPT_ENABLE 0x00185028 +#define BNX2_CP_CPU_INTERRUPT_VECTOR 0x0018502c +#define BNX2_CP_CPU_INTERRUPT_SAVED_PC 0x00185030 +#define BNX2_CP_CPU_HW_BREAKPOINT 0x00185034 +#define BNX2_CP_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_CP_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_CP_CPU_DEBUG_VECT_PEEK 0x00185038 +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_CP_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_CP_CPU_LAST_BRANCH_ADDR 0x00185048 +#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_CP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_CP_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_CP_CPU_REG_FILE 0x00185200 +#define BNX2_CP_CPQ_PFE_PFE_CTL 0x001853bc +#define BNX2_CP_CPQ_PFE_PFE_CTL_INC_USAGE_CNT (1L<<0) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE (0xfL<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_0 (0L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_1 (1L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_2 (2L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_3 (3L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_4 (4L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_5 (5L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_6 (6L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_7 (7L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_8 (8L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_9 (9L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_10 (10L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_11 (11L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_12 (12L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_13 (13L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_14 (14L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_SIZE_15 (15L<<4) +#define BNX2_CP_CPQ_PFE_PFE_CTL_PFE_COUNT (0xfL<<12) +#define BNX2_CP_CPQ_PFE_PFE_CTL_OFFSET (0x1ffL<<16) + +#define BNX2_CP_CPQ 0x001853c0 +#define BNX2_CP_CPQ_FTQ_CMD 0x001853f8 +#define BNX2_CP_CPQ_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_CP_CPQ_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_CP_CPQ_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_CP_CPQ_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_CP_CPQ_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_CP_CPQ_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_CP_CPQ_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_CP_CPQ_FTQ_CMD_POP (1L<<30) +#define BNX2_CP_CPQ_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_CP_CPQ_FTQ_CTL 0x001853fc +#define BNX2_CP_CPQ_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_CP_CPQ_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_CP_CPQ_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_CP_CPQ_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_CP_CPQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_CP_SCRATCH 0x001a0000 + +#define BNX2_FW_MAX_ISCSI_CONN 0x001a0080 + + +/* + * mcp_reg definition + * offset: 0x140000 + */ +#define BNX2_MCP_MCP_CONTROL 0x00140080 +#define BNX2_MCP_MCP_CONTROL_SMBUS_SEL (1L<<30) +#define BNX2_MCP_MCP_CONTROL_MCP_ISOLATE (1L<<31) + +#define BNX2_MCP_MCP_ATTENTION_STATUS 0x00140084 +#define BNX2_MCP_MCP_ATTENTION_STATUS_DRV_DOORBELL (1L<<29) +#define BNX2_MCP_MCP_ATTENTION_STATUS_WATCHDOG_TIMEOUT (1L<<30) +#define BNX2_MCP_MCP_ATTENTION_STATUS_CPU_EVENT (1L<<31) + +#define BNX2_MCP_MCP_HEARTBEAT_CONTROL 0x00140088 +#define BNX2_MCP_MCP_HEARTBEAT_CONTROL_MCP_HEARTBEAT_ENABLE (1L<<31) + +#define BNX2_MCP_MCP_HEARTBEAT_STATUS 0x0014008c +#define BNX2_MCP_MCP_HEARTBEAT_STATUS_MCP_HEARTBEAT_PERIOD (0x7ffL<<0) +#define BNX2_MCP_MCP_HEARTBEAT_STATUS_VALID (1L<<31) + +#define BNX2_MCP_MCP_HEARTBEAT 0x00140090 +#define BNX2_MCP_MCP_HEARTBEAT_MCP_HEARTBEAT_COUNT (0x3fffffffL<<0) +#define BNX2_MCP_MCP_HEARTBEAT_MCP_HEARTBEAT_INC (1L<<30) +#define BNX2_MCP_MCP_HEARTBEAT_MCP_HEARTBEAT_RESET (1L<<31) + +#define BNX2_MCP_WATCHDOG_RESET 0x00140094 +#define BNX2_MCP_WATCHDOG_RESET_WATCHDOG_RESET (1L<<31) + +#define BNX2_MCP_WATCHDOG_CONTROL 0x00140098 +#define BNX2_MCP_WATCHDOG_CONTROL_WATCHDOG_TIMEOUT (0xfffffffL<<0) +#define BNX2_MCP_WATCHDOG_CONTROL_WATCHDOG_ATTN (1L<<29) +#define BNX2_MCP_WATCHDOG_CONTROL_MCP_RST_ENABLE (1L<<30) +#define BNX2_MCP_WATCHDOG_CONTROL_WATCHDOG_ENABLE (1L<<31) + +#define BNX2_MCP_ACCESS_LOCK 0x0014009c +#define BNX2_MCP_ACCESS_LOCK_LOCK (1L<<31) + +#define BNX2_MCP_TOE_ID 0x001400a0 +#define BNX2_MCP_TOE_ID_FUNCTION_ID (1L<<31) + +#define BNX2_MCP_MAILBOX_CFG 0x001400a4 +#define BNX2_MCP_MAILBOX_CFG_MAILBOX_OFFSET (0x3fffL<<0) +#define BNX2_MCP_MAILBOX_CFG_MAILBOX_SIZE (0xfffL<<20) + +#define BNX2_MCP_MAILBOX_CFG_OTHER_FUNC 0x001400a8 +#define BNX2_MCP_MAILBOX_CFG_OTHER_FUNC_MAILBOX_OFFSET (0x3fffL<<0) +#define BNX2_MCP_MAILBOX_CFG_OTHER_FUNC_MAILBOX_SIZE (0xfffL<<20) + +#define BNX2_MCP_MCP_DOORBELL 0x001400ac +#define BNX2_MCP_MCP_DOORBELL_MCP_DOORBELL (1L<<31) + +#define BNX2_MCP_DRIVER_DOORBELL 0x001400b0 +#define BNX2_MCP_DRIVER_DOORBELL_DRIVER_DOORBELL (1L<<31) + +#define BNX2_MCP_DRIVER_DOORBELL_OTHER_FUNC 0x001400b4 +#define BNX2_MCP_DRIVER_DOORBELL_OTHER_FUNC_DRIVER_DOORBELL (1L<<31) + +#define BNX2_MCP_CPU_MODE 0x00145000 +#define BNX2_MCP_CPU_MODE_LOCAL_RST (1L<<0) +#define BNX2_MCP_CPU_MODE_STEP_ENA (1L<<1) +#define BNX2_MCP_CPU_MODE_PAGE_0_DATA_ENA (1L<<2) +#define BNX2_MCP_CPU_MODE_PAGE_0_INST_ENA (1L<<3) +#define BNX2_MCP_CPU_MODE_MSG_BIT1 (1L<<6) +#define BNX2_MCP_CPU_MODE_INTERRUPT_ENA (1L<<7) +#define BNX2_MCP_CPU_MODE_SOFT_HALT (1L<<10) +#define BNX2_MCP_CPU_MODE_BAD_DATA_HALT_ENA (1L<<11) +#define BNX2_MCP_CPU_MODE_BAD_INST_HALT_ENA (1L<<12) +#define BNX2_MCP_CPU_MODE_FIO_ABORT_HALT_ENA (1L<<13) +#define BNX2_MCP_CPU_MODE_SPAD_UNDERFLOW_HALT_ENA (1L<<15) + +#define BNX2_MCP_CPU_STATE 0x00145004 +#define BNX2_MCP_CPU_STATE_BREAKPOINT (1L<<0) +#define BNX2_MCP_CPU_STATE_BAD_INST_HALTED (1L<<2) +#define BNX2_MCP_CPU_STATE_PAGE_0_DATA_HALTED (1L<<3) +#define BNX2_MCP_CPU_STATE_PAGE_0_INST_HALTED (1L<<4) +#define BNX2_MCP_CPU_STATE_BAD_DATA_ADDR_HALTED (1L<<5) +#define BNX2_MCP_CPU_STATE_BAD_PC_HALTED (1L<<6) +#define BNX2_MCP_CPU_STATE_ALIGN_HALTED (1L<<7) +#define BNX2_MCP_CPU_STATE_FIO_ABORT_HALTED (1L<<8) +#define BNX2_MCP_CPU_STATE_SOFT_HALTED (1L<<10) +#define BNX2_MCP_CPU_STATE_SPAD_UNDERFLOW (1L<<11) +#define BNX2_MCP_CPU_STATE_INTERRRUPT (1L<<12) +#define BNX2_MCP_CPU_STATE_DATA_ACCESS_STALL (1L<<14) +#define BNX2_MCP_CPU_STATE_INST_FETCH_STALL (1L<<15) +#define BNX2_MCP_CPU_STATE_BLOCKED_READ (1L<<31) + +#define BNX2_MCP_CPU_EVENT_MASK 0x00145008 +#define BNX2_MCP_CPU_EVENT_MASK_BREAKPOINT_MASK (1L<<0) +#define BNX2_MCP_CPU_EVENT_MASK_BAD_INST_HALTED_MASK (1L<<2) +#define BNX2_MCP_CPU_EVENT_MASK_PAGE_0_DATA_HALTED_MASK (1L<<3) +#define BNX2_MCP_CPU_EVENT_MASK_PAGE_0_INST_HALTED_MASK (1L<<4) +#define BNX2_MCP_CPU_EVENT_MASK_BAD_DATA_ADDR_HALTED_MASK (1L<<5) +#define BNX2_MCP_CPU_EVENT_MASK_BAD_PC_HALTED_MASK (1L<<6) +#define BNX2_MCP_CPU_EVENT_MASK_ALIGN_HALTED_MASK (1L<<7) +#define BNX2_MCP_CPU_EVENT_MASK_FIO_ABORT_MASK (1L<<8) +#define BNX2_MCP_CPU_EVENT_MASK_SOFT_HALTED_MASK (1L<<10) +#define BNX2_MCP_CPU_EVENT_MASK_SPAD_UNDERFLOW_MASK (1L<<11) +#define BNX2_MCP_CPU_EVENT_MASK_INTERRUPT_MASK (1L<<12) + +#define BNX2_MCP_CPU_PROGRAM_COUNTER 0x0014501c +#define BNX2_MCP_CPU_INSTRUCTION 0x00145020 +#define BNX2_MCP_CPU_DATA_ACCESS 0x00145024 +#define BNX2_MCP_CPU_INTERRUPT_ENABLE 0x00145028 +#define BNX2_MCP_CPU_INTERRUPT_VECTOR 0x0014502c +#define BNX2_MCP_CPU_INTERRUPT_SAVED_PC 0x00145030 +#define BNX2_MCP_CPU_HW_BREAKPOINT 0x00145034 +#define BNX2_MCP_CPU_HW_BREAKPOINT_DISABLE (1L<<0) +#define BNX2_MCP_CPU_HW_BREAKPOINT_ADDRESS (0x3fffffffL<<2) + +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK 0x00145038 +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_VALUE (0x7ffL<<0) +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_PEEK_EN (1L<<11) +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_1_SEL (0xfL<<12) +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_VALUE (0x7ffL<<16) +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_PEEK_EN (1L<<27) +#define BNX2_MCP_CPU_DEBUG_VECT_PEEK_2_SEL (0xfL<<28) + +#define BNX2_MCP_CPU_LAST_BRANCH_ADDR 0x00145048 +#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE (1L<<1) +#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE_JUMP (0L<<1) +#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_TYPE_BRANCH (1L<<1) +#define BNX2_MCP_CPU_LAST_BRANCH_ADDR_LBA (0x3fffffffL<<2) + +#define BNX2_MCP_CPU_REG_FILE 0x00145200 +#define BNX2_MCP_MCPQ 0x001453c0 +#define BNX2_MCP_MCPQ_FTQ_CMD 0x001453f8 +#define BNX2_MCP_MCPQ_FTQ_CMD_OFFSET (0x3ffL<<0) +#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP (1L<<10) +#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP_0 (0L<<10) +#define BNX2_MCP_MCPQ_FTQ_CMD_WR_TOP_1 (1L<<10) +#define BNX2_MCP_MCPQ_FTQ_CMD_SFT_RESET (1L<<25) +#define BNX2_MCP_MCPQ_FTQ_CMD_RD_DATA (1L<<26) +#define BNX2_MCP_MCPQ_FTQ_CMD_ADD_INTERVEN (1L<<27) +#define BNX2_MCP_MCPQ_FTQ_CMD_ADD_DATA (1L<<28) +#define BNX2_MCP_MCPQ_FTQ_CMD_INTERVENE_CLR (1L<<29) +#define BNX2_MCP_MCPQ_FTQ_CMD_POP (1L<<30) +#define BNX2_MCP_MCPQ_FTQ_CMD_BUSY (1L<<31) + +#define BNX2_MCP_MCPQ_FTQ_CTL 0x001453fc +#define BNX2_MCP_MCPQ_FTQ_CTL_INTERVENE (1L<<0) +#define BNX2_MCP_MCPQ_FTQ_CTL_OVERFLOW (1L<<1) +#define BNX2_MCP_MCPQ_FTQ_CTL_FORCE_INTERVENE (1L<<2) +#define BNX2_MCP_MCPQ_FTQ_CTL_MAX_DEPTH (0x3ffL<<12) +#define BNX2_MCP_MCPQ_FTQ_CTL_CUR_DEPTH (0x3ffL<<22) + +#define BNX2_MCP_ROM 0x00150000 +#define BNX2_MCP_SCRATCH 0x00160000 +#define BNX2_MCP_STATE_P1 0x0016f9c8 +#define BNX2_MCP_STATE_P0 0x0016fdc + +#define BNX2_SHM_HDR_SIGNATURE BNX2_MCP_SCRATCH +#define BNX2_SHM_HDR_SIGNATURE_SIG_MASK 0xffff0000 +#define BNX2_SHM_HDR_SIGNATURE_SIG 0x53530000 +#define BNX2_SHM_HDR_SIGNATURE_VER_MASK 0x000000ff +#define BNX2_SHM_HDR_SIGNATURE_VER_ONE 0x00000001 + +#define BNX2_SHM_HDR_ADDR_0 BNX2_MCP_SCRATCH + 4 +#define BNX2_SHM_HDR_ADDR_1 BNX2_MCP_SCRATCH + 8 + + +#define NUM_MC_HASH_REGISTERS 8 + + +/* PHY_ID1: bits 31-16; PHY_ID2: bits 15-0. */ +#define PHY_BCM5706_PHY_ID 0x00206160 + +#define PHY_ID(id) ((id) & 0xfffffff0) +#define PHY_REV_ID(id) ((id) & 0xf) + +/* 5708 Serdes PHY registers */ + +#define BCM5708S_BMCR_FORCE_2500 0x20 + +#define BCM5708S_UP1 0xb + +#define BCM5708S_UP1_2G5 0x1 + +#define BCM5708S_BLK_ADDR 0x1f + +#define BCM5708S_BLK_ADDR_DIG 0x0000 +#define BCM5708S_BLK_ADDR_DIG3 0x0002 +#define BCM5708S_BLK_ADDR_TX_MISC 0x0005 + +/* Digital Block */ +#define BCM5708S_1000X_CTL1 0x10 + +#define BCM5708S_1000X_CTL1_FIBER_MODE 0x0001 +#define BCM5708S_1000X_CTL1_AUTODET_EN 0x0010 + +#define BCM5708S_1000X_CTL2 0x11 + +#define BCM5708S_1000X_CTL2_PLLEL_DET_EN 0x0001 + +#define BCM5708S_1000X_STAT1 0x14 + +#define BCM5708S_1000X_STAT1_SGMII 0x0001 +#define BCM5708S_1000X_STAT1_LINK 0x0002 +#define BCM5708S_1000X_STAT1_FD 0x0004 +#define BCM5708S_1000X_STAT1_SPEED_MASK 0x0018 +#define BCM5708S_1000X_STAT1_SPEED_10 0x0000 +#define BCM5708S_1000X_STAT1_SPEED_100 0x0008 +#define BCM5708S_1000X_STAT1_SPEED_1G 0x0010 +#define BCM5708S_1000X_STAT1_SPEED_2G5 0x0018 +#define BCM5708S_1000X_STAT1_TX_PAUSE 0x0020 +#define BCM5708S_1000X_STAT1_RX_PAUSE 0x0040 + +/* Digital3 Block */ +#define BCM5708S_DIG_3_0 0x10 + +#define BCM5708S_DIG_3_0_USE_IEEE 0x0001 + +/* Tx/Misc Block */ +#define BCM5708S_TX_ACTL1 0x15 + +#define BCM5708S_TX_ACTL1_DRIVER_VCM 0x30 + +#define BCM5708S_TX_ACTL3 0x17 + +#define MII_BNX2_DSP_RW_PORT 0x15 +#define MII_BNX2_DSP_ADDRESS 0x17 +#define MII_BNX2_DSP_EXPAND_REG 0x0f00 +#define MII_EXPAND_REG1 (MII_BNX2_DSP_EXPAND_REG | 1) +#define MII_EXPAND_REG1_RUDI_C 0x20 +#define MII_EXPAND_SERDES_CTL (MII_BNX2_DSP_EXPAND_REG | 3) + +#define MII_BNX2_MISC_SHADOW 0x1c +#define MISC_SHDW_AN_DBG 0x6800 +#define MISC_SHDW_AN_DBG_NOSYNC 0x0002 +#define MISC_SHDW_AN_DBG_RUDI_INVALID 0x0100 +#define MISC_SHDW_MODE_CTL 0x7c00 +#define MISC_SHDW_MODE_CTL_SIG_DET 0x0010 + +#define MII_BNX2_BLK_ADDR 0x1f +#define MII_BNX2_BLK_ADDR_IEEE0 0x0000 +#define MII_BNX2_BLK_ADDR_GP_STATUS 0x8120 +#define MII_BNX2_GP_TOP_AN_STATUS1 0x1b +#define MII_BNX2_GP_TOP_AN_SPEED_MSK 0x3f00 +#define MII_BNX2_GP_TOP_AN_SPEED_10 0x0000 +#define MII_BNX2_GP_TOP_AN_SPEED_100 0x0100 +#define MII_BNX2_GP_TOP_AN_SPEED_1G 0x0200 +#define MII_BNX2_GP_TOP_AN_SPEED_2_5G 0x0300 +#define MII_BNX2_GP_TOP_AN_SPEED_1GKV 0x0d00 +#define MII_BNX2_GP_TOP_AN_FD 0x8 +#define MII_BNX2_BLK_ADDR_SERDES_DIG 0x8300 +#define MII_BNX2_SERDES_DIG_1000XCTL1 0x10 +#define MII_BNX2_SD_1000XCTL1_FIBER 0x01 +#define MII_BNX2_SD_1000XCTL1_AUTODET 0x10 +#define MII_BNX2_SERDES_DIG_MISC1 0x18 +#define MII_BNX2_SD_MISC1_FORCE_MSK 0xf +#define MII_BNX2_SD_MISC1_FORCE_2_5G 0x0 +#define MII_BNX2_SD_MISC1_FORCE 0x10 +#define MII_BNX2_BLK_ADDR_OVER1G 0x8320 +#define MII_BNX2_OVER1G_UP1 0x19 +#define MII_BNX2_BLK_ADDR_BAM_NXTPG 0x8350 +#define MII_BNX2_BAM_NXTPG_CTL 0x10 +#define MII_BNX2_NXTPG_CTL_BAM 0x1 +#define MII_BNX2_NXTPG_CTL_T2 0x2 +#define MII_BNX2_BLK_ADDR_CL73_USERB0 0x8370 +#define MII_BNX2_CL73_BAM_CTL1 0x12 +#define MII_BNX2_CL73_BAM_EN 0x8000 +#define MII_BNX2_CL73_BAM_STA_MGR_EN 0x4000 +#define MII_BNX2_CL73_BAM_NP_AFT_BP_EN 0x2000 +#define MII_BNX2_BLK_ADDR_AER 0xffd0 +#define MII_BNX2_AER_AER 0x1e +#define MII_BNX2_AER_AER_AN_MMD 0x3800 +#define MII_BNX2_BLK_ADDR_COMBO_IEEEB0 0xffe0 + +#define MIN_ETHERNET_PACKET_SIZE 60 +#define MAX_ETHERNET_PACKET_SIZE 1514 +#define MAX_ETHERNET_JUMBO_PACKET_SIZE 9014 + +#define BNX2_RX_COPY_THRESH 128 + +#define BNX2_MISC_ENABLE_DEFAULT 0x17ffffff + +#define BNX2_START_UNICAST_ADDRESS_INDEX 4 +#define BNX2_END_UNICAST_ADDRESS_INDEX 7 +#define BNX2_MAX_UNICAST_ADDRESSES (BNX2_END_UNICAST_ADDRESS_INDEX - \ + BNX2_START_UNICAST_ADDRESS_INDEX + 1) + +#define DMA_READ_CHANS 5 +#define DMA_WRITE_CHANS 3 + +/* Use CPU native page size up to 16K for the ring sizes. */ +#if (PAGE_SHIFT > 14) +#define BCM_PAGE_BITS 14 +#else +#define BCM_PAGE_BITS PAGE_SHIFT +#endif +#define BCM_PAGE_SIZE (1 << BCM_PAGE_BITS) + +#define TX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct tx_bd)) +#define MAX_TX_DESC_CNT (TX_DESC_CNT - 1) + +#define MAX_RX_RINGS 16 +#define MAX_RX_PG_RINGS 64 +#define RX_DESC_CNT (BCM_PAGE_SIZE / sizeof(struct rx_bd)) +#define MAX_RX_DESC_CNT (RX_DESC_CNT - 1) +#define MAX_TOTAL_RX_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_RINGS) +#define MAX_TOTAL_RX_PG_DESC_CNT (MAX_RX_DESC_CNT * MAX_RX_PG_RINGS) + +#define NEXT_TX_BD(x) (((x) & (MAX_TX_DESC_CNT - 1)) == \ + (MAX_TX_DESC_CNT - 1)) ? \ + (x) + 2 : (x) + 1 + +#define TX_RING_IDX(x) ((x) & MAX_TX_DESC_CNT) + +#define NEXT_RX_BD(x) (((x) & (MAX_RX_DESC_CNT - 1)) == \ + (MAX_RX_DESC_CNT - 1)) ? \ + (x) + 2 : (x) + 1 + +#define RX_RING_IDX(x) ((x) & bp->rx_max_ring_idx) +#define RX_PG_RING_IDX(x) ((x) & bp->rx_max_pg_ring_idx) + +#define RX_RING(x) (((x) & ~MAX_RX_DESC_CNT) >> (BCM_PAGE_BITS - 4)) +#define RX_IDX(x) ((x) & MAX_RX_DESC_CNT) + +/* Context size. */ +#define CTX_SHIFT 7 +#define CTX_SIZE (1 << CTX_SHIFT) +#define CTX_MASK (CTX_SIZE - 1) +#define GET_CID_ADDR(_cid) ((_cid) << CTX_SHIFT) +#define GET_CID(_cid_addr) ((_cid_addr) >> CTX_SHIFT) + +#define PHY_CTX_SHIFT 6 +#define PHY_CTX_SIZE (1 << PHY_CTX_SHIFT) +#define PHY_CTX_MASK (PHY_CTX_SIZE - 1) +#define GET_PCID_ADDR(_pcid) ((_pcid) << PHY_CTX_SHIFT) +#define GET_PCID(_pcid_addr) ((_pcid_addr) >> PHY_CTX_SHIFT) + +#define MB_KERNEL_CTX_SHIFT 8 +#define MB_KERNEL_CTX_SIZE (1 << MB_KERNEL_CTX_SHIFT) +#define MB_KERNEL_CTX_MASK (MB_KERNEL_CTX_SIZE - 1) +#define MB_GET_CID_ADDR(_cid) (0x10000 + ((_cid) << MB_KERNEL_CTX_SHIFT)) + +#define MAX_CID_CNT 0x4000 +#define MAX_CID_ADDR (GET_CID_ADDR(MAX_CID_CNT)) +#define INVALID_CID_ADDR 0xffffffff + +#define TX_CID 16 +#define TX_TSS_CID 32 +#define RX_CID 0 +#define RX_RSS_CID 4 +#define RX_MAX_RSS_RINGS 7 +#define RX_MAX_RINGS (RX_MAX_RSS_RINGS + 1) +#define TX_MAX_TSS_RINGS 7 +#define TX_MAX_RINGS (TX_MAX_TSS_RINGS + 1) + +#define MB_TX_CID_ADDR MB_GET_CID_ADDR(TX_CID) +#define MB_RX_CID_ADDR MB_GET_CID_ADDR(RX_CID) + +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) +#define NETQUEUE_KWQ_CID 97 +#define NETQUEUE_KCQ_CID 100 +#endif + +struct sw_bd { + struct sk_buff *skb; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +struct sw_pg { + struct page *page; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +struct sw_tx_bd { + struct sk_buff *skb; + unsigned short is_gso; + unsigned short nr_frags; + DECLARE_PCI_UNMAP_ADDR(mapping) +}; + +#define SW_RXBD_RING_SIZE (sizeof(struct sw_bd) * RX_DESC_CNT) +#define SW_RXPG_RING_SIZE (sizeof(struct sw_pg) * RX_DESC_CNT) +#define RXBD_RING_SIZE (sizeof(struct rx_bd) * RX_DESC_CNT) +#define SW_TXBD_RING_SIZE (sizeof(struct sw_tx_bd) * TX_DESC_CNT) +#define TXBD_RING_SIZE (sizeof(struct tx_bd) * TX_DESC_CNT) + +/* Buffered flash (Atmel: AT45DB011B) specific information */ +#define SEEPROM_PAGE_BITS 2 +#define SEEPROM_PHY_PAGE_SIZE (1 << SEEPROM_PAGE_BITS) +#define SEEPROM_BYTE_ADDR_MASK (SEEPROM_PHY_PAGE_SIZE-1) +#define SEEPROM_PAGE_SIZE 4 +#define SEEPROM_TOTAL_SIZE 65536 + +#define BUFFERED_FLASH_PAGE_BITS 9 +#define BUFFERED_FLASH_PHY_PAGE_SIZE (1 << BUFFERED_FLASH_PAGE_BITS) +#define BUFFERED_FLASH_BYTE_ADDR_MASK (BUFFERED_FLASH_PHY_PAGE_SIZE-1) +#define BUFFERED_FLASH_PAGE_SIZE 264 +#define BUFFERED_FLASH_TOTAL_SIZE 0x21000 + +#define SAIFUN_FLASH_PAGE_BITS 8 +#define SAIFUN_FLASH_PHY_PAGE_SIZE (1 << SAIFUN_FLASH_PAGE_BITS) +#define SAIFUN_FLASH_BYTE_ADDR_MASK (SAIFUN_FLASH_PHY_PAGE_SIZE-1) +#define SAIFUN_FLASH_PAGE_SIZE 256 +#define SAIFUN_FLASH_BASE_TOTAL_SIZE 65536 + +#define ST_MICRO_FLASH_PAGE_BITS 8 +#define ST_MICRO_FLASH_PHY_PAGE_SIZE (1 << ST_MICRO_FLASH_PAGE_BITS) +#define ST_MICRO_FLASH_BYTE_ADDR_MASK (ST_MICRO_FLASH_PHY_PAGE_SIZE-1) +#define ST_MICRO_FLASH_PAGE_SIZE 256 +#define ST_MICRO_FLASH_BASE_TOTAL_SIZE 65536 + +#define BCM5709_FLASH_PAGE_BITS 8 +#define BCM5709_FLASH_PHY_PAGE_SIZE (1 << BCM5709_FLASH_PAGE_BITS) +#define BCM5709_FLASH_BYTE_ADDR_MASK (BCM5709_FLASH_PHY_PAGE_SIZE-1) +#define BCM5709_FLASH_PAGE_SIZE 256 + +#define NVRAM_TIMEOUT_COUNT 30000 + + +#define FLASH_STRAP_MASK (BNX2_NVM_CFG1_FLASH_MODE | \ + BNX2_NVM_CFG1_BUFFER_MODE | \ + BNX2_NVM_CFG1_PROTECT_MODE | \ + BNX2_NVM_CFG1_FLASH_SIZE) + +#define FLASH_BACKUP_STRAP_MASK (0xf << 26) + +struct flash_spec { + u32 strapping; + u32 config1; + u32 config2; + u32 config3; + u32 write1; + u32 flags; +#define BNX2_NV_BUFFERED 0x00000001 +#define BNX2_NV_TRANSLATE 0x00000002 +#define BNX2_NV_WREN 0x00000004 + u32 page_bits; + u32 page_size; + u32 addr_mask; + u32 total_size; + u8 *name; +}; + +#define BNX2_MAX_MSIX_HW_VEC 9 +#define BNX2_MAX_MSIX_VEC 9 +#define BNX2_BASE_VEC 0 +#define BNX2_TX_VEC 1 +#define BNX2_TX_INT_NUM (BNX2_TX_VEC << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT) + +struct bnx2_irq { +#if (LINUX_VERSION_CODE < 0x020613) + irqreturn_t (*handler)(int, void *, struct pt_regs *); +#else + irq_handler_t handler; +#endif + unsigned int vector; + u8 requested; + char name[16]; +}; + +struct bnx2_tx_ring_info { + u32 tx_prod_bseq; + u16 tx_prod; + u32 tx_bidx_addr; + u32 tx_bseq_addr; + + struct tx_bd *tx_desc_ring; + struct sw_tx_bd *tx_buf_ring; + + u16 tx_cons; + u16 hw_tx_cons; + + dma_addr_t tx_desc_mapping; +}; + +struct bnx2_rx_ring_info { + u32 rx_prod_bseq; + u16 rx_prod; + u16 rx_cons; + + u32 rx_bidx_addr; + u32 rx_bseq_addr; + u32 rx_pg_bidx_addr; + + u16 rx_pg_prod; + u16 rx_pg_cons; + + struct sw_bd *rx_buf_ring; + struct rx_bd *rx_desc_ring[MAX_RX_RINGS]; + struct sw_pg *rx_pg_ring; + struct rx_bd *rx_pg_desc_ring[MAX_RX_PG_RINGS]; + + dma_addr_t rx_desc_mapping[MAX_RX_RINGS]; + dma_addr_t rx_pg_desc_mapping[MAX_RX_PG_RINGS]; +}; + +struct bnx2_napi { +#ifdef BNX2_NEW_NAPI + struct napi_struct napi ____cacheline_aligned; +#endif + struct bnx2 *bp; + union { + struct status_block *msi; + struct status_block_msix *msix; + } status_blk; + volatile u16 *hw_tx_cons_ptr; + volatile u16 *hw_rx_cons_ptr; + u32 last_status_idx; + u32 int_num; + + u32 cnic_tag; + int cnic_present; + + struct bnx2_rx_ring_info rx_ring; + struct bnx2_tx_ring_info tx_ring; + +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) + u8 rx_queue_allocated; + u8 tx_queue_allocated; + u8 rx_queue_active; + u8 tx_queue_active; + + vmknetddi_queueops_filter_class_t class; + u16 vlan_id; + u8 mac_filter_addr[6]; + u8 netq_flags; +#define BNX2_NETQ_FREE_TX_QUEUE_STATE 0x0001 + u8 netq_state; +#define BNX2_NETQ_SUSPENDED 0x0004 +#define BNX2_NETQ_RX_FILTER_APPLIED 0x0010 + + u32 tx_packets_sent; + u32 tx_packets_processed; + + struct net_device_stats stats; +#endif +}; + +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) +struct netq_dma { + int num_pages; + void **pg_arr; + dma_addr_t *pg_map_arr; + int pgtbl_size; + u32 *pgtbl; + dma_addr_t pgtbl_map; +}; + +struct netq_ctx { + u32 cid; + void *ctx; + dma_addr_t mapping; +}; +#endif + +struct bnx2 { + /* Fields used in the tx and intr/napi performance paths are grouped */ + /* together in the beginning of the structure. */ + void __iomem *regview; + + struct net_device *dev; + struct pci_dev *pdev; + + atomic_t intr_sem; + + u32 flags; +#define BNX2_FLAG_PCIX 0x00000001 +#define BNX2_FLAG_PCI_32BIT 0x00000002 +#define BNX2_FLAG_MSIX_CAP 0x00000004 +#define BNX2_FLAG_NO_WOL 0x00000008 +#define BNX2_FLAG_USING_MSI 0x00000020 +#define BNX2_FLAG_ASF_ENABLE 0x00000040 +#define BNX2_FLAG_MSI_CAP 0x00000080 +#define BNX2_FLAG_ONE_SHOT_MSI 0x00000100 +#define BNX2_FLAG_PCIE 0x00000200 +#define BNX2_FLAG_USING_MSIX 0x00000400 +#define BNX2_FLAG_USING_MSI_OR_MSIX (BNX2_FLAG_USING_MSI | \ + BNX2_FLAG_USING_MSIX) +#define BNX2_FLAG_JUMBO_BROKEN 0x00000800 +#define BNX2_FLAG_CAN_KEEP_VLAN 0x00001000 +#define BNX2_FLAG_BROKEN_STATS 0x00002000 + + struct bnx2_napi bnx2_napi[BNX2_MAX_MSIX_VEC]; + +#ifdef BCM_VLAN + struct vlan_group *vlgrp; +#endif + + u32 rx_buf_use_size; /* useable size */ + u32 rx_buf_size; /* with alignment */ + u32 rx_copy_thresh; + u32 rx_jumbo_thresh; + u32 rx_max_ring_idx; + u32 rx_max_pg_ring_idx; + + u32 rx_csum; + + /* TX constants */ + int tx_ring_size; + u32 tx_wake_thresh; + + struct cnic_ops *cnic_ops; + void *cnic_data; + + /* End of fields used in the performance code paths. */ + + unsigned int current_interval; +#define BNX2_TIMER_INTERVAL HZ +#define BNX2_SERDES_AN_TIMEOUT (HZ / 3) +#define BNX2_SERDES_FORCED_TIMEOUT (HZ / 10) + + struct timer_list timer; +#if (LINUX_VERSION_CODE >= 0x020600) + struct work_struct reset_task; +#else + struct tq_struct reset_task; +#endif + + /* Used to synchronize phy accesses. */ + spinlock_t phy_lock; + spinlock_t indirect_lock; + + u32 phy_flags; +#define BNX2_PHY_FLAG_SERDES 0x00000001 +#define BNX2_PHY_FLAG_CRC_FIX 0x00000002 +#define BNX2_PHY_FLAG_PARALLEL_DETECT 0x00000004 +#define BNX2_PHY_FLAG_2_5G_CAPABLE 0x00000008 +#define BNX2_PHY_FLAG_INT_MODE_MASK 0x00000300 +#define BNX2_PHY_FLAG_INT_MODE_AUTO_POLLING 0x00000100 +#define BNX2_PHY_FLAG_INT_MODE_LINK_READY 0x00000200 +#define BNX2_PHY_FLAG_DIS_EARLY_DAC 0x00000400 +#define BNX2_PHY_FLAG_REMOTE_PHY_CAP 0x00000800 +#define BNX2_PHY_FLAG_FORCED_DOWN 0x00001000 +#define BNX2_PHY_FLAG_NO_PARALLEL 0x00002000 + + u32 mii_bmcr; + u32 mii_bmsr; + u32 mii_bmsr1; + u32 mii_adv; + u32 mii_lpa; + u32 mii_up1; + + u32 chip_id; + /* chip num:16-31, rev:12-15, metal:4-11, bond_id:0-3 */ +#define CHIP_NUM(bp) (((bp)->chip_id) & 0xffff0000) +#define CHIP_NUM_5706 0x57060000 +#define CHIP_NUM_5708 0x57080000 +#define CHIP_NUM_5709 0x57090000 + +#define CHIP_REV(bp) (((bp)->chip_id) & 0x0000f000) +#define CHIP_REV_Ax 0x00000000 +#define CHIP_REV_Bx 0x00001000 +#define CHIP_REV_Cx 0x00002000 + +#define CHIP_METAL(bp) (((bp)->chip_id) & 0x00000ff0) +#define CHIP_BONDING(bp) (((bp)->chip_id) & 0x0000000f) + +#define CHIP_ID(bp) (((bp)->chip_id) & 0xfffffff0) +#define CHIP_ID_5706_A0 0x57060000 +#define CHIP_ID_5706_A1 0x57060010 +#define CHIP_ID_5706_A2 0x57060020 +#define CHIP_ID_5708_A0 0x57080000 +#define CHIP_ID_5708_B0 0x57081000 +#define CHIP_ID_5708_B1 0x57081010 +#define CHIP_ID_5709_A0 0x57090000 +#define CHIP_ID_5709_A1 0x57090010 + +#define CHIP_BOND_ID(bp) (((bp)->chip_id) & 0xf) + +/* A serdes chip will have the first bit of the bond id set. */ +#define CHIP_BOND_ID_SERDES_BIT 0x01 + + u32 phy_addr; + u32 phy_id; + + u16 bus_speed_mhz; + u8 wol; + + u8 index; + + u16 fw_wr_seq; + u16 fw_drv_pulse_wr_seq; + + int rx_max_ring; + int rx_ring_size; + + int rx_max_pg_ring; + int rx_pg_ring_size; + + u16 tx_quick_cons_trip; + u16 tx_quick_cons_trip_int; + u16 rx_quick_cons_trip; + u16 rx_quick_cons_trip_int; + u16 comp_prod_trip; + u16 comp_prod_trip_int; + u16 tx_ticks; + u16 tx_ticks_int; + u16 com_ticks; + u16 com_ticks_int; + u16 cmd_ticks; + u16 cmd_ticks_int; + u16 rx_ticks; + u16 rx_ticks_int; + + u32 stats_ticks; + + dma_addr_t status_blk_mapping; + + struct statistics_block *stats_blk; + dma_addr_t stats_blk_mapping; + + int ctx_pages; + void *ctx_blk[4]; + dma_addr_t ctx_blk_mapping[4]; + + u32 hc_cmd; + u32 rx_mode; + + u16 req_line_speed; + u8 req_duplex; + + u8 phy_port; + u8 link_up; + + u16 line_speed; + u8 duplex; + u8 flow_ctrl; /* actual flow ctrl settings */ + /* may be different from */ + /* req_flow_ctrl if autoneg */ +#ifndef FLOW_CTRL_TX +#define FLOW_CTRL_TX 1 +#define FLOW_CTRL_RX 2 +#endif + + u32 advertising; + + u8 req_flow_ctrl; /* flow ctrl advertisement */ + /* settings or forced */ + /* settings */ + u8 autoneg; +#define AUTONEG_SPEED 1 +#define AUTONEG_FLOW_CTRL 2 + + u8 loopback; +#define MAC_LOOPBACK 1 +#define PHY_LOOPBACK 2 + + u8 serdes_an_pending; + + u8 mac_addr[8]; + + u32 shmem_base; + + char fw_version[32]; + + int pm_cap; + int pcix_cap; + + struct net_device_stats net_stats; + + const struct flash_spec *flash_info; + u32 flash_size; + + int status_stats_size; + + struct z_stream_s *strm; + void *gunzip_buf; + + struct bnx2_irq irq_tbl[BNX2_MAX_MSIX_VEC]; + int irq_nvecs; + + u8 num_tx_rings; + u8 num_rx_rings; + + u32 idle_chk_status_idx; + +#ifdef BCM_CNIC + struct mutex cnic_lock; + struct cnic_eth_dev cnic_eth_dev; +#endif + + struct mutex reset_lock; +#if defined(__VMKLNX__) && defined(__VMKNETDDI_QUEUEOPS__) + u16 n_rx_queues_allocated; + u16 n_tx_queues_allocated; + + /* KWQ/KCQ for NetQueue */ + u32 netq_kwq_cid_addr; + u32 netq_kcq_cid_addr; + + struct netq_dma netq_kwq_info; + struct l2_kwqe **netq_kwq; + + u16 netq_kwq_prod_idx; + u32 netq_kwq_io_addr; + + u16 netq_kwq_con_idx; + + struct netq_dma netq_kcq_info; + struct l2_kcqe **netq_kcq; + + u16 netq_kcq_prod_idx; + u32 netq_kcq_io_addr; + + u32 netq_last_status_idx; + +#define BNX2_NETQ_MAX_COMPLETED_KCQE 8 + struct l2_kcqe *netq_completed_kcq[BNX2_NETQ_MAX_COMPLETED_KCQE]; + + u8 netq_flags; + u8 netq_enabled; + u8 netq_state; +#define BNX2_NETQ_HW_OPENED 0x0001 +#define BNX2_NETQ_HW_STARTED 0x0002 + u8 reserved1[1]; + + wait_queue_head_t netq_wait; +#endif + u8 reset_failed; +}; + +#define REG_RD(bp, offset) \ + readl(bp->regview + offset) + +#define REG_WR(bp, offset, val) \ + writel(val, bp->regview + offset) + +#define REG_WR16(bp, offset, val) \ + writew(val, bp->regview + offset) + +struct cpu_reg { + u32 mode; + u32 mode_value_halt; + u32 mode_value_sstep; + + u32 state; + u32 state_value_clear; + + u32 gpr0; + u32 evmask; + u32 pc; + u32 inst; + u32 bp; + + u32 spad_base; + + u32 mips_view_base; +}; + +struct fw_info { + const u32 ver_major; + const u32 ver_minor; + const u32 ver_fix; + + const u32 start_addr; + + /* Text section. */ + const u32 text_addr; + const u32 text_len; + const u32 text_index; + __le32 *text; + const u8 *gz_text; + const u32 gz_text_len; + + /* Data section. */ + const u32 data_addr; + const u32 data_len; + const u32 data_index; + const u32 *data; + + /* SBSS section. */ + const u32 sbss_addr; + const u32 sbss_len; + const u32 sbss_index; + + /* BSS section. */ + const u32 bss_addr; + const u32 bss_len; + const u32 bss_index; + + /* Read-only section. */ + const u32 rodata_addr; + const u32 rodata_len; + const u32 rodata_index; + const u32 *rodata; +}; + +#define RV2P_P1_FIXUP_PAGE_SIZE_IDX 0 +#define RV2P_BD_PAGE_SIZE_MSK 0xffff +#define RV2P_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + +#define RV2P_PROC1 0 +#define RV2P_PROC2 1 + + +/* This value (in milliseconds) determines the frequency of the driver + * issuing the PULSE message code. The firmware monitors this periodic + * pulse to determine when to switch to an OS-absent mode. */ +#define BNX2_DRV_PULSE_PERIOD_MS 250 + +/* This value (in milliseconds) determines how long the driver should + * wait for an acknowledgement from the firmware before timing out. Once + * the firmware has timed out, the driver will assume there is no firmware + * running and there won't be any firmware-driver synchronization during a + * driver reset. */ +#define BNX2_FW_ACK_TIME_OUT_MS 1000 + + +#define BNX2_DRV_RESET_SIGNATURE 0x00000000 +#define BNX2_DRV_RESET_SIGNATURE_MAGIC 0x4841564b /* HAVK */ +//#define DRV_RESET_SIGNATURE_MAGIC 0x47495352 /* RSIG */ + +#define BNX2_DRV_MB 0x00000004 +#define BNX2_DRV_MSG_CODE 0xff000000 +#define BNX2_DRV_MSG_CODE_RESET 0x01000000 +#define BNX2_DRV_MSG_CODE_UNLOAD 0x02000000 +#define BNX2_DRV_MSG_CODE_SHUTDOWN 0x03000000 +#define BNX2_DRV_MSG_CODE_SUSPEND_WOL 0x04000000 +#define BNX2_DRV_MSG_CODE_FW_TIMEOUT 0x05000000 +#define BNX2_DRV_MSG_CODE_PULSE 0x06000000 +#define BNX2_DRV_MSG_CODE_DIAG 0x07000000 +#define BNX2_DRV_MSG_CODE_SUSPEND_NO_WOL 0x09000000 +#define BNX2_DRV_MSG_CODE_UNLOAD_LNK_DN 0x0b000000 +#define BNX2_DRV_MSG_CODE_KEEP_VLAN_UPDATE 0x0d000000 +#define BNX2_DRV_MSG_CODE_CMD_SET_LINK 0x10000000 + +#define BNX2_DRV_MSG_DATA 0x00ff0000 +#define BNX2_DRV_MSG_DATA_WAIT0 0x00010000 +#define BNX2_DRV_MSG_DATA_WAIT1 0x00020000 +#define BNX2_DRV_MSG_DATA_WAIT2 0x00030000 +#define BNX2_DRV_MSG_DATA_WAIT3 0x00040000 + +#define BNX2_DRV_MSG_SEQ 0x0000ffff + +#define BNX2_FW_MB 0x00000008 +#define BNX2_FW_MSG_ACK 0x0000ffff +#define BNX2_FW_MSG_STATUS_MASK 0x00ff0000 +#define BNX2_FW_MSG_STATUS_OK 0x00000000 +#define BNX2_FW_MSG_STATUS_FAILURE 0x00ff0000 + +#define BNX2_LINK_STATUS 0x0000000c +#define BNX2_LINK_STATUS_INIT_VALUE 0xffffffff +#define BNX2_LINK_STATUS_LINK_UP 0x1 +#define BNX2_LINK_STATUS_LINK_DOWN 0x0 +#define BNX2_LINK_STATUS_SPEED_MASK 0x1e +#define BNX2_LINK_STATUS_AN_INCOMPLETE (0<<1) +#define BNX2_LINK_STATUS_10HALF (1<<1) +#define BNX2_LINK_STATUS_10FULL (2<<1) +#define BNX2_LINK_STATUS_100HALF (3<<1) +#define BNX2_LINK_STATUS_100BASE_T4 (4<<1) +#define BNX2_LINK_STATUS_100FULL (5<<1) +#define BNX2_LINK_STATUS_1000HALF (6<<1) +#define BNX2_LINK_STATUS_1000FULL (7<<1) +#define BNX2_LINK_STATUS_2500HALF (8<<1) +#define BNX2_LINK_STATUS_2500FULL (9<<1) +#define BNX2_LINK_STATUS_AN_ENABLED (1<<5) +#define BNX2_LINK_STATUS_AN_COMPLETE (1<<6) +#define BNX2_LINK_STATUS_PARALLEL_DET (1<<7) +#define BNX2_LINK_STATUS_RESERVED (1<<8) +#define BNX2_LINK_STATUS_PARTNER_AD_1000FULL (1<<9) +#define BNX2_LINK_STATUS_PARTNER_AD_1000HALF (1<<10) +#define BNX2_LINK_STATUS_PARTNER_AD_100BT4 (1<<11) +#define BNX2_LINK_STATUS_PARTNER_AD_100FULL (1<<12) +#define BNX2_LINK_STATUS_PARTNER_AD_100HALF (1<<13) +#define BNX2_LINK_STATUS_PARTNER_AD_10FULL (1<<14) +#define BNX2_LINK_STATUS_PARTNER_AD_10HALF (1<<15) +#define BNX2_LINK_STATUS_TX_FC_ENABLED (1<<16) +#define BNX2_LINK_STATUS_RX_FC_ENABLED (1<<17) +#define BNX2_LINK_STATUS_PARTNER_SYM_PAUSE_CAP (1<<18) +#define BNX2_LINK_STATUS_PARTNER_ASYM_PAUSE_CAP (1<<19) +#define BNX2_LINK_STATUS_SERDES_LINK (1<<20) +#define BNX2_LINK_STATUS_PARTNER_AD_2500FULL (1<<21) +#define BNX2_LINK_STATUS_PARTNER_AD_2500HALF (1<<22) +#define BNX2_LINK_STATUS_HEART_BEAT_EXPIRED (1<<31) + +#define BNX2_DRV_PULSE_MB 0x00000010 +#define BNX2_DRV_PULSE_SEQ_MASK 0x00007fff + +/* Indicate to the firmware not to go into the + * OS absent when it is not getting driver pulse. + * This is used for debugging. */ +#define BNX2_DRV_MSG_DATA_PULSE_CODE_ALWAYS_ALIVE 0x00080000 + +#define BNX2_DRV_MB_ARG0 0x00000014 +#define BNX2_NETLINK_SET_LINK_SPEED_10HALF (1<<0) +#define BNX2_NETLINK_SET_LINK_SPEED_10FULL (1<<1) +#define BNX2_NETLINK_SET_LINK_SPEED_10 \ + (BNX2_NETLINK_SET_LINK_SPEED_10HALF | \ + BNX2_NETLINK_SET_LINK_SPEED_10FULL) +#define BNX2_NETLINK_SET_LINK_SPEED_100HALF (1<<2) +#define BNX2_NETLINK_SET_LINK_SPEED_100FULL (1<<3) +#define BNX2_NETLINK_SET_LINK_SPEED_100 \ + (BNX2_NETLINK_SET_LINK_SPEED_100HALF | \ + BNX2_NETLINK_SET_LINK_SPEED_100FULL) +#define BNX2_NETLINK_SET_LINK_SPEED_1GHALF (1<<4) +#define BNX2_NETLINK_SET_LINK_SPEED_1GFULL (1<<5) +#define BNX2_NETLINK_SET_LINK_SPEED_2G5HALF (1<<6) +#define BNX2_NETLINK_SET_LINK_SPEED_2G5FULL (1<<7) +#define BNX2_NETLINK_SET_LINK_SPEED_10GHALF (1<<8) +#define BNX2_NETLINK_SET_LINK_SPEED_10GFULL (1<<9) +#define BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG (1<<10) +#define BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE (1<<11) +#define BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE (1<<12) +#define BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE (1<<13) +#define BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED (1<<14) +#define BNX2_NETLINK_SET_LINK_PHY_RESET (1<<15) + +#define BNX2_DEV_INFO_SIGNATURE 0x00000020 +#define BNX2_DEV_INFO_SIGNATURE_MAGIC 0x44564900 +#define BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK 0xffffff00 +#define BNX2_DEV_INFO_FEATURE_CFG_VALID 0x01 +#define BNX2_DEV_INFO_SECONDARY_PORT 0x80 +#define BNX2_DEV_INFO_DRV_ALWAYS_ALIVE 0x40 + +#define BNX2_SHARED_HW_CFG_PART_NUM 0x00000024 + +#define BNX2_SHARED_HW_CFG_POWER_DISSIPATED 0x00000034 +#define BNX2_SHARED_HW_CFG_POWER_STATE_D3_MASK 0xff000000 +#define BNX2_SHARED_HW_CFG_POWER_STATE_D2_MASK 0xff0000 +#define BNX2_SHARED_HW_CFG_POWER_STATE_D1_MASK 0xff00 +#define BNX2_SHARED_HW_CFG_POWER_STATE_D0_MASK 0xff + +#define BNX2_SHARED_HW_CFG POWER_CONSUMED 0x00000038 +#define BNX2_SHARED_HW_CFG_CONFIG 0x0000003c +#define BNX2_SHARED_HW_CFG_DESIGN_NIC 0 +#define BNX2_SHARED_HW_CFG_DESIGN_LOM 0x1 +#define BNX2_SHARED_HW_CFG_PHY_COPPER 0 +#define BNX2_SHARED_HW_CFG_PHY_FIBER 0x2 +#define BNX2_SHARED_HW_CFG_PHY_2_5G 0x20 +#define BNX2_SHARED_HW_CFG_PHY_BACKPLANE 0x40 +#define BNX2_SHARED_HW_CFG_LED_MODE_SHIFT_BITS 8 +#define BNX2_SHARED_HW_CFG_LED_MODE_MASK 0x300 +#define BNX2_SHARED_HW_CFG_LED_MODE_MAC 0 +#define BNX2_SHARED_HW_CFG_LED_MODE_GPHY1 0x100 +#define BNX2_SHARED_HW_CFG_LED_MODE_GPHY2 0x200 +#define BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX 0x8000 + +#define BNX2_SHARED_HW_CFG_CONFIG2 0x00000040 +#define BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK 0x00fff000 + +#define BNX2_DEV_INFO_BC_REV 0x0000004c + +#define BNX2_PORT_HW_CFG_MAC_UPPER 0x00000050 +#define BNX2_PORT_HW_CFG_UPPERMAC_MASK 0xffff + +#define BNX2_PORT_HW_CFG_MAC_LOWER 0x00000054 +#define BNX2_PORT_HW_CFG_CONFIG 0x00000058 +#define BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK 0x0000ffff +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK 0x001f0000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_AN 0x00000000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G 0x00030000 +#define BNX2_PORT_HW_CFG_CFG_DFLT_LINK_2_5G 0x00040000 + +#define BNX2_PORT_HW_CFG_IMD_MAC_A_UPPER 0x00000068 +#define BNX2_PORT_HW_CFG_IMD_MAC_A_LOWER 0x0000006c +#define BNX2_PORT_HW_CFG_IMD_MAC_B_UPPER 0x00000070 +#define BNX2_PORT_HW_CFG_IMD_MAC_B_LOWER 0x00000074 +#define BNX2_PORT_HW_CFG_ISCSI_MAC_UPPER 0x00000078 +#define BNX2_PORT_HW_CFG_ISCSI_MAC_LOWER 0x0000007c + +#define BNX2_DEV_INFO_PER_PORT_HW_CONFIG2 0x000000b4 + +#define BNX2_DEV_INFO_FORMAT_REV 0x000000c4 +#define BNX2_DEV_INFO_FORMAT_REV_MASK 0xff000000 +#define BNX2_DEV_INFO_FORMAT_REV_ID ('A' << 24) + +#define BNX2_SHARED_FEATURE 0x000000c8 +#define BNX2_SHARED_FEATURE_MASK 0xffffffff + +#define BNX2_PORT_FEATURE 0x000000d8 +#define BNX2_PORT2_FEATURE 0x00000014c +#define BNX2_PORT_FEATURE_WOL_ENABLED 0x01000000 +#define BNX2_PORT_FEATURE_MBA_ENABLED 0x02000000 +#define BNX2_PORT_FEATURE_ASF_ENABLED 0x04000000 +#define BNX2_PORT_FEATURE_IMD_ENABLED 0x08000000 +#define BNX2_PORT_FEATURE_BAR1_SIZE_MASK 0xf +#define BNX2_PORT_FEATURE_BAR1_SIZE_DISABLED 0x0 +#define BNX2_PORT_FEATURE_BAR1_SIZE_64K 0x1 +#define BNX2_PORT_FEATURE_BAR1_SIZE_128K 0x2 +#define BNX2_PORT_FEATURE_BAR1_SIZE_256K 0x3 +#define BNX2_PORT_FEATURE_BAR1_SIZE_512K 0x4 +#define BNX2_PORT_FEATURE_BAR1_SIZE_1M 0x5 +#define BNX2_PORT_FEATURE_BAR1_SIZE_2M 0x6 +#define BNX2_PORT_FEATURE_BAR1_SIZE_4M 0x7 +#define BNX2_PORT_FEATURE_BAR1_SIZE_8M 0x8 +#define BNX2_PORT_FEATURE_BAR1_SIZE_16M 0x9 +#define BNX2_PORT_FEATURE_BAR1_SIZE_32M 0xa +#define BNX2_PORT_FEATURE_BAR1_SIZE_64M 0xb +#define BNX2_PORT_FEATURE_BAR1_SIZE_128M 0xc +#define BNX2_PORT_FEATURE_BAR1_SIZE_256M 0xd +#define BNX2_PORT_FEATURE_BAR1_SIZE_512M 0xe +#define BNX2_PORT_FEATURE_BAR1_SIZE_1G 0xf + +#define BNX2_PORT_FEATURE_WOL 0xdc +#define BNX2_PORT2_FEATURE_WOL 0x150 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_SHIFT_BITS 4 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_MASK 0x30 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_DISABLE 0 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_MAGIC 0x10 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_ACPI 0x20 +#define BNX2_PORT_FEATURE_WOL_DEFAULT_MAGIC_AND_ACPI 0x30 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_MASK 0xf +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_AUTONEG 0 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_10HALF 1 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_10FULL 2 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_100HALF 3 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_100FULL 4 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_1000HALF 5 +#define BNX2_PORT_FEATURE_WOL_LINK_SPEED_1000FULL 6 +#define BNX2_PORT_FEATURE_WOL_AUTONEG_ADVERTISE_1000 0x40 +#define BNX2_PORT_FEATURE_WOL_RESERVED_PAUSE_CAP 0x400 +#define BNX2_PORT_FEATURE_WOL_RESERVED_ASYM_PAUSE_CAP 0x800 + +#define BNX2_PORT_FEATURE_MBA 0xe0 +#define BNX2_PORT2_FEATURE_MBA 0x154 +#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_SHIFT_BITS 0 +#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK 0x3 +#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_PXE 0 +#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_RPL 1 +#define BNX2_PORT_FEATURE_MBA_BOOT_AGENT_TYPE_BOOTP 2 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_SHIFT_BITS 2 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_MASK 0x3c +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_AUTONEG 0 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_10HALF 0x4 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_10FULL 0x8 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_100HALF 0xc +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_100FULL 0x10 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_1000HALF 0x14 +#define BNX2_PORT_FEATURE_MBA_LINK_SPEED_1000FULL 0x18 +#define BNX2_PORT_FEATURE_MBA_SETUP_PROMPT_ENABLE 0x40 +#define BNX2_PORT_FEATURE_MBA_HOTKEY_CTRL_S 0 +#define BNX2_PORT_FEATURE_MBA_HOTKEY_CTRL_B 0x80 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_SHIFT_BITS 8 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_MASK 0xff00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_DISABLED 0 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_1K 0x100 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_2K 0x200 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_4K 0x300 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_8K 0x400 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_16K 0x500 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_32K 0x600 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_64K 0x700 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_128K 0x800 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_256K 0x900 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_512K 0xa00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_1M 0xb00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_2M 0xc00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_4M 0xd00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_8M 0xe00 +#define BNX2_PORT_FEATURE_MBA_EXP_ROM_SIZE_16M 0xf00 +#define BNX2_PORT_FEATURE_MBA_MSG_TIMEOUT_SHIFT_BITS 16 +#define BNX2_PORT_FEATURE_MBA_MSG_TIMEOUT_MASK 0xf0000 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_SHIFT_BITS 20 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_MASK 0x300000 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_AUTO 0 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_BBS 0x100000 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT18H 0x200000 +#define BNX2_PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT19H 0x300000 + +#define BNX2_PORT_FEATURE_IMD 0xe4 +#define BNX2_PORT2_FEATURE_IMD 0x158 +#define BNX2_PORT_FEATURE_IMD_LINK_OVERRIDE_DEFAULT 0 +#define BNX2_PORT_FEATURE_IMD_LINK_OVERRIDE_ENABLE 1 + +#define BNX2_PORT_FEATURE_VLAN 0xe8 +#define BNX2_PORT2_FEATURE_VLAN 0x15c +#define BNX2_PORT_FEATURE_MBA_VLAN_TAG_MASK 0xffff +#define BNX2_PORT_FEATURE_MBA_VLAN_ENABLE 0x10000 + +#define BNX2_MFW_VER_PTR 0x00000014c + +#define BNX2_BC_STATE_RESET_TYPE 0x000001c0 +#define BNX2_BC_STATE_RESET_TYPE_SIG 0x00005254 +#define BNX2_BC_STATE_RESET_TYPE_SIG_MASK 0x0000ffff +#define BNX2_BC_STATE_RESET_TYPE_NONE (BNX2_BC_STATE_RESET_TYPE_SIG | \ + 0x00010000) +#define BNX2_BC_STATE_RESET_TYPE_PCI (BNX2_BC_STATE_RESET_TYPE_SIG | \ + 0x00020000) +#define BNX2_BC_STATE_RESET_TYPE_VAUX (BNX2_BC_STATE_RESET_TYPE_SIG | \ + 0x00030000) +#define BNX2_BC_STATE_RESET_TYPE_DRV_MASK DRV_MSG_CODE +#define BNX2_BC_STATE_RESET_TYPE_DRV_RESET (BNX2_BC_STATE_RESET_TYPE_SIG | \ + DRV_MSG_CODE_RESET) +#define BNX2_BC_STATE_RESET_TYPE_DRV_UNLOAD (BNX2_BC_STATE_RESET_TYPE_SIG | \ + DRV_MSG_CODE_UNLOAD) +#define BNX2_BC_STATE_RESET_TYPE_DRV_SHUTDOWN (BNX2_BC_STATE_RESET_TYPE_SIG | \ + DRV_MSG_CODE_SHUTDOWN) +#define BNX2_BC_STATE_RESET_TYPE_DRV_WOL (BNX2_BC_STATE_RESET_TYPE_SIG | \ + DRV_MSG_CODE_WOL) +#define BNX2_BC_STATE_RESET_TYPE_DRV_DIAG (BNX2_BC_STATE_RESET_TYPE_SIG | \ + DRV_MSG_CODE_DIAG) +#define BNX2_BC_STATE_RESET_TYPE_VALUE(msg) (BNX2_BC_STATE_RESET_TYPE_SIG | \ + (msg)) + +#define BNX2_BC_STATE 0x000001c4 +#define BNX2_BC_STATE_ERR_MASK 0x0000ff00 +#define BNX2_BC_STATE_SIGN 0x42530000 +#define BNX2_BC_STATE_SIGN_MASK 0xffff0000 +#define BNX2_BC_STATE_BC1_START (BNX2_BC_STATE_SIGN | 0x1) +#define BNX2_BC_STATE_GET_NVM_CFG1 (BNX2_BC_STATE_SIGN | 0x2) +#define BNX2_BC_STATE_PROG_BAR (BNX2_BC_STATE_SIGN | 0x3) +#define BNX2_BC_STATE_INIT_VID (BNX2_BC_STATE_SIGN | 0x4) +#define BNX2_BC_STATE_GET_NVM_CFG2 (BNX2_BC_STATE_SIGN | 0x5) +#define BNX2_BC_STATE_APPLY_WKARND (BNX2_BC_STATE_SIGN | 0x6) +#define BNX2_BC_STATE_LOAD_BC2 (BNX2_BC_STATE_SIGN | 0x7) +#define BNX2_BC_STATE_GOING_BC2 (BNX2_BC_STATE_SIGN | 0x8) +#define BNX2_BC_STATE_GOING_DIAG (BNX2_BC_STATE_SIGN | 0x9) +#define BNX2_BC_STATE_RT_FINAL_INIT (BNX2_BC_STATE_SIGN | 0x81) +#define BNX2_BC_STATE_RT_WKARND (BNX2_BC_STATE_SIGN | 0x82) +#define BNX2_BC_STATE_RT_DRV_PULSE (BNX2_BC_STATE_SIGN | 0x83) +#define BNX2_BC_STATE_RT_FIOEVTS (BNX2_BC_STATE_SIGN | 0x84) +#define BNX2_BC_STATE_RT_DRV_CMD (BNX2_BC_STATE_SIGN | 0x85) +#define BNX2_BC_STATE_RT_LOW_POWER (BNX2_BC_STATE_SIGN | 0x86) +#define BNX2_BC_STATE_RT_SET_WOL (BNX2_BC_STATE_SIGN | 0x87) +#define BNX2_BC_STATE_RT_OTHER_FW (BNX2_BC_STATE_SIGN | 0x88) +#define BNX2_BC_STATE_RT_GOING_D3 (BNX2_BC_STATE_SIGN | 0x89) +#define BNX2_BC_STATE_ERR_BAD_VERSION (BNX2_BC_STATE_SIGN | 0x0100) +#define BNX2_BC_STATE_ERR_BAD_BC2_CRC (BNX2_BC_STATE_SIGN | 0x0200) +#define BNX2_BC_STATE_ERR_BC1_LOOP (BNX2_BC_STATE_SIGN | 0x0300) +#define BNX2_BC_STATE_ERR_UNKNOWN_CMD (BNX2_BC_STATE_SIGN | 0x0400) +#define BNX2_BC_STATE_ERR_DRV_DEAD (BNX2_BC_STATE_SIGN | 0x0500) +#define BNX2_BC_STATE_ERR_NO_RXP (BNX2_BC_STATE_SIGN | 0x0600) +#define BNX2_BC_STATE_ERR_TOO_MANY_RBUF (BNX2_BC_STATE_SIGN | 0x0700) + +#define BNX2_BC_STATE_CONDITION 0x000001c8 +#define BNX2_CONDITION_MFW_RUN_UNKNOWN 0x00000000 +#define BNX2_CONDITION_MFW_RUN_IPMI 0x00002000 +#define BNX2_CONDITION_MFW_RUN_UMP 0x00004000 +#define BNX2_CONDITION_MFW_RUN_NCSI 0x00006000 +#define BNX2_CONDITION_MFW_RUN_NONE 0x0000e000 +#define BNX2_CONDITION_MFW_RUN_MASK 0x0000e000 + +#define BNX2_BC_STATE_DEBUG_CMD 0x1dc +#define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE 0x42440000 +#define BNX2_BC_STATE_BC_DBG_CMD_SIGNATURE_MASK 0xffff0000 +#define BNX2_BC_STATE_BC_DBG_CMD_LOOP_CNT_MASK 0xffff +#define BNX2_BC_STATE_BC_DBG_CMD_LOOP_INFINITE 0xffff + +#define BNX2_FW_EVT_CODE_MB 0x354 +#define BNX2_FW_EVT_CODE_SW_TIMER_EXPIRATION_EVENT 0x00000000 +#define BNX2_FW_EVT_CODE_LINK_EVENT 0x00000001 + +#define BNX2_DRV_ACK_CAP_MB 0x364 +#define BNX2_DRV_ACK_CAP_SIGNATURE 0x35450000 +#define BNX2_CAPABILITY_SIGNATURE_MASK 0xFFFF0000 + +#define BNX2_FW_CAP_MB 0x368 +#define BNX2_FW_CAP_SIGNATURE 0xaa550000 +#define BNX2_FW_ACK_DRV_SIGNATURE 0x52500000 +#define BNX2_FW_CAP_SIGNATURE_MASK 0xffff0000 +#define BNX2_FW_CAP_REMOTE_PHY_CAPABLE 0x00000001 +#define BNX2_FW_CAP_REMOTE_PHY_PRESENT 0x00000002 +#define BNX2_FW_CAP_MFW_CAN_KEEP_VLAN 0x00000008 +#define BNX2_FW_CAP_BC_CAN_KEEP_VLAN 0x00000010 +#define BNX2_FW_CAP_CAN_KEEP_VLAN (BNX2_FW_CAP_BC_CAN_KEEP_VLAN | \ + BNX2_FW_CAP_MFW_CAN_KEEP_VLAN) + +#define BNX2_RPHY_SIGNATURE 0x36c +#define BNX2_RPHY_LOAD_SIGNATURE 0x5a5a5a5a + +#define BNX2_RPHY_FLAGS 0x370 +#define BNX2_RPHY_SERDES_LINK 0x374 +#define BNX2_RPHY_COPPER_LINK 0x378 + +#define HOST_VIEW_SHMEM_BASE 0x167c00 + +#endif diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw.h new file mode 100644 index 0000000..7250ac5 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw.h @@ -0,0 +1,4553 @@ +/* bnx2_fw.h: Broadcom NX2 network driver. + * + * Copyright (c) 2004-2010 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, except as noted below. + * + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004-2010 + * Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ + +static u8 bnx2_COM_b06FwText[] = { + 0xcd, 0x7c, 0x7f, 0x70, 0x5b, 0xd7, 0x95, 0xde, 0x79, 0x0f, 0x00, 0x09, + 0x91, 0x14, 0xf5, 0x44, 0xc3, 0x0c, 0xec, 0x30, 0x09, 0x1e, 0xf9, 0x48, + 0xc2, 0x26, 0x9d, 0x3c, 0x31, 0x8c, 0x42, 0x67, 0x51, 0x1b, 0x06, 0x48, + 0x99, 0x4e, 0xc4, 0x2e, 0x6d, 0x33, 0x5e, 0x4d, 0xab, 0xa6, 0x28, 0x48, + 0x79, 0x1d, 0x8f, 0x33, 0xd1, 0x34, 0x6e, 0xab, 0xa4, 0x8e, 0x05, 0x81, + 0xb4, 0x23, 0x67, 0x21, 0x81, 0x91, 0x28, 0xc9, 0xed, 0x64, 0xba, 0x0c, + 0x48, 0x4a, 0x8e, 0x17, 0x12, 0xe4, 0x1f, 0x49, 0xbc, 0xd9, 0xd8, 0xe6, + 0x32, 0x8a, 0xec, 0xb8, 0xe9, 0x8e, 0x9d, 0x71, 0x3b, 0x9a, 0xae, 0xdb, + 0x6a, 0x14, 0xa7, 0x71, 0xd3, 0x6d, 0xeb, 0x6e, 0xf2, 0x87, 0x77, 0xeb, + 0xe4, 0xf5, 0xfb, 0xee, 0xbb, 0x8f, 0x04, 0x69, 0xc6, 0xce, 0xee, 0x4e, + 0x67, 0xca, 0x19, 0xcc, 0x7d, 0xef, 0xbe, 0xfb, 0xf3, 0x9c, 0x73, 0xcf, + 0xf9, 0xce, 0xb9, 0xf7, 0x72, 0x58, 0xa4, 0x49, 0xf4, 0xdf, 0x56, 0xfc, + 0x3e, 0xf6, 0xb9, 0xcf, 0x4f, 0xba, 0x1f, 0x76, 0x3f, 0x2c, 0x72, 0xe3, + 0xbd, 0xa6, 0x48, 0x84, 0xf9, 0x21, 0xfc, 0x62, 0xf8, 0x0d, 0xe8, 0xe7, + 0xcd, 0xfe, 0x2c, 0xfc, 0x76, 0x1a, 0x22, 0xb9, 0x9f, 0xeb, 0x4a, 0x75, + 0x7f, 0xd1, 0xdf, 0x50, 0xe7, 0xdd, 0xfe, 0xcc, 0xdf, 0xb2, 0x9c, 0xf5, + 0xb7, 0x68, 0xfb, 0xbd, 0xfe, 0x42, 0xba, 0xd9, 0xad, 0xfa, 0x27, 0x51, + 0x33, 0x25, 0x63, 0x19, 0x47, 0xa2, 0xa1, 0xd4, 0xdb, 0x63, 0x93, 0x8e, + 0x48, 0xba, 0xda, 0x97, 0xc8, 0xca, 0xaf, 0xbc, 0x42, 0x2c, 0x2c, 0xcc, + 0xff, 0x40, 0xea, 0xed, 0x83, 0xcf, 0x7e, 0xdc, 0x7e, 0x73, 0x3e, 0x24, + 0x51, 0x2b, 0x65, 0x19, 0x56, 0x8f, 0x44, 0x3b, 0x50, 0xe7, 0xeb, 0xbd, + 0x31, 0x53, 0x5a, 0x83, 0xb6, 0xde, 0xf0, 0x9e, 0xed, 0x8d, 0xc9, 0xf3, + 0x35, 0x4b, 0xce, 0xd7, 0xa2, 0x46, 0xe6, 0x94, 0xec, 0xcf, 0xba, 0x92, + 0x30, 0x9d, 0x66, 0xc9, 0x5b, 0x46, 0x22, 0x9f, 0xfc, 0x88, 0xa4, 0x63, + 0x36, 0x7b, 0x4e, 0x9b, 0x4e, 0x37, 0xf2, 0xd4, 0x60, 0x72, 0xa6, 0xd3, + 0x83, 0x67, 0xe6, 0xcf, 0x81, 0x57, 0xa8, 0x5f, 0x16, 0x63, 0xbc, 0x77, + 0x8b, 0x98, 0xc7, 0xae, 0x95, 0xb4, 0x65, 0x48, 0xc8, 0xe1, 0xf8, 0x12, + 0x92, 0x29, 0xb5, 0xe3, 0xdd, 0x8e, 0x8b, 0xf4, 0x45, 0xfc, 0x3e, 0xa3, + 0x12, 0x3a, 0x29, 0xd1, 0x86, 0xd4, 0x73, 0x63, 0x17, 0xe7, 0xe2, 0x12, + 0x3e, 0x9a, 0x90, 0x62, 0xb9, 0x45, 0x22, 0x27, 0xa5, 0x23, 0x24, 0xdd, + 0xf1, 0xbb, 0x51, 0x62, 0xb8, 0x1a, 0x96, 0x91, 0xaa, 0x21, 0x61, 0x27, + 0x8a, 0x39, 0xb5, 0xe0, 0x67, 0xe1, 0x17, 0xc3, 0x2f, 0x8e, 0xdf, 0x38, + 0xda, 0xe9, 0x90, 0x6c, 0x95, 0x6d, 0x1e, 0x47, 0xdf, 0xb6, 0x95, 0x93, + 0x67, 0x43, 0x7e, 0xdb, 0xfe, 0xbb, 0xc8, 0xa1, 0x6d, 0xfe, 0x3b, 0x9f, + 0x39, 0x36, 0xcc, 0xad, 0x1c, 0x95, 0xcb, 0xa1, 0xb8, 0x3c, 0xdb, 0x7b, + 0x19, 0xf3, 0xe5, 0x5c, 0xe3, 0x98, 0x73, 0x4c, 0x9e, 0xa8, 0x71, 0xdc, + 0xcd, 0x12, 0xc2, 0xb8, 0x4d, 0xf4, 0xb7, 0xfd, 0xe4, 0x3f, 0x94, 0x7c, + 0xcc, 0x4e, 0x8a, 0x18, 0xd2, 0x39, 0x80, 0xfe, 0x35, 0x2b, 0xcd, 0xa3, + 0x31, 0x8c, 0x7b, 0x65, 0xbb, 0x89, 0x1c, 0x13, 0xed, 0xfe, 0x03, 0xf9, + 0x73, 0xf4, 0x55, 0x90, 0xec, 0x62, 0x30, 0xcf, 0xa4, 0x2e, 0xbb, 0x3a, + 0x4f, 0xd0, 0xb2, 0xc5, 0xc8, 0x9e, 0x4a, 0xc8, 0x43, 0xe5, 0x9b, 0x24, + 0xe3, 0x7a, 0xde, 0xa4, 0x2b, 0x20, 0x7c, 0xb7, 0x95, 0xc5, 0xd7, 0x4a, + 0x55, 0x8c, 0x4c, 0x39, 0xa0, 0x43, 0x18, 0xef, 0xed, 0x28, 0xdb, 0x6a, + 0x0c, 0x9f, 0x02, 0xed, 0x53, 0xa4, 0x85, 0xe7, 0xcd, 0xb8, 0xdd, 0xf1, + 0x29, 0xd0, 0x6b, 0xa1, 0xda, 0xed, 0xae, 0x88, 0x85, 0xf6, 0xda, 0x50, + 0x86, 0x74, 0x61, 0x3b, 0x6c, 0x8f, 0x6d, 0xb5, 0xa0, 0x6e, 0x0c, 0xdf, + 0x3c, 0x2f, 0xe3, 0x5a, 0x78, 0x8e, 0xa3, 0xdd, 0x18, 0xd2, 0x66, 0x23, + 0x73, 0xdc, 0x43, 0xbf, 0x71, 0x3c, 0xfb, 0x34, 0x3b, 0x5d, 0xe5, 0x58, + 0xd3, 0x18, 0xab, 0xa1, 0xe4, 0xc3, 0xc0, 0x73, 0x67, 0x95, 0xf2, 0x33, + 0x2c, 0x93, 0x25, 0x13, 0xf3, 0x0d, 0x8b, 0x33, 0x60, 0xc8, 0xa4, 0xfa, + 0x36, 0x2c, 0x5d, 0xa0, 0x77, 0xc1, 0xea, 0x4b, 0x9a, 0xf2, 0x8c, 0x99, + 0x01, 0xfd, 0xb2, 0xe1, 0x04, 0xe8, 0xc0, 0x36, 0x72, 0x75, 0x6d, 0xe4, + 0xd0, 0xc6, 0xff, 0x01, 0x2d, 0x0c, 0x89, 0x38, 0xed, 0xa0, 0x11, 0x69, + 0x57, 0x30, 0x33, 0xb5, 0x30, 0xca, 0xce, 0x98, 0xd9, 0x33, 0x87, 0xf1, + 0x2c, 0x96, 0x99, 0x7a, 0x86, 0x29, 0xea, 0xee, 0xad, 0xab, 0xbb, 0x17, + 0x75, 0xc1, 0x07, 0x8c, 0xf7, 0x09, 0xc5, 0x23, 0xdb, 0x9a, 0x17, 0xf2, + 0x29, 0xf1, 0x2e, 0x7c, 0x0a, 0x69, 0x3e, 0x7d, 0x8e, 0x7c, 0x4a, 0xbc, + 0x37, 0x9f, 0x32, 0xc6, 0x7a, 0x3e, 0x75, 0xff, 0x7f, 0xc2, 0xa7, 0x98, + 0xcc, 0x63, 0xee, 0xf3, 0xef, 0xc1, 0x1b, 0x13, 0x7c, 0xc8, 0x94, 0xc2, + 0xd2, 0x35, 0x10, 0xe4, 0x0f, 0x23, 0xff, 0x5a, 0xc9, 0x59, 0xe4, 0xd7, + 0x7b, 0xf1, 0xe5, 0x5f, 0x18, 0xe4, 0x4b, 0xd8, 0xe7, 0x4b, 0xe2, 0x6f, + 0xc6, 0x97, 0x03, 0xa8, 0x4b, 0xde, 0x5c, 0xc5, 0xf5, 0x8b, 0xba, 0x61, + 0x23, 0x5b, 0x4e, 0xe4, 0xcc, 0x54, 0x0c, 0x6b, 0x0f, 0xfa, 0xa5, 0xf4, + 0x6b, 0x23, 0xe4, 0x78, 0xa1, 0x8c, 0xdb, 0x2c, 0x59, 0xc5, 0x07, 0xd2, + 0x69, 0x19, 0x74, 0x7f, 0xdb, 0xcb, 0x80, 0x3f, 0x99, 0x7e, 0x9f, 0x03, + 0x21, 0x27, 0xfd, 0xa1, 0x10, 0xf5, 0x45, 0x2a, 0xf6, 0x59, 0xac, 0x59, + 0x94, 0x5b, 0xcf, 0xef, 0xc2, 0x2a, 0xbf, 0x05, 0xed, 0x8b, 0x61, 0x3a, + 0x21, 0xc9, 0x8f, 0xaf, 0x6c, 0x0f, 0x29, 0xdd, 0xc4, 0x34, 0xe0, 0x63, + 0x41, 0xd2, 0x8b, 0x2c, 0xab, 0x74, 0x91, 0xe4, 0x8f, 0xf3, 0x19, 0x33, + 0xaa, 0x05, 0x79, 0xab, 0xdf, 0x0c, 0xca, 0x47, 0x31, 0x26, 0x5a, 0x47, + 0xbe, 0x5d, 0x37, 0xaf, 0xb7, 0x31, 0xaf, 0x3f, 0xc4, 0xbc, 0x12, 0x52, + 0x71, 0xf9, 0x6d, 0xa6, 0xee, 0xdb, 0x0c, 0xbe, 0x31, 0x9f, 0xb2, 0x64, + 0xc9, 0x82, 0xfa, 0x0e, 0xd9, 0x58, 0xfd, 0x1e, 0x35, 0x3a, 0xab, 0x7e, + 0x9f, 0xec, 0x2b, 0x67, 0x05, 0xed, 0x87, 0xeb, 0xca, 0x84, 0xeb, 0xca, + 0x28, 0xfd, 0x5c, 0xf7, 0x4d, 0xea, 0xbe, 0xbd, 0xa1, 0x64, 0xfb, 0x79, + 0xc8, 0xf4, 0x70, 0x6f, 0x54, 0xa6, 0x21, 0x57, 0x79, 0xf7, 0xfd, 0x6a, + 0xa6, 0x77, 0xbb, 0x3e, 0x4f, 0x6f, 0x09, 0x73, 0x3d, 0x6d, 0xc6, 0xd3, + 0xff, 0x8e, 0xf1, 0xa3, 0x6e, 0x19, 0x7a, 0x13, 0xba, 0x75, 0x7a, 0x6e, + 0x6d, 0xbd, 0x15, 0x4b, 0xbf, 0x0d, 0x5f, 0x83, 0xfa, 0x0d, 0xb2, 0x6c, + 0xd9, 0xc9, 0x1c, 0xe8, 0x35, 0x5c, 0x2e, 0x1b, 0xfe, 0x5a, 0xf8, 0xb9, + 0xe1, 0xaf, 0x63, 0xd0, 0xaf, 0x4c, 0x7e, 0x37, 0x4a, 0x76, 0x9c, 0xed, + 0xd7, 0x97, 0xc1, 0x7c, 0x31, 0xbe, 0x62, 0x8d, 0xf9, 0x6c, 0x27, 0x58, + 0xb3, 0xd4, 0xad, 0xec, 0xef, 0x30, 0xfa, 0x03, 0x2f, 0x7b, 0x5b, 0x64, + 0xdf, 0x5c, 0xd0, 0xef, 0x61, 0xb5, 0xce, 0xa7, 0x4a, 0xb6, 0x35, 0x02, + 0x86, 0x8e, 0xcc, 0x0e, 0xc9, 0x70, 0xad, 0x43, 0xf2, 0xa5, 0xb7, 0x3c, + 0xd8, 0x89, 0x0f, 0x47, 0xc4, 0xc1, 0xfa, 0x80, 0x4c, 0x0d, 0xa6, 0x24, + 0x53, 0x8b, 0x88, 0x99, 0x72, 0x91, 0xd6, 0xdb, 0xbe, 0x70, 0x78, 0x64, + 0xdd, 0x7b, 0x03, 0xca, 0xa0, 0xed, 0xc1, 0x8d, 0xe5, 0x44, 0x32, 0x90, + 0xab, 0x8c, 0xfb, 0x2b, 0x2f, 0x6d, 0x05, 0x32, 0xc1, 0x5c, 0xea, 0x92, + 0xb8, 0x3c, 0x59, 0xb3, 0x72, 0xa1, 0x54, 0x87, 0xd6, 0x27, 0xd4, 0x2d, + 0x32, 0x3e, 0x55, 0x3a, 0xe8, 0x99, 0x8e, 0x14, 0xae, 0x4d, 0x39, 0x89, + 0xa2, 0xb4, 0x0c, 0xcd, 0x0c, 0x7e, 0x1c, 0xfa, 0x05, 0xf9, 0x58, 0x7b, + 0x6d, 0xa9, 0xa1, 0xb1, 0x3b, 0x7a, 0x20, 0xcb, 0xb5, 0x42, 0x8b, 0xe9, + 0x38, 0x48, 0xa3, 0x85, 0xf7, 0xa7, 0xa8, 0x0b, 0xfa, 0x1b, 0x2e, 0x3a, + 0xb6, 0x95, 0x36, 0x3b, 0xb0, 0xb6, 0xb0, 0xfe, 0x61, 0x7b, 0x77, 0x55, + 0x7f, 0xe5, 0x1d, 0x0a, 0xfb, 0x76, 0xd7, 0x4c, 0xdd, 0x67, 0xe8, 0x35, + 0x3c, 0xe6, 0xaf, 0xe1, 0x70, 0x58, 0xaf, 0x5d, 0xfd, 0xfe, 0x4c, 0xa3, + 0xa6, 0x8b, 0x7e, 0xdf, 0x6b, 0xfa, 0x76, 0x7c, 0xb0, 0x81, 0xba, 0x37, + 0x9c, 0xba, 0xdc, 0x80, 0x36, 0xa3, 0x91, 0xd4, 0xf8, 0xef, 0x2c, 0xa9, + 0x72, 0xf3, 0xba, 0xdc, 0x2f, 0x23, 0x5a, 0x56, 0xc7, 0x7a, 0xaa, 0x4c, + 0xe7, 0xc6, 0xba, 0x55, 0xfa, 0xf5, 0xb1, 0x2e, 0x95, 0x2e, 0x8e, 0x39, + 0x2a, 0x7d, 0x4c, 0x95, 0x37, 0x52, 0x29, 0x9d, 0x3f, 0x3a, 0x96, 0x50, + 0xe9, 0x6e, 0x9d, 0x8e, 0xeb, 0x74, 0x42, 0xa7, 0x7b, 0x74, 0xba, 0x57, + 0xa7, 0x39, 0x9d, 0x4e, 0xe9, 0xf6, 0xee, 0xd1, 0xef, 0xf7, 0xe9, 0x74, + 0xbf, 0x4e, 0xef, 0xd7, 0xe9, 0x01, 0x9d, 0x3e, 0xa0, 0xc7, 0x55, 0xd0, + 0x69, 0x49, 0xe7, 0xcf, 0xea, 0x71, 0x3e, 0x8a, 0xf1, 0xfc, 0x49, 0x83, + 0x2f, 0x47, 0x10, 0xda, 0xd4, 0x7e, 0xf0, 0x10, 0x3c, 0x2b, 0xc5, 0x20, + 0x4f, 0x9c, 0x7f, 0x02, 0x76, 0x28, 0x4c, 0xd9, 0x93, 0xac, 0xc5, 0xef, + 0xbf, 0x08, 0x4b, 0x6b, 0x58, 0xa6, 0x6b, 0x7e, 0xd9, 0x5d, 0x83, 0x2c, + 0x33, 0x8f, 0x32, 0xa4, 0xc5, 0xa2, 0xd2, 0x8b, 0x59, 0x2b, 0x26, 0x33, + 0x65, 0x35, 0x77, 0xd8, 0xab, 0x7f, 0x23, 0xd9, 0x33, 0x22, 0x2f, 0x95, + 0x58, 0xee, 0x7b, 0xba, 0xdc, 0x33, 0x28, 0xd7, 0x95, 0x18, 0x36, 0x6c, + 0xe8, 0x68, 0x3b, 0x0d, 0xbd, 0x9f, 0x40, 0x6a, 0x8d, 0xe2, 0x37, 0x4c, + 0xe5, 0x8f, 0x72, 0x3e, 0x8d, 0x9e, 0xa1, 0xbe, 0x95, 0xdb, 0x21, 0xf3, + 0x9d, 0x03, 0xaf, 0x41, 0x7e, 0x62, 0xf2, 0x55, 0xc8, 0xd6, 0xc5, 0x12, + 0xf9, 0xf0, 0x3d, 0x59, 0x2a, 0x91, 0x2f, 0xcf, 0xc8, 0x4c, 0xa9, 0xcb, + 0x7d, 0x49, 0xec, 0xe4, 0x69, 0x85, 0x2d, 0xfa, 0x5c, 0xa4, 0x90, 0x1b, + 0x3b, 0xf1, 0x30, 0xec, 0x50, 0xef, 0x80, 0xdf, 0x5e, 0xb7, 0x6e, 0xcf, + 0xa9, 0x7e, 0x48, 0x2e, 0x2b, 0x3d, 0x4d, 0xdd, 0x08, 0xdb, 0x53, 0xe3, + 0xda, 0x79, 0x0c, 0x29, 0x6d, 0xf3, 0x61, 0xac, 0x27, 0x4f, 0xc6, 0xdd, + 0x0f, 0x88, 0xf9, 0xe1, 0xb0, 0xa4, 0x27, 0x0a, 0xd0, 0x3a, 0x7f, 0x80, + 0xbc, 0x1f, 0x98, 0x3e, 0xf6, 0xb5, 0xad, 0x3b, 0x28, 0xcf, 0xa5, 0x2d, + 0x6f, 0xa5, 0x15, 0xb9, 0x22, 0xb4, 0x5b, 0x69, 0xea, 0x9b, 0x35, 0x3d, + 0xcc, 0xf7, 0x21, 0xc3, 0x5f, 0xe7, 0x83, 0x75, 0xeb, 0x7c, 0x10, 0x73, + 0x61, 0xbf, 0xad, 0xa8, 0x13, 0x46, 0x9a, 0x46, 0xbf, 0xec, 0x8f, 0x63, + 0xf8, 0x94, 0xc6, 0x4a, 0xac, 0x7b, 0x40, 0xd7, 0x1d, 0xaa, 0xab, 0x3b, + 0x84, 0xba, 0xac, 0xf3, 0x28, 0x68, 0x40, 0xba, 0x17, 0xea, 0xea, 0x16, + 0xa8, 0xa3, 0xb7, 0x99, 0x4e, 0x04, 0xb6, 0x97, 0x4d, 0x1c, 0xc6, 0xb7, + 0xaf, 0x4b, 0xe6, 0xcc, 0x5f, 0x73, 0xcc, 0x68, 0x8f, 0x7a, 0x79, 0x1c, + 0x3a, 0x9f, 0xb8, 0x03, 0x76, 0x29, 0xc6, 0xbc, 0x1b, 0x74, 0x7f, 0x9c, + 0x23, 0xdf, 0xb7, 0xb6, 0xae, 0xf5, 0xff, 0x8c, 0xee, 0x3f, 0x55, 0xd7, + 0x7f, 0x0a, 0xfd, 0x7f, 0x89, 0xed, 0xa1, 0x6f, 0x99, 0xf5, 0xd7, 0x79, + 0x37, 0x68, 0x9c, 0x80, 0xce, 0xc0, 0x18, 0xca, 0xbf, 0xf6, 0xd2, 0x61, + 0x5f, 0x07, 0x6b, 0x3d, 0x5b, 0x58, 0x2b, 0xe3, 0xdb, 0x92, 0xe1, 0xda, + 0x65, 0x85, 0x69, 0xfd, 0x35, 0x6e, 0x1f, 0x2e, 0xd0, 0xe6, 0xd4, 0xcc, + 0x10, 0xe9, 0x7d, 0xde, 0xfd, 0x32, 0xc6, 0x68, 0x27, 0x12, 0x66, 0x77, + 0xc1, 0x34, 0xbf, 0x2c, 0xfb, 0x17, 0xee, 0x97, 0xfd, 0x65, 0xb6, 0xd1, + 0x8c, 0xef, 0x0e, 0xf2, 0xb6, 0x88, 0xb4, 0xd3, 0x46, 0xbd, 0x65, 0xf8, + 0x7d, 0x99, 0xd0, 0x07, 0xcb, 0xc6, 0xed, 0xb5, 0x0b, 0x46, 0x66, 0x81, + 0x7a, 0x15, 0xf9, 0xb5, 0x7a, 0x1b, 0x16, 0xd8, 0xaf, 0x40, 0xa7, 0xcf, + 0x10, 0x43, 0x9b, 0x19, 0x37, 0xa2, 0xed, 0x66, 0xc6, 0xf2, 0xe7, 0x7b, + 0x4b, 0xc8, 0xb7, 0xc5, 0xa4, 0xd9, 0x16, 0x49, 0x87, 0xa9, 0x3b, 0xf9, + 0x2c, 0x5e, 0x28, 0x45, 0xfd, 0x27, 0xe1, 0x50, 0x2a, 0x04, 0x9a, 0xb1, + 0xcc, 0x4d, 0x18, 0xa3, 0xaf, 0x5b, 0x0b, 0xab, 0xba, 0xd5, 0xc0, 0x38, + 0x3a, 0x25, 0xb7, 0xd0, 0x2e, 0xf9, 0x33, 0x69, 0xe8, 0x63, 0x2b, 0xe4, + 0xeb, 0xea, 0x7a, 0xfc, 0x4e, 0xfa, 0x7b, 0x32, 0xec, 0x26, 0x64, 0x7a, + 0xc8, 0x95, 0xe2, 0x50, 0x5f, 0x3c, 0x24, 0x7d, 0x90, 0x40, 0x27, 0x9e, + 0x87, 0xff, 0x90, 0xb3, 0xc6, 0xd1, 0x46, 0x1e, 0xb6, 0x91, 0x98, 0x78, + 0x54, 0xe3, 0x43, 0xcf, 0xcb, 0x92, 0x9f, 0xfd, 0x7b, 0x85, 0x32, 0xff, + 0x7c, 0xb9, 0x80, 0x86, 0xb9, 0x7e, 0x5e, 0xdc, 0x3d, 0x09, 0x1d, 0x97, + 0x55, 0x32, 0x08, 0x9b, 0xe8, 0xa3, 0x2b, 0xd0, 0x88, 0x7d, 0xb7, 0x80, + 0x66, 0xc3, 0x18, 0x3b, 0x68, 0xd3, 0xce, 0x71, 0xb5, 0x48, 0xbe, 0xd6, + 0xac, 0xbf, 0x31, 0x3f, 0x2c, 0xe3, 0xb1, 0x00, 0x77, 0x3f, 0xb3, 0x8d, + 0x38, 0xe2, 0x59, 0xd8, 0x83, 0x7c, 0xf9, 0xa9, 0x90, 0x2f, 0xdb, 0x96, + 0xe4, 0x4f, 0x0d, 0x43, 0x96, 0x88, 0x85, 0xb6, 0x68, 0x59, 0x62, 0x3b, + 0x96, 0x9a, 0x1b, 0x68, 0xa2, 0x6d, 0xd8, 0x10, 0xd2, 0xef, 0x86, 0x7c, + 0xff, 0x82, 0x75, 0x82, 0xfa, 0xc1, 0x38, 0xda, 0x56, 0xdb, 0x19, 0x77, + 0x81, 0x35, 0xd4, 0x58, 0x90, 0x77, 0x66, 0xfd, 0x58, 0xcc, 0xf6, 0x60, + 0x2c, 0xb0, 0x3e, 0x6a, 0x2c, 0x6d, 0x75, 0x6d, 0xc5, 0xea, 0xc6, 0xd2, + 0x80, 0xb1, 0xb0, 0xac, 0x3f, 0x96, 0xf3, 0xe0, 0x71, 0xfe, 0xcc, 0x95, + 0x36, 0xbf, 0x4e, 0xac, 0xae, 0x4e, 0xfb, 0x86, 0x3a, 0x2c, 0x1f, 0xf4, + 0x41, 0xfe, 0x3c, 0xde, 0xec, 0xd7, 0x61, 0xb9, 0x06, 0xf8, 0x4f, 0xca, + 0x3f, 0x8a, 0x2a, 0x7d, 0xb7, 0x2a, 0xe7, 0xfb, 0x21, 0xe7, 0xf5, 0x7e, + 0xc9, 0x3a, 0x3e, 0x1a, 0xe3, 0x65, 0xf2, 0x72, 0x8b, 0x91, 0x55, 0xfc, + 0xfc, 0x10, 0xda, 0x5f, 0x82, 0xbf, 0x95, 0x90, 0x7c, 0x12, 0x3e, 0x90, + 0x35, 0x84, 0xf7, 0x26, 0x3c, 0xc3, 0x37, 0xb2, 0x9a, 0x15, 0x1e, 0xce, + 0x27, 0xfb, 0x35, 0xae, 0xfd, 0xa9, 0xe4, 0x20, 0xb3, 0xf9, 0x24, 0xfc, + 0x91, 0x18, 0xec, 0xa4, 0xf2, 0xd3, 0xd8, 0xff, 0x77, 0xc2, 0xb4, 0xfb, + 0xe7, 0xcb, 0x9f, 0xc1, 0x3b, 0x7c, 0xbb, 0xe4, 0x6b, 0x7a, 0x5c, 0xad, + 0x28, 0xf3, 0x05, 0xe4, 0xf1, 0x1b, 0xcb, 0xb0, 0x8d, 0x65, 0xbc, 0xdf, + 0x88, 0x32, 0x58, 0xd4, 0x90, 0x40, 0xd3, 0xd9, 0x89, 0xdf, 0x4b, 0xc8, + 0xfb, 0x38, 0xf2, 0x9e, 0x46, 0xde, 0xc7, 0xf0, 0xfe, 0xa7, 0x1b, 0xda, + 0xed, 0xc3, 0xfb, 0x21, 0x7c, 0xc7, 0x7c, 0xad, 0x17, 0xf1, 0xfd, 0x46, + 0xfc, 0x9e, 0xde, 0x50, 0xe6, 0x5f, 0x6d, 0x78, 0x0f, 0x30, 0xf9, 0x1f, + 0x6b, 0xd9, 0x0b, 0x30, 0xb9, 0xaf, 0x2f, 0xa7, 0xcb, 0x2d, 0xc6, 0xc8, + 0xa9, 0xa8, 0xb1, 0xeb, 0x14, 0x68, 0x51, 0x0d, 0x2b, 0x1c, 0x1e, 0x06, + 0x0e, 0x9f, 0x99, 0x93, 0xfe, 0x08, 0xf4, 0x49, 0x5e, 0xf9, 0x3a, 0x32, + 0xd8, 0x20, 0xdd, 0xee, 0x05, 0xac, 0x93, 0x7c, 0xb5, 0x03, 0xef, 0x5c, + 0x3f, 0x90, 0xb5, 0x6a, 0x13, 0xe4, 0xbb, 0x3b, 0x59, 0x81, 0xac, 0xed, + 0x03, 0xd6, 0xce, 0x01, 0x7f, 0xe4, 0xaa, 0x1d, 0x72, 0x77, 0xf5, 0x48, + 0x58, 0xfb, 0xab, 0xba, 0xef, 0x7f, 0xbd, 0xa1, 0xef, 0x28, 0xb1, 0x3d, + 0xe4, 0xff, 0xb9, 0xb1, 0xc9, 0x39, 0xf6, 0x6f, 0x76, 0xc2, 0x08, 0x61, + 0x0c, 0xf4, 0x53, 0xa5, 0x27, 0x2c, 0xdd, 0x89, 0x69, 0x61, 0xff, 0x05, + 0x09, 0xa5, 0xba, 0x61, 0x07, 0xd4, 0x3b, 0xfc, 0x52, 0xe8, 0xb7, 0xea, + 0x9a, 0xbf, 0x3a, 0xb2, 0xea, 0xaf, 0x76, 0xc0, 0x9f, 0x85, 0xa1, 0x52, + 0x6b, 0xbf, 0x05, 0xba, 0xe1, 0x6a, 0xd0, 0xdd, 0xd7, 0xe7, 0x5c, 0xe3, + 0x19, 0x77, 0xbb, 0x7e, 0xa7, 0x4c, 0x43, 0x5f, 0x98, 0x11, 0xa5, 0x9f, + 0xc4, 0xc4, 0xb7, 0x41, 0xca, 0x31, 0xde, 0x17, 0x28, 0x0b, 0x09, 0xad, + 0x57, 0x3f, 0x07, 0x9b, 0xc7, 0xef, 0x81, 0xbc, 0xed, 0xb1, 0x7c, 0x59, + 0x23, 0x5e, 0xfe, 0xf6, 0x86, 0xb9, 0x4d, 0x6e, 0x98, 0x5b, 0x78, 0x95, + 0xae, 0x9c, 0x63, 0x04, 0x73, 0x5c, 0x9a, 0x23, 0x6d, 0xfb, 0x21, 0xa7, + 0xe2, 0x84, 0x85, 0xf2, 0x4c, 0x3d, 0xda, 0x0a, 0xdd, 0x4c, 0xda, 0x85, + 0x65, 0x0a, 0x73, 0xca, 0x61, 0x4e, 0x39, 0xcc, 0x29, 0x57, 0x47, 0xc7, + 0x7d, 0xab, 0x73, 0x0a, 0xc6, 0x8d, 0x72, 0x6a, 0xdd, 0xf1, 0x59, 0x8d, + 0x1f, 0xcf, 0x01, 0x86, 0xe5, 0x58, 0xd2, 0x1b, 0xc6, 0x42, 0x5a, 0x70, + 0x2c, 0xab, 0xe3, 0x88, 0x31, 0xba, 0xb2, 0xbf, 0x4a, 0xbe, 0xb2, 0xcf, + 0xdd, 0x32, 0x55, 0xfe, 0x90, 0x1e, 0x47, 0x0b, 0xc6, 0x31, 0x0e, 0xfd, + 0xc1, 0xfe, 0xa0, 0x07, 0xaa, 0x13, 0x78, 0x8e, 0x91, 0xff, 0x7a, 0x2c, + 0x01, 0x2d, 0xe0, 0x4b, 0x29, 0x5a, 0xa0, 0x7b, 0xa7, 0x5b, 0x8a, 0xe3, + 0xcc, 0xab, 0x6c, 0xf3, 0xc7, 0x94, 0xd0, 0xfd, 0xfb, 0xb4, 0x85, 0xef, + 0x41, 0xfc, 0xaa, 0xf5, 0x41, 0x3d, 0x3d, 0xe3, 0x0d, 0x5a, 0x5f, 0x81, + 0xf7, 0xf5, 0xf9, 0x43, 0x0d, 0x6b, 0x65, 0xf9, 0xfe, 0x8f, 0xf4, 0xfb, + 0x56, 0x63, 0xe4, 0x78, 0x90, 0x77, 0xa6, 0xe1, 0x9d, 0xed, 0x4d, 0x37, + 0x04, 0xfa, 0x63, 0x7d, 0x1c, 0xe2, 0x80, 0xb9, 0x66, 0x5f, 0x0a, 0x32, + 0x33, 0x98, 0x36, 0x87, 0x6b, 0xc3, 0xa6, 0x6f, 0x63, 0x58, 0xe6, 0x80, + 0xc2, 0xef, 0xe1, 0xd4, 0x4b, 0x94, 0x77, 0xd0, 0xf0, 0xd5, 0xb1, 0x4c, + 0xc9, 0xf3, 0xa6, 0xdd, 0x65, 0xe8, 0x74, 0xea, 0x65, 0x62, 0x65, 0xe6, + 0xbf, 0x8c, 0x7c, 0xd8, 0xef, 0x1a, 0x74, 0x3b, 0xea, 0x6d, 0x8e, 0x89, + 0x13, 0x1a, 0x13, 0xfb, 0x60, 0x3a, 0xa3, 0xf0, 0xd2, 0x32, 0x30, 0x62, + 0x58, 0x3f, 0x5f, 0x18, 0xa3, 0xef, 0x53, 0x87, 0xbb, 0xd1, 0xee, 0x8b, + 0x63, 0x99, 0x39, 0xae, 0x83, 0x1f, 0x61, 0x1d, 0x90, 0x47, 0x7f, 0x06, + 0x1e, 0x19, 0x32, 0xa3, 0x6c, 0x02, 0xc7, 0xc1, 0x7a, 0x2f, 0x8e, 0x75, + 0x2e, 0x32, 0x7d, 0x69, 0xcc, 0x59, 0x0c, 0xc9, 0x3e, 0xed, 0x73, 0xf1, + 0x3d, 0xb1, 0x18, 0xd8, 0xe7, 0x26, 0x89, 0xa4, 0xa8, 0xdb, 0xec, 0x24, + 0xb4, 0x2f, 0xe6, 0x73, 0x7e, 0x6c, 0xc6, 0xa1, 0x9d, 0xfc, 0x16, 0xe4, + 0xa0, 0x49, 0x1a, 0x94, 0x7c, 0x3c, 0xa9, 0xfb, 0xfa, 0x33, 0xf4, 0xb5, + 0x0d, 0x63, 0x0d, 0x41, 0x47, 0x86, 0xe3, 0xe8, 0xe7, 0xa0, 0xe9, 0xf4, + 0xa1, 0x3f, 0xfa, 0x92, 0x1d, 0xc0, 0x81, 0xca, 0x27, 0x0c, 0x6b, 0x1d, + 0x81, 0x7a, 0xdf, 0x45, 0x3d, 0xda, 0x49, 0xd2, 0x93, 0xfd, 0x55, 0x80, + 0x45, 0x9a, 0x30, 0x0f, 0xdb, 0xca, 0x84, 0x1a, 0x24, 0x3b, 0x17, 0x94, + 0xe1, 0x98, 0xbe, 0x3d, 0xd6, 0xb5, 0xd8, 0x85, 0xb6, 0x3a, 0x28, 0x73, + 0x90, 0xb5, 0x10, 0x7e, 0x6c, 0x9b, 0xf5, 0xa0, 0x93, 0x87, 0x02, 0xfb, + 0xbd, 0x56, 0x3f, 0xa8, 0xd7, 0xb9, 0xb8, 0x4d, 0xcb, 0xec, 0x5f, 0x79, + 0xe9, 0x09, 0x7e, 0x67, 0x9f, 0xf5, 0x7a, 0x9b, 0xf5, 0x82, 0x32, 0x21, + 0xad, 0x87, 0x3f, 0x10, 0x59, 0x1b, 0xe7, 0x32, 0x78, 0xc4, 0x3a, 0x12, + 0xce, 0xf6, 0x0e, 0x69, 0xbe, 0x5d, 0x40, 0x9e, 0x2f, 0xab, 0xd3, 0xb5, + 0x7a, 0xbf, 0xc7, 0x6f, 0xb7, 0x00, 0x8c, 0x51, 0x84, 0x8f, 0x16, 0x4a, + 0xa5, 0xb7, 0xfb, 0xb1, 0x88, 0x77, 0xf3, 0x75, 0xc0, 0x53, 0xb4, 0x53, + 0x5c, 0xad, 0x4b, 0x1f, 0xe5, 0xc2, 0xd8, 0x45, 0xb4, 0xff, 0x50, 0xd9, + 0x5f, 0x63, 0x3e, 0x1d, 0x88, 0x8b, 0x0c, 0x59, 0x72, 0x80, 0xb3, 0x1d, + 0xda, 0xa1, 0x84, 0xbc, 0xe0, 0x04, 0x38, 0x89, 0x18, 0x09, 0xe5, 0x6b, + 0x1c, 0x0f, 0xe7, 0xfd, 0x5d, 0xcc, 0xdb, 0x93, 0x59, 0xd7, 0x97, 0x8f, + 0x5e, 0xac, 0xc9, 0x3f, 0x0d, 0xdb, 0x87, 0xe9, 0x7b, 0x5d, 0x0e, 0xd7, + 0xcf, 0x2b, 0xb0, 0x67, 0xcb, 0xda, 0x47, 0xf9, 0xae, 0xe6, 0xe5, 0x8b, + 0xe0, 0x65, 0x5f, 0xc2, 0x92, 0x1e, 0x8c, 0x1d, 0x65, 0xfa, 0xbb, 0x81, + 0xb7, 0xa1, 0x23, 0x63, 0x71, 0x8c, 0xc7, 0x82, 0xcc, 0x6f, 0xd3, 0x76, + 0xff, 0x96, 0x08, 0xf5, 0xc4, 0x76, 0xe5, 0xff, 0x7c, 0x57, 0xc9, 0x9a, + 0x2f, 0x7b, 0x21, 0xfd, 0x3d, 0xe0, 0x77, 0x88, 0x66, 0x57, 0xd6, 0xe2, + 0x36, 0x81, 0x8e, 0x66, 0xf9, 0xef, 0xa1, 0x3c, 0xe3, 0x56, 0x9e, 0x37, + 0xa5, 0xc6, 0xfb, 0x1c, 0x78, 0x1d, 0x5a, 0x8d, 0x01, 0xf0, 0x3d, 0xb1, + 0xd8, 0x20, 0xd2, 0x56, 0x2f, 0x37, 0x94, 0x95, 0x85, 0x08, 0xe3, 0x85, + 0x09, 0x33, 0xe0, 0x5d, 0x98, 0x98, 0x0d, 0xef, 0x01, 0xef, 0xf8, 0xbc, + 0x19, 0xd6, 0x63, 0xcc, 0xc7, 0xf3, 0x96, 0x5c, 0xc6, 0x20, 0x1b, 0xa5, + 0x60, 0xf9, 0xf8, 0xa5, 0xe8, 0x52, 0x4e, 0x33, 0x89, 0xb0, 0xd8, 0xf1, + 0x7d, 0xf2, 0x47, 0x68, 0x3b, 0x9d, 0x8c, 0xe8, 0xb8, 0x44, 0x4e, 0xe8, + 0x6f, 0x7b, 0xde, 0x45, 0xf8, 0x8a, 0x15, 0xa8, 0x4e, 0xf8, 0x75, 0x52, + 0xac, 0x62, 0x0d, 0x34, 0x85, 0xb1, 0xa6, 0xd6, 0xe2, 0x0a, 0xf3, 0x28, + 0xb3, 0x80, 0x6f, 0x0f, 0x57, 0x03, 0x2e, 0x7b, 0xf0, 0x4f, 0x3d, 0x6f, + 0xd2, 0xf9, 0x6b, 0x2f, 0x1f, 0xab, 0x2f, 0x1b, 0xe0, 0x2e, 0x62, 0x26, + 0x62, 0x1e, 0x62, 0x15, 0x7e, 0x23, 0xfe, 0x38, 0x88, 0xb1, 0x50, 0x86, + 0x5b, 0x25, 0x9a, 0xb2, 0xe3, 0xa3, 0x12, 0xe8, 0xe0, 0x4b, 0xe0, 0x7f, + 0xc1, 0x6b, 0x74, 0x3a, 0xe4, 0xa9, 0x1a, 0xfd, 0xe1, 0x80, 0xf7, 0x09, + 0xf0, 0xde, 0x2e, 0x14, 0xc4, 0x93, 0x27, 0x5c, 0x27, 0xf1, 0x15, 0xa4, + 0x3f, 0x76, 0x3f, 0x42, 0x5a, 0x3c, 0x0a, 0x53, 0x07, 0x3c, 0x0d, 0x1b, + 0x31, 0x1b, 0xe0, 0xfa, 0x56, 0xe2, 0x7a, 0x4d, 0xc7, 0xcb, 0x68, 0xd3, + 0xb6, 0x4c, 0x80, 0xa5, 0x5b, 0x51, 0xce, 0x97, 0xeb, 0x20, 0xef, 0x20, + 0xca, 0x72, 0x0c, 0xf4, 0xb5, 0x5e, 0xc5, 0x5a, 0xf2, 0xbc, 0x3b, 0xdd, + 0xbe, 0xba, 0x35, 0xf1, 0x1c, 0x78, 0xa0, 0x64, 0x73, 0x70, 0xbb, 0x30, + 0x6e, 0x26, 0xfd, 0x6d, 0xca, 0x27, 0xe0, 0x33, 0x64, 0x74, 0x90, 0xb6, + 0x00, 0xe3, 0x02, 0x7e, 0xa3, 0xcd, 0x79, 0x12, 0xb4, 0xff, 0x42, 0x95, + 0x7c, 0x68, 0x51, 0x3a, 0xff, 0xa9, 0x32, 0xed, 0xba, 0x8f, 0xd1, 0x72, + 0x2a, 0x56, 0x4c, 0x5b, 0x90, 0x04, 0x6f, 0x68, 0x03, 0x68, 0xe7, 0x59, + 0x97, 0xe5, 0x58, 0xb7, 0x9e, 0x7f, 0x2c, 0xb3, 0x0d, 0xb8, 0x8a, 0x32, + 0xd8, 0x0a, 0x3c, 0xb2, 0x5d, 0xf6, 0x25, 0x1b, 0x41, 0xf7, 0x36, 0x85, + 0xa3, 0x4c, 0xe7, 0x13, 0xb0, 0x59, 0x0d, 0x8c, 0x6d, 0xbb, 0x6b, 0x3e, + 0xc6, 0xc7, 0x90, 0xf7, 0x36, 0xe8, 0xcf, 0xbc, 0x97, 0x23, 0x3e, 0x46, + 0xba, 0x1f, 0xeb, 0x6f, 0x7e, 0x5b, 0x46, 0xf1, 0x83, 0x7c, 0x08, 0xf4, + 0x40, 0x60, 0xf7, 0x2c, 0x8d, 0x23, 0xc9, 0x9b, 0x00, 0xbf, 0xb3, 0x2c, + 0x31, 0x7c, 0xbd, 0x7f, 0xc2, 0x75, 0xe7, 0x79, 0x4f, 0xb8, 0xca, 0x8e, + 0x82, 0x07, 0x37, 0xc3, 0xd6, 0x87, 0x35, 0xad, 0x5b, 0xfc, 0xd8, 0x1a, + 0x6c, 0x6b, 0xa2, 0x0d, 0x7a, 0xc7, 0xf9, 0xa1, 0xa6, 0x1f, 0x31, 0xc2, + 0xaf, 0xbd, 0x90, 0x43, 0xbf, 0x81, 0xf8, 0x80, 0x63, 0x47, 0xbd, 0x05, + 0x96, 0xa5, 0x0d, 0x3e, 0x84, 0x3e, 0x42, 0x92, 0x68, 0xe7, 0xfb, 0x0d, + 0xda, 0xdf, 0xe6, 0xb3, 0x27, 0x3d, 0x03, 0xf5, 0xf2, 0x3c, 0x84, 0x71, + 0x72, 0x3e, 0x41, 0xbc, 0xb5, 0x43, 0xe9, 0x80, 0x35, 0xb9, 0x08, 0xc6, + 0x14, 0xf4, 0xcb, 0xb1, 0xc5, 0xa5, 0x0d, 0x63, 0xbb, 0x1d, 0x3a, 0x7a, + 0xa0, 0x8d, 0x6d, 0x06, 0x7d, 0xd7, 0x8f, 0x29, 0xc0, 0x2d, 0xbe, 0xdd, + 0x8d, 0x38, 0x8d, 0x32, 0xd0, 0x4e, 0xda, 0x75, 0x28, 0x5d, 0xbd, 0xc6, + 0x0f, 0xda, 0x5f, 0xf6, 0xbd, 0x31, 0xff, 0xc6, 0xba, 0x71, 0xbd, 0xa1, + 0xe3, 0xc0, 0xc4, 0xc6, 0xc4, 0x0c, 0x3b, 0xf1, 0x8d, 0x63, 0x82, 0x33, + 0x1c, 0xf3, 0x64, 0x97, 0xa2, 0x1b, 0xc7, 0x56, 0x3f, 0x0e, 0x62, 0x27, + 0x8e, 0x99, 0x63, 0xd8, 0x88, 0x49, 0x38, 0x9e, 0xaf, 0x37, 0xf8, 0x3c, + 0x7c, 0x59, 0xcf, 0x2b, 0xc0, 0x30, 0x5d, 0xa8, 0xfb, 0x87, 0x98, 0x03, + 0x9f, 0x39, 0x8f, 0xc0, 0x66, 0x77, 0xf9, 0xed, 0x34, 0x05, 0xfb, 0x07, + 0xf1, 0xba, 0x18, 0x12, 0xd7, 0x4c, 0x40, 0xa7, 0x36, 0xcd, 0xa3, 0x9b, + 0x37, 0xf4, 0x6b, 0xbb, 0xeb, 0xf5, 0xc8, 0xc7, 0xea, 0xe6, 0xd7, 0x2f, + 0x85, 0x05, 0xca, 0xc5, 0x0d, 0x48, 0x03, 0x4c, 0x30, 0x08, 0xdd, 0x9f, + 0x86, 0xfd, 0x27, 0x36, 0x78, 0x07, 0x26, 0xc8, 0x85, 0x52, 0x32, 0x91, + 0x87, 0x4f, 0xa6, 0x74, 0xbf, 0x5a, 0x8b, 0x51, 0xbc, 0xb7, 0x40, 0xff, + 0xdf, 0x41, 0x19, 0x9b, 0xc8, 0x55, 0xdd, 0x89, 0xa9, 0xea, 0xe0, 0x04, + 0x71, 0x94, 0x2f, 0x73, 0x28, 0x5f, 0x65, 0x0c, 0x56, 0x26, 0x32, 0xaa, + 0x9e, 0x8a, 0x25, 0x6c, 0xd2, 0x4e, 0x0b, 0xd7, 0x63, 0xce, 0xef, 0x2b, + 0x3a, 0x91, 0x85, 0x0e, 0x5a, 0x98, 0x85, 0x5d, 0x72, 0xec, 0x34, 0xe5, + 0x72, 0xd2, 0xb5, 0x47, 0x95, 0xec, 0xc5, 0xec, 0x71, 0xf2, 0xb2, 0x32, + 0xfb, 0x41, 0x59, 0x98, 0xf3, 0xe4, 0x36, 0xe8, 0xc2, 0x7b, 0x21, 0xab, + 0x72, 0x16, 0x8a, 0xf0, 0x2c, 0x94, 0xd7, 0xd9, 0x98, 0x98, 0x27, 0x3a, + 0x24, 0x72, 0x24, 0x2e, 0xe1, 0x23, 0xc4, 0x94, 0x5d, 0xd6, 0x6d, 0x22, + 0xb0, 0x63, 0xdf, 0xff, 0xb8, 0x29, 0xf6, 0x50, 0x5a, 0xba, 0x12, 0x0f, + 0xc3, 0xf6, 0x56, 0x90, 0x16, 0xa5, 0x2b, 0x79, 0x06, 0x6d, 0x45, 0xce, + 0xa2, 0x2c, 0xea, 0x6d, 0x59, 0x4a, 0xe0, 0xd7, 0x2e, 0x4d, 0x4b, 0xfe, + 0x5a, 0x69, 0x5a, 0x5a, 0xef, 0x87, 0x0f, 0xaf, 0xfa, 0xe1, 0xfc, 0xfe, + 0x96, 0x8e, 0x1f, 0x3c, 0x0d, 0x9d, 0x13, 0xf8, 0x4f, 0xb4, 0x47, 0xca, + 0x87, 0x82, 0xde, 0x7f, 0x1a, 0x3e, 0x96, 0x23, 0xd9, 0x32, 0xfc, 0xa7, + 0x94, 0x27, 0x8f, 0xbb, 0x05, 0x2f, 0x33, 0xe8, 0xc9, 0x25, 0xd7, 0x29, + 0xe4, 0xc5, 0x7e, 0x8b, 0xfa, 0xee, 0x7f, 0xb9, 0xbf, 0x23, 0x7b, 0xb6, + 0xdb, 0x7b, 0xd2, 0x46, 0xc1, 0x6b, 0x81, 0x4f, 0x75, 0x4d, 0xea, 0xa0, + 0x4c, 0xee, 0x58, 0x86, 0xa0, 0xa4, 0xaf, 0x01, 0xce, 0x82, 0xdf, 0xcc, + 0xf6, 0x5f, 0x53, 0x7e, 0xdb, 0x3d, 0xdd, 0x07, 0x65, 0xeb, 0x0e, 0xdb, + 0xba, 0x12, 0x22, 0x06, 0x3a, 0x28, 0x59, 0xe8, 0xff, 0x6c, 0xc8, 0xb1, + 0x76, 0x8b, 0x3d, 0xfa, 0x45, 0x61, 0x7c, 0xd0, 0x91, 0xce, 0x23, 0x4e, + 0xfc, 0x3e, 0xa3, 0x67, 0xff, 0x7d, 0xa0, 0x65, 0xe7, 0x59, 0xbe, 0x7b, + 0x12, 0xdd, 0x61, 0xe1, 0x39, 0x26, 0x9d, 0x27, 0x12, 0xd2, 0x05, 0xba, + 0xf4, 0x2a, 0x9a, 0x70, 0x5f, 0x20, 0x2e, 0x3d, 0x47, 0x88, 0x49, 0x14, + 0x6d, 0x7a, 0x41, 0x9b, 0x24, 0x68, 0x03, 0x5f, 0xa6, 0xcf, 0xba, 0x82, + 0x74, 0x45, 0xba, 0x86, 0x7e, 0x0a, 0xda, 0xf4, 0x82, 0x36, 0x3d, 0x67, + 0x13, 0xa8, 0x8f, 0x36, 0x96, 0x3a, 0x91, 0x36, 0xc9, 0xa7, 0xae, 0x6e, + 0xc7, 0xb3, 0x23, 0x5d, 0x47, 0xa2, 0xe8, 0xc3, 0x90, 0x5d, 0xdd, 0x05, + 0x19, 0xd9, 0x01, 0xec, 0x1c, 0x3b, 0x28, 0x17, 0x60, 0x87, 0xca, 0xf0, + 0xdb, 0x1e, 0x1f, 0xb2, 0xc7, 0x97, 0xa1, 0x4b, 0x6b, 0xb7, 0x7b, 0xf2, + 0xe2, 0x8e, 0x1f, 0x7a, 0xf1, 0xab, 0xed, 0x3d, 0x62, 0x0c, 0xca, 0x4c, + 0x59, 0xd9, 0x87, 0x78, 0x26, 0xa4, 0xb0, 0x0e, 0xe6, 0x58, 0x80, 0x8d, + 0x61, 0xfc, 0xd3, 0x81, 0xae, 0xff, 0xa2, 0xdc, 0x3b, 0x3f, 0x8d, 0x1f, + 0xf0, 0x76, 0x89, 0x65, 0xf7, 0x03, 0x67, 0xdf, 0x2f, 0xfb, 0x4a, 0xc0, + 0x62, 0x29, 0x8c, 0x7b, 0xd0, 0x01, 0x1e, 0x0f, 0x35, 0x4a, 0x2b, 0xf2, + 0x40, 0xdb, 0xf1, 0xda, 0x46, 0x5c, 0xbb, 0x0c, 0x3e, 0x0c, 0xc9, 0x73, + 0xb5, 0x41, 0xf9, 0x4e, 0xad, 0x5f, 0xbe, 0x05, 0xdb, 0xf2, 0x64, 0xad, + 0x03, 0x6b, 0x25, 0x0e, 0x9e, 0xa4, 0xc0, 0x1f, 0x57, 0xbe, 0x5d, 0x4b, + 0xca, 0xd3, 0xa0, 0xd5, 0x53, 0xf8, 0x8d, 0x94, 0x93, 0xb2, 0xab, 0xdc, + 0xaf, 0x79, 0x44, 0xfe, 0x30, 0x56, 0xe1, 0x60, 0xee, 0xf6, 0x63, 0x05, + 0xac, 0xbf, 0x85, 0x9a, 0xf3, 0x66, 0x45, 0x5e, 0x80, 0x0e, 0xb3, 0xe4, + 0xf4, 0xaa, 0x7d, 0x29, 0x78, 0x96, 0x63, 0x1f, 0xce, 0x81, 0x0f, 0x15, + 0xac, 0xd3, 0x71, 0x45, 0xfb, 0x35, 0xdb, 0x53, 0xf1, 0x6d, 0x4f, 0x30, + 0xbf, 0xd9, 0xbc, 0xfc, 0x58, 0x32, 0xc7, 0x66, 0x64, 0x12, 0xbe, 0xf4, + 0xef, 0xb9, 0x1e, 0xe4, 0x98, 0xba, 0x78, 0x90, 0x3a, 0x3e, 0x91, 0x0b, + 0x99, 0xca, 0xbf, 0xf5, 0xb1, 0xc6, 0xb9, 0x36, 0xac, 0xd9, 0x64, 0xda, + 0x9c, 0x96, 0xae, 0x63, 0xd3, 0xd2, 0x79, 0x0c, 0xb2, 0xe0, 0xb2, 0xad, + 0x65, 0xcb, 0x7c, 0x87, 0x3c, 0xb0, 0x1f, 0x7b, 0x28, 0x2b, 0x8e, 0xf5, + 0xa6, 0x24, 0xd1, 0xff, 0x01, 0xe9, 0x46, 0x1d, 0x07, 0x75, 0xae, 0xa8, + 0xbe, 0x5b, 0xd0, 0x77, 0xa3, 0x3c, 0x14, 0xb3, 0x21, 0x6b, 0xb4, 0xe1, + 0xff, 0x5b, 0x32, 0x15, 0xa6, 0x7f, 0x29, 0x99, 0xd3, 0xcf, 0x37, 0x4a, + 0x13, 0x9f, 0xa1, 0x1a, 0x4e, 0x32, 0xbf, 0x13, 0x29, 0xf3, 0x1d, 0x31, + 0x8f, 0xfe, 0x52, 0x32, 0xe7, 0xd8, 0xf7, 0x9b, 0xc8, 0x7f, 0x51, 0x32, + 0x47, 0xdf, 0xc6, 0xfb, 0x05, 0xa4, 0x6f, 0x21, 0x1d, 0x97, 0xce, 0xa3, + 0xf0, 0x8d, 0xcf, 0xfd, 0x08, 0xef, 0xf0, 0xe5, 0xce, 0x3d, 0x84, 0x72, + 0x37, 0x63, 0x7c, 0xd7, 0x46, 0x81, 0x35, 0xa0, 0xf3, 0x5e, 0xd1, 0xe3, + 0x67, 0x3e, 0xf3, 0xf8, 0xed, 0x21, 0xe8, 0xb4, 0xff, 0x02, 0x9d, 0xa6, + 0x9f, 0x17, 0xf8, 0x4e, 0xdd, 0xc6, 0xe7, 0x69, 0xd0, 0xe4, 0x80, 0x8a, + 0x19, 0xdd, 0xef, 0xd2, 0xde, 0xec, 0x94, 0x09, 0xab, 0xe0, 0x35, 0x01, + 0x57, 0xb4, 0x60, 0x1d, 0x4c, 0x0f, 0x6c, 0xbe, 0x0e, 0x0e, 0xf7, 0x1c, + 0x94, 0x2d, 0x3b, 0x82, 0xf9, 0x07, 0xf3, 0x75, 0xac, 0x9f, 0x2b, 0x3a, + 0xd8, 0x85, 0xfb, 0x84, 0xf3, 0x70, 0xe2, 0x5f, 0x35, 0x7b, 0xf6, 0xdc, + 0x8b, 0x75, 0x60, 0x9e, 0xe3, 0xbb, 0xbf, 0x0e, 0xcc, 0x73, 0xd0, 0x0d, + 0x27, 0xe1, 0xcb, 0x9e, 0xec, 0x90, 0xc6, 0xa3, 0x6b, 0xeb, 0xa0, 0xe1, + 0xe8, 0x7b, 0xaf, 0x83, 0xc6, 0x73, 0x28, 0x77, 0x8e, 0x34, 0x43, 0x1b, + 0xa7, 0x49, 0xb3, 0x76, 0xa4, 0x5f, 0xc4, 0x5c, 0x39, 0xf6, 0x46, 0x8c, + 0xdd, 0xc7, 0x45, 0x1f, 0x87, 0xbc, 0xdf, 0xb3, 0xe3, 0x80, 0xce, 0xff, + 0x77, 0xde, 0x68, 0xcc, 0x9e, 0x17, 0x83, 0x34, 0x45, 0xd9, 0x0a, 0x69, + 0xf8, 0x25, 0xd0, 0x66, 0xbf, 0x74, 0x92, 0x7e, 0x95, 0xdd, 0x78, 0x2f, + 0x78, 0x11, 0xfa, 0xe6, 0x8a, 0x9e, 0xc0, 0x49, 0x83, 0xcc, 0x7f, 0x05, + 0x32, 0x43, 0x8c, 0xf9, 0x9a, 0x4c, 0x96, 0x3c, 0x99, 0x50, 0xfb, 0x41, + 0xaf, 0xd3, 0x8f, 0xdd, 0x11, 0x93, 0xe5, 0x44, 0x0c, 0x34, 0x59, 0x80, + 0x6e, 0xbf, 0x20, 0x3e, 0x1d, 0x18, 0x53, 0xde, 0x25, 0x4e, 0x7c, 0x44, + 0x9c, 0xe4, 0x4f, 0x41, 0x87, 0x11, 0xc8, 0x7e, 0xb6, 0x46, 0xd9, 0x79, + 0x59, 0x86, 0x21, 0x13, 0x3f, 0x71, 0xed, 0x24, 0xb0, 0x10, 0xf4, 0x05, + 0xe5, 0x82, 0x32, 0xd1, 0xaa, 0x74, 0xd2, 0x49, 0xd7, 0x7e, 0xb4, 0x22, + 0xd7, 0xcb, 0xc9, 0x36, 0x5f, 0xff, 0x9a, 0x47, 0x95, 0xbd, 0x48, 0xe6, + 0x4c, 0xee, 0x53, 0x26, 0xc5, 0xea, 0xb9, 0xd2, 0x10, 0xec, 0xd5, 0xe7, + 0x8f, 0x19, 0x32, 0xdd, 0x43, 0x5e, 0xb1, 0x5d, 0xbc, 0x57, 0x0a, 0x5e, + 0xd8, 0x79, 0xd3, 0x3b, 0xd5, 0x9e, 0x90, 0x2f, 0xf4, 0xac, 0xca, 0xe5, + 0xbc, 0x88, 0xbf, 0x2e, 0x86, 0x15, 0x3f, 0x82, 0x71, 0x07, 0x73, 0x09, + 0xbe, 0xf5, 0xd7, 0x7d, 0xe3, 0x5c, 0x28, 0xeb, 0xab, 0x6b, 0x27, 0xf1, + 0xce, 0xb1, 0x42, 0xe1, 0x36, 0xd9, 0x8f, 0x16, 0xe5, 0x12, 0x64, 0x0f, + 0x34, 0x3c, 0xc7, 0x94, 0x34, 0x9c, 0x86, 0xdc, 0xbf, 0x22, 0xbb, 0x8e, + 0x71, 0xcd, 0xbc, 0x82, 0xb9, 0x2a, 0x5d, 0x02, 0x1d, 0xc1, 0xf6, 0x3c, + 0x99, 0x71, 0x19, 0x23, 0xb9, 0x3e, 0x3e, 0x05, 0x1f, 0x2e, 0x67, 0x79, + 0xb2, 0xe4, 0x16, 0x64, 0x69, 0x08, 0x75, 0x2a, 0x5f, 0xc4, 0xef, 0xdf, + 0xeb, 0xb9, 0x3d, 0x08, 0xba, 0xdb, 0x89, 0x79, 0xf3, 0x4b, 0xa0, 0xfb, + 0xfd, 0xd2, 0x75, 0x74, 0x55, 0xd7, 0x30, 0x6e, 0xa9, 0x74, 0x4d, 0xd7, + 0x39, 0x4b, 0x2a, 0x65, 0x47, 0x3e, 0x43, 0x1d, 0x52, 0xe6, 0xbc, 0xa0, + 0x63, 0xb8, 0xcf, 0x5d, 0x86, 0x9e, 0x29, 0x43, 0xa7, 0x40, 0x87, 0x7c, + 0x0b, 0xf9, 0x4f, 0xa3, 0xcc, 0x53, 0xf0, 0x79, 0x9e, 0x04, 0xf6, 0x7b, + 0x02, 0x98, 0xe2, 0x7c, 0x39, 0xad, 0x7d, 0x43, 0x35, 0x5f, 0xd8, 0x2c, + 0xe5, 0xaf, 0x48, 0x65, 0x9e, 0xf4, 0xf8, 0xa5, 0xe2, 0x6d, 0xc6, 0xdd, + 0x46, 0x9c, 0x85, 0x91, 0x89, 0xcc, 0xcf, 0x07, 0x34, 0xa1, 0xee, 0x63, + 0x6c, 0x3f, 0xd0, 0x95, 0x2d, 0x1b, 0x74, 0xa5, 0xc8, 0xf7, 0xab, 0x3e, + 0x9e, 0x24, 0x3e, 0x2e, 0x96, 0x20, 0x37, 0x1a, 0x9b, 0x17, 0x61, 0x37, + 0x57, 0xe0, 0x97, 0x44, 0x53, 0x2f, 0x49, 0xf4, 0x84, 0xe7, 0xfd, 0x0c, + 0x76, 0xb3, 0x00, 0x9e, 0x98, 0x06, 0xf2, 0x17, 0xf9, 0x8d, 0x72, 0x4f, + 0xd9, 0x36, 0x18, 0x13, 0x97, 0x17, 0x90, 0x57, 0xf1, 0x7d, 0x6d, 0x8c, + 0x47, 0x8f, 0x4f, 0xe5, 0xb1, 0x5c, 0xa3, 0x64, 0x27, 0x92, 0xf2, 0x70, + 0xb9, 0xcf, 0x6a, 0x44, 0xfd, 0xf9, 0x45, 0xd6, 0xb1, 0x87, 0x50, 0x15, + 0xf5, 0x98, 0xdf, 0x21, 0x17, 0x4a, 0x29, 0x35, 0x86, 0xca, 0x5c, 0x4a, + 0xfc, 0x98, 0x24, 0xf5, 0x15, 0xc7, 0x8a, 0x77, 0xfa, 0x96, 0x65, 0xda, + 0xd9, 0xb0, 0x14, 0xe2, 0xa4, 0x75, 0x5c, 0x56, 0x4a, 0x7f, 0x1e, 0x65, + 0xec, 0x26, 0xe3, 0xf0, 0x39, 0x88, 0x1d, 0x58, 0xbf, 0x45, 0xec, 0x80, + 0xf1, 0x82, 0x30, 0x6c, 0x99, 0x8a, 0x21, 0x20, 0x4d, 0xd4, 0xf9, 0xac, + 0xfc, 0x1e, 0xec, 0xb3, 0x05, 0xd8, 0x88, 0x78, 0x92, 0xf3, 0xb5, 0x0b, + 0xcb, 0xc2, 0xfd, 0xb4, 0x8b, 0x72, 0xc7, 0x49, 0x7f, 0x7e, 0xe6, 0x69, + 0xe1, 0x39, 0x10, 0xb9, 0x32, 0x67, 0xbb, 0x97, 0x81, 0x29, 0xb2, 0x31, + 0x17, 0xfc, 0x3a, 0x1f, 0x85, 0xfe, 0x1a, 0x4a, 0x9b, 0x5b, 0xb7, 0xf8, + 0xf8, 0x2c, 0x2c, 0xd3, 0xdc, 0x0f, 0x2a, 0x41, 0xb7, 0x01, 0x43, 0xfe, + 0x93, 0x30, 0x9e, 0xab, 0x7c, 0x87, 0x9f, 0xe6, 0xfb, 0xa0, 0x78, 0xf6, + 0xdb, 0x23, 0xcd, 0xcd, 0x93, 0x9c, 0xbb, 0x21, 0x77, 0x00, 0x9d, 0x08, + 0xda, 0xef, 0xd4, 0x7d, 0x75, 0x9e, 0x4e, 0x32, 0x76, 0x27, 0x5d, 0xd0, + 0x17, 0x99, 0xb9, 0x30, 0xfa, 0xea, 0xd0, 0xd8, 0x9c, 0xdf, 0x36, 0x62, + 0xcf, 0xc0, 0xc7, 0x4b, 0xca, 0x23, 0xe5, 0x00, 0xeb, 0x25, 0x61, 0x63, + 0x25, 0x3c, 0xda, 0xeb, 0xc9, 0xcf, 0x5c, 0xd2, 0xab, 0x1f, 0xef, 0xae, + 0x1c, 0xae, 0xfd, 0xa6, 0xfd, 0xca, 0xfa, 0x3f, 0xe0, 0x32, 0x62, 0xb3, + 0x12, 0xc6, 0x07, 0x7c, 0xc4, 0xb1, 0x9b, 0xb0, 0xe7, 0x45, 0xe0, 0x2e, + 0xf3, 0x6c, 0x87, 0xfa, 0x66, 0x02, 0x1b, 0x54, 0x4a, 0xd0, 0x8d, 0x67, + 0xb9, 0xa7, 0x0b, 0xdd, 0x76, 0x36, 0x22, 0xc5, 0x59, 0xca, 0xa5, 0xb4, + 0x99, 0xe0, 0x17, 0xcb, 0x57, 0x4a, 0x1d, 0x48, 0x5b, 0x90, 0x26, 0x54, + 0x3b, 0x95, 0x92, 0xa3, 0xea, 0x57, 0x4a, 0x49, 0x55, 0xaf, 0x52, 0xea, + 0x47, 0xea, 0x4a, 0xc3, 0x59, 0x38, 0x4e, 0x67, 0x7b, 0x64, 0xfa, 0x14, + 0xec, 0xcb, 0xa0, 0xa9, 0xce, 0x48, 0xe4, 0x60, 0x7f, 0xc2, 0xf0, 0xb2, + 0x2e, 0x5b, 0x43, 0xc0, 0x58, 0x3b, 0x81, 0x41, 0x76, 0x8a, 0x73, 0x82, + 0xf3, 0xa7, 0xee, 0x5d, 0x61, 0x3c, 0x29, 0xfe, 0x59, 0x49, 0xcb, 0xbe, + 0xd9, 0x46, 0xac, 0xd7, 0xb0, 0x55, 0x94, 0x6e, 0x6b, 0x04, 0xef, 0xf9, + 0x79, 0xd2, 0xed, 0x2e, 0xe5, 0xbb, 0x65, 0xdc, 0xfb, 0xc1, 0x93, 0x14, + 0xfa, 0xf8, 0x6d, 0xea, 0xf7, 0x72, 0xcf, 0x41, 0xb7, 0x91, 0xc2, 0x78, + 0xea, 0xe9, 0xc1, 0xbd, 0xdb, 0xf4, 0x7b, 0xec, 0xdd, 0x52, 0xae, 0x49, + 0xdf, 0xbb, 0x64, 0xc5, 0x49, 0xc9, 0x0b, 0x4e, 0x52, 0x2e, 0x38, 0x03, + 0xf2, 0x03, 0xd8, 0xe9, 0x8b, 0xce, 0xff, 0x8c, 0x12, 0x0b, 0x54, 0xd4, + 0x1e, 0x4c, 0xc0, 0x2b, 0x47, 0xc5, 0x38, 0x1a, 0x52, 0x6f, 0xc8, 0xc5, + 0x12, 0xb1, 0xb3, 0x77, 0xf3, 0xa4, 0x5b, 0xa0, 0xdd, 0x82, 0x4e, 0x26, + 0x56, 0x2b, 0xc0, 0xfe, 0x1d, 0x84, 0xaf, 0x40, 0xbb, 0xa7, 0x6c, 0x54, + 0x7c, 0x97, 0xbf, 0x9e, 0xdd, 0x3c, 0xf4, 0xea, 0xca, 0x2c, 0xf5, 0x12, + 0xd6, 0x94, 0x70, 0x0d, 0xe0, 0x7d, 0x9e, 0xbc, 0x77, 0xe4, 0xab, 0x65, + 0xce, 0xb5, 0x78, 0x55, 0x93, 0x84, 0x64, 0x54, 0x61, 0x86, 0x56, 0xf9, + 0xfe, 0x62, 0xb3, 0x98, 0xb0, 0x52, 0xe6, 0x75, 0x11, 0xb5, 0x5f, 0x4f, + 0x1f, 0x5c, 0xb6, 0xf3, 0xbc, 0xd3, 0x33, 0xa0, 0x0f, 0xe3, 0x01, 0x98, + 0xdf, 0x76, 0xce, 0x26, 0x78, 0xef, 0xc7, 0x1a, 0xe3, 0xb3, 0x21, 0x59, + 0x27, 0x86, 0x67, 0xa6, 0x5c, 0x77, 0x8c, 0x3d, 0x6d, 0x91, 0xf4, 0xb8, + 0x21, 0x8d, 0x4e, 0xaf, 0xf0, 0xdc, 0x43, 0x45, 0x61, 0x90, 0x0b, 0xaa, + 0x6c, 0xa3, 0x73, 0x13, 0x70, 0x1e, 0xe5, 0x17, 0xe9, 0x92, 0x3f, 0x86, + 0x2c, 0x70, 0x5d, 0xbe, 0x7f, 0x0b, 0xfd, 0xf2, 0x64, 0x01, 0x6b, 0x23, + 0xa7, 0xca, 0xef, 0xc4, 0xfa, 0x7a, 0x75, 0x0b, 0xf1, 0xc4, 0x2e, 0xc8, + 0xe6, 0xc5, 0x12, 0x9f, 0xf9, 0x9d, 0xfe, 0x16, 0xe3, 0x6d, 0x97, 0xc6, + 0x66, 0x1c, 0x5b, 0xaf, 0x27, 0x31, 0x6e, 0xeb, 0x05, 0x2e, 0x3d, 0xd2, + 0x80, 0x79, 0xd9, 0x89, 0x84, 0x61, 0xb6, 0x9b, 0xc0, 0xf5, 0xbb, 0x94, + 0x0d, 0xe6, 0x18, 0xec, 0xe4, 0x32, 0xe8, 0xf3, 0x42, 0xb2, 0x55, 0x56, + 0x2c, 0xd0, 0x94, 0xeb, 0xda, 0xda, 0xc1, 0x7c, 0xfc, 0xb6, 0x20, 0xaf, + 0x1b, 0x69, 0x23, 0xd2, 0x1b, 0xa4, 0x78, 0xfc, 0x17, 0xba, 0xcd, 0xc8, + 0x86, 0xf7, 0x92, 0x4e, 0x9f, 0xd3, 0x3e, 0x16, 0xfb, 0x8a, 0x88, 0xf3, + 0xb5, 0x16, 0xe9, 0x3e, 0x62, 0x01, 0xef, 0xc6, 0x81, 0x7f, 0x3b, 0x24, + 0x79, 0x24, 0x21, 0xd7, 0x1d, 0x09, 0x62, 0x47, 0xff, 0x79, 0xac, 0x4b, + 0xc5, 0x11, 0xff, 0xd3, 0x98, 0x33, 0xcf, 0xf4, 0x75, 0xbd, 0x5f, 0xfc, + 0x86, 0xde, 0x47, 0x7e, 0x73, 0xac, 0x57, 0xa5, 0xbf, 0x1c, 0x4b, 0xaa, + 0xf4, 0xad, 0xb1, 0xeb, 0xaa, 0xbe, 0xcf, 0x54, 0x5c, 0x48, 0xca, 0x57, + 0xca, 0xc4, 0x9c, 0x83, 0xc0, 0x93, 0x2e, 0x74, 0x4f, 0x3f, 0x74, 0x4f, + 0x12, 0xba, 0x67, 0x88, 0xba, 0x87, 0xf1, 0x51, 0xe8, 0x72, 0x57, 0x7e, + 0x02, 0x19, 0x3e, 0xef, 0x36, 0x02, 0x2b, 0x7a, 0xde, 0x88, 0x9a, 0xaf, + 0xfd, 0xe8, 0x32, 0xf8, 0x5d, 0x39, 0x23, 0xd1, 0xed, 0xd0, 0x4b, 0x3b, + 0x4e, 0x36, 0xc8, 0x42, 0xcc, 0xf3, 0x8e, 0xb9, 0x8e, 0x5c, 0x41, 0xf9, + 0x8c, 0xc3, 0xb5, 0xdd, 0xdf, 0x44, 0x1f, 0xed, 0x4a, 0x69, 0x00, 0x7a, + 0x8a, 0x6b, 0x20, 0x2a, 0x95, 0x89, 0xb8, 0x2c, 0xc2, 0x67, 0x5b, 0x2b, + 0x93, 0xc4, 0x33, 0x75, 0xc2, 0x27, 0x50, 0x36, 0x09, 0x9b, 0x61, 0xc9, + 0x52, 0x6f, 0x42, 0x4e, 0xf7, 0xda, 0x43, 0x09, 0x93, 0xfa, 0x2c, 0x21, + 0xf3, 0xf0, 0xff, 0x2b, 0x65, 0x96, 0x67, 0x39, 0xac, 0xd9, 0xb2, 0x5f, + 0x6f, 0xa6, 0x1c, 0xe8, 0x0e, 0xc8, 0xec, 0x1c, 0x63, 0x83, 0xbe, 0x5d, + 0x30, 0xcd, 0x46, 0xf8, 0xb6, 0x2e, 0xe8, 0x3f, 0x81, 0xfc, 0x41, 0x9e, + 0xf1, 0x40, 0x1e, 0xf1, 0xd1, 0xdf, 0x6f, 0x22, 0x9f, 0xb3, 0xee, 0x04, + 0xf2, 0x58, 0xc7, 0x8e, 0x77, 0x21, 0x7f, 0x5c, 0xba, 0xe2, 0x79, 0x75, + 0xce, 0xa8, 0x1d, 0x79, 0x6c, 0x23, 0xa4, 0x63, 0x34, 0x7b, 0x9b, 0x28, + 0x4b, 0x21, 0x27, 0xc8, 0xef, 0x53, 0xf1, 0x82, 0xb4, 0xe5, 0x62, 0x8d, + 0x30, 0xaf, 0xcb, 0x62, 0xbd, 0xac, 0xeb, 0x2a, 0xfd, 0x78, 0xa7, 0xde, + 0xc3, 0xb8, 0xa3, 0xda, 0x22, 0xd9, 0x6a, 0xc3, 0xbb, 0xd8, 0x84, 0x60, + 0x9d, 0xae, 0xc4, 0x2d, 0xe1, 0xbe, 0xba, 0xbf, 0xf6, 0xc3, 0x03, 0x5c, + 0x23, 0xa0, 0x3b, 0x6c, 0xf2, 0x53, 0x98, 0xef, 0x93, 0xb0, 0xc9, 0x4f, + 0xc0, 0x26, 0x9f, 0x2f, 0xaf, 0xe9, 0x14, 0xdf, 0x16, 0x53, 0x2f, 0x3c, + 0x06, 0x9e, 0x8d, 0xc3, 0x17, 0xd8, 0x0d, 0x1f, 0x61, 0x14, 0xfe, 0xc0, + 0x30, 0xf8, 0x97, 0x02, 0xef, 0x26, 0xc0, 0xb7, 0x34, 0xf8, 0x38, 0xa4, + 0xf6, 0x33, 0x67, 0xd5, 0x1e, 0xfe, 0x1b, 0xca, 0x1e, 0x3f, 0x5c, 0x36, + 0x61, 0x33, 0x0a, 0xde, 0x55, 0x8e, 0x0d, 0x4c, 0xb8, 0xba, 0xc6, 0x87, + 0xbe, 0x0f, 0x5d, 0xf3, 0x0b, 0x8c, 0xeb, 0xc9, 0x59, 0xda, 0x78, 0x94, + 0xf1, 0x31, 0xb8, 0xcb, 0xf8, 0x17, 0xd6, 0xf8, 0xe1, 0x15, 0x59, 0x06, + 0x16, 0x49, 0x53, 0x8e, 0xe1, 0x53, 0xd8, 0xe7, 0xe7, 0xa5, 0x87, 0x7a, + 0x11, 0x38, 0x69, 0x48, 0x06, 0x8f, 0xc6, 0x81, 0xff, 0x80, 0xee, 0xd5, + 0x1e, 0x1e, 0x9e, 0xcf, 0x6d, 0x15, 0x93, 0x18, 0xd0, 0xe5, 0x3e, 0x0d, + 0x75, 0x49, 0x80, 0x9b, 0x96, 0x87, 0xda, 0x24, 0xbd, 0xa3, 0x4d, 0xe9, + 0x13, 0xdb, 0x7d, 0x01, 0xfd, 0xee, 0x92, 0x46, 0xe0, 0xba, 0x02, 0xfa, + 0x38, 0x20, 0xff, 0xd5, 0x65, 0xdc, 0xca, 0xf7, 0x07, 0x31, 0x96, 0x28, + 0x68, 0xb6, 0x65, 0xd2, 0xb1, 0xa2, 0xbb, 0x6a, 0x6c, 0x3f, 0xaa, 0x70, + 0x57, 0x56, 0xd8, 0x3e, 0x6c, 0x07, 0xfa, 0xec, 0x3a, 0x4a, 0xd9, 0xef, + 0x03, 0xdf, 0xfe, 0x9e, 0x3e, 0x4b, 0x64, 0x35, 0xeb, 0xbd, 0x4d, 0x8c, + 0x7f, 0x99, 0x18, 0x83, 0x71, 0x76, 0xdf, 0x57, 0x5f, 0x1d, 0xdb, 0x4e, + 0xd8, 0xb4, 0xbf, 0x52, 0x32, 0x30, 0xe1, 0xc2, 0x17, 0x3c, 0xea, 0xdb, + 0xf0, 0xce, 0x73, 0xa8, 0x75, 0x4c, 0xda, 0xb9, 0x03, 0x6a, 0xca, 0x75, + 0x72, 0x4b, 0xd8, 0x6f, 0xc7, 0x3c, 0x69, 0x41, 0x56, 0xa9, 0x0b, 0xda, + 0x21, 0xe7, 0x7c, 0xa7, 0x5e, 0xa1, 0x5e, 0xa0, 0x2c, 0x38, 0x3c, 0xc3, + 0xb3, 0x85, 0x67, 0xcf, 0xe6, 0x49, 0xb3, 0x93, 0xd4, 0x15, 0x6f, 0xc8, + 0xcc, 0x06, 0xfd, 0x39, 0x2c, 0x81, 0xaf, 0xdb, 0x22, 0x91, 0x94, 0x63, + 0xdd, 0xa9, 0xe6, 0xe8, 0xeb, 0xd0, 0x7d, 0xc4, 0xa4, 0xb3, 0x69, 0xbb, + 0x4d, 0x34, 0x1e, 0x55, 0x98, 0xea, 0x75, 0xcc, 0x95, 0x6d, 0x28, 0x3a, + 0x0d, 0x0d, 0xfb, 0xfe, 0x81, 0x8a, 0x03, 0x02, 0x1b, 0xc7, 0x7f, 0x01, + 0xfd, 0x92, 0x25, 0x56, 0x01, 0x9d, 0x3b, 0x8f, 0x51, 0x8e, 0xfc, 0xf3, + 0x65, 0xf3, 0x66, 0x92, 0x3a, 0x5c, 0x16, 0x8f, 0x02, 0x87, 0x99, 0x37, + 0x49, 0x9e, 0xf2, 0xca, 0x7d, 0xf0, 0x45, 0x53, 0x66, 0xe6, 0x5a, 0xa5, + 0xfb, 0x24, 0x63, 0xae, 0xcd, 0x4d, 0xd2, 0xca, 0xb8, 0x2b, 0xed, 0xd2, + 0xa0, 0x64, 0x91, 0xdf, 0x79, 0x32, 0xa4, 0x62, 0x64, 0xf3, 0x26, 0x69, + 0xd4, 0x0f, 0x7d, 0x00, 0x1d, 0x66, 0x9e, 0x8c, 0xfa, 0xb8, 0x12, 0xb2, + 0x54, 0x86, 0x8c, 0x95, 0x21, 0x63, 0x65, 0xc8, 0x58, 0x19, 0x32, 0x06, + 0x3c, 0xf8, 0x24, 0xd6, 0xdf, 0x13, 0xe5, 0x21, 0x6d, 0xeb, 0xf7, 0x28, + 0x5b, 0x5f, 0x2c, 0xbf, 0xec, 0x31, 0x7d, 0x5a, 0xf9, 0xab, 0xfd, 0x90, + 0x41, 0xfa, 0xa7, 0x81, 0xdf, 0x0a, 0x0c, 0x3f, 0xfb, 0x8a, 0x64, 0x67, + 0x29, 0x33, 0x9e, 0x1c, 0x73, 0x2d, 0x59, 0x58, 0xa0, 0x1f, 0x79, 0x49, + 0x6e, 0x2f, 0xbd, 0x26, 0x77, 0x96, 0xfa, 0xe4, 0x9f, 0x5a, 0x0a, 0x4f, + 0xe8, 0xf9, 0x83, 0xee, 0xc7, 0x49, 0x83, 0x82, 0xd7, 0xe0, 0xa4, 0xed, + 0xb0, 0x2f, 0x33, 0xd6, 0xb0, 0xa2, 0xa3, 0x03, 0x9b, 0xe4, 0xd3, 0x2f, + 0xbb, 0x8a, 0x29, 0xe1, 0xb7, 0xc3, 0xee, 0x2f, 0xf6, 0x52, 0x77, 0xd8, + 0x85, 0x4e, 0xac, 0xe9, 0xfd, 0x26, 0xe4, 0x2f, 0x4c, 0xff, 0x97, 0x34, + 0x76, 0xac, 0x15, 0xf1, 0x7d, 0x9c, 0x74, 0xcc, 0x3e, 0x2c, 0xa6, 0xa2, + 0x3b, 0xd6, 0x26, 0xe7, 0x49, 0xba, 0x7f, 0xba, 0x99, 0xfb, 0xa9, 0x95, + 0xe3, 0x5f, 0x6c, 0x62, 0xec, 0x31, 0xe6, 0x90, 0x96, 0x97, 0x64, 0x7f, + 0x95, 0x79, 0xaf, 0xe0, 0x3b, 0xd3, 0x4b, 0xde, 0x1d, 0xab, 0xfb, 0xec, + 0xc0, 0x50, 0xed, 0x98, 0x63, 0xf9, 0x39, 0x8d, 0xbf, 0xfb, 0x15, 0xa6, + 0x7e, 0x27, 0x76, 0x26, 0x7d, 0x5c, 0xd0, 0xe7, 0x92, 0x8a, 0x0d, 0x6e, + 0x12, 0x33, 0x7e, 0x14, 0xeb, 0xa9, 0x70, 0x59, 0x18, 0xbf, 0x64, 0x6c, + 0x97, 0x71, 0xe3, 0x7a, 0x4d, 0xa1, 0xf6, 0x4c, 0xe5, 0x76, 0xe8, 0x95, + 0x3b, 0xa0, 0x57, 0xee, 0x7c, 0xc7, 0x59, 0xde, 0x20, 0x86, 0xdf, 0x5d, + 0x08, 0x99, 0x1d, 0x32, 0x5e, 0xad, 0xaf, 0xcb, 0x98, 0xee, 0x66, 0x31, + 0x5c, 0xc6, 0x77, 0x93, 0x1b, 0xe2, 0x82, 0x94, 0x09, 0x4f, 0x2e, 0xba, + 0x8c, 0xc1, 0x05, 0x67, 0xb5, 0x36, 0xc3, 0x62, 0x53, 0xcd, 0x41, 0xfc, + 0x39, 0x9c, 0xba, 0x2c, 0x3c, 0xb7, 0x55, 0x2c, 0x11, 0x1b, 0xa8, 0x7d, + 0x41, 0x15, 0xc7, 0xce, 0xfa, 0xb1, 0x04, 0xe4, 0xc3, 0xe2, 0xc2, 0xf7, + 0x61, 0x1c, 0xdb, 0x1a, 0xb0, 0xad, 0xf1, 0x90, 0x7f, 0x5e, 0x91, 0x6b, + 0xd8, 0xd7, 0x61, 0x90, 0x99, 0xd5, 0x98, 0x2f, 0xcf, 0x1a, 0x70, 0x2e, + 0x97, 0xc1, 0x7b, 0xfa, 0x07, 0xf0, 0x1d, 0xc0, 0xdf, 0x69, 0xe8, 0xa5, + 0xbc, 0x6a, 0x2f, 0x4a, 0x3e, 0xa7, 0x33, 0x21, 0x53, 0x22, 0x27, 0xe8, + 0x17, 0xf9, 0x71, 0x97, 0x6c, 0xc8, 0x56, 0x7a, 0x1b, 0x63, 0x07, 0x56, + 0xe3, 0xba, 0x4c, 0xe4, 0x1a, 0x53, 0x0d, 0x52, 0x01, 0xfe, 0x99, 0xae, + 0x31, 0x3e, 0x80, 0x35, 0xbb, 0xf4, 0xaa, 0xec, 0x9b, 0x7b, 0xa4, 0xd9, + 0x97, 0x7b, 0xc6, 0x94, 0x39, 0xbf, 0x60, 0x0c, 0xeb, 0xdb, 0x36, 0x4f, + 0x48, 0xb4, 0x09, 0xb6, 0xec, 0x93, 0x27, 0x88, 0x05, 0x1a, 0x65, 0x39, + 0xc6, 0x76, 0xfd, 0xb5, 0x32, 0x53, 0x66, 0xdb, 0xaf, 0xca, 0xc8, 0xdc, + 0x5f, 0x36, 0x53, 0x7f, 0x2c, 0x61, 0xfd, 0xaf, 0x58, 0xb4, 0x9d, 0x13, + 0xb0, 0x6d, 0xed, 0xf2, 0xfa, 0x1c, 0xed, 0x62, 0x97, 0x75, 0x5a, 0xfa, + 0xe2, 0xa7, 0x31, 0xa6, 0x47, 0xdc, 0x30, 0xfd, 0x35, 0x6f, 0x18, 0x79, + 0x3f, 0x90, 0x2e, 0xab, 0xd3, 0xe0, 0x73, 0x9f, 0xf5, 0x55, 0xe1, 0x99, + 0x83, 0x2e, 0xeb, 0x7a, 0x83, 0x72, 0x04, 0xff, 0x7b, 0x69, 0x6d, 0x9c, + 0x3f, 0x9d, 0x53, 0x3e, 0x93, 0xd2, 0x2f, 0x4b, 0x2e, 0xfb, 0x7b, 0x44, + 0xeb, 0xb4, 0xeb, 0x21, 0xfb, 0xc1, 0x19, 0x5d, 0xd4, 0x21, 0xae, 0x71, + 0xc3, 0xfa, 0xfd, 0x41, 0xc9, 0x9c, 0x8a, 0x41, 0x8f, 0xb1, 0xad, 0xc0, + 0x8f, 0xa0, 0x6d, 0x0c, 0xb0, 0x37, 0xed, 0xdc, 0x4d, 0xb0, 0x77, 0xd7, + 0xaa, 0xf1, 0x8c, 0xba, 0xfd, 0x32, 0x7d, 0x9c, 0x7d, 0xf7, 0x42, 0x87, + 0xc7, 0x95, 0xdc, 0x16, 0xcb, 0x2b, 0xf1, 0x28, 0x74, 0x71, 0x74, 0x07, + 0xe9, 0xf9, 0x09, 0xb9, 0xd5, 0x99, 0x90, 0xdb, 0x20, 0x3b, 0xc3, 0x8e, + 0x2b, 0x23, 0xe0, 0xc5, 0x2e, 0x07, 0xf6, 0x46, 0xe1, 0xe9, 0x46, 0xf8, + 0x60, 0xec, 0x9b, 0x67, 0xd2, 0x59, 0xd7, 0xc7, 0x92, 0xdf, 0xac, 0xf9, + 0x34, 0xca, 0xcc, 0x35, 0xb7, 0x90, 0x36, 0xa3, 0xee, 0x4e, 0x6d, 0x5f, + 0x5b, 0x25, 0xab, 0xca, 0xed, 0x54, 0x76, 0xb8, 0xb8, 0x78, 0x17, 0x52, + 0xd8, 0xe4, 0x45, 0xe8, 0x19, 0xe0, 0xef, 0x62, 0x75, 0x00, 0xef, 0xb0, + 0x9d, 0x8b, 0x29, 0xa4, 0x9f, 0x40, 0xca, 0xb2, 0xff, 0xb6, 0xd9, 0x8f, + 0xeb, 0x6e, 0x3c, 0x17, 0x24, 0xc6, 0x27, 0xd5, 0x5e, 0xf7, 0x65, 0x75, + 0x96, 0x0c, 0x3e, 0xe6, 0x58, 0x66, 0x56, 0xa2, 0x2d, 0xc0, 0x3e, 0xa5, + 0x13, 0x76, 0x72, 0xc4, 0xb8, 0x59, 0x3e, 0x05, 0xbf, 0xbe, 0xe2, 0x92, + 0x97, 0x03, 0xf2, 0xd9, 0x1b, 0x29, 0x23, 0x37, 0xcb, 0xe4, 0x8d, 0x86, + 0x4c, 0xf6, 0xdb, 0x69, 0x8e, 0xfb, 0xba, 0x1b, 0x02, 0xdf, 0xba, 0x7b, + 0xb4, 0xcb, 0x18, 0x94, 0xaf, 0x42, 0xc6, 0x0a, 0x90, 0xaf, 0x91, 0x1a, + 0x69, 0x4e, 0x3d, 0x4f, 0xfd, 0x9e, 0x04, 0x6e, 0x0e, 0x70, 0x9f, 0x23, + 0xa5, 0x5a, 0xa3, 0x24, 0xae, 0x66, 0x6c, 0x39, 0xe1, 0xef, 0xb9, 0x7d, + 0xda, 0xf7, 0x07, 0xcc, 0x41, 0xf8, 0x24, 0xea, 0x99, 0xf9, 0x11, 0xc9, + 0x5f, 0x4d, 0xba, 0xc7, 0xe8, 0x0f, 0x7b, 0xc4, 0x78, 0xfe, 0x39, 0x7f, + 0xda, 0x07, 0xa6, 0xf7, 0xb4, 0xac, 0x62, 0xbb, 0x56, 0x3b, 0x99, 0x33, + 0x20, 0x04, 0x2a, 0x7f, 0x33, 0x79, 0x0c, 0xe2, 0x70, 0xf3, 0x98, 0x37, + 0xed, 0xb9, 0x0d, 0xdb, 0x5f, 0xf0, 0xb6, 0x3b, 0x7b, 0xe4, 0x39, 0xd8, + 0xf6, 0xef, 0xac, 0xda, 0xf6, 0xbd, 0xa0, 0xc9, 0x46, 0xfb, 0xef, 0x58, + 0xb7, 0x63, 0x3e, 0xa3, 0xe0, 0xe9, 0x6d, 0xf8, 0xdd, 0x5a, 0x5e, 0x17, + 0xd7, 0x9b, 0x2d, 0x00, 0x4b, 0x36, 0x38, 0x6c, 0x6f, 0x5d, 0x7c, 0xaf, + 0x90, 0x97, 0xd5, 0xd8, 0xe1, 0xd0, 0x15, 0xa1, 0xcd, 0x7b, 0x53, 0x22, + 0x3d, 0xce, 0x9b, 0x9d, 0x86, 0xf3, 0x8c, 0x69, 0x70, 0x9f, 0xd9, 0x95, + 0x33, 0x35, 0x62, 0xb0, 0x0b, 0x62, 0x9e, 0x23, 0xfe, 0x7a, 0x51, 0xc5, + 0xa4, 0x2a, 0xe5, 0x1f, 0x21, 0xa5, 0xae, 0x7e, 0x05, 0x36, 0x57, 0xd1, + 0x56, 0xe1, 0x14, 0xda, 0xdd, 0xdb, 0xc0, 0x8b, 0x69, 0xfc, 0x3a, 0x77, + 0x5c, 0x6f, 0xe5, 0xd5, 0xbe, 0x20, 0x63, 0x61, 0x3d, 0xd6, 0x0e, 0x83, + 0xdf, 0x36, 0x8b, 0x8b, 0xfd, 0x58, 0xc2, 0xc7, 0x60, 0xe7, 0x4c, 0xea, + 0x08, 0xce, 0x83, 0x3a, 0x1e, 0x76, 0xe2, 0x38, 0xd7, 0xfb, 0x66, 0xe5, + 0x83, 0xb2, 0xc1, 0x5c, 0x94, 0x2d, 0x48, 0xe7, 0x19, 0xf3, 0x2c, 0x93, + 0x07, 0x2e, 0x78, 0xe0, 0xc9, 0x09, 0x77, 0x3b, 0x74, 0x77, 0x4c, 0x42, + 0x27, 0x78, 0x0e, 0x88, 0x18, 0xaf, 0x0f, 0x78, 0x6b, 0xab, 0xc6, 0x0c, + 0x31, 0x09, 0x9f, 0xe8, 0x90, 0x46, 0x60, 0xea, 0x86, 0x23, 0xb4, 0x8f, + 0x5d, 0x89, 0x61, 0x30, 0x2d, 0xac, 0xce, 0x26, 0xda, 0x43, 0xaf, 0x4b, + 0x5f, 0xe2, 0x75, 0x21, 0x56, 0xba, 0x02, 0xfe, 0xd9, 0xee, 0x85, 0x4d, + 0xca, 0x17, 0xd7, 0xca, 0x43, 0x96, 0x18, 0x6b, 0x63, 0x1d, 0xc6, 0xde, + 0xba, 0x86, 0x7e, 0xc2, 0x98, 0x1b, 0x7c, 0xcf, 0x86, 0xb3, 0xfe, 0x18, + 0xcc, 0xa5, 0x36, 0xa9, 0x9c, 0xe2, 0x3a, 0x65, 0xdc, 0xc5, 0xf2, 0xfd, + 0xd6, 0x32, 0xfd, 0x57, 0x7e, 0x4f, 0xe8, 0xef, 0x9d, 0xfa, 0x3b, 0xfd, + 0x53, 0xda, 0x3f, 0xd8, 0x3b, 0xe8, 0xd0, 0xbb, 0x06, 0x1c, 0x65, 0xf3, + 0xee, 0x5a, 0xe5, 0xd9, 0x6e, 0x31, 0x8f, 0xc2, 0x6f, 0x2d, 0x1f, 0x14, + 0x67, 0xc7, 0x72, 0x32, 0x2c, 0xe3, 0xe0, 0x05, 0xdf, 0x95, 0xbd, 0x4c, + 0x3e, 0x24, 0xfb, 0x15, 0x6f, 0x2a, 0xc7, 0xed, 0xc3, 0x09, 0x63, 0x5a, + 0xcc, 0x8a, 0xb2, 0x6f, 0x48, 0x1f, 0x02, 0xd6, 0xf1, 0x63, 0x99, 0x66, + 0x65, 0x3d, 0x2d, 0x81, 0x2f, 0x60, 0x5b, 0xfb, 0x37, 0x8d, 0x79, 0xf1, + 0xfb, 0xb0, 0x04, 0xb6, 0x77, 0x2d, 0xee, 0x95, 0x35, 0x89, 0x63, 0x82, + 0xef, 0xe4, 0x05, 0xf9, 0x05, 0x3b, 0x7c, 0x3c, 0x88, 0x81, 0xb5, 0x6a, + 0xbe, 0x90, 0x3f, 0x25, 0x79, 0xc2, 0xb2, 0x47, 0x29, 0x7f, 0x1f, 0x1d, + 0xb8, 0x46, 0x72, 0xed, 0x8c, 0xbf, 0xd5, 0x8f, 0x61, 0x63, 0x5c, 0xad, + 0xbe, 0xff, 0x8d, 0xf1, 0x38, 0xf6, 0xed, 0xc7, 0xdc, 0x32, 0xeb, 0x62, + 0x6e, 0xf5, 0xfd, 0xb1, 0xaf, 0xad, 0xf0, 0x9d, 0x0a, 0x5e, 0xcc, 0x21, + 0x8f, 0xba, 0x13, 0x73, 0x7c, 0xff, 0x86, 0x09, 0x3e, 0xc6, 0x60, 0x4b, + 0xc8, 0xcb, 0x60, 0x2f, 0x9a, 0x3c, 0xed, 0x4a, 0x3c, 0xe4, 0xf3, 0x73, + 0xc8, 0xe7, 0xbb, 0xcf, 0xff, 0x0b, 0xab, 0x7c, 0xa4, 0x8d, 0x20, 0x1f, + 0xdb, 0x45, 0xa0, 0x6b, 0xcd, 0x23, 0xe4, 0x21, 0x53, 0xf2, 0x90, 0xdf, + 0xc8, 0xc3, 0x4e, 0xfd, 0x8d, 0xfc, 0x03, 0x46, 0xfb, 0x1a, 0x70, 0x86, + 0x9b, 0x51, 0x77, 0x7a, 0x3a, 0x7b, 0x82, 0xb5, 0x98, 0x94, 0xa7, 0x16, + 0x9a, 0xc4, 0x4a, 0xf9, 0xf3, 0x9a, 0x58, 0x17, 0x7f, 0xe7, 0x7e, 0x56, + 0x3f, 0x71, 0x67, 0x30, 0xaf, 0x38, 0xe7, 0xb5, 0x5f, 0x2e, 0x01, 0xe3, + 0x84, 0xe1, 0xff, 0x25, 0x81, 0x71, 0xfa, 0xa1, 0x73, 0xe9, 0x9b, 0x23, + 0xaf, 0x4a, 0xcc, 0x42, 0x7b, 0x97, 0xc4, 0x5a, 0xa1, 0x1e, 0x26, 0x26, + 0x01, 0xd6, 0x9a, 0x0f, 0x74, 0x0c, 0xda, 0x37, 0x83, 0xf6, 0x49, 0xe7, + 0xf4, 0x75, 0x57, 0xc9, 0x72, 0xe2, 0x2a, 0xb1, 0x13, 0x8b, 0xb2, 0xc6, + 0xd7, 0x89, 0xcd, 0xe9, 0xee, 0xde, 0x15, 0x5a, 0x93, 0x8d, 0x89, 0x4d, + 0x78, 0x3f, 0x25, 0xc1, 0xf7, 0x80, 0xf7, 0x9b, 0xf2, 0xa1, 0xf0, 0xb2, + 0x90, 0x17, 0xa4, 0x01, 0x31, 0x5c, 0x44, 0xfe, 0x59, 0x8c, 0xeb, 0xb1, + 0xa0, 0xf6, 0x3b, 0xbb, 0xcc, 0x1e, 0xa5, 0x33, 0x86, 0x5d, 0x5f, 0x5e, + 0x0b, 0xe8, 0x27, 0xda, 0xfd, 0xcf, 0xbd, 0xe1, 0x18, 0x7c, 0xdc, 0x6e, + 0xea, 0x97, 0x60, 0x4d, 0x37, 0xa9, 0x35, 0xfd, 0x88, 0x6b, 0x48, 0xd1, + 0x31, 0x64, 0xda, 0x39, 0xa8, 0xf0, 0xfd, 0xa7, 0xd1, 0xd6, 0x67, 0x75, + 0x5b, 0xd3, 0xd2, 0xa3, 0xf5, 0xcf, 0x01, 0xc8, 0xb9, 0x27, 0x77, 0xba, + 0x03, 0xf2, 0xd1, 0xed, 0x5c, 0x03, 0xc1, 0xfc, 0x0f, 0x4a, 0xf7, 0xc0, + 0x72, 0x02, 0x5e, 0xc1, 0x75, 0x91, 0x55, 0x1a, 0x70, 0x9d, 0x05, 0xf2, + 0xed, 0xd3, 0xc1, 0x9f, 0xff, 0xba, 0xb9, 0xea, 0x79, 0x72, 0xce, 0x2c, + 0xc7, 0xb9, 0x06, 0x38, 0x34, 0x98, 0x6b, 0x50, 0xbe, 0x05, 0xb2, 0x64, + 0x27, 0xc4, 0xa8, 0xa7, 0xcd, 0xaa, 0x8e, 0x1a, 0x65, 0xcc, 0x84, 0x77, + 0x07, 0x12, 0x46, 0x10, 0x9b, 0x56, 0xba, 0x33, 0xde, 0x09, 0x0c, 0xee, + 0xf4, 0xf4, 0x24, 0xf3, 0x2a, 0x66, 0x6a, 0xaa, 0x79, 0x4d, 0x03, 0x97, + 0x2d, 0xb8, 0x2f, 0x7b, 0x5f, 0x00, 0x6e, 0xcd, 0xc9, 0xfd, 0x12, 0x5a, + 0x17, 0xdb, 0xc5, 0xfb, 0x39, 0xc6, 0x77, 0xed, 0x44, 0x1a, 0x3c, 0xfe, + 0x3d, 0xf8, 0xef, 0x15, 0xe8, 0xfd, 0xcf, 0xd0, 0x36, 0x94, 0x61, 0x2f, + 0x80, 0x4d, 0xbe, 0xf3, 0xae, 0xf8, 0x3d, 0x57, 0x17, 0xdb, 0xf5, 0x31, + 0xea, 0x13, 0x0a, 0x97, 0x12, 0xb3, 0x1f, 0x36, 0x6e, 0xef, 0x0d, 0xc1, + 0xc7, 0x28, 0x78, 0x51, 0x87, 0x58, 0xee, 0xa0, 0xdc, 0x0a, 0xfe, 0x9c, + 0x59, 0x28, 0x18, 0xbb, 0xca, 0x81, 0xac, 0xc2, 0xa7, 0xac, 0xd9, 0xc9, + 0x15, 0xd0, 0xe3, 0x31, 0x8d, 0xfb, 0xb8, 0x7f, 0x53, 0xd1, 0xfe, 0x0a, + 0x63, 0x45, 0xc5, 0xda, 0x41, 0x99, 0x71, 0x4d, 0xff, 0x3c, 0x59, 0x2c, + 0x7d, 0x4d, 0xe3, 0x2a, 0x8d, 0x6c, 0x60, 0x72, 0x3b, 0x49, 0xfd, 0x5d, + 0xd1, 0xfb, 0x1f, 0x8f, 0x29, 0xf9, 0x0a, 0x30, 0x3d, 0x31, 0x3a, 0xf1, + 0x7b, 0xb7, 0x35, 0xca, 0xe7, 0x79, 0xca, 0x80, 0xc6, 0xed, 0xee, 0xbd, + 0x92, 0x1e, 0x4f, 0x28, 0xec, 0xf2, 0x70, 0x99, 0xeb, 0x85, 0xd8, 0xff, + 0x92, 0xac, 0x60, 0x7d, 0xd0, 0x77, 0x80, 0x0f, 0x80, 0xbe, 0xb9, 0x2e, + 0x90, 0x57, 0xb5, 0x7e, 0xc3, 0xba, 0x58, 0x68, 0x25, 0xce, 0x78, 0xbe, + 0xcc, 0xbd, 0x31, 0x3b, 0xb1, 0x2c, 0x41, 0x2c, 0x5d, 0xe1, 0xc1, 0x42, + 0x26, 0x64, 0x48, 0xd7, 0xb1, 0x7f, 0x09, 0x19, 0xfa, 0x5d, 0xf8, 0x47, + 0x2c, 0x27, 0x6a, 0x3f, 0x6b, 0x18, 0xb8, 0xcb, 0x74, 0xde, 0x27, 0x45, + 0x2b, 0x22, 0x45, 0x75, 0x56, 0x33, 0xa2, 0x62, 0x4f, 0xb4, 0xf9, 0x45, + 0x8b, 0xb8, 0x7f, 0xb1, 0xd5, 0xb7, 0xf5, 0x6d, 0x78, 0x67, 0x3d, 0xbe, + 0x33, 0x7f, 0x5a, 0x22, 0xc7, 0x0e, 0x48, 0xc3, 0xb1, 0xfb, 0xa5, 0xf1, + 0x28, 0x71, 0x1e, 0x63, 0x66, 0xe6, 0x4d, 0x8d, 0x42, 0xdc, 0xdd, 0x0c, + 0x1e, 0x1e, 0x94, 0x9f, 0xb9, 0xc1, 0x98, 0x3e, 0x8f, 0x31, 0xb2, 0x4c, + 0xf0, 0x1e, 0x60, 0xf2, 0x9b, 0x30, 0x1e, 0xce, 0x3f, 0xa1, 0xb1, 0xdf, + 0x4d, 0x75, 0x7e, 0x6b, 0x83, 0xf6, 0x5b, 0x59, 0x6f, 0x08, 0x73, 0x39, + 0x2e, 0x11, 0x27, 0xa8, 0x7f, 0x33, 0xca, 0xc5, 0xeb, 0xce, 0x44, 0xb0, + 0x8c, 0x3e, 0x23, 0xd0, 0x4a, 0xec, 0xc3, 0xfd, 0x77, 0xe6, 0xf9, 0x67, + 0x00, 0xcc, 0x4a, 0x73, 0x68, 0x7d, 0xff, 0x3b, 0xeb, 0xca, 0x06, 0x79, + 0x41, 0x9d, 0x88, 0xef, 0xef, 0x0f, 0x46, 0xea, 0xea, 0xed, 0xb1, 0xfc, + 0xd4, 0xf7, 0x3f, 0x7c, 0x5f, 0x88, 0x73, 0x48, 0xd6, 0xe1, 0x9c, 0x7a, + 0xff, 0x83, 0xf7, 0x5d, 0xa2, 0xf0, 0x59, 0x83, 0x73, 0x65, 0x26, 0xe6, + 0x62, 0x17, 0xe8, 0xc3, 0x58, 0x3c, 0x9b, 0x3b, 0x57, 0xe0, 0x1e, 0x9d, + 0x3a, 0x5b, 0xc4, 0xb3, 0x1c, 0x28, 0x97, 0xf0, 0x31, 0x28, 0xdf, 0xe3, + 0xe0, 0xf9, 0x0d, 0x1d, 0x66, 0xea, 0x7f, 0x5c, 0x93, 0x19, 0x24, 0xbe, + 0xd9, 0xc6, 0x7d, 0x49, 0x60, 0x67, 0x75, 0xe6, 0x0f, 0x72, 0xd6, 0xa8, + 0xf6, 0x81, 0x8a, 0x65, 0xfa, 0x74, 0x79, 0xc8, 0x0f, 0xcf, 0xc7, 0xd1, + 0xf7, 0xcb, 0xeb, 0xf8, 0x2c, 0xc7, 0x49, 0x5c, 0x1f, 0xf8, 0x08, 0x6c, + 0x73, 0xb3, 0x3b, 0x8f, 0x81, 0xdf, 0x46, 0x79, 0x8b, 0xab, 0x31, 0x8f, + 0x6c, 0xf0, 0x59, 0x1e, 0x82, 0x2e, 0x58, 0x80, 0x3c, 0x4f, 0x41, 0x07, + 0x0e, 0x87, 0xb8, 0x3e, 0x95, 0xad, 0x56, 0xfb, 0xc2, 0x59, 0x75, 0xff, + 0x0e, 0xb6, 0xe3, 0xe8, 0x6b, 0x32, 0x0d, 0xfd, 0x3f, 0x53, 0xeb, 0x52, + 0x77, 0x76, 0xd2, 0x71, 0x9e, 0x09, 0x63, 0x7e, 0x07, 0xfa, 0x7f, 0x0d, + 0x98, 0xb8, 0x19, 0xf4, 0x34, 0x35, 0xaf, 0x3e, 0xa2, 0xe3, 0x50, 0x51, + 0xc6, 0xe6, 0xa1, 0x37, 0x8b, 0x3e, 0xd6, 0x8c, 0xcd, 0x20, 0xfd, 0x0f, + 0x1a, 0x5b, 0x7e, 0x64, 0x9b, 0x2f, 0x6f, 0x3c, 0x07, 0x7e, 0x48, 0x48, + 0x63, 0x7f, 0x4e, 0xb6, 0xf6, 0x57, 0x22, 0x90, 0x39, 0xce, 0xeb, 0x83, + 0x28, 0x47, 0x59, 0xeb, 0xd5, 0x7b, 0xb5, 0x4d, 0x4a, 0x3f, 0x66, 0x21, + 0x4b, 0x79, 0xe5, 0x4b, 0x00, 0xe3, 0xbb, 0xac, 0x77, 0xed, 0x36, 0xee, + 0x85, 0x36, 0x38, 0xca, 0xbf, 0x68, 0x0f, 0x49, 0x90, 0x77, 0x0b, 0xf2, + 0x28, 0x67, 0xef, 0x03, 0x6f, 0x98, 0x97, 0xc1, 0x3b, 0xfb, 0xba, 0x46, + 0xf7, 0xc3, 0x3e, 0x1e, 0x69, 0x5e, 0x3f, 0x26, 0xce, 0xa5, 0x5d, 0xcf, + 0xa5, 0x81, 0x77, 0x52, 0x74, 0xde, 0xfb, 0x74, 0x5e, 0x58, 0xcf, 0xef, + 0x9b, 0xfa, 0x4e, 0x83, 0x7d, 0x38, 0x2d, 0xc1, 0xfa, 0xe4, 0xf8, 0xa2, + 0xaa, 0x5e, 0xda, 0xf2, 0x65, 0xe7, 0x21, 0xf0, 0x23, 0x9c, 0x7a, 0x98, + 0x7b, 0xb4, 0xa0, 0x6f, 0xb0, 0x26, 0xe2, 0xca, 0xf7, 0x4c, 0x98, 0xfe, + 0x59, 0xa6, 0x27, 0xd6, 0xdd, 0x27, 0x08, 0xce, 0x83, 0x3b, 0x32, 0xbe, + 0xca, 0x2b, 0xf2, 0x8d, 0xfc, 0xfa, 0x4d, 0xbc, 0x22, 0x1f, 0xc9, 0xaf, + 0xbc, 0x14, 0x67, 0xc9, 0x27, 0xca, 0xcb, 0xb8, 0x92, 0x97, 0xe2, 0x7c, + 0x80, 0x93, 0xa9, 0x4b, 0x78, 0xd7, 0x61, 0xb3, 0xfd, 0xfb, 0xe0, 0xac, + 0xd8, 0x07, 0x48, 0x3f, 0x63, 0xa4, 0x77, 0x8b, 0x2c, 0xcc, 0x2a, 0x9d, + 0x02, 0xbb, 0x18, 0x57, 0xba, 0x22, 0x3f, 0xc1, 0xf7, 0xfd, 0xa0, 0x11, + 0xcf, 0x97, 0x30, 0xbf, 0x5d, 0xf3, 0xf5, 0x7d, 0xea, 0xbc, 0x13, 0xd7, + 0x60, 0x71, 0xfe, 0x4b, 0xea, 0xfb, 0x99, 0xb9, 0x06, 0x55, 0xfe, 0xcc, + 0xdc, 0xc6, 0x33, 0x4b, 0xcc, 0x7b, 0xbf, 0x9c, 0x9e, 0x15, 0x59, 0x2c, + 0x35, 0xc8, 0xd2, 0xdc, 0x14, 0x7d, 0xc5, 0x54, 0xe3, 0xda, 0xbd, 0x0e, + 0x75, 0x37, 0xae, 0x38, 0xe7, 0xc9, 0x08, 0xe4, 0x66, 0x61, 0x68, 0x46, + 0x2a, 0x43, 0xf4, 0x85, 0xd4, 0x59, 0x42, 0xcc, 0xb7, 0x01, 0x18, 0x18, + 0xb8, 0xd0, 0x61, 0xec, 0x79, 0xab, 0xd6, 0x27, 0x1f, 0x6d, 0x09, 0x62, + 0xd2, 0x95, 0x58, 0xc1, 0xab, 0x38, 0xc1, 0x5d, 0x19, 0xb6, 0xc9, 0xfb, + 0x32, 0xe4, 0x99, 0x89, 0xfa, 0x3c, 0xa3, 0x09, 0x9c, 0xea, 0xbc, 0xaa, + 0x75, 0x5d, 0x10, 0x7b, 0xbf, 0x45, 0xf3, 0xfd, 0x1f, 0xeb, 0xf4, 0x41, + 0x99, 0x3c, 0xfe, 0x25, 0x9e, 0xc3, 0x0f, 0xee, 0x38, 0xd6, 0xdd, 0x6f, + 0x09, 0xeb, 0xbb, 0x1a, 0x0f, 0x22, 0x8f, 0x71, 0xb8, 0x07, 0xd5, 0x9c, + 0x78, 0xd6, 0xaf, 0x20, 0xef, 0x75, 0x66, 0x25, 0xf0, 0x09, 0x79, 0x9e, + 0xaa, 0x49, 0xb7, 0xb7, 0x4b, 0xcb, 0xd2, 0x84, 0x4c, 0xc2, 0xde, 0xe5, + 0xcb, 0x5f, 0x56, 0x67, 0xd0, 0x72, 0xa1, 0xfa, 0x3e, 0x83, 0xf5, 0xe4, + 0xc7, 0x1b, 0x82, 0xb3, 0x10, 0x21, 0xe5, 0x13, 0xad, 0xc6, 0x2e, 0x74, + 0xfe, 0x84, 0xec, 0x2b, 0xab, 0x18, 0x86, 0xda, 0xc3, 0x9c, 0x81, 0x5e, + 0x18, 0x56, 0x36, 0x2d, 0x6a, 0x8c, 0x54, 0x53, 0x92, 0x3f, 0xb5, 0x1b, + 0xfd, 0x30, 0x0e, 0x98, 0xd6, 0x7b, 0x85, 0x7b, 0x65, 0xb2, 0xe6, 0xf7, + 0x3d, 0x55, 0xe6, 0xf7, 0x2e, 0xe0, 0x04, 0x7e, 0xcf, 0xc6, 0xfd, 0x3b, + 0x98, 0xd7, 0xa3, 0x6e, 0x83, 0xa6, 0x33, 0xcf, 0x5f, 0xb3, 0x3e, 0x75, + 0xc0, 0x9b, 0xa0, 0x55, 0x16, 0xdf, 0x59, 0x27, 0x68, 0x6f, 0x0a, 0x76, + 0x8b, 0x3e, 0xfa, 0x03, 0xb2, 0x3c, 0x3f, 0x23, 0x2b, 0xf3, 0x81, 0xac, + 0xf3, 0x2c, 0x36, 0xc7, 0x7e, 0xab, 0xba, 0x63, 0xf9, 0x7c, 0x39, 0x0d, + 0xfe, 0xac, 0xa7, 0x55, 0x76, 0xdd, 0x3d, 0x1b, 0xf4, 0xa6, 0xee, 0x2a, + 0xde, 0xac, 0xce, 0x74, 0xad, 0x5f, 0x73, 0x6c, 0xa7, 0xdf, 0xe2, 0x5e, + 0x87, 0x7f, 0x2e, 0xad, 0xbd, 0xee, 0x7b, 0x4c, 0x9f, 0x05, 0xfb, 0x84, + 0xe5, 0xf3, 0x91, 0xf4, 0x1c, 0xd7, 0xe3, 0x4d, 0x62, 0xfd, 0xb3, 0xcd, + 0x43, 0x9a, 0x6f, 0x48, 0x17, 0x0e, 0xa9, 0x33, 0x77, 0x99, 0x7e, 0x4b, + 0x9f, 0xc5, 0xaf, 0x3f, 0x83, 0xd7, 0x50, 0xd7, 0x1f, 0xeb, 0xd1, 0x2e, + 0x05, 0x67, 0xc1, 0x99, 0x77, 0x5c, 0x9f, 0xf5, 0x3b, 0x53, 0x97, 0x17, + 0x9c, 0x49, 0x23, 0x9d, 0x18, 0xc7, 0x44, 0x5a, 0x1b, 0xd7, 0xcf, 0xe3, + 0x75, 0x77, 0x65, 0x82, 0x36, 0xc3, 0x6c, 0x43, 0x9f, 0x2f, 0xab, 0x3f, + 0x5b, 0xcc, 0xfb, 0x41, 0x94, 0x41, 0x93, 0xf7, 0x88, 0xe9, 0xff, 0x01, + 0xb3, 0x6d, 0x95, 0x29, 0x35, 0x9e, 0x82, 0x3a, 0xb7, 0xc1, 0xfb, 0x33, + 0xc3, 0x96, 0xff, 0x3e, 0xb5, 0xb0, 0x51, 0x3e, 0x99, 0xff, 0xf9, 0x46, + 0x69, 0x2a, 0xa0, 0x1f, 0x7e, 0x5f, 0x7f, 0xff, 0xd4, 0xb7, 0x5d, 0x5c, + 0x97, 0x2e, 0xea, 0xb8, 0xa8, 0xf3, 0x08, 0xe5, 0xbc, 0x50, 0x58, 0x3d, + 0x2f, 0x5a, 0xf0, 0xef, 0x30, 0x99, 0xc1, 0xb9, 0x4d, 0xde, 0x91, 0x16, + 0x39, 0x5f, 0xe5, 0xfd, 0xa4, 0x9b, 0xd5, 0x79, 0x1a, 0x7f, 0x8f, 0x92, + 0xe3, 0xea, 0x56, 0xf6, 0xa0, 0x52, 0x2d, 0xe2, 0x5b, 0x60, 0xd3, 0x23, + 0xda, 0xa6, 0x53, 0x77, 0x8d, 0x42, 0x77, 0x3d, 0xa8, 0xf9, 0xc1, 0xfa, + 0x69, 0x75, 0xce, 0x3b, 0x1d, 0xe3, 0x1e, 0xd9, 0x21, 0x35, 0x17, 0xda, + 0x07, 0xd4, 0xfd, 0x60, 0x48, 0xc5, 0x3a, 0xd5, 0x1d, 0x6c, 0xc8, 0x25, + 0xef, 0x55, 0x43, 0xb7, 0x97, 0x79, 0x7f, 0x7a, 0x14, 0x29, 0xef, 0x4e, + 0xef, 0x56, 0xe7, 0xff, 0x2b, 0xea, 0x4e, 0x40, 0x20, 0x87, 0x21, 0xdd, + 0xd7, 0x31, 0xf4, 0xe1, 0xf3, 0x3b, 0x5f, 0xe6, 0xdd, 0xf7, 0xe0, 0xac, + 0x69, 0xf3, 0x32, 0xd7, 0x82, 0x28, 0xff, 0xde, 0xbf, 0x73, 0x5d, 0x51, + 0xf7, 0x08, 0x12, 0xbc, 0x3f, 0x08, 0xbb, 0xb5, 0x07, 0xcf, 0xdc, 0x5f, + 0xde, 0x8b, 0x14, 0x7a, 0xa7, 0x9a, 0x43, 0x7a, 0xbf, 0x64, 0x55, 0xcc, + 0xaf, 0x05, 0xef, 0x53, 0xaa, 0xef, 0x62, 0xf5, 0x1e, 0x99, 0x3c, 0x75, + 0x2f, 0xef, 0x4b, 0xa8, 0xbb, 0xdf, 0x19, 0x97, 0x63, 0x8c, 0xc9, 0xb4, + 0x9a, 0x77, 0x41, 0xd3, 0x3e, 0xd8, 0x7f, 0xb9, 0xa8, 0xee, 0x66, 0x14, + 0xaa, 0x2d, 0x18, 0xa3, 0xa1, 0xcf, 0x9b, 0xd2, 0x0f, 0x08, 0xe6, 0xdf, + 0xc4, 0x33, 0x8c, 0x1e, 0xf7, 0x10, 0x27, 0xcb, 0x3c, 0x4f, 0xda, 0xa5, + 0xe3, 0x03, 0x8c, 0x1b, 0x72, 0x4f, 0x82, 0xb2, 0xcd, 0x3b, 0xba, 0x59, + 0xa0, 0xb4, 0x38, 0xf7, 0xb8, 0xf5, 0x5c, 0x5a, 0xea, 0xe6, 0xc2, 0x33, + 0xb4, 0xfe, 0x7c, 0x78, 0x1f, 0x22, 0x5f, 0xae, 0xbf, 0x53, 0xa1, 0xee, + 0xa0, 0xf3, 0xee, 0x8c, 0xe4, 0xaa, 0xf7, 0xc9, 0xdd, 0xe5, 0xad, 0xfa, + 0x3e, 0x45, 0x54, 0xee, 0xae, 0xbe, 0xa6, 0x68, 0x9a, 0x57, 0xf7, 0x3a, + 0x22, 0x9a, 0x67, 0xc1, 0x9d, 0x0a, 0xbf, 0xbd, 0x7d, 0xbc, 0xaf, 0xbd, + 0x8a, 0x25, 0x22, 0x92, 0x5b, 0xf8, 0xe3, 0xf0, 0xe6, 0x77, 0x19, 0x1e, + 0x90, 0xcc, 0x29, 0xda, 0xe6, 0x19, 0x79, 0x78, 0xde, 0xf3, 0x6e, 0x75, + 0x89, 0x29, 0x9b, 0x65, 0x25, 0x36, 0xbe, 0xeb, 0x27, 0x4e, 0x9b, 0x51, + 0x99, 0x6d, 0xc4, 0xda, 0x22, 0x8e, 0x91, 0x26, 0xbe, 0x2f, 0xcc, 0x72, + 0x7d, 0x86, 0x31, 0x47, 0xdb, 0xba, 0x22, 0xbf, 0xb6, 0x18, 0x73, 0xbb, + 0x15, 0x3e, 0xec, 0xef, 0xbb, 0xbe, 0x9e, 0xfe, 0xca, 0xe2, 0x6e, 0xf9, + 0x4a, 0x35, 0x6a, 0x54, 0x4a, 0x3c, 0x77, 0x68, 0x8f, 0xce, 0x4b, 0x17, + 0xca, 0xb1, 0x7d, 0xc8, 0x4b, 0xfc, 0x2a, 0x79, 0xfc, 0xf8, 0xdb, 0xde, + 0x15, 0x07, 0xdf, 0xa1, 0x63, 0x56, 0xdc, 0x20, 0xae, 0x38, 0x0e, 0x9f, + 0x95, 0xe5, 0xae, 0x82, 0x1c, 0x00, 0x33, 0x60, 0xcd, 0xd1, 0xbf, 0xbd, + 0xa2, 0xf5, 0x95, 0x79, 0xe4, 0x5a, 0xb9, 0xb2, 0x7a, 0x6e, 0xf9, 0x12, + 0x64, 0x3b, 0xe1, 0xd3, 0x5f, 0xc5, 0xed, 0x0f, 0x48, 0xe8, 0x6b, 0xb0, + 0x25, 0x5f, 0x6b, 0x50, 0x3a, 0x9d, 0x36, 0x0d, 0xbe, 0x0f, 0xfc, 0x9b, + 0x30, 0xda, 0xf9, 0x0b, 0x2d, 0xb3, 0x33, 0x22, 0xdf, 0xd8, 0x22, 0xe9, + 0xed, 0xf4, 0x9f, 0xe5, 0x3d, 0xf4, 0x56, 0xfd, 0x3a, 0x4b, 0xca, 0x37, + 0xb9, 0xc6, 0x6b, 0x9c, 0x4b, 0x57, 0xfc, 0xbf, 0xc9, 0x17, 0x24, 0x17, + 0xe7, 0x5c, 0x1e, 0x90, 0xc2, 0xfc, 0x21, 0xfc, 0x38, 0x4f, 0x8e, 0x7b, + 0x4c, 0x9f, 0x69, 0x18, 0x97, 0x62, 0x29, 0x25, 0xd3, 0x73, 0x53, 0xbc, + 0x6b, 0x3a, 0x7a, 0xab, 0xda, 0xd7, 0xb3, 0xe3, 0x5d, 0x46, 0x5f, 0x62, + 0x9a, 0x67, 0x38, 0xd4, 0x7c, 0xa6, 0x30, 0x9f, 0xdf, 0xdd, 0xce, 0xb3, + 0xeb, 0x57, 0xa0, 0x77, 0xcd, 0x13, 0x94, 0x43, 0xdb, 0xea, 0x34, 0xf8, + 0xbe, 0x17, 0x7e, 0x3b, 0xf3, 0xf6, 0x4a, 0xe8, 0xc8, 0xaa, 0x7e, 0x47, + 0x7e, 0x9f, 0x5a, 0x23, 0x3e, 0xad, 0x3e, 0x83, 0xba, 0x28, 0x77, 0x24, + 0xa8, 0x1b, 0x94, 0x61, 0x5d, 0xce, 0x73, 0xb7, 0x34, 0x9e, 0x0d, 0xc6, + 0x05, 0x39, 0x8c, 0xd7, 0xd3, 0xbb, 0x69, 0x03, 0xbd, 0xc3, 0xc4, 0xba, + 0xa0, 0x17, 0x69, 0x1c, 0xd2, 0x34, 0x2e, 0xa0, 0xfd, 0x80, 0x07, 0xb7, + 0x22, 0xcf, 0xd2, 0x77, 0x92, 0x7e, 0x1b, 0xba, 0x93, 0xe6, 0x2c, 0xff, + 0x17, 0xfa, 0x5e, 0x13, 0xc7, 0xb3, 0x19, 0xcd, 0x97, 0xb6, 0xfb, 0x7c, + 0xd9, 0x0b, 0x7a, 0xf1, 0x7c, 0x69, 0x9f, 0xba, 0x67, 0x90, 0x9e, 0xd8, + 0x0b, 0xd9, 0x09, 0xe6, 0xd5, 0x07, 0x19, 0xe3, 0x9e, 0x09, 0xcb, 0xd7, + 0xd3, 0xc4, 0xb7, 0x77, 0x21, 0xc6, 0x3c, 0x1c, 0xce, 0x15, 0x78, 0xf4, + 0x1b, 0xb4, 0x4d, 0xbc, 0xe7, 0xfe, 0x7e, 0x6d, 0x9b, 0xde, 0x8b, 0xc7, + 0x7f, 0xb2, 0xdd, 0xb7, 0x4d, 0x16, 0x68, 0xd2, 0xaa, 0xeb, 0xec, 0x05, + 0x36, 0x66, 0x2c, 0xb8, 0x2b, 0xfe, 0x59, 0x09, 0xfa, 0xf1, 0x6e, 0xa6, + 0xbf, 0x3b, 0x3c, 0xd8, 0x07, 0xb4, 0xa2, 0xce, 0xee, 0xc4, 0x79, 0x16, + 0xa8, 0xcb, 0xd8, 0xab, 0xce, 0x71, 0xac, 0xbf, 0x47, 0x92, 0x94, 0xc7, + 0xd7, 0x64, 0x65, 0xf4, 0xe7, 0x62, 0x4b, 0xe2, 0x1a, 0xca, 0x0a, 0xdb, + 0x9d, 0xe2, 0x3c, 0xe3, 0xf7, 0xaa, 0x79, 0xc2, 0x4e, 0x8d, 0xf3, 0xcc, + 0x85, 0x65, 0x54, 0xe6, 0xc8, 0x77, 0xa4, 0x8b, 0x7c, 0x0e, 0xf6, 0x78, + 0x95, 0x5e, 0x41, 0xbf, 0xcc, 0xa3, 0x6e, 0xe4, 0xf7, 0x94, 0xde, 0x03, + 0xfe, 0x8f, 0x94, 0x1b, 0x8c, 0xcb, 0x32, 0xe6, 0x17, 0x37, 0x1f, 0xdb, + 0xef, 0x2b, 0x39, 0x78, 0x00, 0x74, 0xef, 0x6c, 0x93, 0xa6, 0x43, 0x48, + 0x39, 0xc7, 0xd4, 0x2a, 0xdf, 0x49, 0xef, 0x4f, 0xca, 0x10, 0xe4, 0x82, + 0xef, 0x0f, 0x00, 0x67, 0xd2, 0x8e, 0x22, 0x9d, 0xe7, 0x33, 0x75, 0xbd, + 0xa3, 0xcf, 0x55, 0x71, 0x2c, 0x7b, 0x31, 0x16, 0x35, 0x4f, 0x2d, 0x4f, + 0x7b, 0x74, 0xbd, 0x89, 0x55, 0x5a, 0xdd, 0xfb, 0x0e, 0x9c, 0x11, 0x59, + 0xc5, 0x19, 0x7e, 0x5f, 0x5b, 0xda, 0x02, 0x8c, 0xe1, 0xcf, 0xc1, 0xc7, + 0x18, 0xbe, 0x9c, 0x4f, 0x49, 0x18, 0x72, 0x1c, 0x5a, 0x93, 0x63, 0xe0, + 0x1d, 0x7f, 0xcd, 0x4c, 0x73, 0xdf, 0x4d, 0xd1, 0x99, 0x72, 0x48, 0xf9, + 0x25, 0x1f, 0xeb, 0x79, 0xfd, 0xb1, 0xdf, 0xc0, 0xeb, 0x4f, 0xb5, 0x05, + 0xb8, 0xe1, 0xef, 0xb6, 0x0e, 0x32, 0x6d, 0x6b, 0xeb, 0xe0, 0xda, 0xff, + 0x47, 0xeb, 0x60, 0xa3, 0x5c, 0xd6, 0xcb, 0x94, 0x05, 0x79, 0x22, 0xbf, + 0x28, 0x4f, 0x94, 0x23, 0xd2, 0x92, 0xfa, 0xb4, 0x91, 0x7e, 0x5b, 0xfc, + 0xb2, 0xda, 0x0b, 0x9c, 0x81, 0x0e, 0x6a, 0x33, 0xe6, 0xe7, 0x63, 0x52, + 0x5c, 0x7c, 0x56, 0xc9, 0xf4, 0xe3, 0x35, 0xea, 0xa5, 0x77, 0x9b, 0xfb, + 0x7a, 0x9d, 0x9b, 0xdf, 0xa0, 0x73, 0xf3, 0xab, 0x3a, 0x77, 0xbb, 0xf6, + 0xd5, 0xfe, 0x2e, 0x3a, 0x37, 0x56, 0xb7, 0x2f, 0x14, 0xec, 0x09, 0x89, + 0x91, 0xe9, 0x6d, 0x92, 0x5d, 0xb0, 0x23, 0xa3, 0xa5, 0xdd, 0xf2, 0x07, + 0xa5, 0x19, 0x75, 0x5e, 0xea, 0x87, 0x6e, 0x57, 0xfc, 0x1e, 0xc3, 0x93, + 0x4f, 0xc2, 0xd7, 0xce, 0x75, 0x34, 0xc8, 0xae, 0x1b, 0xd4, 0x5e, 0xa7, + 0x95, 0x31, 0xda, 0x85, 0x11, 0xf8, 0xac, 0x6b, 0xbb, 0x09, 0x83, 0x67, + 0xe7, 0x1a, 0x25, 0x17, 0x6b, 0x91, 0xdd, 0xc0, 0x4e, 0x85, 0xab, 0x89, + 0x7b, 0x9a, 0xd5, 0xbd, 0xa4, 0xe7, 0xcb, 0x55, 0xcd, 0x77, 0xd0, 0xa1, + 0xd5, 0x92, 0x3f, 0xaa, 0x55, 0xdb, 0xfc, 0xff, 0x81, 0x32, 0xb0, 0xe1, + 0x9d, 0xcf, 0x77, 0xc0, 0x8f, 0x8b, 0x81, 0x56, 0xf5, 0xe7, 0x90, 0x42, + 0x8a, 0x9e, 0xc5, 0xf9, 0x09, 0x75, 0xbe, 0xeb, 0x72, 0x88, 0xf4, 0x52, + 0xbe, 0x53, 0x3c, 0x13, 0x02, 0xc6, 0x99, 0x05, 0x82, 0x76, 0xe8, 0x6f, + 0x6a, 0xdc, 0x09, 0xfd, 0x3f, 0x39, 0xab, 0xee, 0x51, 0x81, 0x36, 0x9e, + 0x8a, 0x3b, 0xe7, 0x63, 0xc4, 0xf3, 0x6b, 0x67, 0x99, 0xdf, 0x89, 0xeb, + 0x15, 0xa6, 0x0f, 0xf6, 0x40, 0x74, 0x9c, 0x4a, 0xfb, 0xff, 0x6a, 0x5f, + 0x6f, 0x23, 0xad, 0x02, 0xbf, 0x9f, 0xf7, 0xf8, 0x89, 0xed, 0xec, 0xc3, + 0xf3, 0xf2, 0x94, 0xf2, 0x41, 0xd3, 0xa4, 0x6f, 0x05, 0x7c, 0x3a, 0x1a, + 0x0f, 0xec, 0xb9, 0xd1, 0x79, 0xae, 0xde, 0x07, 0x65, 0x1b, 0x51, 0x75, + 0x0e, 0x64, 0xed, 0xff, 0xf0, 0x30, 0xb6, 0x94, 0x36, 0x6e, 0x2f, 0xcf, + 0x48, 0xe8, 0xd8, 0xb8, 0x84, 0x8f, 0x32, 0x8e, 0x9f, 0x96, 0x62, 0xcc, + 0x93, 0xbb, 0xdd, 0xf5, 0x3e, 0x49, 0xa7, 0xb9, 0x71, 0xec, 0x0f, 0xc8, + 0xf0, 0xa9, 0x43, 0x12, 0x39, 0xc6, 0x6f, 0xeb, 0xf6, 0x70, 0xa0, 0x8f, + 0x9a, 0x65, 0x3e, 0xc6, 0x58, 0x76, 0x44, 0xdd, 0xa5, 0x5e, 0x99, 0x78, + 0x2d, 0x52, 0x04, 0x56, 0xc8, 0x2b, 0xdd, 0x82, 0x74, 0xd5, 0x87, 0x68, + 0xbe, 0x8a, 0x6b, 0x0a, 0x7e, 0xa6, 0x91, 0x9b, 0x8f, 0xf8, 0xe7, 0x92, + 0x62, 0x2c, 0x7b, 0x08, 0xfe, 0x36, 0x71, 0x06, 0x74, 0xc7, 0xb8, 0x34, + 0xf1, 0x3d, 0x74, 0x6c, 0x0d, 0x67, 0x50, 0x27, 0x0c, 0xbb, 0x31, 0x09, + 0x9f, 0xf6, 0xe7, 0xce, 0x7f, 0xde, 0x63, 0x9e, 0xdc, 0x2d, 0xa1, 0xa3, + 0x7c, 0xae, 0xf7, 0x83, 0x88, 0xdd, 0x61, 0x1b, 0xce, 0x7d, 0x19, 0xed, + 0xf1, 0x5b, 0x5a, 0xdf, 0xc3, 0xc5, 0x7b, 0xe5, 0x6f, 0xfa, 0x3f, 0x01, + 0x28, 0xfb, 0xff, 0x17, 0xf3, 0x16, 0x61, 0x19, 0xcc, 0x4c, 0x00, 0x00, + 0x00 }; + +static const u32 bnx2_COM_b06FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_COM_b06FwRodata[(0x14/4) + 1] = { + 0x08000d98, 0x08000de0, 0x08000e20, 0x08000e6c, 0x08000ea0, 0x00000000 +}; + +static struct fw_info bnx2_com_fw_06 = { + /* Firmware version: 5.0.0j9 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000110, + + .text_addr = 0x08000000, + .text_len = 0x4cc8, + .text_index = 0x0, + .gz_text = bnx2_COM_b06FwText, + .gz_text_len = sizeof(bnx2_COM_b06FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_COM_b06FwData, + + .sbss_addr = 0x08004d00, + .sbss_len = 0x38, + .sbss_index = 0x0, + + .bss_addr = 0x08004d38, + .bss_len = 0xc4, + .bss_index = 0x0, + + .rodata_addr = 0x08004cc8, + .rodata_len = 0x14, + .rodata_index = 0x0, + .rodata = bnx2_COM_b06FwRodata, +}; + +/* Initialized Values for the Completion Processor. */ +static const struct cpu_reg cpu_reg_com = { + .mode = BNX2_COM_CPU_MODE, + .mode_value_halt = BNX2_COM_CPU_MODE_SOFT_HALT, + .mode_value_sstep = BNX2_COM_CPU_MODE_STEP_ENA, + .state = BNX2_COM_CPU_STATE, + .state_value_clear = 0xffffff, + .gpr0 = BNX2_COM_CPU_REG_FILE, + .evmask = BNX2_COM_CPU_EVENT_MASK, + .pc = BNX2_COM_CPU_PROGRAM_COUNTER, + .inst = BNX2_COM_CPU_INSTRUCTION, + .bp = BNX2_COM_CPU_HW_BREAKPOINT, + .spad_base = BNX2_COM_SCRATCH, + .mips_view_base = 0x8000000, +}; + +static u8 bnx2_CP_b06FwText[] = { + 0xbd, 0xbc, 0x7d, 0x78, 0x13, 0xe7, 0x99, 0x2f, 0xfc, 0x9b, 0x91, 0x64, + 0xcb, 0xdf, 0x63, 0x23, 0x88, 0x48, 0xbd, 0xa0, 0xc1, 0x23, 0x5b, 0xc4, + 0x4e, 0x3a, 0x02, 0x93, 0x28, 0x59, 0x35, 0x56, 0x8d, 0x01, 0x13, 0x68, + 0x62, 0xb6, 0x6c, 0xeb, 0xf4, 0xe5, 0x6d, 0x14, 0x30, 0xe0, 0x10, 0x92, + 0x3a, 0xdb, 0xec, 0x7b, 0x9c, 0xbd, 0xb2, 0x6b, 0xd5, 0x18, 0x30, 0x20, + 0x4b, 0xb6, 0x71, 0x80, 0xec, 0xe9, 0xb5, 0x31, 0x18, 0x30, 0x69, 0x65, + 0x8b, 0xa6, 0xd9, 0xd6, 0xdd, 0x43, 0x4f, 0x74, 0x80, 0x24, 0x26, 0x09, + 0x09, 0xdd, 0xe6, 0xcd, 0xc9, 0xf6, 0xe4, 0xda, 0xf8, 0xe4, 0x83, 0xd0, + 0x36, 0x4d, 0xd8, 0x7e, 0x64, 0xa1, 0x1f, 0x99, 0xf7, 0x77, 0x8f, 0x2c, + 0x70, 0xd2, 0xb4, 0xdb, 0x3d, 0x7f, 0xbc, 0xba, 0xae, 0xb9, 0xa4, 0x19, + 0x3d, 0x1f, 0xf7, 0x73, 0x3f, 0xf7, 0xfd, 0xbb, 0x7f, 0xf7, 0x33, 0xcf, + 0xcc, 0x02, 0xa0, 0x10, 0xd3, 0x9f, 0x12, 0x1e, 0x37, 0x2c, 0xe9, 0xd8, + 0xb0, 0xc5, 0xbc, 0xc1, 0xe4, 0xcf, 0x9b, 0x9d, 0x80, 0x0b, 0x7f, 0xe2, + 0xc7, 0xf7, 0xa7, 0x16, 0x9c, 0xfe, 0x28, 0x3c, 0x6a, 0x3f, 0x76, 0xcd, + 0x01, 0x68, 0x39, 0x39, 0xe4, 0x80, 0x5b, 0x0d, 0x9f, 0xfe, 0x52, 0xa3, + 0x01, 0xb7, 0x23, 0xdc, 0x7f, 0xf7, 0x06, 0x03, 0x88, 0xa4, 0x6a, 0x7d, + 0x4b, 0xf1, 0x3b, 0x2b, 0xe6, 0x71, 0x42, 0xae, 0xff, 0x59, 0xf8, 0xb7, + 0x5d, 0xdf, 0xbf, 0x49, 0xbf, 0x38, 0xec, 0x80, 0x5b, 0x0b, 0xf7, 0x42, + 0xab, 0x86, 0xbb, 0x92, 0x75, 0xbe, 0x5e, 0x73, 0x54, 0x41, 0x69, 0xae, + 0xad, 0x0b, 0xd6, 0xf7, 0x6b, 0xbc, 0xd1, 0x82, 0xb0, 0x86, 0xa7, 0xd2, + 0x68, 0xa9, 0xeb, 0xeb, 0xb2, 0x4a, 0x8c, 0x20, 0xdc, 0x86, 0xd1, 0xda, + 0xa7, 0x14, 0x87, 0xb6, 0x2c, 0x41, 0x71, 0xbe, 0x81, 0xd8, 0xb5, 0x61, + 0xb4, 0x5c, 0x37, 0x56, 0x18, 0x73, 0x86, 0xdd, 0x68, 0x4e, 0xbb, 0x63, + 0x9f, 0x0a, 0x1b, 0x58, 0x91, 0x5e, 0x52, 0x80, 0x52, 0x0d, 0x3d, 0xe9, + 0x4b, 0xee, 0x6c, 0x7b, 0xcb, 0xa6, 0xbf, 0x5f, 0xab, 0xc8, 0x7e, 0xcf, + 0x89, 0x3a, 0xc3, 0xc0, 0xf6, 0xb8, 0x65, 0xe5, 0x85, 0x3f, 0xff, 0x79, + 0x35, 0x6c, 0x78, 0x8f, 0x62, 0x05, 0xd6, 0x6b, 0x78, 0x78, 0x47, 0xfd, + 0xcf, 0x95, 0x93, 0x43, 0x75, 0x88, 0x8d, 0x3a, 0x10, 0xd1, 0x5e, 0xe0, + 0xf7, 0xbc, 0x79, 0xad, 0xa1, 0x3a, 0x1c, 0x18, 0xbd, 0xc4, 0xeb, 0x4e, + 0xfb, 0xda, 0xb6, 0xfd, 0xf3, 0xe6, 0xdd, 0x19, 0x7a, 0x01, 0x8f, 0x8e, + 0xca, 0xef, 0xcd, 0xe8, 0xaa, 0x53, 0x30, 0xf5, 0xf9, 0x4d, 0x70, 0x18, + 0x75, 0xe8, 0xd9, 0xaf, 0x38, 0xbb, 0xeb, 0x54, 0x44, 0x3c, 0x7a, 0x20, + 0x0a, 0x38, 0x9d, 0x06, 0xa2, 0xf9, 0xe1, 0x90, 0xf3, 0xc7, 0xf1, 0xb0, + 0xe6, 0x30, 0x2c, 0x2b, 0x10, 0x9c, 0x0f, 0x47, 0xb9, 0x65, 0x7d, 0xcf, + 0xd4, 0xe0, 0xfb, 0xe2, 0x8b, 0x88, 0x8d, 0xb4, 0x40, 0x35, 0x5e, 0x44, + 0xf7, 0xc8, 0x8b, 0x78, 0x6c, 0x6f, 0x19, 0xdb, 0x79, 0x01, 0xdb, 0x47, + 0xa5, 0x5f, 0x7e, 0xef, 0xe7, 0xd8, 0x93, 0x22, 0x4b, 0x3d, 0x8f, 0xf3, + 0x3c, 0xe0, 0x56, 0xc2, 0x31, 0xf8, 0x53, 0x6e, 0x4c, 0x39, 0xbc, 0xf8, + 0x7e, 0x8d, 0xd4, 0xf9, 0x95, 0x35, 0xf5, 0xc5, 0xe9, 0xf2, 0x33, 0xea, + 0xf4, 0xfc, 0x91, 0x3a, 0xb1, 0x91, 0x30, 0x9e, 0x8f, 0x2b, 0xd8, 0x12, + 0x2c, 0x45, 0xa4, 0x5c, 0xf4, 0x61, 0x59, 0xa3, 0xe6, 0xbf, 0x5a, 0x53, + 0x9a, 0xc8, 0x32, 0x89, 0x17, 0xf8, 0xdf, 0x8e, 0xe0, 0x6b, 0x56, 0xc6, + 0x23, 0xed, 0x3f, 0x48, 0x5b, 0x5b, 0xc3, 0xeb, 0x4e, 0x24, 0xe3, 0x88, + 0x96, 0x86, 0xbf, 0xc8, 0x73, 0xdd, 0x7c, 0x4f, 0x71, 0xbb, 0xdf, 0x8f, + 0xbb, 0xbf, 0x58, 0x62, 0xa8, 0x0f, 0x96, 0xc1, 0x89, 0xb3, 0x1c, 0xd3, + 0x84, 0xb9, 0x09, 0x2e, 0xe3, 0xaf, 0xc5, 0x36, 0x39, 0xee, 0x17, 0x2c, + 0x5c, 0x93, 0xab, 0x2f, 0xed, 0x6a, 0xd8, 0x91, 0xb4, 0xac, 0x5d, 0x66, + 0xe4, 0xe6, 0x02, 0x1a, 0xcc, 0xa9, 0x78, 0x0b, 0xdc, 0x61, 0xbf, 0xef, + 0x02, 0x42, 0x58, 0x9a, 0xf6, 0xe0, 0xe9, 0x38, 0x9c, 0x8d, 0x35, 0x95, + 0xe8, 0x4e, 0x87, 0xb1, 0x2c, 0x6d, 0xa2, 0x29, 0xfd, 0x1f, 0x5b, 0xe3, + 0xaa, 0xa4, 0x8f, 0x63, 0xf8, 0x9d, 0x95, 0x1d, 0x83, 0x8c, 0x4f, 0xbe, + 0x39, 0xef, 0xc9, 0x6b, 0xb1, 0x7b, 0xc8, 0xc0, 0x4e, 0xce, 0xef, 0xca, + 0x60, 0x26, 0x52, 0x00, 0xdd, 0xbc, 0x80, 0x30, 0x96, 0xa7, 0x0d, 0xce, + 0x79, 0x18, 0x4b, 0x93, 0x55, 0xda, 0x08, 0x16, 0x22, 0xe2, 0xcd, 0xfa, + 0xc0, 0x1e, 0x8e, 0x77, 0xbd, 0xbf, 0x05, 0x25, 0xb4, 0xa1, 0xd4, 0x92, + 0x10, 0x1a, 0xd9, 0xff, 0xea, 0x3f, 0xa1, 0xff, 0x3b, 0xd8, 0xff, 0x7b, + 0xec, 0x3f, 0x63, 0xf7, 0x0f, 0xe7, 0x6d, 0x3c, 0x77, 0xd3, 0x5e, 0x77, + 0xa7, 0x9c, 0xce, 0x95, 0x49, 0x0f, 0x76, 0xa5, 0x4c, 0xda, 0xa4, 0xfc, + 0xe5, 0xc5, 0x8e, 0xa1, 0x4a, 0xec, 0x1c, 0xd2, 0xbd, 0xcf, 0xf2, 0xf7, + 0xb6, 0xc3, 0xd7, 0x62, 0xfb, 0x90, 0x82, 0x43, 0xc6, 0xb5, 0xe8, 0xe6, + 0xef, 0x03, 0x43, 0xf3, 0xf0, 0xe8, 0x90, 0x03, 0xa1, 0x59, 0x33, 0xc7, + 0x21, 0xdf, 0xd7, 0x22, 0x76, 0xd8, 0x87, 0xee, 0xf8, 0x2b, 0xb6, 0x0e, + 0x4b, 0xc2, 0xcf, 0xe6, 0xfc, 0x9e, 0xbe, 0xe5, 0xc3, 0x86, 0xb8, 0x17, + 0xdd, 0x49, 0xf1, 0x13, 0x37, 0x6d, 0x57, 0xfc, 0xe4, 0x43, 0xa0, 0x94, + 0xed, 0xa7, 0x73, 0xff, 0x2b, 0x70, 0x72, 0xde, 0xda, 0xf8, 0xdf, 0xae, + 0xa4, 0xd8, 0x45, 0xce, 0x06, 0xe4, 0x77, 0x05, 0xed, 0xb2, 0x10, 0xbe, + 0x23, 0x85, 0x08, 0x3c, 0xa2, 0xe1, 0xed, 0x7a, 0xb9, 0x4e, 0x7f, 0x08, + 0x4a, 0x99, 0x7e, 0x1c, 0x4d, 0x89, 0x1f, 0xfb, 0xd0, 0x18, 0x9f, 0x64, + 0xfb, 0xf5, 0x6c, 0xdb, 0xc4, 0x7f, 0x4f, 0xd7, 0xe1, 0xbb, 0xe9, 0x00, + 0xbe, 0x43, 0x3d, 0xfe, 0x63, 0xda, 0x87, 0x27, 0xd3, 0x95, 0xf8, 0x76, + 0xda, 0x8b, 0x27, 0x38, 0x7f, 0xdf, 0x4a, 0xb7, 0xd0, 0x37, 0x34, 0x1c, + 0x4f, 0x8b, 0xfe, 0xf3, 0x38, 0xde, 0x42, 0x6c, 0x1b, 0xaa, 0x0a, 0x9c, + 0xa2, 0x6d, 0x7d, 0xc7, 0xbc, 0x0d, 0x99, 0x0a, 0xb6, 0x91, 0xf4, 0x62, + 0x17, 0xaf, 0xef, 0x1e, 0xaa, 0x8a, 0x5c, 0xa7, 0x58, 0x96, 0x1a, 0xac, + 0x0d, 0x9d, 0x54, 0x55, 0x4c, 0x79, 0x74, 0x5f, 0x46, 0xd5, 0x7d, 0x11, + 0x02, 0x57, 0x9c, 0xbe, 0x13, 0x9b, 0xad, 0x0f, 0xc7, 0x68, 0x53, 0x1e, + 0x63, 0x8c, 0xe3, 0xd1, 0x7d, 0x31, 0x55, 0xc3, 0xce, 0xa4, 0x7e, 0x20, + 0xa6, 0x7a, 0x10, 0x4b, 0x17, 0xe2, 0x67, 0x43, 0x7a, 0x6f, 0x4c, 0xbd, + 0x1d, 0xb1, 0x0a, 0xcb, 0x7a, 0x22, 0x88, 0x8e, 0x6b, 0xc2, 0x88, 0xcc, + 0x0e, 0x23, 0x3a, 0x2f, 0x5c, 0x89, 0x64, 0x12, 0x78, 0xaf, 0xcf, 0xf0, + 0xfe, 0x4f, 0xa5, 0x05, 0x7f, 0xdd, 0xa2, 0xfb, 0x7c, 0x6a, 0x6d, 0x6c, + 0x44, 0x5d, 0x42, 0x97, 0x87, 0xcf, 0x1b, 0x5e, 0x81, 0x4e, 0xfb, 0x9a, + 0x02, 0xcd, 0xf0, 0x60, 0x5b, 0xf2, 0x66, 0x44, 0x3d, 0x55, 0xad, 0x03, + 0x6a, 0xd5, 0x25, 0x53, 0xd5, 0x27, 0x5b, 0x54, 0xcb, 0xfa, 0xb7, 0xc5, + 0xef, 0x59, 0xbe, 0x39, 0x96, 0xb5, 0x68, 0xb1, 0xf4, 0xe9, 0x43, 0x79, + 0xd8, 0xc4, 0x1a, 0x7b, 0x0e, 0x0b, 0x71, 0x7e, 0xa8, 0x82, 0x7d, 0x68, + 0xf8, 0x7f, 0x6f, 0xd2, 0x03, 0x9b, 0xd4, 0x42, 0xbc, 0x7d, 0xb8, 0x10, + 0x6f, 0x70, 0x3c, 0x3f, 0x1f, 0xf2, 0xe2, 0x97, 0x43, 0x96, 0xf5, 0x45, + 0xf3, 0xcf, 0x31, 0x58, 0xd1, 0x8f, 0xef, 0x8e, 0x7b, 0xf0, 0xb3, 0xb8, + 0x86, 0xb7, 0xe2, 0x91, 0x07, 0x66, 0x41, 0x8f, 0x8c, 0x2b, 0xa7, 0xee, + 0x2a, 0x45, 0x6d, 0x4b, 0xa9, 0xa2, 0x37, 0xef, 0x81, 0xee, 0xbd, 0x4e, + 0xf1, 0xe0, 0x42, 0x4a, 0xc3, 0x9b, 0xa9, 0xaa, 0xd0, 0x0f, 0xd9, 0xe7, + 0x07, 0xe6, 0xf7, 0xac, 0xcc, 0x1c, 0xd1, 0x9b, 0xe8, 0x88, 0x7a, 0xa6, + 0xff, 0x7e, 0x37, 0x49, 0x3d, 0x27, 0xa9, 0x67, 0xca, 0xf0, 0x64, 0x92, + 0x7a, 0xa6, 0xee, 0x9e, 0xa0, 0x4d, 0x7d, 0x8b, 0xf3, 0x78, 0xdc, 0x9e, + 0xc7, 0x10, 0xe7, 0xeb, 0x53, 0xf8, 0x3b, 0x1b, 0x7b, 0x5f, 0xb0, 0xfe, + 0x8b, 0x47, 0xc6, 0x54, 0x33, 0x27, 0x8b, 0x6f, 0x32, 0xb6, 0xe7, 0xad, + 0xa8, 0x26, 0xe3, 0x92, 0xf1, 0xd9, 0xfa, 0xf3, 0x75, 0x28, 0x03, 0x0a, + 0x0a, 0x2d, 0x6b, 0xaf, 0x39, 0xfd, 0xbf, 0x27, 0x37, 0xbe, 0xff, 0x5b, + 0xc9, 0xda, 0xd5, 0x3f, 0xe4, 0x53, 0xdf, 0x81, 0x88, 0xba, 0x86, 0xe7, + 0x7a, 0x2c, 0x82, 0x55, 0x8e, 0x8f, 0x9e, 0xbf, 0xef, 0x91, 0xf9, 0xf0, + 0x5d, 0x39, 0xa7, 0x3d, 0xda, 0xfd, 0x7d, 0x95, 0xe7, 0x32, 0x16, 0xb1, + 0x45, 0xb1, 0x01, 0x0f, 0xed, 0xe5, 0xe6, 0xe9, 0xff, 0x10, 0x53, 0xc3, + 0x1d, 0x68, 0xa9, 0x7f, 0xd2, 0xee, 0x23, 0x2f, 0x21, 0x7e, 0xa3, 0xe0, + 0xbd, 0x9b, 0x15, 0x9c, 0x0c, 0x1a, 0xb4, 0x99, 0x63, 0xc4, 0x05, 0x20, + 0x3f, 0x01, 0x77, 0x71, 0x38, 0x8c, 0x78, 0x1f, 0xdc, 0x05, 0xe1, 0x10, + 0x16, 0xf6, 0x55, 0xb5, 0x9f, 0x87, 0x1e, 0xe8, 0x53, 0xf4, 0x16, 0xc6, + 0x1c, 0x73, 0x8c, 0x7a, 0xbc, 0x4e, 0xd1, 0x7d, 0x79, 0x8a, 0xe0, 0x59, + 0x98, 0x78, 0x76, 0x0c, 0x3b, 0xd3, 0xf2, 0x3b, 0x04, 0x23, 0x85, 0xe9, + 0xb8, 0x21, 0x76, 0xdf, 0x41, 0xbb, 0x3f, 0xcf, 0xb1, 0xeb, 0x3e, 0xe2, + 0xaf, 0xdb, 0x15, 0x6e, 0xc7, 0x91, 0x38, 0xdc, 0x79, 0xe1, 0xad, 0x78, + 0x26, 0xfe, 0x9d, 0xd9, 0xb9, 0x72, 0x0a, 0xcb, 0xf9, 0x52, 0x33, 0x65, + 0xf9, 0x57, 0x2b, 0xe2, 0xc9, 0xca, 0x52, 0x98, 0x38, 0x86, 0x3d, 0x49, + 0xa9, 0x1b, 0xb6, 0xeb, 0x3a, 0xd9, 0x47, 0x4f, 0xbc, 0xaa, 0x79, 0x95, + 0xa2, 0x87, 0x1e, 0xe7, 0xfc, 0x75, 0xa3, 0x36, 0xf2, 0x63, 0xe8, 0x5a, + 0x3b, 0xb2, 0xb2, 0xd4, 0xa4, 0xb2, 0x72, 0x2c, 0xa0, 0x1c, 0x77, 0x25, + 0x61, 0xcd, 0x35, 0x50, 0xec, 0x35, 0x0c, 0xdf, 0x65, 0x47, 0x05, 0x0e, + 0x70, 0x7e, 0x7a, 0xe8, 0x2b, 0x82, 0x67, 0xf7, 0xed, 0xf5, 0xa1, 0xd8, + 0xb0, 0x70, 0x34, 0x58, 0x81, 0x17, 0x88, 0xb5, 0xa5, 0xf4, 0xcd, 0x17, + 0x35, 0x44, 0xe6, 0x86, 0x43, 0xca, 0x9d, 0xe9, 0xb1, 0xe9, 0x39, 0xf8, + 0x8b, 0xe9, 0x18, 0xf5, 0xf1, 0xeb, 0x73, 0x95, 0x4f, 0xbe, 0x0e, 0xa5, + 0x35, 0xa9, 0x07, 0x62, 0xb0, 0x50, 0xb6, 0x58, 0xf7, 0x4d, 0x29, 0x97, + 0x54, 0x94, 0x12, 0xab, 0xd3, 0x1f, 0x2f, 0x57, 0xab, 0x1d, 0xa6, 0x9a, + 0x1c, 0x46, 0x01, 0x75, 0xae, 0x93, 0x29, 0x44, 0x02, 0x2e, 0xfb, 0x9a, + 0x03, 0xc3, 0xce, 0x88, 0xd7, 0x81, 0xdf, 0x5a, 0x91, 0xb5, 0x72, 0xad, + 0x10, 0xd1, 0x96, 0x5a, 0xaf, 0x13, 0xb5, 0xa1, 0xed, 0xf4, 0xc1, 0xa9, + 0xb5, 0x8d, 0xfc, 0xcf, 0x6f, 0x9e, 0x42, 0x95, 0x6f, 0x3b, 0xe4, 0xf7, + 0x65, 0xda, 0x4d, 0xa3, 0xd4, 0x65, 0x19, 0xb1, 0x43, 0x5d, 0x13, 0x1f, + 0xef, 0x31, 0x2d, 0xeb, 0x88, 0x39, 0xa1, 0x34, 0x26, 0x3f, 0xb4, 0x22, + 0xce, 0x58, 0x24, 0x3f, 0xec, 0x37, 0x77, 0x12, 0x8c, 0x1d, 0xe1, 0x98, + 0x12, 0x49, 0xf7, 0x28, 0xcb, 0xd2, 0xbd, 0xca, 0xf2, 0xb4, 0x94, 0x9f, + 0x50, 0x96, 0xa6, 0xa5, 0x7c, 0xae, 0x6c, 0x88, 0x65, 0x81, 0xa3, 0x71, + 0x7f, 0x20, 0x57, 0x7e, 0x39, 0xcb, 0x2e, 0xbb, 0x52, 0x36, 0x44, 0x5b, + 0x35, 0x39, 0x2f, 0x45, 0xd8, 0xa4, 0xe9, 0x91, 0x18, 0x75, 0xce, 0x78, + 0xba, 0xee, 0x1d, 0x23, 0x13, 0x70, 0x70, 0x0e, 0x46, 0x39, 0xb2, 0x26, + 0xe2, 0xdc, 0x06, 0xc3, 0x85, 0x5e, 0xad, 0x0c, 0x1b, 0xcc, 0x5f, 0x5b, + 0x9b, 0xd6, 0xca, 0x7f, 0x59, 0xd9, 0x60, 0x97, 0x0f, 0xb3, 0xbc, 0x6e, + 0x8e, 0x4e, 0x63, 0xeb, 0xc9, 0x38, 0xfa, 0x1d, 0x61, 0x62, 0x7e, 0xbd, + 0xdf, 0xd7, 0x0d, 0x99, 0x1b, 0x1f, 0x96, 0x51, 0x96, 0x61, 0xe7, 0x4c, + 0xfc, 0x45, 0xec, 0x6a, 0x19, 0xb9, 0x26, 0xe5, 0xa6, 0x68, 0xdf, 0x82, + 0x75, 0x96, 0x35, 0x60, 0x8a, 0x9d, 0x7b, 0x69, 0xe7, 0xb3, 0xe1, 0xab, + 0xd0, 0x63, 0xc3, 0xac, 0x70, 0x24, 0x3e, 0x0b, 0xc3, 0x9a, 0x4a, 0xcc, + 0x7d, 0xb8, 0x18, 0xa5, 0x11, 0x25, 0x8f, 0xdc, 0x07, 0xe3, 0x32, 0xce, + 0x12, 0x44, 0x9c, 0x7a, 0x40, 0xe6, 0x2e, 0x8f, 0x31, 0xaf, 0x5a, 0x65, + 0xbd, 0x2b, 0xbe, 0x2c, 0x63, 0xf6, 0xd1, 0x97, 0x63, 0xb6, 0x8e, 0x9a, + 0xae, 0x8c, 0x5b, 0xda, 0xcb, 0xe9, 0xe8, 0x3f, 0x53, 0xcf, 0xb2, 0x76, + 0x5c, 0xd1, 0x6d, 0x5e, 0xa4, 0x80, 0xba, 0x3d, 0x16, 0xf7, 0x87, 0xce, + 0x20, 0xa6, 0x34, 0xa7, 0x9d, 0x38, 0x1c, 0x97, 0x7a, 0x3d, 0x2c, 0xdf, + 0xab, 0xac, 0xb8, 0x52, 0x67, 0x6a, 0xda, 0x6f, 0x65, 0x3c, 0x32, 0xbe, + 0x5b, 0xb1, 0x61, 0xaf, 0x1e, 0x8b, 0x41, 0xec, 0x2a, 0x82, 0xf5, 0xa6, + 0xee, 0x03, 0xca, 0x68, 0x37, 0x40, 0x79, 0xe2, 0x01, 0x77, 0x16, 0x03, + 0x80, 0xcd, 0x7b, 0x5b, 0x38, 0x56, 0x0b, 0x6f, 0x9b, 0x15, 0x38, 0x4c, + 0x2f, 0x2d, 0x4b, 0xc8, 0xf5, 0x99, 0x32, 0x86, 0x95, 0xf5, 0xa3, 0xc1, + 0x02, 0x14, 0x8a, 0x9c, 0x3b, 0xd5, 0xac, 0xfd, 0x7e, 0x52, 0xfd, 0x9f, + 0x5b, 0x87, 0x3d, 0xd9, 0x6b, 0x65, 0x09, 0xe1, 0x84, 0x2d, 0xd0, 0x12, + 0xc5, 0x8c, 0x77, 0x31, 0xab, 0xc8, 0xd0, 0x5b, 0x2e, 0x2a, 0x5d, 0xb8, + 0x3d, 0xa8, 0x47, 0x7f, 0xa4, 0xe8, 0x91, 0x3e, 0xc5, 0xa0, 0x1f, 0x06, + 0xb0, 0x32, 0xfd, 0xf1, 0xbe, 0x5e, 0x81, 0x7a, 0x44, 0xfa, 0x91, 0xfe, + 0xce, 0xa1, 0xd7, 0x1e, 0x53, 0x6e, 0x3c, 0x32, 0x36, 0x05, 0x9b, 0xec, + 0x31, 0xb5, 0xd8, 0xfe, 0xf1, 0x03, 0xd3, 0x85, 0xb6, 0xbd, 0x27, 0x17, + 0x8a, 0x81, 0x6c, 0x1c, 0x8d, 0x60, 0x5b, 0xbd, 0x0b, 0x1b, 0x46, 0xee, + 0x54, 0x45, 0x36, 0xa8, 0x8b, 0x0b, 0xb2, 0xdf, 0x0a, 0x79, 0x4b, 0x31, + 0xd6, 0xa7, 0x39, 0x77, 0xc4, 0xd0, 0xf5, 0xa3, 0x32, 0xb7, 0x15, 0xfc, + 0x96, 0xb9, 0xf5, 0xf0, 0x5b, 0xe6, 0x79, 0x0e, 0xbf, 0xcb, 0xe0, 0x9b, + 0x23, 0xb2, 0xd4, 0x23, 0xbe, 0x1f, 0xee, 0xa2, 0x70, 0x27, 0xee, 0xed, + 0xb3, 0xac, 0x5e, 0xbf, 0x65, 0x15, 0x04, 0xc9, 0xb3, 0xfc, 0xb5, 0xa1, + 0xeb, 0x94, 0x3c, 0x4c, 0x69, 0xf5, 0xe8, 0x1d, 0xcd, 0x8b, 0x96, 0x85, + 0x09, 0xd3, 0xe4, 0x43, 0x3f, 0x5b, 0xd2, 0x82, 0xf1, 0xb1, 0x99, 0x63, + 0xc8, 0xda, 0xd9, 0xf7, 0x6b, 0x72, 0x76, 0x26, 0xf2, 0x8b, 0xec, 0x7a, + 0xef, 0x30, 0xfd, 0x32, 0xa6, 0x21, 0x4a, 0xff, 0xa0, 0x4c, 0x15, 0xe8, + 0xbe, 0xc2, 0xb9, 0x3f, 0xa9, 0xfe, 0xa5, 0xda, 0xf6, 0xf8, 0x87, 0x56, + 0x36, 0x0f, 0xc8, 0xd4, 0x3e, 0x90, 0xfa, 0xa8, 0xdd, 0x14, 0xd8, 0x76, + 0x23, 0x65, 0x2f, 0xd5, 0xde, 0x93, 0x6a, 0xb1, 0xc7, 0x3c, 0xcc, 0xc2, + 0x1b, 0xf7, 0x8a, 0x4e, 0x45, 0x07, 0x16, 0x8e, 0x9b, 0xb7, 0x12, 0x2b, + 0xde, 0xb1, 0x1c, 0x73, 0xa4, 0x8d, 0x4e, 0xa5, 0x89, 0xf6, 0x14, 0x73, + 0xe6, 0x83, 0x9c, 0x5b, 0xcb, 0x0b, 0x47, 0x94, 0x35, 0xb6, 0xfe, 0x9b, + 0x94, 0x15, 0x23, 0x33, 0xdb, 0xee, 0xa4, 0xef, 0x9e, 0x51, 0xb3, 0xf3, + 0x7d, 0xc1, 0x1e, 0x43, 0x56, 0x7e, 0x1f, 0x5a, 0x92, 0xd2, 0x8e, 0xe8, + 0x35, 0xeb, 0x6f, 0x2d, 0x12, 0x23, 0xae, 0xc8, 0x9c, 0xe5, 0x1e, 0x57, + 0x31, 0x61, 0xc9, 0x47, 0xf0, 0x63, 0x19, 0xf1, 0x23, 0xf2, 0x07, 0xf1, + 0xe3, 0xc6, 0xff, 0xa0, 0xec, 0x39, 0xca, 0x21, 0x3c, 0x45, 0xe2, 0x9e, + 0xf0, 0x16, 0xe1, 0x2b, 0x01, 0xca, 0x25, 0xfc, 0x25, 0x67, 0x1b, 0x96, + 0xf5, 0x8f, 0x66, 0x0d, 0xa2, 0x15, 0x7a, 0x3f, 0x50, 0x89, 0x7e, 0xca, + 0xea, 0x48, 0x20, 0xc6, 0x71, 0x52, 0xd7, 0xea, 0xad, 0x0e, 0xa8, 0x75, + 0x0e, 0x74, 0xe1, 0x2d, 0xd3, 0xe8, 0xdd, 0x84, 0x3f, 0x43, 0xb7, 0xc7, + 0xc2, 0x11, 0x33, 0x40, 0x5c, 0x2a, 0x44, 0x7b, 0x1d, 0x27, 0x62, 0x8d, + 0x07, 0x03, 0xc9, 0x58, 0x2b, 0x61, 0x83, 0x31, 0xec, 0x74, 0x6b, 0xdc, + 0xaf, 0xb7, 0x6c, 0x65, 0xaa, 0xb4, 0xb2, 0xcf, 0x0d, 0x9f, 0xa4, 0x4c, + 0x8c, 0x19, 0x4f, 0x30, 0xce, 0x6f, 0x34, 0x0d, 0xea, 0xb6, 0x87, 0x36, + 0xa4, 0xd2, 0x5e, 0xa4, 0x9f, 0x00, 0xf9, 0x8c, 0xd4, 0x65, 0x5c, 0xa8, + 0x56, 0xb0, 0xaa, 0x9a, 0xf6, 0x49, 0x5e, 0xf4, 0x57, 0x41, 0xa7, 0xfd, + 0x7f, 0x3c, 0x5d, 0x1b, 0xf8, 0xbc, 0xfa, 0x9a, 0x35, 0xec, 0xb1, 0xdb, + 0xd0, 0x22, 0x2a, 0xe5, 0xfe, 0xa3, 0x9c, 0xc0, 0x84, 0x70, 0xb5, 0x12, + 0xe3, 0x03, 0x8c, 0xd9, 0x75, 0x4a, 0x51, 0x34, 0x18, 0x9b, 0x53, 0x48, + 0x1b, 0xce, 0x0f, 0xeb, 0xb8, 0x77, 0xa4, 0x04, 0x8e, 0x41, 0xfd, 0xd2, + 0x0a, 0x07, 0xa2, 0x79, 0xc2, 0x0f, 0x47, 0x2a, 0x50, 0xbe, 0xcf, 0xea, + 0x72, 0x85, 0x2d, 0x2b, 0x55, 0x1f, 0xc6, 0x03, 0xa3, 0x1a, 0xd4, 0x7d, + 0x2e, 0x14, 0x31, 0x4f, 0x59, 0x6b, 0xf6, 0xe0, 0x41, 0xf2, 0xbb, 0xb9, + 0x89, 0x00, 0x6e, 0x23, 0x16, 0x5d, 0x4a, 0x36, 0x37, 0xbd, 0x14, 0xaf, + 0xee, 0x98, 0xeb, 0x10, 0xee, 0xbf, 0x1a, 0x9b, 0xd2, 0xab, 0x71, 0x0f, + 0x63, 0xe7, 0x59, 0x03, 0x5d, 0x73, 0xe9, 0xaf, 0xf7, 0x90, 0xff, 0xb5, + 0x25, 0xd7, 0xa2, 0x2d, 0xdd, 0xc1, 0xff, 0x5a, 0x71, 0x1f, 0x8f, 0xf6, + 0xa4, 0xf8, 0xf7, 0x3a, 0xb4, 0xa7, 0xab, 0x10, 0x1d, 0x69, 0xc3, 0xd6, + 0xf4, 0x4d, 0x94, 0xc1, 0x43, 0xdd, 0x36, 0x63, 0x43, 0xba, 0x19, 0x0f, + 0x70, 0x2c, 0x0f, 0x70, 0x3e, 0xd4, 0xc4, 0x56, 0xfa, 0x58, 0x31, 0x3c, + 0x83, 0x37, 0xe2, 0xc1, 0x91, 0x5b, 0xb1, 0x85, 0x71, 0xf2, 0xae, 0x25, + 0xb7, 0xa2, 0x6b, 0xe4, 0x41, 0x74, 0x26, 0x8d, 0xce, 0xb9, 0x4c, 0xc5, + 0xde, 0x5b, 0xf2, 0x20, 0xee, 0xa7, 0x1c, 0xf7, 0xec, 0xb5, 0x60, 0x06, + 0xeb, 0x54, 0x67, 0x45, 0xcc, 0xf2, 0x1a, 0x12, 0x9b, 0x27, 0xd6, 0xf5, + 0x18, 0x43, 0xd3, 0xd8, 0xe2, 0x44, 0x9e, 0xa1, 0x88, 0x8d, 0x66, 0xaf, + 0xc7, 0xff, 0x16, 0x9b, 0x46, 0x5c, 0xd8, 0x3c, 0xd2, 0xa9, 0xdc, 0x26, + 0xb6, 0xe2, 0x52, 0x39, 0x9f, 0x11, 0x62, 0x5f, 0x93, 0xd2, 0x38, 0x62, + 0xcf, 0xb3, 0xe6, 0x09, 0x77, 0x2a, 0x6b, 0xd3, 0x5f, 0x75, 0xa0, 0x50, + 0xe6, 0xe2, 0x26, 0x8c, 0xd5, 0x7d, 0xdd, 0x1a, 0xce, 0xce, 0xe7, 0x30, + 0xdd, 0xc7, 0xed, 0x0d, 0xbf, 0xdb, 0xea, 0xad, 0xd1, 0x3b, 0x0f, 0xa8, + 0xc2, 0x2b, 0xdd, 0xc8, 0xd8, 0xf3, 0x99, 0xc7, 0x7e, 0xca, 0x71, 0xd4, + 0x93, 0xe5, 0x12, 0xf3, 0xd9, 0x97, 0x95, 0x74, 0x71, 0xac, 0x94, 0x9b, + 0xe3, 0x99, 0x9b, 0xf0, 0xe2, 0x21, 0xea, 0xa7, 0x93, 0x73, 0xd4, 0x49, + 0xbd, 0x7c, 0x25, 0x79, 0x92, 0x31, 0xa2, 0x03, 0x5f, 0x99, 0xee, 0xa7, + 0x27, 0x9d, 0x8f, 0x42, 0xa3, 0x07, 0xdf, 0xd0, 0xf2, 0xe8, 0x63, 0xc2, + 0x33, 0x26, 0xd6, 0x1d, 0x31, 0xbe, 0xcc, 0x31, 0x7c, 0x8d, 0x6d, 0x88, + 0x5c, 0xb5, 0x5a, 0x39, 0xb2, 0x65, 0xbb, 0x89, 0xd9, 0xaa, 0xf1, 0x81, + 0x75, 0xc8, 0xd3, 0xc2, 0x3a, 0xc2, 0x8d, 0x26, 0xd6, 0x2d, 0xec, 0xf3, + 0x11, 0xff, 0xdc, 0x70, 0x26, 0x22, 0xd4, 0xb7, 0x9b, 0x9c, 0xaa, 0x89, + 0x3a, 0xe7, 0x1c, 0x53, 0xaf, 0x9b, 0x69, 0xcf, 0x25, 0x89, 0xd5, 0xd4, + 0xbf, 0x06, 0x77, 0xa2, 0x87, 0xba, 0xf7, 0xc0, 0x95, 0x68, 0xc1, 0x46, + 0xca, 0x55, 0x9c, 0x58, 0xcb, 0x39, 0xa8, 0x44, 0x51, 0xa2, 0x15, 0xf7, + 0x52, 0x97, 0x0f, 0x52, 0x97, 0xdb, 0x16, 0xbd, 0xa7, 0x6c, 0xb1, 0xb1, + 0x84, 0x75, 0x93, 0x11, 0x6c, 0x4a, 0x0a, 0xef, 0x72, 0x62, 0xd8, 0xc5, + 0x84, 0xcc, 0xf8, 0x57, 0x72, 0x61, 0x5a, 0xbf, 0xd1, 0xcd, 0xdf, 0x39, + 0x39, 0x73, 0x38, 0x2e, 0x72, 0x4a, 0x7c, 0xcd, 0xc9, 0x29, 0xe3, 0x7f, + 0x81, 0x38, 0x0e, 0x9f, 0xcb, 0xc8, 0xe9, 0x44, 0xf4, 0xe1, 0xa4, 0x3e, + 0xd6, 0x51, 0x1f, 0x6e, 0x78, 0x07, 0xdd, 0xe4, 0xa8, 0x3a, 0x3a, 0x47, + 0x84, 0xa7, 0x17, 0xe0, 0xbd, 0x01, 0x1f, 0xee, 0xe7, 0xef, 0x1d, 0xf4, + 0xa3, 0x33, 0xfd, 0x16, 0x8c, 0xa0, 0x86, 0x7e, 0xad, 0x00, 0xbb, 0x03, + 0x5b, 0x49, 0xe8, 0x65, 0xae, 0x84, 0x2f, 0x15, 0x81, 0x54, 0x3a, 0xe6, + 0xaa, 0xd7, 0xb1, 0x3d, 0xe0, 0x06, 0x7d, 0x21, 0xe2, 0x32, 0x22, 0x70, + 0xdb, 0xf1, 0x5e, 0x81, 0x8b, 0x78, 0xc8, 0x1c, 0x14, 0x7d, 0x8c, 0xbb, + 0xae, 0xb0, 0xfc, 0x47, 0x3b, 0x21, 0x07, 0x2b, 0x0b, 0x1b, 0xcd, 0x2f, + 0x29, 0xfe, 0x98, 0x5f, 0x79, 0x10, 0x1d, 0xe9, 0x22, 0x9c, 0xee, 0xff, + 0x1a, 0xda, 0xd8, 0x57, 0x4f, 0xb2, 0x98, 0x79, 0xd8, 0x90, 0x32, 0x65, + 0x8f, 0xb9, 0x18, 0x89, 0xa1, 0xa7, 0xac, 0xf9, 0x86, 0xd8, 0x4d, 0x18, + 0xf7, 0x8f, 0x96, 0x62, 0x57, 0xff, 0xad, 0xb8, 0xc7, 0xb6, 0x0d, 0x66, + 0xb5, 0x83, 0x0d, 0x76, 0x9d, 0x21, 0xfa, 0x57, 0x5f, 0xe2, 0x41, 0xac, + 0x48, 0x56, 0x45, 0x46, 0x95, 0xa8, 0xad, 0xd3, 0xed, 0x89, 0x36, 0x5b, + 0xa7, 0xf1, 0x7d, 0xed, 0xd8, 0x3a, 0x7a, 0x2d, 0xf6, 0xec, 0xdb, 0x82, + 0x7b, 0x47, 0x2b, 0xb1, 0x8d, 0xb6, 0xbc, 0x21, 0xad, 0xa2, 0x7b, 0xdf, + 0xad, 0x8c, 0x7d, 0xa5, 0xd8, 0x3d, 0x48, 0x7b, 0xa6, 0x4d, 0x3f, 0xb4, + 0xd7, 0xc8, 0x34, 0x38, 0x36, 0x2b, 0xbe, 0x8a, 0x5b, 0xed, 0xf1, 0xf7, + 0x27, 0xb3, 0x7a, 0xdb, 0x91, 0x5e, 0xc0, 0x3c, 0xe7, 0xef, 0xac, 0x27, + 0x3d, 0xf9, 0xb6, 0x2d, 0xa8, 0xd4, 0x5b, 0x63, 0xbc, 0x98, 0xf6, 0xc2, + 0xdc, 0x6b, 0xda, 0x5e, 0xb6, 0xa5, 0x17, 0x53, 0x0f, 0x1e, 0xa4, 0xb4, + 0x00, 0x5c, 0x57, 0xe6, 0xc1, 0x9c, 0xb6, 0x97, 0x4b, 0x2c, 0x63, 0xdb, + 0xf2, 0xc7, 0x7c, 0x01, 0xb8, 0x97, 0xf1, 0xb5, 0x9c, 0xf1, 0x75, 0x43, + 0x70, 0x8d, 0xf2, 0x80, 0x76, 0x65, 0xce, 0xbc, 0xb9, 0x39, 0x93, 0x3c, + 0xd1, 0xcd, 0x3a, 0xee, 0xbe, 0xaf, 0xd9, 0xb6, 0xdb, 0x9c, 0xae, 0xc7, + 0xc6, 0x91, 0x99, 0xed, 0xe7, 0xea, 0x14, 0x70, 0x2e, 0x72, 0xf3, 0xac, + 0xf7, 0x0a, 0x96, 0xf9, 0x17, 0xe5, 0xb0, 0xec, 0xab, 0xd3, 0xfd, 0x1f, + 0xb4, 0x18, 0x93, 0x9c, 0x2e, 0xc3, 0x81, 0x6d, 0x81, 0xaf, 0x28, 0x51, + 0xcd, 0x49, 0x1c, 0x51, 0x38, 0xb6, 0xff, 0x6a, 0x0d, 0xad, 0x95, 0x79, + 0x59, 0xe1, 0x64, 0x08, 0x53, 0x5c, 0x57, 0x7c, 0x76, 0x35, 0xd6, 0x27, + 0x45, 0xd6, 0x16, 0x6c, 0x48, 0xda, 0x72, 0xf9, 0x72, 0x72, 0xf5, 0xd0, + 0x66, 0xb4, 0xc4, 0x6e, 0x5b, 0xa6, 0x16, 0xda, 0xd5, 0xfd, 0x7b, 0x55, + 0x9c, 0x09, 0x7e, 0x59, 0xf1, 0xcd, 0x96, 0x38, 0x5c, 0x85, 0xce, 0xbd, + 0xf2, 0xed, 0x23, 0xdf, 0xbd, 0x53, 0x99, 0x9a, 0xdd, 0xc7, 0x72, 0x0d, + 0x58, 0xbf, 0xb7, 0x02, 0x73, 0x39, 0xd6, 0xbb, 0xcc, 0xb5, 0xca, 0xe5, + 0x59, 0x32, 0x9e, 0x96, 0xe9, 0x58, 0x5e, 0x45, 0x3b, 0x67, 0xd7, 0x86, + 0xfc, 0x6e, 0xc4, 0xb6, 0x1b, 0xab, 0xa6, 0xe3, 0xfc, 0xdf, 0x72, 0x5e, + 0x3a, 0x95, 0x55, 0xc4, 0x85, 0x28, 0x71, 0x81, 0x36, 0xa5, 0xb4, 0x10, + 0x17, 0x96, 0x4d, 0xe3, 0x42, 0x31, 0x71, 0x61, 0x75, 0xfa, 0x32, 0xe5, + 0x11, 0x5f, 0xfc, 0xa8, 0x3c, 0xf7, 0x51, 0x9e, 0x63, 0x41, 0x06, 0x46, + 0x5b, 0x1e, 0xda, 0x08, 0xdb, 0xcf, 0x37, 0xe4, 0xb7, 0x85, 0x1d, 0xe4, + 0x85, 0xcf, 0x6a, 0x1f, 0xed, 0xbf, 0x8b, 0xb2, 0x79, 0x8d, 0x0f, 0xad, + 0x32, 0xd6, 0xbf, 0x7c, 0x53, 0x15, 0x1e, 0x1a, 0x69, 0xa0, 0x0d, 0xc8, + 0xb8, 0xe4, 0x7f, 0xb1, 0x53, 0x91, 0xc7, 0x45, 0xbb, 0x93, 0x36, 0x44, + 0x0f, 0x11, 0x47, 0x56, 0xf7, 0xb9, 0xb9, 0x75, 0xd2, 0x87, 0xdd, 0x28, + 0x0b, 0xeb, 0x91, 0x3b, 0x18, 0xdf, 0x97, 0xd1, 0x77, 0x4b, 0x07, 0x5a, + 0x68, 0xb3, 0x16, 0xf5, 0xf2, 0xff, 0x28, 0xd5, 0xe5, 0xbd, 0xec, 0x6f, + 0x42, 0xb9, 0x93, 0x63, 0xf1, 0xe5, 0x97, 0x46, 0x8a, 0xc3, 0xfe, 0xd6, + 0xf8, 0xc7, 0xe2, 0xe1, 0xaa, 0x74, 0x96, 0x53, 0xaa, 0x03, 0x31, 0xab, + 0x90, 0xf6, 0xee, 0x34, 0xfc, 0x97, 0x6e, 0x63, 0x0f, 0xf3, 0x0f, 0x0a, + 0x87, 0x31, 0xd9, 0xd6, 0xd5, 0xbe, 0x84, 0x83, 0x79, 0x38, 0x47, 0x43, + 0xd5, 0x92, 0xd7, 0x4c, 0xac, 0xfb, 0x74, 0xca, 0x87, 0x3b, 0xd2, 0x14, + 0x69, 0xd0, 0xc9, 0xfe, 0x18, 0xbb, 0xca, 0x2b, 0x28, 0x76, 0x1e, 0x0f, + 0xea, 0x7d, 0xe4, 0x53, 0x8c, 0x29, 0x19, 0xb6, 0xc9, 0xdf, 0xa6, 0xb4, + 0x29, 0xb8, 0xed, 0xc0, 0xdc, 0x41, 0x05, 0xa1, 0xc5, 0x95, 0x0a, 0xae, + 0xc9, 0x72, 0x6a, 0x95, 0xf2, 0x77, 0x8f, 0x8b, 0x7d, 0x67, 0x68, 0xdf, + 0x9f, 0x52, 0x22, 0xb6, 0x3d, 0x9e, 0xd4, 0x55, 0xfe, 0xd7, 0x36, 0x4a, + 0xae, 0x97, 0x50, 0x68, 0x2f, 0x1e, 0xda, 0x4b, 0xdd, 0x34, 0x76, 0x99, + 0xf4, 0xb3, 0x39, 0x70, 0xed, 0x0b, 0x91, 0x9f, 0x79, 0x50, 0xbc, 0xef, + 0x16, 0xfa, 0x59, 0x31, 0x71, 0x4b, 0xa3, 0x9f, 0x55, 0xf0, 0xf0, 0xf0, + 0x98, 0xc3, 0x63, 0x39, 0x7d, 0xaa, 0x9e, 0x71, 0xc3, 0x81, 0xbc, 0x41, + 0x15, 0xcf, 0x9a, 0x0a, 0x2e, 0xd6, 0xb1, 0xbf, 0xea, 0xab, 0x3e, 0x26, + 0x18, 0xea, 0x49, 0x7c, 0x8d, 0xfe, 0xe5, 0xc3, 0x5a, 0xc6, 0xa2, 0xf6, + 0xbd, 0x1a, 0x5c, 0xc1, 0x7c, 0x65, 0xd8, 0x96, 0x61, 0x62, 0x9a, 0xdb, + 0xcc, 0x27, 0xc7, 0xae, 0x0d, 0x95, 0xc3, 0xaf, 0x6d, 0xa2, 0xee, 0xca, + 0xa9, 0xbb, 0xb5, 0xe4, 0x09, 0x3b, 0xa7, 0xf5, 0xd7, 0x48, 0xfd, 0xad, + 0x49, 0x3f, 0xc8, 0xf6, 0x24, 0x36, 0x10, 0x2f, 0x38, 0x9e, 0xb9, 0x61, + 0xdd, 0x77, 0x27, 0xe7, 0x43, 0xb8, 0x06, 0xf3, 0x57, 0x1c, 0xe8, 0x6f, + 0x41, 0x19, 0xe7, 0xc4, 0xb3, 0x58, 0x55, 0x92, 0x15, 0xbd, 0xb4, 0xa9, + 0x5c, 0xdb, 0x05, 0x91, 0x92, 0x70, 0x6d, 0x54, 0xda, 0x1e, 0x9b, 0x6e, + 0x7b, 0x39, 0xdb, 0x8e, 0xb3, 0xed, 0x15, 0xbf, 0xd7, 0x76, 0x25, 0x71, + 0xfd, 0xcf, 0xa7, 0x7d, 0xef, 0x82, 0xe4, 0x6a, 0xcd, 0x11, 0xdb, 0x07, + 0x77, 0xd9, 0xed, 0x7d, 0x4e, 0xf2, 0x14, 0x9b, 0xd7, 0xc5, 0x94, 0x95, + 0xc4, 0xf2, 0xb2, 0x84, 0x12, 0xf1, 0x84, 0x6b, 0x3b, 0xd8, 0x76, 0xf3, + 0x93, 0x76, 0xdb, 0x3d, 0xca, 0x1d, 0x6c, 0x3b, 0xc1, 0x76, 0x57, 0x7e, + 0xa4, 0x5d, 0x15, 0x73, 0xf7, 0xe5, 0xe6, 0xd5, 0xc9, 0xb9, 0xa1, 0xc0, + 0xb3, 0x10, 0x55, 0xc3, 0x95, 0x98, 0x9f, 0xc8, 0xce, 0x73, 0x43, 0x4a, + 0xf0, 0x5a, 0x43, 0xf1, 0xa0, 0x47, 0x38, 0x00, 0x7a, 0x82, 0x13, 0xd8, + 0x63, 0xc7, 0x38, 0x15, 0x05, 0xfb, 0x14, 0x5c, 0x1f, 0xbc, 0x5d, 0x19, + 0x9e, 0x9d, 0x8d, 0xb3, 0xb9, 0xf9, 0x2c, 0xe5, 0x7c, 0xbe, 0xd8, 0xd7, + 0xa4, 0x64, 0xd7, 0xc0, 0x1e, 0x24, 0x27, 0x40, 0xac, 0x34, 0x2c, 0xeb, + 0x4e, 0xfe, 0xf6, 0x1b, 0x88, 0xbd, 0xf7, 0xd1, 0x5f, 0xa2, 0x23, 0xc5, + 0x8c, 0x53, 0xc2, 0x8d, 0x32, 0xeb, 0xe2, 0x7d, 0x95, 0xe8, 0x25, 0x9e, + 0xb6, 0x8d, 0x9e, 0xbc, 0xb3, 0x18, 0x15, 0xfc, 0xf6, 0xf0, 0x98, 0xc3, + 0xc3, 0xcd, 0xb9, 0x74, 0xc3, 0xd1, 0x27, 0x1c, 0xbb, 0x8e, 0x18, 0x5a, + 0x8c, 0xc2, 0x3e, 0x13, 0x5b, 0x28, 0x4f, 0xfe, 0x40, 0x3d, 0x63, 0x78, + 0x25, 0xba, 0x93, 0xe5, 0x58, 0xd6, 0xbf, 0x84, 0x18, 0x25, 0x31, 0xa3, + 0x02, 0xe7, 0xfa, 0x6f, 0x44, 0x07, 0x7f, 0x3f, 0x96, 0x9c, 0x85, 0xcb, + 0x7b, 0x6f, 0xa2, 0x5f, 0x89, 0x9e, 0x3c, 0xf0, 0xd2, 0x66, 0x3a, 0xd9, + 0xa6, 0x87, 0x36, 0xf3, 0xe0, 0xa8, 0x97, 0x3a, 0x32, 0x18, 0x7b, 0x8f, + 0xfc, 0xce, 0xf7, 0x05, 0xc1, 0x96, 0x99, 0xf1, 0x56, 0x7c, 0x4d, 0xea, + 0x7c, 0x87, 0x00, 0x21, 0xbf, 0x67, 0xc6, 0xb8, 0xee, 0xe9, 0x58, 0x2c, + 0xb9, 0x72, 0x0e, 0xab, 0x73, 0xbc, 0xe2, 0xc1, 0xd9, 0x57, 0xb1, 0xb1, + 0x5f, 0xea, 0x7a, 0x3f, 0x5a, 0x77, 0x4f, 0x2e, 0x8e, 0x9b, 0xe5, 0x33, + 0xea, 0xce, 0xe5, 0xff, 0x37, 0x27, 0x25, 0x36, 0xb6, 0xc0, 0xe2, 0x3c, + 0xbe, 0x60, 0xe8, 0x9d, 0x0d, 0x0e, 0xa3, 0xe3, 0x12, 0xf3, 0x99, 0xdb, + 0xaf, 0xb4, 0x2d, 0x31, 0xbe, 0x05, 0x0b, 0xfb, 0xf4, 0xf6, 0x5d, 0xe4, + 0x9c, 0xc7, 0x82, 0x7a, 0xe0, 0x5a, 0x45, 0x8f, 0x8d, 0xe2, 0x55, 0xe4, + 0x8d, 0x9f, 0x43, 0x7f, 0xfa, 0x35, 0xe6, 0x94, 0x27, 0xd9, 0xa6, 0x5b, + 0x29, 0x1e, 0xef, 0x41, 0x34, 0x37, 0x9e, 0xb8, 0x60, 0x79, 0x0b, 0xdc, + 0x7d, 0x31, 0xab, 0x98, 0x7c, 0x4f, 0x0d, 0xeb, 0xc3, 0xc7, 0x60, 0xb4, + 0xc6, 0xc9, 0x19, 0x57, 0x31, 0x5e, 0xcd, 0x4f, 0x74, 0x31, 0xd6, 0xeb, + 0x2d, 0x7f, 0x03, 0xbd, 0xa3, 0x51, 0x79, 0x15, 0xaf, 0x93, 0x20, 0xce, + 0x4d, 0x9c, 0xa3, 0x9d, 0xbc, 0x86, 0x7f, 0x19, 0xd3, 0xe0, 0x4d, 0x10, + 0x9f, 0x6a, 0x66, 0x3b, 0xa5, 0xdd, 0x97, 0xc6, 0x6e, 0xf8, 0x70, 0xcf, + 0x55, 0xcc, 0xd6, 0x5c, 0xc6, 0x92, 0x8f, 0xe1, 0x51, 0x5d, 0xd3, 0xf2, + 0xf8, 0xfa, 0xad, 0xae, 0x70, 0xc7, 0x43, 0xc7, 0xeb, 0xb3, 0xb6, 0xe3, + 0x4b, 0xb9, 0x71, 0xce, 0x23, 0x73, 0xc7, 0x1c, 0x67, 0x7f, 0x1d, 0x76, + 0xef, 0x67, 0xee, 0xa8, 0xd6, 0x86, 0x0a, 0x95, 0x72, 0xe6, 0x3d, 0x83, + 0x36, 0xe7, 0x75, 0x1a, 0x7f, 0x6f, 0xe7, 0xc5, 0x12, 0x03, 0xa4, 0xce, + 0x82, 0x94, 0xc4, 0x38, 0x59, 0xb3, 0x99, 0x58, 0xb7, 0x21, 0x4e, 0x3b, + 0xd1, 0xb6, 0xb1, 0xcc, 0xc6, 0xe9, 0xb5, 0x7a, 0x59, 0xa7, 0xd8, 0x36, + 0x83, 0x77, 0x7c, 0x79, 0x46, 0x3c, 0xaa, 0xf5, 0x95, 0x5f, 0x89, 0x15, + 0xf7, 0x4c, 0x97, 0xdf, 0xef, 0xca, 0xca, 0xe6, 0x9e, 0xe1, 0x3f, 0x37, + 0xf0, 0x5a, 0xd6, 0x4e, 0xaf, 0xc6, 0xb4, 0x9d, 0xd3, 0x73, 0x73, 0x9b, + 0x2b, 0x8b, 0xed, 0xf7, 0xb9, 0x73, 0x6b, 0x42, 0xd9, 0x32, 0x9f, 0xc9, + 0x43, 0xe1, 0x9e, 0x2b, 0xf8, 0x1d, 0x23, 0x7e, 0x77, 0xec, 0xcd, 0xae, + 0x41, 0x96, 0xdc, 0x28, 0x38, 0x5d, 0x85, 0xfb, 0x6c, 0x3b, 0xfb, 0xbc, + 0x2b, 0x3b, 0xef, 0xce, 0xe9, 0x71, 0x99, 0xf4, 0xcf, 0xeb, 0x64, 0xdd, + 0x7f, 0xda, 0x5f, 0xff, 0x8e, 0xff, 0x6f, 0xe3, 0xb5, 0x62, 0xb8, 0x88, + 0x85, 0x4f, 0x99, 0x0e, 0x4c, 0xcd, 0xca, 0x72, 0x72, 0x75, 0x5f, 0x1d, + 0xba, 0x0f, 0xd3, 0xbe, 0x89, 0x57, 0xcd, 0xc1, 0x0f, 0x3e, 0x44, 0xb9, + 0xac, 0x0d, 0x54, 0xa0, 0x68, 0x9f, 0x70, 0x63, 0x72, 0x89, 0xc3, 0x5b, + 0xec, 0xb1, 0x6c, 0x4b, 0x65, 0xd7, 0x3e, 0x76, 0x26, 0x7b, 0x3f, 0xdc, + 0xac, 0x65, 0xed, 0xb3, 0x20, 0x1c, 0x5e, 0xb7, 0xd0, 0x9f, 0xf1, 0x39, + 0xa0, 0x9b, 0xbb, 0x78, 0xe1, 0xe5, 0xf8, 0x97, 0xb1, 0xbd, 0x42, 0x41, + 0xa7, 0x51, 0x06, 0xc7, 0xe2, 0x5f, 0x5b, 0x9b, 0xd7, 0xca, 0x7f, 0x2e, + 0xd7, 0x1f, 0xb6, 0x67, 0x19, 0xb7, 0xf0, 0x36, 0x37, 0x8a, 0x88, 0x5f, + 0xab, 0x1c, 0x2d, 0xc4, 0x45, 0x85, 0xf1, 0xd1, 0x9e, 0x0b, 0x6c, 0x1b, + 0x56, 0xb0, 0x7b, 0x58, 0x7c, 0x94, 0x31, 0x6d, 0xc0, 0x8b, 0x9d, 0xc3, + 0xe2, 0x77, 0x2e, 0xfa, 0xdd, 0x5c, 0x6c, 0x1f, 0x16, 0xbf, 0xcb, 0xc3, + 0xeb, 0xfd, 0xd7, 0xe2, 0x31, 0xfe, 0x7e, 0x34, 0x99, 0x8f, 0xd0, 0xde, + 0x4f, 0xe1, 0xc0, 0xb0, 0x70, 0x24, 0x37, 0x92, 0x83, 0xe4, 0x75, 0xc3, + 0x59, 0xbe, 0x50, 0x3a, 0xf8, 0x67, 0x48, 0xf0, 0x77, 0x1f, 0xb9, 0x5d, + 0x6a, 0x60, 0x1e, 0xe2, 0xfc, 0x2d, 0x6b, 0x6a, 0xc5, 0x94, 0x3f, 0xee, + 0x2f, 0xc2, 0x86, 0x01, 0xc9, 0x93, 0x43, 0xeb, 0xee, 0xf5, 0xcf, 0x67, + 0x9f, 0x95, 0xd8, 0x4d, 0x5e, 0xd6, 0x4c, 0x3e, 0xd8, 0xcb, 0xdf, 0x3b, + 0x93, 0x25, 0x78, 0xbb, 0x5f, 0xb7, 0xfb, 0xeb, 0x4e, 0x2e, 0x5f, 0xee, + 0x32, 0x4a, 0xb1, 0xbc, 0x7f, 0x01, 0x76, 0x0c, 0x8b, 0xaf, 0x97, 0xd1, + 0xd7, 0xab, 0xf0, 0x28, 0x7f, 0x1f, 0x20, 0x8e, 0x78, 0xf6, 0x1a, 0x18, + 0x1a, 0x16, 0x3e, 0x59, 0x8e, 0x8b, 0x03, 0x7e, 0xf4, 0xdb, 0xfd, 0x9b, + 0x48, 0x24, 0x43, 0x94, 0xcf, 0x83, 0x92, 0x7d, 0x19, 0x6f, 0x29, 0x14, + 0x4c, 0xfa, 0x03, 0xe8, 0x3b, 0x3c, 0x07, 0x85, 0xfb, 0x74, 0x73, 0x2b, + 0xf4, 0x4b, 0xf7, 0xe2, 0x3a, 0xec, 0x3e, 0xec, 0x45, 0xfe, 0xbe, 0x32, + 0xb8, 0x83, 0x75, 0xd8, 0x79, 0xf8, 0x06, 0x6c, 0x3f, 0x5c, 0x49, 0x5c, + 0x03, 0xce, 0xa4, 0x4c, 0xf4, 0x32, 0xde, 0xcd, 0x25, 0xa6, 0xbd, 0x91, + 0x96, 0x79, 0x94, 0xf9, 0x51, 0x50, 0xec, 0x2f, 0x23, 0x26, 0xca, 0x6f, + 0xb9, 0x16, 0xb2, 0xb1, 0x24, 0xbb, 0x16, 0xa5, 0xc7, 0x76, 0xc2, 0xd6, + 0x37, 0x32, 0x29, 0xd1, 0xbd, 0xac, 0xfb, 0xcc, 0xb4, 0xa7, 0x9d, 0xf6, + 0x3a, 0xfc, 0x55, 0xbb, 0x3c, 0x34, 0x6d, 0x97, 0xf6, 0xba, 0x19, 0x9e, + 0xb9, 0x92, 0xcb, 0xa2, 0x29, 0x0f, 0x7e, 0xd3, 0xa9, 0xc0, 0xc7, 0x9c, + 0xd6, 0xf7, 0xec, 0xc7, 0xd6, 0xcf, 0xae, 0xae, 0xf1, 0xcc, 0x5c, 0x67, + 0x95, 0xfb, 0x4b, 0x2a, 0xe3, 0x77, 0x1e, 0x62, 0x9a, 0xac, 0x43, 0xd5, + 0x6a, 0xd4, 0xca, 0xc7, 0x72, 0xeb, 0xd2, 0x68, 0x41, 0xb8, 0x1e, 0xbe, + 0xb1, 0x4a, 0xdf, 0xdb, 0x71, 0xd1, 0xe9, 0x6f, 0x2d, 0xb7, 0x61, 0x78, + 0x8f, 0xa1, 0xd2, 0xf7, 0x66, 0xea, 0xe7, 0x79, 0x28, 0x2d, 0xc6, 0xb2, + 0xf8, 0x27, 0xd7, 0x53, 0xc3, 0x50, 0x56, 0xd4, 0x7b, 0x51, 0x60, 0xc0, + 0x79, 0x5b, 0x0d, 0x66, 0x7c, 0xc8, 0x3f, 0xc2, 0x50, 0x4f, 0xd5, 0x87, + 0x98, 0xcf, 0x67, 0xef, 0xd9, 0x2c, 0x4d, 0xeb, 0xde, 0x88, 0x92, 0xbd, + 0x2f, 0xd3, 0x1e, 0xfc, 0x9d, 0x85, 0xf2, 0x2e, 0xe1, 0x28, 0xec, 0x0b, + 0xd8, 0x1a, 0xb7, 0xac, 0x67, 0xa8, 0x03, 0xb9, 0x1f, 0xf8, 0x6e, 0xea, + 0x37, 0xd6, 0xa4, 0xc7, 0x89, 0x77, 0x8c, 0x99, 0xed, 0x91, 0xcf, 0x85, + 0x4d, 0xf2, 0x0c, 0xfb, 0x44, 0x1d, 0x33, 0x6a, 0x3b, 0x8e, 0x30, 0x17, + 0x5e, 0xe8, 0xd7, 0x7d, 0x09, 0xfc, 0x6f, 0x4b, 0xb8, 0xdf, 0xb0, 0x92, + 0x5b, 0x9b, 0xfb, 0xf8, 0xfa, 0x48, 0x69, 0xd4, 0xc5, 0xf1, 0x1d, 0x8a, + 0xeb, 0xbd, 0x31, 0xe6, 0x66, 0x11, 0x0f, 0xa2, 0xce, 0x70, 0xa5, 0x6f, + 0x67, 0xdc, 0x1e, 0xa7, 0x79, 0x81, 0x73, 0x77, 0xaa, 0xbe, 0xd2, 0xb7, + 0x2d, 0x25, 0x36, 0xa8, 0x70, 0x2c, 0xf5, 0x78, 0x3c, 0xa5, 0xe2, 0x9e, + 0x47, 0x3c, 0xd8, 0xd8, 0x57, 0x8c, 0x0e, 0xf2, 0x5f, 0xe3, 0x7a, 0x27, + 0x36, 0x33, 0xbf, 0xdb, 0xd4, 0x97, 0x4f, 0x3d, 0x6a, 0xd8, 0xd2, 0xe7, + 0x44, 0xdd, 0xf5, 0xa5, 0x88, 0xcd, 0xce, 0xc7, 0x8b, 0xf4, 0xdd, 0xeb, + 0x83, 0x45, 0x18, 0xb6, 0x63, 0x9c, 0x60, 0x83, 0xf0, 0x34, 0xd1, 0x1b, + 0x39, 0x87, 0x21, 0x18, 0xf2, 0x49, 0x6b, 0x30, 0x1f, 0x58, 0x99, 0xd9, + 0x7b, 0x6c, 0xce, 0xe8, 0x08, 0x8b, 0x6e, 0xa4, 0xae, 0xac, 0x27, 0x79, + 0xc8, 0x47, 0x3e, 0xa2, 0x47, 0x65, 0x7e, 0xd8, 0x3f, 0xd9, 0xa0, 0x38, + 0x10, 0xf2, 0x97, 0x46, 0xcb, 0xc2, 0x21, 0xac, 0x48, 0x77, 0x7b, 0xbd, + 0xf6, 0xfd, 0xaa, 0x30, 0x2e, 0x2c, 0x31, 0x71, 0x67, 0x1a, 0xce, 0x15, + 0xd4, 0x7d, 0x13, 0xf5, 0xba, 0xc3, 0xfc, 0x9d, 0x95, 0xd1, 0xb2, 0x9c, + 0x2a, 0xaa, 0x59, 0xd6, 0x26, 0xea, 0x97, 0x79, 0x03, 0x7e, 0x3a, 0xad, + 0x5f, 0xd1, 0x69, 0xd1, 0xd8, 0x6f, 0xac, 0x53, 0xd4, 0xaf, 0x9b, 0xed, + 0xb9, 0xd9, 0x5e, 0xc1, 0xd8, 0x47, 0xf5, 0x9c, 0x4f, 0x79, 0x56, 0xd8, + 0x32, 0x5c, 0x2b, 0xeb, 0xfd, 0xbe, 0x88, 0x92, 0xe3, 0x9d, 0xff, 0xd1, + 0x98, 0x5e, 0xb5, 0xd7, 0xd4, 0x9e, 0x48, 0x5b, 0xd6, 0xa0, 0x29, 0xfa, + 0xf7, 0x51, 0xff, 0xb2, 0xb6, 0x22, 0x73, 0x50, 0x87, 0x48, 0x85, 0xde, + 0x0b, 0x3c, 0xc1, 0xe4, 0x56, 0xc1, 0x2c, 0xe6, 0x68, 0xdf, 0x6e, 0x29, + 0xc6, 0xdb, 0xf1, 0x12, 0x7b, 0xdc, 0x37, 0x57, 0x5b, 0x56, 0x70, 0xb1, + 0x0f, 0x97, 0x8c, 0xda, 0xd0, 0x22, 0x55, 0x67, 0x4c, 0xa0, 0xff, 0xd2, + 0x7e, 0xbb, 0x93, 0xf3, 0x38, 0x5f, 0xe2, 0xf3, 0xe8, 0xa0, 0x3d, 0xf9, + 0x1c, 0x61, 0xe0, 0xad, 0xb8, 0x11, 0xd8, 0xc1, 0xfe, 0x47, 0x3c, 0x61, + 0x6c, 0x4f, 0xaa, 0x4d, 0x4e, 0x92, 0x9d, 0x82, 0xb0, 0x11, 0xdb, 0x85, + 0x9f, 0x58, 0xc3, 0x1e, 0x0b, 0x79, 0xe4, 0xa0, 0x85, 0xc6, 0x0d, 0x78, + 0x4e, 0x73, 0xe0, 0xf9, 0xc0, 0x1c, 0x44, 0xcb, 0x1d, 0xcc, 0x8f, 0xde, + 0xb1, 0x7e, 0xe8, 0x91, 0x7e, 0x64, 0x2c, 0xe0, 0xb8, 0x14, 0x1b, 0xef, + 0x76, 0x26, 0xc3, 0xd4, 0xf7, 0xc7, 0xfb, 0xff, 0xdf, 0xd6, 0x94, 0x47, + 0xfa, 0xd7, 0x35, 0x1f, 0xf3, 0x88, 0xa7, 0x3e, 0x71, 0x2d, 0x25, 0xc0, + 0xf1, 0x5e, 0x8b, 0x17, 0x98, 0xc7, 0x94, 0x18, 0xe7, 0xac, 0xb3, 0x9e, + 0x6c, 0x1b, 0x09, 0x33, 0x33, 0xb7, 0xf4, 0x0a, 0x67, 0x84, 0x56, 0x16, + 0x76, 0xfa, 0x34, 0xfa, 0xe8, 0xd2, 0x69, 0x9e, 0xd8, 0x42, 0xce, 0x75, + 0x47, 0x7a, 0xcc, 0xd6, 0xc1, 0xcd, 0xd5, 0xa2, 0x4f, 0xc9, 0x91, 0x9e, + 0xb2, 0x30, 0x47, 0x64, 0x49, 0xf1, 0x7a, 0x18, 0xb1, 0x74, 0x4e, 0x46, + 0xd1, 0xf9, 0xf3, 0xf9, 0x82, 0xf5, 0x3b, 0x93, 0x91, 0xec, 0xb9, 0x2a, + 0xbf, 0x5f, 0xb0, 0xcb, 0x75, 0x53, 0xcf, 0xdd, 0xb4, 0x3d, 0xc6, 0x14, + 0xc6, 0x19, 0xb9, 0x03, 0xab, 0x11, 0xab, 0x2d, 0x6c, 0x37, 0x5d, 0xcc, + 0x83, 0xcb, 0xb0, 0xd3, 0xa4, 0xbd, 0x1a, 0xea, 0x02, 0x27, 0x2c, 0x9c, + 0x32, 0xe5, 0xdc, 0x85, 0x29, 0x8f, 0x03, 0xbb, 0x4c, 0x27, 0xda, 0x0d, + 0x55, 0x97, 0xeb, 0x8e, 0xa0, 0x9c, 0xbb, 0xe0, 0x9b, 0xad, 0x60, 0x4f, + 0x48, 0xc5, 0x16, 0xa3, 0xdb, 0x27, 0xd7, 0x97, 0x06, 0xe5, 0x5c, 0x41, + 0x1b, 0x75, 0x19, 0x63, 0x1e, 0xbd, 0x95, 0xed, 0x6e, 0x0b, 0x66, 0xd7, + 0xcc, 0xa3, 0xb0, 0xac, 0x3d, 0x66, 0xe3, 0xcd, 0x45, 0x2c, 0x77, 0xde, + 0xb4, 0xd7, 0x1c, 0xfe, 0xaf, 0x85, 0xfe, 0x58, 0x24, 0x0f, 0x7a, 0xb4, + 0x80, 0xfe, 0xbd, 0xb3, 0x6f, 0x3e, 0xeb, 0x49, 0xcc, 0x70, 0x7a, 0x77, + 0x43, 0xd6, 0xc2, 0xfc, 0xbe, 0x37, 0x39, 0xa0, 0x61, 0x4f, 0x0d, 0x67, + 0xc4, 0xf0, 0xbd, 0xc1, 0xf9, 0x2e, 0x33, 0x9c, 0x1d, 0x2f, 0x41, 0x6f, + 0x2f, 0x50, 0x6a, 0x02, 0xa5, 0x70, 0x21, 0x46, 0x1e, 0x79, 0x78, 0xac, + 0x98, 0xf1, 0xc3, 0xd0, 0x8e, 0xda, 0xeb, 0xe9, 0xc5, 0x1c, 0x5f, 0x31, + 0xe3, 0x8c, 0x5f, 0x9b, 0x54, 0x72, 0xe7, 0xf3, 0x05, 0x53, 0xa2, 0x8e, + 0xb0, 0xe0, 0x62, 0xcc, 0x7a, 0xba, 0x5e, 0xd2, 0x23, 0xb7, 0x2f, 0x9a, + 0x2a, 0xe6, 0xa1, 0xf1, 0xf0, 0xf8, 0x36, 0xa6, 0xbc, 0xbe, 0xb6, 0x14, + 0x7c, 0xeb, 0x53, 0x39, 0x7b, 0xce, 0x61, 0x82, 0x60, 0xa2, 0x65, 0xc9, + 0x7d, 0xe6, 0xa7, 0xd2, 0xd2, 0x56, 0x36, 0xfe, 0xe5, 0x51, 0xf6, 0x67, + 0xe8, 0x23, 0x2e, 0xc6, 0xb8, 0x5d, 0x46, 0x8c, 0x10, 0x6b, 0x59, 0x46, + 0x50, 0xf7, 0xe6, 0x29, 0x3e, 0xec, 0xac, 0xfb, 0x35, 0xed, 0x00, 0xd8, + 0x98, 0xba, 0xd1, 0x9d, 0x9d, 0x0b, 0xf1, 0x4f, 0xc1, 0x0e, 0x1f, 0xe3, + 0xb6, 0xd7, 0xd7, 0xcd, 0x7e, 0xb6, 0xa7, 0x66, 0xfa, 0x8e, 0x82, 0xdb, + 0xd8, 0x56, 0x63, 0x10, 0xce, 0xe5, 0x75, 0xff, 0x6e, 0x65, 0x3c, 0x33, + 0xef, 0xa9, 0xba, 0x19, 0xab, 0xe1, 0x5c, 0x5f, 0x27, 0xe7, 0x0a, 0x1a, + 0x43, 0x72, 0xae, 0x60, 0xbd, 0x21, 0xe7, 0xc4, 0xfa, 0xb4, 0x9c, 0x5b, + 0xd6, 0xd5, 0xf3, 0x8f, 0x63, 0x98, 0x89, 0x7b, 0x93, 0xb2, 0x2e, 0x27, + 0x18, 0xe6, 0xf6, 0x3d, 0x9f, 0xaa, 0xc3, 0x96, 0xa4, 0xdc, 0x3b, 0x23, + 0x27, 0x36, 0x8a, 0x7d, 0xcf, 0xa5, 0x6e, 0xc1, 0x3d, 0xfb, 0x43, 0x68, + 0xdf, 0x8f, 0xba, 0x02, 0x8e, 0x21, 0x3f, 0xe8, 0xf7, 0x8d, 0x42, 0xf3, + 0x9d, 0xa6, 0x4e, 0x4e, 0x52, 0xce, 0x53, 0x1f, 0x91, 0x53, 0x74, 0x08, + 0xdf, 0x7d, 0x71, 0x37, 0x52, 0xc1, 0xcb, 0x56, 0xcc, 0xe6, 0xec, 0x1e, + 0xdf, 0xfd, 0x71, 0x1f, 0x32, 0x76, 0xee, 0xf0, 0xeb, 0x7c, 0xc1, 0xfc, + 0x9e, 0x64, 0x2c, 0xa2, 0x22, 0x37, 0xbf, 0x7a, 0x48, 0xe6, 0xf6, 0xad, + 0xb8, 0xfc, 0x17, 0xf9, 0x9a, 0xca, 0x78, 0xa6, 0x32, 0xcf, 0xef, 0x97, + 0xb5, 0x7f, 0xd5, 0x2b, 0xfa, 0x91, 0xfb, 0x17, 0x31, 0xc9, 0x2d, 0xeb, + 0x78, 0x5d, 0x5b, 0x44, 0xb7, 0xa3, 0x9e, 0x0a, 0x0d, 0x8f, 0xaf, 0x76, + 0xdc, 0xeb, 0x33, 0xc7, 0xe1, 0xbb, 0x6e, 0x7c, 0xa6, 0x08, 0xe4, 0x18, + 0xea, 0x27, 0x61, 0x88, 0xc7, 0xb7, 0x29, 0x3e, 0x9f, 0xfc, 0x34, 0x66, + 0x2d, 0xad, 0xbf, 0x60, 0xcd, 0x0f, 0x1b, 0x99, 0x53, 0x94, 0xe1, 0xf2, + 0x4d, 0x7a, 0x6c, 0xae, 0xe3, 0xe4, 0x43, 0xda, 0x8c, 0x3e, 0x2e, 0x06, + 0xff, 0x4f, 0xfb, 0xc8, 0xc5, 0x47, 0xda, 0x43, 0xbd, 0x8c, 0x41, 0xe2, + 0x24, 0xf3, 0xd5, 0x0a, 0x19, 0xcb, 0x8d, 0xd3, 0x7c, 0x2f, 0x37, 0x2e, + 0x85, 0x73, 0xed, 0xa6, 0x2e, 0x72, 0xb1, 0xcf, 0xb2, 0xb6, 0x19, 0xde, + 0xe9, 0xf5, 0x71, 0xce, 0x59, 0xfa, 0xe4, 0xcd, 0x4e, 0x34, 0xd0, 0x0f, + 0x1a, 0xff, 0xdc, 0x89, 0x88, 0x37, 0x9f, 0x31, 0x59, 0xd6, 0xa5, 0x4e, + 0xd7, 0x4d, 0x59, 0x93, 0xcc, 0x53, 0x1a, 0xd3, 0x72, 0xef, 0xc9, 0x41, + 0xfb, 0xb6, 0xf0, 0xb8, 0x29, 0xff, 0x0b, 0x3e, 0xc5, 0xa2, 0x0e, 0xda, + 0x8a, 0xdb, 0xd0, 0x5b, 0xff, 0x5e, 0x29, 0xa5, 0x2b, 0x3b, 0x03, 0x93, + 0xd0, 0x43, 0x5b, 0x14, 0xfa, 0x61, 0x79, 0x8d, 0x29, 0x53, 0xf0, 0xe3, + 0xb8, 0xdf, 0xf4, 0x4f, 0xc7, 0xb3, 0xf3, 0x9c, 0xbb, 0xf7, 0xe2, 0x46, + 0xfb, 0x33, 0xd3, 0xe7, 0x3f, 0x4b, 0xcd, 0x5c, 0x3b, 0x17, 0x7b, 0x74, + 0xbb, 0xb7, 0xc7, 0x71, 0xd1, 0x51, 0x8f, 0x8b, 0x87, 0xcc, 0x3c, 0x2c, + 0x6d, 0x11, 0x3b, 0x75, 0xbb, 0x77, 0xc6, 0x31, 0xe5, 0xe4, 0xb5, 0xf3, + 0xe6, 0x3c, 0x9c, 0xd6, 0xec, 0xb5, 0x4d, 0x89, 0x2d, 0x51, 0x8d, 0x71, + 0xb9, 0x30, 0xec, 0x71, 0x17, 0x8e, 0x43, 0x2b, 0x20, 0x77, 0x72, 0x87, + 0xd1, 0xe4, 0x48, 0xe8, 0xbe, 0x66, 0x47, 0x1d, 0x56, 0xa6, 0x7d, 0xe4, + 0xdf, 0x53, 0xe4, 0xab, 0xf6, 0x3d, 0x40, 0xda, 0xa4, 0x93, 0x15, 0x06, + 0xe6, 0xa8, 0x61, 0xc9, 0xbf, 0x4b, 0x71, 0xaf, 0xb6, 0xf5, 0x33, 0x6a, + 0xb8, 0x1f, 0x77, 0xd4, 0xbb, 0x9b, 0xca, 0xc6, 0x73, 0x3a, 0x41, 0xb4, + 0x38, 0x0c, 0xad, 0xd4, 0x80, 0x5a, 0x12, 0x16, 0xdd, 0xf8, 0x9a, 0x12, + 0x63, 0x22, 0xab, 0xe6, 0xee, 0x1b, 0xcb, 0x2f, 0x40, 0x61, 0x84, 0x98, + 0xf6, 0x23, 0xef, 0x7f, 0xae, 0xde, 0xff, 0x72, 0x0b, 0x46, 0xba, 0x0c, + 0xf9, 0xb6, 0x6d, 0x8b, 0xf9, 0xcb, 0xe9, 0xbb, 0xdc, 0x7e, 0xcb, 0x62, + 0x7c, 0xf5, 0x42, 0x99, 0xc7, 0xf1, 0xd0, 0xd7, 0x18, 0xcf, 0xda, 0x52, + 0xbf, 0xb3, 0x3e, 0xeb, 0xb4, 0xb9, 0x03, 0xf9, 0x56, 0x24, 0xfa, 0x8e, + 0xf1, 0x5b, 0x4b, 0x78, 0x8c, 0x93, 0x3e, 0x9d, 0x67, 0xcc, 0xc7, 0x6e, + 0xd3, 0xd9, 0xbc, 0x5c, 0x51, 0xd0, 0x63, 0xd4, 0x68, 0x05, 0x8c, 0x6f, + 0xdb, 0xe8, 0xd7, 0x51, 0x8f, 0x11, 0x38, 0x04, 0x96, 0x4b, 0x6d, 0xda, + 0xe4, 0x0a, 0xdf, 0x7f, 0xf7, 0xe1, 0x7a, 0xc1, 0x02, 0xdc, 0xfd, 0x8c, + 0xd1, 0x4a, 0xde, 0xf6, 0x75, 0xf2, 0xbb, 0x6c, 0x3f, 0x19, 0xcc, 0xff, + 0x84, 0x7e, 0x36, 0x6d, 0xca, 0x0f, 0x0b, 0x7f, 0xcb, 0x44, 0x8f, 0x18, + 0xcd, 0xcc, 0xdd, 0xee, 0xbf, 0xfb, 0x7c, 0xfd, 0x01, 0x7e, 0x67, 0xeb, + 0x0c, 0xa3, 0xec, 0x13, 0xeb, 0x14, 0x85, 0xa5, 0x8f, 0x48, 0xf4, 0x19, + 0xe3, 0xfe, 0xbb, 0xdb, 0x97, 0x1c, 0xc6, 0xf6, 0x74, 0xc7, 0x7f, 0xd8, + 0x4f, 0x09, 0xeb, 0x14, 0x86, 0x63, 0x77, 0xdf, 0xe6, 0xbf, 0xff, 0xee, + 0xd4, 0x92, 0x7e, 0xf6, 0xb1, 0x0e, 0xf1, 0xe9, 0x3a, 0x11, 0xc5, 0xf1, + 0x89, 0x3a, 0x28, 0x08, 0xf7, 0xdf, 0xbd, 0xd0, 0xff, 0x5b, 0xab, 0xa6, + 0x2f, 0xcf, 0xd6, 0x81, 0x8b, 0x3a, 0x78, 0xd4, 0x74, 0x66, 0xfc, 0x0e, + 0x5b, 0x07, 0x9d, 0x5e, 0xea, 0x20, 0x41, 0x1d, 0x64, 0x66, 0x1b, 0xa1, + 0xf7, 0xa9, 0x83, 0x9a, 0xb1, 0x4d, 0x9b, 0x0a, 0xc2, 0x70, 0x3a, 0x8c, + 0xd7, 0x1c, 0xcc, 0xa7, 0x54, 0x97, 0xb1, 0x89, 0x7a, 0xbb, 0xff, 0xee, + 0x05, 0x4b, 0x6c, 0x9d, 0xaf, 0x73, 0xfb, 0x1f, 0xa4, 0xdd, 0x34, 0xd1, + 0xd6, 0xb7, 0xf2, 0x68, 0xe1, 0xd1, 0xc3, 0x23, 0x8e, 0xdd, 0xe9, 0x36, + 0xea, 0x6a, 0x35, 0xc7, 0xb1, 0x96, 0x72, 0x75, 0xf2, 0x77, 0x94, 0xbf, + 0x63, 0xfc, 0x2d, 0xf3, 0xa3, 0x5e, 0x91, 0x2d, 0x7a, 0x45, 0x36, 0x07, + 0xe5, 0x29, 0xb6, 0xd7, 0x31, 0x0b, 0xc3, 0xe7, 0xd6, 0xdd, 0xe6, 0x6f, + 0x67, 0x1b, 0xe3, 0x05, 0xb2, 0xe7, 0xc0, 0x65, 0xc4, 0xbc, 0x4e, 0x88, + 0x7c, 0x7a, 0x6b, 0x3b, 0x32, 0xc4, 0xde, 0xdf, 0x64, 0xb1, 0x97, 0xb2, + 0x95, 0x72, 0x7e, 0xce, 0x2e, 0x19, 0xbe, 0xa6, 0xd8, 0x80, 0xd7, 0x6d, + 0xf4, 0xa2, 0x2f, 0x3d, 0x44, 0x1d, 0x88, 0x9d, 0x3c, 0x4c, 0xfd, 0x75, + 0xb1, 0xce, 0x49, 0xc6, 0x32, 0x3d, 0x42, 0x9f, 0xa5, 0xcd, 0xea, 0x21, + 0x1e, 0xb4, 0x97, 0xa7, 0xd9, 0xee, 0x30, 0x65, 0xca, 0xa3, 0xfd, 0x2a, + 0x90, 0xfb, 0xbb, 0xa7, 0xd9, 0xfe, 0x11, 0xe3, 0x57, 0x45, 0x27, 0x39, + 0xf6, 0x88, 0x67, 0x13, 0x46, 0xea, 0x44, 0x57, 0x31, 0xea, 0x4a, 0xf7, + 0xfa, 0x66, 0xe8, 0xf2, 0xaa, 0xbc, 0xd7, 0x92, 0x87, 0x58, 0xd6, 0x9b, + 0x46, 0xe3, 0x42, 0x26, 0x93, 0x18, 0xb6, 0x73, 0x2c, 0xcb, 0xca, 0xb3, + 0xf7, 0xae, 0xc5, 0xee, 0xde, 0x60, 0x88, 0xbc, 0xb5, 0x2d, 0xdb, 0x69, + 0x9c, 0x9b, 0x52, 0xf4, 0x67, 0xff, 0x6f, 0xac, 0xc8, 0x6c, 0xa9, 0x37, + 0x1f, 0x6f, 0x30, 0xf6, 0x46, 0xb4, 0x58, 0xbb, 0x5b, 0xf2, 0x02, 0xc3, + 0x19, 0x5a, 0x8d, 0x58, 0xab, 0x9b, 0x72, 0xdd, 0x43, 0xce, 0x7a, 0xde, + 0xc8, 0xfa, 0xf1, 0xd1, 0x94, 0x1e, 0x79, 0x9c, 0xe7, 0xe4, 0xce, 0xe4, + 0x60, 0xb9, 0x38, 0x15, 0x20, 0x5f, 0x2e, 0x86, 0x93, 0xb9, 0x57, 0x93, + 0xa3, 0x3b, 0xc0, 0x88, 0x5d, 0x2c, 0xfb, 0xa9, 0x08, 0x7b, 0x1c, 0xa3, + 0xe0, 0xb6, 0x5b, 0x6b, 0xb3, 0xb1, 0x3c, 0xb6, 0xd0, 0x85, 0x62, 0x6d, + 0x63, 0x2a, 0x17, 0xe3, 0x8a, 0xb5, 0xf5, 0x71, 0xc1, 0x05, 0xb9, 0x27, + 0x1b, 0xa2, 0x9e, 0x05, 0x1f, 0x7e, 0x65, 0xef, 0x73, 0x23, 0x46, 0x94, + 0x3a, 0x8d, 0x6c, 0xbb, 0x1a, 0xdb, 0x6d, 0x71, 0x68, 0xb8, 0xea, 0xe3, + 0xba, 0xd6, 0xe2, 0x90, 0x3d, 0x78, 0x44, 0xaf, 0xd4, 0x74, 0xbd, 0x2c, + 0xce, 0x35, 0xb8, 0x6c, 0x9c, 0x63, 0x1b, 0xcc, 0x57, 0x96, 0xc6, 0x3f, + 0xde, 0xbf, 0xf4, 0x27, 0xfd, 0x76, 0x97, 0xab, 0x90, 0x3d, 0x40, 0x72, + 0xbf, 0xac, 0x9d, 0x79, 0xde, 0xcc, 0x7d, 0x40, 0xfa, 0x04, 0xdb, 0x3f, + 0x1e, 0xe3, 0x7c, 0xce, 0x33, 0x64, 0x8f, 0x90, 0xdc, 0x5f, 0x9b, 0xb9, + 0x27, 0x48, 0x64, 0x5b, 0x54, 0x28, 0x5c, 0xe6, 0x08, 0x71, 0x32, 0xd2, + 0x22, 0xf5, 0x2d, 0xeb, 0x5f, 0x6b, 0x02, 0xc8, 0xcc, 0x72, 0x62, 0xa8, + 0x1a, 0x18, 0x4c, 0x88, 0xae, 0x33, 0x77, 0x6d, 0x30, 0xfe, 0xdd, 0x8a, + 0x54, 0xd4, 0x6a, 0xdb, 0x54, 0x59, 0x07, 0x39, 0xbd, 0xae, 0xc7, 0xa8, + 0xd2, 0x7a, 0xd4, 0xcc, 0x31, 0xc6, 0xa1, 0x03, 0xc0, 0x67, 0x0b, 0x05, + 0x2b, 0xca, 0x8d, 0x48, 0x6f, 0x39, 0xaa, 0xe1, 0xab, 0xb0, 0xf1, 0x3b, + 0xf6, 0x6d, 0xd5, 0x08, 0xac, 0x11, 0xde, 0xaa, 0x5e, 0xb6, 0x86, 0x69, + 0x03, 0x5f, 0xad, 0xfe, 0xb0, 0x20, 0x8b, 0xed, 0x91, 0xf6, 0x39, 0x9c, + 0x97, 0x77, 0x17, 0xe9, 0xbe, 0x94, 0x22, 0x3a, 0x12, 0xbe, 0x35, 0x84, + 0x5d, 0x8c, 0xc7, 0xff, 0x5e, 0x1d, 0xc6, 0x51, 0x7e, 0xff, 0xf4, 0x16, + 0xd9, 0xff, 0x66, 0x59, 0x01, 0x7f, 0x4d, 0xa8, 0x9c, 0x63, 0x78, 0x8e, + 0xff, 0xf7, 0xa6, 0xdf, 0xb1, 0xce, 0xcf, 0x31, 0xfa, 0x57, 0x30, 0x28, + 0x0e, 0x8e, 0xeb, 0xda, 0x94, 0xfa, 0x9f, 0xdd, 0x8f, 0x63, 0xaf, 0x87, + 0xdd, 0xf5, 0xa2, 0xbf, 0x56, 0x4b, 0xa8, 0xd7, 0x17, 0x8a, 0x5e, 0x07, + 0xc7, 0x5f, 0x9d, 0x8e, 0xf3, 0xd9, 0xfb, 0xa0, 0x4f, 0x5d, 0xd1, 0x8f, + 0xdc, 0xd3, 0x9d, 0x4f, 0x9b, 0x8b, 0x90, 0x46, 0xc2, 0x3d, 0x8b, 0x63, + 0xfe, 0x6a, 0xf5, 0xdf, 0xd8, 0xe3, 0xac, 0x30, 0xe6, 0x72, 0x8c, 0x0a, + 0xb4, 0xea, 0xd9, 0x85, 0x59, 0x4e, 0xd8, 0x48, 0x96, 0x36, 0x6c, 0x35, + 0xd1, 0x87, 0xf2, 0x58, 0x67, 0x99, 0x79, 0xf0, 0x9a, 0xee, 0x3a, 0xdd, + 0xfb, 0x55, 0xda, 0x6a, 0xb0, 0xfa, 0x97, 0x56, 0x44, 0x73, 0x9a, 0x4f, + 0x70, 0xd4, 0xf7, 0xc4, 0xa5, 0xac, 0xcc, 0xab, 0x11, 0xa9, 0x56, 0xde, + 0xb3, 0x30, 0xdb, 0x1f, 0xaa, 0xb6, 0xc7, 0x0f, 0x6c, 0x4e, 0x0d, 0x31, + 0xc7, 0x96, 0x36, 0x15, 0xac, 0xf0, 0xff, 0xd8, 0xf2, 0xcd, 0x19, 0xc2, + 0xce, 0xf4, 0x1f, 0xe3, 0xbe, 0x5f, 0x27, 0xf7, 0xd6, 0x5b, 0x63, 0x59, + 0xbf, 0x6b, 0x06, 0xfb, 0x95, 0xfb, 0x4f, 0xcc, 0xdf, 0xa3, 0x71, 0x3f, + 0xdc, 0x25, 0xc4, 0xea, 0x31, 0xbf, 0xec, 0xdb, 0xf0, 0x20, 0xd3, 0x22, + 0x65, 0xaa, 0xb4, 0x31, 0x64, 0xc8, 0x30, 0x65, 0x8f, 0xc9, 0xb7, 0x0b, + 0xb3, 0xeb, 0x0f, 0x0e, 0x59, 0x23, 0xd7, 0xde, 0x22, 0x27, 0x6c, 0x36, + 0xa4, 0x0d, 0x05, 0x0b, 0xfd, 0xb3, 0x50, 0xbb, 0xe6, 0xb5, 0xd7, 0xf3, + 0xfc, 0x59, 0xbf, 0xed, 0x31, 0x8c, 0x8e, 0x53, 0xf8, 0x15, 0xb1, 0x4a, + 0xf6, 0xa0, 0x7c, 0x4b, 0xea, 0xb1, 0xad, 0x6a, 0xa4, 0xc8, 0xbb, 0x47, + 0x0c, 0xd9, 0x43, 0x69, 0x59, 0xb7, 0xf9, 0xdf, 0xa6, 0xdf, 0x51, 0x9e, + 0xb4, 0x73, 0xba, 0xae, 0x94, 0x99, 0xde, 0xdf, 0xa1, 0x34, 0xde, 0x2d, + 0x3a, 0x79, 0xda, 0x8c, 0x31, 0xdb, 0x90, 0xf8, 0x70, 0xfa, 0xae, 0x77, + 0x0c, 0xe1, 0xfe, 0xba, 0xb9, 0x42, 0x29, 0x63, 0xbc, 0x75, 0xfa, 0x0e, + 0xdb, 0xeb, 0x20, 0x11, 0x62, 0xb9, 0xf0, 0x50, 0xc9, 0x29, 0x9d, 0x78, + 0xc6, 0x28, 0xc7, 0xd3, 0x5a, 0x96, 0xd3, 0x11, 0x13, 0xf1, 0x52, 0xbc, + 0x26, 0x43, 0x0f, 0x21, 0x37, 0x36, 0xda, 0x2f, 0x29, 0xbf, 0x62, 0xbe, + 0x09, 0x9c, 0x4d, 0x75, 0xe2, 0x51, 0xb9, 0xc7, 0xa5, 0x54, 0x35, 0xd7, + 0x3a, 0xa4, 0xbf, 0x4e, 0xec, 0xb2, 0xd7, 0xdb, 0x4e, 0xdf, 0x75, 0xc4, + 0xf8, 0x6f, 0xd3, 0xb2, 0x0a, 0xe6, 0x9f, 0xbe, 0xeb, 0x19, 0xe3, 0x65, + 0x7b, 0xee, 0x64, 0x3f, 0x43, 0xaf, 0x29, 0xd8, 0x58, 0x08, 0x95, 0x79, + 0x89, 0xc3, 0x58, 0x07, 0x47, 0xf9, 0x61, 0xda, 0x9e, 0xac, 0x13, 0xdd, + 0x05, 0x67, 0xb9, 0x8b, 0xbe, 0xb9, 0x19, 0xae, 0x72, 0xe1, 0xf4, 0x39, + 0xbe, 0xdd, 0xcc, 0xff, 0x45, 0xb7, 0xb8, 0x5b, 0x74, 0xeb, 0x24, 0xf6, + 0xf4, 0x48, 0xde, 0x68, 0x94, 0x51, 0x47, 0x7a, 0xab, 0xac, 0xbf, 0x96, + 0x10, 0x5b, 0x19, 0x47, 0xdd, 0x65, 0x2c, 0xf3, 0x3e, 0xf5, 0x5e, 0xd3, + 0x57, 0x44, 0xae, 0x6f, 0x59, 0x97, 0xc9, 0xf5, 0x17, 0xfa, 0x6b, 0x33, + 0x06, 0xe3, 0x1f, 0x3e, 0xaf, 0x37, 0xcb, 0xfd, 0xe3, 0x0d, 0xc6, 0x25, + 0x2b, 0xba, 0x56, 0xca, 0xe8, 0xde, 0xa8, 0x92, 0xeb, 0x63, 0x11, 0x7c, + 0xb3, 0x2c, 0xb8, 0xc2, 0x16, 0xb1, 0x4b, 0x37, 0x23, 0x68, 0x94, 0xb5, + 0xe5, 0x16, 0x19, 0xbf, 0x4b, 0xee, 0x8d, 0x20, 0x32, 0xe9, 0x82, 0x91, + 0x39, 0x2a, 0x73, 0x76, 0x8d, 0x05, 0xff, 0xe2, 0xdf, 0x30, 0xd7, 0x92, + 0xf9, 0xa9, 0xca, 0xd4, 0x29, 0x99, 0x80, 0x97, 0xdc, 0xff, 0x1b, 0xd0, + 0x5b, 0xe2, 0xd4, 0x75, 0x53, 0xd0, 0xc6, 0x3c, 0x6f, 0x1c, 0x36, 0xdf, + 0x37, 0xdf, 0xc0, 0x67, 0x51, 0xc2, 0xdc, 0xb8, 0x7a, 0x6c, 0x35, 0x4a, + 0xcb, 0x23, 0xde, 0x42, 0xdc, 0xc8, 0xf3, 0xad, 0xcc, 0x63, 0xbe, 0x80, + 0xd2, 0x35, 0x51, 0xc4, 0x93, 0x92, 0x43, 0x7d, 0x89, 0xd7, 0x7a, 0x90, + 0x48, 0xba, 0x38, 0x8e, 0x1f, 0x59, 0xa5, 0xb3, 0x45, 0x36, 0xd3, 0x53, + 0x64, 0x30, 0x5f, 0xb7, 0x75, 0x41, 0x2c, 0x4f, 0x0a, 0x97, 0xaa, 0x8d, + 0x6c, 0xc1, 0xef, 0x68, 0xbb, 0x7a, 0x6b, 0x9b, 0x12, 0xa3, 0xcd, 0xc6, + 0xa9, 0x73, 0x29, 0x6b, 0x59, 0x2b, 0xfd, 0x45, 0x45, 0x28, 0x8c, 0xf1, + 0xdc, 0xf0, 0xbd, 0x4d, 0x22, 0x97, 0x8f, 0x73, 0x56, 0x4c, 0xf3, 0xd2, + 0x2e, 0xd5, 0xb5, 0xc2, 0xbb, 0x96, 0x07, 0x67, 0xf1, 0x7f, 0x6d, 0xda, + 0x4e, 0x33, 0xd1, 0xac, 0x2e, 0x41, 0x5d, 0xfe, 0xba, 0x50, 0xae, 0x3b, + 0xec, 0xeb, 0x91, 0xe9, 0xeb, 0x99, 0x68, 0x8f, 0x71, 0x99, 0xd7, 0xfb, + 0xa9, 0x7b, 0xf5, 0x5a, 0xa9, 0xbf, 0xc9, 0x94, 0xfa, 0xa4, 0x23, 0x46, + 0x7c, 0x7a, 0x3e, 0x62, 0xd3, 0xf3, 0xd1, 0x3f, 0xdd, 0x86, 0x93, 0x6d, + 0xc4, 0x22, 0x85, 0x30, 0x51, 0xe4, 0x17, 0x9c, 0x17, 0xb9, 0x38, 0x77, + 0x69, 0x91, 0x6b, 0x2b, 0xe3, 0x62, 0xf7, 0x99, 0x42, 0xc4, 0x3a, 0xe7, + 0xda, 0x76, 0x98, 0x21, 0x4f, 0xd1, 0x7d, 0xef, 0x28, 0x8d, 0x5e, 0x59, + 0x0e, 0x4a, 0x92, 0xf3, 0x3e, 0x64, 0x3a, 0x43, 0x75, 0x8e, 0x9a, 0x4c, + 0x3e, 0x8c, 0xe8, 0x25, 0x25, 0x50, 0x24, 0xf8, 0x10, 0x4f, 0x35, 0x32, + 0x43, 0x8b, 0x05, 0x98, 0x5b, 0x05, 0xd2, 0xd4, 0xed, 0x7a, 0x22, 0xf6, + 0x84, 0xbd, 0x9f, 0xc9, 0x39, 0xb9, 0x1a, 0x8d, 0xba, 0x03, 0x35, 0xa1, + 0xb9, 0xcc, 0xd0, 0x68, 0x97, 0x66, 0xbe, 0x43, 0xf7, 0xdd, 0x81, 0xad, + 0x76, 0xbd, 0xa3, 0xa9, 0x4c, 0x7b, 0x21, 0xe7, 0xf4, 0x9b, 0x94, 0x63, + 0xb7, 0x5f, 0xe4, 0x38, 0x3c, 0x2d, 0x47, 0x94, 0x31, 0xd7, 0xd4, 0x56, + 0xf9, 0xfb, 0xaf, 0xe8, 0xed, 0x8c, 0xad, 0xb7, 0x1e, 0x9e, 0xe7, 0x63, + 0x07, 0xf9, 0xe3, 0xc9, 0x3a, 0x0f, 0xb2, 0xf7, 0x5f, 0x24, 0xa7, 0x13, + 0xfc, 0x9d, 0xbc, 0x73, 0x83, 0xa1, 0x87, 0x1c, 0x36, 0xff, 0x77, 0x23, + 0x66, 0x73, 0x6b, 0x07, 0x84, 0x3b, 0x3e, 0x6e, 0x97, 0x73, 0x51, 0x27, + 0x45, 0xf8, 0xc6, 0xb4, 0xbf, 0x14, 0x31, 0xbe, 0x7d, 0xd3, 0xfe, 0x3d, + 0xcc, 0xb9, 0x75, 0xd1, 0x57, 0x73, 0x31, 0x4a, 0xd6, 0x15, 0x1f, 0xb5, + 0x7d, 0x7f, 0x18, 0xef, 0xd8, 0xdf, 0x99, 0x6c, 0x5e, 0x86, 0x1e, 0xfa, + 0x84, 0x83, 0x6d, 0x6c, 0xb3, 0xf7, 0xa9, 0xca, 0x1a, 0xc3, 0x2d, 0xd8, + 0xc1, 0x51, 0xb9, 0x8d, 0x76, 0xf4, 0x6a, 0x62, 0x13, 0x5d, 0x48, 0x68, + 0xa6, 0x27, 0x5d, 0x37, 0x33, 0xa7, 0x32, 0x71, 0xa8, 0xee, 0xb7, 0x8c, + 0xe5, 0x72, 0xed, 0x9c, 0x75, 0xc4, 0x38, 0x19, 0xa4, 0x07, 0xb7, 0xe7, + 0xd9, 0xfa, 0xc5, 0xdd, 0xf6, 0x9e, 0x2e, 0xca, 0x7c, 0x26, 0x2e, 0x71, + 0x74, 0x3e, 0x52, 0xa6, 0xc8, 0xe6, 0x6c, 0xd9, 0xc3, 0x39, 0xe9, 0x49, + 0xfa, 0x23, 0xd7, 0xf1, 0xbf, 0x49, 0xc6, 0xb2, 0x6d, 0xd4, 0x67, 0xb4, + 0x45, 0x78, 0xdc, 0x56, 0x1c, 0xa0, 0x8d, 0x8d, 0x9b, 0x96, 0x75, 0x94, + 0x18, 0x51, 0x56, 0xa3, 0x22, 0x33, 0x7b, 0x2b, 0x92, 0x8c, 0x4d, 0x47, + 0x8d, 0xc6, 0xcf, 0xe6, 0x21, 0xe6, 0x63, 0x0c, 0xf7, 0xee, 0xe4, 0x68, + 0x1e, 0xe2, 0x7c, 0x9d, 0x34, 0x85, 0x5f, 0x3a, 0x2f, 0x2d, 0x87, 0x11, + 0x6a, 0x70, 0xfc, 0xc8, 0x9a, 0x12, 0xd9, 0x93, 0xdd, 0xff, 0x83, 0x32, + 0x74, 0x88, 0xf3, 0x96, 0x71, 0x8e, 0xdf, 0xf7, 0xeb, 0xcd, 0x2f, 0xb1, + 0x9f, 0xda, 0xbe, 0xc6, 0x76, 0x91, 0xe1, 0x48, 0xd0, 0x19, 0x3d, 0x0a, + 0x7f, 0xcb, 0x56, 0x25, 0x97, 0x43, 0x00, 0xd7, 0x8d, 0x99, 0x18, 0xad, + 0x7b, 0x8e, 0x7c, 0x47, 0xea, 0xe7, 0xe3, 0x7b, 0xe6, 0xb3, 0x56, 0xd5, + 0x35, 0x2f, 0x5a, 0xc7, 0x0c, 0x75, 0x0b, 0xb5, 0x1d, 0x2d, 0x81, 0xac, + 0x85, 0x66, 0xa2, 0xf7, 0xfa, 0x75, 0x73, 0x0f, 0xdb, 0x3a, 0x1d, 0x3f, + 0x19, 0x70, 0xb3, 0xad, 0x6f, 0x98, 0x92, 0x43, 0x38, 0x9b, 0x9b, 0x39, + 0xb7, 0xdd, 0x49, 0xbf, 0x57, 0xd6, 0x7b, 0x25, 0xcf, 0xbb, 0x2b, 0x2e, + 0xfb, 0xcd, 0x0f, 0x73, 0x3c, 0x91, 0x0e, 0x17, 0x1a, 0x1f, 0x2a, 0xa5, + 0xfd, 0x94, 0x21, 0x67, 0xeb, 0xba, 0x97, 0x78, 0x87, 0x7b, 0x59, 0xe6, + 0x75, 0xff, 0x7c, 0x9c, 0x0d, 0x36, 0xae, 0x99, 0x0f, 0x67, 0xf4, 0x98, + 0xe2, 0x6f, 0xde, 0xaa, 0xc4, 0x34, 0xb1, 0xc5, 0x7b, 0x52, 0x7a, 0xa0, + 0x09, 0x82, 0xdd, 0x51, 0xea, 0x63, 0x3e, 0x2e, 0x2f, 0x16, 0xb9, 0x9c, + 0xa1, 0x80, 0xc3, 0xdf, 0xf9, 0xac, 0x6c, 0xa5, 0xac, 0x11, 0xd9, 0x81, + 0xb4, 0xbd, 0x67, 0x3c, 0x8a, 0x44, 0xfa, 0xdc, 0xfb, 0x47, 0x0c, 0x38, + 0x27, 0xea, 0x1e, 0xb5, 0x30, 0x4b, 0xca, 0x36, 0xca, 0x3c, 0xb4, 0xca, + 0x3c, 0x14, 0xd2, 0x9f, 0x6e, 0xa3, 0xdc, 0x5b, 0x6c, 0xb9, 0xe7, 0x63, + 0xc4, 0x94, 0xf5, 0x35, 0xa7, 0x76, 0x0f, 0xfa, 0x89, 0x9d, 0xfe, 0x4b, + 0xdd, 0xec, 0xe7, 0x75, 0xca, 0x5c, 0x43, 0xbd, 0x4f, 0xb5, 0x08, 0xbf, + 0xed, 0x41, 0x9f, 0xbd, 0x17, 0x59, 0xfa, 0x50, 0x90, 0xf2, 0x4b, 0x1f, + 0x3d, 0xe4, 0x7b, 0xdd, 0xd6, 0xd4, 0x6c, 0xb9, 0x3e, 0x8c, 0x1d, 0xc9, + 0x88, 0x46, 0x7f, 0xa0, 0xde, 0xa1, 0xcf, 0x87, 0x3e, 0xf9, 0x96, 0x23, + 0x42, 0x1f, 0x30, 0x3d, 0x97, 0x88, 0x0d, 0x13, 0xe8, 0xb4, 0x50, 0x6e, + 0xdb, 0xc3, 0x4f, 0x0f, 0x1b, 0x25, 0xb2, 0x46, 0x1f, 0xc8, 0x50, 0x07, + 0x2a, 0xe7, 0x44, 0x74, 0x50, 0x42, 0x9f, 0x1d, 0xf3, 0xeb, 0xbe, 0xb3, + 0x94, 0x67, 0x0f, 0xe5, 0x59, 0x9d, 0x9d, 0x43, 0xef, 0x0e, 0x45, 0x7c, + 0xda, 0xdf, 0xb2, 0x81, 0xd7, 0x77, 0x53, 0x1e, 0x7f, 0x9f, 0x82, 0x61, + 0xa2, 0x59, 0x0f, 0xf9, 0xec, 0x81, 0x19, 0xf2, 0xb8, 0xed, 0x39, 0x8b, + 0x91, 0x0b, 0xe4, 0xe3, 0x88, 0x29, 0xf8, 0xad, 0x61, 0x84, 0x76, 0x7a, + 0x88, 0x33, 0x12, 0xf1, 0xa8, 0xc8, 0x37, 0x04, 0x03, 0x66, 0xf3, 0x9a, + 0x8b, 0x73, 0x53, 0x86, 0x63, 0xda, 0x30, 0xe3, 0x64, 0x8e, 0xdb, 0xfd, + 0xce, 0x1a, 0xf5, 0x08, 0x3f, 0x93, 0xf5, 0x37, 0xb9, 0xdf, 0xf1, 0xcd, + 0xa2, 0xec, 0xde, 0x4b, 0x17, 0x75, 0x92, 0xbd, 0x7e, 0x46, 0x13, 0x8e, + 0x9c, 0x2b, 0xff, 0x6f, 0xd6, 0xd3, 0x76, 0x79, 0x29, 0xe7, 0xb2, 0xb9, + 0x7c, 0xa1, 0x5d, 0xee, 0xdf, 0xac, 0xe7, 0x34, 0xe7, 0x8c, 0x72, 0xb9, + 0xfd, 0x79, 0x27, 0xbf, 0xe6, 0x22, 0xe6, 0x39, 0xaa, 0x1b, 0xf0, 0xb4, + 0x71, 0xae, 0x6a, 0x7d, 0x5d, 0x17, 0xe3, 0x58, 0x8e, 0x6b, 0x55, 0xd2, + 0xaf, 0x2c, 0x0c, 0x98, 0x27, 0x07, 0xf2, 0xd0, 0x4d, 0xee, 0x28, 0x5c, + 0x40, 0x38, 0xaa, 0xac, 0x0f, 0xde, 0x5b, 0x78, 0x35, 0xe7, 0xd5, 0x03, + 0x3e, 0xf5, 0x4e, 0x9b, 0x1b, 0x46, 0x54, 0xc1, 0xdd, 0x4a, 0x7b, 0xec, + 0x57, 0xe3, 0xbf, 0xc4, 0x8a, 0x99, 0xeb, 0x7d, 0x5d, 0x38, 0x64, 0xe4, + 0x38, 0xcb, 0xc9, 0x47, 0x55, 0xe2, 0xe4, 0xa0, 0xd9, 0x20, 0xb1, 0xd9, + 0xc7, 0xfa, 0x81, 0xa8, 0x3a, 0x93, 0xdb, 0x24, 0x8a, 0x50, 0xda, 0xbd, + 0xcb, 0x01, 0xd9, 0x1b, 0x2c, 0xfb, 0xb9, 0xa5, 0xaf, 0x82, 0xe9, 0xf5, + 0xab, 0x4f, 0xe2, 0x1a, 0xb9, 0xbe, 0x84, 0x6f, 0x54, 0xe6, 0x64, 0x0c, + 0x44, 0x6c, 0x39, 0x7f, 0x61, 0xad, 0xd1, 0x32, 0x73, 0x35, 0x7c, 0x54, + 0xf6, 0xc8, 0xb4, 0xec, 0xd1, 0x4f, 0x5c, 0xb7, 0x93, 0x7e, 0x66, 0xb6, + 0x99, 0xdb, 0x97, 0x2a, 0x6b, 0xba, 0xf2, 0x9f, 0x82, 0x6e, 0xe2, 0x50, + 0x44, 0x6b, 0x64, 0x9c, 0xd7, 0xbd, 0x1b, 0x39, 0x1f, 0x31, 0x8f, 0xec, + 0x79, 0xcd, 0xc5, 0xc8, 0x7c, 0x64, 0xd7, 0x56, 0x81, 0x43, 0xd3, 0xeb, + 0xa9, 0xb4, 0x7b, 0x74, 0xa7, 0x7e, 0x63, 0x65, 0x3c, 0x4e, 0xc6, 0xc2, + 0xab, 0x7b, 0xf3, 0x87, 0xa9, 0xd7, 0x11, 0xfe, 0xb7, 0xe3, 0xca, 0xba, + 0x8b, 0xac, 0x3d, 0x49, 0xec, 0xfd, 0xb5, 0xb5, 0xfe, 0x23, 0x65, 0x67, + 0xee, 0x8b, 0x9d, 0x1d, 0x95, 0xbd, 0x6a, 0xa3, 0xd3, 0xeb, 0xfa, 0x4d, + 0xbf, 0xbf, 0x57, 0x8d, 0xb6, 0x84, 0xc8, 0x0e, 0x72, 0xbb, 0x18, 0x7a, + 0x30, 0x1a, 0xaf, 0xd5, 0x76, 0x42, 0x93, 0xf5, 0x6c, 0x7e, 0x7a, 0x70, + 0x2c, 0x8e, 0x48, 0xde, 0xf5, 0x65, 0xe4, 0x5b, 0x88, 0x38, 0x64, 0xff, + 0x50, 0xbc, 0xb6, 0x79, 0x37, 0xc7, 0xe4, 0x5b, 0xd3, 0x83, 0x91, 0x78, + 0xe3, 0x97, 0x18, 0x47, 0x7c, 0x45, 0x59, 0xae, 0xf3, 0xa5, 0x23, 0xc4, + 0x81, 0xed, 0xd3, 0x6b, 0x63, 0xeb, 0xe3, 0xbf, 0xa4, 0xfc, 0xb6, 0x90, + 0xac, 0xf7, 0xc7, 0xca, 0x9d, 0xc3, 0xb6, 0xe4, 0x39, 0x6c, 0xea, 0x57, + 0xc4, 0xbe, 0xb0, 0x71, 0x58, 0xe4, 0x39, 0x87, 0xb6, 0xfe, 0x7f, 0xc6, + 0xa1, 0xfe, 0x6b, 0xd0, 0x64, 0xeb, 0xa6, 0x13, 0x5b, 0xf7, 0x9e, 0xc0, + 0x9e, 0xa4, 0x85, 0xdd, 0xc1, 0x62, 0x6c, 0x39, 0xa8, 0x60, 0xa5, 0xff, + 0x34, 0x76, 0xee, 0xb5, 0xb0, 0x20, 0xd8, 0x85, 0x66, 0xb3, 0x08, 0xf9, + 0xe5, 0x35, 0xed, 0x2a, 0xcb, 0xad, 0x1f, 0xe9, 0x54, 0x6e, 0xe7, 0xb8, + 0x33, 0xae, 0xe3, 0xc4, 0x02, 0x15, 0x5e, 0x43, 0xd6, 0x4b, 0x23, 0xca, + 0x9d, 0xe9, 0x26, 0xa5, 0x75, 0xc4, 0xe6, 0x53, 0xca, 0x1d, 0xe9, 0x85, + 0x25, 0x12, 0xd3, 0x0f, 0x05, 0xcf, 0x61, 0x78, 0x78, 0x7e, 0x49, 0xd6, + 0x5f, 0x72, 0xeb, 0xcc, 0x13, 0x18, 0x4c, 0xce, 0x5c, 0x63, 0x16, 0x5b, + 0x7b, 0x12, 0x7b, 0xc9, 0xc5, 0xef, 0x4c, 0xc4, 0x98, 0xeb, 0xbc, 0x6f, + 0x95, 0x86, 0x89, 0xd5, 0xe3, 0x06, 0x5a, 0x13, 0x85, 0x88, 0x1e, 0xb2, + 0xac, 0xb3, 0x4b, 0x9c, 0xe8, 0x1c, 0xaf, 0xc3, 0x9a, 0xc1, 0xc7, 0xac, + 0xa2, 0xb0, 0x65, 0x6d, 0x59, 0x52, 0x8c, 0x07, 0x0e, 0x15, 0xe3, 0x2b, + 0x89, 0x08, 0xdc, 0xe1, 0x22, 0xfe, 0xf6, 0x47, 0x2f, 0x2a, 0x46, 0x73, + 0x9f, 0x62, 0x84, 0xae, 0x53, 0xfc, 0xe6, 0x05, 0x14, 0x63, 0xd3, 0xb8, + 0x13, 0xcb, 0x12, 0x5e, 0x44, 0xc7, 0x2d, 0xe6, 0x65, 0x1e, 0x6c, 0x64, + 0xfd, 0xa5, 0x09, 0xcb, 0xea, 0xae, 0x77, 0x23, 0x7a, 0xd4, 0xb8, 0xb4, + 0x9e, 0x73, 0xd0, 0x35, 0xee, 0x66, 0x9f, 0xc7, 0xd1, 0x9f, 0xac, 0xc0, + 0xed, 0xfb, 0x7c, 0xec, 0xb3, 0x18, 0x6b, 0x12, 0x56, 0xc3, 0xab, 0xc1, + 0xd8, 0x43, 0x5e, 0x18, 0x78, 0x60, 0xdc, 0x83, 0xcf, 0x25, 0x74, 0xb6, + 0xad, 0xe0, 0xf9, 0x60, 0x00, 0xf7, 0x8d, 0x7b, 0x71, 0x5b, 0xe2, 0xe4, + 0x67, 0x8b, 0x11, 0x5b, 0x55, 0x84, 0x3a, 0x6c, 0x19, 0xaf, 0xc4, 0xf2, + 0x84, 0xac, 0xb1, 0x55, 0x62, 0xf3, 0x51, 0x93, 0x7d, 0xaa, 0x58, 0xc6, + 0x76, 0x9a, 0x12, 0xf3, 0xb0, 0xf1, 0x68, 0x3d, 0xda, 0xc6, 0x17, 0x63, + 0xe9, 0xa0, 0x93, 0xf1, 0xdf, 0x85, 0x08, 0xb9, 0xdb, 0xf2, 0x41, 0x99, + 0x8b, 0x87, 0xd1, 0x15, 0x37, 0xd9, 0xb7, 0x9c, 0x9f, 0x10, 0xdb, 0xc0, + 0xd1, 0xe1, 0xc5, 0x68, 0x1a, 0x54, 0x69, 0xc7, 0xf9, 0xcc, 0xa7, 0x14, + 0xdc, 0xce, 0xeb, 0x3b, 0x93, 0xb2, 0xa7, 0x03, 0xf8, 0x71, 0x7f, 0x36, + 0xe6, 0x5d, 0x18, 0xce, 0x5e, 0xef, 0x4b, 0x3e, 0xc5, 0xdc, 0xf3, 0x75, + 0x4b, 0x70, 0x65, 0xfc, 0xe0, 0x09, 0x72, 0xa9, 0x12, 0xac, 0x1e, 0xe8, + 0xc2, 0x9e, 0x60, 0x09, 0x56, 0xf1, 0x7c, 0x07, 0xcf, 0x27, 0xfb, 0x0d, + 0xca, 0x54, 0x82, 0x67, 0x87, 0x4f, 0x60, 0x80, 0x7e, 0xb4, 0x31, 0x51, + 0x82, 0xaa, 0x41, 0x85, 0x71, 0x37, 0x72, 0x59, 0x85, 0x31, 0xd9, 0x06, + 0x7f, 0xa6, 0xc1, 0x51, 0x82, 0xd0, 0xa1, 0x13, 0xe8, 0xe5, 0xd8, 0x5b, + 0xf6, 0x9d, 0x63, 0x7f, 0x2a, 0xb4, 0x23, 0xa2, 0xb3, 0x13, 0xf8, 0x59, + 0xbf, 0x03, 0x69, 0xb3, 0x8a, 0xd8, 0xeb, 0xc0, 0x0b, 0x41, 0x5d, 0x4b, + 0x91, 0xab, 0x7e, 0x93, 0xd9, 0x4a, 0x74, 0x76, 0x3d, 0x9a, 0x0c, 0x93, + 0xc7, 0x09, 0xfc, 0x5b, 0xbf, 0x11, 0xfb, 0x16, 0x9c, 0x28, 0x5b, 0xa4, + 0x62, 0x8a, 0xf9, 0xf3, 0x36, 0x43, 0xec, 0x3b, 0x25, 0xbc, 0x4b, 0xd6, + 0x90, 0xe1, 0x18, 0x63, 0x8c, 0x3c, 0xd8, 0x80, 0xe6, 0xc1, 0x14, 0xdb, + 0x56, 0x28, 0x7f, 0x8a, 0xb2, 0x34, 0x70, 0xcc, 0x4e, 0xea, 0x47, 0x45, + 0xf5, 0xd1, 0x30, 0x36, 0xee, 0xff, 0x80, 0x7e, 0x6f, 0x59, 0xc7, 0xcd, + 0xd8, 0x2c, 0x15, 0x7e, 0x1f, 0x89, 0x6b, 0xa3, 0x23, 0xec, 0xbf, 0xb4, + 0x8d, 0xed, 0x36, 0x8c, 0xa7, 0xa8, 0x9b, 0x10, 0xe7, 0xc7, 0x8b, 0xef, + 0xa5, 0xea, 0x69, 0x0b, 0x95, 0x98, 0x48, 0x15, 0x63, 0x98, 0xc4, 0x64, + 0x38, 0xe5, 0xc1, 0xf0, 0xe1, 0x39, 0x3c, 0x7c, 0x3c, 0x16, 0xf0, 0x30, + 0xec, 0x6b, 0xeb, 0x13, 0x8a, 0xad, 0x3f, 0x59, 0xcb, 0xfb, 0xa4, 0x1c, + 0xe8, 0x50, 0x6a, 0x4e, 0x89, 0xdc, 0x5f, 0xfe, 0x7e, 0xcd, 0x39, 0xea, + 0x49, 0xf6, 0x90, 0xd6, 0xd1, 0x0e, 0xff, 0xd0, 0xb3, 0x2f, 0x62, 0x9b, + 0x53, 0x38, 0x35, 0xf4, 0x06, 0x4e, 0x0e, 0x7d, 0x16, 0x4b, 0x35, 0x59, + 0xef, 0x28, 0xc5, 0x9c, 0xf0, 0x39, 0x9c, 0xee, 0xff, 0x01, 0x75, 0x2c, + 0x98, 0x49, 0xdb, 0x0a, 0xd6, 0x86, 0x9a, 0xd4, 0x26, 0x4c, 0x31, 0xef, + 0x59, 0x59, 0x7d, 0x13, 0x76, 0x69, 0xc7, 0x19, 0x7b, 0xc4, 0x0f, 0xd7, + 0xe1, 0x48, 0x3c, 0x66, 0x79, 0x0c, 0x3d, 0x3a, 0xc1, 0xfc, 0x63, 0x48, + 0xa9, 0xc3, 0xe7, 0xd2, 0x6f, 0xe0, 0xb9, 0x21, 0x99, 0x2b, 0xbd, 0xf9, + 0x6f, 0x14, 0xab, 0xab, 0x29, 0xa8, 0x47, 0x6e, 0x54, 0x98, 0xe9, 0x41, + 0x3f, 0xc6, 0x44, 0x0a, 0xa3, 0xfb, 0x64, 0x1f, 0x41, 0x2b, 0x2c, 0xe6, + 0xf1, 0xbf, 0x32, 0x63, 0x73, 0x67, 0x33, 0x4e, 0xbe, 0xe9, 0xd0, 0x7b, + 0xe7, 0x3a, 0xba, 0xb0, 0x78, 0x91, 0xde, 0xf9, 0x37, 0xaa, 0x11, 0xab, + 0x57, 0xeb, 0xd0, 0x92, 0xd6, 0x0f, 0x7c, 0xc0, 0xf9, 0xbd, 0x9f, 0xba, + 0x7c, 0x3a, 0xd8, 0x8c, 0xec, 0x9e, 0x97, 0x37, 0x6c, 0x59, 0xe5, 0x78, + 0x75, 0x08, 0x31, 0xe6, 0x2c, 0x5d, 0x5d, 0x8c, 0x93, 0x97, 0x6b, 0xac, + 0xae, 0xe0, 0x62, 0x23, 0xe6, 0x24, 0x0f, 0x28, 0x57, 0xdf, 0xc0, 0x4b, + 0x87, 0xdf, 0xc0, 0x8b, 0x43, 0x70, 0x57, 0x84, 0xa3, 0xf8, 0x8b, 0x84, + 0xd5, 0xf5, 0x72, 0xf0, 0x75, 0x0c, 0xda, 0xb9, 0xb7, 0x17, 0x7f, 0x95, + 0x90, 0x35, 0x18, 0xcb, 0x5a, 0x5e, 0x5d, 0x47, 0x5b, 0x16, 0x1d, 0x4d, + 0x61, 0x92, 0xed, 0x9d, 0x19, 0x3a, 0x69, 0x05, 0xec, 0xf5, 0x66, 0xea, + 0xeb, 0x8f, 0xe6, 0xcc, 0x3a, 0x23, 0x67, 0x6e, 0xcf, 0xea, 0x3f, 0xe3, + 0x2c, 0x31, 0xe7, 0xb6, 0x6a, 0x0b, 0xa9, 0xa0, 0xde, 0x1a, 0xc7, 0x45, + 0x6b, 0x4b, 0xf9, 0xff, 0xdf, 0xba, 0xf9, 0xa7, 0xe9, 0x7d, 0xb6, 0x1a, + 0x36, 0x25, 0x32, 0x99, 0x0a, 0x72, 0xfc, 0xfb, 0x13, 0x91, 0x81, 0x0a, + 0xe8, 0x9d, 0xad, 0xaa, 0xde, 0xfa, 0x15, 0x47, 0x55, 0xfb, 0x8b, 0xe8, + 0xc5, 0x56, 0xbf, 0x6a, 0x3f, 0xcb, 0x76, 0x1f, 0x6d, 0x2e, 0x9e, 0xee, + 0xc5, 0xfa, 0x83, 0x61, 0x6c, 0xd9, 0x6f, 0xa2, 0x2d, 0x21, 0x36, 0x9b, + 0xb5, 0xd1, 0x96, 0x60, 0xac, 0x8a, 0x36, 0xda, 0xdc, 0x9f, 0xb5, 0xd1, + 0x48, 0x95, 0xe2, 0x44, 0x80, 0x18, 0xb3, 0x99, 0x65, 0xe2, 0xf4, 0xe1, + 0xae, 0x84, 0x9b, 0xf9, 0x50, 0x25, 0x76, 0x8e, 0x79, 0xf1, 0xd8, 0x18, + 0x11, 0x62, 0x4c, 0xe3, 0x51, 0x88, 0x8d, 0x83, 0x16, 0xb9, 0xa1, 0x07, + 0x8f, 0x1e, 0x71, 0xa3, 0x73, 0x5f, 0x31, 0x73, 0xb5, 0x39, 0x38, 0x70, + 0xa4, 0x10, 0x0f, 0xf0, 0xfa, 0xa7, 0x17, 0xf9, 0x90, 0xe4, 0xf5, 0x8e, + 0x7d, 0x2e, 0x94, 0x1b, 0x0b, 0xd0, 0xcf, 0xc0, 0x14, 0x1b, 0x2b, 0xa2, + 0xec, 0x0c, 0x59, 0xcc, 0x39, 0x9f, 0xa1, 0xcf, 0xed, 0x38, 0xa2, 0xa0, + 0xef, 0xa0, 0x89, 0x7b, 0xd9, 0x4f, 0x77, 0xf2, 0x38, 0xfd, 0xd5, 0x8d, + 0x55, 0x29, 0xe1, 0x68, 0x6b, 0x71, 0x5b, 0x9f, 0xee, 0x6b, 0x26, 0xee, + 0x0d, 0x41, 0xf6, 0xce, 0x0b, 0xe7, 0x5f, 0x8b, 0x0d, 0x71, 0x3d, 0xd4, + 0x8e, 0x2e, 0x58, 0xa6, 0x3e, 0xf9, 0x6b, 0x87, 0x9e, 0xf1, 0x3b, 0x64, + 0xac, 0x27, 0xc8, 0x87, 0x33, 0x38, 0x90, 0x26, 0x3b, 0x39, 0x28, 0x38, + 0xff, 0x14, 0xf9, 0xc3, 0xeb, 0xb4, 0x67, 0x15, 0xf7, 0x3f, 0x62, 0x0c, + 0x9f, 0x53, 0xfc, 0xfd, 0x8f, 0xa8, 0x2a, 0xfe, 0xea, 0x88, 0x8a, 0x4d, + 0x03, 0x0d, 0x38, 0xcb, 0x4c, 0x32, 0xb5, 0x44, 0xc5, 0xd6, 0x83, 0x82, + 0x0f, 0xe7, 0xd8, 0xaf, 0xd5, 0x55, 0x1c, 0x76, 0x02, 0x63, 0x0f, 0xe3, + 0x36, 0xc6, 0xd0, 0x3d, 0x4b, 0xb2, 0xf7, 0x30, 0x0a, 0xc7, 0x4a, 0xe0, + 0x24, 0xf6, 0xec, 0x32, 0x4b, 0x50, 0xc0, 0xb2, 0x8f, 0x11, 0x7b, 0x7e, + 0xb5, 0xd7, 0x08, 0x8d, 0xa8, 0x25, 0x78, 0x67, 0x44, 0xb0, 0xa7, 0x04, + 0x37, 0x0f, 0x1a, 0x94, 0x41, 0xb0, 0xa6, 0x9e, 0x78, 0x7d, 0xc2, 0xe6, + 0x89, 0xe9, 0xb1, 0x3a, 0xce, 0x83, 0x89, 0x8e, 0x44, 0x15, 0xfb, 0xf6, + 0xe0, 0x49, 0xea, 0xec, 0x09, 0xb6, 0xb3, 0x7c, 0x91, 0x17, 0x47, 0x0f, + 0x0a, 0xf6, 0x99, 0xd8, 0x42, 0xbf, 0x7f, 0x2b, 0x2e, 0xcf, 0x05, 0x18, + 0x91, 0x6e, 0xf8, 0x8f, 0x15, 0x90, 0x7b, 0xff, 0x2a, 0x55, 0x88, 0x0d, + 0x83, 0x95, 0x78, 0x73, 0xd8, 0x8d, 0xae, 0x7d, 0x27, 0xec, 0x38, 0xf6, + 0x68, 0x72, 0x1e, 0x9e, 0x3a, 0x2c, 0x6d, 0xc9, 0x7c, 0x95, 0xd8, 0xfb, + 0x17, 0xfd, 0x49, 0x89, 0x71, 0x91, 0x5d, 0x2a, 0xf0, 0x3f, 0x54, 0x9c, + 0xc0, 0x78, 0xbf, 0xde, 0x19, 0x52, 0x25, 0x3f, 0x56, 0xf1, 0xb2, 0x64, + 0x66, 0x15, 0x7a, 0xac, 0x4c, 0x8d, 0xc9, 0x3a, 0x54, 0x6c, 0x36, 0x75, + 0xf3, 0x44, 0xbf, 0x13, 0x6b, 0x89, 0x63, 0xb1, 0x8a, 0xd8, 0x24, 0x39, + 0x6a, 0x6c, 0xae, 0x6a, 0xda, 0xb2, 0xee, 0x49, 0x22, 0x96, 0xc7, 0x1c, + 0xfd, 0xbd, 0x60, 0x55, 0x7b, 0x29, 0xb1, 0x90, 0x76, 0xac, 0x15, 0xab, + 0xc4, 0xf3, 0xb1, 0x37, 0x70, 0x98, 0x7e, 0xf1, 0x0d, 0x1e, 0x23, 0x43, + 0x56, 0x57, 0x0b, 0x73, 0x67, 0x67, 0xb5, 0xd5, 0xb5, 0xcb, 0x34, 0x22, + 0x9b, 0xe0, 0xef, 0x2d, 0x50, 0xde, 0xc0, 0xb7, 0xe8, 0x67, 0xa3, 0x43, + 0xb2, 0x06, 0x14, 0xc5, 0x57, 0xe9, 0x67, 0x96, 0x59, 0x81, 0x5f, 0xd8, + 0x7b, 0x45, 0x88, 0x41, 0x36, 0xf7, 0x21, 0x98, 0xd8, 0x6b, 0xe4, 0x6f, + 0xe0, 0xec, 0x90, 0x11, 0x3d, 0xcc, 0x3a, 0x2f, 0xb0, 0xce, 0xf3, 0xfd, + 0xc4, 0x1b, 0x62, 0xcb, 0x96, 0xe0, 0xc9, 0x95, 0x85, 0xa8, 0xf1, 0x15, + 0x20, 0xf3, 0x59, 0x27, 0xe7, 0xf3, 0x2f, 0x4d, 0x7f, 0xe8, 0x98, 0xea, + 0x63, 0x9d, 0x37, 0x88, 0xeb, 0x6c, 0x7f, 0xc8, 0x08, 0x55, 0xd3, 0x9f, + 0x47, 0x59, 0xe7, 0x29, 0xd6, 0x79, 0x92, 0x75, 0x7e, 0xb1, 0xf8, 0xe4, + 0x99, 0x59, 0xa8, 0xe9, 0x9f, 0xcb, 0xf2, 0x07, 0x16, 0x65, 0x1e, 0xaf, + 0x80, 0xdf, 0x9c, 0xed, 0x90, 0xfe, 0xde, 0x60, 0x8c, 0xc9, 0xf5, 0x97, + 0xe3, 0x4f, 0x5e, 0x34, 0x11, 0xef, 0xb2, 0xcf, 0xe4, 0x78, 0xd0, 0x98, + 0x3c, 0x4e, 0x3c, 0x0c, 0x10, 0xf3, 0xce, 0x31, 0x1e, 0x86, 0x88, 0x85, + 0xab, 0x89, 0x8d, 0xcd, 0xf8, 0xef, 0xe9, 0x26, 0x7c, 0x37, 0x1d, 0x21, + 0x46, 0x86, 0x89, 0x91, 0xf5, 0xc4, 0x47, 0x93, 0xf8, 0x58, 0x47, 0x7c, + 0x24, 0x06, 0x8f, 0xfe, 0x00, 0x79, 0x8c, 0x69, 0xae, 0x41, 0xcb, 0x1a, + 0x22, 0x16, 0x9e, 0xe6, 0x31, 0x62, 0xd6, 0x6a, 0x6d, 0x98, 0xc7, 0xff, + 0x1e, 0xb0, 0x9f, 0x1d, 0x1c, 0x66, 0x7b, 0x05, 0x83, 0xb5, 0x07, 0x3c, + 0xe4, 0x98, 0x81, 0x60, 0x55, 0xa8, 0x97, 0xfd, 0xff, 0xdc, 0xa8, 0xed, + 0xad, 0x80, 0xd1, 0xb9, 0x58, 0xfd, 0x6b, 0x4c, 0xad, 0xd1, 0x88, 0x1f, + 0x15, 0xf0, 0xee, 0xd3, 0x64, 0x2f, 0xdb, 0x2f, 0x3d, 0xa8, 0x9a, 0x98, + 0xeb, 0xc0, 0x93, 0xd7, 0xc0, 0xe1, 0x99, 0x83, 0xeb, 0x8e, 0x75, 0xd3, + 0x2e, 0x87, 0xe7, 0x38, 0x8c, 0x79, 0x36, 0xf7, 0xac, 0xbd, 0xd4, 0x24, + 0xcf, 0x16, 0xce, 0x92, 0x58, 0xa3, 0x7b, 0x23, 0x2a, 0xea, 0xc9, 0xe6, + 0x2b, 0xf3, 0x20, 0xfb, 0xf0, 0x0b, 0x18, 0xdf, 0xec, 0x67, 0x74, 0x0f, + 0x08, 0x57, 0x9c, 0x45, 0xae, 0x56, 0x90, 0x88, 0xdd, 0x39, 0x8b, 0x5c, + 0xc0, 0xcd, 0xb8, 0xdf, 0x16, 0xd4, 0x50, 0x18, 0xf6, 0x87, 0x76, 0xcb, + 0x33, 0x9d, 0x35, 0x21, 0xfa, 0xcb, 0x04, 0x73, 0xea, 0x30, 0x9a, 0xd3, + 0xb9, 0xfb, 0xe6, 0x7f, 0xfc, 0xf3, 0x39, 0xe2, 0x5d, 0x2a, 0xf8, 0x3b, + 0x2b, 0x56, 0x7e, 0x5d, 0xc7, 0x2c, 0x18, 0xda, 0x0f, 0x14, 0xfd, 0x18, + 0x90, 0x99, 0xde, 0xf3, 0x98, 0xc5, 0xb5, 0x22, 0xfa, 0xdf, 0xbd, 0x7d, + 0x31, 0xab, 0x9c, 0x3c, 0x6b, 0xde, 0xa0, 0xee, 0xeb, 0x54, 0x0c, 0x6d, + 0x00, 0xe7, 0x30, 0x77, 0x30, 0x80, 0x46, 0xc6, 0x93, 0x65, 0x7d, 0xb2, + 0xae, 0xd4, 0x8a, 0x67, 0xe2, 0x70, 0x5f, 0xc3, 0xb2, 0xff, 0x4e, 0xae, + 0x31, 0x4a, 0x2c, 0xcb, 0x87, 0x1e, 0x39, 0xc5, 0xf1, 0xb9, 0x1d, 0xc6, + 0x25, 0x29, 0x5f, 0x34, 0x58, 0x87, 0xbb, 0x28, 0x53, 0xf3, 0x80, 0x85, + 0x57, 0x16, 0x13, 0x27, 0x16, 0xeb, 0x1d, 0x97, 0xd4, 0xc8, 0xdd, 0x73, + 0x90, 0x69, 0x2f, 0xe3, 0xdc, 0x9e, 0x09, 0xea, 0xa1, 0x3e, 0x45, 0x0f, + 0xdc, 0xa2, 0xc8, 0x3e, 0xe0, 0x2e, 0xe6, 0xff, 0xf6, 0xde, 0xb0, 0xe3, + 0x87, 0x10, 0x11, 0x9e, 0x3e, 0xb9, 0xd9, 0xa1, 0x5f, 0xfa, 0x11, 0x1a, + 0xe0, 0x0e, 0x96, 0x62, 0x5e, 0x58, 0x9f, 0xb8, 0x51, 0xed, 0x45, 0xa8, + 0x46, 0xef, 0xfd, 0xd0, 0xe1, 0x46, 0xd9, 0xf5, 0x29, 0xe2, 0xc0, 0x09, + 0xec, 0x27, 0x1e, 0xec, 0x4b, 0x27, 0x95, 0xa9, 0xf2, 0x27, 0x31, 0x90, + 0x96, 0x35, 0x6f, 0x59, 0xe7, 0x9c, 0xba, 0xf3, 0x45, 0xbf, 0x1e, 0x1d, + 0x27, 0xdf, 0xd8, 0x75, 0xe5, 0x39, 0x87, 0x7f, 0x46, 0x29, 0xe7, 0xb8, + 0x64, 0x7a, 0x0e, 0x9f, 0x0b, 0x0a, 0x9e, 0x57, 0x11, 0xcf, 0x75, 0xdf, + 0x2a, 0xc5, 0xb2, 0x06, 0xaf, 0xcc, 0x65, 0x82, 0xb9, 0x5e, 0x16, 0x6b, + 0x9f, 0x48, 0xd2, 0x76, 0x92, 0xb4, 0x1d, 0xc6, 0xfd, 0xc6, 0x5b, 0x68, + 0x3f, 0x49, 0xda, 0x4f, 0x92, 0xf6, 0x23, 0x76, 0x95, 0xa4, 0x0d, 0xd1, + 0xbf, 0x9f, 0x48, 0xd2, 0x86, 0x18, 0x4b, 0xb2, 0x6b, 0x93, 0x2d, 0x76, + 0x9e, 0xd6, 0x3a, 0xe0, 0xc3, 0x35, 0x8b, 0x9d, 0xea, 0x54, 0x85, 0x82, + 0x39, 0xe4, 0x18, 0xf3, 0x07, 0xf5, 0xe3, 0xc2, 0xef, 0x2f, 0x2f, 0x2e, + 0x81, 0x6f, 0x96, 0x82, 0x79, 0x86, 0x07, 0xcd, 0x7d, 0x3d, 0x70, 0x24, + 0x6a, 0x8f, 0x3b, 0x14, 0xe6, 0xf9, 0x73, 0x74, 0x13, 0x4a, 0x0f, 0xf2, + 0x12, 0x6d, 0x70, 0x25, 0x6a, 0x43, 0x4f, 0x63, 0xfa, 0xb9, 0x53, 0xb4, + 0xc1, 0x99, 0x90, 0x35, 0x6c, 0xda, 0x75, 0x5f, 0x1b, 0x8a, 0x12, 0xb5, + 0xe6, 0x2a, 0xfe, 0x97, 0xf1, 0x88, 0x0d, 0xc9, 0x7f, 0x55, 0x13, 0xfb, + 0xd8, 0xee, 0xd4, 0x17, 0x54, 0xb6, 0x59, 0xeb, 0xfb, 0xb2, 0xda, 0xac, + 0xc4, 0xec, 0x7c, 0x86, 0x7c, 0xa3, 0xaf, 0x18, 0x9f, 0x26, 0x0f, 0xf5, + 0x92, 0x83, 0xde, 0x3c, 0x5e, 0x8f, 0x96, 0xbe, 0xc7, 0xc8, 0x47, 0xfd, + 0xd1, 0x4b, 0xc4, 0x7b, 0x73, 0xbc, 0x01, 0x2b, 0x07, 0x84, 0x8f, 0x1a, + 0xbe, 0x3e, 0xc5, 0x47, 0x7b, 0x7a, 0x9f, 0x7c, 0xb4, 0x08, 0x0b, 0x0f, + 0x89, 0x5d, 0x59, 0xd6, 0xfa, 0x25, 0x46, 0xe0, 0x0d, 0xda, 0x5e, 0x5e, + 0x78, 0x82, 0x18, 0xe6, 0x9f, 0x3c, 0x4a, 0xdb, 0xbb, 0x99, 0x1c, 0xf2, + 0xcd, 0xb8, 0x17, 0xbe, 0xf1, 0xdf, 0x58, 0x6e, 0xf2, 0xd0, 0x2a, 0x72, + 0xc8, 0x4b, 0xc4, 0xd0, 0xf9, 0x4b, 0x8c, 0x8e, 0x06, 0x47, 0x25, 0x42, + 0xe4, 0xa0, 0xef, 0xc7, 0xf5, 0xd8, 0xff, 0x54, 0x0d, 0x7c, 0x9a, 0xfc, + 0xf3, 0x67, 0xf1, 0x3a, 0xf6, 0x53, 0x8c, 0x1b, 0xc6, 0x7d, 0xb8, 0x7e, + 0x3c, 0xc0, 0x7a, 0x21, 0xf8, 0x8e, 0xde, 0xc2, 0xc3, 0x83, 0x77, 0xe3, + 0x55, 0xcd, 0xfb, 0x94, 0xaa, 0x96, 0x9b, 0x94, 0x72, 0x44, 0x98, 0x2f, + 0x5f, 0x37, 0xfe, 0x19, 0xbc, 0x47, 0xec, 0xaa, 0x4b, 0x10, 0x4d, 0x12, + 0xb8, 0xa7, 0xf4, 0xa3, 0xcf, 0x56, 0xb6, 0xee, 0x66, 0xde, 0xb4, 0x89, + 0x72, 0xfb, 0xc9, 0x35, 0x17, 0xb0, 0xec, 0x9b, 0xfd, 0x85, 0xa8, 0x3a, + 0x34, 0x41, 0x4c, 0xcf, 0xc3, 0xfc, 0x47, 0xdc, 0x68, 0x38, 0x9a, 0x22, + 0xc6, 0xc9, 0x3e, 0x23, 0x79, 0x56, 0x17, 0xd8, 0x74, 0x50, 0x38, 0x59, + 0x8a, 0xfe, 0x6f, 0x59, 0x87, 0x4c, 0x89, 0x7b, 0x3e, 0x1c, 0x22, 0x2f, + 0x1a, 0x49, 0xc6, 0x96, 0xaa, 0x98, 0x20, 0xa6, 0xfa, 0x27, 0xe5, 0x36, + 0xf8, 0xfc, 0xb0, 0xf0, 0x47, 0x27, 0xbc, 0x8c, 0x97, 0x3d, 0x9c, 0xd3, + 0x34, 0xc7, 0x97, 0x24, 0x47, 0x3b, 0x1e, 0xaf, 0x44, 0x3f, 0x39, 0x5a, + 0x8c, 0x1c, 0x2d, 0x46, 0x3e, 0x16, 0x23, 0x47, 0x93, 0x67, 0x9d, 0x63, + 0xe4, 0x68, 0x31, 0x72, 0xb4, 0x58, 0xaa, 0x01, 0xa3, 0xfd, 0x2a, 0x76, + 0x1e, 0xd6, 0xd4, 0x0c, 0xe7, 0x58, 0xf6, 0xf8, 0x4f, 0xfd, 0xc5, 0x67, + 0x98, 0x87, 0xdc, 0xca, 0x43, 0xee, 0xc3, 0xcb, 0x3e, 0x35, 0x69, 0xd3, + 0x8d, 0x7d, 0x29, 0xe1, 0xca, 0xf5, 0xcc, 0xcd, 0x4f, 0xe0, 0x2b, 0xac, + 0xf3, 0x1e, 0x31, 0x36, 0xb3, 0xc6, 0xe4, 0xf9, 0x04, 0xe3, 0xd1, 0x09, + 0xe2, 0xfe, 0x09, 0xb4, 0x33, 0x18, 0xdf, 0xc5, 0xf1, 0x6b, 0xc4, 0xe8, + 0x97, 0x16, 0x01, 0x0d, 0x23, 0x13, 0xf4, 0xc3, 0x13, 0x8c, 0xc7, 0xe4, + 0xae, 0x2a, 0xdb, 0xdf, 0x8b, 0x8c, 0xec, 0x5d, 0x7f, 0x2e, 0x28, 0x31, + 0xf4, 0x04, 0xc7, 0x35, 0x41, 0x7e, 0xaa, 0x87, 0x3e, 0xa0, 0x2d, 0x38, + 0xf7, 0x55, 0xa0, 0xfa, 0x11, 0x3d, 0xf4, 0x13, 0x18, 0xad, 0xdb, 0x61, + 0x35, 0x9c, 0x32, 0xfd, 0xda, 0x06, 0xb9, 0xff, 0x75, 0x54, 0xa5, 0xdd, + 0x39, 0xe9, 0x3b, 0x0d, 0xb4, 0xbb, 0x08, 0x42, 0x37, 0x31, 0xc7, 0x39, + 0x44, 0xdb, 0xa9, 0x90, 0x78, 0xa3, 0x87, 0x2e, 0x40, 0x78, 0x91, 0x13, + 0xa3, 0x29, 0x79, 0xc6, 0xe0, 0x61, 0x9c, 0x8a, 0x33, 0x37, 0xb8, 0xe1, + 0x75, 0xab, 0x8c, 0x78, 0x33, 0x92, 0x2a, 0xc1, 0xb1, 0xfe, 0xc8, 0x3d, + 0x45, 0xf4, 0x51, 0x95, 0x7c, 0xfc, 0xd0, 0xb0, 0xf4, 0x59, 0x42, 0xff, + 0x37, 0x6c, 0xbe, 0xed, 0x3d, 0x94, 0xe5, 0xeb, 0xb7, 0x0f, 0x18, 0xd1, + 0x97, 0x14, 0x3f, 0xf3, 0x95, 0x12, 0xac, 0x3c, 0x38, 0xc1, 0xf6, 0x24, + 0xd6, 0xf8, 0xf0, 0x6c, 0x5c, 0xc3, 0xe6, 0x31, 0x03, 0x4f, 0xc7, 0xc9, + 0xd9, 0xc7, 0x02, 0x38, 0x4d, 0xbd, 0xb6, 0x31, 0x56, 0x9e, 0x8a, 0x0b, + 0x86, 0x57, 0x62, 0xc3, 0x98, 0x0a, 0xb7, 0xf1, 0x75, 0x4c, 0x7e, 0x51, + 0x30, 0xfa, 0x1c, 0x92, 0xc9, 0x0c, 0xdb, 0xd3, 0x7d, 0x53, 0xea, 0x39, + 0x5c, 0x18, 0x38, 0x87, 0x9f, 0xf2, 0x78, 0x87, 0x98, 0xa1, 0xd1, 0x47, + 0xef, 0x0f, 0x46, 0xee, 0xd1, 0x90, 0x09, 0xd0, 0x26, 0xbc, 0x47, 0x88, + 0x13, 0x3f, 0x26, 0x1f, 0xd8, 0xe0, 0x88, 0x04, 0x0b, 0xa0, 0x5f, 0x7a, + 0x8e, 0x9c, 0x67, 0x41, 0x0d, 0xf9, 0x04, 0x71, 0xe0, 0x31, 0xf2, 0x9d, + 0x5b, 0x47, 0x64, 0xae, 0x65, 0xde, 0x7d, 0x98, 0x48, 0xc6, 0x36, 0xd0, + 0x14, 0x1a, 0xcb, 0xc8, 0x71, 0x0e, 0x28, 0x13, 0xd4, 0xa5, 0xbf, 0xb5, + 0x8c, 0x36, 0x54, 0x44, 0x3b, 0xec, 0xe9, 0x13, 0x7b, 0xb1, 0xef, 0xeb, + 0xde, 0xec, 0x82, 0xc8, 0x56, 0x8f, 0x44, 0x9f, 0xd5, 0x55, 0xc6, 0x9c, + 0xec, 0xc2, 0x92, 0x4a, 0xdc, 0x3f, 0x76, 0x2b, 0xb6, 0x0d, 0x54, 0xe2, + 0x9e, 0x3e, 0x2f, 0x36, 0xf5, 0x61, 0x8d, 0x03, 0xea, 0x57, 0x88, 0x47, + 0x19, 0xe6, 0x64, 0xda, 0xcf, 0x88, 0xdd, 0x85, 0x0e, 0x7d, 0xf2, 0x24, + 0xe3, 0xab, 0xd8, 0x7d, 0x27, 0x63, 0x7e, 0x07, 0x79, 0x52, 0x94, 0x3c, + 0x29, 0xca, 0x7a, 0x3d, 0x03, 0x2e, 0xcc, 0x37, 0x84, 0xf7, 0x78, 0xd0, + 0xc6, 0x3c, 0x24, 0xf1, 0x88, 0x11, 0xb9, 0xa0, 0xca, 0xd8, 0xe6, 0xe0, + 0xfe, 0x23, 0xb7, 0x62, 0x3b, 0xb1, 0x61, 0x23, 0xaf, 0xf7, 0x3d, 0xb2, + 0x00, 0xf7, 0x91, 0x27, 0x45, 0xc7, 0x1a, 0xb0, 0x73, 0x40, 0xc5, 0xe6, + 0x23, 0xd2, 0xe7, 0x67, 0xb0, 0x6b, 0xa0, 0xaa, 0xa5, 0x8a, 0x79, 0xda, + 0x72, 0xbf, 0x42, 0x3b, 0x4e, 0x4d, 0xdb, 0x88, 0x1b, 0x5f, 0x4c, 0x89, + 0x5d, 0x88, 0xde, 0xc5, 0x36, 0x54, 0xdc, 0xf1, 0x48, 0x05, 0x4a, 0xf7, + 0x3f, 0x65, 0x79, 0x0d, 0xa3, 0xbd, 0x4c, 0xb5, 0x1a, 0x9e, 0x0e, 0xfa, + 0x43, 0x47, 0x38, 0xef, 0x2b, 0xc8, 0x7d, 0x56, 0x0f, 0x08, 0x27, 0x6a, + 0xc0, 0xae, 0x60, 0x04, 0x55, 0xe4, 0x3f, 0x4b, 0x0f, 0x4a, 0x1b, 0xe7, + 0xec, 0x77, 0x1c, 0x14, 0x30, 0xa7, 0xf1, 0xa5, 0x1f, 0xc6, 0xf3, 0xe4, + 0xad, 0x0e, 0xce, 0x75, 0x6d, 0xba, 0x04, 0x0b, 0xf6, 0x22, 0x56, 0x14, + 0xee, 0xc2, 0x5d, 0xe4, 0x3f, 0xd2, 0x47, 0x82, 0x73, 0x7b, 0x6e, 0xc0, + 0xe8, 0xf4, 0x92, 0xff, 0xbc, 0x74, 0x50, 0xec, 0xb0, 0x04, 0x7d, 0x03, + 0x06, 0xdb, 0x2f, 0xc1, 0x4e, 0x3b, 0x37, 0xd3, 0x70, 0x86, 0x7e, 0xf1, + 0x4a, 0xca, 0x8b, 0xe7, 0xfa, 0xfd, 0xc7, 0x97, 0x92, 0xd3, 0xbc, 0x42, + 0x1b, 0x49, 0xda, 0xb2, 0x79, 0xf1, 0x46, 0x9f, 0x71, 0x69, 0x15, 0xfc, + 0x93, 0x17, 0x1c, 0x5e, 0x5c, 0xa6, 0x4e, 0xb4, 0xbd, 0x95, 0xb8, 0x48, + 0xfb, 0x48, 0x24, 0x85, 0x37, 0x49, 0x8e, 0x46, 0x4e, 0xfb, 0xc8, 0x3c, + 0x1c, 0x39, 0x92, 0xe5, 0x39, 0x6f, 0xc7, 0xe5, 0x5a, 0xe4, 0x6e, 0xce, + 0x97, 0x2e, 0x3c, 0xe7, 0x27, 0xfd, 0x7a, 0x73, 0x8f, 0x22, 0x6b, 0x2d, + 0x2a, 0xbe, 0x40, 0x9e, 0x93, 0xa9, 0xd0, 0xcd, 0x1f, 0xab, 0xb1, 0xe3, + 0xe4, 0x39, 0xe6, 0x2b, 0xfc, 0xff, 0x5d, 0xfa, 0x4a, 0x8f, 0xf0, 0x1f, + 0xcd, 0x81, 0x9f, 0x2c, 0x8a, 0x65, 0x5c, 0xbc, 0xfe, 0x2a, 0x73, 0xad, + 0x02, 0xfa, 0xd8, 0xfe, 0x64, 0x95, 0x76, 0x9d, 0xe2, 0xe0, 0x58, 0xf4, + 0xc9, 0xd7, 0x79, 0xed, 0xf2, 0xb8, 0xd8, 0x5c, 0x08, 0xfe, 0xa3, 0xe7, + 0xec, 0xe7, 0x4b, 0x32, 0x0e, 0xe6, 0x7f, 0x1e, 0xfd, 0x78, 0x14, 0xf2, + 0x3c, 0xdd, 0x0e, 0x64, 0xbe, 0x30, 0xc1, 0x3a, 0x82, 0xfd, 0x1a, 0x0a, + 0xf6, 0x55, 0xb5, 0x3c, 0xa2, 0xfa, 0xe0, 0x09, 0xeb, 0xda, 0xe3, 0xaa, + 0x46, 0x1f, 0x32, 0xb1, 0x36, 0x6d, 0x59, 0x6b, 0x83, 0xd9, 0x78, 0x30, + 0x8b, 0xbe, 0x36, 0x7f, 0x5f, 0xf9, 0x34, 0xff, 0x29, 0xc6, 0x35, 0xe4, + 0xca, 0xc5, 0x89, 0xd8, 0x19, 0x72, 0x78, 0x26, 0xa4, 0xa7, 0x6a, 0xe6, + 0xa2, 0xf6, 0xf8, 0x5c, 0x45, 0xef, 0xa4, 0xec, 0xad, 0x1f, 0x28, 0x8c, + 0xd7, 0xc4, 0xc4, 0xa2, 0xf1, 0xda, 0x63, 0x1e, 0x18, 0xb1, 0x25, 0xea, + 0xbd, 0x1f, 0xa2, 0x42, 0x64, 0x68, 0x28, 0xcb, 0xae, 0x23, 0x78, 0x50, + 0xb4, 0x4f, 0x9e, 0x9d, 0xb0, 0xac, 0x0d, 0xc1, 0x4c, 0x07, 0xed, 0x2b, + 0x34, 0x8e, 0x30, 0x63, 0xb8, 0xec, 0xdf, 0x0f, 0x33, 0x4e, 0x57, 0x5d, + 0x3c, 0x8b, 0x1b, 0x91, 0xf9, 0x54, 0x36, 0x6e, 0xbb, 0x99, 0x13, 0xaa, + 0x7e, 0x8d, 0x79, 0x9b, 0x1b, 0x2f, 0xdd, 0x98, 0x7d, 0x0f, 0xc4, 0x1d, + 0x7f, 0x42, 0xbc, 0x97, 0x7d, 0x79, 0x71, 0x53, 0xe2, 0xbd, 0x7d, 0xea, + 0xbc, 0x93, 0xe7, 0xd7, 0xb0, 0x8d, 0xb9, 0xe3, 0x4e, 0xe7, 0x5f, 0x26, + 0x8b, 0x31, 0x7b, 0xdc, 0xc4, 0x17, 0xb3, 0xed, 0x30, 0xa6, 0x37, 0x31, + 0xa6, 0x2b, 0xf0, 0x1a, 0x3f, 0xc4, 0xab, 0x36, 0x1f, 0xa8, 0x40, 0xfe, + 0x3e, 0x7b, 0x2d, 0x86, 0x79, 0x8e, 0xde, 0x3e, 0xca, 0xf3, 0x12, 0xe2, + 0xf7, 0xbc, 0x7d, 0x0a, 0xce, 0xd4, 0x78, 0x50, 0xc0, 0xdf, 0xea, 0x3e, + 0xcb, 0x6a, 0x32, 0x9f, 0xb5, 0x76, 0xac, 0x95, 0x71, 0x0a, 0x1f, 0xbb, + 0xb6, 0x0c, 0xa5, 0x4c, 0x56, 0x8e, 0x0a, 0x8f, 0x37, 0xc8, 0xe3, 0x2b, + 0xe0, 0xda, 0x57, 0xd5, 0xb1, 0x14, 0x55, 0xe6, 0x38, 0xeb, 0xe7, 0x1d, + 0x5d, 0x56, 0x8e, 0x42, 0x29, 0x0b, 0xa8, 0x89, 0xd6, 0x72, 0xb9, 0xf7, + 0x31, 0x27, 0xac, 0xe0, 0x0b, 0x03, 0xf2, 0x8e, 0x80, 0xc6, 0xce, 0x39, + 0xa0, 0xad, 0xcc, 0x9e, 0x87, 0x63, 0xfb, 0x3d, 0xb8, 0xab, 0x0f, 0x99, + 0x72, 0xc3, 0x6a, 0xf8, 0x70, 0xb1, 0x31, 0x59, 0xae, 0xc8, 0xf3, 0x6e, + 0x51, 0x78, 0x93, 0xfe, 0x89, 0x5b, 0x1d, 0x56, 0xc3, 0xdb, 0x8b, 0x6a, + 0x5b, 0x26, 0x20, 0xf1, 0x63, 0x1e, 0xbe, 0x3b, 0x2a, 0xcf, 0xe5, 0xb6, + 0x42, 0x4b, 0x1c, 0xa7, 0x0d, 0xc6, 0x1e, 0x70, 0x41, 0xf6, 0x99, 0xeb, + 0xf4, 0x0b, 0xbd, 0x79, 0x5c, 0xe9, 0x82, 0x11, 0x34, 0x5a, 0xeb, 0x68, + 0x4f, 0x7f, 0x2f, 0xfb, 0x9b, 0xc3, 0x75, 0x58, 0x95, 0xd6, 0xcd, 0x43, + 0x28, 0xc1, 0xb3, 0xb4, 0xa3, 0x37, 0xeb, 0x4b, 0x70, 0x6a, 0x38, 0x34, + 0xcd, 0x65, 0x65, 0x7e, 0xe4, 0x1e, 0xa1, 0xd8, 0x84, 0x82, 0xef, 0x55, + 0x23, 0x35, 0x17, 0x55, 0xfd, 0x4b, 0x55, 0x47, 0x6a, 0x36, 0x22, 0xb8, + 0x54, 0x7d, 0x9d, 0xef, 0xdb, 0xaa, 0xd8, 0x8a, 0xdc, 0x63, 0xd2, 0x65, + 0x73, 0x32, 0x79, 0x11, 0x6d, 0x3e, 0x7d, 0x5f, 0x99, 0x8c, 0x23, 0x95, + 0xae, 0xc0, 0x17, 0x1e, 0x39, 0x4e, 0xdc, 0xb7, 0xac, 0xa7, 0x17, 0xfd, + 0xb4, 0x58, 0xf4, 0xf0, 0x9d, 0x51, 0x69, 0xf3, 0x5b, 0xe5, 0xd9, 0xfd, + 0xd8, 0x12, 0x97, 0xc9, 0x47, 0x8e, 0x3a, 0xec, 0xfb, 0x7a, 0x12, 0x97, + 0xbf, 0xd8, 0x57, 0x08, 0xdf, 0x21, 0xf1, 0x1b, 0x27, 0x6e, 0x1a, 0x8f, + 0xa1, 0x2c, 0xdc, 0x80, 0xe2, 0xbd, 0xc5, 0x30, 0x0e, 0x15, 0x23, 0x90, + 0x78, 0xcc, 0x8e, 0xcb, 0x75, 0x87, 0xfc, 0xde, 0x32, 0x72, 0x94, 0xfb, + 0x97, 0xbc, 0x6f, 0xb9, 0xc2, 0x22, 0x9b, 0xd1, 0x7e, 0xbf, 0xbc, 0x17, + 0xa5, 0xde, 0x30, 0x47, 0x69, 0x67, 0xd5, 0x8c, 0xcd, 0x1f, 0x26, 0x2a, + 0x60, 0xed, 0x3b, 0x4e, 0xbc, 0xd0, 0x70, 0x2b, 0xcf, 0x2f, 0x26, 0x24, + 0x56, 0xfb, 0x78, 0x78, 0x18, 0x87, 0x0d, 0x7e, 0x7b, 0xf1, 0x63, 0xf2, + 0xb4, 0x8b, 0x8b, 0x63, 0x64, 0xaa, 0x01, 0x2c, 0xa4, 0x6d, 0x5e, 0x4e, + 0xe8, 0x99, 0x46, 0x62, 0xcd, 0xbb, 0x8b, 0x4d, 0xca, 0x52, 0x8c, 0x9f, + 0x26, 0x64, 0xad, 0xe2, 0xe4, 0x43, 0x5e, 0xc4, 0xaa, 0x8a, 0x69, 0xd3, + 0x6f, 0x11, 0x4f, 0x4a, 0x99, 0x0b, 0x06, 0x8e, 0xde, 0x48, 0x99, 0xeb, + 0x50, 0xcb, 0xf8, 0x3b, 0x3e, 0x1c, 0xc6, 0x66, 0xc6, 0xd6, 0xdd, 0x49, + 0xc9, 0x1f, 0x2d, 0xeb, 0x67, 0xa6, 0xdf, 0x1c, 0x21, 0xae, 0x2e, 0x1f, + 0x9b, 0xc0, 0x3f, 0x24, 0xed, 0x3d, 0x6a, 0x19, 0xb7, 0x11, 0xc2, 0x0f, + 0x18, 0xf3, 0xf2, 0x0c, 0x2f, 0xd6, 0x10, 0x5b, 0xcf, 0x30, 0xbf, 0x5e, + 0x49, 0x8c, 0x8c, 0x10, 0x23, 0x23, 0x63, 0x1e, 0x44, 0x8e, 0xcc, 0xe1, + 0xe1, 0xe3, 0xb1, 0x80, 0x87, 0xc1, 0x6b, 0xf4, 0x73, 0xe6, 0x87, 0x8d, + 0xc4, 0xbb, 0xc7, 0x88, 0x21, 0x12, 0x13, 0x0f, 0x10, 0xf3, 0x3e, 0xa0, + 0x5d, 0xde, 0xb4, 0x17, 0xb8, 0x66, 0x44, 0xf0, 0x5b, 0xf0, 0x45, 0x21, + 0xbe, 0x2a, 0x78, 0xeb, 0xa0, 0xe0, 0x88, 0x8a, 0x6f, 0x3e, 0x62, 0x74, + 0xb4, 0x2b, 0xfe, 0xc0, 0x39, 0xca, 0x79, 0x84, 0xb8, 0x37, 0xca, 0x9c, + 0xef, 0x4d, 0x53, 0xc5, 0xc8, 0x41, 0x89, 0xb9, 0x27, 0x38, 0x0f, 0x27, + 0xf0, 0x00, 0x63, 0xee, 0xad, 0x8b, 0x18, 0x73, 0x3f, 0x2f, 0xcf, 0x11, + 0x39, 0xb1, 0x23, 0xf5, 0x30, 0xbe, 0x12, 0x7f, 0xca, 0xc6, 0xbe, 0x24, + 0xe3, 0x5c, 0x6f, 0x7f, 0x17, 0x8a, 0x18, 0xe3, 0xf6, 0x0c, 0x9f, 0xb0, + 0xf7, 0x76, 0xbf, 0xd7, 0x6f, 0x04, 0x4e, 0x11, 0xe7, 0xde, 0xe6, 0xf9, + 0x3f, 0xf0, 0xfc, 0xec, 0x5e, 0x1f, 0x8e, 0x2e, 0x29, 0xc1, 0x33, 0x94, + 0x61, 0x77, 0xf2, 0x84, 0xfd, 0x3c, 0x6c, 0x4b, 0x9f, 0x66, 0xeb, 0x74, + 0x65, 0x9f, 0x87, 0x7a, 0x24, 0x27, 0x66, 0x9c, 0x58, 0x30, 0x4e, 0xae, + 0xdb, 0x57, 0x89, 0x86, 0xf1, 0x39, 0x33, 0x6c, 0xa9, 0xd6, 0x9e, 0xf7, + 0x8c, 0x5a, 0x81, 0x42, 0x3b, 0xef, 0x37, 0x98, 0xf7, 0xeb, 0x07, 0x7e, + 0xe2, 0xa8, 0xc0, 0xac, 0x2b, 0x7e, 0xc0, 0x98, 0x3e, 0x9c, 0xb2, 0xef, + 0xff, 0x17, 0x53, 0xa6, 0xba, 0xb1, 0x65, 0x9a, 0x3c, 0x23, 0xbe, 0x2d, + 0x29, 0xeb, 0xea, 0x62, 0xf3, 0x2d, 0xb4, 0xf9, 0x99, 0xcf, 0xbf, 0xd3, + 0xbe, 0xd2, 0x0f, 0xe2, 0x81, 0xbd, 0x7a, 0xa7, 0xd3, 0x11, 0xb3, 0x34, + 0xa3, 0x8b, 0x9c, 0xa2, 0x0b, 0xfe, 0x45, 0x46, 0xeb, 0x45, 0x45, 0x6f, + 0xff, 0x91, 0x52, 0x88, 0xe2, 0xf0, 0x69, 0x6c, 0x1f, 0xd1, 0x03, 0x29, + 0xc5, 0xa0, 0xad, 0x6b, 0x78, 0x7c, 0x28, 0x0f, 0xed, 0xfb, 0xd7, 0xe3, + 0x68, 0xbf, 0x1e, 0x8a, 0xc1, 0xe4, 0x1c, 0x55, 0xf9, 0x0a, 0x94, 0x8b, + 0x38, 0x65, 0x32, 0xbf, 0x4c, 0xcf, 0xc5, 0x7a, 0x4d, 0xf6, 0xa1, 0xad, + 0x67, 0x7e, 0x79, 0xd1, 0x2a, 0x31, 0xe4, 0x59, 0x4e, 0x83, 0xdc, 0xd9, + 0xc2, 0x9e, 0xe0, 0xa7, 0xb1, 0xc5, 0xc6, 0x8d, 0x7c, 0x79, 0x47, 0x49, + 0xf1, 0x7c, 0xc3, 0x20, 0x9f, 0x97, 0x35, 0x12, 0xef, 0x8c, 0xbd, 0xd8, + 0xb2, 0x16, 0xef, 0x2b, 0xcb, 0xee, 0x05, 0xf8, 0x63, 0x65, 0xa6, 0x70, + 0x68, 0x48, 0xf2, 0xcd, 0x59, 0xca, 0x53, 0xfd, 0xd5, 0xde, 0x6e, 0xda, + 0xef, 0x43, 0x66, 0x06, 0xef, 0x2c, 0x2e, 0x20, 0xd7, 0x55, 0x10, 0xfc, + 0x74, 0x48, 0xfa, 0xe0, 0xe7, 0xbc, 0xe5, 0xfb, 0x82, 0xb4, 0xf3, 0xbf, + 0xa6, 0xf5, 0xf8, 0x5f, 0xa8, 0x3c, 0x39, 0x97, 0xe7, 0x3d, 0xe5, 0x3c, + 0x77, 0xfd, 0x35, 0x2b, 0xe2, 0x91, 0xeb, 0x0b, 0x58, 0x4f, 0xf4, 0x35, + 0x4b, 0xb9, 0xa7, 0xbf, 0x01, 0x0b, 0x82, 0xb3, 0x94, 0xf5, 0xc3, 0xb9, + 0x3a, 0x2f, 0x23, 0x3d, 0xf4, 0x32, 0xe3, 0x95, 0x1e, 0x98, 0x82, 0x6b, + 0xfa, 0xdd, 0x07, 0xb2, 0x77, 0xcf, 0xc5, 0xfc, 0x4a, 0xee, 0x9f, 0x9c, + 0xc7, 0xc0, 0x7e, 0xf1, 0x4b, 0xcb, 0xf2, 0x57, 0x9f, 0xc7, 0xf6, 0xd1, + 0x09, 0xa5, 0x35, 0xf9, 0xa1, 0x85, 0xfc, 0x59, 0xd1, 0xb9, 0xf6, 0xde, + 0x76, 0x69, 0xa3, 0x47, 0x69, 0x49, 0xfb, 0x43, 0x0f, 0x31, 0x00, 0x68, + 0x61, 0x79, 0x2f, 0x81, 0x8c, 0x6d, 0x82, 0xd7, 0x0c, 0xfb, 0x79, 0xa4, + 0xe3, 0xf6, 0x38, 0x3f, 0xae, 0x87, 0x7f, 0xb4, 0x22, 0x2d, 0x52, 0x37, + 0x27, 0xd7, 0x30, 0xe5, 0x11, 0xd9, 0x72, 0xff, 0x8f, 0x4d, 0xcb, 0x9e, + 0x0f, 0x5f, 0x45, 0xb6, 0x4c, 0x3b, 0x65, 0xcf, 0x63, 0xbc, 0x3e, 0x59, + 0x3f, 0x53, 0xfe, 0xdc, 0x58, 0x0f, 0x7e, 0xa4, 0xbd, 0x6c, 0xd9, 0x73, + 0x15, 0xb2, 0xb7, 0xed, 0x64, 0xfd, 0x24, 0xfe, 0xab, 0x9d, 0xfb, 0xbe, + 0x8b, 0x58, 0x5a, 0xde, 0x61, 0xd4, 0x18, 0x29, 0xc0, 0x67, 0xa1, 0x5e, + 0x1f, 0x5b, 0x58, 0x00, 0xc9, 0x23, 0x23, 0x2d, 0x05, 0x90, 0x67, 0x52, + 0x23, 0x0f, 0xb9, 0x91, 0xc9, 0xb8, 0xc9, 0xa7, 0x2f, 0x29, 0xc7, 0x94, + 0xcd, 0x7e, 0xbd, 0xe3, 0x7d, 0xf2, 0xbb, 0x17, 0xfc, 0x31, 0xce, 0xb9, + 0xe1, 0x25, 0xdf, 0x36, 0x37, 0x92, 0x77, 0x0b, 0xa7, 0x6a, 0xf3, 0xf7, + 0xda, 0xf7, 0xa9, 0x95, 0xf0, 0x6a, 0x5c, 0x67, 0xbf, 0x3f, 0xa4, 0x05, + 0x46, 0xea, 0x65, 0xda, 0x8a, 0xfc, 0x8e, 0x62, 0xa1, 0x7d, 0xad, 0x0d, + 0x01, 0xfb, 0x7b, 0xed, 0xf4, 0x3b, 0x46, 0x5a, 0x51, 0x65, 0x7f, 0xaf, + 0x43, 0x75, 0xea, 0xca, 0xfd, 0x05, 0x6c, 0x63, 0x8e, 0xfe, 0x0c, 0xf3, + 0xe9, 0xb7, 0xae, 0x3e, 0x47, 0xb0, 0xda, 0x01, 0x7f, 0x88, 0x14, 0x39, + 0x9a, 0x7d, 0xc7, 0xd2, 0xd5, 0x67, 0x01, 0x97, 0x7f, 0xe4, 0x39, 0x02, + 0xfb, 0x39, 0x2a, 0xfb, 0x1d, 0x5b, 0x35, 0x4b, 0x9c, 0xe4, 0x2b, 0xa5, + 0xd1, 0x62, 0xfe, 0xde, 0xbe, 0x24, 0x0f, 0x5b, 0xc8, 0x83, 0x9b, 0xaf, + 0x3f, 0x8d, 0x0b, 0x29, 0x27, 0xb9, 0x65, 0x2c, 0x78, 0x98, 0xfd, 0x9d, + 0x8c, 0xab, 0x38, 0x35, 0xd4, 0x13, 0x3c, 0x64, 0xf7, 0xfd, 0x16, 0xb6, + 0x8d, 0x4a, 0xfc, 0x69, 0x61, 0xfc, 0xb9, 0x40, 0x1c, 0x90, 0xb6, 0x62, + 0x96, 0x6a, 0xe8, 0x99, 0x36, 0x18, 0x93, 0xaa, 0x23, 0x80, 0x3b, 0x19, + 0x67, 0xcf, 0xc6, 0xbb, 0xe0, 0x5a, 0xac, 0x77, 0xfe, 0x13, 0x63, 0x79, + 0x69, 0x58, 0x0f, 0xbc, 0xa7, 0xb4, 0x62, 0x8c, 0xf5, 0x27, 0xe3, 0xe2, + 0x17, 0xf2, 0x0e, 0xa2, 0x75, 0x38, 0xc6, 0x1c, 0xe0, 0x05, 0xf2, 0xd9, + 0x0b, 0xf5, 0xc5, 0x48, 0x31, 0x27, 0x78, 0x3e, 0xee, 0xc6, 0x37, 0xc9, + 0x7d, 0xbe, 0x31, 0x24, 0xcf, 0x0b, 0x36, 0xa1, 0x31, 0x2e, 0xf7, 0x18, + 0x3c, 0x78, 0xfc, 0xb0, 0x87, 0xb6, 0x6d, 0x59, 0xdb, 0xcc, 0x6b, 0xe8, + 0x4f, 0xe7, 0xd8, 0xa7, 0x7d, 0xff, 0x11, 0xb7, 0xf5, 0x55, 0xe0, 0x1b, + 0x87, 0xbd, 0x78, 0x31, 0x6e, 0x20, 0xc1, 0x7a, 0x67, 0xe3, 0x3e, 0xf4, + 0x91, 0x37, 0x3d, 0xcb, 0xfc, 0x68, 0x27, 0xcf, 0xe5, 0x7d, 0x56, 0x79, + 0x46, 0x00, 0xf1, 0xd4, 0x09, 0x14, 0xf5, 0x5d, 0x8b, 0x4d, 0x6b, 0x9e, + 0x84, 0xda, 0x37, 0xc1, 0xe3, 0x16, 0x74, 0x1f, 0xbe, 0x05, 0xc9, 0xa1, + 0x30, 0x92, 0x87, 0x5f, 0x46, 0xef, 0x90, 0x8c, 0x4b, 0xde, 0x4b, 0x24, + 0xfb, 0xc6, 0x0c, 0x2c, 0xec, 0x93, 0xb5, 0x63, 0xe9, 0xa7, 0x82, 0x7d, + 0xff, 0xa9, 0xed, 0xff, 0xc4, 0xda, 0xf4, 0x97, 0xd2, 0xf6, 0x93, 0x7f, + 0xa4, 0x7d, 0xd1, 0x95, 0xec, 0x2f, 0x68, 0x41, 0xbc, 0x4f, 0xde, 0x71, + 0xe1, 0x66, 0x9b, 0xc5, 0x70, 0x84, 0x33, 0x6b, 0x4a, 0x18, 0x13, 0x76, + 0x2b, 0x46, 0x73, 0x91, 0x72, 0x01, 0xbb, 0xd3, 0xb2, 0x56, 0x97, 0xcf, + 0x18, 0x4a, 0x1d, 0x06, 0x75, 0xed, 0x9f, 0x68, 0x3b, 0x4b, 0xc9, 0xb7, + 0xde, 0x32, 0x3f, 0x4d, 0x5e, 0x26, 0xfa, 0xcb, 0xc7, 0x4b, 0xfd, 0x6e, + 0x62, 0x53, 0x18, 0xd9, 0xe7, 0xef, 0x8a, 0xf1, 0x2f, 0xcc, 0x07, 0x4e, + 0xc7, 0x6b, 0x33, 0x86, 0xa3, 0x5a, 0x9e, 0xef, 0xb3, 0xaf, 0x9d, 0x8c, + 0xb7, 0xe1, 0x10, 0xe5, 0x3d, 0x1b, 0xbf, 0xc4, 0xf9, 0x69, 0xa7, 0xfe, + 0x45, 0xdf, 0xb1, 0x69, 0x5d, 0xf7, 0x50, 0xd7, 0x95, 0x78, 0x2e, 0xfe, + 0x30, 0xbe, 0x41, 0xf9, 0x1f, 0xef, 0x37, 0x22, 0x0b, 0x94, 0x13, 0x38, + 0x36, 0x9c, 0x8f, 0x53, 0x6c, 0x7b, 0xb3, 0xe9, 0xc4, 0x94, 0xf4, 0x45, + 0x5c, 0x4e, 0x33, 0xef, 0x7a, 0x6f, 0xc9, 0x09, 0xc6, 0xa7, 0x7c, 0xfc, + 0x4b, 0xbf, 0x3c, 0xdf, 0x59, 0xc6, 0x3e, 0x44, 0x3f, 0x3e, 0x3b, 0xf7, + 0xea, 0x66, 0x1c, 0x58, 0x59, 0x7f, 0x02, 0xbb, 0x86, 0xe5, 0xda, 0x7a, + 0xe2, 0xfe, 0x45, 0x38, 0x82, 0x79, 0xd8, 0xec, 0xa9, 0xa7, 0xad, 0x33, + 0xff, 0x48, 0x3d, 0x31, 0x2b, 0xcb, 0xcb, 0xe2, 0xb3, 0xe4, 0x99, 0xc4, + 0x93, 0xf1, 0x7c, 0x3c, 0xcf, 0x3a, 0x9b, 0x88, 0x15, 0xd9, 0xfb, 0x6e, + 0x8c, 0x39, 0xe4, 0x0b, 0x29, 0xf6, 0x11, 0xb7, 0xdb, 0x98, 0xa5, 0x1c, + 0xa0, 0x1f, 0x96, 0x2d, 0x9e, 0xa5, 0x24, 0x79, 0x9e, 0x48, 0xbe, 0x4c, + 0x4e, 0x9b, 0xd5, 0xe1, 0x21, 0xb3, 0x0d, 0xc3, 0xa9, 0xbe, 0x59, 0x57, + 0xef, 0x17, 0x09, 0x7e, 0xcb, 0xb3, 0x3f, 0xc6, 0xf4, 0xbb, 0x1d, 0xae, + 0xde, 0x17, 0xfd, 0x76, 0xba, 0x94, 0xbc, 0xb2, 0x90, 0xb6, 0x96, 0x17, + 0xf5, 0x30, 0x9e, 0xb6, 0x2d, 0xd2, 0xb0, 0xf7, 0xc6, 0xd7, 0x49, 0xee, + 0x35, 0xe7, 0x2f, 0xeb, 0x5f, 0x66, 0x3f, 0xa5, 0xd1, 0xf2, 0xf0, 0x7f, + 0xb3, 0xf7, 0xd2, 0x05, 0x6f, 0x9c, 0x8d, 0xd2, 0x41, 0xd9, 0x5f, 0x10, + 0xc5, 0x3b, 0xf1, 0x8a, 0x68, 0x45, 0xb8, 0x0c, 0x67, 0x83, 0x17, 0xd1, + 0x37, 0xe2, 0x44, 0xa9, 0xac, 0xdb, 0x92, 0x03, 0xb8, 0xf7, 0x69, 0xe4, + 0xa8, 0xd7, 0x62, 0xee, 0xbe, 0x79, 0xf0, 0xee, 0xab, 0x44, 0x19, 0xf9, + 0x59, 0x71, 0xd0, 0xb2, 0x7e, 0xba, 0xd8, 0xb2, 0xae, 0xe3, 0x51, 0xc0, + 0xe3, 0x7c, 0x50, 0xfc, 0x34, 0x82, 0x5a, 0xdb, 0x5f, 0x0d, 0xd4, 0xd9, + 0xdf, 0x4d, 0xf4, 0xf5, 0xce, 0xe0, 0xc2, 0xf1, 0x87, 0x83, 0xd5, 0xe3, + 0xb3, 0xa1, 0x0e, 0xce, 0x81, 0x83, 0x6d, 0xfd, 0xc5, 0x8d, 0x16, 0x9a, + 0x4c, 0x59, 0x97, 0x12, 0x7e, 0xd8, 0x46, 0x7e, 0xd8, 0x1b, 0x34, 0xc6, + 0x9f, 0xc4, 0x32, 0xf2, 0x0a, 0xf7, 0xa0, 0x97, 0xfd, 0x28, 0xcc, 0x77, + 0x9c, 0x99, 0xf9, 0xe4, 0x27, 0x9f, 0x5e, 0x2c, 0x5c, 0xb1, 0x55, 0xde, + 0x0d, 0x83, 0xd6, 0xf1, 0x13, 0xb8, 0x83, 0x65, 0x8a, 0x07, 0x5f, 0xb5, + 0x9f, 0xe3, 0xeb, 0x4b, 0x4b, 0x3c, 0xc9, 0x60, 0x15, 0xdb, 0x2e, 0x1c, + 0x6c, 0xc6, 0xe6, 0xf1, 0xd5, 0xd8, 0x34, 0x6e, 0x61, 0x65, 0x70, 0x12, + 0x2b, 0xc7, 0x1f, 0xc6, 0xc6, 0xf1, 0x9c, 0xbf, 0xca, 0x5e, 0x81, 0xd5, + 0xe8, 0xb1, 0x9f, 0x19, 0x5c, 0x0b, 0x77, 0x9f, 0xf8, 0xd9, 0x3a, 0xfa, + 0x19, 0x75, 0x97, 0x8c, 0x61, 0xc3, 0xb8, 0x60, 0xee, 0x83, 0xd8, 0x36, + 0x2e, 0x6b, 0xf6, 0x5f, 0x0f, 0x2e, 0x18, 0x7f, 0x0d, 0x8d, 0xe3, 0xc3, + 0xc1, 0x9a, 0xf1, 0xc3, 0x94, 0x3b, 0x4e, 0xd9, 0xfa, 0x83, 0x55, 0xe3, + 0x43, 0xc1, 0xc0, 0xf8, 0x81, 0xa0, 0x7f, 0xbc, 0x05, 0x3b, 0xc7, 0xd7, + 0x62, 0xc7, 0x78, 0x07, 0xb6, 0x8f, 0x0b, 0x6e, 0x4f, 0x61, 0xc5, 0xf8, + 0x5b, 0x58, 0x3e, 0xfe, 0x02, 0x9a, 0xc6, 0xcf, 0x61, 0xe9, 0xf8, 0xcb, + 0x68, 0x1e, 0x7f, 0x95, 0x63, 0x91, 0x7b, 0x00, 0xb2, 0xfe, 0x9f, 0xbb, + 0x37, 0x3b, 0x73, 0xff, 0xbb, 0xec, 0xed, 0x93, 0xe7, 0xfe, 0x64, 0x0e, + 0x5d, 0x58, 0xa3, 0x9d, 0x47, 0xcf, 0x7e, 0x79, 0xb7, 0x5e, 0xad, 0xb6, + 0x0d, 0x72, 0xdf, 0xfd, 0x65, 0x79, 0x0e, 0x84, 0x36, 0x36, 0x73, 0xaf, + 0xb7, 0xae, 0x4d, 0x5d, 0xb9, 0x4f, 0x2d, 0xcf, 0xdf, 0x49, 0xec, 0xb9, + 0xc0, 0x3c, 0xf5, 0x03, 0x2b, 0xa2, 0x49, 0x59, 0x79, 0x2e, 0x50, 0xec, + 0xe1, 0x3c, 0x1e, 0xdb, 0x7f, 0x81, 0x7c, 0x67, 0x92, 0x7c, 0x46, 0xc1, + 0xfb, 0x35, 0xf2, 0xde, 0x25, 0x1f, 0xb1, 0xe9, 0x3c, 0x92, 0xa3, 0xe4, + 0x5a, 0x07, 0xc5, 0x0f, 0xdb, 0xe8, 0x87, 0x93, 0xe2, 0x93, 0x31, 0x62, + 0xf2, 0x97, 0x8b, 0xf1, 0x20, 0x9e, 0x4f, 0xe5, 0x21, 0x73, 0xb8, 0x10, + 0x67, 0x86, 0x62, 0xcc, 0xdd, 0xe5, 0x5d, 0x34, 0x06, 0x73, 0xd3, 0x42, + 0xbc, 0xca, 0x6b, 0x93, 0xfd, 0xf0, 0x79, 0x0d, 0xbf, 0x77, 0x3e, 0xcf, + 0x4f, 0x0d, 0x4f, 0x92, 0xd3, 0x74, 0x62, 0x8a, 0xdf, 0x92, 0xf3, 0x03, + 0xdb, 0x30, 0x3c, 0x2c, 0xfa, 0x6c, 0xa1, 0x3e, 0x05, 0x17, 0xf5, 0xce, + 0x26, 0xe2, 0xa1, 0xa5, 0x08, 0x1e, 0xaa, 0xcc, 0x47, 0x84, 0x4b, 0xd8, + 0xef, 0xb2, 0x31, 0xfb, 0x94, 0x97, 0xf1, 0xfc, 0x61, 0x95, 0xbc, 0x85, + 0x79, 0x23, 0xb1, 0xb2, 0x34, 0xac, 0x18, 0x2b, 0xfd, 0xe7, 0x71, 0xe6, + 0xb0, 0x93, 0xb9, 0x88, 0x13, 0x93, 0xc4, 0x49, 0x47, 0x42, 0xf6, 0x7c, + 0x30, 0x3b, 0x27, 0xf6, 0x65, 0x88, 0x45, 0x19, 0xfb, 0x9e, 0xac, 0x70, + 0xab, 0x1f, 0xd8, 0xfd, 0x38, 0x29, 0x7b, 0x4f, 0x5c, 0xd6, 0xdd, 0xff, + 0x19, 0x4d, 0xc3, 0xc5, 0x98, 0x9f, 0x38, 0x47, 0x0e, 0xf5, 0x16, 0x92, + 0xfb, 0x2b, 0x71, 0x17, 0xb9, 0xe0, 0xdc, 0x84, 0x49, 0xce, 0xef, 0xc5, + 0x9d, 0x63, 0x26, 0x79, 0xe0, 0x5a, 0xac, 0x39, 0xf2, 0x05, 0x1e, 0x73, + 0x70, 0xc7, 0x91, 0x76, 0xdc, 0x3e, 0x16, 0x43, 0xeb, 0x58, 0x0f, 0x8f, + 0xf5, 0xf8, 0xdc, 0x40, 0x19, 0x52, 0x41, 0x0d, 0x7b, 0x96, 0xac, 0xc7, + 0xaa, 0x83, 0x92, 0xc7, 0x6e, 0xc0, 0x19, 0xe2, 0x4e, 0x20, 0xb8, 0x01, + 0x93, 0xb6, 0x2f, 0xca, 0xbe, 0xd8, 0x0d, 0xd8, 0xde, 0x6f, 0x68, 0x23, + 0xd8, 0x80, 0x6e, 0x5e, 0x1b, 0xb0, 0xe7, 0xe0, 0x04, 0x1a, 0x06, 0x15, + 0x5c, 0xbe, 0xe9, 0x04, 0x6e, 0x3e, 0x24, 0x7d, 0x5f, 0x44, 0x72, 0x6f, + 0x1b, 0xdb, 0xcc, 0xa0, 0x65, 0xec, 0x87, 0xb8, 0x7d, 0x00, 0xf7, 0x94, + 0xa1, 0x0c, 0x2f, 0x04, 0xfd, 0xad, 0x7d, 0xca, 0x0f, 0xed, 0xb6, 0xb7, + 0x27, 0x5f, 0x23, 0x17, 0xbb, 0x80, 0xc7, 0x53, 0xaf, 0xa2, 0x37, 0x39, + 0x73, 0x4e, 0x65, 0x2e, 0xdf, 0x65, 0x3c, 0x78, 0x05, 0x47, 0x0f, 0x4f, + 0x11, 0x7b, 0xdf, 0xe0, 0xf1, 0xf1, 0x3d, 0x10, 0xd9, 0x67, 0x7c, 0xb3, + 0x76, 0x23, 0xef, 0x96, 0xc8, 0xf1, 0xb7, 0x98, 0x55, 0x66, 0x64, 0x76, + 0xcd, 0x85, 0xde, 0x11, 0x52, 0xbb, 0xe8, 0xb3, 0xb2, 0x6e, 0xa2, 0xb7, + 0xfc, 0x13, 0xb9, 0x7b, 0x51, 0x38, 0x80, 0xd5, 0x69, 0x3d, 0xb2, 0x8a, + 0xfa, 0x2e, 0x78, 0xe4, 0x15, 0x38, 0x1f, 0x71, 0x22, 0x9f, 0x39, 0x61, + 0x30, 0x28, 0xef, 0x09, 0x92, 0x77, 0xd2, 0x64, 0xf4, 0x7c, 0x79, 0x77, + 0x48, 0x62, 0x92, 0xb1, 0x3f, 0xb3, 0x30, 0x0f, 0xf2, 0x8c, 0xfd, 0xad, + 0x68, 0xeb, 0x8f, 0xa0, 0xdb, 0x94, 0xe7, 0xc9, 0xb2, 0xe3, 0x9f, 0x5f, + 0xff, 0x0a, 0xb6, 0x31, 0xfe, 0xac, 0x27, 0x26, 0xde, 0x65, 0xdf, 0x2b, + 0x7a, 0x05, 0x3d, 0x43, 0x93, 0x6e, 0xe1, 0x3b, 0x3d, 0xa6, 0xe4, 0x99, + 0xba, 0xf9, 0xd1, 0x77, 0x12, 0x2d, 0x90, 0x7d, 0x88, 0xb4, 0x89, 0xcc, + 0x42, 0x17, 0x1c, 0xb3, 0xb2, 0xef, 0xc5, 0xf9, 0xa4, 0x77, 0x48, 0xfd, + 0x99, 0xfd, 0x0e, 0x29, 0xd9, 0x8b, 0x21, 0xef, 0x1f, 0x7b, 0x3a, 0x2e, + 0xef, 0x05, 0x51, 0x1b, 0x5c, 0x50, 0x3d, 0x2e, 0xf2, 0xc2, 0xb7, 0xcc, + 0xd9, 0xd8, 0xe6, 0xb1, 0xb0, 0x8c, 0xb2, 0x1c, 0xab, 0xfb, 0x1c, 0x50, + 0x1e, 0x6b, 0x75, 0xd9, 0xef, 0x9a, 0xc1, 0x97, 0x7e, 0xff, 0x5d, 0x33, + 0xef, 0x12, 0x27, 0x65, 0xbd, 0xec, 0x4e, 0x9c, 0xb5, 0x63, 0x82, 0x82, + 0xa2, 0x6a, 0xcb, 0xea, 0x08, 0xfa, 0xf0, 0x9c, 0x51, 0xeb, 0x2b, 0x97, + 0x7b, 0x1b, 0xca, 0x79, 0x2b, 0xe6, 0xa9, 0x64, 0x7c, 0xf9, 0x43, 0xcf, + 0x4f, 0xbc, 0x88, 0x9d, 0x7b, 0x43, 0xe4, 0x8c, 0x1e, 0xca, 0x7f, 0x7a, + 0x56, 0xee, 0xb9, 0xdb, 0x1d, 0x76, 0xee, 0x51, 0x44, 0x70, 0x79, 0x97, + 0x7e, 0xf6, 0xae, 0x7d, 0xff, 0xd6, 0x6d, 0xfc, 0x39, 0x02, 0xe5, 0xb3, + 0xb2, 0xcf, 0xc4, 0xd9, 0xfb, 0xb3, 0xe5, 0xfd, 0x2b, 0x8e, 0xe9, 0x3a, + 0x52, 0x56, 0xea, 0xbd, 0x6b, 0xdf, 0x33, 0x76, 0x19, 0x1f, 0x58, 0x6f, + 0x7b, 0x2a, 0x58, 0xb6, 0x63, 0x56, 0xee, 0xf9, 0x76, 0xfa, 0x8c, 0x19, + 0x81, 0x5c, 0x93, 0x3a, 0xa2, 0xab, 0xab, 0x75, 0xb6, 0x25, 0x1d, 0xc4, + 0xbd, 0x73, 0x56, 0x97, 0x47, 0xc6, 0xb0, 0xe0, 0x63, 0x75, 0xb2, 0xf7, + 0xe1, 0xb2, 0xfa, 0x15, 0x79, 0x7e, 0xbf, 0xcf, 0xa4, 0xbd, 0x5e, 0x59, + 0x84, 0xf3, 0xe5, 0xd9, 0xb5, 0x85, 0xab, 0x32, 0x06, 0x66, 0xcb, 0x5e, + 0x4d, 0xfb, 0x9d, 0x0d, 0xb0, 0xfb, 0x35, 0xaf, 0xd6, 0x0b, 0x7a, 0xb2, + 0xed, 0x54, 0xd8, 0xcf, 0xa5, 0x3d, 0x6a, 0xf3, 0x1a, 0xc7, 0x8c, 0x71, + 0x7f, 0xdf, 0xf3, 0xd1, 0x7e, 0x2a, 0xa6, 0xfb, 0x55, 0xed, 0x67, 0xfb, + 0xae, 0xf6, 0x21, 0x72, 0x2d, 0x9b, 0xae, 0xa3, 0x87, 0x22, 0x76, 0xff, + 0x2a, 0x42, 0xfb, 0x73, 0x7d, 0xd2, 0x9f, 0x16, 0xe7, 0xda, 0x98, 0x14, + 0xfb, 0xea, 0xca, 0x67, 0x6c, 0x3a, 0x5f, 0xff, 0x20, 0xb6, 0xc7, 0x45, + 0xcf, 0xf2, 0x4e, 0x52, 0x62, 0xb0, 0xcd, 0xb5, 0x5c, 0xf4, 0xb7, 0x1b, + 0x31, 0xac, 0xc5, 0x70, 0xa8, 0x4e, 0xee, 0x49, 0xb8, 0x68, 0xd3, 0x31, + 0x14, 0x90, 0xdb, 0x46, 0x78, 0x4d, 0xf6, 0x21, 0x1d, 0x35, 0xf5, 0xc8, + 0xd3, 0xf8, 0x1a, 0x1c, 0xd7, 0xdb, 0x6b, 0x2f, 0xcd, 0xc3, 0x90, 0xeb, + 0x26, 0x73, 0x93, 0x99, 0x2b, 0x15, 0x05, 0xb4, 0x1d, 0x7b, 0xff, 0xbc, + 0x29, 0xcf, 0x69, 0xf6, 0xc5, 0xe5, 0x79, 0xc1, 0xda, 0x28, 0xf9, 0x21, + 0xce, 0xa6, 0x64, 0xcf, 0xca, 0xaf, 0xad, 0xd8, 0x6c, 0xd9, 0x1b, 0x3b, + 0xb3, 0x4e, 0x1e, 0x71, 0xc9, 0x1f, 0x2a, 0x55, 0x7e, 0xff, 0xde, 0xc7, + 0x1d, 0xb4, 0x99, 0x0b, 0xf6, 0x73, 0x9e, 0x72, 0x16, 0x46, 0x63, 0x52, + 0xde, 0xad, 0xa9, 0x4f, 0xae, 0x44, 0x6d, 0xa6, 0xca, 0xe1, 0x9c, 0xe6, + 0x1f, 0x21, 0xac, 0xa6, 0xdd, 0xec, 0xf0, 0x87, 0xec, 0xe7, 0x19, 0x57, + 0x24, 0xab, 0x02, 0x8f, 0x43, 0x6f, 0xff, 0x31, 0xcb, 0x7f, 0x2e, 0xfd, + 0xa2, 0x35, 0xec, 0x91, 0x31, 0xe5, 0x7c, 0x5c, 0xee, 0xb3, 0x53, 0x8f, + 0x61, 0xf1, 0x8f, 0x62, 0x94, 0x87, 0x43, 0xf4, 0x43, 0x89, 0xdf, 0xf2, + 0x2c, 0xa4, 0x7e, 0x40, 0xf2, 0xaa, 0xc6, 0xb4, 0xbc, 0x57, 0x41, 0xf6, + 0xba, 0xeb, 0xbe, 0x35, 0x8e, 0xc0, 0xf4, 0x9e, 0xf3, 0x5c, 0xbc, 0xff, + 0xdb, 0xd9, 0xd3, 0xfb, 0xe1, 0x99, 0x07, 0xae, 0x66, 0x1e, 0x28, 0xd8, + 0xd0, 0x66, 0x63, 0x83, 0x66, 0xe8, 0xc7, 0x7e, 0xe1, 0xe8, 0xc2, 0xf7, + 0x16, 0x19, 0x9d, 0xc7, 0xd5, 0xcc, 0xb0, 0x97, 0x38, 0x71, 0x8b, 0x23, + 0x32, 0xc0, 0x6f, 0xdf, 0x0f, 0x88, 0xcd, 0x77, 0xd8, 0x75, 0xf5, 0xc0, + 0x5a, 0x55, 0xf6, 0x90, 0xb5, 0x60, 0xac, 0x4f, 0x9e, 0x93, 0xd1, 0x5b, + 0xbf, 0xad, 0x74, 0x61, 0x6b, 0xd0, 0x68, 0xe9, 0x50, 0xf4, 0xe6, 0xbf, + 0x57, 0x74, 0x5f, 0x50, 0x91, 0x72, 0xf6, 0x3b, 0x91, 0xae, 0xc4, 0x4e, + 0x17, 0xfb, 0x38, 0x12, 0xd7, 0x43, 0xb3, 0x58, 0xf6, 0xbc, 0x69, 0x78, + 0x2f, 0xb2, 0xcd, 0x1f, 0xf1, 0x18, 0x40, 0x00, 0x4b, 0xed, 0x76, 0x23, + 0x0b, 0x5d, 0xf6, 0x7b, 0x71, 0x5b, 0x19, 0x13, 0x64, 0x1d, 0x25, 0x0a, + 0x2d, 0x51, 0x49, 0x13, 0xd3, 0x7b, 0x3f, 0x8f, 0x98, 0x35, 0xdb, 0x60, + 0x56, 0x56, 0x58, 0x0c, 0x4f, 0xb8, 0x0b, 0xd5, 0x8b, 0x0c, 0xef, 0x12, + 0xd5, 0xae, 0x1f, 0x90, 0xf7, 0x3d, 0x2d, 0xe5, 0x38, 0x87, 0x20, 0x6d, + 0x64, 0x2c, 0xad, 0xba, 0xcc, 0xae, 0xb3, 0x48, 0xfd, 0x2c, 0x5c, 0x37, + 0xfc, 0xd2, 0x1a, 0xd6, 0xa0, 0x55, 0x18, 0x52, 0x27, 0x36, 0xa0, 0xe1, + 0x0f, 0xd5, 0x13, 0x5c, 0xf9, 0x85, 0x85, 0x39, 0x52, 0x4f, 0xee, 0x3b, + 0xad, 0xb3, 0xef, 0x3b, 0x15, 0x1a, 0xe2, 0x8f, 0x7a, 0xe4, 0xab, 0xe4, + 0x9a, 0x85, 0x4a, 0xf6, 0x9e, 0xb0, 0x33, 0xbc, 0x9e, 0x78, 0xd6, 0x05, + 0x2d, 0xa8, 0xf7, 0x5e, 0xab, 0xca, 0x3b, 0xa3, 0x9e, 0x93, 0xbd, 0x56, + 0x07, 0x6a, 0xd4, 0xec, 0x9e, 0xac, 0xe8, 0x1f, 0x7d, 0xff, 0x14, 0xfb, + 0x2a, 0x94, 0x7b, 0xf9, 0x95, 0xf6, 0x33, 0x45, 0xeb, 0xe3, 0x8e, 0xe9, + 0x3d, 0xa6, 0x57, 0xdf, 0xcb, 0xda, 0x46, 0x5e, 0xbf, 0x51, 0xde, 0xc1, + 0xc8, 0xb1, 0x6e, 0x8a, 0xcb, 0x32, 0xda, 0xff, 0x07, 0x05, 0x66, 0x47, + 0x6b, 0xc8, 0x58, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_CP_b06FwData[(0x84/4) + 1] = { + 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006, + 0x00000005, 0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000003, + 0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000001, 0x00000001, 0x00000001, 0x00000000 }; +static const u32 bnx2_CP_b06FwRodata[(0x154/4) + 1] = { + 0x08000f58, 0x08000db0, 0x08000fec, 0x08001094, 0x08000f80, 0x08000fc0, + 0x080011cc, 0x08000dcc, 0x080011f0, 0x08000e1c, 0x08001634, 0x080015dc, + 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x0800127c, 0x0800127c, 0x08000dcc, + 0x08000dcc, 0x08001580, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x080013f0, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000fe0, 0x08000dcc, 0x08000dcc, + 0x08001530, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, 0x08000dcc, + 0x0800145c, 0x08000dcc, 0x08000dcc, 0x08001370, 0x080012e0, 0x08002e94, + 0x08002e9c, 0x08002e64, 0x08002e70, 0x08002e7c, 0x08002e88, 0x080046b4, + 0x08003f00, 0x08004634, 0x080046b4, 0x080046b4, 0x080044b4, 0x080046b4, + 0x080046fc, 0x08005524, 0x080054e4, 0x080054b0, 0x08005484, 0x08005460, + 0x0800541c, 0x00000000 }; + +static struct fw_info bnx2_cp_fw_06 = { + /* Firmware version: 5.0.0j9 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000088, + + .text_addr = 0x08000000, + .text_len = 0x58c4, + .text_index = 0x0, + .gz_text = bnx2_CP_b06FwText, + .gz_text_len = sizeof(bnx2_CP_b06FwText), + + .data_addr = 0x08005a40, + .data_len = 0x84, + .data_index = 0x0, + .data = bnx2_CP_b06FwData, + + .sbss_addr = 0x08005ac4, + .sbss_len = 0xf1, + .sbss_index = 0x0, + + .bss_addr = 0x08005bb8, + .bss_len = 0x5d8, + .bss_index = 0x0, + + .rodata_addr = 0x080058c4, + .rodata_len = 0x154, + .rodata_index = 0x0, + .rodata = bnx2_CP_b06FwRodata, +}; + +/* Initialized Values the Command Processor. */ +static const struct cpu_reg cpu_reg_cp = { + .mode = BNX2_CP_CPU_MODE, + .mode_value_halt = BNX2_CP_CPU_MODE_SOFT_HALT, + .mode_value_sstep = BNX2_CP_CPU_MODE_STEP_ENA, + .state = BNX2_CP_CPU_STATE, + .state_value_clear = 0xffffff, + .gpr0 = BNX2_CP_CPU_REG_FILE, + .evmask = BNX2_CP_CPU_EVENT_MASK, + .pc = BNX2_CP_CPU_PROGRAM_COUNTER, + .inst = BNX2_CP_CPU_INSTRUCTION, + .bp = BNX2_CP_CPU_HW_BREAKPOINT, + .spad_base = BNX2_CP_SCRATCH, + .mips_view_base = 0x8000000, +}; + +static u8 bnx2_RXP_b06FwText[] = { + 0xec, 0x5b, 0x6f, 0x6c, 0x1c, 0xc7, 0x75, 0x7f, 0xbb, 0x77, 0xa4, 0x4e, + 0x14, 0x79, 0x5a, 0x51, 0x67, 0xea, 0xa4, 0x32, 0xc9, 0x1d, 0xb9, 0x12, + 0x19, 0x93, 0x75, 0x56, 0xc4, 0x49, 0xa6, 0xdd, 0xab, 0x7d, 0xbe, 0xa3, + 0x24, 0xa6, 0x50, 0x60, 0xda, 0x66, 0x6d, 0xc3, 0x35, 0xd2, 0xc3, 0x9d, + 0xe4, 0x04, 0x69, 0x3e, 0xa8, 0x49, 0xa4, 0x18, 0xae, 0x5b, 0x5d, 0x8e, + 0xb4, 0xac, 0x2a, 0x27, 0x2e, 0x1b, 0x09, 0x56, 0x80, 0xf4, 0xc3, 0x99, + 0x7f, 0x44, 0xd5, 0x38, 0x7a, 0x6d, 0xd7, 0x4e, 0x52, 0x14, 0xb2, 0x08, + 0x59, 0x56, 0xfc, 0xa1, 0x28, 0x52, 0xa4, 0x68, 0x5d, 0x20, 0x6d, 0x55, + 0x29, 0x91, 0x0d, 0x14, 0x48, 0x04, 0xc4, 0x41, 0xd4, 0x46, 0xd1, 0xf6, + 0xf7, 0x9b, 0xdd, 0x25, 0x4f, 0xaa, 0x8a, 0xca, 0x45, 0x8c, 0x7e, 0xd9, + 0x01, 0x88, 0xdd, 0x99, 0x7d, 0xf3, 0xe6, 0xcd, 0x9b, 0xf7, 0x7e, 0xef, + 0xcd, 0xcc, 0xf1, 0x40, 0xbb, 0xb4, 0x89, 0x5f, 0x3a, 0xf0, 0xb7, 0x6d, + 0xdf, 0xd3, 0x5f, 0xb2, 0xee, 0xb2, 0xee, 0x12, 0xb9, 0xe7, 0x0b, 0x11, + 0x91, 0x16, 0xb6, 0x6b, 0x12, 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, + 0x4b, 0x58, 0xc2, 0x12, 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, 0x4b, + 0x58, 0xc2, 0x12, 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, 0x4b, 0x58, + 0xc2, 0x12, 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, 0x4b, 0x58, 0xc2, + 0x12, 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, 0x4b, 0x58, 0xc2, 0x12, + 0x96, 0xb0, 0x84, 0x25, 0x2c, 0x61, 0x09, 0x4b, 0x58, 0xc2, 0x12, 0x96, + 0x8f, 0xa2, 0x44, 0x44, 0x0c, 0x3e, 0x3b, 0xfc, 0x3f, 0x89, 0xe9, 0xd9, + 0xfa, 0xfe, 0xbc, 0x29, 0xb1, 0x48, 0x76, 0xf4, 0x99, 0xb2, 0x29, 0x92, + 0x6b, 0x0c, 0xa4, 0x0a, 0xf2, 0x2b, 0xb7, 0x92, 0x88, 0x0a, 0xdb, 0x3f, + 0x96, 0xbd, 0x76, 0xf0, 0xf4, 0xdd, 0xe9, 0x2b, 0xf5, 0x88, 0xc4, 0x8c, + 0xec, 0xbb, 0x5b, 0x8d, 0x2d, 0x12, 0xeb, 0x46, 0x9f, 0x3f, 0xef, 0xfb, + 0xa9, 0x21, 0xf1, 0x80, 0x97, 0xeb, 0xce, 0x5b, 0xae, 0x9c, 0xb7, 0x2a, + 0x5a, 0xa1, 0xef, 0xbb, 0x5a, 0xde, 0xbe, 0xee, 0xe6, 0xa2, 0xba, 0xe8, + 0xe0, 0xb7, 0xa7, 0x11, 0x93, 0xbd, 0x73, 0x6d, 0xf2, 0x54, 0x7d, 0x8d, + 0x94, 0xea, 0x62, 0xe8, 0xd9, 0xa4, 0x7c, 0x0e, 0x6d, 0x17, 0x22, 0xa0, + 0x73, 0xa4, 0x18, 0xc9, 0x5e, 0x7d, 0xb0, 0x54, 0x23, 0xbd, 0xe8, 0x7a, + 0x76, 0xe9, 0xc1, 0x3d, 0x8d, 0x73, 0x0f, 0x96, 0x1a, 0xa4, 0x23, 0x0d, + 0xbe, 0x35, 0xda, 0xa5, 0x7a, 0x3c, 0x21, 0x87, 0xcc, 0xf4, 0x70, 0x5d, + 0xf4, 0xf5, 0xba, 0x54, 0x0c, 0x5d, 0xd2, 0xb9, 0xaa, 0x0c, 0x18, 0xef, + 0xc8, 0x63, 0x92, 0x33, 0xbc, 0x99, 0xbd, 0x35, 0xbd, 0x5a, 0x4a, 0x83, + 0x0f, 0x49, 0x6e, 0x4c, 0x93, 0xb3, 0xd3, 0x15, 0x03, 0x33, 0xc5, 0x9c, + 0xc6, 0xf6, 0x97, 0xcd, 0xb4, 0x51, 0xc0, 0xf7, 0x7c, 0x2d, 0x26, 0x39, + 0x45, 0xa9, 0x81, 0xb6, 0x0d, 0xb2, 0xdd, 0x2b, 0xa5, 0x04, 0xeb, 0xbd, + 0x46, 0xab, 0xd6, 0x26, 0xf9, 0xc1, 0xed, 0x92, 0x4b, 0xe8, 0x72, 0x1e, + 0x32, 0x5f, 0xac, 0x89, 0x96, 0xcf, 0xe0, 0xd9, 0x10, 0xf0, 0x22, 0xbd, + 0x2e, 0xe7, 0xa6, 0x23, 0xf2, 0xf6, 0xb4, 0x74, 0x83, 0x6f, 0x97, 0x2e, + 0x9b, 0xc9, 0xb3, 0x27, 0x8a, 0xe7, 0x08, 0xfe, 0x76, 0x48, 0x14, 0xfd, + 0xa2, 0xb7, 0xa2, 0x07, 0x2d, 0xfb, 0xdc, 0x8a, 0xfe, 0xa5, 0x76, 0x69, + 0x8b, 0xa1, 0x0f, 0xe9, 0x31, 0x79, 0xb3, 0x0b, 0xf2, 0x78, 0xe3, 0x93, + 0xc7, 0xb9, 0x69, 0x91, 0x4b, 0x35, 0xe9, 0xd4, 0x55, 0x9f, 0xa8, 0x94, + 0x33, 0xfc, 0xd6, 0x0e, 0xfa, 0x97, 0xd4, 0xff, 0xe7, 0x5c, 0x52, 0xfd, + 0x22, 0xe8, 0x17, 0x5b, 0xee, 0x07, 0xb9, 0xd1, 0xa6, 0xe1, 0x3d, 0x26, + 0xf9, 0x8c, 0x21, 0x97, 0xea, 0x1e, 0xed, 0x45, 0xa5, 0x6f, 0x0d, 0xb4, + 0x9e, 0x6c, 0xba, 0xa9, 0x4b, 0x09, 0x5a, 0x3c, 0x67, 0xa6, 0x53, 0xa2, + 0x91, 0x26, 0x6d, 0x55, 0x84, 0x4f, 0xf6, 0xa5, 0xfe, 0xbc, 0xb6, 0xb3, + 0xc2, 0x7e, 0x69, 0x68, 0xf8, 0x7d, 0xf7, 0x74, 0x5f, 0x42, 0xce, 0x38, + 0x86, 0xbc, 0xe2, 0xc4, 0xd7, 0x4b, 0x3c, 0x5d, 0xa9, 0x48, 0x8b, 0x94, + 0x8e, 0x5d, 0x77, 0x23, 0xe4, 0xa1, 0x9b, 0x98, 0x1f, 0xbe, 0xdb, 0xf8, + 0x6e, 0xa3, 0x7d, 0x76, 0xc3, 0x7a, 0x69, 0x4b, 0xca, 0xe9, 0x3e, 0xf6, + 0x63, 0x1f, 0xf6, 0x8d, 0xaf, 0xf5, 0xfa, 0x09, 0xfa, 0x8d, 0x49, 0xc4, + 0x74, 0x25, 0x6f, 0x45, 0xa5, 0x90, 0x10, 0x4d, 0x37, 0x2b, 0xb0, 0x85, + 0x9e, 0x0e, 0x8c, 0x09, 0x5e, 0x15, 0x2d, 0xe7, 0xf0, 0x19, 0xf0, 0x5b, + 0x5c, 0xeb, 0xf1, 0xaa, 0x80, 0xd7, 0xd3, 0xf2, 0xa6, 0xf3, 0x15, 0xf9, + 0x8e, 0xb3, 0x47, 0xfe, 0xd2, 0x79, 0x16, 0x3c, 0xf7, 0xc9, 0xb7, 0x9d, + 0x2f, 0xca, 0x1b, 0xce, 0xe7, 0xe5, 0x75, 0xa7, 0x28, 0xaf, 0x39, 0x4f, + 0xca, 0xab, 0xce, 0xe3, 0x18, 0xaf, 0x5f, 0x1b, 0xb3, 0xef, 0x97, 0xf2, + 0x31, 0xca, 0x98, 0xbe, 0x02, 0xfb, 0x94, 0x2f, 0x5b, 0x7d, 0x98, 0xb1, + 0x86, 0x31, 0xd3, 0xdf, 0x15, 0x79, 0x0a, 0x6b, 0x3d, 0x26, 0x75, 0xa7, + 0x4b, 0xcb, 0x1f, 0xeb, 0xd4, 0x0a, 0xc7, 0x28, 0x8b, 0x2b, 0x65, 0x2b, + 0x9d, 0xca, 0x63, 0xbe, 0x85, 0x88, 0xe4, 0x76, 0x98, 0xdd, 0x52, 0xb5, + 0x93, 0xb4, 0xaf, 0xdc, 0x9f, 0x99, 0x51, 0xd8, 0xb4, 0x26, 0x91, 0x2c, + 0xe7, 0xb9, 0xde, 0xb7, 0xb9, 0x76, 0x99, 0xad, 0x59, 0x52, 0xb2, 0xdf, + 0xd0, 0x4a, 0x09, 0xea, 0xd6, 0x40, 0x7d, 0x10, 0xf5, 0x57, 0xfd, 0x3a, + 0xec, 0xeb, 0x84, 0xe4, 0x26, 0x8e, 0xbb, 0x6e, 0xde, 0x6a, 0xf8, 0x6d, + 0xc3, 0x68, 0xd3, 0xa5, 0xf7, 0x05, 0xb6, 0x2d, 0xf8, 0x6d, 0xd4, 0x87, + 0x2b, 0x05, 0x8b, 0x6a, 0x84, 0xbc, 0xc6, 0x18, 0x9e, 0xad, 0x78, 0x72, + 0x8c, 0x2f, 0x76, 0x78, 0xff, 0x8b, 0x45, 0x1f, 0xdb, 0x8f, 0x77, 0x0b, + 0x32, 0x4b, 0xec, 0xe3, 0xd9, 0xd8, 0x81, 0x7f, 0xe9, 0x5b, 0xa9, 0xeb, + 0xd9, 0x1f, 0xc2, 0xbe, 0x35, 0xe5, 0xaf, 0x1a, 0xde, 0x7b, 0x1a, 0xef, + 0xae, 0xf7, 0x7c, 0x33, 0x02, 0xdd, 0x41, 0x4f, 0x36, 0xe5, 0x4f, 0x41, + 0xfe, 0x0e, 0xc9, 0x7c, 0x83, 0x73, 0x18, 0x48, 0xe9, 0x92, 0x4b, 0x47, + 0xc5, 0x92, 0x39, 0x27, 0xaa, 0x15, 0xec, 0x9c, 0xe8, 0x59, 0x33, 0x59, + 0x12, 0x5d, 0x8a, 0x89, 0x9c, 0x3c, 0x9f, 0x49, 0x0f, 0x57, 0x24, 0x25, + 0xd5, 0x21, 0x4b, 0x16, 0x1c, 0x50, 0x26, 0x2a, 0x72, 0x39, 0x93, 0xb6, + 0x2e, 0xc8, 0x1a, 0x59, 0x32, 0x2c, 0x39, 0xe9, 0xc4, 0xe4, 0xed, 0x63, + 0xbb, 0xe5, 0x73, 0x36, 0xd7, 0x49, 0x06, 0x5a, 0xe4, 0x6b, 0x32, 0x9f, + 0xf9, 0xda, 0x95, 0x79, 0xeb, 0x68, 0xbb, 0xc4, 0x89, 0x03, 0xb2, 0xd6, + 0x93, 0xfb, 0x3e, 0xcc, 0x2d, 0x07, 0xdd, 0xc6, 0xa1, 0xb3, 0xa8, 0x37, + 0xaf, 0x47, 0x3b, 0xf1, 0x64, 0xbf, 0xcb, 0x09, 0xd8, 0x83, 0x95, 0xd2, + 0x03, 0x19, 0x31, 0xf7, 0x2e, 0xf6, 0x59, 0xdf, 0x81, 0xf6, 0xd4, 0x8a, + 0xec, 0x9b, 0xb4, 0xc2, 0x89, 0xb8, 0x98, 0x2f, 0x6c, 0x03, 0xaf, 0xa8, + 0x3c, 0x37, 0xe4, 0xba, 0x07, 0xac, 0x68, 0x6a, 0x44, 0xc6, 0x29, 0xbb, + 0x0c, 0x4d, 0xdd, 0x21, 0x75, 0x23, 0x26, 0xdb, 0xa6, 0x82, 0xb1, 0x56, + 0xf9, 0xeb, 0xd3, 0x4f, 0xfe, 0xa9, 0x9c, 0xde, 0x11, 0x60, 0x84, 0x2f, + 0xd3, 0x08, 0xd6, 0xa8, 0xd7, 0xc8, 0xeb, 0x3b, 0x34, 0x60, 0x0e, 0xca, + 0xa8, 0x5f, 0x7f, 0x40, 0x7b, 0x20, 0xda, 0x25, 0x51, 0x33, 0x12, 0x97, + 0xb6, 0xa8, 0x9c, 0xb5, 0x83, 0x76, 0xe0, 0x86, 0xa2, 0xa3, 0x9e, 0x65, + 0xeb, 0x8a, 0x9e, 0x65, 0x6b, 0x4f, 0xe3, 0xe7, 0x71, 0x8f, 0x67, 0xce, + 0xa7, 0x5d, 0x2d, 0xb9, 0x64, 0x3b, 0xd7, 0xd4, 0xa7, 0xbd, 0x26, 0xc7, + 0x87, 0xd2, 0xaf, 0x10, 0x73, 0x56, 0xfa, 0xf0, 0xbb, 0x25, 0x33, 0x8e, + 0xea, 0x93, 0x7a, 0x18, 0x6b, 0x5b, 0x49, 0xde, 0x69, 0x9c, 0xd3, 0xbb, + 0xb4, 0x9c, 0xc2, 0xa3, 0x56, 0x79, 0x21, 0xd1, 0x8b, 0xba, 0x26, 0xd5, + 0x7b, 0x69, 0xaf, 0x86, 0xdf, 0xce, 0xb6, 0xf4, 0xf4, 0x88, 0xfe, 0xef, + 0x58, 0x77, 0xd7, 0x7d, 0xd4, 0xa2, 0x8e, 0x74, 0xac, 0xd1, 0x26, 0xcc, + 0xcf, 0xc0, 0x33, 0x98, 0xff, 0x3a, 0x60, 0x20, 0xe5, 0x57, 0x7e, 0x0a, + 0x3d, 0x27, 0x31, 0xde, 0xfd, 0xf0, 0xc9, 0x9b, 0xfd, 0x15, 0x3e, 0x1a, + 0xa7, 0xaf, 0xde, 0x83, 0x39, 0xa7, 0xfb, 0x45, 0xd6, 0x41, 0x5f, 0x49, + 0x69, 0x35, 0xf5, 0xb5, 0xc4, 0x01, 0xdd, 0xdc, 0x80, 0xf6, 0xd5, 0x57, + 0x3d, 0xcc, 0x0c, 0xda, 0xae, 0xfa, 0xba, 0xdc, 0x2d, 0x65, 0x7b, 0x5c, + 0xcd, 0x79, 0x46, 0xff, 0x99, 0xe4, 0xba, 0x7b, 0x8d, 0x59, 0xc8, 0x9b, + 0x8f, 0xa6, 0x4f, 0x15, 0x25, 0x89, 0x75, 0x31, 0xe0, 0x8b, 0x09, 0xf8, + 0x66, 0x0a, 0xfe, 0x95, 0x93, 0xbd, 0x76, 0x56, 0xca, 0x27, 0xe8, 0x63, + 0x69, 0x83, 0xfe, 0xa5, 0xd6, 0xce, 0x76, 0xdd, 0xb2, 0x25, 0xb9, 0xbc, + 0x39, 0x90, 0x9c, 0xa0, 0x1d, 0xc2, 0x3e, 0x67, 0x9c, 0x7e, 0x99, 0x77, + 0x36, 0xa7, 0x54, 0xdd, 0x31, 0xf1, 0x3e, 0x08, 0xfb, 0xce, 0xc0, 0xbf, + 0x39, 0xb7, 0x98, 0x3f, 0x37, 0xe0, 0x23, 0xec, 0x2e, 0xa5, 0x0f, 0xcb, + 0x7c, 0xdf, 0x1c, 0xec, 0x6d, 0x18, 0x34, 0x6b, 0x24, 0x37, 0xce, 0xf6, + 0x61, 0x99, 0xb1, 0x81, 0xdd, 0xb4, 0x01, 0x45, 0x97, 0x95, 0x59, 0xbb, + 0xa8, 0xe4, 0x2c, 0x61, 0x0d, 0x0a, 0xd1, 0xa2, 0x94, 0x1d, 0xb6, 0x73, + 0x5e, 0x86, 0xcc, 0xf5, 0x61, 0x1d, 0x6c, 0x1d, 0x7c, 0x35, 0xf4, 0xbf, + 0x8e, 0xb5, 0x0a, 0x74, 0x78, 0x37, 0xe6, 0x99, 0x40, 0x5f, 0xce, 0x71, + 0x93, 0xcc, 0x74, 0x61, 0x2d, 0x86, 0x12, 0xca, 0xc7, 0x4b, 0x9d, 0x77, + 0x48, 0xe9, 0xce, 0x56, 0x7c, 0xef, 0x42, 0x9d, 0x6b, 0xb9, 0x0a, 0x6d, + 0xfc, 0xfe, 0xfb, 0xbe, 0x2d, 0xb4, 0xdc, 0x54, 0x7f, 0x02, 0xcf, 0xb8, + 0x6c, 0x30, 0xf9, 0x34, 0xf0, 0xfc, 0x2c, 0x9e, 0x9d, 0x78, 0xf6, 0x62, + 0xac, 0xd3, 0x58, 0x0f, 0xae, 0x05, 0xde, 0x67, 0xd9, 0x67, 0xa3, 0x3f, + 0x2e, 0xf9, 0xc6, 0xc1, 0xa7, 0xc3, 0x1f, 0x2b, 0x8e, 0x7a, 0x9b, 0x3f, + 0x96, 0x09, 0x99, 0xbf, 0x1a, 0xe7, 0x7a, 0xe4, 0x89, 0xfd, 0x37, 0xd4, + 0xf7, 0xc7, 0x19, 0x53, 0x36, 0x98, 0x71, 0x85, 0xf1, 0x17, 0xbb, 0xba, + 0xf0, 0xce, 0x31, 0x49, 0xc3, 0xef, 0x78, 0x3a, 0xe4, 0xcf, 0x7a, 0x4e, + 0xbe, 0x6c, 0x33, 0x36, 0xc2, 0x0e, 0x9d, 0x71, 0xd4, 0xb7, 0xcb, 0x1e, + 0xcc, 0xbd, 0x6c, 0xa7, 0x0f, 0xcf, 0xe8, 0xae, 0xab, 0x67, 0xa2, 0x46, + 0x55, 0xd2, 0xc0, 0x84, 0x51, 0xe8, 0x0c, 0x3e, 0x6f, 0xc7, 0xe4, 0xac, + 0xf2, 0x63, 0xce, 0xe9, 0x71, 0xe8, 0x25, 0x2a, 0x3d, 0x5d, 0xf4, 0xf5, + 0x4d, 0x5a, 0xfe, 0x04, 0xf4, 0x37, 0x66, 0xc8, 0xf9, 0x0c, 0x71, 0x21, + 0x23, 0x0b, 0xcb, 0xb8, 0x50, 0x01, 0x2e, 0x10, 0x13, 0x2a, 0xc0, 0x06, + 0xcf, 0x47, 0x1e, 0x91, 0x0d, 0xf0, 0x91, 0x24, 0xd7, 0x09, 0x3e, 0xf2, + 0x4d, 0xf8, 0x88, 0x01, 0x7d, 0xc3, 0x6f, 0x0c, 0xda, 0xd7, 0xe7, 0x81, + 0x8f, 0x98, 0x6f, 0xc2, 0x7f, 0x5f, 0x78, 0x46, 0xf2, 0x27, 0x10, 0x9b, + 0xcd, 0xbf, 0x56, 0x3a, 0x2b, 0x2d, 0xf0, 0x2f, 0xb0, 0xeb, 0x3f, 0x86, + 0xfe, 0x80, 0xc9, 0xca, 0x9e, 0x31, 0xb7, 0xcc, 0x5f, 0x81, 0x66, 0x4c, + 0x66, 0x9d, 0x36, 0xf0, 0xa7, 0x8c, 0xb7, 0xa2, 0xe3, 0x77, 0xe4, 0x35, + 0x19, 0xda, 0x3e, 0xda, 0x67, 0x83, 0xf5, 0x6e, 0x57, 0x63, 0x56, 0x87, + 0xda, 0xfc, 0xf9, 0x51, 0x0f, 0xf4, 0xa1, 0x24, 0x7c, 0x40, 0x93, 0xb2, + 0xf2, 0x83, 0x9c, 0xd2, 0x03, 0xec, 0x65, 0x2d, 0xf1, 0x21, 0x6f, 0x51, + 0x07, 0x86, 0x3c, 0xa4, 0xe8, 0x93, 0x2b, 0x58, 0xd1, 0xad, 0xa1, 0x0f, + 0xeb, 0xab, 0x25, 0xaf, 0xf0, 0xac, 0xdb, 0xf7, 0x93, 0x16, 0x1f, 0x47, + 0x1e, 0x97, 0x3f, 0x74, 0xc6, 0x60, 0xdf, 0x49, 0xf9, 0x92, 0xd3, 0x2d, + 0xfb, 0x61, 0xbb, 0x17, 0x3a, 0xc7, 0xc0, 0x37, 0x90, 0xf7, 0x7e, 0xf9, + 0x2a, 0xe3, 0xa7, 0x7a, 0x07, 0xe6, 0xea, 0x77, 0x83, 0x1f, 0x7d, 0x93, + 0x3e, 0x4a, 0xba, 0x88, 0x2f, 0xe3, 0xb7, 0xda, 0x3d, 0x9a, 0x16, 0x59, + 0xea, 0x4c, 0x63, 0xc6, 0x94, 0x2d, 0xea, 0xfb, 0x48, 0xda, 0x28, 0x0a, + 0xe7, 0x4c, 0x59, 0xf9, 0xde, 0xac, 0x0b, 0x3e, 0x9b, 0x75, 0x10, 0xf0, + 0x09, 0x7c, 0x7c, 0x44, 0x72, 0x0e, 0x9f, 0xc4, 0x5e, 0xc4, 0x5b, 0x1b, + 0xf1, 0xd6, 0x46, 0x9c, 0xb5, 0x11, 0x67, 0x6d, 0xc4, 0x59, 0x1b, 0xb1, + 0x17, 0x3e, 0xf5, 0x9a, 0x8d, 0x58, 0x6b, 0x23, 0xd6, 0xda, 0xcc, 0x11, + 0x2a, 0x88, 0xcf, 0x41, 0xde, 0x87, 0x75, 0x35, 0x99, 0xdb, 0xb1, 0x5d, + 0x82, 0xdc, 0xd0, 0x3d, 0x6f, 0x05, 0xdf, 0x63, 0x88, 0x35, 0x15, 0x6d, + 0xc4, 0x21, 0x16, 0xa4, 0x64, 0xc4, 0x19, 0x95, 0x3c, 0x62, 0xe4, 0x88, + 0xb5, 0x51, 0x98, 0xb5, 0xe9, 0x66, 0xa7, 0xcc, 0x98, 0x03, 0xb0, 0xbd, + 0x3b, 0x30, 0x4f, 0xd6, 0x89, 0x21, 0x9b, 0x30, 0x97, 0xaf, 0x6b, 0x85, + 0x59, 0x62, 0xc8, 0x75, 0x77, 0x17, 0x62, 0x66, 0xd5, 0x1e, 0x48, 0x3e, + 0x8f, 0x39, 0x96, 0x87, 0xab, 0xc8, 0x09, 0xe9, 0x43, 0x2d, 0x2a, 0xc6, + 0x4c, 0xc0, 0xce, 0x4b, 0x99, 0xe3, 0xda, 0xae, 0x85, 0x7b, 0xd4, 0x3a, + 0x55, 0x9d, 0xeb, 0xae, 0x0e, 0x1f, 0x2b, 0x49, 0x50, 0xff, 0xba, 0x96, + 0x9f, 0x65, 0x0e, 0x54, 0xd3, 0xf2, 0x0b, 0xe4, 0x13, 0x95, 0x49, 0x7b, + 0x4a, 0xdb, 0xb1, 0x30, 0x8d, 0x3a, 0x72, 0x4d, 0x5b, 0x2a, 0x13, 0xd6, + 0x29, 0xc8, 0x7f, 0x58, 0xdb, 0xb9, 0x10, 0x97, 0x22, 0x78, 0x56, 0x6d, + 0xe6, 0x09, 0xd7, 0x54, 0xbe, 0x92, 0x47, 0x3e, 0xf9, 0x04, 0x0c, 0x24, + 0x5f, 0x63, 0x0c, 0xa7, 0xad, 0xf2, 0x3b, 0xfc, 0x25, 0xeb, 0x1e, 0xcc, + 0x67, 0x4c, 0xc8, 0xcd, 0x31, 0x54, 0xdb, 0x19, 0xe8, 0x5f, 0x26, 0x4f, + 0x50, 0xb6, 0x93, 0xe4, 0x0d, 0x3f, 0x91, 0x84, 0x97, 0xcf, 0x35, 0x98, + 0xfb, 0x22, 0xc7, 0x6d, 0xd6, 0xd3, 0x3e, 0xd9, 0x65, 0x77, 0x62, 0x1c, + 0xc1, 0x1c, 0xae, 0x20, 0xd7, 0xe1, 0x5c, 0xab, 0xfd, 0xc8, 0x1f, 0xb5, + 0x92, 0x95, 0xb6, 0x44, 0x0a, 0x4a, 0x1f, 0x73, 0xa6, 0xe4, 0x4a, 0x96, + 0x41, 0x1b, 0x48, 0x95, 0xac, 0x0a, 0xa4, 0xf3, 0xe4, 0x29, 0xd4, 0xa2, + 0xf8, 0xc6, 0xba, 0xc0, 0xc6, 0x03, 0x19, 0xa3, 0xf0, 0xf7, 0x40, 0xf6, + 0xa0, 0xed, 0xd0, 0x5a, 0x62, 0xc4, 0x8c, 0xf3, 0x29, 0xf0, 0x20, 0xdf, + 0xff, 0x8d, 0x47, 0x0c, 0xf8, 0x4a, 0x3e, 0x31, 0x39, 0x65, 0x93, 0x9e, + 0x71, 0x27, 0x26, 0x6d, 0x88, 0x67, 0xab, 0xb3, 0xa2, 0x7d, 0x72, 0x73, + 0xda, 0x98, 0x8b, 0x44, 0xe4, 0x48, 0x42, 0xee, 0x8c, 0x12, 0xf0, 0xd6, + 0x79, 0xf9, 0x78, 0x1e, 0x79, 0xe8, 0x24, 0xf0, 0x71, 0x62, 0x30, 0x6d, + 0xcc, 0x78, 0x39, 0xbb, 0xf1, 0x69, 0x95, 0x87, 0xff, 0xcc, 0x2d, 0x26, + 0xb6, 0x20, 0xb7, 0x94, 0x58, 0x34, 0x1b, 0xdd, 0x3a, 0x59, 0xdb, 0x27, + 0xcc, 0x4d, 0x26, 0x06, 0x57, 0x43, 0xd7, 0xbd, 0xc3, 0xbb, 0x54, 0xde, + 0x1e, 0xdb, 0x5a, 0x36, 0x3d, 0xb9, 0x0a, 0x58, 0xe3, 0x09, 0xac, 0xf7, + 0xae, 0x06, 0xe3, 0x67, 0x74, 0x6b, 0x2f, 0xe2, 0xe7, 0x21, 0xd8, 0x67, + 0x2b, 0xd6, 0x61, 0x49, 0xe5, 0xa7, 0x06, 0x6c, 0x8f, 0x58, 0x32, 0x0c, + 0xde, 0xdf, 0x87, 0xde, 0xfa, 0x19, 0x77, 0x90, 0x0f, 0x26, 0x11, 0x83, + 0x06, 0x91, 0x23, 0x9a, 0x88, 0x1f, 0xdd, 0xc8, 0x17, 0x13, 0xc8, 0x0d, + 0x99, 0x8b, 0xa6, 0xa7, 0x19, 0xcb, 0xbb, 0x40, 0xff, 0x0f, 0x5b, 0x98, + 0xdb, 0xb8, 0xee, 0xb8, 0x99, 0xae, 0x03, 0x2f, 0xb8, 0x3e, 0xb0, 0x05, + 0xae, 0x2b, 0xf2, 0x36, 0xab, 0x4d, 0xad, 0xfd, 0x23, 0x66, 0x8a, 0xb9, + 0x11, 0xd6, 0x55, 0xc5, 0x94, 0x4a, 0xd5, 0x0a, 0xd6, 0xd6, 0x44, 0xdc, + 0xfa, 0x47, 0xe6, 0x14, 0x06, 0xf6, 0x0a, 0x68, 0x27, 0x76, 0x34, 0xd1, + 0x1a, 0x9e, 0x5d, 0x44, 0x60, 0x17, 0xe5, 0x0c, 0x69, 0xa5, 0x92, 0xcf, + 0xd0, 0x36, 0xb0, 0xbe, 0xce, 0x67, 0xd7, 0x7a, 0xf9, 0x19, 0xe8, 0x54, + 0x6c, 0xff, 0x38, 0x72, 0x9c, 0x6e, 0x8c, 0xaf, 0x62, 0x22, 0x6d, 0x04, + 0xb8, 0x0b, 0xdd, 0x39, 0xca, 0x66, 0x72, 0x05, 0xf0, 0xd9, 0x69, 0x11, + 0x93, 0x23, 0xfe, 0x9e, 0xe5, 0xa7, 0x18, 0x37, 0x25, 0x80, 0xfe, 0x5c, + 0x5e, 0xc5, 0x3b, 0xc6, 0x2f, 0x83, 0x75, 0xc8, 0x2f, 0x46, 0xd5, 0x4a, + 0xa8, 0x7d, 0xd0, 0xc3, 0xdb, 0x91, 0xc3, 0x59, 0x6b, 0x38, 0x86, 0xe1, + 0xc9, 0x15, 0xf7, 0xdb, 0x25, 0x0e, 0xb9, 0x3a, 0x98, 0xf3, 0x4d, 0xc0, + 0x3f, 0xf3, 0x99, 0x01, 0xe8, 0x79, 0x55, 0xf0, 0x0d, 0xba, 0x1c, 0x6c, + 0xca, 0x27, 0x07, 0x91, 0x4f, 0xb6, 0xa8, 0xf6, 0x96, 0x6c, 0x46, 0xe6, + 0x6b, 0x39, 0xa9, 0x8f, 0x73, 0x1c, 0xe4, 0x1c, 0xf6, 0x6f, 0xab, 0xb8, + 0x3b, 0x69, 0x73, 0xae, 0x90, 0xc5, 0xba, 0xc7, 0xaf, 0x6b, 0x9f, 0xf0, + 0xc6, 0x13, 0x23, 0x82, 0x3e, 0xc8, 0xf1, 0x29, 0x97, 0x7e, 0xd6, 0x1a, + 0xf2, 0xb0, 0x3d, 0xeb, 0xba, 0x7b, 0x87, 0x74, 0xd9, 0xb9, 0xfd, 0x46, + 0x4c, 0xc8, 0x29, 0x4c, 0xf0, 0xf0, 0xa0, 0x00, 0x3c, 0x28, 0x22, 0xaf, + 0x9b, 0x70, 0x3c, 0x3c, 0x28, 0x49, 0xd7, 0xff, 0x88, 0x07, 0x05, 0x85, + 0x07, 0x1c, 0x3f, 0xe6, 0xeb, 0x3d, 0x46, 0x7c, 0xc0, 0x9c, 0xa2, 0xbe, + 0x7f, 0x1e, 0xd7, 0x0a, 0x0b, 0xf7, 0x1a, 0x2a, 0x46, 0x66, 0xae, 0xfb, + 0x31, 0xf7, 0x3e, 0xc3, 0xc3, 0x03, 0xf2, 0x24, 0x26, 0x10, 0x3b, 0xdc, + 0x33, 0xc0, 0x0a, 0x95, 0x07, 0xaf, 0xe0, 0x03, 0xb1, 0x81, 0x58, 0x70, + 0x12, 0x3c, 0xfe, 0x09, 0x7d, 0x88, 0x13, 0x9a, 0xbf, 0xce, 0x6b, 0xe8, + 0x87, 0xd0, 0x2d, 0x75, 0xf6, 0x2e, 0x74, 0x16, 0xd7, 0x76, 0x9c, 0xa8, + 0xa8, 0x98, 0x91, 0x37, 0x89, 0x7b, 0xd4, 0xdf, 0xbb, 0xd0, 0xdf, 0x45, + 0xf4, 0x8b, 0xc0, 0x66, 0xd9, 0xe7, 0x81, 0x20, 0x1f, 0x45, 0x1f, 0x0b, + 0x7d, 0xda, 0x7d, 0x99, 0x29, 0x3f, 0xe3, 0xa0, 0xac, 0x8d, 0xa8, 0x75, + 0xc1, 0xbe, 0x28, 0x1b, 0xcc, 0x81, 0xba, 0xa2, 0xce, 0xc8, 0x87, 0xfc, + 0x3b, 0x90, 0xf3, 0x8a, 0xa6, 0xd6, 0x16, 0xf4, 0xbe, 0xae, 0xf5, 0x48, + 0x76, 0x95, 0x14, 0x0c, 0x62, 0x98, 0x69, 0x8c, 0xc3, 0x77, 0x1e, 0x45, + 0xdf, 0xfc, 0x34, 0x31, 0xeb, 0x04, 0xfa, 0x2d, 0xa5, 0x75, 0xff, 0x14, + 0xe0, 0x90, 0xcd, 0xb5, 0xfc, 0x3e, 0xd6, 0x52, 0xef, 0x6a, 0x45, 0x5a, + 0x3c, 0x06, 0xfb, 0x99, 0x19, 0x86, 0xcc, 0x83, 0xed, 0x12, 0xb9, 0x8b, + 0xba, 0x01, 0xf6, 0x26, 0x96, 0xb0, 0xf1, 0xbb, 0xe6, 0xea, 0x5b, 0xd0, + 0x7f, 0x10, 0x31, 0x65, 0xdc, 0xcb, 0x37, 0x3d, 0x3a, 0xd2, 0x30, 0x0e, + 0xe5, 0x3b, 0x5b, 0x85, 0xbc, 0xf9, 0x6d, 0x20, 0x69, 0x28, 0x1c, 0x06, + 0x26, 0x8e, 0xb1, 0x2f, 0xdb, 0x28, 0x73, 0x02, 0xb6, 0xfe, 0x4b, 0x77, + 0xe7, 0x10, 0xdb, 0x82, 0x39, 0x70, 0x3e, 0xca, 0x76, 0x63, 0xeb, 0xb2, + 0xa6, 0x6c, 0x9d, 0xa2, 0x0d, 0xdf, 0xa7, 0x72, 0x80, 0x9e, 0xa1, 0x74, + 0x25, 0x85, 0xbd, 0x5f, 0x1d, 0x3a, 0xf9, 0xdd, 0x21, 0xce, 0xb1, 0xd3, + 0xcf, 0x0d, 0x9a, 0xe7, 0xd9, 0xee, 0xcf, 0x33, 0x6d, 0xe5, 0x74, 0xf2, + 0x5c, 0x99, 0xef, 0xc8, 0xf4, 0x2f, 0xdd, 0x87, 0x87, 0x80, 0xe9, 0x26, + 0xc7, 0x5d, 0xc2, 0x1e, 0x47, 0xe1, 0x7f, 0xa5, 0x47, 0xd7, 0x54, 0xfe, + 0x84, 0x34, 0x5b, 0x74, 0x7c, 0xcf, 0x0f, 0x31, 0x67, 0xd1, 0x61, 0xd7, + 0xec, 0xff, 0x6f, 0x9c, 0x03, 0x78, 0x79, 0x7e, 0xab, 0x0f, 0xf1, 0x9d, + 0xf2, 0x93, 0x07, 0xbf, 0x7b, 0x3c, 0xf5, 0x21, 0x6f, 0x6f, 0x81, 0xb5, + 0x8a, 0x31, 0x16, 0xe4, 0x0c, 0x7e, 0x23, 0x2d, 0xe9, 0x44, 0x8b, 0x9a, + 0xd8, 0x8b, 0x74, 0x01, 0x73, 0xec, 0xe6, 0x73, 0x10, 0x49, 0xa9, 0x3d, + 0xfa, 0x1c, 0x6d, 0x8a, 0x67, 0x20, 0x86, 0x14, 0xe7, 0x02, 0xec, 0xff, + 0x31, 0xc6, 0x25, 0x3d, 0xf9, 0xf2, 0x19, 0xf8, 0x45, 0x30, 0x36, 0x57, + 0x8b, 0xed, 0xc0, 0x34, 0xe4, 0x6c, 0x6f, 0x00, 0x27, 0x5f, 0xb7, 0x81, + 0x65, 0xc8, 0x4b, 0x5e, 0xb3, 0x81, 0x67, 0x6a, 0x7f, 0xcc, 0xfd, 0x39, + 0x71, 0xd0, 0x02, 0x0e, 0xbe, 0xe3, 0xef, 0xb7, 0xdb, 0x8b, 0x51, 0xd8, + 0xd6, 0x19, 0xe0, 0xdf, 0x77, 0x1c, 0xe2, 0x21, 0x31, 0x90, 0x98, 0x48, + 0x1c, 0x4c, 0xaa, 0xdc, 0xfc, 0x55, 0x47, 0xc6, 0xaa, 0xb5, 0x83, 0xf0, + 0x05, 0xa9, 0x6c, 0x52, 0xfb, 0xda, 0xf6, 0x61, 0xe0, 0xd8, 0x58, 0xb5, + 0x41, 0x7f, 0x80, 0xeb, 0x65, 0x91, 0x6f, 0x3b, 0xb1, 0x98, 0x3e, 0x15, + 0xab, 0xfc, 0x46, 0x96, 0x76, 0x9c, 0x92, 0x54, 0xe3, 0x0a, 0xb0, 0x11, + 0xf9, 0x9a, 0xb2, 0x81, 0xcf, 0x74, 0x4b, 0x1c, 0x7b, 0x64, 0xc7, 0x75, + 0xa3, 0x59, 0x89, 0xea, 0xd9, 0xd6, 0xd8, 0x44, 0xa6, 0x1d, 0xfe, 0x35, + 0xba, 0x51, 0x7f, 0x79, 0xf7, 0xc6, 0xc8, 0xcb, 0x5d, 0xc5, 0x96, 0x6c, + 0x65, 0xa3, 0x3e, 0x85, 0x58, 0x52, 0x13, 0x1d, 0xb1, 0x31, 0xb9, 0x47, + 0x50, 0x7f, 0xf9, 0x91, 0x47, 0xf4, 0xac, 0xc2, 0xb1, 0x67, 0xe7, 0x80, + 0x87, 0x33, 0xb5, 0x74, 0x6a, 0x4c, 0x9e, 0x95, 0x6a, 0xed, 0x69, 0x99, + 0xa8, 0x25, 0xc1, 0x2f, 0x01, 0x9f, 0x97, 0x8a, 0x9e, 0x45, 0x5c, 0xc8, + 0x20, 0xea, 0xd5, 0xd2, 0xc3, 0x39, 0xec, 0x45, 0x27, 0x9c, 0xb4, 0x55, + 0x84, 0x36, 0xde, 0xaf, 0xd1, 0x76, 0xaf, 0xc1, 0x76, 0x19, 0x3f, 0xae, + 0xca, 0x64, 0xad, 0xd7, 0x6a, 0xd5, 0xa8, 0x83, 0x74, 0xff, 0x49, 0x19, + 0xb0, 0x4e, 0xc2, 0xee, 0x90, 0xb7, 0xa6, 0x0e, 0x09, 0x65, 0xbe, 0x26, + 0x9b, 0x55, 0xdc, 0xb8, 0x2a, 0x66, 0x43, 0xe4, 0x51, 0xe4, 0x4e, 0x67, + 0x87, 0x7e, 0xe2, 0xaa, 0xb8, 0xa7, 0x89, 0x5c, 0xbe, 0x05, 0xaf, 0x77, + 0x14, 0x1f, 0xf2, 0x6b, 0xe6, 0xa5, 0xc9, 0xf7, 0x86, 0x02, 0x7e, 0x29, + 0x39, 0xec, 0x04, 0x3c, 0xff, 0x40, 0xbb, 0x80, 0xc8, 0x76, 0x76, 0xa8, + 0x1f, 0x7b, 0x68, 0x62, 0x98, 0x97, 0xd3, 0x14, 0xd4, 0x9e, 0x5a, 0xb4, + 0x11, 0x9b, 0x58, 0x46, 0xbc, 0x87, 0x3d, 0x3a, 0x8c, 0x2b, 0x3c, 0x03, + 0x89, 0x31, 0x06, 0xc0, 0xf7, 0x97, 0xbc, 0x33, 0x29, 0x43, 0x61, 0x23, + 0xea, 0xe7, 0x9a, 0x30, 0xf7, 0x1c, 0x30, 0x03, 0xc0, 0xa7, 0xf6, 0x0f, + 0x86, 0x8f, 0x35, 0xdb, 0x34, 0x62, 0xd9, 0x84, 0xa2, 0x4d, 0x81, 0x96, + 0x71, 0x72, 0x58, 0xca, 0x35, 0xc6, 0xb3, 0xa0, 0x5f, 0x0a, 0xfd, 0x24, + 0xb6, 0x01, 0xed, 0xbf, 0xd8, 0xc2, 0xbd, 0xbc, 0xeb, 0x7e, 0x65, 0x25, + 0xb6, 0x21, 0xa6, 0x51, 0x86, 0xdb, 0x89, 0x6b, 0x47, 0xd7, 0xfd, 0xff, + 0xc4, 0xb5, 0xf9, 0x75, 0x61, 0x5c, 0xfb, 0xb0, 0x71, 0xed, 0xca, 0xba, + 0x1b, 0xe3, 0xda, 0x07, 0xeb, 0x3e, 0x7c, 0x5c, 0xb3, 0x3b, 0xff, 0x5b, + 0x5c, 0x1b, 0xbb, 0x9d, 0xb8, 0xf6, 0xcd, 0xce, 0x5f, 0x4f, 0x5c, 0x23, + 0x9f, 0xdb, 0x8f, 0x6b, 0x8f, 0x2d, 0xc7, 0xb5, 0xcf, 0x74, 0x7e, 0x24, + 0x71, 0x6d, 0x8c, 0x71, 0x8d, 0xbc, 0x3f, 0x4c, 0x5c, 0xe3, 0x1c, 0x3e, + 0x9a, 0xb8, 0xf6, 0xd8, 0xff, 0x39, 0xae, 0x9d, 0xe8, 0xfc, 0xf5, 0xc4, + 0xb5, 0xbb, 0x10, 0xd7, 0x24, 0x47, 0x5b, 0xbe, 0xbd, 0xb8, 0xf6, 0x3a, + 0xb1, 0x2b, 0x47, 0x9c, 0x82, 0x1d, 0xe5, 0x56, 0xfc, 0xa2, 0x39, 0xae, + 0x05, 0x34, 0xca, 0x36, 0xe1, 0x07, 0x31, 0xdf, 0x7e, 0xdc, 0xe7, 0x97, + 0xeb, 0x89, 0xa2, 0x6f, 0x8f, 0x2d, 0xfe, 0xb7, 0x2d, 0x1d, 0x5e, 0xdf, + 0x45, 0x1f, 0x1b, 0xaf, 0x76, 0x7a, 0xf5, 0x56, 0x75, 0x4e, 0x0b, 0x5a, + 0xe0, 0x6e, 0xaa, 0xa8, 0x67, 0x13, 0x52, 0x68, 0x28, 0x93, 0x40, 0xdb, + 0x30, 0xf7, 0x5a, 0x3c, 0xc3, 0x02, 0x4e, 0x7f, 0xe1, 0x3a, 0xe8, 0x10, + 0x5b, 0x72, 0x98, 0x03, 0xb6, 0xe3, 0xc4, 0x51, 0x67, 0x94, 0x58, 0xbd, + 0xcf, 0x3b, 0xff, 0xfc, 0x4d, 0xd9, 0xa3, 0xc6, 0x19, 0x30, 0x26, 0xc8, + 0x33, 0x21, 0xe0, 0x85, 0x79, 0xc2, 0xfe, 0x4a, 0x8a, 0xff, 0x07, 0xfe, + 0xb8, 0x7d, 0xfe, 0xf9, 0xec, 0x07, 0xfe, 0x1c, 0x46, 0xc1, 0x2f, 0xca, + 0xfd, 0x36, 0x2c, 0x9a, 0xbe, 0xbb, 0x06, 0xd8, 0x80, 0x3d, 0x6e, 0x5f, + 0x0e, 0xbc, 0x03, 0x7d, 0x75, 0xab, 0xb3, 0xde, 0x89, 0xc6, 0x1a, 0xa9, + 0xd6, 0x03, 0x3d, 0x05, 0xfd, 0x97, 0x75, 0x8a, 0x42, 0x5e, 0xe4, 0x03, + 0x5f, 0xf7, 0x75, 0x5b, 0xad, 0xb3, 0x0d, 0xb8, 0x34, 0x37, 0x82, 0xa7, + 0x29, 0xd5, 0xc6, 0xcd, 0xfd, 0xbb, 0xfd, 0xf3, 0xde, 0xa0, 0xfe, 0x44, + 0xb7, 0x57, 0xe7, 0xfb, 0xd3, 0xfe, 0xfc, 0x7b, 0x88, 0xe9, 0x98, 0x3b, + 0x6c, 0xd2, 0xbe, 0xcf, 0x3b, 0x27, 0x50, 0xe7, 0x2c, 0xa3, 0xd8, 0xef, + 0xb3, 0x6d, 0x69, 0x55, 0xde, 0x0a, 0xf4, 0xbc, 0x1b, 0x6d, 0x58, 0x38, + 0x27, 0xb8, 0x37, 0x18, 0xc7, 0x7b, 0xce, 0xa7, 0x93, 0x61, 0x0f, 0x97, + 0x83, 0x73, 0x82, 0x60, 0xff, 0x2a, 0xd3, 0x7a, 0x96, 0x38, 0xb4, 0x19, + 0x31, 0x93, 0xfb, 0x7a, 0xe8, 0x76, 0x79, 0x4e, 0xcb, 0x34, 0x95, 0x15, + 0x1a, 0xb6, 0x91, 0xee, 0x02, 0x72, 0x16, 0xe6, 0x24, 0xdd, 0xc8, 0x57, + 0x82, 0x3d, 0x5a, 0x4e, 0x1b, 0xb3, 0x47, 0xb5, 0x87, 0x6c, 0xd2, 0xeb, + 0xc7, 0xd7, 0x89, 0x99, 0xea, 0xd1, 0x5d, 0x29, 0x0c, 0xf1, 0x5c, 0xeb, + 0x08, 0x74, 0xbf, 0x56, 0x4a, 0xfd, 0xf4, 0x9f, 0xbb, 0xf1, 0x6c, 0x45, + 0xdb, 0x6f, 0xa1, 0x0d, 0x6b, 0xd4, 0x4f, 0x3b, 0x5e, 0x8d, 0xfa, 0x26, + 0x60, 0x2c, 0x65, 0xdb, 0xec, 0xaf, 0xd3, 0xdf, 0xad, 0xf7, 0xd6, 0xed, + 0x8f, 0x50, 0x5f, 0x83, 0xf6, 0xdf, 0xc3, 0xd3, 0x75, 0x7b, 0x86, 0x82, + 0x76, 0xda, 0xde, 0x30, 0xda, 0xb7, 0x81, 0x47, 0x05, 0xef, 0x9f, 0xc0, + 0xfb, 0x9f, 0xdc, 0xd4, 0xf7, 0x19, 0xd4, 0x2b, 0x68, 0xcf, 0xdf, 0xd4, + 0x1e, 0xac, 0x1d, 0xc7, 0xab, 0x68, 0x63, 0xce, 0x24, 0xf0, 0xfe, 0xb0, + 0xf6, 0xf0, 0xc2, 0x11, 0xff, 0x9c, 0x81, 0x18, 0x3c, 0xad, 0x3d, 0xb4, + 0xc0, 0xb5, 0xfb, 0x1b, 0xf4, 0x99, 0xc3, 0x7a, 0xb4, 0xa9, 0x1d, 0xb1, + 0xae, 0xe2, 0xd0, 0xd5, 0xfd, 0x3d, 0x75, 0x75, 0x36, 0x7c, 0xc0, 0x6a, + 0x90, 0x46, 0xe5, 0x19, 0xfb, 0x7b, 0x1a, 0x3f, 0x00, 0x2d, 0x74, 0x62, + 0x37, 0xdf, 0xa7, 0x7d, 0xfb, 0xa6, 0x31, 0x95, 0x4a, 0x31, 0x26, 0x31, + 0xf7, 0xea, 0xfe, 0xfc, 0x34, 0x73, 0x72, 0x9e, 0x05, 0x31, 0x37, 0x90, + 0x03, 0xe5, 0xda, 0xa4, 0x56, 0x50, 0xb2, 0x04, 0xdf, 0xf9, 0x8d, 0xfa, + 0xbf, 0x95, 0x6c, 0x94, 0xab, 0x99, 0x8f, 0x87, 0xff, 0x11, 0xc8, 0x52, + 0xae, 0x9d, 0x02, 0x1f, 0x75, 0x5f, 0xa7, 0xe4, 0x4d, 0xd5, 0x6f, 0x25, + 0x1b, 0x79, 0x71, 0xac, 0x80, 0xdf, 0x37, 0x10, 0x4f, 0xfe, 0x96, 0xf2, + 0x82, 0xcf, 0xc7, 0xfc, 0x7c, 0xa0, 0x45, 0x9d, 0xe1, 0xab, 0xf3, 0x55, + 0x55, 0x0f, 0xce, 0xa5, 0x5a, 0x6e, 0x3a, 0x97, 0x6a, 0xf1, 0xcf, 0xab, + 0x49, 0xab, 0xfb, 0xb4, 0xea, 0xbe, 0x12, 0x6d, 0x29, 0xff, 0xee, 0x28, + 0xa6, 0xe2, 0xef, 0x8a, 0x2e, 0x5a, 0x7c, 0xfd, 0x53, 0x8e, 0xc0, 0x3f, + 0x9a, 0xe5, 0x63, 0x1c, 0x9e, 0xc4, 0xf7, 0x60, 0x6d, 0x82, 0xb9, 0xcf, + 0xa1, 0x9d, 0xf2, 0xf2, 0xcc, 0x27, 0x90, 0xf7, 0x76, 0xd7, 0x94, 0x7d, + 0x4f, 0xe1, 0x2f, 0x18, 0x2f, 0xd0, 0x0b, 0x65, 0xe5, 0xb3, 0x39, 0x4f, + 0xf7, 0xec, 0x3d, 0xb8, 0x13, 0xf3, 0xee, 0xc3, 0xbc, 0xf5, 0xcb, 0xc1, + 0xe6, 0xcf, 0xf0, 0xcc, 0x54, 0x82, 0xbb, 0x2e, 0xd7, 0x9d, 0xb4, 0x18, + 0x67, 0xb9, 0x5e, 0xab, 0x60, 0x2b, 0xa4, 0xd3, 0x90, 0xf3, 0xe8, 0xdc, + 0x73, 0xa5, 0xa2, 0x92, 0x4e, 0xee, 0x95, 0x1f, 0x61, 0xac, 0x5c, 0x7f, + 0x8b, 0x7f, 0x47, 0x57, 0x04, 0x5e, 0x2d, 0xc1, 0xa6, 0x79, 0x0f, 0x38, + 0x53, 0x8b, 0xca, 0x3c, 0x73, 0x87, 0xc6, 0x4f, 0xd6, 0x33, 0x17, 0x98, + 0x5c, 0xf6, 0xd1, 0x18, 0xe2, 0x8f, 0xeb, 0xce, 0xe2, 0xdb, 0xa1, 0x86, + 0x1f, 0x34, 0x11, 0xbb, 0x74, 0xc4, 0xf4, 0xb2, 0xf9, 0x9f, 0x6e, 0x29, + 0xd1, 0x4c, 0x7b, 0xab, 0x3b, 0xbf, 0xe0, 0xfc, 0x30, 0xd5, 0x74, 0x7e, + 0x98, 0x6e, 0xba, 0xab, 0xfb, 0x56, 0xbb, 0x2f, 0xbf, 0x20, 0xd7, 0x94, + 0xe0, 0x4e, 0x78, 0x57, 0x5f, 0xb3, 0xbd, 0xf6, 0x2b, 0xec, 0x2d, 0xab, + 0xfb, 0x55, 0xea, 0x37, 0x2a, 0x17, 0x1a, 0x31, 0xb9, 0x34, 0xd7, 0x26, + 0x17, 0xeb, 0x1e, 0xde, 0x5d, 0x54, 0xf8, 0x68, 0xc8, 0x8f, 0xe7, 0x4c, + 0x7c, 0xeb, 0xc7, 0x5f, 0xa7, 0x5c, 0x9e, 0x0b, 0xee, 0x8c, 0x03, 0xfd, + 0xdd, 0x0f, 0x59, 0x3a, 0x7d, 0x5b, 0xe8, 0x40, 0xdc, 0xe4, 0x1d, 0xa6, + 0x77, 0xb7, 0x53, 0x25, 0x08, 0x46, 0xa9, 0x53, 0xde, 0xe1, 0x04, 0xf7, + 0x1b, 0xbd, 0xc6, 0x59, 0xc4, 0xd1, 0x07, 0xa2, 0x9d, 0xc8, 0x57, 0x78, + 0x9e, 0xea, 0xe5, 0xd6, 0x67, 0xec, 0x00, 0xc3, 0x92, 0xfe, 0xfe, 0x69, + 0x10, 0x18, 0x94, 0x3e, 0x5c, 0x17, 0x0b, 0x98, 0x64, 0xc8, 0x7c, 0x5f, + 0x7a, 0xba, 0x22, 0xbc, 0x6f, 0xc8, 0x60, 0xcc, 0x7e, 0xe8, 0x82, 0x77, + 0x0e, 0x86, 0xd4, 0x1d, 0xe6, 0x34, 0xbc, 0x5f, 0x8a, 0x49, 0xcf, 0xd4, + 0xa4, 0x94, 0x1c, 0x28, 0x21, 0x9e, 0x93, 0xa2, 0x33, 0x8c, 0xf1, 0x8e, + 0x4a, 0x8b, 0xf9, 0xcf, 0x09, 0x9e, 0x59, 0xb7, 0x9a, 0xc1, 0xdd, 0xc5, + 0x5a, 0x75, 0x4f, 0xb3, 0x7c, 0x3f, 0xa1, 0xce, 0xf9, 0x83, 0xbb, 0x89, + 0x98, 0x7f, 0x37, 0xf1, 0x54, 0xc2, 0xf3, 0xef, 0x22, 0xf8, 0xb0, 0xdf, + 0x2f, 0x82, 0xb3, 0x0a, 0xff, 0xac, 0x3a, 0xe6, 0xfb, 0x03, 0x73, 0x2e, + 0x9e, 0xc5, 0x65, 0xd0, 0x76, 0xb7, 0x94, 0x8f, 0x4d, 0xca, 0x1e, 0x7b, + 0xf9, 0x0e, 0x33, 0xf9, 0x94, 0x54, 0x92, 0x11, 0xec, 0x63, 0x78, 0xcf, + 0x37, 0x87, 0x5c, 0xce, 0xb3, 0x1f, 0xde, 0xc1, 0x40, 0x4e, 0x75, 0xef, + 0xd2, 0x6b, 0xec, 0x40, 0x5e, 0x53, 0x82, 0x3e, 0x8a, 0xca, 0x87, 0xd8, + 0x5e, 0xc5, 0xd8, 0xbd, 0x95, 0x1d, 0xa0, 0x2b, 0x21, 0x5f, 0x1f, 0xc3, + 0x3e, 0x6f, 0x16, 0x31, 0xad, 0xa4, 0xf2, 0x81, 0x0a, 0x50, 0xb6, 0x1b, + 0xb2, 0x1f, 0x01, 0xcd, 0x80, 0xa1, 0xeb, 0x49, 0x5d, 0xbf, 0x8b, 0x79, + 0x12, 0x9e, 0xe6, 0x31, 0xf6, 0x33, 0x5a, 0xe0, 0xbb, 0x65, 0x2b, 0xc2, + 0x33, 0x3c, 0xf0, 0x26, 0x2d, 0x9f, 0xe9, 0x4a, 0x4e, 0x2a, 0xc8, 0xab, + 0x18, 0x2f, 0x2a, 0x62, 0x98, 0x9e, 0xbf, 0xe7, 0x54, 0xce, 0xd2, 0x0e, + 0x9d, 0xa9, 0xf3, 0xf7, 0x94, 0x21, 0x07, 0x85, 0x79, 0x52, 0x09, 0xb9, + 0x6a, 0xcf, 0x14, 0x73, 0x4c, 0xde, 0x49, 0x64, 0x65, 0xdf, 0xc2, 0x18, + 0xe4, 0x8a, 0x4b, 0xef, 0x0b, 0x3c, 0x07, 0x7c, 0x1c, 0x6d, 0xac, 0xf3, + 0xfe, 0xe8, 0x49, 0xbc, 0x93, 0x36, 0x89, 0x27, 0xf5, 0xdf, 0x8d, 0x27, + 0x75, 0x4b, 0xfd, 0x60, 0xed, 0xc7, 0x53, 0x32, 0x73, 0x6c, 0xbb, 0x14, + 0x67, 0xb7, 0x83, 0xff, 0xbf, 0x42, 0x87, 0xdb, 0x7c, 0xfd, 0x05, 0xba, + 0x3c, 0x9d, 0xe0, 0x19, 0x68, 0xcf, 0x14, 0xdb, 0xf9, 0xdc, 0x8d, 0xfe, + 0x26, 0x78, 0xab, 0xfb, 0x0f, 0xd0, 0xc0, 0x6e, 0x9c, 0xe6, 0x7b, 0xea, + 0x4e, 0xc6, 0x73, 0xee, 0x95, 0xf9, 0x7b, 0x89, 0xad, 0xf9, 0x1a, 0xf2, + 0x79, 0x75, 0x87, 0xd6, 0x2f, 0x1e, 0x66, 0xb2, 0x2d, 0x26, 0xe6, 0x14, + 0xf2, 0x4c, 0xee, 0x01, 0xf5, 0x83, 0xcb, 0x77, 0x5d, 0x05, 0x79, 0x57, + 0x46, 0x60, 0xdf, 0xbd, 0x53, 0xfd, 0xc8, 0xc9, 0x7f, 0x88, 0xbc, 0x64, + 0x83, 0xaf, 0x83, 0x61, 0xdf, 0x2e, 0xdb, 0x9a, 0xec, 0x11, 0x36, 0x66, + 0xc3, 0xee, 0x6c, 0xd8, 0x20, 0xf6, 0xfc, 0xaf, 0x2c, 0xdb, 0xe6, 0x70, + 0x13, 0x6e, 0x74, 0xc8, 0xf7, 0xa6, 0xd3, 0xfd, 0x4b, 0xb0, 0xdd, 0xcb, + 0x98, 0xeb, 0x92, 0xd1, 0x22, 0x17, 0x81, 0x85, 0xb3, 0x35, 0xde, 0x55, + 0xf1, 0xde, 0x98, 0xf5, 0x0d, 0xb0, 0x91, 0x00, 0x53, 0xd6, 0x77, 0x78, + 0x3e, 0xc9, 0x7b, 0xd0, 0x4e, 0xb9, 0x84, 0x75, 0x5d, 0x32, 0xf8, 0x2d, + 0xe8, 0xd3, 0x21, 0xc1, 0xdd, 0xb4, 0x67, 0xb7, 0x94, 0x85, 0x76, 0xbb, + 0xfa, 0x0e, 0xde, 0x57, 0x9d, 0xb1, 0x79, 0x5f, 0xcb, 0xfd, 0x19, 0xdf, + 0xef, 0x4f, 0x78, 0xbc, 0x9a, 0x7d, 0xe6, 0x2a, 0xe4, 0xaa, 0x68, 0xf9, + 0x3e, 0xe0, 0x8e, 0xe3, 0xca, 0x11, 0xeb, 0x46, 0x5f, 0xdf, 0x69, 0x07, + 0xfa, 0xa1, 0xfe, 0xc6, 0xe5, 0x10, 0xf6, 0x42, 0x67, 0x55, 0x3e, 0x6d, + 0x36, 0xe9, 0x4e, 0xe4, 0x2f, 0x6c, 0xe1, 0xf9, 0x32, 0xbe, 0x29, 0xdd, + 0x25, 0xf3, 0x91, 0x36, 0xee, 0xa7, 0x61, 0xa3, 0x7f, 0x2f, 0x7b, 0xb0, + 0x87, 0x5e, 0xc0, 0xf7, 0x79, 0x9b, 0xf8, 0xd0, 0x8f, 0xbd, 0xd3, 0x1a, + 0x99, 0xa9, 0x0b, 0xec, 0x53, 0x8a, 0xf9, 0x6d, 0xc4, 0xca, 0x98, 0x5c, + 0x54, 0xb9, 0x27, 0x32, 0xc4, 0xc5, 0xa8, 0x44, 0x17, 0x4d, 0x29, 0x42, + 0xe7, 0xea, 0x4e, 0x62, 0x39, 0x87, 0xc1, 0x5e, 0xa4, 0x86, 0xbe, 0xca, + 0x2e, 0xf1, 0xde, 0x28, 0x4b, 0x69, 0x9a, 0x63, 0xe1, 0x59, 0x4f, 0xa9, + 0x6f, 0xcf, 0xd9, 0x3b, 0xa5, 0xb2, 0xa0, 0x03, 0xdb, 0x50, 0x6f, 0xfc, + 0x48, 0xea, 0x73, 0x65, 0x99, 0x99, 0x3e, 0xe3, 0xfb, 0x20, 0xf9, 0xa0, + 0x5e, 0x6f, 0xce, 0x81, 0xc7, 0x99, 0x33, 0x4b, 0xa9, 0x61, 0xaa, 0xfc, + 0xaf, 0xd4, 0x98, 0x28, 0xde, 0x98, 0x13, 0x07, 0xbf, 0x63, 0xa1, 0x1c, + 0xa3, 0x72, 0xd8, 0xce, 0x48, 0xf5, 0x58, 0xbf, 0xda, 0xc3, 0xaf, 0xca, + 0x26, 0x9e, 0x79, 0xcf, 0xec, 0x35, 0x46, 0x55, 0xbe, 0x78, 0x4d, 0x3e, + 0x6d, 0x1d, 0x96, 0xbd, 0xe6, 0x6e, 0xec, 0x61, 0x22, 0xf2, 0x3b, 0xd8, + 0x2f, 0xa5, 0xd6, 0x71, 0xed, 0x20, 0xa7, 0xc9, 0xf3, 0x13, 0x57, 0x46, + 0xac, 0x3b, 0x8d, 0x3f, 0x15, 0xfe, 0xee, 0x83, 0xd8, 0xfe, 0x1f, 0x2e, + 0xf7, 0x7f, 0xef, 0x99, 0xc0, 0x20, 0x45, 0xa7, 0x79, 0x74, 0xd3, 0xa4, + 0x1b, 0x30, 0x8e, 0x90, 0xae, 0xae, 0xf9, 0x74, 0x1a, 0xe8, 0x22, 0x72, + 0x96, 0x7e, 0x9c, 0x18, 0xc5, 0x1c, 0xb1, 0x2f, 0xdc, 0x1a, 0xdc, 0x89, + 0xaf, 0x46, 0x3c, 0x58, 0xe9, 0xff, 0x96, 0xdf, 0xff, 0x39, 0xbf, 0xff, + 0xf9, 0xe5, 0xfe, 0x41, 0x4c, 0xf8, 0x95, 0x2b, 0x4d, 0x72, 0xbd, 0x55, + 0xf3, 0xe8, 0x0f, 0xfb, 0x72, 0x9d, 0x5f, 0x96, 0x2b, 0xa0, 0x1f, 0xc5, + 0x5c, 0x39, 0x67, 0xc6, 0x01, 0xc6, 0x83, 0x5e, 0xe8, 0x91, 0xbf, 0x75, + 0xe8, 0xe7, 0x1e, 0x67, 0xb8, 0xa2, 0xce, 0xf7, 0x75, 0x59, 0x4a, 0x1c, + 0x96, 0x51, 0x33, 0x3d, 0x3c, 0x81, 0xbd, 0xd7, 0x45, 0xe6, 0xa0, 0xc0, + 0xb7, 0x19, 0x60, 0x09, 0x9f, 0x25, 0xeb, 0xd6, 0xb2, 0x5e, 0x6a, 0x92, + 0x35, 0xf2, 0x22, 0x65, 0xf4, 0x64, 0x8d, 0x6d, 0x5e, 0x91, 0xd5, 0xa3, + 0xf7, 0x64, 0xbd, 0x54, 0x6b, 0xa2, 0x5f, 0x8c, 0xfa, 0xf4, 0xd1, 0x26, + 0x7a, 0xda, 0x31, 0x63, 0x21, 0xed, 0x98, 0xb2, 0x7d, 0x0a, 0xbe, 0xc0, + 0x3b, 0x8e, 0xc4, 0x81, 0x4f, 0x6e, 0x76, 0x25, 0x86, 0x18, 0xd9, 0xca, + 0xdf, 0xd8, 0x4c, 0x33, 0x7e, 0xea, 0x3d, 0xad, 0xb2, 0x05, 0xb6, 0xca, + 0xb5, 0x6b, 0xbe, 0xdb, 0x70, 0x65, 0xaf, 0x45, 0x59, 0x7e, 0xee, 0x9e, + 0x4a, 0x6c, 0xb1, 0xaa, 0xd2, 0x67, 0xb4, 0x0a, 0xef, 0x4e, 0x14, 0xcf, + 0x7e, 0xca, 0x72, 0xb2, 0xaf, 0xd7, 0x78, 0x1b, 0xf3, 0x1c, 0x99, 0xc6, + 0xde, 0xd4, 0x4c, 0x27, 0x4f, 0x83, 0xc7, 0x0e, 0xac, 0xcd, 0xcc, 0x20, + 0xe5, 0x11, 0xd9, 0x03, 0xbb, 0x9e, 0x51, 0xb9, 0x02, 0xed, 0x37, 0x3d, + 0x5a, 0x41, 0x7c, 0x7e, 0x49, 0xc5, 0x51, 0xd7, 0x7d, 0x0f, 0xb1, 0x74, + 0xf4, 0x26, 0xdb, 0xd3, 0x17, 0x3d, 0xdb, 0xd3, 0x17, 0x53, 0xd2, 0x73, + 0x34, 0x26, 0xab, 0xe6, 0xe1, 0x37, 0x2f, 0x76, 0x29, 0xfb, 0xd3, 0x5f, + 0x4c, 0x69, 0x05, 0xc4, 0x8c, 0x9e, 0xa3, 0x51, 0x31, 0x8f, 0xaa, 0xd8, + 0x00, 0x7d, 0xef, 0x94, 0x89, 0x13, 0xc4, 0x50, 0x53, 0x36, 0x1f, 0xe5, + 0x7a, 0x30, 0xc7, 0xab, 0x6f, 0x2d, 0xc3, 0xfe, 0x27, 0x79, 0xef, 0x3c, + 0xff, 0xbe, 0x94, 0x4d, 0xea, 0x21, 0x2e, 0x6d, 0xf3, 0x86, 0x44, 0xe6, + 0x81, 0x05, 0xf3, 0x49, 0x69, 0x81, 0x4f, 0xe9, 0x8b, 0x09, 0xad, 0x7a, + 0x9c, 0x31, 0x89, 0xe7, 0x48, 0xfd, 0xa8, 0x27, 0xb5, 0x6a, 0x6d, 0x10, + 0x4f, 0xda, 0x39, 0xc2, 0xd1, 0x22, 0xed, 0x9c, 0x72, 0x04, 0xfe, 0x82, + 0xf7, 0xc5, 0x7e, 0x75, 0x5e, 0xf4, 0x9e, 0xc5, 0xb9, 0xfc, 0x00, 0xfb, + 0xf6, 0xe0, 0xb7, 0x62, 0xb2, 0x0e, 0xfb, 0xf6, 0xb5, 0x79, 0x6b, 0xf3, + 0xf0, 0x45, 0xb9, 0xdd, 0x79, 0x6d, 0xb8, 0x8d, 0x79, 0x71, 0x1e, 0xcd, + 0xf3, 0xe2, 0x9c, 0xe2, 0xd2, 0xa2, 0xe6, 0x15, 0xcc, 0x07, 0x8a, 0xc6, + 0x7c, 0x7a, 0x8e, 0x26, 0xc1, 0xff, 0x49, 0xf8, 0x3e, 0xf6, 0x66, 0x8b, + 0x8f, 0xe3, 0x89, 0x54, 0x66, 0x91, 0x73, 0xe7, 0x5c, 0x2f, 0x4b, 0xf5, + 0x78, 0x30, 0xcf, 0x22, 0xde, 0xdf, 0x94, 0x89, 0xe3, 0xee, 0x41, 0xc4, + 0x58, 0x9e, 0x65, 0x75, 0xea, 0xca, 0x76, 0x6f, 0x9e, 0xfb, 0x9b, 0xe2, + 0xe9, 0x87, 0x77, 0x5e, 0x78, 0x9f, 0xbb, 0x59, 0x17, 0xcd, 0xd8, 0x91, + 0xf4, 0x7f, 0x1f, 0x47, 0x9c, 0xa0, 0x8e, 0x2e, 0x4b, 0xfe, 0xb8, 0x01, + 0xec, 0xf0, 0xf8, 0x15, 0x97, 0x7f, 0x23, 0xd7, 0xdc, 0xc7, 0x02, 0x5d, + 0xb7, 0x3a, 0x47, 0xca, 0x5b, 0x4b, 0xd4, 0x1f, 0x30, 0x67, 0x63, 0x13, + 0xd6, 0x34, 0xf7, 0x1b, 0x96, 0xe7, 0x91, 0x13, 0xbc, 0x65, 0xdd, 0xa0, + 0xd7, 0x22, 0xf3, 0xae, 0x99, 0xff, 0xea, 0xdc, 0xfa, 0x62, 0xdb, 0xba, + 0xca, 0xf8, 0xe7, 0xeb, 0x38, 0x4d, 0x4a, 0x93, 0xde, 0x24, 0x4e, 0xe2, + 0xb6, 0xd9, 0x6a, 0xc7, 0x37, 0xad, 0xa5, 0xa4, 0xe8, 0xb6, 0x8b, 0xb6, + 0x68, 0xca, 0x14, 0xcf, 0x6e, 0x52, 0x97, 0x75, 0x53, 0x5a, 0xc2, 0x36, + 0x01, 0x0f, 0x99, 0xd3, 0x41, 0xc7, 0x03, 0x63, 0x63, 0xaa, 0xa6, 0x51, + 0x54, 0xcb, 0x49, 0x59, 0x36, 0x19, 0xc7, 0x4d, 0xb3, 0xb5, 0x2f, 0x48, + 0x26, 0xb1, 0x3a, 0x90, 0xa2, 0xa4, 0x08, 0x21, 0xf1, 0xb0, 0xae, 0x53, + 0x3a, 0xf1, 0xc2, 0xc3, 0x04, 0xe3, 0x81, 0x07, 0x84, 0xaa, 0xac, 0x63, + 0xbc, 0xc1, 0x1b, 0x48, 0x63, 0x5c, 0x7e, 0xbf, 0xef, 0xdc, 0x9b, 0x38, + 0x56, 0x47, 0x05, 0x0f, 0xd6, 0xf5, 0xb9, 0xe7, 0x9e, 0x73, 0xcf, 0xf9, + 0xbe, 0xef, 0x7c, 0xdf, 0xef, 0xfb, 0x73, 0x57, 0x27, 0x71, 0x26, 0x23, + 0xd0, 0x65, 0xb6, 0x6c, 0x96, 0x9a, 0x65, 0x19, 0xd8, 0x6a, 0xa5, 0x46, + 0x1d, 0xc8, 0xb5, 0xef, 0xc6, 0x7d, 0xa3, 0xbf, 0xa8, 0x63, 0x37, 0x4b, + 0xb0, 0xab, 0x38, 0xdb, 0x9b, 0xa5, 0x28, 0xae, 0x7d, 0xb8, 0x3a, 0xb8, + 0xc6, 0x71, 0x4d, 0xe1, 0x3a, 0x84, 0xeb, 0x10, 0xae, 0xf0, 0x49, 0x4b, + 0x31, 0x5c, 0x03, 0x1c, 0xcc, 0xb9, 0xb6, 0xf7, 0x5d, 0xd4, 0xf7, 0x31, + 0x1f, 0x4d, 0x1b, 0xd6, 0xe4, 0x66, 0xe1, 0x1f, 0x66, 0x86, 0x82, 0xba, + 0xb0, 0x7f, 0x7b, 0xb6, 0x43, 0xbf, 0xb3, 0x10, 0x1a, 0xd7, 0x3c, 0x5e, + 0x05, 0xf6, 0xe0, 0x7a, 0x8f, 0xec, 0x76, 0xec, 0x09, 0x8d, 0x25, 0x2d, + 0xa1, 0xcd, 0xff, 0x8c, 0x29, 0xce, 0xc1, 0x2e, 0x51, 0x7f, 0x7a, 0x18, + 0x93, 0x87, 0xfe, 0xde, 0x8b, 0xf3, 0x97, 0x86, 0xbe, 0xc6, 0xff, 0xea, + 0xcb, 0x3d, 0xc6, 0x86, 0x26, 0xec, 0x6d, 0x3c, 0x1a, 0xd8, 0x28, 0x17, + 0x63, 0x02, 0x3f, 0x33, 0xf0, 0x31, 0xfb, 0xd4, 0x96, 0xe6, 0x2b, 0x89, + 0x4a, 0x15, 0x67, 0xf0, 0x77, 0xee, 0x45, 0xc5, 0x91, 0xe4, 0xc5, 0x25, + 0xe0, 0xf6, 0x6c, 0x99, 0x78, 0xf7, 0x02, 0xb0, 0x34, 0xfc, 0x90, 0x28, + 0xfd, 0x4e, 0xda, 0x02, 0xe2, 0xde, 0x0f, 0xb1, 0x36, 0xda, 0x81, 0xb7, + 0xf0, 0x3e, 0xec, 0x6b, 0xc5, 0x03, 0xcd, 0x4e, 0x00, 0x7f, 0x7a, 0x5e, + 0x93, 0x33, 0x2e, 0xf1, 0x33, 0xd4, 0x39, 0x82, 0xf1, 0x26, 0x6e, 0x4b, + 0x8c, 0x95, 0x9e, 0xd4, 0xd8, 0x30, 0x84, 0xeb, 0xcf, 0x18, 0xdb, 0x2d, + 0x26, 0xbe, 0xd1, 0xaa, 0x35, 0x2a, 0xe3, 0x65, 0x83, 0x9f, 0x2d, 0xa7, + 0x7e, 0xbe, 0x87, 0xfc, 0xf9, 0xd8, 0x6f, 0xe9, 0x3c, 0xcb, 0x1a, 0x27, + 0xc4, 0x79, 0x00, 0x8f, 0x7f, 0x04, 0x9f, 0x62, 0x03, 0x7c, 0xb9, 0x0d, + 0x9e, 0x7c, 0x50, 0xa2, 0xac, 0x0f, 0x42, 0xee, 0x23, 0xcc, 0xfb, 0x63, + 0xae, 0x21, 0x7d, 0xf7, 0x46, 0x09, 0xba, 0x93, 0xfa, 0xcf, 0xda, 0xdb, + 0x4b, 0x1c, 0x4a, 0xfb, 0x67, 0xe6, 0xe9, 0x33, 0xcf, 0x49, 0xd0, 0xd7, + 0xa5, 0xeb, 0x59, 0xd6, 0x18, 0x0a, 0xe9, 0x04, 0x19, 0x2c, 0x75, 0xf9, + 0xcf, 0xb4, 0xf6, 0x9a, 0x9a, 0x3c, 0xde, 0xe3, 0x3e, 0x86, 0x24, 0x53, + 0x0e, 0xc6, 0x75, 0x60, 0x5c, 0x6b, 0xdd, 0x5c, 0xbd, 0x0d, 0x7b, 0xb0, + 0xfc, 0x3d, 0xb0, 0xbf, 0xd1, 0x17, 0x4a, 0xc0, 0x93, 0x0e, 0xfc, 0xa1, + 0x61, 0x99, 0xbd, 0x42, 0xde, 0x0c, 0x63, 0x7c, 0xc0, 0x9f, 0x3e, 0xdf, + 0xef, 0x48, 0xcc, 0x17, 0x04, 0x38, 0x31, 0x4a, 0x1e, 0x8d, 0xe0, 0x5c, + 0xbf, 0xd7, 0x2d, 0xed, 0xae, 0x54, 0x4a, 0xbb, 0xc4, 0xea, 0x8c, 0x68, + 0x1d, 0x59, 0xdc, 0xaa, 0x7f, 0xe7, 0x73, 0xfe, 0x3b, 0xe1, 0x37, 0x2e, + 0x12, 0x9f, 0xab, 0x9d, 0xc1, 0x33, 0x7b, 0x1a, 0xd6, 0xf6, 0x8c, 0xff, + 0x1c, 0xfb, 0x1d, 0x29, 0x00, 0x77, 0x66, 0xcb, 0xf0, 0x1e, 0xa0, 0xbf, + 0x19, 0xab, 0x62, 0xae, 0x22, 0x0f, 0xec, 0x3c, 0x8b, 0x35, 0x16, 0xec, + 0x34, 0x73, 0x0f, 0x98, 0x63, 0x5f, 0xc3, 0x1c, 0x13, 0xfe, 0x1c, 0x39, + 0x9c, 0xb3, 0x09, 0x29, 0x5e, 0x4d, 0x43, 0x6e, 0x86, 0xe4, 0xf5, 0xf5, + 0x64, 0xfc, 0x84, 0x3c, 0x0a, 0x5b, 0x35, 0x21, 0x73, 0xef, 0xa4, 0xd4, + 0x9e, 0x2f, 0xc3, 0xee, 0x59, 0xf2, 0xae, 0xd6, 0x6b, 0x4e, 0xba, 0x89, + 0xd4, 0x0d, 0x29, 0x02, 0x9f, 0x87, 0xe4, 0x25, 0xd8, 0x8e, 0x0e, 0xe0, + 0xf4, 0xe5, 0x2d, 0x5d, 0x35, 0xa5, 0xba, 0x72, 0xce, 0x1d, 0x8c, 0x5f, + 0x52, 0xfd, 0x62, 0xe3, 0xfd, 0xf3, 0xc0, 0xc3, 0xdc, 0x7b, 0x9b, 0x14, + 0xed, 0xd0, 0x18, 0xfc, 0x7a, 0xf0, 0x80, 0x67, 0x4b, 0x06, 0xc2, 0xa3, + 0xcd, 0xc0, 0xa5, 0x9e, 0x7c, 0x02, 0xf5, 0x53, 0x2c, 0xcd, 0xcb, 0xc6, + 0xaa, 0x8d, 0xeb, 0x2b, 0xe0, 0xcd, 0x35, 0xfc, 0xbf, 0xd2, 0xcd, 0xfa, + 0x3a, 0x81, 0x9e, 0x27, 0xe6, 0xb8, 0xb4, 0x70, 0x0a, 0xbc, 0x4d, 0x8c, + 0x58, 0x56, 0x4e, 0xf7, 0xfc, 0xfa, 0xca, 0x5d, 0xa9, 0x2d, 0x11, 0x5f, + 0xa5, 0xa9, 0x17, 0xec, 0xb9, 0xe1, 0x53, 0x9a, 0x63, 0x99, 0x14, 0xdc, + 0xaf, 0xb5, 0x4b, 0xbc, 0x33, 0x07, 0xac, 0x86, 0x73, 0x0f, 0x5d, 0x58, + 0xc4, 0xb3, 0xcb, 0x4b, 0x4d, 0x72, 0x1b, 0x7b, 0x9d, 0x5d, 0x97, 0x78, + 0x66, 0x18, 0xed, 0xda, 0x65, 0x23, 0x1b, 0x72, 0x0a, 0xe3, 0x73, 0x52, + 0x00, 0xae, 0x3b, 0xc1, 0xff, 0xeb, 0xf7, 0xe3, 0x37, 0x69, 0x52, 0xef, + 0x5b, 0xce, 0xc8, 0x06, 0xcf, 0x95, 0xc6, 0xb8, 0x89, 0x11, 0x2e, 0x40, + 0x76, 0x89, 0xd9, 0xe9, 0x07, 0xe0, 0xff, 0x2a, 0xfb, 0xb9, 0x5f, 0x5c, + 0xab, 0x49, 0xd0, 0x95, 0xe7, 0x1f, 0x3e, 0xf9, 0x61, 0xd8, 0x53, 0x8b, + 0x67, 0xbe, 0xa8, 0x3a, 0xa1, 0xb8, 0x30, 0x03, 0xdb, 0xc2, 0x5a, 0x9e, + 0x7d, 0x90, 0xc9, 0x49, 0xf0, 0x74, 0x04, 0xcf, 0x35, 0xd8, 0x94, 0xb5, + 0xa2, 0xe2, 0x33, 0xeb, 0xba, 0xd1, 0x6f, 0xd6, 0x32, 0xb0, 0x1a, 0xce, + 0x91, 0xb5, 0x06, 0x19, 0xc3, 0x59, 0xb2, 0xd6, 0xa2, 0xb8, 0x42, 0x2f, + 0xaf, 0xc1, 0xaf, 0x80, 0x9e, 0xb3, 0xd6, 0xe0, 0x13, 0x40, 0xcf, 0x59, + 0x6b, 0x29, 0x5c, 0xa1, 0xeb, 0xd7, 0x02, 0xfd, 0xc6, 0xf9, 0xb9, 0x8e, + 0x40, 0xcf, 0x10, 0x4b, 0x52, 0xcf, 0x04, 0x78, 0x92, 0xf2, 0x00, 0xfa, + 0x2d, 0x90, 0xee, 0x94, 0xef, 0x24, 0xa4, 0x01, 0xf7, 0xde, 0x31, 0x98, + 0xb2, 0x56, 0x31, 0x34, 0x9b, 0x5d, 0xbf, 0xa5, 0xb6, 0x62, 0x42, 0x1c, + 0xc8, 0x1a, 0x69, 0x87, 0x3e, 0xb5, 0x05, 0x37, 0x25, 0xad, 0x57, 0xd2, + 0xec, 0x3d, 0x49, 0xd7, 0x52, 0xf2, 0xa6, 0xea, 0xaf, 0x40, 0x77, 0x11, + 0x4b, 0xc6, 0xb4, 0xb6, 0xe1, 0x8d, 0x2b, 0x77, 0x25, 0xf3, 0x16, 0xf5, + 0xd7, 0x60, 0xac, 0x35, 0x44, 0x9d, 0xe5, 0xc9, 0x2a, 0x6c, 0xd4, 0x09, + 0x37, 0xf1, 0x2c, 0xeb, 0xbd, 0xa7, 0x21, 0x1f, 0xcd, 0x47, 0x13, 0x6e, + 0x3c, 0x94, 0x7c, 0xb6, 0x35, 0x44, 0x1b, 0x39, 0x68, 0x9f, 0x93, 0x63, + 0x7e, 0x4c, 0x65, 0x97, 0x9c, 0x53, 0xec, 0x8f, 0xe3, 0x5b, 0xfe, 0x4c, + 0x73, 0x81, 0x9f, 0x0e, 0x93, 0xd6, 0x68, 0xaf, 0x69, 0xec, 0xa3, 0xe5, + 0xd3, 0xe1, 0x88, 0x14, 0xbb, 0x3d, 0xef, 0xf9, 0xa3, 0x1f, 0x77, 0x9b, + 0x58, 0xcd, 0xa1, 0x98, 0xd1, 0x09, 0xd1, 0x1e, 0xd3, 0x7e, 0x06, 0xd7, + 0x29, 0xc8, 0x27, 0xed, 0x2e, 0xed, 0x24, 0xf9, 0x86, 0x6b, 0x8d, 0xff, + 0x29, 0xd7, 0xf3, 0x90, 0x6b, 0xda, 0xcd, 0xbd, 0x92, 0x65, 0xac, 0xdd, + 0xd2, 0xfb, 0x05, 0x83, 0xa9, 0xfd, 0xe7, 0x2a, 0xd3, 0x32, 0x5b, 0x21, + 0x96, 0xda, 0x80, 0x4d, 0x63, 0x9d, 0x2e, 0x6d, 0xdb, 0x45, 0xd8, 0x75, + 0xe6, 0x8b, 0xd0, 0x57, 0xe5, 0xb8, 0x44, 0x2a, 0x6e, 0x61, 0xcf, 0x5b, + 0x32, 0x75, 0xad, 0x97, 0xb9, 0xa2, 0x9b, 0x87, 0xc1, 0xf7, 0xcb, 0xf4, + 0x2d, 0x06, 0x54, 0x46, 0x32, 0x3f, 0x25, 0xed, 0x3d, 0x2f, 0xe7, 0x42, + 0x0c, 0x3b, 0x1c, 0xd0, 0xde, 0xe0, 0x81, 0x27, 0x40, 0x97, 0x09, 0xf7, + 0x2e, 0x6d, 0xf8, 0xdf, 0x2c, 0x67, 0x30, 0x75, 0x2e, 0xc4, 0x33, 0x8e, + 0x76, 0x2d, 0x2c, 0xd5, 0x28, 0xf7, 0x0f, 0x7a, 0x85, 0x78, 0x5e, 0xee, + 0x45, 0x87, 0x46, 0x1a, 0x3c, 0x05, 0x1a, 0x90, 0x96, 0x01, 0x0d, 0xf8, + 0x9f, 0xe7, 0x8a, 0xfe, 0x43, 0x52, 0xfd, 0xc7, 0xe2, 0xba, 0x79, 0x37, + 0x6b, 0x88, 0xb7, 0xd7, 0xcc, 0xf5, 0x92, 0xa7, 0x37, 0x25, 0xab, 0xfc, + 0x9d, 0x97, 0x6c, 0xe5, 0xa6, 0x8c, 0x57, 0xe6, 0xe5, 0xa4, 0x33, 0x86, + 0xfd, 0xde, 0xf1, 0x66, 0x1c, 0xf5, 0x55, 0x46, 0xf2, 0x78, 0xf7, 0xcc, + 0xd0, 0x3e, 0xf9, 0xab, 0xeb, 0xc8, 0xa5, 0x15, 0x1b, 0x7e, 0xf5, 0x88, + 0xbc, 0xa1, 0x79, 0x51, 0xfa, 0x27, 0x21, 0x60, 0x53, 0xd6, 0xc0, 0xb4, + 0x88, 0x74, 0x3b, 0xb1, 0x4d, 0x21, 0xb6, 0x8c, 0x80, 0xd7, 0x71, 0x83, + 0x9f, 0x6d, 0xd3, 0x7f, 0xe8, 0x32, 0x30, 0xbc, 0xfb, 0x49, 0x6f, 0x10, + 0xe3, 0x34, 0x38, 0xf7, 0x8f, 0x7e, 0x8e, 0x78, 0x44, 0x2a, 0xcc, 0x27, + 0xab, 0xbe, 0x75, 0x20, 0x4b, 0x41, 0x6e, 0xd8, 0x96, 0x48, 0x99, 0x76, + 0xf7, 0x06, 0xec, 0xee, 0x28, 0x64, 0xd8, 0x1b, 0x5b, 0x71, 0x19, 0x2b, + 0x88, 0xca, 0x47, 0x25, 0xea, 0xe3, 0xb8, 0xfc, 0xbe, 0xf4, 0x2a, 0xd6, + 0xc3, 0xbc, 0x62, 0x1b, 0x74, 0x5a, 0x41, 0xeb, 0xab, 0xb2, 0x8a, 0x85, + 0xbf, 0xaf, 0xf6, 0x20, 0x6e, 0x15, 0xbb, 0x22, 0x90, 0xbd, 0x8c, 0xfb, + 0xa2, 0xe6, 0x57, 0xe2, 0x56, 0x9f, 0xdc, 0x5e, 0xe2, 0x7e, 0x53, 0x98, + 0x3b, 0x1a, 0xca, 0xd6, 0x68, 0x9f, 0x92, 0xb1, 0xbc, 0xb5, 0x4b, 0x9e, + 0x8f, 0x32, 0xd6, 0x4a, 0x1d, 0x94, 0x80, 0x4d, 0x1c, 0xb4, 0xf3, 0xac, + 0xa1, 0x53, 0x3b, 0x14, 0x6b, 0xd0, 0xb7, 0x2f, 0xfa, 0xfa, 0x96, 0x7d, + 0x69, 0xcd, 0xd3, 0xe5, 0x4b, 0xac, 0x87, 0x4d, 0xc2, 0xf6, 0xe1, 0xff, + 0x2a, 0xe7, 0x8f, 0xcb, 0xcb, 0xab, 0xe7, 0x80, 0xc3, 0x07, 0xed, 0x33, + 0xb4, 0xaf, 0xf6, 0x28, 0x75, 0x1e, 0xde, 0xff, 0x40, 0xc3, 0x5c, 0xdf, + 0xf4, 0xe7, 0x62, 0x3f, 0xce, 0x79, 0xd9, 0x91, 0x99, 0x12, 0x73, 0x4c, + 0x66, 0xad, 0x3b, 0x9f, 0x3d, 0xbd, 0xf5, 0xde, 0x39, 0xc6, 0xde, 0x4b, + 0xa6, 0x8e, 0xb2, 0x08, 0x4c, 0xf4, 0xd5, 0x4e, 0xbe, 0x93, 0xef, 0x6b, + 0x97, 0xcc, 0xd3, 0xd0, 0x2f, 0x65, 0xfe, 0x0a, 0x7e, 0x9d, 0x38, 0xfc, + 0x96, 0xe8, 0xfe, 0x7b, 0xd8, 0xa8, 0xc7, 0xfc, 0xf9, 0x36, 0x21, 0x43, + 0xd1, 0xba, 0xe7, 0x19, 0x4f, 0x61, 0x3b, 0x2e, 0x85, 0x55, 0x5e, 0x3d, + 0xaf, 0xd3, 0x69, 0x96, 0x33, 0xf6, 0x81, 0x86, 0x39, 0x8e, 0xe0, 0x9e, + 0xc1, 0x06, 0xe1, 0x72, 0xc8, 0xc7, 0x18, 0x07, 0x89, 0x9f, 0xfc, 0xff, + 0xcc, 0x9b, 0xf0, 0xf9, 0xfd, 0x0d, 0xfb, 0x38, 0xb8, 0x65, 0x8f, 0xe3, + 0x16, 0x75, 0xe7, 0xaf, 0xd0, 0x47, 0x19, 0xf2, 0x14, 0xcf, 0x37, 0x01, + 0xef, 0x67, 0xa1, 0x0b, 0xa2, 0x4e, 0xef, 0x3e, 0x16, 0x77, 0xdd, 0x52, + 0xba, 0xb5, 0x11, 0x1b, 0xe0, 0xff, 0xbd, 0xea, 0x0e, 0x52, 0x90, 0x65, + 0xcc, 0xbf, 0x9b, 0xf3, 0xbb, 0x3e, 0x9d, 0x13, 0x6e, 0xc1, 0x7a, 0x58, + 0xf2, 0x4b, 0x46, 0xfe, 0x32, 0x0e, 0x64, 0xaf, 0x1d, 0xed, 0x1a, 0x6d, + 0xc2, 0x17, 0xcd, 0x13, 0xd8, 0x86, 0x94, 0xda, 0x86, 0xd9, 0x05, 0xca, + 0x67, 0x63, 0xad, 0x02, 0xe5, 0x95, 0x32, 0x4a, 0x3d, 0x3b, 0x22, 0x97, + 0x17, 0x48, 0x9b, 0xb4, 0xd6, 0x07, 0x0c, 0x2c, 0xce, 0x68, 0xee, 0xa9, + 0xbf, 0x9c, 0xb8, 0x56, 0x90, 0x31, 0xb9, 0xe1, 0x92, 0x66, 0x89, 0xea, + 0x74, 0xb8, 0xad, 0x6e, 0xff, 0x53, 0x3e, 0xcd, 0x52, 0x2a, 0x57, 0xfd, + 0xe5, 0x0b, 0x5b, 0xfc, 0x9e, 0xb6, 0xda, 0x1b, 0xe8, 0x74, 0xd2, 0xa7, + 0x53, 0x5c, 0x88, 0x23, 0x9a, 0x3a, 0x39, 0x86, 0xef, 0x25, 0xf6, 0xe3, + 0xbb, 0x68, 0xe7, 0xe3, 0xcc, 0x53, 0x0a, 0xfd, 0xb9, 0xa6, 0xa7, 0x0d, + 0xc6, 0x98, 0xb6, 0x66, 0x40, 0xb7, 0xdd, 0x5a, 0xa7, 0x3b, 0xfb, 0xf6, + 0xb4, 0x8f, 0xd1, 0xf9, 0x7d, 0xc3, 0x10, 0xfa, 0x3f, 0xc7, 0x7c, 0x6f, + 0xa2, 0x3f, 0xe7, 0xe7, 0xfe, 0x4b, 0x47, 0x29, 0xa3, 0xe3, 0x9a, 0x63, + 0xe2, 0x58, 0x9e, 0x5f, 0xd2, 0x8a, 0xfc, 0xe0, 0x73, 0xa4, 0xd7, 0x91, + 0x86, 0x75, 0x25, 0xfd, 0x75, 0x05, 0xfd, 0x11, 0x69, 0xea, 0xa1, 0x6e, + 0x8b, 0x4a, 0xb2, 0x4c, 0x9f, 0x05, 0x36, 0x6b, 0x92, 0x73, 0xdd, 0x5f, + 0x07, 0x4f, 0xff, 0x9f, 0x3a, 0x78, 0xda, 0xba, 0xa6, 0x6b, 0x8c, 0x38, + 0xff, 0x0b, 0x3f, 0xeb, 0xbf, 0x01, 0x31, 0xfc, 0x7b, 0x7d, 0x81, 0x76, + 0x2a, 0xad, 0xdf, 0xa8, 0xfc, 0xa5, 0x44, 0x9a, 0x72, 0x8d, 0x37, 0xb8, + 0xc6, 0xb1, 0x0d, 0x97, 0xb9, 0xe1, 0xa7, 0xf4, 0xec, 0x5e, 0x5a, 0xa0, + 0x6e, 0x69, 0x93, 0x95, 0x4a, 0xa0, 0x5f, 0x4e, 0xfa, 0x18, 0xb7, 0xd8, + 0xd5, 0x8c, 0xf3, 0x92, 0x73, 0x2d, 0xad, 0x57, 0xb5, 0xbe, 0xc6, 0x7b, + 0x7d, 0xc0, 0x28, 0xb4, 0xb7, 0x49, 0xf8, 0x19, 0xd1, 0xd0, 0x72, 0x8d, + 0xf5, 0x1d, 0xcc, 0x03, 0x8f, 0xb1, 0x86, 0x1e, 0xb4, 0x9b, 0xc5, 0x39, + 0x8b, 0xc9, 0xc7, 0x25, 0x62, 0x7a, 0xc6, 0xc9, 0x1a, 0xf9, 0x3e, 0xb2, + 0x85, 0x09, 0x77, 0xf2, 0xfb, 0xc3, 0x7d, 0xfc, 0xce, 0x02, 0x7a, 0xc2, + 0xbe, 0x0d, 0x7b, 0x99, 0x8d, 0xf2, 0x7f, 0x1e, 0xbe, 0x00, 0x7d, 0x8f, + 0xb8, 0xfa, 0x1e, 0xcb, 0xd5, 0xe3, 0x32, 0xaf, 0x67, 0xa0, 0xcd, 0x8f, + 0x29, 0xb5, 0xa9, 0x9c, 0x50, 0xd6, 0xa6, 0x15, 0x83, 0x8f, 0x9a, 0xba, + 0x82, 0x12, 0xf7, 0x46, 0xbd, 0x14, 0xf3, 0xbf, 0x81, 0xa8, 0x7f, 0x7f, + 0xcc, 0x7f, 0xff, 0x3f, 0x7c, 0xfe, 0xda, 0xaa, 0x6b, 0x94, 0xd6, 0x16, + 0x6d, 0x8a, 0xab, 0xb5, 0xad, 0xcd, 0x7a, 0xa6, 0xa8, 0xef, 0x82, 0xe7, + 0x02, 0x9e, 0x04, 0x6d, 0x3e, 0x4f, 0xd9, 0x0f, 0xb0, 0x49, 0xac, 0xee, + 0x9c, 0x06, 0xf7, 0x02, 0x1e, 0xb1, 0xaf, 0xde, 0x1e, 0xf0, 0xcc, 0xc5, + 0xc1, 0xa7, 0xed, 0x73, 0xd7, 0x59, 0xde, 0xe6, 0x4d, 0xe6, 0x18, 0xd7, + 0x7f, 0x81, 0x71, 0x6f, 0x9c, 0xb5, 0x7b, 0xf1, 0xe7, 0xbc, 0xf2, 0x67, + 0x1a, 0xfc, 0xe9, 0x54, 0xfd, 0x4f, 0x9f, 0xef, 0x25, 0x5f, 0xe6, 0xda, + 0x40, 0x33, 0xc6, 0x67, 0xa1, 0xe7, 0xa6, 0xa8, 0xef, 0x0f, 0xef, 0xa7, + 0x9e, 0x61, 0x6c, 0x31, 0x3d, 0xb9, 0x07, 0xba, 0x8c, 0xed, 0xc3, 0x8a, + 0x45, 0x8c, 0xcf, 0x15, 0xd7, 0x18, 0x63, 0x18, 0xba, 0x79, 0xb9, 0x04, + 0x9c, 0xc6, 0x1a, 0x94, 0x1d, 0xfc, 0xfa, 0x8e, 0x4f, 0xaf, 0x33, 0xfb, + 0xc9, 0x1f, 0x9e, 0x03, 0xea, 0xcc, 0x0e, 0xcc, 0x77, 0x3a, 0x9a, 0x82, + 0x8c, 0x3d, 0x89, 0xfb, 0x03, 0xea, 0x53, 0x84, 0x71, 0xde, 0x37, 0x4b, + 0x3d, 0xbe, 0x1f, 0xe7, 0xa0, 0x0d, 0xdf, 0xb5, 0xd4, 0x49, 0xbf, 0x42, + 0xe3, 0x89, 0xcd, 0x65, 0xf8, 0xb0, 0xd0, 0xe1, 0x1b, 0x6a, 0x8b, 0x86, + 0xd0, 0xff, 0x25, 0xc6, 0xb1, 0xb5, 0x06, 0x7d, 0xb3, 0xe4, 0xd7, 0x90, + 0x44, 0x0f, 0x29, 0x4d, 0x97, 0x4b, 0x8c, 0xaf, 0x07, 0x75, 0x25, 0x7c, + 0x6f, 0x7f, 0xdd, 0xba, 0xc6, 0xe5, 0xf4, 0x96, 0xad, 0xa0, 0x2f, 0x0d, + 0xcc, 0x5e, 0x31, 0xb6, 0xa0, 0x58, 0x4d, 0x69, 0x7d, 0x42, 0x78, 0x74, + 0xd5, 0xc7, 0xf9, 0x77, 0xe4, 0x83, 0x25, 0x17, 0x34, 0x24, 0xce, 0xf7, + 0x2e, 0xce, 0xb9, 0x69, 0xe6, 0x75, 0x60, 0xcb, 0x2e, 0x4a, 0xd6, 0x4d, + 0xc4, 0xb3, 0xe1, 0x76, 0xc6, 0x92, 0x81, 0x0b, 0x0b, 0x7e, 0xfc, 0x71, + 0x88, 0xf1, 0x52, 0x59, 0xac, 0x71, 0xed, 0x3c, 0xdf, 0xc6, 0xff, 0x5e, + 0x2e, 0x71, 0xbd, 0x26, 0x16, 0xc1, 0xb6, 0x55, 0x76, 0x71, 0x25, 0x2d, + 0x86, 0x71, 0x7d, 0x14, 0x67, 0x82, 0xcf, 0xe2, 0x5a, 0xbb, 0x23, 0xbf, + 0x59, 0x0a, 0xec, 0x7a, 0x48, 0x3e, 0x70, 0xbc, 0x8b, 0xb3, 0x6e, 0x17, + 0x69, 0xe0, 0x16, 0x98, 0x97, 0x75, 0x1c, 0xb7, 0x28, 0x9e, 0xb7, 0xe1, + 0x6e, 0x74, 0x99, 0x1c, 0x36, 0x75, 0xc0, 0x02, 0x68, 0xf8, 0xfe, 0x43, + 0x96, 0x18, 0xfe, 0x91, 0x37, 0xb7, 0xfe, 0xab, 0x1d, 0x08, 0x74, 0x21, + 0xe5, 0x91, 0x72, 0x79, 0x47, 0x26, 0x54, 0xf7, 0xdf, 0x6b, 0x5c, 0xbd, + 0x9e, 0x08, 0xb0, 0x2d, 0x75, 0x3b, 0x65, 0x31, 0xa6, 0xbe, 0xc1, 0x40, + 0x9d, 0xec, 0x2d, 0xab, 0x5e, 0x78, 0x8e, 0xb2, 0x57, 0xa0, 0xec, 0xcd, + 0xf9, 0xb2, 0x37, 0xbb, 0x25, 0x7b, 0xdf, 0xf0, 0x75, 0x03, 0x65, 0x8b, + 0xf5, 0x23, 0xc4, 0x20, 0x5c, 0xcf, 0x6e, 0x99, 0xb9, 0x1a, 0xe8, 0xe3, + 0x08, 0xce, 0x2f, 0xef, 0x07, 0x3a, 0xb9, 0xe3, 0x80, 0xd1, 0xc9, 0x61, + 0xf3, 0x8d, 0x92, 0x62, 0x62, 0x4b, 0xfa, 0x17, 0x89, 0xa1, 0x1c, 0xe8, + 0xd5, 0x6e, 0x99, 0x9e, 0x0c, 0x4b, 0x72, 0xf1, 0xb7, 0xfb, 0x0d, 0xe6, + 0xa5, 0xfd, 0xc7, 0xd9, 0xd3, 0x7b, 0x6c, 0x7f, 0x84, 0xfb, 0x7b, 0xc5, + 0x52, 0x3e, 0xb7, 0x98, 0xef, 0x18, 0xa6, 0x82, 0x3e, 0xbb, 0x41, 0x5e, + 0x1f, 0xf5, 0xe5, 0x95, 0xfd, 0x96, 0xc9, 0x7f, 0xe0, 0xd9, 0xfe, 0x45, + 0xae, 0xd7, 0x8c, 0xeb, 0x5f, 0x34, 0xfe, 0xfb, 0xce, 0x71, 0x43, 0x5b, + 0xe3, 0xd0, 0x0f, 0x0c, 0x6c, 0xe6, 0x9e, 0x18, 0x01, 0xb6, 0x1b, 0x62, + 0xcd, 0x0a, 0xed, 0xf8, 0x80, 0x3b, 0x21, 0x94, 0xfd, 0x84, 0x2f, 0x7f, + 0xd4, 0x3d, 0x9d, 0xbe, 0xee, 0xd9, 0xb6, 0x37, 0x59, 0x53, 0xd3, 0xc0, + 0x18, 0x49, 0x9d, 0xbd, 0x21, 0x0d, 0x1a, 0xed, 0xcd, 0x5e, 0x7f, 0x9e, + 0xa0, 0x2f, 0xd0, 0x31, 0x41, 0x3b, 0xd0, 0x31, 0x8d, 0xd8, 0x36, 0x90, + 0x83, 0xfa, 0xfb, 0xf5, 0xbe, 0xdf, 0x71, 0xdf, 0xd7, 0xb7, 0xf4, 0x2c, + 0x19, 0xbb, 0x4e, 0x5e, 0x13, 0x57, 0xf2, 0xcc, 0x27, 0x0a, 0xcc, 0x81, + 0x14, 0xaf, 0x7c, 0x8e, 0x7d, 0xaf, 0xfb, 0xbc, 0x99, 0x90, 0x4b, 0x57, + 0x73, 0x1a, 0xf3, 0x31, 0x32, 0xf0, 0x43, 0xec, 0xe1, 0x14, 0xf8, 0xff, + 0x74, 0xb7, 0x5f, 0xe3, 0x80, 0xfd, 0x45, 0x5f, 0xcb, 0x38, 0x89, 0x54, + 0x5a, 0xf3, 0x74, 0x7d, 0xbd, 0xfc, 0x26, 0x88, 0x75, 0x89, 0xad, 0xce, + 0x0f, 0xe4, 0xa4, 0xed, 0x69, 0xde, 0xa6, 0x65, 0xd4, 0x79, 0xad, 0xe5, + 0xc7, 0x81, 0xfc, 0x53, 0xae, 0xa2, 0xaf, 0xcd, 0x54, 0xbc, 0xb1, 0xa6, + 0xa3, 0xfc, 0xd6, 0xe0, 0x00, 0xf8, 0x3d, 0x26, 0xdf, 0x76, 0xd9, 0xff, + 0x33, 0xf4, 0x4f, 0xd1, 0xc7, 0x4c, 0x34, 0xe9, 0xf7, 0x2f, 0x89, 0xd8, + 0x59, 0x9c, 0xc9, 0x3c, 0xfc, 0xf6, 0x4c, 0x78, 0x0f, 0xe3, 0x38, 0xf0, + 0xd7, 0x89, 0xb5, 0x98, 0x47, 0x7f, 0x55, 0xbe, 0xe5, 0x0e, 0xb8, 0x1b, + 0x52, 0xf0, 0xbf, 0x31, 0x60, 0x3e, 0x68, 0x97, 0x9c, 0x75, 0x9b, 0x5a, + 0x32, 0xeb, 0xe6, 0x2c, 0x1c, 0x0f, 0xa7, 0x5b, 0xe7, 0x9c, 0x68, 0xcb, + 0xc4, 0x3a, 0xce, 0xfa, 0x3a, 0xe4, 0x76, 0x3d, 0x16, 0xca, 0xae, 0x92, + 0x0e, 0x61, 0x53, 0xb7, 0xa0, 0xfe, 0x17, 0x75, 0xcb, 0x63, 0xb2, 0x69, + 0x1f, 0x96, 0xcd, 0x14, 0xbf, 0x2f, 0x3c, 0x86, 0x76, 0xbf, 0xe6, 0x64, + 0x36, 0xa1, 0x87, 0x36, 0x53, 0x2d, 0x2a, 0x8f, 0xea, 0xa7, 0x41, 0x7f, + 0x6d, 0xda, 0xd4, 0x5b, 0x0f, 0xf2, 0x8a, 0xfd, 0x5e, 0x01, 0x9d, 0x58, + 0xd3, 0x70, 0x04, 0x6d, 0xea, 0x3b, 0xbb, 0xe1, 0xfe, 0x7e, 0xb4, 0x1f, + 0xc2, 0x1c, 0xcd, 0xba, 0x47, 0xcb, 0x39, 0x6a, 0x72, 0xac, 0x3b, 0x9e, + 0xe9, 0x68, 0x68, 0xbf, 0x1a, 0xa3, 0x5f, 0x13, 0xb7, 0xd6, 0xc8, 0xef, + 0x42, 0x5a, 0xfe, 0xb5, 0x6f, 0x67, 0xfb, 0x27, 0xfb, 0x77, 0xb6, 0xdb, + 0xa5, 0xb5, 0x9b, 0xac, 0x38, 0xd8, 0xf0, 0x5c, 0x20, 0x4f, 0x41, 0xbb, + 0x97, 0x3c, 0x86, 0xf1, 0x4b, 0xaa, 0x4f, 0xb5, 0x19, 0xe5, 0xbb, 0xae, + 0x34, 0x8c, 0xe1, 0x7f, 0x8e, 0xe1, 0x58, 0xc6, 0xf9, 0x28, 0x07, 0x1c, + 0xc3, 0xd8, 0x00, 0x63, 0x1a, 0x94, 0xd9, 0x7b, 0xf9, 0x5b, 0x7c, 0x66, + 0xa7, 0xdc, 0x4d, 0x6f, 0xc9, 0x5d, 0xa0, 0x5f, 0x62, 0x7e, 0xcc, 0xc1, + 0xe4, 0xa5, 0x4c, 0xcc, 0x85, 0xbc, 0xd3, 0xbc, 0x54, 0xec, 0x36, 0xf8, + 0xfc, 0x3c, 0xf8, 0x3c, 0x1e, 0xa6, 0x6f, 0xc8, 0xfc, 0x93, 0x23, 0xd9, + 0x75, 0xf2, 0x9b, 0xf6, 0x9e, 0x32, 0x0a, 0x7c, 0xb1, 0x4e, 0x5d, 0x63, + 0x01, 0x1b, 0x1d, 0xc7, 0x1a, 0xdf, 0xc5, 0x7d, 0xcb, 0xcf, 0xc9, 0x0e, + 0xc3, 0xd6, 0xb9, 0xf8, 0x91, 0xef, 0xf0, 0xf9, 0x57, 0xc8, 0x63, 0xd6, + 0x78, 0x32, 0x56, 0x90, 0xd3, 0x6f, 0x42, 0xf8, 0xdd, 0x5f, 0xde, 0xce, + 0x69, 0x5d, 0xa1, 0x53, 0x3e, 0x22, 0x85, 0xc9, 0x9c, 0xe2, 0x82, 0x7e, + 0xd8, 0xad, 0x59, 0x97, 0xf1, 0xa2, 0x83, 0x38, 0xb3, 0x8c, 0x03, 0x68, + 0x8c, 0xc3, 0x8b, 0x28, 0x56, 0x27, 0x16, 0x61, 0x7c, 0xce, 0xe4, 0xb9, + 0xcd, 0xf9, 0xed, 0x3d, 0x20, 0xed, 0x13, 0x52, 0xb9, 0x6a, 0x6b, 0xbd, + 0x47, 0x5a, 0x3e, 0xf7, 0xc8, 0xc3, 0xfc, 0x54, 0x1c, 0x3a, 0x8b, 0xd8, + 0xfe, 0xe1, 0x6e, 0x43, 0x53, 0xe9, 0xa3, 0x8f, 0x9c, 0x2c, 0xd7, 0xcf, + 0xa1, 0x35, 0x22, 0xe8, 0xfb, 0x7a, 0xcc, 0x9c, 0x1f, 0xfa, 0xcb, 0x77, + 0xbd, 0x74, 0x94, 0xef, 0xe4, 0xb3, 0xcc, 0xf9, 0x52, 0x56, 0xb8, 0xb6, + 0xcf, 0x7c, 0xb9, 0xce, 0x61, 0xbe, 0xb8, 0xf4, 0xaf, 0xe5, 0xd4, 0xcf, + 0x9f, 0xdd, 0xe1, 0xd3, 0x9a, 0xf8, 0x81, 0xf1, 0x6b, 0xdf, 0x97, 0xb3, + 0xab, 0xe4, 0x13, 0xed, 0x7e, 0x48, 0x7e, 0xee, 0x0c, 0xda, 0x2f, 0x08, + 0xeb, 0x00, 0x13, 0x69, 0xe6, 0x6d, 0x76, 0x3b, 0x49, 0x7b, 0x45, 0x9a, + 0x46, 0xbe, 0xc2, 0xef, 0x76, 0x1c, 0xd6, 0x33, 0x0c, 0xba, 0x2f, 0x48, + 0x50, 0xd3, 0x30, 0x90, 0xde, 0x15, 0xfa, 0xa7, 0xf7, 0xfe, 0x14, 0x9f, + 0xf1, 0xbf, 0x3b, 0x0e, 0x91, 0x6f, 0x7f, 0x7a, 0x90, 0xdf, 0x8c, 0xef, + 0x8c, 0x0b, 0x3e, 0xfe, 0xe2, 0x99, 0xe1, 0xc4, 0x3c, 0x7d, 0xda, 0x88, + 0x63, 0xf7, 0x99, 0xbd, 0x16, 0x0a, 0x1d, 0xa2, 0x79, 0xb5, 0xf3, 0x9f, + 0x3a, 0xfc, 0xee, 0x3a, 0x11, 0xdb, 0x65, 0x31, 0x3e, 0x4e, 0x5d, 0xc7, + 0x5c, 0x8b, 0xe7, 0x8d, 0xc3, 0xbb, 0xcf, 0x03, 0x4b, 0x5c, 0x1f, 0xb2, + 0xe4, 0xf1, 0xa6, 0x34, 0xc8, 0x73, 0x28, 0xbe, 0x28, 0x78, 0x27, 0xf3, + 0x2e, 0xab, 0x89, 0x02, 0x9f, 0x6f, 0x2a, 0x73, 0xbe, 0xb8, 0xfa, 0x2f, + 0xc9, 0x43, 0x9e, 0xf7, 0x92, 0x2b, 0xa1, 0xe4, 0x97, 0x3f, 0xf1, 0x98, + 0x27, 0xb7, 0xd6, 0xbe, 0xa8, 0xa6, 0x83, 0x7a, 0xe3, 0x0f, 0xdf, 0x35, + 0x75, 0xa5, 0x2d, 0xe7, 0x59, 0x83, 0x6b, 0x8d, 0xba, 0x53, 0xa6, 0xbd, + 0x07, 0xed, 0x66, 0xbf, 0xd6, 0xc7, 0x3e, 0xdf, 0x5f, 0x4d, 0xf6, 0x19, + 0x7f, 0x9c, 0xb8, 0x2b, 0xf0, 0x71, 0xe2, 0x3b, 0x6a, 0x9f, 0x4e, 0x2f, + 0xe4, 0x42, 0xb9, 0x05, 0x6b, 0xa9, 0x85, 0xb9, 0xb2, 0x63, 0x9e, 0x74, + 0x1d, 0x0d, 0xe2, 0x58, 0x8c, 0x7b, 0x89, 0x74, 0xac, 0x1d, 0x37, 0xb9, + 0x91, 0x35, 0x4b, 0x31, 0x52, 0xe7, 0x75, 0xc6, 0xb2, 0xa2, 0xaa, 0x1b, + 0xba, 0xd6, 0x58, 0xf3, 0xd4, 0x2d, 0x79, 0xd5, 0x19, 0xdd, 0xaa, 0x0f, + 0x8c, 0xdc, 0x75, 0x6a, 0xbc, 0x96, 0x38, 0xea, 0xd6, 0xc2, 0x93, 0x0f, + 0xb0, 0x4e, 0xe5, 0x97, 0x0b, 0xdf, 0x43, 0x9b, 0x7a, 0xe6, 0x91, 0x86, + 0xfb, 0xf5, 0x39, 0xdb, 0x84, 0xdd, 0x6f, 0x35, 0xe6, 0x6b, 0x79, 0xaf, + 0x31, 0x4f, 0xfb, 0xae, 0x4c, 0xf7, 0x30, 0x37, 0x1b, 0xc4, 0xe5, 0x5d, + 0x3f, 0x2e, 0x7f, 0xea, 0x01, 0xca, 0xe0, 0xad, 0x05, 0x99, 0x6e, 0x1a, + 0x6d, 0x19, 0x9a, 0x2d, 0x85, 0xff, 0xbe, 0x1d, 0x63, 0x45, 0x7b, 0x75, + 0x2b, 0x7f, 0x8e, 0xbe, 0x57, 0x80, 0x55, 0x8a, 0xc0, 0x1d, 0x05, 0xbf, + 0x56, 0x98, 0xfd, 0x5b, 0xe3, 0xef, 0xb3, 0xa6, 0xdd, 0x9a, 0x7b, 0xef, + 0xdf, 0x91, 0x7b, 0x7f, 0x02, 0x63, 0x53, 0xbe, 0xcf, 0x65, 0xc6, 0x46, + 0xfc, 0xb1, 0xe3, 0xf7, 0xdd, 0x4f, 0xfd, 0x99, 0xb9, 0xa4, 0xb1, 0xe4, + 0xd9, 0xf5, 0x79, 0xc9, 0x3b, 0x9d, 0x92, 0x5d, 0x0a, 0xec, 0x84, 0x37, + 0x36, 0xe3, 0x16, 0xf6, 0x85, 0x85, 0xe3, 0xf9, 0xbe, 0x00, 0xbb, 0x71, + 0xfe, 0x3d, 0x3e, 0x7e, 0xa3, 0x4d, 0x30, 0x38, 0xd0, 0xcc, 0xf5, 0xb2, + 0xc6, 0x37, 0xe6, 0xf4, 0x9e, 0x6d, 0x62, 0x24, 0x51, 0xee, 0xef, 0xac, + 0x9f, 0xbf, 0xa8, 0xcf, 0x9f, 0x7f, 0x11, 0xaf, 0xc9, 0xe7, 0x80, 0x2e, + 0x05, 0x8f, 0xf5, 0xb7, 0x87, 0x58, 0x93, 0xb3, 0xb5, 0x1f, 0xda, 0x35, + 0xb5, 0x5f, 0xba, 0xd7, 0x09, 0x7f, 0xaf, 0x61, 0xac, 0x79, 0xa6, 0x14, + 0x3c, 0x73, 0x51, 0x0e, 0x1f, 0x4b, 0xc4, 0x92, 0x96, 0xae, 0x5d, 0x6d, + 0x5c, 0xc6, 0xbd, 0x08, 0xdb, 0x45, 0x3b, 0xa7, 0xba, 0x0f, 0x38, 0x97, + 0xba, 0x8f, 0x36, 0x4c, 0xed, 0x5e, 0xbc, 0x88, 0xbd, 0x64, 0xd7, 0x35, + 0x97, 0x11, 0x3b, 0x11, 0x4e, 0x54, 0xf2, 0xaa, 0x0f, 0xb9, 0x17, 0xae, + 0x1d, 0xb6, 0x3b, 0x54, 0x9f, 0xa7, 0xa2, 0x6f, 0xca, 0x9c, 0x4e, 0x9b, + 0x64, 0x2a, 0x22, 0xbf, 0xc0, 0x19, 0xb8, 0x51, 0xe3, 0xb9, 0x0c, 0xf7, + 0x18, 0xff, 0x72, 0xe3, 0x11, 0x4b, 0x7a, 0x34, 0xf7, 0x5b, 0x04, 0x4d, + 0x81, 0xcf, 0xc6, 0xc2, 0xc7, 0xe0, 0x63, 0x68, 0xad, 0x05, 0xe3, 0xb4, + 0x33, 0xc0, 0x76, 0xf5, 0xb1, 0x25, 0xe8, 0x91, 0x49, 0xde, 0xcf, 0x83, + 0x6e, 0xdb, 0x79, 0x9f, 0x62, 0x75, 0x4e, 0x63, 0xba, 0xcb, 0xb5, 0x36, + 0xb5, 0x29, 0xcb, 0xd5, 0x87, 0x41, 0x17, 0x39, 0x6c, 0x8d, 0x16, 0xfd, + 0xfb, 0x11, 0xa9, 0x56, 0xd9, 0x96, 0xbe, 0x66, 0x95, 0xa9, 0x20, 0xb7, + 0x65, 0xcb, 0x0a, 0x70, 0x72, 0x75, 0xd5, 0xc1, 0x2f, 0x85, 0xdf, 0x10, + 0x7e, 0xa7, 0x24, 0x53, 0x26, 0x76, 0x67, 0x2e, 0xab, 0xad, 0xe1, 0xfd, + 0x11, 0xad, 0x83, 0x67, 0x6d, 0x57, 0xd1, 0xf7, 0xf1, 0x8a, 0xd5, 0x7b, + 0xe1, 0x5a, 0xc6, 0x88, 0x53, 0xbe, 0x3e, 0xfc, 0xb5, 0x5f, 0x7b, 0xf9, + 0x1f, 0x46, 0x14, 0xec, 0x43, 0x54, 0x75, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = { + 0x080033f8, 0x080033f8, 0x08003370, 0x080033a8, 0x080033dc, 0x08003400, + 0x08003400, 0x08003400, 0x080032e0, 0x00000000 }; + +static struct fw_info bnx2_rxp_fw_06 = { + /* Firmware version: 5.0.0j9 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x080031d8, + + .text_addr = 0x08000000, + .text_len = 0x7550, + .text_index = 0x0, + .gz_text = bnx2_RXP_b06FwText, + .gz_text_len = sizeof(bnx2_RXP_b06FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_RXP_b06FwData, + + .sbss_addr = 0x080075a0, + .sbss_len = 0x58, + .sbss_index = 0x0, + + .bss_addr = 0x080075f8, + .bss_len = 0x450, + .bss_index = 0x0, + + .rodata_addr = 0x08007550, + .rodata_len = 0x24, + .rodata_index = 0x0, + .rodata = bnx2_RXP_b06FwRodata, +}; + +/* Initialized Values for the RX Processor. */ +static const struct cpu_reg cpu_reg_rxp = { + .mode = BNX2_RXP_CPU_MODE, + .mode_value_halt = BNX2_RXP_CPU_MODE_SOFT_HALT, + .mode_value_sstep = BNX2_RXP_CPU_MODE_STEP_ENA, + .state = BNX2_RXP_CPU_STATE, + .state_value_clear = 0xffffff, + .gpr0 = BNX2_RXP_CPU_REG_FILE, + .evmask = BNX2_RXP_CPU_EVENT_MASK, + .pc = BNX2_RXP_CPU_PROGRAM_COUNTER, + .inst = BNX2_RXP_CPU_INSTRUCTION, + .bp = BNX2_RXP_CPU_HW_BREAKPOINT, + .spad_base = BNX2_RXP_SCRATCH, + .mips_view_base = 0x8000000, +}; + +static u8 bnx2_rv2p_proc1[] = { + /* Date: 03/16/2010 11:37 */ +#define RV2P_PROC1_MAX_BD_PAGE_LOC 9 +#define RV2P_PROC1_BD_PAGE_SIZE_MSK 0xffff +#define RV2P_PROC1_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xa5, 0x56, 0x4f, 0x68, 0x14, 0x67, 0x14, 0x7f, 0xbb, 0x9b, 0x99, 0xd9, + 0x4c, 0xf6, 0x9f, 0x18, 0xd3, 0x25, 0x0d, 0x66, 0x15, 0x2f, 0x59, 0x27, + 0x24, 0xab, 0x1e, 0x3c, 0x58, 0x6c, 0x05, 0x09, 0x54, 0x2b, 0x12, 0x10, + 0x44, 0x0a, 0xea, 0x62, 0x7b, 0xf2, 0xa8, 0x17, 0x41, 0x3a, 0x44, 0x22, + 0x18, 0xbc, 0xe4, 0x60, 0x40, 0x11, 0xcc, 0xa9, 0x4a, 0x90, 0x76, 0xa7, + 0xbd, 0x85, 0xd2, 0x14, 0x5a, 0x7a, 0xea, 0x31, 0x87, 0xb6, 0x88, 0x31, + 0x8a, 0x0a, 0xad, 0x87, 0x9e, 0xc4, 0x8b, 0x3b, 0x7e, 0xef, 0xcf, 0x37, + 0xf3, 0xcd, 0xe7, 0x26, 0x11, 0x1a, 0x08, 0x3f, 0xbe, 0x37, 0xef, 0xbd, + 0xef, 0xbd, 0xf7, 0x7b, 0xef, 0x7d, 0x5b, 0x03, 0x00, 0x17, 0xc2, 0x68, + 0x54, 0x21, 0x14, 0x0a, 0xb9, 0xa2, 0x82, 0x38, 0x06, 0xa7, 0x8e, 0x67, + 0xc8, 0x03, 0x9d, 0x21, 0x7b, 0xce, 0x01, 0x3c, 0x04, 0xfe, 0x73, 0x4a, + 0x74, 0x0e, 0x27, 0xe4, 0xbc, 0x97, 0x21, 0xdc, 0x5b, 0x23, 0xed, 0x27, + 0xf3, 0x5a, 0x1f, 0xcf, 0x5f, 0xc0, 0xe1, 0x06, 0x62, 0x01, 0x0e, 0xef, + 0x42, 0x1c, 0x81, 0x95, 0x06, 0xfa, 0x7d, 0x1b, 0x43, 0x28, 0x7a, 0x11, + 0x62, 0x07, 0xc2, 0x00, 0x51, 0xfd, 0x8f, 0xb3, 0x3c, 0x1c, 0x47, 0xbd, + 0x8b, 0xca, 0xf1, 0x00, 0xf9, 0x5d, 0x9b, 0x28, 0x11, 0x86, 0xa3, 0x7c, + 0x9f, 0x17, 0xd4, 0x08, 0x1f, 0xd3, 0x7d, 0xa7, 0x4e, 0x71, 0xbc, 0xff, + 0xc5, 0x59, 0x7d, 0xd8, 0x42, 0xff, 0x1f, 0xa5, 0xaf, 0xfd, 0x9a, 0xf2, + 0x97, 0xa9, 0x7c, 0x2c, 0x7b, 0xef, 0x5a, 0x13, 0xf5, 0x1c, 0x80, 0xa6, + 0xa9, 0xbf, 0x2e, 0xf9, 0x04, 0xb0, 0x27, 0xcf, 0x75, 0xeb, 0x83, 0x3a, + 0xe5, 0x0b, 0x21, 0xe2, 0x4e, 0xc1, 0xaf, 0x04, 0x3b, 0x82, 0xdf, 0x0b, + 0xc2, 0xff, 0xc4, 0xd7, 0x1b, 0xc8, 0x77, 0x08, 0x7e, 0x6c, 0xc9, 0x7f, + 0x17, 0x9c, 0xb0, 0xec, 0x77, 0xe5, 0x18, 0x5f, 0xc9, 0xf9, 0xa8, 0x9c, + 0x4f, 0x58, 0xf6, 0xd7, 0x80, 0xeb, 0x93, 0x4b, 0xea, 0xc2, 0x75, 0xf8, + 0x45, 0xd5, 0x81, 0xeb, 0xbc, 0x3a, 0x2f, 0xdf, 0xc7, 0xb4, 0x5e, 0x91, + 0xea, 0x08, 0x4d, 0x53, 0x7f, 0x79, 0x13, 0x7d, 0x56, 0x3b, 0x32, 0xd6, + 0xcb, 0xee, 0xc7, 0x98, 0xe3, 0xf8, 0x41, 0xec, 0xfd, 0xce, 0x4f, 0x91, + 0xe6, 0x9d, 0xd5, 0xfe, 0x2c, 0x30, 0x1e, 0x0a, 0xb4, 0x7f, 0xe1, 0xcb, + 0x45, 0xbb, 0x8f, 0x24, 0x8f, 0x15, 0x60, 0xfb, 0xe5, 0x5c, 0x3b, 0xc0, + 0xb3, 0x0b, 0xcc, 0x63, 0x24, 0xfd, 0xd8, 0xaf, 0xfa, 0xd1, 0xb4, 0xf7, + 0x72, 0xdc, 0x97, 0x7b, 0x24, 0x7f, 0x90, 0x78, 0xb1, 0xcf, 0x74, 0x7f, + 0xf1, 0xbd, 0xdc, 0x27, 0xae, 0xd5, 0x27, 0x77, 0xb7, 0xa8, 0xcf, 0x80, + 0x95, 0xe7, 0x42, 0xac, 0xeb, 0x9e, 0x17, 0xf1, 0x8c, 0x8b, 0xf6, 0x45, + 0x98, 0x8b, 0x10, 0xbd, 0xc1, 0x9b, 0x94, 0x77, 0x1c, 0xfb, 0x0e, 0xcf, + 0xd9, 0x5c, 0x44, 0x6a, 0x75, 0xff, 0x3a, 0xdf, 0x73, 0x53, 0xcf, 0x63, + 0x53, 0xdf, 0xcb, 0xfe, 0xca, 0xe2, 0x2f, 0xef, 0xe8, 0xb8, 0x59, 0xee, + 0x67, 0xee, 0x41, 0x39, 0xa2, 0x03, 0xeb, 0x3f, 0xe3, 0xf7, 0xab, 0x2a, + 0x9e, 0x1c, 0x8a, 0x07, 0xcf, 0x3b, 0x3c, 0xef, 0x73, 0xe2, 0x7f, 0xbd, + 0x93, 0xf5, 0x6b, 0xdb, 0x3f, 0x25, 0xfb, 0xcb, 0x89, 0x7d, 0xdb, 0xb2, + 0x6f, 0x47, 0xda, 0x1e, 0xe5, 0xdb, 0x3b, 0x8b, 0x16, 0x9f, 0x0d, 0xe2, + 0x03, 0x84, 0x17, 0xb0, 0x78, 0xd1, 0xbc, 0x3e, 0x92, 0x39, 0x1c, 0x51, + 0x3c, 0xf1, 0xf7, 0x51, 0x9a, 0xc3, 0x17, 0x4a, 0x5e, 0xa5, 0xba, 0x9d, + 0x9b, 0xaa, 0xd2, 0x7d, 0x15, 0x97, 0xdd, 0x9c, 0xae, 0x32, 0x5e, 0x90, + 0xc4, 0x9f, 0xfb, 0xfd, 0x54, 0xcf, 0xaf, 0x07, 0xf8, 0x7c, 0xbe, 0x8c, + 0xf6, 0xdb, 0x21, 0xb5, 0xd7, 0x71, 0x6d, 0x16, 0x0f, 0xde, 0xaf, 0xef, + 0xd1, 0x71, 0xe8, 0xfb, 0xd0, 0xdf, 0xaa, 0x8a, 0x67, 0xab, 0x7b, 0x19, + 0xdb, 0xf9, 0x6c, 0x1d, 0xfa, 0x5a, 0x8c, 0x77, 0x26, 0x09, 0xea, 0x0b, + 0x25, 0xb6, 0xbb, 0x5d, 0xea, 0xc3, 0xf3, 0x81, 0xdb, 0x7f, 0x50, 0x5d, + 0xf7, 0x2d, 0x44, 0x12, 0x5f, 0x35, 0xdb, 0x67, 0xd3, 0xd2, 0xaf, 0xd3, + 0x34, 0x57, 0x15, 0xa5, 0x8a, 0x38, 0x0c, 0x61, 0x9e, 0xec, 0xfc, 0xdf, + 0xc8, 0xae, 0x20, 0x72, 0xc5, 0xd5, 0xee, 0xec, 0x3c, 0xae, 0x71, 0x7f, + 0x16, 0xb3, 0x7d, 0xfd, 0x99, 0xb1, 0x77, 0xcd, 0x3a, 0xe4, 0x92, 0x7e, + 0x6e, 0x64, 0xe6, 0xd0, 0xac, 0x9b, 0xae, 0x17, 0xfa, 0xf9, 0x4e, 0xf8, + 0x73, 0xe5, 0xbb, 0x22, 0x69, 0x9c, 0xd5, 0xc2, 0x49, 0x29, 0x60, 0x4b, + 0xbe, 0x8f, 0xdb, 0xf3, 0xd3, 0x6b, 0xfe, 0x6a, 0xd6, 0x3c, 0x05, 0x32, + 0x7f, 0xfd, 0x9d, 0xc5, 0xf9, 0x0f, 0x99, 0xf3, 0xfb, 0x32, 0x7f, 0x35, + 0x48, 0xde, 0xab, 0x87, 0x78, 0x56, 0xb9, 0x32, 0x7f, 0x9d, 0xb0, 0x90, + 0xe1, 0xe7, 0x53, 0xe8, 0xb9, 0x6f, 0x6e, 0x88, 0x9f, 0x96, 0xec, 0x1d, + 0xd7, 0x78, 0xd7, 0x48, 0xbd, 0x02, 0x14, 0x87, 0x67, 0xed, 0x8b, 0xa1, + 0xa4, 0x4f, 0x66, 0xdc, 0x5e, 0xf9, 0x7a, 0xf0, 0x52, 0xf8, 0xe7, 0x79, + 0x72, 0x06, 0x2f, 0x2e, 0x67, 0x78, 0x52, 0x2b, 0x5d, 0xbf, 0x57, 0x66, + 0x5c, 0xe6, 0x7b, 0x8b, 0xfe, 0xea, 0xd0, 0x6e, 0x99, 0xef, 0xee, 0xd5, + 0x64, 0xef, 0xf0, 0x3c, 0x56, 0xde, 0x9b, 0x47, 0xbd, 0x5f, 0x53, 0x5e, + 0xf5, 0x7b, 0xc3, 0x73, 0xcd, 0xfb, 0xb4, 0x64, 0xe7, 0xa9, 0xde, 0x61, + 0x9b, 0x2f, 0xf3, 0xf7, 0xc7, 0x9b, 0xee, 0x87, 0xed, 0xdf, 0x4b, 0x71, + 0xf2, 0xfe, 0x6c, 0xca, 0xbf, 0x6f, 0xf1, 0xff, 0xaa, 0x9b, 0xd6, 0xb3, + 0xd7, 0xef, 0x8e, 0x93, 0xca, 0xbf, 0xe8, 0x83, 0x19, 0x9f, 0xdd, 0xaf, + 0x8e, 0xec, 0x17, 0xbd, 0xd7, 0xfe, 0xee, 0x6e, 0xbc, 0xd7, 0xb2, 0xfb, + 0xb5, 0x0c, 0x66, 0x3e, 0x4b, 0x4b, 0xdc, 0x1f, 0x47, 0x7b, 0xe4, 0x23, + 0xf9, 0x37, 0x45, 0x8f, 0xe2, 0x5f, 0xed, 0xa6, 0xef, 0x87, 0xd9, 0x5f, + 0x9f, 0x48, 0x5f, 0xe7, 0x0f, 0x2d, 0xd2, 0xbe, 0xf5, 0xda, 0x2f, 0x2c, + 0xbe, 0x5a, 0x01, 0xf6, 0xc9, 0x37, 0x10, 0x49, 0x1e, 0x7f, 0x65, 0xf2, + 0x29, 0x4b, 0x3e, 0x2e, 0x3c, 0x90, 0x78, 0xcf, 0x36, 0x34, 0xbf, 0x8c, + 0xf7, 0x03, 0x99, 0x27, 0xd2, 0x2f, 0x0a, 0x0f, 0x07, 0xe5, 0xde, 0x1a, + 0x7c, 0x1b, 0xe9, 0x3d, 0x87, 0x7b, 0xcf, 0x83, 0x49, 0xd9, 0xab, 0xe7, + 0x64, 0xbf, 0xad, 0xfb, 0xbc, 0x3f, 0xdb, 0xc7, 0xa8, 0x5f, 0x61, 0x48, + 0xf6, 0x5c, 0xbb, 0xcc, 0xe7, 0xe1, 0x32, 0xbf, 0x5f, 0x93, 0x5e, 0x89, + 0xf4, 0x86, 0xcb, 0x8c, 0x43, 0x03, 0x68, 0x57, 0x87, 0x67, 0xc7, 0x49, + 0x3d, 0x48, 0xf7, 0x9c, 0xbd, 0xdf, 0x24, 0xcf, 0xfd, 0x28, 0x1f, 0x52, + 0x7b, 0x8b, 0xcf, 0xdc, 0x07, 0xa5, 0xa4, 0xff, 0xef, 0x09, 0xbb, 0x8d, + 0xaa, 0x59, 0x67, 0x3d, 0x6f, 0x0f, 0xac, 0xfa, 0x6a, 0x7e, 0xb6, 0x25, + 0xef, 0xc7, 0xee, 0x29, 0x8c, 0xb7, 0x0a, 0x15, 0x8f, 0xfb, 0x86, 0x51, + 0xf9, 0xc9, 0x7b, 0x68, 0x36, 0x32, 0x2b, 0x7b, 0x73, 0x76, 0x86, 0xdc, + 0x1c, 0x9f, 0xd5, 0xf2, 0x23, 0x34, 0x30, 0xd3, 0x4b, 0xbf, 0x92, 0xbc, + 0x12, 0x15, 0x58, 0xee, 0x1d, 0xd3, 0xf5, 0xaa, 0x52, 0xfe, 0x0b, 0x5c, + 0xaf, 0x2f, 0x6f, 0x31, 0x9e, 0x81, 0xcf, 0x09, 0xfd, 0x74, 0xcf, 0xcb, + 0xbc, 0x94, 0xcd, 0x3d, 0xef, 0xa8, 0xf0, 0xf8, 0x77, 0x41, 0xca, 0x9f, + 0xfd, 0x7e, 0x6e, 0xc6, 0x63, 0xdc, 0x4d, 0xfb, 0x4f, 0xf3, 0x68, 0xef, + 0x7d, 0xea, 0x13, 0xab, 0x1f, 0x67, 0x36, 0xe8, 0xc7, 0x7f, 0xbb, 0xbd, + 0xfb, 0xd9, 0xde, 0x6f, 0x57, 0xd4, 0x3c, 0xbe, 0x03, 0x53, 0x5f, 0x8c, + 0x3b, 0x90, 0x0c, 0x00, 0x00, 0x00 }; + +static u8 bnx2_rv2p_proc2[] = { + /* Date: 03/16/2010 11:37 */ +#define RV2P_PROC2_MAX_BD_PAGE_LOC 5 +#define RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff +#define RV2P_PROC2_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xad, 0x56, 0x4d, 0x6c, 0x5b, 0x45, 0x10, 0x1e, 0x3f, 0xff, 0xdb, 0xcf, + 0x71, 0x92, 0x06, 0x3b, 0x24, 0xa5, 0x4d, 0x63, 0x6a, 0x70, 0x65, 0xd3, + 0xfc, 0xa9, 0x08, 0x89, 0x43, 0xf0, 0x21, 0x69, 0x0b, 0x12, 0x69, 0x8a, + 0x04, 0x9c, 0x20, 0x86, 0x5a, 0xb8, 0x54, 0x3d, 0x90, 0x13, 0x5c, 0x78, + 0xa2, 0xa5, 0x95, 0x90, 0x0f, 0x34, 0x22, 0x8d, 0x85, 0x90, 0x40, 0x54, + 0x5c, 0xb8, 0x19, 0x81, 0x4a, 0x39, 0x70, 0x40, 0x34, 0x42, 0xad, 0x44, + 0x85, 0xc4, 0x01, 0x0e, 0x14, 0x55, 0x85, 0x46, 0xa9, 0xc4, 0x01, 0x51, + 0x2a, 0x90, 0x50, 0xcd, 0xce, 0x7e, 0xb3, 0xf6, 0x3e, 0x27, 0x55, 0x38, + 0xe0, 0xcb, 0xe7, 0xd9, 0x9d, 0x9d, 0x9d, 0x9f, 0x6f, 0x66, 0x5f, 0x2f, + 0x11, 0x85, 0xc8, 0x6b, 0xee, 0x54, 0x48, 0xc1, 0x60, 0x20, 0xa6, 0xa0, + 0x45, 0x14, 0x1e, 0x64, 0x99, 0x1c, 0x92, 0xdf, 0x9e, 0x5e, 0x0d, 0xdf, + 0x37, 0x81, 0x57, 0xcf, 0x00, 0x0f, 0x8f, 0x00, 0x77, 0x42, 0xeb, 0x63, + 0x6f, 0xaf, 0xab, 0x20, 0x40, 0x5e, 0x81, 0xed, 0xa4, 0xe8, 0x29, 0x31, + 0x30, 0x5d, 0x84, 0xbd, 0x10, 0x31, 0xaa, 0x33, 0x1e, 0x63, 0x9f, 0xe0, + 0x23, 0x82, 0x3f, 0x0b, 0x5e, 0x15, 0xfc, 0xa9, 0x0b, 0x49, 0xf0, 0x4f, + 0xc1, 0x1f, 0x05, 0x93, 0x82, 0x7f, 0x0b, 0xce, 0x06, 0x80, 0xcf, 0x8a, + 0xfc, 0xb5, 0xe0, 0x45, 0x85, 0x26, 0x1e, 0x96, 0x6f, 0xb4, 0x3a, 0xb2, + 0x0b, 0xf3, 0x05, 0x5e, 0xbf, 0xde, 0xf2, 0xeb, 0x5d, 0x6b, 0x99, 0xfb, + 0x4d, 0x3e, 0x9c, 0x30, 0xc7, 0xbd, 0x6b, 0xea, 0xac, 0xe4, 0xe1, 0xb9, + 0x11, 0xac, 0xef, 0x28, 0x72, 0xdc, 0x11, 0xf2, 0x04, 0xa9, 0xc4, 0xe8, + 0x04, 0xbc, 0x92, 0x49, 0xa4, 0xc9, 0x1f, 0xa4, 0x85, 0x14, 0xec, 0x26, + 0x7c, 0x76, 0x33, 0x1b, 0xec, 0xfe, 0x10, 0xb7, 0xed, 0x7f, 0x22, 0xf6, + 0x13, 0x5b, 0xda, 0xaf, 0xa4, 0x80, 0xdb, 0x8a, 0x9b, 0xdd, 0x13, 0xdf, + 0xc2, 0xff, 0xa3, 0x5b, 0xda, 0x7f, 0xad, 0xcb, 0x7f, 0xda, 0x63, 0xe2, + 0x92, 0xfb, 0x83, 0xac, 0x7f, 0x8e, 0xca, 0x39, 0x2d, 0xd6, 0x5f, 0x90, + 0x04, 0xce, 0xe4, 0xd9, 0x6e, 0x3f, 0x85, 0x1c, 0xde, 0xdf, 0x11, 0x8b, + 0x5c, 0xc0, 0xfa, 0x33, 0x69, 0xe0, 0x8b, 0x62, 0xf0, 0xd7, 0x04, 0x07, + 0xde, 0x6a, 0x55, 0x93, 0x62, 0x1f, 0x65, 0x22, 0x2f, 0x89, 0xf3, 0xab, + 0x2e, 0xdf, 0xff, 0xad, 0xaa, 0x0f, 0xcb, 0x41, 0xf2, 0xd2, 0x7e, 0x3f, + 0xdf, 0x27, 0xe8, 0xf5, 0x3d, 0x80, 0xd5, 0xb7, 0xab, 0x90, 0x87, 0xcf, + 0xf5, 0x6a, 0xfd, 0x46, 0xd3, 0xf0, 0x97, 0xd7, 0x55, 0x1f, 0xa4, 0x61, + 0x87, 0x46, 0x63, 0xfa, 0x32, 0xe4, 0x41, 0x5d, 0x5a, 0x32, 0xf6, 0xf0, + 0x3b, 0xbb, 0xdb, 0xf0, 0x05, 0xf2, 0xc0, 0x04, 0x70, 0x79, 0x22, 0xcc, + 0x50, 0xac, 0x2e, 0x6a, 0xf1, 0xa1, 0xeb, 0xe3, 0x31, 0xed, 0x8b, 0x57, + 0x62, 0x3f, 0x1b, 0x1d, 0x5e, 0xe5, 0x10, 0xd7, 0x8d, 0xdd, 0xbc, 0xaf, + 0x82, 0x1b, 0x85, 0xbd, 0xf9, 0x9a, 0xcd, 0xc3, 0x25, 0x8b, 0x87, 0xac, + 0x37, 0x2d, 0xfe, 0x8c, 0x48, 0x5d, 0xb6, 0x6f, 0x52, 0x97, 0xb4, 0xfe, + 0x7f, 0xb3, 0xdc, 0xab, 0xe3, 0x79, 0x12, 0xeb, 0x4b, 0x33, 0xe7, 0x11, + 0xf7, 0x01, 0x9d, 0x6f, 0x4a, 0x9c, 0xfc, 0x0c, 0xa7, 0x16, 0x52, 0x2c, + 0x3f, 0x3d, 0x55, 0xfd, 0x02, 0xfb, 0xe1, 0x13, 0x2c, 0x3b, 0xea, 0x1c, + 0x7e, 0x07, 0x82, 0x01, 0x86, 0x7a, 0xe4, 0x04, 0xb2, 0xbf, 0xaa, 0xf7, + 0xfb, 0xe8, 0x74, 0x13, 0xfb, 0xc7, 0x93, 0x2c, 0x87, 0x69, 0xfd, 0x4b, + 0xf6, 0xf7, 0x55, 0xe5, 0xaf, 0xd6, 0x1f, 0xa8, 0x85, 0x61, 0xe7, 0xad, + 0x33, 0x6c, 0x37, 0x40, 0xeb, 0x9f, 0xb2, 0x7c, 0xb0, 0xb8, 0x8e, 0x73, + 0xc5, 0xda, 0x29, 0xb9, 0xc0, 0x41, 0x1e, 0x6e, 0x3a, 0xd0, 0x97, 0xf2, + 0x26, 0x42, 0x4e, 0x5a, 0x9f, 0x73, 0x67, 0x80, 0x6f, 0xea, 0xfd, 0x7f, + 0x02, 0x75, 0xcd, 0xd7, 0xc7, 0x7a, 0x42, 0xe7, 0xa1, 0x38, 0x9d, 0x36, + 0x71, 0x00, 0xff, 0x2b, 0x6f, 0x4e, 0xb9, 0x86, 0x2f, 0x92, 0xf7, 0xc2, + 0xdd, 0xf8, 0x02, 0x9c, 0xc9, 0x03, 0x23, 0x39, 0xc4, 0xbb, 0x91, 0x37, + 0xfe, 0x3a, 0xc8, 0x3c, 0xb4, 0x78, 0xa1, 0x41, 0xf1, 0xc1, 0xc7, 0x0f, + 0xc5, 0x23, 0xdd, 0xef, 0x2a, 0x9f, 0xa6, 0xee, 0x6c, 0x28, 0x4a, 0x2f, + 0x8b, 0xbd, 0x9a, 0xc4, 0x75, 0x4c, 0xe2, 0xfa, 0x2d, 0x61, 0xf2, 0x6e, + 0xe2, 0x01, 0x9e, 0x6e, 0xc7, 0x63, 0xe6, 0x32, 0xe6, 0xf0, 0x7c, 0xcd, + 0xe7, 0x4f, 0xfd, 0xe2, 0x28, 0xfe, 0x0c, 0xa3, 0x1f, 0x3b, 0x71, 0xe6, + 0x75, 0x3f, 0xf4, 0x64, 0x3f, 0xb7, 0xf9, 0x77, 0x5b, 0xd5, 0x13, 0x75, + 0x69, 0x34, 0xed, 0xfe, 0x18, 0xda, 0xa4, 0x3f, 0x0c, 0xcf, 0xfd, 0xf1, + 0x1f, 0x4f, 0x05, 0x19, 0xa6, 0xae, 0xac, 0x19, 0xbb, 0xf6, 0xfb, 0x11, + 0x6d, 0xf3, 0x68, 0x60, 0x9f, 0xe4, 0x49, 0x30, 0xf3, 0x30, 0xdb, 0x9b, + 0x13, 0xfb, 0x63, 0x62, 0xdf, 0x95, 0x3e, 0xda, 0xdb, 0xee, 0x0b, 0x53, + 0x97, 0x4e, 0x3f, 0x99, 0xfc, 0xe8, 0x7b, 0x8b, 0x57, 0xd6, 0xf8, 0xdc, + 0xf0, 0x5d, 0xfa, 0x2b, 0xdf, 0x35, 0xe7, 0xef, 0xdf, 0xe4, 0x3d, 0x30, + 0xfe, 0x22, 0x6e, 0xf8, 0xa3, 0xe2, 0x2f, 0xe9, 0x3a, 0x52, 0x75, 0x51, + 0xcf, 0x47, 0x32, 0x7d, 0xe8, 0x8d, 0xdb, 0xfa, 0xdd, 0xf9, 0x09, 0x89, + 0xff, 0x59, 0xeb, 0x3d, 0x61, 0xbc, 0xc7, 0xba, 0xd7, 0x97, 0x3f, 0x8f, + 0x74, 0xbe, 0xa3, 0x2a, 0xef, 0x83, 0xb8, 0x57, 0xf4, 0x12, 0x0f, 0x02, + 0x9d, 0x30, 0xef, 0xab, 0xd8, 0xa5, 0xae, 0x54, 0x40, 0xff, 0xbf, 0x74, + 0x44, 0xc7, 0xff, 0xce, 0xb1, 0xdb, 0x7a, 0x0e, 0x7c, 0xf0, 0xca, 0x05, + 0x8e, 0xe7, 0x5e, 0x5a, 0x5b, 0x74, 0xb5, 0x1f, 0xe5, 0x5d, 0x50, 0xff, + 0xeb, 0x51, 0x7f, 0x9c, 0x87, 0x47, 0xd8, 0x5e, 0x4c, 0xf2, 0xa5, 0xf4, + 0x16, 0xba, 0xdf, 0x0d, 0xe8, 0x97, 0x17, 0x30, 0x3f, 0xcb, 0x01, 0x96, + 0xef, 0xa3, 0xb5, 0x49, 0x57, 0x47, 0xd3, 0xad, 0xdf, 0x89, 0x07, 0xbc, + 0x9e, 0x4d, 0xc3, 0xbe, 0xe9, 0x3b, 0xaf, 0xdd, 0x77, 0x7c, 0xee, 0xd6, + 0x1d, 0x13, 0xdf, 0xa1, 0x49, 0xfb, 0x7c, 0x8e, 0x56, 0x9b, 0x38, 0x3f, + 0x27, 0x7d, 0xf1, 0xbc, 0x5c, 0x70, 0x2d, 0x91, 0xd6, 0xf6, 0x2a, 0x8f, + 0xeb, 0xfa, 0x53, 0x26, 0x89, 0xf8, 0x2b, 0x4f, 0x60, 0xbf, 0x92, 0xc2, + 0xfa, 0x50, 0x0a, 0xfe, 0xce, 0x45, 0x5d, 0xad, 0x3f, 0x94, 0x02, 0x66, + 0xa4, 0x7f, 0x56, 0xdb, 0xf3, 0x01, 0xd8, 0x88, 0xd8, 0xfd, 0x14, 0xa2, + 0xaf, 0x22, 0x88, 0x8f, 0x0a, 0xe8, 0x87, 0x72, 0xde, 0xd5, 0xfb, 0xf3, + 0x05, 0xcc, 0x37, 0x1a, 0xf5, 0xbf, 0x0f, 0xd2, 0x5f, 0x43, 0x9d, 0x39, + 0x62, 0xcf, 0x99, 0xf8, 0xc4, 0x4a, 0xd3, 0xff, 0x7e, 0x34, 0x22, 0x76, + 0xdf, 0xb2, 0x5d, 0x2d, 0xaa, 0x7e, 0xb5, 0xe7, 0x4c, 0x50, 0x78, 0xf0, + 0x87, 0xf4, 0xe5, 0x36, 0xfa, 0xa6, 0x89, 0xb8, 0x56, 0x9b, 0xdd, 0x75, + 0x34, 0xf7, 0x19, 0x7b, 0xf0, 0xdb, 0xc4, 0xd1, 0xb1, 0x8f, 0xfb, 0x8f, + 0x88, 0x9f, 0xbf, 0xe8, 0x77, 0x39, 0x23, 0xf1, 0xb0, 0x5d, 0xac, 0xef, + 0x97, 0xb9, 0xe7, 0xb5, 0x65, 0xff, 0xbc, 0x9a, 0xd3, 0x7e, 0xf5, 0x13, + 0xde, 0xe1, 0x4c, 0xbb, 0xdf, 0xda, 0xef, 0xe3, 0x18, 0x70, 0x79, 0xcc, + 0xd4, 0xc1, 0xd4, 0xcb, 0xd4, 0x07, 0x75, 0xcc, 0x8c, 0x6b, 0xb5, 0xa9, + 0xca, 0xb8, 0xe6, 0xef, 0x58, 0xe5, 0x77, 0xff, 0xf7, 0xc9, 0xa1, 0x22, + 0xeb, 0xbf, 0x4e, 0xdf, 0xe9, 0xbe, 0x52, 0x5f, 0x80, 0x82, 0x9d, 0xf9, + 0x20, 0x05, 0x20, 0x7b, 0xce, 0xa8, 0xfa, 0x85, 0x4d, 0x1f, 0xc9, 0xf6, + 0xa4, 0xcd, 0xbb, 0x8f, 0xee, 0x74, 0xfa, 0xcf, 0xc4, 0xc3, 0xfb, 0x25, + 0xe1, 0x5d, 0x8c, 0xca, 0xb3, 0x7c, 0x6f, 0x9a, 0x7a, 0xa2, 0xe0, 0x6f, + 0x4f, 0xd4, 0xae, 0x8b, 0xaa, 0x7f, 0x3c, 0xca, 0xe2, 0xf6, 0xfe, 0xb8, + 0xf6, 0x7b, 0xe9, 0xd2, 0x65, 0xbd, 0xfd, 0xe1, 0x4a, 0x12, 0xeb, 0xd9, + 0x32, 0xcc, 0x87, 0x34, 0x3f, 0x83, 0x74, 0x12, 0xfc, 0x7d, 0x6f, 0x19, + 0xf8, 0x2e, 0x1d, 0x84, 0x9d, 0xfe, 0x37, 0xf4, 0xfb, 0x19, 0xcb, 0x22, + 0x7d, 0xf5, 0x15, 0xe1, 0xe5, 0xa0, 0xa3, 0xbf, 0xcb, 0x5b, 0x94, 0x92, + 0xef, 0x33, 0xe9, 0x1f, 0xf0, 0x31, 0x64, 0xd5, 0x75, 0x2b, 0x7e, 0x32, + 0xba, 0x8a, 0x7f, 0x38, 0x2e, 0x3c, 0x8d, 0x75, 0xf3, 0xd4, 0xd4, 0x6d, + 0xd0, 0xd9, 0x94, 0x97, 0xfb, 0xfc, 0xbc, 0x8c, 0x08, 0x2f, 0x6f, 0xb5, + 0xe7, 0xd8, 0x46, 0xbb, 0xac, 0x9f, 0x54, 0x7c, 0xfd, 0xbf, 0x78, 0x0a, + 0xdc, 0x9f, 0xe3, 0xfb, 0xb3, 0x16, 0xdf, 0x8c, 0x5f, 0xec, 0xcf, 0x51, + 0x55, 0xd7, 0x7f, 0x01, 0xce, 0x30, 0x82, 0x1a, 0xe0, 0x0c, 0x00, 0x00, + 0x00 }; + +static u8 bnx2_TPAT_b06FwText[] = { + 0xbd, 0x58, 0x6d, 0x70, 0x5c, 0xd5, 0x79, 0x7e, 0xce, 0xbd, 0x77, 0xb5, + 0xd7, 0xd2, 0x4a, 0xba, 0xb2, 0xd6, 0x66, 0x5d, 0xdc, 0xfa, 0x1e, 0x74, + 0x57, 0x52, 0x58, 0x01, 0x77, 0x6d, 0x01, 0xeb, 0xe6, 0xb6, 0xbe, 0xc8, + 0xb2, 0xbc, 0xfe, 0x00, 0xe4, 0xc0, 0x4c, 0xe4, 0x96, 0x8e, 0x37, 0xc6, + 0x18, 0xd9, 0x90, 0xa9, 0x28, 0xfc, 0x58, 0x37, 0x4c, 0xbd, 0x95, 0x65, + 0x63, 0xc3, 0x4a, 0x6b, 0x0c, 0xb1, 0x4c, 0xda, 0x99, 0x78, 0x84, 0xb1, + 0x4c, 0x22, 0x7b, 0x0d, 0xe4, 0x07, 0x49, 0xc3, 0xa0, 0xc1, 0x0e, 0x08, + 0x06, 0xf3, 0x31, 0x6d, 0x67, 0x98, 0xe9, 0xa4, 0xf5, 0x18, 0xf3, 0x11, + 0x92, 0x18, 0x87, 0x4e, 0x3a, 0xa2, 0x10, 0x9f, 0x3e, 0x67, 0x77, 0xc5, + 0x57, 0x32, 0xd3, 0xfe, 0xaa, 0x66, 0x56, 0x7b, 0xf7, 0xec, 0xf9, 0x78, + 0xcf, 0xfb, 0x3e, 0xef, 0xf3, 0x3e, 0xef, 0x5e, 0x21, 0x50, 0x8f, 0xda, + 0x5f, 0x23, 0x5f, 0xd7, 0x7e, 0x6b, 0xe8, 0x3e, 0xff, 0x6a, 0xff, 0x6a, + 0x60, 0xf9, 0x76, 0x01, 0x44, 0xf0, 0xff, 0xf8, 0x67, 0x02, 0xce, 0x9c, + 0x1d, 0xfa, 0x05, 0xdb, 0x08, 0x0a, 0x97, 0xf7, 0x78, 0xb0, 0xcd, 0x20, + 0xee, 0xde, 0xee, 0x01, 0xe1, 0x54, 0xca, 0x5d, 0x89, 0xdf, 0xa9, 0x42, + 0xdc, 0x82, 0x1e, 0xff, 0xe3, 0xe0, 0xd3, 0x6b, 0x9e, 0xbb, 0x5e, 0x5e, + 0x3c, 0x6c, 0xc2, 0x76, 0x82, 0xbd, 0x96, 0xd3, 0x0e, 0x7b, 0x31, 0xd7, + 0xfc, 0x63, 0xc7, 0x5f, 0x08, 0x34, 0xcd, 0xed, 0xa5, 0xd4, 0x88, 0x1f, + 0xc5, 0xb0, 0x9f, 0xc0, 0xee, 0x92, 0x81, 0xd0, 0x89, 0x62, 0x97, 0x37, + 0xab, 0xb6, 0xf8, 0xd2, 0xdf, 0x0d, 0xb5, 0xe4, 0xb4, 0x2f, 0x13, 0xbd, + 0x26, 0xc2, 0xef, 0x78, 0x8b, 0xb1, 0xbb, 0x9c, 0xc0, 0x48, 0xd9, 0xc6, + 0x59, 0x73, 0x04, 0xbd, 0xe5, 0xb9, 0x75, 0x2e, 0xd7, 0x75, 0x62, 0xcf, + 0x97, 0xd7, 0xba, 0xbb, 0x91, 0x4a, 0xec, 0x81, 0x81, 0x5c, 0xdc, 0xe3, + 0xba, 0x36, 0x77, 0x0f, 0x64, 0x27, 0xf7, 0x29, 0xd4, 0x75, 0xbb, 0xdc, + 0xa3, 0xc0, 0xf5, 0xd2, 0x3d, 0x0a, 0xbd, 0x57, 0x86, 0x9f, 0xdf, 0x52, + 0xcf, 0x75, 0x2c, 0xc6, 0x33, 0xdc, 0xff, 0xe9, 0xb2, 0x83, 0x93, 0x65, + 0x0f, 0xcf, 0x97, 0x5d, 0xfc, 0xa8, 0x1c, 0xc7, 0x53, 0x65, 0x3b, 0x67, + 0x07, 0xe8, 0x8f, 0x8f, 0xee, 0x54, 0x09, 0x0f, 0x85, 0x3f, 0x0a, 0xbc, + 0x43, 0x87, 0x8c, 0x58, 0xe6, 0x6f, 0xae, 0x43, 0xff, 0xfc, 0xe3, 0x36, + 0x36, 0x94, 0x16, 0xe7, 0xa2, 0x01, 0x38, 0x47, 0xc0, 0xbf, 0xce, 0x46, + 0x3f, 0xf7, 0x28, 0x70, 0xff, 0xb0, 0x3c, 0xc2, 0x97, 0x8d, 0x77, 0x8b, + 0xb6, 0xdd, 0x3c, 0xba, 0x50, 0xcf, 0xc1, 0xaf, 0x8a, 0x17, 0xd5, 0x85, + 0xb4, 0x83, 0x57, 0x96, 0x2b, 0xd5, 0x18, 0xa0, 0xd0, 0xd0, 0x5d, 0x80, + 0x19, 0xc8, 0xec, 0x3a, 0x53, 0xa0, 0xf7, 0x2a, 0xaf, 0x73, 0x54, 0xdc, + 0x72, 0x8b, 0x11, 0xc0, 0x16, 0x81, 0x6b, 0xb5, 0x4d, 0x65, 0xb0, 0xaf, + 0xcc, 0x7b, 0xd1, 0x9e, 0x91, 0x32, 0xc2, 0xbf, 0xec, 0x30, 0x31, 0x11, + 0xc7, 0xfd, 0x6f, 0x77, 0x5b, 0xf8, 0xb8, 0x28, 0x13, 0x9d, 0xe6, 0xfd, + 0xd8, 0x59, 0xcc, 0xe3, 0x8e, 0x22, 0x0a, 0x46, 0x30, 0x84, 0x6f, 0x74, + 0x07, 0xbc, 0x67, 0x88, 0xef, 0x97, 0x61, 0xb7, 0x06, 0xa7, 0x2f, 0xbf, + 0xb7, 0x5d, 0x1e, 0x0e, 0x0d, 0x20, 0x3b, 0x06, 0xf4, 0x95, 0x04, 0x4e, + 0x65, 0x04, 0xb6, 0xf8, 0x97, 0xa1, 0xe0, 0x74, 0x63, 0x6f, 0x59, 0x66, + 0x0b, 0xfc, 0xee, 0xaa, 0x51, 0xd8, 0x8b, 0x82, 0xdb, 0xac, 0xe5, 0x25, + 0xd8, 0x2d, 0xc1, 0x80, 0x95, 0x1e, 0x6b, 0x9b, 0x3d, 0x26, 0x64, 0x7e, + 0x85, 0x29, 0x43, 0x40, 0x66, 0x3a, 0x8d, 0x54, 0x41, 0x09, 0x39, 0x74, + 0x11, 0xda, 0xa6, 0xdb, 0xac, 0x6b, 0xa6, 0xf4, 0xfb, 0x80, 0x75, 0xf5, + 0x14, 0xb0, 0x9e, 0x7b, 0x3e, 0xb4, 0x5c, 0x60, 0x7b, 0xfa, 0xd7, 0x2a, + 0x5c, 0x20, 0xc3, 0xc3, 0xa2, 0x1b, 0xa3, 0x65, 0xe0, 0xa6, 0x31, 0xd8, + 0x31, 0xce, 0x2d, 0x72, 0xef, 0x7a, 0xce, 0x5d, 0x3b, 0xda, 0x36, 0x38, + 0x23, 0x24, 0xef, 0x26, 0x07, 0x80, 0x94, 0x7f, 0x1c, 0xd2, 0x5d, 0x27, + 0xa4, 0xb3, 0xa7, 0xb6, 0x67, 0xb2, 0xb6, 0xe7, 0x15, 0x53, 0xb6, 0x58, + 0x55, 0x82, 0xe8, 0x2d, 0xc1, 0x7d, 0xd2, 0x07, 0xef, 0x12, 0xe3, 0xbd, + 0xeb, 0xe1, 0xb6, 0x48, 0xff, 0x30, 0xe7, 0x46, 0x83, 0x2e, 0xeb, 0xbd, + 0xa2, 0xc0, 0x87, 0x9e, 0x9e, 0xdf, 0xa5, 0x6d, 0x09, 0x9d, 0x20, 0x23, + 0xfa, 0xcb, 0xfb, 0xe7, 0x72, 0xc4, 0x38, 0xe9, 0xc7, 0x81, 0x85, 0x68, + 0x6e, 0xf1, 0xe6, 0xe3, 0x61, 0x07, 0x8d, 0x51, 0x6f, 0x99, 0xf1, 0x80, + 0x53, 0x87, 0x93, 0xfe, 0x6f, 0x15, 0xbe, 0xa1, 0xe7, 0x03, 0xdf, 0x7e, + 0xc4, 0x41, 0xcc, 0xbb, 0x88, 0xa3, 0xe9, 0x6d, 0xc6, 0xab, 0xce, 0x10, + 0x9a, 0xbc, 0x9f, 0x1b, 0xaf, 0x39, 0x71, 0x3c, 0xc4, 0xfb, 0xdc, 0x99, + 0x8c, 0xe3, 0x81, 0xf2, 0x57, 0xf7, 0xb5, 0x44, 0x76, 0xfc, 0x1d, 0x85, + 0x96, 0xca, 0xfa, 0xf0, 0x59, 0x7f, 0x02, 0xb8, 0x4c, 0x8f, 0xe7, 0xc5, + 0xc6, 0xd2, 0x25, 0xe5, 0x46, 0x33, 0x78, 0xa0, 0x64, 0x63, 0x1e, 0xed, + 0x8a, 0x78, 0x36, 0xde, 0x2e, 0xe6, 0xc5, 0xaa, 0x72, 0x28, 0xd6, 0x4c, + 0xf6, 0x88, 0x70, 0xd2, 0x12, 0x3d, 0xe3, 0x20, 0x36, 0x95, 0x5a, 0xe3, + 0x0b, 0xfc, 0x87, 0xff, 0xaf, 0xc6, 0xd9, 0x56, 0x19, 0xba, 0xe2, 0x92, + 0xf2, 0x92, 0x06, 0xea, 0xbd, 0x3e, 0xb1, 0x76, 0x52, 0xa9, 0xbd, 0x7e, + 0x56, 0xf4, 0x4e, 0xc2, 0x6e, 0x08, 0x02, 0xeb, 0xae, 0xd1, 0xd3, 0x46, + 0x6e, 0x41, 0x0c, 0xa5, 0x92, 0x8b, 0x53, 0xbe, 0xc6, 0xef, 0x3c, 0x58, + 0x9e, 0xe0, 0x0b, 0xb1, 0x33, 0x3e, 0xac, 0x18, 0x9f, 0xa7, 0x36, 0x58, + 0x18, 0xe9, 0x5e, 0x5b, 0x59, 0x13, 0x21, 0x56, 0x9e, 0x28, 0x66, 0x61, + 0x10, 0x7f, 0x8b, 0x82, 0xe4, 0xec, 0x04, 0x31, 0xff, 0x96, 0x9f, 0xec, + 0xfc, 0xd8, 0xb4, 0x80, 0x56, 0x99, 0xa0, 0xa1, 0xc2, 0x0a, 0x92, 0x9d, + 0x47, 0x20, 0x60, 0x7a, 0x16, 0x5e, 0xf1, 0x23, 0x08, 0x37, 0xd8, 0xd8, + 0x45, 0x5c, 0xd5, 0x71, 0xfc, 0x68, 0x65, 0x5c, 0x7f, 0x86, 0xb3, 0xaa, + 0xfc, 0xd5, 0x9c, 0xe7, 0x78, 0xa9, 0x0d, 0xb9, 0x4a, 0xde, 0xc3, 0x59, + 0xc7, 0xfb, 0x7e, 0xab, 0xc2, 0x39, 0x7f, 0xf2, 0xd9, 0xd8, 0x8d, 0xb4, + 0xd3, 0x0c, 0xbc, 0xdc, 0xe3, 0x62, 0x11, 0x0a, 0x2d, 0xa0, 0xdd, 0x06, + 0x2e, 0xa4, 0x17, 0x62, 0xba, 0x45, 0x7f, 0x1d, 0x77, 0xfa, 0xc7, 0x5b, + 0x75, 0x4c, 0xf4, 0x5e, 0xce, 0xaa, 0x71, 0xa5, 0x9e, 0xf7, 0xeb, 0x30, + 0xdb, 0x31, 0x3c, 0xc3, 0x2c, 0xf1, 0x17, 0x31, 0x27, 0x5f, 0xe2, 0xf9, + 0x2d, 0xcb, 0x4c, 0x98, 0xcb, 0x5c, 0xd3, 0x9d, 0x0f, 0x4c, 0x14, 0x35, + 0x27, 0xc8, 0xd9, 0x97, 0xf8, 0xff, 0x5c, 0x59, 0xe3, 0xd3, 0x27, 0x3e, + 0x05, 0xda, 0x3b, 0x74, 0xdc, 0x7d, 0xab, 0x9d, 0xd8, 0xdb, 0x4e, 0x7f, + 0x46, 0x98, 0x07, 0x0f, 0xd2, 0xde, 0x73, 0xc5, 0xef, 0x19, 0xab, 0x1c, + 0xe9, 0xea, 0x13, 0xde, 0x29, 0x42, 0x3c, 0xef, 0xff, 0x9d, 0xf6, 0xb1, + 0xcb, 0x6d, 0x89, 0x99, 0xfb, 0x88, 0x19, 0xcd, 0x3d, 0xeb, 0x2d, 0x67, + 0x4c, 0x0e, 0xbc, 0x4f, 0x23, 0x12, 0xc1, 0x90, 0x95, 0x28, 0xa5, 0xf6, + 0x0e, 0xf2, 0x7b, 0x3b, 0xc8, 0x5a, 0xf6, 0xa8, 0xcc, 0xf3, 0xbc, 0x9c, + 0x65, 0xc8, 0x44, 0xb3, 0x99, 0x1a, 0x1a, 0x11, 0x72, 0xb0, 0x59, 0xc8, + 0xfe, 0x7b, 0x20, 0x9d, 0x13, 0x42, 0x9f, 0xb9, 0xde, 0xea, 0xaa, 0x60, + 0x34, 0x4b, 0x8c, 0xea, 0xf7, 0xfb, 0xac, 0x54, 0xe5, 0x7d, 0xc8, 0xba, + 0x72, 0x2a, 0x81, 0xd1, 0x92, 0xf4, 0x5d, 0x11, 0xc5, 0xd7, 0xd2, 0x36, + 0x4e, 0x24, 0xd5, 0x92, 0x17, 0xd2, 0x32, 0xd7, 0x63, 0x2e, 0x66, 0x2e, + 0x24, 0x30, 0x4c, 0x2c, 0xfd, 0x43, 0x72, 0x04, 0x3d, 0x65, 0x93, 0x38, + 0x76, 0xb1, 0xbf, 0x14, 0xc5, 0x0c, 0xf9, 0xa9, 0x2e, 0xdd, 0x89, 0x91, + 0x92, 0xec, 0x7c, 0x03, 0xa9, 0xfc, 0x11, 0xc6, 0xeb, 0xec, 0x02, 0x0f, + 0xfb, 0xcb, 0x6d, 0x8c, 0x91, 0x74, 0x57, 0x91, 0xa3, 0xcc, 0x6e, 0xe9, + 0xec, 0xa2, 0x6f, 0xeb, 0x02, 0x72, 0x5b, 0x39, 0xc3, 0x7d, 0x0a, 0x58, + 0x55, 0xce, 0x8b, 0xbe, 0xf2, 0x1c, 0x4e, 0x7f, 0x4e, 0x6c, 0x6a, 0xac, + 0xda, 0xd8, 0x5c, 0x02, 0xee, 0x2c, 0xf9, 0x68, 0xf1, 0x8c, 0x17, 0xa3, + 0xb8, 0x48, 0x3f, 0x4e, 0xe0, 0x1e, 0x27, 0xc4, 0x22, 0x6f, 0x9d, 0xda, + 0x11, 0xd7, 0xf3, 0xf3, 0x62, 0x2d, 0xe3, 0x16, 0x46, 0x60, 0x4c, 0xfa, + 0x26, 0xce, 0xc6, 0x87, 0xe7, 0x47, 0x2a, 0xbc, 0xab, 0xdf, 0x4d, 0xf4, + 0xfb, 0x58, 0xe3, 0x40, 0x0e, 0xf9, 0xa2, 0x30, 0xd8, 0x44, 0x3f, 0x9c, + 0x14, 0x85, 0x81, 0x18, 0x64, 0xe1, 0x5e, 0x96, 0x17, 0x7b, 0x8c, 0x24, + 0xb1, 0x60, 0x8e, 0xa7, 0x2d, 0xfc, 0x75, 0xe9, 0x29, 0xe3, 0x5c, 0xa4, + 0x0e, 0xe6, 0x81, 0x08, 0xa2, 0x07, 0x2c, 0x34, 0x1f, 0x10, 0xc4, 0x5d, + 0xa1, 0x33, 0xaa, 0xd7, 0x21, 0x81, 0x7d, 0xa3, 0x36, 0xee, 0xe9, 0x88, + 0xe0, 0x42, 0x52, 0x0e, 0x5e, 0x21, 0x86, 0xfd, 0x26, 0x8e, 0x8d, 0x1e, + 0x97, 0xae, 0x6b, 0x14, 0x22, 0x68, 0x8a, 0x23, 0xd2, 0x5e, 0x87, 0x06, + 0xae, 0xdb, 0x59, 0x52, 0x3b, 0xed, 0xa0, 0xe0, 0x36, 0x40, 0xfa, 0x0f, + 0x73, 0xdf, 0x53, 0x45, 0xa5, 0xea, 0xaf, 0xf5, 0x66, 0x3e, 0x30, 0xe5, + 0xf4, 0x0e, 0x7e, 0x7e, 0x6b, 0xaa, 0xba, 0xff, 0xbc, 0x03, 0x36, 0x1a, + 0x0f, 0x56, 0xf6, 0x9f, 0x7d, 0x8a, 0x16, 0x7c, 0x58, 0xd2, 0xf9, 0xa4, + 0x54, 0x34, 0xf0, 0xfa, 0xdf, 0x13, 0x4a, 0xdd, 0xe4, 0xcb, 0xdc, 0xcb, + 0xa2, 0x6d, 0x60, 0x94, 0xcf, 0x83, 0xe9, 0xa4, 0x9b, 0xa5, 0xcd, 0xe7, + 0xcb, 0x51, 0xda, 0xc7, 0x5c, 0xf0, 0xb6, 0x19, 0x3b, 0x1c, 0x13, 0x75, + 0xde, 0x0e, 0x63, 0x6b, 0x05, 0xab, 0x0e, 0x16, 0x8d, 0xd5, 0x63, 0x89, + 0x17, 0x8a, 0x4d, 0xcc, 0xcd, 0x8d, 0x93, 0x16, 0xe7, 0xe9, 0xdc, 0x14, + 0x88, 0x7a, 0xbd, 0x62, 0xe5, 0x64, 0x5f, 0x25, 0x5f, 0x07, 0xc6, 0x0d, + 0xbc, 0xe9, 0xdf, 0x80, 0x48, 0x90, 0x15, 0x03, 0x93, 0x3a, 0x7f, 0xd6, + 0x8a, 0xd5, 0x93, 0x8c, 0xdf, 0x7c, 0x9d, 0x3b, 0x37, 0x88, 0x48, 0xa0, + 0xf3, 0xe5, 0xf3, 0x1c, 0xb2, 0x99, 0x43, 0xc7, 0xfe, 0x97, 0x1c, 0x7a, + 0xa8, 0x64, 0x21, 0xd7, 0x52, 0xcd, 0x97, 0x5e, 0xc6, 0xe2, 0xef, 0xad, + 0xea, 0x37, 0xdb, 0x39, 0x1e, 0x3d, 0xa0, 0x73, 0xb8, 0x97, 0x39, 0xac, + 0xf1, 0x6c, 0x89, 0x4d, 0xe3, 0xb0, 0x9b, 0x83, 0xd0, 0xfa, 0x70, 0x54, + 0xe1, 0x6d, 0x5f, 0xa9, 0x8f, 0x97, 0x69, 0x9f, 0xc8, 0xc1, 0x67, 0x89, + 0x47, 0x90, 0x90, 0xde, 0xf5, 0x94, 0x9a, 0xf1, 0x53, 0xd9, 0x67, 0xc9, + 0xcb, 0xe7, 0x84, 0xbe, 0x7f, 0x14, 0x4e, 0x5a, 0xe3, 0xb1, 0xd7, 0xba, + 0xaa, 0x82, 0xcb, 0x90, 0x78, 0x65, 0xad, 0x9e, 0xaf, 0xb1, 0x19, 0x45, + 0x43, 0x72, 0x96, 0xbe, 0x91, 0x43, 0x8d, 0x42, 0x2d, 0x79, 0x35, 0x5d, + 0xc5, 0x65, 0x91, 0xb5, 0x69, 0x3d, 0xcf, 0xea, 0x1d, 0x97, 0x85, 0xf5, + 0x66, 0xb5, 0x8e, 0xee, 0x25, 0x36, 0x34, 0xc7, 0x5d, 0xde, 0x1e, 0xc5, + 0x3e, 0x62, 0xd4, 0x4b, 0xbb, 0x18, 0x66, 0x5d, 0xdd, 0x5d, 0x92, 0xee, + 0x30, 0x71, 0xba, 0xbb, 0x86, 0xd3, 0x61, 0xd6, 0xd2, 0xdd, 0x90, 0x7b, + 0x75, 0x2d, 0x8d, 0x10, 0xa7, 0xa4, 0xb1, 0x0a, 0x4e, 0x47, 0x6a, 0x38, + 0xed, 0xad, 0xe0, 0x74, 0xb7, 0xa1, 0xf1, 0xa9, 0xb1, 0xb7, 0x89, 0xf7, + 0x3d, 0x1b, 0x85, 0xf1, 0x03, 0xee, 0x1f, 0x2e, 0x18, 0xee, 0xa9, 0x61, + 0xaf, 0x47, 0x63, 0xcf, 0x48, 0xe3, 0x1e, 0x83, 0x77, 0x7b, 0x41, 0x14, + 0x72, 0x8d, 0x90, 0xd9, 0x61, 0x51, 0xe8, 0x9c, 0x47, 0xec, 0x3d, 0xc3, + 0x19, 0x0d, 0xc4, 0x5e, 0xd5, 0x67, 0x7a, 0x7e, 0x8c, 0xd8, 0xfb, 0x4f, + 0x71, 0x36, 0xa2, 0xb9, 0x56, 0xc7, 0x16, 0x58, 0x74, 0x42, 0x73, 0x6d, + 0x94, 0x84, 0x61, 0x21, 0x5f, 0x32, 0x16, 0x27, 0xa0, 0xb0, 0x95, 0xdc, + 0xf6, 0xa6, 0x37, 0xec, 0xb7, 0xe0, 0x06, 0x9c, 0xee, 0x32, 0xa0, 0x75, + 0x88, 0x39, 0x51, 0xc5, 0xee, 0x5d, 0xe4, 0x8c, 0xa6, 0x40, 0x76, 0x9e, + 0xa5, 0xde, 0xd8, 0x92, 0x6e, 0x40, 0xc9, 0x1b, 0x0e, 0x9b, 0x59, 0x0d, + 0x6d, 0x9e, 0xbb, 0x1a, 0xba, 0x16, 0xc6, 0x61, 0xb5, 0xdb, 0x68, 0x38, + 0xea, 0xe5, 0x4e, 0x08, 0x8d, 0x57, 0xa0, 0xeb, 0xb8, 0x4d, 0xfb, 0xe1, + 0xd4, 0x07, 0x5e, 0xe6, 0x03, 0xf3, 0x71, 0x71, 0xd6, 0xa9, 0xd6, 0x83, + 0xbe, 0x71, 0x8d, 0xb1, 0x5f, 0xa9, 0x37, 0x3d, 0x03, 0x77, 0x74, 0x2b, + 0xe5, 0x2d, 0x8d, 0x22, 0x32, 0x61, 0xa3, 0xee, 0x60, 0x2b, 0x5e, 0xea, + 0x8a, 0xe0, 0xec, 0xad, 0xfa, 0xfb, 0x28, 0xea, 0x89, 0xc3, 0x4d, 0xd7, + 0x46, 0xb1, 0x64, 0xa2, 0x8a, 0xc9, 0x06, 0xef, 0x27, 0xe2, 0x2e, 0x62, + 0x72, 0x9e, 0x77, 0x46, 0x6c, 0x73, 0x32, 0xd8, 0x4b, 0x9b, 0x5e, 0x27, + 0xc7, 0x9f, 0x4f, 0xee, 0x9a, 0xb1, 0x68, 0xff, 0x8a, 0x65, 0x85, 0xce, + 0x25, 0x14, 0x75, 0x8b, 0x26, 0xe4, 0xc0, 0x31, 0x5d, 0x61, 0x46, 0x2d, + 0xb1, 0x81, 0x78, 0xd7, 0xfc, 0x6a, 0x32, 0x4e, 0x57, 0x2c, 0x6d, 0x1b, + 0xba, 0x19, 0x97, 0xd4, 0x99, 0x64, 0x32, 0x3b, 0x4a, 0xac, 0x6f, 0x3b, + 0x1e, 0x41, 0xdd, 0x81, 0xff, 0x52, 0x46, 0xc0, 0x5c, 0xe8, 0x56, 0xc4, + 0x67, 0x21, 0x53, 0x4f, 0x0e, 0xb9, 0x88, 0x38, 0x1e, 0xdb, 0xbf, 0x53, + 0x2d, 0xe1, 0xf8, 0x7b, 0xd7, 0x37, 0xa3, 0x6d, 0x99, 0xcc, 0x6f, 0xe5, + 0xfe, 0xb3, 0xe9, 0x42, 0x67, 0x82, 0xb1, 0x3b, 0x09, 0x17, 0x57, 0x8d, + 0xc9, 0xdc, 0x31, 0xd4, 0xa1, 0x79, 0xc2, 0xcb, 0x9e, 0x10, 0x31, 0x34, + 0x9e, 0x88, 0x61, 0xdf, 0x71, 0x9d, 0x9f, 0x31, 0x58, 0x63, 0xde, 0x6c, + 0x87, 0x28, 0xf4, 0x33, 0x3f, 0x67, 0xfa, 0x45, 0x3b, 0xda, 0xc7, 0xe5, + 0x74, 0x56, 0x78, 0xe1, 0x03, 0xf0, 0xd0, 0xce, 0xba, 0x6c, 0x9f, 0x70, + 0xb1, 0x42, 0xd7, 0x8f, 0xb2, 0xce, 0x1f, 0x5d, 0x4f, 0x0d, 0xde, 0x29, + 0x14, 0xeb, 0x2b, 0x35, 0xaf, 0x97, 0xaf, 0x3e, 0xd6, 0x3f, 0x4b, 0xac, + 0x1b, 0xd7, 0xb9, 0x65, 0x60, 0xc6, 0xbf, 0xa4, 0xb6, 0x27, 0xb3, 0xac, + 0x75, 0xf3, 0x98, 0x57, 0xd5, 0x7c, 0x42, 0x8b, 0xce, 0xad, 0x79, 0xb5, + 0x7c, 0xb2, 0x70, 0x86, 0xb1, 0x3b, 0xfc, 0x7f, 0xae, 0x4b, 0x16, 0x12, + 0x07, 0x0c, 0xb4, 0x74, 0x44, 0x71, 0xcd, 0xd2, 0x36, 0xa7, 0x19, 0x51, + 0xdc, 0xe4, 0x3b, 0x68, 0x22, 0x26, 0xf6, 0x33, 0xa7, 0x30, 0xbf, 0x9a, + 0x6b, 0x2b, 0x75, 0xbd, 0xaa, 0xe5, 0x5a, 0xbe, 0x94, 0x60, 0x6d, 0xd2, + 0xb5, 0xa0, 0x97, 0xb5, 0xc0, 0xc2, 0xa1, 0xb2, 0xf6, 0xad, 0x83, 0x77, + 0xc9, 0xd9, 0xaf, 0xf8, 0xda, 0xb7, 0x8b, 0x51, 0x62, 0x6e, 0x3c, 0xc8, + 0xdc, 0x58, 0x5b, 0xbe, 0xa4, 0xd6, 0x78, 0xba, 0x1e, 0x87, 0xac, 0xc7, + 0x96, 0xb8, 0x69, 0x5c, 0x0e, 0xba, 0xe2, 0xd4, 0x9d, 0xc4, 0x66, 0x67, + 0xa3, 0xa1, 0xd4, 0xcb, 0xe9, 0x54, 0x48, 0x1d, 0x93, 0xb9, 0x5b, 0x48, + 0xf7, 0x7d, 0x72, 0xd3, 0x5a, 0x33, 0x8a, 0xe5, 0xb5, 0x1c, 0x4c, 0xd6, + 0x72, 0xd0, 0x63, 0x0e, 0xba, 0xad, 0x08, 0x3f, 0xa1, 0x8d, 0x6d, 0xcc, + 0xc1, 0x6d, 0xd4, 0xa9, 0xdf, 0x2f, 0x55, 0x78, 0x3f, 0xb3, 0x42, 0xa4, + 0x66, 0xce, 0x33, 0x9f, 0xdc, 0xcb, 0x3c, 0xea, 0xb5, 0xb6, 0xcc, 0x79, + 0xc6, 0x6c, 0x75, 0x2d, 0x9f, 0x76, 0xd7, 0x78, 0xff, 0x81, 0x5a, 0x3e, + 0xad, 0xfe, 0x52, 0x3e, 0x69, 0x7e, 0x7a, 0xe1, 0x77, 0x68, 0xd5, 0x5a, + 0x24, 0x2f, 0xf4, 0xfd, 0x72, 0x16, 0xc2, 0x1f, 0xfb, 0xfa, 0x2c, 0x1b, + 0x56, 0xd0, 0x58, 0xe1, 0x1b, 0x2b, 0x08, 0x45, 0x2f, 0x6b, 0xa7, 0xed, + 0xe5, 0x45, 0x96, 0xbe, 0xd3, 0xeb, 0xd6, 0x32, 0x16, 0x3b, 0xd3, 0xbf, + 0xc0, 0xd9, 0x56, 0xa5, 0xfa, 0xd2, 0x97, 0xd4, 0x1b, 0x8c, 0x4b, 0x8c, + 0xfa, 0x63, 0xfd, 0x64, 0x56, 0xf4, 0x4f, 0x6a, 0xdf, 0x34, 0x22, 0xe2, + 0xad, 0x15, 0xab, 0x26, 0x81, 0x7b, 0xa8, 0x67, 0xce, 0xd1, 0x2f, 0x6b, + 0x7c, 0x39, 0xb4, 0x86, 0x77, 0x3b, 0xe3, 0x5b, 0x78, 0xb8, 0x5c, 0xf5, + 0xcf, 0xbe, 0xb2, 0xcc, 0x4c, 0x63, 0x04, 0x6b, 0x58, 0xd3, 0x0e, 0x93, + 0x2f, 0xfe, 0x2d, 0x19, 0xc5, 0x8b, 0xe4, 0x8b, 0x97, 0x78, 0xbf, 0x43, + 0xd5, 0xfb, 0xf9, 0xb3, 0x48, 0x65, 0x4e, 0x6b, 0xbe, 0xa0, 0xf6, 0x3e, + 0x54, 0x6e, 0xf3, 0x4f, 0x13, 0x8f, 0x0f, 0x96, 0xe4, 0x40, 0x1f, 0xef, + 0x68, 0x77, 0xcb, 0xd9, 0x41, 0x21, 0xb0, 0x31, 0x09, 0xc7, 0x0c, 0xf4, + 0x3d, 0x5c, 0x6a, 0xdc, 0x0c, 0xfd, 0x50, 0x40, 0x1f, 0xef, 0xba, 0x92, + 0x35, 0xee, 0xb1, 0xf2, 0x97, 0x74, 0x1d, 0xb6, 0x95, 0x34, 0x57, 0x29, + 0xd5, 0x91, 0xd6, 0x5a, 0x29, 0x2f, 0x6e, 0xd6, 0x9c, 0x12, 0x89, 0x42, + 0xf9, 0x6d, 0x89, 0x25, 0x8c, 0x7d, 0x9e, 0xf8, 0x7a, 0xd7, 0xab, 0x27, + 0x2f, 0x84, 0xe4, 0xf5, 0x1e, 0xf2, 0x76, 0xaf, 0xe8, 0xab, 0xf0, 0x79, + 0x56, 0x64, 0x27, 0x6d, 0xd1, 0x43, 0x8d, 0xb2, 0x81, 0x79, 0xe6, 0x2e, + 0x9c, 0x47, 0x4c, 0x69, 0x5c, 0x19, 0xf8, 0x81, 0xbf, 0x96, 0x9c, 0x7f, + 0x03, 0x7d, 0x45, 0x5e, 0xaa, 0x60, 0xf1, 0x06, 0xea, 0xa4, 0x2a, 0x16, + 0x7f, 0x48, 0x2c, 0xe6, 0x6a, 0x58, 0x8c, 0x04, 0x49, 0xf2, 0xdd, 0xe7, + 0x58, 0xec, 0xfd, 0x03, 0xfc, 0xfe, 0x45, 0xcc, 0xad, 0xd7, 0xfc, 0x1e, + 0x99, 0xc3, 0x1c, 0xeb, 0x73, 0x47, 0x40, 0x1e, 0xd6, 0x78, 0xb3, 0xd1, + 0xf7, 0x68, 0x3d, 0x36, 0x3c, 0x1a, 0xc3, 0xcd, 0x8f, 0x2a, 0xf5, 0x9a, + 0x0f, 0xaf, 0x85, 0x5c, 0xf4, 0x8b, 0xf4, 0x04, 0xce, 0xb4, 0x24, 0xdd, + 0x7d, 0xd0, 0x7d, 0x54, 0xaf, 0x75, 0x7b, 0x51, 0x6b, 0x94, 0x90, 0x1a, + 0x45, 0xf6, 0xbf, 0xcf, 0x5c, 0xdf, 0x94, 0x94, 0xf9, 0x9d, 0x15, 0xee, + 0x4f, 0xf9, 0xd4, 0xe2, 0x7b, 0x0d, 0x53, 0x66, 0xdb, 0x8d, 0x2a, 0xd6, + 0xae, 0xa9, 0x61, 0xed, 0x6b, 0x53, 0x36, 0x7e, 0xc9, 0xba, 0xb0, 0x39, + 0x1d, 0xc5, 0x6a, 0x5d, 0xe3, 0x1d, 0xdd, 0x4b, 0x45, 0xd1, 0xcf, 0xb8, + 0x18, 0x4b, 0x15, 0xf5, 0x06, 0x75, 0x07, 0x63, 0xb9, 0x8a, 0xfd, 0xd4, + 0x19, 0xea, 0x93, 0x1b, 0xcd, 0x6a, 0x2f, 0x35, 0x5a, 0xd3, 0x27, 0x37, + 0x96, 0x75, 0x3e, 0xba, 0xc4, 0x40, 0x14, 0xa7, 0xb9, 0x66, 0x8f, 0x5f, + 0xd5, 0x27, 0xaf, 0x23, 0x95, 0xd5, 0xfa, 0xc4, 0x25, 0xef, 0x97, 0x2a, + 0xfa, 0x44, 0xeb, 0x11, 0xad, 0x45, 0x74, 0xbf, 0xd0, 0xcd, 0x7e, 0x41, + 0x4e, 0x6b, 0xbd, 0x62, 0x74, 0x4b, 0xdf, 0x30, 0x23, 0xac, 0x91, 0x19, + 0xc6, 0xf2, 0x32, 0xec, 0x7a, 0xa4, 0x89, 0xb1, 0x68, 0xc4, 0x0e, 0x67, + 0x85, 0xb5, 0xc4, 0xd3, 0xfc, 0x49, 0x0d, 0xf2, 0x7b, 0xda, 0xe5, 0xa8, + 0xe6, 0x58, 0xc6, 0x7f, 0x6e, 0xfc, 0xdf, 0x6b, 0xe3, 0x7a, 0x7e, 0x96, + 0x35, 0x5a, 0xaf, 0xf9, 0x91, 0x55, 0xc5, 0x3d, 0x9a, 0x9b, 0xbc, 0x3f, + 0xc3, 0x05, 0xda, 0xf8, 0xe6, 0x97, 0xe2, 0x68, 0x33, 0x2f, 0x74, 0x1c, + 0x3f, 0xe1, 0x5a, 0x1d, 0x6f, 0x1b, 0xef, 0xd0, 0xc7, 0xe7, 0xe8, 0xe3, + 0x5f, 0x3e, 0x1a, 0x90, 0x9b, 0xf0, 0xa9, 0x41, 0x1f, 0x6f, 0x27, 0x6e, + 0x7e, 0xec, 0x5f, 0x8f, 0xf6, 0xd6, 0xa4, 0xfb, 0x81, 0x39, 0x57, 0x6f, + 0x61, 0x2f, 0xa1, 0xef, 0x14, 0xfd, 0xac, 0x7b, 0x9d, 0x63, 0xf4, 0x2f, + 0x73, 0xb9, 0xa2, 0x41, 0xda, 0xcd, 0xaa, 0x7f, 0x3b, 0x6a, 0xfe, 0xcd, + 0x4c, 0x6d, 0xe3, 0x39, 0xba, 0x9e, 0x6a, 0x3d, 0x7a, 0x7f, 0xa5, 0x5f, + 0x32, 0x83, 0x5b, 0x2b, 0xb1, 0xaa, 0x0b, 0xf2, 0xd6, 0x8b, 0x45, 0x5d, + 0xb3, 0xfb, 0x59, 0xb3, 0xd9, 0x33, 0x99, 0x72, 0x70, 0x10, 0xa9, 0x69, + 0xee, 0xb5, 0xf7, 0x34, 0x52, 0x21, 0xfb, 0xa9, 0xa1, 0xf3, 0xec, 0x7d, + 0x32, 0x86, 0xcc, 0xcd, 0x54, 0xf4, 0xe4, 0xad, 0xb5, 0x3a, 0xdd, 0x5f, + 0xd3, 0x95, 0xf7, 0xd7, 0xce, 0xc9, 0x53, 0x57, 0xce, 0x9d, 0xa3, 0xef, + 0x72, 0xb9, 0xa5, 0x9f, 0x75, 0x1f, 0xf0, 0x86, 0xff, 0x33, 0x85, 0x85, + 0x8d, 0x15, 0xdd, 0xf1, 0xf9, 0x9d, 0x2d, 0xb1, 0x71, 0xfc, 0xa2, 0xca, + 0x74, 0xdc, 0x65, 0xa2, 0x5e, 0x29, 0x6b, 0x59, 0x88, 0x62, 0x69, 0x46, + 0x15, 0xe3, 0xb2, 0xa0, 0x41, 0xd9, 0x12, 0xdc, 0xcd, 0xf8, 0xc0, 0xb6, + 0x82, 0x41, 0x6b, 0xa4, 0x28, 0x87, 0xd8, 0xcb, 0xe5, 0xd9, 0x87, 0x85, + 0xfb, 0xa1, 0xf5, 0xad, 0x3e, 0xef, 0x6e, 0xdd, 0xc7, 0xf1, 0x7d, 0x90, + 0xf6, 0xcc, 0x9d, 0x1b, 0xe2, 0xb1, 0xd2, 0x5f, 0xa9, 0xc7, 0xe2, 0x32, + 0xa7, 0xf7, 0x88, 0x70, 0xce, 0x13, 0x15, 0xfd, 0x3c, 0xa8, 0xf5, 0xb3, + 0xab, 0xf1, 0x38, 0xe6, 0xc9, 0xd9, 0x13, 0x48, 0x0d, 0x5c, 0x30, 0x65, + 0x7f, 0x8c, 0x9a, 0x79, 0x5d, 0x6d, 0xaf, 0x15, 0xb5, 0xbd, 0xda, 0xa6, + 0x1e, 0xa2, 0xdd, 0x1a, 0x8f, 0xd5, 0xfa, 0x66, 0x04, 0x31, 0x34, 0x8d, + 0x7a, 0xac, 0xf1, 0xc9, 0xdc, 0x11, 0xd6, 0x99, 0xd8, 0xf1, 0x1d, 0x15, + 0x7b, 0x5f, 0xf7, 0x9f, 0x34, 0x2b, 0xf9, 0x7d, 0x42, 0xd7, 0x09, 0x0b, + 0x16, 0xeb, 0xce, 0x95, 0x63, 0x32, 0xdc, 0x22, 0x3e, 0x52, 0x4b, 0x92, + 0x5e, 0x62, 0xb5, 0xd0, 0xda, 0x27, 0x49, 0xed, 0x13, 0x43, 0xe6, 0xc4, + 0xbf, 0xd0, 0x3e, 0xad, 0xdf, 0x74, 0x2d, 0x74, 0xd0, 0x32, 0xea, 0x75, + 0xb6, 0x19, 0x49, 0x6a, 0x67, 0x07, 0xcd, 0x9f, 0xed, 0x67, 0x89, 0x55, + 0xdc, 0xa7, 0xee, 0x80, 0x83, 0x6b, 0xc6, 0xa4, 0x73, 0x14, 0x17, 0xc8, + 0xe1, 0xde, 0xa0, 0xd6, 0x89, 0x57, 0xa7, 0x93, 0xac, 0xe9, 0x0e, 0xba, + 0x3e, 0xdb, 0x27, 0x86, 0xba, 0x31, 0x7d, 0x76, 0x61, 0xda, 0x64, 0x9c, + 0x1c, 0xf3, 0x28, 0xc7, 0x5d, 0xb4, 0x9f, 0x68, 0x64, 0xbf, 0xa5, 0x54, + 0x3f, 0xeb, 0x81, 0xc5, 0x9a, 0xdb, 0x8b, 0xf6, 0xc1, 0x11, 0x91, 0x1a, + 0x68, 0x44, 0xaa, 0x3f, 0x06, 0xcf, 0x59, 0x27, 0xf4, 0x6f, 0x0c, 0x73, + 0x9a, 0x04, 0x78, 0xbc, 0xf8, 0xe7, 0x5c, 0x97, 0x74, 0xb6, 0x10, 0x63, + 0x2d, 0x7f, 0x9a, 0xca, 0xb7, 0x20, 0x35, 0xe4, 0xc0, 0x73, 0x5f, 0xe7, + 0xbc, 0xc2, 0x17, 0xe6, 0x3d, 0x5b, 0x99, 0x47, 0x5f, 0x5c, 0xaf, 0xb5, + 0x96, 0x52, 0x4f, 0x50, 0x6f, 0x15, 0x1c, 0xcd, 0x39, 0x02, 0xc3, 0xbe, + 0xde, 0xb3, 0xc7, 0xb5, 0x20, 0x13, 0x77, 0xe0, 0x13, 0x55, 0x88, 0x87, + 0x9d, 0x91, 0xca, 0xef, 0x12, 0xd2, 0xc9, 0x91, 0xdb, 0xa6, 0xab, 0x7d, + 0x16, 0xfb, 0x22, 0xa5, 0x5e, 0x24, 0x37, 0x3d, 0x41, 0xed, 0x33, 0x3c, + 0xf5, 0x89, 0x9a, 0xa6, 0xb6, 0x19, 0xf1, 0xf4, 0xbc, 0x2a, 0x07, 0x1d, + 0x76, 0x94, 0x7a, 0x9c, 0xdf, 0xed, 0x99, 0x9a, 0xe3, 0x25, 0x9e, 0x47, + 0x4e, 0xb8, 0xdd, 0xfb, 0x6f, 0xb5, 0xf9, 0x4b, 0x73, 0x95, 0x1a, 0xa3, + 0x0d, 0x6f, 0xf9, 0xb8, 0x3f, 0x82, 0x64, 0x6e, 0x96, 0xfe, 0x39, 0xb3, + 0x5c, 0xf6, 0x4f, 0xf1, 0x9e, 0xeb, 0x85, 0xcc, 0xf2, 0x8e, 0xbd, 0xf3, + 0xa0, 0xb9, 0x56, 0x32, 0x1f, 0x0c, 0xaf, 0x8e, 0xcf, 0x3f, 0xf3, 0x65, + 0xe2, 0x08, 0xdf, 0x37, 0x67, 0xf4, 0x1e, 0x4a, 0xf5, 0xf8, 0xba, 0xc7, + 0x1f, 0x61, 0x8f, 0x5f, 0x50, 0x0d, 0xde, 0x1b, 0xea, 0xb9, 0x0e, 0xd9, + 0x3f, 0x22, 0x3c, 0xae, 0x75, 0x59, 0x17, 0x74, 0x5f, 0x35, 0xc2, 0xbe, + 0xca, 0xc5, 0xd3, 0xe4, 0x98, 0x93, 0xe5, 0x4e, 0x3c, 0x5f, 0xf6, 0xf0, + 0x0c, 0xeb, 0xc7, 0x53, 0x65, 0x0b, 0x5b, 0x1f, 0x91, 0x19, 0x4b, 0xec, + 0xc4, 0x79, 0x5f, 0x3a, 0xdf, 0xa3, 0xdd, 0x66, 0x20, 0xf7, 0xaf, 0x24, + 0xaf, 0xf0, 0x8c, 0x42, 0xce, 0x6c, 0x11, 0x76, 0x60, 0xe3, 0x3b, 0x1d, + 0x06, 0x0e, 0xc7, 0x87, 0xd0, 0xd7, 0x7e, 0x37, 0x5f, 0x16, 0x5a, 0x0f, + 0xe8, 0x5a, 0xad, 0xfb, 0x8d, 0x66, 0xdc, 0x49, 0x3e, 0xbb, 0x7a, 0x69, + 0x88, 0x5f, 0xa7, 0xdb, 0x3a, 0x5f, 0x12, 0xd4, 0x0c, 0x2d, 0x32, 0x0b, + 0xfc, 0x14, 0x1b, 0xd9, 0x2f, 0x64, 0x96, 0xed, 0xaf, 0xf5, 0xe6, 0x3f, + 0xc5, 0x4a, 0xdd, 0x67, 0xf8, 0xcd, 0xac, 0x77, 0xd5, 0x38, 0x1c, 0xae, + 0xf8, 0xd1, 0x40, 0xd3, 0xc1, 0x82, 0xaa, 0xf7, 0x64, 0x6e, 0xb2, 0xa2, + 0xa3, 0x16, 0x3a, 0x37, 0xb2, 0x0f, 0x68, 0x38, 0xe0, 0xb9, 0xeb, 0x84, + 0x62, 0x2c, 0x76, 0x33, 0x16, 0xc9, 0x30, 0xc6, 0x76, 0xbb, 0x39, 0x48, + 0x86, 0xcd, 0x22, 0x2f, 0x6e, 0xd1, 0x35, 0xb6, 0xae, 0x9e, 0xfd, 0x37, + 0x6b, 0xea, 0xa4, 0xc1, 0x7e, 0x44, 0xf7, 0xe3, 0x51, 0x4c, 0xa5, 0xdb, + 0xd8, 0x27, 0x45, 0xb1, 0x3d, 0xdd, 0x43, 0x5d, 0x63, 0xc0, 0x38, 0x78, + 0x49, 0xad, 0xfc, 0x42, 0x1f, 0xb1, 0x69, 0x5c, 0x73, 0x98, 0x2d, 0x36, + 0x32, 0x7f, 0x33, 0xcb, 0x28, 0xd6, 0x6e, 0xd1, 0x3d, 0xbc, 0xbe, 0x83, + 0xc3, 0xfe, 0xd8, 0xc0, 0xf4, 0x02, 0x07, 0xbb, 0xba, 0x65, 0xa2, 0x00, + 0x9d, 0xcb, 0x5f, 0xad, 0x29, 0x70, 0xb2, 0xbf, 0x57, 0x67, 0xe0, 0x6c, + 0xa0, 0x2d, 0xb2, 0x4e, 0xa9, 0xd6, 0xb4, 0x89, 0x5c, 0xa5, 0xde, 0x24, + 0x9c, 0x2c, 0xfb, 0xbf, 0x99, 0x29, 0xf6, 0x64, 0x07, 0x95, 0xda, 0x49, + 0x2c, 0x7d, 0xdc, 0x31, 0x7c, 0x88, 0x9d, 0xf8, 0xde, 0x56, 0xf6, 0x56, + 0x5f, 0x67, 0xfb, 0xf6, 0x56, 0xf1, 0x9b, 0xe4, 0x6f, 0xa3, 0x3b, 0x01, + 0xdd, 0xef, 0x14, 0x54, 0xc4, 0xf3, 0x66, 0x1f, 0xa7, 0x16, 0xfc, 0xcd, + 0xb2, 0x2e, 0xb8, 0xf3, 0xab, 0xbe, 0x5a, 0x4d, 0x2d, 0xf5, 0x11, 0x39, + 0x3f, 0xac, 0x7c, 0x8e, 0x39, 0xeb, 0xc6, 0x2f, 0xa9, 0xcd, 0xf4, 0x4d, + 0x4f, 0xd5, 0x2e, 0xab, 0x3e, 0x60, 0x93, 0x78, 0x2d, 0x9c, 0x35, 0x7f, + 0xc0, 0xa6, 0xcf, 0xeb, 0x5d, 0xcc, 0x59, 0x33, 0xbe, 0x98, 0x36, 0x4a, + 0x77, 0xba, 0x82, 0x1f, 0x1f, 0x1f, 0x79, 0xc3, 0x89, 0xf9, 0x28, 0x74, + 0x32, 0xc7, 0x66, 0xff, 0x89, 0x63, 0xed, 0x4b, 0x81, 0xdf, 0x94, 0xbf, + 0x4b, 0xde, 0x37, 0xba, 0x5a, 0x50, 0x98, 0xa1, 0x8d, 0x87, 0xbe, 0x4e, + 0x4c, 0xe6, 0xc7, 0x70, 0x1f, 0xdb, 0x08, 0x3c, 0xcb, 0x7a, 0x7b, 0x8c, + 0x9c, 0xd1, 0x9c, 0x76, 0x50, 0xe6, 0xf3, 0x91, 0x52, 0x72, 0xf0, 0x34, + 0xf3, 0xf6, 0x38, 0x9f, 0x8f, 0xf2, 0x9e, 0x5b, 0xa9, 0xef, 0xee, 0x1d, + 0xaf, 0xc7, 0xb7, 0xc7, 0x63, 0xd8, 0x3a, 0x1e, 0x50, 0x53, 0xe0, 0xb6, + 0x46, 0xee, 0xfb, 0x2a, 0xf1, 0xbc, 0x79, 0xe9, 0x75, 0x58, 0xeb, 0x24, + 0xdd, 0xbb, 0x99, 0x7b, 0x75, 0x07, 0xe1, 0x38, 0xc4, 0xd1, 0x3f, 0x7b, + 0xcb, 0x05, 0x9a, 0xa8, 0xf7, 0x97, 0x5a, 0x62, 0xfd, 0xf8, 0xea, 0xca, + 0xf3, 0x48, 0x3a, 0x4f, 0x6d, 0x41, 0x4c, 0x96, 0x88, 0x49, 0xc6, 0xe6, + 0xe9, 0x12, 0x71, 0x49, 0x6d, 0x78, 0xb2, 0xa4, 0xb1, 0xed, 0xe3, 0xb9, + 0x8e, 0x21, 0x55, 0xc5, 0xca, 0xa7, 0xea, 0x09, 0xef, 0xb5, 0x08, 0xea, + 0x2d, 0xfd, 0xdb, 0x0e, 0xde, 0x2c, 0x26, 0x9c, 0x0d, 0x65, 0x8d, 0x87, + 0xbf, 0xad, 0xe1, 0xe1, 0xed, 0x48, 0x55, 0x9f, 0xc8, 0x99, 0x49, 0x68, + 0xae, 0x5b, 0xec, 0xdc, 0x54, 0x1a, 0x9e, 0xa6, 0xef, 0xf3, 0xd4, 0xd8, + 0xee, 0xfb, 0x0c, 0xf9, 0xd8, 0x94, 0xd1, 0xc5, 0x9e, 0x9a, 0xfe, 0xd0, + 0x77, 0x66, 0xfe, 0xa6, 0x65, 0xa7, 0x8e, 0xc9, 0xf1, 0x22, 0x6e, 0x65, + 0xdf, 0xe3, 0x87, 0xa8, 0xde, 0x6d, 0x8a, 0x77, 0x7e, 0x88, 0x77, 0xfe, + 0x21, 0x9f, 0x27, 0x4a, 0xc9, 0x6c, 0x0f, 0xef, 0xfc, 0x24, 0x9f, 0x27, + 0x4b, 0xad, 0x75, 0xfa, 0x8c, 0xc9, 0xa9, 0x90, 0x75, 0xe0, 0x65, 0x55, + 0x8a, 0x57, 0xc2, 0xc1, 0x1e, 0xd8, 0x40, 0xc3, 0xc1, 0x39, 0x7e, 0xd6, + 0xbf, 0x2d, 0xe9, 0x1a, 0xa7, 0x39, 0x7f, 0x50, 0xd7, 0xe4, 0xcc, 0x95, + 0xe2, 0x92, 0xfa, 0xc8, 0x93, 0xe1, 0xd3, 0x38, 0xa5, 0xe6, 0x23, 0x35, + 0x33, 0x5f, 0xc8, 0xe9, 0x15, 0x86, 0x74, 0x17, 0x99, 0x55, 0xae, 0xee, + 0xac, 0x71, 0xb5, 0x37, 0x75, 0x63, 0x5d, 0xf5, 0x0e, 0x29, 0xe7, 0x08, + 0xe6, 0x11, 0xfb, 0xba, 0xa6, 0x6a, 0xfe, 0xd1, 0x9f, 0xa9, 0xef, 0xac, + 0x30, 0x61, 0xd2, 0x0f, 0xe1, 0xad, 0x7a, 0x2c, 0x5a, 0xfb, 0xcd, 0x27, + 0xe5, 0xeb, 0x5e, 0x70, 0x3a, 0xde, 0xc3, 0xef, 0x74, 0x2f, 0xf8, 0x89, + 0xca, 0xc5, 0x7b, 0x3e, 0xe3, 0xac, 0x02, 0xba, 0xa8, 0x3d, 0xde, 0x27, + 0x27, 0x74, 0x50, 0x45, 0x09, 0x9c, 0x62, 0x1f, 0x76, 0xa4, 0x2b, 0xe9, + 0xec, 0xe2, 0x7e, 0xa1, 0xe3, 0x90, 0x0b, 0x76, 0x52, 0x67, 0x72, 0x4e, + 0xb9, 0x83, 0x6b, 0x34, 0x17, 0xde, 0x47, 0xdf, 0xfc, 0xb6, 0xdd, 0xf2, + 0x7c, 0xec, 0x2a, 0x3d, 0x67, 0x58, 0x9e, 0xf6, 0x4b, 0x2a, 0xb3, 0x8b, + 0xf6, 0x9c, 0xa5, 0x3d, 0x11, 0x2f, 0x24, 0x37, 0xa6, 0x2a, 0xeb, 0x0b, + 0x96, 0xb6, 0xa3, 0x62, 0x0f, 0xc7, 0x34, 0xe7, 0xc9, 0xfe, 0x53, 0xac, + 0xb1, 0x5b, 0xa0, 0x7f, 0xa7, 0xd0, 0x36, 0xb4, 0x25, 0xb6, 0xd0, 0x9e, + 0xc3, 0xf1, 0x0a, 0x9f, 0xf2, 0x3b, 0x9e, 0x57, 0x32, 0xd6, 0xd7, 0x13, + 0xef, 0x57, 0xa4, 0x13, 0x8c, 0x6d, 0x17, 0xf5, 0x7d, 0x35, 0xce, 0xfb, + 0x2a, 0x58, 0xfe, 0x1f, 0x94, 0x22, 0x2c, 0xd9, 0x60, 0x17, 0x00, 0x00, + 0x00 }; + +static const u32 bnx2_TPAT_b06FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_TPAT_b06FwRodata[(0x0/4) + 1] = { 0x0 }; + +static struct fw_info bnx2_tpat_fw_06 = { + /* Firmware version: 5.0.0j9 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000488, + + .text_addr = 0x08000400, + .text_len = 0x175c, + .text_index = 0x0, + .gz_text = bnx2_TPAT_b06FwText, + .gz_text_len = sizeof(bnx2_TPAT_b06FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_TPAT_b06FwData, + + .sbss_addr = 0x08001b80, + .sbss_len = 0x44, + .sbss_index = 0x0, + + .bss_addr = 0x08001bc4, + .bss_len = 0x450, + .bss_index = 0x0, + + .rodata_addr = 0x00000000, + .rodata_len = 0x0, + .rodata_index = 0x0, + .rodata = bnx2_TPAT_b06FwRodata, +}; + +/* Initialized Values for the TX Patch-up Processor. */ +static const struct cpu_reg cpu_reg_tpat = { + .mode = BNX2_TPAT_CPU_MODE, + .mode_value_halt = BNX2_TPAT_CPU_MODE_SOFT_HALT, + .mode_value_sstep = BNX2_TPAT_CPU_MODE_STEP_ENA, + .state = BNX2_TPAT_CPU_STATE, + .state_value_clear = 0xffffff, + .gpr0 = BNX2_TPAT_CPU_REG_FILE, + .evmask = BNX2_TPAT_CPU_EVENT_MASK, + .pc = BNX2_TPAT_CPU_PROGRAM_COUNTER, + .inst = BNX2_TPAT_CPU_INSTRUCTION, + .bp = BNX2_TPAT_CPU_HW_BREAKPOINT, + .spad_base = BNX2_TPAT_SCRATCH, + .mips_view_base = 0x8000000, +}; + +static u8 bnx2_TXP_b06FwText[] = { + 0x9d, 0x7b, 0x0b, 0x70, 0x5b, 0xd7, 0x79, 0xe6, 0x77, 0x00, 0x90, 0x04, + 0xf8, 0x00, 0x41, 0x19, 0x92, 0xc1, 0x44, 0x89, 0x70, 0x8d, 0x0b, 0x12, + 0x32, 0x69, 0xf9, 0x82, 0xa2, 0x2c, 0xaa, 0x05, 0x2c, 0x44, 0xa2, 0x24, + 0xea, 0x65, 0xd1, 0x32, 0xd3, 0x52, 0xa9, 0x26, 0x46, 0x25, 0x5a, 0xa2, + 0x25, 0xd9, 0xa6, 0x6d, 0xb6, 0xa5, 0xba, 0x69, 0x08, 0x93, 0x94, 0x2c, + 0x5b, 0xa0, 0x2e, 0x69, 0x98, 0xa6, 0xdc, 0xed, 0xb4, 0xb4, 0x48, 0x99, + 0xb2, 0x0d, 0x0a, 0x72, 0xec, 0x64, 0x93, 0x9d, 0x78, 0x8c, 0x2a, 0x7e, + 0x28, 0xa9, 0x1f, 0x9d, 0xb6, 0xbb, 0xe3, 0x76, 0xba, 0x1b, 0xd5, 0x0f, + 0x59, 0xf6, 0xfa, 0xd5, 0x4e, 0x76, 0x97, 0x4e, 0x6d, 0xdd, 0xfd, 0xfe, + 0x0b, 0x40, 0x52, 0xd2, 0xec, 0xce, 0x4e, 0x39, 0xc3, 0x01, 0x71, 0x1f, + 0xff, 0xf9, 0xcf, 0xff, 0xf8, 0xfe, 0xef, 0x3f, 0xe7, 0xf0, 0x7a, 0xa0, + 0x12, 0xc5, 0x9f, 0x1a, 0xfe, 0xae, 0xe8, 0x1b, 0xe8, 0x37, 0x96, 0x19, + 0xcb, 0x80, 0x55, 0xfb, 0xf8, 0xb5, 0x4c, 0x6e, 0xde, 0xa4, 0x80, 0xe4, + 0x87, 0xf8, 0x77, 0xfd, 0x2c, 0xfa, 0xf7, 0xbd, 0x86, 0x23, 0xd7, 0x14, + 0x3e, 0xff, 0xb1, 0xec, 0xca, 0x35, 0x27, 0xe0, 0x2b, 0xe9, 0x29, 0xbf, + 0x70, 0x3b, 0x62, 0x88, 0xad, 0xd1, 0xe1, 0x76, 0xc6, 0x9e, 0x8f, 0xef, + 0xd6, 0x81, 0x44, 0xb6, 0x29, 0xb8, 0x16, 0x5f, 0x5a, 0x29, 0xbf, 0x0b, + 0x72, 0xfd, 0x6b, 0xb1, 0x2f, 0x06, 0x5f, 0x58, 0xa9, 0x7d, 0x36, 0xe5, + 0x84, 0xdb, 0x17, 0x3b, 0x05, 0x5f, 0x03, 0xdc, 0x8b, 0xf9, 0xce, 0x9f, + 0x35, 0xfe, 0x67, 0x07, 0xbc, 0x25, 0x59, 0x6d, 0x18, 0x36, 0x91, 0x72, + 0xc7, 0xfa, 0x50, 0xb1, 0x02, 0x78, 0x2f, 0x1d, 0x36, 0x86, 0x81, 0x31, + 0x47, 0x2c, 0x1c, 0x3c, 0x0b, 0x03, 0x87, 0x72, 0x41, 0xb4, 0xf3, 0x77, + 0xa3, 0x79, 0xc9, 0x0a, 0x96, 0x21, 0xe5, 0xe4, 0x73, 0xbb, 0x5a, 0x81, + 0x75, 0x69, 0x03, 0x87, 0x4d, 0xb8, 0xeb, 0x63, 0xdf, 0xc1, 0x2a, 0x7e, + 0x7a, 0x63, 0x03, 0x78, 0x63, 0x34, 0x14, 0x7c, 0x12, 0x5a, 0xb7, 0xee, + 0xd4, 0x06, 0x80, 0xa6, 0xde, 0x1e, 0xa5, 0x25, 0xdf, 0x54, 0x5a, 0xe7, + 0xa8, 0x82, 0x5b, 0xf1, 0xb9, 0xa6, 0xac, 0x7c, 0x0e, 0xe0, 0xfa, 0xac, + 0x1b, 0xe7, 0x9d, 0x32, 0xfe, 0x37, 0x68, 0x7f, 0x05, 0x97, 0xde, 0x86, + 0x11, 0xea, 0x50, 0x16, 0x53, 0x38, 0xd1, 0x1a, 0x0e, 0x0c, 0x41, 0xee, + 0x07, 0xb1, 0x36, 0x27, 0x9f, 0x1a, 0x67, 0x6d, 0x59, 0x23, 0x86, 0x65, + 0x9d, 0x34, 0x2a, 0x90, 0xf2, 0x69, 0x01, 0x40, 0x61, 0xc8, 0x70, 0x20, + 0xe1, 0x5b, 0x13, 0x74, 0x41, 0x0b, 0xdc, 0x81, 0x7f, 0xe5, 0x9c, 0x13, + 0x91, 0x32, 0x14, 0x9e, 0x4f, 0xa2, 0x02, 0x79, 0x5f, 0xc1, 0x6a, 0x27, + 0xd2, 0x96, 0xf5, 0x8a, 0xee, 0xc2, 0x49, 0xda, 0x67, 0x28, 0xfb, 0xaf, + 0x56, 0x9e, 0xb6, 0x19, 0xd1, 0x4b, 0xe3, 0xbb, 0x31, 0xe5, 0xb3, 0xac, + 0x69, 0xde, 0x3b, 0x9c, 0x2d, 0xd9, 0xd9, 0xb2, 0x1c, 0xba, 0x65, 0xed, + 0xd6, 0x7f, 0x69, 0xed, 0xfa, 0x95, 0x67, 0x2d, 0xeb, 0x61, 0xe3, 0x1a, + 0x9c, 0xca, 0xb4, 0xab, 0x4d, 0xb3, 0x8b, 0xbc, 0x1b, 0x27, 0x2d, 0xbc, + 0x62, 0xc0, 0xe7, 0x88, 0xad, 0x57, 0x1b, 0x67, 0x3b, 0xd4, 0xba, 0xdc, + 0x76, 0xb5, 0x7e, 0xfa, 0x5b, 0xaa, 0x63, 0x36, 0xa9, 0x36, 0xe4, 0x02, + 0x98, 0x31, 0xfd, 0x98, 0x36, 0xbb, 0x55, 0xfb, 0x6c, 0x97, 0x2a, 0xcc, + 0x63, 0x40, 0xad, 0xc9, 0x95, 0x64, 0x5d, 0xb1, 0xe3, 0xc6, 0x34, 0xbd, + 0x6d, 0x56, 0x70, 0x9c, 0x79, 0xeb, 0x85, 0xc6, 0x79, 0xce, 0xd3, 0xc0, + 0x43, 0xb9, 0x87, 0xb1, 0x75, 0xd2, 0xb2, 0xb2, 0x51, 0x20, 0x9b, 0x03, + 0x9e, 0x31, 0x43, 0x9d, 0xbd, 0xca, 0xb2, 0x36, 0x84, 0xad, 0x25, 0x17, + 0x8c, 0xa6, 0xc8, 0x4b, 0xf8, 0xdf, 0xd6, 0x94, 0x1f, 0xa9, 0x6a, 0xca, + 0x38, 0x4a, 0x9f, 0xed, 0x1b, 0x85, 0xbb, 0x22, 0x36, 0x82, 0xf7, 0xd3, + 0x70, 0x97, 0xc7, 0x52, 0x78, 0x25, 0x3d, 0xe4, 0x73, 0x23, 0x14, 0xd8, + 0xa8, 0x52, 0x03, 0x0e, 0x68, 0x7d, 0xef, 0x40, 0x0b, 0xd2, 0x1f, 0xe7, + 0x7e, 0xa2, 0xb4, 0xfc, 0x4b, 0xd0, 0x12, 0xbf, 0x54, 0x5a, 0x47, 0xbd, + 0x13, 0x09, 0x47, 0xd8, 0x8d, 0x17, 0x1a, 0xc5, 0x27, 0x23, 0x58, 0x66, + 0xfb, 0x26, 0x85, 0xa5, 0x97, 0x7d, 0x43, 0x7b, 0x51, 0xaf, 0xc3, 0xd4, + 0xeb, 0x65, 0x43, 0x0b, 0x9c, 0x80, 0xb5, 0xa4, 0xc7, 0x28, 0xdc, 0x1b, + 0xc9, 0xb5, 0xe1, 0x41, 0x33, 0x81, 0x87, 0xcd, 0x1f, 0x52, 0xe7, 0x76, + 0xc6, 0x41, 0x02, 0x3f, 0xc8, 0xb5, 0xe3, 0xc5, 0x5c, 0x0c, 0xdf, 0xe7, + 0xbd, 0xe7, 0x73, 0xad, 0x78, 0x2e, 0x67, 0xe0, 0x7b, 0xb9, 0x66, 0x3c, + 0x9b, 0x8b, 0xe0, 0x4c, 0xce, 0xa5, 0xd6, 0x99, 0x59, 0x6c, 0x1c, 0x4d, + 0x61, 0x03, 0x63, 0xe9, 0x5c, 0x3a, 0xd4, 0xf6, 0x14, 0xb4, 0x33, 0x0c, + 0x68, 0x6f, 0x47, 0xce, 0xe7, 0x6d, 0x37, 0xb5, 0x0e, 0xc0, 0xef, 0x6d, + 0xcf, 0xe9, 0x38, 0x9b, 0x0e, 0x78, 0xd7, 0xe4, 0x02, 0xde, 0xb5, 0xe6, + 0x62, 0xef, 0xda, 0x5c, 0x58, 0x9d, 0xf7, 0x29, 0x84, 0x6e, 0x70, 0x63, + 0x7f, 0xe6, 0xef, 0x90, 0xac, 0x13, 0xad, 0x7c, 0xb8, 0x9b, 0xb6, 0x79, + 0x3d, 0xda, 0x94, 0xfc, 0x18, 0x6f, 0x22, 0xb5, 0xb0, 0x70, 0xad, 0x8f, + 0xd7, 0x6a, 0x5b, 0xe0, 0xdd, 0x46, 0x7b, 0x6d, 0x37, 0xdd, 0xb8, 0xb5, + 0xe5, 0x4b, 0x2b, 0xb8, 0xc0, 0xf6, 0xb1, 0xb7, 0x6b, 0xd2, 0xe5, 0x5d, + 0x6f, 0x5a, 0xd6, 0xa1, 0x16, 0x85, 0xe7, 0x8c, 0x16, 0x95, 0x5c, 0x50, + 0x8a, 0xfd, 0xc4, 0xd4, 0x0f, 0x8d, 0x04, 0x16, 0xea, 0x79, 0x2c, 0xbc, + 0x06, 0x53, 0x4f, 0x19, 0x37, 0xa8, 0x60, 0x5d, 0x21, 0x2e, 0x06, 0x33, + 0x9c, 0xeb, 0x35, 0x05, 0xd9, 0xbb, 0x29, 0x7b, 0xbf, 0xd1, 0x94, 0xf8, + 0x2b, 0xc9, 0xc1, 0xba, 0x04, 0xb2, 0x46, 0x48, 0xa5, 0xec, 0xe7, 0x62, + 0x38, 0x34, 0xdb, 0x8a, 0xc3, 0xf4, 0xeb, 0x9e, 0x8c, 0x16, 0x39, 0x8f, + 0x20, 0x66, 0x73, 0xba, 0xca, 0xfb, 0x83, 0x78, 0xae, 0xb1, 0x1a, 0x49, + 0xda, 0x63, 0x68, 0x12, 0x89, 0x0d, 0x8c, 0xd5, 0xf3, 0xfe, 0x45, 0x70, + 0xea, 0x5e, 0xfe, 0x56, 0x24, 0xea, 0xf5, 0x4a, 0xec, 0x9e, 0xf6, 0xe3, + 0x60, 0xee, 0x66, 0x3c, 0x9c, 0xf1, 0xa3, 0x9f, 0x76, 0xee, 0x8e, 0x26, + 0x9e, 0x0e, 0x20, 0x3c, 0x36, 0xe1, 0xf0, 0xe3, 0x3e, 0xbe, 0x37, 0x32, + 0xe9, 0x47, 0x9f, 0xe9, 0xc3, 0xb8, 0x11, 0x1e, 0xa8, 0xe3, 0xb5, 0x7b, + 0x78, 0xed, 0xd8, 0xa4, 0x1b, 0xaf, 0x47, 0x37, 0xa8, 0xa9, 0x3a, 0x2d, + 0x42, 0x7b, 0x61, 0xaf, 0x29, 0xf1, 0x87, 0x07, 0xaa, 0x63, 0xe1, 0xc8, + 0xdb, 0xfc, 0x7e, 0x47, 0xae, 0xd2, 0xbb, 0x7e, 0xd2, 0x0b, 0xb7, 0xfe, + 0x85, 0x55, 0xd6, 0x6a, 0x59, 0x3f, 0x31, 0xc2, 0xdd, 0x07, 0xe0, 0xc2, + 0xfe, 0x9c, 0x03, 0xbd, 0xd3, 0x95, 0x9c, 0x93, 0x0b, 0x1f, 0x34, 0x56, + 0xe2, 0xce, 0xe9, 0x18, 0x0e, 0x4f, 0x52, 0x87, 0x0c, 0x96, 0xbc, 0x66, + 0x0c, 0xef, 0xa8, 0x66, 0x4c, 0xec, 0x56, 0x11, 0x2c, 0x09, 0x7b, 0x30, + 0x38, 0x5d, 0xcd, 0xd8, 0xf6, 0xe1, 0xce, 0x59, 0x0f, 0x0e, 0x66, 0x1c, + 0xb8, 0xbe, 0x51, 0x74, 0x0b, 0x9d, 0x0a, 0x30, 0xa7, 0x9e, 0x6d, 0xa9, + 0xc2, 0xbd, 0xd3, 0x1e, 0xf4, 0x67, 0x7c, 0xe8, 0x99, 0x6c, 0xc5, 0xb8, + 0x19, 0x83, 0xc9, 0x3c, 0x78, 0xa4, 0x45, 0x4b, 0xb5, 0x3b, 0xb4, 0xbe, + 0x32, 0x47, 0x02, 0x1f, 0x47, 0xcb, 0x30, 0x55, 0x67, 0x59, 0x2f, 0x45, + 0x9b, 0x22, 0xe3, 0x8c, 0xf3, 0x05, 0x31, 0x3f, 0x73, 0x4c, 0x9b, 0x62, + 0xfc, 0xb5, 0xe9, 0x8e, 0xaf, 0xaa, 0xf3, 0xb4, 0xcd, 0x49, 0xd3, 0xef, + 0xdd, 0x6a, 0xfa, 0xbc, 0x5b, 0x73, 0x8b, 0xbd, 0x6b, 0x4c, 0xf1, 0x37, + 0xe8, 0x7b, 0x60, 0x1b, 0xfd, 0xf6, 0x49, 0xf4, 0x4b, 0x2b, 0x5f, 0x57, + 0xf2, 0x9b, 0x76, 0x24, 0x05, 0x6d, 0x4c, 0xec, 0xfc, 0xe8, 0xac, 0xcb, + 0xdb, 0x69, 0x2a, 0xf8, 0xf5, 0x56, 0x8c, 0xe5, 0x64, 0x7c, 0xcb, 0x9a, + 0x30, 0x80, 0xde, 0x63, 0xa1, 0xf9, 0x3a, 0xe5, 0xc1, 0xf9, 0x6b, 0x81, + 0xc1, 0xd3, 0xb4, 0x81, 0xd9, 0x8e, 0xa3, 0x8c, 0xc7, 0x27, 0x5b, 0xfd, + 0xd8, 0xc3, 0xd8, 0xda, 0x62, 0x06, 0x71, 0x60, 0x4e, 0xe2, 0x49, 0xc7, + 0xee, 0x39, 0x37, 0xf6, 0x66, 0xfe, 0x86, 0xbe, 0x10, 0xf9, 0x7f, 0x0e, + 0x78, 0x7d, 0xc4, 0x9e, 0x0e, 0x3c, 0x64, 0xa2, 0xc5, 0x1d, 0xd3, 0x22, + 0x09, 0x58, 0x68, 0x88, 0xe2, 0x8b, 0x72, 0x84, 0x3b, 0x2f, 0x3a, 0x15, + 0x56, 0x85, 0x3b, 0xf0, 0x38, 0xf5, 0xda, 0x94, 0xf5, 0x60, 0x20, 0x53, + 0x89, 0xbe, 0x8c, 0x05, 0xd7, 0x72, 0xf4, 0xbb, 0xf8, 0x5c, 0x6d, 0x4b, + 0xb8, 0xf7, 0x4d, 0xe5, 0xc2, 0xd6, 0x6c, 0x07, 0xf3, 0xe4, 0x43, 0x24, + 0xca, 0xdd, 0x38, 0x91, 0xad, 0xc6, 0x54, 0x36, 0x86, 0x61, 0xfa, 0x69, + 0x3f, 0x7d, 0x9e, 0x5c, 0x58, 0x8e, 0x48, 0x83, 0x83, 0xbf, 0x7e, 0xef, + 0x2d, 0x93, 0x8b, 0xbd, 0xeb, 0x4c, 0x17, 0x7d, 0xe6, 0xc0, 0x5d, 0x19, + 0xb1, 0x8f, 0x85, 0x13, 0x51, 0x1f, 0x4e, 0xe4, 0xfc, 0x38, 0x60, 0x06, + 0x70, 0x2a, 0x77, 0x94, 0xfa, 0xf8, 0x99, 0xef, 0xa2, 0xd3, 0xab, 0x28, + 0xe0, 0x33, 0x70, 0xdf, 0xb1, 0x32, 0x24, 0xec, 0x32, 0xe2, 0x47, 0x8f, + 0xf9, 0xa2, 0x55, 0xa6, 0xeb, 0xc7, 0x0f, 0xf1, 0xef, 0xfb, 0x73, 0xd5, + 0x38, 0x68, 0x6a, 0x6d, 0x2b, 0x9c, 0xd5, 0xd8, 0xcb, 0xf8, 0xfb, 0x03, + 0xc6, 0xeb, 0x94, 0xfd, 0x5c, 0x39, 0x8d, 0x5e, 0x78, 0x7e, 0xd0, 0xb4, + 0x3e, 0xad, 0x8a, 0x5d, 0xb2, 0x7a, 0x57, 0xe8, 0x1d, 0x17, 0x9d, 0x7e, + 0xdc, 0xc9, 0xe7, 0xfa, 0xa7, 0xc5, 0xfe, 0xeb, 0x1d, 0xa8, 0xd4, 0x82, + 0x41, 0x56, 0x81, 0x0d, 0xb9, 0xff, 0x59, 0xac, 0x81, 0x03, 0x6a, 0x87, + 0x60, 0x7c, 0x05, 0xdc, 0x4b, 0x88, 0x87, 0x23, 0xe6, 0x80, 0xba, 0x9d, + 0x38, 0xb4, 0x99, 0x76, 0xde, 0x17, 0x0d, 0x75, 0xb4, 0x13, 0x7f, 0x22, + 0xc4, 0x1f, 0x47, 0xd4, 0x8d, 0xb5, 0xcd, 0x9f, 0x5b, 0x49, 0xdb, 0x86, + 0x1d, 0x38, 0x66, 0xb6, 0x61, 0x94, 0xf9, 0x9b, 0x27, 0xc6, 0xb4, 0xd3, + 0x66, 0xaf, 0x84, 0x51, 0x5b, 0x4d, 0x9b, 0x1e, 0xce, 0x85, 0xda, 0x3e, + 0x60, 0x82, 0x1d, 0xd6, 0x2d, 0xfc, 0x8c, 0x31, 0x91, 0xad, 0x63, 0x11, + 0xd0, 0x6f, 0xc6, 0x78, 0xa6, 0x02, 0x46, 0x4b, 0xe2, 0x8f, 0x7d, 0xc4, + 0xf0, 0x8b, 0x2b, 0x90, 0xe5, 0xd0, 0x2a, 0x10, 0x0b, 0x4f, 0xfd, 0x90, + 0x70, 0xfe, 0x28, 0x6d, 0x99, 0x31, 0x6f, 0xc2, 0xf7, 0x88, 0x33, 0x33, + 0x86, 0x0b, 0x7f, 0x9b, 0x9d, 0x24, 0xde, 0x87, 0x8d, 0x05, 0xaa, 0x92, + 0xf6, 0x03, 0xc7, 0xc1, 0x03, 0x8e, 0x98, 0x65, 0xbd, 0x46, 0x1d, 0x9e, + 0x09, 0x87, 0x13, 0x43, 0x0a, 0x3e, 0x67, 0xcc, 0x5a, 0x72, 0x47, 0xb4, + 0x9c, 0xbe, 0xf2, 0x62, 0x89, 0x9e, 0x54, 0x1d, 0xb9, 0xb0, 0xf1, 0x13, + 0x7c, 0x4b, 0xdd, 0x3e, 0x0b, 0xd6, 0xae, 0x6e, 0xb5, 0x63, 0xb6, 0x92, + 0xfe, 0x6e, 0xa3, 0x5c, 0xd4, 0x2e, 0xd0, 0x1d, 0xb8, 0x6f, 0xbb, 0xc2, + 0x22, 0x3d, 0x81, 0x57, 0x5a, 0x7d, 0xde, 0x6e, 0xc6, 0xca, 0xa3, 0x8c, + 0x8f, 0xe3, 0xa7, 0x03, 0xde, 0x6f, 0x32, 0x3e, 0x26, 0x4e, 0xfb, 0xe9, + 0xa3, 0x76, 0x62, 0xf9, 0x62, 0xef, 0x0e, 0xb3, 0x43, 0xed, 0x20, 0xa6, + 0x6f, 0x9a, 0x86, 0xaf, 0x32, 0xd6, 0xa5, 0xd6, 0xe7, 0x06, 0xd4, 0xa6, + 0xdc, 0x7f, 0xbb, 0x74, 0xde, 0x2f, 0x78, 0x14, 0x9e, 0xfa, 0x43, 0x5c, + 0x4b, 0x3b, 0x13, 0xf3, 0x4c, 0xbb, 0x76, 0xd5, 0x2e, 0xd2, 0x47, 0xf0, + 0x98, 0xaf, 0x60, 0xc7, 0x75, 0xb4, 0xe3, 0x94, 0x0b, 0xb5, 0x0b, 0xf5, + 0xbb, 0x31, 0x61, 0x5f, 0xf3, 0x7b, 0x37, 0x98, 0x09, 0x87, 0x43, 0x87, + 0x6f, 0x49, 0xac, 0x9d, 0xf5, 0x61, 0x31, 0x31, 0xaf, 0x43, 0xb5, 0x53, + 0x7e, 0x82, 0x35, 0x23, 0xc1, 0x9a, 0x91, 0xa0, 0xae, 0x09, 0xd6, 0x8a, + 0x35, 0x39, 0xb1, 0xbb, 0xc8, 0x25, 0xa6, 0x32, 0xbf, 0xbe, 0x4f, 0xf9, + 0xcf, 0x9b, 0xc4, 0x53, 0x93, 0x78, 0x6a, 0x12, 0x4f, 0x4d, 0xe2, 0xa9, + 0x29, 0x38, 0xdc, 0x41, 0xec, 0xfe, 0xeb, 0x4b, 0x79, 0xbf, 0x60, 0x98, + 0x9f, 0x79, 0xd4, 0x4e, 0x3d, 0x04, 0x47, 0x83, 0xac, 0x73, 0x8b, 0xbd, + 0xb7, 0x72, 0x3e, 0xe3, 0x59, 0xaf, 0x43, 0xea, 0x6b, 0xe8, 0x86, 0x42, + 0xae, 0x3e, 0x3c, 0x29, 0xf9, 0xa8, 0x9d, 0x0a, 0x32, 0x4f, 0xbb, 0xa3, + 0x86, 0x85, 0x6b, 0x25, 0x2f, 0x99, 0xeb, 0xcc, 0xe5, 0x47, 0x88, 0x8f, + 0xab, 0xa2, 0x2b, 0xd0, 0x72, 0x8d, 0xd4, 0x0a, 0xad, 0x23, 0x85, 0xa9, + 0x4b, 0x29, 0xbf, 0xd6, 0x36, 0x85, 0x92, 0xec, 0xdf, 0x24, 0xd7, 0x83, + 0x7d, 0x99, 0x2a, 0xe6, 0x86, 0x85, 0x4e, 0xc6, 0x73, 0xed, 0x72, 0xad, + 0xaf, 0xd6, 0x51, 0x89, 0xb3, 0x61, 0xcb, 0xea, 0x34, 0x24, 0xbf, 0x28, + 0xcb, 0xd1, 0x21, 0x3c, 0xe1, 0x1b, 0x4b, 0x58, 0xdb, 0x5f, 0x67, 0x5c, + 0x8c, 0xe6, 0x3c, 0x38, 0x90, 0xb1, 0x6b, 0x67, 0x7b, 0x39, 0xf3, 0x68, + 0x38, 0xea, 0xc0, 0x7e, 0x3d, 0xdc, 0x51, 0xa5, 0xc2, 0xe7, 0x56, 0x93, + 0x69, 0xed, 0x60, 0x0e, 0xed, 0x25, 0x3e, 0xb4, 0x4f, 0x86, 0x23, 0xff, + 0x42, 0xec, 0x5a, 0x97, 0xbd, 0x92, 0x37, 0xfb, 0x32, 0x36, 0x0f, 0xa0, + 0xee, 0x3e, 0xfc, 0x90, 0x79, 0x73, 0x0f, 0xf3, 0xe6, 0xd9, 0x62, 0xde, + 0xe4, 0x72, 0x4f, 0x2a, 0x89, 0x69, 0x38, 0x5c, 0xc4, 0xdd, 0x9b, 0xf9, + 0x37, 0xf3, 0x6f, 0xba, 0x10, 0xe7, 0xb0, 0x31, 0xa4, 0x4f, 0x89, 0xce, + 0x7e, 0x5d, 0x6c, 0x30, 0xc1, 0xbf, 0xab, 0xf1, 0x3d, 0xd6, 0xfc, 0x71, + 0xca, 0xd5, 0xc3, 0x52, 0xa7, 0xdd, 0x30, 0x1a, 0xac, 0x25, 0xb5, 0x2d, + 0x9f, 0x2b, 0xc9, 0x07, 0x33, 0xb7, 0x85, 0x3e, 0x69, 0x46, 0xa1, 0x1e, + 0xf8, 0x18, 0x0f, 0xed, 0x8c, 0x07, 0xc1, 0x91, 0x04, 0x0a, 0x7e, 0xec, + 0x60, 0x5d, 0xff, 0xbf, 0xf9, 0xaf, 0x91, 0xe3, 0x8a, 0x0f, 0xcb, 0x8b, + 0xef, 0xbb, 0x89, 0xcb, 0x09, 0xbc, 0x46, 0x4c, 0x28, 0xd4, 0xab, 0x1a, + 0x3b, 0x4e, 0xb6, 0x4a, 0x9c, 0x94, 0x15, 0xe4, 0xdf, 0x36, 0x89, 0xb2, + 0x05, 0x31, 0x04, 0xbd, 0xe4, 0x1e, 0xfb, 0x5a, 0xc2, 0xf9, 0xed, 0x6a, + 0x8b, 0xea, 0xce, 0xf9, 0xbd, 0xdb, 0x6c, 0x8c, 0x6f, 0x57, 0xdb, 0x18, + 0x33, 0x9d, 0x8c, 0x99, 0x4e, 0x7b, 0x4c, 0x89, 0xb9, 0x5f, 0x1d, 0xf7, + 0x96, 0xdc, 0x42, 0x8e, 0x29, 0x1c, 0xc3, 0xef, 0xdd, 0x48, 0x5d, 0x37, + 0xf2, 0xf9, 0xb5, 0xe6, 0x31, 0x5e, 0x13, 0x7d, 0xad, 0xa0, 0x37, 0x76, + 0x9e, 0xb5, 0x1a, 0xa9, 0xaf, 0xc4, 0xdc, 0xa9, 0xda, 0xd8, 0x97, 0xd6, + 0xeb, 0x2b, 0x16, 0xb3, 0x5e, 0x07, 0x58, 0xa3, 0xfd, 0xb4, 0xa1, 0x8f, + 0x35, 0x3a, 0xc1, 0x39, 0x83, 0x98, 0xfc, 0x9b, 0xf8, 0xa8, 0x85, 0x6a, + 0xbe, 0x43, 0xae, 0xe1, 0xdd, 0x9c, 0x73, 0x25, 0xcb, 0x63, 0xe8, 0xfc, + 0x69, 0x7a, 0xd0, 0xaa, 0xd4, 0x59, 0x92, 0x63, 0x7a, 0xe2, 0x7a, 0x55, + 0xdd, 0x46, 0xee, 0xd8, 0xf9, 0x6a, 0xb6, 0xcd, 0xa5, 0x1f, 0xf3, 0xa0, + 0x8c, 0x9c, 0x69, 0x5d, 0xce, 0xb2, 0x86, 0x8d, 0x7b, 0x6f, 0xdc, 0xd5, + 0xf6, 0x5c, 0xbe, 0x93, 0x7e, 0x4f, 0xe5, 0x7a, 0x6d, 0x4c, 0x4b, 0xe5, + 0xe8, 0xe4, 0xed, 0xcd, 0xed, 0xc1, 0xd3, 0x2b, 0x5c, 0xfc, 0x9e, 0xaa, + 0x8b, 0xfd, 0x9d, 0x17, 0xde, 0x3e, 0x18, 0x37, 0x09, 0x9f, 0x80, 0x7b, + 0x41, 0xac, 0x37, 0xb6, 0xbd, 0x41, 0x3b, 0x02, 0x07, 0xad, 0x76, 0x0c, + 0xb8, 0x9d, 0x98, 0xff, 0xf9, 0x6f, 0x2b, 0xb4, 0x2d, 0x27, 0xc0, 0x5f, + 0x63, 0xe0, 0x48, 0x4e, 0xeb, 0x20, 0x6e, 0xa1, 0x91, 0x9c, 0xa7, 0x36, + 0x76, 0x00, 0x9f, 0xf2, 0xb3, 0x3a, 0xd6, 0x8b, 0xf4, 0x68, 0x28, 0x7f, + 0x11, 0x5a, 0x64, 0x5e, 0x69, 0x1c, 0xa8, 0xc9, 0xf8, 0x21, 0x79, 0xe8, + 0xa8, 0xd2, 0x12, 0x7b, 0x6c, 0xee, 0x79, 0x00, 0x61, 0x9b, 0xdf, 0xf4, + 0x22, 0x42, 0x9f, 0xb7, 0x53, 0xe6, 0x70, 0x9b, 0xc2, 0x2e, 0xe3, 0x63, + 0x2b, 0xe1, 0xd7, 0x12, 0xe7, 0xc9, 0x73, 0x1f, 0xe4, 0xbc, 0xab, 0x8f, + 0xc1, 0x5d, 0xc6, 0x67, 0x4f, 0x92, 0x47, 0xb9, 0xf8, 0xec, 0x48, 0x3a, + 0x64, 0x1c, 0x51, 0x5a, 0x1b, 0x39, 0x2d, 0xb3, 0xb8, 0x29, 0x71, 0x81, + 0x5c, 0x73, 0x08, 0xda, 0x3c, 0x07, 0xb0, 0x65, 0x36, 0x16, 0x65, 0xae, + 0xce, 0x42, 0x6d, 0x34, 0x8f, 0x60, 0x47, 0xb8, 0x9d, 0xf5, 0xa2, 0x8d, + 0xfc, 0x8d, 0x7c, 0x99, 0xf2, 0x2a, 0x8e, 0x89, 0xdc, 0xab, 0xfd, 0x4c, + 0x74, 0xe6, 0x18, 0x55, 0xb1, 0x7e, 0xec, 0x1f, 0x95, 0x31, 0xfa, 0x64, + 0x8c, 0xc8, 0xab, 0x94, 0x79, 0x87, 0x2a, 0x8c, 0xf1, 0x9e, 0x53, 0x6b, + 0xe3, 0x18, 0xe7, 0x2e, 0x72, 0x0c, 0x8f, 0x2e, 0xf2, 0xfb, 0x45, 0x3e, + 0x3f, 0xfb, 0xb0, 0x2a, 0x3b, 0x40, 0xbf, 0xba, 0x55, 0x77, 0xe6, 0x66, + 0x1c, 0x9f, 0xbe, 0x19, 0x66, 0x46, 0xb1, 0x5e, 0x2e, 0x44, 0x7e, 0xa1, + 0xcd, 0xe1, 0x6b, 0xbc, 0x7a, 0x3d, 0xee, 0xf6, 0xa1, 0xb6, 0x56, 0xff, + 0x1a, 0xee, 0x29, 0xf2, 0xdf, 0x1d, 0xe3, 0x9d, 0x08, 0x10, 0x83, 0x97, + 0x2e, 0x77, 0xa1, 0xad, 0x0e, 0x89, 0x25, 0xb1, 0x36, 0xc6, 0xe7, 0xfb, + 0x8e, 0x02, 0xe6, 0x97, 0x7b, 0x0a, 0x75, 0xc6, 0xb6, 0xfd, 0xaf, 0xdd, + 0xbb, 0x19, 0xa3, 0x99, 0x72, 0x90, 0x83, 0xde, 0x5a, 0x8d, 0x37, 0x24, + 0x97, 0xdf, 0xda, 0xae, 0xd6, 0x3a, 0x25, 0x9e, 0xc4, 0x4f, 0x5f, 0x8d, + 0x5d, 0x8c, 0xfd, 0x87, 0xc6, 0x37, 0x8a, 0x75, 0xea, 0xea, 0xeb, 0xee, + 0xf8, 0xbf, 0xbd, 0xae, 0xf0, 0xf4, 0x98, 0x8f, 0x3c, 0xd6, 0x87, 0x6c, + 0xda, 0x82, 0x33, 0xe6, 0x42, 0xef, 0xa8, 0xd4, 0x65, 0x3f, 0xe6, 0xd2, + 0x5a, 0xf2, 0x3c, 0xb9, 0xf5, 0xae, 0x56, 0x1d, 0x77, 0xcd, 0x05, 0x30, + 0x9b, 0x86, 0xe5, 0x89, 0xe9, 0x79, 0x0f, 0xf9, 0xc8, 0xde, 0xb9, 0xc5, + 0x38, 0x9d, 0xd6, 0xcf, 0x0d, 0xa9, 0xf0, 0x40, 0xbd, 0xd3, 0x85, 0x7b, + 0xe6, 0x9a, 0x71, 0x37, 0x6b, 0xf8, 0x1c, 0x65, 0x6c, 0x8a, 0x2e, 0xe6, + 0xf3, 0x0e, 0x3c, 0xf5, 0x28, 0xeb, 0x12, 0xf1, 0xa0, 0x77, 0x0e, 0x98, + 0x1d, 0x63, 0xce, 0x9f, 0x64, 0xfe, 0x3f, 0x01, 0xec, 0x7d, 0xc2, 0x81, + 0xe9, 0x31, 0x8b, 0x3e, 0x1e, 0xaa, 0x77, 0xa0, 0x0c, 0x49, 0xf2, 0xc8, + 0x32, 0xf2, 0xaf, 0x3b, 0x7c, 0x05, 0x7e, 0x77, 0x9e, 0xb5, 0x6a, 0xdf, + 0x13, 0x11, 0xbc, 0x95, 0x4e, 0x61, 0xd3, 0x8a, 0x00, 0x06, 0xa8, 0xcb, + 0x9b, 0x69, 0x62, 0xca, 0x9c, 0x81, 0x37, 0xd2, 0x6e, 0x8e, 0xd3, 0x8c, + 0x97, 0xd2, 0xf2, 0x8c, 0x3c, 0x5b, 0x8d, 0x1e, 0xea, 0xf2, 0x7a, 0x3a, + 0xc0, 0x31, 0xfd, 0xf8, 0x29, 0x9f, 0xbb, 0x73, 0x4e, 0x27, 0x8f, 0x75, + 0x73, 0xdc, 0x20, 0x5e, 0x4d, 0x13, 0xb3, 0x78, 0xfd, 0x6c, 0xba, 0x07, + 0xc3, 0xe9, 0xa6, 0x73, 0x6b, 0xc9, 0x95, 0x82, 0xd7, 0x14, 0x6a, 0xf0, + 0xd9, 0xf4, 0xbb, 0xd6, 0x16, 0xbb, 0x56, 0xca, 0x38, 0xa5, 0x71, 0x7b, + 0x30, 0x94, 0x7e, 0xdc, 0x59, 0xea, 0x3d, 0x9f, 0x1e, 0x13, 0xee, 0xbf, + 0x18, 0x4f, 0x99, 0xfc, 0x7b, 0x1a, 0x38, 0x6d, 0xa6, 0xac, 0xda, 0x18, + 0x39, 0x01, 0x31, 0xf9, 0xed, 0x15, 0xcd, 0x1c, 0x57, 0x4f, 0x9e, 0x55, + 0xd2, 0x0b, 0xb8, 0x10, 0x7c, 0x42, 0xec, 0xe5, 0xc0, 0x14, 0xeb, 0xdb, + 0x0f, 0x89, 0x8b, 0x8d, 0xa3, 0x5a, 0x80, 0x31, 0xda, 0x3d, 0x05, 0xad, + 0x33, 0x8f, 0x86, 0xc8, 0x5d, 0x18, 0xb4, 0xca, 0x63, 0xc4, 0x62, 0xe2, + 0xed, 0x5c, 0xb3, 0x65, 0x7d, 0xb2, 0xc2, 0xb2, 0xfe, 0xbe, 0x15, 0x96, + 0x23, 0xa6, 0x1b, 0xf5, 0xce, 0xfc, 0xd7, 0x6a, 0xa0, 0x9f, 0xf3, 0x2a, + 0x3d, 0xff, 0x36, 0xc2, 0x7d, 0x3f, 0x81, 0xd8, 0x15, 0x58, 0x36, 0xe7, + 0xc2, 0x8d, 0x9c, 0xcf, 0xba, 0x51, 0x8e, 0x4d, 0x8e, 0x10, 0xe6, 0x9c, + 0xb6, 0x8e, 0x5a, 0xe4, 0x1a, 0xd5, 0xb8, 0x81, 0x36, 0xee, 0x9d, 0xb0, + 0xac, 0x0a, 0xda, 0xb8, 0x91, 0xfe, 0xd9, 0x33, 0x6e, 0xe1, 0xac, 0x71, + 0x96, 0x36, 0x55, 0x48, 0x76, 0xb6, 0xf2, 0x1d, 0x3f, 0x9f, 0x27, 0xaf, + 0x1a, 0x95, 0x5e, 0x62, 0x31, 0x9f, 0x79, 0x0d, 0x47, 0xd3, 0x11, 0x34, + 0xd3, 0x7e, 0x41, 0xca, 0x6c, 0xe2, 0x3b, 0xc1, 0xb9, 0x42, 0x3f, 0x17, + 0x9c, 0x13, 0x0c, 0xba, 0x1a, 0x73, 0x04, 0x83, 0x80, 0xe3, 0x63, 0xda, + 0x91, 0x3c, 0x31, 0xa6, 0x26, 0x36, 0xc8, 0x1a, 0x02, 0xbc, 0x39, 0xa5, + 0x70, 0x6c, 0x8c, 0xfd, 0xcf, 0x0a, 0x58, 0x95, 0x9c, 0xc7, 0x1b, 0x53, + 0x5f, 0xc7, 0x93, 0x8f, 0x72, 0xee, 0x27, 0xfc, 0x78, 0x26, 0xed, 0xc2, + 0xd2, 0x63, 0x5a, 0x6a, 0x0a, 0x7a, 0xe4, 0x80, 0x12, 0xec, 0xd1, 0xc6, + 0x52, 0x08, 0x07, 0xcb, 0x94, 0x03, 0x0d, 0x4f, 0xba, 0xa0, 0x9f, 0x0e, + 0xa2, 0xac, 0xc1, 0x0d, 0xbd, 0xe1, 0x0f, 0x19, 0x83, 0x0e, 0x94, 0x93, + 0xcb, 0x6c, 0x78, 0x24, 0xc2, 0x6b, 0x7e, 0x5e, 0xc3, 0xd7, 0x2b, 0xe0, + 0x5c, 0xe4, 0x64, 0x5d, 0x29, 0xd7, 0xd9, 0x00, 0xb9, 0x2c, 0xcb, 0x49, + 0x4e, 0xb0, 0xe3, 0x31, 0xcb, 0x0a, 0x2d, 0xff, 0x43, 0x9b, 0x0f, 0x86, + 0x4e, 0xeb, 0x7c, 0x8e, 0x7a, 0xb1, 0xb6, 0x7c, 0x8f, 0x3d, 0xdc, 0xb3, + 0x8c, 0xd9, 0x33, 0xa6, 0x93, 0xb1, 0xa3, 0x19, 0xe2, 0x43, 0x54, 0x06, + 0x39, 0xcf, 0xb7, 0x6c, 0x7f, 0x3d, 0x4b, 0xfc, 0x3c, 0xc3, 0x5c, 0x97, + 0x39, 0x9c, 0x1a, 0x53, 0xc4, 0xd9, 0x18, 0x9f, 0x5d, 0x0d, 0x67, 0x54, + 0x78, 0xab, 0x1f, 0xbb, 0x7c, 0x6d, 0x78, 0xda, 0x2c, 0x43, 0x95, 0xbe, + 0x08, 0xfb, 0x3b, 0x7d, 0x78, 0x3a, 0xa7, 0x05, 0xe9, 0xa7, 0x48, 0x1e, + 0xff, 0xe8, 0x64, 0x3e, 0x19, 0x70, 0xfc, 0x18, 0xfa, 0x23, 0x0e, 0x0c, + 0x1b, 0x4e, 0xc6, 0xa7, 0x81, 0xf2, 0x06, 0x20, 0x9f, 0x75, 0xe1, 0x15, + 0x9d, 0x32, 0x4d, 0xca, 0xa7, 0x0e, 0x67, 0x4c, 0xcd, 0x97, 0xb7, 0xe3, + 0x35, 0xc2, 0x71, 0xb5, 0xb6, 0x84, 0xfa, 0x96, 0x53, 0xf4, 0xe4, 0xb8, + 0xae, 0x42, 0xfc, 0x3c, 0xe1, 0x94, 0xfa, 0x77, 0xe5, 0x7b, 0x25, 0x1c, + 0x31, 0x2d, 0xb0, 0xc6, 0x29, 0xf8, 0xb2, 0x25, 0x3e, 0xa2, 0x7f, 0xe5, + 0x2a, 0xdd, 0xbb, 0x30, 0x9c, 0xbb, 0xd2, 0x7b, 0x76, 0xa4, 0xed, 0xb8, + 0xe9, 0x10, 0xdb, 0x3f, 0x6c, 0x08, 0xb6, 0x0e, 0xa8, 0x76, 0x62, 0x55, + 0xca, 0x55, 0xe8, 0x2d, 0x0f, 0xb3, 0xb7, 0x7c, 0x39, 0x2d, 0xeb, 0x0b, + 0xfd, 0xd8, 0xcd, 0xcf, 0x00, 0xaf, 0x05, 0xcc, 0x50, 0xf0, 0x14, 0xb4, + 0xde, 0x1e, 0x62, 0x14, 0xf1, 0x6a, 0x60, 0x46, 0x69, 0x7d, 0xf5, 0x4e, + 0xe9, 0xf3, 0x0b, 0x58, 0x75, 0x43, 0x11, 0xab, 0x9a, 0xb3, 0x7e, 0x6f, + 0x07, 0xeb, 0x50, 0x07, 0xeb, 0xe8, 0x06, 0x9b, 0x47, 0x75, 0xab, 0xcd, + 0xb3, 0x6e, 0xb5, 0x9e, 0x3c, 0xf5, 0x65, 0x43, 0x61, 0xaa, 0x0b, 0xbe, + 0xa5, 0x2b, 0xe0, 0xd9, 0x9c, 0xe9, 0x44, 0x05, 0xf1, 0x69, 0x5f, 0xb4, + 0x02, 0x1b, 0xec, 0x5a, 0x29, 0xf5, 0x5e, 0xfa, 0xe9, 0x2e, 0x62, 0x1d, + 0x7c, 0x9e, 0x58, 0xa1, 0x77, 0x16, 0xdc, 0xdb, 0xca, 0x77, 0x4f, 0x31, + 0x0e, 0x51, 0xa8, 0xa9, 0x6a, 0x1b, 0xfb, 0x90, 0x4f, 0xa2, 0x0a, 0xf9, + 0x5b, 0xdd, 0xa0, 0x2c, 0xce, 0xf7, 0x4c, 0x7c, 0x64, 0xac, 0x53, 0xb5, + 0x4f, 0xcf, 0x78, 0xd6, 0x9a, 0x52, 0x9f, 0xa7, 0x3c, 0xe4, 0x2e, 0xac, + 0x89, 0xbf, 0x2e, 0x4b, 0xd6, 0x2d, 0x0e, 0xc4, 0x57, 0x91, 0x47, 0xb5, + 0x2d, 0xff, 0x67, 0x0b, 0xbf, 0x2b, 0xef, 0xdf, 0x5f, 0xb4, 0x5f, 0x82, + 0xfa, 0xf8, 0xdd, 0x1b, 0x72, 0x3e, 0x77, 0x22, 0xd7, 0xce, 0xf7, 0x3b, + 0x29, 0xab, 0xcb, 0xd3, 0x6e, 0xee, 0xf4, 0xac, 0x33, 0xb7, 0x78, 0xd6, + 0x9b, 0xcc, 0xdd, 0x5c, 0x27, 0xed, 0xb8, 0x85, 0x7d, 0xf0, 0x4e, 0x72, + 0x4c, 0x91, 0x99, 0x24, 0xdf, 0xf5, 0x70, 0x6e, 0x83, 0x9c, 0x5b, 0x3e, + 0x40, 0xc6, 0xae, 0x95, 0xb1, 0x66, 0x0c, 0xdb, 0x7e, 0x3b, 0x62, 0xaf, + 0xc5, 0x78, 0x62, 0xf7, 0xc6, 0x97, 0x8e, 0x3b, 0x70, 0x4a, 0x47, 0x5d, + 0x59, 0x0c, 0x31, 0x0f, 0xc2, 0xc6, 0x45, 0x84, 0x03, 0x2f, 0xf3, 0x99, + 0x21, 0xc6, 0xe8, 0xb0, 0xdd, 0x77, 0xd3, 0xf0, 0xd9, 0x2a, 0xb5, 0x21, + 0xd3, 0x8c, 0x4d, 0xa6, 0xdb, 0xb3, 0x8d, 0xbd, 0x5c, 0x20, 0xa6, 0x75, + 0x74, 0x3b, 0x99, 0xc7, 0xd1, 0xfc, 0x37, 0xbc, 0x68, 0x46, 0x47, 0xce, + 0xed, 0x59, 0x3b, 0xf9, 0x15, 0x34, 0x4f, 0x68, 0x89, 0x14, 0x73, 0xd0, + 0x49, 0xbe, 0x70, 0x34, 0x0a, 0x1c, 0xcd, 0x2e, 0xc6, 0x0d, 0xa3, 0xb6, + 0x3f, 0x93, 0x79, 0xc6, 0xf7, 0x68, 0x36, 0x08, 0x7d, 0x34, 0x81, 0xf7, + 0xc9, 0xa5, 0x5d, 0x73, 0xf5, 0xb8, 0x6e, 0xdc, 0x89, 0x76, 0xa3, 0x1d, + 0xc3, 0x3e, 0x07, 0x0e, 0x45, 0xbe, 0x8d, 0x29, 0xbf, 0xe4, 0xc6, 0x76, + 0x1c, 0xf6, 0x39, 0x51, 0xaf, 0xef, 0xc2, 0xe3, 0x36, 0x2e, 0xde, 0x84, + 0xf3, 0x85, 0xba, 0xe1, 0xae, 0x88, 0xed, 0x89, 0xbf, 0xff, 0xa8, 0xc2, + 0xdb, 0x7a, 0xab, 0x67, 0x43, 0x46, 0xf3, 0x6c, 0xcb, 0x5c, 0x8f, 0x1b, + 0x26, 0x2c, 0xbc, 0x67, 0x0c, 0x75, 0x94, 0x31, 0x5e, 0x2e, 0x44, 0xbb, + 0xd9, 0xfb, 0xe1, 0x0d, 0x0f, 0xa0, 0xb3, 0x5f, 0xea, 0xd3, 0xa9, 0x63, + 0xb7, 0x11, 0xf6, 0xbd, 0xc5, 0x7a, 0xc9, 0x12, 0x9f, 0x70, 0xb2, 0x27, + 0x5d, 0x0b, 0x6c, 0xa9, 0xa0, 0x2e, 0x1e, 0x62, 0x73, 0xd9, 0x5c, 0xd0, + 0xb3, 0x9e, 0xf5, 0xc4, 0xc5, 0x7e, 0xd0, 0x13, 0xc6, 0x1b, 0x7c, 0x27, + 0xaf, 0x3b, 0xdd, 0x08, 0xcc, 0x35, 0x7b, 0xb6, 0xb2, 0x3e, 0x7c, 0x12, + 0xb6, 0x06, 0xcf, 0x46, 0xab, 0x51, 0x33, 0x67, 0x78, 0x36, 0x98, 0xdd, + 0x18, 0x9a, 0x8d, 0xc0, 0x11, 0xf6, 0xa1, 0x62, 0xae, 0x8d, 0x76, 0xf7, + 0xf3, 0x7d, 0x17, 0xb1, 0x24, 0x41, 0x5f, 0xb8, 0x11, 0x9a, 0x5b, 0x49, + 0x59, 0x76, 0x3c, 0xc6, 0x03, 0x8c, 0x81, 0xe0, 0x9c, 0x85, 0x97, 0x0c, + 0xed, 0x5c, 0x9a, 0xa9, 0x5e, 0x0f, 0x7c, 0x87, 0x7d, 0x74, 0xb2, 0x96, + 0xfd, 0xca, 0xd1, 0x15, 0xd5, 0x7c, 0x47, 0xec, 0x4a, 0x7b, 0xd2, 0xe7, + 0x35, 0x9c, 0xd3, 0xdc, 0x84, 0xac, 0x55, 0x25, 0xe3, 0x6f, 0x4c, 0xfc, + 0x94, 0xfe, 0xd6, 0x7c, 0xa7, 0x95, 0xd4, 0xfc, 0x7d, 0xf1, 0x93, 0x8f, + 0xca, 0xda, 0x49, 0x32, 0xfe, 0xca, 0xa3, 0x22, 0x77, 0x67, 0x3c, 0x30, + 0xa9, 0x63, 0xd9, 0x84, 0x36, 0xf0, 0x24, 0x42, 0xbd, 0xf3, 0x0a, 0xac, + 0x1c, 0xff, 0x62, 0x9d, 0x08, 0xcb, 0xda, 0x14, 0x63, 0x87, 0xb8, 0xe8, + 0x24, 0xde, 0xd7, 0xcf, 0xd1, 0x58, 0x73, 0x2f, 0x51, 0x4e, 0x00, 0xee, + 0xb0, 0x8e, 0x86, 0x89, 0x08, 0xc2, 0x13, 0x78, 0xa9, 0x9c, 0x3a, 0xb0, + 0xdc, 0x3f, 0xe0, 0x5d, 0x09, 0xf7, 0xc7, 0xd4, 0xc1, 0xcb, 0xe7, 0x6a, + 0xec, 0xe7, 0xfc, 0x7c, 0xee, 0x49, 0x2b, 0x65, 0xd7, 0x03, 0xe2, 0xcc, + 0x04, 0xfc, 0x2e, 0xca, 0x5b, 0xdb, 0x2a, 0xf2, 0xe4, 0xbe, 0x8f, 0xf7, + 0x25, 0xdf, 0xf6, 0xc5, 0x77, 0x3f, 0x2a, 0x7a, 0x25, 0x8b, 0x7a, 0xed, + 0xa4, 0x5e, 0x3a, 0x56, 0x51, 0x7e, 0xdb, 0x84, 0x16, 0xbc, 0x03, 0xa1, + 0x81, 0xc3, 0xc0, 0x01, 0xce, 0xb5, 0x3f, 0x80, 0x4f, 0xac, 0xb7, 0xc3, + 0xe1, 0x20, 0xeb, 0xc3, 0x03, 0xd3, 0x2b, 0x4a, 0xba, 0xb1, 0x87, 0x24, + 0xee, 0xd6, 0x53, 0xc7, 0x82, 0x7e, 0x8b, 0x29, 0x57, 0xec, 0xf0, 0x0b, + 0xe5, 0xd0, 0x2f, 0x12, 0xbb, 0x04, 0x3f, 0xfc, 0xc4, 0xad, 0xa4, 0xd4, + 0xf5, 0x54, 0x8a, 0x31, 0x5f, 0xc6, 0x98, 0x5f, 0x27, 0x71, 0x6d, 0x32, + 0xae, 0x4d, 0xc6, 0xb5, 0xa9, 0x05, 0xfa, 0x10, 0xf2, 0xf5, 0xd0, 0x7f, + 0x89, 0x80, 0xc4, 0x7b, 0x17, 0x76, 0xf3, 0x77, 0x0f, 0xef, 0x1f, 0x66, + 0xef, 0x09, 0xbb, 0xc7, 0xec, 0x27, 0x97, 0x7a, 0x00, 0xbd, 0x19, 0xfc, + 0xd2, 0xd3, 0x5a, 0x81, 0x8a, 0x1b, 0xca, 0x18, 0x3f, 0x9a, 0xef, 0x21, + 0x3c, 0x40, 0x8e, 0xff, 0x0b, 0x55, 0xa5, 0xbb, 0x3a, 0x8f, 0x92, 0xd7, + 0xb4, 0xab, 0x6a, 0xec, 0xca, 0xed, 0xf4, 0xdc, 0x62, 0x86, 0x7a, 0x5f, + 0x66, 0xcf, 0x3c, 0x55, 0xcf, 0xb1, 0x99, 0x4f, 0xdb, 0x38, 0x8e, 0x29, + 0x7a, 0xd8, 0x18, 0xbb, 0x0b, 0x62, 0xc7, 0x17, 0x1a, 0x7b, 0x38, 0x7e, + 0x41, 0x8f, 0x21, 0xf6, 0x1d, 0x3d, 0xd4, 0x69, 0xb7, 0x9d, 0x63, 0x5d, + 0x94, 0x71, 0x05, 0xbb, 0xd6, 0xa6, 0xa5, 0x66, 0x5a, 0x78, 0x90, 0xfd, + 0xc0, 0x53, 0xfc, 0x3d, 0x47, 0xfc, 0x1a, 0xbe, 0x0a, 0xbf, 0x1c, 0x7c, + 0x6e, 0x07, 0x9f, 0x6b, 0x23, 0x76, 0xcf, 0x4e, 0x4b, 0x3c, 0xf7, 0xcb, + 0xfa, 0x18, 0xb2, 0xa6, 0xd8, 0xb3, 0x0f, 0xaf, 0xa4, 0x43, 0x03, 0x4e, + 0xa7, 0x35, 0xe8, 0x8d, 0x69, 0xe7, 0x3e, 0x25, 0xff, 0x78, 0x7d, 0x85, + 0xd6, 0x49, 0x9f, 0x44, 0xc8, 0x19, 0x03, 0x3f, 0x43, 0x7e, 0x83, 0x1b, + 0x4d, 0xc1, 0x1b, 0x9d, 0x61, 0x1f, 0xb1, 0x2e, 0xdf, 0xc3, 0x99, 0x9e, + 0xc8, 0x15, 0xf0, 0x6d, 0x55, 0x11, 0xdf, 0xda, 0xb2, 0x95, 0xc4, 0x1f, + 0xd6, 0xe1, 0x69, 0x2b, 0xe5, 0x65, 0x8d, 0xca, 0x4d, 0x8b, 0xec, 0x41, + 0x34, 0x45, 0x45, 0x96, 0xde, 0x31, 0xaa, 0xf0, 0x3b, 0x55, 0x08, 0xb3, + 0x3e, 0xc1, 0xa8, 0xd0, 0x53, 0x16, 0xeb, 0x90, 0xaf, 0x2c, 0x26, 0x35, + 0x72, 0x0b, 0x31, 0xb1, 0x8b, 0x98, 0x28, 0xbc, 0x5d, 0xd6, 0x0c, 0x0b, + 0x98, 0xb4, 0x2e, 0x27, 0x7e, 0x11, 0x9f, 0x88, 0x6f, 0xfa, 0x71, 0x87, + 0x89, 0x94, 0xd4, 0xf1, 0x31, 0x23, 0x1c, 0x7c, 0x12, 0xe2, 0xa7, 0x7e, + 0xda, 0xa2, 0x0c, 0xbb, 0x89, 0x81, 0xbb, 0x5a, 0x69, 0x2b, 0x6f, 0x19, + 0x76, 0x4d, 0x4b, 0xbf, 0x53, 0xb2, 0x5f, 0x19, 0x7d, 0xa8, 0x98, 0xd3, + 0x07, 0xca, 0x0a, 0x76, 0x2c, 0xf0, 0x7d, 0x67, 0x4c, 0xe4, 0x05, 0x28, + 0x57, 0x6a, 0x6e, 0xc1, 0x76, 0x1b, 0xd2, 0x22, 0xd7, 0xc2, 0x29, 0xa3, + 0xc0, 0x4f, 0x4b, 0x36, 0x13, 0x7c, 0xaf, 0x5b, 0x09, 0xdc, 0x78, 0x4c, + 0x72, 0xa5, 0x1f, 0x73, 0xe4, 0xa8, 0x95, 0xbc, 0xb6, 0x69, 0x34, 0xd4, + 0xf7, 0xbe, 0xd2, 0x22, 0xa7, 0xc9, 0x33, 0x84, 0x5b, 0x9f, 0x66, 0xcd, + 0xd8, 0xcc, 0x3c, 0x6f, 0x28, 0x62, 0x7e, 0x38, 0x4b, 0xbe, 0x8e, 0x82, + 0x5d, 0x1a, 0xb3, 0xb5, 0x45, 0x7c, 0xee, 0xc7, 0x2e, 0xf2, 0x97, 0xfa, + 0x86, 0x41, 0xb8, 0x5b, 0x1c, 0x97, 0x1c, 0x18, 0xc4, 0x7b, 0xcb, 0x99, + 0x19, 0x0b, 0x2d, 0x5c, 0xb7, 0x3c, 0x65, 0x55, 0xe8, 0x0d, 0xc1, 0x0a, + 0x87, 0xac, 0xbd, 0x86, 0x53, 0xc3, 0xc4, 0x13, 0x47, 0x8b, 0x96, 0x4a, + 0xc0, 0xed, 0xab, 0xd3, 0x93, 0x45, 0xee, 0x18, 0x70, 0x6f, 0x24, 0xbf, + 0x09, 0x47, 0xbf, 0xb4, 0xa6, 0xfc, 0x83, 0x08, 0xb4, 0xe4, 0x07, 0x02, + 0x48, 0xdc, 0x1b, 0x60, 0xed, 0x79, 0x53, 0x1d, 0x41, 0x36, 0x1c, 0x70, + 0x6f, 0xc9, 0xa5, 0x3c, 0x9b, 0x1a, 0x83, 0xd8, 0x3c, 0xda, 0xae, 0x36, + 0xe7, 0x74, 0xac, 0x1f, 0xed, 0x60, 0x9f, 0xde, 0xa9, 0x3a, 0xa7, 0xc5, + 0x3e, 0x62, 0x5f, 0xcd, 0x17, 0x74, 0x70, 0xee, 0x97, 0xeb, 0x78, 0x81, + 0x87, 0xbc, 0xd0, 0x78, 0xd1, 0x8e, 0x9d, 0x11, 0xc3, 0x47, 0xbb, 0xfc, + 0xa7, 0x32, 0x78, 0x2d, 0x9c, 0x34, 0x24, 0xe6, 0x7c, 0x76, 0xdf, 0xbd, + 0xae, 0x75, 0xcc, 0x72, 0xe9, 0xd2, 0x77, 0x05, 0x6c, 0x7f, 0x49, 0x9f, + 0xd7, 0x3e, 0xdd, 0x45, 0x1f, 0x95, 0xd6, 0x71, 0x6f, 0xf6, 0xac, 0x15, + 0x3f, 0x18, 0x35, 0x48, 0xf8, 0x94, 0xf2, 0xc4, 0x2a, 0xdd, 0x11, 0xd6, + 0xca, 0x23, 0xd9, 0x7e, 0x6c, 0xa0, 0xce, 0x0f, 0x66, 0xed, 0x18, 0x8b, + 0xbf, 0x42, 0xce, 0xfb, 0xb2, 0x51, 0x8e, 0xa9, 0x4e, 0x37, 0x71, 0x3d, + 0x89, 0x7d, 0x1c, 0xff, 0x61, 0xf6, 0xb7, 0x85, 0x35, 0x65, 0xcd, 0x97, + 0xc2, 0xd7, 0xcb, 0xa5, 0x0f, 0x1d, 0xd1, 0xaf, 0xf6, 0xfd, 0x6a, 0x62, + 0x9b, 0xd6, 0x39, 0x85, 0x54, 0xa4, 0x0c, 0xa1, 0xb6, 0x43, 0x10, 0xbe, + 0x55, 0x4e, 0x9c, 0x97, 0x1a, 0xb2, 0x27, 0xbe, 0x74, 0xe2, 0x2d, 0xeb, + 0xa2, 0xee, 0xa2, 0xaf, 0x57, 0x62, 0xad, 0x4f, 0x30, 0x3c, 0xe6, 0xe9, + 0x9c, 0x74, 0x39, 0x6a, 0x63, 0x68, 0x65, 0x3f, 0x6d, 0x79, 0xed, 0x75, + 0x29, 0x10, 0xff, 0x6f, 0xf6, 0x6c, 0xc9, 0x04, 0x71, 0x34, 0xea, 0x2e, + 0xae, 0x9b, 0xde, 0x44, 0x9d, 0x9d, 0xca, 0x11, 0x83, 0xf3, 0xf6, 0x56, + 0x0b, 0x07, 0x8d, 0x70, 0x7e, 0x35, 0xf1, 0xb7, 0x8c, 0xb2, 0x8e, 0x67, + 0x5b, 0x79, 0x4f, 0xf3, 0xec, 0xc8, 0x0c, 0xcd, 0x0b, 0xb6, 0x93, 0x33, + 0xe7, 0x1d, 0xfc, 0xbc, 0x71, 0x39, 0xee, 0x0e, 0xd0, 0x91, 0xb5, 0xc4, + 0xd3, 0xd3, 0x2a, 0x1c, 0x7c, 0x88, 0xb8, 0xee, 0x89, 0x85, 0x53, 0x0f, + 0xe1, 0x2d, 0xeb, 0xb3, 0xec, 0x4a, 0xbe, 0xd3, 0xc1, 0x1c, 0x4e, 0x78, + 0xba, 0x4d, 0x79, 0x47, 0x3b, 0xb7, 0x09, 0x5a, 0xdf, 0x6a, 0x67, 0x28, + 0x49, 0xbc, 0xbc, 0xc7, 0x8b, 0x70, 0xe7, 0x93, 0xc4, 0xe0, 0x43, 0xd1, + 0x54, 0xf7, 0x12, 0x84, 0x3b, 0xd6, 0x31, 0x5e, 0x7a, 0x55, 0x90, 0xb5, + 0x40, 0xfc, 0x1b, 0xc1, 0x67, 0x1c, 0xd7, 0xa5, 0x8b, 0x9f, 0x56, 0xa3, + 0x67, 0x9a, 0xbd, 0xcf, 0xe5, 0x38, 0x16, 0xdb, 0x88, 0xdd, 0xa3, 0xb4, + 0xcd, 0x02, 0xce, 0xef, 0xaf, 0x6d, 0xbc, 0xf2, 0xe8, 0x11, 0xfc, 0x80, + 0x3e, 0xfe, 0x3e, 0xf9, 0xd6, 0xf3, 0x97, 0xf9, 0xa3, 0x1d, 0x73, 0xf1, + 0xa5, 0x53, 0xcd, 0xb4, 0xdd, 0x62, 0x3c, 0x67, 0xf7, 0xb3, 0x6e, 0x4f, + 0xc7, 0xa4, 0x85, 0x09, 0xc3, 0x0b, 0x59, 0x2b, 0xaa, 0x88, 0xe6, 0xc9, + 0x2c, 0x9a, 0xb1, 0x9e, 0xd7, 0xdb, 0x27, 0xab, 0x54, 0x7b, 0xc6, 0xc2, + 0xf3, 0x86, 0x96, 0x5a, 0xe3, 0x24, 0x5e, 0x18, 0xb2, 0x06, 0xad, 0xa9, + 0xa4, 0x4f, 0xe2, 0xd7, 0x85, 0x6a, 0xbd, 0x20, 0xaf, 0x79, 0xea, 0x66, + 0xf2, 0x12, 0xc9, 0x5f, 0xe7, 0xb2, 0x4a, 0xec, 0x54, 0x53, 0xae, 0xc2, + 0x5a, 0x57, 0x22, 0x57, 0xc5, 0x9c, 0x0f, 0x92, 0x73, 0x94, 0xa3, 0xb0, + 0x46, 0x79, 0xb3, 0xa7, 0x3b, 0x83, 0x3f, 0x0f, 0xc0, 0xf9, 0xd8, 0x35, + 0x38, 0xa4, 0x12, 0xe5, 0x72, 0x4d, 0xc6, 0x48, 0x14, 0x39, 0x5d, 0x27, + 0x32, 0xc4, 0xb2, 0x21, 0xe6, 0xc1, 0x6d, 0xfa, 0xcd, 0xac, 0xa3, 0x6e, + 0x5c, 0x30, 0x1c, 0xc8, 0xfb, 0x9d, 0x58, 0xa0, 0xcb, 0x9a, 0x44, 0x33, + 0xea, 0x1f, 0x6b, 0xa5, 0x8c, 0x95, 0xac, 0xaf, 0xdd, 0x78, 0x7c, 0x96, + 0x7d, 0xf6, 0x72, 0x8b, 0xf2, 0xb5, 0xde, 0x5b, 0x1c, 0xa9, 0xee, 0x1a, + 0x72, 0xfa, 0x03, 0xec, 0x61, 0x6f, 0xb5, 0xf3, 0x6c, 0x4f, 0x3c, 0x32, + 0x13, 0x40, 0xd9, 0x23, 0x82, 0x77, 0x5a, 0xc0, 0x63, 0x5f, 0xeb, 0x8d, + 0x87, 0x78, 0xad, 0x8e, 0x1c, 0x32, 0xb8, 0xa8, 0xb4, 0xae, 0x20, 0xd7, + 0xf7, 0xf1, 0xba, 0x7c, 0x26, 0xe3, 0x41, 0xfb, 0x73, 0x27, 0x3f, 0xab, + 0xd4, 0xed, 0x19, 0xcb, 0xda, 0x6d, 0x24, 0xf0, 0xd9, 0x72, 0x36, 0xd0, + 0x0b, 0x2a, 0xd1, 0xa3, 0x57, 0xf1, 0xd7, 0xb2, 0xc6, 0x8b, 0x6b, 0x35, + 0x41, 0x47, 0x15, 0x7b, 0x4b, 0xb8, 0xdd, 0x7c, 0xdf, 0xcd, 0x3a, 0x93, + 0xc0, 0xd0, 0x8e, 0x00, 0x39, 0xc6, 0xde, 0xe8, 0x9f, 0xb2, 0x57, 0xd7, + 0x22, 0x15, 0xaa, 0x4a, 0x6d, 0x21, 0x37, 0xd9, 0x4c, 0x6e, 0x72, 0x0b, + 0xb9, 0x49, 0x6d, 0x4c, 0x4b, 0x6c, 0x73, 0xca, 0x5a, 0x7c, 0xfe, 0xd6, + 0x1a, 0x48, 0x8d, 0x2d, 0x70, 0x93, 0xb2, 0x09, 0xf2, 0x54, 0xc8, 0xbe, + 0x8e, 0x65, 0x3d, 0x45, 0xe6, 0xb9, 0x91, 0xdc, 0xa4, 0x7c, 0x54, 0xeb, + 0x48, 0x48, 0x9f, 0x19, 0x75, 0x61, 0x3d, 0xb9, 0x89, 0x83, 0xfd, 0xc2, + 0xdb, 0xd9, 0x7a, 0x38, 0xc9, 0x4b, 0x76, 0x93, 0x09, 0xf5, 0x30, 0x96, + 0x0f, 0x46, 0xfc, 0x2a, 0x78, 0xad, 0x03, 0x3e, 0xdd, 0xad, 0xfa, 0xc8, + 0x4b, 0x96, 0xe8, 0x5f, 0x51, 0x83, 0x36, 0x1f, 0xf9, 0x07, 0x24, 0xea, + 0x0a, 0xbc, 0xa4, 0x90, 0x03, 0x0a, 0xd7, 0x85, 0x5b, 0x69, 0x33, 0xcd, + 0xb3, 0x8e, 0xbc, 0xc4, 0x37, 0x21, 0x36, 0x1b, 0xea, 0xf5, 0x32, 0x66, + 0x67, 0x8c, 0x6e, 0x1c, 0x9a, 0xc4, 0x7a, 0x5a, 0xa2, 0xcb, 0xc5, 0x7c, + 0x58, 0x4f, 0x4e, 0x52, 0xa9, 0xc2, 0xf3, 0xeb, 0xc9, 0x57, 0xcb, 0x1c, + 0x36, 0x2f, 0xc9, 0xbf, 0xe3, 0x44, 0x0f, 0x6b, 0x27, 0xe6, 0xc9, 0xb5, + 0x3f, 0xca, 0x06, 0x29, 0xa7, 0x1c, 0x5e, 0xf2, 0x92, 0x8f, 0x74, 0xdc, + 0xcd, 0x58, 0x0f, 0x9e, 0x56, 0x6e, 0xbc, 0x9b, 0x6d, 0xf6, 0x74, 0x48, + 0xdf, 0xaa, 0x5b, 0x83, 0xeb, 0xc9, 0x4b, 0x2e, 0x66, 0x0d, 0x4f, 0xa7, + 0x19, 0xc1, 0x45, 0xbd, 0x1b, 0x87, 0x67, 0x7d, 0xf8, 0x2c, 0xdb, 0x46, + 0x6e, 0xa8, 0x91, 0x82, 0xf9, 0x39, 0x0f, 0x17, 0x32, 0x45, 0x6e, 0x32, + 0x4c, 0x6e, 0x72, 0x7b, 0x46, 0xd6, 0x26, 0xfa, 0xe2, 0x9f, 0x8e, 0xfb, + 0x90, 0x22, 0x37, 0xf9, 0x7c, 0xb9, 0x96, 0x6f, 0x71, 0xe2, 0x9e, 0x62, + 0x2e, 0x11, 0x47, 0x2d, 0x6b, 0x86, 0x35, 0x7f, 0x84, 0x3d, 0xd2, 0xe6, + 0x9c, 0xc4, 0x9a, 0x1b, 0xf7, 0x47, 0x6b, 0x90, 0x5c, 0xa0, 0x54, 0x80, + 0x58, 0x52, 0xbd, 0x32, 0x42, 0xbd, 0xfa, 0x69, 0x67, 0x17, 0xaa, 0xe6, + 0xe0, 0xbe, 0x86, 0xb2, 0xee, 0x7f, 0xc4, 0x87, 0xbd, 0x14, 0x72, 0x9e, + 0x58, 0x02, 0xe6, 0xd0, 0x41, 0x8e, 0x55, 0x3f, 0x57, 0x0d, 0x5f, 0x38, + 0x8e, 0xbc, 0x5d, 0x8b, 0x57, 0x33, 0x1f, 0xcb, 0xb1, 0x48, 0x97, 0xde, + 0xc6, 0xc2, 0xa0, 0xf1, 0x53, 0xfc, 0xaf, 0x6b, 0x1c, 0xe4, 0xb2, 0x31, + 0xcf, 0x3a, 0xe2, 0x43, 0x0d, 0x73, 0x61, 0xc6, 0x08, 0x77, 0x8e, 0x4a, + 0x87, 0x70, 0xfa, 0x66, 0x4f, 0x07, 0xe3, 0x58, 0xd6, 0x72, 0x13, 0x05, + 0xde, 0x47, 0x1d, 0x9c, 0xea, 0x1a, 0x62, 0xc3, 0x3d, 0x37, 0x59, 0xb8, + 0x3b, 0x1a, 0x36, 0x64, 0x6d, 0xbb, 0xfc, 0xb4, 0x9b, 0xb2, 0x5a, 0x3d, + 0x5b, 0x69, 0xe7, 0xb5, 0x19, 0x59, 0x1f, 0xb4, 0xf0, 0x74, 0x74, 0xc8, + 0x57, 0x49, 0x3b, 0xf7, 0x1a, 0xf8, 0x01, 0xa3, 0xe8, 0x0b, 0x76, 0x8b, + 0xf9, 0x9f, 0x3b, 0xc2, 0x1d, 0xf5, 0xce, 0x94, 0x6c, 0xb7, 0x24, 0xaa, + 0x63, 0xa1, 0xbc, 0xcb, 0x11, 0xee, 0x6e, 0x56, 0x6f, 0x59, 0x55, 0xb9, + 0x95, 0x9e, 0xdb, 0x88, 0x11, 0x5b, 0x89, 0x11, 0xeb, 0x88, 0x11, 0xf7, + 0xb4, 0x68, 0x7d, 0xff, 0xa2, 0x86, 0xce, 0x95, 0x33, 0xae, 0xff, 0x5e, + 0xc1, 0x5f, 0x81, 0x50, 0xe2, 0xa4, 0xc2, 0x92, 0x4a, 0x84, 0xcf, 0xec, + 0xa2, 0xaf, 0x96, 0x44, 0x53, 0xa9, 0x7a, 0x62, 0x4b, 0x45, 0x63, 0x38, + 0xf9, 0x73, 0x87, 0xd6, 0x51, 0xe1, 0x08, 0xd2, 0x0e, 0x11, 0x18, 0x61, + 0xc1, 0x0c, 0x17, 0x73, 0x66, 0x35, 0xee, 0xb3, 0xb1, 0xbd, 0x90, 0x67, + 0xdb, 0x99, 0x67, 0xeb, 0x5b, 0xca, 0x90, 0xf7, 0x49, 0xbf, 0x4b, 0x8e, + 0x79, 0x4c, 0xfa, 0x5d, 0xbd, 0xed, 0x34, 0xef, 0x56, 0x9c, 0x7e, 0xb5, + 0x18, 0xd3, 0xb2, 0xf7, 0xd9, 0x17, 0xf7, 0x3d, 0xe2, 0x44, 0x5d, 0x4b, + 0x2d, 0x82, 0x0b, 0xd8, 0x83, 0x39, 0x3a, 0x91, 0xa6, 0x6f, 0x1f, 0x0a, + 0x77, 0xe2, 0x21, 0xf2, 0x8b, 0x3b, 0xc9, 0x6b, 0xf6, 0x9b, 0xa1, 0xe3, + 0x77, 0xb2, 0x87, 0x4c, 0x7e, 0x85, 0xef, 0xa8, 0x2e, 0xf4, 0x98, 0xfc, + 0x65, 0x1d, 0xee, 0x36, 0x7f, 0xa1, 0x5c, 0x8d, 0xec, 0xff, 0xa5, 0x77, + 0x73, 0x68, 0x91, 0x94, 0xa3, 0x17, 0xc9, 0x59, 0xa9, 0x19, 0xf0, 0xf9, + 0x63, 0x9d, 0xf8, 0x0b, 0xb3, 0x1c, 0xdf, 0x6c, 0xdd, 0xa2, 0x6e, 0xcf, + 0x75, 0xe0, 0x71, 0xb3, 0xd9, 0xee, 0xdb, 0x9e, 0xa3, 0xec, 0x9b, 0x1a, + 0x3b, 0xf0, 0x98, 0xe0, 0x91, 0xb9, 0x5d, 0xed, 0x98, 0x26, 0x76, 0x99, + 0x5d, 0xea, 0x9b, 0x82, 0x5b, 0xe6, 0x80, 0xea, 0x12, 0x1c, 0x33, 0x89, + 0x63, 0x97, 0xf1, 0xce, 0x20, 0xde, 0x5d, 0x8d, 0x25, 0x37, 0x61, 0x4d, + 0xb9, 0x03, 0x75, 0x7a, 0xc8, 0xd3, 0x9e, 0x91, 0xfe, 0xf0, 0x9f, 0x2e, + 0x25, 0x7d, 0xec, 0x31, 0x6c, 0x2c, 0xf9, 0xef, 0x97, 0xce, 0xda, 0xfc, + 0xb1, 0x54, 0x27, 0x57, 0xe3, 0xce, 0xcc, 0x22, 0xbb, 0x87, 0x8a, 0x30, + 0x4e, 0x2b, 0xea, 0x04, 0xd3, 0x65, 0x4d, 0xac, 0x2f, 0x9e, 0x1e, 0x57, + 0xb2, 0x3f, 0x68, 0x63, 0x5a, 0xd3, 0xd4, 0x6a, 0x59, 0x3f, 0xc5, 0xda, + 0xe8, 0x1d, 0xb8, 0x83, 0x1e, 0xac, 0xd1, 0xbf, 0x8d, 0xbb, 0x7c, 0xd5, + 0xec, 0x59, 0x4b, 0xf6, 0x4c, 0x97, 0x17, 0xd7, 0x23, 0x8a, 0x39, 0x26, + 0xb5, 0x3f, 0x19, 0xdf, 0x34, 0xf1, 0x69, 0xb9, 0xf0, 0x64, 0xf2, 0x18, + 0x5e, 0xdf, 0x67, 0x5f, 0x77, 0xf1, 0xfa, 0xc8, 0x55, 0xbc, 0xd4, 0x39, + 0xa1, 0xf9, 0x74, 0x15, 0x62, 0x8e, 0xe1, 0x35, 0x27, 0x79, 0xf2, 0x67, + 0x8d, 0xe1, 0x3c, 0xe1, 0xcf, 0x5d, 0x4b, 0x2e, 0x3a, 0x9f, 0xf5, 0xe3, + 0xd3, 0xac, 0x0f, 0xe7, 0xb3, 0x1f, 0x96, 0x0b, 0x2f, 0x79, 0xbf, 0x88, + 0xb1, 0x51, 0x62, 0xec, 0xed, 0x19, 0x59, 0x8b, 0x0f, 0x32, 0x3f, 0x9e, + 0xba, 0x14, 0xbc, 0xd6, 0xcd, 0xf9, 0x8a, 0x0e, 0x2e, 0x7e, 0x8e, 0xe0, + 0x6e, 0xc6, 0xcc, 0x56, 0xf3, 0xc4, 0xa5, 0xa9, 0xba, 0x4e, 0x1c, 0xa3, + 0xdd, 0x6a, 0x8b, 0xef, 0xdd, 0x38, 0x75, 0xb4, 0xa8, 0xa7, 0x0e, 0x2f, + 0xf9, 0x70, 0xcd, 0x04, 0x7a, 0xa8, 0x7e, 0x33, 0xf3, 0xfd, 0x81, 0x87, + 0x38, 0xd7, 0x27, 0x99, 0x57, 0x1f, 0x70, 0xbc, 0x0b, 0xf6, 0x78, 0x7e, + 0x8e, 0xf7, 0xd9, 0xa5, 0x64, 0x91, 0x6f, 0x3b, 0x26, 0xb0, 0x58, 0x96, + 0x15, 0x7b, 0xf8, 0xcc, 0xbb, 0xf6, 0x7d, 0x1f, 0xef, 0xaf, 0xaa, 0x90, + 0x3a, 0x53, 0xa1, 0xcb, 0x7e, 0xfa, 0xbe, 0xf8, 0x9a, 0xab, 0xfa, 0x00, + 0x27, 0xe7, 0xb7, 0x9b, 0xf3, 0xf3, 0x71, 0x9c, 0xfa, 0x09, 0x8d, 0xf3, + 0x0b, 0x09, 0x76, 0x1c, 0x60, 0xca, 0xf4, 0xd7, 0x93, 0x77, 0xd7, 0x36, + 0x86, 0x23, 0xac, 0xb5, 0x0f, 0x64, 0xc9, 0xf1, 0x3f, 0xe2, 0x98, 0xef, + 0xb1, 0xee, 0x57, 0xe8, 0x01, 0x34, 0xce, 0x2d, 0x46, 0x63, 0xb8, 0x30, + 0x7e, 0x70, 0x6e, 0x0b, 0x06, 0x19, 0x4b, 0x83, 0x8c, 0xb1, 0x83, 0xe6, + 0x04, 0xaf, 0x75, 0xe2, 0x60, 0x6e, 0x35, 0xb9, 0xdb, 0xaf, 0xdb, 0xdd, + 0x4f, 0x5f, 0x2c, 0x71, 0xa3, 0x52, 0xee, 0xfd, 0x26, 0x7e, 0xf2, 0x5d, + 0x0c, 0xb0, 0xbf, 0x3c, 0x98, 0x49, 0xe1, 0xee, 0xcc, 0x1f, 0x93, 0x73, + 0xdb, 0xf5, 0x79, 0x0f, 0x31, 0xe5, 0x40, 0x2d, 0xf3, 0xf1, 0xaf, 0xa2, + 0x61, 0xe1, 0x9c, 0xdb, 0xab, 0x20, 0x1c, 0x26, 0xdc, 0x76, 0xbd, 0xb2, + 0x50, 0x1e, 0x45, 0x5f, 0x7b, 0x6b, 0x38, 0x72, 0x01, 0x0f, 0x58, 0xb2, + 0x66, 0xed, 0x2c, 0xf2, 0x19, 0xe9, 0xad, 0x65, 0xef, 0x61, 0x4d, 0x91, + 0x7b, 0xae, 0xcd, 0xbd, 0xf5, 0x6b, 0xeb, 0x32, 0xc1, 0x62, 0x3d, 0xf5, + 0xa8, 0x35, 0x1c, 0xe7, 0x30, 0xb9, 0xe2, 0x19, 0xe3, 0x6c, 0xa0, 0x1c, + 0x0e, 0xb8, 0x5a, 0x14, 0xee, 0x35, 0xca, 0x90, 0xf2, 0x5b, 0xd8, 0xce, + 0xcf, 0xbd, 0xc4, 0xae, 0xf7, 0xc8, 0x83, 0xa6, 0x7c, 0x3e, 0x72, 0x70, + 0xd6, 0x0c, 0xc7, 0x74, 0x99, 0xd4, 0x8a, 0xa0, 0x43, 0xf0, 0x3f, 0x58, + 0xcc, 0x87, 0xab, 0xd7, 0x52, 0x84, 0xf7, 0x94, 0xd6, 0x33, 0x5a, 0xc8, + 0x07, 0x65, 0xee, 0x1e, 0x45, 0xfe, 0x11, 0x01, 0x39, 0xe2, 0x2e, 0x23, + 0xcf, 0x94, 0x4d, 0x7c, 0xee, 0x80, 0x76, 0xfc, 0x5d, 0xf6, 0xce, 0x07, + 0x1b, 0xb4, 0xe3, 0xbf, 0x4d, 0xf2, 0x33, 0x70, 0xcc, 0x8d, 0x7b, 0x8e, + 0xad, 0x47, 0xad, 0xbd, 0xae, 0x36, 0xc2, 0xfc, 0x74, 0x20, 0xa0, 0x0f, + 0x7d, 0xe9, 0x82, 0x93, 0xf1, 0xf3, 0x1d, 0xb4, 0xd9, 0xd7, 0x87, 0xb1, + 0x27, 0xe3, 0x51, 0x9b, 0x32, 0xac, 0x31, 0xb7, 0x7e, 0x07, 0x65, 0x2d, + 0x49, 0xea, 0x25, 0xd7, 0xe5, 0xef, 0xdb, 0xd8, 0xf3, 0x8a, 0x7e, 0xe5, + 0xac, 0x95, 0xd4, 0xad, 0x45, 0xc7, 0xe0, 0x31, 0x97, 0xda, 0x61, 0xfe, + 0x57, 0xeb, 0xf3, 0x6b, 0xc9, 0xa3, 0xa5, 0x5e, 0xb5, 0x54, 0xca, 0xf9, + 0x02, 0x3e, 0x93, 0x20, 0xb6, 0xf7, 0xb0, 0x76, 0x97, 0xe3, 0x36, 0xfb, + 0xfd, 0x3b, 0xcb, 0x0b, 0x73, 0x12, 0x8c, 0x6f, 0x67, 0x3f, 0x22, 0xcf, + 0x5c, 0x2a, 0xce, 0xb3, 0xdb, 0x5d, 0x38, 0xc3, 0x20, 0xf9, 0xd1, 0x83, + 0xa5, 0x74, 0x42, 0x43, 0x58, 0x62, 0xb5, 0x07, 0x0d, 0xd9, 0x05, 0xc5, + 0x23, 0x20, 0x23, 0xb8, 0xcb, 0xcc, 0xb3, 0xc6, 0xe8, 0xe4, 0x51, 0xb4, + 0xdd, 0x42, 0x79, 0xbf, 0xc1, 0xfd, 0xab, 0xef, 0x0b, 0xa7, 0x23, 0x77, + 0xf7, 0x0a, 0x87, 0xff, 0x4d, 0xf7, 0xbf, 0x01, 0xb9, 0xe7, 0xd2, 0xff, + 0x04, 0xfb, 0x33, 0xe1, 0xce, 0x2a, 0x87, 0xc4, 0xcf, 0x9f, 0x60, 0xdf, + 0xf4, 0x7f, 0xe4, 0x7d, 0x91, 0xdf, 0xcf, 0xde, 0xcc, 0xa5, 0x3a, 0x4c, + 0x1d, 0x7b, 0x8f, 0x39, 0x6e, 0x29, 0xc7, 0x0f, 0xac, 0x8a, 0x85, 0x83, + 0x68, 0x88, 0x0e, 0xf3, 0x79, 0x85, 0x76, 0xf2, 0xf0, 0x87, 0x8d, 0xb5, + 0x58, 0x5f, 0x67, 0x61, 0x77, 0xf4, 0x8c, 0xd5, 0xd3, 0x25, 0x36, 0x54, + 0x58, 0xc7, 0xeb, 0xcf, 0xd2, 0xbf, 0x27, 0x0c, 0x17, 0x1a, 0x16, 0xc8, + 0x1a, 0xa9, 0x36, 0x96, 0xc0, 0xdd, 0xf6, 0x98, 0x75, 0xec, 0x5b, 0x6a, + 0x75, 0xbd, 0x6f, 0x9b, 0xa3, 0x61, 0xec, 0x4d, 0xc6, 0xd3, 0x9a, 0x96, + 0xab, 0xef, 0x95, 0x6c, 0x62, 0x90, 0x9b, 0x3f, 0x6d, 0xe1, 0x9a, 0x21, + 0xf8, 0x5a, 0xae, 0xf6, 0x7f, 0x49, 0xef, 0x7e, 0xe6, 0x32, 0x52, 0xb5, + 0x31, 0x59, 0x43, 0x0b, 0x53, 0x4e, 0x3f, 0xee, 0xcb, 0x0d, 0xe3, 0xde, + 0x4c, 0xb1, 0x57, 0x61, 0x6c, 0xeb, 0x2d, 0x57, 0xe6, 0x76, 0x57, 0x26, + 0x9c, 0xac, 0x29, 0xce, 0xed, 0xc0, 0xb4, 0xac, 0x95, 0x13, 0x9b, 0x69, + 0xd3, 0x3e, 0xdb, 0xa6, 0x5d, 0x30, 0xb2, 0x57, 0xe4, 0xf6, 0x52, 0xae, + 0x27, 0x26, 0x76, 0x0b, 0xb7, 0x79, 0x28, 0x77, 0x2f, 0xe5, 0xee, 0xbe, + 0x4a, 0x6e, 0x8f, 0x71, 0x45, 0xee, 0xae, 0x4c, 0xf8, 0xb8, 0xa3, 0x28, + 0xf7, 0xfe, 0xe9, 0x92, 0x8c, 0x14, 0xb6, 0xb6, 0xa4, 0x90, 0x5d, 0x75, + 0xc0, 0x3a, 0x60, 0xdb, 0xe3, 0x2f, 0xed, 0xeb, 0xeb, 0x1a, 0xce, 0x31, + 0x1f, 0xf8, 0x67, 0xcc, 0x60, 0x1e, 0x34, 0x93, 0x73, 0x46, 0xc8, 0x39, + 0x75, 0xe6, 0x43, 0x90, 0x39, 0x52, 0x5a, 0xf7, 0xd3, 0xde, 0xda, 0xe4, + 0x4c, 0x90, 0x97, 0xfa, 0xdd, 0x1b, 0x7f, 0x6d, 0xad, 0x68, 0x3d, 0x7b, + 0xdb, 0x0d, 0xe6, 0x16, 0xf2, 0x07, 0x37, 0xb9, 0x60, 0x95, 0x5a, 0x97, + 0x91, 0x35, 0x23, 0xc9, 0xe7, 0x62, 0x9f, 0x91, 0x93, 0x1e, 0x7a, 0x27, + 0x7b, 0xaf, 0x35, 0xf4, 0x71, 0x12, 0x47, 0x72, 0x07, 0x55, 0xc2, 0xcf, + 0xb1, 0x4c, 0xa9, 0x2d, 0x60, 0xbd, 0xed, 0x44, 0x15, 0xe3, 0x69, 0x61, + 0x2c, 0x12, 0xff, 0x7e, 0x83, 0x25, 0x6b, 0xf0, 0xee, 0x05, 0xb1, 0xb6, + 0xf8, 0xf6, 0x06, 0x27, 0x8e, 0xda, 0x3c, 0x48, 0x3b, 0x55, 0xd8, 0xd3, + 0xf2, 0xa8, 0x5b, 0x33, 0x52, 0x83, 0x64, 0xcf, 0x78, 0x10, 0xcb, 0x5a, + 0xf2, 0xe4, 0x40, 0x89, 0xdf, 0xf7, 0x42, 0x63, 0x1f, 0x7b, 0x04, 0xcf, + 0xeb, 0x01, 0x77, 0x57, 0xce, 0xa5, 0x36, 0x9a, 0x33, 0x9e, 0x4d, 0xa6, + 0x17, 0x55, 0x31, 0x2d, 0xbf, 0xd9, 0x19, 0xb2, 0xb1, 0x5c, 0xc5, 0xb6, + 0xc4, 0xaf, 0xcb, 0x76, 0x53, 0xdf, 0x02, 0xae, 0xea, 0x53, 0x6e, 0xcf, + 0x86, 0xc9, 0x90, 0x31, 0x68, 0xf3, 0xc7, 0xce, 0x78, 0x43, 0xd6, 0xb2, + 0x2e, 0x1a, 0xf9, 0x9f, 0xba, 0xed, 0xef, 0xfd, 0xf1, 0xd5, 0xd9, 0x66, + 0xec, 0x20, 0xbf, 0x5b, 0x33, 0xd9, 0x0c, 0xdf, 0x24, 0xf0, 0xec, 0xb1, + 0x00, 0x6a, 0x33, 0xda, 0xf1, 0x7e, 0x67, 0x37, 0xc6, 0x66, 0xdb, 0x91, + 0xc9, 0x79, 0xe6, 0x83, 0x0e, 0x0b, 0x9f, 0x45, 0x1d, 0xb8, 0xc5, 0x38, + 0xad, 0xf2, 0x0b, 0x15, 0xb6, 0x19, 0x9b, 0xd5, 0xf9, 0x22, 0x4f, 0x96, + 0x7e, 0x69, 0x4f, 0x91, 0xfb, 0xfa, 0x75, 0xd9, 0x77, 0x9c, 0x61, 0xdf, + 0xa0, 0x70, 0x8d, 0x8d, 0xeb, 0x03, 0xf1, 0xb6, 0xac, 0xf0, 0xb9, 0x95, + 0x9e, 0x5b, 0x89, 0x37, 0x1f, 0x91, 0x67, 0x2c, 0x6b, 0xd1, 0x7a, 0x8f, + 0x39, 0x52, 0x11, 0xe1, 0xc0, 0x59, 0x68, 0xdd, 0x9d, 0x45, 0xbe, 0xdb, + 0x34, 0x53, 0xe0, 0xc2, 0xd7, 0xcf, 0xb4, 0x7a, 0x36, 0xf2, 0xd9, 0xeb, + 0xa2, 0x5a, 0xd0, 0xe1, 0xf0, 0x61, 0xcc, 0x96, 0xd3, 0x13, 0x37, 0x66, + 0xca, 0x89, 0xe5, 0x62, 0x13, 0x7b, 0x8f, 0x26, 0xde, 0x98, 0xdd, 0x89, + 0x23, 0x66, 0xb7, 0x67, 0x87, 0x70, 0x35, 0x84, 0x22, 0x4b, 0xd4, 0x3a, + 0xf2, 0xf9, 0x50, 0x70, 0xb5, 0x73, 0xad, 0x4a, 0xb9, 0x9a, 0x8c, 0x19, + 0xac, 0x53, 0xc5, 0xb3, 0x42, 0xf6, 0xbc, 0xc3, 0x59, 0x60, 0xcd, 0x31, + 0xcf, 0x7c, 0xc2, 0xbe, 0xe4, 0xc0, 0x5a, 0xe3, 0x17, 0x48, 0xfa, 0xb5, + 0x23, 0xc2, 0x67, 0xdb, 0x89, 0xc7, 0x29, 0xb2, 0xca, 0x35, 0xc7, 0x24, + 0xd7, 0xbb, 0xe2, 0x4b, 0x47, 0x91, 0xaf, 0x64, 0x3f, 0x44, 0x7b, 0x7a, + 0x3b, 0x73, 0xc0, 0x3a, 0xd6, 0xf2, 0x67, 0x8c, 0x2f, 0xad, 0x64, 0x71, + 0xcf, 0x6f, 0xeb, 0xa4, 0x22, 0x97, 0x8d, 0x61, 0x74, 0xd6, 0xe5, 0xdd, + 0x62, 0xb6, 0x22, 0x9d, 0x73, 0x5d, 0x25, 0x3b, 0x7c, 0xe4, 0x3a, 0x87, + 0x83, 0xf3, 0xfc, 0x0e, 0x6d, 0x55, 0xaa, 0xbb, 0x3b, 0xed, 0xfa, 0x5a, + 0xce, 0x79, 0x4a, 0xfd, 0xa9, 0x8c, 0x7d, 0x9b, 0xf5, 0x57, 0xd6, 0x2a, + 0xbb, 0xe2, 0xab, 0x4c, 0x2d, 0x29, 0xfd, 0x76, 0x80, 0xb6, 0x0a, 0x98, + 0x52, 0x9b, 0xee, 0x63, 0x6d, 0xd2, 0x82, 0x0f, 0xab, 0x84, 0xe7, 0x16, + 0x53, 0x9b, 0x5f, 0xea, 0x74, 0xc0, 0xd4, 0xb5, 0xc8, 0x3b, 0x4e, 0xad, + 0xb7, 0xde, 0x59, 0xe8, 0x01, 0x9a, 0x67, 0x7a, 0x58, 0x3b, 0x0b, 0xf6, + 0x2d, 0xac, 0xcb, 0x26, 0xe3, 0xe1, 0x19, 0xe1, 0xfa, 0x96, 0xf5, 0x6e, + 0xb4, 0x03, 0x0f, 0x9a, 0xc2, 0xf1, 0xe5, 0xfa, 0xbd, 0xf1, 0xc6, 0x29, + 0x37, 0x75, 0x53, 0xe4, 0xb7, 0x1d, 0x8c, 0xc7, 0x92, 0x8e, 0xd2, 0xcb, + 0x34, 0x63, 0x0b, 0xf9, 0xfe, 0xa6, 0x49, 0x3b, 0x7e, 0x12, 0x9b, 0xc9, + 0xf7, 0x37, 0x46, 0xf3, 0xf5, 0x1e, 0x74, 0xe2, 0x28, 0xf9, 0xce, 0xda, + 0x22, 0xe7, 0x2f, 0xb7, 0x39, 0x3f, 0xf9, 0xbd, 0x61, 0x59, 0x3f, 0x27, + 0xe7, 0xbf, 0x9d, 0x9c, 0xbf, 0xde, 0xe6, 0xfc, 0x2e, 0xec, 0x20, 0xdf, + 0x0f, 0x90, 0xef, 0x77, 0x93, 0xef, 0xd7, 0x92, 0xef, 0xbf, 0x13, 0xfd, + 0x08, 0xf7, 0xfb, 0x0a, 0xf6, 0xdd, 0x15, 0x29, 0x63, 0xec, 0x3b, 0x98, + 0xc3, 0x9f, 0x93, 0x97, 0x38, 0xc9, 0x4b, 0x3c, 0xea, 0x2e, 0xfb, 0xde, + 0x7f, 0xb9, 0xcc, 0xf9, 0x2b, 0xe9, 0xef, 0x4d, 0xe4, 0xfc, 0x6b, 0xc2, + 0x05, 0x2e, 0x2a, 0x9c, 0xdf, 0x45, 0xce, 0xff, 0xa3, 0xe8, 0x50, 0xbe, + 0x9e, 0xb5, 0x2f, 0x67, 0x73, 0x7e, 0xe1, 0xfa, 0xc2, 0xaf, 0xb1, 0x28, + 0x80, 0x70, 0xe2, 0x16, 0xf6, 0x9c, 0xe5, 0x4a, 0xeb, 0x3c, 0x04, 0x9b, + 0xf3, 0xcf, 0x87, 0x14, 0x0e, 0x48, 0x99, 0xb5, 0xc8, 0xd5, 0x3f, 0x26, + 0xe7, 0xdf, 0x41, 0xae, 0x1c, 0x20, 0xe7, 0xff, 0x58, 0xc7, 0x77, 0xeb, + 0x11, 0xee, 0x9b, 0x27, 0xe7, 0xff, 0xa4, 0xc8, 0xf9, 0x4f, 0x08, 0xe7, + 0x37, 0x0a, 0x9c, 0xbf, 0xfd, 0x2a, 0xce, 0xff, 0x2e, 0x39, 0xff, 0x46, + 0xda, 0x4c, 0x38, 0xff, 0x07, 0x94, 0xf3, 0x0c, 0x39, 0xff, 0x26, 0xfa, + 0xfc, 0xe9, 0x39, 0xe9, 0x85, 0xaf, 0xac, 0x47, 0x4e, 0xcd, 0x09, 0xff, + 0xd6, 0xce, 0xfd, 0xc2, 0x89, 0x3f, 0x2a, 0xae, 0x47, 0x92, 0x27, 0x58, + 0xd6, 0x09, 0xf2, 0x8e, 0x13, 0xe4, 0xfc, 0x5b, 0x72, 0xd2, 0x9b, 0xbb, + 0xd9, 0x9b, 0xd7, 0x22, 0x79, 0x6b, 0x35, 0xba, 0x8f, 0x29, 0x55, 0x49, + 0xde, 0x7f, 0xfb, 0x8a, 0x08, 0xf5, 0xeb, 0xa7, 0xbd, 0xd9, 0x8b, 0xce, + 0x09, 0xf6, 0xf5, 0xc5, 0xf7, 0xb3, 0x87, 0xd8, 0x1b, 0xbd, 0xc2, 0xfb, + 0xef, 0xe4, 0x78, 0x1e, 0xf2, 0x7e, 0x57, 0x58, 0xde, 0xf3, 0xcc, 0xa3, + 0x70, 0x56, 0x8b, 0xfd, 0xc6, 0xbe, 0xf8, 0xa7, 0x13, 0xc2, 0x61, 0xbe, + 0x4d, 0x0e, 0xa3, 0xf5, 0xbd, 0x4d, 0x2e, 0xfb, 0x4a, 0xf8, 0x55, 0xdb, + 0xd7, 0x2f, 0x19, 0xd2, 0xd3, 0x6d, 0x89, 0xbb, 0x47, 0x25, 0x6e, 0xba, + 0xe2, 0xbb, 0xd3, 0xa1, 0xa0, 0xb3, 0x88, 0x01, 0x7a, 0xb6, 0x1c, 0x85, + 0xf5, 0xc8, 0xd2, 0x9a, 0x78, 0x02, 0xe1, 0x95, 0x85, 0xdc, 0x09, 0x67, + 0xfb, 0xd8, 0x27, 0xca, 0x79, 0x1a, 0x9f, 0x77, 0x03, 0xeb, 0xde, 0x18, + 0x39, 0x6b, 0xc5, 0xe9, 0x80, 0x77, 0x2b, 0x6b, 0x4c, 0xcd, 0x69, 0xe1, + 0xd5, 0xc9, 0xb8, 0xef, 0xb1, 0x12, 0x0f, 0x2d, 0x61, 0x61, 0x27, 0x1e, + 0x36, 0xb7, 0x30, 0xff, 0xb4, 0x40, 0xa7, 0x0a, 0x25, 0x07, 0xe9, 0xff, + 0x54, 0xfd, 0x95, 0xf5, 0xc3, 0x1e, 0x59, 0x5f, 0xfc, 0xb5, 0xf5, 0xc3, + 0x3d, 0x19, 0xfc, 0xd2, 0xd9, 0x5a, 0x81, 0x73, 0xcd, 0x65, 0x40, 0x9d, + 0x16, 0x18, 0xc6, 0x03, 0xc4, 0xeb, 0x5f, 0xa8, 0x5a, 0xdd, 0xd5, 0xb7, + 0x0d, 0x5a, 0xe0, 0x25, 0x55, 0xcd, 0x77, 0x65, 0xfd, 0x7d, 0x27, 0x39, + 0x76, 0x28, 0xff, 0x23, 0x99, 0xf4, 0x57, 0xe5, 0xfd, 0x9d, 0xec, 0xc9, + 0x76, 0x62, 0x2c, 0x57, 0xe2, 0x52, 0x12, 0x93, 0x3e, 0x6c, 0x38, 0x56, + 0xc0, 0xac, 0xa6, 0xac, 0x67, 0xfe, 0x3c, 0x0a, 0x73, 0xab, 0xe1, 0x5c, + 0xe7, 0x46, 0x3f, 0xbf, 0x34, 0xf5, 0x4d, 0xc1, 0x07, 0x1d, 0xeb, 0x4d, + 0x89, 0xdb, 0x1e, 0xf6, 0x01, 0x9d, 0x78, 0xd4, 0x5c, 0xc2, 0xfe, 0xa1, + 0x1b, 0x0f, 0x4d, 0x76, 0xd9, 0xba, 0x67, 0xd8, 0xaf, 0xf7, 0x1a, 0x29, + 0xe9, 0x25, 0xe6, 0xdf, 0x40, 0x5e, 0xa3, 0xe5, 0x55, 0x0b, 0xf9, 0x42, + 0x3b, 0x6b, 0xc1, 0xc6, 0x93, 0x3a, 0xe4, 0x7c, 0xc6, 0x01, 0xce, 0xb3, + 0x9f, 0xf3, 0xb9, 0x3f, 0x97, 0x42, 0x62, 0x91, 0x0f, 0x6d, 0x2d, 0x87, + 0x81, 0xdf, 0x75, 0xe1, 0xe4, 0xb1, 0x04, 0x56, 0xb5, 0x7c, 0x15, 0xc1, + 0xdf, 0x75, 0x13, 0x23, 0xab, 0x71, 0x46, 0x7c, 0xe4, 0x10, 0x15, 0x04, + 0xdf, 0x59, 0x4b, 0x18, 0x4f, 0xcf, 0xd3, 0x7e, 0xcf, 0xd1, 0x96, 0xdf, + 0xbb, 0xbc, 0xc7, 0x23, 0x7c, 0xa8, 0x8d, 0x7c, 0xc8, 0xa3, 0x36, 0x64, + 0xda, 0x88, 0x57, 0xb8, 0x54, 0x81, 0xf0, 0xb9, 0x8b, 0xce, 0x14, 0x31, + 0x77, 0x8a, 0x38, 0x39, 0xe3, 0xb9, 0xcd, 0xb4, 0xcf, 0x3c, 0x78, 0xbb, + 0xc9, 0xcf, 0xd8, 0x37, 0x78, 0xbb, 0x72, 0x8b, 0xbd, 0xb7, 0xe5, 0xbe, + 0xe5, 0x21, 0xa7, 0xe6, 0xa7, 0x60, 0xaf, 0x8c, 0x71, 0xf5, 0x78, 0x7f, + 0x56, 0x89, 0x4a, 0x19, 0x33, 0x88, 0xe4, 0xc9, 0xeb, 0x70, 0xff, 0xc9, + 0x6d, 0xfc, 0xae, 0xe3, 0xfe, 0xb9, 0x2b, 0xfc, 0xbe, 0xc0, 0x73, 0x3f, + 0xf2, 0x08, 0xbf, 0x2f, 0xac, 0xe5, 0x75, 0xc6, 0x83, 0xd9, 0xc3, 0x1e, + 0xe1, 0xa3, 0x6b, 0x8e, 0x15, 0xbe, 0xeb, 0x57, 0x7d, 0x2f, 0xad, 0x4b, + 0x97, 0xf8, 0xff, 0x12, 0xe2, 0x95, 0x35, 0xa9, 0x23, 0x30, 0xa1, 0x9d, + 0xeb, 0x41, 0x68, 0x60, 0x35, 0xb9, 0x71, 0x80, 0xfc, 0xff, 0x93, 0xb0, + 0xf4, 0xb8, 0xd5, 0x58, 0x47, 0xcc, 0x71, 0xe8, 0xd2, 0x1f, 0x0b, 0xff, + 0x7f, 0xdf, 0x53, 0xe0, 0xff, 0x3a, 0xb1, 0x22, 0x02, 0xcf, 0x84, 0xec, + 0x1b, 0x60, 0xb1, 0x87, 0xbc, 0xfd, 0x2f, 0x5a, 0xe1, 0x3e, 0xc8, 0xdc, + 0xb0, 0xf8, 0xdc, 0xe7, 0xf6, 0x73, 0xc2, 0xdb, 0xad, 0xcb, 0xbc, 0x3d, + 0x30, 0x21, 0x39, 0x04, 0xf7, 0x27, 0xe4, 0xd9, 0x9f, 0xd8, 0xf7, 0x7d, + 0x76, 0x1f, 0x51, 0x41, 0x3d, 0xde, 0xb7, 0xf5, 0xd9, 0x67, 0xeb, 0x53, + 0xe2, 0xeb, 0xf5, 0x94, 0x4f, 0x9d, 0xe6, 0x1f, 0xa4, 0x4e, 0xe4, 0xeb, + 0xe4, 0xe4, 0x68, 0x66, 0x1e, 0x1e, 0x90, 0xb5, 0x72, 0xea, 0xc6, 0xea, + 0x84, 0x07, 0x4e, 0xb4, 0x96, 0x78, 0x7a, 0x35, 0xae, 0x9b, 0xf3, 0xa1, + 0x61, 0xae, 0x30, 0x6e, 0x70, 0xce, 0xc3, 0xbe, 0x52, 0xb8, 0xe8, 0x25, + 0x9b, 0x43, 0xb4, 0xb7, 0xfc, 0xff, 0xf9, 0x6d, 0x8d, 0xfd, 0x8e, 0x70, + 0x22, 0xcb, 0xae, 0x13, 0x6d, 0x2d, 0xdf, 0xb5, 0x70, 0x9b, 0xc4, 0x82, + 0xc4, 0x84, 0x67, 0x7e, 0xca, 0x0e, 0xc3, 0xc7, 0x2a, 0x65, 0x3f, 0x7c, + 0x55, 0xcb, 0xed, 0x56, 0x21, 0xfe, 0xfd, 0xde, 0x2e, 0xe6, 0xd5, 0x23, + 0x94, 0xd9, 0x75, 0x9a, 0xfe, 0x34, 0xbf, 0x6b, 0xfb, 0xe8, 0xb6, 0xd3, + 0x8b, 0xd9, 0xe7, 0xc9, 0xfe, 0x0e, 0x94, 0x2b, 0x76, 0x08, 0x1b, 0xc6, + 0x82, 0x78, 0xc7, 0xf0, 0x20, 0x79, 0x79, 0x6f, 0xa6, 0x3f, 0xfe, 0x7e, + 0x3a, 0x80, 0x61, 0x33, 0x14, 0x7c, 0x87, 0x5c, 0x3a, 0xe5, 0x72, 0xe1, + 0xa1, 0x0c, 0x71, 0xd5, 0x2f, 0xd8, 0x54, 0x5a, 0x5b, 0x94, 0x77, 0x4b, + 0x7f, 0x57, 0x21, 0x58, 0x17, 0x6a, 0xdb, 0x8b, 0x20, 0xe3, 0xbd, 0x95, + 0x79, 0xfa, 0x63, 0x1c, 0x1d, 0x77, 0x60, 0x5f, 0x54, 0x21, 0x71, 0xab, + 0xc1, 0xef, 0x4d, 0xbd, 0x1f, 0xe0, 0x9f, 0xad, 0xa9, 0x85, 0xf2, 0xbe, + 0x9c, 0xdb, 0xfa, 0xc2, 0xaa, 0xd7, 0x75, 0xe6, 0x99, 0x3e, 0xf0, 0x39, + 0x9a, 0xfa, 0xe6, 0xf1, 0xa1, 0x95, 0xe7, 0xbd, 0x8b, 0xca, 0x89, 0xb3, + 0x46, 0x28, 0xe0, 0xa0, 0xf2, 0x52, 0xc7, 0xef, 0x34, 0x64, 0x5f, 0x51, + 0xeb, 0x7b, 0x0a, 0x5a, 0xef, 0x2b, 0x4a, 0xce, 0x63, 0x9e, 0xb7, 0x52, + 0x75, 0x32, 0xae, 0xc2, 0x8d, 0x37, 0x34, 0x75, 0xb0, 0xcf, 0x6f, 0x2b, + 0x53, 0xba, 0xf1, 0x81, 0xfa, 0x07, 0x2b, 0xef, 0xff, 0xc2, 0x7a, 0x57, + 0x2f, 0xc9, 0xd5, 0x82, 0x6e, 0x67, 0x49, 0xb7, 0x20, 0x73, 0x56, 0xd6, + 0x2c, 0x7e, 0x8c, 0x7d, 0xe3, 0x2e, 0xb4, 0x47, 0x3f, 0xb2, 0x52, 0x7e, + 0x91, 0xc9, 0x56, 0xa6, 0x52, 0xe4, 0x17, 0xf6, 0x2b, 0x5e, 0xcc, 0x41, + 0xad, 0x37, 0x85, 0xdb, 0x4b, 0xdc, 0x8d, 0xc1, 0x32, 0x65, 0x0d, 0xd9, + 0xc2, 0xb6, 0xe8, 0x20, 0x2e, 0x46, 0x13, 0xbf, 0xef, 0x86, 0x76, 0xee, + 0x82, 0x53, 0xcb, 0x37, 0x3b, 0x83, 0xca, 0xd3, 0xa8, 0xf7, 0x35, 0xda, + 0xf1, 0x7c, 0x86, 0xfd, 0x62, 0xb5, 0xfb, 0x16, 0x7b, 0xef, 0x67, 0x0c, + 0x73, 0xa3, 0x29, 0xb8, 0xc8, 0x43, 0x87, 0x5a, 0xb5, 0xee, 0x27, 0x95, + 0x16, 0x38, 0xa0, 0x82, 0xea, 0x0e, 0x7d, 0x00, 0x4f, 0x1b, 0xe1, 0xc4, + 0x1a, 0xb5, 0xd8, 0xdd, 0x91, 0x2b, 0xc9, 0x4e, 0x30, 0x07, 0xb5, 0xfc, + 0x05, 0x67, 0x05, 0xea, 0x97, 0xeb, 0x1d, 0x15, 0x4e, 0x6d, 0xe0, 0xb7, + 0xd8, 0xaf, 0x6c, 0xcc, 0xe5, 0x3d, 0x1f, 0x84, 0x59, 0xb3, 0x27, 0x44, + 0x5e, 0xba, 0xb8, 0x3e, 0x3e, 0x86, 0x4d, 0xa3, 0xd6, 0xea, 0xd7, 0xa2, + 0x5a, 0xe0, 0x49, 0x95, 0x92, 0xb3, 0x94, 0x91, 0xfd, 0xd0, 0x83, 0xb3, + 0x68, 0x26, 0x5e, 0x38, 0x70, 0xdd, 0x84, 0xc8, 0x4c, 0x53, 0xe6, 0x21, + 0x54, 0x8c, 0x5b, 0xab, 0x77, 0x18, 0xda, 0xc0, 0x05, 0x67, 0xea, 0x2f, + 0xeb, 0x69, 0xb7, 0xf5, 0x4a, 0xeb, 0x9d, 0x57, 0x83, 0x78, 0x8d, 0x73, + 0x78, 0x26, 0xaa, 0x45, 0xfe, 0x94, 0xf5, 0xea, 0x8f, 0x99, 0x37, 0xce, + 0x98, 0x97, 0x7a, 0x6a, 0x91, 0x69, 0xc8, 0xde, 0x49, 0x10, 0x17, 0x8c, + 0x94, 0x67, 0x43, 0x63, 0x33, 0x39, 0xe4, 0x62, 0xd6, 0x66, 0xdd, 0x3e, + 0x5f, 0x72, 0x28, 0x57, 0x8e, 0xbc, 0x2f, 0x42, 0x0e, 0xd9, 0x09, 0xc7, + 0x68, 0xb5, 0x9a, 0x49, 0x87, 0x8c, 0x76, 0xfc, 0x11, 0xf2, 0x01, 0x09, + 0x91, 0x43, 0xa8, 0x1e, 0xff, 0xb9, 0x55, 0xa3, 0xeb, 0x6d, 0xa3, 0x8a, + 0xe3, 0x3e, 0xb1, 0x98, 0x36, 0xe6, 0x7b, 0x8c, 0xe1, 0x07, 0x89, 0x6f, + 0x77, 0x8c, 0x06, 0xf8, 0x7e, 0x0d, 0x6e, 0x1c, 0x97, 0xb5, 0xcc, 0x6b, + 0x8b, 0x6b, 0x99, 0x8a, 0x71, 0xc0, 0x38, 0x9a, 0xae, 0x46, 0x8a, 0x63, + 0xbc, 0x9b, 0xae, 0xc6, 0x21, 0xc6, 0x77, 0xa5, 0xce, 0xf8, 0x22, 0xe6, + 0xa4, 0x6c, 0x1e, 0xf1, 0x6d, 0xf2, 0x2e, 0xf9, 0xbc, 0x2f, 0x1e, 0x9c, + 0x69, 0xa8, 0xb2, 0xf7, 0xb0, 0x99, 0x9f, 0x87, 0xec, 0x75, 0x73, 0x3f, + 0xf5, 0xab, 0xc1, 0xa9, 0x31, 0xe9, 0x31, 0xd7, 0xac, 0x72, 0x17, 0xcf, + 0x58, 0xbc, 0x4d, 0xce, 0xb7, 0x7a, 0x5c, 0xd9, 0x67, 0x50, 0x3e, 0x5f, + 0x3e, 0xa4, 0xd5, 0x63, 0x15, 0x8e, 0xfb, 0x1c, 0x70, 0xeb, 0xbf, 0x87, + 0x23, 0xbe, 0x66, 0x1c, 0xa6, 0x5e, 0xef, 0xa5, 0xbf, 0xca, 0xde, 0x2c, + 0x28, 0x9c, 0x0d, 0xd7, 0x8d, 0x97, 0x71, 0xcc, 0xd5, 0x58, 0x6f, 0x6c, + 0xc0, 0xcf, 0x7c, 0xc2, 0xd1, 0xdd, 0x7c, 0xc6, 0x85, 0x91, 0x69, 0x9f, + 0xbd, 0xef, 0x74, 0xf8, 0x57, 0x74, 0xfb, 0x4d, 0x3a, 0x15, 0x30, 0xe3, + 0xff, 0xad, 0x93, 0x1b, 0xf3, 0x69, 0x1d, 0x9f, 0xa7, 0x5f, 0xc2, 0x27, + 0x94, 0x9d, 0x9a, 0x2e, 0xc8, 0x3c, 0x96, 0x2b, 0xc8, 0x3d, 0x6c, 0x86, + 0x06, 0xea, 0x9d, 0x22, 0xdf, 0x27, 0x67, 0xa2, 0xfe, 0x9d, 0x63, 0x90, + 0x6d, 0x8e, 0xb3, 0x97, 0x37, 0x1a, 0xd1, 0xee, 0xa3, 0xbf, 0x4c, 0x19, + 0x43, 0x2b, 0xd6, 0xda, 0x00, 0x96, 0x8d, 0x5a, 0x83, 0x81, 0x98, 0x5c, + 0xb7, 0xac, 0xda, 0x95, 0x7a, 0xe0, 0x4d, 0xe6, 0xed, 0x70, 0xce, 0x4d, + 0x1b, 0x8c, 0xe0, 0x54, 0xba, 0x89, 0xd8, 0xef, 0x40, 0x90, 0x7d, 0xe9, + 0x79, 0xe7, 0x08, 0x66, 0xd2, 0xff, 0xc4, 0x5c, 0x70, 0x4b, 0xdd, 0x54, + 0xd3, 0xe9, 0x17, 0xab, 0x04, 0x47, 0x87, 0xd9, 0x83, 0x34, 0x8f, 0x8a, + 0xae, 0xd6, 0x60, 0x0d, 0xe5, 0x3c, 0x44, 0x39, 0xd3, 0x2b, 0xf4, 0xee, + 0x61, 0x25, 0x36, 0xf3, 0xe1, 0x68, 0xee, 0x35, 0x62, 0x99, 0xd8, 0xed, + 0xe3, 0x2a, 0xd9, 0x63, 0x38, 0xcc, 0xde, 0xfe, 0x67, 0x45, 0x39, 0x0f, + 0xe7, 0xce, 0x61, 0x3a, 0xad, 0x57, 0xcb, 0xdf, 0xc3, 0xac, 0x69, 0x23, + 0xec, 0x75, 0xb3, 0x69, 0x3f, 0x46, 0xd3, 0x4d, 0xdd, 0xa3, 0xca, 0x55, + 0xdc, 0x2f, 0xe8, 0xc1, 0x89, 0xe2, 0x33, 0x43, 0x7c, 0x77, 0xe8, 0xf2, + 0xdf, 0x62, 0xa3, 0xc2, 0x39, 0x8e, 0xc2, 0x9e, 0x52, 0x05, 0x7d, 0x27, + 0x6b, 0x06, 0x3a, 0x75, 0x29, 0x93, 0xb3, 0x71, 0x78, 0x69, 0x6c, 0x35, + 0x86, 0x8d, 0x17, 0xb0, 0x8b, 0xf3, 0x1e, 0xa1, 0x3d, 0xc7, 0x4d, 0x39, + 0xaf, 0x11, 0x21, 0xf6, 0xc8, 0x9e, 0x66, 0x67, 0xfc, 0x64, 0xda, 0x85, + 0xa3, 0xcc, 0x99, 0x3d, 0xd1, 0xa6, 0xce, 0x97, 0x19, 0x77, 0x89, 0x6f, + 0xca, 0x99, 0x08, 0x17, 0x46, 0x33, 0xf7, 0x63, 0xaa, 0xae, 0x69, 0xfe, + 0x0c, 0x31, 0xe1, 0x38, 0x71, 0xca, 0x45, 0x4c, 0xa8, 0xcd, 0x38, 0x8a, + 0x7b, 0xfc, 0x06, 0xbf, 0x37, 0x9d, 0x9b, 0xc1, 0x5b, 0xb4, 0x8b, 0xe8, + 0x17, 0x8a, 0xcc, 0x40, 0x9e, 0x2d, 0xac, 0x6f, 0xeb, 0x33, 0xbd, 0x38, + 0x2f, 0x7d, 0xbc, 0x43, 0xea, 0xc0, 0x16, 0x72, 0x9c, 0x26, 0xdf, 0xb0, + 0xc8, 0xee, 0xd2, 0x02, 0x29, 0xfa, 0xea, 0x88, 0xdd, 0x0f, 0x74, 0xc5, + 0x43, 0x59, 0x39, 0x23, 0x59, 0x03, 0x17, 0x63, 0x7f, 0xd8, 0x90, 0x33, + 0x2c, 0x01, 0xef, 0x46, 0xfa, 0x70, 0xd8, 0x6c, 0x6a, 0x0b, 0xa9, 0x1d, + 0x97, 0xf7, 0xbf, 0x5d, 0x7c, 0x76, 0x24, 0xad, 0x75, 0x3f, 0x84, 0xa6, + 0xce, 0xfd, 0xf8, 0x1d, 0x72, 0xd1, 0xa6, 0xe4, 0x18, 0x42, 0xc6, 0x9d, + 0xc4, 0xae, 0x3c, 0x0a, 0xb2, 0x1a, 0xb2, 0xe4, 0x21, 0x0b, 0xbe, 0xb0, + 0x1c, 0xfa, 0x38, 0xc6, 0xc8, 0x5d, 0xaf, 0x6f, 0xd1, 0xe7, 0x87, 0x8a, + 0xf7, 0x0a, 0x67, 0xb6, 0x24, 0x5e, 0xaa, 0x69, 0x83, 0x0a, 0xb8, 0x16, + 0x04, 0x99, 0x7b, 0xb4, 0x45, 0x4e, 0x74, 0x7c, 0x0d, 0xff, 0xcc, 0x78, + 0x1b, 0xcb, 0x29, 0x18, 0x0d, 0xaf, 0xe1, 0xb3, 0xac, 0xe0, 0x48, 0x57, + 0x7c, 0xd3, 0xa8, 0x8f, 0x7a, 0x04, 0xc8, 0x4f, 0x42, 0xc1, 0x87, 0x39, + 0xbf, 0x7d, 0xac, 0xe7, 0x23, 0xc4, 0x90, 0x94, 0xcf, 0xc7, 0x7c, 0xf5, + 0xf1, 0xfa, 0x62, 0xfb, 0x7f, 0x2e, 0xa4, 0x5f, 0x6b, 0x9c, 0x4a, 0xb0, + 0x47, 0x3c, 0x84, 0xd7, 0xc7, 0xf2, 0xec, 0x0f, 0xd7, 0xb2, 0x2f, 0xf4, + 0xe3, 0x98, 0xb9, 0xd0, 0x5e, 0xe3, 0x28, 0xac, 0xa7, 0xf4, 0x93, 0x9b, + 0x5a, 0xb8, 0xc3, 0x70, 0x34, 0x54, 0xd2, 0x0e, 0xd3, 0xec, 0x0f, 0xc7, + 0xd8, 0xdd, 0xdd, 0x6b, 0x3c, 0x00, 0x63, 0x41, 0xca, 0xaa, 0xd2, 0x87, + 0xf1, 0x93, 0x29, 0xe1, 0x02, 0x07, 0xd8, 0xc7, 0x88, 0x7d, 0x1c, 0xf0, + 0x32, 0xd7, 0x6e, 0xb0, 0xd7, 0x0b, 0x9f, 0x8d, 0x2f, 0x9b, 0x2a, 0x70, + 0xc0, 0x1b, 0xb2, 0xd2, 0x5b, 0xd6, 0x90, 0xb7, 0x13, 0x87, 0xa2, 0xb2, + 0xd6, 0x2a, 0xf6, 0x94, 0xb3, 0xbc, 0x85, 0x79, 0x46, 0xb2, 0x0a, 0xc3, + 0xad, 0x57, 0xef, 0xb1, 0xc9, 0xff, 0x5f, 0x94, 0xf6, 0xd9, 0x4a, 0x7b, + 0x0f, 0x7f, 0x6a, 0x9d, 0x97, 0x73, 0xa5, 0x8e, 0x3f, 0xa8, 0x96, 0xf3, + 0x98, 0x53, 0x97, 0xed, 0x2b, 0x36, 0x3d, 0x6d, 0xa5, 0xea, 0x4a, 0x1c, + 0x76, 0x27, 0x39, 0xac, 0xd6, 0xf7, 0xae, 0x6a, 0x62, 0x3d, 0x59, 0xca, + 0x58, 0x70, 0xe1, 0xc1, 0x66, 0x24, 0x97, 0xc4, 0x5c, 0x5d, 0x9f, 0x9b, + 0xab, 0xd1, 0xb6, 0x9c, 0xc1, 0x55, 0xf8, 0xcf, 0x18, 0xf2, 0xdc, 0x19, + 0xac, 0x49, 0xff, 0x93, 0x95, 0xf0, 0xad, 0x81, 0x53, 0xff, 0x3a, 0xf3, + 0x4a, 0x74, 0xf8, 0xdb, 0xea, 0xc2, 0x5a, 0xda, 0x0b, 0xd6, 0xb2, 0x85, + 0x05, 0x7e, 0x79, 0x36, 0x8d, 0x54, 0x45, 0x2c, 0x65, 0x95, 0xe9, 0xe1, + 0xf9, 0x0d, 0xfc, 0xfe, 0xf3, 0xec, 0x21, 0xfc, 0xfd, 0x98, 0x0b, 0xb5, + 0xba, 0xcc, 0x4b, 0x64, 0x86, 0x13, 0x65, 0xce, 0x43, 0x38, 0x37, 0x55, + 0x8a, 0x91, 0x67, 0x59, 0x33, 0xe4, 0x5c, 0x45, 0x0d, 0xca, 0x39, 0xe7, + 0x9f, 0x1a, 0x4e, 0x04, 0x8b, 0xfd, 0x59, 0x81, 0x3b, 0x17, 0x78, 0x73, + 0x28, 0xfb, 0xb3, 0xe2, 0x58, 0xdf, 0xb5, 0xce, 0xdb, 0x3a, 0xc8, 0xd8, + 0x01, 0x7b, 0x0f, 0xeb, 0x41, 0xe6, 0xf0, 0x91, 0x74, 0x53, 0xe4, 0xa2, + 0x9c, 0xd3, 0x62, 0xef, 0x78, 0x1e, 0x23, 0x18, 0x4f, 0x97, 0xf0, 0x35, + 0x20, 0xff, 0xef, 0x10, 0x09, 0x3a, 0x0a, 0xf8, 0x19, 0x74, 0x68, 0xa9, + 0xa0, 0xe3, 0xf7, 0xaa, 0x85, 0x7b, 0x0c, 0xe5, 0x42, 0x81, 0x4a, 0x72, + 0xdb, 0x3d, 0x46, 0x21, 0x76, 0x1a, 0x66, 0xca, 0x10, 0x64, 0xdc, 0x8c, + 0x9a, 0x3f, 0x46, 0x96, 0xb5, 0xf1, 0x68, 0x74, 0x21, 0x92, 0x0b, 0x5d, + 0x78, 0x43, 0x97, 0x5e, 0xe3, 0xbe, 0x78, 0x60, 0x52, 0x1b, 0x70, 0x39, + 0x9b, 0x8c, 0x1c, 0xf6, 0x5a, 0xf9, 0x4e, 0x89, 0xb3, 0x32, 0x1c, 0x6a, + 0xfe, 0x33, 0x6b, 0xca, 0x2f, 0xfa, 0x38, 0xf1, 0xb8, 0x21, 0x18, 0x12, + 0x0a, 0x3c, 0xce, 0x7a, 0x3e, 0xac, 0x97, 0xe2, 0x7f, 0xb2, 0xa8, 0xb7, + 0x9e, 0x7c, 0x06, 0x2f, 0xf2, 0xef, 0x86, 0xc0, 0x51, 0x55, 0x18, 0x6f, + 0xd9, 0xcc, 0xb2, 0x9a, 0xd2, 0x1a, 0xb0, 0x3c, 0x1b, 0xcc, 0xfe, 0x0d, + 0xef, 0x8b, 0x2c, 0x89, 0xcb, 0x0a, 0xe9, 0x83, 0x7d, 0xb0, 0x73, 0x49, + 0xf6, 0x9a, 0x41, 0xfb, 0xc8, 0xb9, 0x0b, 0x27, 0x0e, 0x5d, 0x3e, 0x53, + 0x57, 0xc0, 0xb6, 0x4a, 0x5e, 0xdf, 0x18, 0x3d, 0xbb, 0xca, 0x83, 0x5f, + 0x5a, 0xe7, 0xfd, 0x8b, 0x89, 0x17, 0xe2, 0xef, 0x9d, 0x45, 0x8e, 0xd6, + 0x6f, 0xdb, 0xb0, 0xd0, 0xd3, 0x8a, 0xcf, 0xef, 0x13, 0x9f, 0xe7, 0x7b, + 0xd0, 0x25, 0x67, 0x01, 0x8b, 0x67, 0x89, 0x42, 0xc4, 0xa1, 0xaf, 0x21, + 0x29, 0x9b, 0x34, 0x58, 0x0c, 0xef, 0x78, 0x33, 0xb1, 0xc3, 0xe7, 0xdd, + 0x3c, 0x69, 0xe1, 0xf5, 0xa8, 0x0b, 0x87, 0x46, 0x43, 0xc6, 0x5d, 0x0a, + 0x38, 0x32, 0x6a, 0x59, 0x6f, 0x18, 0xb8, 0xd5, 0xcb, 0xda, 0xff, 0x34, + 0xb9, 0x06, 0xb9, 0x48, 0xb0, 0x42, 0x35, 0x05, 0xae, 0x27, 0x0f, 0x18, + 0x26, 0x9e, 0x3c, 0x3e, 0x07, 0x1c, 0x9f, 0xab, 0x84, 0x39, 0x2e, 0x7b, + 0xc6, 0x95, 0x18, 0x7d, 0xa2, 0x99, 0xba, 0x2f, 0xa0, 0x1c, 0x37, 0xaa, + 0x4e, 0xb6, 0xa1, 0x92, 0x3d, 0xe5, 0xc6, 0x70, 0x1b, 0x3c, 0x27, 0x6b, + 0x58, 0x9b, 0xdd, 0xb8, 0xd0, 0x4a, 0x9f, 0x3f, 0x51, 0x9a, 0x87, 0x60, + 0x1c, 0xe3, 0x2f, 0xa3, 0xc3, 0x64, 0x6c, 0xcf, 0x99, 0x72, 0x56, 0xa0, + 0xda, 0xc6, 0xd9, 0x73, 0xc5, 0xb3, 0xb3, 0xc4, 0xbc, 0xc0, 0x29, 0x55, + 0x83, 0x0f, 0xc7, 0xf3, 0xd7, 0x56, 0xc0, 0x7a, 0x71, 0x49, 0x2c, 0xdc, + 0xbd, 0x8b, 0xb9, 0xb1, 0xec, 0x86, 0x00, 0x7b, 0x25, 0xcb, 0xfa, 0x7c, + 0xa5, 0xf8, 0xa9, 0xdf, 0xee, 0xd7, 0x0b, 0xfd, 0x99, 0xde, 0x7b, 0x50, + 0xa5, 0x36, 0x78, 0x61, 0x7d, 0x5a, 0x11, 0xb3, 0x3e, 0x2b, 0x8b, 0x85, + 0xf9, 0x7e, 0x90, 0xb6, 0xb2, 0xac, 0xb7, 0x5b, 0x2d, 0x2b, 0xdb, 0x1a, + 0xea, 0xf6, 0x39, 0x7d, 0x38, 0xd9, 0x28, 0xfb, 0xba, 0x0e, 0x7c, 0x18, + 0xd6, 0x03, 0xbb, 0x20, 0xe7, 0x33, 0xe8, 0xc7, 0x85, 0x5a, 0x42, 0xce, + 0x46, 0x75, 0x98, 0x0b, 0xf0, 0xf4, 0xec, 0x4a, 0x24, 0xd9, 0x2a, 0x09, + 0xff, 0xb1, 0x0c, 0xbc, 0xb9, 0x04, 0x52, 0xdf, 0xc3, 0x6d, 0x07, 0xe1, + 0xc7, 0x6c, 0xee, 0x10, 0xee, 0x19, 0x97, 0x7e, 0xef, 0xde, 0xb8, 0x7b, + 0xdc, 0xfa, 0x79, 0x20, 0x96, 0x27, 0x7e, 0x5a, 0x56, 0xe5, 0xca, 0xa6, + 0x00, 0xcb, 0x16, 0xb9, 0x48, 0x8f, 0x70, 0xf6, 0xde, 0x0f, 0x51, 0x87, + 0x53, 0xd3, 0x89, 0x6b, 0x9d, 0xec, 0x93, 0x4f, 0x28, 0x1f, 0x7e, 0xc4, + 0x39, 0x3e, 0x95, 0x13, 0x1c, 0xba, 0x3f, 0xbe, 0x69, 0x7c, 0x11, 0x5e, + 0x9c, 0xf5, 0xe3, 0x94, 0xa9, 0x93, 0x4f, 0x41, 0x55, 0xc5, 0xac, 0xda, + 0x5a, 0xea, 0x5a, 0xe5, 0x74, 0x62, 0x43, 0xd4, 0xde, 0x63, 0xe9, 0xad, + 0x56, 0x58, 0x54, 0x01, 0x7d, 0xfe, 0x6e, 0xa0, 0xcf, 0x13, 0x0b, 0x9f, + 0x3b, 0xa1, 0xc2, 0xdd, 0x1f, 0x38, 0xfd, 0xf8, 0x11, 0x71, 0xea, 0x99, + 0x9c, 0x9c, 0xa5, 0x23, 0x16, 0xb1, 0xae, 0xa6, 0x89, 0x79, 0x8e, 0x86, + 0x1a, 0x1c, 0x66, 0x2e, 0xbd, 0x64, 0xb0, 0xd7, 0xf4, 0xc9, 0xd9, 0xba, + 0xd2, 0xd9, 0x16, 0xcb, 0x3a, 0xa3, 0x17, 0xd6, 0x25, 0x8c, 0x99, 0xc0, + 0x55, 0xfb, 0xf3, 0x7e, 0xe2, 0x7f, 0x53, 0x67, 0x40, 0xbd, 0x6a, 0x25, + 0xbe, 0xa9, 0x38, 0xcf, 0x67, 0x19, 0x97, 0x32, 0x57, 0x17, 0x86, 0x32, + 0xa5, 0xda, 0x53, 0x8b, 0x84, 0x4f, 0xeb, 0x4c, 0x15, 0xe3, 0xb1, 0x8a, + 0xd8, 0xf5, 0x10, 0xf9, 0x43, 0xc5, 0xb8, 0xd4, 0x1c, 0x72, 0x71, 0xb5, + 0x9a, 0x9c, 0x59, 0xf8, 0x85, 0x1b, 0xfb, 0x7d, 0x12, 0x1b, 0x3e, 0xce, + 0xcf, 0xeb, 0x92, 0xb3, 0x72, 0x4f, 0xe7, 0xa4, 0xe6, 0x4b, 0xae, 0x96, + 0xc6, 0x0b, 0xa0, 0xde, 0x3e, 0x4f, 0xdc, 0x15, 0xff, 0x94, 0x18, 0x7c, + 0x9c, 0xbe, 0x76, 0xc4, 0xfc, 0x70, 0x33, 0xbe, 0x6e, 0x6f, 0xd5, 0x7b, + 0x57, 0x3b, 0xb5, 0xbe, 0x79, 0xf6, 0xb2, 0xa7, 0x95, 0xd6, 0x76, 0x44, + 0x5d, 0x2d, 0xc7, 0xaa, 0x91, 0xfd, 0x0a, 0xe1, 0x0f, 0x0f, 0xda, 0x73, + 0xba, 0xcf, 0x3e, 0xaf, 0xe3, 0x20, 0x6e, 0xae, 0x49, 0xd7, 0xe0, 0xc2, + 0x18, 0x74, 0x66, 0x30, 0x7e, 0x42, 0x3d, 0x92, 0xbe, 0x70, 0xa2, 0x1d, + 0x92, 0x0b, 0x5a, 0x52, 0xb8, 0x96, 0x60, 0xf7, 0xf4, 0x98, 0xd4, 0x22, + 0x25, 0x3c, 0x26, 0x55, 0x1b, 0xeb, 0xc3, 0x27, 0x2b, 0x80, 0x57, 0x47, + 0x0b, 0x67, 0x32, 0xba, 0xcd, 0x4b, 0x16, 0x2a, 0x0a, 0xe7, 0x5d, 0x0e, + 0xda, 0xe7, 0x58, 0x44, 0x7e, 0xbf, 0x7d, 0x36, 0xb9, 0x86, 0xd7, 0xe6, + 0x46, 0x43, 0x03, 0xe4, 0xa5, 0x6d, 0xb9, 0xc2, 0xd9, 0x64, 0xe3, 0x53, + 0xc6, 0xfe, 0x09, 0x72, 0xda, 0xc3, 0x85, 0xf5, 0xba, 0xe2, 0xd9, 0xe4, + 0x3e, 0x84, 0xb2, 0x1d, 0x6a, 0xb3, 0x7d, 0xde, 0xad, 0x9f, 0xf9, 0xd6, + 0xae, 0x36, 0xce, 0xae, 0x57, 0x9b, 0x66, 0xb7, 0xa8, 0x1d, 0x39, 0x59, + 0x5f, 0xb8, 0x37, 0xbe, 0x7f, 0x7c, 0xbb, 0xda, 0x3c, 0xdd, 0xa5, 0xc8, + 0x7d, 0x7d, 0xee, 0x58, 0xb7, 0xda, 0x32, 0x5b, 0xd8, 0x13, 0xe8, 0x60, + 0x7f, 0xb9, 0xd9, 0x2c, 0xd5, 0x25, 0xf9, 0x7f, 0x37, 0xbf, 0x77, 0xeb, + 0xa4, 0x96, 0x5c, 0xa7, 0x2c, 0xeb, 0xfa, 0xe8, 0x75, 0x5e, 0xfa, 0xc3, + 0x7a, 0x2a, 0xaa, 0x13, 0x17, 0x6a, 0xd0, 0xc3, 0xfe, 0x64, 0xc8, 0x58, + 0x5a, 0xdc, 0x4b, 0x94, 0x39, 0xc9, 0x59, 0x1a, 0x89, 0x57, 0xc1, 0xde, + 0x3e, 0xfc, 0x0f, 0xea, 0xbf, 0xb7, 0x38, 0xaf, 0x2d, 0x72, 0xd6, 0xa4, + 0x0c, 0x29, 0x99, 0x43, 0x96, 0xf3, 0x3d, 0x3a, 0x7a, 0x65, 0x5e, 0xc5, + 0xf3, 0xd0, 0xc6, 0x5e, 0x25, 0xe7, 0xae, 0xec, 0x79, 0x9d, 0xbb, 0xa0, + 0xb4, 0xfc, 0x10, 0x04, 0x17, 0x0a, 0xf3, 0xba, 0xb1, 0x38, 0xaf, 0x65, + 0x9c, 0xd7, 0x46, 0x9b, 0xd7, 0xf7, 0xb3, 0xaf, 0x6f, 0x57, 0x1d, 0xb3, + 0xb2, 0xfe, 0x20, 0x73, 0x93, 0x79, 0x8c, 0x5b, 0x95, 0xfa, 0x16, 0xb5, + 0xd5, 0x3e, 0x77, 0x28, 0x67, 0xff, 0xe4, 0x2c, 0x48, 0x69, 0x5e, 0x52, + 0xef, 0x17, 0x78, 0xd7, 0x4f, 0xfa, 0xbc, 0xeb, 0x26, 0x2d, 0xeb, 0x67, + 0x46, 0xb7, 0x3d, 0x97, 0x53, 0x86, 0xcc, 0x45, 0xce, 0x14, 0x95, 0xe6, + 0xf3, 0x5b, 0xc5, 0xf9, 0x88, 0xaf, 0xae, 0xf8, 0xa9, 0xf4, 0x7f, 0x92, + 0xef, 0xa4, 0x0b, 0xe7, 0x8d, 0x4a, 0xf3, 0xf1, 0xc6, 0x4a, 0xe7, 0x0f, + 0xfb, 0xf0, 0x2a, 0xef, 0x7f, 0x94, 0x2e, 0xcd, 0xcb, 0x89, 0x99, 0x69, + 0xb1, 0x7f, 0x9f, 0xfc, 0x9f, 0x24, 0x71, 0x24, 0x64, 0x0c, 0x5f, 0x3e, + 0x53, 0xae, 0x0d, 0x5c, 0xe7, 0x6c, 0xca, 0x5f, 0x80, 0x96, 0x9c, 0x57, + 0xe1, 0x04, 0xfb, 0x52, 0x9c, 0xca, 0xfd, 0xaa, 0xff, 0x9a, 0xb3, 0x95, + 0x4a, 0xce, 0xba, 0xb9, 0x58, 0x97, 0x46, 0xc6, 0xe4, 0xbc, 0x91, 0xc2, + 0x93, 0xd3, 0xc0, 0xb4, 0xc9, 0x61, 0x63, 0x83, 0xc4, 0x78, 0x59, 0x57, + 0xd2, 0x07, 0x76, 0x01, 0xaf, 0x14, 0xd6, 0xb1, 0x60, 0xd4, 0x70, 0xee, + 0xb7, 0xe4, 0xe4, 0xac, 0x51, 0x17, 0x6d, 0x20, 0x73, 0x97, 0x18, 0x28, + 0xf9, 0x5e, 0xce, 0x41, 0xa6, 0x68, 0x1f, 0xb1, 0x4d, 0xe9, 0x3c, 0x64, + 0x80, 0xbe, 0xbe, 0xda, 0x26, 0xe9, 0x82, 0x7f, 0x0d, 0x89, 0x57, 0xa2, + 0x0f, 0x63, 0x75, 0x86, 0x3c, 0x63, 0xd8, 0x28, 0xb3, 0x39, 0x9d, 0xe4, + 0xd4, 0x11, 0xb3, 0x9a, 0x31, 0x7f, 0x0e, 0xe7, 0xb2, 0x2f, 0xe1, 0xd5, + 0x2b, 0xff, 0x33, 0xc8, 0x78, 0x49, 0xac, 0xda, 0x14, 0x16, 0x5e, 0x51, + 0xfd, 0x5b, 0x4b, 0xc3, 0x82, 0x43, 0x33, 0x37, 0xc8, 0x99, 0xb6, 0x8a, + 0x58, 0xf0, 0xb7, 0xa5, 0x67, 0x2f, 0x8f, 0x9d, 0x59, 0xf9, 0x8a, 0x2e, + 0xb6, 0x89, 0xac, 0x38, 0xa9, 0xcb, 0xbc, 0x5a, 0xa3, 0x23, 0xf6, 0xff, + 0xb0, 0x76, 0xb4, 0xed, 0xb6, 0xf7, 0xe0, 0x16, 0xdf, 0xb4, 0xc6, 0xc6, + 0x04, 0x23, 0x7e, 0xbd, 0x6d, 0x83, 0xe6, 0xf8, 0x52, 0xfb, 0x33, 0x42, + 0xae, 0x21, 0x9f, 0xad, 0xf1, 0x82, 0x6d, 0xda, 0xc9, 0xbf, 0xe4, 0x33, + 0x16, 0x2f, 0x9c, 0xed, 0x6f, 0x8b, 0xeb, 0xf6, 0x67, 0x07, 0x6b, 0x9c, + 0x7c, 0x26, 0xe2, 0xd7, 0x5d, 0xf5, 0xbf, 0x8c, 0xc0, 0xff, 0x01, 0xbf, + 0xc5, 0xf6, 0x75, 0xec, 0x3b, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_TXP_b06FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_TXP_b06FwRodata[(0x0/4) + 1] = { 0x0 }; + +static struct fw_info bnx2_txp_fw_06 = { + /* Firmware version: 5.0.0j9 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x080000a8, + + .text_addr = 0x08000000, + .text_len = 0x3be8, + .text_index = 0x0, + .gz_text = bnx2_TXP_b06FwText, + .gz_text_len = sizeof(bnx2_TXP_b06FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_TXP_b06FwData, + + .sbss_addr = 0x08003c00, + .sbss_len = 0x68, + .sbss_index = 0x0, + + .bss_addr = 0x08003c68, + .bss_len = 0x14c, + .bss_index = 0x0, + + .rodata_addr = 0x00000000, + .rodata_len = 0x0, + .rodata_index = 0x0, + .rodata = bnx2_TXP_b06FwRodata, +}; + +/* Initialized Values for the TX Processor. */ +static const struct cpu_reg cpu_reg_txp = { + .mode = BNX2_TXP_CPU_MODE, + .mode_value_halt = BNX2_TXP_CPU_MODE_SOFT_HALT, + .mode_value_sstep = BNX2_TXP_CPU_MODE_STEP_ENA, + .state = BNX2_TXP_CPU_STATE, + .state_value_clear = 0xffffff, + .gpr0 = BNX2_TXP_CPU_REG_FILE, + .evmask = BNX2_TXP_CPU_EVENT_MASK, + .pc = BNX2_TXP_CPU_PROGRAM_COUNTER, + .inst = BNX2_TXP_CPU_INSTRUCTION, + .bp = BNX2_TXP_CPU_HW_BREAKPOINT, + .spad_base = BNX2_TXP_SCRATCH, + .mips_view_base = 0x8000000, +}; + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw2.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw2.h new file mode 100644 index 0000000..5f97df9 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2_fw2.h @@ -0,0 +1,4985 @@ +/* bnx2_fw2.h: Broadcom NX2 network driver. + * + * Copyright (c) 2004-2010 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, except as noted below. + * + * This file contains firmware data derived from proprietary unpublished + * source code, Copyright (c) 2004-2010 + * Broadcom Corporation. + * + * Permission is hereby granted for the distribution of this firmware data + * in hexadecimal or equivalent format, provided this copyright notice is + * accompanying it. + */ + +static u8 bnx2_COM_b09FwText[] = { + 0xcd, 0x7c, 0x7d, 0x70, 0x5b, 0xd7, 0x95, 0xdf, 0x79, 0x0f, 0x0f, 0x24, + 0x08, 0x51, 0xd4, 0x23, 0x05, 0x33, 0xb0, 0xcd, 0xc8, 0x00, 0xf1, 0x48, + 0xd1, 0x16, 0xe3, 0x85, 0xb4, 0x90, 0x4c, 0x6f, 0x50, 0x1b, 0x01, 0x20, + 0x59, 0xde, 0x2a, 0x2e, 0x4d, 0x2b, 0xbb, 0x99, 0x54, 0x9d, 0xb2, 0x20, + 0xe5, 0xc8, 0xa9, 0x3b, 0x55, 0xe2, 0xfc, 0xe1, 0x76, 0x33, 0xf5, 0x0b, + 0x48, 0x69, 0x95, 0x2d, 0x48, 0xc2, 0x32, 0xad, 0xa4, 0x6d, 0x32, 0x0b, + 0x83, 0x94, 0xec, 0x4c, 0x41, 0xd1, 0x1f, 0xd9, 0x4e, 0xfe, 0x49, 0xcc, + 0x21, 0x25, 0x25, 0xcd, 0xa4, 0x33, 0xce, 0x4e, 0xa6, 0x93, 0x71, 0xd3, + 0x56, 0x23, 0x7b, 0x27, 0xee, 0x4e, 0xd3, 0xc9, 0x74, 0xd2, 0x6e, 0x9a, + 0x3a, 0x46, 0x7f, 0xbf, 0x7b, 0xef, 0x23, 0x21, 0x48, 0xb6, 0xbc, 0x99, + 0xd9, 0xb6, 0x9c, 0x81, 0xee, 0x7b, 0xf7, 0xf3, 0xdc, 0x7b, 0xbe, 0xcf, + 0x3d, 0x4f, 0x45, 0x91, 0xa8, 0x98, 0xbf, 0xed, 0xf8, 0xed, 0xff, 0x47, + 0xff, 0x78, 0x2a, 0x7d, 0x6f, 0xfa, 0x5e, 0xf9, 0xdd, 0xbd, 0x9f, 0xb3, + 0x45, 0xc2, 0xac, 0x0f, 0xe1, 0x17, 0xc3, 0x6f, 0x9f, 0x79, 0xbe, 0xd9, + 0x9f, 0x8b, 0xdf, 0x01, 0x4b, 0x64, 0xf2, 0x2f, 0xcd, 0xa0, 0x96, 0xbf, + 0xc8, 0xfb, 0x8c, 0xf9, 0xa0, 0x3f, 0xfb, 0x43, 0xf6, 0x73, 0x7f, 0x8b, + 0xb9, 0x6f, 0xf5, 0x17, 0x32, 0xd3, 0x6e, 0x37, 0x3f, 0x89, 0xd8, 0xd9, + 0xc4, 0x44, 0xde, 0x93, 0x48, 0x28, 0x7b, 0xf4, 0xb1, 0x29, 0x4f, 0x24, + 0xd7, 0xd8, 0x93, 0x28, 0xc8, 0x6f, 0x9a, 0x7e, 0xcc, 0x11, 0xd6, 0x7f, + 0x34, 0xfb, 0xee, 0x9f, 0x7e, 0xe7, 0xbe, 0xe4, 0x2f, 0x6a, 0x21, 0x89, + 0xb8, 0x59, 0xd7, 0x72, 0x87, 0x25, 0x32, 0x80, 0x31, 0x5f, 0xdf, 0xfd, + 0xf7, 0x6d, 0xe9, 0x09, 0xe6, 0xba, 0xda, 0xfc, 0xce, 0xee, 0xb8, 0xbc, + 0xbe, 0x1a, 0x93, 0x57, 0x56, 0x5d, 0x79, 0x79, 0x55, 0x7c, 0x27, 0x1b, + 0xb1, 0xca, 0x8b, 0x72, 0xb2, 0x90, 0x96, 0x84, 0xed, 0x6d, 0x93, 0x92, + 0x6b, 0x25, 0x4a, 0x23, 0x07, 0x24, 0x17, 0x4b, 0x12, 0x82, 0x9c, 0xed, + 0x8d, 0xa2, 0x4e, 0x01, 0x35, 0x69, 0x7b, 0x1f, 0xc3, 0x33, 0xeb, 0xbf, + 0x01, 0x9c, 0x61, 0x9e, 0x05, 0xb1, 0x9e, 0xcd, 0x74, 0x89, 0x77, 0x36, + 0x2e, 0xe9, 0xf9, 0x84, 0xf8, 0xae, 0x25, 0x21, 0xaf, 0x4b, 0x6c, 0xaf, + 0x43, 0xca, 0xb1, 0x01, 0x29, 0x2f, 0x44, 0x7c, 0x3b, 0x7b, 0x87, 0xe4, + 0x17, 0x25, 0x66, 0xcb, 0x90, 0x6f, 0xdb, 0xac, 0xeb, 0x96, 0x7c, 0xe5, + 0x36, 0xc9, 0xb9, 0xc9, 0xb8, 0xc8, 0xc1, 0xed, 0x1a, 0xb6, 0x01, 0x99, + 0x59, 0x88, 0x88, 0x77, 0x2e, 0x8e, 0xf6, 0x5d, 0x32, 0xb5, 0xd8, 0x2d, + 0x43, 0xe7, 0xc4, 0x73, 0x64, 0x28, 0x31, 0x83, 0xd6, 0xf1, 0x86, 0x23, + 0x07, 0x1b, 0x11, 0xec, 0xb9, 0x1b, 0x3f, 0x17, 0xbf, 0x18, 0x7e, 0x71, + 0xfc, 0x06, 0xa4, 0xd8, 0xf8, 0x27, 0x98, 0xc3, 0x12, 0xc7, 0xe3, 0x7c, + 0x5f, 0x07, 0x5c, 0x49, 0x77, 0x52, 0xee, 0x75, 0xf4, 0xbc, 0xfa, 0x5d, + 0xe4, 0x78, 0xb7, 0x7e, 0xe7, 0x33, 0xe1, 0xc6, 0xfe, 0x17, 0xb0, 0x7f, + 0xac, 0x79, 0x35, 0x94, 0x90, 0xef, 0xec, 0x26, 0x5c, 0x3c, 0x1b, 0x9e, + 0x49, 0x70, 0x3e, 0x84, 0x13, 0x5b, 0xca, 0x8a, 0xd5, 0x3b, 0x9f, 0x01, + 0xbc, 0x1c, 0x17, 0xc0, 0x1b, 0x97, 0x53, 0x0b, 0xcd, 0x67, 0x1c, 0x6f, + 0x4f, 0xe2, 0x59, 0xbc, 0xbd, 0xd2, 0x70, 0xac, 0xd0, 0x7c, 0xc4, 0xb2, + 0xcf, 0xc9, 0x40, 0x48, 0x9a, 0xcd, 0x7c, 0x7a, 0x28, 0x5e, 0x12, 0x47, + 0x96, 0x1a, 0x51, 0xcb, 0x3e, 0x1b, 0xb3, 0x42, 0xe7, 0x9a, 0x92, 0x4f, + 0x37, 0x9b, 0x53, 0x69, 0x75, 0x0e, 0x6e, 0x01, 0xf4, 0x58, 0x6f, 0x74, + 0xa3, 0xbe, 0xa7, 0x6d, 0x4c, 0x37, 0xc6, 0xb8, 0xa8, 0xef, 0x6b, 0xab, + 0x77, 0x51, 0x1f, 0xb7, 0xec, 0xf9, 0x18, 0xc6, 0x0d, 0xa0, 0x8c, 0xa3, + 0x8c, 0x88, 0xaf, 0xce, 0x58, 0xa4, 0xfc, 0xd5, 0x70, 0xc2, 0xc9, 0x0e, + 0xc5, 0x8b, 0x62, 0x81, 0x16, 0x06, 0xd0, 0xf7, 0x3f, 0x28, 0x9e, 0x2a, + 0xbf, 0x18, 0xcf, 0x85, 0xb2, 0xbb, 0x70, 0xfe, 0x5c, 0x73, 0x00, 0x63, + 0x82, 0xb3, 0x6a, 0x3d, 0x03, 0x9e, 0x49, 0x70, 0x0e, 0xe2, 0x77, 0x64, + 0xbf, 0x6d, 0xaf, 0x57, 0x88, 0xc7, 0x88, 0x7c, 0xc2, 0x49, 0x8e, 0xf8, + 0x8a, 0xf6, 0x26, 0x71, 0x16, 0x96, 0xa2, 0x33, 0x0b, 0xcf, 0x83, 0x0d, + 0xf6, 0xe7, 0x39, 0x27, 0x64, 0xa6, 0xd2, 0x2f, 0xe5, 0x45, 0xdf, 0xde, + 0x68, 0xbc, 0xdb, 0xcc, 0x7b, 0xb3, 0xf6, 0xfa, 0x32, 0xfb, 0x1f, 0x43, + 0x7f, 0x47, 0x66, 0x2b, 0x3d, 0xb2, 0xb4, 0x18, 0x8c, 0x3b, 0x86, 0x71, + 0xe2, 0xda, 0xd9, 0xd3, 0xf6, 0xc6, 0xf2, 0x19, 0xfb, 0x52, 0x83, 0xf8, + 0xc2, 0x5a, 0x9b, 0x73, 0x05, 0xe7, 0xcf, 0x33, 0x8f, 0xcb, 0xab, 0xab, + 0x03, 0x06, 0x0f, 0x62, 0xf5, 0x1d, 0xd8, 0x26, 0x85, 0xb3, 0x77, 0x80, + 0xae, 0x22, 0xf2, 0xe8, 0xb9, 0xcf, 0x48, 0x29, 0x96, 0x1c, 0x11, 0xec, + 0x75, 0x70, 0x1f, 0x68, 0xc0, 0xd5, 0x67, 0x90, 0x9f, 0xcf, 0xa5, 0x6c, + 0x79, 0x50, 0xec, 0x2c, 0xce, 0x2c, 0xb3, 0xc7, 0x2d, 0xe2, 0xfc, 0x73, + 0x6e, 0x4e, 0x42, 0xd9, 0x98, 0xe4, 0xcf, 0x79, 0x16, 0xe8, 0x80, 0xb4, + 0x04, 0x3c, 0x89, 0x45, 0xfa, 0x2c, 0x1d, 0x65, 0x3d, 0xe9, 0x13, 0xfc, + 0x53, 0xdd, 0x01, 0xfc, 0xc8, 0x90, 0x2d, 0xac, 0x1b, 0x72, 0xcb, 0xe2, + 0x8b, 0x7d, 0xf1, 0x0f, 0x2d, 0x2d, 0x97, 0x48, 0x07, 0x23, 0x98, 0x8b, + 0xcf, 0x01, 0xfe, 0x89, 0x6b, 0xe2, 0x8f, 0x74, 0xf0, 0x40, 0x1b, 0x6e, + 0x05, 0xe7, 0x8c, 0x35, 0xe6, 0x1d, 0x94, 0xfd, 0x0a, 0xc7, 0xce, 0x39, + 0x05, 0xa3, 0xc2, 0xe7, 0x2c, 0xf0, 0x39, 0x8d, 0xf3, 0x0e, 0xf0, 0xec, + 0x9c, 0xdb, 0x25, 0x87, 0x16, 0x5b, 0xdb, 0x48, 0x03, 0xe0, 0xc5, 0xec, + 0x50, 0x7a, 0x5d, 0x62, 0x58, 0x87, 0xf8, 0x22, 0x1d, 0xb8, 0x98, 0x2f, + 0xa0, 0x81, 0x6d, 0xa0, 0x2b, 0xd2, 0x54, 0xdc, 0xe0, 0x74, 0x40, 0x2e, + 0x34, 0x78, 0xee, 0xb9, 0x16, 0x3c, 0xe5, 0x78, 0xde, 0x90, 0x17, 0x45, + 0x99, 0xaa, 0xd8, 0x38, 0x2b, 0x47, 0xbc, 0x7d, 0x96, 0x4c, 0xa9, 0xb6, + 0xa2, 0xa4, 0x48, 0x3f, 0xee, 0x9e, 0x11, 0x5b, 0x92, 0x89, 0x1c, 0xf8, + 0xf2, 0xf5, 0x05, 0x9c, 0xf9, 0x26, 0x4d, 0xbc, 0x05, 0xfa, 0xd1, 0x7c, + 0x71, 0x7d, 0x7d, 0xd2, 0xad, 0x6d, 0xd2, 0xca, 0xad, 0xf0, 0x15, 0x02, + 0xbe, 0x3e, 0x07, 0x5c, 0x11, 0x67, 0xc4, 0xd5, 0x47, 0x36, 0x71, 0x55, + 0x98, 0x0f, 0xf0, 0x94, 0x4b, 0x85, 0x84, 0xb8, 0x0a, 0x4b, 0x6e, 0x9c, + 0x78, 0xe1, 0xf9, 0x13, 0x67, 0xf3, 0x06, 0x5f, 0x1f, 0x06, 0x4f, 0xdf, + 0x6d, 0xc1, 0xd3, 0xd0, 0xff, 0x27, 0x78, 0x8a, 0x49, 0x0d, 0xf2, 0xa9, + 0x76, 0x0b, 0xdc, 0xd8, 0xc0, 0x03, 0xf9, 0x24, 0xb5, 0x2f, 0xa8, 0x2f, + 0x2a, 0xde, 0x9a, 0x74, 0x89, 0xaf, 0x0f, 0xc2, 0xcb, 0x6d, 0xea, 0x2c, + 0x21, 0x7f, 0x21, 0xbf, 0x1d, 0x6b, 0xa6, 0x92, 0x98, 0xb4, 0x41, 0xe7, + 0x05, 0xc8, 0xc9, 0x7c, 0xe5, 0x3d, 0x2b, 0xe4, 0x35, 0x43, 0xf9, 0x74, + 0xb7, 0x14, 0x62, 0xaa, 0x8f, 0x55, 0xae, 0xac, 0xdf, 0x6e, 0xcb, 0xbb, + 0xcd, 0x12, 0xf8, 0x27, 0x3f, 0x1a, 0xc2, 0x58, 0x1b, 0xb0, 0xfe, 0x06, + 0xef, 0x4e, 0xa2, 0x48, 0xb9, 0x9e, 0x8d, 0x3d, 0x51, 0x6c, 0xdc, 0x88, + 0xeb, 0x56, 0xb9, 0xe0, 0x40, 0x0e, 0xce, 0x54, 0x88, 0xa3, 0x90, 0x94, + 0xc6, 0x89, 0x0f, 0xea, 0x13, 0x8d, 0x97, 0x42, 0x95, 0x7d, 0x77, 0x08, + 0xce, 0xf6, 0xa3, 0x21, 0x35, 0xc6, 0x97, 0x99, 0xc6, 0x97, 0x3b, 0x67, + 0x47, 0xa3, 0x20, 0x0e, 0xf2, 0xaa, 0xa0, 0x5f, 0xc4, 0x82, 0x1e, 0x48, + 0x84, 0x3c, 0x39, 0x99, 0x4f, 0x87, 0x01, 0xdb, 0xcb, 0xcd, 0x99, 0xdd, + 0x1c, 0x1f, 0x06, 0x5e, 0x9b, 0x72, 0x30, 0xcd, 0x77, 0x3f, 0x11, 0x16, + 0xe2, 0x7d, 0xcd, 0x0d, 0x4b, 0xca, 0x3d, 0x88, 0x81, 0xb3, 0x15, 0xd2, + 0xf0, 0xdb, 0x13, 0x53, 0xde, 0x1a, 0xa0, 0x4e, 0x12, 0x6f, 0x7e, 0x28, + 0x5b, 0x95, 0x69, 0x25, 0x37, 0x80, 0xaf, 0x55, 0x2d, 0x3f, 0x34, 0xac, + 0x4a, 0x67, 0x59, 0x94, 0x13, 0xe5, 0x98, 0x18, 0xbd, 0xf9, 0x6e, 0xcb, + 0xb9, 0xbf, 0x8b, 0xf3, 0xf5, 0x6c, 0x9e, 0x61, 0x3d, 0xcd, 0xb6, 0xd9, + 0x96, 0xb6, 0x59, 0xb4, 0xb1, 0x1e, 0x7a, 0xc6, 0x85, 0xbc, 0x55, 0xed, + 0x80, 0x79, 0xb3, 0x3d, 0x62, 0x69, 0xb9, 0xa7, 0xa6, 0x05, 0x8e, 0x82, + 0xf9, 0x9d, 0x96, 0x3e, 0x4e, 0x4b, 0x1f, 0xb6, 0x49, 0x4b, 0x9b, 0xb4, + 0xb4, 0xbd, 0xd3, 0xc2, 0x3b, 0x31, 0xf0, 0x8d, 0x58, 0xce, 0x81, 0x88, + 0xcc, 0x2c, 0x3a, 0x52, 0xc2, 0xd9, 0x10, 0x3f, 0x8f, 0xa7, 0x51, 0xbf, + 0x89, 0xf3, 0x38, 0x70, 0xd0, 0x81, 0x53, 0x49, 0x8e, 0x4c, 0x62, 0x7f, + 0xce, 0x7c, 0xcc, 0xe8, 0xf4, 0xbf, 0x8b, 0xbd, 0x58, 0x4a, 0x2e, 0x96, + 0x17, 0xa8, 0x83, 0x3a, 0xa5, 0xe0, 0xea, 0x33, 0xd8, 0xea, 0xe3, 0x80, + 0xc6, 0xd1, 0xbe, 0xca, 0xfa, 0x60, 0x4e, 0xc2, 0xc1, 0x39, 0x7f, 0x42, + 0x38, 0x26, 0x43, 0xd9, 0x01, 0x79, 0x6d, 0x35, 0x01, 0x38, 0xc8, 0xc7, + 0x9b, 0xb6, 0xc1, 0xf8, 0x74, 0xe5, 0x99, 0xa6, 0x0d, 0xd8, 0x77, 0x66, + 0x0f, 0x4f, 0x3c, 0x35, 0xec, 0x25, 0xca, 0xd2, 0x3d, 0x36, 0x9b, 0x41, + 0x7d, 0x83, 0xf8, 0xbc, 0x4f, 0xe9, 0x88, 0x02, 0xe8, 0xb8, 0x23, 0x9b, + 0x8b, 0x5c, 0xf1, 0x20, 0xc3, 0x41, 0xaf, 0xe4, 0x81, 0x59, 0xd8, 0x27, + 0x87, 0x1a, 0xbf, 0x69, 0x7e, 0xd9, 0xd1, 0xb6, 0x89, 0x9d, 0x7d, 0xd2, + 0xd2, 0x67, 0x30, 0x3e, 0xa1, 0xe9, 0xfe, 0xdb, 0x61, 0xfd, 0x7e, 0xd4, + 0xbc, 0xcf, 0xda, 0xfa, 0xbd, 0x6a, 0xde, 0x23, 0x8e, 0xb6, 0x75, 0x0e, + 0x47, 0x28, 0xaf, 0x9c, 0xec, 0x2f, 0x23, 0x98, 0x33, 0x12, 0xce, 0x1e, + 0x19, 0x3d, 0xaf, 0xfa, 0xbd, 0x6c, 0xfa, 0x2d, 0x77, 0xea, 0x71, 0x5f, + 0x9b, 0x18, 0x6e, 0xb0, 0x5c, 0x9e, 0x18, 0x52, 0x65, 0x63, 0x22, 0xa5, + 0xca, 0x6f, 0x4d, 0x78, 0xaa, 0xfc, 0xb6, 0xea, 0x6f, 0x65, 0x8f, 0x98, + 0xfa, 0x4f, 0x4f, 0x24, 0x54, 0x79, 0xcc, 0x94, 0x93, 0xa6, 0x9c, 0x36, + 0xe5, 0x09, 0x53, 0x3e, 0x69, 0xca, 0x93, 0xa6, 0xfc, 0xa2, 0x99, 0xef, + 0x69, 0xf3, 0xfe, 0x25, 0x53, 0xfa, 0xa6, 0x9c, 0x35, 0xe5, 0x19, 0x53, + 0x56, 0x0c, 0x5c, 0x8b, 0xa6, 0xfc, 0xba, 0xa9, 0xaf, 0x19, 0x38, 0x5f, + 0x02, 0x3c, 0x9f, 0x09, 0x1b, 0x3c, 0xc1, 0x06, 0x52, 0x76, 0x1e, 0x68, + 0xf2, 0x2e, 0xda, 0x59, 0x67, 0x44, 0x5e, 0x6e, 0x9e, 0xdd, 0x4d, 0x7b, + 0xee, 0xed, 0x09, 0xda, 0x73, 0xba, 0xcd, 0x92, 0xb0, 0xe7, 0xc4, 0x87, + 0x6c, 0x0f, 0xf6, 0x9f, 0x03, 0xbc, 0x7b, 0xe0, 0x89, 0x6e, 0x29, 0x8e, + 0x5b, 0xb2, 0x77, 0x98, 0x32, 0x7d, 0x40, 0xaa, 0xab, 0x94, 0xb1, 0xc4, + 0x51, 0x15, 0xf8, 0xe9, 0x86, 0x0c, 0xea, 0x96, 0xf0, 0xc5, 0xff, 0xa4, + 0x68, 0x65, 0xef, 0x70, 0xb7, 0xc8, 0x45, 0x96, 0x90, 0x31, 0xf7, 0x8e, + 0x89, 0x3b, 0xfc, 0x5f, 0x9a, 0x39, 0xd8, 0x90, 0x13, 0x9b, 0xf3, 0x63, + 0x4e, 0x45, 0x97, 0x22, 0xbd, 0xa0, 0xa7, 0xc1, 0x7d, 0x6f, 0x36, 0x73, + 0x2e, 0x61, 0xa3, 0x0c, 0x4f, 0x2a, 0xda, 0x1c, 0xdc, 0x47, 0xb9, 0x99, + 0x80, 0xec, 0x25, 0x6d, 0xbd, 0x84, 0xf2, 0x7f, 0x5a, 0xd8, 0x03, 0x68, + 0x4e, 0xeb, 0xa5, 0x42, 0xfa, 0xa3, 0x52, 0x1a, 0x85, 0xfe, 0x3d, 0xea, + 0xbb, 0x21, 0xa8, 0x7c, 0xe9, 0x69, 0xda, 0x5a, 0x46, 0x27, 0xdd, 0xc7, + 0xf0, 0x6f, 0xbe, 0xd2, 0xf5, 0xab, 0x9c, 0xe8, 0x3d, 0x43, 0x5e, 0x53, + 0x86, 0x58, 0x85, 0x4d, 0x19, 0x46, 0x38, 0x32, 0xb4, 0xbd, 0x72, 0x90, + 0x39, 0xe0, 0x75, 0xf2, 0xcf, 0x98, 0x35, 0xad, 0xce, 0x2b, 0x03, 0x1e, + 0xe5, 0xfa, 0xb0, 0x01, 0x01, 0x13, 0xe0, 0x00, 0x9c, 0x39, 0x03, 0x0b, + 0x61, 0xc8, 0x01, 0x86, 0xaf, 0x86, 0xf4, 0x79, 0xc2, 0x76, 0xcd, 0x3e, + 0x6d, 0xd9, 0x17, 0x39, 0xdf, 0x58, 0x0b, 0x9f, 0x8f, 0x61, 0x0e, 0x8e, + 0x5d, 0x36, 0xfb, 0xe2, 0x1c, 0x7e, 0xcb, 0x1c, 0x3e, 0xe6, 0xf0, 0x69, + 0x27, 0xec, 0xb0, 0xbd, 0x4e, 0xea, 0x2f, 0xc0, 0x77, 0x06, 0xed, 0x57, + 0xa1, 0x97, 0x94, 0x3d, 0x86, 0xf3, 0xfe, 0x78, 0x48, 0xa2, 0xd4, 0x3d, + 0xbe, 0xe4, 0x33, 0xd8, 0x4f, 0x75, 0x1c, 0xbc, 0x40, 0x7d, 0x0c, 0xfe, + 0x53, 0x72, 0xe7, 0x8b, 0x06, 0x06, 0xc8, 0x5a, 0xf5, 0xfe, 0xf7, 0xba, + 0x0c, 0x4c, 0x80, 0x25, 0xdb, 0xb6, 0xb7, 0x6f, 0x9b, 0xbd, 0x65, 0x01, + 0xd7, 0x06, 0xce, 0x49, 0xc1, 0x54, 0xb5, 0xd9, 0x96, 0x19, 0x02, 0xcf, + 0xf1, 0x7c, 0x12, 0xb0, 0x73, 0xd9, 0x3f, 0x21, 0xa5, 0xca, 0x7b, 0xcd, + 0x9c, 0xa3, 0x65, 0x90, 0x91, 0x33, 0x3e, 0xfb, 0x16, 0x32, 0xb4, 0x95, + 0xb5, 0xbc, 0x2e, 0x36, 0xa8, 0x9b, 0x03, 0x3e, 0x4e, 0x9e, 0xf1, 0x69, + 0xf3, 0xae, 0x1e, 0x04, 0x4c, 0x4d, 0x79, 0x39, 0xfd, 0x52, 0x73, 0x66, + 0x21, 0x99, 0x48, 0xd8, 0x43, 0x52, 0xaa, 0xd2, 0x26, 0x1f, 0x92, 0x93, + 0xb5, 0xb8, 0x9c, 0xac, 0x70, 0x9e, 0x71, 0xf4, 0xf1, 0x50, 0x07, 0x64, + 0xf5, 0x2b, 0xfb, 0x1e, 0x6b, 0xfe, 0xca, 0xd2, 0x6b, 0xda, 0x90, 0x33, + 0x6b, 0xd6, 0xe7, 0x1b, 0x97, 0xac, 0x52, 0x8d, 0x76, 0x1c, 0xea, 0x1b, + 0x37, 0xb3, 0xa5, 0xb5, 0x6c, 0x83, 0x4c, 0xc3, 0xd8, 0x59, 0xab, 0xb4, + 0x28, 0x76, 0x5e, 0xc9, 0xb4, 0x64, 0x42, 0xe4, 0xdf, 0xed, 0xd0, 0xe7, + 0xf0, 0x27, 0x21, 0xd2, 0xa2, 0xe3, 0x9d, 0xc1, 0xdc, 0x51, 0x1c, 0x06, + 0xfa, 0x2f, 0xf0, 0x59, 0x9a, 0xa1, 0x2c, 0xe9, 0x59, 0x9c, 0x10, 0xf5, + 0x4a, 0x8c, 0x7d, 0x5e, 0x6a, 0xc2, 0x8f, 0xc0, 0x19, 0xb3, 0x4f, 0xd2, + 0xf5, 0x25, 0x90, 0x5d, 0x0d, 0xd4, 0xd3, 0x4e, 0x25, 0x3f, 0xdc, 0x21, + 0xb9, 0x1a, 0xfb, 0xf5, 0x4b, 0x61, 0x99, 0xfb, 0xf8, 0x14, 0xe6, 0xcf, + 0x59, 0xc5, 0xca, 0x4b, 0xcd, 0x53, 0xca, 0xae, 0x1f, 0x68, 0x97, 0x6d, + 0x52, 0x87, 0xce, 0x29, 0xa6, 0x61, 0xbf, 0x8e, 0xa5, 0xa5, 0x3c, 0xb6, + 0x27, 0x4e, 0x3b, 0xc4, 0x16, 0x0f, 0xb6, 0x76, 0x98, 0xb2, 0x9d, 0x67, + 0x81, 0xfd, 0x7e, 0x59, 0xf9, 0x31, 0x3c, 0x07, 0x3b, 0x7b, 0xd8, 0xa2, + 0x9e, 0xa2, 0x0d, 0x51, 0xf0, 0xc2, 0xa0, 0xef, 0x7f, 0x6a, 0x74, 0x30, + 0x69, 0x9c, 0xb2, 0xea, 0xa7, 0x8f, 0x4e, 0x79, 0x4a, 0x3f, 0x01, 0xbf, + 0xd0, 0x21, 0xda, 0x91, 0xf3, 0x7b, 0x41, 0x9f, 0xde, 0x3c, 0xcf, 0xfe, + 0xa5, 0xe6, 0x59, 0xf8, 0x3e, 0xe3, 0xf3, 0x45, 0x6b, 0x70, 0x1e, 0x67, + 0xd9, 0x4f, 0xb9, 0x0d, 0x9b, 0xe5, 0x22, 0xcf, 0x9c, 0x7d, 0x58, 0xdf, + 0x21, 0xe3, 0xb1, 0x76, 0x3d, 0x7c, 0xff, 0x0e, 0xad, 0xf3, 0xd1, 0x77, + 0x7e, 0xd0, 0xd1, 0x7c, 0x04, 0x1b, 0x63, 0x91, 0x3a, 0xb9, 0x08, 0x9d, + 0x4c, 0x9a, 0xec, 0x02, 0x9d, 0xb2, 0x9e, 0x73, 0xa2, 0x6d, 0x39, 0x07, + 0x9d, 0x2f, 0x76, 0x59, 0xd9, 0xdb, 0x63, 0x28, 0xef, 0xc6, 0xb8, 0x01, + 0x25, 0xfb, 0xeb, 0x8b, 0xc1, 0x1c, 0xa0, 0x77, 0xaf, 0x87, 0x7a, 0x12, + 0x30, 0xf6, 0xa9, 0xf9, 0x60, 0x2b, 0x5a, 0x53, 0x6a, 0xbe, 0x70, 0xcb, + 0x7c, 0x68, 0x5b, 0x7e, 0x37, 0xa4, 0xc7, 0xf7, 0xb5, 0x8c, 0x6f, 0xdd, + 0x57, 0x1f, 0xec, 0xb1, 0xa2, 0x95, 0x9a, 0x6f, 0x36, 0xc7, 0xd3, 0xb6, + 0x84, 0xfa, 0xf5, 0xb8, 0xfc, 0x85, 0xeb, 0xf7, 0x66, 0xf7, 0xb7, 0xef, + 0x6d, 0x3e, 0xa4, 0xf7, 0xc6, 0xf1, 0xc1, 0xbc, 0xb1, 0x36, 0x58, 0x22, + 0x80, 0x85, 0xe3, 0x38, 0x67, 0xeb, 0x58, 0xf4, 0x5b, 0x86, 0xc1, 0xa8, + 0xc6, 0xc7, 0x5a, 0xe0, 0xea, 0xbf, 0xc9, 0x78, 0x8e, 0x6d, 0x5f, 0x1b, + 0xfd, 0x96, 0x65, 0x9b, 0x1e, 0xcf, 0x31, 0x1d, 0xe0, 0x55, 0x85, 0x6b, + 0xf0, 0xe8, 0xc9, 0x16, 0x79, 0x71, 0x12, 0x7c, 0xd9, 0x3a, 0x2e, 0xa0, + 0xf3, 0x9f, 0x28, 0x5f, 0xfa, 0xd5, 0x55, 0xee, 0x9f, 0x74, 0x45, 0xfd, + 0x49, 0x3d, 0xaa, 0xf5, 0x3a, 0x75, 0xff, 0xa3, 0x19, 0xb1, 0xc6, 0x2b, + 0xa0, 0x87, 0xb3, 0x5d, 0x92, 0x3a, 0x4b, 0x7a, 0xbb, 0x0b, 0x70, 0xfc, + 0x6b, 0xc8, 0x76, 0xf0, 0xf1, 0xc8, 0xed, 0xa0, 0x9f, 0x31, 0xbc, 0x47, + 0xf1, 0xbc, 0x1d, 0xcf, 0xdb, 0x94, 0x1e, 0x2f, 0x8d, 0xdc, 0x6b, 0xec, + 0xe4, 0x90, 0x35, 0x09, 0x9e, 0x2b, 0x8d, 0xdc, 0xa3, 0xe0, 0x2a, 0x2f, + 0xe0, 0xfc, 0xbc, 0x61, 0x35, 0xf6, 0xf5, 0x85, 0x23, 0x61, 0xe2, 0xe3, + 0xb5, 0x85, 0x49, 0xbc, 0xc3, 0x67, 0x1f, 0xf9, 0x5f, 0xe8, 0xc3, 0xfa, + 0x1e, 0xf4, 0x79, 0x1a, 0x75, 0xec, 0x1f, 0xf4, 0xf9, 0x11, 0xde, 0xef, + 0x47, 0x1f, 0xf0, 0x19, 0xb8, 0xc7, 0xf6, 0x0e, 0xe0, 0xf7, 0x36, 0xea, + 0xee, 0x43, 0xdd, 0x3a, 0xea, 0xf6, 0xe3, 0xfd, 0x27, 0x6d, 0xf3, 0xd2, + 0xcf, 0xff, 0x32, 0xda, 0x71, 0x26, 0xee, 0xf7, 0xd1, 0x7e, 0x3f, 0x7e, + 0xdf, 0x6f, 0xeb, 0x53, 0x6f, 0x7b, 0x0f, 0x7c, 0xfb, 0x7f, 0x8f, 0x31, + 0x89, 0x16, 0x5f, 0x99, 0xb8, 0x10, 0x6b, 0x0a, 0x72, 0xb2, 0x54, 0xa1, + 0x1d, 0x1e, 0x91, 0xcf, 0xc2, 0xbf, 0x7f, 0x7c, 0x91, 0xf6, 0xb7, 0x23, + 0xd3, 0x15, 0x65, 0x73, 0x67, 0x3a, 0xa0, 0x0b, 0x96, 0x1b, 0xbb, 0xe4, + 0xf0, 0x62, 0x1c, 0xfd, 0x24, 0xdb, 0x29, 0x43, 0x63, 0xef, 0x28, 0x3f, + 0x79, 0x00, 0xef, 0x94, 0x03, 0xdd, 0x78, 0x8e, 0x52, 0x66, 0xc1, 0xde, + 0x76, 0x61, 0x53, 0x07, 0x36, 0xf6, 0x80, 0xbc, 0xd8, 0xd8, 0x16, 0x26, + 0x1e, 0x5f, 0xdf, 0x84, 0xe1, 0xcf, 0xda, 0x60, 0x50, 0xb1, 0x08, 0xf1, + 0xce, 0x31, 0xae, 0xb0, 0x4b, 0x0a, 0x8b, 0xf6, 0x20, 0x03, 0x04, 0xc3, + 0x2a, 0xde, 0x20, 0xc3, 0x26, 0xce, 0x30, 0x1a, 0x86, 0x3f, 0x11, 0xca, + 0x0e, 0x8d, 0x5c, 0x30, 0x71, 0x87, 0x1c, 0xe0, 0xcb, 0xb5, 0xc4, 0x1d, + 0x0e, 0x5e, 0x17, 0x77, 0x88, 0x86, 0xb5, 0x0c, 0xeb, 0x96, 0x41, 0xcc, + 0xa3, 0xe5, 0x3c, 0x6c, 0xd9, 0xb3, 0x2e, 0x64, 0x44, 0xcc, 0xbc, 0x93, + 0x3f, 0x20, 0xf7, 0x6c, 0xd6, 0xb3, 0x44, 0x5b, 0x86, 0x3c, 0x81, 0xf7, + 0x3a, 0xe9, 0x22, 0x61, 0xf4, 0xc6, 0x19, 0xda, 0x6d, 0x68, 0xd7, 0x7b, + 0x78, 0xed, 0x3a, 0x3a, 0x3d, 0xe0, 0x4a, 0x74, 0x04, 0xf4, 0x46, 0x7b, + 0xfb, 0x6f, 0x9b, 0x7d, 0x72, 0x8f, 0x5f, 0x6a, 0xdb, 0x23, 0x74, 0xda, + 0x7c, 0x5c, 0x66, 0xd1, 0x96, 0x3a, 0x07, 0xdf, 0xbf, 0x41, 0xbd, 0x35, + 0x2a, 0x07, 0x17, 0xb7, 0x7c, 0x9a, 0xf3, 0x69, 0xfa, 0x30, 0x3d, 0xd0, + 0x8b, 0x43, 0xf1, 0xe3, 0xc2, 0x73, 0x84, 0xae, 0xa1, 0x1f, 0x88, 0xfd, + 0xf9, 0xd8, 0x9f, 0x8f, 0xfd, 0xf9, 0xd8, 0x9f, 0x8f, 0xfd, 0x9d, 0xde, + 0xdc, 0x5f, 0xb0, 0x87, 0x46, 0xf3, 0xb9, 0x05, 0x96, 0x84, 0xbf, 0x5b, + 0x26, 0x2f, 0xf0, 0x19, 0x72, 0xb6, 0x87, 0xf2, 0x37, 0x38, 0xf7, 0x3f, + 0x6c, 0x83, 0x49, 0x9f, 0x0d, 0xf4, 0x59, 0x8c, 0xd1, 0xb4, 0x93, 0x38, + 0xcf, 0x12, 0xfd, 0x9b, 0xc6, 0x98, 0x14, 0xe7, 0xf5, 0x98, 0xe9, 0x46, + 0x56, 0x0e, 0xcd, 0xef, 0x02, 0x9c, 0x77, 0x01, 0x2e, 0x57, 0x1e, 0x6f, + 0x0c, 0x8d, 0xd4, 0x01, 0x57, 0x69, 0x9e, 0x6b, 0xc7, 0x84, 0x3a, 0x66, + 0x12, 0xf0, 0x1c, 0x6f, 0xdc, 0xec, 0x6c, 0xe0, 0x5f, 0xa9, 0xb3, 0x49, + 0x28, 0x1a, 0x2d, 0xbb, 0x6c, 0xbf, 0xcb, 0xe8, 0x98, 0x8c, 0x81, 0xe5, + 0x46, 0x1d, 0x76, 0xf2, 0x3a, 0x1d, 0x16, 0x9c, 0xe9, 0xfb, 0x9d, 0xff, + 0x89, 0x1e, 0xbd, 0x06, 0x69, 0xe7, 0xfd, 0xfa, 0xcc, 0x99, 0x3e, 0x6c, + 0x6f, 0x6f, 0xfb, 0x76, 0x4f, 0x80, 0xbf, 0xa1, 0xb3, 0x37, 0x6b, 0xef, + 0xda, 0xb1, 0x35, 0xf6, 0x66, 0x73, 0x5f, 0xed, 0x09, 0xf6, 0x78, 0x63, + 0x1b, 0x65, 0xd1, 0x88, 0xf2, 0xcf, 0x42, 0xd9, 0xa7, 0xed, 0xad, 0x3d, + 0xe6, 0xec, 0xe9, 0x46, 0xd1, 0xd6, 0x7b, 0x64, 0x1f, 0xb4, 0x11, 0xbf, + 0x4b, 0x7c, 0xee, 0x45, 0xd9, 0xda, 0x3f, 0x06, 0x3c, 0xe4, 0xd0, 0xce, + 0x71, 0xed, 0x63, 0xe8, 0x1b, 0xf2, 0xd9, 0x39, 0x9a, 0xaf, 0xa4, 0x65, + 0xa6, 0x1a, 0x46, 0x9f, 0x64, 0xce, 0x97, 0x07, 0xe1, 0xeb, 0x25, 0x0f, + 0x93, 0xde, 0x4b, 0xb1, 0xe4, 0xb8, 0xc8, 0x11, 0x29, 0x57, 0x1f, 0x81, + 0xff, 0xd2, 0x94, 0x87, 0xa1, 0x1f, 0x3f, 0x07, 0xdf, 0x53, 0x56, 0xe0, + 0x6e, 0xac, 0xc0, 0x11, 0x58, 0x89, 0x89, 0xfd, 0xfc, 0x80, 0x84, 0xe7, + 0xe2, 0xe2, 0xcc, 0x51, 0x1e, 0xa7, 0xdc, 0x87, 0x61, 0x5a, 0xda, 0xb2, + 0x71, 0x1f, 0xfc, 0xb9, 0xb1, 0x9c, 0xa4, 0x12, 0xa7, 0xa1, 0x7b, 0xeb, + 0x28, 0xcb, 0x92, 0x1a, 0x79, 0x11, 0xbc, 0x1a, 0x5e, 0x41, 0x5f, 0x8c, + 0xeb, 0x3a, 0x9f, 0xc0, 0xaf, 0x5f, 0xa2, 0xe7, 0x09, 0xc3, 0xa0, 0x29, + 0x89, 0xdb, 0x40, 0xf6, 0x46, 0xfc, 0x3e, 0xd8, 0x44, 0xdf, 0x52, 0x72, + 0x97, 0x32, 0xd8, 0x83, 0x0c, 0x56, 0xf2, 0xd7, 0x7a, 0xf4, 0x00, 0x61, + 0x27, 0xdc, 0xa0, 0xc1, 0xb3, 0x12, 0x89, 0x65, 0xff, 0x4a, 0x16, 0x95, + 0x6d, 0x4a, 0x5d, 0xb0, 0x8f, 0xf6, 0xf5, 0xd7, 0x20, 0x0d, 0xf1, 0xbc, + 0x1f, 0x7b, 0xf0, 0x65, 0xfc, 0xc0, 0x7b, 0x3b, 0x35, 0xdd, 0x1c, 0x11, + 0xfb, 0xac, 0xdf, 0x84, 0x9f, 0x0a, 0xfd, 0xfa, 0x0c, 0x78, 0x73, 0x0d, + 0xb0, 0xe6, 0xe0, 0x9f, 0x24, 0xdd, 0x12, 0x14, 0x50, 0x41, 0x16, 0x15, + 0xcf, 0x1c, 0x3c, 0x7b, 0x44, 0x9c, 0xb3, 0x6c, 0xef, 0xc0, 0x59, 0x76, + 0xca, 0xa9, 0x58, 0xd2, 0x2f, 0x80, 0xc7, 0x6c, 0xaf, 0x57, 0x06, 0xeb, + 0x2c, 0xfb, 0x64, 0xf0, 0xc2, 0x77, 0x41, 0x5b, 0x7c, 0x06, 0x6a, 0xcf, + 0xb1, 0x7e, 0x10, 0x25, 0xeb, 0x3d, 0x81, 0x4f, 0x86, 0xf9, 0x63, 0x32, + 0x08, 0x1b, 0xf2, 0x54, 0xe6, 0x08, 0xec, 0x11, 0xf8, 0xd7, 0x19, 0x57, + 0x4a, 0xb5, 0xac, 0xd4, 0x21, 0x27, 0x4b, 0x8d, 0x13, 0x52, 0xae, 0x40, + 0x4e, 0x37, 0xa6, 0x51, 0x5e, 0x45, 0xf9, 0x24, 0xca, 0x77, 0x50, 0x12, + 0xfe, 0x13, 0x52, 0xaf, 0xbd, 0x89, 0xb9, 0x39, 0xc7, 0x47, 0x62, 0x1a, + 0x6e, 0xd8, 0xa2, 0x07, 0x4e, 0xc0, 0x0e, 0x0a, 0xea, 0x4f, 0x40, 0xc0, + 0x3e, 0x81, 0xdf, 0x6d, 0x1d, 0x7c, 0xb7, 0xb3, 0xf0, 0xc9, 0x33, 0x63, + 0x94, 0xad, 0xd6, 0xa9, 0xcc, 0x93, 0x66, 0x9e, 0x27, 0xb0, 0xde, 0x65, + 0xac, 0x0d, 0xdf, 0x13, 0xb6, 0xcd, 0xa3, 0xe9, 0x67, 0xe4, 0x0b, 0xe9, + 0xdb, 0x65, 0x5f, 0xdf, 0x5a, 0x6f, 0xef, 0xe6, 0x9e, 0x79, 0x16, 0xdc, + 0x37, 0xcf, 0x83, 0x7b, 0x0f, 0xf6, 0xcc, 0xfd, 0x76, 0x63, 0x1f, 0xdb, + 0xb5, 0x6d, 0x67, 0x7f, 0xce, 0xf8, 0x31, 0xf0, 0x13, 0x86, 0x39, 0x57, + 0x56, 0x42, 0x67, 0x87, 0xdd, 0x8c, 0x4d, 0xbb, 0x2a, 0x85, 0xdf, 0x33, + 0xa0, 0x19, 0xef, 0xcc, 0xa0, 0xfd, 0x36, 0xe0, 0x43, 0x5b, 0x3d, 0xe2, + 0x47, 0xa0, 0x17, 0x9c, 0xfd, 0x6f, 0x60, 0x5f, 0xbe, 0x74, 0xee, 0xcf, + 0xca, 0xb5, 0x06, 0x9f, 0x45, 0xec, 0x95, 0x23, 0xf2, 0x17, 0xd5, 0xcb, + 0x72, 0xba, 0x7a, 0x44, 0xde, 0x42, 0x39, 0x5b, 0xf5, 0x71, 0x86, 0x1e, + 0xe4, 0x02, 0xe7, 0x68, 0xca, 0x6c, 0x9a, 0x32, 0xfa, 0x9e, 0xf8, 0x34, + 0xf0, 0x37, 0xe9, 0x36, 0xe5, 0x7c, 0xda, 0x97, 0xf3, 0x63, 0x18, 0x53, + 0xeb, 0x92, 0xf0, 0x0b, 0xdc, 0x6b, 0x8f, 0x14, 0xaa, 0xbe, 0x14, 0x33, + 0xe2, 0x87, 0xb3, 0x51, 0x29, 0xc0, 0xbe, 0x85, 0x9d, 0xf4, 0x8c, 0x8e, + 0x39, 0xd1, 0xc6, 0xc3, 0x7b, 0xe3, 0x57, 0x56, 0x7d, 0xd3, 0x96, 0x5e, + 0xb3, 0x5e, 0x6b, 0x80, 0x76, 0x16, 0x40, 0x4b, 0x37, 0xf0, 0x18, 0x69, + 0xe4, 0x92, 0x55, 0xaf, 0x29, 0x3e, 0x33, 0xbc, 0x81, 0xb1, 0x0d, 0xda, + 0x90, 0xca, 0x46, 0x00, 0x2e, 0x68, 0xff, 0xfd, 0x52, 0x60, 0x6f, 0xe0, + 0x6c, 0x6c, 0xd8, 0xad, 0x49, 0x40, 0x24, 0x52, 0xab, 0xb1, 0x4f, 0x0c, + 0x32, 0x39, 0xa0, 0xa1, 0x9c, 0xcc, 0x78, 0x49, 0xd0, 0xb9, 0xda, 0x0f, + 0x4a, 0xee, 0x27, 0x0a, 0x78, 0x93, 0x80, 0x89, 0x36, 0x83, 0x07, 0xbd, + 0xa2, 0x69, 0x7c, 0xa3, 0xd1, 0x21, 0xe5, 0xc5, 0x30, 0xf0, 0xd2, 0x2d, + 0xa7, 0x2a, 0xae, 0x9c, 0x06, 0x4d, 0xfc, 0x31, 0x74, 0xe5, 0x99, 0x4a, + 0x42, 0xc5, 0x44, 0xac, 0xec, 0x95, 0x89, 0xc1, 0x65, 0x96, 0x97, 0x27, + 0x52, 0x35, 0x96, 0x3f, 0x34, 0x3e, 0xe5, 0x1b, 0xc6, 0xd7, 0xfc, 0xc9, + 0xc4, 0x6e, 0x55, 0xfe, 0x74, 0x62, 0x44, 0x95, 0x57, 0xe1, 0xbb, 0x6e, + 0xc6, 0x2f, 0x94, 0x7d, 0x92, 0xcf, 0x64, 0xa4, 0x58, 0x51, 0xfa, 0xd9, + 0x39, 0x0e, 0xda, 0x98, 0x6e, 0xd0, 0x4f, 0x4a, 0xc8, 0xa9, 0xd5, 0x2c, + 0xe8, 0x03, 0xbc, 0x9e, 0x4d, 0xa3, 0x14, 0xf3, 0x17, 0x8c, 0xed, 0x60, + 0xec, 0x8e, 0x38, 0x30, 0xbe, 0x49, 0x9a, 0xbe, 0x49, 0xeb, 0x1f, 0xe7, + 0x03, 0x9d, 0x51, 0x0f, 0xfe, 0x06, 0x3e, 0x96, 0x38, 0xa5, 0x8c, 0xb6, + 0x99, 0xe0, 0x57, 0xca, 0xfa, 0xa2, 0x44, 0x22, 0xd9, 0x1f, 0x48, 0xe4, + 0xf9, 0x66, 0xf3, 0x67, 0x90, 0x21, 0x3e, 0x7c, 0x42, 0xdb, 0x42, 0xfd, + 0x32, 0xdb, 0x28, 0x1f, 0xf6, 0xb8, 0xd7, 0x40, 0x43, 0xb9, 0xa3, 0x22, + 0xdf, 0x43, 0x1d, 0x6c, 0x39, 0x9c, 0xed, 0x0f, 0x71, 0xb6, 0xe6, 0xac, + 0x55, 0x1d, 0xfb, 0xd1, 0xd7, 0xe2, 0x3e, 0xf6, 0xb8, 0x9d, 0x18, 0x5f, + 0x5b, 0xe6, 0x98, 0xe4, 0x18, 0x86, 0x62, 0x9c, 0xde, 0xdf, 0xa1, 0xcc, + 0x88, 0x6c, 0x54, 0xc4, 0xd8, 0xca, 0xef, 0x61, 0x8c, 0x8e, 0x21, 0x95, + 0x24, 0x0b, 0xfd, 0x88, 0x5f, 0x25, 0xa5, 0xe2, 0xf4, 0x93, 0x71, 0x82, + 0xed, 0xc9, 0x7a, 0xe5, 0x42, 0x07, 0x75, 0x5e, 0xde, 0xe3, 0xf3, 0x18, + 0xfa, 0xc0, 0x07, 0xc8, 0x52, 0x67, 0x73, 0x4f, 0xad, 0x67, 0xa1, 0xff, + 0x4a, 0x38, 0x2b, 0xb3, 0x47, 0xf5, 0xa7, 0xd7, 0xb1, 0x24, 0x58, 0xa7, + 0x08, 0xa5, 0x5c, 0xc0, 0xfa, 0xa9, 0x15, 0xc7, 0xa1, 0x5f, 0x3d, 0xb8, + 0x02, 0x36, 0x51, 0xf4, 0x03, 0x9f, 0xa3, 0x71, 0xd5, 0xc8, 0xb0, 0xc0, + 0x27, 0xa1, 0x8f, 0xc2, 0x33, 0x48, 0xfa, 0x6b, 0x38, 0xec, 0xbe, 0xec, + 0x15, 0x99, 0x38, 0xa7, 0xf7, 0x6c, 0x5f, 0x80, 0x27, 0x09, 0x9d, 0x7e, + 0x6d, 0x31, 0x99, 0xbe, 0x2a, 0x8c, 0x9d, 0xa5, 0x41, 0x9b, 0x7f, 0xd4, + 0x01, 0xbd, 0x3c, 0x96, 0xb3, 0xff, 0x63, 0x87, 0xb6, 0x7b, 0xa1, 0xcb, + 0xe9, 0xbb, 0x57, 0x72, 0x18, 0xd3, 0x29, 0xff, 0xc0, 0xc1, 0x73, 0x83, + 0xef, 0xb0, 0x61, 0x1c, 0x0d, 0x5f, 0xd9, 0x9c, 0x21, 0xfc, 0x02, 0xc8, + 0x21, 0x9e, 0xa1, 0x25, 0x13, 0x90, 0xde, 0x82, 0xf9, 0x07, 0xcd, 0x5a, + 0x83, 0x17, 0x02, 0xda, 0x00, 0xdc, 0xe7, 0xe0, 0xab, 0x2e, 0x3a, 0x26, + 0x8e, 0x48, 0x79, 0xc1, 0xf6, 0x76, 0x3b, 0xba, 0x35, 0x1e, 0xcc, 0xb1, + 0x71, 0x15, 0xcf, 0x22, 0x6d, 0x1d, 0x36, 0xb4, 0xf5, 0x04, 0x68, 0xeb, + 0x84, 0xa2, 0xad, 0xa6, 0xfc, 0x0c, 0x3e, 0xd7, 0x57, 0x6e, 0x4a, 0x5f, + 0xed, 0x7f, 0xdd, 0x80, 0x97, 0xbf, 0x1e, 0x99, 0xf9, 0x2a, 0xd6, 0x85, + 0x3e, 0x29, 0x57, 0x92, 0xb9, 0x49, 0xda, 0x39, 0xd0, 0x0f, 0x65, 0xf8, + 0x58, 0x83, 0x2b, 0x03, 0xaa, 0xcf, 0x20, 0x74, 0x45, 0x1d, 0xf4, 0xc6, + 0xf3, 0x2d, 0x57, 0x20, 0x53, 0x57, 0xc2, 0xd0, 0x47, 0xe4, 0x45, 0xe9, + 0xb3, 0xc1, 0xeb, 0xec, 0x5f, 0x07, 0xef, 0x0c, 0xae, 0xc0, 0x86, 0x04, + 0xce, 0x38, 0x57, 0xbd, 0xe2, 0xa9, 0xf1, 0xf5, 0xca, 0x88, 0x1a, 0x57, + 0xaf, 0x8c, 0xa2, 0x84, 0xac, 0xce, 0xa4, 0x65, 0x78, 0x25, 0x23, 0x89, + 0x15, 0x4b, 0x4a, 0xe3, 0xcd, 0x66, 0x04, 0xb0, 0x8f, 0xac, 0xf4, 0xca, + 0x55, 0x15, 0xf3, 0x8c, 0xa8, 0x38, 0xe8, 0x6c, 0x66, 0x1c, 0xbc, 0xc9, + 0xf3, 0x83, 0xcf, 0xbe, 0x52, 0x84, 0xde, 0x2b, 0xca, 0xa9, 0x45, 0x9e, + 0x0f, 0xe3, 0xcb, 0xeb, 0xf0, 0x25, 0x93, 0x90, 0x4d, 0x47, 0x65, 0xba, + 0xda, 0x09, 0xd9, 0xe4, 0x40, 0xb7, 0x1d, 0xee, 0x94, 0xe8, 0x10, 0xe9, + 0x01, 0xe7, 0x92, 0xc5, 0xdc, 0x45, 0xd8, 0xa0, 0x45, 0x29, 0x2e, 0x6e, + 0xf5, 0x2f, 0x49, 0x27, 0x78, 0xea, 0xa8, 0x1c, 0xaf, 0x72, 0x1e, 0xc7, + 0x2d, 0xcb, 0x6e, 0xfa, 0xa3, 0xee, 0x41, 0xcc, 0x03, 0x9d, 0xdc, 0xf2, + 0x47, 0xfe, 0xcb, 0x7d, 0x00, 0x4d, 0x06, 0x7c, 0x17, 0xf1, 0x3b, 0xb2, + 0xe3, 0xd6, 0x7a, 0x46, 0x9c, 0xa9, 0xcc, 0xef, 0x5b, 0xdf, 0xcb, 0x64, + 0xac, 0x4b, 0x99, 0x9c, 0x75, 0x39, 0x53, 0xb4, 0xae, 0x40, 0xcf, 0xd4, + 0x57, 0xbf, 0x0b, 0xfa, 0x81, 0xff, 0xcb, 0xfb, 0xae, 0x4d, 0x1c, 0x76, + 0xab, 0x18, 0x54, 0x47, 0xf6, 0x1d, 0xb9, 0x52, 0xa1, 0x5d, 0xd0, 0x7c, + 0x70, 0x2a, 0xed, 0xdf, 0x0e, 0xf8, 0xdc, 0x43, 0x2a, 0xf6, 0xba, 0xa5, + 0x0b, 0x3a, 0xb2, 0xe0, 0x2d, 0xa5, 0x0b, 0xba, 0xa9, 0x0b, 0xd2, 0x05, + 0xd9, 0x2e, 0xeb, 0x55, 0xca, 0x62, 0xf0, 0xa0, 0x90, 0x67, 0xf0, 0x5e, + 0xeb, 0x96, 0xaf, 0x2c, 0x04, 0xf4, 0xc4, 0x3d, 0x97, 0x77, 0x76, 0x49, + 0x48, 0x0e, 0x2b, 0x1d, 0xdc, 0x23, 0x1b, 0xcb, 0xf0, 0x79, 0x20, 0x19, + 0xed, 0xbb, 0x75, 0xcc, 0x93, 0xfe, 0xb0, 0xf4, 0xd2, 0xa7, 0xc7, 0xc1, + 0x45, 0x79, 0x3f, 0x84, 0xbd, 0xf6, 0x72, 0x57, 0xc1, 0xfb, 0x28, 0xf8, + 0x92, 0xcf, 0x96, 0x14, 0x60, 0x1b, 0xf2, 0x9e, 0xaa, 0x00, 0x9f, 0x70, + 0xbd, 0xb2, 0x07, 0xb0, 0xc1, 0xbf, 0x19, 0xb7, 0xa4, 0xd3, 0xdb, 0x2d, + 0x8c, 0x51, 0xd7, 0x21, 0x1b, 0x42, 0xd9, 0x6f, 0xa8, 0xbe, 0x9d, 0x1e, + 0xfd, 0x8f, 0x23, 0x52, 0x52, 0x77, 0x51, 0x28, 0x97, 0x35, 0x1c, 0x05, + 0xc8, 0xea, 0xd2, 0x68, 0x17, 0xf5, 0xd7, 0x88, 0x4f, 0x39, 0x10, 0xd3, + 0x76, 0xe3, 0xfa, 0xe2, 0x4a, 0x27, 0xf5, 0xf6, 0xa1, 0xf4, 0x18, 0xce, + 0x81, 0xcf, 0x6c, 0x4f, 0xa6, 0x29, 0x04, 0x9d, 0xec, 0xda, 0xc4, 0xac, + 0xf7, 0xdf, 0x0d, 0xcf, 0x55, 0x41, 0xf3, 0x27, 0xe4, 0xdf, 0xac, 0x4e, + 0xcb, 0x9f, 0xad, 0x4e, 0xc2, 0x0e, 0x39, 0x06, 0x3b, 0xe4, 0xd3, 0xe0, + 0xe9, 0xa3, 0xe0, 0xe9, 0x27, 0xc1, 0x07, 0xe3, 0x2a, 0xd6, 0x50, 0xad, + 0x24, 0x5f, 0xf6, 0x55, 0xec, 0xe7, 0x1d, 0xf0, 0xc0, 0x3e, 0x71, 0xce, + 0xc5, 0x70, 0xce, 0x7e, 0x33, 0xe6, 0x35, 0x1f, 0x9c, 0x4d, 0x13, 0xf7, + 0x7e, 0xd2, 0x51, 0x34, 0xe3, 0xb9, 0x5f, 0xc4, 0xd9, 0xee, 0xcc, 0x26, + 0xab, 0x44, 0xf9, 0xf9, 0xea, 0x88, 0x94, 0x2e, 0xa2, 0xff, 0xd9, 0x6e, + 0x9c, 0x21, 0x75, 0x45, 0xf2, 0x4c, 0x49, 0xd6, 0x40, 0x27, 0x39, 0x65, + 0xc3, 0x94, 0x63, 0xc9, 0x97, 0x44, 0xc6, 0x64, 0x3f, 0xec, 0x7e, 0xc6, + 0x14, 0x72, 0x31, 0xed, 0x23, 0x0f, 0x5e, 0xcc, 0xc2, 0x86, 0xa1, 0x6c, + 0xea, 0x41, 0x1d, 0xd7, 0x5a, 0xeb, 0x0d, 0x6b, 0x7d, 0x8e, 0xb5, 0x9e, + 0x96, 0x69, 0x68, 0x27, 0xf8, 0x00, 0x90, 0xdf, 0x5e, 0x1c, 0xeb, 0x45, + 0xa6, 0x2e, 0xba, 0x91, 0xe9, 0x8b, 0x9c, 0x23, 0x22, 0xa1, 0x79, 0xe2, + 0x99, 0x73, 0x8c, 0x2a, 0x7f, 0x22, 0x35, 0xcf, 0x33, 0xdb, 0x83, 0x71, + 0x85, 0x20, 0xe6, 0x0d, 0xbf, 0x45, 0xcb, 0x0a, 0xf8, 0x30, 0x2d, 0x7a, + 0x0f, 0xb8, 0x80, 0x2c, 0xc9, 0x29, 0xbf, 0xa6, 0x5d, 0xe7, 0x29, 0xd8, + 0xb1, 0x1e, 0x75, 0x9d, 0x97, 0x58, 0x54, 0xf4, 0xee, 0xc9, 0xf4, 0xc5, + 0xef, 0x46, 0x78, 0x8e, 0x1b, 0xd8, 0x63, 0xe8, 0xec, 0x1a, 0x75, 0x22, + 0xd6, 0xe6, 0x5c, 0xe1, 0x96, 0xbd, 0x64, 0x20, 0x9b, 0xee, 0x8d, 0x10, + 0x1f, 0x9f, 0x82, 0x5f, 0x35, 0xa8, 0xe0, 0x61, 0x7d, 0x1a, 0x7b, 0x94, + 0x7e, 0x46, 0x1b, 0x6c, 0xd8, 0x8c, 0x9f, 0x50, 0x32, 0x6e, 0x1f, 0xe4, + 0x9a, 0x2b, 0xcb, 0xbb, 0x89, 0x2f, 0xf8, 0xf4, 0x2f, 0xf2, 0x9d, 0x78, + 0x23, 0x0d, 0x90, 0x5f, 0x21, 0x4f, 0x56, 0x81, 0xbb, 0x9e, 0x01, 0xa9, + 0xad, 0xb2, 0x2d, 0xa6, 0xe8, 0xdd, 0x01, 0x5e, 0x66, 0x2b, 0xcd, 0x07, + 0xf3, 0x69, 0x1f, 0x30, 0x13, 0x0f, 0x0a, 0x3e, 0xe0, 0x62, 0x14, 0xe7, + 0x4f, 0xd8, 0x7b, 0x8c, 0x8e, 0xde, 0x0e, 0xff, 0x93, 0x34, 0x8f, 0xb2, + 0xb6, 0x1d, 0x76, 0x25, 0x79, 0xed, 0x69, 0xde, 0x5d, 0x61, 0xcf, 0x9a, + 0xce, 0x8b, 0xa0, 0xb3, 0x32, 0x7c, 0xdb, 0x8d, 0x79, 0xc6, 0xcd, 0xaf, + 0xc8, 0x53, 0x94, 0xb3, 0xa0, 0xb9, 0xf2, 0x32, 0x6c, 0xce, 0xc5, 0x1e, + 0xc8, 0xd4, 0x66, 0xf3, 0x28, 0x6c, 0xe4, 0x93, 0x69, 0x9e, 0xdd, 0x1b, + 0x38, 0xbb, 0xce, 0xf8, 0x49, 0xe0, 0x70, 0xe9, 0xc5, 0x07, 0x94, 0x4c, + 0x81, 0x7d, 0xa3, 0x74, 0x9b, 0x8e, 0xbf, 0xa4, 0x69, 0x0f, 0x29, 0x3e, + 0xcf, 0x7b, 0x94, 0x99, 0x7f, 0x80, 0x73, 0x18, 0x55, 0x32, 0x5e, 0xcb, + 0x9f, 0x2e, 0x29, 0x1d, 0xcd, 0x61, 0xbf, 0x63, 0x6d, 0xfd, 0x32, 0x78, + 0x87, 0xad, 0xd7, 0x38, 0xce, 0xf3, 0x45, 0xfd, 0x98, 0x9c, 0xdf, 0x7d, + 0x58, 0x2e, 0xec, 0x4e, 0x8e, 0x4d, 0xda, 0xd4, 0x1b, 0x87, 0xa5, 0xf6, + 0x62, 0x4e, 0x96, 0x16, 0xb4, 0xfe, 0x9e, 0xf2, 0xc6, 0xa4, 0xd0, 0x28, + 0xe2, 0x3d, 0xcb, 0xf8, 0x2b, 0xfa, 0x07, 0xb2, 0x39, 0xd8, 0x53, 0x9e, + 0x7b, 0x82, 0x1c, 0xd1, 0xfa, 0xd9, 0xb6, 0x3b, 0x55, 0xbc, 0x61, 0x66, + 0xf5, 0x11, 0xd4, 0xe7, 0x21, 0xff, 0xa0, 0xc3, 0xed, 0x14, 0x70, 0xf7, + 0x47, 0x0a, 0x4f, 0x85, 0x34, 0x7d, 0x01, 0x8e, 0x49, 0xc6, 0xa7, 0x50, + 0x3f, 0x2e, 0xd4, 0xb3, 0xdc, 0x5b, 0x30, 0x5f, 0xd6, 0xc0, 0x1f, 0x32, + 0xf1, 0xd2, 0x7f, 0x1e, 0x21, 0x9f, 0x86, 0xbc, 0xa0, 0x7e, 0x8f, 0xcb, + 0x38, 0x1c, 0xd7, 0x28, 0x2f, 0xb0, 0x2e, 0xe5, 0x72, 0x7c, 0x21, 0x9d, + 0x50, 0xf7, 0x87, 0x9f, 0x32, 0x7e, 0xf9, 0x51, 0xf8, 0xad, 0x85, 0x46, + 0xc7, 0x2d, 0x74, 0xf4, 0x96, 0x3c, 0xd4, 0xb2, 0x7b, 0x3d, 0xee, 0x1a, + 0xf9, 0x7c, 0x1c, 0xa2, 0xc4, 0xde, 0x67, 0x49, 0x07, 0xe4, 0xed, 0x21, + 0x19, 0x32, 0xb2, 0x96, 0xfb, 0xe9, 0x51, 0xfa, 0xb0, 0x30, 0x0e, 0xbb, + 0x6b, 0xe9, 0xb7, 0xa1, 0xf7, 0x5b, 0xd9, 0x78, 0xa4, 0x79, 0xc8, 0x87, + 0x05, 0xc8, 0x8e, 0x05, 0xc8, 0x8e, 0x05, 0xc8, 0x8e, 0x05, 0xc8, 0x8e, + 0x05, 0xc8, 0x8e, 0x05, 0xc8, 0x8e, 0x85, 0x71, 0xa3, 0x57, 0x4f, 0x9a, + 0x38, 0x13, 0xfd, 0x9b, 0x56, 0x5b, 0x81, 0xb1, 0x26, 0xfa, 0x2f, 0x49, + 0xff, 0x2a, 0xce, 0xe5, 0x95, 0x34, 0xfd, 0xed, 0xa6, 0xfc, 0x79, 0xba, + 0x75, 0xe7, 0x8c, 0x6d, 0x30, 0xaf, 0x42, 0xe4, 0x51, 0x9c, 0xd7, 0x04, + 0xce, 0xeb, 0xb1, 0x1b, 0xf2, 0x27, 0x98, 0x6b, 0x31, 0xe4, 0x87, 0xe0, + 0x93, 0x8e, 0x5f, 0x77, 0x6e, 0xf4, 0xbd, 0x3f, 0xc8, 0xdf, 0x66, 0x2c, + 0xe1, 0xfb, 0xc4, 0xb5, 0x5c, 0x31, 0x38, 0x2d, 0x64, 0x7a, 0x40, 0xdf, + 0xb4, 0xed, 0xae, 0x28, 0xdb, 0xee, 0x50, 0xda, 0x91, 0xb5, 0x18, 0xf5, + 0xe9, 0x9b, 0x72, 0x7c, 0xf1, 0xb6, 0x2e, 0x89, 0xf2, 0x8c, 0x76, 0xcb, + 0xba, 0x92, 0x21, 0x8f, 0xa0, 0x6f, 0x56, 0xa6, 0x81, 0xeb, 0x83, 0xf0, + 0x07, 0x2f, 0xc8, 0x9e, 0xf8, 0x05, 0xec, 0xe3, 0x8f, 0x31, 0x06, 0xf6, + 0x7c, 0xb3, 0x88, 0xba, 0xcb, 0xf0, 0x19, 0xae, 0x09, 0x9f, 0xf7, 0xb8, + 0x67, 0xe0, 0x58, 0xe4, 0xdc, 0x94, 0xfb, 0x8e, 0x04, 0xf4, 0x43, 0x5a, + 0x61, 0xec, 0x9d, 0xf1, 0x5e, 0xfa, 0x57, 0x3d, 0xe0, 0xaf, 0x37, 0xa1, + 0x83, 0xb9, 0x06, 0xf9, 0x9d, 0xf0, 0xfd, 0x1c, 0xf0, 0x25, 0x26, 0x3b, + 0xb3, 0xf7, 0x40, 0xef, 0x52, 0xc6, 0x6b, 0x1f, 0xa8, 0x80, 0x31, 0x4a, + 0x0f, 0xa4, 0x83, 0xbb, 0x87, 0x7f, 0x06, 0x1b, 0x27, 0x06, 0xfc, 0xa2, + 0x7e, 0x39, 0xb0, 0x71, 0x03, 0x5b, 0x46, 0xc7, 0x8d, 0x5f, 0x56, 0xf6, + 0x4c, 0x1e, 0xfa, 0xeb, 0x08, 0xfa, 0x32, 0x6e, 0xd7, 0x6c, 0x9e, 0x48, + 0xbb, 0x32, 0xf3, 0x1c, 0x65, 0xd4, 0xdd, 0x26, 0x3e, 0x49, 0x7d, 0x2b, + 0xd6, 0x1b, 0x99, 0x75, 0x37, 0x02, 0x5d, 0x39, 0x0e, 0x5a, 0xca, 0x83, + 0xbe, 0x42, 0x7b, 0x0f, 0x43, 0xf7, 0xaa, 0xbb, 0x01, 0xd0, 0x30, 0xd7, + 0x7d, 0xc4, 0xfa, 0xb7, 0x99, 0x51, 0xe8, 0xe2, 0x07, 0xa0, 0x8b, 0xfb, + 0x31, 0x57, 0x1e, 0xfa, 0x98, 0xba, 0xd8, 0x95, 0x6f, 0xae, 0xe6, 0x21, + 0x93, 0xf6, 0x75, 0x91, 0x87, 0x0e, 0x6f, 0xf2, 0x4a, 0xd1, 0xf0, 0xd2, + 0x0e, 0x29, 0xa8, 0x78, 0x73, 0x51, 0xf1, 0x5c, 0x79, 0x99, 0x36, 0x08, + 0xf8, 0x6f, 0x99, 0xbc, 0x4f, 0x7b, 0x92, 0x32, 0x01, 0x32, 0x64, 0xf9, + 0xf7, 0x51, 0x1e, 0x46, 0xa9, 0xed, 0xb4, 0x97, 0x17, 0x7e, 0x11, 0xd1, + 0x31, 0xce, 0x78, 0x8b, 0xad, 0x56, 0xc3, 0xfe, 0x8e, 0xf0, 0xae, 0xde, + 0xef, 0xcd, 0x7e, 0x1a, 0x7b, 0x3c, 0x0a, 0xfa, 0x1a, 0x07, 0x7d, 0x1d, + 0xc6, 0x5e, 0xcf, 0x58, 0xc3, 0x07, 0x42, 0xd0, 0xe5, 0xcf, 0x48, 0x11, + 0x7b, 0x5c, 0x5e, 0xf2, 0xad, 0x7d, 0xf3, 0xa2, 0xde, 0x0b, 0x69, 0xde, + 0xe9, 0x7f, 0x1c, 0xbe, 0x73, 0x4c, 0xce, 0xae, 0x3a, 0x26, 0x3e, 0xe8, + 0xa0, 0x8e, 0xba, 0x1b, 0xb2, 0xc8, 0xc5, 0x5c, 0x0b, 0xff, 0x3b, 0x2a, + 0x51, 0xcc, 0xb7, 0xf0, 0x49, 0xbc, 0x33, 0x5e, 0xf0, 0x88, 0x75, 0x7d, + 0xfd, 0x5a, 0x2f, 0x74, 0x9d, 0x9b, 0x87, 0x5f, 0xe9, 0x78, 0xe4, 0x17, + 0x0f, 0xf8, 0xc9, 0x49, 0x61, 0x18, 0xf6, 0xd8, 0xc5, 0x56, 0x5e, 0x81, + 0x1c, 0xab, 0x66, 0x65, 0x69, 0x95, 0x76, 0x53, 0x56, 0xf9, 0xc5, 0x94, + 0x4f, 0xa5, 0x2a, 0x6c, 0x9f, 0xf4, 0x93, 0x56, 0x4e, 0xcd, 0x19, 0xf1, + 0xdd, 0x2c, 0xe3, 0x1a, 0x62, 0xb9, 0x07, 0xde, 0x80, 0x2f, 0x9a, 0x01, + 0x6f, 0x66, 0x21, 0x0f, 0x5d, 0xc8, 0x3b, 0xea, 0xb1, 0xd5, 0x4e, 0xe9, + 0x41, 0xfd, 0x45, 0xd8, 0x3b, 0xcf, 0x51, 0x3e, 0x5c, 0x16, 0xbb, 0xfe, + 0x41, 0x71, 0x0f, 0xc6, 0x3c, 0x86, 0xcc, 0x5d, 0xcd, 0xaf, 0x01, 0xaf, + 0x5e, 0x23, 0x0c, 0x9b, 0x7e, 0xa3, 0xba, 0x0d, 0xbe, 0xdc, 0x23, 0x56, + 0x21, 0xc6, 0x3a, 0x5f, 0x96, 0x33, 0xb4, 0x41, 0x19, 0xf7, 0x88, 0xd0, + 0x77, 0x37, 0xb1, 0x86, 0x76, 0x3f, 0x93, 0x3a, 0xff, 0x5b, 0xa2, 0xea, + 0x1b, 0xc1, 0x7d, 0x8f, 0xba, 0x97, 0x94, 0xc1, 0x46, 0x10, 0x93, 0x22, + 0x1c, 0x6b, 0x56, 0xa9, 0xb1, 0x8e, 0xf5, 0x08, 0x0b, 0xf7, 0xa4, 0xd7, + 0xb3, 0xcf, 0xee, 0x33, 0xeb, 0xc5, 0xb9, 0x27, 0x2b, 0x0c, 0xbc, 0x74, + 0x78, 0xc1, 0x5a, 0x91, 0x1e, 0x0d, 0xe7, 0x08, 0xda, 0xae, 0xa2, 0x8d, + 0xef, 0x6c, 0x1f, 0x91, 0xfa, 0x82, 0x58, 0xa1, 0x03, 0xf0, 0x8e, 0xa1, + 0xc3, 0xeb, 0x90, 0x31, 0x36, 0x74, 0x65, 0x7d, 0xe1, 0x49, 0x94, 0x98, + 0xe7, 0xb9, 0xcb, 0x32, 0xa5, 0xfd, 0x69, 0xd8, 0x98, 0x43, 0x4a, 0xdf, + 0x3e, 0x0c, 0xbf, 0x7f, 0x16, 0xbf, 0xc1, 0xbd, 0xf7, 0xa0, 0x8e, 0x7e, + 0x94, 0x2f, 0x77, 0xdf, 0x4f, 0x3c, 0x11, 0x3f, 0xb4, 0xf9, 0x88, 0x2f, + 0xea, 0xe6, 0x45, 0xe0, 0x08, 0xe7, 0x3f, 0xbc, 0x19, 0x03, 0xc8, 0x31, + 0xaf, 0x68, 0x69, 0x81, 0x3c, 0x98, 0x93, 0x97, 0x56, 0xa9, 0xf3, 0xfe, + 0x4a, 0x9e, 0x3a, 0xfb, 0xbb, 0xc0, 0xfd, 0xed, 0x38, 0xf3, 0x98, 0x84, + 0x9e, 0x67, 0xdc, 0x9b, 0xb2, 0x7f, 0x0f, 0x64, 0xae, 0x6b, 0x6c, 0x88, + 0x98, 0x38, 0xcf, 0x0f, 0x48, 0xe7, 0x5c, 0x5c, 0x3a, 0xe6, 0x98, 0x4f, + 0x91, 0x62, 0x1e, 0x02, 0x6d, 0xa0, 0xb1, 0xb7, 0x55, 0x8e, 0xd6, 0x9e, + 0x04, 0xca, 0xf4, 0x3a, 0x7e, 0x97, 0x30, 0x7f, 0x27, 0xec, 0xf7, 0x8e, + 0x95, 0x3b, 0x71, 0x3e, 0x7a, 0xce, 0xf6, 0xb1, 0x65, 0x3d, 0x16, 0xe3, + 0x92, 0x71, 0x5f, 0x52, 0x18, 0xc7, 0xf1, 0x29, 0x8c, 0x4d, 0x8d, 0xbd, + 0xb5, 0x39, 0x9e, 0x63, 0xa9, 0xf3, 0x62, 0xe0, 0xf3, 0x3b, 0xa4, 0xfe, + 0x55, 0xf2, 0x3b, 0xec, 0x7f, 0xc8, 0xb5, 0x52, 0x83, 0x65, 0x37, 0x4a, + 0xf6, 0x49, 0x98, 0xf6, 0x41, 0xd3, 0xee, 0x29, 0x3d, 0xe8, 0x6c, 0xc6, + 0x4f, 0xe0, 0x2b, 0x2c, 0x24, 0xcf, 0x24, 0x2c, 0xea, 0x59, 0x3e, 0xd3, + 0x9f, 0x82, 0x7f, 0xf1, 0x1c, 0xec, 0xca, 0x1a, 0xcb, 0x2e, 0x29, 0xd7, + 0x4e, 0xc8, 0xa4, 0x7a, 0x7e, 0x54, 0x1e, 0x75, 0xfd, 0x66, 0x27, 0xec, + 0x9f, 0xbb, 0xf7, 0xad, 0xf5, 0x76, 0x99, 0x98, 0x4a, 0xde, 0x7e, 0x46, + 0x0e, 0xa5, 0x49, 0x0f, 0x9e, 0xfb, 0x10, 0xce, 0xb4, 0xd4, 0xe8, 0x20, + 0xcd, 0x03, 0xee, 0x2c, 0xf8, 0x2c, 0x27, 0x17, 0x56, 0x93, 0x09, 0x01, + 0x6e, 0x1e, 0xe2, 0x7b, 0x0d, 0xe7, 0xca, 0x18, 0xc4, 0xf3, 0x3c, 0x4b, + 0xee, 0x9b, 0xfa, 0x91, 0xe7, 0xc9, 0xfd, 0x53, 0xe7, 0x32, 0x96, 0x96, + 0x1c, 0xbb, 0x26, 0xf4, 0x9b, 0x79, 0x5e, 0x9c, 0x27, 0xd8, 0xb3, 0x1e, + 0x67, 0x9f, 0xef, 0x87, 0x31, 0x19, 0x11, 0x7b, 0xce, 0x15, 0x7b, 0x85, + 0x65, 0x37, 0x4a, 0xb6, 0xc1, 0x1f, 0x3d, 0x3f, 0x68, 0xda, 0x3c, 0xd4, + 0xc1, 0x6e, 0x7c, 0x96, 0xfc, 0x75, 0x07, 0xf8, 0x9a, 0x71, 0x1c, 0xd2, + 0xe2, 0x98, 0x7c, 0x73, 0xe9, 0x7a, 0x1e, 0x0b, 0xcd, 0x69, 0x9b, 0xe3, + 0x7a, 0x1e, 0x1b, 0xfb, 0x2d, 0x78, 0x8c, 0x6b, 0x50, 0xae, 0x38, 0xf2, + 0x54, 0x2c, 0x99, 0xc8, 0x69, 0xff, 0xc2, 0x4d, 0xd9, 0xc3, 0x09, 0xda, + 0xa0, 0xf5, 0xe7, 0xee, 0x8b, 0x52, 0xc7, 0x3c, 0x9b, 0x26, 0xdd, 0x06, + 0x74, 0x16, 0x05, 0x6d, 0x35, 0xe5, 0x2b, 0xd0, 0xbf, 0x65, 0xcf, 0x52, + 0xb6, 0x25, 0xed, 0xc5, 0xc7, 0x62, 0x4d, 0x79, 0x22, 0xad, 0xc7, 0xcf, + 0xc8, 0xb0, 0xa1, 0x6b, 0xe5, 0xb3, 0x41, 0x0e, 0x13, 0x5f, 0x4d, 0x19, + 0x4f, 0xdf, 0x2e, 0xe9, 0x3e, 0xd0, 0xf9, 0x3e, 0xea, 0x6a, 0xe2, 0x21, + 0xa0, 0xef, 0x9b, 0xc6, 0xb7, 0xd4, 0xbd, 0x7a, 0xa1, 0x42, 0xb8, 0xb6, + 0x81, 0x6e, 0x73, 0xf0, 0x99, 0xb6, 0x62, 0x5c, 0xa9, 0x61, 0xbf, 0x19, + 0xc6, 0xda, 0x25, 0xf8, 0x10, 0x8f, 0xc5, 0xbc, 0xc4, 0x90, 0x3d, 0x1c, + 0x3f, 0x25, 0xff, 0x4a, 0xc1, 0xfb, 0xf9, 0xb4, 0xa6, 0x97, 0xd9, 0xcc, + 0xcd, 0xe2, 0x4e, 0xad, 0xf1, 0x68, 0xce, 0xb5, 0x66, 0x7d, 0xa1, 0xa1, + 0x63, 0x4c, 0x5b, 0x31, 0xe9, 0x2d, 0xd9, 0xe3, 0x18, 0x59, 0x50, 0xae, + 0xfe, 0x8e, 0x04, 0xb2, 0xa7, 0x9a, 0x01, 0xbe, 0xce, 0x12, 0x4f, 0x09, + 0x93, 0xef, 0x14, 0x69, 0xb1, 0x85, 0xc3, 0xcc, 0xdb, 0x4b, 0xe4, 0xec, + 0x39, 0xc8, 0x83, 0xe7, 0x24, 0xec, 0x05, 0x73, 0x75, 0xa1, 0x4f, 0xdc, + 0xdc, 0x37, 0x6c, 0x67, 0x8c, 0x0a, 0x7d, 0xee, 0x47, 0xfb, 0x10, 0xfa, + 0x51, 0x67, 0x32, 0xce, 0x4f, 0xfd, 0xc9, 0x7b, 0xd4, 0x3e, 0x95, 0xc7, + 0x59, 0xa8, 0x8d, 0x9b, 0xba, 0x60, 0x8e, 0x03, 0x2d, 0xfd, 0x83, 0x3a, + 0x7d, 0x3f, 0x90, 0xb3, 0x21, 0xeb, 0x95, 0x1d, 0x94, 0xd8, 0xbc, 0xe3, + 0xb0, 0xeb, 0x07, 0x5c, 0x3d, 0x9e, 0xfd, 0x28, 0xfb, 0xa1, 0x63, 0x16, + 0xa0, 0x77, 0x16, 0x0e, 0x1b, 0x5d, 0x34, 0x29, 0x5a, 0xcf, 0x8a, 0x75, + 0x30, 0x43, 0x5d, 0x9c, 0xb3, 0xf2, 0x2a, 0x67, 0x90, 0xf3, 0xf3, 0xdc, + 0x41, 0x3f, 0xab, 0xda, 0x26, 0xb6, 0x33, 0x1d, 0xbc, 0x6f, 0x82, 0x3e, + 0xd7, 0xfa, 0xbe, 0x0e, 0x7d, 0x7f, 0x7e, 0xf1, 0xe7, 0xca, 0xde, 0x3c, + 0x9f, 0x0e, 0xf4, 0xf6, 0xf7, 0x9b, 0x8c, 0x85, 0xd3, 0x4f, 0xef, 0xc8, + 0x8e, 0xc2, 0x27, 0x1b, 0x80, 0x8e, 0x4b, 0x43, 0xbf, 0x8d, 0xc0, 0x37, + 0xf3, 0x54, 0x8e, 0xcb, 0xab, 0x46, 0x9f, 0xf3, 0x6e, 0xee, 0x32, 0x7e, + 0x05, 0xc6, 0x0b, 0xe6, 0x7f, 0x2c, 0xcb, 0x15, 0xfa, 0x52, 0xf0, 0x07, + 0x56, 0x53, 0xd0, 0x37, 0x13, 0x92, 0x8b, 0x93, 0xe6, 0xd9, 0xc6, 0xf8, + 0xf6, 0x8f, 0x55, 0xbe, 0xe5, 0x46, 0x95, 0xb1, 0xd2, 0x67, 0xe4, 0x29, + 0xe6, 0x78, 0x2d, 0xbd, 0x21, 0xaf, 0x56, 0x7e, 0x2c, 0xdf, 0x52, 0xb6, + 0xe0, 0xc7, 0xe5, 0x31, 0xd7, 0x55, 0xb2, 0x89, 0x7e, 0x5d, 0xa7, 0xa7, + 0xe9, 0xab, 0x64, 0xec, 0xc1, 0x29, 0x8f, 0x7c, 0x4e, 0xdd, 0x26, 0x7e, + 0x57, 0x36, 0xea, 0x47, 0xa0, 0xdf, 0x4e, 0x08, 0xe3, 0x0f, 0x19, 0xc8, + 0x93, 0x58, 0xa0, 0xaf, 0xfc, 0x3c, 0x6c, 0xe5, 0xaa, 0x3d, 0x22, 0xe4, + 0x9b, 0x25, 0xc6, 0x48, 0xaa, 0x1e, 0x6d, 0x20, 0xcc, 0x7f, 0x3b, 0xf3, + 0x71, 0xab, 0x30, 0x74, 0xb5, 0xfe, 0xcb, 0x50, 0x1f, 0xc6, 0xe4, 0x34, + 0x64, 0xd7, 0x12, 0x64, 0xda, 0xba, 0xe2, 0x81, 0xe4, 0xc8, 0x61, 0xa5, + 0x6f, 0x7e, 0xa9, 0xee, 0x2e, 0xa7, 0x80, 0xe7, 0x69, 0xd0, 0x66, 0x39, + 0x86, 0x3e, 0xe0, 0xdf, 0xda, 0x92, 0x86, 0xef, 0xfc, 0xea, 0x56, 0x3c, + 0x7b, 0x5d, 0x08, 0x17, 0xe1, 0xd8, 0xbb, 0x4d, 0xa2, 0x6c, 0x27, 0x2f, + 0x2b, 0x7a, 0x32, 0x3e, 0xfb, 0x1b, 0xb0, 0x0b, 0xb9, 0x86, 0x25, 0x51, + 0xef, 0x32, 0xe8, 0x21, 0xe8, 0x67, 0x29, 0x7d, 0x9f, 0xbf, 0xed, 0x56, + 0xf7, 0x08, 0xe4, 0xf5, 0x6d, 0xf0, 0x93, 0x6c, 0x43, 0x77, 0x5f, 0x30, + 0xf6, 0x7e, 0x04, 0xf6, 0x35, 0x63, 0xf1, 0x65, 0xde, 0x55, 0xc0, 0x7e, + 0x9a, 0x65, 0x6c, 0x49, 0xad, 0xf9, 0x70, 0xa6, 0x5b, 0x06, 0xe7, 0x3a, + 0x24, 0xf5, 0xbc, 0x0d, 0x5a, 0x26, 0xee, 0x1f, 0x94, 0x83, 0x69, 0xfa, + 0xf4, 0x3b, 0xa4, 0xee, 0x76, 0x03, 0x3f, 0xd0, 0x6f, 0x23, 0xcc, 0xd1, + 0xda, 0xcb, 0xbb, 0x08, 0x05, 0x47, 0xdd, 0x1d, 0x12, 0xe6, 0x6a, 0xd4, + 0xdd, 0x5e, 0x29, 0x3f, 0xf7, 0xcd, 0x6d, 0xda, 0x37, 0x6f, 0x7f, 0x9f, + 0xea, 0x24, 0x9d, 0x26, 0xac, 0xbb, 0xbb, 0x4d, 0xbe, 0xf9, 0x87, 0x80, + 0x3d, 0xe8, 0x4b, 0x78, 0xc2, 0xe2, 0x3d, 0xdb, 0x2d, 0x43, 0x90, 0xa1, + 0xc3, 0xd0, 0x3d, 0xbb, 0xe7, 0x06, 0x64, 0x64, 0x2e, 0x21, 0x77, 0xcf, + 0x05, 0x3a, 0xfd, 0xca, 0x44, 0xca, 0xc4, 0x63, 0xbd, 0x0f, 0x19, 0x8f, + 0xbd, 0x5b, 0xcd, 0x0f, 0x18, 0x97, 0x20, 0xd3, 0x62, 0x5f, 0x56, 0xba, + 0x5f, 0x9f, 0xfb, 0x9b, 0x72, 0x70, 0x31, 0x2c, 0xc3, 0x8a, 0x9f, 0x48, + 0xdf, 0xb4, 0xb3, 0xff, 0x12, 0xfb, 0x48, 0x82, 0xfe, 0x8f, 0x19, 0xdf, + 0x30, 0x8a, 0x73, 0xe5, 0x19, 0x42, 0x5f, 0xc1, 0x5f, 0x64, 0xae, 0x6b, + 0x29, 0xdd, 0x3a, 0x9e, 0x63, 0xdf, 0xc1, 0x98, 0x1c, 0x6c, 0x02, 0xb6, + 0x4b, 0x7f, 0x48, 0x6e, 0xd6, 0xfe, 0x09, 0xb4, 0x53, 0x6e, 0x1c, 0x82, + 0xdc, 0x68, 0x6f, 0xcf, 0xa3, 0x8d, 0xeb, 0xdf, 0x8e, 0x75, 0xc1, 0x6b, + 0x8a, 0x36, 0x82, 0x33, 0x21, 0x5e, 0xfb, 0x99, 0xef, 0x45, 0x79, 0x29, + 0x45, 0x97, 0x31, 0x21, 0xd6, 0x7d, 0xc4, 0xe0, 0x7a, 0x9f, 0xc1, 0x35, + 0xf9, 0x6c, 0x9b, 0xca, 0xb7, 0xc8, 0xa7, 0xb7, 0x49, 0x31, 0x96, 0xf4, + 0x99, 0x7b, 0xc0, 0x38, 0xdc, 0x72, 0x45, 0xcb, 0xeb, 0x82, 0xe4, 0x7a, + 0x79, 0x3f, 0x30, 0x9b, 0x56, 0x31, 0xb2, 0x44, 0x28, 0x4b, 0xbb, 0x24, + 0x1d, 0x61, 0x6e, 0x70, 0x5d, 0xe5, 0x8e, 0x87, 0xf0, 0xc3, 0x39, 0x3b, + 0x96, 0xb8, 0x1e, 0xeb, 0x7c, 0xad, 0xa3, 0xc6, 0xc1, 0xb3, 0xb6, 0xea, + 0x93, 0xc8, 0xa7, 0xfb, 0xcd, 0x7b, 0x5c, 0x96, 0x2a, 0x1f, 0x1b, 0xb0, + 0xb3, 0x3f, 0xbf, 0x3d, 0x9f, 0xe9, 0xe5, 0x3d, 0x0f, 0xea, 0xc8, 0x17, + 0x3f, 0x06, 0x5f, 0x84, 0x8d, 0x1f, 0xe0, 0x00, 0x46, 0xee, 0xf3, 0xbf, + 0x82, 0xa6, 0xdb, 0xf7, 0xdc, 0x61, 0xf6, 0xcc, 0xfd, 0xf2, 0xbc, 0x39, + 0x3e, 0xd0, 0x57, 0x3c, 0xf3, 0x88, 0xf1, 0x1d, 0x92, 0x6e, 0xcd, 0xfe, + 0xbd, 0x9d, 0x41, 0x5e, 0x79, 0xcd, 0x86, 0x9c, 0x59, 0x80, 0xcc, 0x59, + 0x80, 0xac, 0x81, 0xcd, 0xf0, 0x1a, 0xe4, 0xe0, 0xab, 0xf0, 0x9f, 0x5e, + 0x59, 0x08, 0xec, 0xee, 0x31, 0xc8, 0xba, 0xc0, 0x27, 0x64, 0x7e, 0x4f, + 0xe7, 0x87, 0xce, 0xef, 0x09, 0x65, 0x83, 0x71, 0x9d, 0x52, 0x52, 0x63, + 0x12, 0x32, 0xdd, 0xb8, 0x59, 0x5f, 0x9d, 0x4f, 0xb9, 0xb5, 0x37, 0xcd, + 0x53, 0x79, 0x15, 0x1b, 0xa0, 0x2c, 0xbd, 0x15, 0xbd, 0xb7, 0xe6, 0x27, + 0x12, 0x9f, 0x2a, 0x8f, 0x07, 0xfe, 0x4b, 0x44, 0xae, 0x2d, 0xd2, 0x8e, + 0x2b, 0xcb, 0xcc, 0xd8, 0xac, 0x94, 0xc7, 0x20, 0x5f, 0x46, 0x81, 0x8f, + 0x51, 0xe6, 0xa6, 0x7f, 0x0c, 0xba, 0x71, 0x46, 0x78, 0xef, 0x55, 0x7e, + 0xee, 0x00, 0x70, 0xe0, 0x9a, 0x1c, 0x8a, 0x1f, 0x4e, 0xe4, 0xab, 0x62, + 0x5d, 0xaa, 0x30, 0x9e, 0x78, 0x65, 0xe2, 0xca, 0x22, 0xf9, 0x78, 0x9f, + 0x2c, 0x8d, 0x3d, 0x28, 0xf5, 0xeb, 0xc6, 0xe3, 0xcc, 0x57, 0xbb, 0xe5, + 0xf4, 0x2a, 0xef, 0x25, 0x3b, 0x65, 0x12, 0x7a, 0xe9, 0xaa, 0xca, 0x4d, + 0xe9, 0x93, 0xba, 0xa2, 0x1f, 0xca, 0xfe, 0x1d, 0xb2, 0xae, 0x9e, 0x59, + 0x1f, 0x46, 0x7d, 0x72, 0xe4, 0x2a, 0xc6, 0xbd, 0x55, 0xa1, 0x2e, 0xd8, + 0x26, 0x25, 0xb3, 0xa6, 0x8e, 0xcd, 0x51, 0x77, 0x30, 0xc6, 0xc3, 0x98, + 0xcf, 0xd7, 0xbb, 0x29, 0xaf, 0x5e, 0x5f, 0x98, 0x32, 0x72, 0x8d, 0xcf, + 0xc0, 0xa5, 0xc9, 0xa7, 0x2c, 0xc7, 0xfc, 0x66, 0xd9, 0x73, 0xac, 0x8d, + 0xcd, 0xdc, 0xb3, 0x3f, 0x37, 0xfd, 0xf5, 0x3d, 0x4e, 0x9e, 0x39, 0x6c, + 0xee, 0xa0, 0xca, 0xa9, 0x79, 0x7d, 0x61, 0xe7, 0x36, 0x3d, 0xce, 0x31, + 0xdf, 0x36, 0xb0, 0xee, 0xb1, 0x6e, 0x5d, 0xc7, 0xbb, 0xef, 0x5d, 0x2a, + 0x8e, 0x78, 0x15, 0xbe, 0xe6, 0x5b, 0xd5, 0xb8, 0x8a, 0x41, 0x96, 0x62, + 0xfd, 0x28, 0xbf, 0x83, 0x3e, 0x11, 0xe0, 0x84, 0x31, 0x9d, 0x8f, 0xa8, + 0x7d, 0x85, 0x3c, 0xed, 0x8b, 0xe6, 0x33, 0xd4, 0xb1, 0x3f, 0x50, 0xed, + 0x2f, 0x2e, 0xa2, 0xfd, 0x28, 0x4b, 0xea, 0xdf, 0xf7, 0xe0, 0x1b, 0x85, + 0xa5, 0x50, 0xf5, 0x60, 0x33, 0x87, 0x49, 0xa3, 0xa8, 0xbf, 0x53, 0x2e, + 0x54, 0x05, 0x3c, 0xd3, 0x01, 0xbd, 0xa7, 0xf6, 0x0b, 0x0a, 0xa2, 0x0f, + 0xce, 0xf5, 0x5d, 0x13, 0xc3, 0x8d, 0xab, 0x9c, 0xed, 0x53, 0x2a, 0x2f, + 0xf8, 0x1e, 0xf0, 0x45, 0x06, 0xbc, 0xb0, 0x86, 0x9d, 0xfc, 0x42, 0xd9, + 0xfb, 0xeb, 0xa2, 0xfd, 0xaa, 0x99, 0x06, 0xfc, 0x81, 0x8a, 0x8e, 0x0b, + 0x6d, 0xdd, 0x71, 0x7c, 0xd0, 0xfd, 0x46, 0x44, 0xd6, 0xd3, 0x1d, 0xc6, + 0x5f, 0x8e, 0x38, 0xca, 0x06, 0x6e, 0x74, 0xa3, 0xfc, 0x1f, 0x80, 0xdd, + 0x63, 0x1e, 0xb5, 0x53, 0x40, 0xdd, 0x52, 0x83, 0xf7, 0x1c, 0x7c, 0x4f, + 0x48, 0x28, 0xab, 0x63, 0x4b, 0x8c, 0x27, 0x39, 0x59, 0xc6, 0xb1, 0xc8, + 0xe7, 0x98, 0x0b, 0x67, 0x77, 0x7a, 0x21, 0xa7, 0xe2, 0x4b, 0xe5, 0xc6, + 0x3d, 0xb2, 0xb1, 0x38, 0x22, 0xeb, 0x8b, 0xa3, 0x72, 0x69, 0xf1, 0x5e, + 0xb9, 0xbc, 0x48, 0xbd, 0xc5, 0x7b, 0x93, 0x66, 0x73, 0x3a, 0x8d, 0xfa, + 0x65, 0x5b, 0x4e, 0xc5, 0xd0, 0x67, 0xf9, 0x1e, 0x59, 0xdb, 0xf4, 0xcd, + 0x07, 0x28, 0xb7, 0x40, 0x9f, 0x0e, 0xfc, 0x32, 0x57, 0x66, 0x89, 0x9b, + 0x55, 0xfa, 0x3e, 0x51, 0xf0, 0x2d, 0xdb, 0xfa, 0xe0, 0xff, 0xde, 0x0b, + 0x9f, 0x99, 0xb9, 0xe2, 0x21, 0xc8, 0x66, 0x07, 0xb6, 0x1d, 0x6c, 0x30, + 0x8f, 0x31, 0x62, 0x5b, 0xd9, 0x4b, 0x33, 0x0d, 0xe6, 0x52, 0xfc, 0xb8, + 0x7b, 0xeb, 0xdb, 0x13, 0x57, 0xf9, 0x58, 0xcc, 0x23, 0x2a, 0x2d, 0xde, + 0x21, 0x53, 0x6a, 0xac, 0xdc, 0x66, 0xcb, 0x90, 0x89, 0xd9, 0x70, 0xed, + 0x1a, 0xf6, 0xc2, 0xbe, 0x0e, 0xde, 0x21, 0xef, 0xd0, 0xaf, 0xb4, 0x28, + 0x72, 0xbc, 0xd2, 0x2f, 0xd3, 0xcb, 0x29, 0x05, 0x33, 0xe3, 0x56, 0x07, + 0x15, 0x2f, 0x82, 0xb6, 0xc7, 0x08, 0x8b, 0xe3, 0x77, 0x66, 0xef, 0x90, + 0xd3, 0xe8, 0x77, 0x0a, 0x78, 0xbb, 0xb6, 0xd8, 0x0f, 0xbf, 0xbc, 0x43, + 0xde, 0x5a, 0x4c, 0xb9, 0x1b, 0x9b, 0xfd, 0xd9, 0xf7, 0x57, 0x38, 0x97, + 0x7e, 0x99, 0xb9, 0x6e, 0x8f, 0x7a, 0x9d, 0x3c, 0xd6, 0x99, 0x51, 0xe3, + 0x39, 0x56, 0xc7, 0xc1, 0xb6, 0xc6, 0x6d, 0x07, 0xbf, 0x11, 0xdf, 0xc9, + 0xf4, 0xa4, 0x70, 0xad, 0x0f, 0xb3, 0x86, 0xa6, 0x0f, 0xde, 0xcb, 0x94, + 0x32, 0x94, 0xc1, 0xf0, 0x63, 0x57, 0x79, 0xf7, 0x07, 0xbc, 0x55, 0x5a, + 0xef, 0x65, 0xd4, 0xbd, 0xbf, 0xca, 0xaf, 0xa1, 0x4c, 0x64, 0x3e, 0x5e, + 0xb9, 0x42, 0x39, 0x3d, 0x64, 0x72, 0xb0, 0x3f, 0x28, 0xd6, 0xc6, 0xb9, + 0x1d, 0xf1, 0x1b, 0x9a, 0x26, 0xcb, 0xab, 0xc4, 0x79, 0x6b, 0x4e, 0x22, + 0xef, 0x88, 0x1c, 0xd9, 0x00, 0xad, 0x5c, 0xe6, 0xfa, 0xe0, 0xb7, 0x2a, + 0xe4, 0xf9, 0x25, 0x85, 0x7f, 0xd0, 0x1c, 0xec, 0xfa, 0x59, 0x94, 0x2f, + 0x7a, 0xe8, 0xd3, 0xe0, 0x78, 0xb4, 0x2d, 0x7b, 0xf2, 0xbd, 0x46, 0x87, + 0xbc, 0xe0, 0x30, 0x2f, 0x36, 0x2c, 0xd7, 0x9c, 0x3b, 0x40, 0x37, 0x09, + 0x75, 0x07, 0x90, 0x47, 0xdf, 0xf5, 0x06, 0xdf, 0x47, 0x40, 0x4f, 0x96, + 0x38, 0xf7, 0xd2, 0xfe, 0xa7, 0x7c, 0xf1, 0xcc, 0xb7, 0x05, 0x6c, 0xd3, + 0x79, 0xd2, 0x5b, 0xfd, 0xf6, 0x24, 0x5c, 0x09, 0xfa, 0x51, 0xef, 0x74, + 0x9a, 0x9c, 0x1d, 0xf4, 0xe1, 0x9d, 0x19, 0xec, 0x26, 0x9b, 0xeb, 0x57, + 0x76, 0xa8, 0xf8, 0xce, 0xa9, 0x85, 0x13, 0xea, 0xdb, 0x99, 0x5e, 0x95, + 0xeb, 0x32, 0x22, 0x85, 0x45, 0x7e, 0xd7, 0x14, 0xc4, 0x2f, 0x03, 0x5a, + 0x82, 0x30, 0xee, 0x67, 0xdf, 0xad, 0xbc, 0xa3, 0x53, 0x0b, 0xbb, 0xc0, + 0x87, 0x03, 0xb2, 0xac, 0xee, 0x1e, 0x18, 0xc3, 0xb4, 0x65, 0x3a, 0x86, + 0xba, 0xe5, 0x5d, 0x52, 0x5b, 0x86, 0x22, 0xed, 0x23, 0x9e, 0x99, 0xbf, + 0x76, 0x07, 0xec, 0xde, 0x76, 0xba, 0x23, 0xcd, 0xfd, 0xe7, 0xed, 0x94, + 0x0f, 0xb5, 0x86, 0xa6, 0x85, 0xa5, 0x45, 0xca, 0x00, 0xe6, 0xae, 0x6d, + 0xd1, 0x42, 0x31, 0xa0, 0x05, 0xe8, 0xa4, 0x84, 0x7d, 0x3d, 0x2d, 0xd4, + 0xdb, 0x68, 0xa1, 0xd8, 0x42, 0x0b, 0x4b, 0xcb, 0xec, 0x7f, 0xb3, 0x1c, + 0xce, 0x80, 0x0e, 0x3d, 0x95, 0x77, 0x16, 0xca, 0xfe, 0x75, 0xf0, 0x9e, + 0x30, 0x39, 0xf9, 0x30, 0xe8, 0xae, 0xcb, 0xcd, 0xd7, 0xb2, 0x7c, 0x36, + 0x4d, 0xdd, 0xca, 0xbb, 0x9c, 0x4e, 0xf1, 0x5d, 0xed, 0x4b, 0x95, 0xd3, + 0xe4, 0xcb, 0x7c, 0x82, 0x77, 0x20, 0xc7, 0xe5, 0x3d, 0xec, 0x37, 0x37, + 0x12, 0x96, 0xe0, 0xbb, 0x20, 0xe6, 0xbd, 0x37, 0x9b, 0x57, 0x78, 0xf7, + 0x0b, 0xbc, 0x9c, 0x57, 0xf7, 0x97, 0xe0, 0xf7, 0xa8, 0x03, 0x1a, 0xd9, + 0xca, 0xc7, 0xaf, 0xa1, 0xcf, 0x12, 0xda, 0x4e, 0x6f, 0xc2, 0x46, 0xdd, + 0x00, 0xfb, 0xd1, 0xfb, 0x75, 0xb3, 0x14, 0xbb, 0xae, 0xaf, 0x91, 0xbd, + 0x8c, 0x21, 0x32, 0x7e, 0xec, 0x4a, 0x61, 0xb9, 0x0f, 0x3f, 0xc8, 0x7f, + 0xc5, 0x7f, 0x8c, 0x29, 0x12, 0xc7, 0xef, 0x17, 0x77, 0xed, 0x96, 0x87, + 0x2a, 0x3e, 0x7c, 0x4f, 0xbf, 0xd9, 0xe5, 0xf5, 0xc0, 0x96, 0xa7, 0xff, + 0x9a, 0xf4, 0x61, 0xd4, 0xf8, 0xd1, 0xac, 0x97, 0x78, 0x58, 0x68, 0xdb, + 0x37, 0xe5, 0x95, 0x34, 0xe3, 0xb1, 0x77, 0xcb, 0x55, 0x37, 0xf9, 0x35, + 0x6e, 0xd2, 0x1e, 0x1e, 0x95, 0xe2, 0x8a, 0x37, 0xf2, 0xb0, 0x28, 0x5b, + 0x3d, 0x71, 0x98, 0xe7, 0xb6, 0x99, 0x37, 0xec, 0x18, 0x3a, 0x1a, 0x95, + 0x83, 0x2b, 0x6f, 0xaa, 0x18, 0xf8, 0x63, 0xe9, 0xd6, 0xdc, 0x35, 0x95, + 0x43, 0x35, 0xda, 0x2b, 0xfc, 0x96, 0x4b, 0xa0, 0x41, 0xc0, 0x1f, 0x19, + 0xe6, 0x49, 0x31, 0xc7, 0x59, 0x95, 0x72, 0x52, 0xe5, 0x47, 0x39, 0x32, + 0xa9, 0x72, 0x15, 0x23, 0xf2, 0x54, 0x83, 0x38, 0xed, 0x56, 0xb9, 0x53, + 0xaf, 0x01, 0xb7, 0xd3, 0x0d, 0x9d, 0x33, 0x39, 0xd9, 0xd0, 0xdf, 0x7f, + 0x4d, 0x36, 0x18, 0xc7, 0x65, 0x3c, 0xf7, 0xfd, 0x72, 0xab, 0xb6, 0x72, + 0x8b, 0x18, 0xd7, 0x5c, 0x87, 0x0e, 0x2e, 0x54, 0x5d, 0x75, 0x6f, 0x57, + 0x82, 0x5d, 0x7d, 0x7c, 0xa4, 0x13, 0x67, 0xde, 0xa7, 0x78, 0xca, 0xf6, + 0x7e, 0x0f, 0x7e, 0x21, 0xfd, 0x33, 0xea, 0xde, 0xe0, 0x9c, 0xf7, 0xa3, + 0xee, 0x5d, 0x9c, 0x3d, 0xeb, 0xe0, 0x33, 0x2a, 0x9b, 0xf1, 0x8b, 0xe0, + 0x2d, 0xe6, 0x1f, 0xd7, 0x76, 0xe4, 0x15, 0x3e, 0x18, 0x73, 0x09, 0xf2, + 0x85, 0x83, 0x5c, 0x32, 0xfa, 0xbc, 0xae, 0xb9, 0x6f, 0x66, 0xcc, 0xa5, + 0x4f, 0x4a, 0xcb, 0x94, 0xcd, 0x9a, 0x7f, 0xaf, 0x86, 0xee, 0x10, 0xbf, + 0x76, 0xb3, 0xbb, 0xf3, 0x66, 0xf3, 0xd5, 0xb4, 0xf2, 0x45, 0xcf, 0xf8, + 0x06, 0xc7, 0xe3, 0x19, 0xfa, 0xbc, 0x8e, 0x39, 0xe3, 0x6e, 0x93, 0x2f, + 0x00, 0xdf, 0xa1, 0x2f, 0xca, 0x7c, 0x50, 0x13, 0x3f, 0xa3, 0xdf, 0xfa, + 0x9e, 0xb1, 0x43, 0xe9, 0xb3, 0xf6, 0x29, 0x9f, 0xc2, 0xae, 0x07, 0x74, + 0xc2, 0x5c, 0x69, 0xfa, 0xb3, 0xbb, 0x25, 0x57, 0x0b, 0x49, 0xae, 0x9f, + 0xef, 0xbe, 0x19, 0xcb, 0xe7, 0xa6, 0x1c, 0xda, 0xd7, 0x7e, 0x27, 0x3e, + 0xa6, 0xfd, 0xe4, 0x68, 0x70, 0x2f, 0xde, 0x9e, 0x7f, 0xac, 0xe0, 0x04, + 0xcd, 0x04, 0x30, 0xe8, 0xb5, 0x0e, 0x02, 0xde, 0x3a, 0x6c, 0x87, 0x3e, + 0x8f, 0xf9, 0x33, 0x21, 0xd9, 0xd7, 0x97, 0x84, 0xc1, 0xa3, 0xe1, 0xa9, + 0xd7, 0x60, 0xf7, 0x54, 0x03, 0x38, 0xb5, 0x7f, 0x5d, 0xaf, 0x25, 0x55, + 0xce, 0x58, 0x18, 0xb6, 0xc5, 0xbe, 0x7e, 0x9e, 0x73, 0x3b, 0x1c, 0x9f, + 0x0a, 0xdd, 0xfc, 0x3b, 0xae, 0xfb, 0x5b, 0xe0, 0x7b, 0xc7, 0xf8, 0xcc, + 0x84, 0x2b, 0x66, 0xee, 0xee, 0x61, 0xcf, 0x2c, 0xd2, 0xd7, 0x27, 0x8c, + 0x7d, 0x90, 0x85, 0xd8, 0xa3, 0x3a, 0xdb, 0x56, 0xfe, 0x09, 0x62, 0x04, + 0x61, 0x45, 0x17, 0x53, 0x19, 0xee, 0x25, 0x6c, 0x62, 0x06, 0x84, 0x2b, + 0x69, 0xf2, 0x03, 0x09, 0xdf, 0x6f, 0x0c, 0xfe, 0x87, 0xcc, 0x7e, 0x83, + 0x9c, 0x42, 0xce, 0x75, 0x27, 0xc6, 0xff, 0x69, 0x13, 0x6b, 0xd1, 0xb8, + 0x03, 0xff, 0x07, 0xdf, 0xa8, 0xdc, 0xa9, 0xe7, 0x52, 0xf6, 0x4d, 0xfb, + 0x77, 0xab, 0xe4, 0xaf, 0xe0, 0x0c, 0x39, 0x47, 0x9f, 0xb9, 0x0f, 0x20, + 0x0c, 0x5d, 0x6d, 0x30, 0x24, 0xd3, 0xd7, 0xcb, 0xb8, 0xfd, 0x2d, 0x7b, + 0x27, 0xad, 0xf5, 0xc8, 0x4c, 0x35, 0x2a, 0xe5, 0xea, 0x36, 0xc6, 0x44, + 0x46, 0x44, 0x68, 0x7f, 0x8d, 0x9b, 0xbc, 0x72, 0x11, 0x9d, 0xf3, 0x1d, + 0xf0, 0x67, 0x0f, 0xfa, 0x51, 0x8e, 0xa3, 0xac, 0x69, 0xf9, 0x54, 0x93, + 0x1b, 0xf3, 0x0b, 0xa7, 0x37, 0xf3, 0x0b, 0x75, 0xae, 0x50, 0x69, 0x33, + 0xd7, 0x83, 0xf9, 0x6a, 0xdc, 0xc3, 0x80, 0xc9, 0x53, 0xf3, 0xe5, 0xd1, + 0x03, 0x5d, 0xf0, 0x29, 0xa2, 0x86, 0x46, 0x1f, 0x30, 0xeb, 0x60, 0xbd, + 0xf9, 0x31, 0x19, 0x9c, 0xf7, 0x61, 0xdb, 0xaa, 0x9c, 0x64, 0xf4, 0x09, + 0x64, 0xc5, 0x10, 0xfb, 0x98, 0x58, 0x09, 0xfb, 0x01, 0x5f, 0x07, 0x92, + 0x23, 0x09, 0x7b, 0x00, 0xb2, 0xec, 0x18, 0xfc, 0xea, 0x31, 0x61, 0x1e, + 0x76, 0x3e, 0xcd, 0x1b, 0x75, 0xda, 0x7b, 0x03, 0x92, 0xba, 0xa8, 0xe7, + 0xf3, 0xe6, 0xd9, 0x9e, 0x82, 0x4d, 0xc9, 0xf6, 0x42, 0x5c, 0x7f, 0x09, + 0x76, 0x0f, 0xe8, 0xa9, 0xc3, 0xc4, 0x91, 0x1c, 0xc9, 0xcf, 0x73, 0x3c, + 0xe3, 0x8a, 0xff, 0x70, 0x87, 0x44, 0x0b, 0x09, 0x5b, 0x38, 0x46, 0xcd, + 0x87, 0xe7, 0xe0, 0xae, 0x87, 0x67, 0x3d, 0x2a, 0xcb, 0xb0, 0x19, 0x72, + 0x35, 0x9d, 0xc7, 0x5e, 0xaa, 0x05, 0x79, 0x97, 0x8f, 0x6d, 0x7e, 0x9b, + 0x46, 0x18, 0x75, 0x7e, 0xd1, 0xfb, 0x9d, 0x0f, 0xcf, 0xe6, 0xfb, 0x3b, + 0x74, 0x6e, 0x79, 0x97, 0xba, 0x4f, 0x6d, 0x91, 0x87, 0x66, 0xfc, 0xea, + 0x0e, 0xde, 0xbf, 0x8b, 0x74, 0x29, 0x7f, 0x33, 0x64, 0xfc, 0xcd, 0x42, + 0x2c, 0xa6, 0xf8, 0x62, 0xb0, 0x1e, 0xf4, 0x5b, 0x37, 0xf3, 0xf0, 0xdc, + 0xb2, 0x66, 0x0f, 0x69, 0xf8, 0xb4, 0xac, 0xdb, 0x8d, 0xb1, 0xc4, 0x1b, + 0xca, 0x3a, 0x9f, 0xb1, 0xcf, 0xd1, 0x7e, 0xea, 0x7b, 0xdf, 0xcd, 0x76, + 0xa9, 0x77, 0x3d, 0x6f, 0x57, 0xcb, 0xba, 0xed, 0x3c, 0xc3, 0x58, 0xda, + 0x9c, 0xa1, 0x1b, 0xb6, 0x3f, 0xa7, 0xf2, 0x5e, 0x5f, 0xbf, 0x21, 0x97, + 0x53, 0xb7, 0x3b, 0xf3, 0x01, 0xbf, 0xf0, 0x4c, 0x79, 0x07, 0x8c, 0xf2, + 0x62, 0x16, 0xb0, 0xf1, 0x19, 0xa5, 0xc9, 0xfb, 0x77, 0xe6, 0xf9, 0x6b, + 0x9f, 0xc7, 0xc1, 0xdc, 0x01, 0xef, 0xde, 0x2c, 0xd7, 0x86, 0x32, 0xf9, + 0x8c, 0xb5, 0x5e, 0x61, 0x8e, 0x83, 0x2f, 0xc7, 0x33, 0x3d, 0x32, 0x55, + 0xb5, 0xe1, 0x23, 0xab, 0x58, 0x3b, 0xef, 0xab, 0x61, 0x63, 0x10, 0x57, + 0xc3, 0xc6, 0xef, 0xee, 0x82, 0x7f, 0x4e, 0xba, 0x1e, 0x96, 0xe5, 0x1a, + 0xe9, 0x28, 0xa0, 0xeb, 0x0e, 0x43, 0x6f, 0x73, 0x61, 0x89, 0xfa, 0xf0, + 0xd5, 0x02, 0xde, 0x1e, 0x96, 0x62, 0xad, 0xf5, 0x2e, 0x8c, 0x79, 0x3b, + 0xad, 0xdf, 0x78, 0xaa, 0xef, 0x4a, 0xaa, 0x3e, 0xe8, 0xe6, 0x6a, 0x8c, + 0xb1, 0x09, 0xf6, 0xdb, 0x6e, 0xf4, 0x2e, 0xf4, 0x7d, 0x14, 0x82, 0xdc, + 0x23, 0x6c, 0xd0, 0x15, 0x6a, 0x9d, 0x94, 0x1c, 0x8a, 0x81, 0x96, 0x31, + 0xaf, 0x5e, 0xf7, 0x2e, 0xbc, 0xb3, 0xef, 0x0e, 0xd3, 0x7e, 0xa7, 0x79, + 0x8f, 0x9a, 0xf7, 0x10, 0xde, 0x5f, 0x6a, 0x56, 0x17, 0x38, 0x27, 0x4b, + 0x7e, 0xeb, 0xc1, 0xbb, 0xaa, 0xac, 0x84, 0x2f, 0x42, 0x7a, 0x34, 0xa2, + 0xf2, 0x78, 0x4d, 0x9d, 0xaf, 0xe5, 0xcd, 0xd3, 0x30, 0x18, 0x37, 0xcf, + 0x37, 0xd2, 0xda, 0x17, 0xae, 0xa3, 0xb5, 0x41, 0x57, 0xd3, 0x48, 0x2b, + 0xbc, 0xf7, 0x01, 0xd6, 0xf7, 0xcb, 0x69, 0xa2, 0xae, 0xd2, 0x3e, 0x34, + 0xe8, 0x58, 0xe5, 0xee, 0x1c, 0xaf, 0x00, 0xd6, 0xea, 0x3b, 0x3b, 0x74, + 0x5e, 0x49, 0x90, 0x6b, 0x18, 0xc5, 0xbe, 0x86, 0x4d, 0xee, 0x02, 0xc7, + 0x32, 0xe7, 0x31, 0xb8, 0x43, 0x6c, 0xb5, 0x79, 0xa9, 0x93, 0xa8, 0x6f, + 0xd2, 0xc0, 0x41, 0x1a, 0x7d, 0x4f, 0x51, 0xe6, 0x40, 0x5f, 0x05, 0xf9, + 0xd3, 0xe5, 0x1b, 0xbe, 0x33, 0x3f, 0x0d, 0x58, 0x7f, 0xd4, 0x60, 0x7c, + 0xb7, 0x4b, 0x42, 0x67, 0x83, 0x9c, 0x26, 0xe2, 0x98, 0xf6, 0x98, 0x03, + 0x7b, 0xf6, 0x93, 0x6d, 0xb1, 0x5f, 0xb5, 0x29, 0x7e, 0x3b, 0x27, 0x53, + 0x95, 0x49, 0x97, 0xb9, 0x9f, 0x6e, 0x36, 0x88, 0x17, 0xf3, 0x7b, 0x24, + 0xda, 0x5e, 0xbb, 0x45, 0x7f, 0xa7, 0xc5, 0x36, 0x5f, 0x7a, 0x0f, 0x7c, + 0x92, 0x39, 0xb2, 0xbb, 0x42, 0x0a, 0x7e, 0xf5, 0x7d, 0x2c, 0xe4, 0x46, + 0x04, 0xb6, 0x77, 0x1a, 0x32, 0x43, 0xc3, 0x76, 0xa9, 0x91, 0x91, 0xa1, + 0x79, 0xe6, 0xce, 0x6f, 0x5b, 0xa3, 0xae, 0xb8, 0xdc, 0x60, 0x1f, 0xf2, + 0x1a, 0x64, 0x2c, 0x64, 0xf6, 0x7a, 0x23, 0xab, 0xf2, 0x45, 0xd6, 0xcd, + 0x37, 0xaf, 0x1b, 0x0d, 0x47, 0x6c, 0x95, 0x8f, 0xce, 0x1c, 0x4c, 0xda, + 0x6c, 0x09, 0xb4, 0x33, 0x27, 0x6d, 0x40, 0xe5, 0x99, 0x94, 0x1b, 0x9f, + 0x46, 0xf9, 0x45, 0xf8, 0xa7, 0x3a, 0xce, 0x5e, 0x6e, 0x30, 0xdf, 0xc4, + 0x55, 0xf7, 0x98, 0x83, 0xf3, 0x45, 0xf0, 0x6f, 0xf0, 0x9d, 0x6e, 0x0c, + 0x75, 0x84, 0xcf, 0x6f, 0xb3, 0x95, 0x98, 0xa7, 0xbe, 0xac, 0xf0, 0x49, + 0xf8, 0x98, 0xa7, 0xa2, 0x6d, 0x13, 0xda, 0x7d, 0x11, 0xf4, 0xe7, 0x7e, + 0xa3, 0xd4, 0x5d, 0x4d, 0xca, 0xa7, 0x14, 0xd6, 0xaa, 0xab, 0x7c, 0x3f, + 0xc6, 0x26, 0x3c, 0xd8, 0xce, 0xcc, 0x97, 0xa1, 0x5c, 0xe1, 0x37, 0x95, + 0x05, 0x37, 0xcc, 0xfb, 0xf2, 0x06, 0xe7, 0xe2, 0x7e, 0xb8, 0xcf, 0xee, + 0x35, 0xe6, 0xc9, 0x97, 0xd4, 0x3d, 0xba, 0xde, 0x53, 0xa1, 0x11, 0x51, + 0xdf, 0x32, 0x94, 0xf8, 0xcd, 0x97, 0xfa, 0x96, 0xc1, 0x87, 0xde, 0x53, + 0xdf, 0x49, 0xa9, 0x6f, 0x19, 0x6a, 0x8d, 0xc3, 0xe6, 0x7b, 0x06, 0xd2, + 0x51, 0x04, 0xf2, 0xb1, 0x1b, 0x75, 0x2e, 0x7e, 0x61, 0xf0, 0x27, 0x73, + 0xef, 0xb7, 0xc3, 0x5e, 0xe3, 0x39, 0xab, 0x6f, 0x86, 0xf9, 0x6d, 0x31, + 0x68, 0x8d, 0xdf, 0x30, 0xd0, 0x26, 0xe3, 0x77, 0xc2, 0xb4, 0xc7, 0x34, + 0xcf, 0xdf, 0x68, 0x93, 0x93, 0x0e, 0xbf, 0x04, 0xb8, 0x82, 0xdc, 0x46, + 0xe6, 0x60, 0x36, 0x9b, 0xc7, 0xd3, 0xbc, 0x63, 0x1d, 0x3f, 0xb4, 0x84, + 0x3d, 0x5e, 0xaa, 0xe1, 0x1c, 0x8f, 0xb2, 0x8e, 0xb9, 0x58, 0x9d, 0x90, + 0x71, 0x2a, 0xee, 0x17, 0x5d, 0xf2, 0xb6, 0xcb, 0x46, 0x35, 0xa6, 0xf2, + 0xca, 0x4a, 0xe0, 0xcf, 0x3a, 0xac, 0x52, 0xc6, 0xcd, 0x0f, 0xaa, 0xf1, + 0x01, 0xcf, 0x73, 0x9d, 0x98, 0x1c, 0x5c, 0xd6, 0x32, 0xe5, 0x44, 0x06, + 0x36, 0xcc, 0x8a, 0x58, 0x9f, 0xcd, 0x0c, 0xc8, 0xb5, 0x0a, 0xd7, 0x4a, + 0x61, 0x1c, 0xe8, 0x27, 0x4e, 0x7e, 0x7f, 0xb7, 0x59, 0x07, 0xbc, 0xd7, + 0x1a, 0xb4, 0xdd, 0x61, 0x4f, 0x8d, 0x73, 0x4c, 0x56, 0xec, 0x39, 0xf6, + 0xe9, 0x03, 0x0d, 0x86, 0xb1, 0x1f, 0x07, 0x7e, 0x01, 0x63, 0xb6, 0x6c, + 0xe3, 0xf3, 0x2e, 0x13, 0xcf, 0xe1, 0xf9, 0xff, 0x44, 0xe5, 0x99, 0x52, + 0x2e, 0x05, 0xf7, 0xf2, 0xcc, 0x11, 0x9d, 0xaa, 0x1e, 0x01, 0x1f, 0x39, + 0xc6, 0x4e, 0x73, 0x30, 0xc7, 0x0f, 0x5c, 0x6d, 0x37, 0xf0, 0xde, 0x5e, + 0xdb, 0x25, 0x5a, 0xdf, 0xf0, 0x0e, 0x2f, 0x0a, 0xbf, 0x60, 0x93, 0x37, + 0x6f, 0xa1, 0x63, 0x5a, 0xe3, 0x5a, 0xa9, 0xf8, 0x05, 0xc6, 0x81, 0xc0, + 0x8b, 0x93, 0xd8, 0xcb, 0x19, 0xb3, 0xff, 0x87, 0x32, 0x9e, 0x5c, 0xad, + 0xf1, 0xbe, 0x7d, 0x37, 0x4a, 0xe6, 0x15, 0x72, 0x2f, 0x7f, 0x60, 0x72, + 0x27, 0xb3, 0x38, 0x83, 0x63, 0xf0, 0xa3, 0x46, 0xe5, 0xed, 0x4a, 0x2a, + 0x7d, 0x50, 0xc5, 0xa5, 0x93, 0xf1, 0x0d, 0xd9, 0x93, 0x98, 0x01, 0x0f, + 0xfa, 0x6e, 0x32, 0x7e, 0x15, 0xb6, 0xfb, 0xb5, 0xca, 0xfd, 0xbd, 0xfc, + 0xff, 0x26, 0xea, 0xd0, 0x99, 0xd7, 0x54, 0x1e, 0x0b, 0x63, 0xec, 0x7c, + 0x1f, 0x30, 0xb9, 0x34, 0xcc, 0x49, 0x3e, 0x06, 0xfb, 0x7e, 0x40, 0xf4, + 0x77, 0x5b, 0x4a, 0x47, 0xa3, 0x7d, 0x8f, 0xe2, 0x65, 0xad, 0x83, 0xb9, + 0xf6, 0x91, 0x5e, 0xf2, 0x6d, 0x47, 0xf6, 0x98, 0xc9, 0x87, 0x09, 0xfa, + 0xe9, 0x1c, 0x83, 0x0d, 0xe8, 0xdf, 0xef, 0x01, 0x2f, 0x65, 0xd0, 0xd7, + 0x64, 0x6d, 0x4c, 0xfe, 0x42, 0x7d, 0x23, 0x43, 0x78, 0x41, 0xd3, 0x71, + 0x8d, 0x1b, 0x95, 0xdf, 0xbd, 0x37, 0xa2, 0xce, 0x97, 0xb8, 0xb9, 0x56, + 0xb9, 0x1e, 0x37, 0xeb, 0xf0, 0xd9, 0xea, 0xae, 0xab, 0x7c, 0x86, 0x52, + 0xe5, 0xef, 0x00, 0x37, 0x41, 0xdc, 0x2e, 0xc0, 0x4d, 0xf4, 0x26, 0xb8, + 0x09, 0xb7, 0xe0, 0x86, 0xfd, 0x89, 0x1f, 0xda, 0x67, 0x37, 0xc3, 0xcf, + 0xfb, 0xe1, 0xe6, 0x5f, 0xf4, 0x6a, 0x9c, 0x0e, 0x28, 0x98, 0x0e, 0xa9, + 0xbd, 0xf3, 0xce, 0x79, 0x00, 0xfb, 0x08, 0xce, 0x8d, 0xf9, 0x3f, 0xf4, + 0xc7, 0xd9, 0x9f, 0x75, 0x03, 0x2a, 0xd6, 0x97, 0x4f, 0x6b, 0x7b, 0xe6, + 0x2d, 0x15, 0xb7, 0xe4, 0xbe, 0x69, 0x73, 0x80, 0xe6, 0x6b, 0x77, 0xa9, + 0x6f, 0xb6, 0x5f, 0x5f, 0xf8, 0xb0, 0xf4, 0xf0, 0x4a, 0xaf, 0x8e, 0xf3, + 0xc1, 0x9f, 0xd9, 0xeb, 0x9a, 0xb1, 0x81, 0x0d, 0x3e, 0x00, 0x99, 0x74, + 0x0c, 0xfe, 0x78, 0x2a, 0xfe, 0xb8, 0x04, 0x6b, 0x36, 0x1f, 0xe4, 0x1d, + 0x5e, 0x31, 0xb3, 0xc7, 0x9d, 0x51, 0xb0, 0xf2, 0x9e, 0x39, 0x09, 0x9f, + 0x9a, 0xff, 0xa7, 0x46, 0x6b, 0xec, 0x8d, 0xf4, 0x95, 0xcc, 0xad, 0x49, + 0x2a, 0xad, 0x69, 0x6c, 0x58, 0xd6, 0x40, 0x63, 0x7f, 0x62, 0x68, 0xec, + 0x61, 0xcc, 0xed, 0xcd, 0x8d, 0x4a, 0x6a, 0x2e, 0x95, 0x38, 0x23, 0xbc, + 0x0f, 0xdf, 0xc1, 0xfb, 0x70, 0xeb, 0x21, 0xf8, 0xcc, 0xd7, 0x2a, 0xcc, + 0xb1, 0x44, 0xd9, 0xe0, 0x33, 0xfd, 0xf4, 0x6d, 0x94, 0x5d, 0x0f, 0x32, + 0x36, 0xcc, 0x73, 0x2a, 0xaa, 0x36, 0xd8, 0x62, 0xcf, 0x13, 0xa6, 0x1f, + 0x91, 0xce, 0x54, 0x1c, 0xf8, 0x6a, 0x23, 0x99, 0x38, 0x6d, 0xe0, 0x2b, + 0x00, 0xbe, 0x69, 0x0d, 0x5f, 0x62, 0x72, 0xd3, 0x4e, 0x4f, 0xc6, 0x4f, + 0x09, 0x65, 0x17, 0x6d, 0x35, 0xfa, 0x30, 0xa9, 0x3e, 0xd2, 0x56, 0x88, + 0x31, 0xbf, 0xbd, 0x05, 0x43, 0x1f, 0xa4, 0x2b, 0x5f, 0x2e, 0x65, 0x54, + 0x4e, 0xb4, 0x7b, 0x58, 0x1e, 0x90, 0xdc, 0xa7, 0x7d, 0x79, 0x1c, 0x3c, + 0xa1, 0xed, 0x5d, 0x94, 0x35, 0x3e, 0x53, 0xaf, 0x78, 0x26, 0xff, 0x89, + 0x78, 0x3b, 0xa1, 0xe2, 0x24, 0xfc, 0x3f, 0x06, 0xd6, 0xb1, 0xb7, 0xbc, + 0xa2, 0xb1, 0x29, 0xd0, 0xa0, 0xb6, 0x7b, 0x36, 0x2a, 0xa4, 0xdf, 0x14, + 0xfd, 0xe1, 0x36, 0x7b, 0x33, 0xbc, 0x69, 0x6f, 0xae, 0xab, 0xf5, 0x3a, + 0x00, 0x53, 0xc1, 0xa5, 0xad, 0xb9, 0x45, 0xef, 0xfa, 0x0e, 0xaf, 0xdc, + 0xf0, 0xe5, 0x72, 0x86, 0xf8, 0x80, 0xbd, 0x89, 0xf9, 0x96, 0xb6, 0xf8, + 0x01, 0xfb, 0x57, 0x7c, 0x08, 0x1e, 0x4c, 0xba, 0x8e, 0x35, 0xa0, 0x64, + 0xf0, 0x3a, 0xf4, 0xf4, 0x15, 0xc0, 0xb2, 0xae, 0x68, 0x44, 0xd3, 0xc7, + 0x7a, 0xed, 0x81, 0x5b, 0xd0, 0xc7, 0x63, 0x7d, 0x81, 0x9c, 0x79, 0x1c, + 0x72, 0xef, 0x72, 0x43, 0xac, 0xe9, 0x4c, 0x20, 0x03, 0xb6, 0x78, 0xaa, + 0x0c, 0x9e, 0xca, 0xef, 0x8d, 0x6e, 0xca, 0xbb, 0x75, 0xd5, 0x1e, 0x93, + 0xc2, 0xa6, 0xbc, 0x0b, 0xf2, 0x4e, 0x0f, 0x62, 0xbe, 0xa0, 0xee, 0xae, + 0xff, 0x8b, 0xbc, 0xd5, 0x4e, 0xe7, 0xed, 0xb4, 0x19, 0xf1, 0xa3, 0x59, + 0x2d, 0xfb, 0x1e, 0xde, 0x0f, 0x7d, 0x3d, 0x47, 0x5a, 0xd5, 0xb2, 0xfd, + 0x90, 0x7c, 0x43, 0xc9, 0xf6, 0x9f, 0xa5, 0x41, 0x8f, 0xfb, 0xb9, 0x0e, + 0x69, 0xb8, 0x1b, 0xb2, 0x70, 0x3b, 0x7e, 0x31, 0x19, 0x3c, 0xef, 0x81, + 0x96, 0xa1, 0x9f, 0xd3, 0xf0, 0x27, 0x40, 0xc3, 0x83, 0x73, 0xc4, 0x2b, + 0x69, 0x60, 0x87, 0xc1, 0xe5, 0x8d, 0x34, 0x5c, 0x68, 0xa3, 0xe1, 0xc2, + 0x75, 0x34, 0x5c, 0xee, 0x63, 0x4e, 0x6f, 0x49, 0xd3, 0x30, 0x79, 0x4d, + 0xd1, 0xf0, 0x21, 0xd0, 0xf0, 0x86, 0xe1, 0xb1, 0xb5, 0x16, 0x1a, 0x3e, + 0x7e, 0x1d, 0x0d, 0xbf, 0x61, 0x68, 0x38, 0xb7, 0x29, 0xdf, 0x00, 0x0f, + 0xe8, 0xe8, 0x6f, 0x29, 0xba, 0xfd, 0x2c, 0xe8, 0x76, 0xf0, 0x59, 0x4d, + 0xb7, 0x83, 0x2f, 0xf0, 0xb9, 0x9d, 0x6e, 0xff, 0xa5, 0xa1, 0xdb, 0x01, + 0x23, 0x17, 0xcf, 0x6d, 0xd2, 0x6c, 0x61, 0x8e, 0xf0, 0xbd, 0x1f, 0xcd, + 0xf2, 0xfe, 0x10, 0x76, 0xbc, 0x5a, 0xeb, 0xb5, 0x4d, 0x9a, 0xd5, 0xfb, + 0xf9, 0x6b, 0xd1, 0x6c, 0x9c, 0x34, 0x1b, 0xfa, 0x40, 0x9a, 0xfd, 0xfc, + 0x2d, 0x68, 0xf6, 0xd7, 0x9b, 0x34, 0xfb, 0xd9, 0x0c, 0x65, 0xa1, 0x58, + 0x8f, 0x73, 0x8e, 0x36, 0x9a, 0x5d, 0x6f, 0xd3, 0xd1, 0x7a, 0xbf, 0x8f, + 0xb6, 0xd0, 0xec, 0x03, 0x2d, 0x3a, 0xfa, 0xa8, 0xd4, 0x8f, 0xb6, 0xd3, + 0x6a, 0xc7, 0x4d, 0x68, 0x35, 0x07, 0x8b, 0x29, 0xc8, 0xa7, 0xfb, 0x6d, + 0x69, 0x73, 0x6c, 0xa7, 0x96, 0xc1, 0xb4, 0x5f, 0x76, 0x4b, 0xe2, 0x85, + 0xa8, 0x5c, 0x8b, 0x69, 0xfb, 0xaa, 0xb0, 0x9f, 0x79, 0xb6, 0x1d, 0xb0, + 0x5f, 0xc2, 0x06, 0x6e, 0xbe, 0x13, 0x9f, 0xcc, 0xbb, 0xd5, 0xf6, 0xc9, + 0xad, 0xf7, 0x1c, 0x6d, 0xdb, 0x73, 0xac, 0xc5, 0x2e, 0x09, 0xf8, 0xf4, + 0x77, 0x76, 0x6e, 0xf1, 0xe9, 0x6d, 0x7f, 0x03, 0x7c, 0xda, 0xca, 0x7f, + 0x11, 0x7f, 0x5b, 0x76, 0x2b, 0xd6, 0xa2, 0xe3, 0x2c, 0xbe, 0x7c, 0x6e, + 0x7f, 0x54, 0x8a, 0x55, 0xb1, 0x9e, 0xd8, 0x0f, 0xdb, 0xab, 0x32, 0x26, + 0x87, 0xe7, 0x60, 0xab, 0x3e, 0xab, 0x79, 0x32, 0x6c, 0xbd, 0x26, 0xb9, + 0x81, 0xa6, 0x7c, 0x16, 0x38, 0xb8, 0x36, 0xfa, 0x8a, 0xb9, 0x5b, 0x53, + 0xdf, 0x07, 0xa4, 0xaf, 0xc1, 0x16, 0x5b, 0x27, 0x5e, 0x8f, 0xa6, 0xd2, + 0x2f, 0x81, 0x4f, 0xd7, 0xd3, 0x2f, 0x80, 0xa6, 0xd3, 0x28, 0x97, 0x0c, + 0x6d, 0xbf, 0xbb, 0x53, 0xd3, 0xc7, 0x16, 0xdf, 0x16, 0xc0, 0xb7, 0xf9, + 0x9b, 0xf0, 0x2d, 0xe4, 0x80, 0xe2, 0x5b, 0x7e, 0x07, 0x31, 0x38, 0x77, + 0x3d, 0xdf, 0x0e, 0xce, 0x69, 0xbe, 0x1d, 0x5c, 0x39, 0x26, 0x79, 0x45, + 0xe7, 0x27, 0x77, 0x06, 0x7c, 0x9b, 0x58, 0xf9, 0xeb, 0xf2, 0xed, 0x77, + 0x77, 0xb6, 0xf3, 0x6d, 0x3e, 0xe0, 0xdb, 0xb8, 0xe6, 0xdb, 0xbc, 0xe1, + 0xdb, 0xfc, 0x0b, 0x7c, 0x6e, 0xe7, 0xdb, 0x93, 0x9b, 0x7c, 0x3b, 0xa8, + 0x6c, 0xcd, 0x27, 0x37, 0xf9, 0x76, 0x6a, 0x8e, 0xf0, 0xbd, 0x3f, 0xdf, + 0xc2, 0xcb, 0x96, 0x92, 0x5a, 0xeb, 0x85, 0x9d, 0x01, 0xdf, 0xe6, 0xff, + 0x46, 0xf8, 0xf6, 0xa1, 0x5b, 0xf0, 0xed, 0x7f, 0xdb, 0xf9, 0xe1, 0xf9, + 0xf6, 0x46, 0x1a, 0xbe, 0x51, 0xd7, 0x5c, 0x6d, 0xa1, 0xe1, 0x91, 0xff, + 0x87, 0xba, 0xe6, 0xdd, 0x9d, 0x81, 0x4d, 0xf5, 0x3a, 0x73, 0x70, 0xad, + 0x3b, 0x7b, 0xf5, 0x9c, 0x7c, 0xfe, 0x4c, 0xdf, 0x8d, 0xf7, 0x94, 0x9a, + 0xd7, 0xa7, 0x33, 0x21, 0x15, 0x3f, 0x2a, 0xd7, 0x08, 0xbf, 0xf9, 0x3f, + 0x7d, 0x1a, 0xcc, 0xb9, 0xf4, 0x65, 0x09, 0xb6, 0x78, 0x09, 0xbc, 0x71, + 0x3e, 0x53, 0x90, 0x0e, 0x4f, 0xc7, 0x6f, 0x4a, 0xa0, 0xa3, 0xa9, 0x2a, + 0xf7, 0x77, 0x58, 0x7d, 0x4f, 0x34, 0x05, 0x7f, 0xb0, 0x14, 0xe3, 0x3d, + 0xfd, 0xcd, 0xf2, 0x81, 0xb6, 0xfe, 0x2f, 0x0a, 0x3b, 0x1b, 0x8e, 0xf1, + 0xff, 0xf6, 0x28, 0x56, 0x82, 0x18, 0x16, 0x6d, 0x67, 0xfe, 0x7f, 0x49, + 0xc1, 0xdd, 0x9f, 0x5e, 0x5b, 0xc7, 0xea, 0x82, 0xef, 0x98, 0x02, 0xdf, + 0x9d, 0x76, 0x21, 0x7d, 0x2e, 0xf1, 0x23, 0xd9, 0x9c, 0xd5, 0x05, 0x1e, + 0xdd, 0xa8, 0x66, 0x41, 0x23, 0x63, 0xf0, 0x29, 0x3f, 0x2e, 0xe5, 0x18, + 0x79, 0xf4, 0x4b, 0x62, 0x3f, 0xbf, 0x5b, 0x96, 0xaa, 0x5d, 0x32, 0x19, + 0xa3, 0x6f, 0x15, 0x56, 0xf1, 0xea, 0x6b, 0x47, 0x19, 0x63, 0xa4, 0x3f, + 0xa6, 0xe5, 0xd7, 0x7a, 0x2d, 0x17, 0xd3, 0xdf, 0x67, 0x6e, 0x97, 0xb5, + 0x9a, 0xce, 0x49, 0x2f, 0x33, 0xde, 0x5a, 0x0d, 0x1b, 0xff, 0x36, 0x0a, + 0xdc, 0xfc, 0x34, 0x5c, 0x57, 0xb1, 0x6f, 0xee, 0xbf, 0xd3, 0xc8, 0x41, + 0x89, 0xd6, 0x3d, 0xee, 0xbd, 0xd5, 0x8f, 0xd3, 0xfe, 0xbb, 0x7b, 0x80, + 0xeb, 0x51, 0x37, 0x71, 0x8f, 0x31, 0x09, 0x5f, 0x38, 0x26, 0xf6, 0xb9, + 0x31, 0x09, 0xcd, 0x33, 0x66, 0x72, 0x7d, 0x2c, 0x30, 0x74, 0xf1, 0xa0, + 0xf9, 0x3f, 0x19, 0x86, 0x74, 0x4c, 0x20, 0x83, 0xb2, 0x1e, 0xfc, 0x3f, + 0x0d, 0xb9, 0x9b, 0xc6, 0x50, 0xa6, 0x6f, 0xf9, 0x7f, 0x7e, 0xf0, 0xce, + 0xe5, 0xff, 0x00, 0xee, 0x85, 0x48, 0xd0, 0xc8, 0x51, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_COM_b09FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_COM_b09FwRodata[(0x38/4) + 1] = { + 0x80080100, 0x80080080, 0x80080000, 0x00000c80, 0x00003200, 0x80080240, + 0x08000edc, 0x08000f34, 0x08000f78, 0x08001010, 0x08001050, 0x80080100, + 0x80080080, 0x80080000, 0x00000000 }; + +static struct fw_info bnx2_com_fw_09 = { + /* Firmware version: 5.0.0j13 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000110, + + .text_addr = 0x08000000, + .text_len = 0x51c4, + .text_index = 0x0, + .gz_text = bnx2_COM_b09FwText, + .gz_text_len = sizeof(bnx2_COM_b09FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_COM_b09FwData, + + .sbss_addr = 0x08005220, + .sbss_len = 0x28, + .sbss_index = 0x0, + + .bss_addr = 0x08005248, + .bss_len = 0x10c, + .bss_index = 0x0, + + .rodata_addr = 0x080051c4, + .rodata_len = 0x38, + .rodata_index = 0x0, + .rodata = bnx2_COM_b09FwRodata, +}; + +static u8 bnx2_CP_b09FwText[] = { + 0xa5, 0x7c, 0x0b, 0x74, 0x5b, 0xe5, 0x95, 0xee, 0x77, 0x8e, 0x64, 0x5b, + 0xb6, 0x65, 0xfb, 0xd8, 0x51, 0x8c, 0x02, 0x2e, 0x91, 0xe2, 0xa3, 0xc4, + 0xc4, 0x0e, 0x1c, 0x39, 0x4a, 0x10, 0x1d, 0x41, 0x54, 0xc7, 0x09, 0xa6, + 0xa4, 0xe0, 0x84, 0xc0, 0x35, 0x53, 0xd6, 0xa0, 0x9b, 0x84, 0x12, 0x28, + 0xcc, 0x04, 0x2e, 0x6b, 0xc6, 0xb0, 0xd2, 0xeb, 0x53, 0x3f, 0x62, 0x43, + 0x64, 0x49, 0x36, 0xce, 0x6b, 0xdd, 0x99, 0x41, 0x71, 0x1c, 0x3b, 0x50, + 0x49, 0x0e, 0xb4, 0x33, 0x37, 0x5d, 0xab, 0xbd, 0x68, 0xf2, 0x80, 0x84, + 0xf2, 0x6a, 0xa7, 0x33, 0x43, 0x7b, 0xe7, 0xde, 0x7a, 0x12, 0x02, 0x94, + 0x57, 0x53, 0xda, 0xe9, 0x84, 0x76, 0xd2, 0x73, 0xbf, 0x7d, 0x64, 0x25, + 0x86, 0xbe, 0x66, 0xd6, 0xf5, 0x5a, 0x67, 0x49, 0x3a, 0xe7, 0x7f, 0xec, + 0x7f, 0xff, 0x7b, 0x7f, 0xfb, 0xdb, 0xff, 0xff, 0x1f, 0x2f, 0x02, 0x2a, + 0x30, 0xfb, 0x57, 0xc5, 0xeb, 0xea, 0x15, 0xdb, 0x36, 0xdf, 0x6f, 0x5c, + 0x6d, 0x00, 0xcb, 0x83, 0x4e, 0xa0, 0x04, 0xbf, 0xed, 0x2f, 0x82, 0xf0, + 0xa7, 0x6f, 0xf9, 0x7e, 0x6b, 0xc1, 0xdf, 0xf1, 0x17, 0x86, 0x5f, 0xe1, + 0x47, 0xf3, 0xa7, 0x6e, 0x3b, 0x00, 0xad, 0x28, 0x87, 0x5c, 0x70, 0xa9, + 0x11, 0x7d, 0x63, 0x9b, 0x0e, 0x97, 0x23, 0xb2, 0xee, 0x8e, 0xcd, 0x3a, + 0x10, 0xcd, 0x34, 0xfb, 0x56, 0xe3, 0x82, 0x65, 0x7a, 0x9c, 0x90, 0xfb, + 0x9f, 0x89, 0xfc, 0xfb, 0x53, 0xdf, 0xbe, 0xd6, 0x7f, 0x2e, 0xed, 0x80, + 0x4b, 0x8b, 0x0c, 0x41, 0x5b, 0x0c, 0x57, 0x03, 0xeb, 0xfc, 0xe5, 0x92, + 0x21, 0x15, 0xd5, 0xc5, 0xb6, 0xfc, 0xde, 0x34, 0xfc, 0x9a, 0x09, 0x7f, + 0x93, 0x09, 0xc4, 0x9c, 0x11, 0xc4, 0xca, 0x22, 0x2e, 0x94, 0xea, 0xa5, + 0x88, 0x69, 0xdd, 0xbe, 0xfe, 0x10, 0xd0, 0x16, 0x77, 0xf9, 0x4e, 0x67, + 0x80, 0xcd, 0x71, 0x17, 0x66, 0x1c, 0x6e, 0xdf, 0x99, 0xcc, 0xd2, 0xea, + 0x82, 0x5e, 0xa2, 0x70, 0xe8, 0x88, 0xa9, 0x11, 0xb9, 0x0f, 0xdf, 0xea, + 0x8c, 0xd4, 0x05, 0x76, 0x24, 0x1f, 0xf1, 0x9d, 0x8d, 0xfb, 0xb5, 0x1d, + 0x68, 0xf6, 0x8e, 0xa3, 0x0c, 0x31, 0x8f, 0xbf, 0x09, 0xd8, 0x7b, 0xe1, + 0x89, 0xa4, 0x82, 0x12, 0x7d, 0x1e, 0xda, 0xf7, 0x03, 0x8f, 0x27, 0xfd, + 0x51, 0x9d, 0xc3, 0x1c, 0x9a, 0x96, 0xba, 0x7e, 0x2d, 0xcd, 0xe7, 0xfd, + 0x49, 0x60, 0x20, 0x39, 0x0f, 0x3b, 0x52, 0x16, 0x8e, 0x19, 0x8d, 0xda, + 0x01, 0xf6, 0xd0, 0x6b, 0x3f, 0x9f, 0x07, 0x33, 0x2d, 0xcf, 0xdf, 0xb1, + 0xbe, 0xbd, 0x44, 0xc3, 0xe1, 0x69, 0x0f, 0x9e, 0x9f, 0xae, 0xc5, 0xe3, + 0xa9, 0x5a, 0x0c, 0xa6, 0x9a, 0xa0, 0xea, 0x16, 0x9a, 0x82, 0x4d, 0x28, + 0xbd, 0xce, 0xc2, 0x19, 0xa3, 0x05, 0x03, 0x6c, 0xf8, 0xf5, 0x96, 0x7a, + 0x6c, 0xd2, 0x1a, 0xd0, 0xaf, 0x5f, 0x87, 0xc2, 0x58, 0xf7, 0x5e, 0x48, + 0x26, 0x11, 0x2b, 0x89, 0x38, 0x55, 0x55, 0xbf, 0x01, 0x1f, 0xee, 0x8a, + 0xe0, 0x83, 0x5d, 0xb8, 0xab, 0x1a, 0x96, 0x95, 0x09, 0x06, 0x3a, 0x1f, + 0x50, 0x34, 0xdf, 0x33, 0x19, 0x0a, 0xb4, 0xc1, 0xc9, 0xf6, 0xe0, 0x1b, + 0xcf, 0xcc, 0xd5, 0x3d, 0xfb, 0x4b, 0xb2, 0xdf, 0xa4, 0xc8, 0xe2, 0xc5, + 0xb7, 0x97, 0x3c, 0x44, 0xbb, 0x28, 0x8c, 0x69, 0x20, 0xf9, 0x06, 0x65, + 0xf2, 0x51, 0x9e, 0x06, 0x7c, 0x7d, 0xda, 0x8b, 0xe7, 0x28, 0xdb, 0xb3, + 0xd3, 0x22, 0xa3, 0x7f, 0xaf, 0x89, 0x5a, 0x4c, 0xa4, 0x1a, 0x70, 0x58, + 0x6f, 0xc1, 0xb3, 0x94, 0xb1, 0xcf, 0x68, 0xc2, 0xa6, 0xf0, 0x17, 0x29, + 0x8f, 0x82, 0x0d, 0x2d, 0x9b, 0x67, 0xe5, 0xf2, 0xfb, 0xa0, 0xaa, 0x88, + 0xd6, 0xf9, 0x9b, 0x7c, 0xaa, 0xb4, 0x79, 0x49, 0xde, 0xe1, 0x24, 0x4c, + 0x57, 0x44, 0x64, 0xbe, 0x01, 0x19, 0xca, 0xfb, 0xb5, 0x5d, 0x01, 0x63, + 0xab, 0x8a, 0x75, 0x6e, 0xca, 0x7c, 0x7f, 0x30, 0x10, 0x5e, 0x4a, 0x99, + 0xa7, 0x32, 0x2a, 0xc7, 0xe3, 0xf1, 0x4d, 0x52, 0xf6, 0xe8, 0x06, 0x95, + 0xb2, 0x53, 0x96, 0x24, 0x65, 0x49, 0x52, 0x96, 0x24, 0x65, 0xb1, 0xe5, + 0x6e, 0xa2, 0xcc, 0x85, 0x39, 0x1a, 0xcf, 0xcc, 0x50, 0xde, 0xb9, 0x72, + 0x36, 0x50, 0x76, 0xc4, 0x6a, 0x23, 0x8f, 0xf8, 0x1a, 0x13, 0xd4, 0x77, + 0xd2, 0xb2, 0x5e, 0x37, 0x2c, 0xeb, 0x23, 0xc3, 0x4d, 0xfd, 0x25, 0x69, + 0x07, 0x45, 0x79, 0x16, 0x9a, 0xa5, 0x11, 0xb4, 0xd3, 0x04, 0xad, 0x13, + 0xa1, 0x40, 0xb8, 0x4e, 0x51, 0xe1, 0xd4, 0x35, 0xdf, 0x92, 0x9c, 0x9f, + 0xde, 0xe0, 0xf1, 0x05, 0x72, 0xf0, 0xe9, 0x39, 0xb6, 0xf5, 0x89, 0x7e, + 0xfd, 0x5a, 0x1e, 0xd2, 0xaf, 0x8f, 0xfd, 0xcf, 0xcc, 0xce, 0x9d, 0xb4, + 0xef, 0x65, 0x9f, 0xd2, 0xbf, 0xb4, 0x6d, 0x59, 0x3f, 0x35, 0xa0, 0x6b, + 0x08, 0x98, 0x23, 0xb4, 0x3f, 0x47, 0x44, 0xf3, 0x6d, 0xcb, 0xf0, 0xf9, + 0xc5, 0x36, 0x0a, 0xf3, 0xb1, 0x29, 0xe3, 0x9b, 0x1d, 0x83, 0x9f, 0x22, + 0x88, 0x1d, 0x78, 0x63, 0x95, 0x11, 0x4d, 0x64, 0xef, 0xfc, 0xb3, 0xe1, + 0x1e, 0xcb, 0xab, 0x3f, 0x64, 0xba, 0x43, 0xfa, 0xb6, 0xf3, 0x8a, 0x3b, + 0xfc, 0xca, 0x8a, 0x20, 0x2a, 0x74, 0x98, 0xe5, 0x11, 0x74, 0x3e, 0x98, + 0xad, 0xa0, 0x0e, 0xbf, 0x75, 0xdb, 0x03, 0x59, 0x17, 0x96, 0x66, 0xff, + 0x87, 0x13, 0xd5, 0x2d, 0xb4, 0xb9, 0x3b, 0x9d, 0x85, 0x31, 0x75, 0xcc, + 0x8e, 0xcd, 0xb6, 0x79, 0xd7, 0xd9, 0xf8, 0x39, 0xab, 0x54, 0x2f, 0xff, + 0x2f, 0x8e, 0x88, 0xee, 0x9b, 0x04, 0xce, 0x6d, 0x0a, 0x75, 0xa2, 0x57, + 0x53, 0xb0, 0x40, 0x0f, 0xc1, 0x9c, 0xfe, 0x56, 0x65, 0xa1, 0x6c, 0x7d, + 0x8c, 0x7a, 0xc0, 0xf1, 0xb8, 0x87, 0x75, 0xd2, 0x38, 0x1b, 0xb7, 0x2c, + 0x96, 0xd7, 0xfa, 0x70, 0xdb, 0x6d, 0x0b, 0x23, 0x47, 0x17, 0x96, 0xe0, + 0x7a, 0xdc, 0xad, 0x61, 0xfb, 0x89, 0xd0, 0x47, 0xca, 0xf8, 0xd8, 0x3a, + 0x98, 0x53, 0x0e, 0x44, 0xb5, 0xbb, 0xf8, 0x79, 0xe5, 0x95, 0x37, 0x87, + 0xd7, 0x61, 0xe7, 0xd4, 0x79, 0xde, 0x77, 0xf2, 0x5e, 0x08, 0xc3, 0xc9, + 0x2b, 0xaf, 0x5c, 0x17, 0xbe, 0x0b, 0xf1, 0x29, 0xf9, 0xee, 0x44, 0xba, + 0xf6, 0x2e, 0xf4, 0xef, 0xf1, 0xa1, 0x5a, 0x5f, 0x87, 0xc4, 0x94, 0x7c, + 0xff, 0x2a, 0x92, 0x2d, 0x0a, 0x66, 0xd6, 0x9b, 0xd4, 0xf5, 0x3a, 0x0c, + 0xec, 0x51, 0x9c, 0x47, 0xf8, 0x1b, 0xb7, 0xc1, 0x59, 0x62, 0xfb, 0x5d, + 0xd8, 0xb9, 0x3a, 0x1e, 0xd1, 0x16, 0xe8, 0x96, 0xd5, 0x63, 0x38, 0xf0, + 0xf1, 0x3c, 0xcb, 0x1a, 0x34, 0x6a, 0x30, 0xd3, 0xd9, 0xc9, 0x79, 0xfb, + 0x13, 0x98, 0x07, 0xfe, 0x04, 0x43, 0x4f, 0x52, 0x5d, 0xeb, 0xd9, 0xd6, + 0x94, 0xc8, 0x70, 0x17, 0xdb, 0xa0, 0xce, 0x92, 0x22, 0xd7, 0x46, 0x5e, + 0x0f, 0xf3, 0x82, 0x4b, 0x89, 0x98, 0x08, 0x64, 0x8a, 0xb6, 0xfd, 0x27, + 0xd8, 0x61, 0xd7, 0xfb, 0xb9, 0x85, 0xdb, 0x0b, 0x75, 0xfa, 0xa7, 0xd8, + 0xf7, 0x94, 0xd4, 0x93, 0xfa, 0xbf, 0xab, 0x9e, 0xd9, 0xe9, 0x80, 0xbf, + 0x63, 0xad, 0xe2, 0x44, 0xd3, 0x30, 0xa8, 0xa3, 0x1a, 0x45, 0x7c, 0xa4, + 0x54, 0x71, 0xf0, 0x33, 0x84, 0x7d, 0x9c, 0xf7, 0x3e, 0xfa, 0xe6, 0x10, + 0x6d, 0x71, 0x30, 0x19, 0xf5, 0x13, 0xcd, 0xcc, 0x92, 0x48, 0x27, 0xd4, + 0x48, 0xa0, 0xa3, 0x17, 0x52, 0x1e, 0x4a, 0x45, 0x04, 0xce, 0x4c, 0x68, + 0xc6, 0xf5, 0x4a, 0x5c, 0xef, 0x7a, 0x46, 0x29, 0xa1, 0x51, 0x8a, 0xbe, + 0x67, 0x5c, 0xaf, 0xc5, 0x15, 0xbc, 0xad, 0x07, 0xb6, 0xbd, 0xab, 0xcc, + 0xb8, 0x5e, 0xcd, 0x68, 0x58, 0x30, 0xec, 0xef, 0x32, 0x95, 0x30, 0xbe, + 0x99, 0xf1, 0xc0, 0x3b, 0x1c, 0xc1, 0x91, 0x8c, 0x81, 0xa7, 0x3f, 0xe1, + 0xaf, 0xbf, 0xf5, 0xcf, 0x74, 0x70, 0xde, 0xb6, 0xc4, 0x7d, 0xe8, 0x35, + 0x2e, 0x58, 0x51, 0x0d, 0xb1, 0x9a, 0xc8, 0x8c, 0xeb, 0x83, 0x61, 0x28, + 0xd5, 0x11, 0xdd, 0x9b, 0x53, 0xfe, 0xc5, 0x8a, 0x79, 0xa4, 0x18, 0xe5, + 0xb3, 0x31, 0x27, 0x8c, 0x9d, 0xd3, 0xc4, 0x92, 0xe4, 0x39, 0xab, 0x92, + 0xb6, 0x54, 0x1a, 0xb9, 0x1c, 0x53, 0x63, 0x3a, 0x9e, 0xe6, 0x7c, 0xbf, + 0x6f, 0xe4, 0xc3, 0x6e, 0xe8, 0x9d, 0xef, 0xc1, 0x1f, 0x5d, 0xaa, 0x44, + 0x70, 0x32, 0xa3, 0x63, 0x22, 0x1e, 0xc1, 0xb1, 0x78, 0x23, 0xed, 0x60, + 0x39, 0xa2, 0x5e, 0x69, 0xc7, 0x87, 0x2c, 0xe5, 0x1e, 0x0f, 0x74, 0xa2, + 0x26, 0x12, 0xc6, 0x51, 0xca, 0xfd, 0xe1, 0x0a, 0x69, 0xc7, 0xc0, 0xab, + 0xff, 0x01, 0x59, 0x89, 0xc3, 0xd8, 0x47, 0x59, 0xc3, 0xcb, 0x2f, 0x58, + 0x98, 0xe7, 0xc2, 0x69, 0xe3, 0x32, 0xda, 0x8c, 0xd8, 0xb4, 0xcb, 0x39, + 0x14, 0xd7, 0x70, 0x28, 0xe3, 0x76, 0xf6, 0xc5, 0x3d, 0x38, 0x40, 0xbf, + 0x58, 0x10, 0x81, 0xe9, 0x65, 0xbb, 0x0b, 0x88, 0x3f, 0xb9, 0xb1, 0x06, + 0x4c, 0x8f, 0xf9, 0x8d, 0xd7, 0x14, 0x2f, 0x26, 0x27, 0x2e, 0x47, 0x76, + 0x4c, 0xc1, 0x54, 0x80, 0xb2, 0xf3, 0xfb, 0xd7, 0xc6, 0xae, 0x44, 0x66, + 0xcc, 0x81, 0x9d, 0xb6, 0x5e, 0x6d, 0x3c, 0x98, 0xfd, 0xbc, 0x1c, 0xe9, + 0x09, 0x38, 0x97, 0x0e, 0x6b, 0x78, 0x26, 0xe3, 0x74, 0xea, 0xc3, 0x1e, + 0x4c, 0x64, 0x9e, 0xe1, 0xbc, 0x49, 0xdb, 0x3e, 0x8c, 0xc7, 0x47, 0xf9, + 0x5d, 0xc6, 0x61, 0x2a, 0x05, 0xdc, 0x2f, 0xe0, 0xf0, 0xf3, 0xd3, 0xc7, + 0x95, 0x82, 0x4f, 0xb4, 0x10, 0xcf, 0xc5, 0x3e, 0x44, 0xc7, 0x15, 0xf0, + 0x1d, 0xac, 0x40, 0xd3, 0x2e, 0x27, 0x96, 0xec, 0x12, 0xbb, 0xb0, 0xac, + 0x92, 0x60, 0x0d, 0xde, 0x32, 0x30, 0xbf, 0x14, 0x01, 0xdf, 0xb8, 0xdd, + 0x9f, 0x89, 0x2d, 0x19, 0xb8, 0x4a, 0xd8, 0xf6, 0xc1, 0xb8, 0x13, 0x7d, + 0x9f, 0xc0, 0x75, 0x0d, 0x07, 0x34, 0x3f, 0x43, 0x91, 0x42, 0x9b, 0x77, + 0x1a, 0x4e, 0x55, 0x7c, 0x51, 0xd7, 0x8e, 0xa1, 0x14, 0xed, 0x9d, 0x0a, + 0x63, 0x98, 0xe9, 0xd5, 0xf0, 0x97, 0x17, 0x06, 0x97, 0x54, 0xc0, 0xf4, + 0xf8, 0xbd, 0xf7, 0x42, 0xee, 0xa9, 0x28, 0xbf, 0xfa, 0x67, 0x96, 0xef, + 0x76, 0x69, 0xcb, 0x89, 0x81, 0xe9, 0x4f, 0xe3, 0x35, 0xb0, 0x35, 0x2e, + 0xf6, 0xa6, 0x53, 0x6f, 0x2f, 0x28, 0x82, 0xbf, 0x12, 0x0b, 0x0b, 0xfd, + 0xbf, 0xc7, 0x31, 0x49, 0x7d, 0x89, 0x4d, 0x4e, 0xef, 0x00, 0x15, 0xe2, + 0xe4, 0xfd, 0xfe, 0xf8, 0x49, 0xca, 0x14, 0xa2, 0x3c, 0xe2, 0xdb, 0x06, + 0xfe, 0x17, 0x6d, 0xe1, 0x7f, 0x4e, 0x37, 0xe1, 0x6f, 0xa7, 0x75, 0xfc, + 0xcd, 0xb4, 0x0f, 0xdf, 0xf8, 0x04, 0xde, 0xaf, 0xe7, 0xdc, 0x88, 0xfc, + 0x2d, 0xe8, 0x4f, 0x96, 0x62, 0x70, 0xac, 0x02, 0x43, 0x63, 0x8d, 0xc6, + 0x3b, 0xc4, 0xe9, 0x7f, 0x30, 0x6e, 0x46, 0xba, 0x2e, 0x64, 0xe3, 0xe2, + 0x4e, 0xde, 0x8f, 0x8f, 0x35, 0x32, 0xd6, 0x58, 0x56, 0x5b, 0xb0, 0xb9, + 0x63, 0x9c, 0xb8, 0xef, 0x9b, 0xef, 0xf7, 0xa5, 0x55, 0xbf, 0x2f, 0x4a, + 0x32, 0x91, 0x6c, 0x51, 0x31, 0x33, 0x5f, 0xe2, 0x86, 0x13, 0xf3, 0xf4, + 0xdb, 0x28, 0xa7, 0xdf, 0x17, 0x53, 0x5b, 0xe8, 0x2f, 0xfe, 0x54, 0x4c, + 0x35, 0x88, 0x41, 0x15, 0xf8, 0xf9, 0x98, 0xdf, 0x8c, 0xa9, 0xb7, 0x20, + 0x56, 0x67, 0x59, 0x23, 0xad, 0xd8, 0x56, 0x1f, 0x41, 0xd4, 0x13, 0x81, + 0xef, 0x4a, 0xc6, 0x89, 0xcb, 0x68, 0x67, 0xfb, 0x18, 0x43, 0xc3, 0x49, + 0xdd, 0x5b, 0xef, 0xb8, 0x15, 0x8f, 0x68, 0xcd, 0xe7, 0xfb, 0xd4, 0x95, + 0x98, 0xb9, 0x4c, 0xe6, 0xe8, 0x46, 0xfc, 0x77, 0xcd, 0x60, 0x6c, 0xfe, + 0x2c, 0xf2, 0x1e, 0x85, 0x71, 0xbb, 0x51, 0x73, 0xb0, 0xdf, 0x46, 0xd5, + 0xb2, 0x3a, 0x8d, 0x9f, 0x5a, 0xa8, 0x67, 0x7b, 0x86, 0xf4, 0xe5, 0x43, + 0x2d, 0xed, 0x49, 0xa3, 0x3d, 0xd5, 0xe6, 0x2a, 0xf0, 0xde, 0x18, 0xcc, + 0xcb, 0x22, 0xfe, 0xce, 0x9b, 0xd5, 0x0a, 0xbc, 0x3b, 0x51, 0x81, 0x1f, + 0x13, 0xbb, 0xde, 0x19, 0xb3, 0xac, 0x46, 0xce, 0x69, 0x69, 0x10, 0xcb, + 0x38, 0xa7, 0xe7, 0xee, 0x81, 0x89, 0x5f, 0xb3, 0xec, 0xcf, 0xc6, 0xbc, + 0xf8, 0xc5, 0xd8, 0x4a, 0xfc, 0x7d, 0x5d, 0xd4, 0x5f, 0xc7, 0x98, 0x69, + 0xd1, 0x4e, 0x7f, 0x1e, 0xf7, 0x6f, 0x7d, 0xd3, 0xe1, 0xcf, 0x93, 0xcf, + 0x74, 0x4f, 0x28, 0xfe, 0x6d, 0x7b, 0x55, 0x7f, 0xec, 0x35, 0xc5, 0x83, + 0x0f, 0xe8, 0x0f, 0xef, 0x67, 0x1a, 0xc3, 0xcf, 0xb1, 0xff, 0x7f, 0x35, + 0x8e, 0x58, 0xe9, 0x7a, 0xd1, 0x9d, 0xe8, 0x89, 0xba, 0x4e, 0x52, 0xd7, + 0xc4, 0x89, 0xbf, 0x4d, 0x52, 0xd7, 0x94, 0xe7, 0x1b, 0xbf, 0x11, 0xcf, + 0x0a, 0xfe, 0xf9, 0xed, 0x25, 0x2f, 0x5b, 0x7f, 0xe1, 0x91, 0x31, 0xed, + 0xac, 0x12, 0x5d, 0x41, 0xf5, 0x7b, 0xa3, 0x90, 0xdf, 0xa7, 0xac, 0xbc, + 0x26, 0xe3, 0x6b, 0xdc, 0xb6, 0xad, 0xa0, 0xbf, 0xad, 0xc7, 0x94, 0x3f, + 0x57, 0x51, 0x61, 0x59, 0xcf, 0x05, 0x67, 0x9f, 0x7b, 0x8a, 0xe3, 0x8c, + 0xf2, 0xbe, 0x8c, 0xf5, 0xb8, 0xa3, 0xd0, 0xc6, 0x83, 0xfc, 0x2d, 0xed, + 0xc8, 0xf7, 0xff, 0x5d, 0xc6, 0x7b, 0x8c, 0xcb, 0xc5, 0x7b, 0xe6, 0xac, + 0xbd, 0xdf, 0xc9, 0xdf, 0x22, 0x7b, 0x21, 0xf6, 0x7f, 0xe3, 0x37, 0x62, + 0xbf, 0x4e, 0xbb, 0x79, 0xcb, 0x8e, 0xf3, 0xf3, 0x74, 0x97, 0xa9, 0x72, + 0x7e, 0x88, 0x3d, 0xc4, 0xcb, 0x6d, 0xf0, 0x65, 0x4c, 0x6c, 0x0c, 0x39, + 0xf0, 0x70, 0x48, 0xfa, 0x36, 0xad, 0x5a, 0xfd, 0x9f, 0x66, 0xdb, 0x04, + 0x4a, 0x13, 0x0a, 0x4e, 0x84, 0x15, 0x4c, 0x18, 0xbf, 0x24, 0x87, 0xb3, + 0x6f, 0x29, 0x65, 0x09, 0xb8, 0x1d, 0x7a, 0x39, 0xce, 0x68, 0x62, 0xbf, + 0x50, 0xca, 0x13, 0xa6, 0xd1, 0xb4, 0x8c, 0x98, 0x7e, 0xbb, 0x8d, 0x11, + 0x4a, 0x65, 0xe2, 0xab, 0xc1, 0xfb, 0x97, 0xb9, 0x11, 0xad, 0x2d, 0xfc, + 0xce, 0x88, 0x3f, 0xd5, 0x52, 0x76, 0xd6, 0xcd, 0xc5, 0xbf, 0x6a, 0xbd, + 0x12, 0xb0, 0x30, 0x11, 0x84, 0x52, 0x93, 0xf8, 0x15, 0xfb, 0xd1, 0x51, + 0x93, 0xfb, 0x3b, 0xca, 0x5e, 0x28, 0xfb, 0x14, 0xf1, 0xc5, 0x4b, 0xbe, + 0xf0, 0x14, 0xf1, 0x68, 0xdf, 0xa8, 0x85, 0xc6, 0xe5, 0x0b, 0xd1, 0xad, + 0x11, 0x93, 0xf5, 0x45, 0x8c, 0xfd, 0x17, 0x71, 0x48, 0xe9, 0x8b, 0x3b, + 0x50, 0xc0, 0x46, 0x0f, 0x62, 0x77, 0x20, 0x2a, 0xf7, 0x7a, 0xe3, 0x50, + 0xf6, 0xc5, 0xfd, 0x7b, 0x01, 0xfd, 0x3c, 0xad, 0xff, 0xd1, 0x85, 0xe8, + 0x21, 0x56, 0x05, 0x18, 0x7f, 0x03, 0x5b, 0xbf, 0xa7, 0x18, 0xae, 0xe1, + 0x0c, 0x94, 0x38, 0xcb, 0x3c, 0xce, 0x6b, 0x67, 0x40, 0xef, 0x7c, 0x48, + 0x89, 0x5e, 0x57, 0xc1, 0x32, 0x4d, 0xc1, 0x00, 0xfd, 0x22, 0xd0, 0xf4, + 0x3d, 0x18, 0xae, 0x81, 0x8c, 0xb4, 0x15, 0x56, 0x9c, 0xb9, 0x7d, 0xea, + 0x2c, 0xcf, 0x56, 0x06, 0xe2, 0xc3, 0xd4, 0xb9, 0xc4, 0xbb, 0x4b, 0x72, + 0xf6, 0xc7, 0xdf, 0x9d, 0x57, 0xd0, 0x51, 0xf1, 0x5e, 0xb3, 0x36, 0x01, + 0xb1, 0xe1, 0x72, 0xfa, 0x9d, 0xf0, 0x8f, 0x68, 0x53, 0x09, 0xe4, 0x9e, + 0x03, 0x69, 0x67, 0xd4, 0xeb, 0xc0, 0xbf, 0x5b, 0xd1, 0x8d, 0x72, 0xaf, + 0x02, 0xb1, 0xce, 0x66, 0xaf, 0x13, 0xcd, 0xe1, 0x01, 0xfa, 0xd4, 0xcc, + 0xc6, 0x36, 0x3e, 0x0b, 0x18, 0xc7, 0xd0, 0xe8, 0x1b, 0x80, 0x7c, 0xff, + 0x98, 0x98, 0xdf, 0x26, 0x75, 0x59, 0xa6, 0xc0, 0x2d, 0x8e, 0xd1, 0x67, + 0xfb, 0x0d, 0x0b, 0x2f, 0xd0, 0xdd, 0xca, 0x22, 0x47, 0x94, 0xd3, 0xf1, + 0x5f, 0x5b, 0x51, 0x27, 0xd6, 0xd1, 0xce, 0x0d, 0xd2, 0x4a, 0x9f, 0x2b, + 0x12, 0xf0, 0x9d, 0x24, 0x13, 0x77, 0x10, 0x0b, 0x67, 0x32, 0xfd, 0xca, + 0xd9, 0xcc, 0x90, 0xf2, 0xa6, 0x1d, 0x03, 0x8f, 0x28, 0x67, 0x32, 0x12, + 0xc7, 0x1a, 0x7c, 0x27, 0xc8, 0x23, 0xc8, 0x59, 0xd4, 0x3e, 0x03, 0xca, + 0x0e, 0xa3, 0x9a, 0x3c, 0x5a, 0x6f, 0x1a, 0xa7, 0xbc, 0x07, 0x43, 0x30, + 0x06, 0x8d, 0x12, 0xcc, 0x68, 0x70, 0xf7, 0x19, 0x4e, 0xf9, 0x4d, 0xbe, + 0x2d, 0x75, 0x1b, 0x7c, 0x03, 0x99, 0x0b, 0x56, 0x4c, 0x2b, 0xfc, 0x3e, + 0x18, 0x2a, 0xde, 0xfb, 0x99, 0x95, 0xdf, 0xa8, 0xf2, 0xf7, 0x7c, 0x07, + 0x87, 0xc2, 0xba, 0x73, 0x71, 0x52, 0x38, 0x8b, 0xca, 0x38, 0xcf, 0x89, + 0x27, 0x5e, 0xa6, 0x99, 0x36, 0xf4, 0x25, 0xdd, 0xb4, 0x61, 0x2f, 0x63, + 0x5c, 0x98, 0x3c, 0x4e, 0x6c, 0x40, 0xe1, 0x73, 0x37, 0xd6, 0xc4, 0x2f, + 0xcc, 0xf2, 0x7d, 0x95, 0xf4, 0xc5, 0xc1, 0xf9, 0x15, 0x0e, 0xf5, 0x69, + 0x8c, 0x6c, 0xf0, 0xbd, 0x43, 0xb9, 0xcb, 0x75, 0xbd, 0xa9, 0x5c, 0x69, + 0xf0, 0x9d, 0xcd, 0x84, 0xe9, 0x37, 0xad, 0xec, 0xd7, 0x4d, 0x8e, 0x53, + 0x4d, 0xae, 0xe1, 0x8f, 0x0a, 0x28, 0xaf, 0x0d, 0x79, 0x51, 0xae, 0xcf, + 0x0d, 0x55, 0x9d, 0x60, 0xdc, 0x96, 0xd8, 0xaa, 0xde, 0xb8, 0x22, 0x8c, + 0xad, 0x19, 0x38, 0xb7, 0x84, 0x22, 0xb8, 0x87, 0x31, 0xf9, 0x5e, 0xda, + 0xd5, 0x03, 0xb4, 0xb1, 0x9d, 0x41, 0x8e, 0xad, 0xd6, 0xb2, 0xca, 0xf4, + 0x1e, 0xc9, 0x17, 0x30, 0xcc, 0x18, 0xba, 0x59, 0x77, 0x92, 0x9b, 0x03, + 0xaf, 0x64, 0x7e, 0x65, 0xdd, 0xcb, 0x7c, 0xe5, 0x85, 0x4f, 0xb4, 0x09, + 0x75, 0x42, 0x6f, 0x6e, 0x1a, 0x60, 0x0c, 0x65, 0xbb, 0x66, 0x75, 0xc4, + 0xb2, 0xae, 0x0a, 0xf8, 0xa3, 0x25, 0x8a, 0x81, 0x63, 0xd9, 0x19, 0x8b, + 0x98, 0xc9, 0x5c, 0xa5, 0x18, 0xbf, 0x64, 0xac, 0xe2, 0x87, 0xe2, 0x83, + 0xc2, 0xc3, 0xe7, 0xfa, 0xa1, 0x8a, 0xb5, 0x63, 0x82, 0xa7, 0x5e, 0x6c, + 0x88, 0x7f, 0x15, 0xc7, 0x5a, 0x9c, 0xe8, 0x60, 0x0e, 0x73, 0x63, 0xdc, + 0x8d, 0xf5, 0xc4, 0xa6, 0x9b, 0xe2, 0xcc, 0x4d, 0x34, 0x0f, 0x3e, 0x4f, + 0x9f, 0x39, 0xde, 0xc2, 0x1c, 0xc3, 0x53, 0x86, 0xf7, 0xc8, 0xa3, 0x4e, + 0x18, 0x1a, 0xd2, 0xb6, 0xfd, 0xef, 0x84, 0xa6, 0xdb, 0xb8, 0x42, 0x0c, + 0x10, 0x1d, 0x3a, 0xa8, 0x4f, 0x15, 0xb1, 0x8b, 0x3a, 0xfc, 0x6d, 0x5c, + 0x5b, 0xe4, 0x12, 0xbe, 0xfd, 0x53, 0x2b, 0x36, 0x5f, 0xea, 0xc3, 0x74, + 0x47, 0x64, 0x1c, 0x0a, 0x16, 0xea, 0x06, 0xfa, 0xb2, 0x06, 0x9e, 0x9a, + 0x9e, 0x3b, 0xd4, 0x73, 0xd6, 0x02, 0xbd, 0x06, 0x6f, 0xe8, 0x7a, 0xf7, + 0x02, 0xc7, 0xeb, 0xd0, 0x88, 0xe1, 0x43, 0xd9, 0xc0, 0xb6, 0x73, 0x8a, + 0x03, 0xaf, 0xe8, 0xd5, 0x31, 0x57, 0x24, 0x82, 0xc1, 0x2c, 0x9c, 0x03, + 0x2b, 0x0c, 0x24, 0xb2, 0xbd, 0xe1, 0x2a, 0xa6, 0x97, 0xce, 0x15, 0x05, + 0x2e, 0xf3, 0x65, 0xea, 0x76, 0x53, 0xd0, 0xe6, 0x32, 0x85, 0x38, 0xae, + 0x59, 0xd6, 0x19, 0x5d, 0xf4, 0x0c, 0x1c, 0x9a, 0xd5, 0xf1, 0x41, 0x7e, + 0x1f, 0x9a, 0xd5, 0x71, 0x3f, 0xdb, 0xa3, 0xbf, 0x61, 0xc7, 0x27, 0xf8, + 0x87, 0x0f, 0xcc, 0xd9, 0xc8, 0x4b, 0xfc, 0x3e, 0x9f, 0xe2, 0x6f, 0x8a, + 0x52, 0xc7, 0x2f, 0x66, 0xda, 0x04, 0x0b, 0x39, 0xdd, 0x6e, 0x1b, 0x13, + 0xa3, 0x6a, 0x2f, 0xed, 0x40, 0xf4, 0x50, 0xcc, 0x1d, 0x2c, 0x6b, 0xd4, + 0x10, 0x1d, 0x37, 0xd8, 0xf1, 0xfa, 0xf0, 0x74, 0x15, 0xa2, 0xf5, 0xfe, + 0x21, 0xe0, 0xa7, 0x52, 0x4e, 0xf3, 0xa9, 0x0e, 0xc6, 0xd2, 0x25, 0x18, + 0xe8, 0x14, 0xdb, 0x91, 0x1c, 0x53, 0x41, 0xcb, 0x62, 0xc6, 0x97, 0xa0, + 0x0f, 0xef, 0xe9, 0xcd, 0x9d, 0xad, 0xea, 0x02, 0xe2, 0x95, 0xf0, 0x2b, + 0x83, 0x73, 0x57, 0xcf, 0x00, 0x26, 0xb6, 0x86, 0x6d, 0xa5, 0x05, 0x9c, + 0x64, 0x1d, 0x89, 0xf9, 0x1a, 0xfa, 0x3c, 0x51, 0xc6, 0x04, 0xb5, 0x9d, + 0x69, 0x36, 0x79, 0x8f, 0x6e, 0x3e, 0x8d, 0x1f, 0x13, 0x17, 0x2d, 0xc6, + 0x9d, 0x4a, 0xbc, 0xd4, 0xf2, 0x9e, 0x15, 0xad, 0x95, 0x76, 0xcd, 0xad, + 0xa5, 0x1c, 0x7c, 0x75, 0xe4, 0xe4, 0xfa, 0x57, 0x03, 0xfe, 0x58, 0x8e, + 0xf4, 0x78, 0xe7, 0xb0, 0x0b, 0x31, 0x49, 0xa1, 0x21, 0xb2, 0x7c, 0x3a, + 0x27, 0x29, 0xe6, 0x23, 0x32, 0x9f, 0xfd, 0xc4, 0x99, 0x37, 0x18, 0xfb, + 0xa4, 0xff, 0xef, 0x51, 0x76, 0x22, 0xfc, 0xb4, 0x5f, 0x12, 0x4a, 0x87, + 0x60, 0xb7, 0x53, 0xbf, 0x74, 0xbf, 0xf7, 0xe2, 0x7d, 0xdb, 0xaf, 0x9c, + 0xa8, 0x90, 0x67, 0xf7, 0xcd, 0xc6, 0x8c, 0xb9, 0xe5, 0x2c, 0x6b, 0xda, + 0xc8, 0x2f, 0xa8, 0xb1, 0xb1, 0xf3, 0x88, 0x92, 0x22, 0x7e, 0xa0, 0xd4, + 0xe9, 0x23, 0x47, 0xd3, 0xbc, 0xc4, 0x8c, 0x3e, 0x62, 0x86, 0x49, 0xcc, + 0xd8, 0x97, 0x39, 0xa2, 0xec, 0xcd, 0xfc, 0x3d, 0xeb, 0xc8, 0x18, 0x54, + 0x9c, 0x4e, 0x39, 0x60, 0xa5, 0x6c, 0xdc, 0xfe, 0xac, 0x4a, 0x7c, 0xb4, + 0x20, 0x39, 0x78, 0xd1, 0x6f, 0xff, 0x8f, 0x55, 0xf0, 0x5b, 0xe9, 0x47, + 0xec, 0xae, 0xd8, 0x97, 0x8a, 0xb3, 0x76, 0x1d, 0x1f, 0xe5, 0x29, 0x67, + 0x79, 0x27, 0xce, 0x92, 0xdf, 0xfd, 0x38, 0xa5, 0xe2, 0x4c, 0x0a, 0x21, + 0xea, 0xad, 0xad, 0x1c, 0x82, 0x57, 0x81, 0xa6, 0x3e, 0x02, 0x48, 0xa9, + 0x2e, 0xe5, 0xa4, 0xfc, 0xdc, 0x7a, 0x95, 0xbc, 0x7f, 0xf4, 0x26, 0x27, + 0x56, 0x61, 0x49, 0xb0, 0x6d, 0xb5, 0x93, 0x72, 0xab, 0x91, 0xa8, 0xcf, + 0x05, 0xb3, 0xde, 0xc1, 0xd8, 0xf0, 0x56, 0x4b, 0x0b, 0x56, 0x33, 0x67, + 0x7c, 0x97, 0xe0, 0xd7, 0xcb, 0xe1, 0xe7, 0xa9, 0xff, 0xa7, 0x0d, 0x59, + 0x2f, 0xb0, 0x70, 0x63, 0x90, 0x54, 0x84, 0xe5, 0xab, 0x68, 0xdb, 0x15, + 0xf4, 0x93, 0x61, 0xa5, 0x1a, 0x95, 0x11, 0x67, 0xd3, 0xbb, 0xf0, 0x1b, + 0x3b, 0xc9, 0x67, 0x7c, 0xb5, 0x4b, 0xc2, 0xb2, 0x44, 0xf2, 0x6a, 0x3c, + 0x10, 0x3e, 0xa1, 0x14, 0xfc, 0xf5, 0x45, 0xda, 0xde, 0x1b, 0x71, 0xbd, + 0xbb, 0xcc, 0x51, 0xf8, 0xfd, 0x9a, 0x9d, 0x8f, 0x16, 0xfd, 0xd5, 0x3b, + 0x8b, 0x6b, 0x2e, 0xd7, 0x9b, 0x71, 0x9c, 0x53, 0x43, 0x92, 0x97, 0xe2, + 0x5c, 0x9f, 0x91, 0x57, 0x4a, 0xf4, 0x6a, 0xea, 0x53, 0xb0, 0xbe, 0x94, + 0xb1, 0x89, 0xfc, 0x4d, 0x77, 0xb9, 0xde, 0x65, 0x99, 0x9b, 0x82, 0x98, + 0x69, 0xba, 0xae, 0x39, 0xec, 0x42, 0xd4, 0x2c, 0xe3, 0xc0, 0xaa, 0x22, + 0x1e, 0xd7, 0xb2, 0x9c, 0x59, 0xef, 0xa6, 0xdf, 0x55, 0x32, 0x5f, 0x5d, + 0x92, 0x08, 0x55, 0x4b, 0xce, 0xf7, 0x40, 0x96, 0x23, 0xab, 0x1b, 0xa9, + 0x57, 0x23, 0xc2, 0xf3, 0x34, 0x94, 0xd4, 0x3d, 0x70, 0xbd, 0x1a, 0x99, + 0x41, 0x57, 0xc8, 0xd5, 0x1e, 0xce, 0xc1, 0x55, 0x1b, 0xd9, 0x8e, 0x60, + 0x42, 0xf2, 0x4e, 0xc1, 0xf0, 0xe8, 0x00, 0x51, 0xb5, 0xbe, 0x66, 0x65, + 0xd1, 0x66, 0xa0, 0x56, 0x47, 0xc4, 0x66, 0x7c, 0xed, 0xaf, 0xd9, 0x58, + 0xaf, 0x31, 0x0f, 0xf9, 0xa1, 0xf7, 0xff, 0xaf, 0xfe, 0x67, 0x9d, 0x32, + 0xf7, 0x25, 0xba, 0x7c, 0x4a, 0xde, 0x0f, 0x52, 0x5d, 0x0d, 0xbd, 0x53, + 0xd4, 0xfc, 0x94, 0x6d, 0x07, 0xae, 0xd2, 0xc8, 0xe1, 0x8d, 0x2f, 0xd0, + 0x9f, 0x4b, 0xa8, 0xfb, 0xc7, 0x75, 0x93, 0x61, 0xc8, 0xb2, 0xf4, 0xa0, + 0xdf, 0x5b, 0xaa, 0xf8, 0x30, 0xd8, 0xf2, 0x4b, 0x6b, 0x86, 0x31, 0xf9, + 0x1e, 0xe2, 0xad, 0x53, 0xaf, 0x63, 0x8e, 0x56, 0x31, 0xa7, 0x9e, 0x71, + 0x7b, 0xb1, 0xde, 0xb0, 0x6e, 0xc6, 0xa4, 0xde, 0x44, 0xd0, 0xdf, 0xb5, + 0x83, 0xf5, 0x9e, 0x60, 0xbd, 0xe8, 0x7c, 0xd6, 0xcb, 0x7a, 0x58, 0xde, + 0xcd, 0xab, 0x7a, 0x6e, 0x7f, 0x17, 0xeb, 0xed, 0xd3, 0xcd, 0xbc, 0xdd, + 0xdf, 0x72, 0x7f, 0x77, 0xa9, 0xc3, 0x89, 0x04, 0xeb, 0xe5, 0x59, 0xef, + 0x6c, 0x56, 0xd6, 0x23, 0x70, 0xfd, 0x54, 0x3c, 0x39, 0xe3, 0xd0, 0x75, + 0xed, 0x0c, 0xa2, 0x8c, 0x09, 0xf6, 0x5c, 0x5e, 0x3f, 0x99, 0xe9, 0xc1, + 0xa0, 0x7e, 0x34, 0x58, 0xc6, 0x7a, 0x27, 0xf4, 0xa3, 0xde, 0x12, 0xfa, + 0xfd, 0x16, 0xb6, 0xd7, 0xcb, 0x7c, 0x49, 0x45, 0x03, 0x65, 0x14, 0x0e, + 0x64, 0x60, 0x09, 0xf3, 0x7b, 0xdb, 0xcf, 0x84, 0x63, 0x41, 0xe6, 0x54, + 0xc6, 0xe7, 0x6f, 0x9a, 0xb2, 0xc7, 0xa7, 0x5c, 0x76, 0xa8, 0x85, 0x86, + 0x51, 0x6b, 0xa2, 0xaf, 0x45, 0xe2, 0xb3, 0xc2, 0xd8, 0xe0, 0x6f, 0xca, + 0x13, 0xc3, 0x77, 0x4c, 0x7f, 0x06, 0x79, 0xad, 0x1e, 0x3b, 0xa6, 0x2c, + 0xeb, 0x25, 0xbd, 0xad, 0x96, 0x94, 0xc1, 0xe5, 0xa2, 0xcc, 0xae, 0x40, + 0x85, 0xf0, 0x00, 0xbb, 0xad, 0x28, 0x04, 0xff, 0x14, 0x24, 0x74, 0x73, + 0xab, 0xc8, 0x7f, 0x3c, 0xe8, 0x8f, 0x1d, 0x52, 0x9a, 0xbb, 0x76, 0xe0, + 0x97, 0xc4, 0x63, 0x10, 0x4b, 0x17, 0x62, 0xdc, 0xa0, 0xb5, 0x74, 0x9a, + 0x8c, 0xc0, 0xc2, 0x21, 0x9c, 0x27, 0x57, 0x33, 0x82, 0x3a, 0xe1, 0xef, + 0xee, 0x60, 0xf9, 0x70, 0x61, 0x9d, 0x04, 0xe7, 0xb3, 0x7e, 0xfa, 0x8d, + 0xe8, 0x02, 0x18, 0xc8, 0x14, 0x63, 0x8d, 0x65, 0x1d, 0x34, 0x2c, 0xeb, + 0x05, 0x63, 0x21, 0x0e, 0x19, 0xfe, 0x98, 0xf8, 0xc0, 0xdb, 0x46, 0xdb, + 0x55, 0x25, 0xf0, 0x77, 0x02, 0x22, 0x9b, 0xc2, 0xd8, 0xa8, 0xa0, 0x92, + 0x97, 0x37, 0xe0, 0xf4, 0x55, 0x2a, 0xf4, 0xe2, 0xe5, 0x8b, 0xbb, 0x17, + 0x53, 0xef, 0xd5, 0xd7, 0x29, 0xf8, 0x60, 0x99, 0x82, 0xa3, 0xcb, 0x02, + 0xde, 0x71, 0xa5, 0x8a, 0x71, 0x27, 0xd0, 0xd9, 0xae, 0x98, 0x27, 0x59, + 0x37, 0xda, 0xe2, 0xf0, 0x7b, 0xc9, 0xd0, 0x88, 0xdf, 0x4b, 0x7c, 0x42, + 0x83, 0x9c, 0xc3, 0x01, 0xef, 0x13, 0xfc, 0x74, 0x64, 0x15, 0x64, 0x75, + 0x7f, 0x14, 0x76, 0xfb, 0xec, 0x3b, 0xa8, 0xe0, 0xea, 0x80, 0x65, 0x9d, + 0x0a, 0x36, 0x6b, 0xa7, 0xf0, 0x36, 0x71, 0x5f, 0xfa, 0x29, 0xca, 0x06, + 0x54, 0x0c, 0xeb, 0xd1, 0x76, 0xc5, 0x27, 0xb4, 0x87, 0x71, 0x58, 0xb8, + 0x42, 0x51, 0xde, 0x22, 0x67, 0xb0, 0xac, 0xb7, 0x8d, 0x42, 0x5b, 0x5a, + 0xc8, 0x1f, 0x03, 0x16, 0x62, 0x5a, 0xf7, 0x77, 0xe4, 0xa9, 0x07, 0xe1, + 0x81, 0x0b, 0xf4, 0x7a, 0xcc, 0x94, 0xf8, 0xb5, 0x19, 0x65, 0xf5, 0xc7, + 0x2a, 0x96, 0x6e, 0x7d, 0x4a, 0x69, 0xde, 0x56, 0x0e, 0x3d, 0x9a, 0x53, + 0x2e, 0x93, 0xf9, 0xf0, 0xba, 0x89, 0xa7, 0x5b, 0x60, 0xf3, 0x17, 0xdc, + 0x1c, 0x77, 0x46, 0xcf, 0xa3, 0x91, 0x7e, 0xa7, 0x77, 0xdd, 0xab, 0xf8, + 0xc3, 0xc0, 0xe7, 0x10, 0x9d, 0x2f, 0xb2, 0xd6, 0x23, 0x76, 0xbb, 0x65, + 0xdd, 0x47, 0x59, 0x77, 0x52, 0xd6, 0x07, 0x82, 0xef, 0x5b, 0xff, 0x62, + 0xb7, 0x79, 0x03, 0xc6, 0xf5, 0x4f, 0xb7, 0xfb, 0x9e, 0x85, 0xf9, 0xd2, + 0x6e, 0x09, 0xd6, 0xce, 0xb7, 0x2c, 0x35, 0x24, 0x18, 0xeb, 0x2c, 0x21, + 0xa6, 0x86, 0x05, 0xbb, 0xa1, 0x7e, 0x9a, 0xa3, 0x38, 0x24, 0x5f, 0xf2, + 0xc6, 0x14, 0xb5, 0xa1, 0x92, 0xf1, 0xc1, 0xa5, 0x5b, 0xb8, 0x9f, 0x7c, + 0x2a, 0x3a, 0xbf, 0x06, 0x7f, 0xca, 0x39, 0xad, 0x0a, 0xa8, 0x97, 0x13, + 0x45, 0x71, 0x28, 0x28, 0xbf, 0x4b, 0x90, 0x27, 0x6d, 0xea, 0xe1, 0x2c, + 0x6b, 0x01, 0x75, 0x81, 0xdc, 0x77, 0xb5, 0xca, 0x6f, 0xca, 0x7f, 0x99, + 0x82, 0xfb, 0x68, 0x91, 0x6a, 0xa0, 0xd7, 0x2b, 0xf7, 0x3b, 0x0c, 0xf9, + 0xad, 0xa0, 0x31, 0xe8, 0xe4, 0xbc, 0x58, 0x70, 0x50, 0xf6, 0x0a, 0xf2, + 0xe6, 0x8e, 0xa0, 0x7c, 0x8f, 0xde, 0xc7, 0x71, 0x47, 0x0f, 0x28, 0x82, + 0x71, 0xff, 0x60, 0xbd, 0xc4, 0x18, 0xab, 0xf1, 0xf9, 0x9f, 0xb2, 0xef, + 0x93, 0xc1, 0x17, 0xac, 0x05, 0x8c, 0x41, 0xa7, 0xc2, 0x3e, 0x2c, 0x5c, + 0xd6, 0x80, 0x99, 0xdb, 0x64, 0xcc, 0x0a, 0xaa, 0xf4, 0x3d, 0x25, 0x92, + 0x3b, 0x57, 0xeb, 0x97, 0x61, 0xed, 0xfa, 0xc2, 0xbd, 0xf2, 0x80, 0xac, + 0x51, 0xfa, 0x50, 0xbe, 0xac, 0x0e, 0xbe, 0xd9, 0x7b, 0xab, 0x03, 0xce, + 0xce, 0x2a, 0x45, 0xd7, 0x6e, 0x56, 0xe4, 0xf9, 0xcf, 0xad, 0xa8, 0xc7, + 0xb2, 0xee, 0xe7, 0x7c, 0x2d, 0x09, 0xba, 0xf1, 0x21, 0xfb, 0xe9, 0xa5, + 0xfe, 0xd6, 0x5d, 0x9c, 0xaf, 0x62, 0xfd, 0x8f, 0x98, 0xe7, 0x4a, 0x5d, + 0x69, 0x63, 0x71, 0xc7, 0x5a, 0x65, 0x7d, 0x89, 0xe4, 0x35, 0x0f, 0x04, + 0x6d, 0x9d, 0xb1, 0xec, 0x01, 0xfb, 0xb7, 0x16, 0x7a, 0xe3, 0xe2, 0x7a, + 0xdb, 0x39, 0x3b, 0x56, 0xb7, 0x5d, 0xa7, 0x61, 0xc6, 0xaa, 0x6d, 0x35, + 0xb5, 0x32, 0x08, 0x57, 0x6a, 0x6c, 0x7a, 0x96, 0xed, 0xfe, 0xbd, 0x51, + 0x88, 0xe7, 0x07, 0x0d, 0x7f, 0xca, 0xa4, 0xff, 0xc4, 0x98, 0x13, 0xb6, + 0x0b, 0xaf, 0x99, 0xbe, 0x86, 0xf3, 0xb0, 0x10, 0x65, 0xad, 0xfe, 0xa1, + 0x45, 0xcc, 0xd1, 0x1c, 0x21, 0xe1, 0x01, 0x32, 0x3f, 0x76, 0x19, 0xf6, + 0x55, 0x8e, 0xd5, 0x94, 0x31, 0xd8, 0x2a, 0x31, 0xf6, 0xf7, 0xf1, 0x20, + 0x69, 0xc7, 0x8e, 0xc5, 0x43, 0x51, 0xfc, 0xa1, 0xb2, 0x60, 0x04, 0x93, + 0x35, 0x40, 0xd7, 0xf5, 0xb1, 0x8c, 0x4a, 0x0e, 0x56, 0xaa, 0xf5, 0x86, + 0xea, 0x79, 0xc9, 0x73, 0xe7, 0xf5, 0x9b, 0x32, 0x17, 0xd7, 0x10, 0x91, + 0x32, 0x4a, 0xa1, 0x5e, 0x2d, 0xf1, 0x82, 0xbe, 0xac, 0xc9, 0xf8, 0x4c, + 0x5a, 0xb9, 0xac, 0x85, 0xff, 0x7c, 0xfd, 0x66, 0xe2, 0xc5, 0x31, 0xf6, + 0x38, 0x41, 0xae, 0x67, 0xda, 0x9e, 0x21, 0xd8, 0x30, 0x77, 0x4d, 0x51, + 0xe2, 0x57, 0x91, 0x07, 0xd4, 0x63, 0x64, 0xcf, 0x7a, 0xf8, 0xea, 0x0b, + 0x18, 0xa8, 0x46, 0x96, 0xa3, 0x2d, 0x55, 0x51, 0x5a, 0xc8, 0x47, 0xea, + 0x30, 0xbc, 0x27, 0x88, 0xf4, 0x7c, 0x79, 0x26, 0xf7, 0x5c, 0x10, 0x8c, + 0x1e, 0xdc, 0x73, 0x39, 0x66, 0x3c, 0xf4, 0x59, 0xb6, 0x1b, 0xa3, 0xef, + 0xa8, 0x3a, 0x79, 0x89, 0x26, 0xed, 0x1f, 0xbd, 0x8a, 0x38, 0x62, 0xac, + 0x41, 0x73, 0xd7, 0x24, 0xde, 0x24, 0xe7, 0xb5, 0xd7, 0x6f, 0x7d, 0x65, + 0x91, 0xfc, 0x7d, 0x25, 0x08, 0xc4, 0xa6, 0x88, 0x03, 0xee, 0xac, 0x8b, + 0xdc, 0x6d, 0xa1, 0xac, 0x59, 0x5b, 0x6d, 0xc4, 0x96, 0x18, 0x79, 0xff, + 0xe7, 0x9c, 0x4e, 0x6c, 0x26, 0x66, 0x1c, 0xd4, 0x9b, 0xb7, 0x4d, 0xe2, + 0x5f, 0x89, 0xb3, 0x52, 0xfe, 0xe7, 0x9c, 0x47, 0x69, 0xd3, 0xc5, 0xfe, + 0x64, 0x4d, 0xe2, 0xf0, 0x46, 0xf2, 0x65, 0x67, 0x89, 0x3e, 0x5d, 0x22, + 0xdc, 0xa4, 0x94, 0x72, 0xec, 0xdc, 0xa3, 0xa0, 0x9d, 0xed, 0x3c, 0x41, + 0x9b, 0xb9, 0x2f, 0x00, 0x67, 0xc7, 0x32, 0xf2, 0x37, 0xd0, 0x05, 0xe7, + 0x6b, 0x78, 0x7c, 0x0a, 0xe1, 0x8c, 0x9e, 0x5f, 0xe0, 0x26, 0xac, 0x8b, + 0xdc, 0x26, 0xe3, 0x43, 0xa1, 0x1d, 0xe3, 0xf6, 0x4f, 0xb6, 0x53, 0x87, + 0x7d, 0xb3, 0xed, 0xec, 0x65, 0x3b, 0xd7, 0x2c, 0x81, 0xb3, 0xfa, 0x1a, + 0x99, 0xab, 0x16, 0xfa, 0x4f, 0x1d, 0x92, 0x76, 0x5c, 0x21, 0xf7, 0xf8, + 0x2c, 0x14, 0x7d, 0xb1, 0xe4, 0x46, 0xff, 0x6c, 0xd7, 0x5b, 0xd3, 0x92, + 0x3f, 0x5f, 0x4b, 0xe0, 0x3e, 0xb7, 0x24, 0x4f, 0x47, 0x2d, 0xea, 0xe6, + 0x72, 0x0c, 0xec, 0xa9, 0x2e, 0xca, 0xcb, 0x7e, 0x8a, 0x7d, 0xd4, 0xf3, + 0x9e, 0x17, 0x8f, 0x27, 0x59, 0x8f, 0xfd, 0x1c, 0x32, 0x84, 0xa7, 0x36, + 0x1b, 0xe5, 0x8a, 0xdf, 0x8c, 0x72, 0x5e, 0xf2, 0x9e, 0x7a, 0xf4, 0xd9, + 0x71, 0xa8, 0x81, 0xf5, 0xaf, 0xac, 0x2e, 0x70, 0x2a, 0x94, 0x7c, 0x9e, + 0x65, 0xdb, 0x83, 0x85, 0xfe, 0x88, 0xc3, 0xae, 0x92, 0x48, 0x2b, 0x0e, + 0x8e, 0x5d, 0x7c, 0xee, 0x5f, 0xa3, 0xcf, 0x9d, 0xaf, 0xbc, 0xbf, 0x04, + 0x6d, 0xfc, 0xac, 0x90, 0x38, 0xf3, 0x89, 0xb1, 0xf7, 0x4f, 0xdd, 0xc5, + 0xcf, 0x6a, 0x0c, 0x4c, 0x59, 0xe8, 0xb7, 0x73, 0xa8, 0x52, 0xf4, 0xb6, + 0x78, 0x66, 0xb9, 0xeb, 0x7c, 0x89, 0x1d, 0xe1, 0x34, 0x24, 0xbe, 0x8a, + 0xfd, 0xb8, 0x37, 0x88, 0xfd, 0x38, 0x94, 0xb9, 0xf6, 0xd3, 0x83, 0x97, + 0xf5, 0xa3, 0xeb, 0xcb, 0x70, 0xf4, 0x4e, 0x59, 0x7b, 0xdf, 0x16, 0xc4, + 0xf1, 0x1b, 0xe9, 0x9b, 0x67, 0x89, 0x39, 0xfd, 0x4b, 0x18, 0xbf, 0x6c, + 0xcc, 0x52, 0x50, 0xa6, 0x7b, 0xb0, 0x63, 0x8f, 0xdf, 0x57, 0x4a, 0xdc, + 0xea, 0x9f, 0xfa, 0x8d, 0x35, 0x28, 0xca, 0x6f, 0xe0, 0x60, 0xfc, 0xe8, + 0xa3, 0x65, 0x78, 0x4b, 0x78, 0xdd, 0x8f, 0xde, 0x64, 0x1b, 0x6b, 0x8c, + 0xa2, 0xae, 0x44, 0x4f, 0xc5, 0x76, 0xea, 0x91, 0xd8, 0x53, 0xac, 0xaf, + 0xe0, 0x95, 0x80, 0x77, 0x76, 0xed, 0xbb, 0x1e, 0xc3, 0x53, 0x47, 0x4f, + 0x91, 0xe7, 0x30, 0x4e, 0x1d, 0xed, 0xf6, 0x52, 0x96, 0x73, 0xc1, 0xe2, + 0x9c, 0x8a, 0x6f, 0xce, 0x6d, 0x43, 0x6c, 0x17, 0x4a, 0xf5, 0x62, 0xf4, + 0x57, 0xd3, 0x46, 0x33, 0x01, 0xc4, 0x2a, 0x23, 0x75, 0x88, 0x4f, 0xd1, + 0xb7, 0xb2, 0xa5, 0x70, 0xae, 0x94, 0xb8, 0x2b, 0x5c, 0xcb, 0x79, 0xfd, + 0xe9, 0x78, 0x29, 0xee, 0x36, 0x2e, 0x58, 0x82, 0x8b, 0xa7, 0x74, 0x5c, + 0x51, 0x4a, 0x4c, 0x5c, 0x1c, 0x0c, 0x44, 0xb7, 0x30, 0x67, 0x3e, 0xd1, + 0xe2, 0xbc, 0xfe, 0x9d, 0xcc, 0x2f, 0xac, 0xb4, 0xe7, 0xd3, 0xe3, 0x11, + 0x7d, 0xe0, 0xe4, 0x4d, 0x01, 0xe9, 0x53, 0xfa, 0x2b, 0xda, 0xa8, 0xf4, + 0x6f, 0x59, 0x81, 0xa0, 0xf8, 0xc9, 0xa5, 0x31, 0xbc, 0xa5, 0x17, 0xc7, + 0xa0, 0xd9, 0xf1, 0x9b, 0x39, 0x36, 0x31, 0x47, 0xf2, 0x8e, 0x23, 0xca, + 0x51, 0x3b, 0xc7, 0x36, 0xa3, 0xcc, 0xad, 0xc3, 0x43, 0xb3, 0xb9, 0x75, + 0x9e, 0x3c, 0xf9, 0x04, 0x79, 0xf2, 0x8b, 0xb3, 0xb9, 0xf5, 0xb1, 0x8c, + 0xd4, 0x99, 0x5b, 0x3e, 0xcc, 0xf2, 0xc0, 0x54, 0x3c, 0xd0, 0x54, 0xac, + 0xf3, 0x22, 0xcb, 0x9f, 0xb8, 0x58, 0xbe, 0x8b, 0xf9, 0x70, 0x27, 0x76, + 0x24, 0x2b, 0xf1, 0x25, 0xcd, 0xce, 0x5d, 0x5d, 0xf4, 0xc3, 0xdb, 0xdf, + 0xd6, 0xf3, 0x4d, 0x0e, 0xe2, 0xd0, 0x14, 0x07, 0xdf, 0x1e, 0x57, 0xe8, + 0x77, 0x25, 0x18, 0xd2, 0x6a, 0xb0, 0xd9, 0xf8, 0xa5, 0xf5, 0xa5, 0x8d, + 0xf2, 0xac, 0xb8, 0xc7, 0x20, 0xe5, 0x8f, 0xb3, 0xbc, 0xdf, 0x98, 0x9a, + 0xcd, 0x35, 0x8f, 0xc6, 0x91, 0x92, 0x3c, 0x6e, 0x53, 0x28, 0xe0, 0xeb, + 0xb5, 0xd7, 0x93, 0x7d, 0xd8, 0x92, 0xf1, 0xe1, 0x1e, 0xca, 0x93, 0x76, + 0xce, 0xe6, 0x60, 0x85, 0x58, 0x6c, 0x0a, 0xcf, 0x5c, 0xcd, 0x72, 0x7d, + 0xb3, 0x38, 0xd3, 0x7e, 0x91, 0xe7, 0xca, 0x3a, 0x5b, 0x91, 0xeb, 0x32, + 0x16, 0xd4, 0x49, 0xee, 0x0e, 0xda, 0x45, 0x2d, 0xd2, 0x1e, 0xd9, 0x53, + 0x99, 0x3b, 0x46, 0x44, 0xcb, 0x22, 0x01, 0xdf, 0x12, 0x75, 0x2e, 0x76, + 0xc9, 0x58, 0x05, 0xb7, 0x4c, 0x5b, 0x3f, 0xc7, 0x2f, 0x8e, 0xf7, 0x33, + 0x65, 0x82, 0x59, 0x07, 0xe3, 0x8f, 0x94, 0xd2, 0xb6, 0xd4, 0x52, 0xb1, + 0x07, 0x14, 0xee, 0x21, 0x27, 0xfb, 0x02, 0x73, 0xdb, 0x2d, 0x8d, 0x32, + 0x67, 0xc7, 0xd3, 0xf1, 0x40, 0xf4, 0x5d, 0x98, 0xca, 0xa9, 0x8c, 0x93, + 0xb6, 0x2e, 0xed, 0xf6, 0xb3, 0xbd, 0x21, 0xe5, 0xe4, 0xc5, 0x36, 0xc7, + 0x2e, 0x14, 0xd6, 0x66, 0x8b, 0xbe, 0xe2, 0xc2, 0xbd, 0xa9, 0xe2, 0x5e, + 0x61, 0x14, 0x6f, 0x19, 0x82, 0x8b, 0x2e, 0xf2, 0x1e, 0xa0, 0x33, 0xce, + 0x59, 0x28, 0xac, 0xc1, 0xf9, 0x2e, 0xc5, 0xed, 0x3d, 0x4e, 0xc1, 0xb0, + 0x6f, 0x2f, 0x69, 0x2d, 0x2b, 0xc4, 0x80, 0xdf, 0x57, 0xa6, 0x88, 0xed, + 0x63, 0x17, 0x52, 0xc9, 0x86, 0x39, 0x79, 0x3c, 0xed, 0x6b, 0xd4, 0x3f, + 0x64, 0xc2, 0xc9, 0x36, 0x9c, 0xf8, 0x1e, 0xe3, 0xb7, 0x73, 0xf4, 0xe8, + 0x55, 0xb2, 0x84, 0x5d, 0x32, 0x19, 0x45, 0x1f, 0xb3, 0x1c, 0xc7, 0x78, + 0xb5, 0xac, 0xd3, 0xf9, 0x7c, 0xea, 0x3e, 0x67, 0xe1, 0x53, 0x30, 0xd9, + 0x0d, 0x35, 0x27, 0x79, 0x3b, 0x69, 0xc4, 0xa4, 0xe8, 0xb5, 0x8e, 0x9f, + 0xa2, 0x17, 0x0f, 0x3f, 0x45, 0x47, 0xf5, 0xfc, 0xac, 0x61, 0xde, 0x2a, + 0xf9, 0xe1, 0x46, 0xc4, 0x89, 0x59, 0x95, 0x91, 0x6e, 0x7c, 0x79, 0xd8, + 0xb2, 0x86, 0xe8, 0x97, 0xe5, 0x8c, 0xf1, 0xf7, 0x07, 0x9a, 0xc3, 0x4b, + 0x95, 0x52, 0xf2, 0x9d, 0x8d, 0x18, 0x9a, 0x2a, 0x8d, 0xd5, 0x44, 0xea, + 0x19, 0xd3, 0x35, 0x7c, 0xb0, 0xa2, 0x13, 0xb9, 0xec, 0xef, 0xca, 0x2b, + 0x8b, 0xf3, 0xec, 0x9d, 0xd5, 0x99, 0x53, 0xd6, 0x67, 0x86, 0x88, 0x2f, + 0x94, 0xa9, 0x0c, 0xbd, 0x17, 0xf7, 0x70, 0xe7, 0xce, 0x69, 0xb1, 0xae, + 0xd3, 0x1e, 0x47, 0x1a, 0x63, 0x17, 0x76, 0x24, 0x65, 0x1c, 0x25, 0x38, + 0x91, 0x92, 0xb1, 0x59, 0x38, 0x6c, 0xdc, 0x40, 0xae, 0xfa, 0x53, 0x8b, + 0x10, 0x60, 0xdb, 0x57, 0x49, 0xa4, 0x5b, 0x99, 0xe0, 0x5c, 0x9a, 0xac, + 0xe2, 0xd2, 0xa1, 0x95, 0x45, 0xa2, 0xca, 0xb3, 0x19, 0xa9, 0xd3, 0xae, + 0x1c, 0x4a, 0xcf, 0x6d, 0xbb, 0x5b, 0x99, 0xca, 0x7c, 0xb1, 0x4c, 0xf8, + 0xc8, 0x25, 0x1d, 0x17, 0xf7, 0xdf, 0x64, 0x0d, 0xd2, 0x87, 0xda, 0x84, + 0x34, 0x29, 0xba, 0xf3, 0xc1, 0x99, 0xe3, 0xef, 0xdc, 0x6f, 0x93, 0xed, + 0xd3, 0xfe, 0xb7, 0xe2, 0x13, 0xfe, 0x7a, 0x82, 0xfe, 0x9a, 0xff, 0xbd, + 0xfe, 0xba, 0xf2, 0x0f, 0x94, 0x7f, 0x9d, 0xb2, 0xc9, 0xda, 0xba, 0x65, + 0xed, 0x32, 0x64, 0x9d, 0x5d, 0xd6, 0x55, 0x5b, 0x7e, 0xcb, 0xbe, 0xaa, + 0x65, 0xfd, 0xad, 0xb1, 0x04, 0xe9, 0x3a, 0x7f, 0x5a, 0xd6, 0x7e, 0x46, + 0x93, 0xc0, 0xea, 0x84, 0xf4, 0x13, 0xa5, 0x7e, 0xd5, 0x1b, 0x18, 0xa9, + 0x98, 0x3d, 0xf4, 0xe0, 0x4d, 0x43, 0xdf, 0xfb, 0x25, 0x72, 0xf2, 0x5e, + 0xe6, 0xab, 0x07, 0x8d, 0x0e, 0x62, 0x41, 0x05, 0xb6, 0xb6, 0xc8, 0x5e, + 0x98, 0xac, 0xff, 0x9a, 0x5d, 0x74, 0x53, 0x97, 0x3b, 0xd2, 0xb4, 0x21, + 0x1e, 0xf0, 0x77, 0x3e, 0x40, 0xac, 0xbf, 0x69, 0xd8, 0x05, 0x5f, 0x61, + 0xcd, 0x60, 0xdb, 0xf7, 0xc9, 0x77, 0x4e, 0x04, 0xff, 0xb1, 0xb4, 0xb0, + 0x3e, 0x20, 0xeb, 0x3d, 0xd2, 0x4f, 0x07, 0x73, 0x16, 0xa9, 0xeb, 0xc3, + 0xad, 0x8b, 0x99, 0xaf, 0x2c, 0xf6, 0xa7, 0x66, 0x14, 0xcb, 0x0a, 0x91, + 0x33, 0xe6, 0x3d, 0x61, 0x24, 0xa7, 0x9b, 0x9b, 0x76, 0xa9, 0xff, 0x4c, + 0x9c, 0x2c, 0xac, 0x3b, 0x98, 0x2a, 0x65, 0xff, 0x83, 0x6b, 0xd8, 0x06, + 0x64, 0x8f, 0xa1, 0x4c, 0x5f, 0xab, 0x4c, 0xd9, 0xf5, 0xaa, 0x71, 0xe3, + 0xe8, 0xde, 0x0b, 0x7b, 0x93, 0xe2, 0x03, 0xa8, 0xaf, 0xd1, 0x17, 0xa0, + 0xec, 0x40, 0x15, 0xda, 0x47, 0x85, 0x47, 0xb8, 0xcd, 0xb2, 0x88, 0x17, + 0xce, 0x03, 0x75, 0xb8, 0x7b, 0x37, 0x62, 0xe5, 0x11, 0xab, 0xa7, 0x36, + 0x72, 0x17, 0x16, 0x4e, 0x6a, 0xb8, 0x73, 0xb7, 0x65, 0x2d, 0x5a, 0x49, + 0xbf, 0x60, 0xbc, 0x0c, 0x2c, 0xdf, 0x88, 0x92, 0x5c, 0x03, 0xd6, 0x26, + 0x9a, 0x50, 0x93, 0x05, 0x3e, 0x8c, 0x77, 0xb4, 0x2f, 0x1b, 0x5e, 0xec, + 0x7d, 0x41, 0xf1, 0x1b, 0x07, 0x94, 0x30, 0x4a, 0x73, 0x61, 0xb8, 0x13, + 0x0a, 0x5e, 0xd2, 0xd1, 0x53, 0x15, 0x89, 0xc0, 0x9d, 0x8b, 0xa0, 0x32, + 0xe1, 0x44, 0x25, 0xf5, 0x5d, 0xc1, 0xb9, 0x9f, 0x97, 0x68, 0xc0, 0xbc, + 0xdc, 0x15, 0xa4, 0x91, 0x2d, 0xf4, 0x9f, 0x3a, 0xf6, 0xe7, 0xc1, 0xdd, + 0x89, 0x4e, 0xcc, 0xd3, 0x43, 0x58, 0x98, 0x0b, 0x61, 0x41, 0xc2, 0x63, + 0xef, 0x33, 0xad, 0x49, 0x74, 0xb0, 0x1f, 0x37, 0x6e, 0x1d, 0xbd, 0x05, + 0x35, 0xe3, 0x2e, 0x94, 0x8f, 0xfa, 0x70, 0xf5, 0x0a, 0x17, 0xaa, 0xc7, + 0xbd, 0x70, 0x24, 0xf4, 0xd8, 0x83, 0x40, 0x74, 0xe7, 0x0a, 0x2f, 0x2a, + 0x73, 0x64, 0x4e, 0xa3, 0x16, 0x36, 0x04, 0x27, 0xd5, 0xdb, 0xea, 0x4c, + 0x6b, 0x9e, 0x1d, 0x27, 0xa2, 0x77, 0xf4, 0xeb, 0xd1, 0x59, 0x4c, 0x70, + 0xc2, 0xcd, 0xf8, 0xe1, 0xb2, 0xe3, 0x7b, 0xf4, 0x8e, 0x83, 0x71, 0x59, + 0x37, 0x09, 0xc0, 0x3d, 0x5e, 0x02, 0xd7, 0x78, 0xf7, 0xec, 0xfa, 0x89, + 0xe8, 0x5f, 0x25, 0xaf, 0x16, 0xdb, 0x89, 0x2a, 0x03, 0x99, 0x76, 0x65, + 0x38, 0xdd, 0xad, 0xf4, 0x65, 0x9c, 0x2e, 0x54, 0xc8, 0xbc, 0x5c, 0x8b, + 0x6c, 0xcb, 0x3e, 0x2b, 0x5d, 0x6b, 0xcf, 0xad, 0x59, 0x02, 0xc9, 0xc7, + 0x3b, 0x37, 0x04, 0x17, 0xfb, 0xbb, 0x6b, 0x55, 0xea, 0x80, 0x73, 0x9b, + 0x57, 0x0a, 0x7d, 0x69, 0x7a, 0x02, 0x87, 0x3d, 0xb2, 0xb6, 0x2b, 0xfe, + 0x1e, 0xbd, 0xe3, 0xcb, 0xc3, 0xe2, 0x6b, 0x3e, 0xbc, 0x47, 0x3b, 0x5c, + 0x9d, 0x90, 0x33, 0x02, 0x9d, 0xf4, 0x71, 0x03, 0xc7, 0xf8, 0xfb, 0xf3, + 0x1c, 0xf7, 0x4b, 0x19, 0x37, 0xda, 0x12, 0x21, 0x7b, 0xff, 0xae, 0x3d, + 0x11, 0xc6, 0x71, 0x7e, 0xde, 0x9d, 0xd8, 0x88, 0x1f, 0x65, 0x3c, 0xb8, + 0x33, 0x11, 0xc1, 0x0f, 0x98, 0xcb, 0x76, 0x51, 0x7f, 0xe7, 0x89, 0x07, + 0xeb, 0x13, 0x3e, 0x7c, 0x37, 0x03, 0xfa, 0xac, 0xac, 0x91, 0xfc, 0xb9, + 0x7a, 0xb5, 0xbd, 0xcf, 0x16, 0xc2, 0x89, 0xb8, 0x81, 0xef, 0xc6, 0x1b, + 0x8d, 0x67, 0xf1, 0x33, 0xe4, 0x9d, 0x71, 0xce, 0xd3, 0x39, 0xc4, 0xea, + 0x64, 0x3d, 0xa7, 0x20, 0x7f, 0x2f, 0x69, 0x52, 0x8d, 0xbe, 0x15, 0x34, + 0x71, 0x59, 0xb3, 0x20, 0x07, 0x89, 0xde, 0xb1, 0x39, 0x5e, 0x90, 0x6b, + 0x73, 0xd6, 0x49, 0x39, 0xf6, 0x5e, 0xd8, 0x97, 0x24, 0x8f, 0xd4, 0x1b, + 0x28, 0x8f, 0x0b, 0x6d, 0xa3, 0x2e, 0xd4, 0xd1, 0x36, 0x16, 0x1d, 0x08, + 0xa3, 0x3f, 0x59, 0x8e, 0xa7, 0x52, 0x5e, 0xac, 0xe2, 0xf7, 0x01, 0xda, + 0xf8, 0x11, 0xf6, 0xed, 0x5c, 0xae, 0x61, 0x54, 0x2b, 0x47, 0xbc, 0xe9, + 0x5b, 0x30, 0xe7, 0xab, 0xd4, 0xad, 0xe4, 0x22, 0x95, 0x48, 0x68, 0x1c, + 0x77, 0xc8, 0x8f, 0xc7, 0x9b, 0x68, 0xeb, 0xa4, 0x3d, 0x65, 0x7a, 0x14, + 0xb5, 0x8c, 0x7f, 0x23, 0xcc, 0x23, 0xcb, 0x22, 0x26, 0x65, 0x50, 0x91, + 0xd4, 0x54, 0x59, 0x0f, 0xe4, 0x33, 0x2f, 0x7e, 0x14, 0x87, 0xe5, 0x8c, + 0xe8, 0x27, 0xdf, 0x74, 0x04, 0xf2, 0x4b, 0x18, 0xf3, 0xdf, 0xc8, 0x54, + 0xe2, 0xb9, 0xd4, 0x12, 0x7c, 0x2f, 0x6d, 0xaf, 0x35, 0xe3, 0x9e, 0xb1, + 0xa5, 0x6a, 0x61, 0x9d, 0xd4, 0x8d, 0x7b, 0xc7, 0x60, 0x2e, 0x88, 0x3c, + 0x6f, 0x55, 0xea, 0x77, 0xe1, 0xc5, 0x89, 0x6a, 0x6c, 0x4a, 0x39, 0x69, + 0xd7, 0x2e, 0x1c, 0x4d, 0x8b, 0x8c, 0x35, 0x94, 0xb1, 0x1c, 0x3f, 0xe2, + 0xf7, 0x38, 0x6d, 0x7f, 0x74, 0xf8, 0x11, 0x84, 0x93, 0x8d, 0x4d, 0x5d, + 0x6a, 0x17, 0x4e, 0x50, 0x8f, 0xc9, 0xe1, 0x16, 0xbc, 0x46, 0x3d, 0x8e, + 0xec, 0xb2, 0xac, 0xab, 0x5a, 0xa3, 0x38, 0x95, 0xb9, 0x1c, 0x09, 0x7e, + 0x7f, 0x3d, 0xd8, 0x8e, 0xd7, 0x33, 0x0d, 0x18, 0x1e, 0xee, 0xc0, 0x2b, + 0xcc, 0x07, 0x86, 0x76, 0x75, 0xe3, 0x24, 0xdb, 0xee, 0x1b, 0x71, 0xe1, + 0x58, 0xda, 0x85, 0x97, 0x52, 0x92, 0x3b, 0x7d, 0x5f, 0x89, 0xd5, 0x15, + 0xfa, 0x19, 0x4d, 0x16, 0xf4, 0x39, 0x38, 0x5d, 0x0a, 0xc1, 0xf9, 0x49, + 0x8f, 0xac, 0x4d, 0xc9, 0xd9, 0x97, 0xe8, 0x1d, 0x5a, 0x22, 0x75, 0x21, + 0x4e, 0x7d, 0x1e, 0xce, 0x7a, 0xd1, 0x91, 0x10, 0xdd, 0xca, 0x79, 0x14, + 0x46, 0xa4, 0x6c, 0x18, 0xc7, 0xe2, 0xe2, 0x3b, 0x4e, 0xf4, 0x65, 0x23, + 0xf8, 0x4e, 0xfc, 0xab, 0x9c, 0x1b, 0xe6, 0xb7, 0xd9, 0x42, 0x5b, 0xfd, + 0xd3, 0x34, 0x53, 0xfd, 0x66, 0xe4, 0xb4, 0x52, 0x89, 0xcd, 0x05, 0x1b, + 0xd5, 0xe7, 0xf1, 0xe6, 0x57, 0xed, 0xf5, 0xc1, 0xd1, 0x64, 0xb3, 0x36, + 0x0f, 0xc5, 0x79, 0x6c, 0x64, 0x0e, 0xfd, 0x0b, 0xeb, 0x9b, 0xb3, 0xf3, + 0xe8, 0x66, 0xd9, 0xf8, 0xb0, 0xf4, 0xe3, 0xc3, 0x03, 0xd9, 0xb1, 0x0b, + 0x23, 0x49, 0x27, 0xfd, 0x92, 0x5c, 0x20, 0xe0, 0xc1, 0x9a, 0xc5, 0x4d, + 0x58, 0x9c, 0x93, 0xf5, 0xe4, 0xa5, 0xe4, 0xb3, 0x06, 0x3a, 0x03, 0xf6, + 0xda, 0x1e, 0xe3, 0x62, 0xf1, 0x9e, 0x0b, 0x67, 0x7f, 0xc3, 0x57, 0x80, + 0x45, 0xa3, 0x9d, 0x58, 0xc8, 0xdc, 0xb3, 0xdd, 0xf8, 0x17, 0xeb, 0xa9, + 0x8d, 0xd2, 0xff, 0xfc, 0xea, 0xc2, 0xb3, 0xf2, 0x72, 0x59, 0x93, 0x1c, + 0x4d, 0x2e, 0x67, 0x9c, 0x68, 0x05, 0xdd, 0x56, 0xf6, 0x9d, 0xe8, 0x07, + 0xd1, 0x3b, 0x82, 0xb4, 0x9f, 0x04, 0x65, 0x58, 0x4f, 0xdb, 0x69, 0x27, + 0x2e, 0x94, 0xeb, 0x63, 0x17, 0x86, 0x92, 0x06, 0x8e, 0x67, 0xdd, 0xb4, + 0x65, 0x59, 0x37, 0x0c, 0xe1, 0x47, 0x59, 0xe2, 0x08, 0xed, 0xfb, 0x07, + 0x59, 0x0f, 0xed, 0xd9, 0x87, 0x37, 0xb2, 0xe2, 0xe3, 0x3a, 0x4e, 0xd0, + 0xae, 0x6f, 0x65, 0x9d, 0xd7, 0xb2, 0xb5, 0x38, 0xb5, 0xdf, 0x89, 0x2f, + 0x24, 0x82, 0xd4, 0x4f, 0x13, 0xaa, 0xb2, 0x97, 0xf4, 0xbd, 0x63, 0x7a, + 0x11, 0xdb, 0x3c, 0x62, 0x3d, 0x6d, 0x63, 0x58, 0x99, 0xad, 0xa7, 0x1a, + 0xf6, 0xfb, 0x93, 0x61, 0x98, 0xb5, 0x8c, 0x2f, 0xd7, 0xe4, 0x9e, 0xfd, + 0x75, 0xec, 0x0e, 0xd1, 0xe5, 0xdc, 0xf1, 0x08, 0xa6, 0x8c, 0x11, 0xeb, + 0x98, 0x65, 0x3d, 0x69, 0x61, 0x4d, 0xeb, 0x7d, 0xca, 0xd7, 0x6d, 0x5b, + 0x92, 0x76, 0x85, 0x57, 0x14, 0xf5, 0x5f, 0xd4, 0xf9, 0x99, 0xd2, 0x82, + 0xce, 0x8b, 0xe3, 0xf4, 0xef, 0x15, 0x9c, 0xbe, 0xa7, 0xb5, 0x88, 0xd3, + 0x52, 0x5e, 0xee, 0xaf, 0xb7, 0x86, 0x34, 0x92, 0x05, 0xdd, 0x81, 0xc1, + 0xa6, 0x03, 0xca, 0x8c, 0x26, 0x3e, 0x2f, 0x39, 0xf9, 0xcd, 0xd6, 0xf0, + 0x46, 0xb1, 0xeb, 0xe7, 0x59, 0x0e, 0x4a, 0xd9, 0xc5, 0xb9, 0x14, 0x6e, + 0xd2, 0x3b, 0x3b, 0x97, 0xc2, 0x89, 0x8b, 0x63, 0x2a, 0xca, 0x1a, 0x26, + 0xef, 0x13, 0x79, 0x65, 0x7f, 0x5f, 0xca, 0xdc, 0x5d, 0x5e, 0x58, 0x43, + 0xed, 0x9d, 0x63, 0x0f, 0x45, 0x7e, 0x63, 0xb7, 0xa1, 0xe1, 0xa2, 0x3d, + 0x38, 0xd1, 0x99, 0x90, 0x79, 0x87, 0x59, 0x41, 0x3d, 0x74, 0x66, 0x4b, + 0x38, 0x7f, 0xc2, 0xd3, 0x55, 0xac, 0x35, 0xc8, 0x71, 0x3d, 0x4f, 0xb0, + 0x8d, 0xbd, 0x17, 0x58, 0x87, 0xf7, 0x86, 0xf9, 0xfd, 0x0a, 0xdc, 0x4c, + 0x1c, 0xdd, 0x1c, 0x7c, 0x54, 0x29, 0xec, 0xb7, 0x95, 0x63, 0xd9, 0x68, + 0x1d, 0xf1, 0x51, 0xd6, 0x34, 0x1e, 0x51, 0xdc, 0xb5, 0x32, 0xfe, 0x02, + 0x47, 0x80, 0x7a, 0x05, 0xd6, 0x8c, 0x32, 0x64, 0xdb, 0xfb, 0x13, 0x6d, + 0x78, 0x3a, 0x74, 0x05, 0x6e, 0xb2, 0x79, 0x50, 0x00, 0x57, 0x8f, 0x0b, + 0x86, 0x76, 0x2b, 0x23, 0xc4, 0x4e, 0x26, 0x23, 0xf0, 0xea, 0x51, 0x25, + 0x45, 0xcc, 0xdc, 0x6b, 0xfb, 0x08, 0xb4, 0x1a, 0x3e, 0x4b, 0x66, 0x2a, + 0x38, 0x0e, 0xdb, 0x76, 0x2f, 0xca, 0xb8, 0x90, 0x32, 0x9e, 0x23, 0x16, + 0x5d, 0x37, 0x2b, 0xe3, 0x92, 0xe5, 0x97, 0x31, 0xcf, 0x15, 0x19, 0xcb, + 0xa1, 0xb3, 0xaf, 0x3a, 0x3b, 0xc7, 0xb0, 0xb0, 0xc3, 0xa8, 0xc5, 0xf7, + 0xb4, 0xb9, 0xb2, 0xec, 0xa5, 0x6f, 0xd5, 0xa1, 0x52, 0xff, 0xb5, 0xe5, + 0xe0, 0x18, 0x86, 0x47, 0xe4, 0x9e, 0x0f, 0x87, 0x56, 0x5c, 0x81, 0xa1, + 0xfd, 0xe5, 0x68, 0x26, 0x96, 0x2f, 0x1d, 0xd5, 0xb5, 0xd5, 0x8a, 0xc8, + 0x47, 0x1d, 0x8c, 0xdb, 0xeb, 0x08, 0xd4, 0xe1, 0x6b, 0x65, 0x9f, 0xb4, + 0x5d, 0x27, 0x31, 0xb4, 0x60, 0xb7, 0xb6, 0xcf, 0x2e, 0x16, 0x9b, 0x95, + 0x35, 0x43, 0xda, 0x70, 0xc6, 0x81, 0xb5, 0x94, 0xe1, 0xb8, 0x71, 0x8f, + 0x62, 0x6a, 0x63, 0x17, 0x64, 0x9f, 0x5d, 0xa5, 0x5c, 0xbd, 0xe9, 0x2b, + 0xf0, 0x85, 0xd1, 0xbc, 0xe5, 0xd2, 0x57, 0x21, 0x13, 0x0c, 0x74, 0x0d, + 0x29, 0x2e, 0xec, 0x4c, 0x3b, 0xb0, 0x7a, 0x94, 0xfc, 0xcd, 0xb8, 0x4b, + 0x91, 0xb5, 0x4e, 0xe1, 0xa8, 0x6d, 0x09, 0xe6, 0xa7, 0x39, 0xc9, 0x17, + 0x3b, 0xee, 0x68, 0x8b, 0x7f, 0x51, 0x89, 0x6a, 0xe2, 0x13, 0x47, 0xbf, + 0xaa, 0x92, 0x6b, 0x0d, 0x10, 0xcb, 0x5e, 0x3f, 0x28, 0xbe, 0xa0, 0x10, + 0x03, 0x3d, 0xb4, 0xe5, 0x96, 0x59, 0x7f, 0x68, 0xa0, 0x3f, 0xd4, 0xe3, + 0xc6, 0xdd, 0x11, 0xbc, 0x78, 0x90, 0x7e, 0xb1, 0xfb, 0x06, 0xbc, 0xc1, + 0x72, 0xd3, 0x8c, 0x01, 0xd3, 0x13, 0x75, 0xbc, 0x3c, 0xbc, 0xea, 0x79, + 0xdd, 0x4d, 0x0c, 0x12, 0xff, 0x70, 0x30, 0x56, 0xab, 0x18, 0x35, 0x14, + 0xdc, 0x76, 0xb5, 0x8c, 0xc7, 0x85, 0x4d, 0x8b, 0x2f, 0xd9, 0xc2, 0xda, + 0x84, 0xf0, 0x36, 0x97, 0x29, 0xe7, 0x0b, 0x26, 0xe9, 0x8b, 0x37, 0x92, + 0x77, 0x3d, 0x9e, 0xea, 0x24, 0x06, 0x5b, 0x58, 0x14, 0x3c, 0x82, 0xf5, + 0xda, 0x90, 0xe4, 0xb9, 0xf6, 0xbe, 0x41, 0x92, 0x73, 0x37, 0x53, 0xd2, + 0x6c, 0xce, 0x43, 0x79, 0xd4, 0x1b, 0x09, 0x68, 0x47, 0xd0, 0x81, 0xd4, + 0x34, 0x34, 0x8d, 0xdc, 0x69, 0x07, 0xb9, 0xd3, 0x20, 0xb9, 0x53, 0x6f, + 0xe6, 0x08, 0xe7, 0xb5, 0xc4, 0x25, 0xfb, 0xd7, 0x3b, 0xa8, 0xbb, 0x35, + 0x36, 0x0f, 0x72, 0x99, 0xe5, 0x6c, 0xff, 0x04, 0xe3, 0xd0, 0xaa, 0x91, + 0x4e, 0xe1, 0x04, 0xf8, 0x78, 0xf9, 0x61, 0xe8, 0xf3, 0x86, 0xe8, 0xe7, + 0x85, 0xb6, 0x9f, 0x10, 0x3e, 0x56, 0x52, 0x1d, 0xad, 0x8e, 0x04, 0xb6, + 0xbe, 0x4a, 0x3e, 0xe6, 0x62, 0x9b, 0x03, 0xb3, 0xfb, 0x12, 0xc3, 0x6c, + 0x73, 0x88, 0x75, 0x9b, 0x47, 0x4c, 0xcb, 0x4d, 0x4c, 0x74, 0xea, 0x01, + 0xef, 0x03, 0x8a, 0xc1, 0xba, 0x76, 0x5e, 0x81, 0xc6, 0xfd, 0x97, 0xe6, + 0xaa, 0x93, 0xb8, 0x22, 0x76, 0x53, 0x23, 0x76, 0x93, 0xbd, 0x02, 0x81, + 0x51, 0x8d, 0x71, 0x6f, 0x3b, 0x7c, 0xb4, 0x53, 0xc7, 0x6c, 0x5f, 0x83, + 0x32, 0x0e, 0xe7, 0xc2, 0xe8, 0x42, 0xf6, 0x91, 0xca, 0x04, 0xb4, 0x1e, + 0x34, 0x9f, 0x9c, 0x07, 0x19, 0x87, 0xf4, 0xd7, 0x81, 0x7d, 0xd3, 0x9f, + 0x1e, 0x47, 0x03, 0x31, 0xea, 0x27, 0xa5, 0x05, 0xbb, 0x38, 0x6f, 0xe7, + 0xe6, 0x51, 0xdb, 0xaf, 0x1e, 0xb7, 0xe5, 0x2f, 0x61, 0x9b, 0x39, 0xb6, + 0x99, 0xb7, 0xcf, 0x5e, 0x9a, 0xe4, 0xb6, 0x0d, 0x94, 0x43, 0x89, 0xd6, + 0x46, 0x9a, 0xbb, 0xe7, 0x21, 0x10, 0xfe, 0x2e, 0xdb, 0x9e, 0xc7, 0xb6, + 0x0f, 0xb3, 0xed, 0x24, 0xdb, 0x9e, 0x62, 0xdb, 0x5f, 0xbf, 0xd8, 0xb6, + 0x4a, 0xae, 0x54, 0xb4, 0x2d, 0x27, 0xc2, 0xcb, 0x0f, 0x00, 0xf3, 0x64, + 0xcf, 0xb5, 0x81, 0x73, 0x2f, 0xba, 0xf3, 0x31, 0xae, 0x17, 0xec, 0x6d, + 0x15, 0xe3, 0xcd, 0xad, 0xbb, 0x15, 0xbc, 0x1d, 0x3c, 0x83, 0x19, 0x4f, + 0x81, 0x3b, 0x14, 0x6d, 0x48, 0xa3, 0x0d, 0x69, 0x89, 0x1f, 0xc8, 0xf2, + 0x10, 0xeb, 0x88, 0xfd, 0xc8, 0x7e, 0x04, 0x39, 0x73, 0x5c, 0xf4, 0x91, + 0xba, 0xf0, 0x78, 0x32, 0x70, 0xf2, 0x2d, 0xc6, 0xcb, 0x6f, 0x66, 0x4a, + 0x90, 0x4e, 0xbb, 0x71, 0x98, 0x6d, 0x7a, 0x59, 0xc7, 0x9b, 0x14, 0x8c, + 0x27, 0xf7, 0x9b, 0x38, 0xfa, 0xa8, 0x97, 0x95, 0x0f, 0xd3, 0x7e, 0x0e, + 0xd3, 0x7e, 0x0e, 0x4f, 0xb8, 0x71, 0xcd, 0xa4, 0x8b, 0x5c, 0x2d, 0x8c, + 0xe1, 0xa4, 0xc4, 0xc8, 0x16, 0x5c, 0x4d, 0x6e, 0x75, 0x68, 0x98, 0xb1, + 0x98, 0x31, 0xbf, 0x29, 0xa7, 0x61, 0xe7, 0x48, 0x2d, 0xfd, 0x48, 0xe2, + 0x6e, 0x2d, 0xee, 0x4f, 0xb9, 0xb0, 0x74, 0xbf, 0xec, 0x7b, 0xd6, 0xa1, + 0x3d, 0x75, 0x0b, 0x26, 0x6c, 0xbf, 0x9e, 0x47, 0xff, 0xa8, 0xc3, 0xe2, + 0x71, 0xf9, 0x4e, 0xce, 0x46, 0x9b, 0x5d, 0x35, 0x59, 0xcf, 0xf1, 0xde, + 0x80, 0xeb, 0x26, 0x85, 0xa3, 0x78, 0x10, 0xce, 0xdd, 0x7a, 0x41, 0x70, + 0x78, 0x70, 0x7a, 0x6e, 0x1c, 0x13, 0x3f, 0xb4, 0x71, 0x2b, 0x5c, 0xc4, + 0xad, 0x4b, 0xcf, 0xe7, 0x62, 0xe3, 0xfb, 0x7c, 0x26, 0x65, 0x8a, 0xf1, + 0x66, 0x2e, 0x16, 0x5e, 0xc2, 0xa4, 0xd6, 0x51, 0xf9, 0xd4, 0xd0, 0xb5, + 0x52, 0x7c, 0xfd, 0x0a, 0x84, 0x6d, 0x79, 0x6e, 0xad, 0x90, 0xf3, 0x13, + 0xc2, 0x13, 0x0a, 0x7e, 0xe9, 0x90, 0xf3, 0x0a, 0x36, 0xdf, 0xbd, 0x79, + 0x77, 0x0b, 0x76, 0x72, 0xfc, 0x1d, 0xf4, 0x1b, 0x77, 0x30, 0x6a, 0x99, + 0xb5, 0x92, 0xb7, 0xd6, 0xe1, 0x96, 0xdd, 0x1e, 0xc6, 0x1a, 0xf2, 0x80, + 0x89, 0xcf, 0xb0, 0x2e, 0x39, 0xc0, 0x6c, 0x3e, 0x3f, 0x98, 0xbc, 0xc5, + 0xba, 0xd7, 0xde, 0xf3, 0x97, 0xb5, 0xff, 0xe3, 0xb7, 0xbb, 0x02, 0x79, + 0x1f, 0xf3, 0x79, 0x83, 0x79, 0x05, 0x39, 0xd6, 0x49, 0x04, 0xea, 0x98, + 0x9f, 0xeb, 0x35, 0x58, 0xcd, 0x7c, 0xfe, 0x5e, 0x8f, 0x3c, 0x0b, 0x49, + 0xdf, 0x76, 0xf9, 0x4b, 0x63, 0xda, 0x39, 0x67, 0x4c, 0xcd, 0x61, 0xda, + 0xe3, 0x2c, 0x17, 0xfc, 0xb5, 0xf5, 0x86, 0x0e, 0xe5, 0xa1, 0x40, 0x0f, + 0x96, 0xb6, 0xfa, 0x53, 0x37, 0x2a, 0xba, 0xb6, 0x5c, 0x25, 0x54, 0x65, + 0x5f, 0xc7, 0xda, 0xdc, 0xf7, 0x11, 0xcd, 0xdd, 0xee, 0x12, 0x59, 0xba, + 0x72, 0x1b, 0x91, 0xcf, 0xc8, 0x9e, 0x63, 0xf4, 0x8e, 0x57, 0x87, 0xdd, + 0x72, 0xce, 0x50, 0x69, 0x59, 0xd1, 0x84, 0x0f, 0xc9, 0x65, 0x3a, 0x13, + 0xaf, 0x23, 0x95, 0x15, 0xd9, 0xbf, 0x8f, 0x61, 0x62, 0x48, 0x47, 0xe2, + 0xd7, 0x56, 0x59, 0x60, 0xc4, 0xae, 0x37, 0x98, 0x7d, 0xe6, 0x42, 0xea, + 0x52, 0x0c, 0xd2, 0xca, 0xf4, 0x63, 0x9f, 0xc2, 0xbf, 0x96, 0xf6, 0xbe, + 0x78, 0xf6, 0xff, 0x96, 0x44, 0x7e, 0xf2, 0xbf, 0x9e, 0x0b, 0x15, 0xec, + 0xd0, 0x97, 0x49, 0xe1, 0x61, 0x3b, 0x2e, 0x6e, 0x7a, 0xc0, 0x19, 0xd9, + 0xf6, 0xa8, 0xac, 0x85, 0x6e, 0xb2, 0xd7, 0x09, 0x36, 0xe2, 0x89, 0x3d, + 0xeb, 0xd0, 0xb7, 0x47, 0xb0, 0xb4, 0xb9, 0x63, 0xb5, 0xb2, 0x80, 0x7e, + 0x37, 0x6a, 0xe7, 0x2b, 0x4e, 0xfd, 0x4d, 0x59, 0x73, 0x55, 0x4b, 0xec, + 0x3d, 0x30, 0x1f, 0x36, 0x65, 0x0b, 0x6d, 0x2d, 0xca, 0x54, 0xd1, 0x9f, + 0xc2, 0x48, 0x30, 0x2f, 0x71, 0x33, 0x3e, 0x3a, 0x99, 0xcb, 0xbe, 0x32, + 0x22, 0xb1, 0x45, 0x81, 0xfb, 0x76, 0xc5, 0x3e, 0x63, 0x58, 0xe4, 0xe4, + 0x51, 0xad, 0x8f, 0xbf, 0x7b, 0x2a, 0x0a, 0x72, 0xf5, 0x7d, 0x8a, 0xfb, + 0x14, 0xe7, 0x5f, 0x74, 0x57, 0xb4, 0x99, 0x77, 0x38, 0x06, 0xe6, 0xd8, + 0xba, 0x6b, 0x8e, 0xff, 0xfe, 0xbc, 0xdc, 0x5e, 0x17, 0xcc, 0xcd, 0x8d, + 0xe1, 0x83, 0xb3, 0xba, 0xaf, 0xad, 0x28, 0xc6, 0x9f, 0x82, 0xbc, 0x06, + 0xb1, 0xcf, 0x83, 0xa8, 0xa7, 0xe8, 0xef, 0x5b, 0xf8, 0xbc, 0x4f, 0x7c, + 0x7e, 0xb6, 0xee, 0x9a, 0x4a, 0x54, 0x0c, 0xda, 0x3c, 0xed, 0x52, 0xfb, + 0x03, 0x15, 0x9f, 0x6c, 0x7f, 0xae, 0xbd, 0x4a, 0xfb, 0x12, 0x8b, 0x6d, + 0x1c, 0x96, 0x75, 0x58, 0xd3, 0x1d, 0xe9, 0xb4, 0xf7, 0x66, 0x2a, 0xc8, + 0x87, 0x7b, 0x99, 0x1b, 0x55, 0xee, 0xe7, 0x77, 0x72, 0x9a, 0x9b, 0x46, + 0xbd, 0x28, 0xdf, 0x5f, 0x42, 0xec, 0x5e, 0x00, 0xe7, 0xfe, 0x52, 0xda, + 0xa8, 0xc4, 0xfe, 0xe3, 0xb7, 0xf7, 0xeb, 0x97, 0xc3, 0xb1, 0xbf, 0x8c, + 0x7c, 0x5b, 0x38, 0x79, 0xfe, 0xf6, 0xcd, 0x8c, 0x6d, 0xea, 0x7e, 0x17, + 0xe3, 0x6e, 0x03, 0x4a, 0x18, 0xd7, 0xd6, 0x8e, 0x7e, 0x06, 0xa5, 0xfb, + 0x2b, 0x70, 0xf7, 0xe8, 0x95, 0x58, 0xb8, 0xbf, 0x12, 0x77, 0x8e, 0x2e, + 0xc4, 0x82, 0xfd, 0x6e, 0x74, 0x31, 0x86, 0x7b, 0xf7, 0x57, 0x61, 0xfd, + 0xa8, 0x1f, 0xb5, 0xfb, 0xab, 0xd1, 0x39, 0xba, 0x08, 0xda, 0xfe, 0x1a, + 0xe6, 0x4a, 0x8d, 0xa8, 0xd9, 0xaf, 0xe1, 0x96, 0x51, 0x1d, 0xd5, 0xfb, + 0x6b, 0x19, 0xb7, 0x02, 0xa8, 0xda, 0xef, 0xc1, 0xba, 0xdd, 0x9c, 0x8f, + 0x83, 0xf5, 0xf4, 0x85, 0x4e, 0x3c, 0x91, 0xec, 0xc2, 0xde, 0xe4, 0x52, + 0x54, 0x1e, 0xf4, 0xe2, 0xa6, 0xdd, 0x79, 0x8d, 0x54, 0x05, 0x6b, 0x02, + 0x2d, 0x28, 0x3f, 0x28, 0x39, 0x9d, 0xff, 0x64, 0x3b, 0xfc, 0xe7, 0x57, + 0xa3, 0x86, 0x39, 0x2d, 0xf0, 0xd6, 0x34, 0xb0, 0x64, 0xda, 0x81, 0x23, + 0x5a, 0x27, 0x06, 0xa6, 0xb7, 0xcc, 0xda, 0xb9, 0xec, 0x19, 0xd5, 0x70, + 0x4e, 0xe5, 0xbb, 0xdc, 0xeb, 0xc2, 0xd0, 0xb4, 0xd8, 0x15, 0x13, 0x80, + 0x0a, 0xb1, 0xa1, 0xe2, 0x3a, 0x98, 0x3f, 0x35, 0x48, 0x0d, 0xe6, 0x33, + 0x52, 0x4e, 0x7c, 0x84, 0x09, 0x5b, 0x4e, 0xe9, 0x95, 0xf3, 0xdf, 0x8e, + 0x88, 0x5a, 0xdd, 0x1b, 0xda, 0x7a, 0x7d, 0x2c, 0xd3, 0xcd, 0xdc, 0x4a, + 0xf2, 0xd4, 0x07, 0xae, 0xdf, 0x94, 0x79, 0xe7, 0xe2, 0x7e, 0x42, 0xca, + 0x68, 0xf3, 0x6a, 0xf8, 0x1c, 0x36, 0xd9, 0x6b, 0xa8, 0x2a, 0xe7, 0x4c, + 0xce, 0xeb, 0xd8, 0x67, 0xc1, 0x69, 0x67, 0x31, 0x18, 0x36, 0x86, 0x6e, + 0x41, 0x63, 0xc6, 0x5e, 0xab, 0x6d, 0x8a, 0xe1, 0x79, 0xb5, 0x43, 0x37, + 0x67, 0xcf, 0x96, 0x98, 0xd7, 0x69, 0x88, 0x1a, 0xda, 0xc5, 0xf3, 0x27, + 0x7e, 0xdf, 0x14, 0xfc, 0xde, 0x1d, 0x88, 0xa1, 0x6f, 0x5a, 0xea, 0x75, + 0x21, 0x60, 0xd7, 0xbf, 0x0b, 0xfa, 0xc5, 0xb3, 0xa5, 0x72, 0x76, 0x5a, + 0xf6, 0xb1, 0x2c, 0xe6, 0xf5, 0x92, 0x0b, 0x1f, 0x51, 0xd4, 0x61, 0x7b, + 0x7d, 0x6c, 0xa3, 0x83, 0x98, 0xdf, 0xae, 0x48, 0x3e, 0x1c, 0xf0, 0xfd, + 0x78, 0x76, 0x6d, 0xa1, 0x24, 0xdb, 0xaf, 0x94, 0x66, 0x87, 0x14, 0x67, + 0xb6, 0xb0, 0xb6, 0xe0, 0x20, 0x57, 0xdd, 0x91, 0xac, 0x63, 0x19, 0x0d, + 0x4b, 0x56, 0x38, 0xc9, 0xf1, 0xab, 0x63, 0x6e, 0x7e, 0x1f, 0x58, 0x51, + 0x8a, 0xfb, 0x69, 0xfb, 0x1d, 0xcb, 0x8e, 0xe3, 0x9d, 0x0c, 0xb9, 0x45, + 0xdc, 0x0c, 0x4e, 0xb0, 0xcf, 0xa3, 0x71, 0x15, 0xc7, 0xc6, 0xfa, 0x83, + 0xe3, 0x76, 0xff, 0xdb, 0xd0, 0x37, 0x25, 0xb9, 0x95, 0xcf, 0x1a, 0x4c, + 0x36, 0x59, 0x12, 0x67, 0x73, 0xf1, 0xba, 0x58, 0x0d, 0xeb, 0xbf, 0xb3, + 0x62, 0x2b, 0x7d, 0xde, 0x85, 0x6c, 0xfc, 0x01, 0xfb, 0x3c, 0x5b, 0x26, + 0xbe, 0x0e, 0x2f, 0x33, 0x5f, 0xfc, 0x5a, 0xbc, 0x03, 0xdf, 0xc9, 0x6c, + 0xc4, 0x4b, 0x63, 0xc2, 0x37, 0xda, 0xd1, 0x16, 0x57, 0x70, 0x53, 0x60, + 0x23, 0x4e, 0x4d, 0x6c, 0xc4, 0xf1, 0x31, 0x39, 0x07, 0x7b, 0x59, 0xf1, + 0x7c, 0x15, 0x9f, 0x47, 0xf9, 0x7c, 0x03, 0x8e, 0x4e, 0x78, 0x71, 0x80, + 0x79, 0xe2, 0x19, 0x62, 0xc8, 0x78, 0xbc, 0x05, 0xa7, 0x99, 0x0f, 0x7d, + 0x93, 0xf1, 0xe0, 0x63, 0xfe, 0x3e, 0x12, 0x97, 0xf5, 0xef, 0x10, 0xce, + 0x67, 0xbe, 0x85, 0xd2, 0xe1, 0x05, 0x38, 0xd1, 0xf9, 0x0d, 0xd2, 0xc5, + 0x23, 0xbc, 0x3a, 0x70, 0x7a, 0xa2, 0x03, 0x6f, 0x8e, 0x7d, 0x1e, 0x6f, + 0x4e, 0xfc, 0x10, 0xef, 0x8c, 0x89, 0xbc, 0x96, 0xa5, 0x06, 0xed, 0x77, + 0x03, 0xd8, 0x2e, 0x71, 0x6a, 0xe2, 0x3f, 0xd3, 0xf6, 0x7b, 0xd6, 0x89, + 0x8d, 0xd2, 0xee, 0x37, 0x7e, 0x4f, 0xdb, 0xa2, 0x4b, 0x89, 0xed, 0x2e, + 0x9c, 0x8a, 0xbb, 0x70, 0x32, 0x9e, 0xbf, 0xaa, 0x1c, 0xf9, 0xeb, 0x98, + 0x51, 0x62, 0x30, 0x53, 0x86, 0x63, 0xcc, 0xfb, 0x36, 0x19, 0x9f, 0x25, + 0x7e, 0x3c, 0x42, 0x9b, 0x2c, 0xc3, 0x77, 0x18, 0xab, 0xee, 0x0f, 0x5e, + 0x47, 0xbc, 0xd7, 0xa9, 0x3f, 0x37, 0x5e, 0x89, 0x7b, 0xf0, 0x6a, 0xbc, + 0x39, 0x96, 0x53, 0x5a, 0x99, 0x1c, 0x14, 0x72, 0xc7, 0xa3, 0xf1, 0x6d, + 0xb6, 0x4c, 0xdf, 0x89, 0xfb, 0xac, 0x01, 0xea, 0x78, 0x28, 0xf9, 0x08, + 0xf3, 0x71, 0x0d, 0x2f, 0xc5, 0xcf, 0x5b, 0xaa, 0x7e, 0x12, 0xcf, 0x50, + 0xa7, 0xa7, 0xe2, 0x31, 0x94, 0x33, 0x17, 0x39, 0x1e, 0xcf, 0x63, 0x22, + 0xb3, 0x1d, 0x67, 0x52, 0xfa, 0xc9, 0x4d, 0xd8, 0x8e, 0x8f, 0xd3, 0x65, + 0x78, 0x83, 0x7d, 0xd4, 0x2c, 0x77, 0x62, 0xc6, 0x6e, 0x6f, 0x3b, 0x3e, + 0x48, 0x29, 0xc8, 0xac, 0xd8, 0x8e, 0xf7, 0xf9, 0xec, 0x35, 0x7e, 0xff, + 0x30, 0x48, 0x09, 0x67, 0x9f, 0xbd, 0x99, 0x12, 0x3e, 0xac, 0xa2, 0x37, + 0xb4, 0x1d, 0xa7, 0xd3, 0xef, 0xe3, 0x00, 0xf3, 0xe5, 0x47, 0x8d, 0x79, + 0x08, 0xcf, 0x23, 0xe0, 0xea, 0x65, 0x38, 0xc5, 0xe7, 0x8b, 0x65, 0x4d, + 0x47, 0x2b, 0x94, 0x7f, 0x8f, 0xe3, 0xb9, 0x9f, 0x6d, 0xbd, 0x9b, 0xfe, + 0x0a, 0xdb, 0x15, 0x8e, 0xf9, 0x15, 0xb6, 0xfb, 0x43, 0x4c, 0xcd, 0xea, + 0xe3, 0xb4, 0x21, 0xe3, 0xfa, 0x63, 0x37, 0x2a, 0x3c, 0x1c, 0xc7, 0x17, + 0xf9, 0xb9, 0x0d, 0x33, 0x99, 0xed, 0xfc, 0x7c, 0x19, 0x87, 0x32, 0x12, + 0xcb, 0x8b, 0x67, 0x93, 0x64, 0x0d, 0x4b, 0xfc, 0xc7, 0x37, 0xbb, 0xf6, + 0x36, 0x1f, 0xc9, 0x91, 0xea, 0xd8, 0x3c, 0xda, 0xd1, 0x7f, 0x5b, 0x59, + 0x83, 0xf7, 0x82, 0xdb, 0xb1, 0xf3, 0x80, 0x93, 0xb9, 0x30, 0xf9, 0xeb, + 0x70, 0x1d, 0x9e, 0xda, 0xa5, 0x61, 0xdf, 0xae, 0xcb, 0xd1, 0xbf, 0xeb, + 0x4a, 0xec, 0xdd, 0xd5, 0x60, 0xe7, 0xc3, 0x1f, 0x2c, 0xb7, 0xac, 0xa5, + 0xbc, 0x1e, 0xa7, 0x2f, 0xb8, 0xf8, 0xf9, 0x62, 0x50, 0xfc, 0x44, 0xc7, + 0x32, 0xdb, 0x5f, 0xda, 0x71, 0x55, 0x81, 0xbb, 0x60, 0x69, 0xa6, 0x3b, + 0xb8, 0x35, 0xb7, 0x3d, 0x78, 0x6f, 0x6e, 0x3e, 0x06, 0x46, 0xea, 0x99, + 0x57, 0xd7, 0xc5, 0xea, 0xd8, 0xcf, 0x86, 0x95, 0x16, 0xc6, 0x59, 0xd7, + 0x68, 0x1d, 0x0a, 0x6e, 0xca, 0x7d, 0x03, 0x9d, 0x39, 0x0f, 0x73, 0x69, + 0x2f, 0xfb, 0xb2, 0xf7, 0x0d, 0x4e, 0x7e, 0x09, 0x96, 0x75, 0x7e, 0xf9, + 0x11, 0xdc, 0x99, 0xfb, 0x16, 0x63, 0x9c, 0x07, 0x89, 0x91, 0x2d, 0xe4, + 0x50, 0xa5, 0x31, 0x57, 0xc4, 0xc2, 0x2b, 0xc1, 0x3c, 0xbe, 0xc0, 0xf6, + 0x9e, 0x18, 0xa9, 0xa6, 0x4c, 0x15, 0xb1, 0x32, 0xde, 0xbb, 0x29, 0xb8, + 0x15, 0x3b, 0xa7, 0x65, 0x9d, 0xef, 0x24, 0x6e, 0x22, 0x47, 0xa9, 0x5d, + 0x71, 0xac, 0x12, 0xd5, 0x9a, 0xf3, 0x5c, 0x48, 0xec, 0x2f, 0x46, 0xfb, + 0x13, 0xdc, 0xdc, 0x82, 0xcd, 0x71, 0x39, 0x5b, 0xd0, 0x85, 0x17, 0xe2, + 0x82, 0xd3, 0x77, 0xe1, 0x20, 0xe7, 0xb2, 0x3f, 0xe9, 0xb3, 0xcf, 0xa1, + 0x37, 0xe6, 0xfe, 0x32, 0x78, 0x0f, 0xe3, 0xa9, 0x23, 0xf7, 0xcf, 0x58, + 0x93, 0x4b, 0x53, 0xae, 0x89, 0xe0, 0xe6, 0xdc, 0xde, 0xe0, 0x97, 0x72, + 0x1d, 0x58, 0x94, 0x93, 0x35, 0xb3, 0x4e, 0xe2, 0xbb, 0xac, 0x99, 0xcd, + 0xa0, 0x2d, 0xf7, 0x26, 0x56, 0xe7, 0xde, 0x60, 0x2c, 0x16, 0xdc, 0x90, + 0xb5, 0xb4, 0x97, 0x9d, 0xa8, 0x90, 0x7d, 0xc3, 0x87, 0x31, 0xb0, 0xe7, + 0x2e, 0xc6, 0xc2, 0x22, 0x46, 0x35, 0x6b, 0x07, 0x04, 0x5f, 0xa6, 0x4b, + 0xec, 0x58, 0x90, 0x4a, 0xde, 0x4e, 0x7b, 0x54, 0xc9, 0xeb, 0x25, 0xce, + 0xc4, 0xe8, 0xcb, 0x8f, 0x90, 0x8f, 0x4b, 0xfc, 0xbb, 0x75, 0xf6, 0xbe, + 0xf0, 0x38, 0x89, 0x7d, 0x3e, 0x1c, 0xcd, 0xd8, 0x7b, 0x19, 0x3e, 0x97, + 0xfe, 0x05, 0x3e, 0x93, 0xfa, 0x0f, 0x23, 0xb1, 0x47, 0xb7, 0x9e, 0xa0, + 0x1c, 0xb2, 0xb7, 0x7f, 0x22, 0xc0, 0xbe, 0xa6, 0x80, 0x9b, 0xf6, 0xc3, + 0x55, 0xc5, 0xb1, 0x65, 0x99, 0xe3, 0x3a, 0x74, 0x9f, 0xd5, 0x9f, 0xc4, + 0x97, 0xaa, 0xe0, 0xc5, 0xba, 0x6c, 0x29, 0xa2, 0x07, 0x2b, 0x70, 0xf3, + 0xae, 0x26, 0xda, 0xb2, 0x49, 0xfb, 0xd5, 0x8d, 0xcd, 0x4a, 0x05, 0xd6, + 0xf2, 0xde, 0xdd, 0x23, 0xfe, 0x0e, 0x20, 0x70, 0xf2, 0xb4, 0xa3, 0x02, + 0x77, 0x32, 0x8e, 0xa4, 0xd3, 0xeb, 0x10, 0xdd, 0x7f, 0x02, 0x66, 0x9a, + 0x36, 0xb9, 0x9b, 0x38, 0xb3, 0xc7, 0x09, 0x35, 0xf2, 0x43, 0xec, 0x9d, + 0x50, 0x51, 0xb3, 0xfb, 0x79, 0xcb, 0xab, 0x2b, 0xfa, 0x87, 0x81, 0x1c, + 0x39, 0x90, 0x13, 0x55, 0x89, 0x76, 0x64, 0x89, 0x35, 0xee, 0x44, 0x14, + 0x99, 0x4c, 0x27, 0xd2, 0xc4, 0x92, 0x34, 0x79, 0x53, 0x65, 0xc2, 0x60, + 0x2c, 0x6f, 0xc2, 0x4e, 0xfa, 0x4b, 0x29, 0xf3, 0xf5, 0x1d, 0x99, 0x1b, + 0x60, 0x4e, 0xdc, 0x82, 0xc1, 0x09, 0x72, 0xa5, 0x89, 0x08, 0xfa, 0x26, + 0x1e, 0x41, 0x5b, 0xf6, 0x24, 0x86, 0x32, 0x31, 0xda, 0xe3, 0xfb, 0x18, + 0x4c, 0x1f, 0xc7, 0x53, 0xa9, 0x1e, 0xe6, 0x04, 0xc7, 0xb1, 0x8f, 0xdf, + 0x53, 0x29, 0xbd, 0xdb, 0xab, 0x1e, 0x47, 0x32, 0xbd, 0x1d, 0xb7, 0x8c, + 0x28, 0x78, 0x85, 0xb6, 0xfe, 0x85, 0xfd, 0xb4, 0xc5, 0x27, 0xb7, 0xa1, + 0x23, 0xfb, 0x32, 0xe2, 0x99, 0x17, 0x98, 0x4f, 0x6d, 0xc5, 0x50, 0x72, + 0x0b, 0xb9, 0xd7, 0x37, 0xd8, 0xce, 0x11, 0xfa, 0x79, 0x37, 0xc7, 0xf8, + 0x18, 0xaf, 0x8b, 0x18, 0xae, 0xf9, 0x94, 0x22, 0x56, 0x3f, 0x22, 0xfa, + 0x2d, 0x15, 0x3d, 0xef, 0x48, 0x76, 0x54, 0xd9, 0x67, 0xab, 0xf5, 0xe2, + 0xba, 0xb3, 0xcc, 0x45, 0x71, 0x6d, 0xdc, 0x89, 0xf2, 0x84, 0xac, 0x39, + 0xe7, 0xfd, 0xe5, 0xe4, 0x00, 0xae, 0x84, 0xe8, 0xb0, 0xc9, 0xea, 0x4d, + 0x0a, 0x96, 0x14, 0xb8, 0xf8, 0x8b, 0x99, 0x1f, 0x62, 0x60, 0x6c, 0x1e, + 0x56, 0xa7, 0x1a, 0x10, 0xf3, 0x58, 0xd6, 0xb3, 0xf4, 0xb5, 0x38, 0x73, + 0xaa, 0x9d, 0x23, 0x51, 0x62, 0x4a, 0x25, 0x0a, 0xb9, 0x9d, 0xe8, 0xc6, + 0x6f, 0xf8, 0x3e, 0xb1, 0x47, 0xb2, 0x88, 0xf3, 0x26, 0x5c, 0x35, 0x7f, + 0x55, 0x15, 0x4e, 0x57, 0x16, 0xd6, 0xbe, 0x37, 0x5f, 0xe4, 0x36, 0xff, + 0xb1, 0xf2, 0x5f, 0xfc, 0x4f, 0x96, 0x9f, 0x7b, 0x36, 0xae, 0xf8, 0x5e, + 0x8d, 0x8c, 0xf5, 0x4a, 0x79, 0xb7, 0xc7, 0x14, 0x1e, 0x42, 0xdc, 0xc4, + 0x89, 0x78, 0x29, 0xe3, 0xa4, 0xba, 0xaa, 0x04, 0xaa, 0xa7, 0x04, 0x65, + 0x8c, 0x67, 0xf5, 0xe8, 0xf3, 0x58, 0x58, 0x63, 0x94, 0xe2, 0x50, 0x4b, + 0x54, 0xce, 0x59, 0x74, 0x95, 0xd8, 0x6b, 0xd3, 0x2d, 0xb7, 0xfd, 0xe6, + 0xda, 0x74, 0x37, 0xb9, 0x9b, 0xac, 0x65, 0x74, 0xe2, 0x95, 0x5a, 0x79, + 0xd7, 0xa7, 0x9b, 0x76, 0xac, 0xa0, 0x7c, 0x31, 0x7d, 0x3a, 0xe8, 0xc3, + 0x49, 0xbd, 0xd9, 0x57, 0xa7, 0x32, 0x9e, 0x2b, 0x67, 0x2d, 0xd3, 0x13, + 0x66, 0xdc, 0x97, 0x33, 0x14, 0xbf, 0x6b, 0x9f, 0xe2, 0x4f, 0x30, 0xf8, + 0x64, 0x08, 0x33, 0x1b, 0x25, 0xfe, 0xa7, 0xdc, 0x45, 0x4e, 0xb7, 0x23, + 0x79, 0xa8, 0x4a, 0xce, 0x25, 0x49, 0xdb, 0x83, 0xcc, 0x97, 0x4a, 0xf4, + 0x20, 0xce, 0x0a, 0x4b, 0xb3, 0xf7, 0x93, 0x0a, 0xfc, 0xa2, 0x4c, 0x3f, + 0x3d, 0xfb, 0x2e, 0xcc, 0xd3, 0x55, 0xc2, 0x0f, 0x77, 0x24, 0xbb, 0xc9, + 0xcd, 0x45, 0x9e, 0x5f, 0x58, 0x9b, 0x3c, 0x75, 0x2c, 0xbb, 0x66, 0xb6, + 0x3d, 0xb1, 0x05, 0x39, 0x93, 0x23, 0xf7, 0xa4, 0x8e, 0xe8, 0x6c, 0x6e, + 0x1d, 0x07, 0x73, 0xdf, 0xab, 0xf0, 0x10, 0x7d, 0x70, 0xa1, 0xfe, 0xaa, + 0xd5, 0x23, 0xe7, 0x67, 0x16, 0x6b, 0x73, 0xfa, 0x7a, 0xc1, 0x96, 0xa5, + 0x8c, 0xb2, 0x8c, 0x24, 0xe5, 0xac, 0xeb, 0xc7, 0xd6, 0xe2, 0x7a, 0x79, + 0xfe, 0xee, 0x6c, 0xfb, 0x8d, 0xf6, 0xd9, 0xc1, 0xbd, 0xc9, 0xa2, 0xdc, + 0xb2, 0xa6, 0xea, 0x29, 0xf6, 0xd5, 0x74, 0x69, 0x3c, 0x22, 0xdb, 0x86, + 0xaa, 0x4f, 0xca, 0xfc, 0x51, 0x65, 0xf1, 0x4c, 0xec, 0x02, 0xbb, 0x4e, + 0xb1, 0x4f, 0x91, 0xb1, 0x9b, 0x79, 0xe9, 0xa7, 0xc7, 0xa8, 0xce, 0x19, + 0x93, 0xd4, 0x91, 0x71, 0x69, 0xb3, 0x76, 0x60, 0xb1, 0x8c, 0xd4, 0x11, + 0xee, 0xaa, 0xd9, 0x1c, 0xbc, 0x46, 0x78, 0xb9, 0xd8, 0x46, 0xb5, 0x65, + 0xbd, 0x65, 0xc7, 0xcc, 0xa7, 0xed, 0x32, 0x23, 0xd3, 0x3a, 0xed, 0xdc, + 0xea, 0x21, 0x7e, 0x5a, 0x6f, 0x85, 0xbc, 0x18, 0x88, 0x8b, 0xae, 0x75, + 0xef, 0x24, 0xb1, 0xa3, 0xcf, 0xe6, 0x1b, 0x25, 0xe8, 0x4d, 0x17, 0xf7, + 0x47, 0xcb, 0x64, 0xef, 0xc8, 0x2b, 0x3a, 0xef, 0x35, 0xc8, 0xb3, 0xb4, + 0x36, 0x9f, 0x93, 0x5c, 0xe9, 0x1e, 0xfc, 0x8a, 0xf3, 0x2b, 0xe7, 0x9b, + 0x0b, 0x7b, 0x95, 0x31, 0xda, 0x51, 0x21, 0x5e, 0x81, 0xf1, 0x9d, 0x3c, + 0x69, 0xf6, 0xdc, 0x67, 0x6f, 0xe6, 0x57, 0x56, 0xde, 0x3e, 0xf7, 0x79, + 0xe9, 0x5d, 0x8f, 0xb4, 0x66, 0x59, 0x07, 0xf8, 0xec, 0xd2, 0x19, 0x50, + 0xc6, 0x74, 0x5d, 0xce, 0x8a, 0xfe, 0x92, 0x73, 0x37, 0xb7, 0x6c, 0xbe, + 0xb6, 0x70, 0x26, 0x3a, 0xaa, 0xb6, 0xe9, 0x45, 0x5c, 0xf5, 0x9b, 0xa6, + 0x8d, 0xab, 0xab, 0xaa, 0x0b, 0xfb, 0x54, 0xfe, 0x8e, 0x4e, 0x98, 0x56, + 0x85, 0x5e, 0xc4, 0x01, 0xdd, 0x58, 0xaa, 0xf4, 0x60, 0x49, 0x50, 0xde, + 0xb9, 0x82, 0xdf, 0x19, 0xf1, 0x6b, 0x72, 0xd6, 0xfb, 0xb8, 0xbd, 0x57, + 0x2a, 0xd8, 0xa0, 0xe3, 0x9e, 0x8c, 0x4e, 0x9b, 0x95, 0x77, 0x15, 0xe5, + 0xbb, 0xdd, 0x3e, 0xbf, 0x0b, 0x96, 0x76, 0x11, 0x4b, 0xcd, 0xff, 0x5a, + 0x62, 0xb7, 0xe7, 0xef, 0x9a, 0x50, 0xfc, 0x1d, 0x0f, 0x28, 0xc5, 0xf6, + 0xdc, 0xbf, 0xa5, 0xbd, 0x26, 0xd6, 0xf7, 0xcd, 0xbe, 0x1f, 0xa8, 0xb3, + 0x8d, 0x4f, 0xef, 0x27, 0xcf, 0x8f, 0xc9, 0x7e, 0xd3, 0xa1, 0x59, 0x4e, + 0x78, 0xfc, 0x37, 0xf6, 0x9b, 0x7e, 0x6b, 0x9f, 0x51, 0xf6, 0xd9, 0x51, + 0xa1, 0x44, 0xc9, 0x18, 0x7a, 0x50, 0x16, 0x0c, 0x34, 0xbd, 0x28, 0x87, + 0x24, 0x23, 0x01, 0xef, 0x84, 0xbd, 0xa7, 0x6b, 0xb8, 0x56, 0x67, 0x0a, + 0xfe, 0x63, 0x4e, 0xff, 0x7e, 0x9d, 0x54, 0xea, 0x7a, 0x67, 0xf3, 0xc5, + 0x33, 0xef, 0xf0, 0x95, 0x46, 0x8a, 0x3a, 0x0a, 0x34, 0xbd, 0xc3, 0xf9, + 0x3c, 0x1a, 0x0a, 0x78, 0xc7, 0xed, 0x33, 0xa2, 0xa2, 0x17, 0xc3, 0x55, + 0x98, 0x7b, 0x5d, 0xf8, 0xb6, 0x59, 0xc2, 0xd8, 0x39, 0x15, 0x77, 0x71, + 0x2c, 0xcd, 0xda, 0x20, 0x6a, 0x69, 0xe3, 0x88, 0xf6, 0xb5, 0x10, 0xbf, + 0xe3, 0x88, 0x3a, 0x96, 0xd5, 0x20, 0x46, 0x02, 0xed, 0xd0, 0x63, 0xe4, + 0x44, 0xcd, 0x4d, 0x8f, 0xd3, 0x7e, 0xd3, 0x1e, 0xbf, 0xd7, 0x24, 0x7f, + 0x3e, 0x16, 0x6f, 0xfb, 0x63, 0x07, 0x4c, 0xa3, 0x92, 0x13, 0x5d, 0x11, + 0x49, 0xdf, 0xf6, 0xf9, 0x80, 0xdf, 0xf7, 0xd2, 0xec, 0x9e, 0x74, 0x6f, + 0xfc, 0x67, 0xf2, 0x7e, 0x13, 0xeb, 0xfd, 0xbe, 0x32, 0xd2, 0xb7, 0x0b, + 0x93, 0xa9, 0x21, 0xf4, 0x3f, 0x49, 0x19, 0x75, 0x0b, 0x6d, 0x46, 0x0f, + 0x73, 0x69, 0x37, 0xb6, 0x68, 0x4b, 0xc2, 0x2a, 0xcb, 0x8d, 0xa7, 0x0b, + 0x6b, 0x8b, 0x03, 0xf6, 0x9e, 0xb7, 0xc9, 0x7c, 0xc5, 0x8e, 0x9f, 0x9a, + 0x2b, 0x12, 0x55, 0x9e, 0xc8, 0xb4, 0x2b, 0x8f, 0xa7, 0xa5, 0xad, 0x6e, + 0x65, 0x28, 0x73, 0xbc, 0x1a, 0x15, 0x26, 0x4e, 0x1b, 0x6f, 0xcc, 0xe2, + 0x62, 0x3f, 0xf3, 0xb0, 0xe2, 0x7b, 0x92, 0x85, 0xf3, 0x68, 0xcf, 0x92, + 0x0b, 0x3d, 0xc9, 0x5c, 0xf4, 0xce, 0x84, 0x09, 0x2d, 0xf2, 0x13, 0xab, + 0x3a, 0x02, 0x3c, 0x9a, 0xd3, 0xd1, 0x95, 0xa8, 0x40, 0x6c, 0xdc, 0xb2, + 0x5e, 0x21, 0x57, 0xef, 0xce, 0xb5, 0x30, 0x8f, 0x7a, 0xca, 0xaa, 0xa4, + 0xbf, 0xdc, 0xbf, 0xc2, 0x8d, 0x87, 0xc6, 0xdd, 0xf8, 0x33, 0xc6, 0x40, + 0x57, 0xa4, 0x92, 0xdf, 0x03, 0xb1, 0x73, 0x9c, 0xaf, 0x61, 0x45, 0x0f, + 0x2f, 0x55, 0xe4, 0xbd, 0x02, 0x37, 0xbe, 0x94, 0x93, 0x75, 0x30, 0x2f, + 0x62, 0x39, 0x0b, 0x4e, 0xea, 0xfc, 0x1e, 0xd6, 0x5f, 0x9d, 0xb0, 0x2c, + 0xc9, 0x9b, 0x63, 0x93, 0xfa, 0xf9, 0x4d, 0xf4, 0xcf, 0x9e, 0x9c, 0xcb, + 0xee, 0x33, 0x95, 0x94, 0x75, 0x06, 0x1f, 0xfb, 0x74, 0x63, 0x7d, 0xc2, + 0x5a, 0xf5, 0x46, 0xd0, 0x7c, 0xd4, 0x0b, 0x1d, 0x0f, 0xe5, 0x24, 0x7f, + 0xf7, 0xb3, 0x6d, 0x05, 0xdf, 0x09, 0x36, 0xe1, 0xc1, 0x9c, 0x17, 0x9f, + 0x4f, 0x1c, 0xfd, 0x9c, 0x1b, 0xe6, 0xcd, 0x95, 0x68, 0xc1, 0xfd, 0xf6, + 0xfe, 0x9a, 0x3f, 0x5c, 0xae, 0x34, 0xe0, 0xde, 0x49, 0x83, 0x7d, 0xaa, + 0x58, 0xc3, 0x76, 0xda, 0x13, 0x57, 0xe2, 0x9e, 0xc9, 0x10, 0xb6, 0xe4, + 0x96, 0x33, 0x87, 0x14, 0x1e, 0x4c, 0x2e, 0xb0, 0x11, 0xb8, 0x71, 0xd4, + 0x7e, 0x07, 0x44, 0x59, 0x1d, 0xca, 0xa3, 0x87, 0x3c, 0xbc, 0x27, 0x27, + 0xf7, 0x18, 0xab, 0x93, 0x06, 0x5e, 0x4c, 0x2f, 0x67, 0x3e, 0xa9, 0x62, + 0x42, 0x7c, 0xbd, 0x53, 0xe1, 0x58, 0x75, 0xc6, 0x5a, 0xb1, 0x1f, 0x03, + 0x15, 0x23, 0x81, 0x8e, 0x9b, 0x15, 0x83, 0xb9, 0x69, 0xe1, 0x7e, 0x2a, + 0xf9, 0xbc, 0xe5, 0xd6, 0x7f, 0x64, 0x39, 0x89, 0xc9, 0xb5, 0xe3, 0x3a, + 0x86, 0x99, 0xd7, 0x7a, 0x23, 0x26, 0x6a, 0xaf, 0x8d, 0x60, 0x7a, 0xa4, + 0x87, 0x3c, 0x37, 0x82, 0xdc, 0x7e, 0x1d, 0x8f, 0x27, 0x23, 0x68, 0x1e, + 0xd1, 0x19, 0x3b, 0x22, 0x58, 0xca, 0xdf, 0x4f, 0x11, 0xfb, 0xb7, 0x26, + 0x22, 0x78, 0x8b, 0x73, 0x5a, 0xb6, 0x2c, 0x5a, 0x5b, 0x06, 0x9d, 0x3e, + 0x24, 0xf6, 0x17, 0xc1, 0x19, 0x82, 0xc1, 0x20, 0xf5, 0x70, 0xe7, 0xee, + 0x56, 0x7c, 0x3c, 0x21, 0xba, 0xdb, 0x8e, 0xab, 0x47, 0x1d, 0x38, 0x6c, + 0x34, 0x76, 0x6b, 0x70, 0xe0, 0x83, 0xa0, 0x5f, 0xcb, 0xd2, 0xc6, 0x5e, + 0x0e, 0xaa, 0x30, 0xe7, 0x87, 0xb0, 0x96, 0x72, 0xad, 0xb5, 0xdf, 0x69, + 0x31, 0xb1, 0x9a, 0x1c, 0xba, 0x87, 0x3c, 0xfc, 0x79, 0xc8, 0x5a, 0x9a, + 0x0a, 0x5c, 0xe6, 0xa4, 0xcd, 0xc8, 0x3b, 0x9f, 0x3a, 0x31, 0x59, 0xb5, + 0xdf, 0x9b, 0x94, 0xf7, 0x86, 0x17, 0x1c, 0x58, 0xc5, 0xdc, 0x57, 0x67, + 0xec, 0x72, 0x31, 0x07, 0x37, 0xb1, 0x73, 0x85, 0x82, 0xd7, 0x28, 0xd7, + 0x48, 0x72, 0x15, 0x73, 0x60, 0xc9, 0xe7, 0x55, 0x2c, 0x9b, 0xbc, 0x0b, + 0xf7, 0xef, 0xfa, 0xab, 0x6a, 0xc1, 0xcb, 0xce, 0xa0, 0x79, 0xb3, 0xca, + 0xbc, 0xce, 0x50, 0xd0, 0x46, 0x1f, 0xa6, 0xbf, 0x38, 0x11, 0xc8, 0x85, + 0x59, 0x4e, 0x27, 0xf6, 0x7a, 0xc9, 0xff, 0x29, 0x47, 0xa2, 0x01, 0x93, + 0xcc, 0x0b, 0xd2, 0xe4, 0x3d, 0x69, 0xe6, 0x31, 0xe9, 0x89, 0x7a, 0x5e, + 0x3e, 0x5e, 0x8b, 0x78, 0xe9, 0xf6, 0xbd, 0x4d, 0x09, 0x05, 0xd1, 0x4e, + 0xe5, 0x77, 0xbc, 0x13, 0x4b, 0x5b, 0xce, 0x7c, 0xab, 0xba, 0xc0, 0x1f, + 0xe5, 0x5d, 0x2f, 0xb1, 0x7d, 0x13, 0x13, 0x21, 0x79, 0xe7, 0xeb, 0x0f, + 0xbd, 0xef, 0x25, 0xf6, 0xcb, 0xf8, 0x35, 0xf6, 0x18, 0x7a, 0xc7, 0xd6, + 0xdb, 0xe7, 0xe0, 0x4a, 0x74, 0xff, 0x39, 0x13, 0x2f, 0xd7, 0x30, 0x07, + 0x3f, 0x62, 0xe2, 0x0b, 0xd8, 0xa9, 0xc9, 0xbb, 0x4c, 0xa6, 0xc4, 0x7c, + 0x97, 0x97, 0x9c, 0xd7, 0x9b, 0x94, 0x77, 0x7d, 0x60, 0xd6, 0x47, 0xe4, + 0x3c, 0xad, 0x6e, 0xfe, 0x54, 0x69, 0xc1, 0xeb, 0xb9, 0xc7, 0xf0, 0xe1, + 0xee, 0x1e, 0xbc, 0x1f, 0xac, 0x36, 0xab, 0x22, 0x56, 0xcf, 0x77, 0x82, + 0xfe, 0xce, 0x61, 0x25, 0xda, 0x51, 0x09, 0xff, 0xa1, 0xa5, 0x72, 0xfe, + 0x68, 0xb7, 0xac, 0x71, 0x75, 0xc1, 0x35, 0x6c, 0xb2, 0x7d, 0x6b, 0xd5, + 0x2e, 0x43, 0xce, 0xfe, 0x9a, 0xd7, 0xcd, 0x87, 0xff, 0xe4, 0xbd, 0xd0, + 0xcf, 0x07, 0x1c, 0x50, 0xd4, 0x48, 0x20, 0x75, 0xda, 0x21, 0xef, 0xde, + 0xb8, 0xcd, 0x5a, 0x62, 0xe2, 0xf7, 0x72, 0xfe, 0x54, 0xad, 0xa3, 0x0a, + 0x9d, 0xd4, 0x6b, 0x4d, 0xeb, 0xb5, 0xcc, 0x89, 0xfc, 0x7b, 0x67, 0xd4, + 0xc7, 0x70, 0x66, 0xf7, 0x63, 0x78, 0x87, 0xd7, 0xd9, 0xdd, 0xf4, 0x5f, + 0x9d, 0xf1, 0x87, 0x79, 0xef, 0x19, 0x7e, 0x6e, 0x32, 0xf4, 0xf3, 0x13, + 0x36, 0x27, 0x7d, 0x0c, 0x1f, 0x4f, 0x3e, 0x86, 0xb7, 0xd8, 0xa7, 0x87, + 0xf8, 0x33, 0x96, 0xb0, 0x7a, 0xfe, 0xd1, 0xf8, 0x3b, 0x7c, 0xbf, 0x4e, + 0x62, 0x81, 0xac, 0x1f, 0x9a, 0xe4, 0xec, 0xfe, 0xa6, 0xb4, 0x6a, 0x59, + 0xf3, 0x96, 0xfc, 0x85, 0x7d, 0xa6, 0xfa, 0xb6, 0x5c, 0x37, 0xfe, 0x61, + 0xcf, 0x63, 0xf8, 0xfe, 0x1e, 0x0d, 0xbb, 0xea, 0x24, 0xde, 0xb9, 0xec, + 0xb5, 0x30, 0x7d, 0x85, 0xcb, 0xac, 0x20, 0x8e, 0x74, 0x8c, 0x9c, 0xc0, + 0x20, 0xb9, 0xa6, 0x27, 0x28, 0x79, 0x7b, 0xb3, 0xd1, 0xaf, 0x7e, 0xd3, + 0x92, 0x77, 0xcf, 0x76, 0x2e, 0x1e, 0x42, 0x82, 0xb6, 0x18, 0x5f, 0xec, + 0xdf, 0x9a, 0xc0, 0xff, 0xb4, 0x32, 0xf3, 0x45, 0x4f, 0xff, 0xd1, 0x77, + 0xbf, 0xe4, 0x5d, 0xf1, 0xe2, 0xfb, 0x5f, 0x7e, 0x5f, 0x1e, 0x6d, 0xf6, + 0x1a, 0x83, 0xa9, 0x6a, 0xb8, 0x99, 0x5c, 0x78, 0x1d, 0x6d, 0xa4, 0xdf, + 0xc6, 0x24, 0x79, 0xcf, 0x4e, 0xc3, 0xe7, 0xe9, 0x6b, 0x8f, 0xa7, 0xef, + 0xe2, 0xf8, 0x0d, 0xdb, 0x7e, 0x46, 0x92, 0x05, 0x1b, 0xdb, 0x66, 0x98, + 0xab, 0xe5, 0x9c, 0x3d, 0x29, 0x47, 0x5b, 0x59, 0x24, 0xa0, 0x4d, 0xd1, + 0xc6, 0x16, 0x11, 0x3b, 0xee, 0x66, 0x19, 0xd9, 0x17, 0xbc, 0x33, 0xe1, + 0x42, 0xa5, 0xde, 0x80, 0xbb, 0xb3, 0x5e, 0xdc, 0x99, 0x75, 0x23, 0x9a, + 0x25, 0xe8, 0x66, 0xc9, 0xe3, 0x47, 0x25, 0x27, 0x40, 0x5e, 0xce, 0x9e, + 0xbe, 0x6e, 0x78, 0xd0, 0x79, 0xd0, 0x85, 0xae, 0xdd, 0xf5, 0xe8, 0x22, + 0xbf, 0x5f, 0x3f, 0x2a, 0xfe, 0x68, 0xe1, 0x9a, 0x56, 0x1f, 0x6e, 0xe5, + 0xfd, 0x5b, 0x76, 0x43, 0xa9, 0xbd, 0x76, 0x11, 0x6e, 0x61, 0x30, 0x8e, + 0x66, 0x2b, 0x69, 0xeb, 0x16, 0xf3, 0x47, 0x15, 0xeb, 0x0e, 0x2a, 0xb8, + 0x79, 0xbf, 0x81, 0x9b, 0xd8, 0x57, 0x5f, 0x52, 0xf6, 0x4c, 0x5d, 0xb8, + 0x2f, 0x63, 0x60, 0x4b, 0x5a, 0x7c, 0xfc, 0x47, 0x96, 0xec, 0xdf, 0x95, + 0xed, 0xd6, 0x69, 0xf7, 0x01, 0xed, 0x6f, 0xd0, 0x0a, 0x75, 0xb2, 0x15, + 0x0b, 0x47, 0x57, 0x91, 0xb3, 0x47, 0xb1, 0xf8, 0xda, 0x56, 0x94, 0xd2, + 0xf7, 0xe3, 0xd4, 0x97, 0x99, 0xcd, 0xe3, 0x9a, 0x44, 0x18, 0xc9, 0x6c, + 0x84, 0xb9, 0x9a, 0xd5, 0x53, 0x13, 0xe9, 0x61, 0x9e, 0x16, 0xc1, 0xf0, + 0x7e, 0xd1, 0x81, 0x65, 0x7d, 0xb8, 0x22, 0x82, 0x27, 0x52, 0x3a, 0x31, + 0x24, 0x42, 0x1d, 0x88, 0xef, 0x44, 0x70, 0x28, 0xa5, 0x87, 0x1d, 0xfc, + 0x3d, 0x95, 0x0e, 0xa1, 0xcd, 0xd6, 0x87, 0x9c, 0x47, 0x8c, 0x72, 0xec, + 0x2d, 0x1c, 0xb3, 0xc1, 0xf1, 0x37, 0x1a, 0xab, 0x1c, 0xed, 0x58, 0xcc, + 0xfc, 0xcb, 0x18, 0xed, 0x81, 0xb7, 0xb5, 0x03, 0xe1, 0x71, 0xc1, 0x24, + 0x83, 0x98, 0xd8, 0x01, 0xf7, 0xb0, 0xde, 0x95, 0x53, 0xf4, 0xce, 0xdd, + 0x8a, 0x60, 0x53, 0x07, 0x73, 0xf2, 0x0a, 0xb4, 0x8f, 0xae, 0x83, 0x93, + 0xf9, 0xcc, 0x8d, 0xbb, 0xa5, 0x8f, 0x5b, 0x30, 0x35, 0x61, 0xa0, 0x33, + 0x21, 0xfa, 0x96, 0x73, 0x6e, 0x31, 0xdc, 0x13, 0x67, 0x9e, 0x3e, 0x1a, + 0xfd, 0x58, 0x85, 0x9c, 0x4f, 0x04, 0x99, 0xab, 0xdf, 0x38, 0xed, 0x50, + 0xb1, 0x72, 0xb9, 0x03, 0x79, 0x72, 0xe3, 0x52, 0xd5, 0x3c, 0x5c, 0x02, + 0xbf, 0x59, 0xaf, 0x6e, 0xc7, 0x83, 0xb4, 0xdb, 0xaf, 0x53, 0x47, 0xb1, + 0x3a, 0x73, 0x9b, 0xdc, 0xab, 0x56, 0x0d, 0xce, 0x2b, 0xcc, 0x12, 0xdd, + 0x41, 0xce, 0xdf, 0xd8, 0x51, 0x41, 0x4c, 0x92, 0x33, 0xf0, 0x4e, 0x55, + 0x74, 0x15, 0x62, 0xde, 0xf8, 0x18, 0xde, 0x9c, 0xb5, 0xed, 0x9f, 0xee, + 0x2e, 0xd8, 0xf5, 0x69, 0xda, 0xf5, 0xdd, 0x86, 0x7e, 0x32, 0xa0, 0x06, + 0x38, 0x16, 0xda, 0x34, 0xed, 0xfa, 0x3c, 0xed, 0xba, 0x8e, 0x76, 0xbd, + 0x81, 0x76, 0x5d, 0xb3, 0xdc, 0x8b, 0x8f, 0xec, 0xf5, 0x00, 0xb1, 0xe9, + 0xbf, 0xb0, 0xed, 0x27, 0xad, 0xca, 0xf7, 0xc1, 0x59, 0x5b, 0xfa, 0xd6, + 0xec, 0x1a, 0xf7, 0xc9, 0x9a, 0xc2, 0x39, 0x50, 0x69, 0x5b, 0x37, 0x75, + 0xfa, 0xd1, 0x39, 0xb6, 0xf5, 0x93, 0xd1, 0xc7, 0xf0, 0x1e, 0xe7, 0xf2, + 0xc3, 0xe0, 0xd1, 0xfb, 0xaa, 0xb1, 0x24, 0x56, 0x85, 0xfc, 0x7a, 0x37, + 0xe3, 0xfc, 0x7d, 0xc1, 0x80, 0x6f, 0xa9, 0x72, 0x94, 0x75, 0x28, 0xd3, + 0xb8, 0xf8, 0x92, 0x9e, 0x3f, 0xc1, 0xba, 0xe7, 0x67, 0xeb, 0xfc, 0x8c, + 0x75, 0x3e, 0x0a, 0x1e, 0x7d, 0xa8, 0x0e, 0x4b, 0xb6, 0x56, 0x23, 0xff, + 0x6c, 0x15, 0xeb, 0x3c, 0xd0, 0x1a, 0x68, 0xda, 0xad, 0xd0, 0x2f, 0xc7, + 0x1f, 0xd5, 0x24, 0x5e, 0xf6, 0xdb, 0xef, 0xd0, 0x16, 0xf9, 0x9f, 0x17, + 0x5b, 0x32, 0x0d, 0xb3, 0x3c, 0x89, 0x78, 0x16, 0x3f, 0x64, 0xe3, 0x54, + 0x69, 0xa4, 0x93, 0xf8, 0xb4, 0x91, 0x38, 0xb5, 0x8e, 0x18, 0xd5, 0x41, + 0x8c, 0x6a, 0x27, 0x46, 0x45, 0x89, 0x51, 0x11, 0x62, 0x54, 0x98, 0x18, + 0x15, 0x22, 0x46, 0x19, 0xc4, 0x28, 0x28, 0x27, 0x43, 0x27, 0x50, 0x32, + 0xe2, 0xc2, 0x8b, 0x29, 0xcb, 0xfa, 0x6b, 0x43, 0xce, 0xc2, 0xf4, 0x30, + 0x26, 0x2f, 0xf5, 0xae, 0x21, 0x67, 0x49, 0x4f, 0x5d, 0xc9, 0xeb, 0x36, + 0xf2, 0x09, 0x62, 0x28, 0x79, 0xd4, 0x29, 0xfa, 0xea, 0xe2, 0x60, 0xa3, + 0x6f, 0x92, 0x9c, 0xf0, 0x49, 0x5d, 0xf6, 0x9e, 0x9a, 0x87, 0xae, 0x84, + 0xde, 0x5d, 0xab, 0xf6, 0x63, 0x66, 0xbd, 0x46, 0x3f, 0x74, 0x99, 0x0b, + 0x22, 0x1b, 0xb0, 0x72, 0x4f, 0x27, 0xae, 0xdd, 0x83, 0xe3, 0x57, 0xa2, + 0xf1, 0xd0, 0x3f, 0x31, 0x74, 0xcd, 0x87, 0xc3, 0xe3, 0xc1, 0xd2, 0xd4, + 0x51, 0xce, 0x69, 0xb4, 0xde, 0xd1, 0xe2, 0x2d, 0xcc, 0xb3, 0x67, 0x9e, + 0x64, 0x3a, 0x58, 0x7a, 0x5e, 0xde, 0xd5, 0x9b, 0xf9, 0x2f, 0xc2, 0x8d, + 0xca, 0xd1, 0xd7, 0xa4, 0xca, 0xff, 0x83, 0x48, 0xcb, 0xf9, 0x5b, 0x8f, + 0x2e, 0x38, 0xd1, 0x81, 0x35, 0xc3, 0xe6, 0x4d, 0x1e, 0xac, 0x43, 0xc7, + 0x70, 0x61, 0xec, 0x7a, 0x90, 0xb9, 0x2c, 0xb9, 0xdb, 0x0e, 0x26, 0x5f, + 0x0f, 0x85, 0xc2, 0x1c, 0x7f, 0x3f, 0x79, 0x73, 0x04, 0x5b, 0x67, 0xdf, + 0x29, 0xfb, 0x43, 0x7f, 0x97, 0xde, 0x39, 0x5b, 0xba, 0xd5, 0x03, 0x5d, + 0x3b, 0xac, 0x5c, 0x27, 0xfb, 0x48, 0x87, 0x04, 0x9f, 0xea, 0x89, 0x4b, + 0xff, 0x34, 0x0a, 0xb3, 0x8e, 0x38, 0xd5, 0x9e, 0xe8, 0xc1, 0x2f, 0x5a, + 0x0b, 0xf8, 0x91, 0x27, 0x7e, 0x5c, 0x93, 0x90, 0x7b, 0xfe, 0x14, 0x39, + 0xf1, 0xaa, 0x7f, 0x0b, 0xfe, 0xb1, 0x7d, 0x7f, 0x86, 0x61, 0xed, 0x6a, + 0xfa, 0xde, 0xd1, 0xa0, 0x0b, 0x9d, 0x72, 0x7e, 0x68, 0x83, 0xbc, 0xe7, + 0x64, 0x9e, 0x57, 0xed, 0xb3, 0xa2, 0x1b, 0x6f, 0xdb, 0xac, 0xfb, 0x4f, + 0x9e, 0x71, 0xc8, 0x3b, 0xb7, 0x2e, 0xfb, 0x5f, 0x74, 0x08, 0xc7, 0x7e, + 0x95, 0xfc, 0x69, 0xe7, 0x93, 0xe2, 0x8b, 0x8d, 0xb1, 0x2c, 0x24, 0x87, + 0x7b, 0x5e, 0x93, 0x33, 0xd9, 0xb7, 0x05, 0xa4, 0xae, 0x9c, 0xb9, 0x82, + 0xe2, 0x4c, 0xfc, 0x45, 0xb1, 0x7d, 0x7e, 0x1f, 0x9c, 0x95, 0xa1, 0x06, + 0xbe, 0x3a, 0xd1, 0x7b, 0x3f, 0xe4, 0x7f, 0x65, 0x3c, 0xbd, 0x18, 0x99, + 0x72, 0x34, 0xee, 0x7d, 0x58, 0x75, 0x64, 0xe6, 0x23, 0x8a, 0x35, 0x81, + 0xa5, 0x87, 0xbf, 0xa1, 0xca, 0x73, 0x05, 0x97, 0xe9, 0x72, 0xa6, 0x4c, + 0xd7, 0x5e, 0xe7, 0xdc, 0x0c, 0x4c, 0x9f, 0xb2, 0xa2, 0x1e, 0x8d, 0xb6, + 0xe0, 0x32, 0xcb, 0x68, 0x1b, 0x3f, 0x1d, 0x93, 0x7d, 0x32, 0x1f, 0x75, + 0xe8, 0x3f, 0xf9, 0xac, 0xda, 0xc9, 0xb8, 0x6e, 0x30, 0x56, 0x76, 0xe2, + 0xe7, 0x63, 0x1b, 0x70, 0x66, 0xac, 0x31, 0xf6, 0x0f, 0x8e, 0xcf, 0xe0, + 0x11, 0xc6, 0xac, 0xbf, 0x0e, 0xae, 0xc3, 0xd9, 0x78, 0x07, 0x7e, 0x1c, + 0x37, 0xff, 0x2b, 0x63, 0xca, 0xe1, 0x0c, 0xe4, 0x4c, 0x55, 0xf3, 0xa1, + 0x97, 0x55, 0x7f, 0x67, 0x48, 0xf1, 0x1f, 0xb9, 0x5d, 0x59, 0x87, 0x5f, + 0x64, 0x3a, 0xf0, 0x6f, 0x99, 0xa2, 0x1d, 0x98, 0xd6, 0xcc, 0x7c, 0xb1, + 0x01, 0xb1, 0x05, 0xda, 0x5f, 0x92, 0x76, 0x48, 0x39, 0x37, 0x7d, 0x96, + 0x76, 0x98, 0xa4, 0x1d, 0x26, 0x69, 0x87, 0x49, 0xda, 0x21, 0x71, 0xe6, + 0xeb, 0xcc, 0xc9, 0x9e, 0xa3, 0x7f, 0x3e, 0x4b, 0xdc, 0x28, 0xe4, 0x9c, + 0x5d, 0xc4, 0xeb, 0x8d, 0xf8, 0x68, 0xac, 0x1d, 0x3f, 0x21, 0x77, 0xbc, + 0xbb, 0x35, 0x9f, 0x5f, 0x08, 0xff, 0xb6, 0xf3, 0xc4, 0xa2, 0x5c, 0xa6, + 0x1d, 0xef, 0xc5, 0x23, 0xc8, 0xc6, 0x1b, 0xa3, 0x0f, 0x2a, 0x7f, 0x44, + 0xc2, 0x20, 0x7a, 0x8c, 0xe2, 0x34, 0x73, 0xa3, 0x36, 0xe6, 0xba, 0x65, + 0xec, 0xef, 0xcd, 0x90, 0xd8, 0x46, 0x98, 0x31, 0xdb, 0x90, 0x77, 0xc7, + 0xff, 0xe0, 0xdf, 0x9f, 0xd3, 0x06, 0xfe, 0xa9, 0xf5, 0x82, 0x35, 0x53, + 0xe7, 0x62, 0x5c, 0xdc, 0x88, 0xa6, 0xdd, 0xb2, 0x07, 0x2f, 0xbe, 0xa3, + 0x60, 0x41, 0x30, 0x1f, 0x5b, 0xc0, 0xb1, 0x3e, 0xa1, 0xc0, 0xd9, 0x97, + 0x90, 0xf5, 0xf0, 0x76, 0xbc, 0xcd, 0xf2, 0xf3, 0x69, 0x8b, 0xc7, 0x32, + 0x4e, 0xe7, 0xe3, 0x09, 0x59, 0x13, 0x5d, 0x87, 0x53, 0x99, 0x3b, 0xd5, + 0xb3, 0x9a, 0x81, 0xdb, 0xb3, 0x1b, 0xb0, 0x6a, 0xb7, 0xbd, 0xc7, 0x80, + 0x83, 0x71, 0x7f, 0xfe, 0x79, 0x6c, 0x40, 0x78, 0x72, 0x23, 0xae, 0xd9, + 0xad, 0xe0, 0xc3, 0xc0, 0x46, 0x5c, 0xcd, 0xef, 0x8b, 0x77, 0x5b, 0xd6, + 0x71, 0x23, 0x64, 0x0d, 0x6e, 0x14, 0x5d, 0x89, 0xef, 0xfe, 0x95, 0x86, + 0xea, 0x8d, 0xa0, 0x33, 0xb9, 0x9c, 0x11, 0xe2, 0x71, 0x7c, 0x03, 0x96, + 0xec, 0x6e, 0xd4, 0xda, 0xd1, 0x98, 0x3a, 0xcd, 0xfa, 0xad, 0x93, 0x7f, + 0x47, 0x9b, 0x90, 0xb2, 0x32, 0xce, 0x4d, 0xb5, 0xf2, 0x7e, 0x7d, 0x19, + 0x65, 0x6b, 0x1a, 0x95, 0x7c, 0xb7, 0x07, 0x6a, 0xb0, 0x01, 0x37, 0x7a, + 0xae, 0x44, 0x66, 0x0f, 0x3d, 0x2b, 0x81, 0x7c, 0x25, 0xe3, 0x7f, 0x7b, + 0x50, 0xef, 0xd8, 0xa9, 0xc8, 0x5a, 0x5a, 0x0c, 0x2f, 0xc4, 0x03, 0x4d, + 0xba, 0x62, 0xad, 0x9a, 0x30, 0x9a, 0x87, 0x76, 0x30, 0x47, 0xf0, 0xd5, + 0x5d, 0x89, 0x83, 0x53, 0x72, 0xde, 0xa3, 0x0b, 0x41, 0xc6, 0xea, 0xde, + 0xa4, 0xf9, 0x39, 0x27, 0xf3, 0x90, 0x32, 0xdd, 0xef, 0x5d, 0xa4, 0xfa, + 0xcf, 0x6f, 0x85, 0x7e, 0xf2, 0x6d, 0xf2, 0x84, 0x9f, 0x2c, 0x97, 0xff, + 0x15, 0x50, 0x4d, 0xfb, 0x6f, 0xc1, 0x82, 0x69, 0xff, 0xd6, 0x8f, 0x94, + 0x2a, 0xe4, 0x46, 0x9c, 0x78, 0x7d, 0x45, 0x15, 0x0e, 0xef, 0xff, 0x6e, + 0xb5, 0x9c, 0x1d, 0xae, 0xd3, 0x15, 0x08, 0x57, 0xf9, 0xdd, 0x76, 0xda, + 0x65, 0xf9, 0xea, 0xc5, 0x46, 0x5b, 0x28, 0x77, 0xc1, 0x5e, 0x77, 0xd0, + 0x0e, 0x4e, 0xa5, 0x7c, 0x08, 0x04, 0x9f, 0x50, 0xd2, 0x85, 0xf7, 0xb3, + 0x98, 0x27, 0x98, 0x88, 0x93, 0x23, 0xee, 0x1c, 0xf1, 0x31, 0xce, 0x88, + 0x5f, 0x29, 0xc4, 0xf0, 0x1a, 0x44, 0x6b, 0x7d, 0x36, 0xff, 0x7f, 0x3d, + 0x1e, 0x43, 0x22, 0xde, 0xbc, 0xb5, 0x5a, 0x75, 0xc8, 0x19, 0xfb, 0x30, + 0xd4, 0x18, 0x06, 0xe3, 0x85, 0x7a, 0x7d, 0xa1, 0x6d, 0x78, 0x38, 0xde, + 0xdc, 0xfd, 0x11, 0xec, 0x77, 0xe2, 0x7d, 0x33, 0xd8, 0x86, 0x2d, 0x71, + 0x79, 0x47, 0x41, 0x6c, 0xdc, 0xc4, 0xd9, 0x90, 0x07, 0x3f, 0x88, 0x6f, + 0xc3, 0xf3, 0xf1, 0xe6, 0xfc, 0x2a, 0x87, 0x70, 0x4f, 0xbf, 0xcf, 0xe7, + 0xd8, 0x86, 0x89, 0x78, 0xa3, 0x77, 0x94, 0x8e, 0x18, 0xd3, 0x9a, 0x70, + 0x60, 0xba, 0x70, 0xf6, 0xe9, 0x10, 0xf9, 0xdb, 0xc1, 0x64, 0xb3, 0x76, + 0x8f, 0xfa, 0x37, 0xb2, 0xbf, 0xe4, 0x95, 0x75, 0x81, 0xe3, 0x71, 0x37, + 0xfd, 0xdd, 0x84, 0x97, 0x39, 0x87, 0x9e, 0x0b, 0xe1, 0xd5, 0xf8, 0x53, + 0x96, 0x16, 0x09, 0xc4, 0xce, 0x2b, 0x4e, 0x5c, 0x9d, 0x5b, 0x85, 0xef, + 0x10, 0x2f, 0xab, 0x56, 0x4a, 0x6e, 0xe1, 0x43, 0x05, 0x73, 0x93, 0x52, + 0xe6, 0x1b, 0xcd, 0xe3, 0xf2, 0x3f, 0x57, 0x2c, 0xeb, 0x44, 0x48, 0x8f, + 0x9e, 0xa5, 0x9f, 0xab, 0x91, 0x7e, 0x72, 0xe7, 0x80, 0x4f, 0x55, 0xdc, + 0x6c, 0xc3, 0x83, 0x33, 0x71, 0x2f, 0x7c, 0xb9, 0x26, 0x4c, 0x93, 0xab, + 0x34, 0x32, 0x67, 0x38, 0x1f, 0xff, 0x95, 0xb5, 0x90, 0x78, 0xf6, 0xf1, + 0xb5, 0x0d, 0x08, 0xe7, 0x64, 0x7f, 0x57, 0xdf, 0xba, 0x8f, 0x31, 0xed, + 0x56, 0xc6, 0x2e, 0xd9, 0xdf, 0x7d, 0x9f, 0x32, 0x2c, 0x23, 0xaf, 0xf5, + 0x4d, 0x7e, 0x96, 0x57, 0x0b, 0x8c, 0x9c, 0x0f, 0x2d, 0xac, 0xef, 0x63, + 0x5b, 0xef, 0xc5, 0x9b, 0xf0, 0x4c, 0xb2, 0xb1, 0xe3, 0x61, 0xa5, 0x91, + 0x39, 0x70, 0x2d, 0xf3, 0x7b, 0x8d, 0x31, 0xf9, 0x7a, 0x9c, 0x4b, 0x39, + 0xd1, 0x92, 0x80, 0xd8, 0xc4, 0x7d, 0x1a, 0x71, 0x76, 0x58, 0x91, 0x3d, + 0xae, 0x66, 0x83, 0x38, 0xd3, 0xd1, 0xc6, 0xfc, 0x75, 0xb1, 0x22, 0x5c, + 0x19, 0x68, 0x62, 0xd9, 0x33, 0xa9, 0x0a, 0x34, 0x8e, 0xf7, 0x93, 0xff, + 0x97, 0xe2, 0xe3, 0x3d, 0x2e, 0x5c, 0x37, 0xa9, 0xdb, 0xf9, 0x9a, 0xaa, + 0x8b, 0x1f, 0x00, 0x6d, 0xfb, 0x4d, 0x9c, 0x0a, 0xdd, 0x85, 0xc0, 0x2e, + 0x79, 0xb7, 0x43, 0xe2, 0xa9, 0x9c, 0xcd, 0x17, 0x7e, 0xa4, 0x53, 0x67, + 0x3a, 0x0e, 0x24, 0xcd, 0x5f, 0xa9, 0x9c, 0xdb, 0x81, 0x24, 0xda, 0x98, + 0x03, 0x13, 0xe7, 0x02, 0x79, 0xdd, 0xe1, 0x84, 0x37, 0x27, 0xfc, 0x22, + 0x8c, 0x69, 0x8e, 0x37, 0x49, 0x2e, 0x9e, 0x8b, 0x37, 0x20, 0x41, 0x2e, + 0x6e, 0x92, 0x8b, 0x9b, 0xe4, 0xdd, 0x26, 0xb9, 0xb8, 0x49, 0x2e, 0x6e, + 0x92, 0x8b, 0x9b, 0xe4, 0xe2, 0x66, 0x66, 0x15, 0xa6, 0x52, 0x2a, 0x06, + 0x27, 0xe2, 0x4a, 0x74, 0x83, 0xd8, 0x77, 0x13, 0xbe, 0x46, 0x39, 0x62, + 0xeb, 0xaf, 0xc7, 0x78, 0xea, 0x06, 0x5e, 0x0a, 0xd6, 0xd1, 0xe6, 0xe2, + 0x69, 0x69, 0xd7, 0x85, 0xd1, 0x4c, 0x21, 0xaf, 0xd1, 0xae, 0xdd, 0x8e, + 0x1a, 0xe6, 0x46, 0x1f, 0x92, 0x0f, 0xe4, 0xe7, 0xcb, 0x39, 0x49, 0x83, + 0x97, 0xc8, 0x23, 0xfb, 0x79, 0x26, 0xca, 0x57, 0x00, 0x07, 0x52, 0xdb, + 0xd1, 0x34, 0xe2, 0xc0, 0x9d, 0xad, 0x06, 0xfa, 0xd2, 0x32, 0x56, 0x19, + 0x87, 0xec, 0x29, 0x2a, 0x38, 0xff, 0x64, 0x63, 0xf7, 0x3e, 0x20, 0x5f, + 0xc5, 0x7c, 0xc9, 0x4b, 0x0e, 0xb3, 0x2f, 0xd9, 0xcf, 0x1c, 0xc4, 0x81, + 0xb3, 0xc1, 0x56, 0xb4, 0xec, 0xa9, 0xc3, 0x77, 0x76, 0xf9, 0x3b, 0x3e, + 0x82, 0x4e, 0xce, 0x6d, 0xad, 0xda, 0x14, 0x0c, 0x18, 0x6d, 0x4a, 0x2b, + 0x16, 0x4f, 0xb5, 0xa2, 0xf1, 0x49, 0x7f, 0x38, 0x40, 0x3d, 0xba, 0x82, + 0xab, 0xd0, 0x63, 0x44, 0xf1, 0x26, 0x39, 0x97, 0x7e, 0x40, 0xfe, 0x47, + 0x8f, 0xf0, 0x1b, 0x7f, 0xf8, 0x1d, 0x48, 0x1e, 0x13, 0xc2, 0x54, 0x06, + 0xca, 0xce, 0x15, 0x79, 0x6c, 0x1a, 0x56, 0xd0, 0x7e, 0xb5, 0xf0, 0x36, + 0xc1, 0xa7, 0x08, 0x9e, 0x49, 0x45, 0x4f, 0x39, 0x19, 0xdb, 0xd7, 0x92, + 0x8b, 0x4d, 0xa6, 0x25, 0x1f, 0x7b, 0x9e, 0xfc, 0x3d, 0x82, 0x25, 0x23, + 0x62, 0x37, 0x11, 0x34, 0x91, 0x9f, 0x25, 0x89, 0x91, 0xd6, 0x88, 0x9e, + 0xa7, 0x4e, 0xcd, 0x05, 0x8e, 0x08, 0xce, 0xed, 0xef, 0xc7, 0xce, 0xa4, + 0xcc, 0x8f, 0x0f, 0x7f, 0x3a, 0x1c, 0xc5, 0x2d, 0x59, 0x1d, 0x0f, 0x0e, + 0xb7, 0xe3, 0x0b, 0xd9, 0x26, 0x3c, 0x30, 0xdc, 0x81, 0x75, 0xd9, 0x16, + 0xf6, 0x23, 0xbc, 0x64, 0x1d, 0xda, 0xb2, 0x3e, 0x4c, 0x26, 0xe5, 0x6c, + 0x40, 0x2d, 0x5e, 0xd4, 0x7c, 0x9c, 0xa7, 0x66, 0x9f, 0x03, 0x8d, 0xa6, + 0x13, 0xfa, 0xde, 0x6d, 0xaa, 0xdf, 0x8c, 0xc1, 0x9f, 0x8a, 0x61, 0xbe, + 0xf8, 0xe6, 0x90, 0x06, 0xb2, 0x8d, 0xdd, 0x36, 0x77, 0x97, 0xb8, 0x66, + 0x9d, 0x25, 0x67, 0x9d, 0x9a, 0xfa, 0xb2, 0xed, 0xe7, 0xb5, 0x7a, 0xbe, + 0x56, 0xde, 0xa7, 0xa7, 0x9f, 0x13, 0xd3, 0x0b, 0x39, 0xaa, 0x4e, 0xfd, + 0x77, 0xa5, 0x24, 0x26, 0xf6, 0xa0, 0x64, 0xb9, 0xe4, 0x6c, 0x3e, 0xda, + 0x73, 0x13, 0x26, 0xc8, 0x89, 0x5f, 0xdb, 0x5f, 0xb0, 0x8d, 0x14, 0xe5, + 0xcc, 0x26, 0xcd, 0x3f, 0xa2, 0xd7, 0xb5, 0x55, 0x46, 0x02, 0xd1, 0x0f, + 0x50, 0xf0, 0x83, 0x4a, 0xea, 0xcc, 0x49, 0x7b, 0x3e, 0x1b, 0x97, 0x32, + 0xf2, 0x2e, 0x12, 0x16, 0x54, 0x30, 0x77, 0x28, 0xa1, 0x7f, 0xbd, 0x1f, + 0xb7, 0x7a, 0x5c, 0xf4, 0x05, 0xe7, 0x8a, 0x06, 0xb8, 0x73, 0x37, 0xe0, + 0xc7, 0xa9, 0x06, 0x2c, 0x64, 0x9e, 0xee, 0x4d, 0xe0, 0x54, 0x39, 0xd4, + 0x6b, 0xcb, 0xe1, 0xdf, 0xfa, 0xb1, 0x23, 0xa0, 0x7d, 0x09, 0xcd, 0xdd, + 0xdf, 0x54, 0xfc, 0xdb, 0x54, 0x87, 0xbf, 0xeb, 0x35, 0xe6, 0xd7, 0x55, + 0x39, 0x39, 0x43, 0xea, 0x06, 0x72, 0x34, 0x73, 0xd6, 0x3b, 0x9b, 0x12, + 0xff, 0x2a, 0xa1, 0x18, 0x1e, 0x94, 0x4c, 0x3a, 0xf1, 0xfe, 0x18, 0xf2, + 0x25, 0xba, 0xde, 0xf5, 0xa6, 0x52, 0x0f, 0xf7, 0xe4, 0x0d, 0x78, 0x37, + 0x45, 0xac, 0x10, 0x9f, 0xe5, 0xb3, 0xb7, 0xc6, 0x16, 0xa1, 0x94, 0x36, + 0x0f, 0xfa, 0xf3, 0x19, 0xda, 0x9f, 0x63, 0x52, 0xfa, 0xbd, 0x1e, 0x56, + 0xaa, 0xf1, 0xe4, 0x8f, 0x1d, 0x0a, 0xc2, 0x4b, 0x14, 0xdb, 0x2e, 0x24, + 0x8f, 0xd6, 0xc8, 0x0b, 0xa6, 0xb3, 0x86, 0x9d, 0x3f, 0xef, 0xa5, 0x9d, + 0xf4, 0x26, 0xa1, 0xd4, 0xac, 0x6c, 0x85, 0x9b, 0x76, 0xf2, 0xf9, 0x31, + 0xd3, 0xd2, 0x74, 0x3d, 0x9c, 0x21, 0x2f, 0x58, 0x1b, 0x0c, 0x78, 0xdf, + 0x22, 0x27, 0x77, 0xd0, 0x4e, 0xca, 0x9f, 0x94, 0x79, 0x95, 0x79, 0x5f, + 0x85, 0x55, 0xc1, 0x28, 0x3e, 0xa6, 0x9d, 0x2c, 0x38, 0x20, 0xdc, 0xdc, + 0xb2, 0xbc, 0x7a, 0x81, 0x9f, 0x7f, 0x38, 0x1c, 0x46, 0x82, 0xfc, 0x7c, + 0x98, 0xf9, 0xf9, 0x38, 0xed, 0xa1, 0x77, 0xbf, 0xe4, 0xdb, 0x11, 0xca, + 0xa9, 0x1b, 0x6b, 0x18, 0xfb, 0xde, 0x4a, 0x8b, 0x5d, 0x46, 0x70, 0xd5, + 0x93, 0xfa, 0xf9, 0x46, 0xfe, 0x5e, 0x75, 0xa0, 0x20, 0xcf, 0x42, 0xc6, + 0x9a, 0x23, 0xd9, 0x76, 0x3c, 0x97, 0xed, 0x60, 0x6e, 0x2f, 0x7c, 0x45, + 0xde, 0x09, 0xef, 0xb0, 0xe5, 0x1b, 0x4c, 0x0a, 0xde, 0x76, 0x50, 0xa7, + 0xba, 0x36, 0xaa, 0x04, 0x3a, 0x6f, 0x46, 0x07, 0xde, 0xcd, 0xdc, 0x80, + 0x13, 0x29, 0xc6, 0x73, 0xfa, 0xc0, 0x50, 0x52, 0xb7, 0xff, 0x0f, 0x4a, + 0xf9, 0xae, 0x5b, 0x70, 0xdf, 0x44, 0x0c, 0x67, 0x93, 0x6f, 0xcd, 0xbe, + 0x47, 0xdc, 0x62, 0xed, 0xe3, 0x5c, 0xe6, 0x92, 0xd1, 0xaf, 0xaa, 0xd8, + 0x8e, 0x6b, 0x9e, 0x94, 0x7f, 0xa8, 0xe0, 0xdf, 0xea, 0x55, 0x55, 0xf2, + 0x52, 0xe1, 0x6c, 0xcf, 0xc8, 0x7b, 0xdc, 0xc6, 0x2b, 0x8a, 0xf0, 0x32, + 0xe6, 0xf7, 0x2b, 0xb6, 0xe3, 0x3e, 0xe2, 0xcd, 0xaa, 0xa0, 0x03, 0x33, + 0xf3, 0xa4, 0x9e, 0x19, 0x23, 0x27, 0x37, 0x5e, 0x96, 0x35, 0x71, 0x5d, + 0xe6, 0xd8, 0x81, 0x17, 0x83, 0x8d, 0x5d, 0x53, 0x8a, 0x03, 0x5b, 0x83, + 0xf2, 0xbe, 0x64, 0x88, 0xf3, 0x2f, 0xd8, 0x12, 0x46, 0x60, 0xb2, 0xf0, + 0xff, 0x2a, 0xe4, 0x1d, 0x9a, 0xef, 0xa6, 0x06, 0x6d, 0x7b, 0x0a, 0xb4, + 0x16, 0x79, 0xf5, 0x33, 0x75, 0xb2, 0x66, 0x7e, 0x80, 0xb6, 0x35, 0x90, + 0x94, 0xf3, 0x75, 0x0e, 0x78, 0x99, 0x03, 0xa5, 0x27, 0x40, 0xff, 0x09, + 0xe1, 0x47, 0xf1, 0x0a, 0xa4, 0xd3, 0xfd, 0xf6, 0x19, 0xa3, 0xe7, 0x33, + 0x26, 0x9c, 0x11, 0x59, 0x3f, 0x70, 0xe3, 0x48, 0xda, 0x4d, 0xac, 0x79, + 0xca, 0xaa, 0x22, 0x16, 0x4f, 0xa7, 0x03, 0xd1, 0xe3, 0xc4, 0xe2, 0xaf, + 0xad, 0xf8, 0x89, 0x55, 0x4b, 0x1c, 0xde, 0x9b, 0xd4, 0x8d, 0x4a, 0xfe, + 0xbe, 0x6e, 0xa5, 0x1e, 0xfb, 0x01, 0xdc, 0xc8, 0x10, 0x87, 0x1c, 0xc9, + 0x3a, 0x2c, 0xdc, 0x63, 0xda, 0x67, 0x6e, 0x0e, 0xf0, 0x77, 0x39, 0xf3, + 0xc8, 0x74, 0xc6, 0x67, 0xaf, 0x0d, 0x3c, 0x9d, 0x91, 0x35, 0x02, 0x2f, + 0x2a, 0x92, 0xd6, 0xaa, 0x1f, 0x2f, 0x37, 0x6b, 0xcb, 0x41, 0xbc, 0x25, + 0xcf, 0xae, 0x4b, 0xfa, 0xbb, 0x6f, 0x64, 0x9c, 0xfa, 0x70, 0xb9, 0x81, + 0xe7, 0x88, 0x69, 0xae, 0xa4, 0xcc, 0xcf, 0xd1, 0xfb, 0x6a, 0x60, 0x36, + 0x56, 0x43, 0xd6, 0x08, 0x55, 0xfa, 0x8d, 0x8c, 0xb1, 0x01, 0x5f, 0x9b, + 0x08, 0x51, 0xe6, 0x16, 0x1c, 0x22, 0x1f, 0x09, 0x1e, 0x30, 0xf1, 0x03, + 0x62, 0x69, 0xcb, 0x1e, 0xf1, 0x6d, 0xb4, 0x09, 0x8f, 0x7d, 0x22, 0x18, + 0x08, 0xaf, 0xa6, 0x4f, 0xbc, 0x9d, 0x15, 0x7b, 0x92, 0x77, 0x2c, 0x91, + 0xaf, 0x25, 0x46, 0xdc, 0x1d, 0x17, 0x2c, 0xf3, 0xc2, 0xca, 0x86, 0xb0, + 0x81, 0xd8, 0xf9, 0x11, 0xf3, 0xcb, 0x19, 0xe6, 0x97, 0x33, 0x59, 0x0f, + 0x66, 0x0e, 0xd6, 0xf3, 0xf2, 0xf1, 0x5a, 0xc4, 0x4b, 0xe7, 0x3d, 0x15, + 0xe7, 0x98, 0x2f, 0x9e, 0xe7, 0xbc, 0xef, 0xb4, 0xf1, 0xcb, 0x85, 0x6d, + 0x59, 0xe0, 0x95, 0x11, 0x03, 0x0f, 0xee, 0x2f, 0xcc, 0x75, 0xbf, 0xfc, + 0x5f, 0xb5, 0x91, 0x20, 0x06, 0x68, 0x4b, 0xa3, 0xc9, 0x56, 0xac, 0xdb, + 0xad, 0x77, 0x8e, 0x28, 0x01, 0xef, 0x4d, 0xc4, 0xb3, 0xd5, 0xcc, 0x1d, + 0xef, 0x26, 0x7f, 0x3d, 0xbd, 0xbc, 0x15, 0x6d, 0xe3, 0xdb, 0x11, 0x7e, + 0x52, 0x45, 0xcd, 0x72, 0x89, 0xa9, 0x52, 0x4f, 0xf0, 0x54, 0xfc, 0x3e, + 0x84, 0x41, 0x62, 0xd9, 0x86, 0x50, 0x9e, 0xf9, 0xdf, 0xf3, 0x56, 0xb5, + 0x4e, 0xac, 0x50, 0xc3, 0x78, 0x8a, 0x58, 0xb6, 0x97, 0x39, 0x41, 0xcd, + 0xf2, 0x08, 0x92, 0x69, 0xc9, 0x01, 0x23, 0xa8, 0x1a, 0x91, 0xfc, 0x2f, + 0x82, 0xca, 0xfd, 0xb2, 0x7e, 0x15, 0xe1, 0xdc, 0xfa, 0x70, 0xdd, 0xca, + 0x08, 0x7e, 0x90, 0x16, 0x3e, 0x20, 0xf8, 0x28, 0x98, 0xe3, 0xc3, 0xba, + 0x61, 0xd9, 0xa7, 0xd2, 0xb1, 0x9a, 0x18, 0x76, 0x20, 0xd3, 0x84, 0x9b, + 0x88, 0x61, 0x4f, 0x67, 0x5a, 0x70, 0xe3, 0xf0, 0x3a, 0xe2, 0xa6, 0x6d, + 0x07, 0xf4, 0xb9, 0xfa, 0xda, 0x42, 0x7e, 0xb5, 0x01, 0xaf, 0x8c, 0xc9, + 0x19, 0x1c, 0x1d, 0x5f, 0x1e, 0xf6, 0x0f, 0x3d, 0xa8, 0x6c, 0xc0, 0x77, + 0x27, 0x8a, 0xfc, 0x48, 0xc1, 0x60, 0xba, 0x30, 0xc6, 0x2a, 0xda, 0xc8, + 0x70, 0xe6, 0x6e, 0xda, 0x8e, 0x1d, 0x1f, 0xe8, 0xd1, 0x37, 0xcc, 0x93, + 0x33, 0x0f, 0xdf, 0xc3, 0x8c, 0x9d, 0x17, 0x55, 0x45, 0x8a, 0x7b, 0xac, + 0xc5, 0xbd, 0x17, 0x13, 0xcf, 0xad, 0xf0, 0x62, 0x1d, 0x79, 0xfd, 0xa1, + 0x15, 0xa5, 0xf6, 0xf9, 0x8a, 0xa9, 0x5d, 0xef, 0xa3, 0x7c, 0x44, 0xbd, + 0xc3, 0x8d, 0xc6, 0xa6, 0x7b, 0x95, 0x1e, 0xac, 0x0e, 0xca, 0xbb, 0x4e, + 0xb2, 0x6f, 0x30, 0x84, 0x3e, 0xce, 0x61, 0xff, 0xf4, 0x15, 0x38, 0x4a, + 0x6e, 0x7c, 0xd8, 0x78, 0x1f, 0xa5, 0x23, 0x25, 0xe4, 0x42, 0x16, 0x8e, + 0x1a, 0xcb, 0xb1, 0xc1, 0x5e, 0x5f, 0x2f, 0x07, 0xea, 0x3f, 0xbd, 0x9f, + 0x02, 0x77, 0xd5, 0xec, 0xff, 0x78, 0x28, 0xbc, 0xdf, 0x44, 0xff, 0xcd, + 0x4e, 0x68, 0x85, 0xf3, 0x50, 0xff, 0x91, 0xb2, 0xdd, 0xe8, 0x62, 0xee, + 0xba, 0x7e, 0xf7, 0x57, 0x70, 0xcb, 0xe8, 0xe2, 0xee, 0xb0, 0x6a, 0x59, + 0xef, 0x04, 0xf3, 0x38, 0x1e, 0x2c, 0x87, 0xe9, 0x21, 0x46, 0x2f, 0xbb, + 0x56, 0x5e, 0xa9, 0xe5, 0xdf, 0x69, 0xcb, 0x77, 0x87, 0xb4, 0xf7, 0x58, + 0x4d, 0xc1, 0x87, 0x4a, 0x3d, 0x72, 0xa6, 0xe8, 0xf9, 0xe4, 0x0f, 0xc9, + 0xc5, 0xec, 0x1c, 0x75, 0xf6, 0xfe, 0x1b, 0xcc, 0x05, 0xe4, 0xfe, 0xa2, + 0xd9, 0x7a, 0x5f, 0x99, 0x9d, 0xff, 0xaf, 0x70, 0xfe, 0x2f, 0xd6, 0x21, + 0x36, 0xc8, 0xfe, 0x9c, 0xbc, 0xc7, 0x23, 0xeb, 0x19, 0xb2, 0x5f, 0x27, + 0x7b, 0x48, 0x0f, 0xa3, 0x6f, 0x8f, 0xac, 0xef, 0x5a, 0xd6, 0x3d, 0xba, + 0xec, 0x73, 0x16, 0xcf, 0x0a, 0xda, 0xb9, 0xb2, 0x62, 0x66, 0xa4, 0x6e, + 0xbf, 0x92, 0xca, 0xcc, 0x1d, 0xd3, 0x3c, 0xf9, 0x9f, 0x7f, 0x5a, 0x65, + 0x64, 0xee, 0xd8, 0x86, 0x94, 0xc1, 0xcc, 0x11, 0x65, 0x67, 0xe6, 0xd3, + 0xfa, 0x78, 0xd6, 0x8a, 0x76, 0x4a, 0x1b, 0x22, 0xd3, 0x72, 0xca, 0x22, + 0x72, 0x15, 0x9f, 0x3d, 0x33, 0x2b, 0x77, 0x19, 0xb9, 0x6c, 0x41, 0xee, + 0x3b, 0x29, 0xb7, 0xb1, 0x3c, 0x0a, 0x75, 0xe5, 0x5c, 0xd9, 0x8b, 0xe3, + 0xfc, 0xeb, 0x8b, 0x6d, 0x15, 0xca, 0x6d, 0xf2, 0xc8, 0xff, 0x44, 0x50, + 0x57, 0x4a, 0x6e, 0xf0, 0xff, 0x00, 0xb1, 0x92, 0x7f, 0x52, 0xb8, 0x51, + 0x00, 0x00, 0x00 }; + +static const u32 bnx2_CP_b09FwData[(0x84/4) + 1] = { + 0x00000000, 0x0000001b, 0x0000000f, 0x0000000a, 0x00000008, 0x00000006, + 0x00000005, 0x00000005, 0x00000004, 0x00000004, 0x00000003, 0x00000003, + 0x00000003, 0x00000003, 0x00000003, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0x00000002, + 0x00000001, 0x00000001, 0x00000001, 0x00000000 }; +static const u32 bnx2_CP_b09FwRodata[(0x1c0/4) + 1] = { + 0x80080100, 0x80080080, 0x80080000, 0x00000c00, 0x00003080, 0x08000f48, + 0x08000ff4, 0x0800100c, 0x08001020, 0x08001034, 0x08000f48, 0x08000f48, + 0x08001068, 0x080010a0, 0x080010b0, 0x080010d8, 0x080017c8, 0x080017c8, + 0x08001800, 0x08001800, 0x08001814, 0x080017e4, 0x08001a3c, 0x08001a08, + 0x08001a94, 0x08001a94, 0x08001b1c, 0x08001a4c, 0x80080240, 0x080021a8, + 0x08001ff4, 0x080021d0, 0x08002268, 0x080023b8, 0x08002404, 0x08002528, + 0x08002430, 0x080024b4, 0x08002064, 0x080029d0, 0x08002974, 0x08002010, + 0x08002010, 0x08002010, 0x0800259c, 0x0800259c, 0x08002010, 0x08002010, + 0x0800284c, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x080028ac, + 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, + 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, + 0x08002010, 0x08002010, 0x08002424, 0x08002010, 0x08002010, 0x0800291c, + 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, + 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, + 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002010, 0x08002770, + 0x08002010, 0x08002010, 0x080026e4, 0x08002640, 0x08003788, 0x0800375c, + 0x08003728, 0x080036fc, 0x080036dc, 0x08003690, 0x80080100, 0x80080080, + 0x80080000, 0x80080080, 0x080046f0, 0x08004728, 0x08004670, 0x080046f0, + 0x080046f0, 0x08004450, 0x080046f0, 0x08004ac4, 0x00000000 }; + +static struct fw_info bnx2_cp_fw_09 = { + /* Firmware version: 5.0.0j13 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000088, + + .text_addr = 0x08000000, + .text_len = 0x51b4, + .text_index = 0x0, + .gz_text = bnx2_CP_b09FwText, + .gz_text_len = sizeof(bnx2_CP_b09FwText), + + .data_addr = 0x080053a0, + .data_len = 0x84, + .data_index = 0x0, + .data = bnx2_CP_b09FwData, + + .sbss_addr = 0x08005424, + .sbss_len = 0x89, + .sbss_index = 0x0, + + .bss_addr = 0x080054b0, + .bss_len = 0x19c, + .bss_index = 0x0, + + .rodata_addr = 0x080051b4, + .rodata_len = 0x1c0, + .rodata_index = 0x0, + .rodata = bnx2_CP_b09FwRodata, +}; + +static u8 bnx2_RXP_b09FwText[] = { + 0xec, 0x5c, 0x7f, 0x70, 0x1c, 0xf5, 0x75, 0xff, 0x7c, 0xf7, 0xf6, 0xa4, + 0x95, 0x74, 0x3a, 0xed, 0x9d, 0x7e, 0x9d, 0x8d, 0x63, 0xef, 0x46, 0x7b, + 0x92, 0xb0, 0x8c, 0xd9, 0x3b, 0x9d, 0x6c, 0x39, 0xdd, 0x24, 0x5b, 0xdb, + 0x04, 0x13, 0x12, 0x90, 0x6d, 0x9c, 0x2a, 0x4d, 0xda, 0x68, 0x6c, 0x09, + 0xff, 0x80, 0x16, 0x05, 0x18, 0x2a, 0x18, 0x26, 0x5e, 0x2c, 0xdb, 0x18, + 0x7c, 0xd2, 0x49, 0xc2, 0x26, 0xa6, 0xd3, 0x21, 0x87, 0x2d, 0x19, 0x03, + 0x27, 0x1f, 0x26, 0xc6, 0x98, 0x99, 0x62, 0xab, 0xc1, 0x10, 0xa7, 0x21, + 0x98, 0x74, 0xe8, 0x8c, 0x3b, 0xed, 0x04, 0x0d, 0xc6, 0x60, 0x98, 0xc6, + 0x18, 0x02, 0x8d, 0x28, 0xae, 0xbe, 0x7d, 0xef, 0x4e, 0x72, 0x32, 0x6d, + 0xfa, 0x47, 0xfe, 0xe8, 0x7f, 0xfb, 0x66, 0x98, 0x3b, 0xed, 0x7e, 0x7f, + 0xbc, 0x1f, 0x9f, 0xf7, 0x79, 0xef, 0xdd, 0x8c, 0xb9, 0x27, 0x84, 0x72, + 0xcc, 0x48, 0x25, 0xfd, 0xd7, 0xd6, 0xdb, 0x77, 0xa7, 0xbd, 0xd8, 0x5e, + 0x8c, 0xd6, 0xc4, 0x96, 0x00, 0x10, 0xe4, 0xe7, 0x02, 0xbe, 0xf8, 0xe2, + 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, + 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, + 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, + 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, + 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xf8, 0xe2, 0x8b, 0x2f, 0xbe, 0xfc, 0x7f, + 0x48, 0x00, 0xd0, 0xf9, 0xb3, 0x72, 0xe6, 0x3f, 0xa1, 0x29, 0x4e, 0x76, + 0xdb, 0x72, 0x4b, 0x68, 0x01, 0x67, 0x53, 0xff, 0x06, 0x0b, 0x70, 0x73, + 0x2d, 0xc6, 0x0a, 0xfc, 0x97, 0xf4, 0x6a, 0x54, 0x2c, 0xb7, 0xa0, 0x7d, + 0xc1, 0xb9, 0xfc, 0xa3, 0x97, 0x96, 0x9a, 0x97, 0xb2, 0x01, 0x68, 0xba, + 0x73, 0x36, 0xa1, 0x37, 0x0a, 0x6d, 0x1e, 0xed, 0xf9, 0xbb, 0xa6, 0x0f, + 0x22, 0x08, 0xcf, 0x9e, 0x05, 0x4f, 0x71, 0xa4, 0x1c, 0xb3, 0x25, 0x5e, + 0xb5, 0x3d, 0xb1, 0x22, 0x05, 0x4f, 0x73, 0x8e, 0x8b, 0xb2, 0x81, 0x69, + 0x69, 0x04, 0x8b, 0x37, 0x77, 0xe7, 0x14, 0xa8, 0x96, 0x86, 0x9e, 0xd1, + 0x72, 0xdc, 0x9a, 0xad, 0x40, 0x77, 0x36, 0x86, 0x8d, 0x39, 0xe8, 0x01, + 0x47, 0xc3, 0x64, 0xe0, 0xb8, 0x08, 0x8c, 0xa3, 0x2b, 0xe8, 0x4c, 0xdd, + 0xbc, 0x3f, 0x3d, 0x2d, 0x5d, 0x95, 0x77, 0x4c, 0xdc, 0x3c, 0x5a, 0x78, + 0x0f, 0x45, 0x75, 0x4e, 0xd1, 0x77, 0x5e, 0x37, 0x75, 0xf3, 0x81, 0x5c, + 0x08, 0x3b, 0xf7, 0x98, 0x1d, 0x59, 0xd4, 0x60, 0x97, 0xa5, 0xb4, 0x94, + 0xc0, 0xd3, 0x83, 0x30, 0x57, 0xad, 0x44, 0x4b, 0xac, 0x4c, 0x44, 0xd0, + 0xa5, 0xcf, 0x58, 0x3a, 0x5c, 0x86, 0xee, 0x45, 0x65, 0xf0, 0x3a, 0x04, + 0xe6, 0x0c, 0x7b, 0x5d, 0x01, 0xb2, 0xb5, 0xd2, 0xe9, 0x7a, 0x60, 0x3c, + 0x6e, 0x76, 0x0e, 0x08, 0x60, 0xe3, 0x00, 0x9d, 0x57, 0x58, 0xc9, 0xef, + 0x4d, 0x77, 0x8e, 0x68, 0xb1, 0xcb, 0xc4, 0xc7, 0x72, 0xe2, 0x16, 0xde, + 0xcb, 0x77, 0x99, 0x74, 0xd2, 0x89, 0x10, 0xca, 0x05, 0xb4, 0xb8, 0x40, + 0xd5, 0x70, 0x39, 0xc2, 0x96, 0x8b, 0x8b, 0xb5, 0x0d, 0xa7, 0x9b, 0x45, + 0x39, 0xda, 0xaf, 0xfd, 0x32, 0x50, 0xaf, 0xa0, 0x32, 0x0e, 0x74, 0x0e, + 0x94, 0xa0, 0x2a, 0x0e, 0x11, 0x5e, 0x0a, 0xdc, 0x34, 0xae, 0x20, 0x34, + 0x2c, 0xf0, 0xcc, 0xb0, 0x82, 0xd1, 0xe1, 0x00, 0x0e, 0x0e, 0x63, 0x71, + 0x08, 0x70, 0x2a, 0x10, 0xd7, 0x9f, 0x04, 0xe6, 0xaa, 0x88, 0x9f, 0x5e, + 0x81, 0xf8, 0x44, 0x63, 0x40, 0x45, 0xe7, 0x78, 0x09, 0xc2, 0xb4, 0xf6, + 0xd7, 0xb4, 0xf6, 0x3d, 0x5a, 0x7b, 0x7e, 0x18, 0x7f, 0x49, 0x2e, 0xed, + 0xae, 0x44, 0xdc, 0xbe, 0x5d, 0xe0, 0x8b, 0xa5, 0xb4, 0xe7, 0x14, 0xe2, + 0xb1, 0xeb, 0x50, 0x4e, 0x3a, 0xb0, 0x2e, 0x1a, 0x56, 0x8c, 0xb3, 0x2e, + 0xe4, 0xcb, 0xb8, 0x02, 0xcd, 0x12, 0xb8, 0xb0, 0xce, 0x34, 0x0c, 0xc1, + 0xef, 0x4c, 0xd7, 0x23, 0x5b, 0x42, 0x74, 0x4e, 0x85, 0x55, 0x87, 0xdd, + 0xb5, 0x45, 0x3f, 0x74, 0x0e, 0x28, 0x74, 0x07, 0x05, 0x2f, 0xae, 0xa1, + 0x72, 0xa9, 0x8e, 0x9b, 0x9e, 0x38, 0x51, 0xf8, 0xf7, 0x3d, 0xdf, 0x1c, + 0x67, 0xbb, 0x55, 0x54, 0x59, 0x15, 0xb8, 0xb6, 0x9e, 0x57, 0x2a, 0x28, + 0xa5, 0x75, 0xea, 0x30, 0xb0, 0x62, 0x00, 0x0b, 0xf9, 0xee, 0x51, 0xa8, + 0xb8, 0x35, 0xa5, 0xd2, 0xde, 0x10, 0x96, 0x8f, 0x17, 0xf7, 0x7d, 0x6d, + 0x9c, 0x7d, 0x23, 0xa0, 0x58, 0x17, 0xe4, 0x4b, 0x4d, 0x35, 0x38, 0x99, + 0xd7, 0xf1, 0x6c, 0xfe, 0x72, 0x0d, 0xc2, 0xa6, 0xe7, 0x41, 0xf3, 0x54, + 0xc7, 0xc3, 0x8e, 0x54, 0x10, 0x07, 0x87, 0xa6, 0x65, 0xc0, 0x32, 0x0d, + 0x5a, 0xa8, 0xbf, 0x4c, 0xb1, 0x3a, 0x99, 0xa1, 0x75, 0x99, 0x20, 0xf6, + 0x67, 0x4b, 0x6a, 0x51, 0x1e, 0xc3, 0x4b, 0x4d, 0xbc, 0x9f, 0xf7, 0xf2, + 0x19, 0x37, 0x55, 0xcd, 0xee, 0x2f, 0xa1, 0xfd, 0xaf, 0xa4, 0x80, 0xd1, + 0xa1, 0x0e, 0xda, 0x2a, 0xd1, 0x6f, 0x97, 0x62, 0xbd, 0x0e, 0xaf, 0xcc, + 0xe1, 0xb3, 0x66, 0xcf, 0xf1, 0x84, 0x31, 0xae, 0xeb, 0xc5, 0x73, 0x28, + 0xb0, 0x16, 0xbc, 0xd2, 0xff, 0xf1, 0xfe, 0x42, 0x6e, 0xf6, 0x7d, 0x2f, + 0xdd, 0xa3, 0x11, 0x1e, 0x3d, 0x1c, 0xcb, 0xdf, 0x8f, 0xe7, 0xf3, 0xb7, + 0xe3, 0x48, 0x3e, 0x4d, 0x77, 0xee, 0xc2, 0x89, 0xfc, 0x76, 0xbc, 0x90, + 0xef, 0xc3, 0xd1, 0xfc, 0xdd, 0xf8, 0x71, 0xbe, 0x17, 0xcf, 0xe5, 0x37, + 0x91, 0x3e, 0x1e, 0x82, 0x6d, 0x7c, 0x5e, 0xb3, 0xf8, 0x38, 0x5d, 0x46, + 0x7a, 0x6c, 0xc7, 0x64, 0x8e, 0xed, 0x91, 0x18, 0xb6, 0xcd, 0x43, 0x40, + 0x53, 0xac, 0x84, 0xfc, 0xbc, 0xde, 0x36, 0x9f, 0x25, 0x14, 0xc1, 0xad, + 0xe9, 0x40, 0x36, 0x0f, 0x3c, 0x35, 0x64, 0x20, 0x48, 0xfa, 0x5a, 0x89, + 0x3a, 0xec, 0xd0, 0x3b, 0x50, 0x6e, 0xa5, 0xf1, 0x70, 0x11, 0x8b, 0x5a, + 0xc8, 0xf9, 0x37, 0xa4, 0x09, 0x74, 0xbb, 0xe3, 0xd0, 0x04, 0x7d, 0x6f, + 0xc9, 0x7d, 0x5c, 0x5b, 0xcc, 0x1d, 0xd2, 0x23, 0x43, 0x7a, 0x64, 0x48, + 0x8f, 0x0c, 0xe9, 0x97, 0x21, 0xfd, 0x32, 0xa4, 0x4f, 0x86, 0xf4, 0xc9, + 0x90, 0x3e, 0x19, 0xd2, 0x35, 0x43, 0x3a, 0x65, 0xd8, 0xe7, 0x43, 0x64, + 0x4b, 0x31, 0xd7, 0x74, 0xc7, 0xa6, 0x3b, 0xeb, 0xc4, 0x82, 0x47, 0x55, + 0x31, 0x67, 0xd0, 0xc0, 0x7c, 0x07, 0xa1, 0xea, 0x25, 0xd6, 0xc4, 0x57, + 0x02, 0x2d, 0xc7, 0x63, 0x70, 0x13, 0xf5, 0xb0, 0x71, 0x30, 0xaf, 0x8a, + 0xf0, 0xa0, 0x94, 0x9f, 0xb4, 0xba, 0xa8, 0x72, 0x4c, 0xef, 0x11, 0xc5, + 0xda, 0x74, 0x46, 0x54, 0xa2, 0x7a, 0x64, 0x15, 0xb2, 0x11, 0x17, 0xa7, + 0x52, 0x06, 0xd6, 0x27, 0x15, 0xd2, 0xdf, 0xc3, 0xce, 0x94, 0x69, 0x7b, + 0x78, 0x04, 0x13, 0x35, 0xbc, 0x4f, 0xf3, 0x82, 0xe4, 0xab, 0x43, 0x29, + 0x8d, 0xf0, 0xe0, 0xe2, 0x5d, 0xbb, 0x04, 0x13, 0x1d, 0x1c, 0x17, 0x15, + 0x65, 0xd6, 0x7e, 0x5c, 0x1d, 0x8d, 0x92, 0x6d, 0x57, 0x63, 0x61, 0x94, + 0x9f, 0x41, 0xbc, 0x49, 0xb9, 0x5e, 0xef, 0xcc, 0x15, 0x1f, 0x3e, 0x1a, + 0x46, 0xe5, 0xa3, 0x1a, 0x06, 0x47, 0x54, 0xdc, 0x96, 0x94, 0xf2, 0xb7, + 0x09, 0xb5, 0xeb, 0x17, 0xe2, 0x16, 0xe4, 0xf2, 0x2a, 0x6a, 0x06, 0x13, + 0xe8, 0x8a, 0x68, 0x98, 0x3f, 0xe8, 0xe1, 0x65, 0x3a, 0xf7, 0xde, 0x21, + 0x17, 0xed, 0xad, 0xcd, 0x94, 0x3f, 0x6c, 0x4e, 0x07, 0xee, 0x4a, 0x37, + 0x0c, 0x3d, 0xa2, 0x94, 0xc0, 0xa5, 0x64, 0x0e, 0x39, 0x29, 0xfc, 0x20, + 0xdd, 0xe0, 0x3d, 0xae, 0xf4, 0x43, 0x29, 0xd1, 0xb0, 0x7f, 0x90, 0x9f, + 0xad, 0x84, 0x37, 0xce, 0x98, 0xfb, 0x63, 0xfd, 0x35, 0xb7, 0x92, 0x70, + 0x65, 0xfc, 0xf1, 0x7e, 0xbe, 0xaf, 0x92, 0xf2, 0xc9, 0x98, 0xc0, 0xda, + 0x3a, 0xde, 0xef, 0x29, 0x6f, 0x49, 0xb7, 0x86, 0xf5, 0xd0, 0xbc, 0x00, + 0xf9, 0x66, 0x43, 0x2a, 0x85, 0xf5, 0xe9, 0x86, 0xa9, 0x6d, 0x4a, 0x3d, + 0x26, 0x4b, 0x8b, 0x31, 0xae, 0x75, 0x90, 0x78, 0x7e, 0x50, 0xe0, 0x48, + 0x23, 0xc7, 0x18, 0x89, 0x44, 0xae, 0x90, 0x13, 0x86, 0xab, 0x68, 0x5e, + 0x05, 0xed, 0xe9, 0x6d, 0x8b, 0xa3, 0x7c, 0x84, 0xff, 0x26, 0x5e, 0x6d, + 0xa3, 0x1c, 0x08, 0xc7, 0xa1, 0xec, 0x7f, 0x3c, 0x54, 0x5c, 0xf3, 0x64, + 0x25, 0xf3, 0x8c, 0x42, 0x3c, 0x5c, 0xeb, 0x74, 0xf6, 0x3f, 0xdf, 0xb8, + 0x99, 0xfe, 0x2e, 0xc6, 0xf9, 0xd6, 0x74, 0x83, 0xb1, 0x53, 0xd1, 0xe0, + 0xc5, 0x42, 0xe4, 0x7f, 0x68, 0x1a, 0x9d, 0xad, 0x0d, 0x5c, 0xc6, 0x5d, + 0x49, 0xf3, 0x38, 0x73, 0x57, 0x69, 0xbc, 0x78, 0x5f, 0x53, 0xce, 0xc6, + 0x53, 0x79, 0x1b, 0x3d, 0xe9, 0x86, 0xf6, 0xa3, 0xf8, 0x57, 0x4c, 0xc6, + 0x16, 0x76, 0xbc, 0xa7, 0xfc, 0x4a, 0xba, 0x05, 0x1e, 0x58, 0x88, 0xf7, + 0xa2, 0x0d, 0x9b, 0xde, 0x53, 0xcc, 0xec, 0x83, 0x8a, 0x94, 0x2f, 0x24, + 0x14, 0xfc, 0x75, 0x32, 0x85, 0x89, 0x88, 0x8e, 0xad, 0x49, 0xcd, 0xab, + 0x21, 0xfd, 0x86, 0x96, 0x68, 0xa8, 0x1a, 0x71, 0xf1, 0x1f, 0x89, 0xd7, + 0x31, 0xb1, 0x86, 0xfd, 0xce, 0x7a, 0xb1, 0x0d, 0x31, 0x54, 0x5b, 0x65, + 0xa8, 0xde, 0x1f, 0x44, 0x6c, 0x64, 0x5a, 0xce, 0xb1, 0xf8, 0xb9, 0x75, + 0x7c, 0x4e, 0x80, 0x6d, 0x08, 0xa2, 0x7e, 0xff, 0x32, 0xe2, 0x75, 0x93, + 0x82, 0xb9, 0xb8, 0x8e, 0xd7, 0x96, 0x58, 0xb3, 0xb6, 0x84, 0x70, 0x6c, + 0xa4, 0xc8, 0x07, 0xfd, 0xa9, 0x76, 0x6c, 0x4c, 0xe3, 0x99, 0x3a, 0x3c, + 0x80, 0x23, 0x4b, 0x78, 0xff, 0x03, 0x97, 0xe2, 0xc9, 0x01, 0xb2, 0x9d, + 0xeb, 0xc5, 0x6c, 0x7c, 0xaf, 0xf8, 0x00, 0xb7, 0x7f, 0x89, 0x72, 0x25, + 0x91, 0x97, 0x5d, 0xb5, 0xac, 0xef, 0x54, 0x65, 0xf1, 0xdf, 0x23, 0x96, + 0x4d, 0xb9, 0xa8, 0xa3, 0xbb, 0x66, 0xd7, 0xf1, 0x39, 0xad, 0xf5, 0xe4, + 0xbf, 0x66, 0x28, 0xdf, 0xa5, 0x67, 0x1c, 0xe3, 0xbb, 0xe5, 0x64, 0x75, + 0x31, 0x46, 0x9b, 0xe8, 0x4e, 0x75, 0x40, 0x65, 0xff, 0xe9, 0xaf, 0x06, + 0xee, 0x90, 0xee, 0x3c, 0xbe, 0xa7, 0xa1, 0xf9, 0x14, 0x71, 0xd7, 0x7e, + 0xd5, 0xbc, 0xe4, 0x51, 0x21, 0x3c, 0x4a, 0xdc, 0xf3, 0x42, 0x3e, 0x86, + 0x27, 0xf3, 0xf0, 0x16, 0x38, 0x86, 0x38, 0xf7, 0x43, 0x1b, 0x65, 0x03, + 0xdf, 0x45, 0xc9, 0xde, 0x5b, 0xf0, 0x62, 0xc6, 0x46, 0x2e, 0x23, 0xe5, + 0x7a, 0x5b, 0xca, 0xb3, 0xb6, 0xd9, 0x7b, 0x3d, 0x95, 0xc6, 0x0f, 0x97, + 0xb6, 0x6c, 0x6a, 0x0f, 0x98, 0x9d, 0x67, 0x44, 0xbc, 0x63, 0x40, 0x18, + 0x78, 0x26, 0xdf, 0x5c, 0xf0, 0xf9, 0xd3, 0x79, 0x8b, 0x3e, 0x17, 0x51, + 0x4e, 0xa6, 0x88, 0x53, 0x38, 0x6f, 0x34, 0xbc, 0x63, 0x67, 0xe0, 0xd5, + 0x30, 0x27, 0xa9, 0xe4, 0x4b, 0xd6, 0x5d, 0xc7, 0x68, 0x13, 0xc5, 0x28, + 0xa3, 0xa0, 0x39, 0x41, 0x05, 0x68, 0xdd, 0x34, 0xc5, 0xb0, 0xe8, 0x9f, + 0x34, 0xe5, 0xc4, 0x6e, 0xca, 0xb5, 0x2d, 0x89, 0x28, 0xdc, 0xd5, 0x16, + 0x46, 0x33, 0x2a, 0x06, 0xd2, 0x27, 0x70, 0x22, 0x42, 0xee, 0x27, 0x7f, + 0xf4, 0x24, 0x43, 0xc8, 0xea, 0xfc, 0x3c, 0x44, 0xf6, 0xbf, 0x09, 0x2b, + 0x5a, 0x89, 0xa6, 0x85, 0xaf, 0x63, 0x52, 0x0f, 0x13, 0x26, 0xca, 0x0b, + 0x75, 0xa0, 0x99, 0x62, 0x56, 0x67, 0x59, 0xd8, 0x9f, 0x11, 0x58, 0x49, + 0x9f, 0xa3, 0x64, 0xdb, 0xc1, 0x4c, 0xd1, 0x17, 0x3d, 0x29, 0x73, 0x6a, + 0x27, 0x71, 0xc2, 0x91, 0xb4, 0x8d, 0x93, 0xb9, 0x9b, 0xf0, 0xe2, 0x90, + 0x8d, 0xc3, 0x69, 0x29, 0x63, 0x29, 0xb5, 0x8f, 0xec, 0x21, 0x5e, 0x48, + 0x61, 0x9c, 0xf0, 0x73, 0x30, 0x43, 0xf9, 0x4a, 0x39, 0xf0, 0x8f, 0xb6, + 0xd9, 0xf9, 0x5a, 0x20, 0x04, 0x37, 0xd2, 0x49, 0x36, 0x1a, 0x18, 0x4d, + 0x77, 0x52, 0x6e, 0xec, 0xc1, 0x90, 0xce, 0xf1, 0x0a, 0x61, 0xff, 0x48, + 0x0a, 0x4f, 0x66, 0xd8, 0xff, 0xb8, 0x51, 0x81, 0x87, 0xe6, 0x36, 0x8e, + 0xa5, 0x77, 0x29, 0x98, 0xd0, 0xc8, 0xc7, 0x84, 0xa5, 0x36, 0x1b, 0x15, + 0x83, 0x0d, 0x1d, 0xdf, 0x17, 0xbd, 0x70, 0xe7, 0x78, 0xf8, 0x36, 0xe5, + 0x44, 0xcc, 0xd9, 0x97, 0x88, 0x65, 0x3c, 0xb9, 0xc0, 0xb2, 0xfa, 0xbe, + 0x1a, 0xd8, 0x8a, 0x6b, 0x5a, 0xc1, 0x9c, 0xe2, 0x85, 0x1d, 0x1d, 0x91, + 0xd6, 0x21, 0x9c, 0xc9, 0xa5, 0x60, 0x44, 0xcd, 0xe6, 0xc3, 0xe2, 0x36, + 0x1c, 0x18, 0x4a, 0xa2, 0xeb, 0x16, 0x8d, 0xf0, 0x4f, 0xf8, 0xb6, 0x6e, + 0xc3, 0x93, 0xd9, 0xfb, 0x70, 0x6a, 0x4f, 0x39, 0x76, 0x5a, 0x51, 0x94, + 0x1c, 0xd4, 0xbc, 0x4a, 0xba, 0x63, 0xac, 0x4d, 0xc3, 0x11, 0xe2, 0x91, + 0x45, 0x49, 0x15, 0x5e, 0x2d, 0xdb, 0x29, 0x08, 0xd3, 0xeb, 0x31, 0x51, + 0xc0, 0xbb, 0x87, 0x6e, 0xe2, 0xb7, 0x0c, 0xe9, 0xfd, 0xe3, 0x4c, 0x39, + 0x7e, 0x13, 0x81, 0xd8, 0x40, 0x35, 0xe5, 0xde, 0x74, 0xc3, 0xc4, 0x63, + 0xca, 0xdf, 0x00, 0x57, 0x75, 0xe2, 0x50, 0xc6, 0xc0, 0xae, 0x1c, 0x70, + 0x77, 0x4e, 0xa0, 0xc6, 0x52, 0xf1, 0x83, 0x5c, 0x07, 0xe1, 0x61, 0x29, + 0x26, 0xea, 0x8a, 0x9c, 0x34, 0x4a, 0xf1, 0xf7, 0x6a, 0xf8, 0x7b, 0x10, + 0x93, 0x51, 0x33, 0x06, 0x70, 0xec, 0x54, 0x2c, 0x4d, 0x8c, 0x4c, 0x4f, + 0xae, 0x31, 0xf5, 0x2e, 0xca, 0xbd, 0x80, 0xf5, 0x1d, 0xe6, 0x09, 0xfa, + 0xfe, 0x19, 0x7f, 0xb6, 0x17, 0x31, 0x5a, 0xff, 0x7b, 0x18, 0x65, 0x1b, + 0x08, 0x69, 0x4b, 0x04, 0xc5, 0x69, 0x36, 0x9f, 0xa2, 0x28, 0x3b, 0x48, + 0x49, 0x3b, 0x22, 0xa8, 0x5e, 0x74, 0x60, 0x2c, 0x4f, 0xeb, 0xda, 0xf8, + 0xdd, 0x2c, 0x27, 0x3c, 0x15, 0xa6, 0x3a, 0x4f, 0x36, 0xb6, 0x63, 0xac, + 0xa9, 0x0b, 0x87, 0xf2, 0x87, 0xc8, 0xb7, 0xed, 0x84, 0xad, 0xbf, 0x22, + 0x0e, 0xa2, 0xbf, 0x33, 0xf4, 0x3c, 0x03, 0xf1, 0xac, 0xbd, 0x45, 0x62, + 0x0d, 0x63, 0xcb, 0xc1, 0x81, 0x4c, 0x27, 0x4a, 0x07, 0x1a, 0x8c, 0x8d, + 0xe8, 0x96, 0xfd, 0x6a, 0x27, 0x02, 0xe3, 0xeb, 0xe8, 0x0c, 0x7e, 0x37, + 0xcb, 0x2f, 0xa7, 0xc2, 0xc5, 0x1c, 0xfa, 0x1d, 0x27, 0x31, 0xc7, 0x1f, + 0x48, 0xcd, 0xde, 0x5b, 0x86, 0x7b, 0xb2, 0xa6, 0x3d, 0xa1, 0x2c, 0x25, + 0xdd, 0x39, 0x8f, 0x39, 0x9f, 0x7f, 0x42, 0x7b, 0xd8, 0x0f, 0x31, 0xc2, + 0xd4, 0x01, 0xe9, 0x76, 0xb2, 0x4e, 0xb3, 0xfb, 0x99, 0xcb, 0x04, 0xf5, + 0x19, 0x1d, 0x84, 0x0f, 0xe6, 0xb3, 0x3f, 0xa4, 0xbf, 0x8d, 0x63, 0x69, + 0x0d, 0x27, 0x06, 0x63, 0x74, 0xa6, 0xc0, 0x3f, 0x37, 0x96, 0x4d, 0x4d, + 0x04, 0x6c, 0x3c, 0x4f, 0x38, 0x7b, 0x2e, 0xc3, 0x7e, 0xa3, 0x7d, 0x49, + 0xae, 0xb3, 0x73, 0xc5, 0xf9, 0x3d, 0x5b, 0x64, 0xb6, 0x43, 0xc7, 0xab, + 0xa9, 0x87, 0x68, 0x2f, 0xe3, 0x6b, 0x21, 0x16, 0x47, 0x6b, 0x71, 0xed, + 0xc2, 0xf9, 0x98, 0x8c, 0xd4, 0x61, 0x0e, 0x71, 0x49, 0xcc, 0xfa, 0x8a, + 0x6c, 0xff, 0x16, 0xe7, 0x82, 0x46, 0xb9, 0x7a, 0x15, 0xce, 0x3d, 0xf2, + 0x92, 0xd4, 0xad, 0x30, 0x63, 0xde, 0xee, 0xc5, 0x55, 0x78, 0xf7, 0x40, + 0x4f, 0x98, 0x7d, 0xde, 0x93, 0x04, 0xb6, 0xa6, 0x07, 0xe4, 0x27, 0x85, + 0xda, 0xa2, 0x12, 0xef, 0x34, 0xd8, 0x3f, 0x0d, 0x6c, 0x97, 0xff, 0xa0, + 0x72, 0xcc, 0x4f, 0xce, 0xf8, 0x61, 0x89, 0xbc, 0xba, 0x8e, 0x73, 0xa5, + 0x97, 0xfe, 0xd6, 0xe9, 0x8c, 0x30, 0x22, 0x96, 0x2d, 0x7f, 0xb9, 0x86, + 0xbf, 0xdf, 0x41, 0xcf, 0xea, 0xe8, 0xf3, 0x8b, 0x72, 0xd9, 0xff, 0xba, + 0x4f, 0xff, 0x03, 0xf7, 0x75, 0xd3, 0x67, 0x94, 0x9e, 0x83, 0x30, 0x78, + 0x5c, 0xac, 0x2f, 0xf6, 0xaf, 0x9a, 0x6a, 0x1d, 0x17, 0xdd, 0x85, 0x9e, + 0x95, 0xef, 0x2b, 0xf4, 0xc6, 0x92, 0xb9, 0xae, 0x94, 0xd6, 0xbc, 0x5d, + 0x58, 0x43, 0x3d, 0x0a, 0x61, 0x52, 0x1d, 0x37, 0xf0, 0x4e, 0x8e, 0x79, + 0x60, 0x15, 0xfa, 0xf7, 0x48, 0xb9, 0xc1, 0xfe, 0x02, 0xf7, 0xb0, 0x54, + 0x33, 0xa2, 0x78, 0xda, 0x6a, 0x59, 0xb5, 0x05, 0x73, 0x61, 0xac, 0x0e, + 0x50, 0xcd, 0x35, 0xc4, 0x67, 0x7b, 0x80, 0x87, 0x32, 0x73, 0x11, 0xb2, + 0xa4, 0x6c, 0x6f, 0x9d, 0x96, 0xa5, 0x4d, 0x2d, 0x7d, 0x1b, 0x09, 0x87, + 0x17, 0x97, 0x6d, 0xbb, 0xad, 0x0c, 0x56, 0xe7, 0x61, 0x51, 0x81, 0xd0, + 0x13, 0xd7, 0x53, 0xad, 0x55, 0xd1, 0x9f, 0xa9, 0x41, 0xe9, 0x98, 0x8a, + 0x5d, 0xc4, 0x07, 0xa5, 0x6d, 0x2a, 0x1e, 0xcc, 0xbb, 0x78, 0xcd, 0xae, + 0x82, 0xb7, 0x8e, 0x7b, 0x73, 0xe6, 0x42, 0x4f, 0x6c, 0x6f, 0x0b, 0x63, + 0xc7, 0xe8, 0xbe, 0x2a, 0xf6, 0x79, 0x26, 0xc3, 0x77, 0x78, 0xa2, 0xbb, + 0x8d, 0xd7, 0xf1, 0x3d, 0xb4, 0x27, 0x53, 0x81, 0x87, 0xb3, 0x9f, 0x4a, + 0x6f, 0x35, 0xaf, 0xe7, 0x7d, 0x86, 0x08, 0xec, 0xe5, 0x5e, 0xca, 0x45, + 0x6c, 0xaf, 0x94, 0xf7, 0xda, 0xd3, 0x72, 0x71, 0x93, 0x94, 0x55, 0xad, + 0x2d, 0xc4, 0x21, 0x01, 0xea, 0x2b, 0xa8, 0x66, 0x0a, 0x17, 0x0a, 0xbd, + 0x5b, 0x69, 0xb3, 0x0d, 0x0d, 0x1d, 0xa3, 0xf0, 0x44, 0x0f, 0xdd, 0x33, + 0x3a, 0x6a, 0xe1, 0xe9, 0x51, 0xbe, 0x07, 0x8c, 0x3d, 0x71, 0x38, 0xa5, + 0x50, 0x4c, 0xe1, 0xfd, 0x9a, 0xf8, 0xe4, 0xec, 0x98, 0x8e, 0x9f, 0x8d, + 0x35, 0xe3, 0x0c, 0xf5, 0x96, 0xaf, 0x8e, 0x85, 0xe9, 0x1c, 0x90, 0x3f, + 0xea, 0xc4, 0xd3, 0x7b, 0x2e, 0xcb, 0xe5, 0x09, 0x15, 0xab, 0x2c, 0x33, + 0x16, 0x14, 0x70, 0xef, 0x25, 0xce, 0x6a, 0x6c, 0x2d, 0xa5, 0x3e, 0x45, + 0x9e, 0x0c, 0x93, 0x0f, 0x2a, 0x1c, 0xb9, 0xb5, 0xa7, 0xcd, 0x6a, 0x3f, + 0x0f, 0xb6, 0x8f, 0xf7, 0xf0, 0x73, 0x4f, 0xa4, 0x53, 0xd6, 0xa6, 0x8b, + 0x68, 0xc4, 0xc0, 0xd8, 0x22, 0x3c, 0x34, 0x0e, 0x9d, 0x7d, 0xfe, 0xe0, + 0x95, 0x58, 0x4c, 0x4b, 0xc5, 0xb2, 0xda, 0xd7, 0xe3, 0x9e, 0x2a, 0xc6, + 0x20, 0xef, 0x0b, 0x3a, 0xbd, 0x18, 0xa5, 0x58, 0x3c, 0x9c, 0x8e, 0x8a, + 0x83, 0x43, 0xc0, 0xf6, 0xcc, 0x25, 0xea, 0x19, 0x25, 0x5e, 0xb6, 0xb7, + 0xc5, 0x68, 0x8b, 0xd8, 0x66, 0x73, 0x6e, 0x2f, 0x83, 0xab, 0x07, 0x70, + 0xab, 0x05, 0xf7, 0x41, 0x7b, 0x19, 0x26, 0x3b, 0x60, 0xec, 0xb2, 0x3d, + 0xbd, 0x04, 0xe6, 0xe9, 0xeb, 0xa8, 0x36, 0x5c, 0x4b, 0xfe, 0xea, 0xb3, + 0xbc, 0x5e, 0x22, 0x0a, 0xe4, 0xf3, 0xe6, 0xa6, 0x57, 0x48, 0xdf, 0x1c, + 0xd5, 0x9f, 0x1c, 0xf5, 0x69, 0xcf, 0x90, 0x1d, 0x9b, 0x13, 0xa6, 0x4b, + 0x63, 0x84, 0x1b, 0xa4, 0xb9, 0x63, 0x8c, 0x6a, 0xc4, 0x53, 0x19, 0x93, + 0xbc, 0xcc, 0x79, 0x06, 0xad, 0x94, 0xfa, 0xa8, 0xf7, 0xac, 0xf7, 0xab, + 0xb8, 0xbf, 0xa7, 0x5e, 0x16, 0xcb, 0x87, 0x04, 0xc6, 0x08, 0xf3, 0xe3, + 0x8b, 0xcc, 0xd3, 0xeb, 0xe1, 0x4d, 0xcc, 0x81, 0xd9, 0x57, 0x4a, 0x8a, + 0x5c, 0xa4, 0x39, 0x23, 0x1b, 0x69, 0xb4, 0x5f, 0x87, 0xa9, 0x8f, 0x05, + 0x3e, 0x95, 0x87, 0x6a, 0x30, 0x37, 0x88, 0x4f, 0xa4, 0xb1, 0x8e, 0xf7, + 0xb0, 0xfd, 0xbd, 0x78, 0x30, 0x05, 0x2d, 0xe8, 0xa8, 0x89, 0xb1, 0x34, + 0x70, 0x2e, 0x6d, 0xe0, 0x10, 0xcd, 0x40, 0x88, 0x34, 0xb4, 0x6f, 0x81, + 0xd7, 0x19, 0x2c, 0xf4, 0xa2, 0x5a, 0x22, 0x1d, 0x37, 0x57, 0xdd, 0x2e, + 0x04, 0xe1, 0x8b, 0xba, 0xd9, 0x71, 0xee, 0x1f, 0xd4, 0xc4, 0x42, 0x9e, + 0xab, 0xf2, 0xcc, 0xb7, 0xa6, 0x3e, 0x09, 0xf6, 0x95, 0x4e, 0x7d, 0xd0, + 0x65, 0x89, 0x08, 0xdb, 0xee, 0x75, 0x91, 0x9d, 0x9d, 0x3b, 0x48, 0xff, + 0x6e, 0xb2, 0x69, 0xb3, 0xe5, 0xb5, 0xd3, 0xa9, 0x54, 0x63, 0xcc, 0xd8, + 0x79, 0xb2, 0xfd, 0x56, 0xca, 0xf3, 0x6c, 0xfe, 0x5f, 0x0a, 0xfe, 0x3c, + 0x98, 0x3f, 0x4b, 0xbe, 0x8b, 0x51, 0x2f, 0xcd, 0xbd, 0xbd, 0x45, 0x7d, + 0xb6, 0x41, 0xbc, 0x3a, 0x8f, 0xfa, 0xeb, 0x1a, 0xea, 0xbb, 0x41, 0x98, + 0x62, 0x3d, 0xc3, 0xa2, 0x7f, 0x0f, 0xdc, 0xb7, 0x6d, 0xd3, 0xe3, 0x81, + 0xd4, 0xd5, 0xa5, 0xbc, 0xd3, 0x36, 0x50, 0xe2, 0x58, 0xcd, 0xef, 0xd2, + 0x3c, 0x99, 0x25, 0xfc, 0x7f, 0x60, 0x33, 0x76, 0xe5, 0xc9, 0x32, 0x8a, + 0xd5, 0xfb, 0xb4, 0x28, 0xd0, 0x06, 0x8e, 0x95, 0xf1, 0x91, 0x5d, 0x01, + 0xa3, 0x8e, 0x7a, 0x4a, 0xe7, 0xa4, 0x8c, 0x59, 0xed, 0xd4, 0xe3, 0x5b, + 0x7a, 0x1f, 0x78, 0xfd, 0x4e, 0xb8, 0xb5, 0x06, 0x08, 0xa7, 0xb4, 0x66, + 0x4a, 0x1a, 0x51, 0xce, 0x01, 0x5e, 0x67, 0xed, 0xfb, 0x04, 0x9f, 0xca, + 0xae, 0x28, 0xaf, 0x77, 0xb1, 0x3e, 0x05, 0xf1, 0x19, 0xe5, 0x81, 0x51, + 0xad, 0x62, 0x1b, 0xe9, 0xa6, 0x38, 0xd6, 0xd4, 0xdb, 0xcc, 0xf1, 0xd5, + 0x8c, 0x57, 0x15, 0xaa, 0x63, 0xc5, 0xde, 0xc1, 0x99, 0x99, 0x39, 0x72, + 0xbe, 0xd8, 0xb2, 0x77, 0x9e, 0xd8, 0x4c, 0x78, 0xfe, 0x5a, 0x02, 0x2b, + 0xcb, 0x10, 0x6f, 0x3e, 0x8d, 0x10, 0x76, 0x10, 0x66, 0xc2, 0x4e, 0x48, + 0xfc, 0x62, 0x2f, 0xdc, 0x53, 0x03, 0x52, 0x86, 0x52, 0xcf, 0x22, 0x4d, + 0x36, 0x8c, 0x25, 0x20, 0x32, 0xb6, 0xc0, 0xe4, 0x3a, 0x1d, 0x54, 0xae, + 0xf5, 0x8f, 0x6c, 0x0d, 0xc6, 0x1a, 0x81, 0xc8, 0x12, 0x03, 0xbf, 0xb1, + 0x7f, 0x84, 0xae, 0x3a, 0xe8, 0x31, 0xc7, 0xca, 0x4e, 0xe1, 0x51, 0x78, + 0x75, 0x08, 0xa9, 0x0e, 0xbf, 0x83, 0xb8, 0x40, 0x36, 0xa1, 0x56, 0xa0, + 0xdc, 0x61, 0x9b, 0xe1, 0x96, 0x25, 0x68, 0x5f, 0xad, 0x65, 0x7f, 0x00, + 0xb1, 0x20, 0xe4, 0x58, 0x9d, 0xff, 0x4e, 0xf6, 0x97, 0x3b, 0x87, 0xb1, + 0x65, 0x35, 0x94, 0x71, 0x9b, 0xd7, 0xf1, 0xbb, 0xbd, 0x94, 0x07, 0xd0, + 0x83, 0x8e, 0x65, 0x9c, 0x87, 0xe9, 0x02, 0xa5, 0xd4, 0x30, 0x9a, 0x84, + 0x5e, 0xe5, 0xf1, 0x52, 0x54, 0xe1, 0xce, 0xa4, 0xd7, 0x17, 0xa5, 0xd1, + 0x28, 0xec, 0x68, 0xfd, 0xaf, 0xc7, 0x4d, 0xf7, 0xa2, 0x98, 0x87, 0x3d, + 0x99, 0xeb, 0xe1, 0x45, 0x4d, 0xcf, 0x50, 0x86, 0x69, 0x6d, 0xa1, 0x6f, + 0xa5, 0xb9, 0x2a, 0x2c, 0x96, 0xed, 0xe5, 0x99, 0xd7, 0xb4, 0x0d, 0x85, + 0x79, 0x45, 0x45, 0xb0, 0x49, 0x23, 0xfb, 0xcd, 0x2c, 0xff, 0x5e, 0xb0, + 0xc0, 0xfa, 0x92, 0xd8, 0xaa, 0x2b, 0x05, 0x0e, 0x0f, 0x0d, 0xc7, 0xc4, + 0x76, 0x9a, 0x1d, 0x3e, 0xb0, 0x27, 0x9e, 0x88, 0xc2, 0xc0, 0x08, 0x71, + 0x8b, 0xbb, 0xc6, 0x45, 0xe3, 0x12, 0x78, 0xd5, 0x0e, 0xdc, 0x3b, 0x06, + 0x21, 0x3e, 0x4a, 0xfc, 0x9c, 0xea, 0xf8, 0xe7, 0xf2, 0x97, 0x36, 0xd7, + 0x7c, 0x0b, 0x31, 0x8a, 0xc1, 0x3f, 0x51, 0x2c, 0x4b, 0x5a, 0x5f, 0xe3, + 0xbc, 0x95, 0xcf, 0x92, 0xfe, 0xee, 0xb7, 0x54, 0x24, 0x96, 0x70, 0x5f, + 0xcd, 0xbd, 0xdb, 0x3a, 0x9e, 0xfd, 0xe8, 0xee, 0x4a, 0xb8, 0x75, 0xdc, + 0xab, 0x13, 0x5f, 0x2c, 0x61, 0x8c, 0x1c, 0x17, 0x8f, 0x10, 0x4f, 0x12, + 0xf0, 0x8c, 0x39, 0x96, 0x42, 0x35, 0x5a, 0xc3, 0x8b, 0xa3, 0x15, 0x38, + 0x4a, 0xe0, 0xc8, 0x8e, 0xb2, 0xdd, 0xc7, 0xc5, 0x8e, 0x1c, 0xaf, 0x27, + 0x8c, 0x51, 0x2d, 0x3f, 0x9a, 0x21, 0x8c, 0x51, 0xad, 0x7a, 0x8e, 0x78, + 0xef, 0x48, 0x61, 0x06, 0x34, 0x75, 0xaf, 0x80, 0xe3, 0x66, 0xc2, 0x31, + 0xfb, 0xf0, 0x3e, 0xd9, 0x15, 0x61, 0x6c, 0x50, 0x6f, 0x45, 0x7d, 0x5d, + 0x15, 0x71, 0xc7, 0x45, 0xe2, 0x8e, 0x8b, 0x74, 0xe1, 0x81, 0x36, 0x1a, + 0x44, 0xcb, 0x0b, 0xf8, 0xd2, 0x14, 0xaa, 0xbb, 0xcb, 0xd3, 0xc4, 0xdf, + 0xf4, 0xb9, 0xdd, 0xba, 0xb1, 0x80, 0xcd, 0x1b, 0x0a, 0xdc, 0x1e, 0x16, + 0xb7, 0x13, 0x3f, 0xef, 0x4e, 0x90, 0x5b, 0x88, 0x5f, 0xef, 0x8a, 0xf3, + 0xef, 0x21, 0x36, 0xf4, 0x41, 0xda, 0x48, 0x8e, 0x7e, 0x97, 0xce, 0x7d, + 0x98, 0x62, 0xb7, 0x22, 0x51, 0xc2, 0xd8, 0xa9, 0xaa, 0x72, 0xac, 0xde, + 0x0f, 0x89, 0x3b, 0x2a, 0x9d, 0x16, 0xf7, 0xb0, 0x78, 0x8b, 0xf6, 0x48, + 0xd9, 0x93, 0xdc, 0x8c, 0x09, 0x7a, 0x47, 0x98, 0x6c, 0xfe, 0x84, 0x02, + 0x15, 0x73, 0x7a, 0x70, 0x5c, 0x0f, 0xe1, 0x31, 0xd2, 0xa7, 0x37, 0x69, + 0xed, 0xbb, 0x3a, 0x60, 0x0e, 0x75, 0x53, 0xbf, 0x78, 0x03, 0xcd, 0x50, + 0x4d, 0xf1, 0x09, 0xb3, 0x94, 0xf9, 0x41, 0x51, 0xc8, 0xbf, 0xec, 0x23, + 0x0e, 0xd7, 0xff, 0x6d, 0x2b, 0xae, 0xd8, 0x2a, 0x2b, 0x94, 0x02, 0x86, + 0xa5, 0xfc, 0x5e, 0xaa, 0xe5, 0xf4, 0xb9, 0xc0, 0x46, 0x69, 0xac, 0x2d, + 0xe0, 0x4c, 0x2b, 0x71, 0x16, 0xe1, 0xd5, 0x74, 0x90, 0xbe, 0x0b, 0xbc, + 0x61, 0x71, 0xde, 0x2f, 0x82, 0x9d, 0xfb, 0x0b, 0xb6, 0x9d, 0x30, 0x48, + 0xc5, 0xaf, 0xdc, 0x20, 0xdc, 0x9a, 0xcd, 0xd4, 0xd7, 0x69, 0x51, 0xe7, + 0x2c, 0xd6, 0xd0, 0xbc, 0xc6, 0x71, 0xff, 0x66, 0x61, 0xa6, 0x39, 0x8b, + 0x6b, 0x72, 0xac, 0x47, 0x80, 0x7a, 0xfc, 0x0b, 0x9c, 0x77, 0xa4, 0x8b, + 0xa0, 0x79, 0x44, 0xeb, 0xd7, 0xe2, 0xf7, 0xf3, 0x19, 0x84, 0xa5, 0x57, + 0xe8, 0xd3, 0x5c, 0x05, 0xfc, 0xfd, 0x8c, 0xbe, 0x37, 0x14, 0xfd, 0x9a, + 0x59, 0x2b, 0xb3, 0x33, 0xf8, 0xbe, 0xae, 0x51, 0xca, 0xa7, 0x6d, 0xa5, + 0x80, 0x19, 0xae, 0x97, 0x77, 0x72, 0x2d, 0xa4, 0x39, 0x6f, 0x07, 0xcd, + 0xec, 0x9b, 0x89, 0x83, 0x8d, 0xf1, 0x7c, 0x21, 0xff, 0x55, 0xaa, 0x7f, + 0x37, 0xc7, 0x5b, 0x7a, 0xf3, 0xc8, 0x61, 0x82, 0xea, 0x5f, 0x80, 0xea, + 0x5f, 0xdf, 0x9e, 0xb9, 0x84, 0x03, 0xb8, 0x1f, 0x51, 0x2d, 0xad, 0x6e, + 0xad, 0x40, 0xea, 0x89, 0x63, 0x84, 0xb5, 0x69, 0xb9, 0xa1, 0xb1, 0xe5, + 0xf4, 0x01, 0x1c, 0x85, 0xf1, 0x67, 0xd3, 0xd4, 0x5f, 0x0a, 0x68, 0x6d, + 0x35, 0x68, 0xe0, 0xda, 0x97, 0xe7, 0x19, 0x4a, 0x9e, 0x0c, 0x59, 0xd6, + 0xaa, 0x90, 0x50, 0xa8, 0x5f, 0xf1, 0x84, 0xb6, 0x24, 0x84, 0x0a, 0xaa, + 0x31, 0xe5, 0x63, 0x1a, 0x4a, 0xc6, 0x1a, 0x51, 0x46, 0xb5, 0xa7, 0x74, + 0xac, 0x58, 0x23, 0x4a, 0x0f, 0xcf, 0xda, 0x05, 0x2d, 0xe0, 0xbc, 0x81, + 0x0d, 0xe9, 0x10, 0xae, 0x5b, 0x3c, 0x61, 0x52, 0x78, 0x71, 0x5b, 0x3b, + 0xcd, 0xfc, 0xd7, 0x58, 0x53, 0xd7, 0xe1, 0x6f, 0xe5, 0x64, 0x3d, 0xc7, + 0xeb, 0xb2, 0xfc, 0x46, 0xa3, 0x8a, 0xed, 0xd7, 0x74, 0xc0, 0xbb, 0x85, + 0x71, 0xa8, 0x60, 0x0b, 0xad, 0x59, 0x71, 0x8d, 0xe5, 0xf5, 0xe0, 0xeb, + 0x40, 0x1d, 0xaf, 0x59, 0xbe, 0xa5, 0x14, 0x2d, 0xbd, 0x51, 0x58, 0x84, + 0x81, 0x0d, 0xd4, 0xf3, 0xf3, 0x3a, 0x3e, 0x8f, 0xe3, 0x7a, 0x9e, 0xee, + 0x62, 0x3f, 0x28, 0x78, 0x2b, 0xc5, 0xb9, 0x20, 0xe5, 0xbb, 0xad, 0xec, + 0x5f, 0xee, 0x15, 0x72, 0xec, 0x47, 0x83, 0x7f, 0x9c, 0x2a, 0xcc, 0x56, + 0x57, 0x72, 0x64, 0x9f, 0x3e, 0xf3, 0xff, 0x66, 0x21, 0xce, 0x85, 0x38, + 0x63, 0x7f, 0x99, 0xfa, 0x23, 0x88, 0x29, 0x9b, 0xe3, 0x65, 0x51, 0xbc, + 0x22, 0x00, 0xf1, 0x5a, 0x2a, 0x89, 0xaa, 0x05, 0x8e, 0x75, 0x5a, 0x92, + 0x52, 0x41, 0x27, 0x84, 0x78, 0x75, 0x08, 0xe9, 0x4c, 0x31, 0xbf, 0x7b, + 0x92, 0x56, 0xe7, 0x43, 0xc2, 0xd4, 0xbb, 0x05, 0xe1, 0x6c, 0xe8, 0x73, + 0x69, 0x27, 0xa7, 0x65, 0xc4, 0x62, 0xbc, 0xf1, 0x1d, 0x8c, 0x39, 0x6b, + 0x68, 0xb5, 0x22, 0x28, 0xee, 0x6b, 0xb0, 0x32, 0x4a, 0xf6, 0x24, 0x3b, + 0xd1, 0x55, 0x43, 0xb5, 0x8a, 0x70, 0xf9, 0x75, 0xea, 0xb5, 0x5d, 0xba, + 0x62, 0x80, 0xfc, 0x73, 0x28, 0xf1, 0xe7, 0xc4, 0x59, 0x7c, 0xde, 0x77, + 0xa4, 0x57, 0x57, 0xf0, 0x19, 0x71, 0xc0, 0xef, 0x72, 0x77, 0x88, 0xe2, + 0x0a, 0xca, 0xdd, 0x12, 0xca, 0xdd, 0x2a, 0xca, 0xdd, 0x83, 0x94, 0xbb, + 0xf9, 0x99, 0xdc, 0x0d, 0xd3, 0xfb, 0xc1, 0xdc, 0xac, 0xaf, 0xd9, 0xce, + 0xdf, 0xf7, 0xc7, 0xfb, 0xd3, 0x6e, 0x84, 0xb9, 0x47, 0x17, 0x8b, 0xf7, + 0x2a, 0xa8, 0x24, 0xee, 0x3d, 0x9d, 0x78, 0x67, 0xfa, 0xd0, 0x6a, 0xe6, + 0x9c, 0xdd, 0x05, 0x8c, 0x8e, 0x64, 0xb8, 0xc6, 0x59, 0x18, 0x4b, 0x0b, + 0x1c, 0xb7, 0xff, 0x44, 0x62, 0x2d, 0x9f, 0xc3, 0xba, 0xf0, 0x7e, 0x3e, + 0x6f, 0x36, 0x5f, 0x66, 0xef, 0x98, 0xcd, 0x21, 0xc6, 0xf3, 0x95, 0x7b, + 0x67, 0xfc, 0xfa, 0xb9, 0x6c, 0x4c, 0x7e, 0x3b, 0x82, 0xf2, 0x62, 0x9c, + 0x03, 0xc3, 0xdc, 0xb7, 0x7f, 0x30, 0xbd, 0x5e, 0x67, 0x1f, 0x28, 0x94, + 0x0f, 0xaf, 0x4c, 0xf7, 0xd6, 0xb0, 0x3e, 0x2e, 0xce, 0xd9, 0x2f, 0x4f, + 0x77, 0xe9, 0x7c, 0xbf, 0x2e, 0x5a, 0x48, 0xb7, 0x32, 0xd2, 0x6d, 0x63, + 0x62, 0x72, 0xba, 0x29, 0xc2, 0xe7, 0xed, 0x9e, 0x89, 0x0d, 0x63, 0xd5, + 0x13, 0xdb, 0x52, 0x15, 0x58, 0x91, 0x4d, 0x45, 0x8a, 0x73, 0x3c, 0xd5, + 0xa1, 0x64, 0x80, 0x38, 0xbf, 0xa8, 0x63, 0x74, 0x89, 0x94, 0x1d, 0x49, + 0xf6, 0xe9, 0x91, 0x48, 0x31, 0xce, 0xb3, 0x3a, 0xf3, 0xfb, 0x9d, 0xf4, + 0xec, 0x73, 0xa9, 0x27, 0x19, 0xcb, 0x49, 0xfa, 0x6e, 0xb9, 0x0b, 0x04, + 0xaf, 0x2d, 0xd8, 0x44, 0x78, 0x48, 0x47, 0x8a, 0xf7, 0x9c, 0x9e, 0xf9, + 0xfd, 0x2c, 0x45, 0x35, 0x36, 0xd4, 0xc5, 0x5c, 0x74, 0x82, 0x66, 0xd0, + 0x17, 0x68, 0x26, 0x3d, 0x46, 0x75, 0xf7, 0xf9, 0x2b, 0x75, 0x97, 0x6b, + 0x71, 0xa1, 0xf6, 0x76, 0x84, 0x07, 0xb7, 0xca, 0x2a, 0x8b, 0xe7, 0x2e, + 0xfe, 0x2d, 0x28, 0xd4, 0x9e, 0x6b, 0xe3, 0xdf, 0x0a, 0xd1, 0x11, 0x3a, + 0xac, 0xe1, 0xe7, 0x39, 0xce, 0x71, 0x03, 0x46, 0xee, 0x7b, 0xf5, 0x45, + 0xdf, 0x91, 0x39, 0xce, 0x6a, 0xef, 0x86, 0xb6, 0xfb, 0xd7, 0x96, 0x1d, + 0xae, 0xeb, 0x2a, 0x71, 0x80, 0x9f, 0xa6, 0x6b, 0xba, 0x34, 0x27, 0x8b, + 0x20, 0xd5, 0xbc, 0x00, 0xd5, 0x9d, 0x73, 0x58, 0xbb, 0x56, 0x71, 0x7e, + 0x72, 0x6d, 0x90, 0x02, 0xbd, 0xad, 0x06, 0xf7, 0xbf, 0x91, 0xf2, 0xb2, + 0x41, 0x98, 0xfb, 0x76, 0x12, 0x56, 0xee, 0x1c, 0xa4, 0x36, 0xd4, 0x31, + 0xbd, 0xd5, 0x4a, 0x1f, 0xe6, 0x0f, 0xde, 0x8f, 0x7a, 0xfa, 0x5b, 0x71, + 0x04, 0xc5, 0x6d, 0xe8, 0x81, 0x31, 0xcb, 0x30, 0x56, 0xa6, 0xca, 0x89, + 0x47, 0x74, 0x3c, 0x9e, 0xd7, 0x68, 0xde, 0xa8, 0xc1, 0x0f, 0xf3, 0xfb, + 0x10, 0x73, 0x76, 0x05, 0x82, 0x8d, 0x3a, 0x16, 0x38, 0xa1, 0xae, 0x39, + 0xce, 0x04, 0xea, 0x96, 0xd2, 0x68, 0xe7, 0x5c, 0x5e, 0xfb, 0x55, 0xe2, + 0xe5, 0xf9, 0xc4, 0xc7, 0xbf, 0x6a, 0x12, 0x5a, 0xbd, 0x53, 0xde, 0xff, + 0xdb, 0x46, 0x47, 0x1c, 0x3b, 0x1c, 0xa3, 0x3a, 0x2c, 0xb7, 0x52, 0xcf, + 0x27, 0x77, 0xa5, 0xb8, 0xaf, 0x5e, 0x1a, 0x25, 0xbf, 0x14, 0xf4, 0x7c, + 0x86, 0x70, 0xb1, 0x25, 0xa1, 0x50, 0x3f, 0x20, 0xb0, 0x81, 0xfa, 0x86, + 0x03, 0xb9, 0x32, 0xca, 0x51, 0x9a, 0xb7, 0x68, 0x36, 0xb8, 0x94, 0x0e, + 0xc5, 0x7e, 0x96, 0x0e, 0x40, 0x4d, 0x7e, 0x2a, 0xcd, 0xa0, 0x15, 0x6b, + 0x16, 0xa1, 0xd8, 0xcb, 0x39, 0x3b, 0x5a, 0xf4, 0xe9, 0x3a, 0x64, 0x6b, + 0xe0, 0x45, 0x1c, 0x05, 0x25, 0xc9, 0x0b, 0x72, 0x42, 0xa7, 0x3b, 0x0a, + 0xfd, 0x8a, 0x2b, 0x1e, 0x4b, 0xd3, 0x04, 0x6f, 0x19, 0x78, 0x2c, 0xb7, + 0x4a, 0xec, 0x4b, 0x2b, 0x3f, 0x88, 0xa1, 0x17, 0xe7, 0x12, 0x8b, 0x94, + 0xde, 0x42, 0x1d, 0xfd, 0x53, 0x6c, 0x5c, 0xd4, 0x47, 0x3d, 0x61, 0x17, + 0x61, 0xc6, 0xa0, 0x59, 0xa2, 0x04, 0xdf, 0xa7, 0xb6, 0x66, 0x81, 0xc3, + 0x39, 0xd1, 0x27, 0xb6, 0x1e, 0xe6, 0x35, 0x2d, 0x51, 0xfe, 0x3d, 0x72, + 0x47, 0x66, 0x15, 0xd5, 0x35, 0x95, 0xe6, 0x05, 0x4f, 0xec, 0x4a, 0x29, + 0xdf, 0xa8, 0x86, 0x44, 0x3c, 0xe1, 0x8a, 0xfe, 0xf4, 0x5d, 0xe2, 0x98, + 0xfe, 0x9f, 0xf2, 0x39, 0xda, 0x7b, 0xe3, 0xe2, 0x6a, 0x74, 0xad, 0xe6, + 0xbe, 0x74, 0xa5, 0xd8, 0x99, 0x96, 0x18, 0xb5, 0x25, 0xde, 0xb4, 0xb9, + 0x1f, 0x25, 0x9e, 0x5c, 0xac, 0x90, 0x8e, 0x34, 0xd7, 0x58, 0x01, 0xea, + 0xd5, 0xca, 0x68, 0x16, 0xc8, 0x89, 0xb4, 0x5e, 0x8e, 0x81, 0xe6, 0x7d, + 0x22, 0x1b, 0x29, 0x47, 0x2d, 0xe5, 0x5a, 0xd8, 0xaa, 0xc5, 0xa0, 0x3e, + 0x0f, 0xc3, 0x99, 0xff, 0x6e, 0xec, 0xdb, 0xa3, 0xa3, 0xaa, 0xb3, 0x74, + 0xbf, 0x53, 0x55, 0x49, 0x2a, 0xef, 0x93, 0xa4, 0x02, 0x15, 0x8d, 0xe6, + 0x94, 0x39, 0x95, 0x54, 0x93, 0x28, 0xa7, 0x42, 0xa2, 0xb1, 0xa7, 0xee, + 0x50, 0xad, 0xa0, 0x51, 0xc0, 0x0e, 0x48, 0xaf, 0xc1, 0x6e, 0x66, 0x59, + 0x17, 0x01, 0x11, 0x1f, 0x1d, 0x69, 0xe6, 0xae, 0xf4, 0x3c, 0x6e, 0xce, + 0x24, 0x80, 0x11, 0x2a, 0x55, 0x09, 0x10, 0xc5, 0x99, 0xb5, 0xae, 0x05, + 0x09, 0x09, 0xad, 0x95, 0x04, 0xba, 0xbd, 0x73, 0xd3, 0xfd, 0xc7, 0x98, + 0xd6, 0x28, 0xd8, 0x6a, 0xe3, 0xf4, 0xc3, 0x4b, 0xcf, 0x75, 0xae, 0x5c, + 0x90, 0x87, 0x6f, 0xed, 0x6e, 0xa7, 0xc3, 0xd8, 0xc3, 0xb9, 0xdf, 0x3e, + 0xa7, 0x2a, 0x04, 0xc6, 0x76, 0xda, 0xb5, 0x6a, 0x15, 0x55, 0xe7, 0xd4, + 0xef, 0xb1, 0x7f, 0x7b, 0x7f, 0xfb, 0xfb, 0x7e, 0xbf, 0x7d, 0xe2, 0x54, + 0x55, 0x1e, 0xa4, 0x9d, 0x49, 0x65, 0x94, 0xf1, 0x78, 0xd2, 0xe3, 0x12, + 0x9d, 0x42, 0x7d, 0xe8, 0x25, 0xee, 0x15, 0x62, 0xde, 0xfe, 0x36, 0x65, + 0x38, 0x9e, 0x1d, 0xa7, 0x0a, 0xcf, 0xc1, 0x25, 0xca, 0xf7, 0xe2, 0x3a, + 0xf2, 0xc9, 0x99, 0x65, 0xff, 0xfe, 0x50, 0xfa, 0xca, 0xb1, 0xbb, 0x7e, + 0x92, 0x0b, 0x53, 0xcb, 0x23, 0xaf, 0x98, 0x47, 0xdc, 0x7f, 0xb3, 0x2e, + 0x30, 0xf5, 0x04, 0x63, 0x66, 0x61, 0x1d, 0xe7, 0xb0, 0x48, 0x11, 0xce, + 0x83, 0xaa, 0xa1, 0x53, 0xd6, 0x61, 0x5f, 0x35, 0x92, 0x13, 0xd2, 0xf7, + 0xd6, 0x72, 0x89, 0xd7, 0xed, 0x13, 0x21, 0x65, 0x51, 0x42, 0x34, 0xa1, + 0x86, 0x45, 0xe3, 0x1e, 0xa5, 0x91, 0x3c, 0xa1, 0x2e, 0xd1, 0x86, 0x43, + 0xe4, 0x1d, 0x71, 0xea, 0xc7, 0x1d, 0x13, 0xf4, 0xa7, 0xb0, 0xec, 0x01, + 0x7b, 0xd1, 0x33, 0x21, 0x7c, 0x78, 0x0a, 0xe7, 0xe2, 0xd7, 0xe3, 0xa4, + 0x6a, 0xf3, 0x45, 0x6f, 0x69, 0x64, 0x1a, 0x1f, 0xf7, 0x51, 0xe7, 0xd8, + 0x7b, 0x5d, 0xd3, 0xb8, 0x21, 0x2d, 0x6b, 0xa2, 0x2b, 0x03, 0x71, 0x2d, + 0x96, 0x17, 0xf1, 0xe1, 0xd3, 0xb4, 0xc3, 0x65, 0xb8, 0xf6, 0xd1, 0x79, + 0x91, 0x56, 0xe5, 0x4d, 0xfb, 0x73, 0xd2, 0x8a, 0xad, 0x92, 0x75, 0x8c, + 0x2a, 0x0f, 0xd4, 0x99, 0x78, 0xb8, 0xce, 0xb4, 0x2a, 0x75, 0x3d, 0xd6, + 0xa2, 0xe8, 0x1d, 0xff, 0x53, 0x89, 0x56, 0x95, 0xa0, 0x0b, 0xcf, 0x85, + 0xa3, 0x03, 0x45, 0x7c, 0x0f, 0x85, 0xa1, 0xe5, 0x70, 0xcd, 0x0f, 0x34, + 0x07, 0xdb, 0xb7, 0x22, 0xb8, 0xa6, 0xcd, 0x15, 0xdc, 0xb7, 0x4e, 0x09, + 0xce, 0xdc, 0xa2, 0x18, 0xde, 0xb7, 0xd3, 0x86, 0xf7, 0xe7, 0xe9, 0x5b, + 0xca, 0x05, 0x9b, 0x72, 0x9b, 0x76, 0x59, 0xeb, 0x7d, 0x62, 0xaf, 0xbf, + 0xae, 0x61, 0x8c, 0xd8, 0x9c, 0xa7, 0xe6, 0x3f, 0xac, 0xaf, 0x2a, 0x9c, + 0xb3, 0xff, 0xb7, 0x18, 0xe5, 0x60, 0x84, 0x83, 0x0a, 0x0f, 0xd2, 0xc8, + 0x83, 0x4a, 0x94, 0x1b, 0x9f, 0x40, 0xf4, 0x33, 0xf2, 0x9f, 0xb2, 0x7a, + 0x27, 0xd6, 0xc2, 0x69, 0xcb, 0xfa, 0x59, 0xd3, 0x0f, 0x90, 0x2a, 0x0f, + 0xf4, 0x32, 0xf3, 0xc1, 0xc1, 0xec, 0xc3, 0xe4, 0xa6, 0x30, 0xdf, 0x25, + 0x9f, 0xe8, 0x26, 0xff, 0xf5, 0x90, 0xff, 0xbe, 0xc3, 0x60, 0xbc, 0xb5, + 0xd9, 0xe1, 0xbf, 0x67, 0x8d, 0x83, 0xe4, 0x10, 0xcf, 0x5b, 0x25, 0xc4, + 0xec, 0xe2, 0x88, 0x1e, 0xfb, 0x90, 0x79, 0xc7, 0x2c, 0xd3, 0xd5, 0x47, + 0xe0, 0x70, 0xdb, 0x8f, 0xc9, 0x6d, 0x4f, 0x96, 0x39, 0xdc, 0xb6, 0x92, + 0x5c, 0xf3, 0x33, 0x72, 0x5b, 0xb3, 0x5c, 0xec, 0xe5, 0x61, 0x7c, 0xe9, + 0x87, 0x67, 0xb0, 0x50, 0x99, 0x2a, 0x77, 0xb8, 0xed, 0xce, 0xbd, 0xd5, + 0xca, 0xe3, 0xe4, 0x34, 0xf7, 0x86, 0xe1, 0x23, 0xb7, 0x3d, 0x76, 0xca, + 0x4d, 0x2e, 0x62, 0xeb, 0xa1, 0x22, 0x65, 0x88, 0xfc, 0x7c, 0x98, 0x7a, + 0xab, 0xb0, 0xf9, 0x55, 0xa2, 0x2e, 0x71, 0xc9, 0x80, 0xd2, 0x6b, 0xc8, + 0xbe, 0x95, 0x4a, 0xff, 0x86, 0x7a, 0xd6, 0xa8, 0xe0, 0x38, 0x14, 0xb4, + 0x90, 0xdb, 0x7e, 0x60, 0x10, 0xe4, 0x2a, 0x05, 0xd7, 0x45, 0x77, 0x15, + 0x8b, 0x7e, 0x2b, 0xf2, 0x47, 0xac, 0xc2, 0x79, 0x11, 0xfd, 0xd0, 0x0c, + 0x79, 0xc8, 0x2f, 0x6e, 0x6c, 0xe8, 0x1c, 0x74, 0xe5, 0x71, 0x5c, 0x72, + 0x3f, 0xbc, 0x55, 0xe4, 0x1d, 0x37, 0x27, 0x73, 0xf8, 0x6f, 0x05, 0xe1, + 0x7a, 0x87, 0x87, 0x84, 0xd3, 0x50, 0x2c, 0xf2, 0xe0, 0x93, 0xf3, 0x2f, + 0xf1, 0x60, 0x17, 0x79, 0x70, 0xd4, 0xe7, 0xf0, 0x60, 0xae, 0x77, 0xbb, + 0xd8, 0x21, 0x3f, 0xe2, 0x56, 0xee, 0x28, 0x83, 0xeb, 0xd9, 0x59, 0x1e, + 0xbc, 0xcf, 0xe6, 0xc1, 0x0e, 0x1e, 0xcd, 0xf2, 0x60, 0xe2, 0xb5, 0xeb, + 0x11, 0xe1, 0xc1, 0xcf, 0x85, 0xcd, 0x98, 0x8f, 0xfe, 0x5a, 0x4e, 0x7f, + 0x5d, 0x55, 0x17, 0x88, 0xee, 0x26, 0x0f, 0x4e, 0x24, 0xd7, 0x61, 0xaa, + 0x2c, 0xd0, 0x9b, 0x72, 0xb9, 0x65, 0x8f, 0x87, 0xbc, 0x25, 0xcb, 0x63, + 0x4a, 0x94, 0x85, 0x19, 0x2e, 0x9c, 0x62, 0xae, 0x7c, 0x87, 0xda, 0x73, + 0xbb, 0x6e, 0x73, 0xe1, 0xc3, 0x82, 0xeb, 0xf3, 0xf4, 0x7c, 0xe5, 0xbf, + 0x91, 0x0b, 0x17, 0x90, 0x63, 0x14, 0x0e, 0xd4, 0x61, 0x73, 0x99, 0xe4, + 0x84, 0xa9, 0x23, 0xbe, 0x39, 0x5c, 0x78, 0x84, 0xf9, 0xcf, 0x47, 0xbf, + 0x88, 0xd3, 0xc7, 0x07, 0xc3, 0xff, 0xc8, 0xb5, 0xf5, 0xe0, 0x97, 0xcc, + 0xcf, 0x5c, 0x2b, 0x8c, 0xf5, 0x7d, 0x6e, 0x09, 0x17, 0x1e, 0x09, 0x7f, + 0x6a, 0x73, 0xe1, 0x23, 0x9c, 0x43, 0x8a, 0x5c, 0x78, 0x15, 0x73, 0xd6, + 0x14, 0xb9, 0xb0, 0x96, 0xc9, 0xf3, 0x51, 0x72, 0xe1, 0x54, 0x86, 0x0b, + 0x6f, 0xbb, 0xd1, 0x89, 0xdf, 0x71, 0xc6, 0xef, 0x54, 0x0e, 0xa5, 0x4f, + 0x26, 0x9f, 0x3e, 0xc1, 0x7c, 0x9a, 0x14, 0xa2, 0xc4, 0x7c, 0x2a, 0xf9, + 0x76, 0xd8, 0xe6, 0xc2, 0x3b, 0x2a, 0x64, 0x3f, 0xca, 0xc4, 0xff, 0xb1, + 0x9c, 0x31, 0xab, 0x4a, 0x7d, 0x26, 0x4f, 0x9d, 0x37, 0xde, 0xb4, 0x42, + 0x2b, 0x65, 0xac, 0x77, 0x55, 0x38, 0x39, 0x54, 0xb4, 0xb2, 0xbe, 0xe9, + 0x11, 0xda, 0x2b, 0x55, 0x66, 0x3d, 0x56, 0xaa, 0xeb, 0x87, 0xbe, 0x4d, + 0x10, 0x4c, 0xcd, 0x8b, 0xa1, 0x2a, 0xa2, 0x4f, 0x5d, 0xe0, 0xf7, 0xa8, + 0x10, 0x3f, 0x69, 0x2e, 0x76, 0xf2, 0x41, 0xc8, 0x8a, 0xaa, 0x12, 0x63, + 0xcf, 0x08, 0x56, 0xd2, 0x9f, 0xce, 0xf8, 0x9c, 0xef, 0xa5, 0x4f, 0x79, + 0xff, 0x58, 0x0e, 0x06, 0xe8, 0x87, 0xe2, 0xbb, 0xdf, 0xb0, 0x34, 0x7b, + 0x0f, 0x42, 0x43, 0x21, 0xd7, 0xed, 0x7d, 0xac, 0xb4, 0xa2, 0xfc, 0xbc, + 0x9d, 0x39, 0xda, 0x4b, 0xde, 0xed, 0x26, 0xef, 0x3e, 0x8d, 0xb3, 0x76, + 0x3b, 0x43, 0xb6, 0x5e, 0x6d, 0x65, 0x2e, 0x17, 0x5c, 0xb3, 0xac, 0x61, + 0xdd, 0xe6, 0x3d, 0x36, 0xdf, 0xfe, 0xee, 0x5e, 0xd1, 0x23, 0xff, 0x6c, + 0xf3, 0xed, 0x72, 0xfa, 0x49, 0x19, 0x73, 0x5c, 0x98, 0x7c, 0x5b, 0x63, + 0xa2, 0x76, 0xe2, 0x03, 0xd1, 0x7b, 0x8d, 0x5c, 0xd1, 0x6e, 0xa5, 0x5e, + 0x72, 0xde, 0xf3, 0xe4, 0x4b, 0x85, 0x91, 0x86, 0xf6, 0xfb, 0x94, 0x1f, + 0x93, 0xa7, 0x58, 0xd6, 0xd2, 0xa6, 0x1b, 0xa0, 0x95, 0xa1, 0x94, 0xb6, + 0x37, 0x3e, 0xa4, 0x43, 0x14, 0x45, 0x16, 0xe0, 0x35, 0xf2, 0xed, 0x27, + 0x38, 0x8e, 0x95, 0x4d, 0x7a, 0xe7, 0xb4, 0x2b, 0xd0, 0x71, 0x91, 0x3c, + 0xe8, 0x67, 0x03, 0x1e, 0xdc, 0x5e, 0xe7, 0xf0, 0x6d, 0x8d, 0x7c, 0x7b, + 0x64, 0x96, 0x6f, 0x3b, 0xf6, 0x14, 0x8d, 0x5e, 0x48, 0xfe, 0xfb, 0x60, + 0x9f, 0x70, 0x63, 0x87, 0x13, 0xdf, 0x1f, 0x74, 0x38, 0x71, 0xfd, 0x2c, + 0x27, 0xce, 0xde, 0x9b, 0x6f, 0xdb, 0xb7, 0x4c, 0x8f, 0x2a, 0xdb, 0xe2, + 0xe4, 0x18, 0x8a, 0xc3, 0x73, 0xbb, 0x04, 0x7f, 0xf3, 0xaa, 0xc9, 0x2d, + 0xa8, 0x9b, 0xd3, 0x85, 0x38, 0x90, 0x12, 0x4d, 0x37, 0xa9, 0x6c, 0x4e, + 0xff, 0xa1, 0x3c, 0x71, 0x89, 0x83, 0x6e, 0x27, 0x07, 0xa5, 0x0f, 0xe3, + 0x51, 0xf2, 0xcb, 0x9b, 0x6f, 0xd0, 0xa7, 0x82, 0xee, 0x5f, 0x5a, 0x98, + 0x2f, 0x73, 0xf8, 0xbd, 0xf5, 0x34, 0x39, 0xe8, 0x3b, 0x0b, 0xbd, 0xce, + 0x5e, 0x33, 0xb1, 0x40, 0x78, 0xea, 0xe6, 0xeb, 0x75, 0x75, 0xa9, 0x92, + 0x4b, 0xed, 0x72, 0xcb, 0x2d, 0x79, 0x90, 0xfb, 0x1c, 0x8e, 0xa5, 0xb9, + 0x7e, 0x5c, 0x21, 0x38, 0x36, 0x72, 0x63, 0x83, 0xdf, 0x07, 0x3d, 0xe4, + 0x56, 0x72, 0x6c, 0x9b, 0xaf, 0x6c, 0x92, 0xf6, 0xe7, 0x5e, 0xcf, 0xde, + 0xef, 0xf0, 0xa3, 0x91, 0xa6, 0x8b, 0x15, 0xc2, 0x8f, 0x7c, 0xf8, 0x26, + 0x06, 0x55, 0x73, 0x53, 0x1e, 0x0a, 0x39, 0xdf, 0x07, 0x2e, 0xee, 0xf0, + 0x09, 0xc6, 0x9b, 0xc7, 0x24, 0x1f, 0x94, 0x31, 0x7e, 0xc2, 0x75, 0x01, + 0x23, 0xec, 0x16, 0xcc, 0x57, 0x30, 0x95, 0x72, 0xe1, 0x17, 0xcd, 0xe2, + 0xd7, 0xc2, 0x67, 0x1d, 0x6e, 0xb3, 0xa3, 0xe9, 0xdb, 0x15, 0x0e, 0xdf, + 0x31, 0x67, 0xe4, 0x37, 0x05, 0xfc, 0xcd, 0x9d, 0xc1, 0x80, 0xfa, 0x9e, + 0x1b, 0xb8, 0xbb, 0xff, 0x1b, 0x17, 0x63, 0xe5, 0x76, 0xbe, 0x42, 0x34, + 0x55, 0x8d, 0x5d, 0xb2, 0xf7, 0x1e, 0x6c, 0xbf, 0x18, 0x65, 0x2e, 0xe9, + 0x9e, 0x93, 0x4b, 0xcc, 0x89, 0xac, 0xb6, 0x40, 0x85, 0xa3, 0x2d, 0x2e, + 0x5e, 0x8c, 0x65, 0xb4, 0xc5, 0xad, 0xd4, 0x16, 0x9b, 0x0d, 0x97, 0x1d, + 0x83, 0x97, 0xb4, 0x85, 0xe8, 0x0a, 0xd1, 0x17, 0xa2, 0x2d, 0x76, 0xd9, + 0xda, 0xa2, 0x8a, 0xda, 0x62, 0x45, 0xb0, 0x21, 0x36, 0x86, 0x5e, 0x62, + 0xa7, 0x9b, 0x6b, 0xa5, 0x29, 0x7f, 0x91, 0xd1, 0x16, 0x1f, 0x51, 0x5b, + 0x4c, 0x34, 0x89, 0xb6, 0x18, 0x20, 0x46, 0x5c, 0xb4, 0x4e, 0x07, 0x1b, + 0x0e, 0x0f, 0x21, 0x89, 0xa9, 0x79, 0x17, 0xad, 0x9c, 0x59, 0x6d, 0xf1, + 0xb2, 0x4f, 0xf6, 0x3a, 0xa8, 0x2f, 0x6c, 0x7e, 0x7e, 0x29, 0x6e, 0xbf, + 0x95, 0x89, 0x05, 0x87, 0x47, 0xfa, 0xf4, 0xab, 0xad, 0xad, 0x19, 0x1e, + 0xe9, 0xd7, 0xff, 0xf5, 0x62, 0xa7, 0x4f, 0x62, 0x32, 0x8a, 0x4f, 0x8d, + 0xdf, 0x5e, 0xd4, 0xca, 0x1d, 0x1e, 0x79, 0x1d, 0xe3, 0xb3, 0x86, 0xf1, + 0x79, 0x8f, 0x51, 0x6f, 0x5d, 0xa8, 0x90, 0xd8, 0xbd, 0x2b, 0xdb, 0x06, + 0xf3, 0x86, 0xb7, 0xc7, 0x5f, 0x1f, 0x30, 0x27, 0x15, 0xd7, 0x5f, 0xca, + 0x99, 0x63, 0xe9, 0x01, 0xc4, 0xca, 0x23, 0x9a, 0xff, 0xd6, 0x84, 0xc2, + 0x3c, 0xef, 0xe9, 0xf8, 0x0c, 0xc1, 0xd0, 0x23, 0x08, 0xa4, 0xfe, 0x97, + 0xe2, 0x5a, 0x9f, 0x0b, 0xc7, 0x76, 0xf1, 0x11, 0xcd, 0xbf, 0x74, 0xfc, + 0x2f, 0xec, 0xd8, 0x92, 0x9c, 0x36, 0x32, 0xcb, 0x7b, 0xb3, 0xfe, 0x59, + 0x58, 0xf9, 0x87, 0x73, 0x17, 0xa2, 0x0f, 0x50, 0x57, 0x34, 0x87, 0x5b, + 0x24, 0x67, 0x28, 0x1f, 0x10, 0xb7, 0x98, 0xcb, 0xb0, 0x97, 0xba, 0xc2, + 0x64, 0x0c, 0xfe, 0x03, 0x75, 0x85, 0x83, 0xf1, 0x70, 0xe5, 0x52, 0x57, + 0x8c, 0x94, 0x09, 0x4e, 0x16, 0x91, 0x67, 0x48, 0xac, 0xe9, 0xc7, 0x74, + 0x57, 0x60, 0xea, 0x4f, 0xdd, 0x1e, 0x94, 0xee, 0xf9, 0xdc, 0x3a, 0x42, + 0xfe, 0xca, 0x31, 0xe2, 0xdc, 0x25, 0x5d, 0x91, 0x1a, 0xb4, 0x75, 0xc5, + 0x62, 0x6c, 0xa3, 0xae, 0xe8, 0x6e, 0xca, 0xa3, 0x7f, 0x52, 0x33, 0x37, + 0x89, 0x2e, 0xb9, 0xc4, 0x7f, 0x97, 0x36, 0x7d, 0x6e, 0x85, 0x9b, 0xe4, + 0x7b, 0x47, 0x6b, 0x48, 0x1c, 0x3c, 0x6b, 0x7c, 0x15, 0xb1, 0x4a, 0xb9, + 0xf6, 0x7f, 0x2f, 0x4e, 0xcd, 0xb3, 0xe3, 0xd1, 0x2c, 0xa7, 0xd6, 0x58, + 0x92, 0xc1, 0xc6, 0x43, 0xa2, 0x35, 0x88, 0x8d, 0x3e, 0xda, 0xd9, 0x4d, + 0x6c, 0xdc, 0x4b, 0x6c, 0xec, 0xc9, 0x60, 0x63, 0x3e, 0xaf, 0x7f, 0x2f, + 0x7d, 0x29, 0x8e, 0xc9, 0x7d, 0xa9, 0x81, 0x15, 0xbc, 0x66, 0xbc, 0x7a, + 0xd1, 0x5c, 0x29, 0xdf, 0x49, 0xbb, 0x59, 0x9f, 0xbf, 0x32, 0xee, 0xc5, + 0x37, 0x4c, 0xa5, 0xf5, 0xa6, 0x42, 0x94, 0x0d, 0x49, 0x5f, 0xf6, 0x7e, + 0xd4, 0x4c, 0x3e, 0xb5, 0xa4, 0x8b, 0xdf, 0x1f, 0x6a, 0x2e, 0x82, 0x6b, + 0x8e, 0x96, 0xac, 0xc9, 0x68, 0xc9, 0xcb, 0xfb, 0x14, 0xbf, 0xd1, 0xa3, + 0x39, 0x4a, 0xd6, 0x67, 0x3c, 0xb8, 0x91, 0x5a, 0x60, 0x6a, 0x9e, 0xd3, + 0xef, 0x62, 0x6a, 0x81, 0x4f, 0x17, 0x89, 0x0d, 0x9e, 0xf7, 0x65, 0xb4, + 0x80, 0xa1, 0xcd, 0x72, 0xfd, 0x51, 0x5f, 0x46, 0xef, 0xd1, 0x9f, 0xa1, + 0xac, 0x8f, 0xff, 0x29, 0xba, 0x0d, 0xc9, 0x89, 0xf2, 0x55, 0x1b, 0x62, + 0xcc, 0x99, 0x1b, 0xe3, 0x53, 0x79, 0x2f, 0x19, 0x39, 0xe2, 0xd7, 0xfc, + 0x6f, 0x39, 0xbf, 0x6b, 0xe7, 0x2b, 0x7b, 0x46, 0xbf, 0x9a, 0xff, 0x8e, + 0xda, 0xf7, 0x6d, 0x8a, 0xa3, 0x35, 0x2f, 0x7c, 0xc1, 0x3a, 0xa9, 0x3a, + 0xfe, 0xe9, 0xd2, 0xe5, 0x9e, 0x25, 0x72, 0xad, 0x5f, 0xce, 0x4e, 0xd6, + 0x35, 0x07, 0xb5, 0x6e, 0xbb, 0x1f, 0x0d, 0xeb, 0xd3, 0x1a, 0x36, 0xd0, + 0xa6, 0x29, 0xbb, 0x0e, 0x23, 0xbb, 0x6f, 0x2a, 0x35, 0x1e, 0xd4, 0x83, + 0xbc, 0xaf, 0xc7, 0xfe, 0x4e, 0xc3, 0x92, 0xf4, 0x09, 0xbb, 0x06, 0xe0, + 0x88, 0xbd, 0xf7, 0xaa, 0x51, 0x87, 0x64, 0xf5, 0x86, 0xe8, 0x92, 0xa8, + 0xb2, 0x3b, 0xde, 0x46, 0x1d, 0x58, 0xc2, 0xbe, 0x5c, 0x71, 0x95, 0x3c, + 0xb7, 0xb6, 0xe9, 0x1e, 0xac, 0x53, 0xf5, 0x90, 0xc7, 0x55, 0x8a, 0x8d, + 0x21, 0xe1, 0x0f, 0x37, 0x61, 0x73, 0x28, 0x97, 0x3c, 0x36, 0x81, 0xfb, + 0xd5, 0x3c, 0x6c, 0x0a, 0x5d, 0x0f, 0xac, 0xcc, 0xa7, 0x8f, 0x74, 0xda, + 0x7b, 0xe0, 0xb9, 0x11, 0x39, 0x37, 0x39, 0x8c, 0x07, 0x66, 0x6b, 0x56, + 0xd8, 0xc7, 0x7f, 0xd8, 0xfb, 0xc8, 0xee, 0x7b, 0xdc, 0x43, 0x7f, 0x69, + 0x45, 0xb1, 0xde, 0x82, 0x07, 0x43, 0x39, 0x14, 0x1f, 0xb2, 0x5e, 0x35, + 0xe4, 0xc7, 0x9f, 0x5a, 0x0f, 0xf9, 0x9c, 0xf1, 0x8b, 0xaf, 0x4c, 0x8a, + 0xaf, 0xe4, 0x99, 0xca, 0x0f, 0xc9, 0xa7, 0x9a, 0x26, 0x14, 0xd4, 0xd0, + 0x67, 0xca, 0xc9, 0x67, 0x5c, 0xc4, 0x0f, 0x6d, 0xc2, 0x8b, 0xf0, 0x68, + 0x01, 0x16, 0x0f, 0x15, 0xa2, 0x69, 0x48, 0x85, 0x31, 0xaa, 0xf3, 0xbb, + 0x10, 0x5f, 0x93, 0xca, 0x81, 0xf4, 0x97, 0xf5, 0x5d, 0x8b, 0xf5, 0x6a, + 0x21, 0x72, 0xf4, 0x37, 0xad, 0x0d, 0xc4, 0x53, 0x7f, 0x93, 0x26, 0x67, + 0xdb, 0xec, 0xef, 0xfc, 0xc5, 0x3d, 0xe4, 0x39, 0x5d, 0xbb, 0x3d, 0xb8, + 0xb0, 0xe8, 0xb8, 0xa5, 0xd9, 0x67, 0x12, 0xd9, 0x33, 0x94, 0x1c, 0x3c, + 0x90, 0x39, 0x0f, 0x0e, 0xb5, 0x38, 0x67, 0xa9, 0x9b, 0x0e, 0xe4, 0xe0, + 0x7e, 0xde, 0x7b, 0xca, 0x70, 0x65, 0xd6, 0xd8, 0x3e, 0xef, 0xc7, 0x83, + 0xbb, 0x35, 0xe2, 0xad, 0x45, 0x4d, 0x53, 0x80, 0xdb, 0x2a, 0x9d, 0x79, + 0x0c, 0x73, 0x1e, 0xa6, 0xc7, 0x54, 0xc6, 0x9a, 0x73, 0xc8, 0xf7, 0xa1, + 0x16, 0x51, 0xf7, 0x7c, 0x7f, 0xac, 0x10, 0xe3, 0xfb, 0x27, 0x95, 0x74, + 0xda, 0xb9, 0x67, 0x48, 0xf6, 0xcf, 0x78, 0xcf, 0x44, 0xb3, 0x0b, 0x15, + 0xcc, 0x3b, 0xbf, 0x1e, 0xf3, 0xf0, 0xe5, 0xc5, 0xa7, 0x07, 0x0b, 0xf0, + 0x9b, 0xfd, 0x85, 0x7c, 0xa9, 0xf8, 0xe4, 0xa0, 0x8e, 0x93, 0x63, 0x4b, + 0x94, 0x23, 0x71, 0xa8, 0x6a, 0x24, 0x84, 0x4f, 0xc7, 0x26, 0x95, 0xc3, + 0x5f, 0x3a, 0xd7, 0x31, 0xeb, 0x61, 0xa2, 0x54, 0x89, 0xfe, 0xf7, 0xd6, + 0x23, 0x73, 0xec, 0x3a, 0xb7, 0xaf, 0x72, 0xbd, 0x10, 0xbf, 0xde, 0x2f, + 0xfd, 0x48, 0xfb, 0x4b, 0x94, 0x1f, 0xc4, 0xc5, 0xbe, 0xe5, 0xf8, 0xcd, + 0x41, 0xb1, 0xe3, 0xed, 0x95, 0x82, 0xe3, 0xcf, 0x27, 0x27, 0x95, 0x17, + 0x33, 0xbf, 0xf9, 0x39, 0xd7, 0x62, 0xcb, 0xb8, 0x07, 0xb1, 0x71, 0x85, + 0xbf, 0xf5, 0xe2, 0xd1, 0x11, 0x17, 0xe3, 0xae, 0x00, 0x5b, 0x0e, 0x14, + 0xe2, 0xd1, 0x03, 0x2a, 0x3a, 0x46, 0x96, 0x28, 0x6f, 0xb0, 0x8d, 0x52, + 0xc6, 0x6e, 0xc7, 0x78, 0x88, 0xf7, 0x4d, 0x2a, 0xc7, 0xd3, 0xdd, 0x99, + 0x76, 0x1c, 0xac, 0xdf, 0x28, 0xfc, 0x88, 0x6d, 0xad, 0x6b, 0x56, 0x18, + 0xe3, 0x6d, 0x3d, 0x2f, 0xf7, 0x03, 0xab, 0xd2, 0x8c, 0x33, 0x55, 0xf6, + 0xaf, 0x15, 0x6a, 0x8a, 0xf6, 0x9e, 0x73, 0x71, 0xe7, 0xec, 0xe1, 0x99, + 0x66, 0x67, 0x3f, 0xf3, 0xb5, 0x66, 0xe6, 0x7d, 0xc6, 0xca, 0x4a, 0xda, + 0x63, 0x39, 0xed, 0xb1, 0x84, 0xf6, 0x68, 0xe7, 0x78, 0x9f, 0x8d, 0x3b, + 0xf9, 0x2f, 0xaa, 0xe8, 0x58, 0x36, 0x26, 0x6d, 0x68, 0xf6, 0x5e, 0x97, + 0x27, 0xb2, 0xbc, 0x67, 0x5b, 0xfc, 0x4a, 0xbb, 0x08, 0xef, 0x05, 0xb5, + 0x8d, 0xd8, 0x26, 0xc4, 0xdc, 0x4e, 0xae, 0x36, 0xa6, 0x90, 0x1b, 0xb4, + 0xf5, 0x68, 0xa9, 0x6c, 0xec, 0x14, 0xda, 0x79, 0x27, 0x97, 0x7a, 0x8e, + 0xda, 0x11, 0x55, 0xba, 0x73, 0xfd, 0xe6, 0x94, 0xbc, 0xb7, 0xf7, 0x34, + 0xa5, 0xe5, 0x7d, 0x79, 0x4f, 0xeb, 0xec, 0x9c, 0x26, 0x95, 0xb7, 0x6d, + 0xbe, 0x60, 0x2a, 0x47, 0x39, 0xd6, 0x7c, 0x59, 0xbb, 0x34, 0xd7, 0x8e, + 0x63, 0xfd, 0x74, 0xb8, 0x00, 0xef, 0xa6, 0x0a, 0xf9, 0xa2, 0x6d, 0x87, + 0xb9, 0x76, 0xe9, 0x25, 0xca, 0x31, 0xdb, 0xbe, 0x21, 0x9c, 0x67, 0xdf, + 0x2f, 0xcc, 0xb6, 0xe1, 0xd4, 0xd7, 0x38, 0xb5, 0x35, 0xd9, 0xf8, 0x55, + 0x33, 0xfb, 0x2d, 0xa6, 0x12, 0x9d, 0xad, 0x8f, 0xb1, 0xac, 0x6d, 0x86, + 0xe4, 0x68, 0x9b, 0x37, 0xfb, 0x05, 0x1b, 0xba, 0xc5, 0xff, 0xd4, 0x5b, + 0x34, 0x0f, 0x02, 0xfe, 0x0d, 0xf8, 0xdc, 0x32, 0x7d, 0x51, 0x46, 0x94, + 0x53, 0x13, 0x15, 0x23, 0x2f, 0x9c, 0xca, 0xd4, 0x58, 0x1d, 0xa0, 0x3e, + 0x78, 0x99, 0x18, 0x4f, 0x17, 0x42, 0x77, 0xfa, 0x73, 0x6b, 0x8a, 0xba, + 0x74, 0x9b, 0x9e, 0x9d, 0xb3, 0x97, 0x73, 0xb6, 0xac, 0x21, 0x5e, 0xdb, + 0xe1, 0xe8, 0x33, 0x08, 0xd6, 0xba, 0x74, 0xcb, 0xba, 0x4f, 0xff, 0x37, + 0x6b, 0xdd, 0x65, 0xf7, 0xfe, 0xe1, 0x5a, 0xa2, 0x9e, 0xe6, 0x20, 0x36, + 0xf4, 0x73, 0xcc, 0x2e, 0x8d, 0xfa, 0xcc, 0x39, 0x63, 0x5c, 0x97, 0x0a, + 0xcc, 0xa9, 0xf5, 0xf9, 0x1f, 0x45, 0x99, 0x3a, 0x20, 0xfa, 0xc1, 0x0c, + 0xdb, 0x11, 0x1f, 0xe0, 0xd8, 0x26, 0x2c, 0xc4, 0xa9, 0x99, 0xc7, 0xf8, + 0xfa, 0xa9, 0x7d, 0x16, 0x35, 0xa9, 0xac, 0xef, 0x93, 0x98, 0x71, 0x46, + 0xf2, 0xbd, 0x64, 0x48, 0xd9, 0xd4, 0x07, 0x3c, 0x43, 0x5e, 0x30, 0xca, + 0xd7, 0x70, 0x52, 0xce, 0x63, 0x05, 0xd7, 0x0b, 0xb0, 0x9d, 0xea, 0x61, + 0x88, 0xb9, 0xf0, 0xa9, 0x16, 0xd9, 0x67, 0x2e, 0x64, 0x7f, 0xc0, 0x24, + 0xef, 0x49, 0xf3, 0x35, 0xc2, 0xd7, 0x04, 0x63, 0x81, 0xfd, 0x21, 0xc4, + 0x78, 0x8a, 0x8e, 0xe9, 0x30, 0xc7, 0x42, 0x98, 0xe2, 0xda, 0x5c, 0x18, + 0x56, 0x51, 0x3c, 0x5a, 0x8e, 0x8f, 0x0e, 0x3a, 0x35, 0x6d, 0x1b, 0xc6, + 0xa4, 0x46, 0x46, 0xe6, 0x26, 0x35, 0x4d, 0xb2, 0x16, 0xf9, 0x18, 0xed, + 0x2f, 0xb7, 0xeb, 0x9a, 0x4e, 0x53, 0xeb, 0xac, 0x53, 0xa5, 0xee, 0xa6, + 0x1d, 0x87, 0xe2, 0xb5, 0x5a, 0x2f, 0xed, 0x65, 0x7a, 0x64, 0x7d, 0x9a, + 0xf1, 0x4c, 0x3c, 0x5b, 0x53, 0x51, 0xdb, 0xf6, 0x13, 0x49, 0x6c, 0x39, + 0xe5, 0xf6, 0x5e, 0x09, 0x7d, 0x30, 0x83, 0xdb, 0x32, 0x5f, 0x39, 0xa7, + 0x95, 0x99, 0x5c, 0xf9, 0xbd, 0xec, 0x0b, 0x35, 0x12, 0x93, 0xa9, 0x6f, + 0x60, 0xd8, 0x58, 0x7c, 0xb0, 0x3e, 0xd0, 0x6f, 0x22, 0xa0, 0x69, 0x2e, + 0xd9, 0x2b, 0x0a, 0xd1, 0xc6, 0x72, 0xa6, 0xac, 0x22, 0x35, 0xf1, 0xf7, + 0xc4, 0x19, 0xaf, 0x99, 0x47, 0x3b, 0xbf, 0x43, 0x8e, 0xb4, 0xa3, 0xdf, + 0x8b, 0x97, 0x8c, 0x07, 0xc8, 0x09, 0x55, 0xda, 0xc4, 0x6b, 0xfa, 0xe5, + 0xec, 0xfa, 0x26, 0xa9, 0x0b, 0xf1, 0xe2, 0xa3, 0xb0, 0x0b, 0x53, 0x95, + 0x6e, 0x78, 0x75, 0xd1, 0x58, 0x52, 0xd3, 0x52, 0x86, 0x0d, 0x03, 0xe5, + 0xd8, 0x3c, 0x60, 0x62, 0x63, 0xcb, 0x6a, 0xbc, 0x1d, 0xb7, 0x70, 0x47, + 0x38, 0xa0, 0x85, 0x14, 0x0b, 0x43, 0x86, 0xc9, 0xcc, 0x1e, 0x08, 0xad, + 0x43, 0xc3, 0xb1, 0xe7, 0x39, 0x2f, 0xcd, 0xd6, 0x11, 0x6b, 0xf1, 0xc6, + 0xde, 0xd5, 0x38, 0x4e, 0x9f, 0x29, 0x6e, 0xaa, 0xed, 0x38, 0xa3, 0x34, + 0x30, 0xdc, 0xf7, 0x92, 0x57, 0x38, 0xd7, 0x7e, 0x45, 0xae, 0x5f, 0xbb, + 0xc8, 0x03, 0xcb, 0xd8, 0x4a, 0x3e, 0x6f, 0x32, 0xcb, 0x55, 0xe3, 0x50, + 0xb2, 0x41, 0xdd, 0x84, 0xaf, 0x23, 0xda, 0xee, 0xa1, 0xbd, 0x6a, 0xd5, + 0x8d, 0x30, 0x71, 0x5b, 0xa3, 0x4b, 0x62, 0xda, 0x8c, 0xf2, 0xdf, 0xaa, + 0x7e, 0xe9, 0x3c, 0x5b, 0xea, 0x1c, 0x36, 0x36, 0xcb, 0xf9, 0x55, 0x11, + 0x8e, 0x72, 0x2d, 0x8e, 0xf5, 0x47, 0x37, 0xd1, 0x4d, 0x95, 0xfb, 0x9b, + 0xbb, 0x50, 0x43, 0x1d, 0xf9, 0x36, 0x93, 0xd9, 0xcd, 0xe4, 0x4d, 0xad, + 0xf5, 0x06, 0x4e, 0xa4, 0x39, 0x96, 0xe1, 0x08, 0xc7, 0x52, 0x02, 0xe3, + 0x89, 0x40, 0xc7, 0x27, 0x8a, 0x86, 0x9f, 0xa6, 0x23, 0x78, 0x2d, 0x2e, + 0xb5, 0x81, 0xd5, 0x78, 0x95, 0xb1, 0xb6, 0x20, 0x01, 0xbc, 0xc7, 0x76, + 0xbe, 0x92, 0xf0, 0xe0, 0xdd, 0x34, 0x6d, 0xc8, 0x35, 0x1f, 0x36, 0x9a, + 0x60, 0xae, 0xd6, 0x30, 0xb2, 0xe7, 0x2e, 0xf2, 0xdb, 0xbb, 0xf0, 0x4a, + 0xff, 0xdb, 0x96, 0x9c, 0xf1, 0x93, 0xa7, 0x31, 0x1e, 0x69, 0x3b, 0x5a, + 0xb9, 0xf8, 0x26, 0xa9, 0xfd, 0xd2, 0xb5, 0x03, 0x9c, 0xf7, 0x34, 0xbf, + 0xbb, 0x39, 0xd1, 0x8a, 0x1f, 0x8e, 0xf9, 0x50, 0x9a, 0x34, 0x70, 0xb8, + 0x4f, 0xfa, 0x6a, 0xc6, 0xf8, 0x18, 0x7d, 0x69, 0xc0, 0xc2, 0xae, 0x70, + 0x23, 0x35, 0x24, 0x94, 0xa5, 0x75, 0xe2, 0xd7, 0x32, 0x8f, 0xd6, 0x39, + 0xb5, 0x34, 0xb2, 0x3f, 0xc6, 0xf5, 0x4a, 0xca, 0x79, 0x39, 0xd7, 0x33, + 0xc9, 0x75, 0x9b, 0x5d, 0xe7, 0x56, 0xbb, 0xee, 0xed, 0xbc, 0xf1, 0x5f, + 0xa8, 0x8d, 0x7c, 0xf6, 0xf9, 0xff, 0xce, 0x78, 0x6d, 0xdb, 0x66, 0xec, + 0xb1, 0xb4, 0x1c, 0x19, 0xcf, 0x1a, 0xf4, 0xa4, 0xbb, 0xe7, 0xc9, 0xd9, + 0xf6, 0x68, 0xd2, 0xef, 0xca, 0xd3, 0x8f, 0x50, 0x0f, 0xd6, 0xaa, 0x67, + 0x69, 0xd3, 0x03, 0xc9, 0x51, 0x7e, 0x5f, 0xab, 0xde, 0x06, 0x67, 0x7d, + 0x8b, 0xb9, 0xbe, 0x67, 0xed, 0x71, 0xca, 0xb8, 0xbf, 0x6c, 0xac, 0x6f, + 0x5a, 0x9b, 0x2b, 0x65, 0xac, 0xa6, 0x95, 0xab, 0xeb, 0xea, 0x88, 0x7d, + 0x76, 0x14, 0xc2, 0x75, 0xcc, 0x27, 0xf5, 0x89, 0x2e, 0xae, 0x79, 0x11, + 0xe3, 0x35, 0x30, 0xb3, 0x1e, 0x6f, 0xe0, 0x1c, 0xf3, 0x68, 0x28, 0xd1, + 0x88, 0xa7, 0x27, 0xfe, 0x85, 0x7d, 0xfd, 0x02, 0xe7, 0x27, 0x86, 0xf9, + 0xee, 0x77, 0xad, 0x6b, 0xf4, 0xa2, 0x36, 0xe1, 0xc4, 0x75, 0x77, 0xf3, + 0x6a, 0xdc, 0x9a, 0x96, 0x39, 0x5f, 0xc3, 0xb9, 0x1a, 0x88, 0xa6, 0x65, + 0xee, 0x7d, 0x8c, 0x41, 0x99, 0x7b, 0xf9, 0x7f, 0x32, 0xf7, 0x35, 0x30, + 0xb9, 0x36, 0xf1, 0xfe, 0xdf, 0x59, 0xc5, 0xba, 0xce, 0x35, 0xf3, 0x62, + 0x57, 0x2a, 0x3b, 0xdf, 0xd5, 0x38, 0x11, 0x7f, 0x5a, 0xe6, 0xe8, 0xcf, + 0x71, 0x67, 0x31, 0xb0, 0x18, 0x23, 0xfd, 0x2a, 0x8e, 0x1a, 0x45, 0x38, + 0xa9, 0x4a, 0x9d, 0xa4, 0xd7, 0x94, 0x7c, 0xbf, 0x24, 0xee, 0xc5, 0x10, + 0x5f, 0xeb, 0xd5, 0x1c, 0xbc, 0x42, 0x0e, 0xf5, 0x92, 0x51, 0x4d, 0xcc, + 0xba, 0x32, 0x9e, 0xe4, 0x9a, 0x4a, 0x1d, 0x59, 0x8e, 0x57, 0x0d, 0xe1, + 0x4f, 0x72, 0x5d, 0xce, 0xc0, 0xbd, 0x18, 0x8d, 0x7b, 0x90, 0xdb, 0xf7, + 0x99, 0x75, 0xd6, 0x27, 0xf7, 0x5f, 0x39, 0xfe, 0x2b, 0xdb, 0x11, 0x79, + 0xfc, 0x2e, 0x6d, 0x98, 0xc1, 0x60, 0xa5, 0x63, 0x9e, 0x83, 0x5b, 0x82, + 0xc7, 0x57, 0x15, 0x67, 0x30, 0x8c, 0x5a, 0x78, 0xea, 0xcf, 0x89, 0xa7, + 0xcc, 0x35, 0xf1, 0xbf, 0xda, 0xa6, 0xcb, 0x79, 0xd4, 0xb1, 0x3f, 0xbf, + 0x45, 0xcf, 0x25, 0xaf, 0x95, 0x1c, 0xb1, 0xa6, 0x27, 0x68, 0xe7, 0x8a, + 0xb5, 0x3d, 0xba, 0xfd, 0x1e, 0xeb, 0xb9, 0xce, 0x7e, 0x5f, 0xdf, 0x53, + 0x9b, 0xba, 0x84, 0xbb, 0x0e, 0xf7, 0xb3, 0x6b, 0x72, 0xd1, 0x6b, 0x98, + 0xca, 0xed, 0xcd, 0x92, 0x7b, 0xb2, 0xf9, 0xd6, 0xd6, 0xf2, 0xca, 0x4b, + 0x71, 0xd3, 0xf2, 0xeb, 0x05, 0xcc, 0x5b, 0x50, 0x26, 0x74, 0xbd, 0x63, + 0x46, 0xe9, 0xc2, 0x07, 0x61, 0x9d, 0x71, 0x10, 0xd0, 0xa4, 0x3e, 0xf6, + 0x4c, 0xfa, 0x9f, 0xb1, 0x6b, 0x2f, 0x62, 0xf9, 0x2d, 0x52, 0x67, 0x4a, + 0x5d, 0x15, 0xf6, 0x30, 0x1e, 0x9c, 0xf9, 0xbc, 0x4b, 0x7e, 0x7d, 0x3e, + 0x25, 0xb9, 0xc7, 0x39, 0x37, 0x39, 0x9a, 0x6e, 0xc4, 0xb6, 0x09, 0xe9, + 0x37, 0x86, 0xed, 0xe4, 0xb7, 0xfb, 0xe2, 0x8d, 0x88, 0x27, 0x9f, 0xb7, + 0xf2, 0xf5, 0xda, 0xce, 0x1c, 0xea, 0x81, 0x64, 0x7a, 0x1a, 0x89, 0x81, + 0x8f, 0x2d, 0xb7, 0xde, 0x85, 0xd7, 0xc3, 0xd3, 0xe8, 0xdb, 0xaf, 0x61, + 0x17, 0xef, 0xd9, 0x91, 0x6c, 0x87, 0x39, 0xea, 0xc2, 0xe6, 0x96, 0x34, + 0xa6, 0x86, 0x35, 0xec, 0xe4, 0x7d, 0xc7, 0xfa, 0xf5, 0xd6, 0x7c, 0x65, + 0x1a, 0x47, 0x53, 0x6c, 0x33, 0xf9, 0x16, 0xd7, 0x79, 0x1a, 0xdb, 0xfb, + 0x75, 0x75, 0xc8, 0x9e, 0xd7, 0x34, 0xba, 0x53, 0x32, 0x2f, 0x53, 0x59, + 0xda, 0xec, 0x9c, 0x33, 0xf4, 0xd8, 0x73, 0x8a, 0xe1, 0xf1, 0x64, 0x4f, + 0x2c, 0x8f, 0xf8, 0x9d, 0xcb, 0x7c, 0xf3, 0xbd, 0xb4, 0xae, 0xf4, 0x72, + 0x6d, 0x0e, 0xd1, 0x47, 0x46, 0x39, 0xd6, 0x91, 0x94, 0xe0, 0xb8, 0x83, + 0xc9, 0xdb, 0x19, 0xe7, 0xbd, 0x7b, 0x56, 0xf3, 0xfe, 0x46, 0xd9, 0x5f, + 0xc3, 0xcb, 0x46, 0x2d, 0xfb, 0xb3, 0xf0, 0xae, 0x11, 0xf0, 0x5f, 0xc7, + 0xf7, 0x83, 0x46, 0x27, 0x36, 0xe9, 0x36, 0xc6, 0xb4, 0xea, 0x4a, 0xa0, + 0xd5, 0xa4, 0x06, 0x78, 0xc7, 0x90, 0x7d, 0x22, 0x37, 0x9e, 0x31, 0x8a, + 0xc9, 0x31, 0xdd, 0x68, 0x08, 0xe7, 0xd3, 0x4f, 0x6c, 0x3d, 0x81, 0x0f, + 0xfb, 0x15, 0xdc, 0x45, 0x3c, 0x7f, 0x21, 0xdc, 0x10, 0x5b, 0x2a, 0x8c, + 0x6d, 0xbf, 0x82, 0x73, 0xfa, 0x05, 0xcb, 0xac, 0x54, 0xec, 0x9a, 0x5b, + 0x67, 0x4d, 0x7e, 0x63, 0xc5, 0xec, 0xba, 0xa4, 0xcf, 0xad, 0xec, 0xef, + 0x66, 0x38, 0xbe, 0x7b, 0xf8, 0xbb, 0xeb, 0x16, 0x35, 0x74, 0xca, 0xef, + 0xfc, 0xcc, 0x25, 0xf2, 0xbb, 0x93, 0x95, 0x9e, 0x39, 0xbf, 0x8b, 0x60, + 0xfb, 0x9e, 0xe5, 0xf6, 0x78, 0x1f, 0x4b, 0x82, 0x8a, 0xa8, 0x0b, 0xee, + 0x70, 0x83, 0x7a, 0x06, 0xe8, 0x9a, 0x36, 0x4a, 0x99, 0xa3, 0x83, 0xa1, + 0xf5, 0x10, 0x3b, 0x49, 0x2c, 0xbe, 0x45, 0x0c, 0x18, 0xc6, 0x82, 0x31, + 0xc9, 0x83, 0xc1, 0x35, 0x43, 0x48, 0xe1, 0xc1, 0x74, 0x0a, 0x0f, 0x09, + 0x4f, 0xb4, 0x6b, 0xb0, 0xd3, 0x78, 0x38, 0xfe, 0x16, 0xfa, 0x6c, 0x6d, + 0x70, 0x08, 0xeb, 0xe2, 0x9f, 0xcc, 0x47, 0x81, 0xfc, 0x76, 0x05, 0xdb, + 0x17, 0x9b, 0x06, 0xda, 0x4d, 0x5c, 0x64, 0xfb, 0x2b, 0xd0, 0x33, 0x64, + 0x59, 0xcf, 0x32, 0x6f, 0xbe, 0x46, 0x5e, 0x70, 0x8e, 0xfe, 0xd3, 0xd6, + 0x2c, 0xed, 0x4f, 0x2a, 0xba, 0x9d, 0x3f, 0x63, 0xe8, 0x4b, 0xce, 0x93, + 0xda, 0x0d, 0x14, 0x8f, 0xe9, 0xca, 0x75, 0x7d, 0x8d, 0xfc, 0xec, 0x81, + 0x6b, 0x4c, 0xc3, 0x3d, 0x7d, 0x5e, 0xea, 0x9f, 0xe7, 0x14, 0xc9, 0xa1, + 0x55, 0xe4, 0x53, 0xfe, 0xfd, 0x9a, 0xb2, 0x70, 0xd0, 0x8b, 0xbb, 0xfa, + 0xc8, 0xb3, 0xfa, 0xda, 0xd1, 0xf3, 0xa4, 0xce, 0x7b, 0x02, 0xc6, 0x71, + 0x25, 0x10, 0x3a, 0x8a, 0x5a, 0x6d, 0x88, 0x7c, 0xc0, 0x4f, 0xbc, 0xf6, + 0x50, 0x43, 0x15, 0x92, 0x2b, 0xba, 0x0e, 0x96, 0xa3, 0xe8, 0xa0, 0x1f, + 0x55, 0xcc, 0xa9, 0xfe, 0xb1, 0x13, 0x98, 0x18, 0x84, 0x5a, 0x18, 0xf9, + 0x9d, 0x95, 0x47, 0xff, 0xfb, 0x28, 0x1c, 0x42, 0xc9, 0xd8, 0x56, 0xa4, + 0xd9, 0x5f, 0x11, 0x39, 0x6a, 0x03, 0xfb, 0xbb, 0xad, 0x4f, 0x67, 0x3b, + 0x8e, 0x16, 0x59, 0x3a, 0xd6, 0x88, 0xde, 0x64, 0x60, 0x8d, 0x09, 0x19, + 0xf3, 0xcb, 0xc8, 0x1f, 0xb8, 0x54, 0x93, 0xae, 0x87, 0xed, 0xba, 0xeb, + 0xf6, 0xfb, 0xe1, 0xd4, 0xa7, 0xdf, 0x9e, 0x99, 0x4f, 0xa3, 0xcc, 0x27, + 0x27, 0x46, 0x3f, 0x98, 0x8f, 0x52, 0xce, 0xe7, 0x14, 0xfd, 0xe6, 0x66, + 0x8e, 0xf5, 0x02, 0xf9, 0x6f, 0x27, 0xe7, 0xf2, 0xde, 0xf0, 0x73, 0x4a, + 0x15, 0xe7, 0x32, 0x43, 0xbe, 0xf5, 0x71, 0x4a, 0x53, 0x6a, 0x39, 0x97, + 0x47, 0x78, 0xfd, 0x61, 0xce, 0x65, 0xdb, 0x93, 0x81, 0xf6, 0x17, 0x95, + 0x40, 0x6c, 0x85, 0x52, 0xab, 0x6e, 0x53, 0x8a, 0x70, 0x6a, 0xb8, 0x04, + 0x67, 0x98, 0xff, 0x2f, 0x0c, 0x97, 0xe3, 0xec, 0xb0, 0x8f, 0xb1, 0xa1, + 0xb3, 0x0d, 0xe6, 0x3a, 0xdd, 0x8f, 0x99, 0xf4, 0x43, 0x28, 0xed, 0xab, + 0xc6, 0xc7, 0xe9, 0x4d, 0x28, 0xe9, 0x13, 0x1e, 0xab, 0xe1, 0x23, 0x5e, + 0xff, 0x30, 0x3d, 0x8e, 0x82, 0x41, 0xc1, 0x30, 0xa9, 0x2f, 0x08, 0xe1, + 0x6c, 0xba, 0x03, 0x45, 0x83, 0x5b, 0xe0, 0x19, 0xb4, 0xba, 0x7a, 0xc2, + 0xf8, 0x89, 0x9b, 0x73, 0xe9, 0x36, 0x02, 0x53, 0xd7, 0xb9, 0x1b, 0xd9, + 0xc6, 0xa4, 0xb2, 0x70, 0x6c, 0x0b, 0x4a, 0x06, 0x35, 0x6c, 0xa6, 0x0d, + 0xc7, 0xa1, 0x87, 0x56, 0x28, 0x5b, 0xa8, 0x3b, 0x9d, 0xf9, 0x6f, 0x18, + 0x73, 0xe2, 0xe2, 0xb6, 0xe6, 0xb9, 0x7c, 0xdc, 0x6f, 0x73, 0xc7, 0xe9, + 0x74, 0x21, 0x5e, 0x49, 0x89, 0x7d, 0x64, 0xaf, 0x70, 0x1c, 0x79, 0x83, + 0xc4, 0xc2, 0x61, 0xc3, 0xe6, 0x2c, 0x12, 0x13, 0xc3, 0xe9, 0x2f, 0x8a, + 0xa9, 0x56, 0xec, 0x4c, 0x56, 0x31, 0x9e, 0xaa, 0x71, 0xc7, 0xa0, 0x65, + 0x85, 0xc2, 0x53, 0x37, 0x7b, 0xe9, 0x45, 0xa3, 0xe9, 0x2b, 0xe3, 0x29, + 0x4a, 0xdf, 0x14, 0x4c, 0xb5, 0x30, 0x6d, 0x38, 0x38, 0xf3, 0x82, 0x5d, + 0xdf, 0x24, 0x31, 0xb9, 0x16, 0x3d, 0x7b, 0x10, 0x7b, 0xaa, 0x59, 0x62, + 0x32, 0x07, 0x43, 0xe4, 0xac, 0xa7, 0xe2, 0xb2, 0x7f, 0xf9, 0x3b, 0x62, + 0x41, 0x2e, 0x0e, 0x0c, 0xcb, 0x99, 0xbe, 0x06, 0x7f, 0x5f, 0x01, 0x26, + 0x53, 0x72, 0x3e, 0x08, 0x7c, 0x44, 0xa5, 0x38, 0xce, 0xfc, 0xfb, 0x61, + 0xdc, 0x87, 0xb1, 0x74, 0x35, 0x3e, 0x88, 0xeb, 0x48, 0x73, 0x3d, 0xde, + 0x8f, 0x87, 0xf0, 0x2c, 0x71, 0xe6, 0xbd, 0xb8, 0x60, 0x4e, 0x23, 0x9e, + 0xa1, 0xfd, 0xf2, 0xfb, 0xfc, 0x6c, 0x57, 0xf0, 0x47, 0x43, 0x4e, 0x9f, + 0xae, 0x0d, 0x65, 0x7c, 0xc1, 0x33, 0xb6, 0x96, 0x71, 0x23, 0xf5, 0x79, + 0x82, 0xff, 0x1e, 0x63, 0x88, 0xba, 0xf1, 0x40, 0x63, 0xb6, 0xd6, 0x3c, + 0xe0, 0x9f, 0x42, 0x05, 0x63, 0xe7, 0xa2, 0xa5, 0xea, 0x72, 0xd6, 0xd0, + 0x1f, 0x3e, 0x17, 0xd7, 0x99, 0x1b, 0xa5, 0xbe, 0xc9, 0x54, 0x72, 0x5a, + 0x72, 0xc8, 0x89, 0xb6, 0x71, 0xde, 0x8d, 0x76, 0x0d, 0x54, 0x01, 0xd7, + 0x46, 0xd5, 0x3f, 0xc0, 0x82, 0xfd, 0x71, 0xbf, 0xc3, 0xb7, 0x18, 0xbf, + 0xb3, 0xdc, 0x33, 0x8b, 0xed, 0xb2, 0xaf, 0xb0, 0x37, 0xfc, 0x72, 0xfc, + 0x1f, 0xfd, 0xb2, 0x07, 0xfa, 0x22, 0x5a, 0x69, 0x93, 0x93, 0x99, 0x3a, + 0x18, 0xd1, 0xc7, 0xd2, 0x77, 0x35, 0xfb, 0xb6, 0xf0, 0x06, 0x31, 0xe4, + 0x6c, 0xbf, 0x70, 0x33, 0xe1, 0x64, 0x5d, 0xcc, 0x39, 0xc5, 0x38, 0xc3, + 0xb5, 0xd9, 0x4e, 0x4d, 0x51, 0x9b, 0x98, 0x22, 0xa7, 0xbe, 0x81, 0xbc, + 0xb0, 0x84, 0xcd, 0x1c, 0x61, 0x7f, 0x6b, 0xb1, 0x93, 0xb1, 0x98, 0xaf, + 0x5f, 0x87, 0x3b, 0xc8, 0xa5, 0xe5, 0x6c, 0x09, 0xab, 0x24, 0x5f, 0x00, + 0x75, 0x09, 0x15, 0x52, 0x1b, 0xf2, 0x1a, 0x6e, 0x46, 0xac, 0xd2, 0x0b, + 0xd9, 0x97, 0xf9, 0x29, 0x16, 0x23, 0xf5, 0x0d, 0xc9, 0xa9, 0x2e, 0xd9, + 0xeb, 0x37, 0x4f, 0xa0, 0x06, 0x28, 0xe7, 0x1c, 0x22, 0x32, 0x1e, 0x1f, + 0x6d, 0xaf, 0xe2, 0x34, 0xed, 0x7a, 0x26, 0x5e, 0x3b, 0x73, 0x2b, 0xb9, + 0xd9, 0x19, 0x37, 0xb9, 0x65, 0x85, 0xdc, 0xdf, 0x08, 0x9d, 0xed, 0x7d, + 0x1a, 0x0f, 0x63, 0x40, 0x95, 0xcf, 0xc2, 0x51, 0xd7, 0xa2, 0x7b, 0x48, + 0xc6, 0x60, 0x59, 0xe5, 0xc4, 0xc3, 0x55, 0x76, 0xff, 0xd2, 0x37, 0xe7, + 0xf1, 0x85, 0x75, 0x16, 0x1a, 0xed, 0x30, 0x8d, 0x43, 0xfd, 0xb4, 0x7f, + 0xcb, 0x39, 0xda, 0x61, 0x1a, 0xc3, 0x29, 0x9d, 0xfc, 0xb5, 0x10, 0x5a, + 0x65, 0x2b, 0x76, 0x25, 0x5b, 0x89, 0x13, 0x2a, 0xe3, 0xb7, 0x10, 0x66, + 0xa5, 0xd3, 0xe7, 0x0d, 0x89, 0x0f, 0xac, 0xa9, 0x95, 0xb6, 0xd6, 0x92, + 0x31, 0x57, 0xa1, 0x60, 0xbe, 0x3c, 0x2e, 0x80, 0x8d, 0x7d, 0x67, 0xad, + 0xa9, 0xf6, 0xb9, 0xdf, 0x97, 0x65, 0xea, 0x7d, 0x2b, 0xf9, 0xee, 0xd8, + 0xa5, 0x9b, 0x76, 0x29, 0xd5, 0xdf, 0xb2, 0xbe, 0x6e, 0x8f, 0xeb, 0x53, + 0xbf, 0xec, 0x93, 0xd4, 0x25, 0x42, 0xbc, 0xd7, 0xc7, 0x7b, 0x88, 0xa1, + 0x11, 0xbd, 0xf5, 0x18, 0x7e, 0x61, 0x9d, 0xbc, 0xac, 0x9d, 0x0a, 0x5e, + 0x93, 0xbc, 0x73, 0x32, 0xb3, 0x6f, 0xe1, 0xcf, 0x68, 0x8e, 0x69, 0xbc, + 0xd8, 0x2f, 0xd8, 0xaf, 0x61, 0x9d, 0xec, 0xaf, 0xa8, 0x81, 0x5e, 0x13, + 0x53, 0x78, 0x35, 0xfe, 0x36, 0x6d, 0xaf, 0x60, 0x73, 0x70, 0x0a, 0x3f, + 0xb9, 0x2c, 0x37, 0x45, 0xed, 0x73, 0xc2, 0xa2, 0x88, 0xe0, 0xe7, 0x34, + 0x1e, 0xeb, 0x97, 0xda, 0xa2, 0x8f, 0xc9, 0x8b, 0xba, 0xc8, 0x53, 0xa7, + 0xd1, 0x93, 0x6a, 0xc7, 0xd3, 0x4f, 0xae, 0x26, 0xae, 0x08, 0x36, 0xd6, + 0x1e, 0x3b, 0xe5, 0x6e, 0xc7, 0x53, 0xa3, 0x69, 0xa4, 0x0e, 0x4e, 0x63, + 0x62, 0x40, 0x72, 0xed, 0x34, 0x75, 0xba, 0xe4, 0xc8, 0xa3, 0x30, 0xf9, + 0xbe, 0x33, 0xb9, 0x05, 0xd1, 0x83, 0x6f, 0x51, 0x4b, 0x4c, 0x63, 0xe9, + 0x80, 0xbe, 0x66, 0x04, 0xd3, 0x58, 0xb6, 0x3f, 0x84, 0x7e, 0x72, 0x99, + 0x6d, 0xcc, 0x91, 0x3b, 0x9e, 0x0c, 0xd8, 0x7b, 0x26, 0x53, 0x6a, 0x88, + 0xf9, 0x75, 0x39, 0xcc, 0x21, 0x39, 0xef, 0xf4, 0xa2, 0x31, 0xa1, 0x29, + 0x1f, 0xee, 0xf5, 0xa0, 0x21, 0x11, 0x68, 0xef, 0x53, 0x02, 0xe6, 0x32, + 0xa5, 0x56, 0xcb, 0x75, 0x59, 0xd6, 0x0e, 0xe6, 0x86, 0x63, 0x86, 0x82, + 0xfc, 0x9b, 0x15, 0x84, 0x99, 0xab, 0xb4, 0x79, 0xcc, 0x21, 0x43, 0x11, + 0xec, 0xd8, 0xc3, 0xf9, 0xce, 0xae, 0x9b, 0x66, 0xf3, 0xa8, 0xed, 0x76, + 0xde, 0x5e, 0x8d, 0x1d, 0x13, 0xb5, 0x1d, 0xc7, 0x20, 0xd7, 0xe5, 0xbe, + 0x59, 0x6d, 0x5b, 0xf4, 0x71, 0x73, 0x20, 0x54, 0xaa, 0xc8, 0xbd, 0xdb, + 0x88, 0x59, 0x73, 0xef, 0x37, 0x95, 0xfe, 0x16, 0x39, 0x43, 0x97, 0xb8, + 0xe8, 0xb6, 0xe3, 0x45, 0x6c, 0xb1, 0xa3, 0x3f, 0x4a, 0x9f, 0xfe, 0x91, + 0x95, 0x6a, 0x5f, 0xcb, 0x71, 0x46, 0xed, 0xf3, 0x53, 0xc1, 0x84, 0xd7, + 0x65, 0x3f, 0x29, 0x47, 0x30, 0xa1, 0x3b, 0xe6, 0xa5, 0x3f, 0xe5, 0x11, + 0x97, 0xf2, 0xc7, 0xbd, 0xf0, 0x8e, 0x14, 0x22, 0xef, 0x80, 0xf0, 0x30, + 0xd1, 0xd1, 0x2a, 0xdc, 0xe3, 0x45, 0x8c, 0x01, 0xae, 0xe1, 0x38, 0x63, + 0x8c, 0x4d, 0xd7, 0x8c, 0xfb, 0xf1, 0x43, 0x62, 0x40, 0xd5, 0xb8, 0x8e, + 0x49, 0x62, 0x80, 0x9f, 0xfa, 0x7f, 0x82, 0xdc, 0xa1, 0x74, 0x7c, 0x52, + 0xf9, 0x69, 0x7a, 0x39, 0xd7, 0x54, 0xfa, 0x11, 0x1b, 0x66, 0xd7, 0x54, + 0xd6, 0x73, 0x35, 0xb1, 0x4e, 0xd6, 0xd6, 0xc0, 0xe3, 0x7b, 0xd2, 0xb8, + 0x65, 0xd0, 0xc2, 0x3f, 0x19, 0xf2, 0x7c, 0x90, 0xe8, 0x4a, 0x0b, 0x69, + 0xe6, 0xb5, 0xdb, 0x8d, 0xc0, 0x1a, 0xd9, 0xdf, 0x8b, 0xf9, 0x2c, 0xe4, + 0x86, 0x03, 0x06, 0xd1, 0x7d, 0x4d, 0xbe, 0x22, 0x39, 0xaa, 0x41, 0xdb, + 0x84, 0xab, 0x33, 0xb5, 0xbf, 0xb7, 0x62, 0x93, 0xaa, 0x30, 0x16, 0xdb, + 0xb0, 0xb3, 0xcc, 0xf4, 0x9e, 0x6b, 0xb6, 0xac, 0x0d, 0xe1, 0x1b, 0xfc, + 0xf6, 0x33, 0x05, 0xae, 0x47, 0xf8, 0x1e, 0xe3, 0x9c, 0x65, 0xde, 0x1d, + 0xe8, 0xdb, 0xab, 0x20, 0x1d, 0xec, 0x40, 0x7c, 0xb8, 0x43, 0x78, 0x13, + 0xf1, 0xa0, 0x97, 0x78, 0x60, 0x75, 0xdd, 0x1f, 0xfe, 0x3a, 0xce, 0xda, + 0x19, 0x5f, 0x7e, 0x23, 0x7b, 0xc5, 0x73, 0xd7, 0xa0, 0xb5, 0x4a, 0xb4, + 0xba, 0xc4, 0xcd, 0x92, 0x01, 0xe1, 0xd5, 0xc1, 0xde, 0x1d, 0x5c, 0xfb, + 0x95, 0xfb, 0x25, 0xbf, 0x58, 0x56, 0x2f, 0xf9, 0x28, 0xca, 0x64, 0x0e, + 0x8d, 0x48, 0x24, 0xad, 0x8f, 0xab, 0xf4, 0xda, 0x99, 0x5d, 0xcc, 0xe3, + 0x27, 0x06, 0x1b, 0x36, 0x6d, 0x12, 0xce, 0xb2, 0x48, 0xef, 0xac, 0x72, + 0xa7, 0x71, 0xfc, 0xe0, 0x02, 0xa4, 0x56, 0x72, 0x3e, 0x5c, 0xa7, 0x9c, + 0xc4, 0xe7, 0x96, 0xd4, 0x83, 0xbb, 0xc9, 0xd1, 0x0f, 0x11, 0xf7, 0x5c, + 0xe3, 0x41, 0xf4, 0x94, 0xc1, 0x3c, 0xd7, 0x2c, 0xfd, 0xcf, 0x8e, 0x9f, + 0xf3, 0x6d, 0xc7, 0xae, 0x27, 0x85, 0x57, 0x08, 0x07, 0xab, 0x35, 0xdf, + 0xc7, 0x6a, 0xf4, 0x4f, 0x38, 0x7d, 0xc5, 0x93, 0x57, 0xfa, 0x89, 0xac, + 0xf9, 0x51, 0x3c, 0x4e, 0xde, 0xe6, 0x65, 0xfb, 0xcc, 0x29, 0x6c, 0x4f, + 0x0f, 0xe5, 0x4b, 0x7f, 0xe3, 0x3f, 0xb2, 0x76, 0x56, 0x8a, 0x6d, 0xa4, + 0xfd, 0xdf, 0xcf, 0xb7, 0x6b, 0x18, 0xc2, 0x5f, 0x36, 0xd7, 0x8f, 0xab, + 0x9c, 0x1a, 0xa1, 0xec, 0x78, 0xe4, 0x37, 0x5f, 0x34, 0x1e, 0x8b, 0xf7, + 0xc9, 0x98, 0x3a, 0xf0, 0x38, 0x65, 0x22, 0x35, 0x55, 0x74, 0x81, 0xd2, + 0x81, 0x5e, 0xda, 0x77, 0x7b, 0x7f, 0x07, 0x9e, 0x62, 0xbc, 0x1e, 0x30, + 0x5e, 0xa8, 0x72, 0xa1, 0x7e, 0xc6, 0x8d, 0xa9, 0x1f, 0xd7, 0x10, 0x4b, + 0x17, 0x2e, 0x0a, 0x32, 0xb6, 0x3a, 0x90, 0x48, 0xfd, 0xef, 0x2a, 0x7b, + 0x2f, 0xd5, 0xd5, 0x68, 0xd7, 0xbf, 0xba, 0xf5, 0x4e, 0x14, 0x0c, 0x1c, + 0x45, 0xce, 0x40, 0x27, 0xf2, 0x83, 0x8b, 0x71, 0x7b, 0xf8, 0xa4, 0x75, + 0x56, 0xf7, 0xf8, 0x5f, 0xa4, 0x7d, 0x5e, 0x68, 0xac, 0xc2, 0xfd, 0x86, + 0x81, 0xed, 0x43, 0x57, 0x31, 0xee, 0xa3, 0x78, 0x7c, 0x82, 0x7d, 0x45, + 0x5c, 0x58, 0xd6, 0x22, 0xfb, 0x01, 0x0a, 0xfd, 0x7a, 0x1e, 0x4e, 0xfa, + 0x74, 0xf5, 0x41, 0xbb, 0x56, 0x93, 0x9c, 0xcb, 0xa7, 0xe1, 0x3e, 0xc6, + 0x57, 0x4c, 0x95, 0xeb, 0x5b, 0xc9, 0xff, 0xb7, 0xa2, 0xaa, 0xcf, 0xb4, + 0xc4, 0xde, 0x2f, 0x22, 0xfa, 0x5d, 0x17, 0xc7, 0xd1, 0xba, 0x28, 0xb8, + 0x69, 0x46, 0x11, 0x7f, 0x0e, 0x52, 0xe3, 0x1a, 0xde, 0xe5, 0x63, 0x0a, + 0x42, 0x03, 0x6c, 0x2b, 0x3c, 0x56, 0xe5, 0xec, 0xe7, 0x66, 0xf9, 0xdd, + 0x56, 0xf2, 0x82, 0xad, 0x28, 0xee, 0x13, 0x2e, 0x2e, 0xb8, 0x10, 0xfd, + 0x9a, 0x9c, 0x4b, 0xa7, 0xc3, 0xc1, 0xf6, 0x22, 0x45, 0xb8, 0x4f, 0xb0, + 0x75, 0x99, 0x22, 0x5c, 0x45, 0x7e, 0x67, 0x78, 0xeb, 0xc7, 0x4e, 0x64, + 0x6a, 0x3e, 0xa2, 0xc4, 0x06, 0xcd, 0x7e, 0x7e, 0xe1, 0x88, 0x5d, 0x63, + 0x79, 0x69, 0xdf, 0x35, 0x27, 0x21, 0x9a, 0xe1, 0x70, 0xf8, 0x96, 0xf8, + 0x12, 0xe2, 0x9c, 0xb5, 0x78, 0x94, 0x7e, 0x7f, 0x0a, 0x3e, 0xfc, 0x2c, + 0x2e, 0x98, 0xa6, 0xe1, 0xe7, 0xf1, 0xbc, 0x4c, 0x6d, 0x5f, 0x31, 0x5e, + 0xed, 0x37, 0x2d, 0xda, 0xb5, 0x6d, 0x19, 0x7d, 0x29, 0x14, 0x2e, 0x02, + 0x2a, 0xbb, 0xef, 0xcb, 0xb1, 0xf7, 0x09, 0x8a, 0x51, 0x46, 0xfc, 0x1f, + 0x18, 0xfa, 0x43, 0xf5, 0x66, 0xc4, 0xe0, 0x02, 0xd9, 0xef, 0x72, 0x63, + 0x7b, 0xf8, 0xb7, 0x56, 0x6a, 0xb5, 0xfc, 0xa6, 0x1a, 0xc7, 0xf7, 0x8a, + 0x9f, 0x86, 0x90, 0x97, 0x38, 0x41, 0x9f, 0x54, 0xf1, 0x7a, 0xbc, 0xd6, + 0x58, 0xe1, 0x5a, 0x4b, 0xff, 0xaf, 0xb9, 0x0c, 0xb7, 0x6b, 0xf4, 0xbb, + 0x70, 0xaf, 0x8d, 0xdb, 0x6d, 0xe8, 0x61, 0x5e, 0x20, 0x6f, 0xdb, 0x77, + 0x9f, 0x4b, 0x65, 0x3e, 0xaf, 0x55, 0x6b, 0x15, 0x9d, 0xdf, 0xa9, 0x36, + 0x9f, 0xac, 0x20, 0xdf, 0xbb, 0x3f, 0xde, 0xa0, 0xfd, 0x06, 0xeb, 0xec, + 0xf3, 0x2d, 0xcd, 0x25, 0x73, 0xd2, 0x51, 0x94, 0xd0, 0xf1, 0x12, 0xe7, + 0xb1, 0xbd, 0xcc, 0xe9, 0xb7, 0x24, 0xd3, 0x76, 0x62, 0x48, 0xf8, 0xd6, + 0x4d, 0x58, 0x61, 0xb7, 0xdd, 0xca, 0xb8, 0xd4, 0xa9, 0x45, 0x14, 0x94, + 0xd6, 0xeb, 0xd4, 0x20, 0x4b, 0xb0, 0xa5, 0x5c, 0xc7, 0x53, 0xc9, 0xad, + 0x68, 0x4a, 0x7e, 0x0d, 0x77, 0x97, 0x9b, 0xcc, 0x8b, 0xc4, 0xa0, 0x84, + 0xae, 0x2e, 0x50, 0xbe, 0x9a, 0xd9, 0x6f, 0xf5, 0xc1, 0x93, 0x90, 0x7c, + 0x97, 0x8b, 0xdd, 0xea, 0xd5, 0x28, 0xd4, 0xa5, 0x7d, 0xa7, 0xed, 0x5d, + 0x43, 0x81, 0x4c, 0x0e, 0x24, 0x6a, 0x24, 0x14, 0xc9, 0xbd, 0xa1, 0x87, + 0xc8, 0x23, 0x52, 0xcc, 0x7e, 0xb9, 0x11, 0x3d, 0xb5, 0x11, 0xf9, 0x30, + 0xe7, 0x09, 0x1e, 0xca, 0x6f, 0xae, 0xba, 0x62, 0x4c, 0xe5, 0x99, 0x31, + 0x65, 0xaf, 0xff, 0x13, 0xaf, 0x89, 0x6f, 0x09, 0xb7, 0x90, 0xef, 0x0b, + 0xd0, 0xae, 0xca, 0x79, 0x51, 0x2b, 0x92, 0x49, 0xb9, 0x1e, 0x30, 0x4c, + 0x57, 0x33, 0x7e, 0x3d, 0xe8, 0xf8, 0xe0, 0x9a, 0x3a, 0xae, 0x7f, 0x49, + 0x33, 0x66, 0x0e, 0x4a, 0x2e, 0xfb, 0x63, 0xea, 0x1d, 0xc5, 0xae, 0x81, + 0x63, 0xa7, 0xd1, 0x30, 0x75, 0x8f, 0xeb, 0x90, 0x85, 0x0a, 0xb1, 0xf1, + 0x13, 0x57, 0x89, 0xc6, 0x74, 0x91, 0x43, 0x98, 0xe9, 0xa9, 0xab, 0x24, + 0x4f, 0x7a, 0x12, 0x40, 0x4d, 0xc2, 0x44, 0x5e, 0x44, 0xdf, 0x77, 0xce, + 0x7d, 0xc1, 0x8a, 0xcd, 0xbb, 0x4a, 0xf6, 0x77, 0x66, 0xe7, 0xdc, 0xcb, + 0xb1, 0xbb, 0xf5, 0x1f, 0x59, 0xb7, 0xfa, 0x64, 0x8c, 0xef, 0x5e, 0xe5, + 0xd4, 0x4d, 0x5d, 0x43, 0xbb, 0x64, 0x6d, 0x62, 0xd1, 0x7f, 0xfe, 0xce, + 0xba, 0xf3, 0xb2, 0xeb, 0xc2, 0x65, 0xc4, 0x4f, 0xe7, 0xd6, 0x1e, 0x89, + 0xcf, 0xca, 0xf9, 0xc0, 0x34, 0x46, 0xfb, 0xc5, 0x77, 0xc5, 0xc6, 0x51, + 0x9c, 0x22, 0x2f, 0xcc, 0xdd, 0x3d, 0x8d, 0x03, 0xe4, 0x85, 0xee, 0x44, + 0x60, 0x1f, 0x2d, 0x89, 0x2d, 0xea, 0x62, 0x62, 0x75, 0x31, 0xc7, 0x91, + 0x1d, 0x43, 0x30, 0x63, 0x77, 0xc1, 0x78, 0xf2, 0x59, 0x72, 0xa4, 0x25, + 0x7d, 0x79, 0xd0, 0xb9, 0xf6, 0x31, 0x57, 0x09, 0x8a, 0x32, 0xf7, 0xc5, + 0x39, 0x96, 0x42, 0xfd, 0x2a, 0x2c, 0xcb, 0xf0, 0x24, 0x0f, 0x39, 0x80, + 0x5e, 0x2e, 0xf9, 0x57, 0x72, 0x2e, 0xf9, 0x76, 0x8b, 0xe4, 0xdc, 0x36, + 0x8e, 0xad, 0x2a, 0x73, 0x56, 0x72, 0xa7, 0x7d, 0x7d, 0x5f, 0xf2, 0xfc, + 0xc5, 0xdd, 0xc4, 0x6f, 0xf5, 0xc9, 0x02, 0xac, 0x7c, 0xa2, 0x0d, 0xc6, + 0xaa, 0x66, 0xec, 0x49, 0xc2, 0x5b, 0x13, 0x89, 0x87, 0xad, 0xa4, 0x70, + 0xa4, 0x6b, 0xa1, 0xcd, 0x97, 0xbe, 0x24, 0xfe, 0x65, 0x1d, 0x64, 0xdd, + 0x64, 0x1d, 0xbe, 0x68, 0x8f, 0x7c, 0xee, 0x1a, 0x2c, 0x80, 0xbe, 0xca, + 0xc7, 0x78, 0x74, 0xf2, 0xc3, 0x4e, 0xe6, 0x87, 0x3b, 0x98, 0x1f, 0x1e, + 0x27, 0x7e, 0xf5, 0xee, 0x95, 0x18, 0xed, 0x65, 0x8c, 0x5a, 0x5d, 0x79, + 0xe1, 0x12, 0x9c, 0xca, 0xe4, 0x87, 0x98, 0xab, 0xd5, 0x6e, 0x3f, 0x47, + 0xbf, 0xf3, 0x6a, 0xe7, 0x2c, 0xe8, 0xfa, 0xcb, 0xe2, 0xc6, 0xad, 0xff, + 0xbf, 0xcc, 0x5a, 0x2c, 0xbb, 0xda, 0xd9, 0xe3, 0x25, 0x0e, 0x12, 0x1b, + 0xa5, 0xe6, 0x31, 0x47, 0xd7, 0xa7, 0x16, 0xbb, 0x3b, 0xb0, 0x8f, 0xed, + 0xef, 0x26, 0x3e, 0x26, 0x88, 0x8f, 0x2b, 0x9b, 0x5e, 0xf8, 0xdb, 0x32, + 0xd4, 0x77, 0xaa, 0x98, 0x7a, 0xa0, 0x94, 0xb8, 0xf2, 0x5a, 0x38, 0xb8, + 0xa6, 0x8f, 0xf8, 0xb8, 0x2b, 0x25, 0xfd, 0x48, 0x7f, 0xd9, 0x7e, 0x2c, + 0xe6, 0x9e, 0x37, 0xad, 0x91, 0xd5, 0x32, 0xd6, 0x2f, 0x1a, 0x87, 0x7c, + 0xb7, 0x9e, 0xff, 0x2e, 0xe0, 0x78, 0xfe, 0x9d, 0xfd, 0xcb, 0xf7, 0xab, + 0xb1, 0x67, 0x42, 0xf0, 0x75, 0xee, 0x73, 0x9c, 0xd3, 0xc4, 0x59, 0x5b, + 0x0f, 0x30, 0xcf, 0x46, 0x71, 0x47, 0x8b, 0x8a, 0xb3, 0xf1, 0x69, 0xe4, + 0xef, 0xcf, 0x62, 0x92, 0xb5, 0xf8, 0x25, 0xe2, 0xd1, 0x01, 0x08, 0x06, + 0x2d, 0x91, 0x9a, 0x4f, 0xc6, 0x46, 0x31, 0xc6, 0xfb, 0x75, 0xe2, 0xa4, + 0xec, 0x31, 0x79, 0xc9, 0x65, 0xbb, 0x5f, 0xcc, 0xb5, 0x73, 0x43, 0x31, + 0x71, 0x3b, 0xcb, 0xb3, 0x85, 0x63, 0x0b, 0xe6, 0x50, 0x4f, 0x0c, 0xb9, + 0x91, 0xbb, 0xc8, 0xd1, 0x10, 0xc7, 0xa5, 0xee, 0x92, 0xf1, 0x7f, 0x60, + 0xaf, 0xf8, 0x5c, 0x2d, 0xaa, 0xf4, 0x13, 0xd4, 0x14, 0xc0, 0xf9, 0xb8, + 0xeb, 0x5a, 0x2f, 0xb9, 0x70, 0x97, 0xd1, 0x82, 0x0b, 0x15, 0x3d, 0x8c, + 0x73, 0x3f, 0xbf, 0x9b, 0xc2, 0x48, 0xdc, 0x8b, 0x5c, 0x7b, 0xbf, 0xb1, + 0x84, 0x73, 0x73, 0xec, 0xba, 0x9d, 0x76, 0xcd, 0xa3, 0x46, 0xbb, 0x3d, + 0xe3, 0x63, 0xdb, 0xe9, 0x2f, 0xf2, 0x2c, 0xa7, 0xde, 0x22, 0xfc, 0xb5, + 0x95, 0xb9, 0xb0, 0x18, 0x89, 0x01, 0xd9, 0xb7, 0x28, 0x46, 0xdf, 0x7e, + 0x89, 0xab, 0x6a, 0xc1, 0x4f, 0xf6, 0xbb, 0x84, 0xb6, 0x52, 0x89, 0x2f, + 0x0d, 0x9d, 0x6e, 0x77, 0x31, 0x4e, 0x96, 0x51, 0xb7, 0xda, 0xcf, 0xbb, + 0xae, 0xc5, 0x53, 0x19, 0xde, 0xac, 0x92, 0xe7, 0xb4, 0xcf, 0xf2, 0xe6, + 0xec, 0x5c, 0xb2, 0x3e, 0x22, 0x73, 0x52, 0xb1, 0x23, 0xde, 0x8a, 0xa7, + 0x65, 0x3f, 0xc8, 0x55, 0xcb, 0xfc, 0x41, 0x7d, 0x34, 0x21, 0x76, 0xcf, + 0xfa, 0xd9, 0x9b, 0x19, 0xfb, 0x67, 0xd7, 0x23, 0xfb, 0x59, 0x5f, 0x53, + 0xa0, 0xfc, 0xca, 0xda, 0x5c, 0x29, 0xe3, 0xfb, 0x80, 0x7a, 0xec, 0x45, + 0x7e, 0x7f, 0x17, 0x76, 0x0c, 0xcd, 0xcd, 0x0f, 0x12, 0x7b, 0xd9, 0x33, + 0x39, 0x27, 0x06, 0xcb, 0x12, 0x52, 0x53, 0x70, 0x38, 0x7c, 0x1f, 0xd7, + 0x21, 0xd8, 0xd4, 0x60, 0xef, 0xa9, 0x90, 0xeb, 0x52, 0x87, 0x08, 0xae, + 0x9a, 0xcc, 0xeb, 0xc5, 0xf8, 0x49, 0xbf, 0xe4, 0x59, 0x0b, 0x79, 0xe1, + 0x42, 0xe6, 0xbd, 0xee, 0x07, 0xcb, 0x6c, 0xee, 0x5c, 0x8c, 0x72, 0xe6, + 0x83, 0xdd, 0x43, 0x5f, 0xe4, 0xf3, 0x97, 0x72, 0x41, 0x3a, 0x2c, 0xcf, + 0x04, 0xfd, 0xd6, 0xda, 0xf5, 0x0d, 0xe7, 0x37, 0xc7, 0xfb, 0x65, 0xdf, + 0x38, 0x86, 0xa9, 0xb2, 0x36, 0xc6, 0x54, 0x3e, 0x62, 0xf3, 0xea, 0xed, + 0xe7, 0x02, 0xe5, 0x99, 0xd5, 0x13, 0xf1, 0x1c, 0xb4, 0xce, 0xd7, 0xec, + 0xfd, 0x24, 0x17, 0xf1, 0xfc, 0xed, 0x78, 0x94, 0x39, 0x41, 0xbb, 0xcc, + 0xdf, 0x73, 0xf5, 0x45, 0xb8, 0x2d, 0x83, 0xe5, 0x4f, 0x25, 0x7f, 0x47, + 0xac, 0x29, 0x31, 0x2b, 0x22, 0xc5, 0xf8, 0xca, 0x1e, 0x53, 0x70, 0xd8, + 0x2c, 0x8e, 0xe8, 0x33, 0x0b, 0x94, 0x62, 0x2c, 0x1e, 0x12, 0x5c, 0x97, + 0x67, 0x23, 0xd3, 0x61, 0x6f, 0x5f, 0x8c, 0x6b, 0xd4, 0x89, 0xfa, 0x27, + 0x6d, 0xbb, 0xaa, 0x6e, 0xc5, 0xea, 0x3a, 0x63, 0x44, 0x0d, 0xe6, 0xb5, + 0xce, 0xdb, 0x18, 0x03, 0x33, 0xe1, 0x40, 0xac, 0xc2, 0xad, 0x77, 0xbc, + 0xa3, 0x34, 0xda, 0x7b, 0x9b, 0x03, 0x07, 0x43, 0x78, 0x3f, 0x29, 0x1c, + 0x3f, 0x84, 0xf7, 0xe8, 0xcf, 0xa7, 0x89, 0x5f, 0xf9, 0x89, 0x40, 0xf4, + 0x01, 0x34, 0xe2, 0x3c, 0x3f, 0xe7, 0x25, 0x0c, 0x9c, 0x9b, 0x90, 0x38, + 0x6e, 0xc6, 0x99, 0x89, 0xaf, 0xe2, 0xec, 0x93, 0x0a, 0x5e, 0xd0, 0xbf, + 0x8a, 0x53, 0xa3, 0x9d, 0x58, 0xf4, 0xa4, 0xd4, 0x80, 0x1f, 0x0e, 0xab, + 0xcc, 0x07, 0xf7, 0xd5, 0x59, 0x5d, 0x8f, 0x1a, 0xf5, 0x30, 0xca, 0x03, + 0x46, 0x8c, 0x18, 0x9d, 0xb4, 0x9f, 0x8f, 0x93, 0x35, 0x93, 0xb5, 0xeb, + 0xc4, 0xd9, 0x83, 0x7f, 0x0c, 0x66, 0x48, 0x3f, 0x96, 0x55, 0xa1, 0x5f, + 0x83, 0x1f, 0xa8, 0x8d, 0x9c, 0x87, 0x9f, 0x7c, 0x6b, 0x8a, 0x39, 0x30, + 0x1f, 0x79, 0x95, 0x72, 0x8e, 0xaa, 0xa3, 0x20, 0x11, 0xc2, 0x2b, 0xb4, + 0xdd, 0x1d, 0x95, 0x01, 0x7e, 0x96, 0x5c, 0xdb, 0x48, 0x9d, 0x52, 0x81, + 0xf7, 0x2f, 0xcb, 0xb1, 0x3f, 0xb0, 0xee, 0xb6, 0x71, 0x62, 0x4d, 0xb5, + 0x83, 0x13, 0x5a, 0xb5, 0x60, 0xb3, 0xec, 0x09, 0x3a, 0x35, 0x3f, 0x96, + 0x95, 0x0e, 0xbf, 0xf0, 0xad, 0x22, 0x72, 0xe1, 0x47, 0xc3, 0xf5, 0x66, + 0x19, 0x56, 0xf2, 0xfa, 0xd4, 0x22, 0x15, 0xdf, 0xe6, 0x7b, 0xd0, 0xd6, + 0x48, 0x39, 0xd4, 0x66, 0x29, 0xb5, 0xd6, 0xee, 0x33, 0xc1, 0x9c, 0xf9, + 0x7a, 0x5f, 0x43, 0xec, 0xa0, 0x72, 0xce, 0x32, 0x2b, 0xeb, 0xf8, 0x9d, + 0x0f, 0xc7, 0xe3, 0x81, 0xa9, 0x51, 0x34, 0x68, 0x33, 0xca, 0x53, 0x96, + 0xa9, 0xca, 0xfa, 0xc8, 0x7c, 0xe5, 0xf7, 0xd7, 0xf1, 0xfa, 0xc9, 0x39, + 0x7e, 0x78, 0x49, 0x67, 0xe5, 0xcc, 0xfa, 0x9f, 0x70, 0x11, 0x6b, 0xf1, + 0xb0, 0xd1, 0xa0, 0xf6, 0x40, 0xea, 0x00, 0xbe, 0xc8, 0xff, 0xf2, 0xe9, + 0x7f, 0x6d, 0xd4, 0x8d, 0xc5, 0x52, 0x93, 0xce, 0x9c, 0xb4, 0x16, 0xfd, + 0x43, 0x73, 0xf9, 0xa4, 0xf8, 0x9d, 0xf0, 0x49, 0x62, 0x49, 0x59, 0xf7, + 0xab, 0x39, 0x5c, 0xaf, 0x24, 0xb1, 0x3c, 0x41, 0x4c, 0xfc, 0x60, 0xb0, + 0x00, 0xaf, 0x0f, 0xfe, 0x19, 0xd2, 0x65, 0xcd, 0x8c, 0x67, 0x37, 0xf9, + 0x98, 0x9a, 0x79, 0xd6, 0xd8, 0x85, 0x9a, 0xdd, 0x5f, 0x93, 0x7a, 0x21, + 0x48, 0x1e, 0xcd, 0x4d, 0x50, 0x53, 0xb5, 0xbb, 0xe1, 0xd9, 0x2d, 0xed, + 0x97, 0x5e, 0xe6, 0x7b, 0x5e, 0x3d, 0x0f, 0x6d, 0xb6, 0x0d, 0xdf, 0xaf, + 0x96, 0xbc, 0xf9, 0x3c, 0xc7, 0x71, 0x94, 0xfe, 0x7c, 0xda, 0xb8, 0xc9, + 0x8e, 0x7f, 0xcd, 0x25, 0xbf, 0x93, 0xb3, 0x39, 0x0b, 0x3b, 0x0d, 0x59, + 0x0f, 0x0b, 0xdb, 0x0d, 0x19, 0x6f, 0x18, 0xb1, 0x95, 0x72, 0x5d, 0x3e, + 0xab, 0x98, 0x6c, 0x55, 0x30, 0xd1, 0xa8, 0xa0, 0x64, 0xe1, 0xdc, 0xdc, + 0x1f, 0x34, 0x3e, 0x52, 0x2c, 0xfb, 0xf9, 0xb5, 0xf6, 0x59, 0x1e, 0x34, + 0x3f, 0xd3, 0xee, 0xa5, 0xdc, 0x73, 0xda, 0x5d, 0x04, 0xed, 0xcf, 0xae, + 0x27, 0x17, 0xb3, 0x39, 0xc1, 0x15, 0xf9, 0x67, 0xae, 0x2d, 0xe6, 0x6a, + 0x70, 0x67, 0x0e, 0x03, 0x43, 0xff, 0x6a, 0xb5, 0x5f, 0x36, 0xfe, 0x2c, + 0x86, 0xbc, 0x57, 0x9d, 0xc1, 0x10, 0x4c, 0x53, 0x57, 0xb9, 0x12, 0x3f, + 0xb6, 0x96, 0xd8, 0xfc, 0xed, 0x55, 0x7e, 0x2f, 0x73, 0x7a, 0xbe, 0x5a, + 0xf6, 0xd1, 0xc5, 0x07, 0x8a, 0x33, 0xf6, 0xe8, 0xa3, 0x3d, 0x8a, 0xf4, + 0xd3, 0xd6, 0x72, 0x7b, 0xac, 0x3f, 0xcb, 0xdc, 0x27, 0x79, 0x40, 0xda, + 0x5a, 0x2d, 0x75, 0xb8, 0xd4, 0xce, 0x32, 0x2e, 0x05, 0xdf, 0xd3, 0x1b, + 0xd4, 0x57, 0x50, 0x24, 0xb8, 0x12, 0x95, 0xb3, 0xc4, 0x02, 0xbd, 0xd6, + 0x3f, 0xc2, 0xf7, 0x5d, 0xbc, 0xfe, 0xb2, 0xee, 0x69, 0xdd, 0x0c, 0x39, + 0x57, 0x74, 0x71, 0xcd, 0x1a, 0xfc, 0xaf, 0x20, 0x18, 0xcd, 0x53, 0x66, + 0xac, 0x98, 0x4f, 0xee, 0xc9, 0xfc, 0xcd, 0x05, 0xc5, 0x79, 0x7e, 0xc8, + 0xf1, 0x9d, 0x6a, 0xfa, 0x8e, 0x60, 0x98, 0xe4, 0xbe, 0x85, 0xb4, 0x83, + 0x8a, 0xa1, 0x09, 0xe1, 0x0c, 0x5e, 0x9b, 0x17, 0xa9, 0x75, 0x75, 0xda, + 0x46, 0x14, 0x5f, 0x23, 0xcf, 0x11, 0x6f, 0x33, 0x70, 0xad, 0x0b, 0x6f, + 0x5d, 0xeb, 0x8a, 0x7c, 0xed, 0xdb, 0xb7, 0x35, 0xb7, 0x5c, 0x93, 0xa9, + 0xc5, 0x92, 0x7d, 0x5a, 0xbf, 0xfc, 0x5d, 0x84, 0xa5, 0xe4, 0x59, 0x07, + 0xa8, 0xed, 0x97, 0x36, 0xfe, 0x9b, 0xf5, 0x5f, 0x3d, 0x51, 0xcd, 0x8d, + 0x3a, 0x6d, 0x07, 0x2e, 0x58, 0x29, 0x9f, 0x5c, 0x97, 0x36, 0xe4, 0xf9, + 0x7d, 0xb6, 0x4f, 0x6e, 0xf2, 0x95, 0x3a, 0x8b, 0xba, 0xd9, 0x75, 0x8b, + 0x9b, 0xf1, 0x91, 0xa7, 0x9f, 0xb2, 0xea, 0xe7, 0xd5, 0xf9, 0x5d, 0x4a, + 0x3d, 0x3d, 0xc5, 0x87, 0x67, 0xe8, 0xc7, 0xcf, 0x4c, 0xc8, 0xb3, 0x5b, + 0x2a, 0x0e, 0x31, 0x5e, 0x47, 0xeb, 0x6b, 0x3b, 0xcf, 0x52, 0x47, 0x7e, + 0x48, 0x7e, 0xff, 0x53, 0x3d, 0x10, 0x3b, 0x26, 0x7b, 0x8c, 0x61, 0x0f, + 0x5e, 0x6d, 0xbc, 0x60, 0xef, 0xf9, 0xf6, 0xed, 0x57, 0x71, 0x20, 0xe9, + 0xc4, 0xfd, 0x11, 0xc6, 0xf3, 0xa5, 0x73, 0xf4, 0x08, 0x7a, 0xf6, 0x48, + 0x9c, 0x34, 0xdb, 0xf1, 0x74, 0x69, 0x8f, 0x48, 0x70, 0x5b, 0xf2, 0xe7, + 0x06, 0x39, 0x1f, 0xec, 0x4d, 0x81, 0x3c, 0x66, 0x77, 0x1b, 0xf9, 0xaf, + 0xe4, 0x5a, 0x83, 0x5a, 0xd7, 0x83, 0x60, 0xe2, 0x18, 0xf2, 0xfa, 0xa8, + 0x5b, 0x23, 0x96, 0xf5, 0x62, 0xb3, 0x6e, 0x0c, 0xa1, 0x41, 0x3d, 0x8b, + 0x76, 0x72, 0xd8, 0x36, 0xea, 0x72, 0x47, 0x43, 0xed, 0x7c, 0xb2, 0x19, + 0x8f, 0x4d, 0xd4, 0x46, 0x6f, 0x57, 0x9a, 0x31, 0xa5, 0xb6, 0xa3, 0x77, + 0x54, 0x30, 0xd2, 0x8d, 0xb7, 0x8d, 0x5a, 0xad, 0x06, 0x7f, 0x8d, 0xa6, + 0x3d, 0x6e, 0xf4, 0x1b, 0x81, 0x8e, 0x5c, 0x57, 0xf7, 0x94, 0xd4, 0xbd, + 0x97, 0x2f, 0x92, 0xe7, 0x85, 0xe4, 0x59, 0x60, 0xae, 0x75, 0xb8, 0x81, + 0x3c, 0xe1, 0x5e, 0xfa, 0xb1, 0xf4, 0x19, 0xa2, 0x66, 0x5f, 0x83, 0xee, + 0xe4, 0x5f, 0xe1, 0x0e, 0x55, 0x59, 0xec, 0x8e, 0xc8, 0x3e, 0x0b, 0x82, + 0x65, 0xe4, 0xbf, 0x2f, 0xa2, 0x13, 0x47, 0x7c, 0x51, 0xe6, 0xc1, 0x28, + 0xb9, 0x99, 0xbd, 0xbf, 0x88, 0x65, 0x7d, 0x9d, 0x28, 0x1c, 0x53, 0x71, + 0x7b, 0x5f, 0x2f, 0xf2, 0xc6, 0x64, 0x2c, 0x1c, 0x13, 0xc7, 0x1d, 0xdf, + 0x13, 0xd8, 0x54, 0xaf, 0x04, 0x42, 0xb9, 0xae, 0x80, 0xbf, 0xc8, 0x65, + 0x30, 0x8f, 0xa7, 0x91, 0x3f, 0x18, 0x42, 0xdf, 0x04, 0x54, 0xa3, 0x25, + 0x0d, 0xf5, 0x60, 0xbb, 0x5d, 0x2f, 0xbb, 0x45, 0x17, 0x7f, 0xfa, 0xcf, + 0xf6, 0x99, 0x42, 0xec, 0x73, 0x35, 0xcc, 0x89, 0x40, 0xf4, 0x31, 0xec, + 0xbf, 0x46, 0xf2, 0x4f, 0xef, 0x44, 0x11, 0x6a, 0x98, 0xa3, 0x9e, 0xb6, + 0x73, 0xaf, 0xa3, 0x2d, 0xab, 0xf4, 0x8f, 0xac, 0x7b, 0x32, 0x79, 0xfd, + 0xcb, 0x6d, 0xf7, 0x7d, 0x2b, 0xaa, 0x8a, 0xed, 0xe4, 0x77, 0x55, 0x8c, + 0xe9, 0xb5, 0x78, 0x7c, 0x36, 0x87, 0xff, 0x8b, 0xe5, 0xc4, 0x68, 0x07, + 0xfb, 0x91, 0xb9, 0x34, 0xda, 0xf3, 0x7d, 0x8c, 0xed, 0xfd, 0x3a, 0x2e, + 0xfb, 0x1d, 0x2a, 0x5e, 0x62, 0x9c, 0xa7, 0x7c, 0xab, 0x19, 0xc3, 0x39, + 0xd8, 0xd4, 0x58, 0x47, 0x1d, 0x25, 0xf8, 0x32, 0x8d, 0x9d, 0xfd, 0xbf, + 0xb7, 0x1e, 0xa4, 0x4f, 0xdd, 0x61, 0x3f, 0xcf, 0x65, 0x61, 0x7d, 0x78, + 0x0d, 0xf9, 0x68, 0x88, 0x39, 0xdb, 0x43, 0x6c, 0x52, 0x90, 0x24, 0x36, + 0x7c, 0x14, 0x5e, 0x98, 0x79, 0x66, 0x59, 0xbb, 0xc6, 0xd9, 0x5f, 0x9c, + 0xb9, 0xc6, 0xd1, 0x88, 0x62, 0xf7, 0x3f, 0xc6, 0x6e, 0xcf, 0x59, 0xd1, + 0x55, 0xab, 0xed, 0x73, 0x97, 0x2d, 0xba, 0xc1, 0x1c, 0x9d, 0x46, 0xe9, + 0xa0, 0x07, 0x93, 0xb4, 0xe3, 0xbe, 0x09, 0x68, 0x1f, 0xf1, 0x9e, 0x92, + 0x83, 0x07, 0xae, 0x71, 0x62, 0xfe, 0x2d, 0x74, 0xc7, 0x1f, 0xb4, 0x6e, + 0x29, 0x97, 0x79, 0xe6, 0xc0, 0xcf, 0x79, 0xee, 0x9b, 0xdd, 0xe3, 0xdb, + 0x60, 0xad, 0xb2, 0xf1, 0x62, 0x88, 0xf7, 0x8a, 0xed, 0x4f, 0x5f, 0x23, + 0xe7, 0x03, 0xbd, 0x49, 0x0b, 0x67, 0x8c, 0x49, 0x5b, 0xa3, 0x03, 0xf2, + 0x59, 0xd6, 0x54, 0xc6, 0x36, 0x98, 0xb1, 0xc7, 0xe9, 0xf9, 0x97, 0x8f, + 0xfb, 0xae, 0x8c, 0x5f, 0xcb, 0x59, 0x7a, 0x96, 0xff, 0x57, 0x67, 0xf6, + 0xd9, 0x04, 0xf7, 0xff, 0x41, 0xfc, 0xba, 0x5f, 0x9e, 0xb1, 0xee, 0xa1, + 0xde, 0x97, 0x9a, 0xd0, 0x8d, 0x46, 0x83, 0xf6, 0x12, 0xbe, 0x65, 0x17, + 0xce, 0x3e, 0xb6, 0xc7, 0x79, 0xce, 0xd4, 0x33, 0xb8, 0x0a, 0x67, 0xd4, + 0x10, 0xfd, 0x6a, 0x0d, 0xed, 0x2d, 0xf8, 0x22, 0x63, 0x10, 0x8c, 0x91, + 0xfd, 0x7a, 0x39, 0xcf, 0x37, 0xed, 0xfa, 0xb5, 0xbb, 0xa8, 0xed, 0xdf, + 0x08, 0x9b, 0x56, 0xa9, 0x1e, 0x8c, 0xd5, 0x10, 0x8e, 0x3b, 0x5b, 0xf2, + 0xf0, 0xab, 0xb0, 0x3c, 0xdf, 0x00, 0xef, 0xc3, 0x63, 0x01, 0xb3, 0xd5, + 0xad, 0x7a, 0x1f, 0x1a, 0xcb, 0xe0, 0xa7, 0xeb, 0x9b, 0xb4, 0x31, 0x71, + 0xc5, 0xc6, 0x93, 0x45, 0xb8, 0xd5, 0x5e, 0x57, 0x95, 0x7a, 0x52, 0xf6, + 0x81, 0x0f, 0x87, 0xcf, 0xc5, 0x05, 0x5b, 0xac, 0xc5, 0xdb, 0xc2, 0x0d, + 0xa1, 0xc7, 0x50, 0x4b, 0xec, 0x58, 0x8c, 0xd7, 0x99, 0xcd, 0x9f, 0x4a, + 0x9a, 0xdf, 0xf5, 0x40, 0xce, 0xe4, 0x0e, 0x85, 0xb7, 0xc5, 0x25, 0x4f, + 0xad, 0x40, 0xff, 0x9e, 0x40, 0xf4, 0x29, 0x72, 0xa3, 0x52, 0x45, 0xef, + 0x7c, 0x1c, 0xd1, 0x95, 0xa5, 0xf6, 0x79, 0x68, 0x17, 0x9e, 0x36, 0x4c, + 0x14, 0x46, 0xc4, 0x4e, 0x9d, 0x48, 0x10, 0xf3, 0x3a, 0x5b, 0x82, 0xa1, + 0x7b, 0x95, 0x3c, 0xec, 0x30, 0xa2, 0xf9, 0xf5, 0x2d, 0x52, 0xa7, 0x5c, + 0x64, 0xba, 0x22, 0xc1, 0x35, 0x27, 0x94, 0xc0, 0xb1, 0xa3, 0x08, 0xb6, + 0x0f, 0x21, 0x30, 0x75, 0xca, 0xcd, 0xfc, 0x70, 0xa3, 0xc7, 0xbb, 0x70, + 0x6c, 0x09, 0x9e, 0x9a, 0xf0, 0x79, 0x1b, 0xc6, 0x5a, 0xb9, 0x76, 0x21, + 0x2c, 0xa4, 0xfe, 0xf5, 0x8c, 0x19, 0xde, 0x05, 0x63, 0x2b, 0xa8, 0x23, + 0xc5, 0xae, 0x6e, 0xe6, 0xc2, 0x7a, 0x74, 0xb4, 0x9f, 0xb4, 0x86, 0x82, + 0xd4, 0xa0, 0x7a, 0x35, 0x1e, 0x62, 0x8e, 0xce, 0xb5, 0xf7, 0x46, 0xbf, + 0x2c, 0x5e, 0xdc, 0xf4, 0xc1, 0x71, 0x4b, 0xfb, 0x86, 0xd8, 0xb2, 0xe5, + 0x5a, 0x14, 0xac, 0x21, 0xb6, 0x3a, 0x76, 0xdd, 0x30, 0x6b, 0xd7, 0x08, + 0x12, 0x7b, 0x9a, 0x21, 0x5c, 0xf8, 0x68, 0x99, 0xac, 0x8b, 0xac, 0x8f, + 0x65, 0x75, 0x1a, 0xb5, 0x1d, 0x93, 0x58, 0x8d, 0xc4, 0xc4, 0xc3, 0xd7, + 0xca, 0xf3, 0xe0, 0xe6, 0x68, 0x13, 0x46, 0xca, 0x1c, 0xbd, 0xa2, 0xb9, + 0x0a, 0x89, 0xc9, 0xd9, 0x7c, 0x23, 0xd7, 0x03, 0x54, 0x77, 0x1a, 0xb6, + 0x34, 0xce, 0x58, 0xd1, 0x72, 0x53, 0x95, 0xbf, 0xb9, 0x93, 0x13, 0x99, + 0xfc, 0xdb, 0x83, 0x7a, 0x60, 0x46, 0xce, 0xb8, 0x3e, 0x24, 0xf6, 0xa5, + 0xec, 0xff, 0x75, 0x74, 0x0e, 0x26, 0x1b, 0xcf, 0x5b, 0x98, 0x2f, 0x7d, + 0x08, 0x56, 0x59, 0x56, 0x5b, 0xb8, 0xb6, 0xed, 0x10, 0xbf, 0x6f, 0xb8, + 0xde, 0xcd, 0xdc, 0x60, 0x61, 0x49, 0xf8, 0xf7, 0xd6, 0x04, 0x73, 0xeb, + 0x3b, 0x61, 0x19, 0x6b, 0x88, 0x6b, 0xe0, 0x41, 0x55, 0xb9, 0x82, 0xa7, + 0x19, 0x33, 0x1f, 0x2e, 0xfa, 0x0a, 0x52, 0x76, 0xcc, 0x38, 0x7c, 0x7d, + 0x94, 0x31, 0x78, 0xba, 0x79, 0x1a, 0x43, 0xa9, 0xac, 0x4f, 0x49, 0x8c, + 0x66, 0xc7, 0x2e, 0x67, 0x88, 0x32, 0x6e, 0x19, 0x9f, 0xcc, 0x43, 0xd6, + 0x3e, 0x47, 0xf6, 0xc4, 0xf8, 0xdf, 0xae, 0xab, 0x05, 0x2b, 0x34, 0x57, + 0x76, 0xec, 0xea, 0x15, 0x9f, 0x07, 0xaa, 0x2f, 0xff, 0xfc, 0xf1, 0x15, + 0xd7, 0xef, 0xbf, 0xea, 0xf2, 0xcf, 0x72, 0x5e, 0x27, 0x79, 0xf1, 0x91, + 0x6b, 0x9d, 0xbc, 0x98, 0x8d, 0x8d, 0xec, 0xb8, 0xb8, 0x4e, 0x10, 0x7f, + 0xaf, 0x8d, 0x8d, 0x70, 0xae, 0xdd, 0xd7, 0x1f, 0xb2, 0xe4, 0xf9, 0xc2, + 0x4e, 0xa3, 0x11, 0x03, 0x49, 0x67, 0xac, 0xfa, 0xf8, 0xdc, 0xb1, 0xbe, + 0x31, 0xe7, 0x59, 0xda, 0x10, 0x63, 0x68, 0xee, 0x73, 0x3d, 0x4e, 0xdd, + 0x5d, 0x51, 0x24, 0xa4, 0xf4, 0xf6, 0x89, 0xff, 0x17, 0x98, 0xf2, 0x1c, + 0xb1, 0x1a, 0xa4, 0xff, 0x05, 0xf5, 0x4d, 0xa5, 0xae, 0x2e, 0xe4, 0x34, + 0xe9, 0x1d, 0xdf, 0x56, 0xfa, 0x91, 0x18, 0x0b, 0x84, 0x46, 0x99, 0xef, + 0xfb, 0xc6, 0x3e, 0xa0, 0xad, 0xba, 0xf0, 0x40, 0xd8, 0x63, 0x16, 0x44, + 0x02, 0xfe, 0x05, 0xca, 0x5d, 0x78, 0x6c, 0xe8, 0xaf, 0xb1, 0xb1, 0x5f, + 0x34, 0x80, 0x8e, 0x9e, 0x09, 0x17, 0x5e, 0xa0, 0xbf, 0xf7, 0x92, 0xf7, + 0x12, 0x83, 0xfd, 0x29, 0x48, 0x1d, 0x5a, 0x33, 0xb5, 0xb4, 0xc1, 0x57, + 0x04, 0xdb, 0x86, 0x5e, 0xc3, 0xc6, 0xb8, 0x05, 0x79, 0x86, 0xd2, 0xa3, + 0xcb, 0x1e, 0xb0, 0x68, 0xec, 0xb5, 0x36, 0xae, 0xde, 0x9d, 0xb8, 0x46, + 0x9e, 0x6f, 0x65, 0xec, 0xae, 0x60, 0x0c, 0x2b, 0xf8, 0xb5, 0x9c, 0x4f, + 0x96, 0x87, 0xe4, 0x6f, 0x72, 0x60, 0x32, 0xbe, 0x15, 0xc3, 0x8c, 0x9b, + 0x2a, 0x5d, 0xef, 0xad, 0x72, 0x47, 0x1f, 0x2d, 0x23, 0x0f, 0x4f, 0x1a, + 0xc1, 0x18, 0x63, 0x54, 0x2b, 0x8e, 0x88, 0x26, 0xbd, 0x88, 0xcf, 0x0c, + 0xd9, 0x77, 0x33, 0xbc, 0xcb, 0xe8, 0xeb, 0x83, 0x43, 0xf2, 0x3b, 0xce, + 0xf5, 0x0b, 0xf7, 0x39, 0xe4, 0x0c, 0xda, 0xc8, 0xec, 0x49, 0xbe, 0x86, + 0x91, 0xb4, 0x17, 0xf7, 0x24, 0x34, 0xa5, 0x66, 0x50, 0xc5, 0x6d, 0x89, + 0x00, 0x35, 0x30, 0xf5, 0xdc, 0xa2, 0x52, 0xc8, 0x73, 0x16, 0xcf, 0x35, + 0x85, 0x38, 0xc6, 0x3f, 0x81, 0x39, 0x6f, 0x39, 0xdb, 0x44, 0x51, 0x6e, + 0x4b, 0x40, 0x1d, 0x71, 0xd5, 0xfa, 0x3f, 0xc3, 0x36, 0xb8, 0xc7, 0x98, + 0xd3, 0x38, 0xfe, 0x3b, 0x12, 0x72, 0xb6, 0xd5, 0x00, 0x94, 0xb5, 0xe3, + 0xf1, 0x51, 0x53, 0xce, 0x84, 0xcc, 0xca, 0x08, 0x34, 0x5f, 0xe4, 0x9b, + 0x35, 0x28, 0xb8, 0x48, 0x2e, 0x3e, 0x2d, 0xfa, 0x74, 0x53, 0x09, 0xf9, + 0x5c, 0x3a, 0xbc, 0x20, 0x73, 0x76, 0xb1, 0x02, 0xdb, 0xf6, 0xc8, 0xbe, + 0x3c, 0x31, 0x5c, 0x9e, 0x59, 0x28, 0xd3, 0x43, 0xeb, 0x5d, 0x72, 0x5e, + 0xb4, 0x15, 0xb5, 0x7d, 0x5b, 0x11, 0xea, 0x5b, 0x41, 0x5d, 0xa9, 0xab, + 0x1d, 0x88, 0xbe, 0x22, 0xfb, 0x81, 0x35, 0xe1, 0x20, 0xc7, 0x15, 0xec, + 0xf5, 0xb9, 0x0d, 0xef, 0x91, 0x71, 0xaa, 0x71, 0x35, 0xeb, 0xb7, 0xfa, + 0x9a, 0x3c, 0x97, 0xd4, 0xf5, 0x9d, 0xb5, 0xa2, 0x76, 0xbb, 0xea, 0xb5, + 0x28, 0x69, 0xc7, 0xc0, 0x93, 0xe7, 0xe9, 0x17, 0xd2, 0xc7, 0xbf, 0x5b, + 0x39, 0xf4, 0xd5, 0xa5, 0xab, 0x35, 0xdc, 0x9a, 0x90, 0xfd, 0xd4, 0xfe, + 0xf9, 0x4e, 0x9d, 0x88, 0x7c, 0xf6, 0xa0, 0xc3, 0x20, 0xe0, 0xce, 0xfb, + 0xdc, 0xf2, 0xd9, 0xba, 0x95, 0x02, 0x80, 0x3e, 0xb3, 0x23, 0xf9, 0x27, + 0x35, 0x12, 0xdf, 0x3b, 0x26, 0x16, 0x5d, 0xe5, 0xf8, 0xde, 0x9d, 0xfc, + 0x2c, 0x6d, 0xe9, 0xfb, 0xb6, 0xe2, 0xd0, 0x7c, 0xe1, 0x39, 0x77, 0x8f, + 0xcf, 0xbd, 0x3f, 0xbb, 0x57, 0xe3, 0xcb, 0x70, 0xad, 0xac, 0xbf, 0xc9, + 0x99, 0x60, 0x54, 0x59, 0x15, 0x6f, 0x53, 0x96, 0xc5, 0xe5, 0x5c, 0xd0, + 0x15, 0x2f, 0xb4, 0x6b, 0x38, 0x2d, 0x7c, 0x27, 0x3c, 0xa9, 0x6c, 0xb7, + 0xeb, 0x43, 0x4d, 0xa5, 0xbf, 0x19, 0x28, 0x1f, 0x5f, 0xa2, 0x3c, 0x16, + 0xff, 0xc4, 0x5a, 0x6f, 0x9f, 0xbf, 0x57, 0xa0, 0xa7, 0xd1, 0x83, 0xbc, + 0x71, 0x2f, 0xca, 0x46, 0x0a, 0x91, 0x7b, 0x40, 0x47, 0xc5, 0xf8, 0xd7, + 0x11, 0xb3, 0x6b, 0xe8, 0xcc, 0x36, 0x8f, 0x5d, 0xf7, 0xdd, 0xda, 0x7d, + 0x67, 0x30, 0x40, 0x9e, 0x0f, 0x78, 0xfa, 0xbc, 0x30, 0x61, 0xff, 0x47, + 0x2d, 0x75, 0x88, 0x5a, 0xca, 0x5a, 0xfc, 0x9d, 0xb0, 0xf9, 0x78, 0x05, + 0x02, 0xc7, 0xca, 0x5d, 0x26, 0xe7, 0x1f, 0xd0, 0xc2, 0x04, 0x92, 0xe5, + 0x75, 0x26, 0x6e, 0xaf, 0x93, 0xbf, 0xd3, 0xa2, 0xfb, 0xcf, 0x88, 0xff, + 0x84, 0xbb, 0xf0, 0xae, 0xd1, 0x45, 0xee, 0x5d, 0x60, 0xfa, 0xed, 0xbf, + 0x23, 0x52, 0x24, 0x7a, 0x50, 0xdd, 0x0e, 0xdd, 0xd8, 0xae, 0x04, 0xcc, + 0x15, 0x8a, 0x8e, 0xb3, 0xe4, 0x07, 0x33, 0xf4, 0xff, 0xd3, 0x13, 0x81, + 0x7d, 0x37, 0x28, 0x21, 0x6a, 0xeb, 0x56, 0x62, 0x3f, 0xb1, 0x99, 0x71, + 0xb4, 0x67, 0xe2, 0x6f, 0x84, 0x27, 0x98, 0xb1, 0x4c, 0x7d, 0xfe, 0x83, + 0x72, 0xe6, 0x99, 0x23, 0xe7, 0x64, 0xa6, 0xb2, 0xa1, 0x59, 0xce, 0x88, + 0x8a, 0x71, 0x9a, 0x59, 0xea, 0xfb, 0xe9, 0x5c, 0x1c, 0x1e, 0xc6, 0x3c, + 0x37, 0xdc, 0x17, 0x5d, 0xa8, 0xef, 0xaf, 0xc1, 0x0b, 0xf5, 0xe5, 0xf8, + 0x4b, 0x98, 0x6a, 0x27, 0x75, 0x60, 0x77, 0xac, 0xca, 0x7e, 0x2e, 0x39, + 0x07, 0xa9, 0x14, 0xb5, 0x85, 0x5e, 0x88, 0xe7, 0x53, 0xa8, 0x66, 0x54, + 0x50, 0x07, 0xa0, 0x9e, 0x38, 0xdf, 0xbf, 0x8e, 0x3c, 0xf1, 0xfb, 0x69, + 0x1f, 0x52, 0x69, 0x9d, 0xaf, 0x10, 0x5f, 0x8d, 0x7c, 0xb5, 0xe2, 0x3b, + 0x7d, 0xe2, 0x6b, 0x7e, 0xfc, 0x20, 0x5d, 0x8c, 0x77, 0xfa, 0xf5, 0x5e, + 0x0f, 0xfd, 0x20, 0xd8, 0x24, 0x75, 0xbc, 0x9a, 0xad, 0x35, 0x3e, 0x60, + 0x9c, 0xf6, 0x86, 0x8b, 0x71, 0x3e, 0xf5, 0x45, 0x9a, 0x11, 0x6a, 0x71, + 0x44, 0xe2, 0x25, 0x94, 0x89, 0x83, 0x49, 0x65, 0xc5, 0x18, 0x94, 0x7b, + 0xeb, 0xc4, 0x5e, 0xd4, 0xb8, 0xf6, 0xdf, 0x56, 0xd1, 0x3b, 0xcf, 0xb8, + 0x0b, 0xcc, 0xaa, 0x48, 0x40, 0xab, 0x72, 0xeb, 0x38, 0x2e, 0x35, 0x18, + 0xf4, 0xe3, 0x71, 0x39, 0xff, 0x08, 0xbf, 0x67, 0x99, 0x65, 0x52, 0xb3, + 0xc1, 0x1c, 0xa5, 0x97, 0x53, 0x2b, 0xc9, 0xdf, 0x05, 0x38, 0x14, 0x8e, + 0xf7, 0x59, 0x8b, 0x9f, 0x0d, 0x07, 0xda, 0x76, 0x2b, 0xe6, 0xca, 0x42, + 0xc8, 0xfa, 0xe8, 0x5a, 0x0e, 0xed, 0x36, 0x9d, 0xee, 0xa2, 0x1e, 0x2b, + 0x62, 0x9b, 0x01, 0x4d, 0x9e, 0xcf, 0xef, 0xb1, 0xeb, 0x31, 0x2c, 0x2c, + 0x35, 0x4e, 0x50, 0x23, 0xb6, 0xb2, 0x9d, 0x62, 0xec, 0x23, 0x06, 0x97, + 0x2e, 0xfa, 0xa5, 0x75, 0xb2, 0x52, 0xc6, 0xfb, 0x37, 0xfe, 0x6c, 0xcd, + 0xa1, 0xd8, 0xf6, 0xbb, 0xb4, 0xad, 0xe6, 0xfc, 0x9d, 0x24, 0xdb, 0x57, + 0xb6, 0xc4, 0x3d, 0x7c, 0x17, 0xff, 0x90, 0x3a, 0x4f, 0xe6, 0x10, 0xdb, + 0x47, 0xce, 0xd4, 0x64, 0xea, 0x39, 0x63, 0xe5, 0x11, 0x6f, 0xe3, 0xd2, + 0x84, 0xfb, 0x13, 0x37, 0x39, 0xda, 0xba, 0x66, 0x7d, 0xe6, 0x00, 0xbc, + 0x8d, 0xf7, 0x8e, 0x7b, 0x1b, 0xd7, 0x24, 0x0e, 0x2b, 0x55, 0x91, 0xe0, + 0xbe, 0x2a, 0xb7, 0xb7, 0xf1, 0xee, 0x4b, 0xf7, 0x2b, 0x2b, 0xea, 0xba, + 0x30, 0x11, 0x2e, 0x90, 0xbf, 0xb5, 0x62, 0x95, 0xe8, 0x81, 0xd0, 0x27, + 0x8a, 0xec, 0x27, 0x09, 0x47, 0xd0, 0xf1, 0xd0, 0xd8, 0x84, 0x15, 0x9b, + 0x27, 0x78, 0x26, 0xb5, 0xdc, 0x1f, 0xe0, 0x48, 0xea, 0xd2, 0xef, 0xda, + 0xf8, 0xbb, 0x02, 0xfe, 0x8e, 0x5c, 0x82, 0x39, 0x3d, 0x60, 0x2c, 0xe3, + 0x7c, 0xf3, 0x15, 0x39, 0x5b, 0xd3, 0xf1, 0x4e, 0xfa, 0x9d, 0x1a, 0xe1, + 0x3f, 0x3b, 0x26, 0xca, 0x71, 0xe7, 0x5e, 0x6b, 0xb1, 0xb7, 0xc9, 0x5a, + 0xbc, 0x3c, 0xbc, 0xcd, 0xea, 0xad, 0x94, 0x35, 0x9f, 0xc6, 0xf1, 0x7e, + 0xe9, 0x4b, 0x6f, 0x23, 0x5f, 0xc6, 0xf5, 0xe1, 0xff, 0x6e, 0xa5, 0xec, + 0x7c, 0x42, 0xbf, 0x67, 0x1f, 0x47, 0x53, 0xe2, 0x47, 0xdb, 0x62, 0x7e, + 0xea, 0xd9, 0x5c, 0xfa, 0xc7, 0x24, 0xfd, 0x63, 0x24, 0x75, 0xbc, 0x46, + 0x9e, 0xad, 0xa8, 0xd1, 0xc5, 0x0e, 0xff, 0x1f, 0xc5, 0x6d, 0x1d, 0x80, + 0x64, 0x81, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_RXP_b09FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_RXP_b09FwRodata[(0x124/4) + 1] = { + 0x0800330c, 0x0800330c, 0x080033e8, 0x080033bc, 0x080033a0, 0x080032f0, + 0x080032f0, 0x080032f0, 0x08003314, 0x80080100, 0x80080080, 0x80080000, + 0x5f865437, 0xe4ac62cc, 0x50103a45, 0x36621985, 0xbf14c0e8, 0x1bc27a1e, + 0x84f4b556, 0x094ea6fe, 0x7dda01e7, 0xc04d7481, 0x08007ae0, 0x08007b0c, + 0x08007aec, 0x08007a28, 0x08007aec, 0x08007b2c, 0x08007aec, 0x08007a28, + 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, + 0x08007a28, 0x08007a28, 0x08007a28, 0x08007b1c, 0x08007afc, 0x08007a28, + 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, + 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007a28, 0x08007afc, + 0x080080e8, 0x08007f90, 0x080080b0, 0x08007f90, 0x08008080, 0x08007e78, + 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, + 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, 0x08007f90, + 0x08007fb8, 0x00000000 }; + +static struct fw_info bnx2_rxp_fw_09 = { + /* Firmware version: 5.0.0j13 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x080031d8, + + .text_addr = 0x08000000, + .text_len = 0x8160, + .text_index = 0x0, + .gz_text = bnx2_RXP_b09FwText, + .gz_text_len = sizeof(bnx2_RXP_b09FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_RXP_b09FwData, + + .sbss_addr = 0x080082a0, + .sbss_len = 0x64, + .sbss_index = 0x0, + + .bss_addr = 0x08008308, + .bss_len = 0x60, + .bss_index = 0x0, + + .rodata_addr = 0x08008160, + .rodata_len = 0x124, + .rodata_index = 0x0, + .rodata = bnx2_RXP_b09FwRodata, +}; + +static u8 bnx2_xi_rv2p_proc1[] = { + /* Date: 03/16/2010 11:30 */ +#define XI_RV2P_PROC1_MAX_BD_PAGE_LOC 9 +#define XI_RV2P_PROC1_BD_PAGE_SIZE_MSK 0xffff +#define XI_RV2P_PROC1_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xa5, 0x56, 0xdd, 0x6b, 0x1c, 0x55, 0x14, 0x3f, 0x3b, 0x93, 0x99, 0xd9, + 0xcc, 0x7e, 0x62, 0xb7, 0xe9, 0x12, 0x8b, 0xd9, 0x96, 0x40, 0x49, 0x3a, + 0xa1, 0xd9, 0x9a, 0x07, 0x91, 0x40, 0x4b, 0x5e, 0x0a, 0x26, 0xf8, 0x10, + 0xa9, 0x8a, 0x14, 0x9a, 0x8e, 0x1f, 0x08, 0xf6, 0x45, 0x9f, 0x14, 0xfc, + 0x18, 0xa2, 0xf1, 0x21, 0x14, 0x24, 0x60, 0x03, 0x55, 0xc1, 0x20, 0xf8, + 0x41, 0xec, 0xc3, 0xce, 0x8b, 0x68, 0x2d, 0x0a, 0xd6, 0x17, 0xb1, 0xf8, + 0x50, 0xfa, 0xa0, 0x22, 0xa6, 0x51, 0x5a, 0x5f, 0x44, 0xf0, 0x0f, 0xe8, + 0x8e, 0xf7, 0x7c, 0xdc, 0x9d, 0x99, 0xdb, 0xcd, 0x26, 0x60, 0x20, 0x1c, + 0xee, 0x9d, 0x73, 0xce, 0x3d, 0x1f, 0xbf, 0xf3, 0x3b, 0x5b, 0x07, 0x00, + 0x17, 0xa2, 0x78, 0x4c, 0x49, 0xb0, 0x6d, 0xa7, 0xa8, 0x44, 0x92, 0x80, + 0xd3, 0xc4, 0x33, 0x58, 0x40, 0x67, 0xc8, 0x9f, 0x0b, 0x00, 0x97, 0x81, + 0xff, 0x9c, 0x32, 0x9d, 0xa3, 0x63, 0x72, 0x3e, 0xca, 0x22, 0x3a, 0x5a, + 0x27, 0xed, 0x5b, 0x6b, 0x5a, 0x1f, 0xcf, 0x2f, 0xc0, 0x89, 0x16, 0x4a, + 0x1b, 0x4e, 0x1c, 0x42, 0xf9, 0x30, 0x7c, 0xdb, 0x42, 0xbf, 0x77, 0x13, + 0x88, 0xf0, 0xbc, 0xbf, 0xf3, 0x65, 0x5c, 0x22, 0xbb, 0x2d, 0xf1, 0xf7, + 0xb3, 0xcd, 0xf2, 0xa1, 0xa0, 0xc8, 0x7e, 0x45, 0xc2, 0x54, 0x9d, 0xc4, + 0x4d, 0xf2, 0x7f, 0xfa, 0x34, 0xb8, 0xe8, 0xe7, 0x55, 0xa5, 0x80, 0xe7, + 0x83, 0x85, 0x68, 0x4a, 0xde, 0xb5, 0x58, 0xef, 0xf7, 0xb5, 0x1a, 0xde, + 0xc3, 0xad, 0x39, 0x3c, 0x8f, 0xf8, 0x6f, 0xad, 0xa1, 0xfe, 0x9b, 0x4a, + 0xbf, 0x4c, 0xef, 0x45, 0x13, 0x22, 0xc7, 0xd8, 0xfd, 0xd6, 0x24, 0xda, + 0x2b, 0x9b, 0x49, 0x9d, 0x27, 0xea, 0xdf, 0x49, 0xd8, 0x3f, 0xfa, 0xcd, + 0xfa, 0x6b, 0x2a, 0x7f, 0x45, 0xae, 0x63, 0xc0, 0x32, 0x1f, 0x9f, 0xab, + 0xe2, 0x41, 0xfb, 0x97, 0xd4, 0x7b, 0x28, 0xff, 0x4d, 0xfd, 0xc4, 0x28, + 0xcb, 0x05, 0xb6, 0x53, 0xff, 0x12, 0x37, 0xeb, 0x9f, 0x57, 0xfa, 0xba, + 0x1e, 0xf9, 0xf8, 0xbc, 0x40, 0xe7, 0x25, 0xf9, 0x53, 0x7c, 0x37, 0x92, + 0xbc, 0x3e, 0xec, 0xa2, 0x7f, 0x3d, 0xe9, 0xe5, 0x3f, 0x96, 0xbd, 0xff, + 0x21, 0x19, 0x5c, 0x17, 0x47, 0xd5, 0x25, 0xab, 0x7f, 0x4d, 0xf2, 0x79, + 0x04, 0xc6, 0x2d, 0xc6, 0xc9, 0x10, 0x34, 0xa9, 0x3e, 0x9c, 0xef, 0x03, + 0x22, 0x9f, 0x15, 0x79, 0x55, 0xe4, 0xd7, 0x22, 0xe1, 0x7f, 0x4a, 0xaf, + 0xd0, 0xff, 0x7e, 0xbf, 0xc8, 0xfb, 0x8d, 0xfb, 0x1b, 0x22, 0x8f, 0x19, + 0xf6, 0xc7, 0x45, 0xde, 0x95, 0xfb, 0xc7, 0xe5, 0xfc, 0xa8, 0x61, 0xff, + 0x8e, 0xe0, 0xa6, 0xd0, 0xab, 0x0b, 0xd7, 0xe1, 0x23, 0xc1, 0x31, 0xf6, + 0x5d, 0xbe, 0x4f, 0x68, 0xbd, 0x22, 0xd5, 0x31, 0x8f, 0xa7, 0x0f, 0x06, + 0xe8, 0xb3, 0xda, 0xdc, 0x44, 0x3f, 0xbb, 0x8b, 0x09, 0xc7, 0xf1, 0xae, + 0xd8, 0xfb, 0x9d, 0xab, 0x3b, 0xcc, 0xcd, 0x6c, 0xd0, 0x6f, 0x4e, 0x0e, + 0x48, 0x1e, 0x3f, 0x02, 0xdb, 0x5f, 0x29, 0x84, 0x01, 0x9e, 0x5d, 0x99, + 0x9f, 0x8a, 0xe0, 0x71, 0xd8, 0xc0, 0xb1, 0x27, 0x38, 0x1e, 0x97, 0xfc, + 0x41, 0xe2, 0x45, 0x9c, 0x69, 0x7c, 0xf1, 0xbb, 0x8c, 0x13, 0xd7, 0xc0, + 0xc9, 0xeb, 0xbb, 0xd4, 0xa7, 0x64, 0xe4, 0xf9, 0x72, 0xa2, 0xeb, 0x6e, + 0xc9, 0xf5, 0xb2, 0x8b, 0xf6, 0x45, 0x58, 0x8d, 0x51, 0x7a, 0x8d, 0x0b, + 0x94, 0x77, 0x92, 0xf8, 0x0e, 0xf3, 0xca, 0x6a, 0x4c, 0x6a, 0x4d, 0xff, + 0x6d, 0x7e, 0xe7, 0x82, 0xe6, 0x9f, 0x49, 0xfd, 0x2e, 0xfb, 0xab, 0x88, + 0x3f, 0xcb, 0xd1, 0x71, 0xf3, 0xbd, 0x9f, 0x7b, 0x07, 0xef, 0x51, 0x3a, + 0xb0, 0xfd, 0x0d, 0x7e, 0x3f, 0xab, 0xe2, 0x29, 0xe0, 0x75, 0xe3, 0x9c, + 0xc3, 0xfc, 0xb6, 0x2a, 0xfe, 0xb7, 0x3b, 0x79, 0xbf, 0xa6, 0xfd, 0x1f, + 0x64, 0xff, 0x44, 0xcf, 0x3e, 0x34, 0xec, 0xc3, 0x58, 0xdb, 0xe3, 0xfd, + 0xbe, 0xce, 0x86, 0xd1, 0xcf, 0xd6, 0x9e, 0xf8, 0xef, 0xb7, 0x24, 0xe5, + 0x3f, 0xfe, 0x3e, 0x06, 0x9a, 0xb7, 0x6a, 0x54, 0xb7, 0xa5, 0x53, 0x35, + 0x7a, 0xaf, 0xea, 0xb2, 0x9b, 0x27, 0x6b, 0x2c, 0x9f, 0x91, 0xc4, 0x6f, + 0xfb, 0xc3, 0x54, 0xcf, 0xe7, 0x4a, 0x7c, 0x3e, 0x57, 0x41, 0xfb, 0x7d, + 0x90, 0xda, 0xeb, 0xb8, 0x06, 0xc5, 0x83, 0xef, 0xeb, 0x77, 0x74, 0x1c, + 0xfa, 0x3d, 0xf4, 0x77, 0x53, 0xc5, 0xb3, 0xdb, 0xbb, 0x2c, 0x43, 0x2b, + 0x5f, 0x87, 0xa1, 0x36, 0xcb, 0xf7, 0xa6, 0x51, 0xbf, 0x06, 0x4b, 0x54, + 0xc7, 0x92, 0xee, 0xfb, 0xc2, 0xd3, 0xb4, 0xbf, 0xee, 0x03, 0xc1, 0x43, + 0x23, 0xfc, 0x4a, 0x1e, 0xb6, 0x35, 0xbe, 0x09, 0xbf, 0x82, 0xc3, 0xa1, + 0x86, 0xfb, 0x05, 0xd7, 0xdf, 0xb5, 0x35, 0x4e, 0xf0, 0xfb, 0x84, 0x8e, + 0xaf, 0xb9, 0x5e, 0xe6, 0xb8, 0x2e, 0x95, 0x87, 0xf0, 0x3c, 0x73, 0xe9, + 0x3a, 0xf5, 0xed, 0xf8, 0x7a, 0x2c, 0xf9, 0xd7, 0xf2, 0x38, 0x5e, 0x94, + 0x79, 0x58, 0xa4, 0xb9, 0xad, 0x2a, 0x55, 0x94, 0xa3, 0x10, 0xd1, 0x1e, + 0xb2, 0xfc, 0xef, 0xc9, 0xce, 0x96, 0x7b, 0xf5, 0xde, 0xe1, 0xfc, 0xbc, + 0x6f, 0x31, 0xfe, 0x8b, 0xf9, 0xb9, 0x39, 0x90, 0xe1, 0xf5, 0x6c, 0x9d, + 0x0b, 0xbd, 0x79, 0x69, 0xe5, 0xe6, 0x3c, 0xdb, 0x17, 0xdd, 0x0f, 0xcd, + 0x4f, 0xe6, 0x9e, 0x62, 0xb5, 0x68, 0x5a, 0xea, 0xd4, 0x96, 0xef, 0x53, + 0xe6, 0x7c, 0xf6, 0x9b, 0xef, 0xba, 0x31, 0xaf, 0x96, 0xd4, 0x75, 0xb8, + 0xb3, 0xb1, 0xb6, 0x17, 0x1e, 0x79, 0x5f, 0xe6, 0xbb, 0x0e, 0xbd, 0x7d, + 0x78, 0xb9, 0x49, 0xfd, 0x94, 0xfa, 0x77, 0x22, 0x3b, 0xd7, 0xff, 0x93, + 0xd0, 0x97, 0xcf, 0x5e, 0x13, 0x3f, 0x6d, 0xe9, 0xaf, 0x9b, 0xd9, 0x9b, + 0xa4, 0x5e, 0x05, 0x8a, 0xc3, 0x33, 0xf8, 0xe8, 0xef, 0xae, 0xc6, 0xe1, + 0xb2, 0xdb, 0x2f, 0x5f, 0x0f, 0xfe, 0x92, 0xfe, 0xf3, 0xbc, 0x3a, 0x8d, + 0xf3, 0x57, 0x72, 0x7d, 0x02, 0x38, 0xa4, 0xf7, 0x61, 0x36, 0xae, 0xec, + 0x3e, 0x47, 0x7f, 0x4d, 0x08, 0xdb, 0xd9, 0xbd, 0xfe, 0x62, 0x8f, 0xd7, + 0x78, 0xde, 0xab, 0xf7, 0xcc, 0xbb, 0xe6, 0xef, 0xb4, 0xaf, 0x7a, 0x9f, + 0x31, 0x6f, 0x30, 0x5f, 0x97, 0xcd, 0x3c, 0xd5, 0x9e, 0x37, 0xfb, 0x95, + 0xfd, 0x3d, 0xf7, 0x53, 0x77, 0x6f, 0xfc, 0xfe, 0x7c, 0xd2, 0xdb, 0x6f, + 0x03, 0xfb, 0xef, 0x1b, 0xfd, 0xff, 0x2e, 0x53, 0xcf, 0x7e, 0xbf, 0x6b, + 0x66, 0x94, 0x7f, 0xd1, 0x07, 0xf6, 0x77, 0xb6, 0x85, 0xf7, 0x27, 0x45, + 0x6f, 0x56, 0xf4, 0xc6, 0xef, 0xd1, 0xe3, 0x3c, 0x22, 0x03, 0xd7, 0x8e, + 0xf0, 0x9c, 0xe6, 0xd7, 0xcf, 0xbb, 0x3b, 0xf3, 0x6b, 0x9e, 0xe7, 0x2b, + 0x90, 0xcd, 0x7b, 0x73, 0x93, 0x71, 0x34, 0xd3, 0x27, 0x6f, 0xa9, 0xd3, + 0xa4, 0xe8, 0x51, 0x9e, 0x1f, 0x77, 0xd3, 0x3d, 0x96, 0xc5, 0x61, 0x20, + 0xf8, 0xb7, 0x66, 0x37, 0x88, 0xf7, 0xbd, 0xf0, 0x8e, 0xd1, 0xd7, 0x76, + 0x80, 0x78, 0x7a, 0x03, 0x62, 0xc9, 0xe3, 0x97, 0x5c, 0x3e, 0x15, 0xc9, + 0xc7, 0x85, 0xcf, 0x62, 0x5d, 0x1f, 0x8d, 0x03, 0x96, 0x9f, 0x06, 0x32, + 0x77, 0xa4, 0x5f, 0x94, 0x7e, 0x1d, 0x91, 0x77, 0xeb, 0xf0, 0x49, 0xac, + 0xf9, 0x16, 0xf9, 0xd7, 0x83, 0x69, 0xe1, 0xf7, 0x25, 0xe1, 0xd9, 0x6d, + 0x9f, 0x79, 0x3c, 0x9c, 0x27, 0x5c, 0xc3, 0x88, 0xf0, 0x6d, 0x58, 0xe1, + 0xf3, 0x68, 0x85, 0xf7, 0xe8, 0xb4, 0x57, 0x26, 0xbd, 0xd1, 0x0a, 0xcb, + 0x91, 0x12, 0xda, 0x35, 0xe1, 0xcf, 0x05, 0x52, 0x0f, 0x52, 0x3e, 0x34, + 0x79, 0x50, 0xf2, 0x7c, 0x10, 0xef, 0x47, 0x14, 0xbf, 0xf1, 0x99, 0xf1, + 0x52, 0xee, 0xcd, 0xc9, 0x87, 0xd2, 0xdd, 0x56, 0x2d, 0x5b, 0x67, 0x3d, + 0x97, 0xaf, 0x18, 0xf5, 0xd5, 0xfd, 0x81, 0xde, 0x1e, 0x3b, 0x7c, 0x8a, + 0xf9, 0xbf, 0xea, 0x31, 0xbe, 0x58, 0x2a, 0x3f, 0x96, 0x87, 0x7a, 0x07, + 0x57, 0x84, 0x5f, 0x57, 0x96, 0xc9, 0xcd, 0xc2, 0x8a, 0xbe, 0x9f, 0xa3, + 0xc1, 0x5a, 0xdc, 0xbc, 0x46, 0xf7, 0xd5, 0xd8, 0xe6, 0x7b, 0x6f, 0x5e, + 0xd7, 0xab, 0x46, 0xf9, 0xaf, 0x73, 0xbd, 0xce, 0x5c, 0x64, 0xf9, 0x94, + 0xfa, 0x69, 0x8b, 0x7f, 0x7e, 0xba, 0x0f, 0x64, 0xae, 0x2a, 0xd9, 0x7d, + 0xe0, 0xa8, 0xf0, 0xf8, 0xf7, 0x49, 0xda, 0x3f, 0x73, 0x8f, 0x0f, 0xea, + 0xe3, 0x3f, 0xdd, 0x14, 0x7f, 0xba, 0x8f, 0xe6, 0x7e, 0x20, 0x9c, 0x18, + 0x78, 0x7c, 0x6c, 0x07, 0x3c, 0xfe, 0xda, 0xed, 0x8f, 0x67, 0x93, 0x07, + 0xe7, 0xd5, 0xdc, 0xfe, 0x07, 0x31, 0x16, 0xd9, 0xbd, 0x08, 0x0e, 0x00, + 0x00, 0x00 }; + +static u8 bnx2_xi90_rv2p_proc1[] = { + /* Date: 03/16/2010 11:30 */ +#define XI90_RV2P_PROC1_MAX_BD_PAGE_LOC 9 +#define XI90_RV2P_PROC1_BD_PAGE_SIZE_MSK 0xffff +#define XI90_RV2P_PROC1_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xa5, 0x56, 0x5d, 0x68, 0x1c, 0x55, 0x14, 0x3e, 0x33, 0xb3, 0x33, 0xb3, + 0x99, 0x9d, 0xfd, 0xd1, 0x6e, 0x97, 0x25, 0x16, 0xb3, 0x2d, 0xbe, 0x64, + 0xb3, 0xa1, 0x1b, 0x2d, 0x58, 0x24, 0xd0, 0x1a, 0x0a, 0x05, 0x9b, 0xa7, + 0x40, 0x45, 0x44, 0x30, 0x59, 0x7f, 0x1e, 0x6c, 0x5f, 0x85, 0x3e, 0xd9, + 0x31, 0x18, 0x1f, 0x42, 0x45, 0x02, 0x76, 0x21, 0xa1, 0xb4, 0xc1, 0x87, + 0x2a, 0xa1, 0x0f, 0xbb, 0x08, 0xa2, 0x45, 0xec, 0x43, 0x45, 0x50, 0xe3, + 0x8b, 0x14, 0xd4, 0xa2, 0x4d, 0xa3, 0x58, 0x9f, 0xfd, 0x79, 0xd4, 0x1d, + 0xef, 0xb9, 0xe7, 0xdc, 0xd9, 0x3b, 0xb7, 0x93, 0x34, 0xe0, 0xc2, 0xf2, + 0x71, 0xef, 0x9c, 0x73, 0xee, 0x3d, 0x7f, 0xdf, 0xb9, 0x15, 0x00, 0xf0, + 0x20, 0xea, 0x8f, 0x09, 0x04, 0xc7, 0x71, 0xf2, 0x02, 0xe2, 0x18, 0xdc, + 0x3a, 0xae, 0xc1, 0x06, 0xb9, 0x86, 0xf4, 0xda, 0x02, 0xb8, 0x06, 0xf4, + 0x73, 0x43, 0xb9, 0x8e, 0x0e, 0xf3, 0x7a, 0x82, 0x20, 0x9a, 0xa8, 0x48, + 0xe9, 0xbb, 0x2b, 0x4a, 0x1e, 0xd7, 0x67, 0xe0, 0x58, 0x03, 0xd1, 0x81, + 0x63, 0x07, 0x11, 0x9f, 0x82, 0x1b, 0x0d, 0xb4, 0xfb, 0x6f, 0x0c, 0x11, + 0xae, 0xf7, 0xf7, 0x3e, 0xe9, 0x17, 0xa4, 0xde, 0x16, 0xdb, 0xfb, 0xc1, + 0x21, 0x3c, 0xda, 0xca, 0x93, 0x5d, 0x46, 0x98, 0xac, 0x48, 0xb8, 0x25, + 0xed, 0x9f, 0x3e, 0x0d, 0x1e, 0xda, 0x79, 0x57, 0x08, 0xe0, 0xfa, 0x80, + 0x15, 0x4d, 0xf2, 0xb9, 0x36, 0xc9, 0xdd, 0x59, 0x29, 0xe3, 0x3e, 0xdc, + 0x9d, 0xc1, 0x75, 0x2d, 0x78, 0x6b, 0x05, 0xe5, 0xbb, 0x42, 0x3e, 0x94, + 0xe7, 0x45, 0xe3, 0x8c, 0x63, 0x64, 0x7e, 0xab, 0x89, 0xfa, 0x42, 0xa7, + 0xa9, 0xfc, 0x44, 0xf9, 0x7b, 0x31, 0xd9, 0x47, 0xbb, 0xba, 0xbd, 0xba, + 0xb0, 0x97, 0xa7, 0x38, 0xb6, 0x08, 0xd3, 0xf7, 0xf3, 0xc4, 0x7d, 0x50, + 0x7f, 0x49, 0x9c, 0x87, 0xf8, 0xc7, 0xd0, 0x4e, 0x1f, 0x31, 0xb4, 0x48, + 0x4f, 0xfc, 0xf9, 0xde, 0x24, 0x7f, 0x5e, 0xc8, 0xab, 0x78, 0xa4, 0xef, + 0xe7, 0xb7, 0x94, 0x5f, 0xec, 0xbf, 0xbc, 0xdf, 0x77, 0x71, 0x5a, 0x1e, + 0x1e, 0x20, 0xbf, 0x19, 0x27, 0xfe, 0x8f, 0xe9, 0xfb, 0x5f, 0xc5, 0xbb, + 0xc7, 0xc5, 0x15, 0x71, 0xd1, 0xe5, 0x6f, 0xb2, 0x3f, 0xcf, 0xc0, 0x63, + 0x36, 0xd5, 0x49, 0x0e, 0xea, 0x32, 0x3e, 0xe4, 0xef, 0xa3, 0x8c, 0xe7, + 0x18, 0xbf, 0x61, 0xfc, 0x9a, 0x11, 0xfe, 0x27, 0xd6, 0xac, 0xec, 0xfd, + 0xfd, 0x8c, 0x8f, 0x18, 0xfb, 0xdb, 0x8c, 0x87, 0x0d, 0xfd, 0xa7, 0x19, + 0x43, 0xc6, 0x57, 0x18, 0x17, 0x0c, 0xfd, 0xcb, 0x5c, 0x37, 0x56, 0x12, + 0x17, 0x8a, 0xc3, 0xfb, 0x5c, 0xc7, 0x98, 0x77, 0xfe, 0x3e, 0xae, 0xe4, + 0xf2, 0x32, 0x8e, 0xe9, 0x7a, 0xba, 0xb4, 0x8b, 0x3c, 0x89, 0xcd, 0x8c, + 0x67, 0xe9, 0x5d, 0x8c, 0xe9, 0x1e, 0xef, 0xb1, 0x7e, 0xd0, 0xfb, 0x6c, + 0x87, 0xbe, 0x99, 0x6e, 0x65, 0xf5, 0x49, 0x93, 0xfd, 0xb8, 0x0d, 0xa4, + 0x7f, 0xdd, 0xea, 0xb4, 0x70, 0xed, 0x71, 0xff, 0x14, 0xb9, 0x1e, 0x47, + 0x8c, 0x3a, 0xf6, 0xb9, 0x8e, 0x9f, 0x64, 0xff, 0x81, 0xef, 0x8b, 0x75, + 0xa6, 0xea, 0x8b, 0xce, 0xa5, 0x3a, 0xf1, 0x8c, 0x3a, 0x79, 0xe3, 0x01, + 0xf1, 0x29, 0x18, 0x7e, 0x9e, 0x13, 0xf2, 0xb4, 0xb4, 0x6d, 0xc2, 0x35, + 0xc2, 0x56, 0xe8, 0xe5, 0x10, 0x8f, 0x84, 0x5f, 0x92, 0xbd, 0x31, 0x40, + 0x0c, 0xeb, 0x5d, 0xd9, 0x4f, 0x39, 0xe8, 0x7a, 0xe2, 0xee, 0xf0, 0x4f, + 0xfc, 0x0e, 0xc9, 0x8d, 0xba, 0xdf, 0x4a, 0xac, 0xaf, 0x6d, 0x92, 0xfc, + 0xf7, 0x0d, 0xba, 0xf7, 0xb3, 0xcc, 0x57, 0xc3, 0x9f, 0xfa, 0xce, 0x7d, + 0x58, 0xc6, 0xf5, 0xdf, 0x56, 0xd4, 0x57, 0xe7, 0xb0, 0xde, 0x19, 0x55, + 0xe7, 0xf4, 0x5b, 0xf4, 0xf0, 0x7b, 0x1e, 0x96, 0xa5, 0x9c, 0x5f, 0xbd, + 0x20, 0xf3, 0x11, 0xc7, 0x81, 0x4b, 0x7c, 0xb7, 0xdc, 0x97, 0x62, 0xf5, + 0xe0, 0x6d, 0xb2, 0x73, 0x41, 0xf1, 0x62, 0x53, 0xc5, 0x83, 0xec, 0x15, + 0xd9, 0x9e, 0xed, 0xaa, 0x78, 0xd2, 0x7e, 0x90, 0x3a, 0x07, 0xf7, 0x11, + 0x5d, 0xd8, 0xfe, 0x1c, 0xbf, 0xcf, 0x8a, 0x38, 0x59, 0xb8, 0x5d, 0x5d, + 0x70, 0x89, 0x77, 0x97, 0xd9, 0xfe, 0x76, 0x2f, 0x6d, 0xd7, 0xd4, 0xff, + 0x45, 0xea, 0x9f, 0x48, 0xf4, 0x3b, 0x86, 0x7e, 0xa7, 0xaf, 0xf4, 0x71, + 0x7f, 0x5f, 0x6f, 0xdd, 0xa8, 0xb3, 0xc6, 0x9e, 0x78, 0xf9, 0xa7, 0x78, + 0xc8, 0xcb, 0x2a, 0x8e, 0x8a, 0x4f, 0xcb, 0x32, 0x6e, 0xf3, 0x27, 0xcb, + 0xf2, 0xbc, 0x92, 0x47, 0x66, 0x9e, 0x2b, 0x13, 0xbe, 0xcc, 0x8e, 0xff, + 0x16, 0x8c, 0xc8, 0x78, 0xbe, 0x5a, 0xa0, 0xf5, 0x42, 0x11, 0xf5, 0xf7, + 0xc1, 0x50, 0x5f, 0xdd, 0x6b, 0xb7, 0xfb, 0xe0, 0xf9, 0xea, 0x1c, 0x75, + 0x0f, 0x75, 0x1e, 0xda, 0xbb, 0x95, 0xd4, 0xdb, 0xce, 0xe7, 0x12, 0x76, + 0xec, 0x74, 0x1c, 0x72, 0x53, 0x84, 0x6b, 0x6d, 0x94, 0x2f, 0xc3, 0xbc, + 0x8c, 0x63, 0x41, 0xe5, 0x7d, 0xf6, 0x25, 0x17, 0xcf, 0x7f, 0x18, 0xb8, + 0x1e, 0xaa, 0x9d, 0x4f, 0xf9, 0x60, 0x47, 0xf5, 0x1d, 0xe2, 0x43, 0xdc, + 0x1f, 0xb9, 0xaa, 0xf7, 0x31, 0xc5, 0xdf, 0x73, 0x54, 0x9d, 0x48, 0x9e, + 0xe2, 0xbe, 0xbf, 0x1c, 0x27, 0xfc, 0xc3, 0xfd, 0x33, 0xc7, 0x7d, 0x38, + 0x27, 0xf9, 0xa2, 0x24, 0xae, 0x86, 0x38, 0x0a, 0x91, 0x9c, 0x7f, 0x76, + 0xf0, 0x85, 0xec, 0x0b, 0x87, 0xf7, 0x85, 0xbd, 0x43, 0x69, 0x9e, 0xd9, + 0xa2, 0xbe, 0xcb, 0xa7, 0xfb, 0x35, 0xaf, 0xcd, 0x13, 0x3d, 0x8e, 0x56, + 0xd2, 0xa7, 0x8d, 0x14, 0xbf, 0xe8, 0x71, 0x57, 0xf1, 0x46, 0x3b, 0x57, + 0x39, 0xff, 0xfa, 0x7c, 0x24, 0xb1, 0xa8, 0xcd, 0x71, 0x98, 0xe2, 0xef, + 0x93, 0x26, 0x2f, 0x64, 0xf1, 0x4a, 0xc5, 0xe0, 0x89, 0xbf, 0x06, 0x14, + 0xb7, 0x91, 0xde, 0xfa, 0xca, 0x5e, 0xf8, 0xeb, 0x0a, 0xc7, 0xb1, 0x02, + 0xc9, 0x1c, 0xbe, 0x56, 0x97, 0xf9, 0xe2, 0xfc, 0xf7, 0x22, 0x27, 0x95, + 0xdf, 0xe3, 0x90, 0xc9, 0xa3, 0x6f, 0xb2, 0x9d, 0x29, 0xce, 0x9f, 0xa7, + 0xcd, 0x6b, 0x29, 0x5e, 0x02, 0x79, 0x0f, 0xdf, 0xe0, 0xc1, 0x9f, 0x07, + 0xaa, 0xce, 0x16, 0xbd, 0x2c, 0x7f, 0x7d, 0xf8, 0x3d, 0xa4, 0xba, 0xa3, + 0x7e, 0x74, 0xab, 0x67, 0xaf, 0xa7, 0xf2, 0x04, 0x70, 0x50, 0xcd, 0x61, + 0xfd, 0x5e, 0xfa, 0x3b, 0x02, 0xed, 0xd5, 0xa1, 0x33, 0xa5, 0xbf, 0x27, + 0x5e, 0x8f, 0xd5, 0x1c, 0xa3, 0x7e, 0x2e, 0xdd, 0xd7, 0xcf, 0x6a, 0x6e, + 0x0c, 0xf3, 0xaa, 0xe6, 0x28, 0xf1, 0x02, 0xcd, 0x89, 0xd0, 0xf4, 0x53, + 0xbc, 0x2f, 0xcc, 0x7c, 0xe9, 0xef, 0xc8, 0x1b, 0x83, 0xbd, 0xcd, 0x95, + 0xb3, 0xf7, 0xd5, 0x75, 0x76, 0xfe, 0x03, 0x23, 0xff, 0x1f, 0x69, 0xf1, + 0xcc, 0x7a, 0x4f, 0x1d, 0x11, 0xf6, 0x59, 0x9e, 0xf9, 0xfd, 0x45, 0xc9, + 0xef, 0xc7, 0x59, 0x6e, 0x5a, 0xab, 0xd7, 0xb4, 0x1c, 0xf9, 0x11, 0x19, + 0x75, 0xed, 0x32, 0x8f, 0x29, 0xfe, 0xbc, 0x34, 0xd8, 0x99, 0x3f, 0xd3, + 0x3c, 0x5e, 0x04, 0xdd, 0xef, 0x8d, 0x0d, 0xaa, 0xa3, 0xa3, 0x19, 0x7e, + 0x73, 0x9c, 0x9a, 0x2c, 0x27, 0xfd, 0xec, 0x0e, 0x86, 0xf3, 0x53, 0xaf, + 0xc3, 0x36, 0xf3, 0x86, 0x3d, 0xbd, 0x2e, 0x79, 0xdd, 0xef, 0xdc, 0x33, + 0xf2, 0x3a, 0xd5, 0xc2, 0x7a, 0x3a, 0x0f, 0x7d, 0xf6, 0xe3, 0xc7, 0x94, + 0x3f, 0x45, 0xf6, 0xc7, 0x83, 0x0f, 0xfb, 0x2a, 0x3e, 0xaa, 0x0e, 0x08, + 0x3f, 0x68, 0x71, 0xdf, 0x49, 0xf9, 0x3c, 0xe7, 0x6b, 0x82, 0xcf, 0xad, + 0xc0, 0xd5, 0x64, 0x3e, 0x22, 0xbf, 0xfa, 0xd0, 0x66, 0xfe, 0x9e, 0x67, + 0x1e, 0xdd, 0x0e, 0x88, 0xa7, 0x3b, 0xa7, 0x64, 0x5d, 0x43, 0x8d, 0xf9, + 0xb4, 0x53, 0xa4, 0xf5, 0x68, 0x91, 0xe6, 0x64, 0xdb, 0x0f, 0xa5, 0xdc, + 0x68, 0x91, 0xb0, 0x56, 0x40, 0xbd, 0x3a, 0xfc, 0x3a, 0x2b, 0xc5, 0x5b, + 0xab, 0x21, 0xcd, 0xfd, 0xd5, 0x4d, 0xe6, 0x9b, 0xb2, 0x8a, 0x1b, 0xfb, + 0xf9, 0x04, 0xee, 0xd7, 0x04, 0xbf, 0xd1, 0x9a, 0xea, 0x25, 0x4c, 0xfa, + 0xe4, 0x0a, 0x67, 0xb7, 0x51, 0xd6, 0xe3, 0xac, 0xfa, 0xf2, 0x35, 0x23, + 0xbe, 0x2a, 0x3f, 0xb9, 0x64, 0x4e, 0x1d, 0x3a, 0x49, 0xfc, 0x5e, 0xf2, + 0xa9, 0xbe, 0x08, 0x85, 0x1d, 0xdb, 0x47, 0xb5, 0x03, 0x4b, 0xcc, 0xaf, + 0x4b, 0x8b, 0xd2, 0xcc, 0xec, 0x92, 0xda, 0x9f, 0x91, 0x8d, 0x35, 0xb7, + 0x71, 0x53, 0xee, 0x97, 0xfa, 0x0e, 0xed, 0xfb, 0xa7, 0x54, 0xbc, 0xca, + 0xd2, 0xff, 0x2e, 0xc5, 0xeb, 0x85, 0x8b, 0x84, 0xcf, 0x8b, 0x27, 0x35, + 0xfe, 0x82, 0x2e, 0xf3, 0xc1, 0x6a, 0xc8, 0x7d, 0x25, 0xe3, 0x65, 0x3f, + 0x4e, 0xef, 0x1d, 0x97, 0xdf, 0x29, 0x79, 0x2d, 0x7f, 0xe6, 0x9c, 0xde, + 0x2d, 0x8f, 0x7f, 0x0e, 0x86, 0xf5, 0xa7, 0xbf, 0x73, 0x2c, 0xe3, 0xdd, + 0x5f, 0x34, 0xea, 0xf1, 0xc4, 0x0e, 0xf5, 0x78, 0x67, 0x90, 0x5d, 0xcf, + 0x26, 0x0f, 0x4e, 0x8b, 0xbe, 0xfd, 0x0f, 0x50, 0x4f, 0xb8, 0x8c, 0x80, + 0x0e, 0x00, 0x00, 0x00 }; + +static u8 bnx2_xi_rv2p_proc2[] = { + /* Date: 03/16/2010 11:30 */ +#define XI_RV2P_PROC2_MAX_BD_PAGE_LOC 5 +#define XI_RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff +#define XI_RV2P_PROC2_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xad, 0x57, 0x4d, 0x68, 0x5c, 0x55, 0x14, 0x3e, 0xf3, 0x3f, 0x99, 0x79, + 0x93, 0xc9, 0x1f, 0x93, 0x31, 0xa9, 0x26, 0x4d, 0x6c, 0xda, 0x94, 0x19, + 0xcd, 0x1f, 0x15, 0x41, 0x30, 0xce, 0x22, 0xfd, 0x13, 0x9a, 0xa6, 0x82, + 0xee, 0x9a, 0xa4, 0x66, 0x30, 0x5a, 0xb2, 0x30, 0xb8, 0x71, 0xe3, 0xa3, + 0xad, 0x09, 0x48, 0xb0, 0xb6, 0x98, 0x26, 0x88, 0xa0, 0xe8, 0xce, 0xdd, + 0x80, 0x5a, 0xeb, 0xa2, 0xa2, 0x60, 0x10, 0x05, 0x8b, 0xa0, 0xa0, 0x9b, + 0xe2, 0x5f, 0x0d, 0x29, 0x08, 0x8a, 0x5a, 0x0b, 0xd6, 0x8e, 0xf7, 0x9c, + 0xef, 0xdc, 0x37, 0xef, 0x4d, 0x22, 0x71, 0x61, 0x16, 0xf9, 0x72, 0xde, + 0x3d, 0xf7, 0xbb, 0xe7, 0xe7, 0xbb, 0xe7, 0xbd, 0x34, 0x11, 0x51, 0x94, + 0xdc, 0x4a, 0x97, 0x41, 0x8a, 0x44, 0x62, 0x49, 0x03, 0x55, 0xa2, 0x58, + 0x9e, 0x6d, 0x0a, 0x93, 0xfe, 0xec, 0x6d, 0x12, 0xf8, 0xb2, 0x02, 0xbc, + 0x7a, 0x0e, 0x78, 0xac, 0x1b, 0xd8, 0x05, 0xaf, 0xb7, 0xdc, 0x7b, 0x1d, + 0x03, 0x21, 0x72, 0xfb, 0x99, 0xa7, 0x91, 0x1e, 0x51, 0x82, 0xd1, 0x42, + 0x83, 0xf9, 0xfd, 0x20, 0x4d, 0xf4, 0x83, 0x37, 0x4a, 0x8c, 0x66, 0xaf, + 0xcb, 0xd8, 0xac, 0x78, 0xbf, 0xe2, 0xdf, 0x8a, 0xb7, 0x14, 0xff, 0xaa, + 0x43, 0x52, 0x6c, 0x0d, 0x01, 0xff, 0x54, 0x3b, 0xad, 0xd8, 0xae, 0xcf, + 0x67, 0x14, 0x4f, 0xe8, 0xf3, 0xcf, 0x15, 0xaf, 0x1a, 0xb4, 0x79, 0xb1, + 0x7d, 0xad, 0x5a, 0xb3, 0x1d, 0xd0, 0x4b, 0x9c, 0xdf, 0x57, 0x83, 0x7e, + 0xdf, 0x56, 0xed, 0xf9, 0xb6, 0x2e, 0xe1, 0x18, 0xe7, 0xbf, 0x73, 0xe4, + 0x82, 0xd6, 0xe3, 0x78, 0x37, 0x9e, 0xdf, 0x55, 0xe0, 0xfc, 0xe3, 0xe4, + 0x2a, 0x52, 0x91, 0x31, 0x1c, 0x72, 0x8b, 0xb6, 0xa0, 0xb6, 0x8e, 0xb0, + 0xa6, 0x32, 0xe0, 0x4d, 0x05, 0x78, 0x73, 0x9b, 0x78, 0xbf, 0x6e, 0xf0, + 0xf3, 0x37, 0x86, 0xc0, 0x9f, 0xda, 0x96, 0x7f, 0x3a, 0x03, 0x6c, 0x2d, + 0x6c, 0x75, 0x4e, 0xc3, 0x36, 0xf1, 0x3f, 0xb9, 0x2d, 0xff, 0xb3, 0x75, + 0xf1, 0xd3, 0x5e, 0x9b, 0x97, 0x9e, 0x1f, 0x61, 0xff, 0x0f, 0xa9, 0xd4, + 0x2b, 0xe6, 0xd2, 0x09, 0x2d, 0xe0, 0x58, 0x1f, 0xf3, 0xb6, 0x50, 0x34, + 0xcc, 0xeb, 0xbb, 0x93, 0xf1, 0x4b, 0x78, 0xfe, 0x58, 0x16, 0xf8, 0xb8, + 0x12, 0x5e, 0x4b, 0x71, 0xe2, 0xd5, 0x6a, 0x39, 0xad, 0xfc, 0x68, 0x13, + 0xb9, 0x69, 0xec, 0x5f, 0x73, 0xa4, 0xbf, 0xa6, 0x3f, 0x6c, 0x47, 0xc8, + 0xcd, 0x06, 0xe3, 0x7c, 0x8d, 0xe0, 0xd7, 0xbc, 0x1b, 0x4f, 0x5f, 0x2a, + 0xc3, 0xee, 0x7c, 0xb3, 0x49, 0xfc, 0x57, 0x2b, 0x56, 0xc7, 0xfc, 0xdc, + 0xdc, 0x87, 0x2c, 0x78, 0xa8, 0x27, 0x29, 0x87, 0xa1, 0x0e, 0xe6, 0xd0, + 0xa2, 0xe5, 0xc3, 0xcf, 0x85, 0x5d, 0x56, 0x2f, 0xb0, 0xcb, 0x71, 0x81, + 0xfc, 0xd4, 0x02, 0xc7, 0x9b, 0xa5, 0xc9, 0x30, 0x07, 0x12, 0xd6, 0xfc, + 0x62, 0x49, 0xe7, 0x5d, 0xf8, 0x7f, 0xd0, 0x85, 0x73, 0xcb, 0x7b, 0x98, + 0x37, 0x44, 0x67, 0x13, 0x8e, 0xc4, 0x5a, 0x1e, 0x06, 0x4f, 0xdb, 0x10, + 0x70, 0x79, 0x28, 0xc6, 0x50, 0x28, 0xcf, 0x8b, 0x79, 0xcf, 0x0f, 0x83, + 0x49, 0xf1, 0x73, 0x8b, 0x9c, 0xef, 0x8b, 0x35, 0x7d, 0xf6, 0xa2, 0x3e, + 0x3f, 0xed, 0xe2, 0x75, 0x53, 0xa4, 0x1e, 0x9c, 0x33, 0x31, 0x6b, 0xe3, + 0xe3, 0xf3, 0x9e, 0x31, 0xe7, 0xf1, 0xbe, 0x45, 0x9f, 0xae, 0xd9, 0x7f, + 0x54, 0xf3, 0xeb, 0xd6, 0x3e, 0xef, 0xd8, 0xa2, 0xcf, 0x59, 0xf9, 0xfb, + 0x7a, 0xa9, 0x49, 0xea, 0x73, 0x04, 0xcf, 0xcf, 0x8f, 0x5d, 0x44, 0x1d, + 0x0f, 0x4a, 0x7e, 0x94, 0x3a, 0xf3, 0x0e, 0x76, 0x4d, 0x65, 0xd8, 0x7e, + 0x74, 0xa4, 0xfc, 0x3e, 0xd6, 0x63, 0xa7, 0x9b, 0xa4, 0x0e, 0x47, 0x94, + 0xf5, 0x60, 0x24, 0xc4, 0xb0, 0x14, 0x3f, 0x2d, 0xa6, 0xb3, 0x26, 0xeb, + 0xcd, 0xb4, 0x58, 0xc1, 0xfa, 0x5c, 0x5a, 0xea, 0x45, 0x1b, 0x97, 0x39, + 0xde, 0x39, 0x13, 0xaf, 0xf8, 0xb7, 0xcd, 0xc6, 0xc0, 0xf3, 0xc2, 0x39, + 0xd4, 0x6d, 0xe3, 0x6d, 0xb6, 0x0f, 0x15, 0x36, 0xb0, 0xaf, 0x30, 0xbb, + 0xa0, 0x07, 0x84, 0x51, 0x8f, 0xeb, 0x61, 0xf8, 0xab, 0x5c, 0x52, 0x51, + 0xe9, 0x47, 0x88, 0x9c, 0x31, 0xe0, 0xf3, 0xb2, 0x7e, 0x2b, 0xb4, 0x24, + 0xfa, 0x7f, 0xa8, 0x31, 0x7a, 0x11, 0x8e, 0xa3, 0x59, 0x9b, 0x07, 0xf0, + 0xbf, 0xea, 0x70, 0xc1, 0xb1, 0xfa, 0xd3, 0xfa, 0xf7, 0xff, 0x9b, 0xfe, + 0x80, 0x63, 0x7d, 0xc0, 0x78, 0x2f, 0xf2, 0xdd, 0xac, 0xc3, 0x60, 0x1f, + 0x74, 0xce, 0xfa, 0xf4, 0x21, 0x60, 0x74, 0x11, 0xd0, 0x89, 0xd1, 0xa5, + 0xcc, 0x0f, 0x53, 0x4f, 0xdb, 0x7f, 0x26, 0x4a, 0xd0, 0x53, 0xca, 0x37, + 0xab, 0x79, 0x9d, 0xd4, 0xbc, 0x7e, 0x4e, 0xd9, 0xba, 0xdb, 0x7c, 0x80, + 0x8b, 0x5e, 0x3e, 0x76, 0xde, 0x63, 0xbe, 0x4f, 0xcc, 0x06, 0xe2, 0x59, + 0xfa, 0xb8, 0x07, 0x7f, 0x74, 0xe2, 0x7e, 0xd7, 0xf2, 0xec, 0x13, 0x9d, + 0x37, 0xb6, 0xbf, 0xe7, 0x9f, 0xab, 0x37, 0x4c, 0x3f, 0xd1, 0x97, 0xd5, + 0x8a, 0xff, 0xbe, 0x75, 0x6c, 0x71, 0xdf, 0xac, 0xde, 0x83, 0xf9, 0xcf, + 0x65, 0x22, 0x0c, 0x23, 0x57, 0xd6, 0xfd, 0xfa, 0xb6, 0xef, 0xa5, 0x84, + 0xa7, 0xa3, 0xb6, 0x7d, 0x5a, 0x27, 0xc5, 0xdc, 0x7d, 0xcc, 0x37, 0xae, + 0xfc, 0x03, 0xca, 0xef, 0xe8, 0x7d, 0xba, 0xdb, 0xbb, 0x17, 0xb6, 0x2f, + 0xb5, 0x7b, 0x65, 0xeb, 0x23, 0xe7, 0x16, 0xae, 0xac, 0xf3, 0xbe, 0xce, + 0x2d, 0xee, 0x19, 0xf3, 0x74, 0xfa, 0xee, 0x17, 0xfa, 0x2a, 0xe3, 0x86, + 0xea, 0xe7, 0xc3, 0x2f, 0x66, 0x3e, 0x48, 0x1d, 0xcc, 0x5c, 0xe0, 0x7d, + 0x6d, 0xde, 0xbe, 0x53, 0x71, 0xe4, 0x73, 0xb6, 0xa2, 0xf3, 0x61, 0x51, + 0xe7, 0xc3, 0x3c, 0xdb, 0x79, 0x8d, 0x3f, 0x6f, 0xe7, 0xb2, 0x89, 0x5f, + 0xe7, 0xca, 0x71, 0x5b, 0x07, 0xcc, 0x63, 0x6d, 0xb3, 0xc6, 0xf1, 0x47, + 0x08, 0xf3, 0x26, 0xa2, 0xfb, 0x4d, 0x2e, 0x45, 0x89, 0xa3, 0x3a, 0x39, + 0x80, 0x73, 0x2c, 0x4f, 0xad, 0x9e, 0xe8, 0x0b, 0xfc, 0x4d, 0x7f, 0x8a, + 0x31, 0xe4, 0x31, 0x6f, 0xcf, 0x05, 0xbd, 0x3b, 0xe8, 0xf7, 0xaf, 0xef, + 0x5f, 0x54, 0xeb, 0x7b, 0xf3, 0x76, 0xed, 0xfd, 0x29, 0x3a, 0xb8, 0x1d, + 0xac, 0x93, 0xd7, 0x5f, 0x97, 0x44, 0x0f, 0x09, 0xa3, 0x8b, 0x3c, 0xce, + 0x55, 0xbf, 0xd4, 0x1e, 0x60, 0x58, 0xbe, 0x53, 0x4c, 0xec, 0xaa, 0x3b, + 0xea, 0xc7, 0x7c, 0x7a, 0x62, 0x46, 0xfa, 0xf3, 0xf2, 0xc9, 0x1b, 0x32, + 0xa7, 0x5e, 0x7f, 0xfa, 0x12, 0xe7, 0x73, 0x07, 0xad, 0xcf, 0x3b, 0x12, + 0x47, 0x69, 0x27, 0xdc, 0x6f, 0x3e, 0x10, 0xcc, 0xf3, 0x58, 0x37, 0xf3, + 0x25, 0xb5, 0x9f, 0xc6, 0x6f, 0xaa, 0xfe, 0x3d, 0x09, 0xff, 0xd2, 0x14, + 0xe6, 0x76, 0x29, 0xc4, 0xf6, 0x9d, 0xb4, 0x3e, 0xec, 0x48, 0x36, 0xf5, + 0xfe, 0xb5, 0x7c, 0x70, 0xef, 0xf6, 0x67, 0xc1, 0x6f, 0xe7, 0x82, 0xeb, + 0xcd, 0x05, 0xde, 0xf7, 0x95, 0x57, 0x87, 0xa3, 0xc3, 0xfe, 0xfd, 0xbd, + 0xb4, 0x56, 0xc1, 0xfe, 0x71, 0xbd, 0xb7, 0x93, 0x7a, 0xc0, 0x77, 0xa9, + 0xac, 0xf0, 0x4d, 0x1f, 0x16, 0x7d, 0x52, 0x2e, 0x8d, 0xfc, 0xa7, 0x1f, + 0xc6, 0xfa, 0x74, 0x06, 0xcf, 0x3b, 0x32, 0x88, 0x77, 0x5c, 0xde, 0x2f, + 0x49, 0x63, 0x03, 0x73, 0x7a, 0xbf, 0xd7, 0xbc, 0xf9, 0x05, 0x5c, 0x8d, + 0xfb, 0xef, 0x7b, 0x94, 0x3e, 0x8a, 0x23, 0x3f, 0xea, 0xc7, 0x7d, 0x2d, + 0xf5, 0x39, 0xb2, 0x3e, 0xd1, 0x0f, 0xbd, 0x50, 0x4f, 0xf0, 0x7d, 0xa8, + 0xf7, 0xbf, 0xa3, 0x36, 0xe7, 0xfc, 0x73, 0xb0, 0x61, 0x68, 0xc5, 0x9b, + 0x47, 0xf6, 0x3c, 0xff, 0x5c, 0x61, 0x5e, 0x31, 0xcd, 0x3c, 0xf1, 0xcf, + 0xc1, 0x88, 0xea, 0xe0, 0x37, 0x9d, 0x1b, 0xad, 0xf4, 0x49, 0x05, 0x79, + 0xad, 0x55, 0xea, 0xfb, 0x68, 0xcf, 0xb3, 0x7c, 0x88, 0xdb, 0xe6, 0x51, + 0xe3, 0xc7, 0xf9, 0x33, 0x1a, 0xe7, 0x8f, 0xf2, 0x1d, 0x92, 0xd3, 0x7c, + 0x98, 0x17, 0xcf, 0x0f, 0xe8, 0x5c, 0x76, 0x3d, 0x3b, 0x38, 0x4f, 0xc7, + 0x25, 0xae, 0x16, 0xc2, 0x77, 0x47, 0xce, 0x9b, 0x07, 0x36, 0xbf, 0xb6, + 0x01, 0xe0, 0xf2, 0x80, 0xed, 0x83, 0xed, 0x97, 0xed, 0x0f, 0xfa, 0x98, + 0x1b, 0x14, 0xb7, 0x91, 0xe9, 0x41, 0xd1, 0xef, 0xc0, 0xf4, 0xaf, 0xc1, + 0xef, 0xb1, 0xa3, 0xf2, 0xfd, 0xfc, 0x1c, 0x7d, 0x51, 0xc0, 0x20, 0xf9, + 0x46, 0xb1, 0x36, 0xbf, 0xb4, 0x01, 0xde, 0xfb, 0x5a, 0xfb, 0x17, 0xb3, + 0xf7, 0x48, 0x97, 0x87, 0xfd, 0xba, 0x5b, 0xf0, 0xdd, 0x3f, 0x9b, 0x0f, + 0xaf, 0x17, 0x55, 0x77, 0x49, 0x2a, 0xed, 0xc7, 0x77, 0x4c, 0x63, 0x02, + 0xfa, 0x6d, 0x4c, 0xf8, 0xfb, 0x62, 0xfa, 0xdf, 0x90, 0x60, 0x73, 0x47, + 0x4b, 0x83, 0xc4, 0x7d, 0xfe, 0xd3, 0xcf, 0x64, 0xf9, 0x8d, 0x95, 0x34, + 0x9e, 0xb7, 0x97, 0x40, 0x1f, 0x15, 0x7d, 0x46, 0xe8, 0x0c, 0xf4, 0xfb, + 0xea, 0x32, 0xf0, 0x15, 0x3a, 0x04, 0x9e, 0x96, 0x53, 0xf2, 0x7e, 0x4f, + 0xb6, 0xa3, 0x7c, 0x4b, 0x2b, 0xaa, 0xcb, 0x7c, 0x58, 0xfe, 0x1f, 0xa9, + 0x52, 0x46, 0xbf, 0x47, 0xf5, 0xfe, 0x40, 0x8f, 0x51, 0x5f, 0x5f, 0xb7, + 0xd3, 0x27, 0xa3, 0x63, 0xf4, 0x87, 0xed, 0xaa, 0xd3, 0x64, 0xbd, 0x4e, + 0x6d, 0xdf, 0xf2, 0xe1, 0x2d, 0x75, 0xb9, 0x2f, 0xa8, 0xcb, 0xb8, 0xea, + 0xf2, 0x77, 0x6f, 0x6e, 0x6f, 0xe6, 0x65, 0xff, 0xb4, 0xd1, 0xeb, 0xff, + 0xa5, 0x53, 0xe0, 0x81, 0x5e, 0x3e, 0xbf, 0xdd, 0xa7, 0x37, 0x1b, 0x17, + 0xc7, 0x73, 0xd8, 0xf4, 0xf5, 0x1f, 0xb4, 0x79, 0xe4, 0x7a, 0xd8, 0x0d, + 0x00, 0x00, 0x00 }; + +static u8 bnx2_xi90_rv2p_proc2[] = { + /* Date: 03/16/2010 11:30 */ +#define XI90_RV2P_PROC2_MAX_BD_PAGE_LOC 5 +#define XI90_RV2P_PROC2_BD_PAGE_SIZE_MSK 0xffff +#define XI90_RV2P_PROC2_BD_PAGE_SIZE ((BCM_PAGE_SIZE / 16) - 1) + 0xad, 0x57, 0x4b, 0x68, 0x9c, 0x55, 0x14, 0xbe, 0xf3, 0xfe, 0x67, 0xe6, + 0x9f, 0x4c, 0x32, 0x09, 0x93, 0x69, 0x52, 0x9b, 0x34, 0xa1, 0x69, 0xa6, + 0xce, 0xd4, 0xc9, 0x83, 0xba, 0x11, 0x1a, 0x06, 0x4c, 0x1f, 0x0a, 0x4d, + 0xd3, 0x2a, 0x6e, 0xa4, 0xc9, 0x68, 0x07, 0xd3, 0x96, 0x2c, 0x0c, 0x6e, + 0x74, 0xe1, 0x4f, 0x5a, 0x13, 0x91, 0x81, 0x98, 0x62, 0x1e, 0x16, 0x17, + 0x62, 0xc1, 0x85, 0xbb, 0x01, 0xb5, 0xad, 0x0b, 0x85, 0x82, 0x41, 0xaa, + 0x58, 0x04, 0xc1, 0x17, 0x54, 0x8a, 0xd5, 0x98, 0x8a, 0xd4, 0x0a, 0x4a, + 0x05, 0xc9, 0x78, 0xef, 0xf9, 0xce, 0x9d, 0xc7, 0x3f, 0x7f, 0x4c, 0x04, + 0xb3, 0xc8, 0x97, 0x73, 0xef, 0xb9, 0xe7, 0x9e, 0xc7, 0x77, 0xce, 0xfd, + 0xd3, 0x28, 0x84, 0xf0, 0x0a, 0xab, 0xd8, 0x21, 0x51, 0x78, 0x3c, 0x1e, + 0x43, 0x42, 0x49, 0x08, 0x5f, 0x42, 0xc9, 0xc2, 0x2d, 0xf8, 0x67, 0x4f, + 0x23, 0xc1, 0x97, 0x45, 0xe0, 0x8d, 0x79, 0xe0, 0xb1, 0x4e, 0x60, 0x87, + 0x30, 0xe5, 0x6f, 0x97, 0xf8, 0xea, 0x34, 0x89, 0xef, 0x58, 0x0f, 0x40, + 0xb6, 0x92, 0xca, 0x5e, 0x54, 0x1c, 0x67, 0x43, 0x43, 0xa9, 0xa0, 0xfc, + 0xbd, 0x5f, 0x8c, 0x26, 0x61, 0xdf, 0x2b, 0x14, 0x4a, 0x1b, 0x96, 0xc2, + 0x26, 0xc6, 0xc3, 0x8c, 0xbd, 0x2e, 0xe0, 0x6e, 0xc6, 0x1e, 0x1b, 0x0a, + 0xd6, 0xdb, 0xcf, 0x72, 0x17, 0x63, 0x98, 0xd7, 0x1f, 0x66, 0xf9, 0x02, + 0xe3, 0x0b, 0xbc, 0xfe, 0x17, 0x63, 0x50, 0xae, 0xeb, 0xf8, 0x94, 0x7c, + 0xab, 0x54, 0x91, 0x4d, 0x98, 0x27, 0x3f, 0x6f, 0x96, 0x6a, 0xf5, 0xbe, + 0x2f, 0xcb, 0xd3, 0x1e, 0x25, 0x7f, 0x2b, 0x65, 0x97, 0x12, 0x5b, 0xe2, + 0x38, 0xd6, 0x92, 0x28, 0xa8, 0xbc, 0x78, 0xc4, 0xf2, 0xbc, 0x41, 0x59, + 0x5c, 0x34, 0x21, 0x5b, 0x45, 0x83, 0xf2, 0xb2, 0x68, 0xb2, 0x3d, 0xc6, + 0x6d, 0x11, 0xe4, 0xf1, 0xf1, 0x4e, 0xce, 0xe3, 0xfd, 0xd0, 0xb3, 0xa2, + 0xba, 0x00, 0xf6, 0x3c, 0x2b, 0xf9, 0xae, 0xab, 0xd9, 0x85, 0x3c, 0x04, + 0x58, 0xcb, 0xed, 0x53, 0xeb, 0x3b, 0x07, 0x17, 0xb9, 0x3e, 0x27, 0x3a, + 0xb1, 0xbe, 0x23, 0xa5, 0xec, 0xf9, 0x85, 0xc5, 0x28, 0xd2, 0xe4, 0x97, + 0xcb, 0x4a, 0xd7, 0xda, 0xbf, 0x31, 0x0f, 0x69, 0x3c, 0x02, 0xbb, 0xa1, + 0x1a, 0xbb, 0xf1, 0x3a, 0xbb, 0x5f, 0x07, 0xab, 0xed, 0x37, 0xb8, 0x60, + 0x3f, 0xb4, 0xa9, 0xfd, 0x5c, 0x04, 0xd8, 0x9c, 0x72, 0xba, 0x27, 0xb8, + 0x89, 0xff, 0xa7, 0x36, 0xb5, 0xff, 0xbc, 0xcd, 0x7f, 0xb1, 0x47, 0xc7, + 0xc5, 0xf7, 0x7b, 0x94, 0xfe, 0x77, 0x22, 0xdb, 0x4d, 0x62, 0xe1, 0x29, + 0xe6, 0xe7, 0x70, 0x8f, 0xb2, 0x1b, 0x13, 0x5e, 0xb7, 0xda, 0xdf, 0x6b, + 0xf8, 0xaf, 0x60, 0xfd, 0x09, 0xae, 0xc3, 0xd3, 0x6c, 0xf0, 0xc7, 0x90, + 0x0a, 0xbc, 0x54, 0xca, 0x87, 0xd9, 0x3e, 0xd7, 0xd1, 0x0a, 0xe3, 0xfc, + 0x8a, 0xa9, 0xee, 0xff, 0x5c, 0xf2, 0xc2, 0xa9, 0xae, 0x9e, 0x7f, 0xa9, + 0x2b, 0xce, 0x37, 0xed, 0xc6, 0xee, 0xab, 0x79, 0xc8, 0xed, 0x17, 0x1b, + 0x29, 0xfe, 0xe5, 0xa2, 0x13, 0x0f, 0xec, 0xf6, 0x65, 0x3f, 0x47, 0x71, + 0x8f, 0xe8, 0x32, 0xc8, 0x39, 0xe4, 0x4d, 0xea, 0xa4, 0x1d, 0xfb, 0x55, + 0x2c, 0xee, 0xd2, 0x7c, 0x87, 0x9c, 0xf7, 0x13, 0x24, 0xc6, 0x67, 0x54, + 0x9c, 0x51, 0x31, 0xe6, 0x56, 0x0e, 0xbb, 0x39, 0x2f, 0x3e, 0xc3, 0x7c, + 0x1f, 0xfa, 0x1f, 0x75, 0x80, 0xd7, 0xf9, 0x5e, 0xf0, 0x75, 0x2e, 0x60, + 0x52, 0x4c, 0xf9, 0x01, 0xd8, 0x69, 0xe9, 0x07, 0x2e, 0xf4, 0xfb, 0x14, + 0xa4, 0xf2, 0x53, 0x24, 0xee, 0xfd, 0xa1, 0xcf, 0x20, 0x3d, 0x2b, 0xad, + 0xf2, 0xf4, 0x5c, 0xa5, 0xbf, 0xba, 0x91, 0xd7, 0x9f, 0x76, 0xa9, 0x7d, + 0x99, 0xdc, 0x2e, 0xdc, 0x33, 0x3a, 0xa1, 0xfd, 0x53, 0xf7, 0xbd, 0x2c, + 0xef, 0x53, 0xe7, 0x26, 0xab, 0xfa, 0x52, 0xe9, 0x0f, 0x71, 0x9c, 0x9d, + 0xcc, 0x8f, 0xed, 0x0e, 0xfc, 0x88, 0xd2, 0xdf, 0xb7, 0xb3, 0x8d, 0x94, + 0xa7, 0x23, 0x58, 0x3f, 0x3f, 0x7c, 0x09, 0x79, 0x3e, 0x44, 0xf1, 0x89, + 0xd0, 0xb9, 0xf7, 0x70, 0x6a, 0x9c, 0xfa, 0xf2, 0xd4, 0x60, 0xfe, 0x03, + 0xec, 0xfb, 0xce, 0x36, 0x52, 0x1e, 0x8e, 0xb0, 0xd5, 0x43, 0x1e, 0xea, + 0xfb, 0x82, 0xff, 0x2c, 0x89, 0xe6, 0x0a, 0xed, 0x37, 0x89, 0xd9, 0x22, + 0xf6, 0x27, 0xc3, 0x94, 0x2f, 0xb1, 0xf6, 0xa1, 0xf2, 0xf7, 0xb1, 0xf2, + 0x9c, 0x98, 0xf0, 0xc1, 0xce, 0x2b, 0xf3, 0xc8, 0xdb, 0xda, 0xbb, 0x4a, + 0x7e, 0x32, 0xb5, 0x86, 0x73, 0xa9, 0x89, 0x19, 0xbe, 0xc0, 0x8d, 0x7c, + 0xdc, 0x76, 0x43, 0x9f, 0x69, 0x16, 0xf2, 0x52, 0x3d, 0x5c, 0xc2, 0x1c, + 0x06, 0xbe, 0x44, 0xfb, 0x7f, 0xbb, 0x0a, 0xd4, 0x37, 0xc7, 0x1b, 0xbc, + 0x97, 0xa0, 0x38, 0x14, 0xd5, 0x71, 0x00, 0xb7, 0xca, 0xdf, 0x19, 0x73, + 0x23, 0xde, 0x72, 0x3d, 0x92, 0x9b, 0xf1, 0x16, 0x38, 0xdc, 0x03, 0xf4, + 0x77, 0x53, 0x5f, 0xff, 0x07, 0xfe, 0xd6, 0xd6, 0xcd, 0xce, 0xd7, 0x0a, + 0xaf, 0x08, 0x24, 0x9f, 0x6a, 0xf8, 0x25, 0xf9, 0x4c, 0x73, 0x50, 0xd6, + 0x41, 0xf3, 0x46, 0x19, 0x0c, 0x88, 0xd3, 0x6c, 0x77, 0x82, 0xf3, 0x71, + 0x86, 0xf3, 0xf1, 0x2b, 0xe3, 0x64, 0x58, 0xe7, 0x01, 0x38, 0x4b, 0x7d, + 0xbc, 0xc3, 0x61, 0xbe, 0xeb, 0x39, 0x8e, 0xba, 0x2c, 0x73, 0x1d, 0x5f, + 0x2f, 0xcf, 0x73, 0x9d, 0xd7, 0x8d, 0xe6, 0xba, 0x7e, 0x3f, 0xb1, 0x3e, + 0x3a, 0xe1, 0x18, 0x67, 0xe1, 0xe3, 0x2e, 0x98, 0x89, 0x61, 0x4e, 0x55, + 0xf2, 0xdb, 0x43, 0x7d, 0xd7, 0xd0, 0x7a, 0xb9, 0xfa, 0x9d, 0xfa, 0x45, + 0xf7, 0x43, 0xc3, 0xd2, 0x34, 0x61, 0x28, 0x76, 0x51, 0xdd, 0xd7, 0xe6, + 0x30, 0x07, 0x74, 0xff, 0x39, 0xe7, 0x77, 0x32, 0xe2, 0x51, 0x30, 0x78, + 0x7d, 0xb5, 0xba, 0xef, 0xf4, 0xbb, 0x1f, 0x28, 0xf3, 0xbb, 0x65, 0x1f, + 0xd7, 0x81, 0x31, 0xfe, 0xa0, 0xb2, 0x3b, 0xc2, 0xf7, 0x64, 0xf8, 0x1e, + 0x93, 0xfb, 0xfc, 0xde, 0xba, 0xee, 0x57, 0xcd, 0x8b, 0x4a, 0xbf, 0xeb, + 0xfc, 0xd3, 0xbd, 0xa9, 0xeb, 0xab, 0xea, 0x5c, 0xbb, 0x43, 0xff, 0x2b, + 0x3b, 0x77, 0xd6, 0x2b, 0x7d, 0x8f, 0xfe, 0xa2, 0x31, 0x29, 0xec, 0x73, + 0xeb, 0x37, 0x39, 0xb7, 0xa8, 0x3e, 0x72, 0x5e, 0xa9, 0x73, 0x3f, 0x97, + 0xcf, 0x4d, 0xfb, 0x11, 0xcf, 0x1c, 0xbf, 0xc7, 0x73, 0xb3, 0x3c, 0xb7, + 0xa6, 0x94, 0x9c, 0x60, 0xff, 0x13, 0xfa, 0x9d, 0x91, 0xfe, 0xf3, 0xbc, + 0x3b, 0xa1, 0xf3, 0x80, 0xf7, 0x45, 0x97, 0x19, 0x7e, 0xfc, 0xe1, 0xc2, + 0x1c, 0xf4, 0xf0, 0x79, 0x19, 0x4b, 0x9a, 0xfc, 0x28, 0x8d, 0x65, 0xb8, + 0xee, 0x69, 0x7b, 0x3e, 0x51, 0x1f, 0xe8, 0xcb, 0x3a, 0xa5, 0x7d, 0x88, + 0x63, 0x4a, 0xdf, 0x0b, 0xf3, 0x56, 0x5f, 0xb5, 0xbe, 0xbd, 0x8e, 0x5e, + 0xce, 0xef, 0x67, 0xeb, 0xfa, 0xbb, 0xc8, 0x4d, 0xdf, 0x55, 0xd7, 0x6c, + 0x79, 0xaa, 0xab, 0xb3, 0x25, 0xe8, 0x9d, 0x08, 0x48, 0x3e, 0x26, 0x90, + 0x6f, 0xd6, 0x0f, 0xf5, 0x02, 0xdd, 0x3e, 0xb5, 0x2f, 0x63, 0x60, 0x1e, + 0x8a, 0x24, 0xe6, 0xe7, 0x33, 0x27, 0xa9, 0x4e, 0xaf, 0x9d, 0xf9, 0x93, + 0xe6, 0xe8, 0x9b, 0xcf, 0x5e, 0x51, 0x76, 0xb7, 0x89, 0xd5, 0x29, 0x93, + 0xfc, 0xc9, 0xee, 0x84, 0xfa, 0xbd, 0x87, 0x6a, 0xe3, 0x3d, 0xd6, 0xa9, + 0xec, 0x19, 0x5c, 0x57, 0xa9, 0x37, 0x6e, 0x7f, 0xff, 0xa1, 0x9f, 0x1d, + 0xc7, 0xbb, 0x92, 0x75, 0x29, 0xf9, 0x3e, 0xb1, 0x3a, 0x60, 0x52, 0x54, + 0x76, 0xfd, 0xfa, 0xb8, 0xd0, 0xe7, 0x07, 0xa2, 0xb8, 0x47, 0xcf, 0x2b, + 0xab, 0x6e, 0x5e, 0x29, 0x3b, 0x6f, 0x97, 0xf3, 0x73, 0x74, 0xa0, 0xda, + 0x5e, 0x52, 0xac, 0x14, 0x61, 0x67, 0x84, 0xe7, 0xc5, 0x18, 0x5f, 0x78, + 0x33, 0x14, 0x25, 0xbb, 0xb9, 0x47, 0x88, 0xb7, 0x22, 0x1e, 0x46, 0x3e, + 0x72, 0x8f, 0x62, 0x3f, 0x17, 0xc1, 0x7a, 0x5b, 0x04, 0xfe, 0x8f, 0xd0, + 0x7b, 0x68, 0x48, 0x19, 0x18, 0xe7, 0xb9, 0xb2, 0x52, 0x9e, 0xb7, 0xc0, + 0x65, 0xff, 0x46, 0xf3, 0x16, 0xef, 0xd4, 0x55, 0x3f, 0xe2, 0x17, 0x49, + 0xcc, 0x9b, 0x6c, 0x8f, 0x49, 0xfb, 0xa3, 0x49, 0xf0, 0x4a, 0x74, 0x39, + 0xf7, 0x71, 0x3b, 0xe6, 0x46, 0x5b, 0x65, 0x2e, 0x57, 0xcf, 0x6f, 0xb3, + 0x7f, 0xa9, 0x3c, 0x1f, 0x6b, 0xfd, 0xc0, 0x5c, 0x52, 0xf6, 0x49, 0x94, + 0x73, 0x68, 0x2b, 0x73, 0xdb, 0xc3, 0x3c, 0xba, 0xc3, 0xdf, 0x3d, 0xcd, + 0xe2, 0x93, 0x22, 0xf2, 0xb0, 0x52, 0xb4, 0xf3, 0x40, 0xfb, 0xa1, 0xef, + 0x41, 0x5c, 0x3a, 0xce, 0xca, 0xbd, 0xf0, 0xeb, 0x24, 0xfb, 0x7f, 0x8b, + 0xbe, 0xcf, 0xe2, 0x1c, 0xaf, 0xb2, 0x8b, 0xf5, 0x83, 0xdd, 0x98, 0x03, + 0x56, 0x59, 0xae, 0x9d, 0xfb, 0x23, 0xe4, 0x57, 0x4c, 0x2e, 0xe8, 0xf3, + 0xb5, 0x71, 0xb7, 0x64, 0x80, 0x0b, 0x19, 0x5d, 0x37, 0x5d, 0x5f, 0x5d, + 0x4f, 0xd4, 0x3d, 0xde, 0x47, 0x6a, 0x83, 0xb9, 0x3e, 0xe2, 0x7f, 0x26, + 0x77, 0xb7, 0xf6, 0x3b, 0xf5, 0x28, 0xfd, 0x7f, 0xf3, 0xa2, 0xf8, 0x22, + 0x85, 0x81, 0xf4, 0x0d, 0x63, 0x65, 0x0e, 0x0a, 0xfe, 0xa9, 0x9e, 0xa7, + 0x3e, 0x71, 0xd5, 0xa7, 0xfb, 0x90, 0xb7, 0x07, 0x9c, 0xf8, 0x3a, 0x52, + 0xd5, 0xcf, 0x3a, 0x2e, 0xa5, 0x97, 0x61, 0xbe, 0x1a, 0x22, 0x7b, 0x00, + 0xdf, 0x6b, 0x0d, 0x01, 0xf0, 0xbf, 0x21, 0xe0, 0xf4, 0x4e, 0x4b, 0xbe, + 0x04, 0xe9, 0x3f, 0x86, 0xed, 0xb1, 0x20, 0xc5, 0x71, 0xfe, 0xda, 0xa7, + 0xa4, 0xf6, 0xd6, 0x52, 0x18, 0xeb, 0xad, 0x59, 0x5c, 0xe3, 0x25, 0x7e, + 0x7b, 0xc4, 0x39, 0xf0, 0xff, 0x8d, 0x05, 0xe0, 0x05, 0x71, 0x18, 0x76, + 0x62, 0xd3, 0xf4, 0x2e, 0x1a, 0xad, 0x48, 0x67, 0x61, 0x89, 0x79, 0x9d, + 0x70, 0xd3, 0xff, 0x91, 0x25, 0x11, 0xe1, 0xef, 0x76, 0xee, 0x43, 0xf0, + 0xd7, 0x5b, 0x55, 0xe7, 0xad, 0xf2, 0x59, 0xc9, 0x11, 0xc9, 0x57, 0x98, + 0x61, 0x5e, 0x1b, 0x76, 0x5e, 0xeb, 0x7a, 0x26, 0xdc, 0x8e, 0x3c, 0xde, + 0x57, 0xcf, 0x63, 0xed, 0x9f, 0xca, 0xef, 0xef, 0xe5, 0xef, 0xc9, 0x7a, + 0xfb, 0xea, 0x5c, 0x58, 0xf2, 0xf9, 0xff, 0xe2, 0x31, 0xf0, 0x60, 0xb7, + 0xba, 0xbf, 0xb5, 0x8a, 0x8f, 0x4e, 0x75, 0x6f, 0x92, 0x75, 0xff, 0x07, + 0x48, 0xf7, 0x72, 0xb6, 0xa8, 0x0f, 0x00, 0x00, 0x00 }; + +static u8 bnx2_TPAT_b09FwText[] = { + 0xbd, 0x58, 0x5b, 0x6c, 0x1c, 0xe5, 0x15, 0x3e, 0x73, 0xf1, 0x7a, 0xec, + 0xd8, 0xc9, 0x18, 0xb6, 0xe9, 0x86, 0xda, 0xca, 0x8c, 0x3d, 0xb6, 0x97, + 0xda, 0x0a, 0x93, 0xc6, 0xc0, 0x46, 0x5d, 0xda, 0xe9, 0xee, 0xda, 0x71, + 0x43, 0x1e, 0x9c, 0x36, 0x15, 0x50, 0x68, 0x65, 0xd6, 0x09, 0xa1, 0xa5, + 0x95, 0x02, 0xe5, 0x01, 0x15, 0xa4, 0x6c, 0xd7, 0x9b, 0x34, 0x95, 0x36, + 0xde, 0xd4, 0xa0, 0x24, 0xad, 0x78, 0xb0, 0x9c, 0x38, 0xe6, 0x61, 0xc9, + 0x86, 0xf6, 0xb5, 0x08, 0x2b, 0x94, 0x00, 0x12, 0x08, 0x51, 0xd1, 0x8b, + 0x40, 0x95, 0x22, 0xa8, 0x1a, 0x1e, 0xaa, 0x2a, 0xaa, 0x4a, 0x85, 0x68, + 0x9a, 0xe9, 0xf7, 0xfd, 0x3b, 0xe3, 0x6c, 0x6e, 0xea, 0x5b, 0x57, 0x5a, + 0xcd, 0xe5, 0xff, 0xcf, 0xf9, 0xcf, 0xf5, 0x3b, 0xe7, 0x4c, 0xbf, 0x26, + 0x9d, 0x12, 0xfd, 0xba, 0xf1, 0xbf, 0xf3, 0xe1, 0x7d, 0x4f, 0xfa, 0x9b, + 0xfc, 0x4d, 0xb2, 0x65, 0xf3, 0xf7, 0x35, 0x91, 0x36, 0xf9, 0x3f, 0xfe, + 0x0c, 0x11, 0x3b, 0x96, 0x83, 0x7f, 0xb1, 0xf4, 0xac, 0xd3, 0x9b, 0xf3, + 0xc4, 0x32, 0xb2, 0x0b, 0x1b, 0x67, 0x3c, 0x91, 0xa0, 0x3e, 0xe2, 0xe4, + 0xe5, 0x3f, 0x61, 0x29, 0x69, 0x0a, 0xdf, 0xf7, 0x65, 0x2f, 0xdd, 0xf1, + 0xf2, 0xdd, 0xee, 0xc5, 0x05, 0x43, 0x2c, 0x3b, 0x7b, 0xc8, 0xb4, 0x87, + 0xc4, 0xea, 0x05, 0xcd, 0xf3, 0xc3, 0x1f, 0xea, 0xb2, 0x36, 0xe6, 0x55, + 0x0a, 0x75, 0xef, 0x7c, 0xf8, 0xf2, 0xb0, 0x67, 0x97, 0x71, 0xc0, 0x99, + 0x86, 0x23, 0xb9, 0x46, 0x4a, 0x5e, 0x69, 0x24, 0xe5, 0xa5, 0x86, 0x29, + 0x7b, 0x9e, 0xdd, 0x2f, 0x15, 0xdf, 0x4d, 0x15, 0x0c, 0x4b, 0xf4, 0xac, + 0x9b, 0x2a, 0x8a, 0x23, 0x4b, 0xbe, 0x5b, 0x9a, 0x36, 0x7a, 0x34, 0x2b, + 0x6b, 0xc9, 0xd3, 0xc3, 0xba, 0x2c, 0x24, 0x1f, 0x92, 0x47, 0xbc, 0xfb, + 0xf1, 0x37, 0x45, 0x9f, 0x37, 0xb5, 0xfc, 0x31, 0x53, 0xcc, 0xf9, 0x75, + 0xb2, 0xcd, 0x0f, 0xc3, 0x19, 0x3f, 0x00, 0xfd, 0x40, 0x7a, 0xaf, 0x74, + 0x48, 0xc9, 0x76, 0x27, 0x69, 0x34, 0xec, 0x91, 0x9c, 0xdf, 0x26, 0x81, + 0xdd, 0xd4, 0x6b, 0x41, 0x5d, 0x2f, 0x85, 0x4b, 0xa0, 0xef, 0xf0, 0xe2, + 0xf5, 0x5b, 0xa2, 0x75, 0x3b, 0x5a, 0xd7, 0x45, 0x3f, 0xea, 0x3a, 0xcb, + 0x32, 0x18, 0x98, 0xda, 0xe5, 0x30, 0xe7, 0xad, 0xb7, 0x73, 0xcb, 0xa6, + 0x18, 0xf3, 0x94, 0xdf, 0xb3, 0xf3, 0x12, 0x82, 0xc6, 0x20, 0x8d, 0xa9, + 0x67, 0x9f, 0x80, 0xdf, 0x06, 0x03, 0x1d, 0x2e, 0x3a, 0x5b, 0x4d, 0xd9, + 0xb9, 0xc6, 0x53, 0x5a, 0xae, 0x76, 0x39, 0x0c, 0xcc, 0x4e, 0xd1, 0xbd, + 0x40, 0xcb, 0x2d, 0x93, 0x57, 0x87, 0x98, 0x5e, 0x3b, 0x68, 0x06, 0x6c, + 0x5d, 0x78, 0xcd, 0x45, 0xef, 0xc9, 0xbb, 0x80, 0xfb, 0x09, 0x2d, 0x58, + 0x36, 0xb5, 0xdc, 0xb1, 0x49, 0xdc, 0x5b, 0xa0, 0x87, 0x5d, 0x7c, 0x4d, + 0x82, 0x29, 0x0d, 0x74, 0xd4, 0xd3, 0xc6, 0xb3, 0x2e, 0x41, 0xd2, 0x96, + 0xd9, 0x31, 0x37, 0x55, 0x92, 0xed, 0x5a, 0x7e, 0xf9, 0x3a, 0xa7, 0xd9, + 0x93, 0x8d, 0xeb, 0xdf, 0x51, 0x96, 0xaf, 0x99, 0x61, 0xa8, 0x6f, 0x6e, + 0x8f, 0x74, 0x24, 0xbf, 0xa0, 0x29, 0x7f, 0x92, 0xcf, 0x90, 0xb9, 0x06, + 0xd9, 0xeb, 0x09, 0xc8, 0x13, 0x86, 0x3c, 0x27, 0xe7, 0xe5, 0x21, 0x67, + 0x80, 0xbf, 0x7b, 0xa8, 0x88, 0x50, 0xe8, 0x3f, 0xda, 0x2d, 0x4e, 0x4f, + 0x18, 0x16, 0x7c, 0xd7, 0x5e, 0x96, 0x8c, 0xcc, 0xd6, 0x7a, 0xed, 0xf1, + 0x5a, 0x19, 0xeb, 0x25, 0xee, 0x81, 0x3d, 0x44, 0xc6, 0xeb, 0x61, 0x78, + 0xca, 0x7f, 0x17, 0xbe, 0xd6, 0x47, 0xdb, 0xc4, 0x75, 0x02, 0xbc, 0xeb, + 0x3f, 0x75, 0xad, 0xcd, 0x36, 0x46, 0x32, 0xd0, 0xee, 0x38, 0xc7, 0xff, + 0x42, 0xf4, 0xdc, 0x65, 0xe7, 0x8e, 0xc5, 0x76, 0x56, 0x72, 0xc3, 0xae, + 0xbe, 0xe4, 0xc6, 0x20, 0xff, 0x4d, 0x75, 0x8a, 0xe9, 0x28, 0x0b, 0xe5, + 0xc6, 0x7e, 0xef, 0x8a, 0x4c, 0x0f, 0x5e, 0x27, 0x13, 0xe5, 0xd1, 0xc5, + 0x3c, 0x6a, 0x49, 0xc5, 0xbb, 0xa0, 0xc9, 0xda, 0x30, 0xac, 0xf8, 0xa6, + 0x56, 0x38, 0xf6, 0x49, 0x74, 0x8f, 0x38, 0xac, 0x21, 0x0e, 0x6b, 0x88, + 0xcb, 0x9a, 0xd8, 0x88, 0x77, 0x79, 0x79, 0xd8, 0x92, 0xf3, 0x06, 0xfc, + 0xd9, 0xe0, 0x7a, 0xbb, 0x94, 0x7d, 0x4f, 0x0e, 0xd4, 0x68, 0x99, 0x76, + 0x99, 0xf5, 0x3e, 0x0d, 0x77, 0xc3, 0x1e, 0x27, 0x25, 0xdc, 0x98, 0x43, + 0xcc, 0xe6, 0x60, 0xce, 0xa7, 0xbd, 0xb4, 0x1c, 0x68, 0x78, 0x52, 0x6e, + 0x90, 0xae, 0x22, 0x4d, 0xba, 0x75, 0xa0, 0x1b, 0x05, 0xdd, 0x98, 0x1c, + 0x54, 0xb4, 0xeb, 0x40, 0x7b, 0x31, 0xa2, 0x1d, 0x49, 0x4d, 0x88, 0x0f, + 0x9a, 0x01, 0x67, 0x02, 0x31, 0x37, 0x9d, 0x1c, 0x05, 0xed, 0xa8, 0x54, + 0xf0, 0x2f, 0xd7, 0xa4, 0x64, 0x8e, 0x91, 0xaf, 0x9b, 0xda, 0x4d, 0x9b, + 0x2b, 0x9e, 0x25, 0xf0, 0x4c, 0x62, 0xcd, 0x02, 0x1f, 0x13, 0xd7, 0xb7, + 0xc2, 0x72, 0x0d, 0xb1, 0x9d, 0xe4, 0xfd, 0x2b, 0xa1, 0x9e, 0x85, 0x1d, + 0xc6, 0x3c, 0xa7, 0x2c, 0x7c, 0x4e, 0x48, 0x1e, 0xbe, 0xd4, 0xbd, 0x75, + 0x52, 0xb4, 0x35, 0x4d, 0xcf, 0x1a, 0x52, 0x84, 0x15, 0x82, 0x29, 0x53, + 0xbd, 0x9b, 0xb6, 0x35, 0xe4, 0xd8, 0x26, 0xbd, 0x89, 0x39, 0x6d, 0xd8, + 0x03, 0xff, 0x7b, 0x5d, 0x52, 0x4c, 0xf6, 0x60, 0x2f, 0x12, 0xad, 0x73, + 0x10, 0x39, 0xda, 0x83, 0x3d, 0xbc, 0xd2, 0x0f, 0xd8, 0xef, 0x71, 0x7f, + 0x17, 0x64, 0x8c, 0xdf, 0x75, 0x49, 0xe9, 0x2a, 0xff, 0x50, 0x46, 0xe5, + 0x17, 0x9c, 0x6f, 0x46, 0xbe, 0x6d, 0xf5, 0x57, 0xbc, 0x6e, 0x53, 0xbf, + 0x4f, 0xf3, 0xde, 0xd9, 0xdb, 0x75, 0xb9, 0x18, 0x2e, 0x7a, 0x9a, 0x31, + 0x33, 0x6a, 0x40, 0xa6, 0x1c, 0x7c, 0xf7, 0x2d, 0x25, 0x53, 0xb9, 0x9e, + 0x42, 0x9c, 0x8d, 0xd8, 0x27, 0x64, 0x0d, 0xf4, 0x73, 0x33, 0x22, 0x03, + 0xb8, 0xd7, 0x64, 0xc2, 0xeb, 0x05, 0xad, 0x6b, 0x17, 0x05, 0xba, 0x7a, + 0x23, 0xf6, 0x38, 0x74, 0x0d, 0x76, 0x21, 0xbe, 0xbd, 0x26, 0xdd, 0xc1, + 0x3a, 0xef, 0xbf, 0x1d, 0xf1, 0xc0, 0xbf, 0x4a, 0xcc, 0x7a, 0xa8, 0x77, + 0xc6, 0x0b, 0x7a, 0x10, 0x17, 0x99, 0xbc, 0x92, 0xc1, 0xb5, 0xcf, 0x43, + 0x98, 0x8e, 0x6c, 0xa9, 0xef, 0xf6, 0xc3, 0xc1, 0x4e, 0x88, 0x66, 0x6d, + 0xc0, 0x9e, 0xad, 0xc3, 0xee, 0x53, 0x2b, 0xe2, 0x4e, 0x97, 0xc0, 0x7b, + 0xad, 0xc7, 0x33, 0xdd, 0xe0, 0x01, 0xed, 0x2e, 0xc4, 0xbe, 0xeb, 0x53, + 0xf8, 0x54, 0xf6, 0x78, 0x5f, 0x6a, 0x58, 0xac, 0xee, 0xec, 0xf3, 0x7d, + 0x2f, 0x0e, 0x8e, 0xdc, 0xbf, 0x4e, 0x4a, 0x3d, 0x09, 0xc4, 0xda, 0x84, + 0xac, 0xa4, 0x18, 0x73, 0x4f, 0x61, 0x53, 0xae, 0xea, 0x48, 0xf9, 0x73, + 0xae, 0xf3, 0x43, 0xdc, 0x2f, 0x56, 0x3b, 0x20, 0x5b, 0x4a, 0xf4, 0xc3, + 0xc4, 0xcf, 0x4a, 0x5f, 0xae, 0xaa, 0x11, 0x2b, 0x29, 0x97, 0xa5, 0xe1, + 0xb9, 0xbf, 0xfe, 0x0e, 0xe4, 0x74, 0x1d, 0x01, 0xce, 0x6d, 0xab, 0xf1, + 0x8c, 0x15, 0xc8, 0xb8, 0x5d, 0xa6, 0x7b, 0x88, 0x8b, 0xbd, 0x62, 0x1d, + 0xb6, 0xa4, 0x23, 0x2b, 0x72, 0xa2, 0xea, 0xa6, 0x1e, 0x91, 0x52, 0xca, + 0xc0, 0x19, 0x3f, 0xc6, 0xff, 0xeb, 0xe0, 0x5d, 0x00, 0xaf, 0x73, 0x9e, + 0x9b, 0x7a, 0x54, 0x46, 0xec, 0x77, 0xe4, 0x5f, 0x21, 0x73, 0x79, 0x77, + 0xfd, 0x6d, 0x3d, 0xae, 0x21, 0x95, 0xea, 0x88, 0x3d, 0x47, 0xdb, 0x4c, + 0xa9, 0x7d, 0xfb, 0x4a, 0xd0, 0x7d, 0x45, 0x78, 0x3f, 0x62, 0xbf, 0x29, + 0xbf, 0xc3, 0x7e, 0xca, 0x4e, 0x9f, 0x42, 0xce, 0x3a, 0xe5, 0x7b, 0x06, + 0xf2, 0xd1, 0x56, 0xa5, 0xbe, 0x19, 0xd0, 0xe6, 0xe5, 0x8b, 0xb0, 0xfb, + 0xe5, 0xd0, 0xf4, 0x5c, 0xfb, 0x01, 0x2d, 0x05, 0xbd, 0x86, 0xe0, 0xcf, + 0x10, 0xcf, 0x25, 0xb7, 0x1d, 0xb6, 0x68, 0x83, 0xfc, 0x4b, 0x55, 0xd7, + 0xf9, 0xa9, 0xa4, 0x24, 0x71, 0x78, 0xc5, 0x31, 0x55, 0x8d, 0x38, 0xde, + 0x97, 0xc3, 0x7e, 0xc4, 0x06, 0xf8, 0x3c, 0xdf, 0xc7, 0x3a, 0xb1, 0xa3, + 0xae, 0xc9, 0x12, 0xe4, 0x9c, 0x55, 0xeb, 0x0b, 0x7d, 0xd4, 0x7f, 0x4f, + 0x7d, 0x65, 0x73, 0x42, 0x9a, 0x36, 0x18, 0xac, 0xbb, 0x88, 0x57, 0xea, + 0xdf, 0x2b, 0xe6, 0x8b, 0x8e, 0x4c, 0x34, 0x3a, 0xe5, 0xbc, 0xb2, 0xb7, + 0xaa, 0x01, 0x69, 0xe4, 0x15, 0xec, 0xa8, 0xe4, 0x4e, 0xbd, 0x23, 0xb4, + 0x9d, 0x09, 0x7e, 0x9f, 0x85, 0xd3, 0x88, 0xf9, 0x8a, 0x07, 0xba, 0x06, + 0xed, 0xd7, 0xf4, 0x29, 0xfd, 0x56, 0x41, 0x1d, 0x38, 0xe7, 0x0b, 0x22, + 0x7d, 0x30, 0x7d, 0x0a, 0xcf, 0xe5, 0x8c, 0x8b, 0x18, 0x19, 0x49, 0x8f, + 0x0b, 0xaf, 0x7a, 0xaf, 0xce, 0xb8, 0xf1, 0x89, 0x59, 0xad, 0xf7, 0xb8, + 0x66, 0xc8, 0x83, 0xcf, 0x6f, 0xa0, 0x3e, 0xf9, 0xa8, 0x49, 0xa3, 0xf2, + 0xeb, 0x46, 0x5a, 0x7e, 0x85, 0x7c, 0x7e, 0x09, 0x75, 0xea, 0x4c, 0xc3, + 0x9a, 0x36, 0xb3, 0x32, 0x55, 0xae, 0xee, 0x0f, 0x0d, 0x4f, 0xa6, 0x13, + 0x59, 0x62, 0x5a, 0x57, 0x06, 0x18, 0x35, 0x55, 0xae, 0xf7, 0xee, 0x38, + 0x5b, 0x95, 0xd2, 0x6d, 0x59, 0x7d, 0xbd, 0x2e, 0xeb, 0x80, 0x6b, 0xc4, + 0x5a, 0xc4, 0x69, 0xa3, 0x77, 0xc7, 0xab, 0xd5, 0x8d, 0xd0, 0x43, 0x2e, + 0x21, 0x2f, 0x51, 0xcf, 0xce, 0x6e, 0x30, 0x60, 0x2f, 0xe6, 0x32, 0x30, + 0x37, 0x78, 0x70, 0x18, 0xf1, 0x30, 0x86, 0x7b, 0x9c, 0x51, 0x6a, 0xf4, + 0x4e, 0xeb, 0xd9, 0x92, 0x04, 0x8d, 0x0a, 0xfe, 0x96, 0x8c, 0x57, 0x2d, + 0xeb, 0x55, 0xf0, 0xd4, 0xc7, 0x5c, 0x27, 0x67, 0x5c, 0x24, 0x86, 0x82, + 0xbe, 0x44, 0x5e, 0xb0, 0x9b, 0x63, 0xf6, 0xd7, 0x3b, 0xee, 0xd3, 0xb3, + 0x19, 0x60, 0x85, 0x89, 0x9c, 0x1d, 0x03, 0x86, 0xd0, 0x97, 0x49, 0x43, + 0x3a, 0x81, 0x0f, 0xc0, 0x88, 0x52, 0xe3, 0x1e, 0x31, 0x58, 0x3b, 0x3c, + 0xee, 0x7f, 0x0e, 0xb1, 0xc6, 0xeb, 0x91, 0xbe, 0x01, 0x75, 0xad, 0x46, + 0xd7, 0x43, 0xea, 0x7a, 0x2b, 0x62, 0xff, 0x47, 0x43, 0xa8, 0xa3, 0x1e, + 0x7d, 0xf4, 0x24, 0xea, 0xbc, 0x05, 0x5a, 0xd4, 0x53, 0xd0, 0x07, 0x75, + 0xd6, 0xfa, 0x4b, 0xe1, 0xc3, 0x26, 0x62, 0xd2, 0x5b, 0x01, 0xea, 0xb8, + 0x76, 0x41, 0xee, 0x51, 0x35, 0x9f, 0xfc, 0xfa, 0xeb, 0x5a, 0x74, 0xc6, + 0x33, 0xb8, 0x67, 0xee, 0xf1, 0xfe, 0x78, 0x74, 0x5e, 0xa5, 0xcf, 0x01, + 0x7d, 0xae, 0x06, 0x3d, 0x33, 0xf8, 0xfb, 0x97, 0x10, 0x77, 0xc4, 0xaf, + 0xf5, 0x71, 0x2d, 0x42, 0xcd, 0x6b, 0xd6, 0xe6, 0xd9, 0x5a, 0x3b, 0xf0, + 0x2f, 0x0c, 0x8b, 0xde, 0xbd, 0xd0, 0xa1, 0x13, 0x58, 0x65, 0xe3, 0xcf, + 0xf8, 0xe5, 0x9a, 0x26, 0x45, 0xe6, 0x4d, 0x83, 0xf7, 0x5c, 0x63, 0xed, + 0x6a, 0xc7, 0xf5, 0x1b, 0xd8, 0xfb, 0x56, 0x58, 0x6a, 0x10, 0x57, 0x29, + 0x07, 0xf0, 0xb0, 0x61, 0x69, 0xf9, 0x9a, 0x68, 0x85, 0x9a, 0x38, 0x45, + 0xdf, 0x54, 0xb6, 0x0e, 0x6c, 0x1b, 0x76, 0xa2, 0x6e, 0xa3, 0x66, 0x94, + 0x83, 0x90, 0x6d, 0x14, 0x36, 0xfc, 0x63, 0x02, 0xf9, 0x12, 0xc0, 0xa6, + 0xfa, 0x1e, 0xd4, 0xc3, 0x85, 0xa4, 0xac, 0xd3, 0xbd, 0x0e, 0xa3, 0x9c, + 0x94, 0x6e, 0xdd, 0xa3, 0x6c, 0x8f, 0x1b, 0x90, 0x8d, 0xeb, 0x41, 0xd1, + 0x7f, 0x11, 0x67, 0x66, 0x14, 0xf6, 0x16, 0xaa, 0x71, 0x8d, 0x07, 0x4f, + 0x8f, 0xf5, 0xc1, 0x8a, 0x6a, 0x7d, 0x2e, 0xaa, 0xe3, 0x88, 0x4d, 0xd4, + 0xa4, 0x9d, 0xa8, 0xe1, 0x65, 0x15, 0x0b, 0x6e, 0xc9, 0xd1, 0x2f, 0x87, + 0x03, 0x43, 0xc4, 0xe3, 0x30, 0xdc, 0xe7, 0x4f, 0x60, 0xef, 0x7e, 0xc8, + 0x3e, 0x89, 0x3a, 0xce, 0xda, 0x4f, 0xd9, 0xb2, 0x90, 0xad, 0xbb, 0x59, + 0xe3, 0x51, 0xff, 0xcb, 0xaa, 0xde, 0x77, 0xc0, 0x0f, 0x1a, 0xfe, 0xae, + 0x33, 0x2d, 0x7c, 0x2f, 0x1d, 0x3a, 0x9e, 0x8b, 0xc0, 0xf0, 0xca, 0xd8, + 0x76, 0xad, 0xb0, 0xfc, 0x4b, 0x23, 0xca, 0x77, 0xc8, 0x0d, 0x0c, 0x4f, + 0x92, 0x2e, 0x01, 0xba, 0x6e, 0xd0, 0xfc, 0x02, 0x6b, 0x6d, 0xb8, 0xb6, + 0xf2, 0x51, 0x7d, 0x03, 0x7b, 0x39, 0x9c, 0x35, 0x29, 0x66, 0xb6, 0x13, + 0xb5, 0x71, 0xd0, 0x29, 0xc8, 0x96, 0xa8, 0x47, 0x23, 0x6e, 0x7f, 0xa5, + 0x05, 0xb7, 0x1d, 0x31, 0x54, 0x9c, 0x6f, 0x8d, 0xea, 0x0d, 0x6b, 0xf6, + 0x5d, 0xd1, 0x7a, 0x12, 0xb5, 0x77, 0x4b, 0xd4, 0x43, 0x58, 0xb8, 0xcf, + 0xc8, 0x21, 0x55, 0x87, 0x13, 0xac, 0xc3, 0xc0, 0xc3, 0x52, 0x06, 0x78, + 0xe5, 0x7f, 0x0c, 0x8c, 0xc9, 0x23, 0x9b, 0x7f, 0x5b, 0x35, 0x81, 0xef, + 0x06, 0xe8, 0xd9, 0x07, 0x7e, 0x00, 0xd9, 0x5c, 0xfb, 0x63, 0xe8, 0x44, + 0xec, 0x66, 0xce, 0xb6, 0x65, 0x3d, 0xe7, 0x80, 0x0c, 0xa5, 0x0e, 0xa0, + 0x26, 0x1a, 0xc0, 0x34, 0x53, 0x78, 0x6e, 0xdc, 0xb7, 0xc5, 0xfd, 0x23, + 0x7f, 0x48, 0x5b, 0x8f, 0xbd, 0xd6, 0xfb, 0xe0, 0x31, 0xe8, 0x8c, 0x23, + 0x77, 0x67, 0x33, 0xff, 0x8b, 0x66, 0x30, 0xa2, 0x41, 0x0f, 0x33, 0xc6, + 0x73, 0x81, 0x9f, 0x0a, 0xf3, 0xfc, 0x96, 0x78, 0xf0, 0x11, 0x0f, 0x22, + 0xc5, 0x1a, 0x72, 0x0a, 0x3e, 0x56, 0xb1, 0x86, 0xfd, 0xfa, 0x18, 0xea, + 0x67, 0xd2, 0x25, 0x47, 0x60, 0xde, 0x2e, 0x73, 0x09, 0x18, 0x69, 0x66, + 0xa7, 0xcc, 0x4a, 0xd5, 0x4d, 0x9f, 0x91, 0x11, 0xff, 0x8c, 0x10, 0xbf, + 0x5c, 0xe7, 0xa0, 0xc2, 0xb3, 0x5d, 0xe6, 0xa0, 0x8a, 0xfb, 0x29, 0xd3, + 0xab, 0xbf, 0x8d, 0xd8, 0xb2, 0x98, 0x53, 0xac, 0x41, 0x5a, 0x0e, 0x7d, + 0x00, 0xe2, 0x20, 0xe2, 0xb3, 0x23, 0xe2, 0x33, 0x79, 0x13, 0x3e, 0x3b, + 0x22, 0x3e, 0x93, 0xad, 0x7c, 0x40, 0x57, 0x88, 0xe8, 0x82, 0x9b, 0xd0, + 0x15, 0x22, 0xba, 0xa0, 0x85, 0xce, 0x82, 0x4e, 0xd4, 0x8b, 0xd8, 0x74, + 0x11, 0xbe, 0xf0, 0x45, 0xc5, 0x8a, 0x1d, 0xe0, 0xfa, 0x98, 0x56, 0xb4, + 0x11, 0x33, 0xb5, 0xdf, 0x63, 0x2f, 0xed, 0xd0, 0xc6, 0x1c, 0xb8, 0xc6, + 0x76, 0x53, 0xb0, 0xdd, 0x6a, 0xbc, 0xe3, 0xf7, 0x65, 0xc4, 0x8a, 0x2d, + 0x27, 0x87, 0xd9, 0x77, 0xb8, 0xa5, 0xe0, 0xaa, 0xbd, 0xf7, 0x29, 0x3b, + 0xeb, 0x73, 0x37, 0xf2, 0x01, 0x6a, 0x32, 0xfb, 0x8b, 0x9a, 0x21, 0x79, + 0x93, 0xb9, 0xfa, 0x9d, 0x36, 0x15, 0xbb, 0xa7, 0xb1, 0xff, 0x74, 0x33, + 0xaf, 0xc6, 0xab, 0xa8, 0x2c, 0x8b, 0x5d, 0xb2, 0x07, 0xbd, 0xc3, 0x6e, + 0xc4, 0xd2, 0x09, 0x1f, 0x59, 0x28, 0x03, 0x88, 0x8b, 0x10, 0x71, 0xed, + 0x2a, 0xdf, 0xe6, 0xbc, 0xd9, 0x43, 0xba, 0xfc, 0x44, 0xfa, 0x37, 0x75, + 0x4a, 0xdb, 0xa9, 0x66, 0xef, 0x63, 0x2e, 0xb6, 0x9e, 0xf3, 0x04, 0x65, + 0xb0, 0xda, 0x51, 0xc7, 0x2e, 0x54, 0x6d, 0x79, 0x01, 0x7c, 0x3a, 0x3c, + 0x17, 0x28, 0x72, 0xab, 0x9c, 0xb7, 0x9b, 0x75, 0xbc, 0x0b, 0xb5, 0xa9, + 0x3a, 0xe8, 0xa6, 0x4b, 0x9a, 0x9b, 0xe2, 0x2c, 0xb0, 0x58, 0xbd, 0x43, + 0xf4, 0x9d, 0x6e, 0xea, 0x07, 0x58, 0x3c, 0x59, 0xb5, 0xf4, 0x19, 0xd4, + 0xc8, 0x9f, 0x09, 0xfb, 0x7b, 0x4b, 0x47, 0xed, 0x9a, 0x44, 0xed, 0x9c, + 0x8a, 0x6b, 0xe7, 0xeb, 0xf2, 0xcf, 0x30, 0xd8, 0x45, 0x1a, 0xfa, 0xa3, + 0xd4, 0x47, 0x7f, 0xc4, 0xb5, 0xb3, 0x23, 0x3b, 0xdd, 0x7b, 0xfb, 0x20, + 0x6b, 0xdf, 0xf1, 0x3e, 0xf2, 0x58, 0x5c, 0x3d, 0x8b, 0x3e, 0xab, 0xf4, + 0x55, 0xb0, 0x67, 0x0d, 0x6a, 0xe0, 0x63, 0x83, 0xb7, 0x81, 0x77, 0xb0, + 0xd9, 0x42, 0xff, 0xd0, 0xa6, 0xea, 0xd2, 0x0a, 0x7b, 0xd6, 0xcc, 0x9b, + 0x38, 0xa3, 0xe2, 0xb9, 0xfe, 0xbd, 0xe2, 0xa6, 0xf2, 0xa2, 0xea, 0xa6, + 0xbd, 0x03, 0x32, 0x3d, 0x8a, 0x5e, 0xe8, 0xaf, 0x11, 0x9e, 0x7a, 0xf5, + 0x66, 0xec, 0x6a, 0x38, 0x7b, 0xb0, 0xfe, 0x82, 0x29, 0x9d, 0xa8, 0x9b, + 0x73, 0x57, 0xf5, 0x17, 0x51, 0x6f, 0x81, 0x81, 0x05, 0xf6, 0x2d, 0xd6, + 0x4b, 0x3d, 0x9d, 0x38, 0x63, 0x7b, 0xf3, 0x8c, 0x34, 0x7b, 0x75, 0xf4, + 0x13, 0x99, 0x1d, 0xea, 0xac, 0x60, 0x03, 0x73, 0xf4, 0x4d, 0x9c, 0xf7, + 0x3d, 0xec, 0xb9, 0x17, 0x6b, 0x2f, 0xe0, 0xac, 0xe9, 0xd5, 0xb3, 0x52, + 0x98, 0x0b, 0x44, 0xfe, 0x52, 0xe7, 0x19, 0x19, 0xf4, 0xb0, 0x17, 0x12, + 0xb2, 0xd6, 0xf5, 0x1d, 0x1d, 0x35, 0xa7, 0x46, 0x9c, 0x05, 0xee, 0x9d, + 0x62, 0xaf, 0xcc, 0xda, 0x64, 0x21, 0xbf, 0x63, 0x4c, 0x6f, 0x47, 0xdf, + 0xff, 0x37, 0xf4, 0x67, 0xba, 0xcc, 0x8c, 0x85, 0xe1, 0xb8, 0xff, 0x1b, + 0xc8, 0x82, 0x77, 0x8b, 0x5c, 0xbb, 0x88, 0xf7, 0x7c, 0x67, 0x49, 0xe2, + 0xe8, 0xad, 0x72, 0x96, 0x3d, 0xe9, 0x2e, 0xee, 0x6f, 0xc7, 0x4c, 0xc0, + 0x7a, 0x88, 0xeb, 0x22, 0x9f, 0xb5, 0x28, 0x4e, 0x0d, 0x5c, 0xd7, 0xe0, + 0x1a, 0x86, 0xaf, 0xfb, 0x1f, 0x80, 0x8f, 0x2e, 0x1f, 0x7a, 0x8c, 0x17, + 0xf4, 0x22, 0xd9, 0x2e, 0xc9, 0x57, 0x3d, 0xf4, 0xc7, 0x83, 0xa9, 0x3d, + 0xc0, 0xae, 0x7c, 0xfd, 0x7d, 0xac, 0x73, 0x5f, 0xbc, 0x6e, 0xb7, 0xac, + 0xe3, 0xbe, 0xce, 0x35, 0xd2, 0xcf, 0xc2, 0x16, 0x98, 0x41, 0x16, 0x39, + 0xcb, 0x70, 0x2e, 0x51, 0x33, 0x83, 0x4f, 0xdb, 0xbc, 0x56, 0x25, 0x4e, + 0x98, 0xc4, 0xcd, 0xcf, 0xeb, 0x88, 0x99, 0x7c, 0x32, 0xd6, 0x29, 0x0c, + 0x81, 0x85, 0xa9, 0x13, 0xaa, 0x67, 0x18, 0xb0, 0xb7, 0x09, 0xe7, 0x95, + 0xc1, 0x74, 0x91, 0x34, 0xf5, 0x36, 0xcc, 0xa0, 0xbd, 0x62, 0xcc, 0x31, + 0x4e, 0xaf, 0xcc, 0x44, 0xb9, 0x23, 0xec, 0x05, 0x58, 0x2f, 0x6d, 0xc4, + 0x3a, 0xfa, 0xeb, 0x45, 0x93, 0x38, 0x08, 0x5e, 0x9d, 0x62, 0x60, 0xd6, + 0x3a, 0xe0, 0xc7, 0xbc, 0xfe, 0x00, 0x5e, 0x92, 0xd4, 0xd1, 0xb3, 0x2c, + 0xa2, 0x67, 0x7b, 0xad, 0x4e, 0x5b, 0x90, 0x67, 0x5a, 0x66, 0xbc, 0x59, + 0xf6, 0x7d, 0xd0, 0x01, 0x73, 0xea, 0x58, 0x02, 0x36, 0x6c, 0x57, 0x7c, + 0xca, 0xb5, 0x7f, 0x87, 0xc4, 0x76, 0xf4, 0x15, 0x38, 0x0b, 0xcf, 0x0d, + 0xac, 0x41, 0x86, 0x76, 0xf8, 0xe9, 0x60, 0xad, 0xd9, 0x2b, 0xee, 0x85, + 0x4d, 0x0a, 0xd5, 0x7f, 0xc5, 0x73, 0x41, 0x1a, 0x38, 0x81, 0x3e, 0xb2, + 0x4b, 0xcc, 0xd3, 0xc8, 0xb1, 0x3a, 0xf7, 0xe3, 0x7e, 0x6e, 0x7f, 0xb4, + 0x4e, 0x1a, 0x0f, 0xe7, 0x73, 0x7e, 0x70, 0x53, 0x7b, 0x5b, 0xf6, 0xe9, + 0xf3, 0x4d, 0x9d, 0xb6, 0xc9, 0x2d, 0x32, 0xfe, 0x9c, 0x8d, 0xb9, 0xea, + 0xca, 0xbb, 0x09, 0xe1, 0xb3, 0x2d, 0x8b, 0x98, 0x43, 0x8c, 0x79, 0xf6, + 0xd8, 0xea, 0x6c, 0xd0, 0xbb, 0xce, 0x37, 0x21, 0x57, 0xb1, 0x8a, 0x7e, + 0xa7, 0xba, 0x16, 0xb5, 0x3d, 0x89, 0x3c, 0x67, 0x6e, 0x54, 0xd1, 0x5f, + 0xe2, 0x9d, 0xc2, 0xdf, 0x23, 0x88, 0xd9, 0x11, 0xf4, 0xf2, 0x1b, 0x62, + 0xbc, 0xc0, 0xbb, 0xe7, 0xf0, 0x8e, 0xfd, 0x7d, 0xb3, 0x4f, 0xe9, 0x47, + 0x0c, 0xea, 0x73, 0x8e, 0x4c, 0xae, 0xf6, 0xc7, 0x6b, 0xc4, 0xb9, 0x85, + 0xfd, 0x71, 0xdc, 0x1f, 0xba, 0xce, 0x79, 0xf6, 0x85, 0x51, 0x8f, 0xf8, + 0x2e, 0xfb, 0xee, 0x3a, 0x7b, 0xc3, 0x66, 0x8f, 0xb8, 0x84, 0x1e, 0x71, + 0xb2, 0xf1, 0x5d, 0xd8, 0xdf, 0x56, 0xbd, 0xee, 0x15, 0x9c, 0x78, 0x0f, + 0x38, 0x61, 0x5f, 0x99, 0xd1, 0x3d, 0xd6, 0xee, 0x02, 0xfe, 0xac, 0xcd, + 0xf4, 0x11, 0xb0, 0x33, 0x4b, 0x1f, 0x73, 0x26, 0x67, 0x2c, 0xb2, 0x56, + 0x6e, 0xc7, 0x3d, 0x7d, 0xc7, 0x19, 0x5a, 0xf5, 0x90, 0xc8, 0xb7, 0xd6, + 0xb9, 0x7e, 0x8b, 0xc2, 0x46, 0xe8, 0x49, 0xcc, 0x85, 0xae, 0x05, 0x73, + 0x06, 0x18, 0x44, 0x0c, 0x2e, 0x37, 0x9a, 0x31, 0x94, 0xf3, 0xc9, 0xd3, + 0xcd, 0x04, 0xf2, 0xea, 0xdd, 0xba, 0xd2, 0x37, 0x40, 0x0d, 0xa2, 0xbd, + 0x46, 0xd2, 0x7b, 0x95, 0x3d, 0x89, 0x07, 0x4d, 0x2c, 0x1f, 0x88, 0xb0, + 0xbc, 0xbf, 0x5e, 0x4c, 0xc4, 0x73, 0xda, 0xf5, 0xf8, 0x6c, 0x1a, 0xd7, + 0xe3, 0x73, 0xf2, 0x26, 0xf8, 0xbc, 0x06, 0x7b, 0x4d, 0x49, 0xcc, 0x63, + 0xbd, 0x96, 0x92, 0xa5, 0x61, 0x76, 0x0b, 0x0f, 0x61, 0x7f, 0x4a, 0x16, + 0x10, 0x3f, 0xec, 0xb5, 0xf4, 0xb9, 0xd6, 0xfd, 0x3d, 0x46, 0x13, 0xcf, + 0x13, 0x2a, 0x47, 0xf5, 0xf9, 0xd6, 0xb5, 0xf5, 0x58, 0x6b, 0x6f, 0xf9, + 0xbe, 0x72, 0xa3, 0x98, 0x24, 0x4e, 0x74, 0x00, 0xef, 0xb9, 0x8f, 0x31, + 0xc3, 0x1c, 0x61, 0xcc, 0xc5, 0x39, 0xd2, 0x45, 0x2c, 0x43, 0x0d, 0x88, + 0xf9, 0x60, 0xd6, 0xdb, 0xc5, 0x6f, 0x06, 0x8c, 0xa5, 0x24, 0xf6, 0xf5, + 0x4a, 0xdb, 0x1c, 0xe3, 0x89, 0xb3, 0xaa, 0xaa, 0x73, 0xc8, 0x63, 0xbc, + 0x3f, 0x8d, 0xfa, 0x50, 0xe7, 0xbe, 0x4e, 0x7e, 0xa7, 0x41, 0xac, 0xa8, + 0xba, 0x70, 0x44, 0x47, 0x6f, 0xbd, 0x58, 0xeb, 0x26, 0x6e, 0xcb, 0xe3, + 0xc3, 0xd4, 0xb1, 0x0c, 0xf4, 0x18, 0xf0, 0x73, 0x3a, 0x75, 0x6d, 0xea, + 0xb9, 0xa8, 0xf4, 0x24, 0xdf, 0x56, 0x5d, 0xbe, 0x0a, 0x5d, 0xf8, 0xce, + 0x75, 0x1c, 0xbd, 0x89, 0x71, 0x81, 0x9e, 0x40, 0xfe, 0x99, 0xa8, 0x45, + 0xe1, 0x7e, 0xf4, 0xe5, 0x98, 0x6f, 0x5c, 0xe7, 0xe7, 0xd0, 0x89, 0x3d, + 0x01, 0x73, 0x69, 0x51, 0xc9, 0x82, 0xe7, 0x7a, 0x53, 0x76, 0xca, 0xdc, + 0xa6, 0x74, 0x48, 0xaa, 0xf3, 0xdb, 0x8f, 0x86, 0xb2, 0xe4, 0x97, 0xd2, + 0xc0, 0xf7, 0xf4, 0x4b, 0xd8, 0x77, 0x32, 0xca, 0xfb, 0x04, 0xde, 0xcf, + 0xf8, 0xf1, 0xdc, 0x41, 0x7f, 0x87, 0xe1, 0x47, 0x88, 0x9f, 0xbc, 0xfc, + 0x49, 0xe1, 0x62, 0xc5, 0x57, 0x38, 0xa0, 0x66, 0xf8, 0x93, 0xf5, 0xf5, + 0x09, 0x85, 0x9b, 0xf3, 0xad, 0xbc, 0x24, 0xe2, 0xd5, 0xca, 0x87, 0x18, + 0xa2, 0xf0, 0xc9, 0x99, 0x55, 0xf8, 0x44, 0x7a, 0xec, 0xab, 0xc7, 0x38, + 0x9a, 0x00, 0x7e, 0x52, 0x4f, 0x62, 0x69, 0x4f, 0x74, 0xbf, 0x35, 0xc1, + 0x9c, 0x30, 0xe6, 0x9a, 0xfd, 0x2a, 0x6d, 0xd9, 0x76, 0xb4, 0x4b, 0xbc, + 0xb9, 0xa6, 0x5c, 0xe3, 0xf2, 0x0f, 0x25, 0xcf, 0xd5, 0x3c, 0xb1, 0x7e, + 0xfa, 0x46, 0x74, 0x76, 0x0b, 0xdd, 0xdf, 0x6f, 0x40, 0x87, 0xf5, 0xd3, + 0xa4, 0xe9, 0x5c, 0xed, 0x93, 0xf3, 0xab, 0x79, 0x14, 0x20, 0xcf, 0x48, + 0x7b, 0xed, 0x77, 0xb0, 0xd6, 0x9c, 0x8b, 0xfb, 0x53, 0xe6, 0x15, 0xcf, + 0x74, 0x1d, 0xce, 0x7c, 0xcd, 0x9c, 0x52, 0x36, 0xa5, 0x1d, 0x50, 0x83, + 0xdc, 0xf4, 0xb4, 0xc4, 0x79, 0x77, 0x25, 0xb7, 0xf6, 0xa8, 0x99, 0x65, + 0x24, 0xb3, 0x47, 0x61, 0xd8, 0xb5, 0xb9, 0xc5, 0xef, 0x87, 0xec, 0x9f, + 0x3a, 0x81, 0x19, 0xb4, 0x3f, 0xbf, 0x0d, 0x35, 0x31, 0xbf, 0x70, 0x8c, + 0xcf, 0x9f, 0x44, 0xcf, 0xac, 0x73, 0xec, 0xf5, 0xdf, 0x83, 0xfe, 0xec, + 0x99, 0x86, 0xa5, 0x9c, 0x84, 0x5d, 0x7d, 0xca, 0xb0, 0x57, 0xae, 0xcc, + 0x09, 0x37, 0xea, 0x7d, 0x6e, 0x33, 0x5b, 0x72, 0xf4, 0x46, 0x33, 0x03, + 0xbf, 0x97, 0x68, 0xf9, 0x63, 0x5a, 0x34, 0x3b, 0x72, 0x46, 0xb8, 0x1c, + 0x1a, 0x6a, 0x5e, 0x20, 0x1e, 0x71, 0x4e, 0xa8, 0xe2, 0xdc, 0x6e, 0xf5, + 0x1c, 0x2c, 0xf3, 0x4a, 0xbb, 0xd0, 0x1e, 0x56, 0x84, 0x2f, 0xb1, 0xdc, + 0x8f, 0x24, 0xd4, 0x37, 0x05, 0x3d, 0x17, 0xcb, 0x24, 0xc5, 0x67, 0xd9, + 0xf7, 0xd9, 0x51, 0x3d, 0xdd, 0x87, 0xeb, 0x9d, 0x72, 0x75, 0xdf, 0xa7, + 0xec, 0x8a, 0xf3, 0xc3, 0x70, 0x0a, 0x31, 0xf5, 0xb8, 0x1f, 0xcb, 0x8a, + 0xd8, 0xfe, 0x52, 0x8c, 0x6d, 0xf0, 0x97, 0x77, 0x39, 0x34, 0x87, 0x02, + 0xc8, 0xc2, 0xef, 0x97, 0x05, 0xcc, 0x1f, 0x94, 0x65, 0x52, 0xdb, 0xb9, + 0xfa, 0xcd, 0xf2, 0xda, 0x59, 0x83, 0xfe, 0xa3, 0x7f, 0x57, 0xfd, 0x87, + 0xbe, 0xac, 0x60, 0x5e, 0x00, 0xbe, 0xf7, 0xe8, 0xc4, 0x41, 0xb1, 0x12, + 0xf0, 0xc1, 0x39, 0xf8, 0x28, 0x40, 0xff, 0xf3, 0x91, 0xa8, 0xfe, 0x18, + 0x39, 0x37, 0x12, 0xe0, 0xde, 0x3f, 0x0b, 0x1f, 0x9b, 0x43, 0xae, 0xff, + 0x86, 0x9a, 0xeb, 0x2d, 0xcc, 0xb8, 0x4d, 0xdf, 0x0d, 0x47, 0xbe, 0x1b, + 0xaa, 0x5f, 0xad, 0xb3, 0xa3, 0x6f, 0x8d, 0x9e, 0xa9, 0x1b, 0xf5, 0x72, + 0xd8, 0xc7, 0xc3, 0x06, 0x19, 0xd8, 0xfb, 0xae, 0x68, 0x56, 0x6a, 0xce, + 0x1b, 0x4b, 0x3e, 0x7b, 0xbf, 0x76, 0x29, 0xa9, 0x13, 0xb5, 0xe6, 0xbc, + 0x65, 0xe7, 0x98, 0xe7, 0x88, 0x97, 0x3f, 0x83, 0x5f, 0x80, 0x7c, 0x6b, + 0x7e, 0x57, 0x98, 0x96, 0x04, 0xba, 0xa7, 0x30, 0x3c, 0xc7, 0x6f, 0x25, + 0x55, 0xd6, 0x14, 0x7e, 0x87, 0x00, 0x4e, 0x74, 0xb2, 0xce, 0xc4, 0xdf, + 0xb4, 0x2c, 0x59, 0xc0, 0x9e, 0x13, 0x1e, 0xbf, 0x41, 0xc5, 0xfe, 0xe7, + 0x3c, 0xcc, 0x39, 0xfa, 0xb3, 0xb0, 0x98, 0x6c, 0xdd, 0xcb, 0xdf, 0x7f, + 0x01, 0xe1, 0xdd, 0x07, 0x39, 0xf0, 0x17, 0x00, 0x00, 0x00 }; + +static const u32 bnx2_TPAT_b09FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_TPAT_b09FwRodata[(0x4/4) + 1] = { + 0x00000001, 0x00000000 }; + +static struct fw_info bnx2_tpat_fw_09 = { + /* Firmware version: 5.0.0j13 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x08000488, + + .text_addr = 0x08000400, + .text_len = 0x17ec, + .text_index = 0x0, + .gz_text = bnx2_TPAT_b09FwText, + .gz_text_len = sizeof(bnx2_TPAT_b09FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_TPAT_b09FwData, + + .sbss_addr = 0x08001c20, + .sbss_len = 0x3c, + .sbss_index = 0x0, + + .bss_addr = 0x08001c5c, + .bss_len = 0x344, + .bss_index = 0x0, + + .rodata_addr = 0x08001bec, + .rodata_len = 0x4, + .rodata_index = 0x0, + .rodata = bnx2_TPAT_b09FwRodata, +}; + +static u8 bnx2_TXP_b09FwText[] = { + 0xbd, 0x7b, 0x6d, 0x70, 0x5b, 0xd7, 0x79, 0xe6, 0x73, 0x2e, 0x00, 0xf2, + 0x02, 0x04, 0x41, 0x90, 0x82, 0x64, 0x70, 0xcb, 0x44, 0xb8, 0xe2, 0x05, + 0x05, 0x9b, 0xb4, 0x7d, 0x41, 0x82, 0x12, 0x54, 0x62, 0x2a, 0x44, 0xa6, + 0x25, 0xda, 0xa6, 0xd7, 0x8c, 0x57, 0x69, 0x99, 0xac, 0x67, 0x8d, 0x4a, + 0x94, 0x45, 0xcb, 0x92, 0x4d, 0xc7, 0x6e, 0x4b, 0x4f, 0xdd, 0xf2, 0x86, + 0xa2, 0x24, 0x4a, 0x02, 0x09, 0xf0, 0x43, 0x91, 0xd4, 0x69, 0x57, 0x34, + 0x49, 0x89, 0x92, 0x8d, 0x0f, 0x7f, 0xc7, 0x9e, 0x9d, 0xae, 0xb1, 0xb2, + 0x6c, 0xcb, 0x49, 0x6c, 0x25, 0xed, 0xee, 0x8c, 0xbb, 0xd3, 0x4e, 0xb8, + 0x96, 0x3f, 0xe4, 0x7c, 0x38, 0x4e, 0xbb, 0xdd, 0x4a, 0x8d, 0x93, 0xbb, + 0xcf, 0xb9, 0x20, 0x65, 0xc5, 0xf5, 0xec, 0xec, 0xf6, 0xc7, 0x72, 0x86, + 0x03, 0xe2, 0xde, 0x73, 0xcf, 0x79, 0xcf, 0x7b, 0xde, 0xf7, 0x79, 0x9e, + 0xf7, 0x9c, 0xcb, 0x1b, 0x00, 0x0f, 0x96, 0x7e, 0xaa, 0xf9, 0xdb, 0x3e, + 0x30, 0xf8, 0xa8, 0x71, 0x93, 0x71, 0x13, 0xda, 0xa2, 0xbb, 0xf8, 0xd5, + 0x25, 0x6f, 0xae, 0x13, 0x40, 0xea, 0xc7, 0xf8, 0x57, 0xfd, 0xac, 0xfa, + 0xd7, 0x3d, 0x86, 0xd1, 0x15, 0xe5, 0xcf, 0xbf, 0x75, 0x7d, 0x76, 0xcd, + 0x01, 0xf8, 0x97, 0xed, 0x94, 0xbf, 0x50, 0x95, 0x44, 0x68, 0xc3, 0x26, + 0x1d, 0xaa, 0x23, 0xf1, 0x5f, 0x3b, 0xb6, 0xeb, 0x40, 0x32, 0xd7, 0x1c, + 0xba, 0x05, 0xbf, 0xb2, 0xcc, 0x80, 0x13, 0xf2, 0xfa, 0x97, 0x12, 0x9f, + 0x0e, 0xfd, 0xe5, 0x7a, 0xed, 0x93, 0x19, 0x07, 0x54, 0x7f, 0xe2, 0x34, + 0xfc, 0x4d, 0x50, 0x1b, 0xf8, 0xcc, 0x9f, 0xaf, 0xad, 0x74, 0xc2, 0xb7, + 0xdc, 0x57, 0x02, 0xfb, 0x33, 0xc8, 0x3a, 0x12, 0x30, 0x95, 0x44, 0x38, + 0xb2, 0x1f, 0xe1, 0xd0, 0x1c, 0x42, 0xe8, 0xcc, 0xc1, 0x74, 0x24, 0x42, + 0xd8, 0x99, 0xfe, 0xb5, 0xb5, 0xe8, 0xb4, 0x87, 0xc3, 0xa2, 0x43, 0x7e, + 0x7e, 0x85, 0x3e, 0x13, 0x70, 0xea, 0x09, 0xec, 0xcb, 0xc0, 0x74, 0x26, + 0x04, 0xf6, 0xc6, 0xc2, 0xfe, 0x39, 0xfb, 0x7e, 0x08, 0xc3, 0x39, 0xf9, + 0xa9, 0xd1, 0x52, 0xcb, 0x1a, 0x31, 0x2c, 0xeb, 0xa4, 0x51, 0x09, 0xd3, + 0xaf, 0x05, 0x01, 0x81, 0x61, 0x43, 0x41, 0xd2, 0xbf, 0x29, 0xe4, 0x84, + 0x16, 0xdc, 0x81, 0x5f, 0xd2, 0xce, 0x64, 0xc4, 0x85, 0x72, 0xfb, 0x14, + 0x2a, 0x51, 0xf2, 0x97, 0x67, 0x3a, 0x9b, 0xb6, 0xac, 0xd7, 0x75, 0x27, + 0x4e, 0x72, 0x4e, 0xc3, 0xb9, 0x5f, 0x5a, 0x25, 0xce, 0x67, 0x44, 0x5f, + 0x1e, 0x5f, 0xc5, 0x8c, 0xdf, 0xb2, 0xe6, 0x78, 0x6f, 0x7f, 0x6e, 0xd9, + 0x37, 0x96, 0xa5, 0xe8, 0x96, 0xb5, 0x5d, 0xff, 0x67, 0x6b, 0xdb, 0x6f, + 0xb4, 0x8d, 0xe2, 0xc9, 0xac, 0x1f, 0x4f, 0x65, 0x92, 0xc8, 0xa5, 0x2d, + 0x38, 0x12, 0x4e, 0xf4, 0x8f, 0x85, 0xb0, 0x3b, 0xdf, 0x89, 0x7c, 0x5a, + 0x4b, 0x2d, 0xf2, 0xb9, 0x6d, 0x31, 0x1d, 0x7b, 0xf2, 0x5d, 0x58, 0x48, + 0xc3, 0x72, 0x27, 0xf4, 0x92, 0x5b, 0x44, 0xb0, 0x33, 0xdf, 0x8d, 0x42, + 0x5a, 0x3f, 0x3f, 0x2c, 0xc2, 0x83, 0xf5, 0x0e, 0x27, 0x1e, 0xca, 0xb7, + 0xe0, 0xc1, 0x7c, 0x9c, 0xcf, 0x58, 0xb8, 0x3d, 0xda, 0xc0, 0xf6, 0xad, + 0x38, 0x33, 0x6d, 0x59, 0x91, 0xa8, 0x1f, 0xfd, 0x79, 0x03, 0x0b, 0x59, + 0x05, 0xa9, 0x93, 0x4e, 0xa4, 0x9e, 0x00, 0x76, 0x3e, 0xd1, 0x8a, 0xb9, + 0xac, 0x85, 0x6d, 0xc6, 0x70, 0xbd, 0x02, 0x17, 0x52, 0x7e, 0x01, 0x97, + 0xee, 0xc3, 0x0e, 0xff, 0xb2, 0x0f, 0x05, 0x76, 0x3d, 0x11, 0xc1, 0x3b, + 0x69, 0x13, 0xb7, 0xb7, 0x07, 0x31, 0x98, 0x0f, 0xe0, 0x42, 0x3a, 0xc0, + 0x31, 0x0c, 0xbc, 0x9d, 0x56, 0x39, 0x4e, 0x0b, 0xce, 0xa5, 0x65, 0x1b, + 0xd9, 0xd6, 0x8b, 0xbe, 0x7c, 0x03, 0xde, 0x4a, 0x07, 0x39, 0x66, 0x00, + 0x6f, 0xb2, 0xdd, 0xfd, 0x79, 0x1d, 0xe7, 0xd9, 0xae, 0x3f, 0x1f, 0xc2, + 0x1b, 0x69, 0x2f, 0x6d, 0x0d, 0xe0, 0x6c, 0x7a, 0x00, 0x7b, 0xd3, 0xcd, + 0xe7, 0x6f, 0xa1, 0x0f, 0x43, 0x76, 0xe4, 0xc8, 0x6b, 0xef, 0x59, 0xdd, + 0x01, 0xf9, 0xb7, 0x1c, 0x67, 0x79, 0xdc, 0x01, 0x0c, 0xa7, 0xbf, 0xb3, + 0x14, 0xf3, 0x06, 0x0e, 0x66, 0x2f, 0x5b, 0x7f, 0xb9, 0xb6, 0x01, 0xa7, + 0x33, 0xc0, 0x99, 0x39, 0x60, 0x2e, 0x63, 0x5a, 0xd5, 0x09, 0xcb, 0x9a, + 0x6d, 0x6f, 0xa1, 0xbf, 0xf4, 0xde, 0x6d, 0x6c, 0xf5, 0x54, 0x91, 0x8b, + 0xff, 0x84, 0xd6, 0x5b, 0x82, 0x82, 0x99, 0x05, 0x27, 0x2a, 0xc6, 0xb4, + 0xae, 0x19, 0x68, 0xe7, 0x77, 0x32, 0x2b, 0x4e, 0x66, 0xb4, 0x1e, 0x13, + 0x43, 0x56, 0x30, 0xd1, 0x14, 0x6a, 0x71, 0x58, 0xf0, 0x31, 0x16, 0xd2, + 0x2d, 0x96, 0x55, 0xb3, 0xde, 0xb2, 0xde, 0x6a, 0x87, 0xa5, 0x24, 0xf4, + 0xf3, 0x45, 0xe8, 0xa5, 0x9f, 0x41, 0x1f, 0x3c, 0x8b, 0xd2, 0x97, 0xbc, + 0x08, 0xf7, 0x37, 0x3a, 0xc2, 0x03, 0x97, 0xf9, 0x6c, 0x75, 0x9e, 0x21, + 0xc8, 0xb9, 0xe8, 0x63, 0x40, 0xbe, 0xa8, 0xc2, 0xc9, 0xf9, 0xb4, 0x8c, + 0x59, 0x96, 0x53, 0xf7, 0xc2, 0x4b, 0xff, 0x6e, 0x39, 0x62, 0x59, 0x1f, + 0x18, 0x7e, 0x54, 0x70, 0x6d, 0x6e, 0x9d, 0xb0, 0x30, 0x6b, 0x9c, 0xa5, + 0x3f, 0x05, 0x52, 0x3d, 0x31, 0x3e, 0x13, 0x60, 0xfb, 0x38, 0xb6, 0x8c, + 0x05, 0xf1, 0x64, 0x46, 0xc5, 0x5f, 0xae, 0x8d, 0xa0, 0x8a, 0x7d, 0x79, + 0xe8, 0xab, 0x4a, 0xfa, 0x0f, 0x79, 0x86, 0x5b, 0xbe, 0x1c, 0x8f, 0xc8, + 0x2f, 0x72, 0x8e, 0x41, 0x3c, 0x5b, 0x0c, 0xe0, 0x99, 0xa2, 0x1f, 0x4f, + 0x17, 0x1b, 0xf0, 0x4a, 0xd1, 0xc0, 0xb1, 0xac, 0x36, 0x5a, 0x82, 0x85, + 0xea, 0xc4, 0x10, 0x6a, 0xda, 0x80, 0x0b, 0x33, 0x51, 0x8c, 0x67, 0x2d, + 0x2b, 0x47, 0xbb, 0x3d, 0x9c, 0xc7, 0xdb, 0x33, 0x5f, 0xc6, 0xa9, 0x69, + 0x27, 0x42, 0xb3, 0x01, 0x3c, 0x95, 0x76, 0xe2, 0xfa, 0x71, 0xcd, 0x9c, + 0x81, 0x1e, 0xd9, 0x2d, 0xf4, 0xe4, 0x0d, 0x42, 0xcb, 0x9a, 0xcc, 0x13, + 0x97, 0x50, 0xd0, 0x74, 0xca, 0x09, 0xbd, 0x10, 0x82, 0xab, 0x49, 0x85, + 0xde, 0xb4, 0x1d, 0xf0, 0x29, 0xa8, 0xd0, 0x0d, 0x6c, 0x99, 0x8c, 0xf0, + 0x5a, 0x80, 0xd7, 0xf0, 0xe5, 0x4a, 0x38, 0x56, 0x39, 0x40, 0xdf, 0xe9, + 0x0e, 0x24, 0x9d, 0x96, 0xe5, 0xd0, 0x5b, 0xf1, 0xf5, 0x6f, 0x5b, 0x56, + 0x63, 0x9b, 0x6c, 0xef, 0x47, 0x63, 0x81, 0x7e, 0x68, 0xa2, 0x5d, 0x19, + 0xda, 0x99, 0xa1, 0x9d, 0x19, 0xda, 0x99, 0x71, 0x30, 0x6e, 0x34, 0x03, + 0xd8, 0xc3, 0xf5, 0x0a, 0x71, 0x8e, 0xef, 0xd8, 0x6b, 0xf5, 0x4c, 0x31, + 0xc8, 0x39, 0x84, 0xec, 0x39, 0x9c, 0xc9, 0x0a, 0x28, 0xba, 0xd6, 0xb3, + 0x88, 0x8d, 0x68, 0x8c, 0x6a, 0xc9, 0x19, 0x24, 0xf9, 0x9c, 0x36, 0x6a, + 0x42, 0xeb, 0x2a, 0x31, 0x06, 0xb6, 0xf9, 0xe3, 0x58, 0xc8, 0xb8, 0x50, + 0xa5, 0x6b, 0x21, 0xae, 0x59, 0xa4, 0x84, 0x15, 0x78, 0xc0, 0xcf, 0x3e, + 0x95, 0x2b, 0x28, 0xe7, 0xff, 0xe3, 0x08, 0x4f, 0x2a, 0x98, 0x37, 0x1c, + 0xcc, 0x51, 0x03, 0x8e, 0x26, 0x0e, 0x57, 0x88, 0xf1, 0x93, 0xfd, 0x67, + 0x38, 0x16, 0xed, 0x61, 0x7f, 0xcc, 0x4d, 0xe9, 0xcb, 0x08, 0x6d, 0x18, + 0xb4, 0xed, 0x7d, 0xba, 0x98, 0x14, 0xe5, 0x18, 0x4a, 0x30, 0x66, 0xb4, + 0x10, 0x84, 0x16, 0x09, 0x09, 0xcd, 0x48, 0x0a, 0x3f, 0xe6, 0x8a, 0xaf, + 0xb0, 0x4d, 0xe0, 0x9a, 0x36, 0x30, 0x5d, 0x09, 0xbf, 0x6f, 0x2e, 0xdd, + 0x89, 0x91, 0x4c, 0x08, 0x7b, 0x73, 0x41, 0xdf, 0x6c, 0x5a, 0xf6, 0xa7, + 0x33, 0xb7, 0xe5, 0xbd, 0xc0, 0x35, 0xf7, 0x1a, 0xae, 0xb9, 0xe7, 0xc5, + 0xf0, 0xd4, 0x6f, 0x11, 0x2f, 0x6a, 0xb0, 0x57, 0xff, 0x84, 0x71, 0xa1, + 0xc7, 0xfb, 0x50, 0x8f, 0x45, 0xbf, 0x1f, 0x87, 0x8f, 0xfa, 0x30, 0x72, + 0xb4, 0x1a, 0x07, 0xa7, 0x1a, 0x52, 0x9e, 0xc4, 0x1f, 0x73, 0x9c, 0xc6, + 0x64, 0x9f, 0xd0, 0x06, 0x1c, 0xa2, 0x31, 0xd2, 0xc7, 0x38, 0x6d, 0xaa, + 0xb5, 0xac, 0xb3, 0x51, 0xc6, 0xb1, 0xd1, 0x6c, 0x6c, 0xe1, 0x44, 0x4b, + 0x3d, 0x5a, 0xd7, 0x7b, 0xf0, 0xe2, 0x4e, 0xc6, 0xd7, 0x5c, 0x14, 0x7d, + 0x0e, 0x38, 0x5a, 0xbc, 0xf8, 0x07, 0xeb, 0x09, 0xa7, 0xf4, 0xaf, 0x35, + 0xb4, 0xdd, 0x78, 0x44, 0x48, 0x4c, 0xab, 0xb8, 0x8a, 0x1b, 0xb2, 0x7f, + 0xf9, 0x0c, 0xd7, 0x88, 0xfd, 0xf4, 0x47, 0x9b, 0xe3, 0xfd, 0xb8, 0x6c, + 0x2d, 0x6e, 0xf5, 0x61, 0xef, 0x42, 0x35, 0x0e, 0x4d, 0xb9, 0x90, 0xac, + 0x15, 0xa8, 0xd1, 0x1b, 0x4b, 0x0f, 0x10, 0x43, 0xcd, 0x39, 0xf9, 0x9c, + 0x0f, 0xc7, 0x16, 0xca, 0xdf, 0x33, 0x57, 0xbf, 0x2f, 0xf7, 0x77, 0x89, + 0x6b, 0x27, 0xfd, 0x26, 0x31, 0x91, 0xae, 0x4e, 0x34, 0xe3, 0xf4, 0x54, + 0x80, 0x6b, 0xd8, 0x29, 0x9c, 0xa7, 0x56, 0xf9, 0x3c, 0xdf, 0xb6, 0xf0, + 0xba, 0xc1, 0xf5, 0xcc, 0x6c, 0x16, 0x9e, 0x53, 0x5d, 0xc2, 0x55, 0xb8, + 0x5b, 0x54, 0xcc, 0x7e, 0x43, 0xa8, 0xa7, 0x52, 0xa2, 0xb2, 0xd0, 0x42, + 0x1f, 0xf7, 0x0a, 0xf7, 0x29, 0x2d, 0x14, 0x12, 0xcc, 0x3a, 0xdf, 0x56, + 0xe1, 0x28, 0xc0, 0xaf, 0x24, 0x06, 0x85, 0x52, 0x60, 0x1f, 0x76, 0xac, + 0xc8, 0x71, 0x82, 0x5c, 0x1f, 0x10, 0x93, 0x2b, 0x89, 0x7f, 0x32, 0xaf, + 0x2f, 0xdb, 0x63, 0x55, 0x24, 0x0e, 0xe1, 0x7b, 0xc4, 0xaa, 0x5d, 0x51, + 0xe0, 0xc9, 0x22, 0xf3, 0x3c, 0xd3, 0x98, 0x0c, 0x0b, 0xcb, 0xaa, 0x0c, + 0x5b, 0xab, 0x2f, 0x1a, 0xcd, 0xfe, 0x3e, 0xfc, 0x93, 0x95, 0x0c, 0x0c, + 0xf7, 0xbb, 0x60, 0x46, 0xc8, 0x06, 0xc9, 0xef, 0xc7, 0x34, 0x7f, 0xce, + 0x5e, 0x6f, 0xd5, 0xee, 0x6f, 0x98, 0xfd, 0xed, 0x67, 0x7f, 0xaf, 0x19, + 0x5a, 0x70, 0x16, 0xd6, 0xea, 0x3e, 0xa3, 0x3c, 0xa7, 0x91, 0x62, 0x27, + 0xc7, 0x4a, 0xe0, 0x50, 0xe6, 0x69, 0x8e, 0x25, 0x79, 0xa0, 0x13, 0xdf, + 0x29, 0xc6, 0xf1, 0x7c, 0xb1, 0x85, 0x31, 0xda, 0xc5, 0xb9, 0x25, 0xf1, + 0x62, 0x31, 0x81, 0x17, 0x8a, 0x31, 0x3c, 0xc7, 0x58, 0x7d, 0xb6, 0x18, + 0xe1, 0xfc, 0x9d, 0xe2, 0x40, 0x5a, 0xc7, 0x19, 0x62, 0xdf, 0xa1, 0x5c, + 0x08, 0xa7, 0xd3, 0x8d, 0xa3, 0x1f, 0x41, 0x7b, 0x89, 0xc4, 0xe6, 0x1b, + 0xcd, 0xe9, 0x38, 0x95, 0xd6, 0x66, 0x80, 0xa0, 0x6f, 0x7f, 0xce, 0xef, + 0x1b, 0x4e, 0x07, 0x7c, 0xc3, 0x8c, 0x95, 0xbd, 0xe9, 0x06, 0xdf, 0xde, + 0xdc, 0x2f, 0x11, 0xaa, 0x83, 0xb9, 0x2a, 0xa1, 0xe2, 0x81, 0xa9, 0x5f, + 0x20, 0x55, 0x2b, 0x7d, 0xea, 0xc7, 0x83, 0x47, 0x89, 0x33, 0xd1, 0xe6, + 0xd4, 0x8d, 0xca, 0x4f, 0x61, 0xae, 0x2c, 0x5f, 0x1b, 0xe0, 0xb5, 0x9a, + 0x56, 0xf8, 0x2e, 0x14, 0x64, 0x6c, 0x01, 0xcf, 0x31, 0x9e, 0xbe, 0xd9, + 0xfa, 0x2b, 0x2b, 0x59, 0x67, 0xe3, 0xaf, 0xef, 0x85, 0x69, 0xa7, 0x6f, + 0x81, 0xfc, 0x72, 0xb2, 0x55, 0xe0, 0x79, 0xe3, 0x7f, 0xc0, 0xac, 0x5b, + 0xe6, 0xc1, 0xe4, 0xcc, 0xcb, 0x46, 0x12, 0x41, 0xfd, 0x3a, 0x11, 0x5f, + 0x81, 0x99, 0xe7, 0x8d, 0xbf, 0x5d, 0xba, 0xa7, 0xe2, 0x91, 0x29, 0x15, + 0xa9, 0xba, 0x72, 0xff, 0xf7, 0xb3, 0xff, 0x35, 0xd1, 0xe6, 0xd0, 0xbb, + 0x90, 0x39, 0x93, 0xc4, 0x29, 0xe3, 0xaf, 0x96, 0x78, 0x2b, 0x89, 0x7d, + 0x0b, 0x71, 0x1c, 0x20, 0x96, 0xed, 0x9a, 0xd2, 0xe2, 0x21, 0x25, 0x44, + 0x3f, 0xfc, 0x02, 0xc9, 0x95, 0x21, 0x3c, 0xbf, 0xd6, 0x8b, 0x14, 0xfd, + 0xb1, 0xef, 0x28, 0x92, 0xcf, 0x90, 0x03, 0x43, 0xab, 0x56, 0xc1, 0x41, + 0x4e, 0x70, 0xe8, 0x95, 0xc9, 0x95, 0xba, 0x07, 0xdb, 0xe7, 0x02, 0xf8, + 0x83, 0xe2, 0x26, 0x64, 0x19, 0x13, 0x0f, 0x65, 0x04, 0xea, 0x5b, 0x93, + 0x67, 0xeb, 0x11, 0x4e, 0x5e, 0x16, 0x01, 0xf4, 0xf3, 0xb9, 0x03, 0x47, + 0x03, 0xd8, 0xce, 0x75, 0xfe, 0xd8, 0x08, 0xf7, 0x3f, 0xc8, 0xbc, 0xde, + 0xc3, 0x6b, 0xe9, 0xa3, 0x2a, 0x0e, 0x47, 0x77, 0x88, 0xb2, 0x2f, 0x02, + 0xd8, 0x91, 0x81, 0xbf, 0x8a, 0x1c, 0xee, 0x49, 0x84, 0x47, 0x9f, 0xe2, + 0xf7, 0x87, 0x8b, 0x1e, 0xdf, 0xe6, 0x23, 0xf8, 0x96, 0x3b, 0xe1, 0xc3, + 0x0a, 0x72, 0xe3, 0x59, 0x23, 0x1c, 0xba, 0x8d, 0x18, 0xd4, 0x57, 0x54, + 0xf0, 0xc8, 0x9c, 0x07, 0x43, 0x53, 0x9f, 0x5a, 0x15, 0x31, 0x27, 0xfe, + 0x7e, 0xad, 0x07, 0xdf, 0x9c, 0x4b, 0x62, 0xec, 0x28, 0x42, 0xb9, 0xe8, + 0xef, 0x09, 0xb3, 0xb6, 0x9c, 0xb3, 0x95, 0x09, 0x79, 0xcd, 0xeb, 0xfb, + 0xe9, 0x74, 0x12, 0x13, 0x47, 0x37, 0xf5, 0xd2, 0x43, 0xa5, 0x7d, 0x51, + 0x07, 0x76, 0x45, 0x1d, 0x2b, 0x28, 0x4a, 0xfc, 0xd7, 0xb7, 0x86, 0x8f, + 0x6d, 0x12, 0x8e, 0x35, 0x6e, 0x84, 0x2f, 0xf7, 0x29, 0xa5, 0xec, 0x6a, + 0xd4, 0xe1, 0x9b, 0x0b, 0x49, 0x1c, 0x39, 0xea, 0xc1, 0x63, 0x53, 0xc3, + 0xdf, 0x5a, 0x49, 0x6c, 0x08, 0xb6, 0x6a, 0xe4, 0xcf, 0x04, 0x2e, 0x85, + 0xdd, 0xe8, 0x9f, 0xf3, 0xfa, 0x3e, 0x9e, 0xb6, 0x36, 0xbe, 0x4a, 0xce, + 0xdc, 0xbe, 0x50, 0x87, 0xed, 0x47, 0xdd, 0xd8, 0x39, 0xa5, 0x0d, 0x5c, + 0x64, 0xbe, 0xbe, 0x15, 0xae, 0x44, 0x2e, 0xda, 0xd8, 0xeb, 0x25, 0x7f, + 0xed, 0x88, 0x56, 0x61, 0xc7, 0x9c, 0x1b, 0x0f, 0x4f, 0xd5, 0xa1, 0xef, + 0xa8, 0x1f, 0xbb, 0x8e, 0x5a, 0x58, 0xd3, 0x1a, 0xc7, 0x04, 0x39, 0xfc, + 0x04, 0x73, 0xb2, 0x13, 0xda, 0x31, 0x89, 0xbf, 0xf7, 0x29, 0x49, 0xfc, + 0x63, 0x9b, 0x0b, 0x33, 0x75, 0x96, 0xb5, 0xb9, 0xb5, 0x39, 0xf9, 0x43, + 0xda, 0x5c, 0x97, 0xa0, 0xde, 0xaa, 0xd5, 0x8e, 0x01, 0xcd, 0x83, 0x4d, + 0xca, 0x3a, 0xb1, 0x48, 0xdf, 0x2f, 0x50, 0xa3, 0x04, 0x89, 0x31, 0xfe, + 0x4c, 0x19, 0x87, 0xfc, 0xc5, 0x06, 0x5f, 0x7d, 0x26, 0xe8, 0xab, 0x2f, + 0xc2, 0x57, 0xc1, 0x7c, 0x78, 0x96, 0xf1, 0xf1, 0x35, 0xc6, 0xc7, 0xcc, + 0x52, 0x7c, 0xbc, 0x32, 0x2d, 0x79, 0x41, 0xcb, 0xca, 0xf5, 0x3c, 0xb1, + 0xe0, 0xf4, 0x9d, 0x22, 0x17, 0xaf, 0xd0, 0xe3, 0xd8, 0x5f, 0x2c, 0xaf, + 0x7d, 0x3b, 0xf3, 0x28, 0x3d, 0xde, 0x18, 0x9a, 0x10, 0x41, 0x61, 0x72, + 0xdd, 0x47, 0x0a, 0x2a, 0xe7, 0xf1, 0x0e, 0x16, 0x6d, 0xae, 0x7d, 0x5e, + 0x48, 0x7c, 0x74, 0xea, 0x5d, 0x18, 0xcf, 0xa0, 0xd5, 0x91, 0xd0, 0x22, + 0x49, 0x72, 0xcc, 0xeb, 0x51, 0x24, 0x2a, 0x10, 0x4e, 0x5d, 0x24, 0x7f, + 0xbd, 0x15, 0xee, 0xc2, 0x18, 0xc7, 0xed, 0xce, 0xb9, 0xb1, 0xcd, 0x9e, + 0xa3, 0x5c, 0x0b, 0xea, 0x0a, 0x6a, 0xa5, 0xc3, 0x86, 0xd6, 0x75, 0x87, + 0xc0, 0xf7, 0xdd, 0x7c, 0xe6, 0x93, 0xb6, 0x70, 0xc9, 0xa0, 0xf6, 0x78, + 0x29, 0xd7, 0x85, 0x0c, 0xe7, 0x3e, 0xca, 0xf5, 0x71, 0x44, 0x1d, 0x22, + 0xe5, 0x57, 0x51, 0xcc, 0xd5, 0xe1, 0x21, 0xda, 0x72, 0x29, 0x2a, 0x44, + 0xb2, 0xc2, 0x8b, 0xd3, 0xb9, 0x24, 0xb2, 0x8c, 0x07, 0x57, 0x2b, 0x39, + 0x3a, 0x50, 0x81, 0x48, 0x93, 0xc2, 0x5f, 0x99, 0x93, 0x01, 0xdf, 0xe1, + 0xe9, 0x06, 0xdf, 0x3e, 0xf2, 0xd7, 0xce, 0x8c, 0xc2, 0xb8, 0xb4, 0xac, + 0xbe, 0xa8, 0x85, 0xdb, 0xb8, 0x06, 0x67, 0xc8, 0x87, 0x43, 0xc4, 0xf7, + 0xd3, 0x45, 0x89, 0x43, 0x7f, 0x26, 0xca, 0x7c, 0x20, 0x6d, 0x3f, 0xbf, + 0xf4, 0x37, 0x30, 0x39, 0x4e, 0x9c, 0x5b, 0x55, 0x8e, 0xaf, 0xc7, 0x32, + 0xaf, 0x58, 0x2e, 0x5d, 0x9f, 0x09, 0x3b, 0x02, 0x78, 0xb4, 0xe8, 0xc5, + 0xfd, 0x19, 0xed, 0x72, 0xbb, 0xf0, 0x62, 0x88, 0xf1, 0xfe, 0x07, 0xcc, + 0x8f, 0x19, 0xbb, 0x5d, 0xc5, 0x52, 0x9e, 0x04, 0xf0, 0x40, 0xc6, 0xfa, + 0xb9, 0x37, 0xf1, 0x6b, 0x6b, 0xa4, 0x5d, 0xef, 0xe9, 0x63, 0x1c, 0xef, + 0x62, 0xbb, 0x47, 0xe6, 0xe4, 0x7a, 0x90, 0x0a, 0x3d, 0xc4, 0x32, 0x05, + 0xbe, 0x1f, 0x16, 0x2e, 0x4b, 0x8e, 0xe0, 0xba, 0x68, 0xd6, 0x62, 0x40, + 0xe6, 0x5f, 0x8a, 0x63, 0x4b, 0x0c, 0x10, 0x98, 0xb8, 0x29, 0xfc, 0xf4, + 0x7a, 0xe5, 0x3a, 0x94, 0xea, 0x88, 0x25, 0x19, 0x5b, 0x6b, 0xd6, 0x5c, + 0xa7, 0xbf, 0x85, 0xef, 0xf8, 0xe5, 0xbc, 0x06, 0xc5, 0x71, 0xea, 0xd2, + 0x50, 0x25, 0x6a, 0x56, 0xea, 0x3f, 0xc1, 0x0b, 0x3d, 0xe5, 0xb9, 0x1e, + 0x4c, 0x27, 0x15, 0x97, 0x0e, 0x7f, 0x20, 0xd1, 0x29, 0x0e, 0x92, 0x4b, + 0x4e, 0xa4, 0xbb, 0xc4, 0x89, 0xdc, 0xdd, 0xc2, 0x9c, 0xf9, 0x86, 0x30, + 0xe7, 0x53, 0xc2, 0xcc, 0xf5, 0xf2, 0x73, 0xab, 0xd8, 0x97, 0x1b, 0x14, + 0xd3, 0x39, 0xd9, 0x2f, 0x31, 0x8b, 0xbe, 0x7d, 0x91, 0xfd, 0xbf, 0x90, + 0x21, 0x76, 0x65, 0x88, 0x55, 0x19, 0x62, 0x55, 0x86, 0x18, 0x96, 0x89, + 0x2c, 0xe1, 0x6a, 0x0f, 0x71, 0xb0, 0x1c, 0x7f, 0x53, 0x47, 0x65, 0x8c, + 0x69, 0xa7, 0x43, 0x8c, 0xbd, 0x5d, 0xad, 0x7f, 0x62, 0x25, 0x57, 0xca, + 0x58, 0xf3, 0xe3, 0x81, 0xa3, 0x71, 0xda, 0x47, 0x2d, 0x19, 0x9d, 0xc5, + 0xad, 0x7e, 0xf2, 0x21, 0xb4, 0x19, 0x13, 0xef, 0x4b, 0xdd, 0x3b, 0xba, + 0x88, 0xbf, 0xfa, 0x75, 0xc8, 0xf6, 0xcd, 0x87, 0x8a, 0xe4, 0x98, 0x89, + 0x9b, 0xa4, 0xae, 0x1e, 0x14, 0x43, 0x52, 0x57, 0x57, 0x42, 0x75, 0x4a, + 0x1d, 0x9b, 0x19, 0x14, 0x7d, 0xb6, 0xde, 0x3e, 0x84, 0xdd, 0xc4, 0xea, + 0xc3, 0xd1, 0xc6, 0x9e, 0xfb, 0x88, 0xd1, 0xb7, 0x11, 0xa3, 0x23, 0x51, + 0x15, 0xca, 0x8d, 0x57, 0x88, 0xd1, 0xb2, 0x0f, 0x3b, 0xae, 0x92, 0x0f, + 0xc5, 0x12, 0xd8, 0x9b, 0xd1, 0x66, 0x16, 0x81, 0x9a, 0x6a, 0x5d, 0xe0, + 0x0d, 0xc6, 0xd4, 0x81, 0xa2, 0x66, 0x5c, 0x40, 0xe3, 0x68, 0x4c, 0x81, + 0xa9, 0x26, 0x2c, 0xfc, 0xb7, 0xa8, 0x0b, 0x7b, 0xa8, 0x3d, 0x2b, 0xf5, + 0x4d, 0x98, 0x9a, 0x12, 0xc4, 0xc0, 0xe4, 0x70, 0x1d, 0xfd, 0x5a, 0xb9, + 0x0e, 0x01, 0x42, 0xa5, 0x70, 0x27, 0x24, 0x1e, 0x00, 0xe7, 0xe8, 0x87, + 0x13, 0x99, 0x75, 0x78, 0x99, 0xb8, 0xfe, 0x92, 0xe1, 0xc4, 0x8f, 0x72, + 0x0c, 0xfd, 0x15, 0xe1, 0x63, 0x57, 0xe0, 0xf1, 0x55, 0x1e, 0x81, 0x1c, + 0xef, 0x5b, 0x0e, 0x6a, 0xc2, 0x9f, 0xf1, 0xfe, 0xf7, 0xc2, 0xe1, 0xc8, + 0x9c, 0x80, 0xdf, 0x9b, 0xb0, 0x56, 0xef, 0x8a, 0x56, 0x60, 0xb2, 0xc9, + 0x47, 0xce, 0x4c, 0x09, 0x57, 0x3e, 0x7c, 0x6c, 0xb7, 0xf2, 0x0d, 0x51, + 0x71, 0x12, 0x38, 0x54, 0xec, 0x15, 0x75, 0x27, 0x55, 0x62, 0x9c, 0xe4, + 0xb9, 0x04, 0x8e, 0x73, 0xdd, 0x82, 0xba, 0x82, 0xf8, 0xbf, 0x13, 0xb8, + 0x4e, 0x4f, 0xe2, 0x91, 0x75, 0x5f, 0x97, 0xf1, 0xc5, 0x7b, 0x01, 0xdf, + 0xea, 0x71, 0x2d, 0x94, 0x54, 0x3a, 0xc5, 0xea, 0x42, 0x83, 0xaf, 0x6e, + 0xbc, 0x4b, 0xd4, 0x91, 0xf7, 0x56, 0xce, 0x6e, 0x15, 0x2b, 0x0a, 0x92, + 0xe7, 0xe0, 0x5f, 0x49, 0x3f, 0xad, 0x2c, 0xd4, 0x3b, 0xca, 0x3a, 0xc2, + 0x8d, 0xc1, 0x29, 0x89, 0x1b, 0x55, 0xe8, 0x67, 0xbe, 0xd4, 0xb4, 0x69, + 0xf1, 0x8b, 0xc2, 0x82, 0x12, 0xd5, 0x06, 0xde, 0x65, 0x83, 0x1f, 0x84, + 0x2d, 0xcb, 0xdf, 0x2a, 0xf3, 0x8f, 0xfe, 0x57, 0xba, 0x64, 0x4d, 0xf3, + 0x95, 0xfa, 0x84, 0xc4, 0x31, 0xe6, 0x9c, 0x2e, 0x73, 0xce, 0x8d, 0xdd, + 0x76, 0xbe, 0x49, 0xae, 0xb5, 0x70, 0x28, 0x7a, 0x35, 0xdf, 0x5a, 0x2a, + 0x88, 0x41, 0x1b, 0xc3, 0xe1, 0xd2, 0x2b, 0x90, 0x7a, 0x1f, 0xb8, 0x8b, + 0xda, 0xa3, 0x3f, 0x13, 0x20, 0x5e, 0x85, 0x83, 0x75, 0xc2, 0x89, 0x5b, + 0x18, 0x4b, 0xef, 0x2f, 0xe5, 0xd0, 0x1e, 0xe6, 0xd0, 0x39, 0xe6, 0x50, + 0x8e, 0x39, 0x94, 0x63, 0xee, 0x6c, 0x63, 0x0e, 0x3d, 0x63, 0xe7, 0x4f, + 0x00, 0xb3, 0xc5, 0xd7, 0x14, 0x19, 0xdb, 0x50, 0x58, 0x0b, 0x10, 0x67, + 0x53, 0x57, 0x71, 0xf5, 0xa9, 0x5f, 0x9b, 0x2b, 0xa5, 0xd6, 0xa8, 0x43, + 0x6a, 0x41, 0xe6, 0xaa, 0x87, 0x73, 0x91, 0xeb, 0x8d, 0xd5, 0xf5, 0xad, + 0x7b, 0x1f, 0xab, 0x87, 0x46, 0xac, 0x8f, 0xa0, 0x92, 0x38, 0xb9, 0x93, + 0x38, 0xf9, 0xe0, 0xf4, 0x7f, 0x60, 0x3f, 0xe4, 0xb7, 0x85, 0x00, 0x1e, + 0x64, 0xdc, 0xbd, 0xd5, 0xfe, 0x75, 0xbb, 0xff, 0x3d, 0xc5, 0x09, 0xa5, + 0xec, 0x8b, 0x72, 0x0e, 0x71, 0x19, 0xad, 0xaf, 0x30, 0xff, 0x67, 0x68, + 0xef, 0x4b, 0x69, 0x98, 0xf5, 0x89, 0x70, 0xb6, 0xde, 0xf1, 0x2c, 0xdb, + 0x78, 0xf1, 0x6c, 0x4e, 0x62, 0xd8, 0x98, 0x1d, 0x73, 0x2b, 0x74, 0x97, + 0xe4, 0x32, 0xb3, 0x3a, 0xa1, 0xfa, 0x4e, 0x1d, 0x49, 0xe2, 0xaf, 0x8d, + 0x4d, 0x4b, 0x79, 0x3a, 0x28, 0xb2, 0x8c, 0x43, 0xa6, 0xad, 0xcc, 0x7d, + 0xdf, 0xe4, 0x34, 0x5c, 0xb4, 0x29, 0x54, 0x49, 0xbe, 0xe8, 0x6d, 0x0d, + 0x0f, 0x3a, 0x1c, 0xdd, 0x22, 0x93, 0x0b, 0xf8, 0x46, 0xd3, 0xbc, 0xc9, + 0x9c, 0x1a, 0xa5, 0x1f, 0x86, 0x99, 0x53, 0xc3, 0x5f, 0x90, 0x53, 0x07, + 0x98, 0x53, 0xe3, 0xb9, 0x8f, 0xa5, 0x7d, 0xcc, 0x45, 0x20, 0x4b, 0x5f, + 0x4d, 0x36, 0x95, 0x63, 0xa1, 0xa6, 0xc9, 0x5a, 0x7d, 0x29, 0xfa, 0xbb, + 0xf6, 0x3a, 0x8e, 0x16, 0xbb, 0xf9, 0x4c, 0xfd, 0x12, 0xb7, 0xfa, 0x7d, + 0x87, 0xd2, 0x9d, 0xe2, 0x90, 0xcd, 0xf3, 0x30, 0xbd, 0xe4, 0x9c, 0x55, + 0x7a, 0x97, 0xd8, 0x6b, 0xe7, 0x26, 0xc7, 0x78, 0x42, 0xe6, 0x27, 0xc7, + 0x39, 0x29, 0xf3, 0x93, 0x63, 0xe5, 0x65, 0x8e, 0x72, 0xbc, 0x93, 0x32, + 0x4f, 0xb7, 0x8a, 0x6f, 0xe7, 0x65, 0xae, 0xca, 0xfc, 0x5d, 0xce, 0x57, + 0xf8, 0x9d, 0x09, 0x99, 0xaf, 0x32, 0x6f, 0x07, 0xc5, 0x48, 0x9e, 0xf8, + 0xc7, 0xfe, 0x0f, 0xd3, 0xee, 0xbd, 0xe9, 0xf7, 0xe4, 0xf8, 0x1c, 0x43, + 0x62, 0x8c, 0xcc, 0xc3, 0x4b, 0xb4, 0x55, 0x62, 0xcc, 0x32, 0xff, 0xcb, + 0x9f, 0xdf, 0x76, 0xb0, 0x5c, 0x71, 0x94, 0xe7, 0xb0, 0x68, 0xeb, 0xed, + 0x57, 0x8a, 0x56, 0x68, 0x75, 0x02, 0xa9, 0x4a, 0xc6, 0x92, 0x3b, 0xe1, + 0xa7, 0xde, 0xfe, 0x95, 0x75, 0x65, 0xbd, 0x6a, 0xbc, 0x9b, 0xbb, 0xb6, + 0xa6, 0x80, 0x6f, 0x43, 0x1e, 0x5f, 0xf0, 0x63, 0x21, 0x98, 0xf8, 0x95, + 0x55, 0xb7, 0x1e, 0xbe, 0xd6, 0xbc, 0x33, 0x45, 0x7e, 0xee, 0x19, 0x18, + 0x1b, 0xb2, 0x6a, 0x99, 0x0f, 0xbe, 0x84, 0x3e, 0x58, 0xab, 0x78, 0xe3, + 0x3f, 0x6d, 0x77, 0x8b, 0xb7, 0xda, 0x83, 0xdd, 0x3f, 0x23, 0x1f, 0x78, + 0x74, 0xf4, 0xec, 0xce, 0xc7, 0x9d, 0x97, 0xc8, 0x49, 0x37, 0xb0, 0xae, + 0x0b, 0xe5, 0x1b, 0xba, 0xdf, 0xa7, 0x56, 0xa9, 0x88, 0x3e, 0x7c, 0xf3, + 0xb9, 0xb8, 0xf2, 0x65, 0x17, 0x6a, 0x58, 0x57, 0x3e, 0x57, 0xda, 0xaf, + 0x57, 0x52, 0x17, 0xab, 0x18, 0x2e, 0xca, 0xfb, 0xab, 0xe1, 0x4e, 0xe0, + 0xd3, 0x48, 0xbb, 0x1e, 0x3c, 0x8d, 0xb3, 0x9a, 0xac, 0x33, 0x46, 0x8a, + 0xaa, 0xfa, 0x8b, 0xb4, 0xfb, 0xf7, 0x6a, 0x12, 0xf8, 0xa4, 0x4e, 0xd7, + 0x07, 0x5a, 0x15, 0x3f, 0x3e, 0x69, 0x6f, 0x4a, 0xfd, 0x40, 0x34, 0xf5, + 0x5f, 0x10, 0x02, 0x4f, 0xde, 0x28, 0x70, 0xf8, 0xc6, 0x70, 0xfc, 0x0e, + 0xe1, 0xc6, 0x62, 0x8f, 0x97, 0xfa, 0xb5, 0x21, 0xa5, 0x50, 0x5b, 0x7d, + 0x9d, 0x5c, 0xb7, 0x9a, 0xf5, 0xd7, 0x89, 0x39, 0x3c, 0x1e, 0x6f, 0xf3, + 0x53, 0xbf, 0x32, 0x51, 0x17, 0xa4, 0xbe, 0xed, 0x82, 0x59, 0x74, 0xa0, + 0x44, 0x0c, 0x32, 0x8b, 0x48, 0x55, 0x24, 0x5a, 0x3a, 0x4b, 0xb9, 0x17, + 0x9d, 0xe5, 0x3c, 0xf6, 0xf9, 0x96, 0xf8, 0x42, 0xad, 0x4d, 0x8c, 0x6e, + 0x88, 0x36, 0x41, 0xad, 0x4b, 0xa8, 0xbf, 0x7d, 0x77, 0x13, 0xe0, 0x1a, + 0x17, 0x98, 0x8b, 0x0b, 0xf4, 0x19, 0x9f, 0xb2, 0xd6, 0xb7, 0xdb, 0x88, + 0x8a, 0x71, 0x0f, 0xd7, 0xc0, 0xb4, 0x3c, 0x7a, 0x52, 0x79, 0x43, 0x1f, + 0xc2, 0x4f, 0x98, 0x83, 0xb2, 0xa6, 0xfa, 0x31, 0x42, 0xa8, 0x28, 0x74, + 0xe2, 0x60, 0x51, 0x87, 0x5a, 0x90, 0xb9, 0x91, 0x20, 0xe7, 0x0e, 0x8a, + 0x3d, 0x8c, 0xcf, 0x19, 0x17, 0xd4, 0x7a, 0x7d, 0x50, 0x3c, 0x96, 0x53, + 0xc5, 0x60, 0x76, 0x13, 0x8e, 0xcd, 0x6d, 0x42, 0x86, 0x98, 0xf6, 0x71, + 0xb4, 0x06, 0xa5, 0x5a, 0x54, 0x57, 0xeb, 0xb8, 0x7c, 0x56, 0x17, 0x8e, + 0x7b, 0x5b, 0x1a, 0xb0, 0xb8, 0xe2, 0xec, 0xf5, 0x15, 0xf8, 0xc4, 0x9a, + 0xd3, 0x37, 0x85, 0x58, 0x6d, 0x45, 0x9d, 0xb8, 0x20, 0x31, 0xe1, 0x1d, + 0xea, 0x83, 0x24, 0xe3, 0x92, 0x7a, 0x38, 0x2e, 0xce, 0xe5, 0x7e, 0xcf, + 0x59, 0xce, 0xa3, 0x26, 0xbc, 0xe5, 0x47, 0x8d, 0x4f, 0xbf, 0x01, 0x6f, + 0xfb, 0x55, 0x53, 0x49, 0x98, 0xb8, 0x37, 0x06, 0x5c, 0x99, 0xea, 0xa1, + 0xb6, 0xb7, 0x10, 0x6f, 0xfb, 0x07, 0xab, 0xe6, 0x3a, 0xf9, 0xdc, 0xcd, + 0xee, 0xa5, 0x39, 0x7e, 0x41, 0x1f, 0x4e, 0x62, 0x71, 0x73, 0x72, 0x0e, + 0x55, 0xc0, 0x4a, 0x6a, 0x32, 0xd6, 0xc4, 0x0f, 0xb0, 0x6e, 0xd8, 0x12, + 0x6e, 0xee, 0x7a, 0x9f, 0x89, 0x15, 0x5a, 0xd9, 0x98, 0x9a, 0x43, 0xf2, + 0x7a, 0xef, 0x92, 0x1d, 0xcf, 0xe2, 0x71, 0xf9, 0x9c, 0xec, 0xe7, 0x9a, + 0xb8, 0xcb, 0x33, 0xee, 0x2e, 0x2c, 0xf1, 0xee, 0xd5, 0xfb, 0xea, 0x6f, + 0x25, 0xd4, 0x8e, 0x3f, 0x5e, 0xfb, 0x45, 0xd7, 0x23, 0x5f, 0x70, 0xbd, + 0x54, 0xeb, 0xb4, 0x75, 0x7b, 0x52, 0x91, 0x7b, 0x3f, 0xce, 0xc4, 0xee, + 0x8e, 0x11, 0xfd, 0xdf, 0xb0, 0x86, 0x94, 0xf5, 0xa3, 0xc4, 0x9e, 0xe5, + 0x78, 0xfe, 0x8d, 0xb8, 0xe5, 0xfa, 0xb9, 0x45, 0xd5, 0xa4, 0x69, 0xd5, + 0xe9, 0xcf, 0x71, 0x3d, 0x87, 0xd0, 0x17, 0x4d, 0x90, 0xeb, 0xb4, 0x9e, + 0xaf, 0x42, 0x4f, 0xde, 0x2d, 0xe4, 0x5a, 0xb8, 0x85, 0x63, 0x72, 0xe9, + 0x9e, 0x61, 0x12, 0xef, 0x4b, 0xe4, 0x94, 0x24, 0x75, 0x02, 0x03, 0xb0, + 0x10, 0x50, 0x9d, 0x85, 0xa0, 0x5a, 0x51, 0x68, 0x50, 0x2b, 0xd9, 0xce, + 0x3b, 0xa9, 0x5d, 0xfe, 0x2a, 0x86, 0x70, 0xb9, 0xcd, 0x43, 0x2c, 0xd2, + 0xfc, 0xf5, 0x8e, 0x21, 0x8c, 0x44, 0xe5, 0xb3, 0x9d, 0x8c, 0x55, 0x88, + 0xda, 0x71, 0x13, 0x5e, 0xe2, 0xf1, 0xbe, 0x76, 0x6d, 0x70, 0x8d, 0xa2, + 0x77, 0xfd, 0xbd, 0x70, 0xaa, 0xee, 0x02, 0x84, 0x6f, 0x5c, 0xc1, 0xb1, + 0x76, 0xb8, 0xdd, 0xeb, 0xb4, 0xfe, 0xb3, 0x62, 0x10, 0x4f, 0x45, 0xc3, + 0x3d, 0x3b, 0x44, 0x48, 0xf5, 0xf0, 0x9e, 0x6b, 0x1c, 0x42, 0x1d, 0x37, + 0xdd, 0xae, 0x75, 0x5a, 0x50, 0x11, 0x49, 0xf4, 0xe9, 0xba, 0x31, 0x09, + 0x95, 0x63, 0x42, 0x54, 0x8e, 0x6b, 0x97, 0xdf, 0xa5, 0x4e, 0xbb, 0xc2, + 0xba, 0xb4, 0xb5, 0x2d, 0x3c, 0xda, 0xab, 0xe8, 0x6a, 0x2d, 0xaf, 0x3b, + 0xc7, 0xbd, 0xb8, 0xf9, 0xc8, 0x72, 0x3d, 0x6d, 0x59, 0x1f, 0x47, 0x4b, + 0xf7, 0xd3, 0x55, 0x6a, 0x75, 0x21, 0xa2, 0x7a, 0x0b, 0x5e, 0x34, 0x1f, + 0x91, 0x35, 0xb6, 0xac, 0x89, 0x4a, 0x5f, 0xf1, 0xa0, 0x85, 0x73, 0xec, + 0xc1, 0x5c, 0x5a, 0xd6, 0x51, 0x09, 0xcc, 0x12, 0xe7, 0xf5, 0xb1, 0x06, + 0xd6, 0x22, 0xac, 0x9d, 0xd3, 0xb2, 0xee, 0x4e, 0x61, 0x6f, 0xb1, 0x87, + 0xf6, 0x77, 0x33, 0xaf, 0x7a, 0x19, 0x93, 0xd2, 0xc7, 0xf7, 0x90, 0x6f, + 0x25, 0x1e, 0xc0, 0xdd, 0xd8, 0x5e, 0x25, 0x22, 0x13, 0xb5, 0xd8, 0x95, + 0x8d, 0xc8, 0x5a, 0xbc, 0xcb, 0x64, 0xce, 0x6f, 0x21, 0x27, 0xb1, 0xde, + 0xee, 0x2f, 0xd1, 0x36, 0x35, 0xaa, 0xe0, 0x5d, 0xff, 0xdf, 0xed, 0xf7, + 0xc6, 0xa0, 0x7a, 0x75, 0xa9, 0xcf, 0xff, 0xcc, 0xb3, 0xa9, 0x1d, 0xd8, + 0x32, 0xfd, 0xe7, 0x9e, 0x3b, 0xda, 0x67, 0x3c, 0x9b, 0xdb, 0x2d, 0xeb, + 0x0a, 0x57, 0x47, 0xe2, 0xc7, 0xe0, 0x98, 0xc9, 0x6b, 0x72, 0x6f, 0xcd, + 0x89, 0x38, 0xbf, 0x5f, 0x20, 0x0e, 0xdc, 0x9c, 0xaf, 0xc7, 0x8e, 0x09, + 0x07, 0xe6, 0x8c, 0x71, 0xf4, 0xf9, 0x15, 0xf4, 0x45, 0xf2, 0x30, 0x03, + 0x0a, 0xd7, 0xf5, 0xcf, 0xb1, 0xc3, 0xef, 0x60, 0x9c, 0x3e, 0x8b, 0x87, + 0xfc, 0xf3, 0x9e, 0x5b, 0xdb, 0xa1, 0x7a, 0xf4, 0x2d, 0x38, 0x54, 0x5b, + 0xae, 0xcb, 0xf1, 0x55, 0x98, 0xb2, 0x1e, 0x60, 0xbc, 0xb8, 0xf7, 0xc6, + 0xea, 0xb0, 0x33, 0x6b, 0xe1, 0x5d, 0x43, 0x1b, 0xbc, 0x13, 0xe6, 0xf9, + 0x1a, 0xea, 0x00, 0x7d, 0xad, 0xb4, 0x05, 0xee, 0xbb, 0xda, 0xeb, 0xf1, + 0xfe, 0x84, 0xe9, 0xee, 0x6e, 0x8f, 0xe0, 0xc0, 0x98, 0xc5, 0x71, 0xb0, + 0xd2, 0x81, 0x70, 0xef, 0x16, 0x4a, 0x03, 0x27, 0x90, 0x22, 0xa7, 0x18, + 0x8f, 0x09, 0xab, 0x42, 0x5d, 0xcf, 0x6c, 0xc9, 0x3b, 0x11, 0xc9, 0xb7, + 0xe0, 0xc7, 0x63, 0x11, 0x44, 0xc2, 0x12, 0xa3, 0x0c, 0xfc, 0x74, 0xcc, + 0x8b, 0x96, 0x7c, 0x0c, 0xef, 0x8f, 0xf9, 0x11, 0x26, 0x3e, 0xbf, 0x37, + 0x16, 0x80, 0x9e, 0x6f, 0xc0, 0xc5, 0xb1, 0x20, 0x1a, 0xf3, 0x21, 0x7c, + 0x38, 0x26, 0x73, 0xb9, 0x01, 0x6b, 0xf3, 0x3a, 0xde, 0x1d, 0x0b, 0x61, + 0x4d, 0x3e, 0x82, 0x2b, 0x63, 0x09, 0xb7, 0xdc, 0x77, 0x93, 0x73, 0xbe, + 0x35, 0x2d, 0xf7, 0x81, 0xe0, 0x7e, 0x8c, 0x79, 0xe7, 0xca, 0x7b, 0xc5, + 0xce, 0x74, 0x00, 0x0a, 0xfb, 0xae, 0xcc, 0xd7, 0xa1, 0x79, 0x4a, 0xc6, + 0x71, 0xb6, 0x63, 0x24, 0x4b, 0xa1, 0x9d, 0xb7, 0x30, 0x18, 0xd5, 0x8c, + 0x6a, 0x07, 0xee, 0xaa, 0xb0, 0x83, 0x3e, 0x3c, 0x70, 0xb3, 0x90, 0xfb, + 0x4c, 0xe5, 0x7d, 0xb2, 0x6a, 0xf6, 0x31, 0xd8, 0x5e, 0x87, 0x0a, 0x3e, + 0xe3, 0x4a, 0x98, 0x1d, 0x27, 0xa7, 0x2d, 0x9c, 0x37, 0xb4, 0x9e, 0x6a, + 0x61, 0xa6, 0x3c, 0xd8, 0xe8, 0x92, 0x7c, 0xb9, 0x4f, 0x7c, 0x83, 0x39, + 0x5a, 0xc6, 0x2a, 0x35, 0xb1, 0xbf, 0x43, 0x3d, 0x02, 0xb5, 0x82, 0x6d, + 0x5f, 0x9f, 0xd6, 0xfc, 0x15, 0xc2, 0xf6, 0x97, 0xfb, 0xb1, 0xf6, 0x5a, + 0xc4, 0xa7, 0xea, 0x71, 0xc3, 0x94, 0xe9, 0xb9, 0xaf, 0xdd, 0x82, 0xda, + 0x76, 0x03, 0x2e, 0x4c, 0x0f, 0xa7, 0x54, 0xae, 0xeb, 0xad, 0xd1, 0xad, + 0x38, 0x74, 0x14, 0x5f, 0xf6, 0x02, 0x64, 0x54, 0xe6, 0xb8, 0x11, 0x66, + 0xfd, 0x1c, 0x2e, 0x6d, 0x81, 0x66, 0xfc, 0x58, 0x20, 0x59, 0x95, 0x08, + 0x27, 0xab, 0x1c, 0xe8, 0x93, 0x74, 0x1a, 0xa1, 0xaf, 0x5a, 0xf2, 0x41, + 0x84, 0xa7, 0x2a, 0xe0, 0x48, 0x04, 0xe8, 0x2f, 0xfc, 0x8e, 0x0b, 0x61, + 0xff, 0x45, 0xe6, 0xe8, 0x1a, 0xfa, 0x50, 0xcf, 0xd8, 0x18, 0x47, 0x3f, + 0x78, 0x6d, 0x7f, 0xc5, 0x59, 0xf7, 0xdd, 0x15, 0xb6, 0x86, 0x7e, 0x42, + 0x5d, 0x11, 0xff, 0x42, 0xbf, 0x6c, 0xc5, 0xe1, 0x85, 0x7f, 0xb5, 0x6f, + 0x54, 0x25, 0x71, 0xa8, 0x63, 0xd3, 0xf4, 0xb2, 0x6f, 0xe6, 0x3d, 0x9d, + 0x8c, 0x97, 0xca, 0xc4, 0xe3, 0x1d, 0x1f, 0x4e, 0x03, 0x87, 0xa7, 0xb5, + 0xf3, 0xb7, 0xa2, 0xb1, 0xb4, 0xd6, 0x81, 0x86, 0x2a, 0xfc, 0xbd, 0x55, + 0xb1, 0x36, 0xdc, 0x73, 0x1f, 0xbc, 0x5c, 0x5f, 0x3f, 0x39, 0x28, 0xc0, + 0x79, 0xb0, 0xd0, 0xf2, 0x04, 0x71, 0x7d, 0x78, 0xde, 0x73, 0x17, 0x63, + 0xf7, 0xfd, 0x23, 0x11, 0xf4, 0x1d, 0x41, 0x80, 0x75, 0x60, 0x82, 0x31, + 0xf2, 0xad, 0xaf, 0xc7, 0xc2, 0xbd, 0x3f, 0x65, 0xfb, 0x0d, 0x6c, 0xdf, + 0x6c, 0xb7, 0x0d, 0xb0, 0x2d, 0xe3, 0x9d, 0x3e, 0x4e, 0x1f, 0xd9, 0xeb, + 0x92, 0x1a, 0x64, 0x38, 0xdc, 0x6b, 0xa5, 0xb6, 0xca, 0x18, 0x9d, 0xf7, + 0xf4, 0xb2, 0x8f, 0x8a, 0xa3, 0x68, 0x60, 0x4d, 0xd4, 0xb3, 0xdb, 0x1e, + 0x47, 0x3e, 0xe3, 0xb7, 0x9f, 0xa1, 0x06, 0xee, 0xd8, 0x3e, 0x2d, 0x6d, + 0x33, 0xa5, 0x6d, 0x6a, 0x0d, 0x6d, 0xfc, 0x39, 0x75, 0xe8, 0xfc, 0x74, + 0x04, 0x8f, 0x1d, 0xd1, 0xfc, 0x3b, 0xd1, 0xd8, 0x7b, 0x17, 0xd0, 0xc0, + 0x71, 0x63, 0xf5, 0xf8, 0xd8, 0x1a, 0x0c, 0x87, 0x07, 0xdf, 0xa1, 0x0d, + 0xbb, 0x62, 0x65, 0x7b, 0x6f, 0xb6, 0x79, 0x33, 0xb8, 0x64, 0x73, 0x03, + 0xfb, 0x94, 0x3e, 0xf8, 0x41, 0xa5, 0xa2, 0x7f, 0xd1, 0x3e, 0xe0, 0x9d, + 0x20, 0x26, 0x8f, 0x9a, 0xe8, 0xc1, 0x68, 0xa6, 0x1b, 0x07, 0x32, 0x2a, + 0x6b, 0x11, 0x13, 0xcf, 0xc6, 0xb4, 0x48, 0xad, 0x90, 0xd8, 0x68, 0x32, + 0xa7, 0x4b, 0xac, 0xd3, 0x1b, 0x43, 0x0b, 0x08, 0xaa, 0x4a, 0x41, 0x25, + 0xf6, 0x37, 0xa8, 0x8e, 0x82, 0x93, 0x45, 0x65, 0x0f, 0xf6, 0x15, 0x9d, + 0x78, 0x2d, 0xe7, 0xc4, 0x9b, 0xe9, 0x6e, 0xf2, 0x96, 0x1b, 0xa1, 0x3a, + 0xd3, 0xed, 0x5c, 0x77, 0xc5, 0x55, 0xc6, 0xe5, 0xb5, 0xe8, 0x9e, 0x7c, + 0x14, 0x55, 0xe3, 0xce, 0x9e, 0x61, 0xa1, 0x19, 0x77, 0xb0, 0x56, 0xda, + 0x5c, 0x90, 0xf7, 0x1b, 0x30, 0x9e, 0xee, 0x65, 0x4d, 0xd7, 0x48, 0x2e, + 0x76, 0x62, 0xa6, 0xbe, 0xc1, 0xde, 0x6b, 0xcb, 0xf2, 0x5a, 0xb6, 0xf8, + 0xf9, 0x3d, 0xc0, 0xbb, 0x96, 0xf6, 0xfe, 0x52, 0xd4, 0xb3, 0x3d, 0xe4, + 0x99, 0x6e, 0x0c, 0x2f, 0xd9, 0x38, 0x1f, 0xeb, 0xc1, 0xfe, 0x1c, 0xeb, + 0x00, 0x7b, 0xbf, 0xdd, 0x89, 0xd9, 0x9c, 0xf4, 0xdd, 0x56, 0x6c, 0x4f, + 0xcb, 0xbd, 0x1f, 0x0b, 0x23, 0x86, 0xc0, 0x36, 0x72, 0xd8, 0x49, 0x03, + 0xaa, 0xe0, 0xf5, 0x35, 0x39, 0xa9, 0x7b, 0xa5, 0x1e, 0x1e, 0x14, 0x97, + 0xa4, 0xe6, 0x73, 0x59, 0x43, 0x9e, 0x84, 0x03, 0xf3, 0x73, 0xf4, 0x2d, + 0xb1, 0xf0, 0x36, 0xea, 0x87, 0x83, 0x28, 0x6d, 0xe1, 0x9a, 0xf8, 0xfb, + 0x69, 0xfd, 0x6c, 0xd1, 0x23, 0xae, 0x64, 0x59, 0x4f, 0xce, 0x59, 0xac, + 0x9f, 0x05, 0x5e, 0x66, 0xbb, 0x42, 0x66, 0x08, 0x79, 0x43, 0xee, 0xef, + 0xea, 0xbd, 0x64, 0x9f, 0xfb, 0xaa, 0xc9, 0xd9, 0xac, 0x23, 0x7a, 0x76, + 0x0b, 0x84, 0x9a, 0xda, 0x4d, 0x4b, 0xd6, 0x5e, 0xce, 0x84, 0xdc, 0x37, + 0xea, 0x16, 0x3f, 0xce, 0x6d, 0x15, 0x1f, 0x50, 0x1b, 0x2e, 0xce, 0xdf, + 0x2d, 0xde, 0x9f, 0x29, 0xeb, 0xb1, 0xf7, 0x68, 0xc3, 0xa8, 0x21, 0xe3, + 0xde, 0xc2, 0xbc, 0x31, 0x28, 0xb6, 0xd1, 0x8e, 0xa4, 0xb3, 0xbc, 0xdf, + 0x40, 0xdd, 0xe9, 0xb9, 0x2f, 0x16, 0xc2, 0x77, 0xd3, 0xa6, 0x7b, 0x67, + 0xac, 0xb9, 0xcb, 0x89, 0x4e, 0xb1, 0x2b, 0xa7, 0xe3, 0xb5, 0x74, 0x72, + 0xa5, 0x1b, 0x5d, 0x62, 0x47, 0xae, 0x47, 0xf4, 0xcf, 0x74, 0xe3, 0xbd, + 0xec, 0x1e, 0xd1, 0x67, 0xf7, 0xd7, 0x2b, 0x52, 0xf3, 0x97, 0x96, 0xe6, + 0xea, 0xe7, 0x5a, 0xde, 0x53, 0x01, 0x9f, 0x9c, 0xaf, 0xf4, 0x13, 0xbf, + 0xdb, 0xf5, 0x7e, 0x12, 0x9b, 0x63, 0x59, 0x8b, 0x35, 0x96, 0x5f, 0x49, + 0x04, 0x6d, 0xbb, 0xe6, 0xa8, 0x5d, 0xe7, 0x67, 0xb6, 0x8a, 0x53, 0xb9, + 0xb2, 0x4d, 0xb3, 0x39, 0x19, 0x17, 0x2a, 0x6b, 0xa6, 0xcf, 0x73, 0xa3, + 0x09, 0x7f, 0x7b, 0x10, 0x15, 0xe3, 0xd2, 0x67, 0x16, 0x26, 0x8d, 0x70, + 0xe8, 0x0d, 0x04, 0xe1, 0x2c, 0xc8, 0x98, 0xb1, 0xf0, 0x8c, 0xe1, 0x82, + 0x63, 0x52, 0xc5, 0xb6, 0x18, 0xd7, 0xc8, 0xe7, 0x82, 0x32, 0x2b, 0x6b, + 0x99, 0x01, 0xda, 0xa0, 0x45, 0x42, 0x8a, 0xfc, 0xfb, 0xf3, 0x6b, 0xe9, + 0x22, 0x66, 0xcb, 0x3d, 0xc6, 0xb6, 0x8a, 0xf2, 0x9a, 0x4a, 0xfb, 0x4c, + 0xf7, 0x5c, 0x4c, 0xc5, 0x7d, 0x59, 0x15, 0x67, 0x8d, 0x1a, 0x6a, 0x3a, + 0x21, 0x3c, 0x09, 0x8f, 0x7a, 0x1b, 0xf3, 0xe3, 0x60, 0xee, 0x51, 0x9c, + 0x26, 0x06, 0x8c, 0xe6, 0x64, 0x2e, 0x64, 0x3b, 0x3e, 0x64, 0x9e, 0xbf, + 0xcf, 0x1a, 0x6c, 0xa6, 0x47, 0x85, 0x99, 0x53, 0xa9, 0xe5, 0x4d, 0xe4, + 0xda, 0x7b, 0x71, 0x78, 0x8c, 0x9a, 0x83, 0xfa, 0xbf, 0x7c, 0xe6, 0xa1, + 0xf9, 0x4d, 0x3c, 0x57, 0x21, 0xf5, 0xff, 0x88, 0x7e, 0xc9, 0xde, 0x97, + 0x53, 0x13, 0x72, 0x2e, 0xb2, 0xc6, 0x37, 0xdd, 0x15, 0xed, 0x6e, 0xbc, + 0x91, 0x65, 0xb5, 0xa3, 0x93, 0x6b, 0x89, 0x6d, 0x17, 0x0d, 0xcd, 0x34, + 0xa1, 0xa5, 0x66, 0xa8, 0x61, 0xaa, 0xf4, 0xc7, 0xb0, 0x8d, 0xfc, 0x52, + 0xa9, 0xdf, 0x43, 0xbc, 0x73, 0x2a, 0x3e, 0x59, 0xf3, 0x91, 0x87, 0x0b, + 0x82, 0x21, 0x58, 0x50, 0xf1, 0x5a, 0x36, 0xc4, 0x35, 0xe3, 0xd8, 0xf6, + 0x5e, 0xd7, 0xbf, 0xc5, 0xd9, 0xac, 0x43, 0x50, 0x17, 0x3b, 0xae, 0xac, + 0xb7, 0xd0, 0x6b, 0x84, 0x8d, 0x7a, 0x87, 0xca, 0x3e, 0x9c, 0xd4, 0x70, + 0xb5, 0xd8, 0x30, 0x51, 0x87, 0x26, 0x72, 0xa2, 0x3e, 0x21, 0x35, 0xd4, + 0xf0, 0x40, 0x90, 0xd8, 0x79, 0x81, 0x58, 0x7c, 0x41, 0x68, 0xfd, 0xdd, + 0x42, 0xc6, 0x80, 0x65, 0x3d, 0x19, 0x8d, 0xc0, 0xb1, 0xc1, 0x8c, 0x78, + 0xd0, 0x8c, 0x54, 0xa0, 0x31, 0xe9, 0x52, 0xea, 0xd8, 0x1e, 0xa6, 0x8f, + 0x3e, 0xf9, 0x1b, 0xda, 0xb6, 0xcf, 0xd0, 0x82, 0x2c, 0x89, 0xc9, 0x70, + 0xda, 0xe5, 0x3b, 0x80, 0x91, 0xd5, 0xb0, 0x2a, 0xdc, 0xeb, 0x9c, 0x70, + 0x13, 0x13, 0xdf, 0x24, 0x46, 0x37, 0x71, 0x8c, 0x9b, 0x27, 0x86, 0x4b, + 0x55, 0x88, 0xa1, 0x39, 0x63, 0xe1, 0x67, 0x51, 0xaf, 0x38, 0x37, 0xa6, + 0x45, 0x72, 0x42, 0xf3, 0xbf, 0x84, 0xc6, 0xcb, 0x7d, 0x02, 0x23, 0x95, + 0xc0, 0x6a, 0x05, 0xe1, 0xf3, 0x03, 0xc4, 0xea, 0x8f, 0xda, 0x3e, 0xa5, + 0x0d, 0xe1, 0x81, 0xeb, 0x1d, 0x5a, 0xa8, 0x97, 0x76, 0x5c, 0x12, 0x66, + 0x8f, 0x93, 0xd8, 0x53, 0xc8, 0xdb, 0x18, 0x60, 0x7a, 0x84, 0xca, 0x75, + 0xe6, 0x15, 0xdd, 0xc4, 0x4f, 0xec, 0x35, 0x65, 0xbd, 0xf8, 0x84, 0x46, + 0xc1, 0xff, 0xf9, 0x3d, 0xd6, 0x5a, 0x84, 0x27, 0xea, 0xd1, 0x38, 0x01, + 0x35, 0x48, 0x7c, 0x0b, 0x1e, 0x95, 0x67, 0x13, 0xc3, 0x97, 0x15, 0xce, + 0x71, 0xc0, 0xc0, 0xdb, 0xab, 0x81, 0x6e, 0x32, 0xa1, 0x71, 0xbd, 0x23, + 0x3c, 0x40, 0x5c, 0x4a, 0xd6, 0x24, 0xc2, 0xcc, 0x73, 0x39, 0x2f, 0xd8, + 0x1c, 0xf5, 0x99, 0xed, 0x72, 0x9e, 0xd2, 0x7e, 0x69, 0xbb, 0x9c, 0xc3, + 0xff, 0x2f, 0xfb, 0x5f, 0x63, 0x7c, 0xd4, 0x71, 0x9d, 0x7f, 0x60, 0xc9, + 0x73, 0x93, 0x17, 0xa9, 0xb7, 0x5f, 0x28, 0x86, 0xf0, 0xbc, 0x1d, 0xf7, + 0x2d, 0x8c, 0x93, 0x06, 0x3c, 0x67, 0xe7, 0x41, 0x59, 0x1f, 0x56, 0x24, + 0xaa, 0xc4, 0xab, 0xd4, 0x0e, 0xd3, 0xac, 0x99, 0x5f, 0x30, 0x0c, 0xd6, + 0x1f, 0xda, 0xd3, 0xc0, 0x5f, 0x30, 0x56, 0xb5, 0x51, 0xa6, 0xad, 0xfb, + 0x1c, 0xe3, 0x77, 0x34, 0x8b, 0xdf, 0x51, 0xe1, 0xb8, 0xa9, 0x12, 0xe7, + 0x30, 0xe3, 0x74, 0x52, 0xbf, 0xf4, 0x10, 0x4b, 0x25, 0xee, 0x64, 0x3b, + 0xf4, 0x19, 0x59, 0x73, 0xb1, 0x7e, 0xc8, 0xcb, 0x1c, 0xaf, 0x12, 0x7b, + 0x18, 0x47, 0x27, 0xa3, 0x95, 0x98, 0xf1, 0x4b, 0xbe, 0x35, 0xdd, 0xdf, + 0xe4, 0xf3, 0x3d, 0x93, 0xf8, 0x53, 0x3f, 0x1c, 0x7f, 0x58, 0x83, 0x37, + 0x51, 0x72, 0xa9, 0xd4, 0x8e, 0x55, 0xe2, 0x7e, 0xfa, 0x67, 0x17, 0xf9, + 0xab, 0x6b, 0x22, 0x09, 0x3d, 0xda, 0xec, 0x97, 0xda, 0xd6, 0x11, 0x75, + 0xa0, 0x8e, 0xb5, 0x13, 0xe3, 0xe5, 0xd8, 0xbb, 0xf6, 0x1e, 0x9d, 0x8d, + 0xd1, 0x1e, 0xdf, 0x3a, 0xb8, 0xd5, 0x75, 0x2d, 0x78, 0xe3, 0x48, 0x2d, + 0x1c, 0xf4, 0xad, 0x32, 0x11, 0xc4, 0x6b, 0x8c, 0xbd, 0x41, 0xda, 0x7c, + 0xaf, 0xa1, 0x9d, 0xbf, 0x57, 0x31, 0x07, 0xeb, 0x99, 0xbb, 0xdf, 0x9f, + 0xd0, 0xfa, 0x2f, 0x13, 0x8b, 0x9f, 0x11, 0x32, 0x7f, 0xb5, 0xe0, 0x0f, + 0xb1, 0x15, 0x07, 0x16, 0xa4, 0x9d, 0xfb, 0x3b, 0x9a, 0xe6, 0xe5, 0xe7, + 0x68, 0x47, 0xe3, 0xbc, 0xb2, 0xb4, 0x97, 0x2c, 0xb5, 0x79, 0x95, 0x70, + 0x4e, 0x5a, 0xd6, 0x0e, 0x1b, 0x43, 0x0f, 0xf1, 0x5e, 0x12, 0x07, 0xed, + 0xbf, 0xcd, 0x8e, 0x90, 0xdd, 0xfe, 0x71, 0x7e, 0x2a, 0x08, 0xd5, 0x7a, + 0x30, 0xaf, 0x57, 0xf1, 0xd7, 0xb2, 0x26, 0x8c, 0xf2, 0x1e, 0x44, 0x48, + 0xa9, 0x12, 0xf5, 0x14, 0xaa, 0x3e, 0x3e, 0xf7, 0x36, 0x75, 0x46, 0x75, + 0x62, 0xa2, 0x23, 0x3f, 0x31, 0xfc, 0x5f, 0xea, 0xa9, 0xbd, 0x6a, 0xda, + 0xb4, 0x08, 0x63, 0x22, 0x56, 0x0d, 0x05, 0x0b, 0x7a, 0xb8, 0xf7, 0x0d, + 0xa0, 0xd6, 0x5b, 0xc6, 0x51, 0xdc, 0x4e, 0x5c, 0xea, 0xd4, 0xb5, 0x48, + 0x4a, 0xd1, 0x8c, 0xa4, 0x52, 0x43, 0x2e, 0x71, 0x22, 0x99, 0x3b, 0x21, + 0x71, 0x25, 0x94, 0x44, 0x3f, 0x4a, 0xab, 0xe4, 0x67, 0x95, 0xa8, 0x9b, + 0x4c, 0xe2, 0x77, 0x5b, 0x5d, 0x28, 0xd5, 0x59, 0x50, 0x18, 0x5b, 0x53, + 0xac, 0x13, 0xef, 0x8d, 0xe9, 0xe6, 0x10, 0xeb, 0xd9, 0x6c, 0xee, 0xfc, + 0x92, 0x0d, 0x92, 0x13, 0xb2, 0x1d, 0xdb, 0xb3, 0x0e, 0x3c, 0x6c, 0xac, + 0x22, 0x3f, 0xa9, 0xf4, 0x57, 0x0f, 0xd2, 0xe4, 0x10, 0xfa, 0x1e, 0x7d, + 0xd4, 0x9a, 0x87, 0xc2, 0x09, 0x1c, 0xca, 0x49, 0x4e, 0x71, 0xe2, 0x4c, + 0x9a, 0x7d, 0x8b, 0xc6, 0xe4, 0x0d, 0x82, 0x9d, 0xd4, 0xf7, 0xe0, 0x10, + 0xf9, 0x6d, 0x3e, 0x7d, 0xc5, 0xb6, 0x61, 0x3e, 0x27, 0x63, 0xf8, 0x51, + 0xbc, 0x35, 0x56, 0xe6, 0x9f, 0x53, 0x31, 0x2d, 0x7e, 0x27, 0xe3, 0xef, + 0x8d, 0x9c, 0x6a, 0xf3, 0x64, 0xdd, 0x3a, 0x2d, 0x64, 0x2a, 0x5a, 0x64, + 0x46, 0x79, 0x00, 0xc9, 0x59, 0x89, 0xc5, 0x94, 0xa9, 0x1c, 0xeb, 0xdb, + 0x19, 0xb9, 0x8f, 0xd3, 0x2d, 0xbe, 0x5d, 0xe8, 0xc2, 0xb1, 0x4c, 0x05, + 0xee, 0x8a, 0x31, 0xc6, 0xe4, 0x1e, 0xf7, 0xda, 0x2e, 0x1c, 0x2f, 0x32, + 0xfe, 0x58, 0xe7, 0x1f, 0x9b, 0x6d, 0xb0, 0xeb, 0xf9, 0x4c, 0x41, 0xe2, + 0xe5, 0xa0, 0x38, 0x52, 0x90, 0x98, 0xc9, 0xb8, 0xcc, 0x30, 0x2e, 0xaf, + 0xc6, 0xae, 0xc1, 0xd8, 0x35, 0xdd, 0xaf, 0x32, 0x5e, 0x1e, 0xca, 0x82, + 0xb1, 0xe2, 0x78, 0xd0, 0x87, 0x36, 0xb0, 0x36, 0x74, 0xff, 0x28, 0xf6, + 0x5b, 0xb8, 0x3c, 0xe5, 0x47, 0xbd, 0x5e, 0x8e, 0xb9, 0x0d, 0x33, 0x0a, + 0x56, 0xb4, 0x6d, 0xb7, 0x52, 0x75, 0x32, 0x0e, 0xef, 0x21, 0x67, 0xfe, + 0xbe, 0xb5, 0x25, 0x20, 0xe3, 0xef, 0xce, 0xa5, 0x73, 0x2f, 0x95, 0xba, + 0xd8, 0xc4, 0xbe, 0x98, 0x1b, 0xa7, 0xb3, 0xab, 0x98, 0x0b, 0x16, 0x63, + 0xab, 0x1a, 0x3b, 0xfd, 0xe5, 0x7d, 0xa6, 0xa7, 0xb2, 0x52, 0x17, 0x66, + 0x3b, 0x5e, 0x27, 0x2e, 0xbb, 0x79, 0xaf, 0x2f, 0x2a, 0xf0, 0xdd, 0x58, + 0xb9, 0xef, 0x1b, 0x66, 0x6e, 0xc6, 0x41, 0xbf, 0x87, 0x79, 0x16, 0x41, + 0xda, 0xef, 0x25, 0x96, 0xde, 0xb5, 0xd4, 0xe7, 0xbf, 0xaf, 0x84, 0x47, + 0x8e, 0xf7, 0x1d, 0x9b, 0x03, 0x92, 0x4a, 0xa1, 0x52, 0x6a, 0x4e, 0x56, + 0x00, 0xb6, 0xaf, 0x77, 0xb5, 0x6f, 0xc5, 0x96, 0x31, 0xaf, 0x78, 0x33, + 0xbd, 0xc1, 0x0a, 0xd5, 0xb2, 0x1d, 0xf3, 0xad, 0x62, 0xc9, 0xde, 0xa6, + 0x99, 0x6f, 0x54, 0x96, 0xf7, 0x26, 0x54, 0x3c, 0x4c, 0xce, 0xad, 0x5b, + 0xba, 0xde, 0x3a, 0x13, 0x82, 0xd1, 0xca, 0xba, 0xb2, 0x4e, 0x60, 0x95, + 0x9d, 0x53, 0x72, 0x0c, 0x15, 0xb5, 0xcc, 0xf1, 0xb6, 0xf5, 0x71, 0x0c, + 0x8d, 0x3b, 0xb1, 0x91, 0x6b, 0x14, 0x67, 0xdd, 0x32, 0x58, 0xb8, 0xcf, + 0xee, 0xa3, 0x2a, 0xb1, 0xdc, 0xce, 0xc9, 0x76, 0x6e, 0xcc, 0xce, 0x7c, + 0xde, 0x3e, 0x6a, 0x48, 0x7d, 0x83, 0x0a, 0x8f, 0xbc, 0x27, 0x39, 0x42, + 0x72, 0xc3, 0x67, 0xb5, 0xa0, 0x32, 0x29, 0xcf, 0xab, 0xcb, 0x5c, 0xda, + 0x69, 0xa8, 0xe6, 0xea, 0x84, 0x8f, 0xbe, 0x35, 0x71, 0x71, 0x7d, 0x0d, + 0xeb, 0xe2, 0x26, 0x3c, 0x98, 0xf5, 0xe0, 0xa3, 0x29, 0x0b, 0x37, 0xb7, + 0xe1, 0xbe, 0x20, 0xb0, 0xbb, 0x86, 0xf8, 0xf5, 0x3d, 0xf2, 0xc4, 0x98, + 0x00, 0x2d, 0x0d, 0xc7, 0x37, 0x33, 0xb7, 0x22, 0x51, 0xa4, 0x6e, 0x8d, + 0x85, 0x43, 0x97, 0xf0, 0x2d, 0x8b, 0x5c, 0xe3, 0x77, 0x70, 0xfd, 0x9d, + 0xf6, 0x59, 0xd5, 0x56, 0xfb, 0x6c, 0x4b, 0x99, 0x1d, 0x14, 0x8e, 0xc2, + 0xb5, 0x98, 0xf4, 0x45, 0x3c, 0x2e, 0xb9, 0x5b, 0xd6, 0x2f, 0x93, 0xd4, + 0x15, 0x5b, 0xc5, 0x7e, 0xf2, 0xf6, 0xbe, 0x99, 0xab, 0xdc, 0x7e, 0x95, + 0xcf, 0xf7, 0x2e, 0xf1, 0xf8, 0x70, 0xee, 0x9d, 0xcf, 0xe9, 0xbb, 0xd0, + 0x12, 0x96, 0x49, 0xfe, 0x76, 0x8b, 0x77, 0x89, 0x61, 0xfb, 0x89, 0x07, + 0x4f, 0x1b, 0x67, 0x83, 0x72, 0xbf, 0xcf, 0xd9, 0x2a, 0x98, 0x13, 0x95, + 0x0c, 0x52, 0x0b, 0x77, 0x73, 0x9e, 0x6e, 0xae, 0x51, 0x5b, 0xbb, 0x0b, + 0xfd, 0xe4, 0x74, 0x57, 0xd4, 0x4b, 0x7c, 0xf2, 0xe3, 0xbb, 0x86, 0xe4, + 0xf1, 0x6f, 0x2d, 0x71, 0xba, 0x3c, 0x6b, 0x2d, 0x9f, 0x8b, 0x3e, 0xf7, + 0x1b, 0xbc, 0xbe, 0x7c, 0x36, 0x6a, 0x20, 0xb9, 0x12, 0x9e, 0xf7, 0x59, + 0xd7, 0xbc, 0xcc, 0xba, 0xed, 0xa5, 0xf4, 0x16, 0xc4, 0x57, 0x68, 0x49, + 0x19, 0x6b, 0xe4, 0x34, 0xfc, 0x75, 0x7b, 0x3f, 0xf6, 0x4c, 0x2a, 0xe4, + 0x48, 0xb9, 0x77, 0x68, 0xe2, 0x70, 0xad, 0xc4, 0xd6, 0x6e, 0x0c, 0x4d, + 0xba, 0xc5, 0xb9, 0xac, 0x13, 0x27, 0x7a, 0x1e, 0xc7, 0x8a, 0xd6, 0x9d, + 0x44, 0x02, 0xbb, 0xa6, 0xe7, 0xdf, 0xdf, 0x40, 0x4a, 0xe6, 0xba, 0x22, + 0xf7, 0x52, 0x05, 0xbc, 0xad, 0x72, 0x1e, 0xf0, 0xfc, 0x84, 0xfd, 0xef, + 0x18, 0x73, 0x52, 0xc3, 0xfd, 0xad, 0x75, 0x3a, 0x20, 0xdf, 0xb3, 0x90, + 0xf7, 0xaa, 0x61, 0xd6, 0xca, 0xb6, 0x72, 0x0d, 0xbd, 0xac, 0xa7, 0x53, + 0x18, 0xa3, 0x5d, 0x6f, 0xd9, 0x7d, 0x6d, 0xac, 0x2c, 0xdb, 0xef, 0x15, + 0x35, 0xe3, 0x2a, 0xb5, 0x1c, 0x75, 0xcd, 0xfa, 0x1e, 0xd4, 0x14, 0xae, + 0xd5, 0x2b, 0x34, 0xd8, 0x23, 0xe7, 0x27, 0xb5, 0x46, 0x1f, 0x3e, 0x4c, + 0x0b, 0x7c, 0x60, 0xc7, 0x60, 0x1f, 0x9a, 0x72, 0xd5, 0x4b, 0xaf, 0xb1, + 0xc8, 0x76, 0x03, 0x65, 0x1c, 0x52, 0xfa, 0xf1, 0x10, 0xe7, 0x52, 0xcd, + 0xb9, 0x7c, 0x1c, 0x5d, 0xc3, 0x71, 0xe4, 0xb5, 0xa4, 0x5a, 0x8e, 0xb3, + 0xe5, 0xbe, 0xbe, 0x02, 0xb9, 0xcf, 0xe6, 0xd4, 0xc3, 0xd8, 0x3d, 0x19, + 0xee, 0xf5, 0x2a, 0x32, 0x0e, 0xc3, 0x78, 0x60, 0xf6, 0xfb, 0xbc, 0x2f, + 0xfb, 0x0a, 0x62, 0xfb, 0xb8, 0x53, 0xbc, 0x97, 0xd6, 0xf1, 0x4a, 0x5a, + 0x59, 0xe5, 0xc0, 0x0b, 0xd6, 0x89, 0xc0, 0x10, 0x6e, 0x35, 0xba, 0x71, + 0x3f, 0x63, 0xb0, 0xb3, 0x69, 0x08, 0x53, 0x8c, 0x81, 0x1d, 0xc4, 0xb7, + 0xc6, 0x68, 0xd1, 0xea, 0x0b, 0x48, 0x3f, 0x0a, 0x74, 0xf1, 0x7a, 0x6d, + 0x54, 0xee, 0xfb, 0x32, 0xda, 0x98, 0x17, 0xaa, 0xae, 0x65, 0x93, 0x38, + 0x6e, 0x8f, 0x59, 0x4b, 0xfd, 0xe1, 0x92, 0xfa, 0xca, 0x27, 0x75, 0xd6, + 0xe7, 0xed, 0x31, 0xad, 0x4a, 0x5d, 0x8f, 0x6c, 0x51, 0x9a, 0xb2, 0x0b, + 0x8c, 0xd9, 0x4d, 0xad, 0xd7, 0x3e, 0xb7, 0xec, 0x23, 0x03, 0x15, 0xad, + 0x73, 0x56, 0xc9, 0x3f, 0x0c, 0x7f, 0xeb, 0xb5, 0x6b, 0xbf, 0xdc, 0x87, + 0xb4, 0x59, 0x5e, 0x97, 0xd7, 0xc2, 0xfe, 0xfb, 0xb0, 0x8d, 0x63, 0x04, + 0xb1, 0xad, 0xd0, 0x8d, 0xbe, 0x49, 0xc7, 0x67, 0xfa, 0xce, 0x27, 0x63, + 0xf9, 0xb3, 0xf9, 0xef, 0x9a, 0x0c, 0x77, 0x79, 0x96, 0xe6, 0x7f, 0xff, + 0xec, 0x67, 0x7d, 0x0d, 0x8e, 0xcb, 0x3d, 0x5b, 0xd9, 0x9f, 0xdc, 0x77, + 0x5e, 0xf6, 0x6f, 0x10, 0x0f, 0xd9, 0xfd, 0x05, 0xdc, 0x32, 0x87, 0x5d, + 0xcc, 0xf5, 0xcd, 0xad, 0x26, 0xbe, 0x1b, 0x7f, 0xd0, 0xda, 0x65, 0xfb, + 0xe0, 0x67, 0xf6, 0xf3, 0x5d, 0x4d, 0x25, 0x3b, 0xde, 0xcb, 0x79, 0x1b, + 0x67, 0xac, 0xc7, 0xf0, 0x9d, 0xa2, 0x41, 0x3e, 0x6f, 0x21, 0x9f, 0x47, + 0xc8, 0xe7, 0x3a, 0x63, 0x3f, 0xc4, 0x7c, 0xf8, 0x4f, 0x2c, 0x24, 0xe5, + 0x7b, 0x03, 0x2a, 0xb9, 0xac, 0x4a, 0xb8, 0x26, 0xa5, 0x6d, 0x8f, 0xa8, + 0xe5, 0x1c, 0x7b, 0x1f, 0xc9, 0x00, 0x9f, 0xcd, 0x94, 0xe3, 0x3f, 0xd2, + 0xfe, 0x00, 0xf0, 0x84, 0xe9, 0xae, 0x5c, 0x07, 0x7c, 0x90, 0xed, 0xb1, + 0xe3, 0xe1, 0xba, 0x44, 0x57, 0xc7, 0x3f, 0x35, 0x59, 0x78, 0x95, 0xbc, + 0xb7, 0x22, 0xd1, 0xdb, 0xf1, 0x48, 0x93, 0x83, 0x3a, 0x51, 0x8e, 0x29, + 0xcf, 0x6d, 0xcb, 0xe7, 0x1f, 0xab, 0x75, 0x78, 0x6a, 0xd7, 0x99, 0xee, + 0xc0, 0x3a, 0xa7, 0x58, 0x35, 0xde, 0xc3, 0xd8, 0xd3, 0x11, 0x1f, 0x37, + 0x3d, 0xf5, 0xeb, 0x42, 0x98, 0x1c, 0x2f, 0x63, 0xd9, 0xc6, 0x99, 0x16, + 0xb4, 0x1c, 0x05, 0xfe, 0x71, 0x3c, 0xc8, 0xda, 0xb5, 0x71, 0xe0, 0x4e, + 0xa5, 0x71, 0xf0, 0x1d, 0x45, 0xde, 0xdb, 0xdd, 0x71, 0x73, 0x4e, 0x7e, + 0x0e, 0x74, 0xdc, 0x64, 0x7f, 0x4e, 0x77, 0xdc, 0x98, 0xdb, 0x8a, 0xf4, + 0x82, 0xfb, 0xf2, 0x8c, 0x62, 0xe1, 0x9b, 0x51, 0x05, 0xb7, 0x1b, 0x97, + 0x98, 0x5b, 0x82, 0xb1, 0xf1, 0xaa, 0xd4, 0x0d, 0x12, 0xbf, 0x71, 0x88, + 0x79, 0xda, 0xc3, 0x7b, 0x72, 0x2b, 0x3c, 0xa0, 0xcb, 0x33, 0x23, 0x99, + 0x4f, 0xa0, 0x1e, 0x81, 0xe7, 0x55, 0xe6, 0xc8, 0x83, 0xe9, 0x5a, 0xec, + 0xcb, 0xd6, 0x61, 0x38, 0x5b, 0x8b, 0xe3, 0xcc, 0xfd, 0x97, 0x98, 0xfb, + 0x5f, 0x35, 0xb4, 0xcb, 0x13, 0x8a, 0xf9, 0x34, 0xb5, 0x24, 0xf1, 0x4b, + 0xeb, 0x7d, 0x47, 0xd1, 0x4e, 0xdf, 0xa5, 0xf8, 0x91, 0x6b, 0xd2, 0xfa, + 0xbf, 0x49, 0x8d, 0xb6, 0x32, 0x21, 0xc7, 0x3f, 0xb6, 0x64, 0xc7, 0x68, + 0xc7, 0x8d, 0x36, 0xc7, 0x8f, 0x74, 0xb4, 0xcc, 0x97, 0x35, 0x42, 0xf3, + 0xbc, 0xe9, 0x7e, 0x71, 0x9d, 0xc4, 0xd0, 0x5e, 0x1c, 0x24, 0x37, 0xfd, + 0xd5, 0x78, 0x05, 0xe3, 0xaf, 0xd1, 0x58, 0x2b, 0x1a, 0x19, 0x57, 0xb2, + 0x4d, 0xba, 0x23, 0x92, 0x7b, 0x01, 0x25, 0xa7, 0xd4, 0x26, 0xcf, 0x51, + 0x0b, 0x35, 0x9b, 0xaf, 0xe1, 0x05, 0xb9, 0xed, 0x6f, 0x1b, 0x2d, 0xe7, + 0xd8, 0x94, 0x03, 0x1e, 0x1e, 0x77, 0x5f, 0x0e, 0xd9, 0xfb, 0xce, 0x72, + 0x6e, 0x8f, 0x72, 0x6e, 0x9a, 0x99, 0x64, 0x1e, 0xdf, 0x61, 0xd4, 0x22, + 0xf5, 0x35, 0x27, 0xef, 0x4b, 0xbd, 0xf0, 0x68, 0x47, 0x7e, 0x0c, 0x25, + 0x9f, 0xbd, 0x87, 0x13, 0x4e, 0x51, 0x87, 0xfb, 0x72, 0x05, 0xe0, 0x18, + 0xc3, 0xa7, 0xa6, 0xed, 0x57, 0xd6, 0xa2, 0x9d, 0xdb, 0xaa, 0xef, 0xc4, + 0xb4, 0x20, 0x5f, 0x94, 0xcf, 0x2a, 0x8f, 0xa7, 0xe3, 0xe4, 0x54, 0xe7, + 0x35, 0xfd, 0x87, 0x4d, 0x45, 0x51, 0xa0, 0xb4, 0x3e, 0x8f, 0xf2, 0xf9, + 0x91, 0xdc, 0xf7, 0x78, 0xdc, 0xde, 0xf7, 0xa8, 0xe5, 0xfc, 0xa2, 0xdf, + 0x86, 0xea, 0x4e, 0xfc, 0x69, 0xc7, 0xf5, 0x47, 0xa4, 0x4e, 0x78, 0xb4, + 0x63, 0x7b, 0x5a, 0xeb, 0x67, 0xdd, 0xab, 0xae, 0xa6, 0x0f, 0xac, 0x8c, + 0xc4, 0x82, 0x49, 0x59, 0x83, 0x9b, 0xb5, 0x8c, 0xd1, 0x33, 0xc2, 0x2b, + 0xe2, 0xe3, 0x5a, 0xa4, 0x9f, 0x36, 0x1f, 0xd7, 0xb5, 0x81, 0x05, 0x68, + 0x83, 0x17, 0x1d, 0x29, 0x1c, 0x2b, 0x96, 0x7d, 0x56, 0x5e, 0x43, 0xb3, + 0xe3, 0xa6, 0xf9, 0xb2, 0x56, 0xba, 0x71, 0x5e, 0xea, 0x20, 0xcb, 0xd2, + 0xdb, 0xba, 0xa8, 0x37, 0x24, 0x0f, 0xca, 0xeb, 0x13, 0x1d, 0x2d, 0xac, + 0xdd, 0xb6, 0x8d, 0x0b, 0x1c, 0x0e, 0x77, 0xe1, 0x70, 0xd1, 0x7d, 0x39, + 0x69, 0x9b, 0xc5, 0x5a, 0x3a, 0xa3, 0x19, 0xa6, 0xad, 0x77, 0x64, 0xdb, + 0x65, 0xbd, 0xe3, 0xc5, 0x2e, 0xce, 0x25, 0x29, 0xca, 0xcf, 0xab, 0xec, + 0x57, 0xda, 0x5e, 0xb6, 0x59, 0x8b, 0x93, 0xad, 0x88, 0x53, 0xe7, 0xed, + 0x71, 0xce, 0x19, 0x4b, 0x7b, 0x9e, 0xe9, 0xe5, 0xb9, 0x34, 0x46, 0xf6, + 0xa2, 0x1c, 0x5f, 0xe1, 0x5c, 0x05, 0x66, 0x96, 0xe6, 0xef, 0xe1, 0x1a, + 0xdd, 0x3e, 0x46, 0x6e, 0x69, 0x2f, 0xaf, 0x57, 0x53, 0xee, 0x16, 0x24, + 0xeb, 0x3a, 0x69, 0xa3, 0xdf, 0xd7, 0x3c, 0xde, 0x89, 0x49, 0xae, 0xeb, + 0x1d, 0x85, 0xa0, 0x6f, 0xcd, 0xb8, 0x8e, 0x4d, 0x05, 0xd9, 0xa7, 0xd9, + 0x31, 0x32, 0xfd, 0xcb, 0xa5, 0x9a, 0xbe, 0x07, 0xc7, 0x89, 0xf9, 0x83, + 0xe3, 0xe5, 0x38, 0xdd, 0x90, 0x73, 0x5f, 0x86, 0xa3, 0xdc, 0x6f, 0x0d, + 0xc7, 0xf9, 0xf9, 0xd8, 0x63, 0xd6, 0xe2, 0x4a, 0x19, 0x1f, 0x5b, 0x31, + 0x7d, 0xd4, 0x67, 0xae, 0x48, 0x40, 0xac, 0x6c, 0xbd, 0x81, 0x73, 0x69, + 0xc1, 0xa3, 0xa7, 0x36, 0x63, 0x66, 0x15, 0x55, 0x6e, 0xeb, 0x9d, 0x48, + 0x6d, 0x75, 0xe2, 0xfd, 0xf1, 0x24, 0x2a, 0x5b, 0xbf, 0x84, 0xc5, 0xad, + 0x2a, 0x3e, 0x19, 0xf7, 0xe2, 0x3d, 0xce, 0xd3, 0xb4, 0xbb, 0x92, 0xf9, + 0xc8, 0x5c, 0xce, 0x18, 0xf6, 0xb9, 0xc6, 0x0b, 0x19, 0xe6, 0x32, 0xf3, + 0xe9, 0x39, 0xda, 0xf5, 0xec, 0xd5, 0x77, 0x72, 0xec, 0x7d, 0x5e, 0x72, + 0x8e, 0x5b, 0xb8, 0x27, 0x13, 0x18, 0xcd, 0xe0, 0x77, 0xdc, 0xac, 0x39, + 0x2e, 0xc1, 0x64, 0xfd, 0x15, 0x42, 0x23, 0x6d, 0xd7, 0xc7, 0xe5, 0xbb, + 0x38, 0x01, 0x9f, 0xe4, 0xd9, 0x59, 0xce, 0x4d, 0x29, 0x34, 0xf8, 0x9c, + 0x85, 0x07, 0x89, 0x29, 0x41, 0x7e, 0xd2, 0x6e, 0x3b, 0x3e, 0xae, 0x1d, + 0xb7, 0xc9, 0x03, 0x4f, 0xdc, 0xd6, 0x66, 0x3e, 0xe2, 0x58, 0x35, 0xb9, + 0xce, 0x3c, 0xb9, 0x06, 0xe3, 0x27, 0x55, 0x8f, 0x3c, 0x98, 0x18, 0xcb, + 0x97, 0xe3, 0x37, 0x94, 0xfb, 0x8f, 0x6e, 0xb9, 0xef, 0xfd, 0xf0, 0x78, + 0xf9, 0x7b, 0xf8, 0xea, 0x77, 0xb7, 0xa8, 0x9d, 0xd4, 0x22, 0xc0, 0x80, + 0x8d, 0x7f, 0x7a, 0xeb, 0xff, 0xcb, 0x3c, 0x40, 0x9d, 0xe1, 0x16, 0xff, + 0x6b, 0x4a, 0x3e, 0x2f, 0xb1, 0xd8, 0xc2, 0xb9, 0x56, 0xe9, 0xab, 0xef, + 0x58, 0xa9, 0x1e, 0xe9, 0x27, 0xe9, 0x2f, 0xe2, 0x81, 0x6d, 0x67, 0x88, + 0xf6, 0xc8, 0x6b, 0x0b, 0x56, 0xf2, 0x6e, 0xe9, 0xe7, 0x80, 0xef, 0x45, + 0xae, 0xdb, 0x14, 0xfb, 0xfd, 0x43, 0xce, 0xf1, 0x79, 0xce, 0xfd, 0xd1, + 0xc2, 0x75, 0x6c, 0x63, 0xdf, 0xa3, 0xf6, 0x33, 0x35, 0xe7, 0xd2, 0x3b, + 0x86, 0xc3, 0x90, 0x35, 0x92, 0x89, 0x77, 0x63, 0xf7, 0xe3, 0x96, 0xac, + 0x96, 0x34, 0xa9, 0xf5, 0x52, 0x7e, 0x08, 0xb9, 0xa7, 0x5e, 0xc9, 0xf5, + 0xfc, 0x30, 0x6d, 0x50, 0x5f, 0x34, 0x86, 0xe4, 0x1e, 0x9d, 0xe9, 0x6c, + 0xc0, 0xc1, 0x29, 0x07, 0x2e, 0x06, 0xb4, 0x10, 0xc4, 0x72, 0x6d, 0x2d, + 0xdb, 0x2e, 0xff, 0x5d, 0x45, 0xdd, 0xdf, 0x18, 0x27, 0x63, 0xcb, 0x5a, + 0xdc, 0x9d, 0x6b, 0x7f, 0x1c, 0x87, 0x27, 0x14, 0xec, 0x8a, 0x86, 0x90, + 0xac, 0x8d, 0x51, 0x37, 0x36, 0x0f, 0x7c, 0x84, 0x5f, 0x58, 0xa5, 0x95, + 0xf2, 0xf9, 0xc6, 0xf8, 0x47, 0xf8, 0xd4, 0x72, 0xe8, 0xfa, 0xf9, 0x39, + 0xe8, 0xa5, 0x8b, 0x68, 0x1e, 0xbc, 0x82, 0x1f, 0x33, 0x56, 0xb4, 0x90, + 0xea, 0x70, 0xe0, 0x9c, 0xd1, 0xc8, 0xfa, 0x26, 0x80, 0x52, 0xc0, 0x81, + 0xdb, 0x0c, 0xb9, 0x57, 0xaf, 0x0d, 0x9e, 0x81, 0x36, 0xf0, 0x81, 0x68, + 0xee, 0xff, 0x18, 0x8b, 0xd6, 0x4c, 0xad, 0x1c, 0x57, 0x20, 0x7e, 0x63, + 0xf3, 0xf9, 0x0a, 0x68, 0x5d, 0x2e, 0xa1, 0xc7, 0xeb, 0x1d, 0xff, 0xdd, + 0x5a, 0x0c, 0x7c, 0x6a, 0xe9, 0xe1, 0x4f, 0xa9, 0xb1, 0xf4, 0xe0, 0x2c, + 0xb4, 0x50, 0x3f, 0x96, 0x6d, 0x3b, 0xca, 0xf9, 0x1b, 0xb4, 0x41, 0x6a, + 0x4a, 0xd3, 0xbd, 0x9f, 0xb6, 0x7d, 0x8f, 0x1a, 0x63, 0x57, 0xf4, 0x23, + 0x2b, 0xb9, 0x52, 0xbe, 0x87, 0x76, 0xca, 0x53, 0x3e, 0x13, 0x90, 0xb9, + 0x72, 0x0f, 0xb6, 0xa7, 0x83, 0xf4, 0xd3, 0xb2, 0x16, 0x74, 0x11, 0xdf, + 0xa5, 0x7e, 0x2a, 0x5d, 0xef, 0x80, 0xa9, 0xcc, 0xeb, 0x01, 0x8c, 0xb0, + 0x1e, 0xdc, 0x6b, 0xf3, 0x0c, 0x3c, 0x8e, 0x75, 0xad, 0xd8, 0x31, 0x3d, + 0xe8, 0xe1, 0x1a, 0x6d, 0x9c, 0x37, 0xe4, 0x5e, 0xbb, 0x89, 0x60, 0xc2, + 0x81, 0x9a, 0xf5, 0xda, 0xf9, 0x61, 0x98, 0xd2, 0x96, 0xd4, 0x1a, 0xc7, + 0x10, 0xae, 0x6f, 0x4b, 0x5e, 0xf1, 0x22, 0x9c, 0xfc, 0xc8, 0x31, 0x88, + 0x9b, 0xda, 0xe0, 0xaf, 0x66, 0x7d, 0x53, 0x2d, 0xc2, 0xbd, 0x17, 0x44, + 0x04, 0xde, 0x82, 0xc9, 0x7a, 0xcd, 0xab, 0x7a, 0x0b, 0x2d, 0x6a, 0x55, + 0xc1, 0x50, 0x3d, 0x85, 0xfb, 0x59, 0xb7, 0x79, 0x89, 0xdf, 0x5a, 0xbc, + 0x49, 0x54, 0x70, 0x4d, 0x62, 0xd4, 0xc7, 0x04, 0xf3, 0xb1, 0xdd, 0xa8, + 0x18, 0x6b, 0xe4, 0xb5, 0x21, 0x2c, 0x06, 0xcb, 0xba, 0x9d, 0xf3, 0xc1, + 0xe1, 0x76, 0xb9, 0x77, 0x7d, 0x3f, 0x52, 0xe4, 0xaa, 0x9e, 0xf6, 0x38, + 0x94, 0x71, 0x1b, 0xfb, 0x3d, 0xaf, 0xc5, 0x12, 0xc8, 0xb3, 0xbe, 0x3c, + 0x1d, 0xad, 0xa7, 0x8e, 0x32, 0x30, 0x5c, 0x94, 0xb1, 0x2c, 0x39, 0x96, + 0xde, 0x58, 0xdf, 0x80, 0xf1, 0x39, 0x7e, 0x21, 0x2f, 0x3a, 0x19, 0x23, + 0xfb, 0x18, 0x7b, 0x41, 0x19, 0xe3, 0xe4, 0x4a, 0xd3, 0xc6, 0xb0, 0x3f, + 0xed, 0x88, 0xdb, 0xd8, 0x35, 0xc9, 0x9a, 0xee, 0x71, 0xce, 0x4f, 0xfa, + 0x27, 0x81, 0x9a, 0xc9, 0xe5, 0xfa, 0x79, 0xd3, 0xc3, 0x35, 0x68, 0x61, + 0x9f, 0xc1, 0xa5, 0xf3, 0x45, 0x81, 0xb3, 0xd1, 0x56, 0xbc, 0x9c, 0x15, + 0x4b, 0x67, 0x45, 0xc3, 0x5a, 0x10, 0x1b, 0x91, 0xf1, 0x2b, 0xe4, 0xc3, + 0x6d, 0x38, 0xe1, 0x2f, 0x79, 0xce, 0xc6, 0xca, 0xfb, 0x5a, 0x7d, 0xe4, + 0xa3, 0xe3, 0xe9, 0x2f, 0x21, 0x74, 0x1d, 0xdc, 0xf7, 0xc5, 0x18, 0x63, + 0x59, 0x17, 0xdb, 0x6c, 0x64, 0x2d, 0xdd, 0x8d, 0x7b, 0xed, 0xf7, 0x43, + 0x43, 0xd8, 0xcf, 0x9c, 0xd8, 0x37, 0x17, 0xc1, 0x7e, 0xda, 0xb7, 0xbf, + 0xb8, 0x6c, 0xf3, 0xb5, 0xb6, 0x7e, 0x91, 0x8d, 0xe5, 0xbd, 0xfe, 0xff, + 0xb3, 0x8d, 0xac, 0xcf, 0xa9, 0xb1, 0xc6, 0xd2, 0x7d, 0xf8, 0x5e, 0xfa, + 0xb3, 0x7e, 0x0f, 0x53, 0x1b, 0x9b, 0x73, 0xb2, 0x7f, 0x39, 0xb6, 0x1c, + 0xa3, 0x31, 0x55, 0x2d, 0xe4, 0x38, 0xac, 0x6b, 0xbe, 0xd0, 0x1f, 0xff, + 0x37, 0x63, 0xc9, 0x77, 0x61, 0x37, 0xe2, 0xa2, 0x11, 0x41, 0x5f, 0x4f, + 0x89, 0xeb, 0xa1, 0xe3, 0xc9, 0xf4, 0x1a, 0xa9, 0x8b, 0xdd, 0xe7, 0x63, + 0x5d, 0x78, 0x2a, 0x6d, 0x0d, 0x79, 0x13, 0x96, 0xb5, 0xaf, 0x5d, 0xf7, + 0xef, 0x10, 0xf2, 0xbd, 0x9c, 0x90, 0x3c, 0x17, 0x72, 0xbb, 0xd6, 0x87, + 0x30, 0x9e, 0x49, 0xa1, 0x98, 0x6e, 0xee, 0xbf, 0x40, 0x4c, 0x9f, 0x61, + 0x5e, 0x94, 0x44, 0x8a, 0xb5, 0x67, 0xb0, 0x4a, 0xee, 0x95, 0x8d, 0x14, + 0x77, 0x43, 0x19, 0xfb, 0x07, 0x8f, 0xac, 0x6f, 0x2a, 0x12, 0x5d, 0x38, + 0x98, 0x96, 0x36, 0xcb, 0xfd, 0x4b, 0xcb, 0xea, 0x69, 0xd7, 0xe3, 0x86, + 0x50, 0xed, 0xf7, 0x90, 0x5d, 0xb4, 0xfd, 0x00, 0xdb, 0x9a, 0x39, 0xe9, + 0xcb, 0xa6, 0x2a, 0x89, 0x5b, 0xfb, 0x59, 0x0f, 0x74, 0x5e, 0xed, 0x87, + 0xec, 0x35, 0x96, 0xaa, 0x92, 0xfd, 0x50, 0x07, 0x53, 0x2b, 0x0c, 0x60, + 0x7f, 0x3a, 0x80, 0xa7, 0xd3, 0xcd, 0x5d, 0x3f, 0x80, 0x93, 0xf9, 0x2c, + 0xe7, 0x28, 0xdf, 0x91, 0x5d, 0x6e, 0x13, 0xc0, 0xec, 0xd5, 0xbf, 0xa5, + 0x8f, 0xca, 0x7b, 0xc8, 0xaf, 0xd8, 0x35, 0x86, 0x4a, 0x4e, 0x29, 0xd7, + 0x4d, 0xc4, 0x0f, 0xcf, 0x01, 0xae, 0xeb, 0x07, 0x5c, 0x57, 0x85, 0xeb, + 0xfa, 0xaa, 0xf1, 0x9f, 0xa5, 0x46, 0x72, 0x8f, 0xc4, 0x42, 0xf2, 0x2c, + 0xcd, 0x24, 0x6e, 0xd9, 0x6d, 0xc6, 0x63, 0x4e, 0xd6, 0xcf, 0xb2, 0xb6, + 0x1c, 0xe8, 0x78, 0x3d, 0x6d, 0x6d, 0x5c, 0x88, 0x36, 0xa7, 0x3e, 0x20, + 0xef, 0x9b, 0x5f, 0xd3, 0x8c, 0x45, 0x34, 0x20, 0x33, 0xf5, 0x87, 0x58, + 0xac, 0x6d, 0xf6, 0xff, 0x00, 0xa6, 0xfb, 0x78, 0xec, 0x71, 0xc4, 0xa7, + 0x58, 0xa7, 0xb4, 0xfd, 0x11, 0x13, 0x2f, 0x06, 0x87, 0xde, 0x7c, 0xf9, + 0x55, 0xfc, 0x1d, 0x16, 0xaf, 0x6b, 0xa4, 0x0a, 0x92, 0x6d, 0xca, 0xfb, + 0x0f, 0x8d, 0xf3, 0x7b, 0xc8, 0xed, 0x0c, 0x3d, 0x65, 0x99, 0xff, 0x9a, + 0x23, 0x7d, 0xec, 0x73, 0x66, 0xab, 0x16, 0x4a, 0xd9, 0xef, 0x5e, 0xc2, + 0x73, 0x86, 0x79, 0x11, 0x99, 0x90, 0xed, 0x1f, 0xed, 0xd0, 0x73, 0x21, + 0xd6, 0xba, 0x72, 0x0f, 0x45, 0xeb, 0x92, 0xef, 0xda, 0x9d, 0x49, 0xb7, + 0x90, 0x3f, 0x9a, 0x7b, 0x22, 0xe2, 0x5e, 0xe2, 0x56, 0x99, 0xcb, 0x5c, + 0x6c, 0x77, 0x32, 0xad, 0xa5, 0xce, 0xa0, 0xb9, 0xd7, 0x2b, 0xee, 0x41, + 0xaa, 0xb6, 0xb9, 0xff, 0x69, 0x34, 0x92, 0x6f, 0xb5, 0xc8, 0x22, 0xca, + 0xfd, 0xac, 0xcd, 0x91, 0xf8, 0xea, 0x24, 0xa6, 0x4d, 0xe1, 0x69, 0xbf, + 0x03, 0xcd, 0xad, 0xba, 0x7f, 0x0e, 0xcb, 0xf1, 0x52, 0x6e, 0xb3, 0x26, + 0x27, 0xdf, 0x7f, 0xd2, 0x31, 0xc2, 0xba, 0xdf, 0x59, 0xa7, 0x32, 0x67, + 0x77, 0xe3, 0x8e, 0x31, 0xe2, 0xa1, 0x42, 0xbf, 0x30, 0x37, 0x07, 0xc2, + 0xbb, 0xd1, 0x93, 0x67, 0xbc, 0x65, 0x1a, 0x47, 0xf7, 0xb1, 0xdd, 0x44, + 0xb1, 0x31, 0xb4, 0x8f, 0xf8, 0x30, 0x52, 0x54, 0x10, 0xaa, 0x0b, 0xb2, + 0x2e, 0xf7, 0xf3, 0x57, 0x35, 0x6b, 0x98, 0xf3, 0x1f, 0xb0, 0x7e, 0x7a, + 0x3b, 0x5b, 0xd6, 0x92, 0x6b, 0x67, 0x84, 0x5d, 0xb3, 0xbf, 0x15, 0xbd, + 0x1d, 0x0b, 0xb6, 0xcd, 0x41, 0xd6, 0x71, 0x92, 0x3b, 0x24, 0xde, 0xb9, + 0xc5, 0xbe, 0x09, 0xd3, 0x3d, 0xd1, 0x4e, 0x9d, 0x39, 0x2e, 0x35, 0xae, + 0xc0, 0x9c, 0xae, 0xec, 0xaf, 0xc2, 0x10, 0xb5, 0xfd, 0x10, 0x76, 0x19, + 0xfb, 0xb0, 0xb9, 0x56, 0xd6, 0x02, 0xe5, 0x3d, 0x80, 0x83, 0xb1, 0x6e, + 0x34, 0x3e, 0x21, 0xb5, 0x45, 0xba, 0x43, 0x1d, 0x53, 0x98, 0xcb, 0x72, + 0x8c, 0x1f, 0x76, 0xdc, 0x4c, 0x9d, 0xe2, 0x5b, 0xd2, 0x08, 0x37, 0xe5, + 0xfc, 0x8c, 0x2d, 0xf9, 0x7e, 0x3c, 0x3c, 0xf7, 0xd2, 0x97, 0x57, 0xa6, + 0x42, 0xcc, 0x77, 0x17, 0xb0, 0x42, 0xbe, 0x57, 0x2b, 0xb8, 0x36, 0xe5, + 0xf9, 0x36, 0xe6, 0x04, 0xe6, 0x63, 0x8c, 0x8f, 0xab, 0xb5, 0xa1, 0xc4, + 0xe2, 0xf2, 0x7b, 0xc8, 0xe4, 0xb8, 0xa5, 0xfd, 0xa2, 0x23, 0x56, 0x52, + 0xbe, 0x0f, 0xaf, 0x3c, 0xc7, 0xb8, 0xd2, 0x82, 0x25, 0x3c, 0x55, 0x25, + 0xb1, 0x5a, 0xf6, 0x51, 0xf6, 0xbb, 0xf4, 0xf5, 0x69, 0x89, 0xf9, 0xf6, + 0x5a, 0x38, 0xf9, 0xcc, 0xc8, 0xb4, 0x36, 0xb8, 0x0f, 0xcd, 0x03, 0x1f, + 0x0a, 0x1d, 0xf2, 0x94, 0x77, 0xae, 0x05, 0xa9, 0xd5, 0x09, 0xe7, 0xd6, + 0x2b, 0x99, 0x8d, 0xb4, 0x63, 0x35, 0xed, 0x28, 0xb7, 0x55, 0x12, 0xf3, + 0xd8, 0x94, 0xfe, 0x11, 0xfb, 0xdf, 0xc4, 0xba, 0xa3, 0x9e, 0xf1, 0x29, + 0x6d, 0x59, 0xe5, 0x2d, 0x9f, 0x53, 0xbf, 0x68, 0x45, 0x56, 0x96, 0x7d, + 0xf5, 0xaa, 0x8d, 0x03, 0x12, 0xa7, 0xc2, 0xfe, 0xc7, 0xf8, 0xfd, 0x6c, + 0x8e, 0xcc, 0xbf, 0xbe, 0x1f, 0x3f, 0x9a, 0x21, 0xe6, 0x4e, 0xc9, 0xfd, + 0x3b, 0xcd, 0x3f, 0x83, 0x90, 0xac, 0xe3, 0x6d, 0x5f, 0xe8, 0x33, 0x14, + 0x0b, 0xb5, 0x7e, 0xbb, 0xbe, 0x51, 0xf4, 0xb2, 0xa6, 0x5a, 0x93, 0xf3, + 0xca, 0x7e, 0xe9, 0x93, 0x3f, 0xb1, 0x52, 0xf6, 0x78, 0x72, 0x1c, 0x39, + 0x5e, 0x84, 0xf1, 0x94, 0x62, 0x8e, 0x36, 0x47, 0xa4, 0x3e, 0x9b, 0x09, + 0x68, 0xa3, 0x60, 0x2e, 0x4f, 0xa4, 0xe5, 0xde, 0x44, 0xd0, 0xd7, 0x37, + 0x26, 0x98, 0x96, 0xf6, 0x1e, 0xb9, 0x11, 0x52, 0x1a, 0x70, 0x68, 0xce, + 0xc6, 0x5a, 0x33, 0xa4, 0xfc, 0x19, 0xfd, 0x20, 0xf1, 0xa4, 0xb1, 0xa7, + 0x4a, 0xbe, 0xc7, 0x5e, 0xe7, 0x40, 0x67, 0xb4, 0xbc, 0x1f, 0xfc, 0x16, + 0xf9, 0x6b, 0x61, 0xc2, 0x89, 0x9f, 0x1a, 0xf5, 0x14, 0xe9, 0x4e, 0x64, + 0xf4, 0x72, 0x9c, 0xe9, 0x8c, 0xb3, 0x7a, 0x7e, 0x6e, 0x38, 0xaa, 0x95, + 0xc2, 0x8e, 0xe6, 0xd0, 0x3b, 0xd8, 0x61, 0x99, 0x7e, 0x19, 0x6f, 0x2e, + 0x9c, 0x6a, 0xf9, 0x0b, 0xab, 0x14, 0x90, 0x76, 0x39, 0xf0, 0x8a, 0xa1, + 0xc8, 0xbc, 0x09, 0xbe, 0x42, 0x0e, 0x9e, 0xbb, 0xba, 0x56, 0xcb, 0xb1, + 0xfa, 0x37, 0x72, 0x1d, 0x22, 0x29, 0xe8, 0xfd, 0xac, 0x0b, 0xf9, 0x77, + 0x53, 0x70, 0x41, 0x94, 0xef, 0xdd, 0x3c, 0x3f, 0xb0, 0xe4, 0xbb, 0xf2, + 0x33, 0xa1, 0xdc, 0x4a, 0x7e, 0x97, 0x7d, 0x46, 0xa8, 0x13, 0xec, 0xf3, + 0x42, 0xcf, 0xae, 0xf6, 0x0a, 0x99, 0x4b, 0x7e, 0xf9, 0x3e, 0xfd, 0xe6, + 0x09, 0xb9, 0xc7, 0x4f, 0xed, 0x62, 0x38, 0xb0, 0xef, 0xea, 0xfb, 0xfe, + 0xf2, 0xb3, 0x0b, 0xb7, 0x4d, 0xc8, 0x7d, 0x91, 0xb3, 0x1b, 0x54, 0xfc, + 0x33, 0x79, 0x5b, 0xc6, 0x9e, 0xc4, 0x81, 0xc7, 0x3b, 0x5e, 0x9f, 0x96, + 0x1c, 0x3c, 0x4d, 0xbd, 0xba, 0xbc, 0xfe, 0x72, 0x5f, 0x79, 0xb2, 0x23, + 0x78, 0x54, 0x3b, 0x7f, 0x1f, 0x31, 0x69, 0x3c, 0xad, 0x0d, 0x86, 0x1d, + 0x72, 0xdf, 0xb2, 0x91, 0x35, 0xc0, 0x97, 0xb8, 0x70, 0xb2, 0xbf, 0x6e, + 0xf4, 0x4e, 0xc4, 0x58, 0x67, 0xf9, 0x7d, 0x0f, 0x1e, 0x91, 0xef, 0x42, + 0x39, 0x71, 0x66, 0xac, 0xd1, 0xb8, 0x20, 0x80, 0x27, 0xc7, 0x2c, 0xeb, + 0x82, 0x81, 0xdf, 0xaf, 0x61, 0xbd, 0xde, 0x22, 0xb4, 0x38, 0xb5, 0x44, + 0x68, 0x8b, 0x68, 0x0e, 0xe6, 0xa0, 0x9d, 0xdf, 0xcb, 0xfe, 0x4e, 0xe6, + 0x81, 0x97, 0xf3, 0x1e, 0xbc, 0x34, 0xa1, 0x0d, 0x5c, 0x16, 0x1e, 0x14, + 0x9e, 0xa8, 0xf3, 0xed, 0x3e, 0x12, 0xc3, 0x21, 0x72, 0x4c, 0xf7, 0xc9, + 0x38, 0x6e, 0x3b, 0x22, 0x10, 0x09, 0xc7, 0xd1, 0x75, 0xb2, 0x1a, 0x5b, + 0x26, 0x54, 0xfc, 0x24, 0x56, 0x8d, 0x3b, 0x9e, 0x58, 0x9e, 0xc7, 0x3b, + 0x4b, 0x35, 0xa7, 0xc4, 0x2a, 0xe2, 0x26, 0x31, 0x58, 0x25, 0x2e, 0x1e, + 0xc8, 0xc8, 0xbc, 0xb3, 0xac, 0x60, 0x7b, 0x79, 0xcf, 0xe5, 0x99, 0x22, + 0x3c, 0xc7, 0xdb, 0xf5, 0x60, 0x90, 0x09, 0x73, 0xc3, 0x54, 0xe9, 0xde, + 0x1a, 0x58, 0xaf, 0x28, 0xc4, 0xe7, 0x4f, 0x5a, 0x2c, 0xeb, 0xb6, 0x58, + 0xf8, 0xf2, 0x03, 0xb6, 0x96, 0x9f, 0x66, 0xbe, 0x19, 0xf2, 0xfd, 0x30, + 0xce, 0xf7, 0x10, 0xe7, 0xab, 0xf7, 0x7e, 0xe4, 0x30, 0x87, 0xfc, 0xb0, + 0x7e, 0x5e, 0x99, 0xb0, 0x3e, 0x71, 0x25, 0xc2, 0xc1, 0x87, 0x84, 0xac, + 0x3d, 0x42, 0xb8, 0x2d, 0x6a, 0x59, 0xef, 0xc6, 0x2c, 0x2b, 0x1f, 0x33, + 0xdd, 0x37, 0xad, 0xf3, 0xe3, 0xe4, 0x5a, 0xf9, 0x8e, 0x7d, 0x63, 0xb2, + 0x9e, 0xf1, 0xe5, 0x59, 0xab, 0x07, 0xb7, 0x41, 0x9e, 0x63, 0x10, 0x33, + 0x56, 0x6a, 0xbd, 0x40, 0x83, 0xef, 0xf0, 0x58, 0x1d, 0x9e, 0x5c, 0xf8, + 0x6d, 0x80, 0x29, 0x2a, 0x71, 0xe2, 0xe7, 0x06, 0x36, 0xd6, 0x50, 0x8b, + 0xec, 0x84, 0x7c, 0xc7, 0x23, 0x80, 0xd3, 0x45, 0x13, 0x77, 0xc4, 0xfa, + 0xb1, 0x6b, 0x42, 0xea, 0xf6, 0x89, 0x8e, 0x9f, 0x4f, 0x58, 0x3f, 0x72, + 0xd3, 0xfe, 0x8d, 0xed, 0xcd, 0x29, 0x8f, 0x9d, 0x47, 0x23, 0x1d, 0x9b, + 0xa6, 0x6b, 0x51, 0x9c, 0xd3, 0x4b, 0xab, 0x45, 0xf2, 0x02, 0x75, 0x4c, + 0xb0, 0xde, 0xe1, 0xc7, 0x02, 0xf3, 0x7a, 0xae, 0x28, 0xeb, 0xa3, 0xa9, + 0x0e, 0x6b, 0x6a, 0x15, 0x66, 0x17, 0xd8, 0x57, 0x46, 0xef, 0xfa, 0x19, + 0x75, 0x61, 0x55, 0xc2, 0xaa, 0xf1, 0x24, 0xc2, 0xe7, 0x9b, 0x85, 0x03, + 0x97, 0xdb, 0x2c, 0xab, 0xbb, 0x5d, 0x1f, 0xac, 0x26, 0xc4, 0x29, 0x09, + 0x3d, 0xde, 0xe2, 0xc0, 0x97, 0x83, 0x08, 0x77, 0xbd, 0x8b, 0x70, 0xef, + 0x45, 0x11, 0xc0, 0x53, 0x45, 0xf9, 0xfe, 0xe5, 0xe3, 0xf8, 0xd1, 0xc4, + 0x4a, 0xbc, 0x32, 0xb7, 0x7d, 0x69, 0x7f, 0x0e, 0x9e, 0x1b, 0xd7, 0x25, + 0x70, 0x6a, 0x22, 0xc4, 0xf8, 0xa9, 0x20, 0xe6, 0xab, 0x50, 0x9a, 0x64, + 0x9d, 0x66, 0xb2, 0x4e, 0xb3, 0xac, 0x9b, 0x9a, 0x96, 0xeb, 0xab, 0x6b, + 0xdf, 0xcd, 0x5f, 0xde, 0x7b, 0x6a, 0xe1, 0xfa, 0x35, 0xa7, 0x76, 0x89, + 0x73, 0x96, 0xf9, 0x35, 0x89, 0x8d, 0xff, 0xcc, 0x38, 0x95, 0xf3, 0x6e, + 0xc0, 0xde, 0x29, 0x99, 0xa3, 0x72, 0xdd, 0xe0, 0xe9, 0x8a, 0xc9, 0xff, + 0xd7, 0x90, 0x6b, 0x54, 0xf2, 0x6c, 0x8e, 0x11, 0x2f, 0x85, 0x8f, 0x5a, + 0xcb, 0x74, 0x77, 0x92, 0xbb, 0x2a, 0x27, 0xe4, 0xff, 0x09, 0x84, 0x58, + 0xd7, 0x6e, 0x64, 0x9e, 0x55, 0xe1, 0x70, 0xad, 0x8c, 0x1d, 0x69, 0xa7, + 0xdc, 0xbf, 0xdc, 0x8d, 0xfb, 0xe5, 0xff, 0x5a, 0x14, 0x9b, 0xed, 0xf7, + 0xd0, 0xce, 0xd8, 0xda, 0x41, 0xda, 0xb1, 0x3c, 0x7e, 0x17, 0x56, 0x8f, + 0xc9, 0x75, 0x7c, 0xb4, 0x23, 0xc8, 0xfc, 0x3f, 0xce, 0xb8, 0x50, 0x12, + 0x9d, 0x50, 0x19, 0x8b, 0xb7, 0xc4, 0xae, 0xed, 0x43, 0x1f, 0xb8, 0xe8, + 0x90, 0xef, 0x04, 0xcb, 0xb3, 0x4f, 0x2d, 0x7e, 0x5a, 0x5c, 0xdb, 0xe7, + 0x5d, 0xd5, 0xf2, 0xbc, 0xd6, 0x9c, 0x2b, 0x73, 0xd6, 0x29, 0xe2, 0xec, + 0x1b, 0xf6, 0x3e, 0xec, 0xa4, 0x9d, 0x23, 0x0a, 0x71, 0x78, 0x13, 0x79, + 0xff, 0xa2, 0x01, 0xbd, 0x02, 0x5f, 0xa6, 0xdd, 0xe1, 0x38, 0x47, 0x30, + 0x55, 0x62, 0xb8, 0x8b, 0xdc, 0x30, 0x97, 0x95, 0x7a, 0xcd, 0xde, 0x0f, + 0x0a, 0xa1, 0x8c, 0xc9, 0xec, 0x67, 0x50, 0xe4, 0xd2, 0xbf, 0xb6, 0x4c, + 0xfb, 0xbf, 0xa8, 0xba, 0xc4, 0xe9, 0x5c, 0xa7, 0x98, 0x9f, 0xdf, 0x2c, + 0xe6, 0xe6, 0x97, 0x73, 0xae, 0xbc, 0x1f, 0x56, 0xb3, 0x5e, 0x9e, 0x0b, + 0x4a, 0x2c, 0x99, 0xe8, 0xd8, 0x30, 0x25, 0xb5, 0xea, 0xdd, 0xe2, 0xe5, + 0x99, 0xad, 0x62, 0x21, 0xd7, 0x2b, 0x4e, 0xcd, 0x77, 0xe3, 0xe3, 0x89, + 0x3d, 0xa2, 0xb0, 0x74, 0x86, 0x99, 0xcf, 0x35, 0xf8, 0x4e, 0x33, 0x47, + 0xab, 0x38, 0xd7, 0x07, 0xc6, 0x56, 0xf9, 0x9e, 0x9c, 0x0e, 0xf8, 0xce, + 0x4c, 0x6b, 0x86, 0x7c, 0x5f, 0xf3, 0x96, 0xe8, 0x1f, 0x71, 0x0e, 0xac, + 0x79, 0xa3, 0x65, 0xbe, 0xdf, 0xcb, 0x39, 0xec, 0xa0, 0x1e, 0x9d, 0xe5, + 0x3a, 0x24, 0x6d, 0x3c, 0xb0, 0xb5, 0x3d, 0xed, 0x93, 0xff, 0x0f, 0x55, + 0xb6, 0xef, 0x8c, 0x7c, 0x8f, 0x75, 0xc9, 0xbe, 0x53, 0x39, 0x79, 0x5e, + 0x30, 0xdd, 0xf1, 0xf6, 0xd8, 0x84, 0x55, 0xcd, 0x9a, 0xde, 0xab, 0x4b, + 0xbf, 0x75, 0xd2, 0x5e, 0xb9, 0x7f, 0xbc, 0x99, 0xb6, 0x77, 0x8b, 0x42, + 0xee, 0x6e, 0x91, 0xa7, 0x6d, 0x39, 0xda, 0x36, 0x33, 0xef, 0x16, 0x73, + 0xd9, 0x6e, 0x74, 0x4e, 0xb8, 0xc5, 0xa9, 0xac, 0x3c, 0x7b, 0xdd, 0x23, + 0x4e, 0x2d, 0xd9, 0x39, 0x9f, 0x0b, 0xfa, 0xf6, 0xa7, 0xeb, 0x7c, 0xa3, + 0xd3, 0x7e, 0xdf, 0x81, 0x69, 0xcb, 0x72, 0x46, 0x4f, 0xd8, 0xb6, 0xd1, + 0x7f, 0x9f, 0xb3, 0xad, 0x89, 0xb6, 0xc9, 0x33, 0x63, 0xc1, 0x7a, 0x41, + 0xae, 0xb9, 0xf4, 0xa1, 0xd4, 0x59, 0x83, 0xe2, 0x9c, 0xf4, 0x9d, 0x7d, + 0x3e, 0xeb, 0x16, 0xdf, 0xcd, 0x4a, 0x2e, 0xfa, 0x61, 0xc7, 0x48, 0x56, + 0x9e, 0x07, 0x3b, 0xf0, 0xa4, 0xfd, 0xff, 0x42, 0x43, 0xd8, 0x67, 0x9f, + 0x07, 0xcb, 0xbd, 0xb0, 0xf2, 0x99, 0xf1, 0xdf, 0xd8, 0x67, 0xc6, 0x78, + 0xd0, 0x85, 0xe5, 0x33, 0x63, 0x18, 0x1e, 0x5d, 0x9e, 0x09, 0xeb, 0xa9, + 0x0b, 0xd4, 0xff, 0x63, 0xa2, 0x5b, 0x7c, 0x2f, 0xb7, 0x55, 0x7c, 0x97, + 0xf6, 0x97, 0xe6, 0xbb, 0xc4, 0x9b, 0x5c, 0x93, 0x37, 0xe6, 0x4d, 0xcb, + 0xad, 0x6f, 0x16, 0xe7, 0xe7, 0xe1, 0x57, 0xe9, 0xfb, 0x37, 0x97, 0xe6, + 0x70, 0x9e, 0x73, 0x38, 0xc8, 0x39, 0x1c, 0xe0, 0x1c, 0xf6, 0x73, 0x0e, + 0x97, 0x8c, 0xd7, 0xed, 0x39, 0xbc, 0x61, 0x2c, 0xff, 0x3f, 0x85, 0xfd, + 0x1e, 0x29, 0xe3, 0x99, 0xcc, 0xc3, 0xba, 0xa4, 0xe6, 0x68, 0xb9, 0x2e, + 0x79, 0x2f, 0x2a, 0xdf, 0x29, 0x32, 0xe9, 0x43, 0x84, 0x9c, 0x09, 0xad, + 0xf7, 0xac, 0xd0, 0x53, 0x7b, 0x44, 0xf2, 0x36, 0x2f, 0x35, 0xc0, 0xae, + 0x68, 0x38, 0x79, 0x83, 0x08, 0xc7, 0x9d, 0xb6, 0x66, 0x34, 0xd4, 0xca, + 0x82, 0x89, 0xfd, 0xc4, 0x82, 0xd7, 0x68, 0xb7, 0x43, 0x97, 0x67, 0x79, + 0x4e, 0xdc, 0xe2, 0x0f, 0xe1, 0x04, 0x49, 0xe6, 0x78, 0xa6, 0x1f, 0x27, + 0x72, 0x7d, 0x38, 0x9e, 0xfb, 0x17, 0xff, 0x67, 0xa1, 0x7a, 0x12, 0xbd, + 0xeb, 0x6e, 0x0f, 0xcb, 0xbd, 0x88, 0xff, 0xb9, 0x4e, 0xbe, 0xb7, 0xa0, + 0x26, 0xd0, 0xac, 0x86, 0x65, 0x1d, 0xf9, 0xd2, 0xfa, 0x0f, 0x75, 0x19, + 0xb7, 0x8b, 0xb1, 0xd7, 0x6d, 0x4e, 0x8f, 0xb7, 0x9e, 0xb4, 0xdf, 0xc7, + 0x6a, 0xb9, 0x69, 0xc4, 0xfe, 0x5f, 0xbd, 0xe9, 0xf6, 0xed, 0xba, 0x8c, + 0x67, 0xa3, 0x6d, 0x93, 0xcd, 0x45, 0x3d, 0x1d, 0x37, 0xd8, 0x5c, 0xd4, + 0xdd, 0x71, 0xbd, 0xfd, 0xd9, 0xd5, 0x11, 0xb1, 0x3f, 0xb7, 0x52, 0x63, + 0xd9, 0x7b, 0xb0, 0x72, 0xcf, 0x88, 0x9f, 0xf7, 0xb0, 0xd6, 0x96, 0x9f, + 0xbd, 0xd4, 0x70, 0xf2, 0xb3, 0x7f, 0x89, 0xc3, 0x52, 0xe4, 0xe2, 0x65, + 0x7c, 0x96, 0x3f, 0xff, 0x1b, 0xdc, 0xef, 0xe7, 0x51, 0xd4, 0x38, 0x00, + 0x00, 0x00 }; + +static const u32 bnx2_TXP_b09FwData[(0x0/4) + 1] = { 0x0 }; +static const u32 bnx2_TXP_b09FwRodata[(0x30/4) + 1] = { + 0x80000940, 0x80000900, 0x80080100, 0x80080080, 0x80080000, 0x800e0000, + 0x80080080, 0x80080000, 0x80000a80, 0x80000a00, 0x80000980, 0x80000900, + 0x00000000 }; + +static struct fw_info bnx2_txp_fw_09 = { + /* Firmware version: 5.0.0j13 */ + .ver_major = 0x5, + .ver_minor = 0x0, + .ver_fix = 0x0, + + .start_addr = 0x080000a8, + + .text_addr = 0x08000000, + .text_len = 0x38d0, + .text_index = 0x0, + .gz_text = bnx2_TXP_b09FwText, + .gz_text_len = sizeof(bnx2_TXP_b09FwText), + + .data_addr = 0x00000000, + .data_len = 0x0, + .data_index = 0x0, + .data = bnx2_TXP_b09FwData, + + .sbss_addr = 0x08003920, + .sbss_len = 0x64, + .sbss_index = 0x0, + + .bss_addr = 0x08003988, + .bss_len = 0x24c, + .bss_index = 0x0, + + .rodata_addr = 0x080038d0, + .rodata_len = 0x30, + .rodata_index = 0x0, + .rodata = bnx2_TXP_b09FwRodata, +}; + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_fw_defs.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_fw_defs.h new file mode 100644 index 0000000..2e3a385 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_fw_defs.h @@ -0,0 +1,592 @@ +/* bnx2x_fw_defs.h: Broadcom Everest network driver. + * + * Copyright (c) 2007-2009 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + + +#define CSTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0x7000 : 0x1000) +#define CSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x7020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) +#define CSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0x8522 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100) + (index * 0x4)) : (0x1922 + (function * \ + 0x40) + (index * 0x4))) +#define CSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8500 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100)) : (0x1900 + (function * 0x40))) +#define CSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8508 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100)) : (0x1908 + (function * 0x40))) +#define CSTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x11e8 : 0xffffffff) +#define CSTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x8704 + (port * 0xf0)) : (0x1984 + (port * 0xc0))) +#define CSTORM_ISCSI_CQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6680 + (function * 0x8)) : (0x25a0 + \ + (function * 0x8))) +#define CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x66c0 + (function * 0x8)) : (0x25b0 + \ + (function * 0x8))) +#define CSTORM_ISCSI_EQ_CONS_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6040 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2410 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6044 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2414 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x604c + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x241c + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6057 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2427 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_PROD_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6042 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2412 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6056 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2426 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_EQ_SB_NUM_OFFSET(function, eqIdx) \ + (IS_E1H_OFFSET ? (0x6054 + (function * 0xc0) + (eqIdx * 0x18)) : \ + (0x2424 + (function * 0xc0) + (eqIdx * 0x18))) +#define CSTORM_ISCSI_HQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6640 + (function * 0x8)) : (0x2590 + \ + (function * 0x8))) +#define CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6004 + (function * 0x8)) : (0x2404 + \ + (function * 0x8))) +#define CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6002 + (function * 0x8)) : (0x2402 + \ + (function * 0x8))) +#define CSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6000 + (function * 0x8)) : (0x2400 + \ + (function * 0x8))) +#define CSTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \ + (IS_E1H_OFFSET ? (0x801a + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4))) +#define CSTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \ + (IS_E1H_OFFSET ? (0x8018 + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4))) +#define CSTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \ + (IS_E1H_OFFSET ? (0x8000 + (port * 0x280) + (cpu_id * 0x28)) : \ + (0x1400 + (port * 0x280) + (cpu_id * 0x28))) +#define CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \ + (IS_E1H_OFFSET ? (0x8008 + (port * 0x280) + (cpu_id * 0x28)) : \ + (0x1408 + (port * 0x280) + (cpu_id * 0x28))) +#define CSTORM_STATS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x1108 + (function * 0x8)) : (0x5108 + \ + (function * 0x8))) +#define TSTORM_APPROXIMATE_MATCH_MULTICAST_FILTERING_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x31c0 + (function * 0x20)) : 0xffffffff) +#define TSTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0xa000 : 0x1000) +#define TSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0xa020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) +#define TSTORM_CLIENT_CONFIG_OFFSET(port, client_id) \ + (IS_E1H_OFFSET ? (0x3350 + (port * 0x190) + (client_id * 0x10)) \ + : (0x9c0 + (port * 0x130) + (client_id * 0x10))) +#define TSTORM_COMMON_SAFC_WORKAROUND_ENABLE_OFFSET \ + (IS_E1H_OFFSET ? 0x1ad8 : 0xffffffff) +#define TSTORM_COMMON_SAFC_WORKAROUND_TIMEOUT_USEC_OFFSET \ + (IS_E1H_OFFSET ? 0x1ada : 0xffffffff) +#define TSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0xb01a + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0) + (index * 0x4)) : (0x141a + (function * \ + 0x28) + (index * 0x4))) +#define TSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0xb000 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1400 + (function * 0x28))) +#define TSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ + (IS_E1H_OFFSET ? (0xb008 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1408 + (function * 0x28))) +#define TSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2b80 + (function * 0x8)) : (0x4b68 + \ + (function * 0x8))) +#define TSTORM_FUNCTION_COMMON_CONFIG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x3000 + (function * 0x38)) : (0x1500 + \ + (function * 0x38))) +#define TSTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x1ad0 : 0xffffffff) +#define TSTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0xb144 + (port * 0x30)) : (0x1454 + (port * 0x18))) +#define TSTORM_INDIRECTION_TABLE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x12c8 + (function * 0x80)) : (0x22c8 + \ + (function * 0x80))) +#define TSTORM_INDIRECTION_TABLE_SIZE 0x80 +#define TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(function, pblEntry) \ + (IS_E1H_OFFSET ? (0x60c0 + (function * 0x40) + (pblEntry * 0x8)) \ + : (0x4c30 + (function * 0x40) + (pblEntry * 0x8))) +#define TSTORM_ISCSI_ERROR_BITMAP_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6340 + (function * 0x8)) : (0x4cd0 + \ + (function * 0x8))) +#define TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6004 + (function * 0x8)) : (0x4c04 + \ + (function * 0x8))) +#define TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6002 + (function * 0x8)) : (0x4c02 + \ + (function * 0x8))) +#define TSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6000 + (function * 0x8)) : (0x4c00 + \ + (function * 0x8))) +#define TSTORM_ISCSI_RQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6080 + (function * 0x8)) : (0x4c20 + \ + (function * 0x8))) +#define TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6040 + (function * 0x8)) : (0x4c10 + \ + (function * 0x8))) +#define TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6042 + (function * 0x8)) : (0x4c12 + \ + (function * 0x8))) +#define TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x6044 + (function * 0x8)) : (0x4c14 + \ + (function * 0x8))) +#define TSTORM_MAC_FILTER_CONFIG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x3008 + (function * 0x38)) : (0x1508 + \ + (function * 0x38))) +#define TSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ + (IS_E1H_OFFSET ? (0x2010 + (port * 0x5b0) + (stats_counter_id * \ + 0x50)) : (0x4080 + (port * 0x5b0) + (stats_counter_id * 0x50))) +#define TSTORM_STATS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2c00 + (function * 0x8)) : (0x4b88 + \ + (function * 0x8))) +#define TSTORM_TCP_MAX_CWND_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x4004 + (function * 0x8)) : (0x1fb4 + \ + (function * 0x8))) +#define TSTORM_TPA_EXIST_OFFSET (IS_E1H_OFFSET ? 0x3680 : 0x1c20) +#define USTORM_AGG_DATA_OFFSET (IS_E1H_OFFSET ? 0xa040 : 0x2c10) +#define USTORM_AGG_DATA_SIZE (IS_E1H_OFFSET ? 0x2440 : 0x1200) +#define USTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0x8960 : 0x1000) +#define USTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x8980 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) +#define USTORM_CQE_PAGE_BASE_OFFSET(port, clientId) \ + (IS_E1H_OFFSET ? (0x8018 + (port * 0x4b0) + (clientId * 0x30)) : \ + (0x5330 + (port * 0x260) + (clientId * 0x20))) +#define USTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0x9522 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100) + (index * 0x4)) : (0x1922 + (function * \ + 0x40) + (index * 0x4))) +#define USTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x9500 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100)) : (0x1900 + (function * 0x40))) +#define USTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x9508 + ((function>>1) * 0x40) + \ + ((function&1) * 0x100)) : (0x1908 + (function * 0x40))) +#define USTORM_ETH_RING_PAUSE_DATA_OFFSET(port, clientId) \ + (IS_E1H_OFFSET ? (0x8020 + (port * 0x4b0) + (clientId * 0x30)) : \ + 0xffffffff) +#define USTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2a50 + (function * 0x8)) : (0x1d98 + \ + (function * 0x8))) +#define USTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x2448 : 0xffffffff) +#define USTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x9704 + (port * 0xf0)) : (0x1984 + (port * 0xc0))) +#define USTORM_ISCSI_CQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7044 + (function * 0x8)) : (0x2414 + \ + (function * 0x8))) +#define USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7046 + (function * 0x8)) : (0x2416 + \ + (function * 0x8))) +#define USTORM_ISCSI_ERROR_BITMAP_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7688 + (function * 0x8)) : (0x29c8 + \ + (function * 0x8))) +#define USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7648 + (function * 0x8)) : (0x29b8 + \ + (function * 0x8))) +#define USTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7004 + (function * 0x8)) : (0x2404 + \ + (function * 0x8))) +#define USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7002 + (function * 0x8)) : (0x2402 + \ + (function * 0x8))) +#define USTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7000 + (function * 0x8)) : (0x2400 + \ + (function * 0x8))) +#define USTORM_ISCSI_R2TQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7040 + (function * 0x8)) : (0x2410 + \ + (function * 0x8))) +#define USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7080 + (function * 0x8)) : (0x2420 + \ + (function * 0x8))) +#define USTORM_ISCSI_RQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x7084 + (function * 0x8)) : (0x2424 + \ + (function * 0x8))) +#define USTORM_MAX_AGG_SIZE_OFFSET(port, clientId) \ + (IS_E1H_OFFSET ? (0x8010 + (port * 0x4b0) + (clientId * 0x30)) : \ + (0x5328 + (port * 0x260) + (clientId * 0x20))) +#define USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2408 + (function * 0x8)) : (0x5308 + \ + (function * 0x8))) +#define USTORM_PAUSE_ENABLED_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x2ad4 + (port * 0x8)) : 0xffffffff) +#define USTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ + (IS_E1H_OFFSET ? (0x2450 + (port * 0x2d0) + (stats_counter_id * \ + 0x28)) : (0x4740 + (port * 0x2d0) + (stats_counter_id * 0x28))) +#define USTORM_RX_PRODS_OFFSET(port, client_id) \ + (IS_E1H_OFFSET ? (0x8000 + (port * 0x4b0) + (client_id * 0x30)) \ + : (0x5318 + (port * 0x260) + (client_id * 0x20))) +#define USTORM_SB_HC_DISABLE_OFFSET(port, cpu_id, index) \ + (IS_E1H_OFFSET ? (0x901a + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4)) : (0x141a + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4))) +#define USTORM_SB_HC_TIMEOUT_OFFSET(port, cpu_id, index) \ + (IS_E1H_OFFSET ? (0x9018 + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4)) : (0x1418 + (port * 0x280) + (cpu_id * 0x28) + \ + (index * 0x4))) +#define USTORM_SB_HOST_SB_ADDR_OFFSET(port, cpu_id) \ + (IS_E1H_OFFSET ? (0x9000 + (port * 0x280) + (cpu_id * 0x28)) : \ + (0x1400 + (port * 0x280) + (cpu_id * 0x28))) +#define USTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, cpu_id) \ + (IS_E1H_OFFSET ? (0x9008 + (port * 0x280) + (cpu_id * 0x28)) : \ + (0x1408 + (port * 0x280) + (cpu_id * 0x28))) +#define USTORM_STATS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x29f0 + (function * 0x8)) : (0x1d80 + \ + (function * 0x8))) +#define USTORM_TPA_BTR_OFFSET (IS_E1H_OFFSET ? 0x3225 : 0x57ed) +#define USTORM_TPA_BTR_SIZE 0x1 +#define XSTORM_ASSERT_LIST_INDEX_OFFSET \ + (IS_E1H_OFFSET ? 0x9000 : 0x1000) +#define XSTORM_ASSERT_LIST_OFFSET(idx) \ + (IS_E1H_OFFSET ? (0x9020 + (idx * 0x10)) : (0x1020 + (idx * 0x10))) +#define XSTORM_CMNG_PER_PORT_VARS_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x24a8 + (port * 0x50)) : (0x3ba0 + (port * 0x50))) +#define XSTORM_DEF_SB_HC_DISABLE_OFFSET(function, index) \ + (IS_E1H_OFFSET ? (0xa01a + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0) + (index * 0x4)) : (0x141a + (function * \ + 0x28) + (index * 0x4))) +#define XSTORM_DEF_SB_HOST_SB_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0xa000 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1400 + (function * 0x28))) +#define XSTORM_DEF_SB_HOST_STATUS_BLOCK_OFFSET(function) \ + (IS_E1H_OFFSET ? (0xa008 + ((function>>1) * 0x28) + \ + ((function&1) * 0xa0)) : (0x1408 + (function * 0x28))) +#define XSTORM_E1HOV_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2c10 + (function * 0x2)) : 0xffffffff) +#define XSTORM_ETH_STATS_QUERY_ADDR_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2418 + (function * 0x8)) : (0x3b70 + \ + (function * 0x8))) +#define XSTORM_FAIRNESS_PER_VN_VARS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2588 + (function * 0x90)) : (0x3c80 + \ + (function * 0x90))) +#define XSTORM_FUNCTION_MODE_OFFSET \ + (IS_E1H_OFFSET ? 0x2c20 : 0xffffffff) +#define XSTORM_HC_BTR_OFFSET(port) \ + (IS_E1H_OFFSET ? (0xa144 + (port * 0x30)) : (0x1454 + (port * 0x18))) +#define XSTORM_ISCSI_HQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x80c0 + (function * 0x8)) : (0x1c30 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8080 + (function * 0x8)) : (0x1c20 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8081 + (function * 0x8)) : (0x1c21 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8082 + (function * 0x8)) : (0x1c22 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8083 + (function * 0x8)) : (0x1c23 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8084 + (function * 0x8)) : (0x1c24 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8085 + (function * 0x8)) : (0x1c25 + \ + (function * 0x8))) +#define XSTORM_ISCSI_LOCAL_VLAN_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8086 + (function * 0x8)) : (0x1c26 + \ + (function * 0x8))) +#define XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8004 + (function * 0x8)) : (0x1c04 + \ + (function * 0x8))) +#define XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8002 + (function * 0x8)) : (0x1c02 + \ + (function * 0x8))) +#define XSTORM_ISCSI_PAGE_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8000 + (function * 0x8)) : (0x1c00 + \ + (function * 0x8))) +#define XSTORM_ISCSI_R2TQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x80c4 + (function * 0x8)) : (0x1c34 + \ + (function * 0x8))) +#define XSTORM_ISCSI_SQ_SIZE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x80c2 + (function * 0x8)) : (0x1c32 + \ + (function * 0x8))) +#define XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8043 + (function * 0x8)) : (0x1c13 + \ + (function * 0x8))) +#define XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8042 + (function * 0x8)) : (0x1c12 + \ + (function * 0x8))) +#define XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8041 + (function * 0x8)) : (0x1c11 + \ + (function * 0x8))) +#define XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x8040 + (function * 0x8)) : (0x1c10 + \ + (function * 0x8))) +#define XSTORM_PER_COUNTER_ID_STATS_OFFSET(port, stats_counter_id) \ + (IS_E1H_OFFSET ? (0xc000 + (port * 0x3f0) + (stats_counter_id * \ + 0x38)) : (0x3378 + (port * 0x3f0) + (stats_counter_id * 0x38))) +#define XSTORM_RATE_SHAPING_PER_VN_VARS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2548 + (function * 0x90)) : (0x3c40 + \ + (function * 0x90))) +#define XSTORM_SPQ_PAGE_BASE_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2000 + (function * 0x10)) : (0x3328 + \ + (function * 0x10))) +#define XSTORM_SPQ_PROD_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x2008 + (function * 0x10)) : (0x3330 + \ + (function * 0x10))) +#define XSTORM_STATS_FLAGS_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x23d8 + (function * 0x8)) : (0x3b60 + \ + (function * 0x8))) +#define XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x4000 + (port * 0x8)) : (0x1820 + (port * 0x8))) +#define XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_OFFSET(port) \ + (IS_E1H_OFFSET ? (0x4001 + (port * 0x8)) : (0x1821 + (port * 0x8))) +#define XSTORM_TCP_TX_SWS_TIMER_VAL_OFFSET(function) \ + (IS_E1H_OFFSET ? (0x4060 + ((function>>1) * 0x8) + ((function&1) \ + * 0x4)) : (0x1838 + (function * 0x4))) +#define COMMON_ASM_INVALID_ASSERT_OPCODE 0x0 + +/** +* This file defines HSI constants for the ETH flow +*/ +#ifdef _EVEREST_MICROCODE +#include "microcode_constants.h" +#include "eth_rx_bd.h" +#include "eth_tx_bd.h" +#include "eth_rx_cqe.h" +#include "eth_rx_sge.h" +#include "eth_rx_cqe_next_page.h" +#endif + +/* RSS hash types */ +#define DEFAULT_HASH_TYPE 0 +#define IPV4_HASH_TYPE 1 +#define TCP_IPV4_HASH_TYPE 2 +#define IPV6_HASH_TYPE 3 +#define TCP_IPV6_HASH_TYPE 4 +#define INNER_VLAN_PRI_HASH_TYPE 5 +#define OUTER_VLAN_PRI_HASH_TYPE 6 +#define DSCP_HASH_TYPE 7 + + +/* Ethernet Ring parameters */ +#define X_ETH_LOCAL_RING_SIZE 13 +#define FIRST_BD_IN_PKT 0 +#define PARSE_BD_INDEX 1 +#define NUM_OF_ETH_BDS_IN_PAGE ((PAGE_SIZE)/(STRUCT_SIZE(eth_tx_bd)/8)) + + +/* Rx ring params */ +#define U_ETH_LOCAL_BD_RING_SIZE 16 +#define U_ETH_LOCAL_SGE_RING_SIZE 12 +#define U_ETH_SGL_SIZE 8 + + +#define U_ETH_BDS_PER_PAGE_MASK \ + ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8))-1) +#define U_ETH_CQE_PER_PAGE_MASK \ + ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe)/8))-1) +#define U_ETH_SGES_PER_PAGE_MASK \ + ((PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8))-1) + +#define U_ETH_SGES_PER_PAGE_INVERSE_MASK \ + (0xFFFF - ((PAGE_SIZE/((STRUCT_SIZE(eth_rx_sge))/8))-1)) + + +#define TU_ETH_CQES_PER_PAGE \ + (PAGE_SIZE/(STRUCT_SIZE(eth_rx_cqe_next_page)/8)) +#define U_ETH_BDS_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_bd)/8)) +#define U_ETH_SGES_PER_PAGE (PAGE_SIZE/(STRUCT_SIZE(eth_rx_sge)/8)) + +#define U_ETH_UNDEFINED_Q 0xFF + +/* values of command IDs in the ramrod message */ +#define RAMROD_CMD_ID_ETH_PORT_SETUP 80 +#define RAMROD_CMD_ID_ETH_CLIENT_SETUP 85 +#define RAMROD_CMD_ID_ETH_STAT_QUERY 90 +#define RAMROD_CMD_ID_ETH_UPDATE 100 +#define RAMROD_CMD_ID_ETH_HALT 105 +#define RAMROD_CMD_ID_ETH_SET_MAC 110 +#define RAMROD_CMD_ID_ETH_CFC_DEL 115 +#define RAMROD_CMD_ID_ETH_PORT_DEL 120 +#define RAMROD_CMD_ID_ETH_FORWARD_SETUP 125 + + +/* command values for set mac command */ +#define T_ETH_MAC_COMMAND_SET 0 +#define T_ETH_MAC_COMMAND_INVALIDATE 1 + +#define T_ETH_INDIRECTION_TABLE_SIZE 128 + +/*The CRC32 seed, that is used for the hash(reduction) multicast address */ +#define T_ETH_CRC32_HASH_SEED 0x00000000 + +/* Maximal L2 clients supported */ +#define ETH_MAX_RX_CLIENTS_E1 19 +#define ETH_MAX_RX_CLIENTS_E1H 25 + +/* Maximal aggregation queues supported */ +#define ETH_MAX_AGGREGATION_QUEUES_E1 32 +#define ETH_MAX_AGGREGATION_QUEUES_E1H 64 + +/* ETH RSS modes */ +#define ETH_RSS_MODE_DISABLED 0 +#define ETH_RSS_MODE_REGULAR 1 +#define ETH_RSS_MODE_INNER_VLAN_PRI 2 +#define ETH_RSS_MODE_OUTER_VLAN_PRI 3 +#define ETH_RSS_MODE_IP_DSCP 4 + + +/** +* This file defines HSI constants common to all microcode flows +*/ + +/* Connection types */ +#define ETH_CONNECTION_TYPE 0 +#define TOE_CONNECTION_TYPE 1 +#define RDMA_CONNECTION_TYPE 2 +#define ISCSI_CONNECTION_TYPE 3 +#define FCOE_CONNECTION_TYPE 4 +#define RESERVED_CONNECTION_TYPE_0 5 +#define RESERVED_CONNECTION_TYPE_1 6 +#define RESERVED_CONNECTION_TYPE_2 7 + + +#define PROTOCOL_STATE_BIT_OFFSET 6 + +#define ETH_STATE (ETH_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +#define TOE_STATE (TOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +#define RDMA_STATE (RDMA_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +#define ISCSI_STATE \ + (ISCSI_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) +#define FCOE_STATE (FCOE_CONNECTION_TYPE << PROTOCOL_STATE_BIT_OFFSET) + +/* microcode fixed page page size 4K (chains and ring segments) */ +#define MC_PAGE_SIZE 4096 + + +/* Host coalescing constants */ + +/* index numbers */ +#define HC_USTORM_DEF_SB_NUM_INDICES 8 +#define HC_CSTORM_DEF_SB_NUM_INDICES 8 +#define HC_XSTORM_DEF_SB_NUM_INDICES 4 +#define HC_TSTORM_DEF_SB_NUM_INDICES 4 +#define HC_USTORM_SB_NUM_INDICES 4 +#define HC_CSTORM_SB_NUM_INDICES 4 + +/* index values - which counter to update */ + +#define HC_INDEX_U_TOE_RX_CQ_CONS 0 +#define HC_INDEX_U_ETH_RX_CQ_CONS 1 +#define HC_INDEX_U_ETH_RX_BD_CONS 2 +#define HC_INDEX_U_FCOE_EQ_CONS 3 + +#define HC_INDEX_C_TOE_TX_CQ_CONS 0 +#define HC_INDEX_C_ETH_TX_CQ_CONS 1 +#define HC_INDEX_C_ISCSI_EQ_CONS 2 + +#define HC_INDEX_DEF_X_SPQ_CONS 0 + +#define HC_INDEX_DEF_C_RDMA_EQ_CONS 0 +#define HC_INDEX_DEF_C_RDMA_NAL_PROD 1 +#define HC_INDEX_DEF_C_ETH_FW_TX_CQ_CONS 2 +#define HC_INDEX_DEF_C_ETH_SLOW_PATH 3 +#define HC_INDEX_DEF_C_ETH_RDMA_CQ_CONS 4 +#define HC_INDEX_DEF_C_ETH_ISCSI_CQ_CONS 5 +#define HC_INDEX_DEF_C_ETH_FCOE_CQ_CONS 6 + +#define HC_INDEX_DEF_U_ETH_RDMA_RX_CQ_CONS 0 +#define HC_INDEX_DEF_U_ETH_ISCSI_RX_CQ_CONS 1 +#define HC_INDEX_DEF_U_ETH_RDMA_RX_BD_CONS 2 +#define HC_INDEX_DEF_U_ETH_ISCSI_RX_BD_CONS 3 +#define HC_INDEX_DEF_U_ETH_FCOE_RX_CQ_CONS 4 +#define HC_INDEX_DEF_U_ETH_FCOE_RX_BD_CONS 5 + +/* used by the driver to get the SB offset */ +#define USTORM_ID 0 +#define CSTORM_ID 1 +#define XSTORM_ID 2 +#define TSTORM_ID 3 +#define ATTENTION_ID 4 + +/* max number of slow path commands per port */ +#define MAX_RAMRODS_PER_PORT 8 + +/* values for RX ETH CQE type field */ +#define RX_ETH_CQE_TYPE_ETH_FASTPATH 0 +#define RX_ETH_CQE_TYPE_ETH_RAMROD 1 + + +/**** DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/ +#define EMULATION_FREQUENCY_FACTOR 1600 +#define FPGA_FREQUENCY_FACTOR 100 + +#define TIMERS_TICK_SIZE_CHIP (1e-3) +#define TIMERS_TICK_SIZE_EMUL \ + ((TIMERS_TICK_SIZE_CHIP)/((EMULATION_FREQUENCY_FACTOR))) +#define TIMERS_TICK_SIZE_FPGA \ + ((TIMERS_TICK_SIZE_CHIP)/((FPGA_FREQUENCY_FACTOR))) + +#define TSEMI_CLK1_RESUL_CHIP (1e-3) +#define TSEMI_CLK1_RESUL_EMUL \ + ((TSEMI_CLK1_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR)) +#define TSEMI_CLK1_RESUL_FPGA \ + ((TSEMI_CLK1_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR)) + +#define USEMI_CLK1_RESUL_CHIP (TIMERS_TICK_SIZE_CHIP) +#define USEMI_CLK1_RESUL_EMUL (TIMERS_TICK_SIZE_EMUL) +#define USEMI_CLK1_RESUL_FPGA (TIMERS_TICK_SIZE_FPGA) + +#define XSEMI_CLK1_RESUL_CHIP (1e-3) +#define XSEMI_CLK1_RESUL_EMUL \ + ((XSEMI_CLK1_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR)) +#define XSEMI_CLK1_RESUL_FPGA \ + ((XSEMI_CLK1_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR)) + +#define XSEMI_CLK2_RESUL_CHIP (1e-6) +#define XSEMI_CLK2_RESUL_EMUL \ + ((XSEMI_CLK2_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR)) +#define XSEMI_CLK2_RESUL_FPGA \ + ((XSEMI_CLK2_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR)) + +#define SDM_TIMER_TICK_RESUL_CHIP (4*(1e-6)) +#define SDM_TIMER_TICK_RESUL_EMUL \ + ((SDM_TIMER_TICK_RESUL_CHIP)/(EMULATION_FREQUENCY_FACTOR)) +#define SDM_TIMER_TICK_RESUL_FPGA \ + ((SDM_TIMER_TICK_RESUL_CHIP)/(FPGA_FREQUENCY_FACTOR)) + + +/**** END DEFINES FOR TIMERS/CLOCKS RESOLUTIONS ****/ +#define XSTORM_IP_ID_ROLL_HALF 0x8000 +#define XSTORM_IP_ID_ROLL_ALL 0 + +#define FW_LOG_LIST_SIZE 50 + +#define NUM_OF_PROTOCOLS 4 +#define NUM_OF_SAFC_BITS 16 +#define MAX_COS_NUMBER 4 +#define MAX_T_STAT_COUNTER_ID 18 +#define MAX_X_STAT_COUNTER_ID 18 +#define MAX_U_STAT_COUNTER_ID 18 + + +#define UNKNOWN_ADDRESS 0 +#define UNICAST_ADDRESS 1 +#define MULTICAST_ADDRESS 2 +#define BROADCAST_ADDRESS 3 + +#define SINGLE_FUNCTION 0 +#define MULTI_FUNCTION 1 + +#define IP_V4 0 +#define IP_V6 1 + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_hsi.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_hsi.h new file mode 100644 index 0000000..77aa359 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_hsi.h @@ -0,0 +1,2992 @@ +/* bnx2x_hsi.h: Broadcom Everest network driver. + * + * Copyright (c) 2007-2009 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +struct license_key { + u32 reserved[6]; + +#if defined(__BIG_ENDIAN) + u16 max_iscsi_init_conn; + u16 max_iscsi_trgt_conn; +#elif defined(__LITTLE_ENDIAN) + u16 max_iscsi_trgt_conn; + u16 max_iscsi_init_conn; +#endif + + u32 reserved_a[6]; +}; + + +#define PORT_0 0 +#define PORT_1 1 +#define PORT_MAX 2 + +/**************************************************************************** + * Shared HW configuration * + ****************************************************************************/ +struct shared_hw_cfg { /* NVRAM Offset */ + /* Up to 16 bytes of NULL-terminated string */ + u8 part_num[16]; /* 0x104 */ + + u32 config; /* 0x114 */ +#define SHARED_HW_CFG_MDIO_VOLTAGE_MASK 0x00000001 +#define SHARED_HW_CFG_MDIO_VOLTAGE_SHIFT 0 +#define SHARED_HW_CFG_MDIO_VOLTAGE_1_2V 0x00000000 +#define SHARED_HW_CFG_MDIO_VOLTAGE_2_5V 0x00000001 +#define SHARED_HW_CFG_MCP_RST_ON_CORE_RST_EN 0x00000002 + +#define SHARED_HW_CFG_PORT_SWAP 0x00000004 + +#define SHARED_HW_CFG_BEACON_WOL_EN 0x00000008 + +#define SHARED_HW_CFG_MFW_SELECT_MASK 0x00000700 +#define SHARED_HW_CFG_MFW_SELECT_SHIFT 8 + /* Whatever MFW found in NVM + (if multiple found, priority order is: NC-SI, UMP, IPMI) */ +#define SHARED_HW_CFG_MFW_SELECT_DEFAULT 0x00000000 +#define SHARED_HW_CFG_MFW_SELECT_NC_SI 0x00000100 +#define SHARED_HW_CFG_MFW_SELECT_UMP 0x00000200 +#define SHARED_HW_CFG_MFW_SELECT_IPMI 0x00000300 + /* Use SPIO4 as an arbiter between: 0-NC_SI, 1-IPMI + (can only be used when an add-in board, not BMC, pulls-down SPIO4) */ +#define SHARED_HW_CFG_MFW_SELECT_SPIO4_NC_SI_IPMI 0x00000400 + /* Use SPIO4 as an arbiter between: 0-UMP, 1-IPMI + (can only be used when an add-in board, not BMC, pulls-down SPIO4) */ +#define SHARED_HW_CFG_MFW_SELECT_SPIO4_UMP_IPMI 0x00000500 + /* Use SPIO4 as an arbiter between: 0-NC-SI, 1-UMP + (can only be used when an add-in board, not BMC, pulls-down SPIO4) */ +#define SHARED_HW_CFG_MFW_SELECT_SPIO4_NC_SI_UMP 0x00000600 + +#define SHARED_HW_CFG_LED_MODE_MASK 0x000f0000 +#define SHARED_HW_CFG_LED_MODE_SHIFT 16 +#define SHARED_HW_CFG_LED_MAC1 0x00000000 +#define SHARED_HW_CFG_LED_PHY1 0x00010000 +#define SHARED_HW_CFG_LED_PHY2 0x00020000 +#define SHARED_HW_CFG_LED_PHY3 0x00030000 +#define SHARED_HW_CFG_LED_MAC2 0x00040000 +#define SHARED_HW_CFG_LED_PHY4 0x00050000 +#define SHARED_HW_CFG_LED_PHY5 0x00060000 +#define SHARED_HW_CFG_LED_PHY6 0x00070000 +#define SHARED_HW_CFG_LED_MAC3 0x00080000 +#define SHARED_HW_CFG_LED_PHY7 0x00090000 +#define SHARED_HW_CFG_LED_PHY9 0x000a0000 +#define SHARED_HW_CFG_LED_PHY11 0x000b0000 +#define SHARED_HW_CFG_LED_MAC4 0x000c0000 +#define SHARED_HW_CFG_LED_PHY8 0x000d0000 + +#define SHARED_HW_CFG_AN_ENABLE_MASK 0x3f000000 +#define SHARED_HW_CFG_AN_ENABLE_SHIFT 24 +#define SHARED_HW_CFG_AN_ENABLE_CL37 0x01000000 +#define SHARED_HW_CFG_AN_ENABLE_CL73 0x02000000 +#define SHARED_HW_CFG_AN_ENABLE_BAM 0x04000000 +#define SHARED_HW_CFG_AN_ENABLE_PARALLEL_DETECTION 0x08000000 +#define SHARED_HW_CFG_AN_EN_SGMII_FIBER_AUTO_DETECT 0x10000000 +#define SHARED_HW_CFG_AN_ENABLE_REMOTE_PHY 0x20000000 + + u32 config2; /* 0x118 */ + /* one time auto detect grace period (in sec) */ +#define SHARED_HW_CFG_GRACE_PERIOD_MASK 0x000000ff +#define SHARED_HW_CFG_GRACE_PERIOD_SHIFT 0 + +#define SHARED_HW_CFG_PCIE_GEN2_ENABLED 0x00000100 + + /* The default value for the core clock is 250MHz and it is + achieved by setting the clock change to 4 */ +#define SHARED_HW_CFG_CLOCK_CHANGE_MASK 0x00000e00 +#define SHARED_HW_CFG_CLOCK_CHANGE_SHIFT 9 + +#define SHARED_HW_CFG_SMBUS_TIMING_100KHZ 0x00000000 +#define SHARED_HW_CFG_SMBUS_TIMING_400KHZ 0x00001000 + +#define SHARED_HW_CFG_HIDE_PORT1 0x00002000 + +#define SHARED_HW_CFG_WOL_CAPABLE_DISABLED 0x00000000 +#define SHARED_HW_CFG_WOL_CAPABLE_ENABLED 0x00004000 + + /* Output low when PERST is asserted */ +#define SHARED_HW_CFG_SPIO4_FOLLOW_PERST_DISABLED 0x00000000 +#define SHARED_HW_CFG_SPIO4_FOLLOW_PERST_ENABLED 0x00008000 + + /* The fan failure mechanism is usually related to the PHY type + since the power consumption of the board is determined by the PHY. + Currently, fan is required for most designs with SFX7101, BCM8727 + and BCM8481. If a fan is not required for a board which uses one + of those PHYs, this field should be set to "Disabled". If a fan is + required for a different PHY type, this option should be set to + "Enabled". + The fan failure indication is expected on + SPIO5 */ +#define SHARED_HW_CFG_FAN_FAILURE_MASK 0x00180000 +#define SHARED_HW_CFG_FAN_FAILURE_SHIFT 19 +#define SHARED_HW_CFG_FAN_FAILURE_PHY_TYPE 0x00000000 +#define SHARED_HW_CFG_FAN_FAILURE_DISABLED 0x00080000 +#define SHARED_HW_CFG_FAN_FAILURE_ENABLED 0x00100000 + + u32 power_dissipated; /* 0x11c */ +#define SHARED_HW_CFG_POWER_DIS_CMN_MASK 0xff000000 +#define SHARED_HW_CFG_POWER_DIS_CMN_SHIFT 24 + +#define SHARED_HW_CFG_POWER_MGNT_SCALE_MASK 0x00ff0000 +#define SHARED_HW_CFG_POWER_MGNT_SCALE_SHIFT 16 +#define SHARED_HW_CFG_POWER_MGNT_UNKNOWN_SCALE 0x00000000 +#define SHARED_HW_CFG_POWER_MGNT_DOT_1_WATT 0x00010000 +#define SHARED_HW_CFG_POWER_MGNT_DOT_01_WATT 0x00020000 +#define SHARED_HW_CFG_POWER_MGNT_DOT_001_WATT 0x00030000 + + u32 ump_nc_si_config; /* 0x120 */ +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_MASK 0x00000003 +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_SHIFT 0 +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_MAC 0x00000000 +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_PHY 0x00000001 +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_MII 0x00000000 +#define SHARED_HW_CFG_UMP_NC_SI_MII_MODE_RMII 0x00000002 + +#define SHARED_HW_CFG_UMP_NC_SI_NUM_DEVS_MASK 0x00000f00 +#define SHARED_HW_CFG_UMP_NC_SI_NUM_DEVS_SHIFT 8 + +#define SHARED_HW_CFG_UMP_NC_SI_EXT_PHY_TYPE_MASK 0x00ff0000 +#define SHARED_HW_CFG_UMP_NC_SI_EXT_PHY_TYPE_SHIFT 16 +#define SHARED_HW_CFG_UMP_NC_SI_EXT_PHY_TYPE_NONE 0x00000000 +#define SHARED_HW_CFG_UMP_NC_SI_EXT_PHY_TYPE_BCM5221 0x00010000 + + u32 board; /* 0x124 */ +#define SHARED_HW_CFG_BOARD_REV_MASK 0x00FF0000 +#define SHARED_HW_CFG_BOARD_REV_SHIFT 16 + +#define SHARED_HW_CFG_BOARD_MAJOR_VER_MASK 0x0F000000 +#define SHARED_HW_CFG_BOARD_MAJOR_VER_SHIFT 24 + +#define SHARED_HW_CFG_BOARD_MINOR_VER_MASK 0xF0000000 +#define SHARED_HW_CFG_BOARD_MINOR_VER_SHIFT 28 + + u32 reserved; /* 0x128 */ + +}; + + +/**************************************************************************** + * Port HW configuration * + ****************************************************************************/ +struct port_hw_cfg { /* port 0: 0x12c port 1: 0x2bc */ + + u32 pci_id; +#define PORT_HW_CFG_PCI_VENDOR_ID_MASK 0xffff0000 +#define PORT_HW_CFG_PCI_DEVICE_ID_MASK 0x0000ffff + + u32 pci_sub_id; +#define PORT_HW_CFG_PCI_SUBSYS_DEVICE_ID_MASK 0xffff0000 +#define PORT_HW_CFG_PCI_SUBSYS_VENDOR_ID_MASK 0x0000ffff + + u32 power_dissipated; +#define PORT_HW_CFG_POWER_DIS_D3_MASK 0xff000000 +#define PORT_HW_CFG_POWER_DIS_D3_SHIFT 24 +#define PORT_HW_CFG_POWER_DIS_D2_MASK 0x00ff0000 +#define PORT_HW_CFG_POWER_DIS_D2_SHIFT 16 +#define PORT_HW_CFG_POWER_DIS_D1_MASK 0x0000ff00 +#define PORT_HW_CFG_POWER_DIS_D1_SHIFT 8 +#define PORT_HW_CFG_POWER_DIS_D0_MASK 0x000000ff +#define PORT_HW_CFG_POWER_DIS_D0_SHIFT 0 + + u32 power_consumed; +#define PORT_HW_CFG_POWER_CONS_D3_MASK 0xff000000 +#define PORT_HW_CFG_POWER_CONS_D3_SHIFT 24 +#define PORT_HW_CFG_POWER_CONS_D2_MASK 0x00ff0000 +#define PORT_HW_CFG_POWER_CONS_D2_SHIFT 16 +#define PORT_HW_CFG_POWER_CONS_D1_MASK 0x0000ff00 +#define PORT_HW_CFG_POWER_CONS_D1_SHIFT 8 +#define PORT_HW_CFG_POWER_CONS_D0_MASK 0x000000ff +#define PORT_HW_CFG_POWER_CONS_D0_SHIFT 0 + + u32 mac_upper; +#define PORT_HW_CFG_UPPERMAC_MASK 0x0000ffff +#define PORT_HW_CFG_UPPERMAC_SHIFT 0 + u32 mac_lower; + + u32 iscsi_mac_upper; /* Upper 16 bits are always zeroes */ + u32 iscsi_mac_lower; + + u32 rdma_mac_upper; /* Upper 16 bits are always zeroes */ + u32 rdma_mac_lower; + + u32 serdes_config; +#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_MASK 0x0000FFFF +#define PORT_HW_CFG_SERDES_TX_DRV_PRE_EMPHASIS_SHIFT 0 + +#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_MASK 0xFFFF0000 +#define PORT_HW_CFG_SERDES_RX_DRV_EQUALIZER_SHIFT 16 + + + u32 Reserved0[16]; /* 0x158 */ + + /* for external PHY, or forced mode or during AN */ + u16 xgxs_config_rx[4]; /* 0x198 */ + + u16 xgxs_config_tx[4]; /* 0x1A0 */ + + u32 Reserved1[64]; /* 0x1A8 */ + + u32 lane_config; +#define PORT_HW_CFG_LANE_SWAP_CFG_MASK 0x0000ffff +#define PORT_HW_CFG_LANE_SWAP_CFG_SHIFT 0 +#define PORT_HW_CFG_LANE_SWAP_CFG_TX_MASK 0x000000ff +#define PORT_HW_CFG_LANE_SWAP_CFG_TX_SHIFT 0 +#define PORT_HW_CFG_LANE_SWAP_CFG_RX_MASK 0x0000ff00 +#define PORT_HW_CFG_LANE_SWAP_CFG_RX_SHIFT 8 +#define PORT_HW_CFG_LANE_SWAP_CFG_MASTER_MASK 0x0000c000 +#define PORT_HW_CFG_LANE_SWAP_CFG_MASTER_SHIFT 14 + /* AN and forced */ +#define PORT_HW_CFG_LANE_SWAP_CFG_01230123 0x00001b1b + /* forced only */ +#define PORT_HW_CFG_LANE_SWAP_CFG_01233210 0x00001be4 + /* forced only */ +#define PORT_HW_CFG_LANE_SWAP_CFG_31203120 0x0000d8d8 + /* forced only */ +#define PORT_HW_CFG_LANE_SWAP_CFG_32103210 0x0000e4e4 + + u32 external_phy_config; +#define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK 0xff000000 +#define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_SHIFT 24 +#define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_DIRECT 0x00000000 +#define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_BCM5482 0x01000000 +#define PORT_HW_CFG_SERDES_EXT_PHY_TYPE_NOT_CONN 0xff000000 + +#define PORT_HW_CFG_SERDES_EXT_PHY_ADDR_MASK 0x00ff0000 +#define PORT_HW_CFG_SERDES_EXT_PHY_ADDR_SHIFT 16 + +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK 0x0000ff00 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SHIFT 8 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_DIRECT 0x00000000 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8071 0x00000100 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8072 0x00000200 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8073 0x00000300 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8705 0x00000400 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8706 0x00000500 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726 0x00000600 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8481 0x00000700 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_SFX7101 0x00000800 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727 0x00000900 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8727_NOC 0x00000a00 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_FAILURE 0x0000fd00 +#define PORT_HW_CFG_XGXS_EXT_PHY_TYPE_NOT_CONN 0x0000ff00 + +#define PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK 0x000000ff +#define PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT 0 + + u32 speed_capability_mask; +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_MASK 0xffff0000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_SHIFT 16 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL 0x00010000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF 0x00020000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF 0x00040000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL 0x00080000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_1G 0x00100000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_2_5G 0x00200000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_10G 0x00400000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_12G 0x00800000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_12_5G 0x01000000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_13G 0x02000000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_15G 0x04000000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_16G 0x08000000 +#define PORT_HW_CFG_SPEED_CAPABILITY_D0_RESERVED 0xf0000000 + +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_MASK 0x0000ffff +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_SHIFT 0 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_10M_FULL 0x00000001 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_10M_HALF 0x00000002 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_100M_HALF 0x00000004 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_100M_FULL 0x00000008 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_1G 0x00000010 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_2_5G 0x00000020 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_10G 0x00000040 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_12G 0x00000080 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_12_5G 0x00000100 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_13G 0x00000200 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_15G 0x00000400 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_16G 0x00000800 +#define PORT_HW_CFG_SPEED_CAPABILITY_D3_RESERVED 0x0000f000 + + /* A place to hold the original MAC address as a backup */ + u32 backup_mac_upper; /* 0x2B4 */ + + u32 backup_mac_lower; /* 0x2B8 */ +}; + + +/**************************************************************************** + * Shared Feature configuration * + ****************************************************************************/ +struct shared_feat_cfg { /* NVRAM Offset */ + + u32 config; /* 0x450 */ +#define SHARED_FEATURE_BMC_ECHO_MODE_EN 0x00000001 + + /* Use the values from options 47 and 48 instead of the HW default + values */ +#define SHARED_FEAT_CFG_OVERRIDE_PREEMPHASIS_CFG_DISABLED 0x00000000 +#define SHARED_FEAT_CFG_OVERRIDE_PREEMPHASIS_CFG_ENABLED 0x00000002 + +#define SHARED_FEAT_CFG_NCSI_ID_METHOD_SPIO 0x00000000 +#define SHARED_FEAT_CFG_NCSI_ID_METHOD_NVRAM 0x00000008 + +#define SHARED_FEAT_CFG_NCSI_ID_MASK 0x00000030 +#define SHARED_FEAT_CFG_NCSI_ID_SHIFT 4 + /* Override the OTP back to single function mode */ +#define SHARED_FEATURE_MF_MODE_DISABLED 0x00000100 + +}; + + +/**************************************************************************** + * Port Feature configuration * + ****************************************************************************/ +struct port_feat_cfg { /* port 0: 0x454 port 1: 0x4c8 */ + + u32 config; +#define PORT_FEATURE_BAR1_SIZE_MASK 0x0000000f +#define PORT_FEATURE_BAR1_SIZE_SHIFT 0 +#define PORT_FEATURE_BAR1_SIZE_DISABLED 0x00000000 +#define PORT_FEATURE_BAR1_SIZE_64K 0x00000001 +#define PORT_FEATURE_BAR1_SIZE_128K 0x00000002 +#define PORT_FEATURE_BAR1_SIZE_256K 0x00000003 +#define PORT_FEATURE_BAR1_SIZE_512K 0x00000004 +#define PORT_FEATURE_BAR1_SIZE_1M 0x00000005 +#define PORT_FEATURE_BAR1_SIZE_2M 0x00000006 +#define PORT_FEATURE_BAR1_SIZE_4M 0x00000007 +#define PORT_FEATURE_BAR1_SIZE_8M 0x00000008 +#define PORT_FEATURE_BAR1_SIZE_16M 0x00000009 +#define PORT_FEATURE_BAR1_SIZE_32M 0x0000000a +#define PORT_FEATURE_BAR1_SIZE_64M 0x0000000b +#define PORT_FEATURE_BAR1_SIZE_128M 0x0000000c +#define PORT_FEATURE_BAR1_SIZE_256M 0x0000000d +#define PORT_FEATURE_BAR1_SIZE_512M 0x0000000e +#define PORT_FEATURE_BAR1_SIZE_1G 0x0000000f +#define PORT_FEATURE_BAR2_SIZE_MASK 0x000000f0 +#define PORT_FEATURE_BAR2_SIZE_SHIFT 4 +#define PORT_FEATURE_BAR2_SIZE_DISABLED 0x00000000 +#define PORT_FEATURE_BAR2_SIZE_64K 0x00000010 +#define PORT_FEATURE_BAR2_SIZE_128K 0x00000020 +#define PORT_FEATURE_BAR2_SIZE_256K 0x00000030 +#define PORT_FEATURE_BAR2_SIZE_512K 0x00000040 +#define PORT_FEATURE_BAR2_SIZE_1M 0x00000050 +#define PORT_FEATURE_BAR2_SIZE_2M 0x00000060 +#define PORT_FEATURE_BAR2_SIZE_4M 0x00000070 +#define PORT_FEATURE_BAR2_SIZE_8M 0x00000080 +#define PORT_FEATURE_BAR2_SIZE_16M 0x00000090 +#define PORT_FEATURE_BAR2_SIZE_32M 0x000000a0 +#define PORT_FEATURE_BAR2_SIZE_64M 0x000000b0 +#define PORT_FEATURE_BAR2_SIZE_128M 0x000000c0 +#define PORT_FEATURE_BAR2_SIZE_256M 0x000000d0 +#define PORT_FEATURE_BAR2_SIZE_512M 0x000000e0 +#define PORT_FEATURE_BAR2_SIZE_1G 0x000000f0 +#define PORT_FEATURE_EN_SIZE_MASK 0x07000000 +#define PORT_FEATURE_EN_SIZE_SHIFT 24 +#define PORT_FEATURE_WOL_ENABLED 0x01000000 +#define PORT_FEATURE_MBA_ENABLED 0x02000000 +#define PORT_FEATURE_MFW_ENABLED 0x04000000 + + /* Reserved bits: 28-29 */ + /* Check the optic vendor via i2c against a list of approved modules + in a separate nvram image */ +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_MASK 0xE0000000 +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_SHIFT 29 +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_NO_ENFORCEMENT 0x00000000 +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_DISABLE_TX_LASER 0x20000000 +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_WARNING_MSG 0x40000000 +#define PORT_FEAT_CFG_OPT_MDL_ENFRCMNT_POWER_DOWN 0x60000000 + + + u32 wol_config; + /* Default is used when driver sets to "auto" mode */ +#define PORT_FEATURE_WOL_DEFAULT_MASK 0x00000003 +#define PORT_FEATURE_WOL_DEFAULT_SHIFT 0 +#define PORT_FEATURE_WOL_DEFAULT_DISABLE 0x00000000 +#define PORT_FEATURE_WOL_DEFAULT_MAGIC 0x00000001 +#define PORT_FEATURE_WOL_DEFAULT_ACPI 0x00000002 +#define PORT_FEATURE_WOL_DEFAULT_MAGIC_AND_ACPI 0x00000003 +#define PORT_FEATURE_WOL_RES_PAUSE_CAP 0x00000004 +#define PORT_FEATURE_WOL_RES_ASYM_PAUSE_CAP 0x00000008 +#define PORT_FEATURE_WOL_ACPI_UPON_MGMT 0x00000010 + + u32 mba_config; +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_MASK 0x00000007 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_SHIFT 0 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_PXE 0x00000000 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_RPL 0x00000001 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_BOOTP 0x00000002 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_ISCSIB 0x00000003 +#define PORT_FEATURE_MBA_BOOT_AGENT_TYPE_NONE 0x00000007 +#define PORT_FEATURE_MBA_RES_PAUSE_CAP 0x00000100 +#define PORT_FEATURE_MBA_RES_ASYM_PAUSE_CAP 0x00000200 +#define PORT_FEATURE_MBA_SETUP_PROMPT_ENABLE 0x00000400 +#define PORT_FEATURE_MBA_HOTKEY_CTRL_S 0x00000000 +#define PORT_FEATURE_MBA_HOTKEY_CTRL_B 0x00000800 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_MASK 0x000ff000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_SHIFT 12 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_DISABLED 0x00000000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_2K 0x00001000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_4K 0x00002000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_8K 0x00003000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_16K 0x00004000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_32K 0x00005000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_64K 0x00006000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_128K 0x00007000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_256K 0x00008000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_512K 0x00009000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_1M 0x0000a000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_2M 0x0000b000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_4M 0x0000c000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_8M 0x0000d000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_16M 0x0000e000 +#define PORT_FEATURE_MBA_EXP_ROM_SIZE_32M 0x0000f000 +#define PORT_FEATURE_MBA_MSG_TIMEOUT_MASK 0x00f00000 +#define PORT_FEATURE_MBA_MSG_TIMEOUT_SHIFT 20 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_MASK 0x03000000 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_SHIFT 24 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_AUTO 0x00000000 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_BBS 0x01000000 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT18H 0x02000000 +#define PORT_FEATURE_MBA_BIOS_BOOTSTRAP_INT19H 0x03000000 +#define PORT_FEATURE_MBA_LINK_SPEED_MASK 0x3c000000 +#define PORT_FEATURE_MBA_LINK_SPEED_SHIFT 26 +#define PORT_FEATURE_MBA_LINK_SPEED_AUTO 0x00000000 +#define PORT_FEATURE_MBA_LINK_SPEED_10HD 0x04000000 +#define PORT_FEATURE_MBA_LINK_SPEED_10FD 0x08000000 +#define PORT_FEATURE_MBA_LINK_SPEED_100HD 0x0c000000 +#define PORT_FEATURE_MBA_LINK_SPEED_100FD 0x10000000 +#define PORT_FEATURE_MBA_LINK_SPEED_1GBPS 0x14000000 +#define PORT_FEATURE_MBA_LINK_SPEED_2_5GBPS 0x18000000 +#define PORT_FEATURE_MBA_LINK_SPEED_10GBPS_CX4 0x1c000000 +#define PORT_FEATURE_MBA_LINK_SPEED_10GBPS_KX4 0x20000000 +#define PORT_FEATURE_MBA_LINK_SPEED_10GBPS_KR 0x24000000 +#define PORT_FEATURE_MBA_LINK_SPEED_12GBPS 0x28000000 +#define PORT_FEATURE_MBA_LINK_SPEED_12_5GBPS 0x2c000000 +#define PORT_FEATURE_MBA_LINK_SPEED_13GBPS 0x30000000 +#define PORT_FEATURE_MBA_LINK_SPEED_15GBPS 0x34000000 +#define PORT_FEATURE_MBA_LINK_SPEED_16GBPS 0x38000000 + + u32 bmc_config; +#define PORT_FEATURE_BMC_LINK_OVERRIDE_DEFAULT 0x00000000 +#define PORT_FEATURE_BMC_LINK_OVERRIDE_EN 0x00000001 + + u32 mba_vlan_cfg; +#define PORT_FEATURE_MBA_VLAN_TAG_MASK 0x0000ffff +#define PORT_FEATURE_MBA_VLAN_TAG_SHIFT 0 +#define PORT_FEATURE_MBA_VLAN_EN 0x00010000 + + u32 resource_cfg; +#define PORT_FEATURE_RESOURCE_CFG_VALID 0x00000001 +#define PORT_FEATURE_RESOURCE_CFG_DIAG 0x00000002 +#define PORT_FEATURE_RESOURCE_CFG_L2 0x00000004 +#define PORT_FEATURE_RESOURCE_CFG_ISCSI 0x00000008 +#define PORT_FEATURE_RESOURCE_CFG_RDMA 0x00000010 + + u32 smbus_config; + /* Obsolete */ +#define PORT_FEATURE_SMBUS_EN 0x00000001 +#define PORT_FEATURE_SMBUS_ADDR_MASK 0x000000fe +#define PORT_FEATURE_SMBUS_ADDR_SHIFT 1 + + u32 reserved1; + + u32 link_config; /* Used as HW defaults for the driver */ +#define PORT_FEATURE_CONNECTED_SWITCH_MASK 0x03000000 +#define PORT_FEATURE_CONNECTED_SWITCH_SHIFT 24 + /* (forced) low speed switch (< 10G) */ +#define PORT_FEATURE_CON_SWITCH_1G_SWITCH 0x00000000 + /* (forced) high speed switch (>= 10G) */ +#define PORT_FEATURE_CON_SWITCH_10G_SWITCH 0x01000000 +#define PORT_FEATURE_CON_SWITCH_AUTO_DETECT 0x02000000 +#define PORT_FEATURE_CON_SWITCH_ONE_TIME_DETECT 0x03000000 + +#define PORT_FEATURE_LINK_SPEED_MASK 0x000f0000 +#define PORT_FEATURE_LINK_SPEED_SHIFT 16 +#define PORT_FEATURE_LINK_SPEED_AUTO 0x00000000 +#define PORT_FEATURE_LINK_SPEED_10M_FULL 0x00010000 +#define PORT_FEATURE_LINK_SPEED_10M_HALF 0x00020000 +#define PORT_FEATURE_LINK_SPEED_100M_HALF 0x00030000 +#define PORT_FEATURE_LINK_SPEED_100M_FULL 0x00040000 +#define PORT_FEATURE_LINK_SPEED_1G 0x00050000 +#define PORT_FEATURE_LINK_SPEED_2_5G 0x00060000 +#define PORT_FEATURE_LINK_SPEED_10G_CX4 0x00070000 +#define PORT_FEATURE_LINK_SPEED_10G_KX4 0x00080000 +#define PORT_FEATURE_LINK_SPEED_10G_KR 0x00090000 +#define PORT_FEATURE_LINK_SPEED_12G 0x000a0000 +#define PORT_FEATURE_LINK_SPEED_12_5G 0x000b0000 +#define PORT_FEATURE_LINK_SPEED_13G 0x000c0000 +#define PORT_FEATURE_LINK_SPEED_15G 0x000d0000 +#define PORT_FEATURE_LINK_SPEED_16G 0x000e0000 + +#define PORT_FEATURE_FLOW_CONTROL_MASK 0x00000700 +#define PORT_FEATURE_FLOW_CONTROL_SHIFT 8 +#define PORT_FEATURE_FLOW_CONTROL_AUTO 0x00000000 +#define PORT_FEATURE_FLOW_CONTROL_TX 0x00000100 +#define PORT_FEATURE_FLOW_CONTROL_RX 0x00000200 +#define PORT_FEATURE_FLOW_CONTROL_BOTH 0x00000300 +#define PORT_FEATURE_FLOW_CONTROL_NONE 0x00000400 + + /* The default for MCP link configuration, + uses the same defines as link_config */ + u32 mfw_wol_link_cfg; + + u32 reserved[19]; + +}; + + +/**************************************************************************** + * Device Information * + ****************************************************************************/ +struct shm_dev_info { /* size */ + + u32 bc_rev; /* 8 bits each: major, minor, build */ /* 4 */ + + struct shared_hw_cfg shared_hw_config; /* 40 */ + + struct port_hw_cfg port_hw_config[PORT_MAX]; /* 400*2=800 */ + + struct shared_feat_cfg shared_feature_config; /* 4 */ + + struct port_feat_cfg port_feature_config[PORT_MAX];/* 116*2=232 */ + +}; + + +#define FUNC_0 0 +#define FUNC_1 1 +#define FUNC_2 2 +#define FUNC_3 3 +#define FUNC_4 4 +#define FUNC_5 5 +#define FUNC_6 6 +#define FUNC_7 7 +#define E1_FUNC_MAX 2 +#define E1H_FUNC_MAX 8 + +#define VN_0 0 +#define VN_1 1 +#define VN_2 2 +#define VN_3 3 +#define E1VN_MAX 1 +#define E1HVN_MAX 4 + + +/* This value (in milliseconds) determines the frequency of the driver + * issuing the PULSE message code. The firmware monitors this periodic + * pulse to determine when to switch to an OS-absent mode. */ +#define DRV_PULSE_PERIOD_MS 250 + +/* This value (in milliseconds) determines how long the driver should + * wait for an acknowledgement from the firmware before timing out. Once + * the firmware has timed out, the driver will assume there is no firmware + * running and there won't be any firmware-driver synchronization during a + * driver reset. */ +#define FW_ACK_TIME_OUT_MS 5000 + +#define FW_ACK_POLL_TIME_MS 1 + +#define FW_ACK_NUM_OF_POLL (FW_ACK_TIME_OUT_MS/FW_ACK_POLL_TIME_MS) + +/* LED Blink rate that will achieve ~15.9Hz */ +#define LED_BLINK_RATE_VAL 480 + +/**************************************************************************** + * Driver <-> FW Mailbox * + ****************************************************************************/ +struct drv_port_mb { + + u32 link_status; + /* Driver should update this field on any link change event */ + +#define LINK_STATUS_LINK_FLAG_MASK 0x00000001 +#define LINK_STATUS_LINK_UP 0x00000001 +#define LINK_STATUS_SPEED_AND_DUPLEX_MASK 0x0000001E +#define LINK_STATUS_SPEED_AND_DUPLEX_AN_NOT_COMPLETE (0<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_10THD (1<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_10TFD (2<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_100TXHD (3<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_100T4 (4<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_100TXFD (5<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_1000THD (6<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_1000TFD (7<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_1000XFD (7<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_2500THD (8<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_2500TFD (9<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_2500XFD (9<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_10GTFD (10<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_10GXFD (10<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_12GTFD (11<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_12GXFD (11<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_12_5GTFD (12<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_12_5GXFD (12<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_13GTFD (13<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_13GXFD (13<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_15GTFD (14<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_15GXFD (14<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_16GTFD (15<<1) +#define LINK_STATUS_SPEED_AND_DUPLEX_16GXFD (15<<1) + +#define LINK_STATUS_AUTO_NEGOTIATE_FLAG_MASK 0x00000020 +#define LINK_STATUS_AUTO_NEGOTIATE_ENABLED 0x00000020 + +#define LINK_STATUS_AUTO_NEGOTIATE_COMPLETE 0x00000040 +#define LINK_STATUS_PARALLEL_DETECTION_FLAG_MASK 0x00000080 +#define LINK_STATUS_PARALLEL_DETECTION_USED 0x00000080 + +#define LINK_STATUS_LINK_PARTNER_1000TFD_CAPABLE 0x00000200 +#define LINK_STATUS_LINK_PARTNER_1000THD_CAPABLE 0x00000400 +#define LINK_STATUS_LINK_PARTNER_100T4_CAPABLE 0x00000800 +#define LINK_STATUS_LINK_PARTNER_100TXFD_CAPABLE 0x00001000 +#define LINK_STATUS_LINK_PARTNER_100TXHD_CAPABLE 0x00002000 +#define LINK_STATUS_LINK_PARTNER_10TFD_CAPABLE 0x00004000 +#define LINK_STATUS_LINK_PARTNER_10THD_CAPABLE 0x00008000 + +#define LINK_STATUS_TX_FLOW_CONTROL_FLAG_MASK 0x00010000 +#define LINK_STATUS_TX_FLOW_CONTROL_ENABLED 0x00010000 + +#define LINK_STATUS_RX_FLOW_CONTROL_FLAG_MASK 0x00020000 +#define LINK_STATUS_RX_FLOW_CONTROL_ENABLED 0x00020000 + +#define LINK_STATUS_LINK_PARTNER_FLOW_CONTROL_MASK 0x000C0000 +#define LINK_STATUS_LINK_PARTNER_NOT_PAUSE_CAPABLE (0<<18) +#define LINK_STATUS_LINK_PARTNER_SYMMETRIC_PAUSE (1<<18) +#define LINK_STATUS_LINK_PARTNER_ASYMMETRIC_PAUSE (2<<18) +#define LINK_STATUS_LINK_PARTNER_BOTH_PAUSE (3<<18) + +#define LINK_STATUS_SERDES_LINK 0x00100000 + +#define LINK_STATUS_LINK_PARTNER_2500XFD_CAPABLE 0x00200000 +#define LINK_STATUS_LINK_PARTNER_2500XHD_CAPABLE 0x00400000 +#define LINK_STATUS_LINK_PARTNER_10GXFD_CAPABLE 0x00800000 +#define LINK_STATUS_LINK_PARTNER_12GXFD_CAPABLE 0x01000000 +#define LINK_STATUS_LINK_PARTNER_12_5GXFD_CAPABLE 0x02000000 +#define LINK_STATUS_LINK_PARTNER_13GXFD_CAPABLE 0x04000000 +#define LINK_STATUS_LINK_PARTNER_15GXFD_CAPABLE 0x08000000 +#define LINK_STATUS_LINK_PARTNER_16GXFD_CAPABLE 0x10000000 + + u32 port_stx; + + u32 stat_nig_timer; + + /* MCP firmware does not use this field */ + u32 ext_phy_fw_version; + +}; + + +struct drv_func_mb { + + u32 drv_mb_header; +#define DRV_MSG_CODE_MASK 0xffff0000 +#define DRV_MSG_CODE_LOAD_REQ 0x10000000 +#define DRV_MSG_CODE_LOAD_DONE 0x11000000 +#define DRV_MSG_CODE_UNLOAD_REQ_WOL_EN 0x20000000 +#define DRV_MSG_CODE_UNLOAD_REQ_WOL_DIS 0x20010000 +#define DRV_MSG_CODE_UNLOAD_REQ_WOL_MCP 0x20020000 +#define DRV_MSG_CODE_UNLOAD_DONE 0x21000000 +#define DRV_MSG_CODE_DCC_OK 0x30000000 +#define DRV_MSG_CODE_DCC_FAILURE 0x31000000 +#define DRV_MSG_CODE_DIAG_ENTER_REQ 0x50000000 +#define DRV_MSG_CODE_DIAG_EXIT_REQ 0x60000000 +#define DRV_MSG_CODE_VALIDATE_KEY 0x70000000 +#define DRV_MSG_CODE_GET_CURR_KEY 0x80000000 +#define DRV_MSG_CODE_GET_UPGRADE_KEY 0x81000000 +#define DRV_MSG_CODE_GET_MANUF_KEY 0x82000000 +#define DRV_MSG_CODE_LOAD_L2B_PRAM 0x90000000 + /* + * The optic module verification commands requris bootcode + * v5.0.6 or later + */ +#define DRV_MSG_CODE_VRFY_OPT_MDL 0xa0000000 +#define REQ_BC_VER_4_VRFY_OPT_MDL 0x00050006 + +#define BIOS_MSG_CODE_LIC_CHALLENGE 0xff010000 +#define BIOS_MSG_CODE_LIC_RESPONSE 0xff020000 +#define BIOS_MSG_CODE_VIRT_MAC_PRIM 0xff030000 +#define BIOS_MSG_CODE_VIRT_MAC_ISCSI 0xff040000 + +#define DRV_MSG_SEQ_NUMBER_MASK 0x0000ffff + + u32 drv_mb_param; + + u32 fw_mb_header; +#define FW_MSG_CODE_MASK 0xffff0000 +#define FW_MSG_CODE_DRV_LOAD_COMMON 0x10100000 +#define FW_MSG_CODE_DRV_LOAD_PORT 0x10110000 +#define FW_MSG_CODE_DRV_LOAD_FUNCTION 0x10120000 +#define FW_MSG_CODE_DRV_LOAD_REFUSED 0x10200000 +#define FW_MSG_CODE_DRV_LOAD_DONE 0x11100000 +#define FW_MSG_CODE_DRV_UNLOAD_COMMON 0x20100000 +#define FW_MSG_CODE_DRV_UNLOAD_PORT 0x20110000 +#define FW_MSG_CODE_DRV_UNLOAD_FUNCTION 0x20120000 +#define FW_MSG_CODE_DRV_UNLOAD_DONE 0x21100000 +#define FW_MSG_CODE_DIAG_ENTER_DONE 0x50100000 +#define FW_MSG_CODE_DIAG_REFUSE 0x50200000 +#define FW_MSG_CODE_DIAG_EXIT_DONE 0x60100000 +#define FW_MSG_CODE_VALIDATE_KEY_SUCCESS 0x70100000 +#define FW_MSG_CODE_VALIDATE_KEY_FAILURE 0x70200000 +#define FW_MSG_CODE_GET_KEY_DONE 0x80100000 +#define FW_MSG_CODE_NO_KEY 0x80f00000 +#define FW_MSG_CODE_LIC_INFO_NOT_READY 0x80f80000 +#define FW_MSG_CODE_L2B_PRAM_LOADED 0x90100000 +#define FW_MSG_CODE_L2B_PRAM_T_LOAD_FAILURE 0x90210000 +#define FW_MSG_CODE_L2B_PRAM_C_LOAD_FAILURE 0x90220000 +#define FW_MSG_CODE_L2B_PRAM_X_LOAD_FAILURE 0x90230000 +#define FW_MSG_CODE_L2B_PRAM_U_LOAD_FAILURE 0x90240000 +#define FW_MSG_CODE_VRFY_OPT_MDL_SUCCESS 0xa0100000 +#define FW_MSG_CODE_VRFY_OPT_MDL_INVLD_IMG 0xa0200000 +#define FW_MSG_CODE_VRFY_OPT_MDL_UNAPPROVED 0xa0300000 + +#define FW_MSG_CODE_LIC_CHALLENGE 0xff010000 +#define FW_MSG_CODE_LIC_RESPONSE 0xff020000 +#define FW_MSG_CODE_VIRT_MAC_PRIM 0xff030000 +#define FW_MSG_CODE_VIRT_MAC_ISCSI 0xff040000 + +#define FW_MSG_SEQ_NUMBER_MASK 0x0000ffff + + u32 fw_mb_param; + + u32 drv_pulse_mb; +#define DRV_PULSE_SEQ_MASK 0x00007fff +#define DRV_PULSE_SYSTEM_TIME_MASK 0xffff0000 + /* The system time is in the format of + * (year-2001)*12*32 + month*32 + day. */ +#define DRV_PULSE_ALWAYS_ALIVE 0x00008000 + /* Indicate to the firmware not to go into the + * OS-absent when it is not getting driver pulse. + * This is used for debugging as well for PXE(MBA). */ + + u32 mcp_pulse_mb; +#define MCP_PULSE_SEQ_MASK 0x00007fff +#define MCP_PULSE_ALWAYS_ALIVE 0x00008000 + /* Indicates to the driver not to assert due to lack + * of MCP response */ +#define MCP_EVENT_MASK 0xffff0000 +#define MCP_EVENT_OTHER_DRIVER_RESET_REQ 0x00010000 + + u32 iscsi_boot_signature; + u32 iscsi_boot_block_offset; + + u32 drv_status; +#define DRV_STATUS_PMF 0x00000001 + +#define DRV_STATUS_DCC_EVENT_MASK 0x0000ff00 +#define DRV_STATUS_DCC_DISABLE_ENABLE_PF 0x00000100 +#define DRV_STATUS_DCC_BANDWIDTH_ALLOCATION 0x00000200 +#define DRV_STATUS_DCC_CHANGE_MAC_ADDRESS 0x00000400 +#define DRV_STATUS_DCC_RESERVED1 0x00000800 +#define DRV_STATUS_DCC_SET_PROTOCOL 0x00001000 +#define DRV_STATUS_DCC_SET_PRIORITY 0x00002000 + + u32 virt_mac_upper; +#define VIRT_MAC_SIGN_MASK 0xffff0000 +#define VIRT_MAC_SIGNATURE 0x564d0000 + u32 virt_mac_lower; + +}; + + +/**************************************************************************** + * Management firmware state * + ****************************************************************************/ +/* Allocate 440 bytes for management firmware */ +#define MGMTFW_STATE_WORD_SIZE 110 + +struct mgmtfw_state { + u32 opaque[MGMTFW_STATE_WORD_SIZE]; +}; + + +/**************************************************************************** + * Multi-Function configuration * + ****************************************************************************/ +struct shared_mf_cfg { + + u32 clp_mb; +#define SHARED_MF_CLP_SET_DEFAULT 0x00000000 + /* set by CLP */ +#define SHARED_MF_CLP_EXIT 0x00000001 + /* set by MCP */ +#define SHARED_MF_CLP_EXIT_DONE 0x00010000 + +}; + +struct port_mf_cfg { + + u32 dynamic_cfg; /* device control channel */ +#define PORT_MF_CFG_E1HVN_TAG_MASK 0x0000ffff +#define PORT_MF_CFG_E1HVN_TAG_SHIFT 0 +#define PORT_MF_CFG_DYNAMIC_CFG_ENABLED 0x00010000 +#define PORT_MF_CFG_DYNAMIC_CFG_DEFAULT 0x00000000 + + u32 reserved[3]; + +}; + +struct func_mf_cfg { + + u32 config; + /* E/R/I/D */ + /* function 0 of each port cannot be hidden */ +#define FUNC_MF_CFG_FUNC_HIDE 0x00000001 + +#define FUNC_MF_CFG_PROTOCOL_MASK 0x00000007 +#define FUNC_MF_CFG_PROTOCOL_ETHERNET 0x00000002 +#define FUNC_MF_CFG_PROTOCOL_ETHERNET_WITH_RDMA 0x00000004 +#define FUNC_MF_CFG_PROTOCOL_ISCSI 0x00000006 +#define FUNC_MF_CFG_PROTOCOL_DEFAULT\ + FUNC_MF_CFG_PROTOCOL_ETHERNET_WITH_RDMA + +#define FUNC_MF_CFG_FUNC_DISABLED 0x00000008 + + /* PRI */ + /* 0 - low priority, 3 - high priority */ +#define FUNC_MF_CFG_TRANSMIT_PRIORITY_MASK 0x00000300 +#define FUNC_MF_CFG_TRANSMIT_PRIORITY_SHIFT 8 +#define FUNC_MF_CFG_TRANSMIT_PRIORITY_DEFAULT 0x00000000 + + /* MINBW, MAXBW */ + /* value range - 0..100, increments in 100Mbps */ +#define FUNC_MF_CFG_MIN_BW_MASK 0x00ff0000 +#define FUNC_MF_CFG_MIN_BW_SHIFT 16 +#define FUNC_MF_CFG_MIN_BW_DEFAULT 0x00000000 +#define FUNC_MF_CFG_MAX_BW_MASK 0xff000000 +#define FUNC_MF_CFG_MAX_BW_SHIFT 24 +#define FUNC_MF_CFG_MAX_BW_DEFAULT 0x64000000 + + u32 mac_upper; /* MAC */ +#define FUNC_MF_CFG_UPPERMAC_MASK 0x0000ffff +#define FUNC_MF_CFG_UPPERMAC_SHIFT 0 +#define FUNC_MF_CFG_UPPERMAC_DEFAULT FUNC_MF_CFG_UPPERMAC_MASK + u32 mac_lower; +#define FUNC_MF_CFG_LOWERMAC_DEFAULT 0xffffffff + + u32 e1hov_tag; /* VNI */ +#define FUNC_MF_CFG_E1HOV_TAG_MASK 0x0000ffff +#define FUNC_MF_CFG_E1HOV_TAG_SHIFT 0 +#define FUNC_MF_CFG_E1HOV_TAG_DEFAULT FUNC_MF_CFG_E1HOV_TAG_MASK + + u32 reserved[2]; + +}; + +struct mf_cfg { + + struct shared_mf_cfg shared_mf_config; + struct port_mf_cfg port_mf_config[PORT_MAX]; + struct func_mf_cfg func_mf_config[E1H_FUNC_MAX]; + +}; + + +/**************************************************************************** + * Shared Memory Region * + ****************************************************************************/ +struct shmem_region { /* SharedMem Offset (size) */ + + u32 validity_map[PORT_MAX]; /* 0x0 (4*2 = 0x8) */ +#define SHR_MEM_FORMAT_REV_ID ('A'<<24) +#define SHR_MEM_FORMAT_REV_MASK 0xff000000 + /* validity bits */ +#define SHR_MEM_VALIDITY_PCI_CFG 0x00100000 +#define SHR_MEM_VALIDITY_MB 0x00200000 +#define SHR_MEM_VALIDITY_DEV_INFO 0x00400000 +#define SHR_MEM_VALIDITY_RESERVED 0x00000007 + /* One licensing bit should be set */ +#define SHR_MEM_VALIDITY_LIC_KEY_IN_EFFECT_MASK 0x00000038 +#define SHR_MEM_VALIDITY_LIC_MANUF_KEY_IN_EFFECT 0x00000008 +#define SHR_MEM_VALIDITY_LIC_UPGRADE_KEY_IN_EFFECT 0x00000010 +#define SHR_MEM_VALIDITY_LIC_NO_KEY_IN_EFFECT 0x00000020 + /* Active MFW */ +#define SHR_MEM_VALIDITY_ACTIVE_MFW_UNKNOWN 0x00000000 +#define SHR_MEM_VALIDITY_ACTIVE_MFW_IPMI 0x00000040 +#define SHR_MEM_VALIDITY_ACTIVE_MFW_UMP 0x00000080 +#define SHR_MEM_VALIDITY_ACTIVE_MFW_NCSI 0x000000c0 +#define SHR_MEM_VALIDITY_ACTIVE_MFW_NONE 0x000001c0 +#define SHR_MEM_VALIDITY_ACTIVE_MFW_MASK 0x000001c0 + + struct shm_dev_info dev_info; /* 0x8 (0x438) */ + +struct license_key drv_lic_key[PORT_MAX]; /* 0x440 (52*2=0x68) */ + + /* FW information (for internal FW use) */ + u32 fw_info_fio_offset; /* 0x4a8 (0x4) */ + struct mgmtfw_state mgmtfw_state; /* 0x4ac (0x1b8) */ + + struct drv_port_mb port_mb[PORT_MAX]; /* 0x664 (16*2=0x20) */ +#if !defined(b710) /* BNX2X_UPSTREAM */ + struct drv_func_mb func_mb[E1H_FUNC_MAX]; +#else + struct drv_func_mb func_mb[E1_FUNC_MAX]; /* 0x684 (44*2=0x58) */ +#endif + +#if !defined(b710) /* BNX2X_UPSTREAM */ + struct mf_cfg mf_cfg; +#endif + +}; /* 0x6dc */ + + +struct emac_stats { + u32 rx_stat_ifhcinoctets; + u32 rx_stat_ifhcinbadoctets; + u32 rx_stat_etherstatsfragments; + u32 rx_stat_ifhcinucastpkts; + u32 rx_stat_ifhcinmulticastpkts; + u32 rx_stat_ifhcinbroadcastpkts; + u32 rx_stat_dot3statsfcserrors; + u32 rx_stat_dot3statsalignmenterrors; + u32 rx_stat_dot3statscarriersenseerrors; + u32 rx_stat_xonpauseframesreceived; + u32 rx_stat_xoffpauseframesreceived; + u32 rx_stat_maccontrolframesreceived; + u32 rx_stat_xoffstateentered; + u32 rx_stat_dot3statsframestoolong; + u32 rx_stat_etherstatsjabbers; + u32 rx_stat_etherstatsundersizepkts; + u32 rx_stat_etherstatspkts64octets; + u32 rx_stat_etherstatspkts65octetsto127octets; + u32 rx_stat_etherstatspkts128octetsto255octets; + u32 rx_stat_etherstatspkts256octetsto511octets; + u32 rx_stat_etherstatspkts512octetsto1023octets; + u32 rx_stat_etherstatspkts1024octetsto1522octets; + u32 rx_stat_etherstatspktsover1522octets; + + u32 rx_stat_falsecarriererrors; + + u32 tx_stat_ifhcoutoctets; + u32 tx_stat_ifhcoutbadoctets; + u32 tx_stat_etherstatscollisions; + u32 tx_stat_outxonsent; + u32 tx_stat_outxoffsent; + u32 tx_stat_flowcontroldone; + u32 tx_stat_dot3statssinglecollisionframes; + u32 tx_stat_dot3statsmultiplecollisionframes; + u32 tx_stat_dot3statsdeferredtransmissions; + u32 tx_stat_dot3statsexcessivecollisions; + u32 tx_stat_dot3statslatecollisions; + u32 tx_stat_ifhcoutucastpkts; + u32 tx_stat_ifhcoutmulticastpkts; + u32 tx_stat_ifhcoutbroadcastpkts; + u32 tx_stat_etherstatspkts64octets; + u32 tx_stat_etherstatspkts65octetsto127octets; + u32 tx_stat_etherstatspkts128octetsto255octets; + u32 tx_stat_etherstatspkts256octetsto511octets; + u32 tx_stat_etherstatspkts512octetsto1023octets; + u32 tx_stat_etherstatspkts1024octetsto1522octets; + u32 tx_stat_etherstatspktsover1522octets; + u32 tx_stat_dot3statsinternalmactransmiterrors; +}; + + +struct bmac_stats { + u32 tx_stat_gtpkt_lo; + u32 tx_stat_gtpkt_hi; + u32 tx_stat_gtxpf_lo; + u32 tx_stat_gtxpf_hi; + u32 tx_stat_gtfcs_lo; + u32 tx_stat_gtfcs_hi; + u32 tx_stat_gtmca_lo; + u32 tx_stat_gtmca_hi; + u32 tx_stat_gtbca_lo; + u32 tx_stat_gtbca_hi; + u32 tx_stat_gtfrg_lo; + u32 tx_stat_gtfrg_hi; + u32 tx_stat_gtovr_lo; + u32 tx_stat_gtovr_hi; + u32 tx_stat_gt64_lo; + u32 tx_stat_gt64_hi; + u32 tx_stat_gt127_lo; + u32 tx_stat_gt127_hi; + u32 tx_stat_gt255_lo; + u32 tx_stat_gt255_hi; + u32 tx_stat_gt511_lo; + u32 tx_stat_gt511_hi; + u32 tx_stat_gt1023_lo; + u32 tx_stat_gt1023_hi; + u32 tx_stat_gt1518_lo; + u32 tx_stat_gt1518_hi; + u32 tx_stat_gt2047_lo; + u32 tx_stat_gt2047_hi; + u32 tx_stat_gt4095_lo; + u32 tx_stat_gt4095_hi; + u32 tx_stat_gt9216_lo; + u32 tx_stat_gt9216_hi; + u32 tx_stat_gt16383_lo; + u32 tx_stat_gt16383_hi; + u32 tx_stat_gtmax_lo; + u32 tx_stat_gtmax_hi; + u32 tx_stat_gtufl_lo; + u32 tx_stat_gtufl_hi; + u32 tx_stat_gterr_lo; + u32 tx_stat_gterr_hi; + u32 tx_stat_gtbyt_lo; + u32 tx_stat_gtbyt_hi; + + u32 rx_stat_gr64_lo; + u32 rx_stat_gr64_hi; + u32 rx_stat_gr127_lo; + u32 rx_stat_gr127_hi; + u32 rx_stat_gr255_lo; + u32 rx_stat_gr255_hi; + u32 rx_stat_gr511_lo; + u32 rx_stat_gr511_hi; + u32 rx_stat_gr1023_lo; + u32 rx_stat_gr1023_hi; + u32 rx_stat_gr1518_lo; + u32 rx_stat_gr1518_hi; + u32 rx_stat_gr2047_lo; + u32 rx_stat_gr2047_hi; + u32 rx_stat_gr4095_lo; + u32 rx_stat_gr4095_hi; + u32 rx_stat_gr9216_lo; + u32 rx_stat_gr9216_hi; + u32 rx_stat_gr16383_lo; + u32 rx_stat_gr16383_hi; + u32 rx_stat_grmax_lo; + u32 rx_stat_grmax_hi; + u32 rx_stat_grpkt_lo; + u32 rx_stat_grpkt_hi; + u32 rx_stat_grfcs_lo; + u32 rx_stat_grfcs_hi; + u32 rx_stat_grmca_lo; + u32 rx_stat_grmca_hi; + u32 rx_stat_grbca_lo; + u32 rx_stat_grbca_hi; + u32 rx_stat_grxcf_lo; + u32 rx_stat_grxcf_hi; + u32 rx_stat_grxpf_lo; + u32 rx_stat_grxpf_hi; + u32 rx_stat_grxuo_lo; + u32 rx_stat_grxuo_hi; + u32 rx_stat_grjbr_lo; + u32 rx_stat_grjbr_hi; + u32 rx_stat_grovr_lo; + u32 rx_stat_grovr_hi; + u32 rx_stat_grflr_lo; + u32 rx_stat_grflr_hi; + u32 rx_stat_grmeg_lo; + u32 rx_stat_grmeg_hi; + u32 rx_stat_grmeb_lo; + u32 rx_stat_grmeb_hi; + u32 rx_stat_grbyt_lo; + u32 rx_stat_grbyt_hi; + u32 rx_stat_grund_lo; + u32 rx_stat_grund_hi; + u32 rx_stat_grfrg_lo; + u32 rx_stat_grfrg_hi; + u32 rx_stat_grerb_lo; + u32 rx_stat_grerb_hi; + u32 rx_stat_grfre_lo; + u32 rx_stat_grfre_hi; + u32 rx_stat_gripj_lo; + u32 rx_stat_gripj_hi; +}; + + +union mac_stats { + struct emac_stats emac_stats; + struct bmac_stats bmac_stats; +}; + + +struct mac_stx { + /* in_bad_octets */ + u32 rx_stat_ifhcinbadoctets_hi; + u32 rx_stat_ifhcinbadoctets_lo; + + /* out_bad_octets */ + u32 tx_stat_ifhcoutbadoctets_hi; + u32 tx_stat_ifhcoutbadoctets_lo; + + /* crc_receive_errors */ + u32 rx_stat_dot3statsfcserrors_hi; + u32 rx_stat_dot3statsfcserrors_lo; + /* alignment_errors */ + u32 rx_stat_dot3statsalignmenterrors_hi; + u32 rx_stat_dot3statsalignmenterrors_lo; + /* carrier_sense_errors */ + u32 rx_stat_dot3statscarriersenseerrors_hi; + u32 rx_stat_dot3statscarriersenseerrors_lo; + /* false_carrier_detections */ + u32 rx_stat_falsecarriererrors_hi; + u32 rx_stat_falsecarriererrors_lo; + + /* runt_packets_received */ + u32 rx_stat_etherstatsundersizepkts_hi; + u32 rx_stat_etherstatsundersizepkts_lo; + /* jabber_packets_received */ + u32 rx_stat_dot3statsframestoolong_hi; + u32 rx_stat_dot3statsframestoolong_lo; + + /* error_runt_packets_received */ + u32 rx_stat_etherstatsfragments_hi; + u32 rx_stat_etherstatsfragments_lo; + /* error_jabber_packets_received */ + u32 rx_stat_etherstatsjabbers_hi; + u32 rx_stat_etherstatsjabbers_lo; + + /* control_frames_received */ + u32 rx_stat_maccontrolframesreceived_hi; + u32 rx_stat_maccontrolframesreceived_lo; + u32 rx_stat_bmac_xpf_hi; + u32 rx_stat_bmac_xpf_lo; + u32 rx_stat_bmac_xcf_hi; + u32 rx_stat_bmac_xcf_lo; + + /* xoff_state_entered */ + u32 rx_stat_xoffstateentered_hi; + u32 rx_stat_xoffstateentered_lo; + /* pause_xon_frames_received */ + u32 rx_stat_xonpauseframesreceived_hi; + u32 rx_stat_xonpauseframesreceived_lo; + /* pause_xoff_frames_received */ + u32 rx_stat_xoffpauseframesreceived_hi; + u32 rx_stat_xoffpauseframesreceived_lo; + /* pause_xon_frames_transmitted */ + u32 tx_stat_outxonsent_hi; + u32 tx_stat_outxonsent_lo; + /* pause_xoff_frames_transmitted */ + u32 tx_stat_outxoffsent_hi; + u32 tx_stat_outxoffsent_lo; + /* flow_control_done */ + u32 tx_stat_flowcontroldone_hi; + u32 tx_stat_flowcontroldone_lo; + + /* ether_stats_collisions */ + u32 tx_stat_etherstatscollisions_hi; + u32 tx_stat_etherstatscollisions_lo; + /* single_collision_transmit_frames */ + u32 tx_stat_dot3statssinglecollisionframes_hi; + u32 tx_stat_dot3statssinglecollisionframes_lo; + /* multiple_collision_transmit_frames */ + u32 tx_stat_dot3statsmultiplecollisionframes_hi; + u32 tx_stat_dot3statsmultiplecollisionframes_lo; + /* deferred_transmissions */ + u32 tx_stat_dot3statsdeferredtransmissions_hi; + u32 tx_stat_dot3statsdeferredtransmissions_lo; + /* excessive_collision_frames */ + u32 tx_stat_dot3statsexcessivecollisions_hi; + u32 tx_stat_dot3statsexcessivecollisions_lo; + /* late_collision_frames */ + u32 tx_stat_dot3statslatecollisions_hi; + u32 tx_stat_dot3statslatecollisions_lo; + + /* frames_transmitted_64_bytes */ + u32 tx_stat_etherstatspkts64octets_hi; + u32 tx_stat_etherstatspkts64octets_lo; + /* frames_transmitted_65_127_bytes */ + u32 tx_stat_etherstatspkts65octetsto127octets_hi; + u32 tx_stat_etherstatspkts65octetsto127octets_lo; + /* frames_transmitted_128_255_bytes */ + u32 tx_stat_etherstatspkts128octetsto255octets_hi; + u32 tx_stat_etherstatspkts128octetsto255octets_lo; + /* frames_transmitted_256_511_bytes */ + u32 tx_stat_etherstatspkts256octetsto511octets_hi; + u32 tx_stat_etherstatspkts256octetsto511octets_lo; + /* frames_transmitted_512_1023_bytes */ + u32 tx_stat_etherstatspkts512octetsto1023octets_hi; + u32 tx_stat_etherstatspkts512octetsto1023octets_lo; + /* frames_transmitted_1024_1522_bytes */ + u32 tx_stat_etherstatspkts1024octetsto1522octets_hi; + u32 tx_stat_etherstatspkts1024octetsto1522octets_lo; + /* frames_transmitted_1523_9022_bytes */ + u32 tx_stat_etherstatspktsover1522octets_hi; + u32 tx_stat_etherstatspktsover1522octets_lo; + u32 tx_stat_bmac_2047_hi; + u32 tx_stat_bmac_2047_lo; + u32 tx_stat_bmac_4095_hi; + u32 tx_stat_bmac_4095_lo; + u32 tx_stat_bmac_9216_hi; + u32 tx_stat_bmac_9216_lo; + u32 tx_stat_bmac_16383_hi; + u32 tx_stat_bmac_16383_lo; + + /* internal_mac_transmit_errors */ + u32 tx_stat_dot3statsinternalmactransmiterrors_hi; + u32 tx_stat_dot3statsinternalmactransmiterrors_lo; + + /* if_out_discards */ + u32 tx_stat_bmac_ufl_hi; + u32 tx_stat_bmac_ufl_lo; +}; + + +#define MAC_STX_IDX_MAX 2 + +struct host_port_stats { + u32 host_port_stats_start; + + struct mac_stx mac_stx[MAC_STX_IDX_MAX]; + + u32 brb_drop_hi; + u32 brb_drop_lo; + + u32 host_port_stats_end; +}; + + +struct host_func_stats { + u32 host_func_stats_start; + + u32 total_bytes_received_hi; + u32 total_bytes_received_lo; + + u32 total_bytes_transmitted_hi; + u32 total_bytes_transmitted_lo; + + u32 total_unicast_packets_received_hi; + u32 total_unicast_packets_received_lo; + + u32 total_multicast_packets_received_hi; + u32 total_multicast_packets_received_lo; + + u32 total_broadcast_packets_received_hi; + u32 total_broadcast_packets_received_lo; + + u32 total_unicast_packets_transmitted_hi; + u32 total_unicast_packets_transmitted_lo; + + u32 total_multicast_packets_transmitted_hi; + u32 total_multicast_packets_transmitted_lo; + + u32 total_broadcast_packets_transmitted_hi; + u32 total_broadcast_packets_transmitted_lo; + + u32 valid_bytes_received_hi; + u32 valid_bytes_received_lo; + + u32 host_func_stats_end; +}; + + +#define BCM_5710_FW_MAJOR_VERSION 4 +#define BCM_5710_FW_MINOR_VERSION 8 +#define BCM_5710_FW_REVISION_VERSION 57 +#define BCM_5710_FW_ENGINEERING_VERSION 0 +#define BCM_5710_FW_COMPILE_FLAGS 1 + + +/* + * attention bits + */ +struct atten_def_status_block { + __le32 attn_bits; + __le32 attn_bits_ack; + u8 status_block_id; + u8 reserved0; + __le16 attn_bits_index; + __le32 reserved1; +}; + + +/* + * common data for all protocols + */ +struct doorbell_hdr { + u8 header; +#define DOORBELL_HDR_RX (0x1<<0) +#define DOORBELL_HDR_RX_SHIFT 0 +#define DOORBELL_HDR_DB_TYPE (0x1<<1) +#define DOORBELL_HDR_DB_TYPE_SHIFT 1 +#define DOORBELL_HDR_DPM_SIZE (0x3<<2) +#define DOORBELL_HDR_DPM_SIZE_SHIFT 2 +#define DOORBELL_HDR_CONN_TYPE (0xF<<4) +#define DOORBELL_HDR_CONN_TYPE_SHIFT 4 +}; + +/* + * doorbell message sent to the chip + */ +struct doorbell { +#if defined(__BIG_ENDIAN) + u16 zero_fill2; + u8 zero_fill1; + struct doorbell_hdr header; +#elif defined(__LITTLE_ENDIAN) + struct doorbell_hdr header; + u8 zero_fill1; + u16 zero_fill2; +#endif +}; + + +/* + * IGU driver acknowledgement register + */ +struct igu_ack_register { +#if defined(__BIG_ENDIAN) + u16 sb_id_and_flags; +#define IGU_ACK_REGISTER_STATUS_BLOCK_ID (0x1F<<0) +#define IGU_ACK_REGISTER_STATUS_BLOCK_ID_SHIFT 0 +#define IGU_ACK_REGISTER_STORM_ID (0x7<<5) +#define IGU_ACK_REGISTER_STORM_ID_SHIFT 5 +#define IGU_ACK_REGISTER_UPDATE_INDEX (0x1<<8) +#define IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT 8 +#define IGU_ACK_REGISTER_INTERRUPT_MODE (0x3<<9) +#define IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT 9 +#define IGU_ACK_REGISTER_RESERVED (0x1F<<11) +#define IGU_ACK_REGISTER_RESERVED_SHIFT 11 + u16 status_block_index; +#elif defined(__LITTLE_ENDIAN) + u16 status_block_index; + u16 sb_id_and_flags; +#define IGU_ACK_REGISTER_STATUS_BLOCK_ID (0x1F<<0) +#define IGU_ACK_REGISTER_STATUS_BLOCK_ID_SHIFT 0 +#define IGU_ACK_REGISTER_STORM_ID (0x7<<5) +#define IGU_ACK_REGISTER_STORM_ID_SHIFT 5 +#define IGU_ACK_REGISTER_UPDATE_INDEX (0x1<<8) +#define IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT 8 +#define IGU_ACK_REGISTER_INTERRUPT_MODE (0x3<<9) +#define IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT 9 +#define IGU_ACK_REGISTER_RESERVED (0x1F<<11) +#define IGU_ACK_REGISTER_RESERVED_SHIFT 11 +#endif +}; + + +/* + * Parser parsing flags field + */ +struct parsing_flags { + __le16 flags; +#define PARSING_FLAGS_ETHERNET_ADDRESS_TYPE (0x1<<0) +#define PARSING_FLAGS_ETHERNET_ADDRESS_TYPE_SHIFT 0 +#define PARSING_FLAGS_VLAN (0x1<<1) +#define PARSING_FLAGS_VLAN_SHIFT 1 +#define PARSING_FLAGS_EXTRA_VLAN (0x1<<2) +#define PARSING_FLAGS_EXTRA_VLAN_SHIFT 2 +#define PARSING_FLAGS_OVER_ETHERNET_PROTOCOL (0x3<<3) +#define PARSING_FLAGS_OVER_ETHERNET_PROTOCOL_SHIFT 3 +#define PARSING_FLAGS_IP_OPTIONS (0x1<<5) +#define PARSING_FLAGS_IP_OPTIONS_SHIFT 5 +#define PARSING_FLAGS_FRAGMENTATION_STATUS (0x1<<6) +#define PARSING_FLAGS_FRAGMENTATION_STATUS_SHIFT 6 +#define PARSING_FLAGS_OVER_IP_PROTOCOL (0x3<<7) +#define PARSING_FLAGS_OVER_IP_PROTOCOL_SHIFT 7 +#define PARSING_FLAGS_PURE_ACK_INDICATION (0x1<<9) +#define PARSING_FLAGS_PURE_ACK_INDICATION_SHIFT 9 +#define PARSING_FLAGS_TCP_OPTIONS_EXIST (0x1<<10) +#define PARSING_FLAGS_TCP_OPTIONS_EXIST_SHIFT 10 +#define PARSING_FLAGS_TIME_STAMP_EXIST_FLAG (0x1<<11) +#define PARSING_FLAGS_TIME_STAMP_EXIST_FLAG_SHIFT 11 +#define PARSING_FLAGS_CONNECTION_MATCH (0x1<<12) +#define PARSING_FLAGS_CONNECTION_MATCH_SHIFT 12 +#define PARSING_FLAGS_LLC_SNAP (0x1<<13) +#define PARSING_FLAGS_LLC_SNAP_SHIFT 13 +#define PARSING_FLAGS_RESERVED0 (0x3<<14) +#define PARSING_FLAGS_RESERVED0_SHIFT 14 +}; + + +struct regpair { + __le32 lo; + __le32 hi; +}; + + +/* + * dmae command structure + */ +struct dmae_command { + u32 opcode; +#define DMAE_COMMAND_SRC (0x1<<0) +#define DMAE_COMMAND_SRC_SHIFT 0 +#define DMAE_COMMAND_DST (0x3<<1) +#define DMAE_COMMAND_DST_SHIFT 1 +#define DMAE_COMMAND_C_DST (0x1<<3) +#define DMAE_COMMAND_C_DST_SHIFT 3 +#define DMAE_COMMAND_C_TYPE_ENABLE (0x1<<4) +#define DMAE_COMMAND_C_TYPE_ENABLE_SHIFT 4 +#define DMAE_COMMAND_C_TYPE_CRC_ENABLE (0x1<<5) +#define DMAE_COMMAND_C_TYPE_CRC_ENABLE_SHIFT 5 +#define DMAE_COMMAND_C_TYPE_CRC_OFFSET (0x7<<6) +#define DMAE_COMMAND_C_TYPE_CRC_OFFSET_SHIFT 6 +#define DMAE_COMMAND_ENDIANITY (0x3<<9) +#define DMAE_COMMAND_ENDIANITY_SHIFT 9 +#define DMAE_COMMAND_PORT (0x1<<11) +#define DMAE_COMMAND_PORT_SHIFT 11 +#define DMAE_COMMAND_CRC_RESET (0x1<<12) +#define DMAE_COMMAND_CRC_RESET_SHIFT 12 +#define DMAE_COMMAND_SRC_RESET (0x1<<13) +#define DMAE_COMMAND_SRC_RESET_SHIFT 13 +#define DMAE_COMMAND_DST_RESET (0x1<<14) +#define DMAE_COMMAND_DST_RESET_SHIFT 14 +#define DMAE_COMMAND_E1HVN (0x3<<15) +#define DMAE_COMMAND_E1HVN_SHIFT 15 +#define DMAE_COMMAND_RESERVED0 (0x7FFF<<17) +#define DMAE_COMMAND_RESERVED0_SHIFT 17 + u32 src_addr_lo; + u32 src_addr_hi; + u32 dst_addr_lo; + u32 dst_addr_hi; +#if defined(__BIG_ENDIAN) + u16 reserved1; + u16 len; +#elif defined(__LITTLE_ENDIAN) + u16 len; + u16 reserved1; +#endif + u32 comp_addr_lo; + u32 comp_addr_hi; + u32 comp_val; + u32 crc32; + u32 crc32_c; +#if defined(__BIG_ENDIAN) + u16 crc16_c; + u16 crc16; +#elif defined(__LITTLE_ENDIAN) + u16 crc16; + u16 crc16_c; +#endif +#if defined(__BIG_ENDIAN) + u16 reserved2; + u16 crc_t10; +#elif defined(__LITTLE_ENDIAN) + u16 crc_t10; + u16 reserved2; +#endif +#if defined(__BIG_ENDIAN) + u16 xsum8; + u16 xsum16; +#elif defined(__LITTLE_ENDIAN) + u16 xsum16; + u16 xsum8; +#endif +}; + + +struct double_regpair { + u32 regpair0_lo; + u32 regpair0_hi; + u32 regpair1_lo; + u32 regpair1_hi; +}; + + +/* + * The eth storm context of Ustorm (configuration part) + */ +struct ustorm_eth_st_context_config { +#if defined(__BIG_ENDIAN) + u8 flags; +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT (0x1<<0) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT_SHIFT 0 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC (0x1<<1) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC_SHIFT 1 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA (0x1<<2) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA_SHIFT 2 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING (0x1<<3) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING_SHIFT 3 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS (0x1<<4) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS_SHIFT 4 +#define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0 (0x7<<5) +#define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0_SHIFT 5 + u8 status_block_id; + u8 clientId; + u8 sb_index_numbers; +#define USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER (0xF<<0) +#define USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER_SHIFT 0 +#define USTORM_ETH_ST_CONTEXT_CONFIG_BD_SB_INDEX_NUMBER (0xF<<4) +#define USTORM_ETH_ST_CONTEXT_CONFIG_BD_SB_INDEX_NUMBER_SHIFT 4 +#elif defined(__LITTLE_ENDIAN) + u8 sb_index_numbers; +#define USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER (0xF<<0) +#define USTORM_ETH_ST_CONTEXT_CONFIG_CQE_SB_INDEX_NUMBER_SHIFT 0 +#define USTORM_ETH_ST_CONTEXT_CONFIG_BD_SB_INDEX_NUMBER (0xF<<4) +#define USTORM_ETH_ST_CONTEXT_CONFIG_BD_SB_INDEX_NUMBER_SHIFT 4 + u8 clientId; + u8 status_block_id; + u8 flags; +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT (0x1<<0) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_MC_ALIGNMENT_SHIFT 0 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC (0x1<<1) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_DYNAMIC_HC_SHIFT 1 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA (0x1<<2) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_TPA_SHIFT 2 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING (0x1<<3) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_SGE_RING_SHIFT 3 +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS (0x1<<4) +#define USTORM_ETH_ST_CONTEXT_CONFIG_ENABLE_STATISTICS_SHIFT 4 +#define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0 (0x7<<5) +#define __USTORM_ETH_ST_CONTEXT_CONFIG_RESERVED0_SHIFT 5 +#endif +#if defined(__BIG_ENDIAN) + u16 bd_buff_size; + u8 statistics_counter_id; + u8 mc_alignment_log_size; +#elif defined(__LITTLE_ENDIAN) + u8 mc_alignment_log_size; + u8 statistics_counter_id; + u16 bd_buff_size; +#endif +#if defined(__BIG_ENDIAN) + u8 __local_sge_prod; + u8 __local_bd_prod; + u16 sge_buff_size; +#elif defined(__LITTLE_ENDIAN) + u16 sge_buff_size; + u8 __local_bd_prod; + u8 __local_sge_prod; +#endif + u32 reserved; + u32 bd_page_base_lo; + u32 bd_page_base_hi; + u32 sge_page_base_lo; + u32 sge_page_base_hi; +}; + +/* + * The eth Rx Buffer Descriptor + */ +struct eth_rx_bd { + __le32 addr_lo; + __le32 addr_hi; +}; + +/* + * The eth Rx SGE Descriptor + */ +struct eth_rx_sge { + __le32 addr_lo; + __le32 addr_hi; +}; + +/* + * Local BDs and SGEs rings (in ETH) + */ +struct eth_local_rx_rings { + struct eth_rx_bd __local_bd_ring[16]; + struct eth_rx_sge __local_sge_ring[12]; +}; + +/* + * The eth storm context of Ustorm + */ +struct ustorm_eth_st_context { + struct ustorm_eth_st_context_config common; + struct eth_local_rx_rings __rings; +}; + +/* + * The eth storm context of Tstorm + */ +struct tstorm_eth_st_context { + u32 __reserved0[28]; +}; + +/* + * The eth aggregative context section of Xstorm + */ +struct xstorm_eth_extra_ag_context_section { +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars1; + u8 __reserved50; + u16 __mss; +#elif defined(__LITTLE_ENDIAN) + u16 __mss; + u8 __reserved50; + u8 __tcp_agg_vars1; +#endif + u32 __snd_nxt; + u32 __tx_wnd; + u32 __snd_una; + u32 __reserved53; +#if defined(__BIG_ENDIAN) + u8 __agg_val8_th; + u8 __agg_val8; + u16 __tcp_agg_vars2; +#elif defined(__LITTLE_ENDIAN) + u16 __tcp_agg_vars2; + u8 __agg_val8; + u8 __agg_val8_th; +#endif + u32 __reserved58; + u32 __reserved59; + u32 __reserved60; + u32 __reserved61; +#if defined(__BIG_ENDIAN) + u16 __agg_val7_th; + u16 __agg_val7; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val7; + u16 __agg_val7_th; +#endif +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars5; + u8 __tcp_agg_vars4; + u8 __tcp_agg_vars3; + u8 __reserved62; +#elif defined(__LITTLE_ENDIAN) + u8 __reserved62; + u8 __tcp_agg_vars3; + u8 __tcp_agg_vars4; + u8 __tcp_agg_vars5; +#endif + u32 __tcp_agg_vars6; +#if defined(__BIG_ENDIAN) + u16 __agg_misc6; + u16 __tcp_agg_vars7; +#elif defined(__LITTLE_ENDIAN) + u16 __tcp_agg_vars7; + u16 __agg_misc6; +#endif + u32 __agg_val10; + u32 __agg_val10_th; +#if defined(__BIG_ENDIAN) + u16 __reserved3; + u8 __reserved2; + u8 __da_only_cnt; +#elif defined(__LITTLE_ENDIAN) + u8 __da_only_cnt; + u8 __reserved2; + u16 __reserved3; +#endif +}; + +/* + * The eth aggregative context of Xstorm + */ +struct xstorm_eth_ag_context { +#if defined(__BIG_ENDIAN) + u16 __bd_prod; + u8 __agg_vars1; + u8 __state; +#elif defined(__LITTLE_ENDIAN) + u8 __state; + u8 __agg_vars1; + u16 __bd_prod; +#endif +#if defined(__BIG_ENDIAN) + u8 cdu_reserved; + u8 __agg_vars4; + u8 __agg_vars3; + u8 __agg_vars2; +#elif defined(__LITTLE_ENDIAN) + u8 __agg_vars2; + u8 __agg_vars3; + u8 __agg_vars4; + u8 cdu_reserved; +#endif + u32 __more_packets_to_send; +#if defined(__BIG_ENDIAN) + u16 __agg_vars5; + u16 __agg_val4_th; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val4_th; + u16 __agg_vars5; +#endif + struct xstorm_eth_extra_ag_context_section __extra_section; +#if defined(__BIG_ENDIAN) + u16 __agg_vars7; + u8 __agg_val3_th; + u8 __agg_vars6; +#elif defined(__LITTLE_ENDIAN) + u8 __agg_vars6; + u8 __agg_val3_th; + u16 __agg_vars7; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val11_th; + u16 __agg_val11; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val11; + u16 __agg_val11_th; +#endif +#if defined(__BIG_ENDIAN) + u8 __reserved1; + u8 __agg_val6_th; + u16 __agg_val9; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val9; + u8 __agg_val6_th; + u8 __reserved1; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val2_th; + u16 __agg_val2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val2; + u16 __agg_val2_th; +#endif + u32 __agg_vars8; +#if defined(__BIG_ENDIAN) + u16 __agg_misc0; + u16 __agg_val4; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val4; + u16 __agg_misc0; +#endif +#if defined(__BIG_ENDIAN) + u8 __agg_val3; + u8 __agg_val6; + u8 __agg_val5_th; + u8 __agg_val5; +#elif defined(__LITTLE_ENDIAN) + u8 __agg_val5; + u8 __agg_val5_th; + u8 __agg_val6; + u8 __agg_val3; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_misc1; + u16 __bd_ind_max_val; +#elif defined(__LITTLE_ENDIAN) + u16 __bd_ind_max_val; + u16 __agg_misc1; +#endif + u32 __reserved57; + u32 __agg_misc4; + u32 __agg_misc5; +}; + +/* + * The eth extra aggregative context section of Tstorm + */ +struct tstorm_eth_extra_ag_context_section { + u32 __agg_val1; +#if defined(__BIG_ENDIAN) + u8 __tcp_agg_vars2; + u8 __agg_val3; + u16 __agg_val2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val2; + u8 __agg_val3; + u8 __tcp_agg_vars2; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val5; + u8 __agg_val6; + u8 __tcp_agg_vars3; +#elif defined(__LITTLE_ENDIAN) + u8 __tcp_agg_vars3; + u8 __agg_val6; + u16 __agg_val5; +#endif + u32 __reserved63; + u32 __reserved64; + u32 __reserved65; + u32 __reserved66; + u32 __reserved67; + u32 __tcp_agg_vars1; + u32 __reserved61; + u32 __reserved62; + u32 __reserved2; +}; + +/* + * The eth aggregative context of Tstorm + */ +struct tstorm_eth_ag_context { +#if defined(__BIG_ENDIAN) + u16 __reserved54; + u8 __agg_vars1; + u8 __state; +#elif defined(__LITTLE_ENDIAN) + u8 __state; + u8 __agg_vars1; + u16 __reserved54; +#endif +#if defined(__BIG_ENDIAN) + u16 __agg_val4; + u16 __agg_vars2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_vars2; + u16 __agg_val4; +#endif + struct tstorm_eth_extra_ag_context_section __extra_section; +}; + +/* + * The eth aggregative context of Cstorm + */ +struct cstorm_eth_ag_context { + u32 __agg_vars1; +#if defined(__BIG_ENDIAN) + u8 __aux1_th; + u8 __aux1_val; + u16 __agg_vars2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_vars2; + u8 __aux1_val; + u8 __aux1_th; +#endif + u32 __num_of_treated_packet; + u32 __last_packet_treated; +#if defined(__BIG_ENDIAN) + u16 __reserved58; + u16 __reserved57; +#elif defined(__LITTLE_ENDIAN) + u16 __reserved57; + u16 __reserved58; +#endif +#if defined(__BIG_ENDIAN) + u8 __reserved62; + u8 __reserved61; + u8 __reserved60; + u8 __reserved59; +#elif defined(__LITTLE_ENDIAN) + u8 __reserved59; + u8 __reserved60; + u8 __reserved61; + u8 __reserved62; +#endif +#if defined(__BIG_ENDIAN) + u16 __reserved64; + u16 __reserved63; +#elif defined(__LITTLE_ENDIAN) + u16 __reserved63; + u16 __reserved64; +#endif + u32 __reserved65; +#if defined(__BIG_ENDIAN) + u16 __agg_vars3; + u16 __rq_inv_cnt; +#elif defined(__LITTLE_ENDIAN) + u16 __rq_inv_cnt; + u16 __agg_vars3; +#endif +#if defined(__BIG_ENDIAN) + u16 __packet_index_th; + u16 __packet_index; +#elif defined(__LITTLE_ENDIAN) + u16 __packet_index; + u16 __packet_index_th; +#endif +}; + +/* + * The eth aggregative context of Ustorm + */ +struct ustorm_eth_ag_context { +#if defined(__BIG_ENDIAN) + u8 __aux_counter_flags; + u8 __agg_vars2; + u8 __agg_vars1; + u8 __state; +#elif defined(__LITTLE_ENDIAN) + u8 __state; + u8 __agg_vars1; + u8 __agg_vars2; + u8 __aux_counter_flags; +#endif +#if defined(__BIG_ENDIAN) + u8 cdu_usage; + u8 __agg_misc2; + u16 __agg_misc1; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_misc1; + u8 __agg_misc2; + u8 cdu_usage; +#endif + u32 __agg_misc4; +#if defined(__BIG_ENDIAN) + u8 __agg_val3_th; + u8 __agg_val3; + u16 __agg_misc3; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_misc3; + u8 __agg_val3; + u8 __agg_val3_th; +#endif + u32 __agg_val1; + u32 __agg_misc4_th; +#if defined(__BIG_ENDIAN) + u16 __agg_val2_th; + u16 __agg_val2; +#elif defined(__LITTLE_ENDIAN) + u16 __agg_val2; + u16 __agg_val2_th; +#endif +#if defined(__BIG_ENDIAN) + u16 __reserved2; + u8 __decision_rules; + u8 __decision_rule_enable_bits; +#elif defined(__LITTLE_ENDIAN) + u8 __decision_rule_enable_bits; + u8 __decision_rules; + u16 __reserved2; +#endif +}; + +/* + * Timers connection context + */ +struct timers_block_context { + u32 __reserved_0; + u32 __reserved_1; + u32 __reserved_2; + u32 flags; +#define __TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS (0x3<<0) +#define __TIMERS_BLOCK_CONTEXT_NUM_OF_ACTIVE_TIMERS_SHIFT 0 +#define TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG (0x1<<2) +#define TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG_SHIFT 2 +#define __TIMERS_BLOCK_CONTEXT_RESERVED0 (0x1FFFFFFF<<3) +#define __TIMERS_BLOCK_CONTEXT_RESERVED0_SHIFT 3 +}; + +/* + * structure for easy accessbility to assembler + */ +struct eth_tx_bd_flags { + u8 as_bitfield; +#define ETH_TX_BD_FLAGS_VLAN_TAG (0x1<<0) +#define ETH_TX_BD_FLAGS_VLAN_TAG_SHIFT 0 +#define ETH_TX_BD_FLAGS_IP_CSUM (0x1<<1) +#define ETH_TX_BD_FLAGS_IP_CSUM_SHIFT 1 +#define ETH_TX_BD_FLAGS_TCP_CSUM (0x1<<2) +#define ETH_TX_BD_FLAGS_TCP_CSUM_SHIFT 2 +#define ETH_TX_BD_FLAGS_END_BD (0x1<<3) +#define ETH_TX_BD_FLAGS_END_BD_SHIFT 3 +#define ETH_TX_BD_FLAGS_START_BD (0x1<<4) +#define ETH_TX_BD_FLAGS_START_BD_SHIFT 4 +#define ETH_TX_BD_FLAGS_HDR_POOL (0x1<<5) +#define ETH_TX_BD_FLAGS_HDR_POOL_SHIFT 5 +#define ETH_TX_BD_FLAGS_SW_LSO (0x1<<6) +#define ETH_TX_BD_FLAGS_SW_LSO_SHIFT 6 +#define ETH_TX_BD_FLAGS_IPV6 (0x1<<7) +#define ETH_TX_BD_FLAGS_IPV6_SHIFT 7 +}; + +/* + * The eth Tx Buffer Descriptor + */ +struct eth_tx_bd { + __le32 addr_lo; + __le32 addr_hi; + __le16 nbd; + __le16 nbytes; + __le16 vlan; + struct eth_tx_bd_flags bd_flags; + u8 general_data; +#define ETH_TX_BD_HDR_NBDS (0x3F<<0) +#define ETH_TX_BD_HDR_NBDS_SHIFT 0 +#define ETH_TX_BD_ETH_ADDR_TYPE (0x3<<6) +#define ETH_TX_BD_ETH_ADDR_TYPE_SHIFT 6 +}; + +/* + * Tx parsing BD structure for ETH,Relevant in START + */ +struct eth_tx_parse_bd { + u8 global_data; +#define ETH_TX_PARSE_BD_IP_HDR_START_OFFSET (0xF<<0) +#define ETH_TX_PARSE_BD_IP_HDR_START_OFFSET_SHIFT 0 +#define ETH_TX_PARSE_BD_CS_ANY_FLG (0x1<<4) +#define ETH_TX_PARSE_BD_CS_ANY_FLG_SHIFT 4 +#define ETH_TX_PARSE_BD_PSEUDO_CS_WITHOUT_LEN (0x1<<5) +#define ETH_TX_PARSE_BD_PSEUDO_CS_WITHOUT_LEN_SHIFT 5 +#define ETH_TX_PARSE_BD_LLC_SNAP_EN (0x1<<6) +#define ETH_TX_PARSE_BD_LLC_SNAP_EN_SHIFT 6 +#define ETH_TX_PARSE_BD_NS_FLG (0x1<<7) +#define ETH_TX_PARSE_BD_NS_FLG_SHIFT 7 + u8 tcp_flags; +#define ETH_TX_PARSE_BD_FIN_FLG (0x1<<0) +#define ETH_TX_PARSE_BD_FIN_FLG_SHIFT 0 +#define ETH_TX_PARSE_BD_SYN_FLG (0x1<<1) +#define ETH_TX_PARSE_BD_SYN_FLG_SHIFT 1 +#define ETH_TX_PARSE_BD_RST_FLG (0x1<<2) +#define ETH_TX_PARSE_BD_RST_FLG_SHIFT 2 +#define ETH_TX_PARSE_BD_PSH_FLG (0x1<<3) +#define ETH_TX_PARSE_BD_PSH_FLG_SHIFT 3 +#define ETH_TX_PARSE_BD_ACK_FLG (0x1<<4) +#define ETH_TX_PARSE_BD_ACK_FLG_SHIFT 4 +#define ETH_TX_PARSE_BD_URG_FLG (0x1<<5) +#define ETH_TX_PARSE_BD_URG_FLG_SHIFT 5 +#define ETH_TX_PARSE_BD_ECE_FLG (0x1<<6) +#define ETH_TX_PARSE_BD_ECE_FLG_SHIFT 6 +#define ETH_TX_PARSE_BD_CWR_FLG (0x1<<7) +#define ETH_TX_PARSE_BD_CWR_FLG_SHIFT 7 + u8 ip_hlen; + s8 cs_offset; + __le16 total_hlen; + __le16 lso_mss; + __le16 tcp_pseudo_csum; + __le16 ip_id; + __le32 tcp_send_seq; +}; + +/* + * The last BD in the BD memory will hold a pointer to the next BD memory + */ +struct eth_tx_next_bd { + u32 addr_lo; + u32 addr_hi; + u8 reserved[8]; +}; + +/* + * union for 3 Bd types + */ +union eth_tx_bd_types { + struct eth_tx_bd reg_bd; + struct eth_tx_parse_bd parse_bd; + struct eth_tx_next_bd next_bd; +}; + +/* + * The eth storm context of Xstorm + */ +struct xstorm_eth_st_context { + u32 tx_bd_page_base_lo; + u32 tx_bd_page_base_hi; +#if defined(__BIG_ENDIAN) + u16 tx_bd_cons; + u8 statistics_data; +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_COUNTER_ID (0x7F<<0) +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_COUNTER_ID_SHIFT 0 +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE (0x1<<7) +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE_SHIFT 7 + u8 __local_tx_bd_prod; +#elif defined(__LITTLE_ENDIAN) + u8 __local_tx_bd_prod; + u8 statistics_data; +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_COUNTER_ID (0x7F<<0) +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_COUNTER_ID_SHIFT 0 +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE (0x1<<7) +#define XSTORM_ETH_ST_CONTEXT_STATISTICS_ENABLE_SHIFT 7 + u16 tx_bd_cons; +#endif + u32 db_data_addr_lo; + u32 db_data_addr_hi; + u32 __pkt_cons; + u32 __gso_next; +#if defined(__BIG_ENDIAN) + u8 __reserved1; + u8 safc_group_num; + u8 safc_group_en; + u8 __is_eth_conn; +#elif defined(__LITTLE_ENDIAN) + u8 __is_eth_conn; + u8 safc_group_en; + u8 safc_group_num; + u8 __reserved1; +#endif + union eth_tx_bd_types __bds[13]; +}; + +/* + * The eth storm context of Cstorm + */ +struct cstorm_eth_st_context { +#if defined(__BIG_ENDIAN) + u16 __reserved0; + u8 sb_index_number; + u8 status_block_id; +#elif defined(__LITTLE_ENDIAN) + u8 status_block_id; + u8 sb_index_number; + u16 __reserved0; +#endif + u32 __reserved1[3]; +}; + +/* + * Ethernet connection context + */ +struct eth_context { + struct ustorm_eth_st_context ustorm_st_context; + struct tstorm_eth_st_context tstorm_st_context; + struct xstorm_eth_ag_context xstorm_ag_context; + struct tstorm_eth_ag_context tstorm_ag_context; + struct cstorm_eth_ag_context cstorm_ag_context; + struct ustorm_eth_ag_context ustorm_ag_context; + struct timers_block_context timers_context; + struct xstorm_eth_st_context xstorm_st_context; + struct cstorm_eth_st_context cstorm_st_context; +}; + + +/* + * Ethernet doorbell + */ +struct eth_tx_doorbell { +#if defined(__BIG_ENDIAN) + u16 npackets; + u8 params; +#define ETH_TX_DOORBELL_NUM_BDS (0x3F<<0) +#define ETH_TX_DOORBELL_NUM_BDS_SHIFT 0 +#define ETH_TX_DOORBELL_RESERVED_TX_FIN_FLAG (0x1<<6) +#define ETH_TX_DOORBELL_RESERVED_TX_FIN_FLAG_SHIFT 6 +#define ETH_TX_DOORBELL_SPARE (0x1<<7) +#define ETH_TX_DOORBELL_SPARE_SHIFT 7 + struct doorbell_hdr hdr; +#elif defined(__LITTLE_ENDIAN) + struct doorbell_hdr hdr; + u8 params; +#define ETH_TX_DOORBELL_NUM_BDS (0x3F<<0) +#define ETH_TX_DOORBELL_NUM_BDS_SHIFT 0 +#define ETH_TX_DOORBELL_RESERVED_TX_FIN_FLAG (0x1<<6) +#define ETH_TX_DOORBELL_RESERVED_TX_FIN_FLAG_SHIFT 6 +#define ETH_TX_DOORBELL_SPARE (0x1<<7) +#define ETH_TX_DOORBELL_SPARE_SHIFT 7 + u16 npackets; +#endif +}; + + +/* + * ustorm status block + */ +struct ustorm_def_status_block { + __le16 index_values[HC_USTORM_DEF_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * cstorm status block + */ +struct cstorm_def_status_block { + __le16 index_values[HC_CSTORM_DEF_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * xstorm status block + */ +struct xstorm_def_status_block { + __le16 index_values[HC_XSTORM_DEF_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * tstorm status block + */ +struct tstorm_def_status_block { + __le16 index_values[HC_TSTORM_DEF_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * host status block + */ +struct host_def_status_block { + struct atten_def_status_block atten_status_block; + struct ustorm_def_status_block u_def_status_block; + struct cstorm_def_status_block c_def_status_block; + struct xstorm_def_status_block x_def_status_block; + struct tstorm_def_status_block t_def_status_block; +}; + + +/* + * ustorm status block + */ +struct ustorm_status_block { + __le16 index_values[HC_USTORM_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * cstorm status block + */ +struct cstorm_status_block { + __le16 index_values[HC_CSTORM_SB_NUM_INDICES]; + __le16 status_block_index; + u8 func; + u8 status_block_id; + __le32 __flags; +}; + +/* + * host status block + */ +struct host_status_block { + struct ustorm_status_block u_status_block; + struct cstorm_status_block c_status_block; +}; + + +/* + * The data for RSS setup ramrod + */ +struct eth_client_setup_ramrod_data { + u32 client_id; + u8 is_rdma; + u8 is_fcoe; + u16 reserved1; +}; + + +/* + * L2 dynamic host coalescing init parameters + */ +struct eth_dynamic_hc_config { + u32 threshold[3]; + u8 hc_timeout[4]; +}; + + +/* + * regular eth FP CQE parameters struct + */ +struct eth_fast_path_rx_cqe { + u8 type_error_flags; +#define ETH_FAST_PATH_RX_CQE_TYPE (0x1<<0) +#define ETH_FAST_PATH_RX_CQE_TYPE_SHIFT 0 +#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG (0x1<<1) +#define ETH_FAST_PATH_RX_CQE_PHY_DECODE_ERR_FLG_SHIFT 1 +#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG (0x1<<2) +#define ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG_SHIFT 2 +#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG (0x1<<3) +#define ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG_SHIFT 3 +#define ETH_FAST_PATH_RX_CQE_START_FLG (0x1<<4) +#define ETH_FAST_PATH_RX_CQE_START_FLG_SHIFT 4 +#define ETH_FAST_PATH_RX_CQE_END_FLG (0x1<<5) +#define ETH_FAST_PATH_RX_CQE_END_FLG_SHIFT 5 +#define ETH_FAST_PATH_RX_CQE_RESERVED0 (0x3<<6) +#define ETH_FAST_PATH_RX_CQE_RESERVED0_SHIFT 6 + u8 status_flags; +#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE (0x7<<0) +#define ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE_SHIFT 0 +#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG (0x1<<3) +#define ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG_SHIFT 3 +#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG (0x1<<4) +#define ETH_FAST_PATH_RX_CQE_BROADCAST_FLG_SHIFT 4 +#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG (0x1<<5) +#define ETH_FAST_PATH_RX_CQE_MAC_MATCH_FLG_SHIFT 5 +#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG (0x1<<6) +#define ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG_SHIFT 6 +#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG (0x1<<7) +#define ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG_SHIFT 7 + u8 placement_offset; + u8 queue_index; + __le32 rss_hash_result; + __le16 vlan_tag; + __le16 pkt_len; + __le16 len_on_bd; + struct parsing_flags pars_flags; + __le16 sgl[8]; +}; + + +/* + * The data for RSS setup ramrod + */ +struct eth_halt_ramrod_data { + u32 client_id; + u32 reserved0; +}; + + +/* + * The data for statistics query ramrod + */ +struct eth_query_ramrod_data { +#if defined(__BIG_ENDIAN) + u8 reserved0; + u8 collect_port; + u16 drv_counter; +#elif defined(__LITTLE_ENDIAN) + u16 drv_counter; + u8 collect_port; + u8 reserved0; +#endif + u32 ctr_id_vector; +}; + + +/* + * Place holder for ramrods protocol specific data + */ +struct ramrod_data { + __le32 data_lo; + __le32 data_hi; +}; + +/* + * union for ramrod data for Ethernet protocol (CQE) (force size of 16 bits) + */ +union eth_ramrod_data { + struct ramrod_data general; +}; + + +/* + * Eth Rx Cqe structure- general structure for ramrods + */ +struct common_ramrod_eth_rx_cqe { + u8 ramrod_type; +#define COMMON_RAMROD_ETH_RX_CQE_TYPE (0x1<<0) +#define COMMON_RAMROD_ETH_RX_CQE_TYPE_SHIFT 0 +#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0 (0x7F<<1) +#define COMMON_RAMROD_ETH_RX_CQE_RESERVED0_SHIFT 1 + u8 conn_type; + __le16 reserved1; + __le32 conn_and_cmd_data; +#define COMMON_RAMROD_ETH_RX_CQE_CID (0xFFFFFF<<0) +#define COMMON_RAMROD_ETH_RX_CQE_CID_SHIFT 0 +#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID (0xFF<<24) +#define COMMON_RAMROD_ETH_RX_CQE_CMD_ID_SHIFT 24 + struct ramrod_data protocol_data; + __le32 reserved2[4]; +}; + +/* + * Rx Last CQE in page (in ETH) + */ +struct eth_rx_cqe_next_page { + __le32 addr_lo; + __le32 addr_hi; + __le32 reserved[6]; +}; + +/* + * union for all eth rx cqe types (fix their sizes) + */ +union eth_rx_cqe { + struct eth_fast_path_rx_cqe fast_path_cqe; + struct common_ramrod_eth_rx_cqe ramrod_cqe; + struct eth_rx_cqe_next_page next_page_cqe; +}; + + +/* + * common data for all protocols + */ +struct spe_hdr { + __le32 conn_and_cmd_data; +#define SPE_HDR_CID (0xFFFFFF<<0) +#define SPE_HDR_CID_SHIFT 0 +#define SPE_HDR_CMD_ID (0xFF<<24) +#define SPE_HDR_CMD_ID_SHIFT 24 + __le16 type; +#define SPE_HDR_CONN_TYPE (0xFF<<0) +#define SPE_HDR_CONN_TYPE_SHIFT 0 +#define SPE_HDR_COMMON_RAMROD (0xFF<<8) +#define SPE_HDR_COMMON_RAMROD_SHIFT 8 + __le16 reserved; +}; + +/* + * Ethernet slow path element + */ +union eth_specific_data { + u8 protocol_data[8]; + struct regpair mac_config_addr; + struct eth_client_setup_ramrod_data client_setup_ramrod_data; + struct eth_halt_ramrod_data halt_ramrod_data; + struct regpair leading_cqe_addr; + struct regpair update_data_addr; + struct eth_query_ramrod_data query_ramrod_data; +}; + +/* + * Ethernet slow path element + */ +struct eth_spe { + struct spe_hdr hdr; + union eth_specific_data data; +}; + + +/* + * doorbell data in host memory + */ +struct eth_tx_db_data { + __le32 packets_prod; + __le16 bds_prod; + __le16 reserved; +}; + + +/* + * Common configuration parameters per function in Tstorm + */ +struct tstorm_eth_function_common_config { +#if defined(__BIG_ENDIAN) + u8 leading_client_id; + u8 rss_result_mask; + u16 config_flags; +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY (0x1<<0) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY_SHIFT 0 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY (0x1<<1) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY_SHIFT 1 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY (0x1<<2) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY_SHIFT 2 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY (0x1<<3) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY_SHIFT 3 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE (0x7<<4) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT 4 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<7) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 7 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<8) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 8 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM (0x1<<9) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM_SHIFT 9 +#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x3F<<10) +#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 10 +#elif defined(__LITTLE_ENDIAN) + u16 config_flags; +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY (0x1<<0) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_CAPABILITY_SHIFT 0 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY (0x1<<1) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV4_TCP_CAPABILITY_SHIFT 1 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY (0x1<<2) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_CAPABILITY_SHIFT 2 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY (0x1<<3) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_IPV6_TCP_CAPABILITY_SHIFT 3 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE (0x7<<4) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_RSS_MODE_SHIFT 4 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE (0x1<<7) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_DEFAULT_ENABLE_SHIFT 7 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM (0x1<<8) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_VLAN_IN_CAM_SHIFT 8 +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM (0x1<<9) +#define TSTORM_ETH_FUNCTION_COMMON_CONFIG_E1HOV_IN_CAM_SHIFT 9 +#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0 (0x3F<<10) +#define __TSTORM_ETH_FUNCTION_COMMON_CONFIG_RESERVED0_SHIFT 10 + u8 rss_result_mask; + u8 leading_client_id; +#endif + u16 vlan_id[2]; +}; + +/* + * parameters for eth update ramrod + */ +struct eth_update_ramrod_data { + struct tstorm_eth_function_common_config func_config; + u8 indirectionTable[128]; +}; + + +/* + * MAC filtering configuration command header + */ +struct mac_configuration_hdr { + u8 length; + u8 offset; + u16 client_id; + u32 reserved1; +}; + +/* + * MAC address in list for ramrod + */ +struct tstorm_cam_entry { + __le16 lsb_mac_addr; + __le16 middle_mac_addr; + __le16 msb_mac_addr; + __le16 flags; +#define TSTORM_CAM_ENTRY_PORT_ID (0x1<<0) +#define TSTORM_CAM_ENTRY_PORT_ID_SHIFT 0 +#define TSTORM_CAM_ENTRY_RSRVVAL0 (0x7<<1) +#define TSTORM_CAM_ENTRY_RSRVVAL0_SHIFT 1 +#define TSTORM_CAM_ENTRY_RESERVED0 (0xFFF<<4) +#define TSTORM_CAM_ENTRY_RESERVED0_SHIFT 4 +}; + +/* + * MAC filtering: CAM target table entry + */ +struct tstorm_cam_target_table_entry { + u8 flags; +#define TSTORM_CAM_TARGET_TABLE_ENTRY_BROADCAST (0x1<<0) +#define TSTORM_CAM_TARGET_TABLE_ENTRY_BROADCAST_SHIFT 0 +#define TSTORM_CAM_TARGET_TABLE_ENTRY_OVERRIDE_VLAN_REMOVAL (0x1<<1) +#define TSTORM_CAM_TARGET_TABLE_ENTRY_OVERRIDE_VLAN_REMOVAL_SHIFT 1 +#define TSTORM_CAM_TARGET_TABLE_ENTRY_ACTION_TYPE (0x1<<2) +#define TSTORM_CAM_TARGET_TABLE_ENTRY_ACTION_TYPE_SHIFT 2 +#define TSTORM_CAM_TARGET_TABLE_ENTRY_RDMA_MAC (0x1<<3) +#define TSTORM_CAM_TARGET_TABLE_ENTRY_RDMA_MAC_SHIFT 3 +#define TSTORM_CAM_TARGET_TABLE_ENTRY_RESERVED0 (0xF<<4) +#define TSTORM_CAM_TARGET_TABLE_ENTRY_RESERVED0_SHIFT 4 + u8 client_id; + u16 vlan_id; +}; + +/* + * MAC address in list for ramrod + */ +struct mac_configuration_entry { + struct tstorm_cam_entry cam_entry; + struct tstorm_cam_target_table_entry target_table_entry; +}; + +/* + * MAC filtering configuration command + */ +struct mac_configuration_cmd { + struct mac_configuration_hdr hdr; + struct mac_configuration_entry config_table[64]; +}; + + +/* + * MAC address in list for ramrod + */ +struct mac_configuration_entry_e1h { + __le16 lsb_mac_addr; + __le16 middle_mac_addr; + __le16 msb_mac_addr; + __le16 vlan_id; + __le16 e1hov_id; + u8 client_id; + u8 flags; +#define MAC_CONFIGURATION_ENTRY_E1H_PORT (0x1<<0) +#define MAC_CONFIGURATION_ENTRY_E1H_PORT_SHIFT 0 +#define MAC_CONFIGURATION_ENTRY_E1H_ACTION_TYPE (0x1<<1) +#define MAC_CONFIGURATION_ENTRY_E1H_ACTION_TYPE_SHIFT 1 +#define MAC_CONFIGURATION_ENTRY_E1H_RDMA_MAC (0x1<<2) +#define MAC_CONFIGURATION_ENTRY_E1H_RDMA_MAC_SHIFT 2 +#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED0 (0x1F<<3) +#define MAC_CONFIGURATION_ENTRY_E1H_RESERVED0_SHIFT 3 +}; + +/* + * MAC filtering configuration command + */ +struct mac_configuration_cmd_e1h { + struct mac_configuration_hdr hdr; + struct mac_configuration_entry_e1h config_table[32]; +}; + + +/* + * approximate-match multicast filtering for E1H per function in Tstorm + */ +struct tstorm_eth_approximate_match_multicast_filtering { + u32 mcast_add_hash_bit_array[8]; +}; + + +/* + * Configuration parameters per client in Tstorm + */ +struct tstorm_eth_client_config { +#if defined(__BIG_ENDIAN) + u8 max_sges_for_packet; + u8 statistics_counter_id; + u16 mtu; +#elif defined(__LITTLE_ENDIAN) + u16 mtu; + u8 statistics_counter_id; + u8 max_sges_for_packet; +#endif +#if defined(__BIG_ENDIAN) + u16 drop_flags; +#define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR (0x1<<0) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR_SHIFT 0 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TCP_CS_ERR (0x1<<1) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TCP_CS_ERR_SHIFT 1 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0 (0x1<<2) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0_SHIFT 2 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR (0x1<<3) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR_SHIFT 3 +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0xFFF<<4) +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 4 + u16 config_flags; +#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE (0x1<<0) +#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE_SHIFT 0 +#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE (0x1<<1) +#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE_SHIFT 1 +#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<2) +#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 2 +#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING (0x1<<3) +#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING_SHIFT 3 +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0 (0xFFF<<4) +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0_SHIFT 4 +#elif defined(__LITTLE_ENDIAN) + u16 config_flags; +#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE (0x1<<0) +#define TSTORM_ETH_CLIENT_CONFIG_VLAN_REM_ENABLE_SHIFT 0 +#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE (0x1<<1) +#define TSTORM_ETH_CLIENT_CONFIG_E1HOV_REM_ENABLE_SHIFT 1 +#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE (0x1<<2) +#define TSTORM_ETH_CLIENT_CONFIG_STATSITICS_ENABLE_SHIFT 2 +#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING (0x1<<3) +#define TSTORM_ETH_CLIENT_CONFIG_ENABLE_SGE_RING_SHIFT 3 +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0 (0xFFF<<4) +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED0_SHIFT 4 + u16 drop_flags; +#define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR (0x1<<0) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_IP_CS_ERR_SHIFT 0 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TCP_CS_ERR (0x1<<1) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TCP_CS_ERR_SHIFT 1 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0 (0x1<<2) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_TTL0_SHIFT 2 +#define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR (0x1<<3) +#define TSTORM_ETH_CLIENT_CONFIG_DROP_UDP_CS_ERR_SHIFT 3 +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1 (0xFFF<<4) +#define __TSTORM_ETH_CLIENT_CONFIG_RESERVED1_SHIFT 4 +#endif +}; + + +/* + * MAC filtering configuration parameters per port in Tstorm + */ +struct tstorm_eth_mac_filter_config { + u32 ucast_drop_all; + u32 ucast_accept_all; + u32 mcast_drop_all; + u32 mcast_accept_all; + u32 bcast_drop_all; + u32 bcast_accept_all; + u32 strict_vlan; + u32 vlan_filter[2]; + u32 reserved; +}; + + +/* + * common flag to indicate existance of TPA. + */ +struct tstorm_eth_tpa_exist { +#if defined(__BIG_ENDIAN) + u16 reserved1; + u8 reserved0; + u8 tpa_exist; +#elif defined(__LITTLE_ENDIAN) + u8 tpa_exist; + u8 reserved0; + u16 reserved1; +#endif + u32 reserved2; +}; + + +/* + * rx rings pause data for E1h only + */ +struct ustorm_eth_rx_pause_data_e1h { +#if defined(__BIG_ENDIAN) + u16 bd_thr_low; + u16 cqe_thr_low; +#elif defined(__LITTLE_ENDIAN) + u16 cqe_thr_low; + u16 bd_thr_low; +#endif +#if defined(__BIG_ENDIAN) + u16 cos; + u16 sge_thr_low; +#elif defined(__LITTLE_ENDIAN) + u16 sge_thr_low; + u16 cos; +#endif +#if defined(__BIG_ENDIAN) + u16 bd_thr_high; + u16 cqe_thr_high; +#elif defined(__LITTLE_ENDIAN) + u16 cqe_thr_high; + u16 bd_thr_high; +#endif +#if defined(__BIG_ENDIAN) + u16 reserved0; + u16 sge_thr_high; +#elif defined(__LITTLE_ENDIAN) + u16 sge_thr_high; + u16 reserved0; +#endif +}; + + +/* + * Three RX producers for ETH + */ +struct ustorm_eth_rx_producers { +#if defined(__BIG_ENDIAN) + u16 bd_prod; + u16 cqe_prod; +#elif defined(__LITTLE_ENDIAN) + u16 cqe_prod; + u16 bd_prod; +#endif +#if defined(__BIG_ENDIAN) + u16 reserved; + u16 sge_prod; +#elif defined(__LITTLE_ENDIAN) + u16 sge_prod; + u16 reserved; +#endif +}; + + +/* + * per-port SAFC demo variables + */ +struct cmng_flags_per_port { + u8 con_number[NUM_OF_PROTOCOLS]; + u32 cmng_enables; +#define CMNG_FLAGS_PER_PORT_FAIRNESS_VN (0x1<<0) +#define CMNG_FLAGS_PER_PORT_FAIRNESS_VN_SHIFT 0 +#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN (0x1<<1) +#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_VN_SHIFT 1 +#define CMNG_FLAGS_PER_PORT_FAIRNESS_PROTOCOL (0x1<<2) +#define CMNG_FLAGS_PER_PORT_FAIRNESS_PROTOCOL_SHIFT 2 +#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_PROTOCOL (0x1<<3) +#define CMNG_FLAGS_PER_PORT_RATE_SHAPING_PROTOCOL_SHIFT 3 +#define CMNG_FLAGS_PER_PORT_FAIRNESS_COS (0x1<<4) +#define CMNG_FLAGS_PER_PORT_FAIRNESS_COS_SHIFT 4 +#define __CMNG_FLAGS_PER_PORT_RESERVED0 (0x7FFFFFF<<5) +#define __CMNG_FLAGS_PER_PORT_RESERVED0_SHIFT 5 +}; + + +/* + * per-port rate shaping variables + */ +struct rate_shaping_vars_per_port { + u32 rs_periodic_timeout; + u32 rs_threshold; +}; + + +/* + * per-port fairness variables + */ +struct fairness_vars_per_port { + u32 upper_bound; + u32 fair_threshold; + u32 fairness_timeout; +}; + + +/* + * per-port SAFC variables + */ +struct safc_struct_per_port { +#if defined(__BIG_ENDIAN) + u16 __reserved1; + u8 __reserved0; + u8 safc_timeout_usec; +#elif defined(__LITTLE_ENDIAN) + u8 safc_timeout_usec; + u8 __reserved0; + u16 __reserved1; +#endif + u16 cos_to_pause_mask[NUM_OF_SAFC_BITS]; +}; + + +/* + * Per-port congestion management variables + */ +struct cmng_struct_per_port { + struct rate_shaping_vars_per_port rs_vars; + struct fairness_vars_per_port fair_vars; + struct safc_struct_per_port safc_vars; + struct cmng_flags_per_port flags; +}; + + +/* + * Protocol-common statistics collected by the Xstorm (per client) + */ +struct xstorm_per_client_stats { + struct regpair total_sent_bytes; + __le32 total_sent_pkts; + __le32 unicast_pkts_sent; + struct regpair unicast_bytes_sent; + struct regpair multicast_bytes_sent; + __le32 multicast_pkts_sent; + __le32 broadcast_pkts_sent; + struct regpair broadcast_bytes_sent; + __le16 stats_counter; + __le16 reserved0; + __le32 reserved1; +}; + + +/* + * Common statistics collected by the Xstorm (per port) + */ +struct xstorm_common_stats { + struct xstorm_per_client_stats client_statistics[MAX_X_STAT_COUNTER_ID]; +}; + + +/* + * Protocol-common statistics collected by the Tstorm (per port) + */ +struct tstorm_per_port_stats { + __le32 mac_filter_discard; + __le32 xxoverflow_discard; + __le32 brb_truncate_discard; + __le32 mac_discard; +}; + + +/* + * Protocol-common statistics collected by the Tstorm (per client) + */ +struct tstorm_per_client_stats { + struct regpair total_rcv_bytes; + struct regpair rcv_unicast_bytes; + struct regpair rcv_broadcast_bytes; + struct regpair rcv_multicast_bytes; + struct regpair rcv_error_bytes; + __le32 checksum_discard; + __le32 packets_too_big_discard; + __le32 total_rcv_pkts; + __le32 rcv_unicast_pkts; + __le32 rcv_broadcast_pkts; + __le32 rcv_multicast_pkts; + __le32 no_buff_discard; + __le32 ttl0_discard; + __le16 stats_counter; + __le16 reserved0; + __le32 reserved1; +}; + +/* + * Protocol-common statistics collected by the Tstorm + */ +struct tstorm_common_stats { + struct tstorm_per_port_stats port_statistics; + struct tstorm_per_client_stats client_statistics[MAX_T_STAT_COUNTER_ID]; +}; + +/* + * Protocol-common statistics collected by the Ustorm (per client) + */ +struct ustorm_per_client_stats { + struct regpair ucast_no_buff_bytes; + struct regpair mcast_no_buff_bytes; + struct regpair bcast_no_buff_bytes; + __le32 ucast_no_buff_pkts; + __le32 mcast_no_buff_pkts; + __le32 bcast_no_buff_pkts; + __le16 stats_counter; + __le16 reserved0; +}; + +/* + * Protocol-common statistics collected by the Ustorm + */ +struct ustorm_common_stats { + struct ustorm_per_client_stats client_statistics[MAX_U_STAT_COUNTER_ID]; +}; + +/* + * Eth statistics query structure for the eth_stats_query ramrod + */ +struct eth_stats_query { + struct xstorm_common_stats xstorm_common; + struct tstorm_common_stats tstorm_common; + struct ustorm_common_stats ustorm_common; +}; + + +/* + * per-vnic fairness variables + */ +struct fairness_vars_per_vn { + u32 cos_credit_delta[MAX_COS_NUMBER]; + u32 protocol_credit_delta[NUM_OF_PROTOCOLS]; + u32 vn_credit_delta; + u32 __reserved0; +}; + + +/* + * FW version stored in the Xstorm RAM + */ +struct fw_version { +#if defined(__BIG_ENDIAN) + u8 engineering; + u8 revision; + u8 minor; + u8 major; +#elif defined(__LITTLE_ENDIAN) + u8 major; + u8 minor; + u8 revision; + u8 engineering; +#endif + u32 flags; +#define FW_VERSION_OPTIMIZED (0x1<<0) +#define FW_VERSION_OPTIMIZED_SHIFT 0 +#define FW_VERSION_BIG_ENDIEN (0x1<<1) +#define FW_VERSION_BIG_ENDIEN_SHIFT 1 +#define FW_VERSION_CHIP_VERSION (0x3<<2) +#define FW_VERSION_CHIP_VERSION_SHIFT 2 +#define __FW_VERSION_RESERVED (0xFFFFFFF<<4) +#define __FW_VERSION_RESERVED_SHIFT 4 +}; + + +/* + * FW version stored in first line of pram + */ +struct pram_fw_version { + u8 major; + u8 minor; + u8 revision; + u8 engineering; + u8 flags; +#define PRAM_FW_VERSION_OPTIMIZED (0x1<<0) +#define PRAM_FW_VERSION_OPTIMIZED_SHIFT 0 +#define PRAM_FW_VERSION_STORM_ID (0x3<<1) +#define PRAM_FW_VERSION_STORM_ID_SHIFT 1 +#define PRAM_FW_VERSION_BIG_ENDIEN (0x1<<3) +#define PRAM_FW_VERSION_BIG_ENDIEN_SHIFT 3 +#define PRAM_FW_VERSION_CHIP_VERSION (0x3<<4) +#define PRAM_FW_VERSION_CHIP_VERSION_SHIFT 4 +#define __PRAM_FW_VERSION_RESERVED0 (0x3<<6) +#define __PRAM_FW_VERSION_RESERVED0_SHIFT 6 +}; + + +/* + * a single rate shaping counter. can be used as protocol or vnic counter + */ +struct rate_shaping_counter { + u32 quota; +#if defined(__BIG_ENDIAN) + u16 __reserved0; + u16 rate; +#elif defined(__LITTLE_ENDIAN) + u16 rate; + u16 __reserved0; +#endif +}; + + +/* + * per-vnic rate shaping variables + */ +struct rate_shaping_vars_per_vn { + struct rate_shaping_counter protocol_counters[NUM_OF_PROTOCOLS]; + struct rate_shaping_counter vn_counter; +}; + + +/* + * The send queue element + */ +struct slow_path_element { + struct spe_hdr hdr; + u8 protocol_data[8]; +}; + + +/* + * eth/toe flags that indicate if to query + */ +struct stats_indication_flags { + u32 collect_eth; + u32 collect_toe; +}; + + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_reg.h b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_reg.h new file mode 100644 index 0000000..744883f --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/bnx2x_reg.h @@ -0,0 +1,6010 @@ +/* bnx2x_reg.h: Broadcom Everest network driver. + * + * Copyright (c) 2007-2009 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * The registers description starts with the register Access type followed + * by size in bits. For example [RW 32]. The access types are: + * R - Read only + * RC - Clear on read + * RW - Read/Write + * ST - Statistics register (clear on read) + * W - Write only + * WB - Wide bus register - the size is over 32 bits and it should be + * read/write in consecutive 32 bits accesses + * WR - Write Clear (write 1 to clear the bit) + * + */ + + +/* [R 19] Interrupt register #0 read */ +#define BRB1_REG_BRB1_INT_STS 0x6011c +/* [RW 4] Parity mask register #0 read/write */ +#define BRB1_REG_BRB1_PRTY_MASK 0x60138 +/* [R 4] Parity register #0 read */ +#define BRB1_REG_BRB1_PRTY_STS 0x6012c +/* [RW 10] At address BRB1_IND_FREE_LIST_PRS_CRDT initialize free head. At + address BRB1_IND_FREE_LIST_PRS_CRDT+1 initialize free tail. At address + BRB1_IND_FREE_LIST_PRS_CRDT+2 initialize parser initial credit. */ +#define BRB1_REG_FREE_LIST_PRS_CRDT 0x60200 +/* [RW 10] The number of free blocks above which the High_llfc signal to + interface #n is de-asserted. */ +#define BRB1_REG_HIGH_LLFC_HIGH_THRESHOLD_0 0x6014c +/* [RW 10] The number of free blocks below which the High_llfc signal to + interface #n is asserted. */ +#define BRB1_REG_HIGH_LLFC_LOW_THRESHOLD_0 0x6013c +/* [RW 23] LL RAM data. */ +#define BRB1_REG_LL_RAM 0x61000 +/* [RW 10] The number of free blocks above which the Low_llfc signal to + interface #n is de-asserted. */ +#define BRB1_REG_LOW_LLFC_HIGH_THRESHOLD_0 0x6016c +/* [RW 10] The number of free blocks below which the Low_llfc signal to + interface #n is asserted. */ +#define BRB1_REG_LOW_LLFC_LOW_THRESHOLD_0 0x6015c +/* [R 24] The number of full blocks. */ +#define BRB1_REG_NUM_OF_FULL_BLOCKS 0x60090 +/* [ST 32] The number of cycles that the write_full signal towards MAC #0 + was asserted. */ +#define BRB1_REG_NUM_OF_FULL_CYCLES_0 0x600c8 +#define BRB1_REG_NUM_OF_FULL_CYCLES_1 0x600cc +#define BRB1_REG_NUM_OF_FULL_CYCLES_4 0x600d8 +/* [ST 32] The number of cycles that the pause signal towards MAC #0 was + asserted. */ +#define BRB1_REG_NUM_OF_PAUSE_CYCLES_0 0x600b8 +#define BRB1_REG_NUM_OF_PAUSE_CYCLES_1 0x600bc +/* [RW 10] Write client 0: De-assert pause threshold. */ +#define BRB1_REG_PAUSE_HIGH_THRESHOLD_0 0x60078 +#define BRB1_REG_PAUSE_HIGH_THRESHOLD_1 0x6007c +/* [RW 10] Write client 0: Assert pause threshold. */ +#define BRB1_REG_PAUSE_LOW_THRESHOLD_0 0x60068 +#define BRB1_REG_PAUSE_LOW_THRESHOLD_1 0x6006c +/* [R 24] The number of full blocks occupied by port. */ +#define BRB1_REG_PORT_NUM_OCC_BLOCKS_0 0x60094 +/* [RW 1] Reset the design by software. */ +#define BRB1_REG_SOFT_RESET 0x600dc +/* [R 5] Used to read the value of the XX protection CAM occupancy counter. */ +#define CCM_REG_CAM_OCCUP 0xd0188 +/* [RW 1] CM - CFC Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CCM_CFC_IFEN 0xd003c +/* [RW 1] CM - QM Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CCM_CQM_IFEN 0xd000c +/* [RW 1] If set the Q index; received from the QM is inserted to event ID. + Otherwise 0 is inserted. */ +#define CCM_REG_CCM_CQM_USE_Q 0xd00c0 +/* [RW 11] Interrupt mask register #0 read/write */ +#define CCM_REG_CCM_INT_MASK 0xd01e4 +/* [R 11] Interrupt register #0 read */ +#define CCM_REG_CCM_INT_STS 0xd01d8 +/* [R 27] Parity register #0 read */ +#define CCM_REG_CCM_PRTY_STS 0xd01e8 +/* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS + REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). + Is used to determine the number of the AG context REG-pairs written back; + when the input message Reg1WbFlg isn't set. */ +#define CCM_REG_CCM_REG0_SZ 0xd00c4 +/* [RW 1] CM - STORM 0 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CCM_STORM0_IFEN 0xd0004 +/* [RW 1] CM - STORM 1 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CCM_STORM1_IFEN 0xd0008 +/* [RW 1] CDU AG read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define CCM_REG_CDU_AG_RD_IFEN 0xd0030 +/* [RW 1] CDU AG write Interface enable. If 0 - the request and valid input + are disregarded; all other signals are treated as usual; if 1 - normal + activity. */ +#define CCM_REG_CDU_AG_WR_IFEN 0xd002c +/* [RW 1] CDU STORM read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define CCM_REG_CDU_SM_RD_IFEN 0xd0038 +/* [RW 1] CDU STORM write Interface enable. If 0 - the request and valid + input is disregarded; all other signals are treated as usual; if 1 - + normal activity. */ +#define CCM_REG_CDU_SM_WR_IFEN 0xd0034 +/* [RW 4] CFC output initial credit. Max credit available - 15.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 1 at start-up. */ +#define CCM_REG_CFC_INIT_CRD 0xd0204 +/* [RW 2] Auxillary counter flag Q number 1. */ +#define CCM_REG_CNT_AUX1_Q 0xd00c8 +/* [RW 2] Auxillary counter flag Q number 2. */ +#define CCM_REG_CNT_AUX2_Q 0xd00cc +/* [RW 28] The CM header value for QM request (primary). */ +#define CCM_REG_CQM_CCM_HDR_P 0xd008c +/* [RW 28] The CM header value for QM request (secondary). */ +#define CCM_REG_CQM_CCM_HDR_S 0xd0090 +/* [RW 1] QM - CM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CQM_CCM_IFEN 0xd0014 +/* [RW 6] QM output initial credit. Max credit available - 32. Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 32 at start-up. */ +#define CCM_REG_CQM_INIT_CRD 0xd020c +/* [RW 3] The weight of the QM (primary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_CQM_P_WEIGHT 0xd00b8 +/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_CQM_S_WEIGHT 0xd00bc +/* [RW 1] Input SDM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_CSDM_IFEN 0xd0018 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the SDM interface is detected. */ +#define CCM_REG_CSDM_LENGTH_MIS 0xd0170 +/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_CSDM_WEIGHT 0xd00b4 +/* [RW 28] The CM header for QM formatting in case of an error in the QM + inputs. */ +#define CCM_REG_ERR_CCM_HDR 0xd0094 +/* [RW 8] The Event ID in case the input message ErrorFlg is set. */ +#define CCM_REG_ERR_EVNT_ID 0xd0098 +/* [RW 8] FIC0 output initial credit. Max credit available - 255. Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define CCM_REG_FIC0_INIT_CRD 0xd0210 +/* [RW 8] FIC1 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define CCM_REG_FIC1_INIT_CRD 0xd0214 +/* [RW 1] Arbitration between Input Arbiter groups: 0 - fair Round-Robin; 1 + - strict priority defined by ~ccm_registers_gr_ag_pr.gr_ag_pr; + ~ccm_registers_gr_ld0_pr.gr_ld0_pr and + ~ccm_registers_gr_ld1_pr.gr_ld1_pr. Groups are according to channels and + outputs to STORM: aggregation; load FIC0; load FIC1 and store. */ +#define CCM_REG_GR_ARB_TYPE 0xd015c +/* [RW 2] Load (FIC0) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed; that the Store channel priority is + the compliment to 4 of the rest priorities - Aggregation channel; Load + (FIC0) channel and Load (FIC1). */ +#define CCM_REG_GR_LD0_PR 0xd0164 +/* [RW 2] Load (FIC1) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed; that the Store channel priority is + the compliment to 4 of the rest priorities - Aggregation channel; Load + (FIC0) channel and Load (FIC1). */ +#define CCM_REG_GR_LD1_PR 0xd0168 +/* [RW 2] General flags index. */ +#define CCM_REG_INV_DONE_Q 0xd0108 +/* [RW 4] The number of double REG-pairs(128 bits); loaded from the STORM + context and sent to STORM; for a specific connection type. The double + REG-pairs are used in order to align to STORM context row size of 128 + bits. The offset of these data in the STORM context is always 0. Index + _(0..15) stands for the connection type (one of 16). */ +#define CCM_REG_N_SM_CTX_LD_0 0xd004c +#define CCM_REG_N_SM_CTX_LD_1 0xd0050 +#define CCM_REG_N_SM_CTX_LD_10 0xd0074 +#define CCM_REG_N_SM_CTX_LD_11 0xd0078 +#define CCM_REG_N_SM_CTX_LD_12 0xd007c +#define CCM_REG_N_SM_CTX_LD_13 0xd0080 +#define CCM_REG_N_SM_CTX_LD_14 0xd0084 +#define CCM_REG_N_SM_CTX_LD_15 0xd0088 +#define CCM_REG_N_SM_CTX_LD_2 0xd0054 +#define CCM_REG_N_SM_CTX_LD_3 0xd0058 +#define CCM_REG_N_SM_CTX_LD_4 0xd005c +/* [RW 1] Input pbf Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define CCM_REG_PBF_IFEN 0xd0028 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the pbf interface is detected. */ +#define CCM_REG_PBF_LENGTH_MIS 0xd0180 +/* [RW 3] The weight of the input pbf in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_PBF_WEIGHT 0xd00ac +#define CCM_REG_PHYS_QNUM1_0 0xd0134 +#define CCM_REG_PHYS_QNUM1_1 0xd0138 +#define CCM_REG_PHYS_QNUM2_0 0xd013c +#define CCM_REG_PHYS_QNUM2_1 0xd0140 +#define CCM_REG_PHYS_QNUM3_0 0xd0144 +#define CCM_REG_PHYS_QNUM3_1 0xd0148 +#define CCM_REG_QOS_PHYS_QNUM0_0 0xd0114 +#define CCM_REG_QOS_PHYS_QNUM0_1 0xd0118 +#define CCM_REG_QOS_PHYS_QNUM1_0 0xd011c +#define CCM_REG_QOS_PHYS_QNUM1_1 0xd0120 +#define CCM_REG_QOS_PHYS_QNUM2_0 0xd0124 +#define CCM_REG_QOS_PHYS_QNUM2_1 0xd0128 +#define CCM_REG_QOS_PHYS_QNUM3_0 0xd012c +#define CCM_REG_QOS_PHYS_QNUM3_1 0xd0130 +/* [RW 1] STORM - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define CCM_REG_STORM_CCM_IFEN 0xd0010 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the STORM interface is detected. */ +#define CCM_REG_STORM_LENGTH_MIS 0xd016c +/* [RW 3] The weight of the STORM input in the WRR (Weighted Round robin) + mechanism. 0 stands for weight 8 (the most prioritised); 1 stands for + weight 1(least prioritised); 2 stands for weight 2 (more prioritised); + tc. */ +#define CCM_REG_STORM_WEIGHT 0xd009c +/* [RW 1] Input tsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define CCM_REG_TSEM_IFEN 0xd001c +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the tsem interface is detected. */ +#define CCM_REG_TSEM_LENGTH_MIS 0xd0174 +/* [RW 3] The weight of the input tsem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_TSEM_WEIGHT 0xd00a0 +/* [RW 1] Input usem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define CCM_REG_USEM_IFEN 0xd0024 +/* [RC 1] Set when message length mismatch (relative to last indication) at + the usem interface is detected. */ +#define CCM_REG_USEM_LENGTH_MIS 0xd017c +/* [RW 3] The weight of the input usem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_USEM_WEIGHT 0xd00a8 +/* [RW 1] Input xsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define CCM_REG_XSEM_IFEN 0xd0020 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the xsem interface is detected. */ +#define CCM_REG_XSEM_LENGTH_MIS 0xd0178 +/* [RW 3] The weight of the input xsem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define CCM_REG_XSEM_WEIGHT 0xd00a4 +/* [RW 19] Indirect access to the descriptor table of the XX protection + mechanism. The fields are: [5:0] - message length; [12:6] - message + pointer; 18:13] - next pointer. */ +#define CCM_REG_XX_DESCR_TABLE 0xd0300 +#define CCM_REG_XX_DESCR_TABLE_SIZE 36 +/* [R 7] Used to read the value of XX protection Free counter. */ +#define CCM_REG_XX_FREE 0xd0184 +/* [RW 6] Initial value for the credit counter; responsible for fulfilling + of the Input Stage XX protection buffer by the XX protection pending + messages. Max credit available - 127. Write writes the initial credit + value; read returns the current value of the credit counter. Must be + initialized to maximum XX protected message size - 2 at start-up. */ +#define CCM_REG_XX_INIT_CRD 0xd0220 +/* [RW 7] The maximum number of pending messages; which may be stored in XX + protection. At read the ~ccm_registers_xx_free.xx_free counter is read. + At write comprises the start value of the ~ccm_registers_xx_free.xx_free + counter. */ +#define CCM_REG_XX_MSG_NUM 0xd0224 +/* [RW 8] The Event ID; sent to the STORM in case of XX overflow. */ +#define CCM_REG_XX_OVFL_EVNT_ID 0xd0044 +/* [RW 18] Indirect access to the XX table of the XX protection mechanism. + The fields are: [5:0] - tail pointer; 11:6] - Link List size; 17:12] - + header pointer. */ +#define CCM_REG_XX_TABLE 0xd0280 +#define CDU_REG_CDU_CHK_MASK0 0x101000 +#define CDU_REG_CDU_CHK_MASK1 0x101004 +#define CDU_REG_CDU_CONTROL0 0x101008 +#define CDU_REG_CDU_DEBUG 0x101010 +#define CDU_REG_CDU_GLOBAL_PARAMS 0x101020 +/* [RW 7] Interrupt mask register #0 read/write */ +#define CDU_REG_CDU_INT_MASK 0x10103c +/* [R 7] Interrupt register #0 read */ +#define CDU_REG_CDU_INT_STS 0x101030 +/* [RW 5] Parity mask register #0 read/write */ +#define CDU_REG_CDU_PRTY_MASK 0x10104c +/* [R 5] Parity register #0 read */ +#define CDU_REG_CDU_PRTY_STS 0x101040 +/* [RC 32] logging of error data in case of a CDU load error: + {expected_cid[15:0]; xpected_type[2:0]; xpected_region[2:0]; ctive_error; + ype_error; ctual_active; ctual_compressed_context}; */ +#define CDU_REG_ERROR_DATA 0x101014 +/* [WB 216] L1TT ram access. each entry has the following format : + {mrege_regions[7:0]; ffset12[5:0]...offset0[5:0]; + ength12[5:0]...length0[5:0]; d12[3:0]...id0[3:0]} */ +#define CDU_REG_L1TT 0x101800 +/* [WB 24] MATT ram access. each entry has the following + format:{RegionLength[11:0]; egionOffset[11:0]} */ +#define CDU_REG_MATT 0x101100 +/* [RW 1] when this bit is set the CDU operates in e1hmf mode */ +#define CDU_REG_MF_MODE 0x101050 +/* [RW 13] activity counter ram access */ +#define CFC_REG_ACTIVITY_COUNTER 0x104400 +#define CFC_REG_ACTIVITY_COUNTER_SIZE 256 +/* [R 1] indication the initializing the activity counter by the hardware + was done. */ +#define CFC_REG_AC_INIT_DONE 0x104078 +/* [R 1] indication the initializing the cams by the hardware was done. */ +#define CFC_REG_CAM_INIT_DONE 0x10407c +/* [RW 2] Interrupt mask register #0 read/write */ +#define CFC_REG_CFC_INT_MASK 0x104108 +/* [R 2] Interrupt register #0 read */ +#define CFC_REG_CFC_INT_STS 0x1040fc +/* [RC 2] Interrupt register #0 read clear */ +#define CFC_REG_CFC_INT_STS_CLR 0x104100 +/* [RW 4] Parity mask register #0 read/write */ +#define CFC_REG_CFC_PRTY_MASK 0x104118 +/* [R 4] Parity register #0 read */ +#define CFC_REG_CFC_PRTY_STS 0x10410c +/* [RW 21] CID cam access (21:1 - Data; alid - 0) */ +#define CFC_REG_CID_CAM 0x104800 +#define CFC_REG_CONTROL0 0x104028 +#define CFC_REG_DEBUG0 0x104050 +/* [RW 14] indicates per error (in #cfc_registers_cfc_error_vector.cfc_error + vector) whether the cfc should be disabled upon it */ +#define CFC_REG_DISABLE_ON_ERROR 0x104044 +/* [RC 14] CFC error vector. when the CFC detects an internal error it will + set one of these bits. the bit description can be found in CFC + specifications */ +#define CFC_REG_ERROR_VECTOR 0x10403c +/* [WB 93] LCID info ram access */ +#define CFC_REG_INFO_RAM 0x105000 +#define CFC_REG_INFO_RAM_SIZE 1024 +#define CFC_REG_INIT_REG 0x10404c +#define CFC_REG_INTERFACES 0x104058 +/* [RW 24] {weight_load_client7[2:0] to weight_load_client0[2:0]}. this + field allows changing the priorities of the weighted-round-robin arbiter + which selects which CFC load client should be served next */ +#define CFC_REG_LCREQ_WEIGHTS 0x104084 +/* [RW 16] Link List ram access; data = {prev_lcid; ext_lcid} */ +#define CFC_REG_LINK_LIST 0x104c00 +#define CFC_REG_LINK_LIST_SIZE 256 +/* [R 1] indication the initializing the link list by the hardware was done. */ +#define CFC_REG_LL_INIT_DONE 0x104074 +/* [R 9] Number of allocated LCIDs which are at empty state */ +#define CFC_REG_NUM_LCIDS_ALLOC 0x104020 +/* [R 9] Number of Arriving LCIDs in Link List Block */ +#define CFC_REG_NUM_LCIDS_ARRIVING 0x104004 +/* [R 9] Number of Leaving LCIDs in Link List Block */ +#define CFC_REG_NUM_LCIDS_LEAVING 0x104018 +/* [RW 8] The event id for aggregated interrupt 0 */ +#define CSDM_REG_AGG_INT_EVENT_0 0xc2038 +#define CSDM_REG_AGG_INT_EVENT_1 0xc203c +#define CSDM_REG_AGG_INT_EVENT_10 0xc2060 +#define CSDM_REG_AGG_INT_EVENT_11 0xc2064 +#define CSDM_REG_AGG_INT_EVENT_12 0xc2068 +#define CSDM_REG_AGG_INT_EVENT_13 0xc206c +#define CSDM_REG_AGG_INT_EVENT_14 0xc2070 +#define CSDM_REG_AGG_INT_EVENT_15 0xc2074 +#define CSDM_REG_AGG_INT_EVENT_16 0xc2078 +#define CSDM_REG_AGG_INT_EVENT_17 0xc207c +#define CSDM_REG_AGG_INT_EVENT_18 0xc2080 +#define CSDM_REG_AGG_INT_EVENT_19 0xc2084 +#define CSDM_REG_AGG_INT_EVENT_2 0xc2040 +#define CSDM_REG_AGG_INT_EVENT_20 0xc2088 +#define CSDM_REG_AGG_INT_EVENT_21 0xc208c +#define CSDM_REG_AGG_INT_EVENT_22 0xc2090 +#define CSDM_REG_AGG_INT_EVENT_23 0xc2094 +#define CSDM_REG_AGG_INT_EVENT_24 0xc2098 +#define CSDM_REG_AGG_INT_EVENT_25 0xc209c +#define CSDM_REG_AGG_INT_EVENT_26 0xc20a0 +#define CSDM_REG_AGG_INT_EVENT_27 0xc20a4 +#define CSDM_REG_AGG_INT_EVENT_28 0xc20a8 +#define CSDM_REG_AGG_INT_EVENT_29 0xc20ac +#define CSDM_REG_AGG_INT_EVENT_3 0xc2044 +#define CSDM_REG_AGG_INT_EVENT_30 0xc20b0 +#define CSDM_REG_AGG_INT_EVENT_31 0xc20b4 +#define CSDM_REG_AGG_INT_EVENT_4 0xc2048 +/* [RW 1] The T bit for aggregated interrupt 0 */ +#define CSDM_REG_AGG_INT_T_0 0xc20b8 +#define CSDM_REG_AGG_INT_T_1 0xc20bc +#define CSDM_REG_AGG_INT_T_10 0xc20e0 +#define CSDM_REG_AGG_INT_T_11 0xc20e4 +#define CSDM_REG_AGG_INT_T_12 0xc20e8 +#define CSDM_REG_AGG_INT_T_13 0xc20ec +#define CSDM_REG_AGG_INT_T_14 0xc20f0 +#define CSDM_REG_AGG_INT_T_15 0xc20f4 +#define CSDM_REG_AGG_INT_T_16 0xc20f8 +#define CSDM_REG_AGG_INT_T_17 0xc20fc +#define CSDM_REG_AGG_INT_T_18 0xc2100 +#define CSDM_REG_AGG_INT_T_19 0xc2104 +/* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ +#define CSDM_REG_CFC_RSP_START_ADDR 0xc2008 +/* [RW 16] The maximum value of the competion counter #0 */ +#define CSDM_REG_CMP_COUNTER_MAX0 0xc201c +/* [RW 16] The maximum value of the competion counter #1 */ +#define CSDM_REG_CMP_COUNTER_MAX1 0xc2020 +/* [RW 16] The maximum value of the competion counter #2 */ +#define CSDM_REG_CMP_COUNTER_MAX2 0xc2024 +/* [RW 16] The maximum value of the competion counter #3 */ +#define CSDM_REG_CMP_COUNTER_MAX3 0xc2028 +/* [RW 13] The start address in the internal RAM for the completion + counters. */ +#define CSDM_REG_CMP_COUNTER_START_ADDR 0xc200c +/* [RW 32] Interrupt mask register #0 read/write */ +#define CSDM_REG_CSDM_INT_MASK_0 0xc229c +#define CSDM_REG_CSDM_INT_MASK_1 0xc22ac +/* [R 32] Interrupt register #0 read */ +#define CSDM_REG_CSDM_INT_STS_0 0xc2290 +#define CSDM_REG_CSDM_INT_STS_1 0xc22a0 +/* [RW 11] Parity mask register #0 read/write */ +#define CSDM_REG_CSDM_PRTY_MASK 0xc22bc +/* [R 11] Parity register #0 read */ +#define CSDM_REG_CSDM_PRTY_STS 0xc22b0 +#define CSDM_REG_ENABLE_IN1 0xc2238 +#define CSDM_REG_ENABLE_IN2 0xc223c +#define CSDM_REG_ENABLE_OUT1 0xc2240 +#define CSDM_REG_ENABLE_OUT2 0xc2244 +/* [RW 4] The initial number of messages that can be sent to the pxp control + interface without receiving any ACK. */ +#define CSDM_REG_INIT_CREDIT_PXP_CTRL 0xc24bc +/* [ST 32] The number of ACK after placement messages received */ +#define CSDM_REG_NUM_OF_ACK_AFTER_PLACE 0xc227c +/* [ST 32] The number of packet end messages received from the parser */ +#define CSDM_REG_NUM_OF_PKT_END_MSG 0xc2274 +/* [ST 32] The number of requests received from the pxp async if */ +#define CSDM_REG_NUM_OF_PXP_ASYNC_REQ 0xc2278 +/* [ST 32] The number of commands received in queue 0 */ +#define CSDM_REG_NUM_OF_Q0_CMD 0xc2248 +/* [ST 32] The number of commands received in queue 10 */ +#define CSDM_REG_NUM_OF_Q10_CMD 0xc226c +/* [ST 32] The number of commands received in queue 11 */ +#define CSDM_REG_NUM_OF_Q11_CMD 0xc2270 +/* [ST 32] The number of commands received in queue 1 */ +#define CSDM_REG_NUM_OF_Q1_CMD 0xc224c +/* [ST 32] The number of commands received in queue 3 */ +#define CSDM_REG_NUM_OF_Q3_CMD 0xc2250 +/* [ST 32] The number of commands received in queue 4 */ +#define CSDM_REG_NUM_OF_Q4_CMD 0xc2254 +/* [ST 32] The number of commands received in queue 5 */ +#define CSDM_REG_NUM_OF_Q5_CMD 0xc2258 +/* [ST 32] The number of commands received in queue 6 */ +#define CSDM_REG_NUM_OF_Q6_CMD 0xc225c +/* [ST 32] The number of commands received in queue 7 */ +#define CSDM_REG_NUM_OF_Q7_CMD 0xc2260 +/* [ST 32] The number of commands received in queue 8 */ +#define CSDM_REG_NUM_OF_Q8_CMD 0xc2264 +/* [ST 32] The number of commands received in queue 9 */ +#define CSDM_REG_NUM_OF_Q9_CMD 0xc2268 +/* [RW 13] The start address in the internal RAM for queue counters */ +#define CSDM_REG_Q_COUNTER_START_ADDR 0xc2010 +/* [R 1] pxp_ctrl rd_data fifo empty in sdm_dma_rsp block */ +#define CSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY 0xc2548 +/* [R 1] parser fifo empty in sdm_sync block */ +#define CSDM_REG_SYNC_PARSER_EMPTY 0xc2550 +/* [R 1] parser serial fifo empty in sdm_sync block */ +#define CSDM_REG_SYNC_SYNC_EMPTY 0xc2558 +/* [RW 32] Tick for timer counter. Applicable only when + ~csdm_registers_timer_tick_enable.timer_tick_enable =1 */ +#define CSDM_REG_TIMER_TICK 0xc2000 +/* [RW 5] The number of time_slots in the arbitration cycle */ +#define CSEM_REG_ARB_CYCLE_SIZE 0x200034 +/* [RW 3] The source that is associated with arbitration element 0. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2 */ +#define CSEM_REG_ARB_ELEMENT0 0x200020 +/* [RW 3] The source that is associated with arbitration element 1. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~csem_registers_arb_element0.arb_element0 */ +#define CSEM_REG_ARB_ELEMENT1 0x200024 +/* [RW 3] The source that is associated with arbitration element 2. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~csem_registers_arb_element0.arb_element0 + and ~csem_registers_arb_element1.arb_element1 */ +#define CSEM_REG_ARB_ELEMENT2 0x200028 +/* [RW 3] The source that is associated with arbitration element 3. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2.Could + not be equal to register ~csem_registers_arb_element0.arb_element0 and + ~csem_registers_arb_element1.arb_element1 and + ~csem_registers_arb_element2.arb_element2 */ +#define CSEM_REG_ARB_ELEMENT3 0x20002c +/* [RW 3] The source that is associated with arbitration element 4. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~csem_registers_arb_element0.arb_element0 + and ~csem_registers_arb_element1.arb_element1 and + ~csem_registers_arb_element2.arb_element2 and + ~csem_registers_arb_element3.arb_element3 */ +#define CSEM_REG_ARB_ELEMENT4 0x200030 +/* [RW 32] Interrupt mask register #0 read/write */ +#define CSEM_REG_CSEM_INT_MASK_0 0x200110 +#define CSEM_REG_CSEM_INT_MASK_1 0x200120 +/* [R 32] Interrupt register #0 read */ +#define CSEM_REG_CSEM_INT_STS_0 0x200104 +#define CSEM_REG_CSEM_INT_STS_1 0x200114 +/* [RW 32] Parity mask register #0 read/write */ +#define CSEM_REG_CSEM_PRTY_MASK_0 0x200130 +#define CSEM_REG_CSEM_PRTY_MASK_1 0x200140 +/* [R 32] Parity register #0 read */ +#define CSEM_REG_CSEM_PRTY_STS_0 0x200124 +#define CSEM_REG_CSEM_PRTY_STS_1 0x200134 +#define CSEM_REG_ENABLE_IN 0x2000a4 +#define CSEM_REG_ENABLE_OUT 0x2000a8 +/* [RW 32] This address space contains all registers and memories that are + placed in SEM_FAST block. The SEM_FAST registers are described in + appendix B. In order to access the sem_fast registers the base address + ~fast_memory.fast_memory should be added to eachsem_fast register offset. */ +#define CSEM_REG_FAST_MEMORY 0x220000 +/* [RW 1] Disables input messages from FIC0 May be updated during run_time + by the microcode */ +#define CSEM_REG_FIC0_DISABLE 0x200224 +/* [RW 1] Disables input messages from FIC1 May be updated during run_time + by the microcode */ +#define CSEM_REG_FIC1_DISABLE 0x200234 +/* [RW 15] Interrupt table Read and write access to it is not possible in + the middle of the work */ +#define CSEM_REG_INT_TABLE 0x200400 +/* [ST 24] Statistics register. The number of messages that entered through + FIC0 */ +#define CSEM_REG_MSG_NUM_FIC0 0x200000 +/* [ST 24] Statistics register. The number of messages that entered through + FIC1 */ +#define CSEM_REG_MSG_NUM_FIC1 0x200004 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC0 */ +#define CSEM_REG_MSG_NUM_FOC0 0x200008 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC1 */ +#define CSEM_REG_MSG_NUM_FOC1 0x20000c +/* [ST 24] Statistics register. The number of messages that were sent to + FOC2 */ +#define CSEM_REG_MSG_NUM_FOC2 0x200010 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ +#define CSEM_REG_MSG_NUM_FOC3 0x200014 +/* [WB 128] Debug only. Passive buffer memory */ +#define CSEM_REG_PASSIVE_BUFFER 0x202000 +/* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ +#define CSEM_REG_PAS_DISABLE 0x20024c +/* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ +#define CSEM_REG_PRAM 0x240000 +/* [R 16] Valid sleeping threads indication have bit per thread */ +#define CSEM_REG_SLEEP_THREADS_VALID 0x20026c +/* [R 1] EXT_STORE FIFO is empty in sem_slow_ls_ext */ +#define CSEM_REG_SLOW_EXT_STORE_EMPTY 0x2002a0 +/* [RW 16] List of free threads . There is a bit per thread. */ +#define CSEM_REG_THREADS_LIST 0x2002e4 +/* [RW 3] The arbitration scheme of time_slot 0 */ +#define CSEM_REG_TS_0_AS 0x200038 +/* [RW 3] The arbitration scheme of time_slot 10 */ +#define CSEM_REG_TS_10_AS 0x200060 +/* [RW 3] The arbitration scheme of time_slot 11 */ +#define CSEM_REG_TS_11_AS 0x200064 +/* [RW 3] The arbitration scheme of time_slot 12 */ +#define CSEM_REG_TS_12_AS 0x200068 +/* [RW 3] The arbitration scheme of time_slot 13 */ +#define CSEM_REG_TS_13_AS 0x20006c +/* [RW 3] The arbitration scheme of time_slot 14 */ +#define CSEM_REG_TS_14_AS 0x200070 +/* [RW 3] The arbitration scheme of time_slot 15 */ +#define CSEM_REG_TS_15_AS 0x200074 +/* [RW 3] The arbitration scheme of time_slot 16 */ +#define CSEM_REG_TS_16_AS 0x200078 +/* [RW 3] The arbitration scheme of time_slot 17 */ +#define CSEM_REG_TS_17_AS 0x20007c +/* [RW 3] The arbitration scheme of time_slot 18 */ +#define CSEM_REG_TS_18_AS 0x200080 +/* [RW 3] The arbitration scheme of time_slot 1 */ +#define CSEM_REG_TS_1_AS 0x20003c +/* [RW 3] The arbitration scheme of time_slot 2 */ +#define CSEM_REG_TS_2_AS 0x200040 +/* [RW 3] The arbitration scheme of time_slot 3 */ +#define CSEM_REG_TS_3_AS 0x200044 +/* [RW 3] The arbitration scheme of time_slot 4 */ +#define CSEM_REG_TS_4_AS 0x200048 +/* [RW 3] The arbitration scheme of time_slot 5 */ +#define CSEM_REG_TS_5_AS 0x20004c +/* [RW 3] The arbitration scheme of time_slot 6 */ +#define CSEM_REG_TS_6_AS 0x200050 +/* [RW 3] The arbitration scheme of time_slot 7 */ +#define CSEM_REG_TS_7_AS 0x200054 +/* [RW 3] The arbitration scheme of time_slot 8 */ +#define CSEM_REG_TS_8_AS 0x200058 +/* [RW 3] The arbitration scheme of time_slot 9 */ +#define CSEM_REG_TS_9_AS 0x20005c +/* [RW 1] Parity mask register #0 read/write */ +#define DBG_REG_DBG_PRTY_MASK 0xc0a8 +/* [R 1] Parity register #0 read */ +#define DBG_REG_DBG_PRTY_STS 0xc09c +/* [RW 32] Commands memory. The address to command X; row Y is to calculated + as 14*X+Y. */ +#define DMAE_REG_CMD_MEM 0x102400 +#define DMAE_REG_CMD_MEM_SIZE 224 +/* [RW 1] If 0 - the CRC-16c initial value is all zeroes; if 1 - the CRC-16c + initial value is all ones. */ +#define DMAE_REG_CRC16C_INIT 0x10201c +/* [RW 1] If 0 - the CRC-16 T10 initial value is all zeroes; if 1 - the + CRC-16 T10 initial value is all ones. */ +#define DMAE_REG_CRC16T10_INIT 0x102020 +/* [RW 2] Interrupt mask register #0 read/write */ +#define DMAE_REG_DMAE_INT_MASK 0x102054 +/* [RW 4] Parity mask register #0 read/write */ +#define DMAE_REG_DMAE_PRTY_MASK 0x102064 +/* [R 4] Parity register #0 read */ +#define DMAE_REG_DMAE_PRTY_STS 0x102058 +/* [RW 1] Command 0 go. */ +#define DMAE_REG_GO_C0 0x102080 +/* [RW 1] Command 1 go. */ +#define DMAE_REG_GO_C1 0x102084 +/* [RW 1] Command 10 go. */ +#define DMAE_REG_GO_C10 0x102088 +#define DMAE_REG_GO_C10_SIZE 1 +/* [RW 1] Command 11 go. */ +#define DMAE_REG_GO_C11 0x10208c +#define DMAE_REG_GO_C11_SIZE 1 +/* [RW 1] Command 12 go. */ +#define DMAE_REG_GO_C12 0x102090 +#define DMAE_REG_GO_C12_SIZE 1 +/* [RW 1] Command 13 go. */ +#define DMAE_REG_GO_C13 0x102094 +#define DMAE_REG_GO_C13_SIZE 1 +/* [RW 1] Command 14 go. */ +#define DMAE_REG_GO_C14 0x102098 +#define DMAE_REG_GO_C14_SIZE 1 +/* [RW 1] Command 15 go. */ +#define DMAE_REG_GO_C15 0x10209c +#define DMAE_REG_GO_C15_SIZE 1 +/* [RW 1] Command 10 go. */ +#define DMAE_REG_GO_C10 0x102088 +/* [RW 1] Command 11 go. */ +#define DMAE_REG_GO_C11 0x10208c +/* [RW 1] Command 12 go. */ +#define DMAE_REG_GO_C12 0x102090 +/* [RW 1] Command 13 go. */ +#define DMAE_REG_GO_C13 0x102094 +/* [RW 1] Command 14 go. */ +#define DMAE_REG_GO_C14 0x102098 +/* [RW 1] Command 15 go. */ +#define DMAE_REG_GO_C15 0x10209c +/* [RW 1] Command 2 go. */ +#define DMAE_REG_GO_C2 0x1020a0 +/* [RW 1] Command 3 go. */ +#define DMAE_REG_GO_C3 0x1020a4 +/* [RW 1] Command 4 go. */ +#define DMAE_REG_GO_C4 0x1020a8 +/* [RW 1] Command 5 go. */ +#define DMAE_REG_GO_C5 0x1020ac +/* [RW 1] Command 6 go. */ +#define DMAE_REG_GO_C6 0x1020b0 +/* [RW 1] Command 7 go. */ +#define DMAE_REG_GO_C7 0x1020b4 +/* [RW 1] Command 8 go. */ +#define DMAE_REG_GO_C8 0x1020b8 +/* [RW 1] Command 9 go. */ +#define DMAE_REG_GO_C9 0x1020bc +/* [RW 1] DMAE GRC Interface (Target; aster) enable. If 0 - the acknowledge + input is disregarded; valid is deasserted; all other signals are treated + as usual; if 1 - normal activity. */ +#define DMAE_REG_GRC_IFEN 0x102008 +/* [RW 1] DMAE PCI Interface (Request; ead; rite) enable. If 0 - the + acknowledge input is disregarded; valid is deasserted; full is asserted; + all other signals are treated as usual; if 1 - normal activity. */ +#define DMAE_REG_PCI_IFEN 0x102004 +/* [RW 4] DMAE- PCI Request Interface initial credit. Write writes the + initial value to the credit counter; related to the address. Read returns + the current value of the counter. */ +#define DMAE_REG_PXP_REQ_INIT_CRD 0x1020c0 +/* [RW 8] Aggregation command. */ +#define DORQ_REG_AGG_CMD0 0x170060 +/* [RW 8] Aggregation command. */ +#define DORQ_REG_AGG_CMD1 0x170064 +/* [RW 8] Aggregation command. */ +#define DORQ_REG_AGG_CMD2 0x170068 +/* [RW 8] Aggregation command. */ +#define DORQ_REG_AGG_CMD3 0x17006c +/* [RW 28] UCM Header. */ +#define DORQ_REG_CMHEAD_RX 0x170050 +/* [RW 32] Doorbell address for RBC doorbells (function 0). */ +#define DORQ_REG_DB_ADDR0 0x17008c +/* [RW 5] Interrupt mask register #0 read/write */ +#define DORQ_REG_DORQ_INT_MASK 0x170180 +/* [R 5] Interrupt register #0 read */ +#define DORQ_REG_DORQ_INT_STS 0x170174 +/* [RC 5] Interrupt register #0 read clear */ +#define DORQ_REG_DORQ_INT_STS_CLR 0x170178 +/* [RW 2] Parity mask register #0 read/write */ +#define DORQ_REG_DORQ_PRTY_MASK 0x170190 +/* [R 2] Parity register #0 read */ +#define DORQ_REG_DORQ_PRTY_STS 0x170184 +/* [RW 8] The address to write the DPM CID to STORM. */ +#define DORQ_REG_DPM_CID_ADDR 0x170044 +/* [RW 5] The DPM mode CID extraction offset. */ +#define DORQ_REG_DPM_CID_OFST 0x170030 +/* [RW 12] The threshold of the DQ FIFO to send the almost full interrupt. */ +#define DORQ_REG_DQ_FIFO_AFULL_TH 0x17007c +/* [RW 12] The threshold of the DQ FIFO to send the full interrupt. */ +#define DORQ_REG_DQ_FIFO_FULL_TH 0x170078 +/* [R 13] Current value of the DQ FIFO fill level according to following + pointer. The range is 0 - 256 FIFO rows; where each row stands for the + doorbell. */ +#define DORQ_REG_DQ_FILL_LVLF 0x1700a4 +/* [R 1] DQ FIFO full status. Is set; when FIFO filling level is more or + equal to full threshold; reset on full clear. */ +#define DORQ_REG_DQ_FULL_ST 0x1700c0 +/* [RW 28] The value sent to CM header in the case of CFC load error. */ +#define DORQ_REG_ERR_CMHEAD 0x170058 +#define DORQ_REG_IF_EN 0x170004 +#define DORQ_REG_MODE_ACT 0x170008 +/* [RW 5] The normal mode CID extraction offset. */ +#define DORQ_REG_NORM_CID_OFST 0x17002c +/* [RW 28] TCM Header when only TCP context is loaded. */ +#define DORQ_REG_NORM_CMHEAD_TX 0x17004c +/* [RW 3] The number of simultaneous outstanding requests to Context Fetch + Interface. */ +#define DORQ_REG_OUTST_REQ 0x17003c +#define DORQ_REG_REGN 0x170038 +/* [R 4] Current value of response A counter credit. Initial credit is + configured through write to ~dorq_registers_rsp_init_crd.rsp_init_crd + register. */ +#define DORQ_REG_RSPA_CRD_CNT 0x1700ac +/* [R 4] Current value of response B counter credit. Initial credit is + configured through write to ~dorq_registers_rsp_init_crd.rsp_init_crd + register. */ +#define DORQ_REG_RSPB_CRD_CNT 0x1700b0 +/* [RW 4] The initial credit at the Doorbell Response Interface. The write + writes the same initial credit to the rspa_crd_cnt and rspb_crd_cnt. The + read reads this written value. */ +#define DORQ_REG_RSP_INIT_CRD 0x170048 +/* [RW 4] Initial activity counter value on the load request; when the + shortcut is done. */ +#define DORQ_REG_SHRT_ACT_CNT 0x170070 +/* [RW 28] TCM Header when both ULP and TCP context is loaded. */ +#define DORQ_REG_SHRT_CMHEAD 0x170054 +#define HC_CONFIG_0_REG_ATTN_BIT_EN_0 (0x1<<4) +#define HC_CONFIG_0_REG_INT_LINE_EN_0 (0x1<<3) +#define HC_CONFIG_0_REG_MSI_ATTN_EN_0 (0x1<<7) +#define HC_CONFIG_0_REG_MSI_MSIX_INT_EN_0 (0x1<<2) +#define HC_CONFIG_0_REG_SINGLE_ISR_EN_0 (0x1<<1) +#define HC_REG_AGG_INT_0 0x108050 +#define HC_REG_AGG_INT_1 0x108054 +#define HC_REG_ATTN_BIT 0x108120 +#define HC_REG_ATTN_IDX 0x108100 +#define HC_REG_ATTN_MSG0_ADDR_L 0x108018 +#define HC_REG_ATTN_MSG1_ADDR_L 0x108020 +#define HC_REG_ATTN_NUM_P0 0x108038 +#define HC_REG_ATTN_NUM_P1 0x10803c +#define HC_REG_COMMAND_REG 0x108180 +#define HC_REG_CONFIG_0 0x108000 +#define HC_REG_CONFIG_1 0x108004 +#define HC_REG_FUNC_NUM_P0 0x1080ac +#define HC_REG_FUNC_NUM_P1 0x1080b0 +/* [RW 3] Parity mask register #0 read/write */ +#define HC_REG_HC_PRTY_MASK 0x1080a0 +/* [R 3] Parity register #0 read */ +#define HC_REG_HC_PRTY_STS 0x108094 +#define HC_REG_INT_MASK 0x108108 +#define HC_REG_LEADING_EDGE_0 0x108040 +#define HC_REG_LEADING_EDGE_1 0x108048 +#define HC_REG_P0_PROD_CONS 0x108200 +#define HC_REG_P1_PROD_CONS 0x108400 +#define HC_REG_PBA_COMMAND 0x108140 +#define HC_REG_PCI_CONFIG_0 0x108010 +#define HC_REG_PCI_CONFIG_1 0x108014 +#define HC_REG_STATISTIC_COUNTERS 0x109000 +#define HC_REG_TRAILING_EDGE_0 0x108044 +#define HC_REG_TRAILING_EDGE_1 0x10804c +#define HC_REG_UC_RAM_ADDR_0 0x108028 +#define HC_REG_UC_RAM_ADDR_1 0x108030 +#define HC_REG_USTORM_ADDR_FOR_COALESCE 0x108068 +#define HC_REG_VQID_0 0x108008 +#define HC_REG_VQID_1 0x10800c +#define MCP_REG_MCPR_NVM_ACCESS_ENABLE 0x86424 +#define MCP_REG_MCPR_NVM_ADDR 0x8640c +#define MCP_REG_MCPR_NVM_CFG4 0x8642c +#define MCP_REG_MCPR_NVM_COMMAND 0x86400 +#define MCP_REG_MCPR_NVM_READ 0x86410 +#define MCP_REG_MCPR_NVM_SW_ARB 0x86420 +#define MCP_REG_MCPR_NVM_WRITE 0x86408 +#define MCP_REG_MCPR_NVM_WRITE1 0x86428 +#define MCP_REG_MCPR_SCRATCH 0xa0000 +/* [R 32] read first 32 bit after inversion of function 0. mapped as + follows: [0] NIG attention for function0; [1] NIG attention for + function1; [2] GPIO1 mcp; [3] GPIO2 mcp; [4] GPIO3 mcp; [5] GPIO4 mcp; + [6] GPIO1 function 1; [7] GPIO2 function 1; [8] GPIO3 function 1; [9] + GPIO4 function 1; [10] PCIE glue/PXP VPD event function0; [11] PCIE + glue/PXP VPD event function1; [12] PCIE glue/PXP Expansion ROM event0; + [13] PCIE glue/PXP Expansion ROM event1; [14] SPIO4; [15] SPIO5; [16] + MSI/X indication for mcp; [17] MSI/X indication for function 1; [18] BRB + Parity error; [19] BRB Hw interrupt; [20] PRS Parity error; [21] PRS Hw + interrupt; [22] SRC Parity error; [23] SRC Hw interrupt; [24] TSDM Parity + error; [25] TSDM Hw interrupt; [26] TCM Parity error; [27] TCM Hw + interrupt; [28] TSEMI Parity error; [29] TSEMI Hw interrupt; [30] PBF + Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_AFTER_INVERT_1_FUNC_0 0xa42c +#define MISC_REG_AEU_AFTER_INVERT_1_FUNC_1 0xa430 +/* [R 32] read first 32 bit after inversion of mcp. mapped as follows: [0] + NIG attention for function0; [1] NIG attention for function1; [2] GPIO1 + mcp; [3] GPIO2 mcp; [4] GPIO3 mcp; [5] GPIO4 mcp; [6] GPIO1 function 1; + [7] GPIO2 function 1; [8] GPIO3 function 1; [9] GPIO4 function 1; [10] + PCIE glue/PXP VPD event function0; [11] PCIE glue/PXP VPD event + function1; [12] PCIE glue/PXP Expansion ROM event0; [13] PCIE glue/PXP + Expansion ROM event1; [14] SPIO4; [15] SPIO5; [16] MSI/X indication for + mcp; [17] MSI/X indication for function 1; [18] BRB Parity error; [19] + BRB Hw interrupt; [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC + Parity error; [23] SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw + interrupt; [26] TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI + Parity error; [29] TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw + interrupt; */ +#define MISC_REG_AEU_AFTER_INVERT_1_MCP 0xa434 +/* [R 32] read second 32 bit after inversion of function 0. mapped as + follows: [0] PBClient Parity error; [1] PBClient Hw interrupt; [2] QM + Parity error; [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw + interrupt; [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity + error; [9] XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw + interrupt; [12] DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] + NIG Parity error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; + [17] Vaux PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw + interrupt; [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM + Parity error; [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI + Hw interrupt; [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM + Parity error; [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw + interrupt; */ +#define MISC_REG_AEU_AFTER_INVERT_2_FUNC_0 0xa438 +#define MISC_REG_AEU_AFTER_INVERT_2_FUNC_1 0xa43c +/* [R 32] read second 32 bit after inversion of mcp. mapped as follows: [0] + PBClient Parity error; [1] PBClient Hw interrupt; [2] QM Parity error; + [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw interrupt; + [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity error; [9] + XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw interrupt; [12] + DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] NIG Parity + error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; [17] Vaux + PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw interrupt; + [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM Parity error; + [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI Hw interrupt; + [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM Parity error; + [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw interrupt; */ +#define MISC_REG_AEU_AFTER_INVERT_2_MCP 0xa440 +/* [R 32] read third 32 bit after inversion of function 0. mapped as + follows: [0] CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP Parity + error; [3] PXP Hw interrupt; [4] PXPpciClockClient Parity error; [5] + PXPpciClockClient Hw interrupt; [6] CFC Parity error; [7] CFC Hw + interrupt; [8] CDU Parity error; [9] CDU Hw interrupt; [10] DMAE Parity + error; [11] DMAE Hw interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) + Hw interrupt; [14] MISC Parity error; [15] MISC Hw interrupt; [16] + pxp_misc_mps_attn; [17] Flash event; [18] SMB event; [19] MCP attn0; [20] + MCP attn1; [21] SW timers attn_1 func0; [22] SW timers attn_2 func0; [23] + SW timers attn_3 func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW + timers attn_1 func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 + func1; [29] SW timers attn_4 func1; [30] General attn0; [31] General + attn1; */ +#define MISC_REG_AEU_AFTER_INVERT_3_FUNC_0 0xa444 +#define MISC_REG_AEU_AFTER_INVERT_3_FUNC_1 0xa448 +/* [R 32] read third 32 bit after inversion of mcp. mapped as follows: [0] + CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP Parity error; [3] PXP + Hw interrupt; [4] PXPpciClockClient Parity error; [5] PXPpciClockClient + Hw interrupt; [6] CFC Parity error; [7] CFC Hw interrupt; [8] CDU Parity + error; [9] CDU Hw interrupt; [10] DMAE Parity error; [11] DMAE Hw + interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) Hw interrupt; [14] + MISC Parity error; [15] MISC Hw interrupt; [16] pxp_misc_mps_attn; [17] + Flash event; [18] SMB event; [19] MCP attn0; [20] MCP attn1; [21] SW + timers attn_1 func0; [22] SW timers attn_2 func0; [23] SW timers attn_3 + func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW timers attn_1 + func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 func1; [29] SW + timers attn_4 func1; [30] General attn0; [31] General attn1; */ +#define MISC_REG_AEU_AFTER_INVERT_3_MCP 0xa44c +/* [R 32] read fourth 32 bit after inversion of function 0. mapped as + follows: [0] General attn2; [1] General attn3; [2] General attn4; [3] + General attn5; [4] General attn6; [5] General attn7; [6] General attn8; + [7] General attn9; [8] General attn10; [9] General attn11; [10] General + attn12; [11] General attn13; [12] General attn14; [13] General attn15; + [14] General attn16; [15] General attn17; [16] General attn18; [17] + General attn19; [18] General attn20; [19] General attn21; [20] Main power + interrupt; [21] RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN + Latched attn; [24] RBCU Latched attn; [25] RBCP Latched attn; [26] GRC + Latched timeout attention; [27] GRC Latched reserved access attention; + [28] MCP Latched rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP + Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_AFTER_INVERT_4_FUNC_0 0xa450 +#define MISC_REG_AEU_AFTER_INVERT_4_FUNC_1 0xa454 +/* [R 32] read fourth 32 bit after inversion of mcp. mapped as follows: [0] + General attn2; [1] General attn3; [2] General attn4; [3] General attn5; + [4] General attn6; [5] General attn7; [6] General attn8; [7] General + attn9; [8] General attn10; [9] General attn11; [10] General attn12; [11] + General attn13; [12] General attn14; [13] General attn15; [14] General + attn16; [15] General attn17; [16] General attn18; [17] General attn19; + [18] General attn20; [19] General attn21; [20] Main power interrupt; [21] + RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN Latched attn; [24] + RBCU Latched attn; [25] RBCP Latched attn; [26] GRC Latched timeout + attention; [27] GRC Latched reserved access attention; [28] MCP Latched + rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP Latched + ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_AFTER_INVERT_4_MCP 0xa458 +/* [W 14] write to this register results with the clear of the latched + signals; one in d0 clears RBCR latch; one in d1 clears RBCT latch; one in + d2 clears RBCN latch; one in d3 clears RBCU latch; one in d4 clears RBCP + latch; one in d5 clears GRC Latched timeout attention; one in d6 clears + GRC Latched reserved access attention; one in d7 clears Latched + rom_parity; one in d8 clears Latched ump_rx_parity; one in d9 clears + Latched ump_tx_parity; one in d10 clears Latched scpad_parity (both + ports); one in d11 clears pxpv_misc_mps_attn; one in d12 clears + pxp_misc_exp_rom_attn0; one in d13 clears pxp_misc_exp_rom_attn1; read + from this register return zero */ +#define MISC_REG_AEU_CLR_LATCH_SIGNAL 0xa45c +/* [RW 32] first 32b for enabling the output for function 0 output0. mapped + as follows: [0] NIG attention for function0; [1] NIG attention for + function1; [2] GPIO1 function 0; [3] GPIO2 function 0; [4] GPIO3 function + 0; [5] GPIO4 function 0; [6] GPIO1 function 1; [7] GPIO2 function 1; [8] + GPIO3 function 1; [9] GPIO4 function 1; [10] PCIE glue/PXP VPD event + function0; [11] PCIE glue/PXP VPD event function1; [12] PCIE glue/PXP + Expansion ROM event0; [13] PCIE glue/PXP Expansion ROM event1; [14] + SPIO4; [15] SPIO5; [16] MSI/X indication for function 0; [17] MSI/X + indication for function 1; [18] BRB Parity error; [19] BRB Hw interrupt; + [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC Parity error; [23] + SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw interrupt; [26] + TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI Parity error; [29] + TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_0 0xa06c +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_1 0xa07c +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_2 0xa08c +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_3 0xa09c +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_5 0xa0bc +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_6 0xa0cc +#define MISC_REG_AEU_ENABLE1_FUNC_0_OUT_7 0xa0dc +/* [RW 32] first 32b for enabling the output for function 1 output0. mapped + as follows: [0] NIG attention for function0; [1] NIG attention for + function1; [2] GPIO1 function 1; [3] GPIO2 function 1; [4] GPIO3 function + 1; [5] GPIO4 function 1; [6] GPIO1 function 1; [7] GPIO2 function 1; [8] + GPIO3 function 1; [9] GPIO4 function 1; [10] PCIE glue/PXP VPD event + function0; [11] PCIE glue/PXP VPD event function1; [12] PCIE glue/PXP + Expansion ROM event0; [13] PCIE glue/PXP Expansion ROM event1; [14] + SPIO4; [15] SPIO5; [16] MSI/X indication for function 1; [17] MSI/X + indication for function 1; [18] BRB Parity error; [19] BRB Hw interrupt; + [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC Parity error; [23] + SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw interrupt; [26] + TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI Parity error; [29] + TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_0 0xa10c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_1 0xa11c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_2 0xa12c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_3 0xa13c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_5 0xa15c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_6 0xa16c +#define MISC_REG_AEU_ENABLE1_FUNC_1_OUT_7 0xa17c +/* [RW 32] first 32b for enabling the output for close the gate nig. mapped + as follows: [0] NIG attention for function0; [1] NIG attention for + function1; [2] GPIO1 function 0; [3] GPIO2 function 0; [4] GPIO3 function + 0; [5] GPIO4 function 0; [6] GPIO1 function 1; [7] GPIO2 function 1; [8] + GPIO3 function 1; [9] GPIO4 function 1; [10] PCIE glue/PXP VPD event + function0; [11] PCIE glue/PXP VPD event function1; [12] PCIE glue/PXP + Expansion ROM event0; [13] PCIE glue/PXP Expansion ROM event1; [14] + SPIO4; [15] SPIO5; [16] MSI/X indication for function 0; [17] MSI/X + indication for function 1; [18] BRB Parity error; [19] BRB Hw interrupt; + [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC Parity error; [23] + SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw interrupt; [26] + TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI Parity error; [29] + TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_ENABLE1_NIG_0 0xa0ec +#define MISC_REG_AEU_ENABLE1_NIG_1 0xa18c +/* [RW 32] first 32b for enabling the output for close the gate pxp. mapped + as follows: [0] NIG attention for function0; [1] NIG attention for + function1; [2] GPIO1 function 0; [3] GPIO2 function 0; [4] GPIO3 function + 0; [5] GPIO4 function 0; [6] GPIO1 function 1; [7] GPIO2 function 1; [8] + GPIO3 function 1; [9] GPIO4 function 1; [10] PCIE glue/PXP VPD event + function0; [11] PCIE glue/PXP VPD event function1; [12] PCIE glue/PXP + Expansion ROM event0; [13] PCIE glue/PXP Expansion ROM event1; [14] + SPIO4; [15] SPIO5; [16] MSI/X indication for function 0; [17] MSI/X + indication for function 1; [18] BRB Parity error; [19] BRB Hw interrupt; + [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC Parity error; [23] + SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw interrupt; [26] + TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI Parity error; [29] + TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_ENABLE1_PXP_0 0xa0fc +#define MISC_REG_AEU_ENABLE1_PXP_1 0xa19c +/* [RW 32] second 32b for enabling the output for function 0 output0. mapped + as follows: [0] PBClient Parity error; [1] PBClient Hw interrupt; [2] QM + Parity error; [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw + interrupt; [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity + error; [9] XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw + interrupt; [12] DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] + NIG Parity error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; + [17] Vaux PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw + interrupt; [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM + Parity error; [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI + Hw interrupt; [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM + Parity error; [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw + interrupt; */ +#define MISC_REG_AEU_ENABLE2_FUNC_0_OUT_0 0xa070 +#define MISC_REG_AEU_ENABLE2_FUNC_0_OUT_1 0xa080 +/* [RW 32] second 32b for enabling the output for function 1 output0. mapped + as follows: [0] PBClient Parity error; [1] PBClient Hw interrupt; [2] QM + Parity error; [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw + interrupt; [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity + error; [9] XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw + interrupt; [12] DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] + NIG Parity error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; + [17] Vaux PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw + interrupt; [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM + Parity error; [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI + Hw interrupt; [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM + Parity error; [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw + interrupt; */ +#define MISC_REG_AEU_ENABLE2_FUNC_1_OUT_0 0xa110 +#define MISC_REG_AEU_ENABLE2_FUNC_1_OUT_1 0xa120 +/* [RW 32] second 32b for enabling the output for close the gate nig. mapped + as follows: [0] PBClient Parity error; [1] PBClient Hw interrupt; [2] QM + Parity error; [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw + interrupt; [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity + error; [9] XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw + interrupt; [12] DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] + NIG Parity error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; + [17] Vaux PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw + interrupt; [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM + Parity error; [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI + Hw interrupt; [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM + Parity error; [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw + interrupt; */ +#define MISC_REG_AEU_ENABLE2_NIG_0 0xa0f0 +#define MISC_REG_AEU_ENABLE2_NIG_1 0xa190 +/* [RW 32] second 32b for enabling the output for close the gate pxp. mapped + as follows: [0] PBClient Parity error; [1] PBClient Hw interrupt; [2] QM + Parity error; [3] QM Hw interrupt; [4] Timers Parity error; [5] Timers Hw + interrupt; [6] XSDM Parity error; [7] XSDM Hw interrupt; [8] XCM Parity + error; [9] XCM Hw interrupt; [10] XSEMI Parity error; [11] XSEMI Hw + interrupt; [12] DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] + NIG Parity error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; + [17] Vaux PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw + interrupt; [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM + Parity error; [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI + Hw interrupt; [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM + Parity error; [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw + interrupt; */ +#define MISC_REG_AEU_ENABLE2_PXP_0 0xa100 +#define MISC_REG_AEU_ENABLE2_PXP_1 0xa1a0 +/* [RW 32] third 32b for enabling the output for function 0 output0. mapped + as follows: [0] CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP + Parity error; [3] PXP Hw interrupt; [4] PXPpciClockClient Parity error; + [5] PXPpciClockClient Hw interrupt; [6] CFC Parity error; [7] CFC Hw + interrupt; [8] CDU Parity error; [9] CDU Hw interrupt; [10] DMAE Parity + error; [11] DMAE Hw interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) + Hw interrupt; [14] MISC Parity error; [15] MISC Hw interrupt; [16] + pxp_misc_mps_attn; [17] Flash event; [18] SMB event; [19] MCP attn0; [20] + MCP attn1; [21] SW timers attn_1 func0; [22] SW timers attn_2 func0; [23] + SW timers attn_3 func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW + timers attn_1 func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 + func1; [29] SW timers attn_4 func1; [30] General attn0; [31] General + attn1; */ +#define MISC_REG_AEU_ENABLE3_FUNC_0_OUT_0 0xa074 +#define MISC_REG_AEU_ENABLE3_FUNC_0_OUT_1 0xa084 +/* [RW 32] third 32b for enabling the output for function 1 output0. mapped + as follows: [0] CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP + Parity error; [3] PXP Hw interrupt; [4] PXPpciClockClient Parity error; + [5] PXPpciClockClient Hw interrupt; [6] CFC Parity error; [7] CFC Hw + interrupt; [8] CDU Parity error; [9] CDU Hw interrupt; [10] DMAE Parity + error; [11] DMAE Hw interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) + Hw interrupt; [14] MISC Parity error; [15] MISC Hw interrupt; [16] + pxp_misc_mps_attn; [17] Flash event; [18] SMB event; [19] MCP attn0; [20] + MCP attn1; [21] SW timers attn_1 func0; [22] SW timers attn_2 func0; [23] + SW timers attn_3 func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW + timers attn_1 func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 + func1; [29] SW timers attn_4 func1; [30] General attn0; [31] General + attn1; */ +#define MISC_REG_AEU_ENABLE3_FUNC_1_OUT_0 0xa114 +#define MISC_REG_AEU_ENABLE3_FUNC_1_OUT_1 0xa124 +/* [RW 32] third 32b for enabling the output for close the gate nig. mapped + as follows: [0] CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP + Parity error; [3] PXP Hw interrupt; [4] PXPpciClockClient Parity error; + [5] PXPpciClockClient Hw interrupt; [6] CFC Parity error; [7] CFC Hw + interrupt; [8] CDU Parity error; [9] CDU Hw interrupt; [10] DMAE Parity + error; [11] DMAE Hw interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) + Hw interrupt; [14] MISC Parity error; [15] MISC Hw interrupt; [16] + pxp_misc_mps_attn; [17] Flash event; [18] SMB event; [19] MCP attn0; [20] + MCP attn1; [21] SW timers attn_1 func0; [22] SW timers attn_2 func0; [23] + SW timers attn_3 func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW + timers attn_1 func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 + func1; [29] SW timers attn_4 func1; [30] General attn0; [31] General + attn1; */ +#define MISC_REG_AEU_ENABLE3_NIG_0 0xa0f4 +#define MISC_REG_AEU_ENABLE3_NIG_1 0xa194 +/* [RW 32] third 32b for enabling the output for close the gate pxp. mapped + as follows: [0] CSEMI Parity error; [1] CSEMI Hw interrupt; [2] PXP + Parity error; [3] PXP Hw interrupt; [4] PXPpciClockClient Parity error; + [5] PXPpciClockClient Hw interrupt; [6] CFC Parity error; [7] CFC Hw + interrupt; [8] CDU Parity error; [9] CDU Hw interrupt; [10] DMAE Parity + error; [11] DMAE Hw interrupt; [12] IGU (HC) Parity error; [13] IGU (HC) + Hw interrupt; [14] MISC Parity error; [15] MISC Hw interrupt; [16] + pxp_misc_mps_attn; [17] Flash event; [18] SMB event; [19] MCP attn0; [20] + MCP attn1; [21] SW timers attn_1 func0; [22] SW timers attn_2 func0; [23] + SW timers attn_3 func0; [24] SW timers attn_4 func0; [25] PERST; [26] SW + timers attn_1 func1; [27] SW timers attn_2 func1; [28] SW timers attn_3 + func1; [29] SW timers attn_4 func1; [30] General attn0; [31] General + attn1; */ +#define MISC_REG_AEU_ENABLE3_PXP_0 0xa104 +#define MISC_REG_AEU_ENABLE3_PXP_1 0xa1a4 +/* [RW 32] fourth 32b for enabling the output for function 0 output0.mapped + as follows: [0] General attn2; [1] General attn3; [2] General attn4; [3] + General attn5; [4] General attn6; [5] General attn7; [6] General attn8; + [7] General attn9; [8] General attn10; [9] General attn11; [10] General + attn12; [11] General attn13; [12] General attn14; [13] General attn15; + [14] General attn16; [15] General attn17; [16] General attn18; [17] + General attn19; [18] General attn20; [19] General attn21; [20] Main power + interrupt; [21] RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN + Latched attn; [24] RBCU Latched attn; [25] RBCP Latched attn; [26] GRC + Latched timeout attention; [27] GRC Latched reserved access attention; + [28] MCP Latched rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP + Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_0 0xa078 +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_2 0xa098 +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_4 0xa0b8 +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_5 0xa0c8 +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_6 0xa0d8 +#define MISC_REG_AEU_ENABLE4_FUNC_0_OUT_7 0xa0e8 +/* [RW 32] fourth 32b for enabling the output for function 1 output0.mapped + as follows: [0] General attn2; [1] General attn3; [2] General attn4; [3] + General attn5; [4] General attn6; [5] General attn7; [6] General attn8; + [7] General attn9; [8] General attn10; [9] General attn11; [10] General + attn12; [11] General attn13; [12] General attn14; [13] General attn15; + [14] General attn16; [15] General attn17; [16] General attn18; [17] + General attn19; [18] General attn20; [19] General attn21; [20] Main power + interrupt; [21] RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN + Latched attn; [24] RBCU Latched attn; [25] RBCP Latched attn; [26] GRC + Latched timeout attention; [27] GRC Latched reserved access attention; + [28] MCP Latched rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP + Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_0 0xa118 +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_2 0xa138 +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_4 0xa158 +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_5 0xa168 +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_6 0xa178 +#define MISC_REG_AEU_ENABLE4_FUNC_1_OUT_7 0xa188 +/* [RW 32] fourth 32b for enabling the output for close the gate nig.mapped + as follows: [0] General attn2; [1] General attn3; [2] General attn4; [3] + General attn5; [4] General attn6; [5] General attn7; [6] General attn8; + [7] General attn9; [8] General attn10; [9] General attn11; [10] General + attn12; [11] General attn13; [12] General attn14; [13] General attn15; + [14] General attn16; [15] General attn17; [16] General attn18; [17] + General attn19; [18] General attn20; [19] General attn21; [20] Main power + interrupt; [21] RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN + Latched attn; [24] RBCU Latched attn; [25] RBCP Latched attn; [26] GRC + Latched timeout attention; [27] GRC Latched reserved access attention; + [28] MCP Latched rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP + Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_ENABLE4_NIG_0 0xa0f8 +#define MISC_REG_AEU_ENABLE4_NIG_1 0xa198 +/* [RW 32] fourth 32b for enabling the output for close the gate pxp.mapped + as follows: [0] General attn2; [1] General attn3; [2] General attn4; [3] + General attn5; [4] General attn6; [5] General attn7; [6] General attn8; + [7] General attn9; [8] General attn10; [9] General attn11; [10] General + attn12; [11] General attn13; [12] General attn14; [13] General attn15; + [14] General attn16; [15] General attn17; [16] General attn18; [17] + General attn19; [18] General attn20; [19] General attn21; [20] Main power + interrupt; [21] RBCR Latched attn; [22] RBCT Latched attn; [23] RBCN + Latched attn; [24] RBCU Latched attn; [25] RBCP Latched attn; [26] GRC + Latched timeout attention; [27] GRC Latched reserved access attention; + [28] MCP Latched rom_parity; [29] MCP Latched ump_rx_parity; [30] MCP + Latched ump_tx_parity; [31] MCP Latched scpad_parity; */ +#define MISC_REG_AEU_ENABLE4_PXP_0 0xa108 +#define MISC_REG_AEU_ENABLE4_PXP_1 0xa1a8 +/* [RW 1] set/clr general attention 0; this will set/clr bit 94 in the aeu + 128 bit vector */ +#define MISC_REG_AEU_GENERAL_ATTN_0 0xa000 +#define MISC_REG_AEU_GENERAL_ATTN_1 0xa004 +#define MISC_REG_AEU_GENERAL_ATTN_10 0xa028 +#define MISC_REG_AEU_GENERAL_ATTN_11 0xa02c +#define MISC_REG_AEU_GENERAL_ATTN_12 0xa030 +#define MISC_REG_AEU_GENERAL_ATTN_13 0xa034 +#define MISC_REG_AEU_GENERAL_ATTN_14 0xa038 +#define MISC_REG_AEU_GENERAL_ATTN_15 0xa03c +#define MISC_REG_AEU_GENERAL_ATTN_16 0xa040 +#define MISC_REG_AEU_GENERAL_ATTN_17 0xa044 +#define MISC_REG_AEU_GENERAL_ATTN_18 0xa048 +#define MISC_REG_AEU_GENERAL_ATTN_19 0xa04c +#define MISC_REG_AEU_GENERAL_ATTN_10 0xa028 +#define MISC_REG_AEU_GENERAL_ATTN_11 0xa02c +#define MISC_REG_AEU_GENERAL_ATTN_12 0xa030 +#define MISC_REG_AEU_GENERAL_ATTN_2 0xa008 +#define MISC_REG_AEU_GENERAL_ATTN_20 0xa050 +#define MISC_REG_AEU_GENERAL_ATTN_21 0xa054 +#define MISC_REG_AEU_GENERAL_ATTN_3 0xa00c +#define MISC_REG_AEU_GENERAL_ATTN_4 0xa010 +#define MISC_REG_AEU_GENERAL_ATTN_5 0xa014 +#define MISC_REG_AEU_GENERAL_ATTN_6 0xa018 +#define MISC_REG_AEU_GENERAL_ATTN_7 0xa01c +#define MISC_REG_AEU_GENERAL_ATTN_8 0xa020 +#define MISC_REG_AEU_GENERAL_ATTN_9 0xa024 +#define MISC_REG_AEU_GENERAL_MASK 0xa61c +/* [RW 32] first 32b for inverting the input for function 0; for each bit: + 0= do not invert; 1= invert; mapped as follows: [0] NIG attention for + function0; [1] NIG attention for function1; [2] GPIO1 mcp; [3] GPIO2 mcp; + [4] GPIO3 mcp; [5] GPIO4 mcp; [6] GPIO1 function 1; [7] GPIO2 function 1; + [8] GPIO3 function 1; [9] GPIO4 function 1; [10] PCIE glue/PXP VPD event + function0; [11] PCIE glue/PXP VPD event function1; [12] PCIE glue/PXP + Expansion ROM event0; [13] PCIE glue/PXP Expansion ROM event1; [14] + SPIO4; [15] SPIO5; [16] MSI/X indication for mcp; [17] MSI/X indication + for function 1; [18] BRB Parity error; [19] BRB Hw interrupt; [20] PRS + Parity error; [21] PRS Hw interrupt; [22] SRC Parity error; [23] SRC Hw + interrupt; [24] TSDM Parity error; [25] TSDM Hw interrupt; [26] TCM + Parity error; [27] TCM Hw interrupt; [28] TSEMI Parity error; [29] TSEMI + Hw interrupt; [30] PBF Parity error; [31] PBF Hw interrupt; */ +#define MISC_REG_AEU_INVERTER_1_FUNC_0 0xa22c +#define MISC_REG_AEU_INVERTER_1_FUNC_1 0xa23c +/* [RW 32] second 32b for inverting the input for function 0; for each bit: + 0= do not invert; 1= invert. mapped as follows: [0] PBClient Parity + error; [1] PBClient Hw interrupt; [2] QM Parity error; [3] QM Hw + interrupt; [4] Timers Parity error; [5] Timers Hw interrupt; [6] XSDM + Parity error; [7] XSDM Hw interrupt; [8] XCM Parity error; [9] XCM Hw + interrupt; [10] XSEMI Parity error; [11] XSEMI Hw interrupt; [12] + DoorbellQ Parity error; [13] DoorbellQ Hw interrupt; [14] NIG Parity + error; [15] NIG Hw interrupt; [16] Vaux PCI core Parity error; [17] Vaux + PCI core Hw interrupt; [18] Debug Parity error; [19] Debug Hw interrupt; + [20] USDM Parity error; [21] USDM Hw interrupt; [22] UCM Parity error; + [23] UCM Hw interrupt; [24] USEMI Parity error; [25] USEMI Hw interrupt; + [26] UPB Parity error; [27] UPB Hw interrupt; [28] CSDM Parity error; + [29] CSDM Hw interrupt; [30] CCM Parity error; [31] CCM Hw interrupt; */ +#define MISC_REG_AEU_INVERTER_2_FUNC_0 0xa230 +#define MISC_REG_AEU_INVERTER_2_FUNC_1 0xa240 +/* [RW 10] [7:0] = mask 8 attention output signals toward IGU function0; + [9:8] = raserved. Zero = mask; one = unmask */ +#define MISC_REG_AEU_MASK_ATTN_FUNC_0 0xa060 +#define MISC_REG_AEU_MASK_ATTN_FUNC_1 0xa064 +/* [RW 1] If set a system kill occurred */ +#define MISC_REG_AEU_SYS_KILL_OCCURRED 0xa610 +/* [RW 32] Represent the status of the input vector to the AEU when a system + kill occurred. The register is reset in por reset. Mapped as follows: [0] + NIG attention for function0; [1] NIG attention for function1; [2] GPIO1 + mcp; [3] GPIO2 mcp; [4] GPIO3 mcp; [5] GPIO4 mcp; [6] GPIO1 function 1; + [7] GPIO2 function 1; [8] GPIO3 function 1; [9] GPIO4 function 1; [10] + PCIE glue/PXP VPD event function0; [11] PCIE glue/PXP VPD event + function1; [12] PCIE glue/PXP Expansion ROM event0; [13] PCIE glue/PXP + Expansion ROM event1; [14] SPIO4; [15] SPIO5; [16] MSI/X indication for + mcp; [17] MSI/X indication for function 1; [18] BRB Parity error; [19] + BRB Hw interrupt; [20] PRS Parity error; [21] PRS Hw interrupt; [22] SRC + Parity error; [23] SRC Hw interrupt; [24] TSDM Parity error; [25] TSDM Hw + interrupt; [26] TCM Parity error; [27] TCM Hw interrupt; [28] TSEMI + Parity error; [29] TSEMI Hw interrupt; [30] PBF Parity error; [31] PBF Hw + interrupt; */ +#define MISC_REG_AEU_SYS_KILL_STATUS_0 0xa600 +#define MISC_REG_AEU_SYS_KILL_STATUS_1 0xa604 +#define MISC_REG_AEU_SYS_KILL_STATUS_2 0xa608 +#define MISC_REG_AEU_SYS_KILL_STATUS_3 0xa60c +/* [R 4] This field indicates the type of the device. '0' - 2 Ports; '1' - 1 + Port. */ +#define MISC_REG_BOND_ID 0xa400 +/* [R 8] These bits indicate the metal revision of the chip. This value + starts at 0x00 for each all-layer tape-out and increments by one for each + tape-out. */ +#define MISC_REG_CHIP_METAL 0xa404 +/* [R 16] These bits indicate the part number for the chip. */ +#define MISC_REG_CHIP_NUM 0xa408 +/* [R 4] These bits indicate the base revision of the chip. This value + starts at 0x0 for the A0 tape-out and increments by one for each + all-layer tape-out. */ +#define MISC_REG_CHIP_REV 0xa40c +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_10 0xa3e0 +#define MISC_REG_DRIVER_CONTROL_10_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_11 0xa3e8 +#define MISC_REG_DRIVER_CONTROL_11_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_12 0xa3f0 +#define MISC_REG_DRIVER_CONTROL_12_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_13 0xa3f8 +#define MISC_REG_DRIVER_CONTROL_13_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_1 0xa510 +#define MISC_REG_DRIVER_CONTROL_14 0xa5e0 +#define MISC_REG_DRIVER_CONTROL_14_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_15 0xa5e8 +#define MISC_REG_DRIVER_CONTROL_15_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_16 0xa5f0 +#define MISC_REG_DRIVER_CONTROL_16_SIZE 2 +/* [RW 32] The following driver registers(1...16) represent 16 drivers and + 32 clients. Each client can be controlled by one driver only. One in each + bit represent that this driver control the appropriate client (Ex: bit 5 + is set means this driver control client number 5). addr1 = set; addr0 = + clear; read from both addresses will give the same result = status. write + to address 1 will set a request to control all the clients that their + appropriate bit (in the write command) is set. if the client is free (the + appropriate bit in all the other drivers is clear) one will be written to + that driver register; if the client isn't free the bit will remain zero. + if the appropriate bit is set (the driver request to gain control on a + client it already controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW + interrupt will be asserted). write to address 0 will set a request to + free all the clients that their appropriate bit (in the write command) is + set. if the appropriate bit is clear (the driver request to free a client + it doesn't controls the ~MISC_REGISTERS_INT_STS.GENERIC_SW interrupt will + be asserted). */ +#define MISC_REG_DRIVER_CONTROL_7 0xa3c8 +/* [RW 1] e1hmf for WOL. If clr WOL signal o the PXP will be send on bit 0 + only. */ +#define MISC_REG_E1HMF_MODE 0xa5f8 +/* [RW 32] Debug only: spare RW register reset by core reset */ +#define MISC_REG_GENERIC_CR_0 0xa460 +/* [RW 32] GPIO. [31-28] FLOAT port 0; [27-24] FLOAT port 0; When any of + these bits is written as a '1'; the corresponding SPIO bit will turn off + it's drivers and become an input. This is the reset state of all GPIO + pins. The read value of these bits will be a '1' if that last command + (#SET; #CLR; or #FLOAT) for this bit was a #FLOAT. (reset value 0xff). + [23-20] CLR port 1; 19-16] CLR port 0; When any of these bits is written + as a '1'; the corresponding GPIO bit will drive low. The read value of + these bits will be a '1' if that last command (#SET; #CLR; or #FLOAT) for + this bit was a #CLR. (reset value 0). [15-12] SET port 1; 11-8] port 0; + SET When any of these bits is written as a '1'; the corresponding GPIO + bit will drive high (if it has that capability). The read value of these + bits will be a '1' if that last command (#SET; #CLR; or #FLOAT) for this + bit was a #SET. (reset value 0). [7-4] VALUE port 1; [3-0] VALUE port 0; + RO; These bits indicate the read value of each of the eight GPIO pins. + This is the result value of the pin; not the drive value. Writing these + bits will have not effect. */ +#define MISC_REG_GPIO 0xa490 +/* [RW 8] These bits enable the GPIO_INTs to signals event to the + IGU/MCP.according to the following map: [0] p0_gpio_0; [1] p0_gpio_1; [2] + p0_gpio_2; [3] p0_gpio_3; [4] p1_gpio_0; [5] p1_gpio_1; [6] p1_gpio_2; + [7] p1_gpio_3; */ +#define MISC_REG_GPIO_EVENT_EN 0xa2bc +/* [RW 32] GPIO INT. [31-28] OLD_CLR port1; [27-24] OLD_CLR port0; Writing a + '1' to these bit clears the corresponding bit in the #OLD_VALUE register. + This will acknowledge an interrupt on the falling edge of corresponding + GPIO input (reset value 0). [23-16] OLD_SET [23-16] port1; OLD_SET port0; + Writing a '1' to these bit sets the corresponding bit in the #OLD_VALUE + register. This will acknowledge an interrupt on the rising edge of + corresponding SPIO input (reset value 0). [15-12] OLD_VALUE [11-8] port1; + OLD_VALUE port0; RO; These bits indicate the old value of the GPIO input + value. When the ~INT_STATE bit is set; this bit indicates the OLD value + of the pin such that if ~INT_STATE is set and this bit is '0'; then the + interrupt is due to a low to high edge. If ~INT_STATE is set and this bit + is '1'; then the interrupt is due to a high to low edge (reset value 0). + [7-4] INT_STATE port1; [3-0] INT_STATE RO port0; These bits indicate the + current GPIO interrupt state for each GPIO pin. This bit is cleared when + the appropriate #OLD_SET or #OLD_CLR command bit is written. This bit is + set when the GPIO input does not match the current value in #OLD_VALUE + (reset value 0). */ +#define MISC_REG_GPIO_INT 0xa494 +/* [R 28] this field hold the last information that caused reserved + attention. bits [19:0] - address; [22:20] function; [23] reserved; + [27:24] the master that caused the attention - according to the following + encodeing:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = + dbu; 8 = dmae */ +#define MISC_REG_GRC_RSV_ATTN 0xa3c0 +/* [R 28] this field hold the last information that caused timeout + attention. bits [19:0] - address; [22:20] function; [23] reserved; + [27:24] the master that caused the attention - according to the following + encodeing:1 = pxp; 2 = mcp; 3 = usdm; 4 = tsdm; 5 = xsdm; 6 = csdm; 7 = + dbu; 8 = dmae */ +#define MISC_REG_GRC_TIMEOUT_ATTN 0xa3c4 +/* [RW 1] Setting this bit enables a timer in the GRC block to timeout any + access that does not finish within + ~misc_registers_grc_timout_val.grc_timeout_val cycles. When this bit is + cleared; this timeout is disabled. If this timeout occurs; the GRC shall + assert it attention output. */ +#define MISC_REG_GRC_TIMEOUT_EN 0xa280 +/* [RW 28] 28 LSB of LCPLL first register; reset val = 521. inside order of + the bits is: [2:0] OAC reset value 001) CML output buffer bias control; + 111 for +40%; 011 for +20%; 001 for 0%; 000 for -20%. [5:3] Icp_ctrl + (reset value 001) Charge pump current control; 111 for 720u; 011 for + 600u; 001 for 480u and 000 for 360u. [7:6] Bias_ctrl (reset value 00) + Global bias control; When bit 7 is high bias current will be 10 0gh; When + bit 6 is high bias will be 100w; Valid values are 00; 10; 01. [10:8] + Pll_observe (reset value 010) Bits to control observability. bit 10 is + for test bias; bit 9 is for test CK; bit 8 is test Vc. [12:11] Vth_ctrl + (reset value 00) Comparator threshold control. 00 for 0.6V; 01 for 0.54V + and 10 for 0.66V. [13] pllSeqStart (reset value 0) Enables VCO tuning + sequencer: 1= sequencer disabled; 0= sequencer enabled (inverted + internally). [14] reserved (reset value 0) Reset for VCO sequencer is + connected to RESET input directly. [15] capRetry_en (reset value 0) + enable retry on cap search failure (inverted). [16] freqMonitor_e (reset + value 0) bit to continuously monitor vco freq (inverted). [17] + freqDetRestart_en (reset value 0) bit to enable restart when not freq + locked (inverted). [18] freqDetRetry_en (reset value 0) bit to enable + retry on freq det failure(inverted). [19] pllForceFdone_en (reset value + 0) bit to enable pllForceFdone & pllForceFpass into pllSeq. [20] + pllForceFdone (reset value 0) bit to force freqDone. [21] pllForceFpass + (reset value 0) bit to force freqPass. [22] pllForceDone_en (reset value + 0) bit to enable pllForceCapDone. [23] pllForceCapDone (reset value 0) + bit to force capDone. [24] pllForceCapPass_en (reset value 0) bit to + enable pllForceCapPass. [25] pllForceCapPass (reset value 0) bit to force + capPass. [26] capRestart (reset value 0) bit to force cap sequencer to + restart. [27] capSelectM_en (reset value 0) bit to enable cap select + register bits. */ +#define MISC_REG_LCPLL_CTRL_1 0xa2a4 +#define MISC_REG_LCPLL_CTRL_REG_2 0xa2a8 +/* [RW 4] Interrupt mask register #0 read/write */ +#define MISC_REG_MISC_INT_MASK 0xa388 +/* [RW 1] Parity mask register #0 read/write */ +#define MISC_REG_MISC_PRTY_MASK 0xa398 +/* [R 1] Parity register #0 read */ +#define MISC_REG_MISC_PRTY_STS 0xa38c +#define MISC_REG_NIG_WOL_P0 0xa270 +#define MISC_REG_NIG_WOL_P1 0xa274 +/* [R 1] If set indicate that the pcie_rst_b was asserted without perst + assertion */ +#define MISC_REG_PCIE_HOT_RESET 0xa618 +/* [RW 32] 32 LSB of storm PLL first register; reset val = 0x 071d2911. + inside order of the bits is: [0] P1 divider[0] (reset value 1); [1] P1 + divider[1] (reset value 0); [2] P1 divider[2] (reset value 0); [3] P1 + divider[3] (reset value 0); [4] P2 divider[0] (reset value 1); [5] P2 + divider[1] (reset value 0); [6] P2 divider[2] (reset value 0); [7] P2 + divider[3] (reset value 0); [8] ph_det_dis (reset value 1); [9] + freq_det_dis (reset value 0); [10] Icpx[0] (reset value 0); [11] Icpx[1] + (reset value 1); [12] Icpx[2] (reset value 0); [13] Icpx[3] (reset value + 1); [14] Icpx[4] (reset value 0); [15] Icpx[5] (reset value 0); [16] + Rx[0] (reset value 1); [17] Rx[1] (reset value 0); [18] vc_en (reset + value 1); [19] vco_rng[0] (reset value 1); [20] vco_rng[1] (reset value + 1); [21] Kvco_xf[0] (reset value 0); [22] Kvco_xf[1] (reset value 0); + [23] Kvco_xf[2] (reset value 0); [24] Kvco_xs[0] (reset value 1); [25] + Kvco_xs[1] (reset value 1); [26] Kvco_xs[2] (reset value 1); [27] + testd_en (reset value 0); [28] testd_sel[0] (reset value 0); [29] + testd_sel[1] (reset value 0); [30] testd_sel[2] (reset value 0); [31] + testa_en (reset value 0); */ +#define MISC_REG_PLL_STORM_CTRL_1 0xa294 +#define MISC_REG_PLL_STORM_CTRL_2 0xa298 +#define MISC_REG_PLL_STORM_CTRL_3 0xa29c +#define MISC_REG_PLL_STORM_CTRL_4 0xa2a0 +/* [RW 32] reset reg#2; rite/read one = the specific block is out of reset; + write/read zero = the specific block is in reset; addr 0-wr- the write + value will be written to the register; addr 1-set - one will be written + to all the bits that have the value of one in the data written (bits that + have the value of zero will not be change) ; addr 2-clear - zero will be + written to all the bits that have the value of one in the data written + (bits that have the value of zero will not be change); addr 3-ignore; + read ignore from all addr except addr 00; inside order of the bits is: + [0] rst_bmac0; [1] rst_bmac1; [2] rst_emac0; [3] rst_emac1; [4] rst_grc; + [5] rst_mcp_n_reset_reg_hard_core; [6] rst_ mcp_n_hard_core_rst_b; [7] + rst_ mcp_n_reset_cmn_cpu; [8] rst_ mcp_n_reset_cmn_core; [9] rst_rbcn; + [10] rst_dbg; [11] rst_misc_core; [12] rst_dbue (UART); [13] + Pci_resetmdio_n; [14] rst_emac0_hard_core; [15] rst_emac1_hard_core; 16] + rst_pxp_rq_rd_wr; 31:17] reserved */ +#define MISC_REG_RESET_REG_2 0xa590 +/* [RW 20] 20 bit GRC address where the scratch-pad of the MCP that is + shared with the driver resides */ +#define MISC_REG_SHARED_MEM_ADDR 0xa2b4 +/* [RW 32] SPIO. [31-24] FLOAT When any of these bits is written as a '1'; + the corresponding SPIO bit will turn off it's drivers and become an + input. This is the reset state of all SPIO pins. The read value of these + bits will be a '1' if that last command (#SET; #CL; or #FLOAT) for this + bit was a #FLOAT. (reset value 0xff). [23-16] CLR When any of these bits + is written as a '1'; the corresponding SPIO bit will drive low. The read + value of these bits will be a '1' if that last command (#SET; #CLR; or +#FLOAT) for this bit was a #CLR. (reset value 0). [15-8] SET When any of + these bits is written as a '1'; the corresponding SPIO bit will drive + high (if it has that capability). The read value of these bits will be a + '1' if that last command (#SET; #CLR; or #FLOAT) for this bit was a #SET. + (reset value 0). [7-0] VALUE RO; These bits indicate the read value of + each of the eight SPIO pins. This is the result value of the pin; not the + drive value. Writing these bits will have not effect. Each 8 bits field + is divided as follows: [0] VAUX Enable; when pulsed low; enables supply + from VAUX. (This is an output pin only; the FLOAT field is not applicable + for this pin); [1] VAUX Disable; when pulsed low; disables supply form + VAUX. (This is an output pin only; FLOAT field is not applicable for this + pin); [2] SEL_VAUX_B - Control to power switching logic. Drive low to + select VAUX supply. (This is an output pin only; it is not controlled by + the SET and CLR fields; it is controlled by the Main Power SM; the FLOAT + field is not applicable for this pin; only the VALUE fields is relevant - + it reflects the output value); [3] port swap [4] spio_4; [5] spio_5; [6] + Bit 0 of UMP device ID select; read by UMP firmware; [7] Bit 1 of UMP + device ID select; read by UMP firmware. */ +#define MISC_REG_SPIO 0xa4fc +/* [RW 8] These bits enable the SPIO_INTs to signals event to the IGU/MC. + according to the following map: [3:0] reserved; [4] spio_4 [5] spio_5; + [7:0] reserved */ +#define MISC_REG_SPIO_EVENT_EN 0xa2b8 +/* [RW 32] SPIO INT. [31-24] OLD_CLR Writing a '1' to these bit clears the + corresponding bit in the #OLD_VALUE register. This will acknowledge an + interrupt on the falling edge of corresponding SPIO input (reset value + 0). [23-16] OLD_SET Writing a '1' to these bit sets the corresponding bit + in the #OLD_VALUE register. This will acknowledge an interrupt on the + rising edge of corresponding SPIO input (reset value 0). [15-8] OLD_VALUE + RO; These bits indicate the old value of the SPIO input value. When the + ~INT_STATE bit is set; this bit indicates the OLD value of the pin such + that if ~INT_STATE is set and this bit is '0'; then the interrupt is due + to a low to high edge. If ~INT_STATE is set and this bit is '1'; then the + interrupt is due to a high to low edge (reset value 0). [7-0] INT_STATE + RO; These bits indicate the current SPIO interrupt state for each SPIO + pin. This bit is cleared when the appropriate #OLD_SET or #OLD_CLR + command bit is written. This bit is set when the SPIO input does not + match the current value in #OLD_VALUE (reset value 0). */ +#define MISC_REG_SPIO_INT 0xa500 +/* [RW 32] reload value for counter 4 if reload; the value will be reload if + the counter reached zero and the reload bit + (~misc_registers_sw_timer_cfg_4.sw_timer_cfg_4[1] ) is set */ +#define MISC_REG_SW_TIMER_RELOAD_VAL_4 0xa2fc +/* [RW 32] the value of the counter for sw timers1-8. there are 8 addresses + in this register. addres 0 - timer 1; address - timer 2�address 7 - + timer 8 */ +#define MISC_REG_SW_TIMER_VAL 0xa5c0 +/* [RW 1] Set by the MCP to remember if one or more of the drivers is/are + loaded; 0-prepare; -unprepare */ +#define MISC_REG_UNPREPARED 0xa424 +#define NIG_MASK_INTERRUPT_PORT0_REG_MASK_EMAC0_MISC_MI_INT (0x1<<0) +#define NIG_MASK_INTERRUPT_PORT0_REG_MASK_SERDES0_LINK_STATUS (0x1<<9) +#define NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK10G (0x1<<15) +#define NIG_MASK_INTERRUPT_PORT0_REG_MASK_XGXS0_LINK_STATUS (0xf<<18) +/* [RW 1] Input enable for RX_BMAC0 IF */ +#define NIG_REG_BMAC0_IN_EN 0x100ac +/* [RW 1] output enable for TX_BMAC0 IF */ +#define NIG_REG_BMAC0_OUT_EN 0x100e0 +/* [RW 1] output enable for TX BMAC pause port 0 IF */ +#define NIG_REG_BMAC0_PAUSE_OUT_EN 0x10110 +/* [RW 1] output enable for RX_BMAC0_REGS IF */ +#define NIG_REG_BMAC0_REGS_OUT_EN 0x100e8 +/* [RW 1] output enable for RX BRB1 port0 IF */ +#define NIG_REG_BRB0_OUT_EN 0x100f8 +/* [RW 1] Input enable for TX BRB1 pause port 0 IF */ +#define NIG_REG_BRB0_PAUSE_IN_EN 0x100c4 +/* [RW 1] output enable for RX BRB1 port1 IF */ +#define NIG_REG_BRB1_OUT_EN 0x100fc +/* [RW 1] Input enable for TX BRB1 pause port 1 IF */ +#define NIG_REG_BRB1_PAUSE_IN_EN 0x100c8 +/* [RW 1] output enable for RX BRB1 LP IF */ +#define NIG_REG_BRB_LB_OUT_EN 0x10100 +/* [WB_W 82] Debug packet to LP from RBC; Data spelling:[63:0] data; 64] + error; [67:65]eop_bvalid; [68]eop; [69]sop; [70]port_id; 71]flush; + 72:73]-vnic_num; 81:74]-sideband_info */ +#define NIG_REG_DEBUG_PACKET_LB 0x10800 +/* [RW 1] Input enable for TX Debug packet */ +#define NIG_REG_EGRESS_DEBUG_IN_EN 0x100dc +/* [RW 1] If 1 - egress drain mode for port0 is active. In this mode all + packets from PBFare not forwarded to the MAC and just deleted from FIFO. + First packet may be deleted from the middle. And last packet will be + always deleted till the end. */ +#define NIG_REG_EGRESS_DRAIN0_MODE 0x10060 +/* [RW 1] Output enable to EMAC0 */ +#define NIG_REG_EGRESS_EMAC0_OUT_EN 0x10120 +/* [RW 1] MAC configuration for packets of port0. If 1 - all packet outputs + to emac for port0; other way to bmac for port0 */ +#define NIG_REG_EGRESS_EMAC0_PORT 0x10058 +/* [RW 32] TX_MNG_FIFO in NIG_TX_PORT0; data[31:0] written in FIFO order. */ +#define NIG_REG_EGRESS_MNG0_FIFO 0x1045c +/* [RW 1] Input enable for TX PBF user packet port0 IF */ +#define NIG_REG_EGRESS_PBF0_IN_EN 0x100cc +/* [RW 1] Input enable for TX PBF user packet port1 IF */ +#define NIG_REG_EGRESS_PBF1_IN_EN 0x100d0 +/* [RW 1] Input enable for TX UMP management packet port0 IF */ +#define NIG_REG_EGRESS_UMP0_IN_EN 0x100d4 +/* [RW 1] Input enable for RX_EMAC0 IF */ +#define NIG_REG_EMAC0_IN_EN 0x100a4 +/* [RW 1] output enable for TX EMAC pause port 0 IF */ +#define NIG_REG_EMAC0_PAUSE_OUT_EN 0x10118 +/* [R 1] status from emac0. This bit is set when MDINT from either the + EXT_MDINT pin or from the Copper PHY is driven low. This condition must + be cleared in the attached PHY device that is driving the MINT pin. */ +#define NIG_REG_EMAC0_STATUS_MISC_MI_INT 0x10494 +/* [WB 48] This address space contains BMAC0 registers. The BMAC registers + are described in appendix A. In order to access the BMAC0 registers; the + base address; NIG_REGISTERS_INGRESS_BMAC0_MEM; Offset: 0x10c00; should be + added to each BMAC register offset */ +#define NIG_REG_INGRESS_BMAC0_MEM 0x10c00 +/* [WB 48] This address space contains BMAC1 registers. The BMAC registers + are described in appendix A. In order to access the BMAC0 registers; the + base address; NIG_REGISTERS_INGRESS_BMAC1_MEM; Offset: 0x11000; should be + added to each BMAC register offset */ +#define NIG_REG_INGRESS_BMAC1_MEM 0x11000 +/* [R 1] FIFO empty in EOP descriptor FIFO of LP in NIG_RX_EOP */ +#define NIG_REG_INGRESS_EOP_LB_EMPTY 0x104e0 +/* [RW 17] Debug only. RX_EOP_DSCR_lb_FIFO in NIG_RX_EOP. Data + packet_length[13:0]; mac_error[14]; trunc_error[15]; parity[16] */ +#define NIG_REG_INGRESS_EOP_LB_FIFO 0x104e4 +/* [RW 1] led 10g for port 0 */ +#define NIG_REG_LED_10G_P0 0x10320 +/* [RW 1] led 10g for port 1 */ +#define NIG_REG_LED_10G_P1 0x10324 +/* [RW 1] Port0: This bit is set to enable the use of the + ~nig_registers_led_control_blink_rate_p0.led_control_blink_rate_p0 field + defined below. If this bit is cleared; then the blink rate will be about + 8Hz. */ +#define NIG_REG_LED_CONTROL_BLINK_RATE_ENA_P0 0x10318 +/* [RW 12] Port0: Specifies the period of each blink cycle (on + off) for + Traffic LED in milliseconds. Must be a non-zero value. This 12-bit field + is reset to 0x080; giving a default blink period of approximately 8Hz. */ +#define NIG_REG_LED_CONTROL_BLINK_RATE_P0 0x10310 +/* [RW 1] Port0: If set along with the + ~nig_registers_led_control_override_traffic_p0.led_control_override_traffic_p0 + bit and ~nig_registers_led_control_traffic_p0.led_control_traffic_p0 LED + bit; the Traffic LED will blink with the blink rate specified in + ~nig_registers_led_control_blink_rate_p0.led_control_blink_rate_p0 and + ~nig_registers_led_control_blink_rate_ena_p0.led_control_blink_rate_ena_p0 + fields. */ +#define NIG_REG_LED_CONTROL_BLINK_TRAFFIC_P0 0x10308 +/* [RW 1] Port0: If set overrides hardware control of the Traffic LED. The + Traffic LED will then be controlled via bit ~nig_registers_ + led_control_traffic_p0.led_control_traffic_p0 and bit + ~nig_registers_led_control_blink_traffic_p0.led_control_blink_traffic_p0 */ +#define NIG_REG_LED_CONTROL_OVERRIDE_TRAFFIC_P0 0x102f8 +/* [RW 1] Port0: If set along with the led_control_override_trafic_p0 bit; + turns on the Traffic LED. If the led_control_blink_traffic_p0 bit is also + set; the LED will blink with blink rate specified in + ~nig_registers_led_control_blink_rate_p0.led_control_blink_rate_p0 and + ~nig_regsters_led_control_blink_rate_ena_p0.led_control_blink_rate_ena_p0 + fields. */ +#define NIG_REG_LED_CONTROL_TRAFFIC_P0 0x10300 +/* [RW 4] led mode for port0: 0 MAC; 1-3 PHY1; 4 MAC2; 5-7 PHY4; 8-MAC3; + 9-11PHY7; 12 MAC4; 13-15 PHY10; */ +#define NIG_REG_LED_MODE_P0 0x102f0 +/* [RW 3] for port0 enable for llfc ppp and pause. b0 - brb1 enable; b1- + tsdm enable; b2- usdm enable */ +#define NIG_REG_LLFC_EGRESS_SRC_ENABLE_0 0x16070 +/* [RW 1] SAFC enable for port0. This register may get 1 only when + ~ppp_enable.ppp_enable = 0 and pause_enable.pause_enable =0 for the same + port */ +#define NIG_REG_LLFC_ENABLE_0 0x16208 +/* [RW 16] classes are high-priority for port0 */ +#define NIG_REG_LLFC_HIGH_PRIORITY_CLASSES_0 0x16058 +/* [RW 16] classes are low-priority for port0 */ +#define NIG_REG_LLFC_LOW_PRIORITY_CLASSES_0 0x16060 +/* [RW 1] Output enable of message to LLFC BMAC IF for port0 */ +#define NIG_REG_LLFC_OUT_EN_0 0x160c8 +#define NIG_REG_LLH0_ACPI_PAT_0_CRC 0x1015c +#define NIG_REG_LLH0_ACPI_PAT_6_LEN 0x10154 +#define NIG_REG_LLH0_BRB1_DRV_MASK 0x10244 +#define NIG_REG_LLH0_BRB1_DRV_MASK_MF 0x16048 +/* [RW 1] send to BRB1 if no match on any of RMP rules. */ +#define NIG_REG_LLH0_BRB1_NOT_MCP 0x1025c +/* [RW 2] Determine the classification participants. 0: no classification.1: + classification upon VLAN id. 2: classification upon MAC address. 3: + classification upon both VLAN id & MAC addr. */ +#define NIG_REG_LLH0_CLS_TYPE 0x16080 +/* [RW 32] cm header for llh0 */ +#define NIG_REG_LLH0_CM_HEADER 0x1007c +#define NIG_REG_LLH0_DEST_IP_0_1 0x101dc +#define NIG_REG_LLH0_DEST_MAC_0_0 0x101c0 +/* [RW 16] destination TCP address 1. The LLH will look for this address in + all incoming packets. */ +#define NIG_REG_LLH0_DEST_TCP_0 0x10220 +/* [RW 16] destination UDP address 1 The LLH will look for this address in + all incoming packets. */ +#define NIG_REG_LLH0_DEST_UDP_0 0x10214 +#define NIG_REG_LLH0_ERROR_MASK 0x1008c +/* [RW 8] event id for llh0 */ +#define NIG_REG_LLH0_EVENT_ID 0x10084 +#define NIG_REG_LLH0_FUNC_EN 0x160fc +#define NIG_REG_LLH0_FUNC_VLAN_ID 0x16100 +/* [RW 1] Determine the IP version to look for in + ~nig_registers_llh0_dest_ip_0.llh0_dest_ip_0. 0 - IPv6; 1-IPv4 */ +#define NIG_REG_LLH0_IPV4_IPV6_0 0x10208 +/* [RW 1] t bit for llh0 */ +#define NIG_REG_LLH0_T_BIT 0x10074 +/* [RW 12] VLAN ID 1. In case of VLAN packet the LLH will look for this ID. */ +#define NIG_REG_LLH0_VLAN_ID_0 0x1022c +/* [RW 8] init credit counter for port0 in LLH */ +#define NIG_REG_LLH0_XCM_INIT_CREDIT 0x10554 +#define NIG_REG_LLH0_XCM_MASK 0x10130 +#define NIG_REG_LLH1_BRB1_DRV_MASK 0x10248 +/* [RW 1] send to BRB1 if no match on any of RMP rules. */ +#define NIG_REG_LLH1_BRB1_NOT_MCP 0x102dc +/* [RW 2] Determine the classification participants. 0: no classification.1: + classification upon VLAN id. 2: classification upon MAC address. 3: + classification upon both VLAN id & MAC addr. */ +#define NIG_REG_LLH1_CLS_TYPE 0x16084 +/* [RW 32] cm header for llh1 */ +#define NIG_REG_LLH1_CM_HEADER 0x10080 +#define NIG_REG_LLH1_ERROR_MASK 0x10090 +/* [RW 8] event id for llh1 */ +#define NIG_REG_LLH1_EVENT_ID 0x10088 +/* [RW 8] init credit counter for port1 in LLH */ +#define NIG_REG_LLH1_XCM_INIT_CREDIT 0x10564 +#define NIG_REG_LLH1_XCM_MASK 0x10134 +/* [RW 1] When this bit is set; the LLH will expect all packets to be with + e1hov */ +#define NIG_REG_LLH_E1HOV_MODE 0x160d8 +/* [RW 1] When this bit is set; the LLH will classify the packet before + sending it to the BRB or calculating WoL on it. */ +#define NIG_REG_LLH_MF_MODE 0x16024 +#define NIG_REG_MASK_INTERRUPT_PORT0 0x10330 +#define NIG_REG_MASK_INTERRUPT_PORT1 0x10334 +/* [RW 1] Output signal from NIG to EMAC0. When set enables the EMAC0 block. */ +#define NIG_REG_NIG_EMAC0_EN 0x1003c +/* [RW 1] Output signal from NIG to EMAC1. When set enables the EMAC1 block. */ +#define NIG_REG_NIG_EMAC1_EN 0x10040 +/* [RW 1] Output signal from NIG to TX_EMAC0. When set indicates to the + EMAC0 to strip the CRC from the ingress packets. */ +#define NIG_REG_NIG_INGRESS_EMAC0_NO_CRC 0x10044 +/* [R 32] Interrupt register #0 read */ +#define NIG_REG_NIG_INT_STS_0 0x103b0 +#define NIG_REG_NIG_INT_STS_1 0x103c0 +/* [R 32] Parity register #0 read */ +#define NIG_REG_NIG_PRTY_STS 0x103d0 +/* [RW 1] Pause enable for port0. This register may get 1 only when + ~safc_enable.safc_enable = 0 and ppp_enable.ppp_enable =0 for the same + port */ +#define NIG_REG_PAUSE_ENABLE_0 0x160c0 +/* [RW 1] Input enable for RX PBF LP IF */ +#define NIG_REG_PBF_LB_IN_EN 0x100b4 +/* [RW 1] Value of this register will be transmitted to port swap when + ~nig_registers_strap_override.strap_override =1 */ +#define NIG_REG_PORT_SWAP 0x10394 +/* [RW 1] output enable for RX parser descriptor IF */ +#define NIG_REG_PRS_EOP_OUT_EN 0x10104 +/* [RW 1] Input enable for RX parser request IF */ +#define NIG_REG_PRS_REQ_IN_EN 0x100b8 +/* [RW 5] control to serdes - CL45 DEVAD */ +#define NIG_REG_SERDES0_CTRL_MD_DEVAD 0x10370 +/* [RW 1] control to serdes; 0 - clause 45; 1 - clause 22 */ +#define NIG_REG_SERDES0_CTRL_MD_ST 0x1036c +/* [RW 5] control to serdes - CL22 PHY_ADD and CL45 PRTAD */ +#define NIG_REG_SERDES0_CTRL_PHY_ADDR 0x10374 +/* [R 1] status from serdes0 that inputs to interrupt logic of link status */ +#define NIG_REG_SERDES0_STATUS_LINK_STATUS 0x10578 +/* [R 32] Rx statistics : In user packets discarded due to BRB backpressure + for port0 */ +#define NIG_REG_STAT0_BRB_DISCARD 0x105f0 +/* [R 32] Rx statistics : In user packets truncated due to BRB backpressure + for port0 */ +#define NIG_REG_STAT0_BRB_TRUNCATE 0x105f8 +/* [WB_R 36] Tx statistics : Number of packets from emac0 or bmac0 that + between 1024 and 1522 bytes for port0 */ +#define NIG_REG_STAT0_EGRESS_MAC_PKT0 0x10750 +/* [WB_R 36] Tx statistics : Number of packets from emac0 or bmac0 that + between 1523 bytes and above for port0 */ +#define NIG_REG_STAT0_EGRESS_MAC_PKT1 0x10760 +/* [R 32] Rx statistics : In user packets discarded due to BRB backpressure + for port1 */ +#define NIG_REG_STAT1_BRB_DISCARD 0x10628 +/* [WB_R 36] Tx statistics : Number of packets from emac1 or bmac1 that + between 1024 and 1522 bytes for port1 */ +#define NIG_REG_STAT1_EGRESS_MAC_PKT0 0x107a0 +/* [WB_R 36] Tx statistics : Number of packets from emac1 or bmac1 that + between 1523 bytes and above for port1 */ +#define NIG_REG_STAT1_EGRESS_MAC_PKT1 0x107b0 +/* [WB_R 64] Rx statistics : User octets received for LP */ +#define NIG_REG_STAT2_BRB_OCTET 0x107e0 +#define NIG_REG_STATUS_INTERRUPT_PORT0 0x10328 +#define NIG_REG_STATUS_INTERRUPT_PORT1 0x1032c +/* [RW 1] port swap mux selection. If this register equal to 0 then port + swap is equal to SPIO pin that inputs from ifmux_serdes_swap. If 1 then + ort swap is equal to ~nig_registers_port_swap.port_swap */ +#define NIG_REG_STRAP_OVERRIDE 0x10398 +/* [RW 1] output enable for RX_XCM0 IF */ +#define NIG_REG_XCM0_OUT_EN 0x100f0 +/* [RW 1] output enable for RX_XCM1 IF */ +#define NIG_REG_XCM1_OUT_EN 0x100f4 +/* [RW 1] control to xgxs - remote PHY in-band MDIO */ +#define NIG_REG_XGXS0_CTRL_EXTREMOTEMDIOST 0x10348 +/* [RW 5] control to xgxs - CL45 DEVAD */ +#define NIG_REG_XGXS0_CTRL_MD_DEVAD 0x1033c +/* [RW 1] control to xgxs; 0 - clause 45; 1 - clause 22 */ +#define NIG_REG_XGXS0_CTRL_MD_ST 0x10338 +/* [RW 5] control to xgxs - CL22 PHY_ADD and CL45 PRTAD */ +#define NIG_REG_XGXS0_CTRL_PHY_ADDR 0x10340 +/* [R 1] status from xgxs0 that inputs to interrupt logic of link10g. */ +#define NIG_REG_XGXS0_STATUS_LINK10G 0x10680 +/* [R 4] status from xgxs0 that inputs to interrupt logic of link status */ +#define NIG_REG_XGXS0_STATUS_LINK_STATUS 0x10684 +/* [RW 2] selection for XGXS lane of port 0 in NIG_MUX block */ +#define NIG_REG_XGXS_LANE_SEL_P0 0x102e8 +/* [RW 1] selection for port0 for NIG_MUX block : 0 = SerDes; 1 = XGXS */ +#define NIG_REG_XGXS_SERDES0_MODE_SEL 0x102e0 +#define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_SERDES0_LINK_STATUS (0x1<<9) +#define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK10G (0x1<<15) +#define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS (0xf<<18) +#define NIG_STATUS_INTERRUPT_PORT0_REG_STATUS_XGXS0_LINK_STATUS_SIZE 18 +/* [RW 1] Disable processing further tasks from port 0 (after ending the + current task in process). */ +#define PBF_REG_DISABLE_NEW_TASK_PROC_P0 0x14005c +/* [RW 1] Disable processing further tasks from port 1 (after ending the + current task in process). */ +#define PBF_REG_DISABLE_NEW_TASK_PROC_P1 0x140060 +/* [RW 1] Disable processing further tasks from port 4 (after ending the + current task in process). */ +#define PBF_REG_DISABLE_NEW_TASK_PROC_P4 0x14006c +#define PBF_REG_IF_ENABLE_REG 0x140044 +/* [RW 1] Init bit. When set the initial credits are copied to the credit + registers (except the port credits). Should be set and then reset after + the configuration of the block has ended. */ +#define PBF_REG_INIT 0x140000 +/* [RW 1] Init bit for port 0. When set the initial credit of port 0 is + copied to the credit register. Should be set and then reset after the + configuration of the port has ended. */ +#define PBF_REG_INIT_P0 0x140004 +/* [RW 1] Init bit for port 1. When set the initial credit of port 1 is + copied to the credit register. Should be set and then reset after the + configuration of the port has ended. */ +#define PBF_REG_INIT_P1 0x140008 +/* [RW 1] Init bit for port 4. When set the initial credit of port 4 is + copied to the credit register. Should be set and then reset after the + configuration of the port has ended. */ +#define PBF_REG_INIT_P4 0x14000c +/* [RW 1] Enable for mac interface 0. */ +#define PBF_REG_MAC_IF0_ENABLE 0x140030 +/* [RW 1] Enable for mac interface 1. */ +#define PBF_REG_MAC_IF1_ENABLE 0x140034 +/* [RW 1] Enable for the loopback interface. */ +#define PBF_REG_MAC_LB_ENABLE 0x140040 +/* [RW 10] Port 0 threshold used by arbiter in 16 byte lines used when pause + not suppoterd. */ +#define PBF_REG_P0_ARB_THRSH 0x1400e4 +/* [R 11] Current credit for port 0 in the tx port buffers in 16 byte lines. */ +#define PBF_REG_P0_CREDIT 0x140200 +/* [RW 11] Initial credit for port 0 in the tx port buffers in 16 byte + lines. */ +#define PBF_REG_P0_INIT_CRD 0x1400d0 +/* [RW 1] Indication that pause is enabled for port 0. */ +#define PBF_REG_P0_PAUSE_ENABLE 0x140014 +/* [R 8] Number of tasks in port 0 task queue. */ +#define PBF_REG_P0_TASK_CNT 0x140204 +/* [R 11] Current credit for port 1 in the tx port buffers in 16 byte lines. */ +#define PBF_REG_P1_CREDIT 0x140208 +/* [RW 11] Initial credit for port 1 in the tx port buffers in 16 byte + lines. */ +#define PBF_REG_P1_INIT_CRD 0x1400d4 +/* [R 8] Number of tasks in port 1 task queue. */ +#define PBF_REG_P1_TASK_CNT 0x14020c +/* [R 11] Current credit for port 4 in the tx port buffers in 16 byte lines. */ +#define PBF_REG_P4_CREDIT 0x140210 +/* [RW 11] Initial credit for port 4 in the tx port buffers in 16 byte + lines. */ +#define PBF_REG_P4_INIT_CRD 0x1400e0 +/* [R 8] Number of tasks in port 4 task queue. */ +#define PBF_REG_P4_TASK_CNT 0x140214 +/* [RW 5] Interrupt mask register #0 read/write */ +#define PBF_REG_PBF_INT_MASK 0x1401d4 +/* [R 5] Interrupt register #0 read */ +#define PBF_REG_PBF_INT_STS 0x1401c8 +#define PB_REG_CONTROL 0 +/* [RW 2] Interrupt mask register #0 read/write */ +#define PB_REG_PB_INT_MASK 0x28 +/* [R 2] Interrupt register #0 read */ +#define PB_REG_PB_INT_STS 0x1c +/* [RW 4] Parity mask register #0 read/write */ +#define PB_REG_PB_PRTY_MASK 0x38 +/* [R 4] Parity register #0 read */ +#define PB_REG_PB_PRTY_STS 0x2c +#define PRS_REG_A_PRSU_20 0x40134 +/* [R 8] debug only: CFC load request current credit. Transaction based. */ +#define PRS_REG_CFC_LD_CURRENT_CREDIT 0x40164 +/* [R 8] debug only: CFC search request current credit. Transaction based. */ +#define PRS_REG_CFC_SEARCH_CURRENT_CREDIT 0x40168 +/* [RW 6] The initial credit for the search message to the CFC interface. + Credit is transaction based. */ +#define PRS_REG_CFC_SEARCH_INITIAL_CREDIT 0x4011c +/* [RW 24] CID for port 0 if no match */ +#define PRS_REG_CID_PORT_0 0x400fc +/* [RW 32] The CM header for flush message where 'load existed' bit in CFC + load response is reset and packet type is 0. Used in packet start message + to TCM. */ +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_0 0x400dc +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_1 0x400e0 +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_2 0x400e4 +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_3 0x400e8 +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_4 0x400ec +#define PRS_REG_CM_HDR_FLUSH_LOAD_TYPE_5 0x400f0 +/* [RW 32] The CM header for flush message where 'load existed' bit in CFC + load response is set and packet type is 0. Used in packet start message + to TCM. */ +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_0 0x400bc +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_1 0x400c0 +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_2 0x400c4 +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_3 0x400c8 +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_4 0x400cc +#define PRS_REG_CM_HDR_FLUSH_NO_LOAD_TYPE_5 0x400d0 +/* [RW 32] The CM header for a match and packet type 1 for loopback port. + Used in packet start message to TCM. */ +#define PRS_REG_CM_HDR_LOOPBACK_TYPE_1 0x4009c +#define PRS_REG_CM_HDR_LOOPBACK_TYPE_2 0x400a0 +#define PRS_REG_CM_HDR_LOOPBACK_TYPE_3 0x400a4 +#define PRS_REG_CM_HDR_LOOPBACK_TYPE_4 0x400a8 +/* [RW 32] The CM header for a match and packet type 0. Used in packet start + message to TCM. */ +#define PRS_REG_CM_HDR_TYPE_0 0x40078 +#define PRS_REG_CM_HDR_TYPE_1 0x4007c +#define PRS_REG_CM_HDR_TYPE_2 0x40080 +#define PRS_REG_CM_HDR_TYPE_3 0x40084 +#define PRS_REG_CM_HDR_TYPE_4 0x40088 +/* [RW 32] The CM header in case there was not a match on the connection */ +#define PRS_REG_CM_NO_MATCH_HDR 0x400b8 +/* [RW 1] Indicates if in e1hov mode. 0=non-e1hov mode; 1=e1hov mode. */ +#define PRS_REG_E1HOV_MODE 0x401c8 +/* [RW 8] The 8-bit event ID for a match and packet type 1. Used in packet + start message to TCM. */ +#define PRS_REG_EVENT_ID_1 0x40054 +#define PRS_REG_EVENT_ID_2 0x40058 +#define PRS_REG_EVENT_ID_3 0x4005c +/* [RW 16] The Ethernet type value for FCoE */ +#define PRS_REG_FCOE_TYPE 0x401d0 +/* [RW 8] Context region for flush packet with packet type 0. Used in CFC + load request message. */ +#define PRS_REG_FLUSH_REGIONS_TYPE_0 0x40004 +#define PRS_REG_FLUSH_REGIONS_TYPE_1 0x40008 +#define PRS_REG_FLUSH_REGIONS_TYPE_2 0x4000c +#define PRS_REG_FLUSH_REGIONS_TYPE_3 0x40010 +#define PRS_REG_FLUSH_REGIONS_TYPE_4 0x40014 +#define PRS_REG_FLUSH_REGIONS_TYPE_5 0x40018 +#define PRS_REG_FLUSH_REGIONS_TYPE_6 0x4001c +#define PRS_REG_FLUSH_REGIONS_TYPE_7 0x40020 +/* [RW 4] The increment value to send in the CFC load request message */ +#define PRS_REG_INC_VALUE 0x40048 +/* [RW 1] If set indicates not to send messages to CFC on received packets */ +#define PRS_REG_NIC_MODE 0x40138 +/* [RW 8] The 8-bit event ID for cases where there is no match on the + connection. Used in packet start message to TCM. */ +#define PRS_REG_NO_MATCH_EVENT_ID 0x40070 +/* [ST 24] The number of input CFC flush packets */ +#define PRS_REG_NUM_OF_CFC_FLUSH_MESSAGES 0x40128 +/* [ST 32] The number of cycles the Parser halted its operation since it + could not allocate the next serial number */ +#define PRS_REG_NUM_OF_DEAD_CYCLES 0x40130 +/* [ST 24] The number of input packets */ +#define PRS_REG_NUM_OF_PACKETS 0x40124 +/* [ST 24] The number of input transparent flush packets */ +#define PRS_REG_NUM_OF_TRANSPARENT_FLUSH_MESSAGES 0x4012c +/* [RW 8] Context region for received Ethernet packet with a match and + packet type 0. Used in CFC load request message */ +#define PRS_REG_PACKET_REGIONS_TYPE_0 0x40028 +#define PRS_REG_PACKET_REGIONS_TYPE_1 0x4002c +#define PRS_REG_PACKET_REGIONS_TYPE_2 0x40030 +#define PRS_REG_PACKET_REGIONS_TYPE_3 0x40034 +#define PRS_REG_PACKET_REGIONS_TYPE_4 0x40038 +#define PRS_REG_PACKET_REGIONS_TYPE_5 0x4003c +#define PRS_REG_PACKET_REGIONS_TYPE_6 0x40040 +#define PRS_REG_PACKET_REGIONS_TYPE_7 0x40044 +/* [R 2] debug only: Number of pending requests for CAC on port 0. */ +#define PRS_REG_PENDING_BRB_CAC0_RQ 0x40174 +/* [R 2] debug only: Number of pending requests for header parsing. */ +#define PRS_REG_PENDING_BRB_PRS_RQ 0x40170 +/* [R 1] Interrupt register #0 read */ +#define PRS_REG_PRS_INT_STS 0x40188 +/* [RW 8] Parity mask register #0 read/write */ +#define PRS_REG_PRS_PRTY_MASK 0x401a4 +/* [R 8] Parity register #0 read */ +#define PRS_REG_PRS_PRTY_STS 0x40198 +/* [RW 8] Context region for pure acknowledge packets. Used in CFC load + request message */ +#define PRS_REG_PURE_REGIONS 0x40024 +/* [R 32] debug only: Serial number status lsb 32 bits. '1' indicates this + serail number was released by SDM but cannot be used because a previous + serial number was not released. */ +#define PRS_REG_SERIAL_NUM_STATUS_LSB 0x40154 +/* [R 32] debug only: Serial number status msb 32 bits. '1' indicates this + serail number was released by SDM but cannot be used because a previous + serial number was not released. */ +#define PRS_REG_SERIAL_NUM_STATUS_MSB 0x40158 +/* [R 4] debug only: SRC current credit. Transaction based. */ +#define PRS_REG_SRC_CURRENT_CREDIT 0x4016c +/* [R 8] debug only: TCM current credit. Cycle based. */ +#define PRS_REG_TCM_CURRENT_CREDIT 0x40160 +/* [R 8] debug only: TSDM current credit. Transaction based. */ +#define PRS_REG_TSDM_CURRENT_CREDIT 0x4015c +/* [R 6] Debug only: Number of used entries in the data FIFO */ +#define PXP2_REG_HST_DATA_FIFO_STATUS 0x12047c +/* [R 7] Debug only: Number of used entries in the header FIFO */ +#define PXP2_REG_HST_HEADER_FIFO_STATUS 0x120478 +#define PXP2_REG_PGL_ADDR_88_F0 0x120534 +#define PXP2_REG_PGL_ADDR_8C_F0 0x120538 +#define PXP2_REG_PGL_ADDR_90_F0 0x12053c +#define PXP2_REG_PGL_ADDR_94_F0 0x120540 +#define PXP2_REG_PGL_CONTROL0 0x120490 +#define PXP2_REG_PGL_CONTROL1 0x120514 +/* [RW 32] third dword data of expansion rom request. this register is + special. reading from it provides a vector outstanding read requests. if + a bit is zero it means that a read request on the corresponding tag did + not finish yet (not all completions have arrived for it) */ +#define PXP2_REG_PGL_EXP_ROM2 0x120808 +/* [RW 32] Inbound interrupt table for CSDM: bits[31:16]-mask; + its[15:0]-address */ +#define PXP2_REG_PGL_INT_CSDM_0 0x1204f4 +#define PXP2_REG_PGL_INT_CSDM_1 0x1204f8 +#define PXP2_REG_PGL_INT_CSDM_2 0x1204fc +#define PXP2_REG_PGL_INT_CSDM_3 0x120500 +#define PXP2_REG_PGL_INT_CSDM_4 0x120504 +#define PXP2_REG_PGL_INT_CSDM_5 0x120508 +#define PXP2_REG_PGL_INT_CSDM_6 0x12050c +#define PXP2_REG_PGL_INT_CSDM_7 0x120510 +/* [RW 32] Inbound interrupt table for TSDM: bits[31:16]-mask; + its[15:0]-address */ +#define PXP2_REG_PGL_INT_TSDM_0 0x120494 +#define PXP2_REG_PGL_INT_TSDM_1 0x120498 +#define PXP2_REG_PGL_INT_TSDM_2 0x12049c +#define PXP2_REG_PGL_INT_TSDM_3 0x1204a0 +#define PXP2_REG_PGL_INT_TSDM_4 0x1204a4 +#define PXP2_REG_PGL_INT_TSDM_5 0x1204a8 +#define PXP2_REG_PGL_INT_TSDM_6 0x1204ac +#define PXP2_REG_PGL_INT_TSDM_7 0x1204b0 +/* [RW 32] Inbound interrupt table for USDM: bits[31:16]-mask; + its[15:0]-address */ +#define PXP2_REG_PGL_INT_USDM_0 0x1204b4 +#define PXP2_REG_PGL_INT_USDM_1 0x1204b8 +#define PXP2_REG_PGL_INT_USDM_2 0x1204bc +#define PXP2_REG_PGL_INT_USDM_3 0x1204c0 +#define PXP2_REG_PGL_INT_USDM_4 0x1204c4 +#define PXP2_REG_PGL_INT_USDM_5 0x1204c8 +#define PXP2_REG_PGL_INT_USDM_6 0x1204cc +#define PXP2_REG_PGL_INT_USDM_7 0x1204d0 +/* [RW 32] Inbound interrupt table for XSDM: bits[31:16]-mask; + its[15:0]-address */ +#define PXP2_REG_PGL_INT_XSDM_0 0x1204d4 +#define PXP2_REG_PGL_INT_XSDM_1 0x1204d8 +#define PXP2_REG_PGL_INT_XSDM_2 0x1204dc +#define PXP2_REG_PGL_INT_XSDM_3 0x1204e0 +#define PXP2_REG_PGL_INT_XSDM_4 0x1204e4 +#define PXP2_REG_PGL_INT_XSDM_5 0x1204e8 +#define PXP2_REG_PGL_INT_XSDM_6 0x1204ec +#define PXP2_REG_PGL_INT_XSDM_7 0x1204f0 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F0 0x120674 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F1 0x120678 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F2 0x12067c +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F3 0x120680 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F4 0x120684 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F5 0x120688 +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F6 0x12068c +/* [RW 3] this field allows one function to pretend being another function + when accessing any BAR mapped resource within the device. the value of + the field is the number of the function that will be accessed + effectively. after software write to this bit it must read it in order to + know that the new value is updated */ +#define PXP2_REG_PGL_PRETEND_FUNC_F7 0x120690 +/* [R 1] this bit indicates that a read request was blocked because of + bus_master_en was deasserted */ +#define PXP2_REG_PGL_READ_BLOCKED 0x120568 +#define PXP2_REG_PGL_TAGS_LIMIT 0x1205a8 +/* [R 18] debug only */ +#define PXP2_REG_PGL_TXW_CDTS 0x12052c +/* [R 1] this bit indicates that a write request was blocked because of + bus_master_en was deasserted */ +#define PXP2_REG_PGL_WRITE_BLOCKED 0x120564 +#define PXP2_REG_PSWRQ_BW_ADD1 0x1201c0 +#define PXP2_REG_PSWRQ_BW_ADD10 0x1201e4 +#define PXP2_REG_PSWRQ_BW_ADD11 0x1201e8 +#define PXP2_REG_PSWRQ_BW_ADD10 0x1201e4 +#define PXP2_REG_PSWRQ_BW_ADD11 0x1201e8 +#define PXP2_REG_PSWRQ_BW_ADD2 0x1201c4 +#define PXP2_REG_PSWRQ_BW_ADD28 0x120228 +#define PXP2_REG_PSWRQ_BW_ADD28 0x120228 +#define PXP2_REG_PSWRQ_BW_ADD3 0x1201c8 +#define PXP2_REG_PSWRQ_BW_ADD6 0x1201d4 +#define PXP2_REG_PSWRQ_BW_ADD7 0x1201d8 +#define PXP2_REG_PSWRQ_BW_ADD8 0x1201dc +#define PXP2_REG_PSWRQ_BW_ADD9 0x1201e0 +#define PXP2_REG_PSWRQ_BW_CREDIT 0x12032c +#define PXP2_REG_PSWRQ_BW_L1 0x1202b0 +#define PXP2_REG_PSWRQ_BW_L10 0x1202d4 +#define PXP2_REG_PSWRQ_BW_L11 0x1202d8 +#define PXP2_REG_PSWRQ_BW_L10 0x1202d4 +#define PXP2_REG_PSWRQ_BW_L11 0x1202d8 +#define PXP2_REG_PSWRQ_BW_L2 0x1202b4 +#define PXP2_REG_PSWRQ_BW_L28 0x120318 +#define PXP2_REG_PSWRQ_BW_L28 0x120318 +#define PXP2_REG_PSWRQ_BW_L3 0x1202b8 +#define PXP2_REG_PSWRQ_BW_L6 0x1202c4 +#define PXP2_REG_PSWRQ_BW_L7 0x1202c8 +#define PXP2_REG_PSWRQ_BW_L8 0x1202cc +#define PXP2_REG_PSWRQ_BW_L9 0x1202d0 +#define PXP2_REG_PSWRQ_BW_RD 0x120324 +#define PXP2_REG_PSWRQ_BW_UB1 0x120238 +#define PXP2_REG_PSWRQ_BW_UB10 0x12025c +#define PXP2_REG_PSWRQ_BW_UB11 0x120260 +#define PXP2_REG_PSWRQ_BW_UB10 0x12025c +#define PXP2_REG_PSWRQ_BW_UB11 0x120260 +#define PXP2_REG_PSWRQ_BW_UB2 0x12023c +#define PXP2_REG_PSWRQ_BW_UB28 0x1202a0 +#define PXP2_REG_PSWRQ_BW_UB28 0x1202a0 +#define PXP2_REG_PSWRQ_BW_UB3 0x120240 +#define PXP2_REG_PSWRQ_BW_UB6 0x12024c +#define PXP2_REG_PSWRQ_BW_UB7 0x120250 +#define PXP2_REG_PSWRQ_BW_UB8 0x120254 +#define PXP2_REG_PSWRQ_BW_UB9 0x120258 +#define PXP2_REG_PSWRQ_BW_WR 0x120328 +#define PXP2_REG_PSWRQ_CDU0_L2P 0x120000 +#define PXP2_REG_PSWRQ_QM0_L2P 0x120038 +#define PXP2_REG_PSWRQ_SRC0_L2P 0x120054 +#define PXP2_REG_PSWRQ_TM0_L2P 0x12001c +#define PXP2_REG_PSWRQ_TSDM0_L2P 0x1200e0 +/* [RW 32] Interrupt mask register #0 read/write */ +#define PXP2_REG_PXP2_INT_MASK_0 0x120578 +/* [R 32] Interrupt register #0 read */ +#define PXP2_REG_PXP2_INT_STS_0 0x12056c +#define PXP2_REG_PXP2_INT_STS_1 0x120608 +/* [RC 32] Interrupt register #0 read clear */ +#define PXP2_REG_PXP2_INT_STS_CLR_0 0x120570 +/* [RW 32] Parity mask register #0 read/write */ +#define PXP2_REG_PXP2_PRTY_MASK_0 0x120588 +#define PXP2_REG_PXP2_PRTY_MASK_1 0x120598 +/* [R 32] Parity register #0 read */ +#define PXP2_REG_PXP2_PRTY_STS_0 0x12057c +#define PXP2_REG_PXP2_PRTY_STS_1 0x12058c +/* [R 1] Debug only: The 'almost full' indication from each fifo (gives + indication about backpressure) */ +#define PXP2_REG_RD_ALMOST_FULL_0 0x120424 +/* [R 8] Debug only: The blocks counter - number of unused block ids */ +#define PXP2_REG_RD_BLK_CNT 0x120418 +/* [RW 8] Debug only: Total number of available blocks in Tetris Buffer. + Must be bigger than 6. Normally should not be changed. */ +#define PXP2_REG_RD_BLK_NUM_CFG 0x12040c +/* [RW 2] CDU byte swapping mode configuration for master read requests */ +#define PXP2_REG_RD_CDURD_SWAP_MODE 0x120404 +/* [RW 1] When '1'; inputs to the PSWRD block are ignored */ +#define PXP2_REG_RD_DISABLE_INPUTS 0x120374 +/* [R 1] PSWRD internal memories initialization is done */ +#define PXP2_REG_RD_INIT_DONE 0x120370 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq10 */ +#define PXP2_REG_RD_MAX_BLKS_VQ10 0x1203a0 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq11 */ +#define PXP2_REG_RD_MAX_BLKS_VQ11 0x1203a4 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq17 */ +#define PXP2_REG_RD_MAX_BLKS_VQ17 0x1203bc +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq18 */ +#define PXP2_REG_RD_MAX_BLKS_VQ18 0x1203c0 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq19 */ +#define PXP2_REG_RD_MAX_BLKS_VQ19 0x1203c4 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq22 */ +#define PXP2_REG_RD_MAX_BLKS_VQ22 0x1203d0 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq6 */ +#define PXP2_REG_RD_MAX_BLKS_VQ6 0x120390 +/* [RW 8] The maximum number of blocks in Tetris Buffer that can be + allocated for vq9 */ +#define PXP2_REG_RD_MAX_BLKS_VQ9 0x12039c +/* [RW 2] PBF byte swapping mode configuration for master read requests */ +#define PXP2_REG_RD_PBF_SWAP_MODE 0x1203f4 +/* [R 1] Debug only: Indication if delivery ports are idle */ +#define PXP2_REG_RD_PORT_IS_IDLE_0 0x12041c +#define PXP2_REG_RD_PORT_IS_IDLE_1 0x120420 +/* [RW 2] QM byte swapping mode configuration for master read requests */ +#define PXP2_REG_RD_QM_SWAP_MODE 0x1203f8 +/* [RW 2] SRC byte swapping mode configuration for master read requests */ +#define PXP2_REG_RD_SRC_SWAP_MODE 0x120400 +/* [R 7] Debug only: The SR counter - number of unused sub request ids */ +#define PXP2_REG_RD_SR_CNT 0x120414 +/* [RW 7] Debug only: Total number of available PCI read sub-requests. Must + be bigger than 1. Normally should not be changed. */ +#define PXP2_REG_RD_SR_NUM_CFG 0x120408 +/* [RW 1] Signals the PSWRD block to start initializing internal memories */ +#define PXP2_REG_RD_START_INIT 0x12036c +/* [RW 2] TM byte swapping mode configuration for master read requests */ +#define PXP2_REG_RD_TM_SWAP_MODE 0x1203fc +/* [RW 10] Bandwidth addition to VQ0 write requests */ +#define PXP2_REG_RQ_BW_RD_ADD0 0x1201bc +/* [RW 10] Bandwidth addition to VQ12 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD12 0x1201ec +/* [RW 10] Bandwidth addition to VQ13 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD13 0x1201f0 +/* [RW 10] Bandwidth addition to VQ14 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD14 0x1201f4 +/* [RW 10] Bandwidth addition to VQ15 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD15 0x1201f8 +/* [RW 10] Bandwidth addition to VQ16 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD16 0x1201fc +/* [RW 10] Bandwidth addition to VQ17 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD17 0x120200 +/* [RW 10] Bandwidth addition to VQ18 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD18 0x120204 +/* [RW 10] Bandwidth addition to VQ19 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD19 0x120208 +/* [RW 10] Bandwidth addition to VQ20 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD20 0x12020c +/* [RW 10] Bandwidth addition to VQ22 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD22 0x120210 +/* [RW 10] Bandwidth addition to VQ23 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD23 0x120214 +/* [RW 10] Bandwidth addition to VQ24 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD24 0x120218 +/* [RW 10] Bandwidth addition to VQ25 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD25 0x12021c +/* [RW 10] Bandwidth addition to VQ26 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD26 0x120220 +/* [RW 10] Bandwidth addition to VQ27 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD27 0x120224 +/* [RW 10] Bandwidth addition to VQ4 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD4 0x1201cc +/* [RW 10] Bandwidth addition to VQ5 read requests */ +#define PXP2_REG_RQ_BW_RD_ADD5 0x1201d0 +/* [RW 10] Bandwidth Typical L for VQ0 Read requests */ +#define PXP2_REG_RQ_BW_RD_L0 0x1202ac +/* [RW 10] Bandwidth Typical L for VQ12 Read requests */ +#define PXP2_REG_RQ_BW_RD_L12 0x1202dc +/* [RW 10] Bandwidth Typical L for VQ13 Read requests */ +#define PXP2_REG_RQ_BW_RD_L13 0x1202e0 +/* [RW 10] Bandwidth Typical L for VQ14 Read requests */ +#define PXP2_REG_RQ_BW_RD_L14 0x1202e4 +/* [RW 10] Bandwidth Typical L for VQ15 Read requests */ +#define PXP2_REG_RQ_BW_RD_L15 0x1202e8 +/* [RW 10] Bandwidth Typical L for VQ16 Read requests */ +#define PXP2_REG_RQ_BW_RD_L16 0x1202ec +/* [RW 10] Bandwidth Typical L for VQ17 Read requests */ +#define PXP2_REG_RQ_BW_RD_L17 0x1202f0 +/* [RW 10] Bandwidth Typical L for VQ18 Read requests */ +#define PXP2_REG_RQ_BW_RD_L18 0x1202f4 +/* [RW 10] Bandwidth Typical L for VQ19 Read requests */ +#define PXP2_REG_RQ_BW_RD_L19 0x1202f8 +/* [RW 10] Bandwidth Typical L for VQ20 Read requests */ +#define PXP2_REG_RQ_BW_RD_L20 0x1202fc +/* [RW 10] Bandwidth Typical L for VQ22 Read requests */ +#define PXP2_REG_RQ_BW_RD_L22 0x120300 +/* [RW 10] Bandwidth Typical L for VQ23 Read requests */ +#define PXP2_REG_RQ_BW_RD_L23 0x120304 +/* [RW 10] Bandwidth Typical L for VQ24 Read requests */ +#define PXP2_REG_RQ_BW_RD_L24 0x120308 +/* [RW 10] Bandwidth Typical L for VQ25 Read requests */ +#define PXP2_REG_RQ_BW_RD_L25 0x12030c +/* [RW 10] Bandwidth Typical L for VQ26 Read requests */ +#define PXP2_REG_RQ_BW_RD_L26 0x120310 +/* [RW 10] Bandwidth Typical L for VQ27 Read requests */ +#define PXP2_REG_RQ_BW_RD_L27 0x120314 +/* [RW 10] Bandwidth Typical L for VQ4 Read requests */ +#define PXP2_REG_RQ_BW_RD_L4 0x1202bc +/* [RW 10] Bandwidth Typical L for VQ5 Read- currently not used */ +#define PXP2_REG_RQ_BW_RD_L5 0x1202c0 +/* [RW 7] Bandwidth upper bound for VQ0 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND0 0x120234 +/* [RW 7] Bandwidth upper bound for VQ12 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND12 0x120264 +/* [RW 7] Bandwidth upper bound for VQ13 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND13 0x120268 +/* [RW 7] Bandwidth upper bound for VQ14 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND14 0x12026c +/* [RW 7] Bandwidth upper bound for VQ15 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND15 0x120270 +/* [RW 7] Bandwidth upper bound for VQ16 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND16 0x120274 +/* [RW 7] Bandwidth upper bound for VQ17 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND17 0x120278 +/* [RW 7] Bandwidth upper bound for VQ18 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND18 0x12027c +/* [RW 7] Bandwidth upper bound for VQ19 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND19 0x120280 +/* [RW 7] Bandwidth upper bound for VQ20 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND20 0x120284 +/* [RW 7] Bandwidth upper bound for VQ22 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND22 0x120288 +/* [RW 7] Bandwidth upper bound for VQ23 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND23 0x12028c +/* [RW 7] Bandwidth upper bound for VQ24 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND24 0x120290 +/* [RW 7] Bandwidth upper bound for VQ25 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND25 0x120294 +/* [RW 7] Bandwidth upper bound for VQ26 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND26 0x120298 +/* [RW 7] Bandwidth upper bound for VQ27 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND27 0x12029c +/* [RW 7] Bandwidth upper bound for VQ4 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND4 0x120244 +/* [RW 7] Bandwidth upper bound for VQ5 read requests */ +#define PXP2_REG_RQ_BW_RD_UBOUND5 0x120248 +/* [RW 10] Bandwidth addition to VQ29 write requests */ +#define PXP2_REG_RQ_BW_WR_ADD29 0x12022c +/* [RW 10] Bandwidth addition to VQ30 write requests */ +#define PXP2_REG_RQ_BW_WR_ADD30 0x120230 +/* [RW 10] Bandwidth Typical L for VQ29 Write requests */ +#define PXP2_REG_RQ_BW_WR_L29 0x12031c +/* [RW 10] Bandwidth Typical L for VQ30 Write requests */ +#define PXP2_REG_RQ_BW_WR_L30 0x120320 +/* [RW 7] Bandwidth upper bound for VQ29 */ +#define PXP2_REG_RQ_BW_WR_UBOUND29 0x1202a4 +/* [RW 7] Bandwidth upper bound for VQ30 */ +#define PXP2_REG_RQ_BW_WR_UBOUND30 0x1202a8 +/* [RW 18] external first_mem_addr field in L2P table for CDU module port 0 */ +#define PXP2_REG_RQ_CDU0_EFIRST_MEM_ADDR 0x120008 +/* [RW 2] Endian mode for cdu */ +#define PXP2_REG_RQ_CDU_ENDIAN_M 0x1201a0 +#define PXP2_REG_RQ_CDU_FIRST_ILT 0x12061c +#define PXP2_REG_RQ_CDU_LAST_ILT 0x120620 +/* [RW 3] page size in L2P table for CDU module; -4k; -8k; -16k; -32k; -64k; + -128k */ +#define PXP2_REG_RQ_CDU_P_SIZE 0x120018 +/* [R 1] 1' indicates that the requester has finished its internal + configuration */ +#define PXP2_REG_RQ_CFG_DONE 0x1201b4 +/* [RW 2] Endian mode for debug */ +#define PXP2_REG_RQ_DBG_ENDIAN_M 0x1201a4 +/* [RW 1] When '1'; requests will enter input buffers but wont get out + towards the glue */ +#define PXP2_REG_RQ_DISABLE_INPUTS 0x120330 +/* [RW 1] 1 - SR will be aligned by 64B; 0 - SR will be aligned by 8B */ +#define PXP2_REG_RQ_DRAM_ALIGN 0x1205b0 +/* [RW 1] If 1 ILT failiue will not result in ELT access; An interrupt will + be asserted */ +#define PXP2_REG_RQ_ELT_DISABLE 0x12066c +/* [RW 2] Endian mode for hc */ +#define PXP2_REG_RQ_HC_ENDIAN_M 0x1201a8 +/* [RW 1] when '0' ILT logic will work as in A0; otherwise B0; for back + compatibility needs; Note that different registers are used per mode */ +#define PXP2_REG_RQ_ILT_MODE 0x1205b4 +/* [WB 53] Onchip address table */ +#define PXP2_REG_RQ_ONCHIP_AT 0x122000 +/* [WB 53] Onchip address table - B0 */ +#define PXP2_REG_RQ_ONCHIP_AT_B0 0x128000 +/* [RW 13] Pending read limiter threshold; in Dwords */ +#define PXP2_REG_RQ_PDR_LIMIT 0x12033c +/* [RW 2] Endian mode for qm */ +#define PXP2_REG_RQ_QM_ENDIAN_M 0x120194 +#define PXP2_REG_RQ_QM_FIRST_ILT 0x120634 +#define PXP2_REG_RQ_QM_LAST_ILT 0x120638 +/* [RW 3] page size in L2P table for QM module; -4k; -8k; -16k; -32k; -64k; + -128k */ +#define PXP2_REG_RQ_QM_P_SIZE 0x120050 +/* [RW 1] 1' indicates that the RBC has finished configuring the PSWRQ */ +#define PXP2_REG_RQ_RBC_DONE 0x1201b0 +/* [RW 3] Max burst size filed for read requests port 0; 000 - 128B; + 001:256B; 010: 512B; 11:1K:100:2K; 01:4K */ +#define PXP2_REG_RQ_RD_MBS0 0x120160 +/* [RW 3] Max burst size filed for read requests port 1; 000 - 128B; + 001:256B; 010: 512B; 11:1K:100:2K; 01:4K */ +#define PXP2_REG_RQ_RD_MBS1 0x120168 +/* [RW 2] Endian mode for src */ +#define PXP2_REG_RQ_SRC_ENDIAN_M 0x12019c +#define PXP2_REG_RQ_SRC_FIRST_ILT 0x12063c +#define PXP2_REG_RQ_SRC_LAST_ILT 0x120640 +/* [RW 3] page size in L2P table for SRC module; -4k; -8k; -16k; -32k; -64k; + -128k */ +#define PXP2_REG_RQ_SRC_P_SIZE 0x12006c +/* [RW 2] Endian mode for tm */ +#define PXP2_REG_RQ_TM_ENDIAN_M 0x120198 +#define PXP2_REG_RQ_TM_FIRST_ILT 0x120644 +#define PXP2_REG_RQ_TM_LAST_ILT 0x120648 +/* [RW 3] page size in L2P table for TM module; -4k; -8k; -16k; -32k; -64k; + -128k */ +#define PXP2_REG_RQ_TM_P_SIZE 0x120034 +/* [R 5] Number of entries in the ufifo; his fifo has l2p completions */ +#define PXP2_REG_RQ_UFIFO_NUM_OF_ENTRY 0x12080c +/* [RW 18] external first_mem_addr field in L2P table for USDM module port 0 */ +#define PXP2_REG_RQ_USDM0_EFIRST_MEM_ADDR 0x120094 +/* [R 8] Number of entries occupied by vq 0 in pswrq memory */ +#define PXP2_REG_RQ_VQ0_ENTRY_CNT 0x120810 +/* [R 8] Number of entries occupied by vq 10 in pswrq memory */ +#define PXP2_REG_RQ_VQ10_ENTRY_CNT 0x120818 +/* [R 8] Number of entries occupied by vq 11 in pswrq memory */ +#define PXP2_REG_RQ_VQ11_ENTRY_CNT 0x120820 +/* [R 8] Number of entries occupied by vq 12 in pswrq memory */ +#define PXP2_REG_RQ_VQ12_ENTRY_CNT 0x120828 +/* [R 8] Number of entries occupied by vq 13 in pswrq memory */ +#define PXP2_REG_RQ_VQ13_ENTRY_CNT 0x120830 +/* [R 8] Number of entries occupied by vq 14 in pswrq memory */ +#define PXP2_REG_RQ_VQ14_ENTRY_CNT 0x120838 +/* [R 8] Number of entries occupied by vq 15 in pswrq memory */ +#define PXP2_REG_RQ_VQ15_ENTRY_CNT 0x120840 +/* [R 8] Number of entries occupied by vq 16 in pswrq memory */ +#define PXP2_REG_RQ_VQ16_ENTRY_CNT 0x120848 +/* [R 8] Number of entries occupied by vq 17 in pswrq memory */ +#define PXP2_REG_RQ_VQ17_ENTRY_CNT 0x120850 +/* [R 8] Number of entries occupied by vq 18 in pswrq memory */ +#define PXP2_REG_RQ_VQ18_ENTRY_CNT 0x120858 +/* [R 8] Number of entries occupied by vq 19 in pswrq memory */ +#define PXP2_REG_RQ_VQ19_ENTRY_CNT 0x120860 +/* [R 8] Number of entries occupied by vq 1 in pswrq memory */ +#define PXP2_REG_RQ_VQ1_ENTRY_CNT 0x120868 +/* [R 8] Number of entries occupied by vq 20 in pswrq memory */ +#define PXP2_REG_RQ_VQ20_ENTRY_CNT 0x120870 +/* [R 8] Number of entries occupied by vq 21 in pswrq memory */ +#define PXP2_REG_RQ_VQ21_ENTRY_CNT 0x120878 +/* [R 8] Number of entries occupied by vq 22 in pswrq memory */ +#define PXP2_REG_RQ_VQ22_ENTRY_CNT 0x120880 +/* [R 8] Number of entries occupied by vq 23 in pswrq memory */ +#define PXP2_REG_RQ_VQ23_ENTRY_CNT 0x120888 +/* [R 8] Number of entries occupied by vq 24 in pswrq memory */ +#define PXP2_REG_RQ_VQ24_ENTRY_CNT 0x120890 +/* [R 8] Number of entries occupied by vq 25 in pswrq memory */ +#define PXP2_REG_RQ_VQ25_ENTRY_CNT 0x120898 +/* [R 8] Number of entries occupied by vq 26 in pswrq memory */ +#define PXP2_REG_RQ_VQ26_ENTRY_CNT 0x1208a0 +/* [R 8] Number of entries occupied by vq 27 in pswrq memory */ +#define PXP2_REG_RQ_VQ27_ENTRY_CNT 0x1208a8 +/* [R 8] Number of entries occupied by vq 28 in pswrq memory */ +#define PXP2_REG_RQ_VQ28_ENTRY_CNT 0x1208b0 +/* [R 8] Number of entries occupied by vq 29 in pswrq memory */ +#define PXP2_REG_RQ_VQ29_ENTRY_CNT 0x1208b8 +/* [R 8] Number of entries occupied by vq 2 in pswrq memory */ +#define PXP2_REG_RQ_VQ2_ENTRY_CNT 0x1208c0 +/* [R 8] Number of entries occupied by vq 30 in pswrq memory */ +#define PXP2_REG_RQ_VQ30_ENTRY_CNT 0x1208c8 +/* [R 8] Number of entries occupied by vq 31 in pswrq memory */ +#define PXP2_REG_RQ_VQ31_ENTRY_CNT 0x1208d0 +/* [R 8] Number of entries occupied by vq 3 in pswrq memory */ +#define PXP2_REG_RQ_VQ3_ENTRY_CNT 0x1208d8 +/* [R 8] Number of entries occupied by vq 4 in pswrq memory */ +#define PXP2_REG_RQ_VQ4_ENTRY_CNT 0x1208e0 +/* [R 8] Number of entries occupied by vq 5 in pswrq memory */ +#define PXP2_REG_RQ_VQ5_ENTRY_CNT 0x1208e8 +/* [R 8] Number of entries occupied by vq 6 in pswrq memory */ +#define PXP2_REG_RQ_VQ6_ENTRY_CNT 0x1208f0 +/* [R 8] Number of entries occupied by vq 7 in pswrq memory */ +#define PXP2_REG_RQ_VQ7_ENTRY_CNT 0x1208f8 +/* [R 8] Number of entries occupied by vq 8 in pswrq memory */ +#define PXP2_REG_RQ_VQ8_ENTRY_CNT 0x120900 +/* [R 8] Number of entries occupied by vq 9 in pswrq memory */ +#define PXP2_REG_RQ_VQ9_ENTRY_CNT 0x120908 +/* [RW 3] Max burst size filed for write requests port 0; 000 - 128B; + 001:256B; 010: 512B; */ +#define PXP2_REG_RQ_WR_MBS0 0x12015c +/* [RW 3] Max burst size filed for write requests port 1; 000 - 128B; + 001:256B; 010: 512B; */ +#define PXP2_REG_RQ_WR_MBS1 0x120164 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_CDU_MPS 0x1205f0 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_CSDM_MPS 0x1205d0 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_DBG_MPS 0x1205e8 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_DMAE_MPS 0x1205ec +/* [RW 10] if Number of entries in dmae fifo will be higher than this + threshold then has_payload indication will be asserted; the default value + should be equal to > write MBS size! */ +#define PXP2_REG_WR_DMAE_TH 0x120368 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_HC_MPS 0x1205c8 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_QM_MPS 0x1205dc +/* [RW 1] 0 - working in A0 mode; - working in B0 mode */ +#define PXP2_REG_WR_REV_MODE 0x120670 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_SRC_MPS 0x1205e4 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_TM_MPS 0x1205e0 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_TSDM_MPS 0x1205d4 +/* [RW 10] if Number of entries in usdmdp fifo will be higher than this + threshold then has_payload indication will be asserted; the default value + should be equal to > write MBS size! */ +#define PXP2_REG_WR_USDMDP_TH 0x120348 +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_USDM_MPS 0x1205cc +/* [RW 2] 0 - 128B; - 256B; - 512B; - 1024B; when the payload in the + buffer reaches this number has_payload will be asserted */ +#define PXP2_REG_WR_XSDM_MPS 0x1205d8 +/* [R 1] debug only: Indication if PSWHST arbiter is idle */ +#define PXP_REG_HST_ARB_IS_IDLE 0x103004 +/* [R 8] debug only: A bit mask for all PSWHST arbiter clients. '1' means + this client is waiting for the arbiter. */ +#define PXP_REG_HST_CLIENTS_WAITING_TO_ARB 0x103008 +/* [R 1] debug only: '1' means this PSWHST is discarding doorbells. This bit + should update accoring to 'hst_discard_doorbells' register when the state + machine is idle */ +#define PXP_REG_HST_DISCARD_DOORBELLS_STATUS 0x1030a0 +/* [R 6] debug only: A bit mask for all PSWHST internal write clients. '1' + means this PSWHST is discarding inputs from this client. Each bit should + update accoring to 'hst_discard_internal_writes' register when the state + machine is idle. */ +#define PXP_REG_HST_DISCARD_INTERNAL_WRITES_STATUS 0x10309c +/* [WB 160] Used for initialization of the inbound interrupts memory */ +#define PXP_REG_HST_INBOUND_INT 0x103800 +/* [RW 32] Interrupt mask register #0 read/write */ +#define PXP_REG_PXP_INT_MASK_0 0x103074 +#define PXP_REG_PXP_INT_MASK_1 0x103084 +/* [R 32] Interrupt register #0 read */ +#define PXP_REG_PXP_INT_STS_0 0x103068 +#define PXP_REG_PXP_INT_STS_1 0x103078 +/* [RC 32] Interrupt register #0 read clear */ +#define PXP_REG_PXP_INT_STS_CLR_0 0x10306c +/* [RW 26] Parity mask register #0 read/write */ +#define PXP_REG_PXP_PRTY_MASK 0x103094 +/* [R 26] Parity register #0 read */ +#define PXP_REG_PXP_PRTY_STS 0x103088 +/* [RW 4] The activity counter initial increment value sent in the load + request */ +#define QM_REG_ACTCTRINITVAL_0 0x168040 +#define QM_REG_ACTCTRINITVAL_1 0x168044 +#define QM_REG_ACTCTRINITVAL_2 0x168048 +#define QM_REG_ACTCTRINITVAL_3 0x16804c +/* [RW 32] The base logical address (in bytes) of each physical queue. The + index I represents the physical queue number. The 12 lsbs are ignore and + considered zero so practically there are only 20 bits in this register; + queues 63-0 */ +#define QM_REG_BASEADDR 0x168900 +/* [RW 32] The base logical address (in bytes) of each physical queue. The + index I represents the physical queue number. The 12 lsbs are ignore and + considered zero so practically there are only 20 bits in this register; + queues 127-64 */ +#define QM_REG_BASEADDR_EXT_A 0x16e100 +/* [RW 16] The byte credit cost for each task. This value is for both ports */ +#define QM_REG_BYTECRDCOST 0x168234 +/* [RW 16] The initial byte credit value for both ports. */ +#define QM_REG_BYTECRDINITVAL 0x168238 +/* [RW 32] A bit per physical queue. If the bit is cleared then the physical + queue uses port 0 else it uses port 1; queues 31-0 */ +#define QM_REG_BYTECRDPORT_LSB 0x168228 +/* [RW 32] A bit per physical queue. If the bit is cleared then the physical + queue uses port 0 else it uses port 1; queues 95-64 */ +#define QM_REG_BYTECRDPORT_LSB_EXT_A 0x16e520 +/* [RW 32] A bit per physical queue. If the bit is cleared then the physical + queue uses port 0 else it uses port 1; queues 63-32 */ +#define QM_REG_BYTECRDPORT_MSB 0x168224 +/* [RW 32] A bit per physical queue. If the bit is cleared then the physical + queue uses port 0 else it uses port 1; queues 127-96 */ +#define QM_REG_BYTECRDPORT_MSB_EXT_A 0x16e51c +/* [RW 16] The byte credit value that if above the QM is considered almost + full */ +#define QM_REG_BYTECREDITAFULLTHR 0x168094 +/* [RW 4] The initial credit for interface */ +#define QM_REG_CMINITCRD_0 0x1680cc +#define QM_REG_CMINITCRD_1 0x1680d0 +#define QM_REG_CMINITCRD_2 0x1680d4 +#define QM_REG_CMINITCRD_3 0x1680d8 +#define QM_REG_CMINITCRD_4 0x1680dc +#define QM_REG_CMINITCRD_5 0x1680e0 +#define QM_REG_CMINITCRD_6 0x1680e4 +#define QM_REG_CMINITCRD_7 0x1680e8 +/* [RW 8] A mask bit per CM interface. If this bit is 0 then this interface + is masked */ +#define QM_REG_CMINTEN 0x1680ec +/* [RW 12] A bit vector which indicates which one of the queues are tied to + interface 0 */ +#define QM_REG_CMINTVOQMASK_0 0x1681f4 +#define QM_REG_CMINTVOQMASK_1 0x1681f8 +#define QM_REG_CMINTVOQMASK_2 0x1681fc +#define QM_REG_CMINTVOQMASK_3 0x168200 +#define QM_REG_CMINTVOQMASK_4 0x168204 +#define QM_REG_CMINTVOQMASK_5 0x168208 +#define QM_REG_CMINTVOQMASK_6 0x16820c +#define QM_REG_CMINTVOQMASK_7 0x168210 +/* [RW 20] The number of connections divided by 16 which dictates the size + of each queue which belongs to even function number. */ +#define QM_REG_CONNNUM_0 0x168020 +/* [R 6] Keep the fill level of the fifo from write client 4 */ +#define QM_REG_CQM_WRC_FIFOLVL 0x168018 +/* [RW 8] The context regions sent in the CFC load request */ +#define QM_REG_CTXREG_0 0x168030 +#define QM_REG_CTXREG_1 0x168034 +#define QM_REG_CTXREG_2 0x168038 +#define QM_REG_CTXREG_3 0x16803c +/* [RW 12] The VOQ mask used to select the VOQs which needs to be full for + bypass enable */ +#define QM_REG_ENBYPVOQMASK 0x16823c +/* [RW 32] A bit mask per each physical queue. If a bit is set then the + physical queue uses the byte credit; queues 31-0 */ +#define QM_REG_ENBYTECRD_LSB 0x168220 +/* [RW 32] A bit mask per each physical queue. If a bit is set then the + physical queue uses the byte credit; queues 95-64 */ +#define QM_REG_ENBYTECRD_LSB_EXT_A 0x16e518 +/* [RW 32] A bit mask per each physical queue. If a bit is set then the + physical queue uses the byte credit; queues 63-32 */ +#define QM_REG_ENBYTECRD_MSB 0x16821c +/* [RW 32] A bit mask per each physical queue. If a bit is set then the + physical queue uses the byte credit; queues 127-96 */ +#define QM_REG_ENBYTECRD_MSB_EXT_A 0x16e514 +/* [RW 4] If cleared then the secondary interface will not be served by the + RR arbiter */ +#define QM_REG_ENSEC 0x1680f0 +/* [RW 32] NA */ +#define QM_REG_FUNCNUMSEL_LSB 0x168230 +/* [RW 32] NA */ +#define QM_REG_FUNCNUMSEL_MSB 0x16822c +/* [RW 32] A mask register to mask the Almost empty signals which will not + be use for the almost empty indication to the HW block; queues 31:0 */ +#define QM_REG_HWAEMPTYMASK_LSB 0x168218 +/* [RW 32] A mask register to mask the Almost empty signals which will not + be use for the almost empty indication to the HW block; queues 95-64 */ +#define QM_REG_HWAEMPTYMASK_LSB_EXT_A 0x16e510 +/* [RW 32] A mask register to mask the Almost empty signals which will not + be use for the almost empty indication to the HW block; queues 63:32 */ +#define QM_REG_HWAEMPTYMASK_MSB 0x168214 +/* [RW 32] A mask register to mask the Almost empty signals which will not + be use for the almost empty indication to the HW block; queues 127-96 */ +#define QM_REG_HWAEMPTYMASK_MSB_EXT_A 0x16e50c +/* [RW 4] The number of outstanding request to CFC */ +#define QM_REG_OUTLDREQ 0x168804 +/* [RC 1] A flag to indicate that overflow error occurred in one of the + queues. */ +#define QM_REG_OVFERROR 0x16805c +/* [RC 7] the Q were the qverflow occurs */ +#define QM_REG_OVFQNUM 0x168058 +/* [R 16] Pause state for physical queues 15-0 */ +#define QM_REG_PAUSESTATE0 0x168410 +/* [R 16] Pause state for physical queues 31-16 */ +#define QM_REG_PAUSESTATE1 0x168414 +/* [R 16] Pause state for physical queues 47-32 */ +#define QM_REG_PAUSESTATE2 0x16e684 +/* [R 16] Pause state for physical queues 63-48 */ +#define QM_REG_PAUSESTATE3 0x16e688 +/* [R 16] Pause state for physical queues 79-64 */ +#define QM_REG_PAUSESTATE4 0x16e68c +/* [R 16] Pause state for physical queues 95-80 */ +#define QM_REG_PAUSESTATE5 0x16e690 +/* [R 16] Pause state for physical queues 111-96 */ +#define QM_REG_PAUSESTATE6 0x16e694 +/* [R 16] Pause state for physical queues 127-112 */ +#define QM_REG_PAUSESTATE7 0x16e698 +/* [RW 2] The PCI attributes field used in the PCI request. */ +#define QM_REG_PCIREQAT 0x168054 +/* [R 16] The byte credit of port 0 */ +#define QM_REG_PORT0BYTECRD 0x168300 +/* [R 16] The byte credit of port 1 */ +#define QM_REG_PORT1BYTECRD 0x168304 +/* [RW 3] pci function number of queues 15-0 */ +#define QM_REG_PQ2PCIFUNC_0 0x16e6bc +#define QM_REG_PQ2PCIFUNC_1 0x16e6c0 +#define QM_REG_PQ2PCIFUNC_2 0x16e6c4 +#define QM_REG_PQ2PCIFUNC_3 0x16e6c8 +#define QM_REG_PQ2PCIFUNC_4 0x16e6cc +#define QM_REG_PQ2PCIFUNC_5 0x16e6d0 +#define QM_REG_PQ2PCIFUNC_6 0x16e6d4 +#define QM_REG_PQ2PCIFUNC_7 0x16e6d8 +/* [WB 54] Pointer Table Memory for queues 63-0; The mapping is as follow: + ptrtbl[53:30] read pointer; ptrtbl[29:6] write pointer; ptrtbl[5:4] read + bank0; ptrtbl[3:2] read bank 1; ptrtbl[1:0] write bank; */ +#define QM_REG_PTRTBL 0x168a00 +/* [WB 54] Pointer Table Memory for queues 127-64; The mapping is as follow: + ptrtbl[53:30] read pointer; ptrtbl[29:6] write pointer; ptrtbl[5:4] read + bank0; ptrtbl[3:2] read bank 1; ptrtbl[1:0] write bank; */ +#define QM_REG_PTRTBL_EXT_A 0x16e200 +/* [RW 2] Interrupt mask register #0 read/write */ +#define QM_REG_QM_INT_MASK 0x168444 +/* [R 2] Interrupt register #0 read */ +#define QM_REG_QM_INT_STS 0x168438 +/* [RW 12] Parity mask register #0 read/write */ +#define QM_REG_QM_PRTY_MASK 0x168454 +/* [R 12] Parity register #0 read */ +#define QM_REG_QM_PRTY_STS 0x168448 +/* [R 32] Current queues in pipeline: Queues from 32 to 63 */ +#define QM_REG_QSTATUS_HIGH 0x16802c +/* [R 32] Current queues in pipeline: Queues from 96 to 127 */ +#define QM_REG_QSTATUS_HIGH_EXT_A 0x16e408 +/* [R 32] Current queues in pipeline: Queues from 0 to 31 */ +#define QM_REG_QSTATUS_LOW 0x168028 +/* [R 32] Current queues in pipeline: Queues from 64 to 95 */ +#define QM_REG_QSTATUS_LOW_EXT_A 0x16e404 +/* [R 24] The number of tasks queued for each queue; queues 63-0 */ +#define QM_REG_QTASKCTR_0 0x168308 +/* [R 24] The number of tasks queued for each queue; queues 127-64 */ +#define QM_REG_QTASKCTR_EXT_A_0 0x16e584 +/* [RW 4] Queue tied to VOQ */ +#define QM_REG_QVOQIDX_0 0x1680f4 +#define QM_REG_QVOQIDX_10 0x16811c +#define QM_REG_QVOQIDX_100 0x16e49c +#define QM_REG_QVOQIDX_101 0x16e4a0 +#define QM_REG_QVOQIDX_102 0x16e4a4 +#define QM_REG_QVOQIDX_103 0x16e4a8 +#define QM_REG_QVOQIDX_104 0x16e4ac +#define QM_REG_QVOQIDX_105 0x16e4b0 +#define QM_REG_QVOQIDX_106 0x16e4b4 +#define QM_REG_QVOQIDX_107 0x16e4b8 +#define QM_REG_QVOQIDX_108 0x16e4bc +#define QM_REG_QVOQIDX_109 0x16e4c0 +#define QM_REG_QVOQIDX_100 0x16e49c +#define QM_REG_QVOQIDX_101 0x16e4a0 +#define QM_REG_QVOQIDX_102 0x16e4a4 +#define QM_REG_QVOQIDX_103 0x16e4a8 +#define QM_REG_QVOQIDX_104 0x16e4ac +#define QM_REG_QVOQIDX_105 0x16e4b0 +#define QM_REG_QVOQIDX_106 0x16e4b4 +#define QM_REG_QVOQIDX_107 0x16e4b8 +#define QM_REG_QVOQIDX_108 0x16e4bc +#define QM_REG_QVOQIDX_109 0x16e4c0 +#define QM_REG_QVOQIDX_11 0x168120 +#define QM_REG_QVOQIDX_110 0x16e4c4 +#define QM_REG_QVOQIDX_111 0x16e4c8 +#define QM_REG_QVOQIDX_112 0x16e4cc +#define QM_REG_QVOQIDX_113 0x16e4d0 +#define QM_REG_QVOQIDX_114 0x16e4d4 +#define QM_REG_QVOQIDX_115 0x16e4d8 +#define QM_REG_QVOQIDX_116 0x16e4dc +#define QM_REG_QVOQIDX_117 0x16e4e0 +#define QM_REG_QVOQIDX_118 0x16e4e4 +#define QM_REG_QVOQIDX_119 0x16e4e8 +#define QM_REG_QVOQIDX_110 0x16e4c4 +#define QM_REG_QVOQIDX_111 0x16e4c8 +#define QM_REG_QVOQIDX_112 0x16e4cc +#define QM_REG_QVOQIDX_113 0x16e4d0 +#define QM_REG_QVOQIDX_114 0x16e4d4 +#define QM_REG_QVOQIDX_115 0x16e4d8 +#define QM_REG_QVOQIDX_116 0x16e4dc +#define QM_REG_QVOQIDX_117 0x16e4e0 +#define QM_REG_QVOQIDX_118 0x16e4e4 +#define QM_REG_QVOQIDX_119 0x16e4e8 +#define QM_REG_QVOQIDX_12 0x168124 +#define QM_REG_QVOQIDX_120 0x16e4ec +#define QM_REG_QVOQIDX_121 0x16e4f0 +#define QM_REG_QVOQIDX_122 0x16e4f4 +#define QM_REG_QVOQIDX_123 0x16e4f8 +#define QM_REG_QVOQIDX_124 0x16e4fc +#define QM_REG_QVOQIDX_125 0x16e500 +#define QM_REG_QVOQIDX_126 0x16e504 +#define QM_REG_QVOQIDX_127 0x16e508 +#define QM_REG_QVOQIDX_120 0x16e4ec +#define QM_REG_QVOQIDX_121 0x16e4f0 +#define QM_REG_QVOQIDX_122 0x16e4f4 +#define QM_REG_QVOQIDX_123 0x16e4f8 +#define QM_REG_QVOQIDX_124 0x16e4fc +#define QM_REG_QVOQIDX_125 0x16e500 +#define QM_REG_QVOQIDX_126 0x16e504 +#define QM_REG_QVOQIDX_127 0x16e508 +#define QM_REG_QVOQIDX_13 0x168128 +#define QM_REG_QVOQIDX_14 0x16812c +#define QM_REG_QVOQIDX_15 0x168130 +#define QM_REG_QVOQIDX_16 0x168134 +#define QM_REG_QVOQIDX_17 0x168138 +#define QM_REG_QVOQIDX_21 0x168148 +#define QM_REG_QVOQIDX_22 0x16814c +#define QM_REG_QVOQIDX_23 0x168150 +#define QM_REG_QVOQIDX_24 0x168154 +#define QM_REG_QVOQIDX_25 0x168158 +#define QM_REG_QVOQIDX_26 0x16815c +#define QM_REG_QVOQIDX_27 0x168160 +#define QM_REG_QVOQIDX_28 0x168164 +#define QM_REG_QVOQIDX_29 0x168168 +#define QM_REG_QVOQIDX_30 0x16816c +#define QM_REG_QVOQIDX_31 0x168170 +#define QM_REG_QVOQIDX_32 0x168174 +#define QM_REG_QVOQIDX_33 0x168178 +#define QM_REG_QVOQIDX_34 0x16817c +#define QM_REG_QVOQIDX_35 0x168180 +#define QM_REG_QVOQIDX_36 0x168184 +#define QM_REG_QVOQIDX_37 0x168188 +#define QM_REG_QVOQIDX_38 0x16818c +#define QM_REG_QVOQIDX_39 0x168190 +#define QM_REG_QVOQIDX_40 0x168194 +#define QM_REG_QVOQIDX_41 0x168198 +#define QM_REG_QVOQIDX_42 0x16819c +#define QM_REG_QVOQIDX_43 0x1681a0 +#define QM_REG_QVOQIDX_44 0x1681a4 +#define QM_REG_QVOQIDX_45 0x1681a8 +#define QM_REG_QVOQIDX_46 0x1681ac +#define QM_REG_QVOQIDX_47 0x1681b0 +#define QM_REG_QVOQIDX_48 0x1681b4 +#define QM_REG_QVOQIDX_49 0x1681b8 +#define QM_REG_QVOQIDX_5 0x168108 +#define QM_REG_QVOQIDX_50 0x1681bc +#define QM_REG_QVOQIDX_51 0x1681c0 +#define QM_REG_QVOQIDX_52 0x1681c4 +#define QM_REG_QVOQIDX_53 0x1681c8 +#define QM_REG_QVOQIDX_54 0x1681cc +#define QM_REG_QVOQIDX_55 0x1681d0 +#define QM_REG_QVOQIDX_56 0x1681d4 +#define QM_REG_QVOQIDX_57 0x1681d8 +#define QM_REG_QVOQIDX_58 0x1681dc +#define QM_REG_QVOQIDX_59 0x1681e0 +#define QM_REG_QVOQIDX_50 0x1681bc +#define QM_REG_QVOQIDX_51 0x1681c0 +#define QM_REG_QVOQIDX_52 0x1681c4 +#define QM_REG_QVOQIDX_53 0x1681c8 +#define QM_REG_QVOQIDX_54 0x1681cc +#define QM_REG_QVOQIDX_55 0x1681d0 +#define QM_REG_QVOQIDX_56 0x1681d4 +#define QM_REG_QVOQIDX_57 0x1681d8 +#define QM_REG_QVOQIDX_58 0x1681dc +#define QM_REG_QVOQIDX_59 0x1681e0 +#define QM_REG_QVOQIDX_6 0x16810c +#define QM_REG_QVOQIDX_60 0x1681e4 +#define QM_REG_QVOQIDX_61 0x1681e8 +#define QM_REG_QVOQIDX_62 0x1681ec +#define QM_REG_QVOQIDX_63 0x1681f0 +#define QM_REG_QVOQIDX_64 0x16e40c +#define QM_REG_QVOQIDX_65 0x16e410 +#define QM_REG_QVOQIDX_66 0x16e414 +#define QM_REG_QVOQIDX_67 0x16e418 +#define QM_REG_QVOQIDX_68 0x16e41c +#define QM_REG_QVOQIDX_69 0x16e420 +#define QM_REG_QVOQIDX_60 0x1681e4 +#define QM_REG_QVOQIDX_61 0x1681e8 +#define QM_REG_QVOQIDX_62 0x1681ec +#define QM_REG_QVOQIDX_63 0x1681f0 +#define QM_REG_QVOQIDX_64 0x16e40c +#define QM_REG_QVOQIDX_65 0x16e410 +#define QM_REG_QVOQIDX_69 0x16e420 +#define QM_REG_QVOQIDX_7 0x168110 +#define QM_REG_QVOQIDX_70 0x16e424 +#define QM_REG_QVOQIDX_71 0x16e428 +#define QM_REG_QVOQIDX_72 0x16e42c +#define QM_REG_QVOQIDX_73 0x16e430 +#define QM_REG_QVOQIDX_74 0x16e434 +#define QM_REG_QVOQIDX_75 0x16e438 +#define QM_REG_QVOQIDX_76 0x16e43c +#define QM_REG_QVOQIDX_77 0x16e440 +#define QM_REG_QVOQIDX_78 0x16e444 +#define QM_REG_QVOQIDX_79 0x16e448 +#define QM_REG_QVOQIDX_70 0x16e424 +#define QM_REG_QVOQIDX_71 0x16e428 +#define QM_REG_QVOQIDX_72 0x16e42c +#define QM_REG_QVOQIDX_73 0x16e430 +#define QM_REG_QVOQIDX_74 0x16e434 +#define QM_REG_QVOQIDX_75 0x16e438 +#define QM_REG_QVOQIDX_76 0x16e43c +#define QM_REG_QVOQIDX_77 0x16e440 +#define QM_REG_QVOQIDX_78 0x16e444 +#define QM_REG_QVOQIDX_79 0x16e448 +#define QM_REG_QVOQIDX_8 0x168114 +#define QM_REG_QVOQIDX_80 0x16e44c +#define QM_REG_QVOQIDX_81 0x16e450 +#define QM_REG_QVOQIDX_82 0x16e454 +#define QM_REG_QVOQIDX_83 0x16e458 +#define QM_REG_QVOQIDX_84 0x16e45c +#define QM_REG_QVOQIDX_85 0x16e460 +#define QM_REG_QVOQIDX_86 0x16e464 +#define QM_REG_QVOQIDX_87 0x16e468 +#define QM_REG_QVOQIDX_88 0x16e46c +#define QM_REG_QVOQIDX_89 0x16e470 +#define QM_REG_QVOQIDX_80 0x16e44c +#define QM_REG_QVOQIDX_81 0x16e450 +#define QM_REG_QVOQIDX_85 0x16e460 +#define QM_REG_QVOQIDX_86 0x16e464 +#define QM_REG_QVOQIDX_87 0x16e468 +#define QM_REG_QVOQIDX_88 0x16e46c +#define QM_REG_QVOQIDX_89 0x16e470 +#define QM_REG_QVOQIDX_9 0x168118 +#define QM_REG_QVOQIDX_90 0x16e474 +#define QM_REG_QVOQIDX_91 0x16e478 +#define QM_REG_QVOQIDX_92 0x16e47c +#define QM_REG_QVOQIDX_93 0x16e480 +#define QM_REG_QVOQIDX_94 0x16e484 +#define QM_REG_QVOQIDX_95 0x16e488 +#define QM_REG_QVOQIDX_96 0x16e48c +#define QM_REG_QVOQIDX_97 0x16e490 +#define QM_REG_QVOQIDX_98 0x16e494 +#define QM_REG_QVOQIDX_99 0x16e498 +#define QM_REG_QVOQIDX_90 0x16e474 +#define QM_REG_QVOQIDX_91 0x16e478 +#define QM_REG_QVOQIDX_92 0x16e47c +#define QM_REG_QVOQIDX_93 0x16e480 +#define QM_REG_QVOQIDX_94 0x16e484 +#define QM_REG_QVOQIDX_95 0x16e488 +#define QM_REG_QVOQIDX_96 0x16e48c +#define QM_REG_QVOQIDX_97 0x16e490 +#define QM_REG_QVOQIDX_98 0x16e494 +#define QM_REG_QVOQIDX_99 0x16e498 +/* [RW 1] Initialization bit command */ +#define QM_REG_SOFT_RESET 0x168428 +/* [RW 8] The credit cost per every task in the QM. A value per each VOQ */ +#define QM_REG_TASKCRDCOST_0 0x16809c +#define QM_REG_TASKCRDCOST_1 0x1680a0 +#define QM_REG_TASKCRDCOST_10 0x1680c4 +#define QM_REG_TASKCRDCOST_11 0x1680c8 +#define QM_REG_TASKCRDCOST_2 0x1680a4 +#define QM_REG_TASKCRDCOST_4 0x1680ac +#define QM_REG_TASKCRDCOST_5 0x1680b0 +/* [R 6] Keep the fill level of the fifo from write client 3 */ +#define QM_REG_TQM_WRC_FIFOLVL 0x168010 +/* [R 6] Keep the fill level of the fifo from write client 2 */ +#define QM_REG_UQM_WRC_FIFOLVL 0x168008 +/* [RC 32] Credit update error register */ +#define QM_REG_VOQCRDERRREG 0x168408 +/* [RW 16] The credit value that if above the QM is considered almost full */ +#define QM_REG_VOQCREDITAFULLTHR 0x168090 +/* [R 16] The credit value for each VOQ */ +#define QM_REG_VOQCREDIT_0 0x1682d0 +#define QM_REG_VOQCREDIT_1 0x1682d4 +#define QM_REG_VOQCREDIT_10 0x1682f8 +#define QM_REG_VOQCREDIT_11 0x1682fc +#define QM_REG_VOQCREDIT_4 0x1682e0 +/* [RW 16] The init and maximum credit for each VoQ */ +#define QM_REG_VOQINITCREDIT_0 0x168060 +#define QM_REG_VOQINITCREDIT_1 0x168064 +#define QM_REG_VOQINITCREDIT_10 0x168088 +#define QM_REG_VOQINITCREDIT_11 0x16808c +#define QM_REG_VOQINITCREDIT_2 0x168068 +#define QM_REG_VOQINITCREDIT_4 0x168070 +#define QM_REG_VOQINITCREDIT_5 0x168074 +/* [RW 1] The port of which VOQ belongs */ +#define QM_REG_VOQPORT_0 0x1682a0 +#define QM_REG_VOQPORT_1 0x1682a4 +#define QM_REG_VOQPORT_10 0x1682c8 +#define QM_REG_VOQPORT_11 0x1682cc +#define QM_REG_VOQPORT_2 0x1682a8 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_0_LSB 0x168240 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_0_LSB_EXT_A 0x16e524 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_0_MSB 0x168244 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_0_MSB_EXT_A 0x16e528 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_10_LSB 0x168290 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_10_LSB_EXT_A 0x16e574 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_10_MSB 0x168294 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_10_MSB_EXT_A 0x16e578 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_11_LSB 0x168298 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_11_LSB_EXT_A 0x16e57c +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_11_MSB 0x16829c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_11_MSB_EXT_A 0x16e580 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_1_LSB 0x168248 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_1_LSB_EXT_A 0x16e52c +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_1_MSB 0x16824c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_1_MSB_EXT_A 0x16e530 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_2_LSB 0x168250 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_2_LSB_EXT_A 0x16e534 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_2_MSB 0x168254 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_2_MSB_EXT_A 0x16e538 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_3_LSB 0x168258 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_3_LSB_EXT_A 0x16e53c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_3_MSB_EXT_A 0x16e540 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_4_LSB 0x168260 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_4_LSB_EXT_A 0x16e544 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_4_MSB 0x168264 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_4_MSB_EXT_A 0x16e548 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_5_LSB 0x168268 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_5_LSB_EXT_A 0x16e54c +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_5_MSB 0x16826c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_5_MSB_EXT_A 0x16e550 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_6_LSB 0x168270 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_6_LSB_EXT_A 0x16e554 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_6_MSB 0x168274 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_6_MSB_EXT_A 0x16e558 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_7_LSB 0x168278 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_7_LSB_EXT_A 0x16e55c +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_7_MSB 0x16827c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_7_MSB_EXT_A 0x16e560 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_8_LSB 0x168280 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_8_LSB_EXT_A 0x16e564 +/* [RW 32] The physical queue number associated with each VOQ; queues 63-32 */ +#define QM_REG_VOQQMASK_8_MSB 0x168284 +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_8_MSB_EXT_A 0x16e568 +/* [RW 32] The physical queue number associated with each VOQ; queues 31-0 */ +#define QM_REG_VOQQMASK_9_LSB 0x168288 +/* [RW 32] The physical queue number associated with each VOQ; queues 95-64 */ +#define QM_REG_VOQQMASK_9_LSB_EXT_A 0x16e56c +/* [RW 32] The physical queue number associated with each VOQ; queues 127-96 */ +#define QM_REG_VOQQMASK_9_MSB_EXT_A 0x16e570 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_0 0x16880c +#define QM_REG_WRRWEIGHTS_1 0x168810 +#define QM_REG_WRRWEIGHTS_10 0x168814 +#define QM_REG_WRRWEIGHTS_10_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_11 0x168818 +#define QM_REG_WRRWEIGHTS_11_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_12 0x16881c +#define QM_REG_WRRWEIGHTS_12_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_13 0x168820 +#define QM_REG_WRRWEIGHTS_13_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_14 0x168824 +#define QM_REG_WRRWEIGHTS_14_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_15 0x168828 +#define QM_REG_WRRWEIGHTS_15_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_16 0x16e000 +#define QM_REG_WRRWEIGHTS_16_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_17 0x16e004 +#define QM_REG_WRRWEIGHTS_17_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_18 0x16e008 +#define QM_REG_WRRWEIGHTS_18_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_19 0x16e00c +#define QM_REG_WRRWEIGHTS_19_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_10 0x168814 +#define QM_REG_WRRWEIGHTS_11 0x168818 +#define QM_REG_WRRWEIGHTS_12 0x16881c +#define QM_REG_WRRWEIGHTS_13 0x168820 +#define QM_REG_WRRWEIGHTS_14 0x168824 +#define QM_REG_WRRWEIGHTS_15 0x168828 +#define QM_REG_WRRWEIGHTS_16 0x16e000 +#define QM_REG_WRRWEIGHTS_17 0x16e004 +#define QM_REG_WRRWEIGHTS_18 0x16e008 +#define QM_REG_WRRWEIGHTS_19 0x16e00c +#define QM_REG_WRRWEIGHTS_2 0x16882c +#define QM_REG_WRRWEIGHTS_20 0x16e010 +#define QM_REG_WRRWEIGHTS_20_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_21 0x16e014 +#define QM_REG_WRRWEIGHTS_21_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_22 0x16e018 +#define QM_REG_WRRWEIGHTS_22_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_23 0x16e01c +#define QM_REG_WRRWEIGHTS_23_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_24 0x16e020 +#define QM_REG_WRRWEIGHTS_24_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_25 0x16e024 +#define QM_REG_WRRWEIGHTS_25_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_26 0x16e028 +#define QM_REG_WRRWEIGHTS_26_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_27 0x16e02c +#define QM_REG_WRRWEIGHTS_27_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_28 0x16e030 +#define QM_REG_WRRWEIGHTS_28_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_29 0x16e034 +#define QM_REG_WRRWEIGHTS_29_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_20 0x16e010 +#define QM_REG_WRRWEIGHTS_21 0x16e014 +#define QM_REG_WRRWEIGHTS_22 0x16e018 +#define QM_REG_WRRWEIGHTS_23 0x16e01c +#define QM_REG_WRRWEIGHTS_24 0x16e020 +#define QM_REG_WRRWEIGHTS_25 0x16e024 +#define QM_REG_WRRWEIGHTS_26 0x16e028 +#define QM_REG_WRRWEIGHTS_27 0x16e02c +#define QM_REG_WRRWEIGHTS_28 0x16e030 +#define QM_REG_WRRWEIGHTS_29 0x16e034 +#define QM_REG_WRRWEIGHTS_3 0x168830 +#define QM_REG_WRRWEIGHTS_30 0x16e038 +#define QM_REG_WRRWEIGHTS_30_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_31 0x16e03c +#define QM_REG_WRRWEIGHTS_31_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_30 0x16e038 +#define QM_REG_WRRWEIGHTS_31 0x16e03c +#define QM_REG_WRRWEIGHTS_4 0x168834 +#define QM_REG_WRRWEIGHTS_5 0x168838 +#define QM_REG_WRRWEIGHTS_6 0x16883c +#define QM_REG_WRRWEIGHTS_7 0x168840 +#define QM_REG_WRRWEIGHTS_8 0x168844 +#define QM_REG_WRRWEIGHTS_9 0x168848 +/* [R 6] Keep the fill level of the fifo from write client 1 */ +#define QM_REG_XQM_WRC_FIFOLVL 0x168000 +#define BRB1_BRB1_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define BRB1_BRB1_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define BRB1_BRB1_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define BRB1_BRB1_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define BRB1_BRB1_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define BRB1_BRB1_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define BRB1_BRB1_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define BRB1_BRB1_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define CCM_CCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define CCM_CCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define CCM_CCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define CCM_CCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define CCM_CCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define CCM_CCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define CCM_CCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define CCM_CCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define CDU_CDU_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define CDU_CDU_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define CDU_CDU_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define CDU_CDU_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define CDU_CDU_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define CDU_CDU_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define CDU_CDU_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define CDU_CDU_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define CFC_CFC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define CFC_CFC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define CFC_CFC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define CFC_CFC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define CFC_CFC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define CFC_CFC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define CFC_CFC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define CFC_CFC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define CSDM_CSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSDM_CSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSDM_CSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSDM_CSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSDM_CSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSDM_CSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSDM_CSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSDM_CSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSEM_CSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSEM_CSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSEM_CSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSEM_CSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSEM_CSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSEM_CSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define CSEM_CSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define CSEM_CSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define DBG_DBG_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define DBG_DBG_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define DBG_DBG_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define DBG_DBG_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define DBG_DBG_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define DBG_DBG_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define DBG_DBG_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define DBG_DBG_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define DMAE_DMAE_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define DMAE_DMAE_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define DMAE_DMAE_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define DMAE_DMAE_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define DMAE_DMAE_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define DMAE_DMAE_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define DMAE_DMAE_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define DMAE_DMAE_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define DORQ_DORQ_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define DORQ_DORQ_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define DORQ_DORQ_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define DORQ_DORQ_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define DORQ_DORQ_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define DORQ_DORQ_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define DORQ_DORQ_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define DORQ_DORQ_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define HC_HC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define HC_HC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define HC_HC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define HC_HC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define HC_HC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define HC_HC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define HC_HC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define HC_HC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define MISC_MISC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define MISC_MISC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define MISC_MISC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define MISC_MISC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define MISC_MISC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define MISC_MISC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define MISC_MISC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define MISC_MISC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define NIG_NIG_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define NIG_NIG_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define NIG_NIG_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define NIG_NIG_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define NIG_NIG_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define NIG_NIG_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define NIG_NIG_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define NIG_NIG_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define PBF_PBF_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define PBF_PBF_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define PBF_PBF_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define PBF_PBF_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define PBF_PBF_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define PBF_PBF_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define PBF_PBF_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define PBF_PBF_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define PB_PB_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define PB_PB_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define PB_PB_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define PB_PB_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define PB_PB_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define PB_PB_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define PB_PB_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define PB_PB_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define PRS_PRS_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define PRS_PRS_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define PRS_PRS_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define PRS_PRS_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define PRS_PRS_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define PRS_PRS_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define PRS_PRS_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define PRS_PRS_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define PXP2_PXP2_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP2_PXP2_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP2_PXP2_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP2_PXP2_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP2_PXP2_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP2_PXP2_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP2_PXP2_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP2_PXP2_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP_PXP_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP_PXP_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP_PXP_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP_PXP_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP_PXP_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP_PXP_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define PXP_PXP_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define PXP_PXP_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define QM_QM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define QM_QM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define QM_QM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define QM_QM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define QM_QM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define QM_QM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define QM_QM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define QM_QM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define SEM_FAST_SEM_FAST_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define SEM_FAST_SEM_FAST_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define SEM_FAST_SEM_FAST_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define SEM_FAST_SEM_FAST_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define SEM_FAST_SEM_FAST_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define SEM_FAST_SEM_FAST_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define SEM_FAST_SEM_FAST_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define SEM_FAST_SEM_FAST_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define SRC_SRC_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define SRC_SRC_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define SRC_SRC_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define SRC_SRC_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define SRC_SRC_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define SRC_SRC_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define SRC_SRC_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define SRC_SRC_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define TCM_TCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define TCM_TCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define TCM_TCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define TCM_TCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define TCM_TCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define TCM_TCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define TCM_TCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define TCM_TCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define TM_TM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define TM_TM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define TM_TM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define TM_TM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define TM_TM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define TM_TM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define TM_TM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define TM_TM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define TSDM_TSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSDM_TSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSDM_TSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSDM_TSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSDM_TSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSDM_TSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSDM_TSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSDM_TSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSEM_TSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSEM_TSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSEM_TSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSEM_TSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSEM_TSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSEM_TSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define TSEM_TSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define TSEM_TSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define UCM_UCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define UCM_UCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define UCM_UCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define UCM_UCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define UCM_UCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define UCM_UCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define UCM_UCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define UCM_UCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define USDM_USDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define USDM_USDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define USDM_USDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define USDM_USDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define USDM_USDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define USDM_USDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define USDM_USDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define USDM_USDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define USEM_USEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define USEM_USEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define USEM_USEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define USEM_USEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define USEM_USEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define USEM_USEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define USEM_USEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define USEM_USEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define XCM_XCM_INT_STS_REG_ADDRESS_ERROR (0x1<<0) +#define XCM_XCM_INT_STS_REG_ADDRESS_ERROR_SIZE 0 +#define XCM_XCM_INT_STS_CLR_REG_ADDRESS_ERROR (0x1<<0) +#define XCM_XCM_INT_STS_CLR_REG_ADDRESS_ERROR_SIZE 0 +#define XCM_XCM_INT_STS_WR_REG_ADDRESS_ERROR (0x1<<0) +#define XCM_XCM_INT_STS_WR_REG_ADDRESS_ERROR_SIZE 0 +#define XCM_XCM_INT_MASK_REG_ADDRESS_ERROR (0x1<<0) +#define XCM_XCM_INT_MASK_REG_ADDRESS_ERROR_SIZE 0 +#define XSDM_XSDM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSDM_XSDM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSDM_XSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSDM_XSDM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSDM_XSDM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSDM_XSDM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSDM_XSDM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSDM_XSDM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSEM_XSEM_INT_STS_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSEM_XSEM_INT_STS_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSEM_XSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSEM_XSEM_INT_STS_CLR_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSEM_XSEM_INT_STS_WR_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSEM_XSEM_INT_STS_WR_0_REG_ADDRESS_ERROR_SIZE 0 +#define XSEM_XSEM_INT_MASK_0_REG_ADDRESS_ERROR (0x1<<0) +#define XSEM_XSEM_INT_MASK_0_REG_ADDRESS_ERROR_SIZE 0 +#define CFC_DEBUG1_REG_WRITE_AC (0x1<<4) +#define CFC_DEBUG1_REG_WRITE_AC_SIZE 4 +/* [R 1] debug only: This bit indicates whether indicates that external + buffer was wrapped (oldest data was thrown); Relevant only when + ~dbg_registers_debug_target=2 (PCI) & ~dbg_registers_full_mode=1 (wrap); */ +#define DBG_REG_WRAP_ON_EXT_BUFFER 0xc124 +#define DBG_REG_WRAP_ON_EXT_BUFFER_SIZE 1 +/* [R 1] debug only: This bit indicates whether the internal buffer was + wrapped (oldest data was thrown) Relevant only when + ~dbg_registers_debug_target=0 (internal buffer) */ +#define DBG_REG_WRAP_ON_INT_BUFFER 0xc128 +#define DBG_REG_WRAP_ON_INT_BUFFER_SIZE 1 +#define QM_QM_PRTY_STS_REG_WRBUFF (0x1<<8) +#define QM_QM_PRTY_STS_REG_WRBUFF_SIZE 8 +#define QM_QM_PRTY_STS_CLR_REG_WRBUFF (0x1<<8) +#define QM_QM_PRTY_STS_CLR_REG_WRBUFF_SIZE 8 +#define QM_QM_PRTY_STS_WR_REG_WRBUFF (0x1<<8) +#define QM_QM_PRTY_STS_WR_REG_WRBUFF_SIZE 8 +#define QM_QM_PRTY_MASK_REG_WRBUFF (0x1<<8) +#define QM_QM_PRTY_MASK_REG_WRBUFF_SIZE 8 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_0 0x16880c +#define QM_REG_WRRWEIGHTS_0_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_1 0x168810 +#define QM_REG_WRRWEIGHTS_1_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_10 0x168814 +#define QM_REG_WRRWEIGHTS_10_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_11 0x168818 +#define QM_REG_WRRWEIGHTS_11_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_12 0x16881c +#define QM_REG_WRRWEIGHTS_12_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_13 0x168820 +#define QM_REG_WRRWEIGHTS_13_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_14 0x168824 +#define QM_REG_WRRWEIGHTS_14_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_15 0x168828 +#define QM_REG_WRRWEIGHTS_15_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_2 0x16882c +#define QM_REG_WRRWEIGHTS_2_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_3 0x168830 +#define QM_REG_WRRWEIGHTS_3_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_4 0x168834 +#define QM_REG_WRRWEIGHTS_4_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_5 0x168838 +#define QM_REG_WRRWEIGHTS_5_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_6 0x16883c +#define QM_REG_WRRWEIGHTS_6_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_7 0x168840 +#define QM_REG_WRRWEIGHTS_7_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_8 0x168844 +#define QM_REG_WRRWEIGHTS_8_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_9 0x168848 +#define QM_REG_WRRWEIGHTS_9_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_16 0x16e000 +#define QM_REG_WRRWEIGHTS_16_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_17 0x16e004 +#define QM_REG_WRRWEIGHTS_17_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_18 0x16e008 +#define QM_REG_WRRWEIGHTS_18_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_19 0x16e00c +#define QM_REG_WRRWEIGHTS_19_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_20 0x16e010 +#define QM_REG_WRRWEIGHTS_20_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_21 0x16e014 +#define QM_REG_WRRWEIGHTS_21_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_22 0x16e018 +#define QM_REG_WRRWEIGHTS_22_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_23 0x16e01c +#define QM_REG_WRRWEIGHTS_23_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_24 0x16e020 +#define QM_REG_WRRWEIGHTS_24_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_25 0x16e024 +#define QM_REG_WRRWEIGHTS_25_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_26 0x16e028 +#define QM_REG_WRRWEIGHTS_26_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_27 0x16e02c +#define QM_REG_WRRWEIGHTS_27_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_28 0x16e030 +#define QM_REG_WRRWEIGHTS_28_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_29 0x16e034 +#define QM_REG_WRRWEIGHTS_29_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_30 0x16e038 +#define QM_REG_WRRWEIGHTS_30_SIZE 1 +/* [RW 32] Wrr weights */ +#define QM_REG_WRRWEIGHTS_31 0x16e03c +#define QM_REG_WRRWEIGHTS_31_SIZE 1 +#define SRC_REG_COUNTFREE0 0x40500 +/* [RW 1] If clr the searcher is compatible to E1 A0 - support only two + ports. If set the searcher support 8 functions. */ +#define SRC_REG_E1HMF_ENABLE 0x404cc +#define SRC_REG_FIRSTFREE0 0x40510 +#define SRC_REG_KEYRSS0_0 0x40408 +#define SRC_REG_KEYRSS0_7 0x40424 +#define SRC_REG_KEYRSS1_9 0x40454 +#define SRC_REG_KEYSEARCH_0 0x40458 +#define SRC_REG_KEYSEARCH_1 0x4045c +#define SRC_REG_KEYSEARCH_2 0x40460 +#define SRC_REG_KEYSEARCH_3 0x40464 +#define SRC_REG_KEYSEARCH_4 0x40468 +#define SRC_REG_KEYSEARCH_5 0x4046c +#define SRC_REG_KEYSEARCH_6 0x40470 +#define SRC_REG_KEYSEARCH_7 0x40474 +#define SRC_REG_KEYSEARCH_8 0x40478 +#define SRC_REG_KEYSEARCH_9 0x4047c +#define SRC_REG_LASTFREE0 0x40530 +#define SRC_REG_NUMBER_HASH_BITS0 0x40400 +/* [RW 1] Reset internal state machines. */ +#define SRC_REG_SOFT_RST 0x4049c +/* [R 3] Interrupt register #0 read */ +#define SRC_REG_SRC_INT_STS 0x404ac +/* [RW 3] Parity mask register #0 read/write */ +#define SRC_REG_SRC_PRTY_MASK 0x404c8 +/* [R 3] Parity register #0 read */ +#define SRC_REG_SRC_PRTY_STS 0x404bc +/* [R 4] Used to read the value of the XX protection CAM occupancy counter. */ +#define TCM_REG_CAM_OCCUP 0x5017c +/* [RW 1] CDU AG read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define TCM_REG_CDU_AG_RD_IFEN 0x50034 +/* [RW 1] CDU AG write Interface enable. If 0 - the request and valid input + are disregarded; all other signals are treated as usual; if 1 - normal + activity. */ +#define TCM_REG_CDU_AG_WR_IFEN 0x50030 +/* [RW 1] CDU STORM read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define TCM_REG_CDU_SM_RD_IFEN 0x5003c +/* [RW 1] CDU STORM write Interface enable. If 0 - the request and valid + input is disregarded; all other signals are treated as usual; if 1 - + normal activity. */ +#define TCM_REG_CDU_SM_WR_IFEN 0x50038 +/* [RW 4] CFC output initial credit. Max credit available - 15.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 1 at start-up. */ +#define TCM_REG_CFC_INIT_CRD 0x50204 +/* [RW 3] The weight of the CP input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_CP_WEIGHT 0x500c0 +/* [RW 1] Input csem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define TCM_REG_CSEM_IFEN 0x5002c +/* [RC 1] Message length mismatch (relative to last indication) at the In#9 + interface. */ +#define TCM_REG_CSEM_LENGTH_MIS 0x50174 +/* [RW 3] The weight of the input csem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_CSEM_WEIGHT 0x500bc +/* [RW 8] The Event ID in case of ErrorFlg is set in the input message. */ +#define TCM_REG_ERR_EVNT_ID 0x500a0 +/* [RW 28] The CM erroneous header for QM and Timers formatting. */ +#define TCM_REG_ERR_TCM_HDR 0x5009c +/* [RW 8] The Event ID for Timers expiration. */ +#define TCM_REG_EXPR_EVNT_ID 0x500a4 +/* [RW 8] FIC0 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define TCM_REG_FIC0_INIT_CRD 0x5020c +/* [RW 8] FIC1 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define TCM_REG_FIC1_INIT_CRD 0x50210 +/* [RW 1] Arbitration between Input Arbiter groups: 0 - fair Round-Robin; 1 + - strict priority defined by ~tcm_registers_gr_ag_pr.gr_ag_pr; + ~tcm_registers_gr_ld0_pr.gr_ld0_pr and + ~tcm_registers_gr_ld1_pr.gr_ld1_pr. */ +#define TCM_REG_GR_ARB_TYPE 0x50114 +/* [RW 2] Load (FIC0) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Store channel is the + compliment of the other 3 groups. */ +#define TCM_REG_GR_LD0_PR 0x5011c +/* [RW 2] Load (FIC1) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Store channel is the + compliment of the other 3 groups. */ +#define TCM_REG_GR_LD1_PR 0x50120 +/* [RW 4] The number of double REG-pairs; loaded from the STORM context and + sent to STORM; for a specific connection type. The double REG-pairs are + used to align to STORM context row size of 128 bits. The offset of these + data in the STORM context is always 0. Index _i stands for the connection + type (one of 16). */ +#define TCM_REG_N_SM_CTX_LD_0 0x50050 +#define TCM_REG_N_SM_CTX_LD_1 0x50054 +#define TCM_REG_N_SM_CTX_LD_10 0x50078 +#define TCM_REG_N_SM_CTX_LD_11 0x5007c +#define TCM_REG_N_SM_CTX_LD_12 0x50080 +#define TCM_REG_N_SM_CTX_LD_13 0x50084 +#define TCM_REG_N_SM_CTX_LD_14 0x50088 +#define TCM_REG_N_SM_CTX_LD_15 0x5008c +#define TCM_REG_N_SM_CTX_LD_2 0x50058 +#define TCM_REG_N_SM_CTX_LD_3 0x5005c +#define TCM_REG_N_SM_CTX_LD_4 0x50060 +#define TCM_REG_N_SM_CTX_LD_5 0x50064 +/* [RW 1] Input pbf Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_PBF_IFEN 0x50024 +/* [RC 1] Message length mismatch (relative to last indication) at the In#7 + interface. */ +#define TCM_REG_PBF_LENGTH_MIS 0x5016c +/* [RW 3] The weight of the input pbf in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_PBF_WEIGHT 0x500b4 +#define TCM_REG_PHYS_QNUM0_0 0x500e0 +#define TCM_REG_PHYS_QNUM0_1 0x500e4 +#define TCM_REG_PHYS_QNUM1_0 0x500e8 +#define TCM_REG_PHYS_QNUM1_1 0x500ec +#define TCM_REG_PHYS_QNUM2_0 0x500f0 +#define TCM_REG_PHYS_QNUM2_1 0x500f4 +#define TCM_REG_PHYS_QNUM3_0 0x500f8 +#define TCM_REG_PHYS_QNUM3_1 0x500fc +/* [RW 1] Input prs Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_PRS_IFEN 0x50020 +/* [RC 1] Message length mismatch (relative to last indication) at the In#6 + interface. */ +#define TCM_REG_PRS_LENGTH_MIS 0x50168 +/* [RW 3] The weight of the input prs in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_PRS_WEIGHT 0x500b0 +/* [RW 8] The Event ID for Timers formatting in case of stop done. */ +#define TCM_REG_STOP_EVNT_ID 0x500a8 +/* [RC 1] Message length mismatch (relative to last indication) at the STORM + interface. */ +#define TCM_REG_STORM_LENGTH_MIS 0x50160 +/* [RW 1] STORM - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define TCM_REG_STORM_TCM_IFEN 0x50010 +/* [RW 3] The weight of the STORM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_STORM_WEIGHT 0x500ac +/* [RW 1] CM - CFC Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TCM_CFC_IFEN 0x50040 +/* [RW 11] Interrupt mask register #0 read/write */ +#define TCM_REG_TCM_INT_MASK 0x501dc +/* [R 11] Interrupt register #0 read */ +#define TCM_REG_TCM_INT_STS 0x501d0 +/* [R 27] Parity register #0 read */ +#define TCM_REG_TCM_PRTY_STS 0x501e0 +/* [RW 3] The size of AG context region 0 in REG-pairs. Designates the MS + REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). + Is used to determine the number of the AG context REG-pairs written back; + when the input message Reg1WbFlg isn't set. */ +#define TCM_REG_TCM_REG0_SZ 0x500d8 +/* [RW 1] CM - STORM 0 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TCM_STORM0_IFEN 0x50004 +/* [RW 1] CM - STORM 1 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TCM_STORM1_IFEN 0x50008 +/* [RW 1] CM - QM Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TCM_TQM_IFEN 0x5000c +/* [RW 1] If set the Q index; received from the QM is inserted to event ID. */ +#define TCM_REG_TCM_TQM_USE_Q 0x500d4 +/* [RW 28] The CM header for Timers expiration command. */ +#define TCM_REG_TM_TCM_HDR 0x50098 +/* [RW 1] Timers - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define TCM_REG_TM_TCM_IFEN 0x5001c +/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_TM_WEIGHT 0x500d0 +/* [RW 6] QM output initial credit. Max credit available - 32.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 32 at start-up. */ +#define TCM_REG_TQM_INIT_CRD 0x5021c +/* [RW 3] The weight of the QM (primary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_TQM_P_WEIGHT 0x500c8 +/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_TQM_S_WEIGHT 0x500cc +/* [RW 28] The CM header value for QM request (primary). */ +#define TCM_REG_TQM_TCM_HDR_P 0x50090 +/* [RW 28] The CM header value for QM request (secondary). */ +#define TCM_REG_TQM_TCM_HDR_S 0x50094 +/* [RW 1] QM - CM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TQM_TCM_IFEN 0x50014 +/* [RW 1] Input SDM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define TCM_REG_TSDM_IFEN 0x50018 +/* [RC 1] Message length mismatch (relative to last indication) at the SDM + interface. */ +#define TCM_REG_TSDM_LENGTH_MIS 0x50164 +/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_TSDM_WEIGHT 0x500c4 +/* [RW 1] Input usem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define TCM_REG_USEM_IFEN 0x50028 +/* [RC 1] Message length mismatch (relative to last indication) at the In#8 + interface. */ +#define TCM_REG_USEM_LENGTH_MIS 0x50170 +/* [RW 3] The weight of the input usem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define TCM_REG_USEM_WEIGHT 0x500b8 +/* [RW 21] Indirect access to the descriptor table of the XX protection + mechanism. The fields are: [5:0] - length of the message; 15:6] - message + pointer; 20:16] - next pointer. */ +#define TCM_REG_XX_DESCR_TABLE 0x50280 +#define TCM_REG_XX_DESCR_TABLE_SIZE 32 +/* [R 6] Use to read the value of XX protection Free counter. */ +#define TCM_REG_XX_FREE 0x50178 +/* [RW 6] Initial value for the credit counter; responsible for fulfilling + of the Input Stage XX protection buffer by the XX protection pending + messages. Max credit available - 127.Write writes the initial credit + value; read returns the current value of the credit counter. Must be + initialized to 19 at start-up. */ +#define TCM_REG_XX_INIT_CRD 0x50220 +/* [RW 6] Maximum link list size (messages locked) per connection in the XX + protection. */ +#define TCM_REG_XX_MAX_LL_SZ 0x50044 +/* [RW 6] The maximum number of pending messages; which may be stored in XX + protection. ~tcm_registers_xx_free.xx_free is read on read. */ +#define TCM_REG_XX_MSG_NUM 0x50224 +/* [RW 8] The Event ID; sent to the STORM in case of XX overflow. */ +#define TCM_REG_XX_OVFL_EVNT_ID 0x50048 +/* [RW 16] Indirect access to the XX table of the XX protection mechanism. + The fields are:[4:0] - tail pointer; [10:5] - Link List size; 15:11] - + header pointer. */ +#define TCM_REG_XX_TABLE 0x50240 +/* [RW 4] Load value for for cfc ac credit cnt. */ +#define TM_REG_CFC_AC_CRDCNT_VAL 0x164208 +/* [RW 4] Load value for cfc cld credit cnt. */ +#define TM_REG_CFC_CLD_CRDCNT_VAL 0x164210 +/* [RW 8] Client0 context region. */ +#define TM_REG_CL0_CONT_REGION 0x164030 +/* [RW 8] Client1 context region. */ +#define TM_REG_CL1_CONT_REGION 0x164034 +/* [RW 8] Client2 context region. */ +#define TM_REG_CL2_CONT_REGION 0x164038 +/* [RW 2] Client in High priority client number. */ +#define TM_REG_CLIN_PRIOR0_CLIENT 0x164024 +/* [RW 4] Load value for clout0 cred cnt. */ +#define TM_REG_CLOUT_CRDCNT0_VAL 0x164220 +/* [RW 4] Load value for clout1 cred cnt. */ +#define TM_REG_CLOUT_CRDCNT1_VAL 0x164228 +/* [RW 4] Load value for clout2 cred cnt. */ +#define TM_REG_CLOUT_CRDCNT2_VAL 0x164230 +/* [RW 1] Enable client0 input. */ +#define TM_REG_EN_CL0_INPUT 0x164008 +/* [RW 1] Enable client1 input. */ +#define TM_REG_EN_CL1_INPUT 0x16400c +/* [RW 1] Enable client2 input. */ +#define TM_REG_EN_CL2_INPUT 0x164010 +#define TM_REG_EN_LINEAR0_TIMER 0x164014 +/* [RW 1] Enable real time counter. */ +#define TM_REG_EN_REAL_TIME_CNT 0x1640d8 +/* [RW 1] Enable for Timers state machines. */ +#define TM_REG_EN_TIMERS 0x164000 +/* [RW 4] Load value for expiration credit cnt. CFC max number of + outstanding load requests for timers (expiration) context loading. */ +#define TM_REG_EXP_CRDCNT_VAL 0x164238 +/* [RW 32] Linear0 logic address. */ +#define TM_REG_LIN0_LOGIC_ADDR 0x164240 +/* [RW 18] Linear0 Max active cid (in banks of 32 entries). */ +#define TM_REG_LIN0_MAX_ACTIVE_CID 0x164048 +/* [WB 64] Linear0 phy address. */ +#define TM_REG_LIN0_PHY_ADDR 0x164270 +/* [RW 1] Linear0 physical address valid. */ +#define TM_REG_LIN0_PHY_ADDR_VALID 0x164248 +/* [RW 24] Linear0 array scan timeout. */ +#define TM_REG_LIN0_SCAN_TIME 0x16403c +/* [RW 32] Linear1 logic address. */ +#define TM_REG_LIN1_LOGIC_ADDR 0x164250 +/* [WB 64] Linear1 phy address. */ +#define TM_REG_LIN1_PHY_ADDR 0x164280 +/* [RW 1] Linear1 physical address valid. */ +#define TM_REG_LIN1_PHY_ADDR_VALID 0x164258 +/* [RW 6] Linear timer set_clear fifo threshold. */ +#define TM_REG_LIN_SETCLR_FIFO_ALFULL_THR 0x164070 +/* [RW 2] Load value for pci arbiter credit cnt. */ +#define TM_REG_PCIARB_CRDCNT_VAL 0x164260 +/* [RW 20] The amount of hardware cycles for each timer tick. */ +#define TM_REG_TIMER_TICK_SIZE 0x16401c +/* [RW 8] Timers Context region. */ +#define TM_REG_TM_CONTEXT_REGION 0x164044 +/* [RW 1] Interrupt mask register #0 read/write */ +#define TM_REG_TM_INT_MASK 0x1640fc +/* [R 1] Interrupt register #0 read */ +#define TM_REG_TM_INT_STS 0x1640f0 +/* [RW 8] The event id for aggregated interrupt 0 */ +#define TSDM_REG_AGG_INT_EVENT_0 0x42038 +#define TSDM_REG_AGG_INT_EVENT_1 0x4203c +#define TSDM_REG_AGG_INT_EVENT_10 0x42060 +#define TSDM_REG_AGG_INT_EVENT_11 0x42064 +#define TSDM_REG_AGG_INT_EVENT_12 0x42068 +#define TSDM_REG_AGG_INT_EVENT_13 0x4206c +#define TSDM_REG_AGG_INT_EVENT_14 0x42070 +#define TSDM_REG_AGG_INT_EVENT_15 0x42074 +#define TSDM_REG_AGG_INT_EVENT_16 0x42078 +#define TSDM_REG_AGG_INT_EVENT_17 0x4207c +#define TSDM_REG_AGG_INT_EVENT_18 0x42080 +#define TSDM_REG_AGG_INT_EVENT_19 0x42084 +#define TSDM_REG_AGG_INT_EVENT_2 0x42040 +#define TSDM_REG_AGG_INT_EVENT_20 0x42088 +#define TSDM_REG_AGG_INT_EVENT_21 0x4208c +#define TSDM_REG_AGG_INT_EVENT_22 0x42090 +#define TSDM_REG_AGG_INT_EVENT_23 0x42094 +#define TSDM_REG_AGG_INT_EVENT_24 0x42098 +#define TSDM_REG_AGG_INT_EVENT_25 0x4209c +#define TSDM_REG_AGG_INT_EVENT_26 0x420a0 +#define TSDM_REG_AGG_INT_EVENT_27 0x420a4 +#define TSDM_REG_AGG_INT_EVENT_28 0x420a8 +#define TSDM_REG_AGG_INT_EVENT_29 0x420ac +#define TSDM_REG_AGG_INT_EVENT_3 0x42044 +#define TSDM_REG_AGG_INT_EVENT_30 0x420b0 +#define TSDM_REG_AGG_INT_EVENT_31 0x420b4 +#define TSDM_REG_AGG_INT_EVENT_4 0x42048 +/* [RW 1] The T bit for aggregated interrupt 0 */ +#define TSDM_REG_AGG_INT_T_0 0x420b8 +#define TSDM_REG_AGG_INT_T_1 0x420bc +#define TSDM_REG_AGG_INT_T_10 0x420e0 +#define TSDM_REG_AGG_INT_T_11 0x420e4 +#define TSDM_REG_AGG_INT_T_12 0x420e8 +#define TSDM_REG_AGG_INT_T_13 0x420ec +#define TSDM_REG_AGG_INT_T_14 0x420f0 +#define TSDM_REG_AGG_INT_T_15 0x420f4 +#define TSDM_REG_AGG_INT_T_16 0x420f8 +#define TSDM_REG_AGG_INT_T_17 0x420fc +#define TSDM_REG_AGG_INT_T_18 0x42100 +#define TSDM_REG_AGG_INT_T_19 0x42104 +/* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ +#define TSDM_REG_CFC_RSP_START_ADDR 0x42008 +/* [RW 16] The maximum value of the competion counter #0 */ +#define TSDM_REG_CMP_COUNTER_MAX0 0x4201c +/* [RW 16] The maximum value of the competion counter #1 */ +#define TSDM_REG_CMP_COUNTER_MAX1 0x42020 +/* [RW 16] The maximum value of the competion counter #2 */ +#define TSDM_REG_CMP_COUNTER_MAX2 0x42024 +/* [RW 16] The maximum value of the competion counter #3 */ +#define TSDM_REG_CMP_COUNTER_MAX3 0x42028 +/* [RW 13] The start address in the internal RAM for the completion + counters. */ +#define TSDM_REG_CMP_COUNTER_START_ADDR 0x4200c +#define TSDM_REG_ENABLE_IN1 0x42238 +#define TSDM_REG_ENABLE_IN2 0x4223c +#define TSDM_REG_ENABLE_OUT1 0x42240 +#define TSDM_REG_ENABLE_OUT2 0x42244 +/* [RW 4] The initial number of messages that can be sent to the pxp control + interface without receiving any ACK. */ +#define TSDM_REG_INIT_CREDIT_PXP_CTRL 0x424bc +/* [ST 32] The number of ACK after placement messages received */ +#define TSDM_REG_NUM_OF_ACK_AFTER_PLACE 0x4227c +/* [ST 32] The number of packet end messages received from the parser */ +#define TSDM_REG_NUM_OF_PKT_END_MSG 0x42274 +/* [ST 32] The number of requests received from the pxp async if */ +#define TSDM_REG_NUM_OF_PXP_ASYNC_REQ 0x42278 +/* [ST 32] The number of commands received in queue 0 */ +#define TSDM_REG_NUM_OF_Q0_CMD 0x42248 +/* [ST 32] The number of commands received in queue 10 */ +#define TSDM_REG_NUM_OF_Q10_CMD 0x4226c +/* [ST 32] The number of commands received in queue 11 */ +#define TSDM_REG_NUM_OF_Q11_CMD 0x42270 +/* [ST 32] The number of commands received in queue 1 */ +#define TSDM_REG_NUM_OF_Q1_CMD 0x4224c +/* [ST 32] The number of commands received in queue 3 */ +#define TSDM_REG_NUM_OF_Q3_CMD 0x42250 +/* [ST 32] The number of commands received in queue 4 */ +#define TSDM_REG_NUM_OF_Q4_CMD 0x42254 +/* [ST 32] The number of commands received in queue 5 */ +#define TSDM_REG_NUM_OF_Q5_CMD 0x42258 +/* [ST 32] The number of commands received in queue 6 */ +#define TSDM_REG_NUM_OF_Q6_CMD 0x4225c +/* [ST 32] The number of commands received in queue 7 */ +#define TSDM_REG_NUM_OF_Q7_CMD 0x42260 +/* [ST 32] The number of commands received in queue 8 */ +#define TSDM_REG_NUM_OF_Q8_CMD 0x42264 +/* [ST 32] The number of commands received in queue 9 */ +#define TSDM_REG_NUM_OF_Q9_CMD 0x42268 +/* [RW 13] The start address in the internal RAM for the packet end message */ +#define TSDM_REG_PCK_END_MSG_START_ADDR 0x42014 +/* [RW 13] The start address in the internal RAM for queue counters */ +#define TSDM_REG_Q_COUNTER_START_ADDR 0x42010 +/* [R 1] pxp_ctrl rd_data fifo empty in sdm_dma_rsp block */ +#define TSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY 0x42548 +/* [R 1] parser fifo empty in sdm_sync block */ +#define TSDM_REG_SYNC_PARSER_EMPTY 0x42550 +/* [R 1] parser serial fifo empty in sdm_sync block */ +#define TSDM_REG_SYNC_SYNC_EMPTY 0x42558 +/* [RW 32] Tick for timer counter. Applicable only when + ~tsdm_registers_timer_tick_enable.timer_tick_enable =1 */ +#define TSDM_REG_TIMER_TICK 0x42000 +/* [RW 32] Interrupt mask register #0 read/write */ +#define TSDM_REG_TSDM_INT_MASK_0 0x4229c +#define TSDM_REG_TSDM_INT_MASK_1 0x422ac +/* [R 32] Interrupt register #0 read */ +#define TSDM_REG_TSDM_INT_STS_0 0x42290 +#define TSDM_REG_TSDM_INT_STS_1 0x422a0 +/* [RW 11] Parity mask register #0 read/write */ +#define TSDM_REG_TSDM_PRTY_MASK 0x422bc +/* [R 11] Parity register #0 read */ +#define TSDM_REG_TSDM_PRTY_STS 0x422b0 +/* [RW 5] The number of time_slots in the arbitration cycle */ +#define TSEM_REG_ARB_CYCLE_SIZE 0x180034 +/* [RW 3] The source that is associated with arbitration element 0. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2 */ +#define TSEM_REG_ARB_ELEMENT0 0x180020 +/* [RW 3] The source that is associated with arbitration element 1. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~tsem_registers_arb_element0.arb_element0 */ +#define TSEM_REG_ARB_ELEMENT1 0x180024 +/* [RW 3] The source that is associated with arbitration element 2. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~tsem_registers_arb_element0.arb_element0 + and ~tsem_registers_arb_element1.arb_element1 */ +#define TSEM_REG_ARB_ELEMENT2 0x180028 +/* [RW 3] The source that is associated with arbitration element 3. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2.Could + not be equal to register ~tsem_registers_arb_element0.arb_element0 and + ~tsem_registers_arb_element1.arb_element1 and + ~tsem_registers_arb_element2.arb_element2 */ +#define TSEM_REG_ARB_ELEMENT3 0x18002c +/* [RW 3] The source that is associated with arbitration element 4. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~tsem_registers_arb_element0.arb_element0 + and ~tsem_registers_arb_element1.arb_element1 and + ~tsem_registers_arb_element2.arb_element2 and + ~tsem_registers_arb_element3.arb_element3 */ +#define TSEM_REG_ARB_ELEMENT4 0x180030 +#define TSEM_REG_ENABLE_IN 0x1800a4 +#define TSEM_REG_ENABLE_OUT 0x1800a8 +/* [RW 32] This address space contains all registers and memories that are + placed in SEM_FAST block. The SEM_FAST registers are described in + appendix B. In order to access the sem_fast registers the base address + ~fast_memory.fast_memory should be added to eachsem_fast register offset. */ +#define TSEM_REG_FAST_MEMORY 0x1a0000 +/* [RW 1] Disables input messages from FIC0 May be updated during run_time + by the microcode */ +#define TSEM_REG_FIC0_DISABLE 0x180224 +/* [RW 1] Disables input messages from FIC1 May be updated during run_time + by the microcode */ +#define TSEM_REG_FIC1_DISABLE 0x180234 +/* [RW 15] Interrupt table Read and write access to it is not possible in + the middle of the work */ +#define TSEM_REG_INT_TABLE 0x180400 +/* [ST 24] Statistics register. The number of messages that entered through + FIC0 */ +#define TSEM_REG_MSG_NUM_FIC0 0x180000 +/* [ST 24] Statistics register. The number of messages that entered through + FIC1 */ +#define TSEM_REG_MSG_NUM_FIC1 0x180004 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC0 */ +#define TSEM_REG_MSG_NUM_FOC0 0x180008 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC1 */ +#define TSEM_REG_MSG_NUM_FOC1 0x18000c +/* [ST 24] Statistics register. The number of messages that were sent to + FOC2 */ +#define TSEM_REG_MSG_NUM_FOC2 0x180010 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ +#define TSEM_REG_MSG_NUM_FOC3 0x180014 +/* [WB 128] Debug only. Passive buffer memory */ +#define TSEM_REG_PASSIVE_BUFFER 0x181000 +/* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ +#define TSEM_REG_PAS_DISABLE 0x18024c +/* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ +#define TSEM_REG_PRAM 0x1c0000 +/* [R 8] Valid sleeping threads indication have bit per thread */ +#define TSEM_REG_SLEEP_THREADS_VALID 0x18026c +/* [R 1] EXT_STORE FIFO is empty in sem_slow_ls_ext */ +#define TSEM_REG_SLOW_EXT_STORE_EMPTY 0x1802a0 +/* [RW 8] List of free threads . There is a bit per thread. */ +#define TSEM_REG_THREADS_LIST 0x1802e4 +/* [RW 32] Interrupt mask register #0 read/write */ +#define TSEM_REG_TSEM_INT_MASK_0 0x180100 +#define TSEM_REG_TSEM_INT_MASK_1 0x180110 +/* [R 32] Interrupt register #0 read */ +#define TSEM_REG_TSEM_INT_STS_0 0x1800f4 +#define TSEM_REG_TSEM_INT_STS_1 0x180104 +/* [RW 32] Parity mask register #0 read/write */ +#define TSEM_REG_TSEM_PRTY_MASK_0 0x180120 +#define TSEM_REG_TSEM_PRTY_MASK_1 0x180130 +/* [R 32] Parity register #0 read */ +#define TSEM_REG_TSEM_PRTY_STS_0 0x180114 +#define TSEM_REG_TSEM_PRTY_STS_1 0x180124 +/* [RW 3] The arbitration scheme of time_slot 0 */ +#define TSEM_REG_TS_0_AS 0x180038 +/* [RW 3] The arbitration scheme of time_slot 10 */ +#define TSEM_REG_TS_10_AS 0x180060 +/* [RW 3] The arbitration scheme of time_slot 11 */ +#define TSEM_REG_TS_11_AS 0x180064 +/* [RW 3] The arbitration scheme of time_slot 12 */ +#define TSEM_REG_TS_12_AS 0x180068 +/* [RW 3] The arbitration scheme of time_slot 13 */ +#define TSEM_REG_TS_13_AS 0x18006c +/* [RW 3] The arbitration scheme of time_slot 14 */ +#define TSEM_REG_TS_14_AS 0x180070 +/* [RW 3] The arbitration scheme of time_slot 15 */ +#define TSEM_REG_TS_15_AS 0x180074 +/* [RW 3] The arbitration scheme of time_slot 16 */ +#define TSEM_REG_TS_16_AS 0x180078 +/* [RW 3] The arbitration scheme of time_slot 17 */ +#define TSEM_REG_TS_17_AS 0x18007c +/* [RW 3] The arbitration scheme of time_slot 18 */ +#define TSEM_REG_TS_18_AS 0x180080 +/* [RW 3] The arbitration scheme of time_slot 1 */ +#define TSEM_REG_TS_1_AS 0x18003c +/* [RW 3] The arbitration scheme of time_slot 2 */ +#define TSEM_REG_TS_2_AS 0x180040 +/* [RW 3] The arbitration scheme of time_slot 3 */ +#define TSEM_REG_TS_3_AS 0x180044 +/* [RW 3] The arbitration scheme of time_slot 4 */ +#define TSEM_REG_TS_4_AS 0x180048 +/* [RW 3] The arbitration scheme of time_slot 5 */ +#define TSEM_REG_TS_5_AS 0x18004c +/* [RW 3] The arbitration scheme of time_slot 6 */ +#define TSEM_REG_TS_6_AS 0x180050 +/* [RW 3] The arbitration scheme of time_slot 7 */ +#define TSEM_REG_TS_7_AS 0x180054 +/* [RW 3] The arbitration scheme of time_slot 8 */ +#define TSEM_REG_TS_8_AS 0x180058 +/* [RW 3] The arbitration scheme of time_slot 9 */ +#define TSEM_REG_TS_9_AS 0x18005c +/* [R 5] Used to read the XX protection CAM occupancy counter. */ +#define UCM_REG_CAM_OCCUP 0xe0170 +/* [RW 1] CDU AG read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define UCM_REG_CDU_AG_RD_IFEN 0xe0038 +/* [RW 1] CDU AG write Interface enable. If 0 - the request and valid input + are disregarded; all other signals are treated as usual; if 1 - normal + activity. */ +#define UCM_REG_CDU_AG_WR_IFEN 0xe0034 +/* [RW 1] CDU STORM read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define UCM_REG_CDU_SM_RD_IFEN 0xe0040 +/* [RW 1] CDU STORM write Interface enable. If 0 - the request and valid + input is disregarded; all other signals are treated as usual; if 1 - + normal activity. */ +#define UCM_REG_CDU_SM_WR_IFEN 0xe003c +/* [RW 4] CFC output initial credit. Max credit available - 15.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 1 at start-up. */ +#define UCM_REG_CFC_INIT_CRD 0xe0204 +/* [RW 3] The weight of the CP input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_CP_WEIGHT 0xe00c4 +/* [RW 1] Input csem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_CSEM_IFEN 0xe0028 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the csem interface is detected. */ +#define UCM_REG_CSEM_LENGTH_MIS 0xe0160 +/* [RW 3] The weight of the input csem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_CSEM_WEIGHT 0xe00b8 +/* [RW 1] Input dorq Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_DORQ_IFEN 0xe0030 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the dorq interface is detected. */ +#define UCM_REG_DORQ_LENGTH_MIS 0xe0168 +/* [RW 3] The weight of the input dorq in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_DORQ_WEIGHT 0xe00c0 +/* [RW 8] The Event ID in case ErrorFlg input message bit is set. */ +#define UCM_REG_ERR_EVNT_ID 0xe00a4 +/* [RW 28] The CM erroneous header for QM and Timers formatting. */ +#define UCM_REG_ERR_UCM_HDR 0xe00a0 +/* [RW 8] The Event ID for Timers expiration. */ +#define UCM_REG_EXPR_EVNT_ID 0xe00a8 +/* [RW 8] FIC0 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define UCM_REG_FIC0_INIT_CRD 0xe020c +/* [RW 8] FIC1 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define UCM_REG_FIC1_INIT_CRD 0xe0210 +/* [RW 1] Arbitration between Input Arbiter groups: 0 - fair Round-Robin; 1 + - strict priority defined by ~ucm_registers_gr_ag_pr.gr_ag_pr; + ~ucm_registers_gr_ld0_pr.gr_ld0_pr and + ~ucm_registers_gr_ld1_pr.gr_ld1_pr. */ +#define UCM_REG_GR_ARB_TYPE 0xe0144 +/* [RW 2] Load (FIC0) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Store channel group is + compliment to the others. */ +#define UCM_REG_GR_LD0_PR 0xe014c +/* [RW 2] Load (FIC1) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Store channel group is + compliment to the others. */ +#define UCM_REG_GR_LD1_PR 0xe0150 +/* [RW 2] The queue index for invalidate counter flag decision. */ +#define UCM_REG_INV_CFLG_Q 0xe00e4 +/* [RW 5] The number of double REG-pairs; loaded from the STORM context and + sent to STORM; for a specific connection type. the double REG-pairs are + used in order to align to STORM context row size of 128 bits. The offset + of these data in the STORM context is always 0. Index _i stands for the + connection type (one of 16). */ +#define UCM_REG_N_SM_CTX_LD_0 0xe0054 +#define UCM_REG_N_SM_CTX_LD_1 0xe0058 +#define UCM_REG_N_SM_CTX_LD_10 0xe007c +#define UCM_REG_N_SM_CTX_LD_11 0xe0080 +#define UCM_REG_N_SM_CTX_LD_12 0xe0084 +#define UCM_REG_N_SM_CTX_LD_13 0xe0088 +#define UCM_REG_N_SM_CTX_LD_14 0xe008c +#define UCM_REG_N_SM_CTX_LD_15 0xe0090 +#define UCM_REG_N_SM_CTX_LD_2 0xe005c +#define UCM_REG_N_SM_CTX_LD_3 0xe0060 +#define UCM_REG_N_SM_CTX_LD_4 0xe0064 +#define UCM_REG_N_SM_CTX_LD_5 0xe0068 +#define UCM_REG_PHYS_QNUM0_0 0xe0110 +#define UCM_REG_PHYS_QNUM0_1 0xe0114 +#define UCM_REG_PHYS_QNUM1_0 0xe0118 +#define UCM_REG_PHYS_QNUM1_1 0xe011c +#define UCM_REG_PHYS_QNUM2_0 0xe0120 +#define UCM_REG_PHYS_QNUM2_1 0xe0124 +#define UCM_REG_PHYS_QNUM3_0 0xe0128 +#define UCM_REG_PHYS_QNUM3_1 0xe012c +/* [RW 8] The Event ID for Timers formatting in case of stop done. */ +#define UCM_REG_STOP_EVNT_ID 0xe00ac +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the STORM interface is detected. */ +#define UCM_REG_STORM_LENGTH_MIS 0xe0154 +/* [RW 1] STORM - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_STORM_UCM_IFEN 0xe0010 +/* [RW 3] The weight of the STORM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_STORM_WEIGHT 0xe00b0 +/* [RW 4] Timers output initial credit. Max credit available - 15.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 4 at start-up. */ +#define UCM_REG_TM_INIT_CRD 0xe021c +/* [RW 28] The CM header for Timers expiration command. */ +#define UCM_REG_TM_UCM_HDR 0xe009c +/* [RW 1] Timers - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_TM_UCM_IFEN 0xe001c +/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_TM_WEIGHT 0xe00d4 +/* [RW 1] Input tsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_TSEM_IFEN 0xe0024 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the tsem interface is detected. */ +#define UCM_REG_TSEM_LENGTH_MIS 0xe015c +/* [RW 3] The weight of the input tsem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_TSEM_WEIGHT 0xe00b4 +/* [RW 1] CM - CFC Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_UCM_CFC_IFEN 0xe0044 +/* [RW 11] Interrupt mask register #0 read/write */ +#define UCM_REG_UCM_INT_MASK 0xe01d4 +/* [R 11] Interrupt register #0 read */ +#define UCM_REG_UCM_INT_STS 0xe01c8 +/* [R 27] Parity register #0 read */ +#define UCM_REG_UCM_PRTY_STS 0xe01d8 +/* [RW 2] The size of AG context region 0 in REG-pairs. Designates the MS + REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). + Is used to determine the number of the AG context REG-pairs written back; + when the Reg1WbFlg isn't set. */ +#define UCM_REG_UCM_REG0_SZ 0xe00dc +/* [RW 1] CM - STORM 0 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_UCM_STORM0_IFEN 0xe0004 +/* [RW 1] CM - STORM 1 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_UCM_STORM1_IFEN 0xe0008 +/* [RW 1] CM - Timers Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_UCM_TM_IFEN 0xe0020 +/* [RW 1] CM - QM Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_UCM_UQM_IFEN 0xe000c +/* [RW 1] If set the Q index; received from the QM is inserted to event ID. */ +#define UCM_REG_UCM_UQM_USE_Q 0xe00d8 +/* [RW 6] QM output initial credit. Max credit available - 32.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 32 at start-up. */ +#define UCM_REG_UQM_INIT_CRD 0xe0220 +/* [RW 3] The weight of the QM (primary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_UQM_P_WEIGHT 0xe00cc +/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_UQM_S_WEIGHT 0xe00d0 +/* [RW 28] The CM header value for QM request (primary). */ +#define UCM_REG_UQM_UCM_HDR_P 0xe0094 +/* [RW 28] The CM header value for QM request (secondary). */ +#define UCM_REG_UQM_UCM_HDR_S 0xe0098 +/* [RW 1] QM - CM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_UQM_UCM_IFEN 0xe0014 +/* [RW 1] Input SDM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define UCM_REG_USDM_IFEN 0xe0018 +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the SDM interface is detected. */ +#define UCM_REG_USDM_LENGTH_MIS 0xe0158 +/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_USDM_WEIGHT 0xe00c8 +/* [RW 1] Input xsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define UCM_REG_XSEM_IFEN 0xe002c +/* [RC 1] Set when the message length mismatch (relative to last indication) + at the xsem interface isdetected. */ +#define UCM_REG_XSEM_LENGTH_MIS 0xe0164 +/* [RW 3] The weight of the input xsem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define UCM_REG_XSEM_WEIGHT 0xe00bc +/* [RW 20] Indirect access to the descriptor table of the XX protection + mechanism. The fields are:[5:0] - message length; 14:6] - message + pointer; 19:15] - next pointer. */ +#define UCM_REG_XX_DESCR_TABLE 0xe0280 +#define UCM_REG_XX_DESCR_TABLE_SIZE 32 +/* [R 6] Use to read the XX protection Free counter. */ +#define UCM_REG_XX_FREE 0xe016c +/* [RW 6] Initial value for the credit counter; responsible for fulfilling + of the Input Stage XX protection buffer by the XX protection pending + messages. Write writes the initial credit value; read returns the current + value of the credit counter. Must be initialized to 12 at start-up. */ +#define UCM_REG_XX_INIT_CRD 0xe0224 +/* [RW 6] The maximum number of pending messages; which may be stored in XX + protection. ~ucm_registers_xx_free.xx_free read on read. */ +#define UCM_REG_XX_MSG_NUM 0xe0228 +/* [RW 8] The Event ID; sent to the STORM in case of XX overflow. */ +#define UCM_REG_XX_OVFL_EVNT_ID 0xe004c +/* [RW 16] Indirect access to the XX table of the XX protection mechanism. + The fields are: [4:0] - tail pointer; 10:5] - Link List size; 15:11] - + header pointer. */ +#define UCM_REG_XX_TABLE 0xe0300 +/* [RW 8] The event id for aggregated interrupt 0 */ +#define USDM_REG_AGG_INT_EVENT_0 0xc4038 +#define USDM_REG_AGG_INT_EVENT_1 0xc403c +#define USDM_REG_AGG_INT_EVENT_10 0xc4060 +#define USDM_REG_AGG_INT_EVENT_11 0xc4064 +#define USDM_REG_AGG_INT_EVENT_12 0xc4068 +#define USDM_REG_AGG_INT_EVENT_13 0xc406c +#define USDM_REG_AGG_INT_EVENT_14 0xc4070 +#define USDM_REG_AGG_INT_EVENT_15 0xc4074 +#define USDM_REG_AGG_INT_EVENT_16 0xc4078 +#define USDM_REG_AGG_INT_EVENT_17 0xc407c +#define USDM_REG_AGG_INT_EVENT_18 0xc4080 +#define USDM_REG_AGG_INT_EVENT_19 0xc4084 +#define USDM_REG_AGG_INT_EVENT_2 0xc4040 +#define USDM_REG_AGG_INT_EVENT_20 0xc4088 +#define USDM_REG_AGG_INT_EVENT_21 0xc408c +#define USDM_REG_AGG_INT_EVENT_22 0xc4090 +#define USDM_REG_AGG_INT_EVENT_23 0xc4094 +#define USDM_REG_AGG_INT_EVENT_24 0xc4098 +#define USDM_REG_AGG_INT_EVENT_25 0xc409c +#define USDM_REG_AGG_INT_EVENT_26 0xc40a0 +#define USDM_REG_AGG_INT_EVENT_27 0xc40a4 +#define USDM_REG_AGG_INT_EVENT_28 0xc40a8 +#define USDM_REG_AGG_INT_EVENT_29 0xc40ac +#define USDM_REG_AGG_INT_EVENT_3 0xc4044 +#define USDM_REG_AGG_INT_EVENT_30 0xc40b0 +#define USDM_REG_AGG_INT_EVENT_31 0xc40b4 +#define USDM_REG_AGG_INT_EVENT_4 0xc4048 +#define USDM_REG_AGG_INT_EVENT_5 0xc404c +/* [RW 1] For each aggregated interrupt index whether the mode is normal (0) + or auto-mask-mode (1) */ +#define USDM_REG_AGG_INT_MODE_0 0xc41b8 +#define USDM_REG_AGG_INT_MODE_1 0xc41bc +#define USDM_REG_AGG_INT_MODE_10 0xc41e0 +#define USDM_REG_AGG_INT_MODE_11 0xc41e4 +#define USDM_REG_AGG_INT_MODE_12 0xc41e8 +#define USDM_REG_AGG_INT_MODE_13 0xc41ec +#define USDM_REG_AGG_INT_MODE_14 0xc41f0 +#define USDM_REG_AGG_INT_MODE_15 0xc41f4 +#define USDM_REG_AGG_INT_MODE_16 0xc41f8 +#define USDM_REG_AGG_INT_MODE_17 0xc41fc +#define USDM_REG_AGG_INT_MODE_18 0xc4200 +#define USDM_REG_AGG_INT_MODE_19 0xc4204 +#define USDM_REG_AGG_INT_MODE_4 0xc41c8 +#define USDM_REG_AGG_INT_MODE_5 0xc41cc +/* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ +#define USDM_REG_CFC_RSP_START_ADDR 0xc4008 +/* [RW 16] The maximum value of the competion counter #0 */ +#define USDM_REG_CMP_COUNTER_MAX0 0xc401c +/* [RW 16] The maximum value of the competion counter #1 */ +#define USDM_REG_CMP_COUNTER_MAX1 0xc4020 +/* [RW 16] The maximum value of the competion counter #2 */ +#define USDM_REG_CMP_COUNTER_MAX2 0xc4024 +/* [RW 16] The maximum value of the competion counter #3 */ +#define USDM_REG_CMP_COUNTER_MAX3 0xc4028 +/* [RW 13] The start address in the internal RAM for the completion + counters. */ +#define USDM_REG_CMP_COUNTER_START_ADDR 0xc400c +#define USDM_REG_ENABLE_IN1 0xc4238 +#define USDM_REG_ENABLE_IN2 0xc423c +#define USDM_REG_ENABLE_OUT1 0xc4240 +#define USDM_REG_ENABLE_OUT2 0xc4244 +/* [RW 4] The initial number of messages that can be sent to the pxp control + interface without receiving any ACK. */ +#define USDM_REG_INIT_CREDIT_PXP_CTRL 0xc44c0 +/* [ST 32] The number of ACK after placement messages received */ +#define USDM_REG_NUM_OF_ACK_AFTER_PLACE 0xc4280 +/* [ST 32] The number of packet end messages received from the parser */ +#define USDM_REG_NUM_OF_PKT_END_MSG 0xc4278 +/* [ST 32] The number of requests received from the pxp async if */ +#define USDM_REG_NUM_OF_PXP_ASYNC_REQ 0xc427c +/* [ST 32] The number of commands received in queue 0 */ +#define USDM_REG_NUM_OF_Q0_CMD 0xc4248 +/* [ST 32] The number of commands received in queue 10 */ +#define USDM_REG_NUM_OF_Q10_CMD 0xc4270 +/* [ST 32] The number of commands received in queue 11 */ +#define USDM_REG_NUM_OF_Q11_CMD 0xc4274 +/* [ST 32] The number of commands received in queue 1 */ +#define USDM_REG_NUM_OF_Q1_CMD 0xc424c +/* [ST 32] The number of commands received in queue 2 */ +#define USDM_REG_NUM_OF_Q2_CMD 0xc4250 +/* [ST 32] The number of commands received in queue 3 */ +#define USDM_REG_NUM_OF_Q3_CMD 0xc4254 +/* [ST 32] The number of commands received in queue 4 */ +#define USDM_REG_NUM_OF_Q4_CMD 0xc4258 +/* [ST 32] The number of commands received in queue 5 */ +#define USDM_REG_NUM_OF_Q5_CMD 0xc425c +/* [ST 32] The number of commands received in queue 6 */ +#define USDM_REG_NUM_OF_Q6_CMD 0xc4260 +/* [ST 32] The number of commands received in queue 7 */ +#define USDM_REG_NUM_OF_Q7_CMD 0xc4264 +/* [ST 32] The number of commands received in queue 8 */ +#define USDM_REG_NUM_OF_Q8_CMD 0xc4268 +/* [ST 32] The number of commands received in queue 9 */ +#define USDM_REG_NUM_OF_Q9_CMD 0xc426c +/* [RW 13] The start address in the internal RAM for the packet end message */ +#define USDM_REG_PCK_END_MSG_START_ADDR 0xc4014 +/* [RW 13] The start address in the internal RAM for queue counters */ +#define USDM_REG_Q_COUNTER_START_ADDR 0xc4010 +/* [R 1] pxp_ctrl rd_data fifo empty in sdm_dma_rsp block */ +#define USDM_REG_RSP_PXP_CTRL_RDATA_EMPTY 0xc4550 +/* [R 1] parser fifo empty in sdm_sync block */ +#define USDM_REG_SYNC_PARSER_EMPTY 0xc4558 +/* [R 1] parser serial fifo empty in sdm_sync block */ +#define USDM_REG_SYNC_SYNC_EMPTY 0xc4560 +/* [RW 32] Tick for timer counter. Applicable only when + ~usdm_registers_timer_tick_enable.timer_tick_enable =1 */ +#define USDM_REG_TIMER_TICK 0xc4000 +/* [RW 32] Interrupt mask register #0 read/write */ +#define USDM_REG_USDM_INT_MASK_0 0xc42a0 +#define USDM_REG_USDM_INT_MASK_1 0xc42b0 +/* [R 32] Interrupt register #0 read */ +#define USDM_REG_USDM_INT_STS_0 0xc4294 +#define USDM_REG_USDM_INT_STS_1 0xc42a4 +/* [RW 11] Parity mask register #0 read/write */ +#define USDM_REG_USDM_PRTY_MASK 0xc42c0 +/* [R 11] Parity register #0 read */ +#define USDM_REG_USDM_PRTY_STS 0xc42b4 +/* [RW 5] The number of time_slots in the arbitration cycle */ +#define USEM_REG_ARB_CYCLE_SIZE 0x300034 +/* [RW 3] The source that is associated with arbitration element 0. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2 */ +#define USEM_REG_ARB_ELEMENT0 0x300020 +/* [RW 3] The source that is associated with arbitration element 1. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~usem_registers_arb_element0.arb_element0 */ +#define USEM_REG_ARB_ELEMENT1 0x300024 +/* [RW 3] The source that is associated with arbitration element 2. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~usem_registers_arb_element0.arb_element0 + and ~usem_registers_arb_element1.arb_element1 */ +#define USEM_REG_ARB_ELEMENT2 0x300028 +/* [RW 3] The source that is associated with arbitration element 3. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2.Could + not be equal to register ~usem_registers_arb_element0.arb_element0 and + ~usem_registers_arb_element1.arb_element1 and + ~usem_registers_arb_element2.arb_element2 */ +#define USEM_REG_ARB_ELEMENT3 0x30002c +/* [RW 3] The source that is associated with arbitration element 4. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~usem_registers_arb_element0.arb_element0 + and ~usem_registers_arb_element1.arb_element1 and + ~usem_registers_arb_element2.arb_element2 and + ~usem_registers_arb_element3.arb_element3 */ +#define USEM_REG_ARB_ELEMENT4 0x300030 +#define USEM_REG_ENABLE_IN 0x3000a4 +#define USEM_REG_ENABLE_OUT 0x3000a8 +/* [RW 32] This address space contains all registers and memories that are + placed in SEM_FAST block. The SEM_FAST registers are described in + appendix B. In order to access the sem_fast registers the base address + ~fast_memory.fast_memory should be added to eachsem_fast register offset. */ +#define USEM_REG_FAST_MEMORY 0x320000 +/* [RW 1] Disables input messages from FIC0 May be updated during run_time + by the microcode */ +#define USEM_REG_FIC0_DISABLE 0x300224 +/* [RW 1] Disables input messages from FIC1 May be updated during run_time + by the microcode */ +#define USEM_REG_FIC1_DISABLE 0x300234 +/* [RW 15] Interrupt table Read and write access to it is not possible in + the middle of the work */ +#define USEM_REG_INT_TABLE 0x300400 +/* [ST 24] Statistics register. The number of messages that entered through + FIC0 */ +#define USEM_REG_MSG_NUM_FIC0 0x300000 +/* [ST 24] Statistics register. The number of messages that entered through + FIC1 */ +#define USEM_REG_MSG_NUM_FIC1 0x300004 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC0 */ +#define USEM_REG_MSG_NUM_FOC0 0x300008 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC1 */ +#define USEM_REG_MSG_NUM_FOC1 0x30000c +/* [ST 24] Statistics register. The number of messages that were sent to + FOC2 */ +#define USEM_REG_MSG_NUM_FOC2 0x300010 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ +#define USEM_REG_MSG_NUM_FOC3 0x300014 +/* [WB 128] Debug only. Passive buffer memory */ +#define USEM_REG_PASSIVE_BUFFER 0x302000 +/* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ +#define USEM_REG_PAS_DISABLE 0x30024c +/* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ +#define USEM_REG_PRAM 0x340000 +/* [R 16] Valid sleeping threads indication have bit per thread */ +#define USEM_REG_SLEEP_THREADS_VALID 0x30026c +/* [R 1] EXT_STORE FIFO is empty in sem_slow_ls_ext */ +#define USEM_REG_SLOW_EXT_STORE_EMPTY 0x3002a0 +/* [RW 16] List of free threads . There is a bit per thread. */ +#define USEM_REG_THREADS_LIST 0x3002e4 +/* [RW 3] The arbitration scheme of time_slot 0 */ +#define USEM_REG_TS_0_AS 0x300038 +/* [RW 3] The arbitration scheme of time_slot 10 */ +#define USEM_REG_TS_10_AS 0x300060 +/* [RW 3] The arbitration scheme of time_slot 11 */ +#define USEM_REG_TS_11_AS 0x300064 +/* [RW 3] The arbitration scheme of time_slot 12 */ +#define USEM_REG_TS_12_AS 0x300068 +/* [RW 3] The arbitration scheme of time_slot 13 */ +#define USEM_REG_TS_13_AS 0x30006c +/* [RW 3] The arbitration scheme of time_slot 14 */ +#define USEM_REG_TS_14_AS 0x300070 +/* [RW 3] The arbitration scheme of time_slot 15 */ +#define USEM_REG_TS_15_AS 0x300074 +/* [RW 3] The arbitration scheme of time_slot 16 */ +#define USEM_REG_TS_16_AS 0x300078 +/* [RW 3] The arbitration scheme of time_slot 17 */ +#define USEM_REG_TS_17_AS 0x30007c +/* [RW 3] The arbitration scheme of time_slot 18 */ +#define USEM_REG_TS_18_AS 0x300080 +/* [RW 3] The arbitration scheme of time_slot 1 */ +#define USEM_REG_TS_1_AS 0x30003c +/* [RW 3] The arbitration scheme of time_slot 2 */ +#define USEM_REG_TS_2_AS 0x300040 +/* [RW 3] The arbitration scheme of time_slot 3 */ +#define USEM_REG_TS_3_AS 0x300044 +/* [RW 3] The arbitration scheme of time_slot 4 */ +#define USEM_REG_TS_4_AS 0x300048 +/* [RW 3] The arbitration scheme of time_slot 5 */ +#define USEM_REG_TS_5_AS 0x30004c +/* [RW 3] The arbitration scheme of time_slot 6 */ +#define USEM_REG_TS_6_AS 0x300050 +/* [RW 3] The arbitration scheme of time_slot 7 */ +#define USEM_REG_TS_7_AS 0x300054 +/* [RW 3] The arbitration scheme of time_slot 8 */ +#define USEM_REG_TS_8_AS 0x300058 +/* [RW 3] The arbitration scheme of time_slot 9 */ +#define USEM_REG_TS_9_AS 0x30005c +/* [RW 32] Interrupt mask register #0 read/write */ +#define USEM_REG_USEM_INT_MASK_0 0x300110 +#define USEM_REG_USEM_INT_MASK_1 0x300120 +/* [R 32] Interrupt register #0 read */ +#define USEM_REG_USEM_INT_STS_0 0x300104 +#define USEM_REG_USEM_INT_STS_1 0x300114 +/* [RW 32] Parity mask register #0 read/write */ +#define USEM_REG_USEM_PRTY_MASK_0 0x300130 +#define USEM_REG_USEM_PRTY_MASK_1 0x300140 +/* [R 32] Parity register #0 read */ +#define USEM_REG_USEM_PRTY_STS_0 0x300124 +#define USEM_REG_USEM_PRTY_STS_1 0x300134 +/* [RW 2] The queue index for registration on Aux1 counter flag. */ +#define XCM_REG_AUX1_Q 0x20134 +/* [RW 2] Per each decision rule the queue index to register to. */ +#define XCM_REG_AUX_CNT_FLG_Q_19 0x201b0 +/* [R 5] Used to read the XX protection CAM occupancy counter. */ +#define XCM_REG_CAM_OCCUP 0x20244 +/* [RW 1] CDU AG read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define XCM_REG_CDU_AG_RD_IFEN 0x20044 +/* [RW 1] CDU AG write Interface enable. If 0 - the request and valid input + are disregarded; all other signals are treated as usual; if 1 - normal + activity. */ +#define XCM_REG_CDU_AG_WR_IFEN 0x20040 +/* [RW 1] CDU STORM read Interface enable. If 0 - the request input is + disregarded; valid output is deasserted; all other signals are treated as + usual; if 1 - normal activity. */ +#define XCM_REG_CDU_SM_RD_IFEN 0x2004c +/* [RW 1] CDU STORM write Interface enable. If 0 - the request and valid + input is disregarded; all other signals are treated as usual; if 1 - + normal activity. */ +#define XCM_REG_CDU_SM_WR_IFEN 0x20048 +/* [RW 4] CFC output initial credit. Max credit available - 15.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 1 at start-up. */ +#define XCM_REG_CFC_INIT_CRD 0x20404 +/* [RW 3] The weight of the CP input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_CP_WEIGHT 0x200dc +/* [RW 1] Input csem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_CSEM_IFEN 0x20028 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the csem interface. */ +#define XCM_REG_CSEM_LENGTH_MIS 0x20228 +/* [RW 3] The weight of the input csem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_CSEM_WEIGHT 0x200c4 +/* [RW 1] Input dorq Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_DORQ_IFEN 0x20030 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the dorq interface. */ +#define XCM_REG_DORQ_LENGTH_MIS 0x20230 +/* [RW 3] The weight of the input dorq in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_DORQ_WEIGHT 0x200cc +/* [RW 8] The Event ID in case the ErrorFlg input message bit is set. */ +#define XCM_REG_ERR_EVNT_ID 0x200b0 +/* [RW 28] The CM erroneous header for QM and Timers formatting. */ +#define XCM_REG_ERR_XCM_HDR 0x200ac +/* [RW 8] The Event ID for Timers expiration. */ +#define XCM_REG_EXPR_EVNT_ID 0x200b4 +/* [RW 8] FIC0 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define XCM_REG_FIC0_INIT_CRD 0x2040c +/* [RW 8] FIC1 output initial credit. Max credit available - 255.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 64 at start-up. */ +#define XCM_REG_FIC1_INIT_CRD 0x20410 +#define XCM_REG_GLB_DEL_ACK_MAX_CNT_0 0x20118 +#define XCM_REG_GLB_DEL_ACK_MAX_CNT_1 0x2011c +#define XCM_REG_GLB_DEL_ACK_TMR_VAL_0 0x20108 +#define XCM_REG_GLB_DEL_ACK_TMR_VAL_1 0x2010c +/* [RW 1] Arbitratiojn between Input Arbiter groups: 0 - fair Round-Robin; 1 + - strict priority defined by ~xcm_registers_gr_ag_pr.gr_ag_pr; + ~xcm_registers_gr_ld0_pr.gr_ld0_pr and + ~xcm_registers_gr_ld1_pr.gr_ld1_pr. */ +#define XCM_REG_GR_ARB_TYPE 0x2020c +/* [RW 2] Load (FIC0) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Channel group is the + compliment of the other 3 groups. */ +#define XCM_REG_GR_LD0_PR 0x20214 +/* [RW 2] Load (FIC1) channel group priority. The lowest priority is 0; the + highest priority is 3. It is supposed that the Channel group is the + compliment of the other 3 groups. */ +#define XCM_REG_GR_LD1_PR 0x20218 +/* [RW 1] Input nig0 Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_NIG0_IFEN 0x20038 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the nig0 interface. */ +#define XCM_REG_NIG0_LENGTH_MIS 0x20238 +/* [RW 3] The weight of the input nig0 in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_NIG0_WEIGHT 0x200d4 +/* [RW 1] Input nig1 Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_NIG1_IFEN 0x2003c +/* [RC 1] Set at message length mismatch (relative to last indication) at + the nig1 interface. */ +#define XCM_REG_NIG1_LENGTH_MIS 0x2023c +/* [RW 5] The number of double REG-pairs; loaded from the STORM context and + sent to STORM; for a specific connection type. The double REG-pairs are + used in order to align to STORM context row size of 128 bits. The offset + of these data in the STORM context is always 0. Index _i stands for the + connection type (one of 16). */ +#define XCM_REG_N_SM_CTX_LD_0 0x20060 +#define XCM_REG_N_SM_CTX_LD_1 0x20064 +#define XCM_REG_N_SM_CTX_LD_10 0x20088 +#define XCM_REG_N_SM_CTX_LD_11 0x2008c +#define XCM_REG_N_SM_CTX_LD_12 0x20090 +#define XCM_REG_N_SM_CTX_LD_13 0x20094 +#define XCM_REG_N_SM_CTX_LD_14 0x20098 +#define XCM_REG_N_SM_CTX_LD_15 0x2009c +#define XCM_REG_N_SM_CTX_LD_2 0x20068 +#define XCM_REG_N_SM_CTX_LD_3 0x2006c +#define XCM_REG_N_SM_CTX_LD_4 0x20070 +#define XCM_REG_N_SM_CTX_LD_5 0x20074 +/* [RW 1] Input pbf Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_PBF_IFEN 0x20034 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the pbf interface. */ +#define XCM_REG_PBF_LENGTH_MIS 0x20234 +/* [RW 3] The weight of the input pbf in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_PBF_WEIGHT 0x200d0 +#define XCM_REG_PHYS_QNUM3_0 0x20100 +#define XCM_REG_PHYS_QNUM3_1 0x20104 +/* [RW 8] The Event ID for Timers formatting in case of stop done. */ +#define XCM_REG_STOP_EVNT_ID 0x200b8 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the STORM interface. */ +#define XCM_REG_STORM_LENGTH_MIS 0x2021c +/* [RW 3] The weight of the STORM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_STORM_WEIGHT 0x200bc +/* [RW 1] STORM - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_STORM_XCM_IFEN 0x20010 +/* [RW 4] Timers output initial credit. Max credit available - 15.Write + writes the initial credit value; read returns the current value of the + credit counter. Must be initialized to 4 at start-up. */ +#define XCM_REG_TM_INIT_CRD 0x2041c +/* [RW 3] The weight of the Timers input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_TM_WEIGHT 0x200ec +/* [RW 28] The CM header for Timers expiration command. */ +#define XCM_REG_TM_XCM_HDR 0x200a8 +/* [RW 1] Timers - CM Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_TM_XCM_IFEN 0x2001c +/* [RW 1] Input tsem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_TSEM_IFEN 0x20024 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the tsem interface. */ +#define XCM_REG_TSEM_LENGTH_MIS 0x20224 +/* [RW 3] The weight of the input tsem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_TSEM_WEIGHT 0x200c0 +/* [RW 2] The queue index for registration on UNA greater NXT decision rule. */ +#define XCM_REG_UNA_GT_NXT_Q 0x20120 +/* [RW 1] Input usem Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_USEM_IFEN 0x2002c +/* [RC 1] Message length mismatch (relative to last indication) at the usem + interface. */ +#define XCM_REG_USEM_LENGTH_MIS 0x2022c +/* [RW 3] The weight of the input usem in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_USEM_WEIGHT 0x200c8 +#define XCM_REG_WU_DA_CNT_CMD00 0x201d4 +#define XCM_REG_WU_DA_CNT_CMD01 0x201d8 +#define XCM_REG_WU_DA_CNT_CMD10 0x201dc +#define XCM_REG_WU_DA_CNT_CMD11 0x201e0 +#define XCM_REG_WU_DA_CNT_UPD_VAL00 0x201e4 +#define XCM_REG_WU_DA_CNT_UPD_VAL01 0x201e8 +#define XCM_REG_WU_DA_CNT_UPD_VAL10 0x201ec +#define XCM_REG_WU_DA_CNT_UPD_VAL11 0x201f0 +#define XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD00 0x201c4 +#define XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD01 0x201c8 +#define XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD10 0x201cc +#define XCM_REG_WU_DA_SET_TMR_CNT_FLG_CMD11 0x201d0 +/* [RW 1] CM - CFC Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XCM_CFC_IFEN 0x20050 +/* [RW 14] Interrupt mask register #0 read/write */ +#define XCM_REG_XCM_INT_MASK 0x202b4 +/* [R 14] Interrupt register #0 read */ +#define XCM_REG_XCM_INT_STS 0x202a8 +/* [R 30] Parity register #0 read */ +#define XCM_REG_XCM_PRTY_STS 0x202b8 +/* [RW 4] The size of AG context region 0 in REG-pairs. Designates the MS + REG-pair number (e.g. if region 0 is 6 REG-pairs; the value should be 5). + Is used to determine the number of the AG context REG-pairs written back; + when the Reg1WbFlg isn't set. */ +#define XCM_REG_XCM_REG0_SZ 0x200f4 +/* [RW 1] CM - STORM 0 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XCM_STORM0_IFEN 0x20004 +/* [RW 1] CM - STORM 1 Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XCM_STORM1_IFEN 0x20008 +/* [RW 1] CM - Timers Interface enable. If 0 - the valid input is + disregarded; acknowledge output is deasserted; all other signals are + treated as usual; if 1 - normal activity. */ +#define XCM_REG_XCM_TM_IFEN 0x20020 +/* [RW 1] CM - QM Interface enable. If 0 - the acknowledge input is + disregarded; valid is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XCM_XQM_IFEN 0x2000c +/* [RW 1] If set the Q index; received from the QM is inserted to event ID. */ +#define XCM_REG_XCM_XQM_USE_Q 0x200f0 +/* [RW 4] The value by which CFC updates the activity counter at QM bypass. */ +#define XCM_REG_XQM_BYP_ACT_UPD 0x200fc +/* [RW 6] QM output initial credit. Max credit available - 32.Write writes + the initial credit value; read returns the current value of the credit + counter. Must be initialized to 32 at start-up. */ +#define XCM_REG_XQM_INIT_CRD 0x20420 +/* [RW 3] The weight of the QM (primary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_XQM_P_WEIGHT 0x200e4 +/* [RW 3] The weight of the QM (secondary) input in the WRR mechanism. 0 + stands for weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_XQM_S_WEIGHT 0x200e8 +/* [RW 28] The CM header value for QM request (primary). */ +#define XCM_REG_XQM_XCM_HDR_P 0x200a0 +/* [RW 28] The CM header value for QM request (secondary). */ +#define XCM_REG_XQM_XCM_HDR_S 0x200a4 +/* [RW 1] QM - CM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XQM_XCM_IFEN 0x20014 +/* [RW 1] Input SDM Interface enable. If 0 - the valid input is disregarded; + acknowledge output is deasserted; all other signals are treated as usual; + if 1 - normal activity. */ +#define XCM_REG_XSDM_IFEN 0x20018 +/* [RC 1] Set at message length mismatch (relative to last indication) at + the SDM interface. */ +#define XCM_REG_XSDM_LENGTH_MIS 0x20220 +/* [RW 3] The weight of the SDM input in the WRR mechanism. 0 stands for + weight 8 (the most prioritised); 1 stands for weight 1(least + prioritised); 2 stands for weight 2; tc. */ +#define XCM_REG_XSDM_WEIGHT 0x200e0 +/* [RW 17] Indirect access to the descriptor table of the XX protection + mechanism. The fields are: [5:0] - message length; 11:6] - message + pointer; 16:12] - next pointer. */ +#define XCM_REG_XX_DESCR_TABLE 0x20480 +#define XCM_REG_XX_DESCR_TABLE_SIZE 32 +/* [R 6] Used to read the XX protection Free counter. */ +#define XCM_REG_XX_FREE 0x20240 +/* [RW 6] Initial value for the credit counter; responsible for fulfilling + of the Input Stage XX protection buffer by the XX protection pending + messages. Max credit available - 3.Write writes the initial credit value; + read returns the current value of the credit counter. Must be initialized + to 2 at start-up. */ +#define XCM_REG_XX_INIT_CRD 0x20424 +/* [RW 6] The maximum number of pending messages; which may be stored in XX + protection. ~xcm_registers_xx_free.xx_free read on read. */ +#define XCM_REG_XX_MSG_NUM 0x20428 +/* [RW 8] The Event ID; sent to the STORM in case of XX overflow. */ +#define XCM_REG_XX_OVFL_EVNT_ID 0x20058 +/* [RW 16] Indirect access to the XX table of the XX protection mechanism. + The fields are:[4:0] - tail pointer; 9:5] - Link List size; 14:10] - + header pointer. */ +#define XCM_REG_XX_TABLE 0x20500 +/* [RW 8] The event id for aggregated interrupt 0 */ +#define XSDM_REG_AGG_INT_EVENT_0 0x166038 +#define XSDM_REG_AGG_INT_EVENT_1 0x16603c +#define XSDM_REG_AGG_INT_EVENT_10 0x166060 +#define XSDM_REG_AGG_INT_EVENT_11 0x166064 +#define XSDM_REG_AGG_INT_EVENT_12 0x166068 +#define XSDM_REG_AGG_INT_EVENT_13 0x16606c +#define XSDM_REG_AGG_INT_EVENT_14 0x166070 +#define XSDM_REG_AGG_INT_EVENT_15 0x166074 +#define XSDM_REG_AGG_INT_EVENT_16 0x166078 +#define XSDM_REG_AGG_INT_EVENT_17 0x16607c +#define XSDM_REG_AGG_INT_EVENT_18 0x166080 +#define XSDM_REG_AGG_INT_EVENT_19 0x166084 +#define XSDM_REG_AGG_INT_EVENT_10 0x166060 +#define XSDM_REG_AGG_INT_EVENT_11 0x166064 +#define XSDM_REG_AGG_INT_EVENT_12 0x166068 +#define XSDM_REG_AGG_INT_EVENT_13 0x16606c +#define XSDM_REG_AGG_INT_EVENT_14 0x166070 +#define XSDM_REG_AGG_INT_EVENT_2 0x166040 +#define XSDM_REG_AGG_INT_EVENT_20 0x166088 +#define XSDM_REG_AGG_INT_EVENT_21 0x16608c +#define XSDM_REG_AGG_INT_EVENT_22 0x166090 +#define XSDM_REG_AGG_INT_EVENT_23 0x166094 +#define XSDM_REG_AGG_INT_EVENT_24 0x166098 +#define XSDM_REG_AGG_INT_EVENT_25 0x16609c +#define XSDM_REG_AGG_INT_EVENT_26 0x1660a0 +#define XSDM_REG_AGG_INT_EVENT_27 0x1660a4 +#define XSDM_REG_AGG_INT_EVENT_28 0x1660a8 +#define XSDM_REG_AGG_INT_EVENT_29 0x1660ac +#define XSDM_REG_AGG_INT_EVENT_3 0x166044 +#define XSDM_REG_AGG_INT_EVENT_30 0x1660b0 +#define XSDM_REG_AGG_INT_EVENT_31 0x1660b4 +#define XSDM_REG_AGG_INT_EVENT_4 0x166048 +#define XSDM_REG_AGG_INT_EVENT_5 0x16604c +#define XSDM_REG_AGG_INT_EVENT_6 0x166050 +#define XSDM_REG_AGG_INT_EVENT_7 0x166054 +#define XSDM_REG_AGG_INT_EVENT_8 0x166058 +#define XSDM_REG_AGG_INT_EVENT_9 0x16605c +/* [RW 1] For each aggregated interrupt index whether the mode is normal (0) + or auto-mask-mode (1) */ +#define XSDM_REG_AGG_INT_MODE_0 0x1661b8 +#define XSDM_REG_AGG_INT_MODE_1 0x1661bc +#define XSDM_REG_AGG_INT_MODE_10 0x1661e0 +#define XSDM_REG_AGG_INT_MODE_11 0x1661e4 +#define XSDM_REG_AGG_INT_MODE_12 0x1661e8 +#define XSDM_REG_AGG_INT_MODE_13 0x1661ec +#define XSDM_REG_AGG_INT_MODE_14 0x1661f0 +#define XSDM_REG_AGG_INT_MODE_15 0x1661f4 +#define XSDM_REG_AGG_INT_MODE_16 0x1661f8 +#define XSDM_REG_AGG_INT_MODE_17 0x1661fc +#define XSDM_REG_AGG_INT_MODE_18 0x166200 +#define XSDM_REG_AGG_INT_MODE_19 0x166204 +/* [RW 13] The start address in the internal RAM for the cfc_rsp lcid */ +#define XSDM_REG_CFC_RSP_START_ADDR 0x166008 +/* [RW 16] The maximum value of the competion counter #0 */ +#define XSDM_REG_CMP_COUNTER_MAX0 0x16601c +/* [RW 16] The maximum value of the competion counter #1 */ +#define XSDM_REG_CMP_COUNTER_MAX1 0x166020 +/* [RW 16] The maximum value of the competion counter #2 */ +#define XSDM_REG_CMP_COUNTER_MAX2 0x166024 +/* [RW 16] The maximum value of the competion counter #3 */ +#define XSDM_REG_CMP_COUNTER_MAX3 0x166028 +/* [RW 13] The start address in the internal RAM for the completion + counters. */ +#define XSDM_REG_CMP_COUNTER_START_ADDR 0x16600c +#define XSDM_REG_ENABLE_IN1 0x166238 +#define XSDM_REG_ENABLE_IN2 0x16623c +#define XSDM_REG_ENABLE_OUT1 0x166240 +#define XSDM_REG_ENABLE_OUT2 0x166244 +/* [RW 4] The initial number of messages that can be sent to the pxp control + interface without receiving any ACK. */ +#define XSDM_REG_INIT_CREDIT_PXP_CTRL 0x1664bc +/* [ST 32] The number of ACK after placement messages received */ +#define XSDM_REG_NUM_OF_ACK_AFTER_PLACE 0x16627c +/* [ST 32] The number of packet end messages received from the parser */ +#define XSDM_REG_NUM_OF_PKT_END_MSG 0x166274 +/* [ST 32] The number of requests received from the pxp async if */ +#define XSDM_REG_NUM_OF_PXP_ASYNC_REQ 0x166278 +/* [ST 32] The number of commands received in queue 0 */ +#define XSDM_REG_NUM_OF_Q0_CMD 0x166248 +/* [ST 32] The number of commands received in queue 10 */ +#define XSDM_REG_NUM_OF_Q10_CMD 0x16626c +/* [ST 32] The number of commands received in queue 11 */ +#define XSDM_REG_NUM_OF_Q11_CMD 0x166270 +/* [ST 32] The number of commands received in queue 1 */ +#define XSDM_REG_NUM_OF_Q1_CMD 0x16624c +/* [ST 32] The number of commands received in queue 3 */ +#define XSDM_REG_NUM_OF_Q3_CMD 0x166250 +/* [ST 32] The number of commands received in queue 4 */ +#define XSDM_REG_NUM_OF_Q4_CMD 0x166254 +/* [ST 32] The number of commands received in queue 5 */ +#define XSDM_REG_NUM_OF_Q5_CMD 0x166258 +/* [ST 32] The number of commands received in queue 6 */ +#define XSDM_REG_NUM_OF_Q6_CMD 0x16625c +/* [ST 32] The number of commands received in queue 7 */ +#define XSDM_REG_NUM_OF_Q7_CMD 0x166260 +/* [ST 32] The number of commands received in queue 8 */ +#define XSDM_REG_NUM_OF_Q8_CMD 0x166264 +/* [ST 32] The number of commands received in queue 9 */ +#define XSDM_REG_NUM_OF_Q9_CMD 0x166268 +/* [RW 13] The start address in the internal RAM for queue counters */ +#define XSDM_REG_Q_COUNTER_START_ADDR 0x166010 +/* [R 1] pxp_ctrl rd_data fifo empty in sdm_dma_rsp block */ +#define XSDM_REG_RSP_PXP_CTRL_RDATA_EMPTY 0x166548 +/* [R 1] parser fifo empty in sdm_sync block */ +#define XSDM_REG_SYNC_PARSER_EMPTY 0x166550 +/* [R 1] parser serial fifo empty in sdm_sync block */ +#define XSDM_REG_SYNC_SYNC_EMPTY 0x166558 +/* [RW 32] Tick for timer counter. Applicable only when + ~xsdm_registers_timer_tick_enable.timer_tick_enable =1 */ +#define XSDM_REG_TIMER_TICK 0x166000 +/* [RW 32] Interrupt mask register #0 read/write */ +#define XSDM_REG_XSDM_INT_MASK_0 0x16629c +#define XSDM_REG_XSDM_INT_MASK_1 0x1662ac +/* [R 32] Interrupt register #0 read */ +#define XSDM_REG_XSDM_INT_STS_0 0x166290 +#define XSDM_REG_XSDM_INT_STS_1 0x1662a0 +/* [RW 11] Parity mask register #0 read/write */ +#define XSDM_REG_XSDM_PRTY_MASK 0x1662bc +/* [R 11] Parity register #0 read */ +#define XSDM_REG_XSDM_PRTY_STS 0x1662b0 +/* [RW 5] The number of time_slots in the arbitration cycle */ +#define XSEM_REG_ARB_CYCLE_SIZE 0x280034 +/* [RW 3] The source that is associated with arbitration element 0. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2 */ +#define XSEM_REG_ARB_ELEMENT0 0x280020 +/* [RW 3] The source that is associated with arbitration element 1. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~xsem_registers_arb_element0.arb_element0 */ +#define XSEM_REG_ARB_ELEMENT1 0x280024 +/* [RW 3] The source that is associated with arbitration element 2. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~xsem_registers_arb_element0.arb_element0 + and ~xsem_registers_arb_element1.arb_element1 */ +#define XSEM_REG_ARB_ELEMENT2 0x280028 +/* [RW 3] The source that is associated with arbitration element 3. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2.Could + not be equal to register ~xsem_registers_arb_element0.arb_element0 and + ~xsem_registers_arb_element1.arb_element1 and + ~xsem_registers_arb_element2.arb_element2 */ +#define XSEM_REG_ARB_ELEMENT3 0x28002c +/* [RW 3] The source that is associated with arbitration element 4. Source + decoding is: 0- foc0; 1-fic1; 2-sleeping thread with priority 0; 3- + sleeping thread with priority 1; 4- sleeping thread with priority 2. + Could not be equal to register ~xsem_registers_arb_element0.arb_element0 + and ~xsem_registers_arb_element1.arb_element1 and + ~xsem_registers_arb_element2.arb_element2 and + ~xsem_registers_arb_element3.arb_element3 */ +#define XSEM_REG_ARB_ELEMENT4 0x280030 +#define XSEM_REG_ENABLE_IN 0x2800a4 +#define XSEM_REG_ENABLE_OUT 0x2800a8 +/* [RW 32] This address space contains all registers and memories that are + placed in SEM_FAST block. The SEM_FAST registers are described in + appendix B. In order to access the sem_fast registers the base address + ~fast_memory.fast_memory should be added to eachsem_fast register offset. */ +#define XSEM_REG_FAST_MEMORY 0x2a0000 +/* [RW 1] Disables input messages from FIC0 May be updated during run_time + by the microcode */ +#define XSEM_REG_FIC0_DISABLE 0x280224 +/* [RW 1] Disables input messages from FIC1 May be updated during run_time + by the microcode */ +#define XSEM_REG_FIC1_DISABLE 0x280234 +/* [RW 15] Interrupt table Read and write access to it is not possible in + the middle of the work */ +#define XSEM_REG_INT_TABLE 0x280400 +/* [ST 24] Statistics register. The number of messages that entered through + FIC0 */ +#define XSEM_REG_MSG_NUM_FIC0 0x280000 +/* [ST 24] Statistics register. The number of messages that entered through + FIC1 */ +#define XSEM_REG_MSG_NUM_FIC1 0x280004 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC0 */ +#define XSEM_REG_MSG_NUM_FOC0 0x280008 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC1 */ +#define XSEM_REG_MSG_NUM_FOC1 0x28000c +/* [ST 24] Statistics register. The number of messages that were sent to + FOC2 */ +#define XSEM_REG_MSG_NUM_FOC2 0x280010 +/* [ST 24] Statistics register. The number of messages that were sent to + FOC3 */ +#define XSEM_REG_MSG_NUM_FOC3 0x280014 +/* [WB 128] Debug only. Passive buffer memory */ +#define XSEM_REG_PASSIVE_BUFFER 0x282000 +/* [RW 1] Disables input messages from the passive buffer May be updated + during run_time by the microcode */ +#define XSEM_REG_PAS_DISABLE 0x28024c +/* [WB 46] pram memory. B45 is parity; b[44:0] - data. */ +#define XSEM_REG_PRAM 0x2c0000 +/* [R 16] Valid sleeping threads indication have bit per thread */ +#define XSEM_REG_SLEEP_THREADS_VALID 0x28026c +/* [R 1] EXT_STORE FIFO is empty in sem_slow_ls_ext */ +#define XSEM_REG_SLOW_EXT_STORE_EMPTY 0x2802a0 +/* [RW 16] List of free threads . There is a bit per thread. */ +#define XSEM_REG_THREADS_LIST 0x2802e4 +/* [RW 3] The arbitration scheme of time_slot 0 */ +#define XSEM_REG_TS_0_AS 0x280038 +/* [RW 3] The arbitration scheme of time_slot 10 */ +#define XSEM_REG_TS_10_AS 0x280060 +/* [RW 3] The arbitration scheme of time_slot 11 */ +#define XSEM_REG_TS_11_AS 0x280064 +/* [RW 3] The arbitration scheme of time_slot 12 */ +#define XSEM_REG_TS_12_AS 0x280068 +/* [RW 3] The arbitration scheme of time_slot 13 */ +#define XSEM_REG_TS_13_AS 0x28006c +/* [RW 3] The arbitration scheme of time_slot 14 */ +#define XSEM_REG_TS_14_AS 0x280070 +/* [RW 3] The arbitration scheme of time_slot 15 */ +#define XSEM_REG_TS_15_AS 0x280074 +/* [RW 3] The arbitration scheme of time_slot 16 */ +#define XSEM_REG_TS_16_AS 0x280078 +/* [RW 3] The arbitration scheme of time_slot 17 */ +#define XSEM_REG_TS_17_AS 0x28007c +/* [RW 3] The arbitration scheme of time_slot 18 */ +#define XSEM_REG_TS_18_AS 0x280080 +/* [RW 3] The arbitration scheme of time_slot 1 */ +#define XSEM_REG_TS_1_AS 0x28003c +/* [RW 3] The arbitration scheme of time_slot 2 */ +#define XSEM_REG_TS_2_AS 0x280040 +/* [RW 3] The arbitration scheme of time_slot 3 */ +#define XSEM_REG_TS_3_AS 0x280044 +/* [RW 3] The arbitration scheme of time_slot 4 */ +#define XSEM_REG_TS_4_AS 0x280048 +/* [RW 3] The arbitration scheme of time_slot 5 */ +#define XSEM_REG_TS_5_AS 0x28004c +/* [RW 3] The arbitration scheme of time_slot 6 */ +#define XSEM_REG_TS_6_AS 0x280050 +/* [RW 3] The arbitration scheme of time_slot 7 */ +#define XSEM_REG_TS_7_AS 0x280054 +/* [RW 3] The arbitration scheme of time_slot 8 */ +#define XSEM_REG_TS_8_AS 0x280058 +/* [RW 3] The arbitration scheme of time_slot 9 */ +#define XSEM_REG_TS_9_AS 0x28005c +/* [RW 32] Interrupt mask register #0 read/write */ +#define XSEM_REG_XSEM_INT_MASK_0 0x280110 +#define XSEM_REG_XSEM_INT_MASK_1 0x280120 +/* [R 32] Interrupt register #0 read */ +#define XSEM_REG_XSEM_INT_STS_0 0x280104 +#define XSEM_REG_XSEM_INT_STS_1 0x280114 +/* [RW 32] Parity mask register #0 read/write */ +#define XSEM_REG_XSEM_PRTY_MASK_0 0x280130 +#define XSEM_REG_XSEM_PRTY_MASK_1 0x280140 +/* [R 32] Parity register #0 read */ +#define XSEM_REG_XSEM_PRTY_STS_0 0x280124 +#define XSEM_REG_XSEM_PRTY_STS_1 0x280134 +#define MCPR_NVM_ACCESS_ENABLE_EN (1L<<0) +#define MCPR_NVM_ACCESS_ENABLE_WR_EN (1L<<1) +#define MCPR_NVM_ADDR_NVM_ADDR_VALUE (0xffffffL<<0) +#define MCPR_NVM_CFG4_FLASH_SIZE (0x7L<<0) +#define MCPR_NVM_COMMAND_DOIT (1L<<4) +#define MCPR_NVM_COMMAND_DONE (1L<<3) +#define MCPR_NVM_COMMAND_FIRST (1L<<7) +#define MCPR_NVM_COMMAND_LAST (1L<<8) +#define MCPR_NVM_COMMAND_WR (1L<<5) +#define MCPR_NVM_COMMAND_WREN (1L<<16) +#define MCPR_NVM_COMMAND_WREN_BITSHIFT 16 +#define MCPR_NVM_COMMAND_WRDI (1L<<17) +#define MCPR_NVM_COMMAND_WRDI_BITSHIFT 17 +#define MCPR_NVM_SW_ARB_ARB_ARB1 (1L<<9) +#define MCPR_NVM_SW_ARB_ARB_REQ_CLR1 (1L<<5) +#define MCPR_NVM_SW_ARB_ARB_REQ_SET1 (1L<<1) +#define BIGMAC_REGISTER_BMAC_CONTROL (0x00<<3) +#define BIGMAC_REGISTER_BMAC_XGXS_CONTROL (0x01<<3) +#define BIGMAC_REGISTER_CNT_MAX_SIZE (0x05<<3) +#define BIGMAC_REGISTER_RX_CONTROL (0x21<<3) +#define BIGMAC_REGISTER_RX_LLFC_MSG_FLDS (0x46<<3) +#define BIGMAC_REGISTER_RX_MAX_SIZE (0x23<<3) +#define BIGMAC_REGISTER_RX_STAT_GR64 (0x26<<3) +#define BIGMAC_REGISTER_RX_STAT_GRIPJ (0x42<<3) +#define BIGMAC_REGISTER_TX_CONTROL (0x07<<3) +#define BIGMAC_REGISTER_TX_MAX_SIZE (0x09<<3) +#define BIGMAC_REGISTER_TX_PAUSE_THRESHOLD (0x0A<<3) +#define BIGMAC_REGISTER_TX_SOURCE_ADDR (0x08<<3) +#define BIGMAC_REGISTER_TX_STAT_GTBYT (0x20<<3) +#define BIGMAC_REGISTER_TX_STAT_GTPKT (0x0C<<3) +#define EMAC_LED_1000MB_OVERRIDE (1L<<1) +#define EMAC_LED_100MB_OVERRIDE (1L<<2) +#define EMAC_LED_10MB_OVERRIDE (1L<<3) +#define EMAC_LED_2500MB_OVERRIDE (1L<<12) +#define EMAC_LED_OVERRIDE (1L<<0) +#define EMAC_LED_TRAFFIC (1L<<6) +#define EMAC_MDIO_COMM_COMMAND_ADDRESS (0L<<26) +#define EMAC_MDIO_COMM_COMMAND_READ_45 (3L<<26) +#define EMAC_MDIO_COMM_COMMAND_WRITE_45 (1L<<26) +#define EMAC_MDIO_COMM_DATA (0xffffL<<0) +#define EMAC_MDIO_COMM_START_BUSY (1L<<29) +#define EMAC_MDIO_MODE_AUTO_POLL (1L<<4) +#define EMAC_MDIO_MODE_CLAUSE_45 (1L<<31) +#define EMAC_MDIO_MODE_CLOCK_CNT (0x3fL<<16) +#define EMAC_MDIO_MODE_CLOCK_CNT_BITSHIFT 16 +#define EMAC_MODE_25G_MODE (1L<<5) +#define EMAC_MODE_HALF_DUPLEX (1L<<1) +#define EMAC_MODE_PORT_GMII (2L<<2) +#define EMAC_MODE_PORT_MII (1L<<2) +#define EMAC_MODE_PORT_MII_10M (3L<<2) +#define EMAC_MODE_RESET (1L<<0) +#define EMAC_REG_EMAC_LED 0xc +#define EMAC_REG_EMAC_MAC_MATCH 0x10 +#define EMAC_REG_EMAC_MDIO_COMM 0xac +#define EMAC_REG_EMAC_MDIO_MODE 0xb4 +#define EMAC_REG_EMAC_MODE 0x0 +#define EMAC_REG_EMAC_RX_MODE 0xc8 +#define EMAC_REG_EMAC_RX_MTU_SIZE 0x9c +#define EMAC_REG_EMAC_RX_STAT_AC 0x180 +#define EMAC_REG_EMAC_RX_STAT_AC_28 0x1f4 +#define EMAC_REG_EMAC_RX_STAT_AC_COUNT 23 +#define EMAC_REG_EMAC_TX_MODE 0xbc +#define EMAC_REG_EMAC_TX_STAT_AC 0x280 +#define EMAC_REG_EMAC_TX_STAT_AC_COUNT 22 +#define EMAC_RX_MODE_FLOW_EN (1L<<2) +#define EMAC_RX_MODE_KEEP_VLAN_TAG (1L<<10) +#define EMAC_RX_MODE_PROMISCUOUS (1L<<8) +#define EMAC_RX_MODE_RESET (1L<<0) +#define EMAC_RX_MTU_SIZE_JUMBO_ENA (1L<<31) +#define EMAC_TX_MODE_EXT_PAUSE_EN (1L<<3) +#define EMAC_TX_MODE_FLOW_EN (1L<<4) +#define EMAC_TX_MODE_RESET (1L<<0) +#define MISC_REGISTERS_GPIO_0 0 +#define MISC_REGISTERS_GPIO_1 1 +#define MISC_REGISTERS_GPIO_2 2 +#define MISC_REGISTERS_GPIO_3 3 +#define MISC_REGISTERS_GPIO_CLR_POS 16 +#define MISC_REGISTERS_GPIO_FLOAT (0xffL<<24) +#define MISC_REGISTERS_GPIO_FLOAT_POS 24 +#define MISC_REGISTERS_GPIO_HIGH 1 +#define MISC_REGISTERS_GPIO_INPUT_HI_Z 2 +#define MISC_REGISTERS_GPIO_INT_CLR_POS 24 +#define MISC_REGISTERS_GPIO_INT_OUTPUT_CLR 0 +#define MISC_REGISTERS_GPIO_INT_OUTPUT_SET 1 +#define MISC_REGISTERS_GPIO_INT_SET_POS 16 +#define MISC_REGISTERS_GPIO_LOW 0 +#define MISC_REGISTERS_GPIO_OUTPUT_HIGH 1 +#define MISC_REGISTERS_GPIO_OUTPUT_LOW 0 +#define MISC_REGISTERS_GPIO_PORT_SHIFT 4 +#define MISC_REGISTERS_GPIO_SET_POS 8 +#define MISC_REGISTERS_RESET_REG_1_CLEAR 0x588 +#define MISC_REGISTERS_RESET_REG_1_RST_NIG (0x1<<7) +#define MISC_REGISTERS_RESET_REG_1_SET 0x584 +#define MISC_REGISTERS_RESET_REG_2_CLEAR 0x598 +#define MISC_REGISTERS_RESET_REG_2_RST_BMAC0 (0x1<<0) +#define MISC_REGISTERS_RESET_REG_2_RST_EMAC0_HARD_CORE (0x1<<14) +#define MISC_REGISTERS_RESET_REG_2_SET 0x594 +#define MISC_REGISTERS_RESET_REG_3_CLEAR 0x5a8 +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_IDDQ (0x1<<1) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN (0x1<<2) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_PWRDWN_SD (0x1<<3) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_SERDES0_RSTB_HW (0x1<<0) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_IDDQ (0x1<<5) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN (0x1<<6) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_PWRDWN_SD (0x1<<7) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_RSTB_HW (0x1<<4) +#define MISC_REGISTERS_RESET_REG_3_MISC_NIG_MUX_XGXS0_TXD_FIFO_RSTB (0x1<<8) +#define MISC_REGISTERS_RESET_REG_3_SET 0x5a4 +#define MISC_REGISTERS_SPIO_4 4 +#define MISC_REGISTERS_SPIO_5 5 +#define MISC_REGISTERS_SPIO_7 7 +#define MISC_REGISTERS_SPIO_CLR_POS 16 +#define MISC_REGISTERS_SPIO_FLOAT (0xffL<<24) +#define GRC_MISC_REGISTERS_SPIO_FLOAT7 0x80000000 +#define GRC_MISC_REGISTERS_SPIO_FLOAT6 0x40000000 +#define GRC_MISC_REGISTERS_SPIO_FLOAT5 0x20000000 +#define GRC_MISC_REGISTERS_SPIO_FLOAT4 0x10000000 +#define MISC_REGISTERS_SPIO_FLOAT_POS 24 +#define MISC_REGISTERS_SPIO_INPUT_HI_Z 2 +#define MISC_REGISTERS_SPIO_INT_OLD_SET_POS 16 +#define MISC_REGISTERS_SPIO_OUTPUT_HIGH 1 +#define MISC_REGISTERS_SPIO_OUTPUT_LOW 0 +#define MISC_REGISTERS_SPIO_SET_POS 8 +#define HW_LOCK_MAX_RESOURCE_VALUE 31 +#define HW_LOCK_RESOURCE_GPIO 1 +#define HW_LOCK_RESOURCE_MDIO 0 +#define HW_LOCK_RESOURCE_PORT0_ATT_MASK 3 +#define HW_LOCK_RESOURCE_SPIO 2 +#define HW_LOCK_RESOURCE_UNDI 5 +#define PRS_FLAG_OVERETH_IPV4 1 +#define AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR (1<<18) +#define AEU_INPUTS_ATTN_BITS_CCM_HW_INTERRUPT (1<<31) +#define AEU_INPUTS_ATTN_BITS_CDU_HW_INTERRUPT (1<<9) +#define AEU_INPUTS_ATTN_BITS_CDU_PARITY_ERROR (1<<8) +#define AEU_INPUTS_ATTN_BITS_CFC_HW_INTERRUPT (1<<7) +#define AEU_INPUTS_ATTN_BITS_CFC_PARITY_ERROR (1<<6) +#define AEU_INPUTS_ATTN_BITS_CSDM_HW_INTERRUPT (1<<29) +#define AEU_INPUTS_ATTN_BITS_CSDM_PARITY_ERROR (1<<28) +#define AEU_INPUTS_ATTN_BITS_CSEMI_HW_INTERRUPT (1<<1) +#define AEU_INPUTS_ATTN_BITS_CSEMI_PARITY_ERROR (1<<0) +#define AEU_INPUTS_ATTN_BITS_DEBUG_PARITY_ERROR (1<<18) +#define AEU_INPUTS_ATTN_BITS_DMAE_HW_INTERRUPT (1<<11) +#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_HW_INTERRUPT (1<<13) +#define AEU_INPUTS_ATTN_BITS_DOORBELLQ_PARITY_ERROR (1<<12) +#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_0 (1<<5) +#define AEU_INPUTS_ATTN_BITS_GPIO3_FUNCTION_1 (1<<9) +#define AEU_INPUTS_ATTN_BITS_IGU_PARITY_ERROR (1<<12) +#define AEU_INPUTS_ATTN_BITS_MISC_HW_INTERRUPT (1<<15) +#define AEU_INPUTS_ATTN_BITS_MISC_PARITY_ERROR (1<<14) +#define AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR (1<<20) +#define AEU_INPUTS_ATTN_BITS_PBCLIENT_PARITY_ERROR (1<<0) +#define AEU_INPUTS_ATTN_BITS_PBF_HW_INTERRUPT (1<<31) +#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_HW_INTERRUPT (1<<5) +#define AEU_INPUTS_ATTN_BITS_PXPPCICLOCKCLIENT_PARITY_ERROR (1<<4) +#define AEU_INPUTS_ATTN_BITS_PXP_HW_INTERRUPT (1<<3) +#define AEU_INPUTS_ATTN_BITS_PXP_PARITY_ERROR (1<<2) +#define AEU_INPUTS_ATTN_BITS_QM_HW_INTERRUPT (1<<3) +#define AEU_INPUTS_ATTN_BITS_QM_PARITY_ERROR (1<<2) +#define AEU_INPUTS_ATTN_BITS_SEARCHER_PARITY_ERROR (1<<22) +#define AEU_INPUTS_ATTN_BITS_SPIO5 (1<<15) +#define AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT (1<<27) +#define AEU_INPUTS_ATTN_BITS_TIMERS_HW_INTERRUPT (1<<5) +#define AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT (1<<25) +#define AEU_INPUTS_ATTN_BITS_TSDM_PARITY_ERROR (1<<24) +#define AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT (1<<29) +#define AEU_INPUTS_ATTN_BITS_TSEMI_PARITY_ERROR (1<<28) +#define AEU_INPUTS_ATTN_BITS_UCM_HW_INTERRUPT (1<<23) +#define AEU_INPUTS_ATTN_BITS_UPB_HW_INTERRUPT (1<<27) +#define AEU_INPUTS_ATTN_BITS_UPB_PARITY_ERROR (1<<26) +#define AEU_INPUTS_ATTN_BITS_USDM_HW_INTERRUPT (1<<21) +#define AEU_INPUTS_ATTN_BITS_USDM_PARITY_ERROR (1<<20) +#define AEU_INPUTS_ATTN_BITS_USEMI_HW_INTERRUPT (1<<25) +#define AEU_INPUTS_ATTN_BITS_USEMI_PARITY_ERROR (1<<24) +#define AEU_INPUTS_ATTN_BITS_VAUX_PCI_CORE_PARITY_ERROR (1<<16) +#define AEU_INPUTS_ATTN_BITS_XCM_HW_INTERRUPT (1<<9) +#define AEU_INPUTS_ATTN_BITS_XSDM_HW_INTERRUPT (1<<7) +#define AEU_INPUTS_ATTN_BITS_XSDM_PARITY_ERROR (1<<6) +#define AEU_INPUTS_ATTN_BITS_XSEMI_HW_INTERRUPT (1<<11) +#define AEU_INPUTS_ATTN_BITS_XSEMI_PARITY_ERROR (1<<10) +#define RESERVED_GENERAL_ATTENTION_BIT_0 0 + +#define EVEREST_GEN_ATTN_IN_USE_MASK 0x3ffe0 +#define EVEREST_LATCHED_ATTN_IN_USE_MASK 0xffe00000 + +#define RESERVED_GENERAL_ATTENTION_BIT_6 6 +#define RESERVED_GENERAL_ATTENTION_BIT_7 7 +#define RESERVED_GENERAL_ATTENTION_BIT_8 8 +#define RESERVED_GENERAL_ATTENTION_BIT_9 9 +#define RESERVED_GENERAL_ATTENTION_BIT_10 10 +#define RESERVED_GENERAL_ATTENTION_BIT_11 11 +#define RESERVED_GENERAL_ATTENTION_BIT_12 12 +#define RESERVED_GENERAL_ATTENTION_BIT_13 13 +#define RESERVED_GENERAL_ATTENTION_BIT_14 14 +#define RESERVED_GENERAL_ATTENTION_BIT_15 15 +#define RESERVED_GENERAL_ATTENTION_BIT_16 16 +#define RESERVED_GENERAL_ATTENTION_BIT_17 17 +#define RESERVED_GENERAL_ATTENTION_BIT_18 18 +#define RESERVED_GENERAL_ATTENTION_BIT_19 19 +#define RESERVED_GENERAL_ATTENTION_BIT_20 20 +#define RESERVED_GENERAL_ATTENTION_BIT_21 21 + +/* storm asserts attention bits */ +#define TSTORM_FATAL_ASSERT_ATTENTION_BIT RESERVED_GENERAL_ATTENTION_BIT_7 +#define USTORM_FATAL_ASSERT_ATTENTION_BIT RESERVED_GENERAL_ATTENTION_BIT_8 +#define CSTORM_FATAL_ASSERT_ATTENTION_BIT RESERVED_GENERAL_ATTENTION_BIT_9 +#define XSTORM_FATAL_ASSERT_ATTENTION_BIT RESERVED_GENERAL_ATTENTION_BIT_10 + +/* mcp error attention bit */ +#define MCP_FATAL_ASSERT_ATTENTION_BIT RESERVED_GENERAL_ATTENTION_BIT_11 + +/*E1H NIG status sync attention mapped to group 4-7*/ +#define LINK_SYNC_ATTENTION_BIT_FUNC_0 RESERVED_GENERAL_ATTENTION_BIT_12 +#define LINK_SYNC_ATTENTION_BIT_FUNC_1 RESERVED_GENERAL_ATTENTION_BIT_13 +#define LINK_SYNC_ATTENTION_BIT_FUNC_2 RESERVED_GENERAL_ATTENTION_BIT_14 +#define LINK_SYNC_ATTENTION_BIT_FUNC_3 RESERVED_GENERAL_ATTENTION_BIT_15 +#define LINK_SYNC_ATTENTION_BIT_FUNC_4 RESERVED_GENERAL_ATTENTION_BIT_16 +#define LINK_SYNC_ATTENTION_BIT_FUNC_5 RESERVED_GENERAL_ATTENTION_BIT_17 +#define LINK_SYNC_ATTENTION_BIT_FUNC_6 RESERVED_GENERAL_ATTENTION_BIT_18 +#define LINK_SYNC_ATTENTION_BIT_FUNC_7 RESERVED_GENERAL_ATTENTION_BIT_19 + + +#define LATCHED_ATTN_RBCR 23 +#define LATCHED_ATTN_RBCT 24 +#define LATCHED_ATTN_RBCN 25 +#define LATCHED_ATTN_RBCU 26 +#define LATCHED_ATTN_RBCP 27 +#define LATCHED_ATTN_TIMEOUT_GRC 28 +#define LATCHED_ATTN_RSVD_GRC 29 +#define LATCHED_ATTN_ROM_PARITY_MCP 30 +#define LATCHED_ATTN_UM_RX_PARITY_MCP 31 +#define LATCHED_ATTN_UM_TX_PARITY_MCP 32 +#define LATCHED_ATTN_SCPAD_PARITY_MCP 33 + +#define GENERAL_ATTEN_WORD(atten_name) ((94 + atten_name) / 32) +#define GENERAL_ATTEN_OFFSET(atten_name) (1 << ((94 + atten_name) % 32)) +/* + * This file defines GRC base address for every block. + * This file is included by chipsim, asm microcode and cpp microcode. + * These values are used in Design.xml on regBase attribute + * Use the base with the generated offsets of specific registers. + */ + +#define GRCBASE_PXPCS 0x000000 +#define GRCBASE_PCICONFIG 0x002000 +#define GRCBASE_PCIREG 0x002400 +#define GRCBASE_EMAC0 0x008000 +#define GRCBASE_EMAC1 0x008400 +#define GRCBASE_DBU 0x008800 +#define GRCBASE_MISC 0x00A000 +#define GRCBASE_DBG 0x00C000 +#define GRCBASE_NIG 0x010000 +#define GRCBASE_XCM 0x020000 +#define GRCBASE_PRS 0x040000 +#define GRCBASE_SRCH 0x040400 +#define GRCBASE_TSDM 0x042000 +#define GRCBASE_TCM 0x050000 +#define GRCBASE_BRB1 0x060000 +#define GRCBASE_MCP 0x080000 +#define GRCBASE_UPB 0x0C1000 +#define GRCBASE_CSDM 0x0C2000 +#define GRCBASE_USDM 0x0C4000 +#define GRCBASE_CCM 0x0D0000 +#define GRCBASE_UCM 0x0E0000 +#define GRCBASE_CDU 0x101000 +#define GRCBASE_DMAE 0x102000 +#define GRCBASE_PXP 0x103000 +#define GRCBASE_CFC 0x104000 +#define GRCBASE_HC 0x108000 +#define GRCBASE_PXP2 0x120000 +#define GRCBASE_PBF 0x140000 +#define GRCBASE_XPB 0x161000 +#define GRCBASE_TIMERS 0x164000 +#define GRCBASE_XSDM 0x166000 +#define GRCBASE_QM 0x168000 +#define GRCBASE_DQ 0x170000 +#define GRCBASE_TSEM 0x180000 +#define GRCBASE_CSEM 0x200000 +#define GRCBASE_XSEM 0x280000 +#define GRCBASE_USEM 0x300000 +#define GRCBASE_MISC_AEU GRCBASE_MISC + + +/* offset of configuration space in the pci core register */ +#define PCICFG_OFFSET 0x2000 +#define PCICFG_VENDOR_ID_OFFSET 0x00 +#define PCICFG_DEVICE_ID_OFFSET 0x02 +#define PCICFG_COMMAND_OFFSET 0x04 +#define PCICFG_COMMAND_IO_SPACE (1<<0) +#define PCICFG_COMMAND_MEM_SPACE (1<<1) +#define PCICFG_COMMAND_BUS_MASTER (1<<2) +#define PCICFG_COMMAND_SPECIAL_CYCLES (1<<3) +#define PCICFG_COMMAND_MWI_CYCLES (1<<4) +#define PCICFG_COMMAND_VGA_SNOOP (1<<5) +#define PCICFG_COMMAND_PERR_ENA (1<<6) +#define PCICFG_COMMAND_STEPPING (1<<7) +#define PCICFG_COMMAND_SERR_ENA (1<<8) +#define PCICFG_COMMAND_FAST_B2B (1<<9) +#define PCICFG_COMMAND_INT_DISABLE (1<<10) +#define PCICFG_COMMAND_RESERVED (0x1f<<11) +#define PCICFG_STATUS_OFFSET 0x06 +#define PCICFG_REVESION_ID_OFFSET 0x08 +#define PCICFG_CACHE_LINE_SIZE 0x0c +#define PCICFG_LATENCY_TIMER 0x0d +#define PCICFG_BAR_1_LOW 0x10 +#define PCICFG_BAR_1_HIGH 0x14 +#define PCICFG_BAR_2_LOW 0x18 +#define PCICFG_BAR_2_HIGH 0x1c +#define PCICFG_SUBSYSTEM_VENDOR_ID_OFFSET 0x2c +#define PCICFG_SUBSYSTEM_ID_OFFSET 0x2e +#define PCICFG_INT_LINE 0x3c +#define PCICFG_INT_PIN 0x3d +#define PCICFG_PM_CAPABILITY 0x48 +#define PCICFG_PM_CAPABILITY_VERSION (0x3<<16) +#define PCICFG_PM_CAPABILITY_CLOCK (1<<19) +#define PCICFG_PM_CAPABILITY_RESERVED (1<<20) +#define PCICFG_PM_CAPABILITY_DSI (1<<21) +#define PCICFG_PM_CAPABILITY_AUX_CURRENT (0x7<<22) +#define PCICFG_PM_CAPABILITY_D1_SUPPORT (1<<25) +#define PCICFG_PM_CAPABILITY_D2_SUPPORT (1<<26) +#define PCICFG_PM_CAPABILITY_PME_IN_D0 (1<<27) +#define PCICFG_PM_CAPABILITY_PME_IN_D1 (1<<28) +#define PCICFG_PM_CAPABILITY_PME_IN_D2 (1<<29) +#define PCICFG_PM_CAPABILITY_PME_IN_D3_HOT (1<<30) +#define PCICFG_PM_CAPABILITY_PME_IN_D3_COLD (1<<31) +#define PCICFG_PM_CSR_OFFSET 0x4c +#define PCICFG_PM_CSR_STATE (0x3<<0) +#define PCICFG_PM_CSR_PME_ENABLE (1<<8) +#define PCICFG_PM_CSR_PME_STATUS (1<<15) +#define PCICFG_MSI_CAP_ID_OFFSET 0x58 +#define PCICFG_MSI_CONTROL_ENABLE (0x1<<16) +#define PCICFG_MSI_CONTROL_MCAP (0x7<<17) +#define PCICFG_MSI_CONTROL_MENA (0x7<<20) +#define PCICFG_MSI_CONTROL_64_BIT_ADDR_CAP (0x1<<23) +#define PCICFG_MSI_CONTROL_MSI_PVMASK_CAPABLE (0x1<<24) +#define PCICFG_GRC_ADDRESS 0x78 +#define PCICFG_GRC_DATA 0x80 +#define PCICFG_MSIX_CAP_ID_OFFSET 0xa0 +#define PCICFG_MSIX_CONTROL_TABLE_SIZE (0x7ff<<16) +#define PCICFG_MSIX_CONTROL_RESERVED (0x7<<27) +#define PCICFG_MSIX_CONTROL_FUNC_MASK (0x1<<30) +#define PCICFG_MSIX_CONTROL_MSIX_ENABLE (0x1<<31) + +#define PCICFG_DEVICE_CONTROL 0xb4 +#define PCICFG_DEVICE_STATUS 0xb6 +#define PCICFG_DEVICE_STATUS_CORR_ERR_DET (1<<0) +#define PCICFG_DEVICE_STATUS_NON_FATAL_ERR_DET (1<<1) +#define PCICFG_DEVICE_STATUS_FATAL_ERR_DET (1<<2) +#define PCICFG_DEVICE_STATUS_UNSUP_REQ_DET (1<<3) +#define PCICFG_DEVICE_STATUS_AUX_PWR_DET (1<<4) +#define PCICFG_DEVICE_STATUS_NO_PEND (1<<5) +#define PCICFG_LINK_CONTROL 0xbc + + +#define BAR_USTRORM_INTMEM 0x400000 +#define BAR_CSTRORM_INTMEM 0x410000 +#define BAR_XSTRORM_INTMEM 0x420000 +#define BAR_TSTRORM_INTMEM 0x430000 + +/* for accessing the IGU in case of status block ACK */ +#define BAR_IGU_INTMEM 0x440000 + +#define BAR_DOORBELL_OFFSET 0x800000 + +#define BAR_ME_REGISTER 0x450000 + +/* config_2 offset */ +#define GRC_CONFIG_2_SIZE_REG 0x408 +#define PCI_CONFIG_2_BAR1_SIZE (0xfL<<0) +#define PCI_CONFIG_2_BAR1_SIZE_DISABLED (0L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_64K (1L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_128K (2L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_256K (3L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_512K (4L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_1M (5L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_2M (6L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_4M (7L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_8M (8L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_16M (9L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_32M (10L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_64M (11L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_128M (12L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_256M (13L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_512M (14L<<0) +#define PCI_CONFIG_2_BAR1_SIZE_1G (15L<<0) +#define PCI_CONFIG_2_BAR1_64ENA (1L<<4) +#define PCI_CONFIG_2_EXP_ROM_RETRY (1L<<5) +#define PCI_CONFIG_2_CFG_CYCLE_RETRY (1L<<6) +#define PCI_CONFIG_2_FIRST_CFG_DONE (1L<<7) +#define PCI_CONFIG_2_EXP_ROM_SIZE (0xffL<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_DISABLED (0L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_2K (1L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_4K (2L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_8K (3L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_16K (4L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_32K (5L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_64K (6L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_128K (7L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_256K (8L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_512K (9L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_1M (10L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_2M (11L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_4M (12L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_8M (13L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_16M (14L<<8) +#define PCI_CONFIG_2_EXP_ROM_SIZE_32M (15L<<8) +#define PCI_CONFIG_2_BAR_PREFETCH (1L<<16) +#define PCI_CONFIG_2_RESERVED0 (0x7fffL<<17) + +/* config_3 offset */ +#define GRC_CONFIG_3_SIZE_REG 0x40c +#define PCI_CONFIG_3_STICKY_BYTE (0xffL<<0) +#define PCI_CONFIG_3_FORCE_PME (1L<<24) +#define PCI_CONFIG_3_PME_STATUS (1L<<25) +#define PCI_CONFIG_3_PME_ENABLE (1L<<26) +#define PCI_CONFIG_3_PM_STATE (0x3L<<27) +#define PCI_CONFIG_3_VAUX_PRESET (1L<<30) +#define PCI_CONFIG_3_PCI_POWER (1L<<31) + +#define GRC_BAR2_CONFIG 0x4e0 +#define PCI_CONFIG_2_BAR2_SIZE (0xfL<<0) +#define PCI_CONFIG_2_BAR2_SIZE_DISABLED (0L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_64K (1L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_128K (2L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_256K (3L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_512K (4L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_1M (5L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_2M (6L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_4M (7L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_8M (8L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_16M (9L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_32M (10L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_64M (11L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_128M (12L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_256M (13L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_512M (14L<<0) +#define PCI_CONFIG_2_BAR2_SIZE_1G (15L<<0) +#define PCI_CONFIG_2_BAR2_64ENA (1L<<4) + +#define PCI_PM_DATA_A 0x410 +#define PCI_PM_DATA_B 0x414 +#define PCI_ID_VAL1 0x434 +#define PCI_ID_VAL2 0x438 + + +#define MDIO_REG_BANK_CL73_IEEEB0 0x0 +#define MDIO_CL73_IEEEB0_CL73_AN_CONTROL 0x0 +#define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_RESTART_AN 0x0200 +#define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_AN_EN 0x1000 +#define MDIO_CL73_IEEEB0_CL73_AN_CONTROL_MAIN_RST 0x8000 + +#define MDIO_REG_BANK_CL73_IEEEB1 0x10 +#define MDIO_CL73_IEEEB1_AN_ADV2 0x01 +#define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M 0x0000 +#define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_1000M_KX 0x0020 +#define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KX4 0x0040 +#define MDIO_CL73_IEEEB1_AN_ADV2_ADVR_10G_KR 0x0080 + +#define MDIO_REG_BANK_RX0 0x80b0 +#define MDIO_RX0_RX_EQ_BOOST 0x1c +#define MDIO_RX0_RX_EQ_BOOST_EQUALIZER_CTRL_MASK 0x7 +#define MDIO_RX0_RX_EQ_BOOST_OFFSET_CTRL 0x10 + +#define MDIO_REG_BANK_RX1 0x80c0 +#define MDIO_RX1_RX_EQ_BOOST 0x1c +#define MDIO_RX1_RX_EQ_BOOST_EQUALIZER_CTRL_MASK 0x7 +#define MDIO_RX1_RX_EQ_BOOST_OFFSET_CTRL 0x10 + +#define MDIO_REG_BANK_RX2 0x80d0 +#define MDIO_RX2_RX_EQ_BOOST 0x1c +#define MDIO_RX2_RX_EQ_BOOST_EQUALIZER_CTRL_MASK 0x7 +#define MDIO_RX2_RX_EQ_BOOST_OFFSET_CTRL 0x10 + +#define MDIO_REG_BANK_RX3 0x80e0 +#define MDIO_RX3_RX_EQ_BOOST 0x1c +#define MDIO_RX3_RX_EQ_BOOST_EQUALIZER_CTRL_MASK 0x7 +#define MDIO_RX3_RX_EQ_BOOST_OFFSET_CTRL 0x10 + +#define MDIO_REG_BANK_RX_ALL 0x80f0 +#define MDIO_RX_ALL_RX_EQ_BOOST 0x1c +#define MDIO_RX_ALL_RX_EQ_BOOST_EQUALIZER_CTRL_MASK 0x7 +#define MDIO_RX_ALL_RX_EQ_BOOST_OFFSET_CTRL 0x10 + +#define MDIO_REG_BANK_TX0 0x8060 +#define MDIO_TX0_TX_DRIVER 0x17 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 +#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 +#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 +#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e +#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 +#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 + +#define MDIO_REG_BANK_TX1 0x8070 +#define MDIO_TX1_TX_DRIVER 0x17 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 +#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 +#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 +#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e +#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 +#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 + +#define MDIO_REG_BANK_TX2 0x8080 +#define MDIO_TX2_TX_DRIVER 0x17 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 +#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 +#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 +#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e +#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 +#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 + +#define MDIO_REG_BANK_TX3 0x8090 +#define MDIO_TX3_TX_DRIVER 0x17 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_MASK 0xf000 +#define MDIO_TX0_TX_DRIVER_PREEMPHASIS_SHIFT 12 +#define MDIO_TX0_TX_DRIVER_IDRIVER_MASK 0x0f00 +#define MDIO_TX0_TX_DRIVER_IDRIVER_SHIFT 8 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_MASK 0x00f0 +#define MDIO_TX0_TX_DRIVER_IPREDRIVER_SHIFT 4 +#define MDIO_TX0_TX_DRIVER_IFULLSPD_MASK 0x000e +#define MDIO_TX0_TX_DRIVER_IFULLSPD_SHIFT 1 +#define MDIO_TX0_TX_DRIVER_ICBUF1T 1 + +#define MDIO_REG_BANK_XGXS_BLOCK0 0x8000 +#define MDIO_BLOCK0_XGXS_CONTROL 0x10 + +#define MDIO_REG_BANK_XGXS_BLOCK1 0x8010 +#define MDIO_BLOCK1_LANE_CTRL0 0x15 +#define MDIO_BLOCK1_LANE_CTRL1 0x16 +#define MDIO_BLOCK1_LANE_CTRL2 0x17 +#define MDIO_BLOCK1_LANE_PRBS 0x19 + +#define MDIO_REG_BANK_XGXS_BLOCK2 0x8100 +#define MDIO_XGXS_BLOCK2_RX_LN_SWAP 0x10 +#define MDIO_XGXS_BLOCK2_RX_LN_SWAP_ENABLE 0x8000 +#define MDIO_XGXS_BLOCK2_RX_LN_SWAP_FORCE_ENABLE 0x4000 +#define MDIO_XGXS_BLOCK2_TX_LN_SWAP 0x11 +#define MDIO_XGXS_BLOCK2_TX_LN_SWAP_ENABLE 0x8000 +#define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G 0x14 +#define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_CX4_XGXS 0x0001 +#define MDIO_XGXS_BLOCK2_UNICORE_MODE_10G_HIGIG_XGXS 0x0010 +#define MDIO_XGXS_BLOCK2_TEST_MODE_LANE 0x15 + +#define MDIO_REG_BANK_GP_STATUS 0x8120 +#define MDIO_GP_STATUS_TOP_AN_STATUS1 0x1B +#define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_AUTONEG_COMPLETE 0x0001 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_CL37_AUTONEG_COMPLETE 0x0002 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS 0x0004 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_DUPLEX_STATUS 0x0008 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_MR_LP_NP_AN_ABLE 0x0010 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_CL73_LP_NP_BAM_ABLE 0x0020 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_TXSIDE 0x0040 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_PAUSE_RSOLUTION_RXSIDE 0x0080 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_MASK 0x3f00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10M 0x0000 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_100M 0x0100 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G 0x0200 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_2_5G 0x0300 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_5G 0x0400 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_6G 0x0500 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_HIG 0x0600 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_CX4 0x0700 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12G_HIG 0x0800 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_12_5G 0x0900 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_13G 0x0A00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_15G 0x0B00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_16G 0x0C00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_1G_KX 0x0D00 +#define MDIO_GP_STATUS_TOP_AN_STATUS1_ACTUAL_SPEED_10G_KX4 0x0E00 + + +#define MDIO_REG_BANK_10G_PARALLEL_DETECT 0x8130 +#define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL 0x11 +#define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_CONTROL_PARDET10G_EN 0x1 +#define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK 0x13 +#define MDIO_10G_PARALLEL_DETECT_PAR_DET_10G_LINK_CNT (0xb71<<1) + +#define MDIO_REG_BANK_SERDES_DIGITAL 0x8300 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1 0x10 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_FIBER_MODE 0x0001 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_TBI_IF 0x0002 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_SIGNAL_DETECT_EN 0x0004 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_INVERT_SIGNAL_DETECT 0x0008 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_AUTODET 0x0010 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL1_MSTR_MODE 0x0020 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2 0x11 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_PRL_DT_EN 0x0001 +#define MDIO_SERDES_DIGITAL_A_1000X_CONTROL2_AN_FST_TMR 0x0040 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1 0x14 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_DUPLEX 0x0004 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_MASK 0x0018 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_SHIFT 3 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_2_5G 0x0018 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_1G 0x0010 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_100M 0x0008 +#define MDIO_SERDES_DIGITAL_A_1000X_STATUS1_SPEED_10M 0x0000 +#define MDIO_SERDES_DIGITAL_MISC1 0x18 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_MASK 0xE000 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_25M 0x0000 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_100M 0x2000 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_125M 0x4000 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_156_25M 0x6000 +#define MDIO_SERDES_DIGITAL_MISC1_REFCLK_SEL_187_5M 0x8000 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_SEL 0x0010 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_MASK 0x000f +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_2_5G 0x0000 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_5G 0x0001 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_6G 0x0002 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_10G_HIG 0x0003 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_10G_CX4 0x0004 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_12G 0x0005 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_12_5G 0x0006 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_13G 0x0007 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_15G 0x0008 +#define MDIO_SERDES_DIGITAL_MISC1_FORCE_SPEED_16G 0x0009 + +#define MDIO_REG_BANK_OVER_1G 0x8320 +#define MDIO_OVER_1G_DIGCTL_3_4 0x14 +#define MDIO_OVER_1G_DIGCTL_3_4_MP_ID_MASK 0xffe0 +#define MDIO_OVER_1G_DIGCTL_3_4_MP_ID_SHIFT 5 +#define MDIO_OVER_1G_UP1 0x19 +#define MDIO_OVER_1G_UP1_2_5G 0x0001 +#define MDIO_OVER_1G_UP1_5G 0x0002 +#define MDIO_OVER_1G_UP1_6G 0x0004 +#define MDIO_OVER_1G_UP1_10G 0x0010 +#define MDIO_OVER_1G_UP1_10GH 0x0008 +#define MDIO_OVER_1G_UP1_12G 0x0020 +#define MDIO_OVER_1G_UP1_12_5G 0x0040 +#define MDIO_OVER_1G_UP1_13G 0x0080 +#define MDIO_OVER_1G_UP1_15G 0x0100 +#define MDIO_OVER_1G_UP1_16G 0x0200 +#define MDIO_OVER_1G_UP2 0x1A +#define MDIO_OVER_1G_UP2_IPREDRIVER_MASK 0x0007 +#define MDIO_OVER_1G_UP2_IDRIVER_MASK 0x0038 +#define MDIO_OVER_1G_UP2_PREEMPHASIS_MASK 0x03C0 +#define MDIO_OVER_1G_UP3 0x1B +#define MDIO_OVER_1G_UP3_HIGIG2 0x0001 +#define MDIO_OVER_1G_LP_UP1 0x1C +#define MDIO_OVER_1G_LP_UP2 0x1D +#define MDIO_OVER_1G_LP_UP2_MR_ADV_OVER_1G_MASK 0x03ff +#define MDIO_OVER_1G_LP_UP2_PREEMPHASIS_MASK 0x0780 +#define MDIO_OVER_1G_LP_UP2_PREEMPHASIS_SHIFT 7 +#define MDIO_OVER_1G_LP_UP3 0x1E + +#define MDIO_REG_BANK_BAM_NEXT_PAGE 0x8350 +#define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL 0x10 +#define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_BAM_MODE 0x0001 +#define MDIO_BAM_NEXT_PAGE_MP5_NEXT_PAGE_CTRL_TETON_AN 0x0002 + +#define MDIO_REG_BANK_CL73_USERB0 0x8370 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL1 0x12 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_EN 0x8000 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_STATION_MNGR_EN 0x4000 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL1_BAM_NP_AFTER_BP_EN 0x2000 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL3 0x14 +#define MDIO_CL73_USERB0_CL73_BAM_CTRL3_USE_CL73_HCD_MR 0x0001 + +#define MDIO_REG_BANK_AER_BLOCK 0xFFD0 +#define MDIO_AER_BLOCK_AER_REG 0x1E + +#define MDIO_REG_BANK_COMBO_IEEE0 0xFFE0 +#define MDIO_COMBO_IEEE0_MII_CONTROL 0x10 +#define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_MASK 0x2040 +#define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_10 0x0000 +#define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_100 0x2000 +#define MDIO_COMBO_IEEO_MII_CONTROL_MAN_SGMII_SP_1000 0x0040 +#define MDIO_COMBO_IEEO_MII_CONTROL_FULL_DUPLEX 0x0100 +#define MDIO_COMBO_IEEO_MII_CONTROL_RESTART_AN 0x0200 +#define MDIO_COMBO_IEEO_MII_CONTROL_AN_EN 0x1000 +#define MDIO_COMBO_IEEO_MII_CONTROL_LOOPBACK 0x4000 +#define MDIO_COMBO_IEEO_MII_CONTROL_RESET 0x8000 +#define MDIO_COMBO_IEEE0_MII_STATUS 0x11 +#define MDIO_COMBO_IEEE0_MII_STATUS_LINK_PASS 0x0004 +#define MDIO_COMBO_IEEE0_MII_STATUS_AUTONEG_COMPLETE 0x0020 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV 0x14 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_FULL_DUPLEX 0x0020 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_HALF_DUPLEX 0x0040 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_MASK 0x0180 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_NONE 0x0000 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_SYMMETRIC 0x0080 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_ASYMMETRIC 0x0100 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_PAUSE_BOTH 0x0180 +#define MDIO_COMBO_IEEE0_AUTO_NEG_ADV_NEXT_PAGE 0x8000 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1 0x15 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_NEXT_PAGE 0x8000 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_ACK 0x4000 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_MASK 0x0180 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_NONE 0x0000 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_PAUSE_BOTH 0x0180 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_HALF_DUP_CAP 0x0040 +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_FULL_DUP_CAP 0x0020 +/*WhenthelinkpartnerisinSGMIImode(bit0=1),then +bit15=link,bit12=duplex,bits11:10=speed,bit14=acknowledge. +Theotherbitsarereservedandshouldbezero*/ +#define MDIO_COMBO_IEEE0_AUTO_NEG_LINK_PARTNER_ABILITY1_SGMII_MODE 0x0001 + + +#define MDIO_PMA_DEVAD 0x1 +/*ieee*/ +#define MDIO_PMA_REG_CTRL 0x0 +#define MDIO_PMA_REG_STATUS 0x1 +#define MDIO_PMA_REG_10G_CTRL2 0x7 +#define MDIO_PMA_REG_RX_SD 0xa +/*bcm*/ +#define MDIO_PMA_REG_BCM_CTRL 0x0096 +#define MDIO_PMA_REG_FEC_CTRL 0x00ab +#define MDIO_PMA_REG_RX_ALARM_CTRL 0x9000 +#define MDIO_PMA_REG_LASI_CTRL 0x9002 +#define MDIO_PMA_REG_RX_ALARM 0x9003 +#define MDIO_PMA_REG_TX_ALARM 0x9004 +#define MDIO_PMA_REG_LASI_STATUS 0x9005 +#define MDIO_PMA_REG_PHY_IDENTIFIER 0xc800 +#define MDIO_PMA_REG_DIGITAL_CTRL 0xc808 +#define MDIO_PMA_REG_DIGITAL_STATUS 0xc809 +#define MDIO_PMA_REG_TX_POWER_DOWN 0xca02 +#define MDIO_PMA_REG_CMU_PLL_BYPASS 0xca09 +#define MDIO_PMA_REG_MISC_CTRL 0xca0a +#define MDIO_PMA_REG_GEN_CTRL 0xca10 +#define MDIO_PMA_REG_GEN_CTRL_ROM_RESET_INTERNAL_MP 0x0188 +#define MDIO_PMA_REG_GEN_CTRL_ROM_MICRO_RESET 0x018a +#define MDIO_PMA_REG_M8051_MSGIN_REG 0xca12 +#define MDIO_PMA_REG_M8051_MSGOUT_REG 0xca13 +#define MDIO_PMA_REG_ROM_VER1 0xca19 +#define MDIO_PMA_REG_ROM_VER2 0xca1a +#define MDIO_PMA_REG_EDC_FFE_MAIN 0xca1b +#define MDIO_PMA_REG_PLL_BANDWIDTH 0xca1d +#define MDIO_PMA_REG_PLL_CTRL 0xca1e +#define MDIO_PMA_REG_MISC_CTRL0 0xca23 +#define MDIO_PMA_REG_LRM_MODE 0xca3f +#define MDIO_PMA_REG_CDR_BANDWIDTH 0xca46 +#define MDIO_PMA_REG_MISC_CTRL1 0xca85 + +#define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL 0x8000 +#define MDIO_PMA_REG_SFP_TWO_WIRE_CTRL_STATUS_MASK 0x000c +#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IDLE 0x0000 +#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_COMPLETE 0x0004 +#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_IN_PROGRESS 0x0008 +#define MDIO_PMA_REG_SFP_TWO_WIRE_STATUS_FAILED 0x000c +#define MDIO_PMA_REG_SFP_TWO_WIRE_BYTE_CNT 0x8002 +#define MDIO_PMA_REG_SFP_TWO_WIRE_MEM_ADDR 0x8003 +#define MDIO_PMA_REG_8726_TWO_WIRE_DATA_BUF 0xc820 +#define MDIO_PMA_REG_8726_TWO_WIRE_DATA_MASK 0xff +#define MDIO_PMA_REG_8726_TX_CTRL1 0xca01 +#define MDIO_PMA_REG_8726_TX_CTRL2 0xca05 + +#define MDIO_PMA_REG_8727_TWO_WIRE_SLAVE_ADDR 0x8005 +#define MDIO_PMA_REG_8727_TWO_WIRE_DATA_BUF 0x8007 +#define MDIO_PMA_REG_8727_TWO_WIRE_DATA_MASK 0xff +#define MDIO_PMA_REG_8727_MISC_CTRL 0x8309 +#define MDIO_PMA_REG_8727_TX_CTRL1 0xca02 +#define MDIO_PMA_REG_8727_TX_CTRL2 0xca05 +#define MDIO_PMA_REG_8727_PCS_OPT_CTRL 0xc808 +#define MDIO_PMA_REG_8727_GPIO_CTRL 0xc80e + +#define MDIO_PMA_REG_8073_CHIP_REV 0xc801 +#define MDIO_PMA_REG_8073_SPEED_LINK_STATUS 0xc820 +#define MDIO_PMA_REG_8073_XAUI_WA 0xc841 + +#define MDIO_PMA_REG_7101_RESET 0xc000 +#define MDIO_PMA_REG_7107_LED_CNTL 0xc007 +#define MDIO_PMA_REG_7101_VER1 0xc026 +#define MDIO_PMA_REG_7101_VER2 0xc027 + +#define MDIO_PMA_REG_8481_PMD_SIGNAL 0xa811 +#define MDIO_PMA_REG_8481_SIGNAL_MASK 0xa835 +#define MDIO_PMA_REG_8481_LINK_SIGNAL 0xa83b + + +#define MDIO_WIS_DEVAD 0x2 +/*bcm*/ +#define MDIO_WIS_REG_LASI_CNTL 0x9002 +#define MDIO_WIS_REG_LASI_STATUS 0x9005 + +#define MDIO_PCS_DEVAD 0x3 +#define MDIO_PCS_REG_STATUS 0x0020 +#define MDIO_PCS_REG_LASI_STATUS 0x9005 +#define MDIO_PCS_REG_7101_DSP_ACCESS 0xD000 +#define MDIO_PCS_REG_7101_SPI_MUX 0xD008 +#define MDIO_PCS_REG_7101_SPI_CTRL_ADDR 0xE12A +#define MDIO_PCS_REG_7101_SPI_RESET_BIT (5) +#define MDIO_PCS_REG_7101_SPI_FIFO_ADDR 0xE02A +#define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_WRITE_ENABLE_CMD (6) +#define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_BULK_ERASE_CMD (0xC7) +#define MDIO_PCS_REG_7101_SPI_FIFO_ADDR_PAGE_PROGRAM_CMD (2) +#define MDIO_PCS_REG_7101_SPI_BYTES_TO_TRANSFER_ADDR 0xE028 + + +#define MDIO_XS_DEVAD 0x4 +#define MDIO_XS_PLL_SEQUENCER 0x8000 +#define MDIO_XS_SFX7101_XGXS_TEST1 0xc00a + +#define MDIO_XS_8706_REG_BANK_RX0 0x80bc +#define MDIO_XS_8706_REG_BANK_RX1 0x80cc +#define MDIO_XS_8706_REG_BANK_RX2 0x80dc +#define MDIO_XS_8706_REG_BANK_RX3 0x80ec +#define MDIO_XS_8706_REG_BANK_RXA 0x80fc + +#define MDIO_AN_DEVAD 0x7 +/*ieee*/ +#define MDIO_AN_REG_CTRL 0x0000 +#define MDIO_AN_REG_STATUS 0x0001 +#define MDIO_AN_REG_STATUS_AN_COMPLETE 0x0020 +#define MDIO_AN_REG_ADV_PAUSE 0x0010 +#define MDIO_AN_REG_ADV_PAUSE_PAUSE 0x0400 +#define MDIO_AN_REG_ADV_PAUSE_ASYMMETRIC 0x0800 +#define MDIO_AN_REG_ADV_PAUSE_BOTH 0x0C00 +#define MDIO_AN_REG_ADV_PAUSE_MASK 0x0C00 +#define MDIO_AN_REG_ADV 0x0011 +#define MDIO_AN_REG_ADV2 0x0012 +#define MDIO_AN_REG_LP_AUTO_NEG 0x0013 +#define MDIO_AN_REG_MASTER_STATUS 0x0021 +/*bcm*/ +#define MDIO_AN_REG_LINK_STATUS 0x8304 +#define MDIO_AN_REG_CL37_CL73 0x8370 +#define MDIO_AN_REG_CL37_AN 0xffe0 +#define MDIO_AN_REG_CL37_FC_LD 0xffe4 +#define MDIO_AN_REG_CL37_FC_LP 0xffe5 + +#define MDIO_AN_REG_8073_2_5G 0x8329 + +#define MDIO_AN_REG_8481_LEGACY_MII_CTRL 0xffe0 +#define MDIO_AN_REG_8481_LEGACY_AN_ADV 0xffe4 +#define MDIO_AN_REG_8481_1000T_CTRL 0xffe9 +#define MDIO_AN_REG_8481_EXPANSION_REG_RD_RW 0xfff5 +#define MDIO_AN_REG_8481_EXPANSION_REG_ACCESS 0xfff7 +#define MDIO_AN_REG_8481_LEGACY_SHADOW 0xfffc + +#define IGU_FUNC_BASE 0x0400 + +#define IGU_ADDR_MSIX 0x0000 +#define IGU_ADDR_INT_ACK 0x0200 +#define IGU_ADDR_PROD_UPD 0x0201 +#define IGU_ADDR_ATTN_BITS_UPD 0x0202 +#define IGU_ADDR_ATTN_BITS_SET 0x0203 +#define IGU_ADDR_ATTN_BITS_CLR 0x0204 +#define IGU_ADDR_COALESCE_NOW 0x0205 +#define IGU_ADDR_SIMD_MASK 0x0206 +#define IGU_ADDR_SIMD_NOMASK 0x0207 +#define IGU_ADDR_MSI_CTL 0x0210 +#define IGU_ADDR_MSI_ADDR_LO 0x0211 +#define IGU_ADDR_MSI_ADDR_HI 0x0212 +#define IGU_ADDR_MSI_DATA 0x0213 + +#define IGU_INT_ENABLE 0 +#define IGU_INT_DISABLE 1 +#define IGU_INT_NOP 2 +#define IGU_INT_NOP2 3 + +#define COMMAND_REG_INT_ACK 0x0 +#define COMMAND_REG_PROD_UPD 0x4 +#define COMMAND_REG_ATTN_BITS_UPD 0x8 +#define COMMAND_REG_ATTN_BITS_SET 0xc +#define COMMAND_REG_ATTN_BITS_CLR 0x10 +#define COMMAND_REG_COALESCE_NOW 0x14 +#define COMMAND_REG_SIMD_MASK 0x18 +#define COMMAND_REG_SIMD_NOMASK 0x1c + + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/cnic.c b/vmkdrivers/src_current/drivers/net/bnx2/cnic.c new file mode 100644 index 0000000..fb1d650 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/cnic.c @@ -0,0 +1,4887 @@ +/* cnic.c: Broadcom CNIC core network driver. + * + * Copyright (c) 2006-2010 Broadcom Corporation + * + * Portions Copyright (c) VMware, Inc. 2009-2010, All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * Written by: John(Zongxi) Chen (zongxi@broadcom.com) + * Modified and maintained by: Michael Chan + */ + +#include +#if (LINUX_VERSION_CODE < 0x020612) +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) +#define BCM_VLAN 1 +#endif +#include +#include +#if !defined (__VMKLNX__) +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_NETEVENT +#include +#endif +#include +#endif /* !defined (__VMKLNX__) */ + +#if !defined (__VMKLNX__) +#define NEW_BNX2X_HSI 1 +#endif /* !defined (__VMKLNX__) */ +#include "cnic_drv.h" +#include "bnx2.h" +#include "bnx2x_reg.h" +#include "bnx2x_fw_defs.h" +#include "bnx2x_hsi.h" +#include "cnic_if.h" +#include "cnic.h" +#include "cnic_defs.h" +#include "5710_hsi_cnic.h" +#include "57xx_iscsi_constants.h" + +#define DRV_MODULE_NAME "cnic" +#define PFX DRV_MODULE_NAME ": " + +static char version[] __devinitdata = + "Broadcom NetXtreme II CNIC Driver " DRV_MODULE_NAME " v" CNIC_MODULE_VERSION " (" CNIC_MODULE_RELDATE ")\n"; + +MODULE_AUTHOR("John(Zongxi) Chen "); +MODULE_DESCRIPTION("Broadcom NetXtreme II CNIC Driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(CNIC_MODULE_VERSION); + +static LIST_HEAD(cnic_dev_list); +static DEFINE_RWLOCK(cnic_dev_lock); +static DEFINE_MUTEX(cnic_lock); + +struct cnic_ulp_ops *cnic_ulp_tbl[MAX_CNIC_ULP_TYPE]; + +static int cnic_service_bnx2(void *, void *); +static int cnic_service_bnx2x(void *, void *); +static int cnic_ctl(void *, struct cnic_ctl_info *); + +static struct cnic_ops cnic_bnx2_ops = { + .cnic_owner = THIS_MODULE, + .cnic_handler = cnic_service_bnx2, + .cnic_ctl = cnic_ctl, +}; + +static struct cnic_ops cnic_bnx2x_ops = { + .cnic_owner = THIS_MODULE, + .cnic_handler = cnic_service_bnx2x, + .cnic_ctl = cnic_ctl, +}; + +static inline void cnic_hold(struct cnic_dev *dev) +{ + atomic_inc(&dev->ref_count); +} + +static inline void cnic_put(struct cnic_dev *dev) +{ + atomic_dec(&dev->ref_count); +} + +static inline void csk_hold(struct cnic_sock *csk) +{ + atomic_inc(&csk->ref_count); +} + +static inline void csk_put(struct cnic_sock *csk) +{ + atomic_dec(&csk->ref_count); +} + +static inline void ulp_get(struct cnic_ulp_ops *ulp_ops) +{ + atomic_inc(&ulp_ops->ref_count); +} + +static inline void ulp_put(struct cnic_ulp_ops *ulp_ops) +{ + atomic_dec(&ulp_ops->ref_count); +} + +static void cnic_ctx_wr(struct cnic_dev *dev, u32 cid_addr, u32 off, u32 val) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct drv_ctl_info info; + struct drv_ctl_io *io = &info.data.io; + + info.cmd = DRV_CTL_CTX_WR_CMD; + io->cid_addr = cid_addr; + io->offset = off; + io->data = val; + ethdev->drv_ctl(dev->netdev, &info); +} + +static void cnic_ctx_tbl_wr(struct cnic_dev *dev, u32 off, dma_addr_t addr) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct drv_ctl_info info; + struct drv_ctl_io *io = &info.data.io; + + info.cmd = DRV_CTL_CTXTBL_WR_CMD; + io->offset = off; + io->dma_addr = addr; + ethdev->drv_ctl(dev->netdev, &info); +} + +static void cnic_reg_wr_ind(struct cnic_dev *dev, u32 off, u32 val) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct drv_ctl_info info; + struct drv_ctl_io *io = &info.data.io; + + info.cmd = DRV_CTL_IO_WR_CMD; + io->offset = off; + io->data = val; + ethdev->drv_ctl(dev->netdev, &info); +} + +static u32 cnic_reg_rd_ind(struct cnic_dev *dev, u32 off) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct drv_ctl_info info; + struct drv_ctl_io *io = &info.data.io; + + info.cmd = DRV_CTL_IO_RD_CMD; + io->offset = off; + ethdev->drv_ctl(dev->netdev, &info); + return io->data; +} + +static void cnic_kwq_completion(struct cnic_dev *dev, u32 count) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct drv_ctl_info info; + + info.cmd = DRV_CTL_COMPLETION_CMD; + info.data.comp.comp_count = count; + ethdev->drv_ctl(dev->netdev, &info); +} + +static int cnic_get_l5_cid(struct cnic_local *cp, u32 cid, u32 *l5_cid) +{ + u32 i; + + for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { + if (cp->ctx_tbl[i].cid == cid) { + *l5_cid = i; + return 0; + } + } + return -EINVAL; +} + + +static int cnic_in_use(struct cnic_sock *csk) +{ + return (test_bit(SK_F_INUSE, &csk->flags)); +} + +static int cnic_offld_prep(struct cnic_sock *csk) +{ + if (!test_bit(SK_F_CONNECT_START, &csk->flags)) + return 0; + + if (test_and_set_bit(SK_F_OFFLD_SCHED, &csk->flags)) + return 0; + + return 1; +} + +static int cnic_close_prep(struct cnic_sock *csk) +{ + if (test_and_clear_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) + return 1; + + return 0; +} + +static int cnic_abort_prep(struct cnic_sock *csk) +{ + while (test_and_set_bit(SK_F_OFFLD_SCHED, &csk->flags)) + msleep(1); + + if (cnic_close_prep(csk)) { + csk->state = L4_KCQE_OPCODE_VALUE_RESET_COMP; + return 1; + } + + return 0; +} + +int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops) +{ + struct cnic_dev *dev; + + if (ulp_type >= MAX_CNIC_ULP_TYPE) { + printk(KERN_ERR PFX "cnic_register_driver: Bad type %d\n", + ulp_type); + return -EINVAL; + } + mutex_lock(&cnic_lock); + if (cnic_ulp_tbl[ulp_type]) { + printk(KERN_ERR PFX "cnic_register_driver: Type %d has already " + "been registered\n", ulp_type); + mutex_unlock(&cnic_lock); + return -EBUSY; + } + +#if !defined (__VMKLNX__) + read_lock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + list_for_each_entry(dev, &cnic_dev_list, list) { + struct cnic_local *cp = dev->cnic_priv; + + clear_bit(ULP_F_INIT, &cp->ulp_flags[ulp_type]); + } +#if !defined (__VMKLNX__) + read_unlock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + + atomic_set(&ulp_ops->ref_count, 0); + rcu_assign_pointer(cnic_ulp_tbl[ulp_type], ulp_ops); + mutex_unlock(&cnic_lock); + + /* Prevent race conditions with netdev_event */ +#if !defined (__VMKLNX__) + rtnl_lock(); + read_lock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + list_for_each_entry(dev, &cnic_dev_list, list) { + struct cnic_local *cp = dev->cnic_priv; + + if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[ulp_type])) + ulp_ops->cnic_init(dev); + } +#if !defined (__VMKLNX__) + read_unlock(&cnic_dev_lock); + rtnl_unlock(); +#endif /* !defined (__VMKLNX__) */ + + return 0; +} + +int cnic_unregister_driver(int ulp_type) +{ + struct cnic_dev *dev; + struct cnic_ulp_ops *ulp_ops; + int i = 0; + + if (ulp_type >= MAX_CNIC_ULP_TYPE) { + printk(KERN_ERR PFX "cnic_unregister_driver: Bad type %d\n", + ulp_type); + return -EINVAL; + } + mutex_lock(&cnic_lock); + ulp_ops = cnic_ulp_tbl[ulp_type]; + if (!ulp_ops) { + printk(KERN_ERR PFX "cnic_unregister_driver: Type %d has not " + "been registered\n", ulp_type); + goto out_unlock; + } +#if !defined (__VMKLNX__) + read_lock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + list_for_each_entry(dev, &cnic_dev_list, list) { + struct cnic_local *cp = dev->cnic_priv; + + if (rcu_dereference(cp->ulp_ops[ulp_type])) { + printk(KERN_ERR PFX "cnic_unregister_driver: Type %d " + "still has devices registered\n", ulp_type); +#if !defined (__VMKLNX__) + read_unlock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + goto out_unlock; + } + } +#if !defined (__VMKLNX__) + read_unlock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + + rcu_assign_pointer(cnic_ulp_tbl[ulp_type], NULL); + + mutex_unlock(&cnic_lock); + synchronize_rcu(); + while ((atomic_read(&ulp_ops->ref_count) != 0) && (i < 20)) { + msleep(100); + i++; + } + + if (atomic_read(&ulp_ops->ref_count) != 0) + printk(KERN_WARNING PFX "%s: Failed waiting for ref count to go" + " to zero.\n", dev->netdev->name); + return 0; + +out_unlock: + mutex_unlock(&cnic_lock); + return -EINVAL; +} + +EXPORT_SYMBOL(cnic_register_driver); +EXPORT_SYMBOL(cnic_unregister_driver); + +static int cnic_register_netdev(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int err; + + if (!ethdev) + return -ENODEV; + + if (ethdev->drv_state & CNIC_DRV_STATE_REGD) + return 0; + + err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev); + if (err) + printk(KERN_ERR PFX "%s: register_cnic failed\n", + dev->netdev->name); + + return err; +} + +static void cnic_unregister_netdev(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (!ethdev) + return; + + if (ethdev->drv_state & CNIC_DRV_STATE_REGD) + ethdev->drv_unregister_cnic(dev->netdev); +} + +static int cnic_start_hw(struct cnic_dev *); +static void cnic_stop_hw(struct cnic_dev *); + +static int cnic_register_device(struct cnic_dev *dev, int ulp_type, + void *ulp_ctx) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_ulp_ops *ulp_ops; + + if (ulp_type >= MAX_CNIC_ULP_TYPE) { + printk(KERN_ERR PFX "cnic_register_device: Bad type %d\n", + ulp_type); + return -EINVAL; + } + mutex_lock(&cnic_lock); + if (cnic_ulp_tbl[ulp_type] == NULL) { + printk(KERN_ERR PFX "cnic_register_device: Driver with type %d " + "has not been registered\n", ulp_type); + mutex_unlock(&cnic_lock); + return -EAGAIN; + } + if (rcu_dereference(cp->ulp_ops[ulp_type])) { + printk(KERN_ERR PFX "cnic_register_device: Type %d has already " + "been registered to this device\n", ulp_type); + mutex_unlock(&cnic_lock); + return -EBUSY; + } +#if !defined (__VMKLNX__) + if (!try_module_get(cnic_ulp_tbl[ulp_type]->owner)) { + mutex_unlock(&cnic_lock); + return -EBUSY; + } +#endif /* !defined (__VMKLNX__) */ + + clear_bit(ULP_F_START, &cp->ulp_flags[ulp_type]); + cp->ulp_handle[ulp_type] = ulp_ctx; + ulp_ops = cnic_ulp_tbl[ulp_type]; + rcu_assign_pointer(cp->ulp_ops[ulp_type], ulp_ops); + cnic_hold(dev); + if (!dev->use_count) { + if (!test_bit(CNIC_F_IF_GOING_DOWN, &dev->flags)) { + if (dev->netdev->flags & IFF_UP) + set_bit(CNIC_F_IF_UP, &dev->flags); + } + } + dev->use_count++; + + if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) + if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[ulp_type])) + ulp_ops->cnic_start(cp->ulp_handle[ulp_type]); + + mutex_unlock(&cnic_lock); + + return 0; + +} + +static int cnic_unregister_device(struct cnic_dev *dev, int ulp_type) +{ + struct cnic_local *cp = dev->cnic_priv; + + if (ulp_type >= MAX_CNIC_ULP_TYPE) { + printk(KERN_ERR PFX "cnic_unregister_device: Bad type %d\n", + ulp_type); + return -EINVAL; + } + mutex_lock(&cnic_lock); + if (rcu_dereference(cp->ulp_ops[ulp_type])) { + dev->use_count--; +#if !defined (__VMKLNX__) + module_put(cp->ulp_ops[ulp_type]->owner); +#endif /* !defined (__VMKLNX__) */ + rcu_assign_pointer(cp->ulp_ops[ulp_type], NULL); + cnic_put(dev); + } else { + printk(KERN_ERR PFX "cnic_unregister_device: device not " + "registered to this ulp type %d\n", ulp_type); + mutex_unlock(&cnic_lock); + return -EINVAL; + } + mutex_unlock(&cnic_lock); + + synchronize_rcu(); + + return 0; +} + +static int cnic_init_id_tbl(struct cnic_id_tbl *id_tbl, u32 size, u32 start_id, + u32 next) +{ + id_tbl->start = start_id; + id_tbl->max = size; + id_tbl->next = next; + spin_lock_init(&id_tbl->lock); + id_tbl->table = kzalloc(DIV_ROUND_UP(size, 32) * 4, GFP_KERNEL); + if (!id_tbl->table) + return -ENOMEM; + + return 0; +} + +static u32 cnic_free_id_tbl(struct cnic_id_tbl *id_tbl) +{ + kfree(id_tbl->table); + id_tbl->table = NULL; + return id_tbl->next; +} + +/* Returns -1 if not successful */ +static u32 cnic_alloc_new_id(struct cnic_id_tbl *id_tbl) +{ + u32 id; + + spin_lock(&id_tbl->lock); + id = find_next_zero_bit(id_tbl->table, id_tbl->max, id_tbl->next); + if (id >= id_tbl->max) { + id = -1; + if (id_tbl->next != 0) { + id = find_first_zero_bit(id_tbl->table, id_tbl->next); + if (id >= id_tbl->next) + id = -1; + } + } + + if (id < id_tbl->max) { + set_bit(id, id_tbl->table); + id_tbl->next = (id + 1) & (id_tbl->max - 1); + id += id_tbl->start; + } + + spin_unlock(&id_tbl->lock); + + return id; +} + +void cnic_free_id(struct cnic_id_tbl *id_tbl, u32 id) +{ + if (id == -1) + return; + + id -= id_tbl->start; + if (id >= id_tbl->max) + return; + + clear_bit(id, id_tbl->table); +} + +static void cnic_free_dma(struct cnic_dev *dev, struct cnic_dma *dma) +{ + int i; + + if (!dma->pg_arr) + return; + + for (i = 0; i < dma->num_pages; i++) { + if (dma->pg_arr[i]) { + pci_free_consistent(dev->pcidev, BCM_PAGE_SIZE, + dma->pg_arr[i], dma->pg_map_arr[i]); + dma->pg_arr[i] = NULL; + } + } + if (dma->pgtbl) { + pci_free_consistent(dev->pcidev, dma->pgtbl_size, + dma->pgtbl, dma->pgtbl_map); + dma->pgtbl = NULL; + } + kfree(dma->pg_arr); + dma->pg_arr = NULL; + dma->num_pages = 0; +} + +static void cnic_setup_page_tbl(struct cnic_dev *dev, struct cnic_dma *dma) +{ + int i; + u32 *page_table = dma->pgtbl; + + for (i = 0; i < dma->num_pages; i++) { + /* Each entry needs to be in big endian format. */ + *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); + page_table++; + *page_table = (u32) dma->pg_map_arr[i]; + page_table++; + } +} + +static void cnic_setup_page_tbl_le(struct cnic_dev *dev, struct cnic_dma *dma) +{ + int i; + u32 *page_table = dma->pgtbl; + + for (i = 0; i < dma->num_pages; i++) { + /* Each entry needs to be in little endian format. */ + *page_table = dma->pg_map_arr[i] & 0xffffffff; + page_table++; + *page_table = (u32) ((u64) dma->pg_map_arr[i] >> 32); + page_table++; + } +} + +static int cnic_alloc_dma(struct cnic_dev *dev, struct cnic_dma *dma, + int pages, int use_pg_tbl) +{ + int i, size; + struct cnic_local *cp = dev->cnic_priv; + + size = pages * (sizeof(void *) + sizeof(dma_addr_t)); + dma->pg_arr = kzalloc(size, GFP_ATOMIC); + if (dma->pg_arr == NULL) + return -ENOMEM; + + dma->pg_map_arr = (dma_addr_t *) (dma->pg_arr + pages); + dma->num_pages = pages; + + for (i = 0; i < pages; i++) { + dma->pg_arr[i] = pci_alloc_consistent(dev->pcidev, + BCM_PAGE_SIZE, + &dma->pg_map_arr[i]); + if (dma->pg_arr[i] == NULL) + goto error; + } + if (!use_pg_tbl) + return 0; + + dma->pgtbl_size = ((pages * 8) + BCM_PAGE_SIZE - 1) & + ~(BCM_PAGE_SIZE - 1); + dma->pgtbl = pci_alloc_consistent(dev->pcidev, dma->pgtbl_size, + &dma->pgtbl_map); + if (dma->pgtbl == NULL) + goto error; + + cp->setup_pgtbl(dev, dma); + + return 0; + +error: + cnic_free_dma(dev, dma); + return -ENOMEM; +} + +static void cnic_free_contex(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int i; + + for (i = 0; i < cp->ctx_blks; i++) { + if (cp->ctx_arr[i].ctx) { + pci_free_consistent(dev->pcidev, cp->ctx_blk_size, + cp->ctx_arr[i].ctx, + cp->ctx_arr[i].mapping); + cp->ctx_arr[i].ctx = NULL; + } + } +} + +static void cnic_free_resc(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + + cnic_free_contex(dev); + kfree(cp->ctx_arr); + cp->ctx_arr = NULL; + cp->ctx_blks = 0; + + cnic_free_dma(dev, &cp->gbl_buf_info); + cnic_free_dma(dev, &cp->conn_buf_info); + cnic_free_dma(dev, &cp->kwq_info); + cnic_free_dma(dev, &cp->kwq_16_data_info); + cnic_free_dma(dev, &cp->kcq_info); + kfree(cp->iscsi_tbl); + cp->iscsi_tbl = NULL; + kfree(cp->ctx_tbl); + cp->ctx_tbl = NULL; + + cnic_free_id_tbl(&cp->cid_tbl); +} + +static int cnic_alloc_context(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + + if (CHIP_NUM(cp) == CHIP_NUM_5709) { + int i, k, arr_size; + + cp->ctx_blk_size = BCM_PAGE_SIZE; + cp->cids_per_blk = BCM_PAGE_SIZE / 128; + arr_size = BNX2_MAX_CID / cp->cids_per_blk * + sizeof(struct cnic_ctx); + cp->ctx_arr = kmalloc(arr_size, GFP_KERNEL); + if (cp->ctx_arr == NULL) + return -ENOMEM; + + memset(cp->ctx_arr, 0, arr_size); + + k = 0; + for (i = 0; i < 2; i++) { + u32 j, reg, off, lo, hi; + + if (i == 0) + off = BNX2_PG_CTX_MAP; + else + off = BNX2_ISCSI_CTX_MAP; + + reg = cnic_reg_rd_ind(dev, off); + lo = reg >> 16; + hi = reg & 0xffff; + for (j = lo; j < hi; j += cp->cids_per_blk, k++) + cp->ctx_arr[k].cid = j; + } + + cp->ctx_blks = k; + if (cp->ctx_blks >= (BNX2_MAX_CID / cp->cids_per_blk)) { + cp->ctx_blks = 0; + return -ENOMEM; + } + + for (i = 0; i < cp->ctx_blks; i++) { + cp->ctx_arr[i].ctx = + pci_alloc_consistent(dev->pcidev, BCM_PAGE_SIZE, + &cp->ctx_arr[i].mapping); + if (cp->ctx_arr[i].ctx == NULL) + return -ENOMEM; + } + } + return 0; +} + +static int cnic_alloc_bnx2_resc(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int ret; + + ret = cnic_alloc_dma(dev, &cp->kwq_info, KWQ_PAGE_CNT, 1); + if (ret) + goto error; + cp->kwq = (struct kwqe **) cp->kwq_info.pg_arr; + + ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 1); + if (ret) + goto error; + cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; + + ret = cnic_alloc_context(dev); + if (ret) + goto error; + + return 0; + +error: + cnic_free_resc(dev); + return ret; +} + +static int cnic_alloc_bnx2x_context(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int ctx_blk_size = cp->ethdev->ctx_blk_size; + int total_mem, blks, i; + + total_mem = BNX2X_ISCSI_CONTEXT_MEM_SIZE * MAX_ISCSI_TBL_SZ; + blks = total_mem / ctx_blk_size; + if (total_mem % ctx_blk_size) + blks++; + + if (blks > cp->ethdev->ctx_tbl_len) + return -ENOMEM; + + cp->ctx_arr = kzalloc(blks * sizeof(struct cnic_ctx), GFP_KERNEL); + if (cp->ctx_arr == NULL) + return -ENOMEM; + + cp->ctx_blks = blks; + cp->ctx_blk_size = ctx_blk_size; + if (BNX2X_CHIP_IS_E1H(cp->chip_id)) + cp->ctx_align = 0; + else + cp->ctx_align = ctx_blk_size; + + cp->cids_per_blk = ctx_blk_size / BNX2X_ISCSI_CONTEXT_MEM_SIZE; + + for (i = 0; i < blks; i++) { + cp->ctx_arr[i].ctx = + pci_alloc_consistent(dev->pcidev, cp->ctx_blk_size, + &cp->ctx_arr[i].mapping); + if (cp->ctx_arr[i].ctx == NULL) + return -ENOMEM; + + if (cp->ctx_align && cp->ctx_blk_size == ctx_blk_size) { + if (cp->ctx_arr[i].mapping & (cp->ctx_align - 1)) { + cnic_free_contex(dev); + cp->ctx_blk_size += cp->ctx_align; + i = -1; + continue; + } + } + } + return 0; +} + +static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int i, j, n, ret, pages; + struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info; + + cp->iscsi_tbl = kzalloc(sizeof(struct cnic_iscsi) * MAX_ISCSI_TBL_SZ, + GFP_KERNEL); + if (!cp->iscsi_tbl) + goto error; + + cp->ctx_tbl = kzalloc(sizeof(struct cnic_context) * + MAX_CNIC_L5_CONTEXT, GFP_KERNEL); + if (!cp->ctx_tbl) + goto error; + + for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { + cp->ctx_tbl[i].proto.iscsi = &cp->iscsi_tbl[i]; + cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_ISCSI; + } + + pages = PAGE_ALIGN(MAX_CNIC_L5_CONTEXT * CNIC_KWQ16_DATA_SIZE) / + PAGE_SIZE; + + ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0); + if (ret) + return -ENOMEM; + + n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE; + for (i = 0, j = 0; i < MAX_ISCSI_TBL_SZ; i++) { + long off = CNIC_KWQ16_DATA_SIZE * (i % n); + + cp->ctx_tbl[i].kwqe_data = kwq_16_dma->pg_arr[j] + off; + cp->ctx_tbl[i].kwqe_data_mapping = kwq_16_dma->pg_map_arr[j] + + off; + + if ((i % n) == (n - 1)) + j++; + } + + ret = cnic_alloc_dma(dev, &cp->kcq_info, KCQ_PAGE_CNT, 0); + if (ret) + goto error; + cp->kcq = (struct kcqe **) cp->kcq_info.pg_arr; + + for (i = 0; i < KCQ_PAGE_CNT; i++) { + struct bnx2x_bd_chain_next *next = + (struct bnx2x_bd_chain_next *) + &cp->kcq[i][MAX_KCQE_CNT]; + int j = i + 1; + + if (j >= KCQ_PAGE_CNT) + j = 0; + next->addr_hi = (u64) cp->kcq_info.pg_map_arr[j] >> 32; + next->addr_lo = cp->kcq_info.pg_map_arr[j] & 0xffffffff; + } + + pages = PAGE_ALIGN(BNX2X_ISCSI_NUM_CONNECTIONS * + BNX2X_ISCSI_CONN_BUF_SIZE) / PAGE_SIZE; + ret = cnic_alloc_dma(dev, &cp->conn_buf_info, pages, 1); + if (ret) + goto error; + + pages = PAGE_ALIGN(BNX2X_ISCSI_GLB_BUF_SIZE) / PAGE_SIZE; + ret = cnic_alloc_dma(dev, &cp->gbl_buf_info, pages, 0); + if (ret) + goto error; + + ret = cnic_alloc_bnx2x_context(dev); + if (ret) + goto error; + + return 0; + +error: + cnic_free_resc(dev); + return -ENOMEM; +} + +static inline u32 cnic_kwq_avail(struct cnic_local *cp) +{ + return (cp->max_kwq_idx - + ((cp->kwq_prod_idx - cp->kwq_con_idx) & cp->max_kwq_idx)); +} + +static int cnic_submit_bnx2_kwqes(struct cnic_dev *dev, struct kwqe *wqes[], + u32 num_wqes) +{ + struct cnic_local *cp = dev->cnic_priv; + struct kwqe *prod_qe; + u16 prod, sw_prod, i; + + if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) + return -EAGAIN; /* bnx2 is down */ + + spin_lock_bh(&cp->cnic_ulp_lock); + if (num_wqes > cnic_kwq_avail(cp) && + !(cp->cnic_local_flags & CNIC_LCL_FL_KWQ_INIT)) { + spin_unlock_bh(&cp->cnic_ulp_lock); + return -EAGAIN; + } + + cp->cnic_local_flags &= ~CNIC_LCL_FL_KWQ_INIT; + + prod = cp->kwq_prod_idx; + sw_prod = prod & MAX_KWQ_IDX; + for (i = 0; i < num_wqes; i++) { + prod_qe = &cp->kwq[KWQ_PG(sw_prod)][KWQ_IDX(sw_prod)]; + memcpy(prod_qe, wqes[i], sizeof(struct kwqe)); + prod++; + sw_prod = prod & MAX_KWQ_IDX; + } + cp->kwq_prod_idx = prod; + + CNIC_WR16(dev, cp->kwq_io_addr, cp->kwq_prod_idx); + + spin_unlock_bh(&cp->cnic_ulp_lock); + return 0; +} + +static void *cnic_get_kwqe_16_data(struct cnic_local *cp, u32 l5_cid, + union l5cm_specific_data *l5_data) +{ + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + dma_addr_t map; + + map = ctx->kwqe_data_mapping; + l5_data->phy_address.lo = (u64) map & 0xffffffff; + l5_data->phy_address.hi = (u64) map >> 32; + return ctx->kwqe_data; +} + +static int cnic_submit_kwqe_16(struct cnic_dev *dev, u32 cmd, u32 cid, + u32 type, union l5cm_specific_data *l5_data) +{ + struct cnic_local *cp = dev->cnic_priv; + struct l5cm_spe kwqe; + struct kwqe_16 *kwq[1]; + int ret; + + kwqe.hdr.conn_and_cmd_data = + cpu_to_le32(((cmd << SPE_HDR_CMD_ID_SHIFT) | + BNX2X_HW_CID(cid, cp->func))); + kwqe.hdr.type = cpu_to_le16(type); + kwqe.hdr.reserved = 0; + kwqe.data.phy_address.lo = cpu_to_le32(l5_data->phy_address.lo); + kwqe.data.phy_address.hi = cpu_to_le32(l5_data->phy_address.hi); + + kwq[0] = (struct kwqe_16 *) &kwqe; + spin_lock_bh(&cp->cnic_ulp_lock); + ret = cp->ethdev->drv_submit_kwqes_16(dev->netdev, kwq, 1); + spin_unlock_bh(&cp->cnic_ulp_lock); + + if (ret == 1) + return 0; + + return -EBUSY; +} + +static void cnic_reply_bnx2x_kcqes(struct cnic_dev *dev, int ulp_type, + struct kcqe *cqes[], u32 num_cqes) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_ulp_ops *ulp_ops; + + rcu_read_lock(); + ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); + if (likely(ulp_ops)) { + ulp_ops->indicate_kcqes(cp->ulp_handle[ulp_type], + cqes, num_cqes); + } + rcu_read_unlock(); +} + +static int cnic_bnx2x_iscsi_init1(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct cnic_local *cp = dev->cnic_priv; + struct iscsi_kwqe_init1 *req1 = (struct iscsi_kwqe_init1 *) kwqe; + int func = cp->func, pages; + int hq_bds; + + cp->num_iscsi_tasks = req1->num_tasks_per_conn; + cp->num_ccells = req1->num_ccells_per_conn; + cp->task_array_size = BNX2X_ISCSI_TASK_CONTEXT_SIZE * + cp->num_iscsi_tasks; + cp->r2tq_size = cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS * + BNX2X_ISCSI_R2TQE_SIZE; + cp->hq_size = cp->num_ccells * BNX2X_ISCSI_HQ_BD_SIZE; + pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; + hq_bds = pages * (PAGE_SIZE / BNX2X_ISCSI_HQ_BD_SIZE); + cp->num_cqs = req1->num_cqs; + + if (!dev->max_iscsi_conn) + return 0; + + /* init Tstorm RAM */ + CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_RQ_SIZE_OFFSET(func), + req1->rq_num_wqes); + CNIC_WR16(dev, BAR_TSTRORM_INTMEM + TSTORM_ISCSI_PAGE_SIZE_OFFSET(func), + PAGE_SIZE); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); + CNIC_WR16(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), + req1->num_tasks_per_conn); + + /* init Ustorm RAM */ + CNIC_WR16(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_RQ_BUFFER_SIZE_OFFSET(func), + req1->rq_buffer_size); + CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_PAGE_SIZE_OFFSET(func), + PAGE_SIZE); + CNIC_WR8(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); + CNIC_WR16(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), + req1->num_tasks_per_conn); + CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_RQ_SIZE_OFFSET(func), + req1->rq_num_wqes); + CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_CQ_SIZE_OFFSET(func), + req1->cq_num_wqes); + CNIC_WR16(dev, BAR_USTRORM_INTMEM + USTORM_ISCSI_R2TQ_SIZE_OFFSET(func), + cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS); + + /* init Xstorm RAM */ + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_PAGE_SIZE_OFFSET(func), + PAGE_SIZE); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), + req1->num_tasks_per_conn); + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_HQ_SIZE_OFFSET(func), + hq_bds); + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_SQ_SIZE_OFFSET(func), + req1->num_tasks_per_conn); + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + XSTORM_ISCSI_R2TQ_SIZE_OFFSET(func), + cp->num_iscsi_tasks * BNX2X_ISCSI_MAX_PENDING_R2TS); + + /* init Cstorm RAM */ + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_PAGE_SIZE_OFFSET(func), + PAGE_SIZE); + CNIC_WR8(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_PAGE_SIZE_LOG_OFFSET(func), PAGE_SHIFT); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_NUM_OF_TASKS_OFFSET(func), + req1->num_tasks_per_conn); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_CQ_SIZE_OFFSET(func), + req1->cq_num_wqes); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + CSTORM_ISCSI_HQ_SIZE_OFFSET(func), + hq_bds); + + return 0; +} + +static int cnic_bnx2x_iscsi_init2(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct iscsi_kwqe_init2 *req2 = (struct iscsi_kwqe_init2 *) kwqe; + struct cnic_local *cp = dev->cnic_priv; + int func = cp->func; + struct iscsi_kcqe kcqe; + struct kcqe *cqes[1]; + + memset(&kcqe, 0, sizeof(kcqe)); + if (!dev->max_iscsi_conn) { + kcqe.completion_status = + ISCSI_KCQE_COMPLETION_STATUS_ISCSI_NOT_SUPPORTED; + goto done; + } + + CNIC_WR(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_ERROR_BITMAP_OFFSET(func), req2->error_bit_map[0]); + CNIC_WR(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_ERROR_BITMAP_OFFSET(func) + 4, + req2->error_bit_map[1]); + + CNIC_WR16(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn); + CNIC_WR(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_ERROR_BITMAP_OFFSET(func), req2->error_bit_map[0]); + CNIC_WR(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_ERROR_BITMAP_OFFSET(func) + 4, + req2->error_bit_map[1]); + + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_CQ_SQN_SIZE_OFFSET(func), req2->max_cq_sqn); + + kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; + +done: + kcqe.op_code = ISCSI_KCQE_OPCODE_INIT; + cqes[0] = (struct kcqe *) &kcqe; + cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); + + return 0; +} + +static void cnic_free_bnx2x_conn_resc(struct cnic_dev *dev, u32 l5_cid) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + + if (ctx->ulp_proto_id == CNIC_ULP_ISCSI) { + struct cnic_iscsi *iscsi = ctx->proto.iscsi; + + cnic_free_dma(dev, &iscsi->hq_info); + cnic_free_dma(dev, &iscsi->r2tq_info); + cnic_free_dma(dev, &iscsi->task_array_info); + } + cnic_free_id(&cp->cid_tbl, ctx->cid); + ctx->cid = 0; +} + +static int cnic_alloc_bnx2x_conn_resc(struct cnic_dev *dev, u32 l5_cid) +{ + u32 cid; + int ret, pages; + struct cnic_local *cp = dev->cnic_priv; + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + struct cnic_iscsi *iscsi = ctx->proto.iscsi; + + cid = cnic_alloc_new_id(&cp->cid_tbl); + if (cid == -1) { + ret = -ENOMEM; + goto error; + } + + ctx->cid = cid; + pages = PAGE_ALIGN(cp->task_array_size) / PAGE_SIZE; + + ret = cnic_alloc_dma(dev, &iscsi->task_array_info, pages, 1); + if (ret) + goto error; + + pages = PAGE_ALIGN(cp->r2tq_size) / PAGE_SIZE; + ret = cnic_alloc_dma(dev, &iscsi->r2tq_info, pages, 1); + if (ret) + goto error; + + pages = PAGE_ALIGN(cp->hq_size) / PAGE_SIZE; + ret = cnic_alloc_dma(dev, &iscsi->hq_info, pages, 1); + if (ret) + goto error; + + return 0; + +error: + cnic_free_bnx2x_conn_resc(dev, l5_cid); + return ret; +} + +static struct iscsi_context *cnic_get_bnx2x_ctx(struct cnic_dev *dev, u32 cid, + int init, + struct regpair *ctx_addr) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int blk = (cid - ethdev->starting_cid) / cp->cids_per_blk; + int off = (cid - ethdev->starting_cid) % cp->cids_per_blk; + unsigned long align_off = 0; + dma_addr_t ctx_map; + struct iscsi_context *ctx; + + if (cp->ctx_align) { + unsigned long mask = cp->ctx_align - 1; + + if (cp->ctx_arr[blk].mapping & mask) + align_off = cp->ctx_align - + (cp->ctx_arr[blk].mapping & mask); + } + ctx_map = cp->ctx_arr[blk].mapping + align_off + + (off * BNX2X_ISCSI_CONTEXT_MEM_SIZE); + ctx = (struct iscsi_context *) (cp->ctx_arr[blk].ctx + align_off + + (off * BNX2X_ISCSI_CONTEXT_MEM_SIZE)); + if (init) + memset(ctx, 0, sizeof(*ctx)); + + ctx_addr->lo = ctx_map & 0xffffffff; + ctx_addr->hi = (u64) ctx_map >> 32; + return ctx; +} + +static int cnic_setup_bnx2x_ctx(struct cnic_dev *dev, struct kwqe *wqes[], + u32 num) +{ + struct cnic_local *cp = dev->cnic_priv; + struct iscsi_kwqe_conn_offload1 *req1 = + (struct iscsi_kwqe_conn_offload1 *) wqes[0]; + struct iscsi_kwqe_conn_offload2 *req2 = + (struct iscsi_kwqe_conn_offload2 *) wqes[1]; + struct iscsi_kwqe_conn_offload3 *req3; + struct cnic_context *ctx = &cp->ctx_tbl[req1->iscsi_conn_id]; + struct cnic_iscsi *iscsi = ctx->proto.iscsi; + u32 cid = ctx->cid; + u32 hw_cid = BNX2X_HW_CID(cid, cp->func); + struct iscsi_context *ictx; + struct regpair context_addr; + int i, j, n = 2, n_max; + + ctx->ctx_flags = 0; + if (!req2->num_additional_wqes) + return -EINVAL; + + n_max = req2->num_additional_wqes + 2; + + ictx = cnic_get_bnx2x_ctx(dev, cid, 1, &context_addr); + if (ictx == NULL) + return -ENOMEM; + + req3 = (struct iscsi_kwqe_conn_offload3 *) wqes[n++]; + + ictx->xstorm_ag_context.hq_prod = 1; + + ictx->xstorm_st_context.iscsi.first_burst_length = + ISCSI_DEF_FIRST_BURST_LEN; + ictx->xstorm_st_context.iscsi.max_send_pdu_length = + ISCSI_DEF_MAX_RECV_SEG_LEN; + ictx->xstorm_st_context.iscsi.sq_pbl_base.lo = + req1->sq_page_table_addr_lo; + ictx->xstorm_st_context.iscsi.sq_pbl_base.hi = + req1->sq_page_table_addr_hi; + ictx->xstorm_st_context.iscsi.sq_curr_pbe.lo = req2->sq_first_pte.hi; + ictx->xstorm_st_context.iscsi.sq_curr_pbe.hi = req2->sq_first_pte.lo; + ictx->xstorm_st_context.iscsi.hq_pbl_base.lo = + iscsi->hq_info.pgtbl_map & 0xffffffff; + ictx->xstorm_st_context.iscsi.hq_pbl_base.hi = + (u64) iscsi->hq_info.pgtbl_map >> 32; + ictx->xstorm_st_context.iscsi.hq_curr_pbe_base.lo = + iscsi->hq_info.pgtbl[0]; + ictx->xstorm_st_context.iscsi.hq_curr_pbe_base.hi = + iscsi->hq_info.pgtbl[1]; + ictx->xstorm_st_context.iscsi.r2tq_pbl_base.lo = + iscsi->r2tq_info.pgtbl_map & 0xffffffff; + ictx->xstorm_st_context.iscsi.r2tq_pbl_base.hi = + (u64) iscsi->r2tq_info.pgtbl_map >> 32; + ictx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.lo = + iscsi->r2tq_info.pgtbl[0]; + ictx->xstorm_st_context.iscsi.r2tq_curr_pbe_base.hi = + iscsi->r2tq_info.pgtbl[1]; + ictx->xstorm_st_context.iscsi.task_pbl_base.lo = + iscsi->task_array_info.pgtbl_map & 0xffffffff; + ictx->xstorm_st_context.iscsi.task_pbl_base.hi = + (u64) iscsi->task_array_info.pgtbl_map >> 32; + ictx->xstorm_st_context.iscsi.task_pbl_cache_idx = + BNX2X_ISCSI_PBL_NOT_CACHED; +/* ictx->xstorm_st_context.iscsi.max_outstanding_r2ts = + ISCSI_DEFAULT_MAX_OUTSTANDING_R2T;*/ + ictx->xstorm_st_context.iscsi.flags.flags |= + XSTORM_ISCSI_CONTEXT_FLAGS_B_IMMEDIATE_DATA; + ictx->xstorm_st_context.iscsi.flags.flags |= + XSTORM_ISCSI_CONTEXT_FLAGS_B_INITIAL_R2T; + + ictx->tstorm_st_context.iscsi.hdr_bytes_2_fetch = ISCSI_HEADER_SIZE; + /* TSTORM requires the base address of RQ DB & not PTE */ + ictx->tstorm_st_context.iscsi.rq_db_phy_addr.lo = + req2->rq_page_table_addr_lo & PAGE_MASK; + ictx->tstorm_st_context.iscsi.rq_db_phy_addr.hi = + req2->rq_page_table_addr_hi; + ictx->tstorm_st_context.iscsi.iscsi_conn_id = req1->iscsi_conn_id; + ictx->tstorm_st_context.tcp.cwnd = 0x5A8; + ictx->tstorm_st_context.tcp.flags2 |= + TSTORM_TCP_ST_CONTEXT_SECTION_DA_EN; + + ictx->timers_context.flags |= ISCSI_TIMERS_BLOCK_CONTEXT_CONN_VALID_FLG; + + ictx->ustorm_st_context.ring.rq.pbl_base.lo = + req2->rq_page_table_addr_lo; + ictx->ustorm_st_context.ring.rq.pbl_base.hi = + req2->rq_page_table_addr_hi; + ictx->ustorm_st_context.ring.rq.curr_pbe.lo = req3->qp_first_pte[0].hi; + ictx->ustorm_st_context.ring.rq.curr_pbe.hi = req3->qp_first_pte[0].lo; + ictx->ustorm_st_context.ring.r2tq.pbl_base.lo = + iscsi->r2tq_info.pgtbl_map & 0xffffffff; + ictx->ustorm_st_context.ring.r2tq.pbl_base.hi = + (u64) iscsi->r2tq_info.pgtbl_map >> 32; + ictx->ustorm_st_context.ring.r2tq.curr_pbe.lo = + iscsi->r2tq_info.pgtbl[0]; + ictx->ustorm_st_context.ring.r2tq.curr_pbe.hi = + iscsi->r2tq_info.pgtbl[1]; + ictx->ustorm_st_context.ring.cq_pbl_base.lo = + req1->cq_page_table_addr_lo; + ictx->ustorm_st_context.ring.cq_pbl_base.hi = + req1->cq_page_table_addr_hi; + ictx->ustorm_st_context.ring.cq[0].cq_sn = ISCSI_INITIAL_SN; + ictx->ustorm_st_context.ring.cq[0].curr_pbe.lo = req2->cq_first_pte.hi; + ictx->ustorm_st_context.ring.cq[0].curr_pbe.hi = req2->cq_first_pte.lo; + ictx->ustorm_st_context.task_pbe_cache_index = + BNX2X_ISCSI_PBL_NOT_CACHED; + ictx->ustorm_st_context.task_pdu_cache_index = + BNX2X_ISCSI_PDU_HEADER_NOT_CACHED; + + for (i = 1, j = 1; i < cp->num_cqs; i++, j++) { + if (j == 3) { + if (n >= n_max) + break; + req3 = (struct iscsi_kwqe_conn_offload3 *) wqes[n++]; + j = 0; + } + ictx->ustorm_st_context.ring.cq[i].cq_sn = ISCSI_INITIAL_SN; + ictx->ustorm_st_context.ring.cq[i].curr_pbe.lo = + req3->qp_first_pte[j].hi; + ictx->ustorm_st_context.ring.cq[i].curr_pbe.hi = + req3->qp_first_pte[j].lo; + } + + ictx->ustorm_st_context.task_pbl_base.lo = + iscsi->task_array_info.pgtbl_map & 0xffffffff; + ictx->ustorm_st_context.task_pbl_base.hi = + (u64) iscsi->task_array_info.pgtbl_map >> 32; + ictx->ustorm_st_context.tce_phy_addr.lo = + iscsi->task_array_info.pgtbl[0]; + ictx->ustorm_st_context.tce_phy_addr.hi = + iscsi->task_array_info.pgtbl[1]; + ictx->ustorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; + ictx->ustorm_st_context.num_cqs = cp->num_cqs; + ictx->ustorm_st_context.negotiated_rx |= ISCSI_DEF_MAX_RECV_SEG_LEN; + ictx->ustorm_st_context.negotiated_rx_and_flags |= + ISCSI_DEF_MAX_BURST_LEN; + ictx->ustorm_st_context.negotiated_rx |= + ISCSI_DEFAULT_MAX_OUTSTANDING_R2T << + USTORM_ISCSI_ST_CONTEXT_MAX_OUTSTANDING_R2TS_SHIFT; + + ictx->cstorm_st_context.hq_pbl_base.lo = + iscsi->hq_info.pgtbl_map & 0xffffffff; + ictx->cstorm_st_context.hq_pbl_base.hi = + (u64) iscsi->hq_info.pgtbl_map >> 32; + ictx->cstorm_st_context.hq_curr_pbe.lo = iscsi->hq_info.pgtbl[0]; + ictx->cstorm_st_context.hq_curr_pbe.hi = iscsi->hq_info.pgtbl[1]; + ictx->cstorm_st_context.task_pbl_base.lo = + iscsi->task_array_info.pgtbl_map & 0xffffffff; + ictx->cstorm_st_context.task_pbl_base.hi = + (u64) iscsi->task_array_info.pgtbl_map >> 32; + /* CSTORM and USTORM initialization is different, CSTORM requires + * CQ DB base & not PTE addr */ + ictx->cstorm_st_context.cq_db_base.lo = + req1->cq_page_table_addr_lo & PAGE_MASK; + ictx->cstorm_st_context.cq_db_base.hi = req1->cq_page_table_addr_hi; + ictx->cstorm_st_context.iscsi_conn_id = req1->iscsi_conn_id; + ictx->cstorm_st_context.cq_proc_en_bit_map = (1 << cp->num_cqs) - 1; + for (i = 0; i < cp->num_cqs; i++) { + ictx->cstorm_st_context.cq_c_prod_sqn_arr.sqn[i] = + ISCSI_INITIAL_SN; + ictx->cstorm_st_context.cq_c_sqn_2_notify_arr.sqn[i] = + ISCSI_INITIAL_SN; + } + + ictx->xstorm_ag_context.cdu_reserved = + CDU_RSRVD_VALUE_TYPE_A(hw_cid, CDU_REGION_NUMBER_XCM_AG, + ISCSI_CONNECTION_TYPE); + ictx->ustorm_ag_context.cdu_usage = + CDU_RSRVD_VALUE_TYPE_A(hw_cid, CDU_REGION_NUMBER_UCM_AG, + ISCSI_CONNECTION_TYPE); + return 0; + +} + +static int cnic_bnx2x_iscsi_ofld1(struct cnic_dev *dev, struct kwqe *wqes[], + u32 num, int *work) +{ + struct iscsi_kwqe_conn_offload1 *req1; + struct iscsi_kwqe_conn_offload2 *req2; + struct cnic_local *cp = dev->cnic_priv; + struct cnic_context *ctx; + struct iscsi_kcqe kcqe; + struct kcqe *cqes[1]; + u32 l5_cid; + int ret = 0; + + if (num < 2) { + *work = num; + return -EINVAL; + } + + req1 = (struct iscsi_kwqe_conn_offload1 *) wqes[0]; + req2 = (struct iscsi_kwqe_conn_offload2 *) wqes[1]; + if ((num - 2) < req2->num_additional_wqes) { + *work = num; + return -EINVAL; + } + *work = 2 + req2->num_additional_wqes; + + l5_cid = req1->iscsi_conn_id; + if (l5_cid >= MAX_ISCSI_TBL_SZ) + return -EINVAL; + + memset(&kcqe, 0, sizeof(kcqe)); + kcqe.op_code = ISCSI_KCQE_OPCODE_OFFLOAD_CONN; + kcqe.iscsi_conn_id = l5_cid; + kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAILURE; + + ctx = &cp->ctx_tbl[l5_cid]; + if (test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags)) { + kcqe.completion_status = + ISCSI_KCQE_COMPLETION_STATUS_CID_BUSY; + goto done; + } + + if (atomic_inc_return(&cp->iscsi_conn) > dev->max_iscsi_conn) { + atomic_dec(&cp->iscsi_conn); + goto done; + } + ret = cnic_alloc_bnx2x_conn_resc(dev, l5_cid); + if (ret) { + atomic_dec(&cp->iscsi_conn); + ret = 0; + goto done; + } + ret = cnic_setup_bnx2x_ctx(dev, wqes, num); + if (ret < 0) { + cnic_free_bnx2x_conn_resc(dev, l5_cid); + atomic_dec(&cp->iscsi_conn); + goto done; + } + + kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; + kcqe.iscsi_conn_context_id = BNX2X_HW_CID(cp->ctx_tbl[l5_cid].cid, + cp->func); + +done: + cqes[0] = (struct kcqe *) &kcqe; + cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); + return ret; +} + + +static int cnic_bnx2x_iscsi_update(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct cnic_local *cp = dev->cnic_priv; + struct iscsi_kwqe_conn_update *req = + (struct iscsi_kwqe_conn_update *) kwqe; + void *data; + union l5cm_specific_data l5_data; + u32 l5_cid, cid = BNX2X_SW_CID(req->context_id); + int ret; + + if (cnic_get_l5_cid(cp, cid, &l5_cid) != 0) + return -EINVAL; + + data = cnic_get_kwqe_16_data(cp, l5_cid, &l5_data); + if (!data) + return -ENOMEM; + + memcpy(data, kwqe, sizeof(struct kwqe)); + + ret = cnic_submit_kwqe_16(dev, ISCSI_RAMROD_CMD_ID_UPDATE_CONN, + req->context_id, ISCSI_CONNECTION_TYPE, &l5_data); + return ret; +} + +static int cnic_bnx2x_destroy_ramrod(struct cnic_dev *dev, u32 l5_cid) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + union l5cm_specific_data l5_data; + int ret; + u32 hw_cid; + + init_waitqueue_head(&ctx->waitq); + ctx->wait_cond = 0; + memset(&l5_data, 0, sizeof(l5_data)); + hw_cid = BNX2X_HW_CID(ctx->cid, cp->func); + ret = cnic_submit_kwqe_16(dev, RAMROD_CMD_ID_ETH_CFC_DEL, + hw_cid, + ETH_CONNECTION_TYPE | + (1 << SPE_HDR_COMMON_RAMROD_SHIFT), + &l5_data); + if (ret == 0) + wait_event(ctx->waitq, ctx->wait_cond); + + return ret; +} + +static int cnic_bnx2x_iscsi_destroy(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct cnic_local *cp = dev->cnic_priv; + struct iscsi_kwqe_conn_destroy *req = + (struct iscsi_kwqe_conn_destroy *) kwqe; + u32 l5_cid = req->iscsi_conn_id; + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + int ret = 0; + struct iscsi_kcqe kcqe; + struct kcqe *cqes[1]; + + if (!test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags)) + goto skip_cfc_delete; + + if (!time_after(jiffies, ctx->timestamp + (2 * HZ))) { + unsigned long delta = ctx->timestamp + (2 * HZ) - jiffies; + + if (delta > (2 * HZ)) + delta = 0; + + set_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags); + schedule_delayed_work(&cp->delete_task, delta); + goto destroy_reply; + } + + ret = cnic_bnx2x_destroy_ramrod(dev, l5_cid); + +skip_cfc_delete: + cnic_free_bnx2x_conn_resc(dev, l5_cid); + + atomic_dec(&cp->iscsi_conn); + clear_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags); + +destroy_reply: + memset(&kcqe, 0, sizeof(kcqe)); + kcqe.op_code = ISCSI_KCQE_OPCODE_DESTROY_CONN; + kcqe.iscsi_conn_id = l5_cid; + kcqe.completion_status = ISCSI_KCQE_COMPLETION_STATUS_SUCCESS; + kcqe.iscsi_conn_context_id = req->context_id; + + cqes[0] = (struct kcqe *) &kcqe; + cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_ISCSI, cqes, 1); + + return ret; +} + +static void cnic_init_storm_conn_bufs(struct cnic_dev *dev, + struct l4_kwq_connect_req1 *kwqe1, + struct l4_kwq_connect_req3 *kwqe3, + struct l5cm_active_conn_buffer *conn_buf) +{ + struct l5cm_conn_addr_params *conn_addr = &conn_buf->conn_addr_buf; + struct l5cm_xstorm_conn_buffer *xstorm_buf = + &conn_buf->xstorm_conn_buffer; + struct l5cm_tstorm_conn_buffer *tstorm_buf = + &conn_buf->tstorm_conn_buffer; + struct regpair context_addr; + u32 cid = BNX2X_SW_CID(kwqe1->cid); + struct in6_addr src_ip, dst_ip; + int i; + u32 *addrp; + + addrp = (u32 *) &conn_addr->local_ip_addr; + for (i = 0; i < 4; i++, addrp++) + src_ip.in6_u.u6_addr32[i] = cpu_to_be32(*addrp); + + addrp = (u32 *) &conn_addr->remote_ip_addr; + for (i = 0; i < 4; i++, addrp++) + dst_ip.in6_u.u6_addr32[i] = cpu_to_be32(*addrp); + + cnic_get_bnx2x_ctx(dev, cid, 0, &context_addr); + + xstorm_buf->context_addr.hi = context_addr.hi; + xstorm_buf->context_addr.lo = context_addr.lo; + xstorm_buf->mss = 0xffff; + xstorm_buf->rcv_buf = kwqe3->rcv_buf; + if (kwqe1->tcp_flags & L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE) + xstorm_buf->params |= L5CM_XSTORM_CONN_BUFFER_NAGLE_ENABLE; + xstorm_buf->pseudo_header_checksum = + swab16(~csum_ipv6_magic(&src_ip, &dst_ip, 0, IPPROTO_TCP, 0)); + + if (!(kwqe1->tcp_flags & L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK)) + tstorm_buf->params |= + L5CM_TSTORM_CONN_BUFFER_DELAYED_ACK_ENABLE; + if (kwqe3->ka_timeout) { + tstorm_buf->ka_enable = 1; + tstorm_buf->ka_timeout = kwqe3->ka_timeout; + tstorm_buf->ka_interval = kwqe3->ka_interval; + tstorm_buf->ka_max_probe_count = kwqe3->ka_max_probe_count; + } + tstorm_buf->rcv_buf = kwqe3->rcv_buf; + tstorm_buf->snd_buf = kwqe3->snd_buf; + tstorm_buf->max_rt_time = 0xffffffff; +} + +static void cnic_init_bnx2x_mac(struct cnic_dev *dev, u8 *mac) +{ + struct cnic_local *cp = dev->cnic_priv; + int func = CNIC_FUNC(cp); + + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR0_OFFSET(func), mac[0]); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR1_OFFSET(func), mac[1]); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR2_OFFSET(func), mac[2]); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR3_OFFSET(func), mac[3]); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR4_OFFSET(func), mac[4]); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_MAC_ADDR5_OFFSET(func), mac[5]); + + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(func), mac[5]); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_LSB_LOCAL_MAC_ADDR_OFFSET(func) + 1, + mac[4]); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func), mac[3]); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 1, + mac[2]); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 2, + mac[1]); + CNIC_WR8(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_MSB_LOCAL_MAC_ADDR_OFFSET(func) + 3, + mac[0]); +} + +static void cnic_bnx2x_set_tcp_timestamp(struct cnic_dev *dev, int tcp_ts) +{ + struct cnic_local *cp = dev->cnic_priv; + u8 xstorm_flags = XSTORM_L5CM_TCP_FLAGS_WND_SCL_EN; + u16 tstorm_flags = 0; + + if (tcp_ts) { + xstorm_flags |= XSTORM_L5CM_TCP_FLAGS_TS_ENABLED; + tstorm_flags |= TSTORM_L5CM_TCP_FLAGS_TS_ENABLED; + } + + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(cp->func), xstorm_flags); + + CNIC_WR16(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_TCP_VARS_FLAGS_OFFSET(cp->func), tstorm_flags); +} + +static int cnic_bnx2x_connect(struct cnic_dev *dev, struct kwqe *wqes[], + u32 num, int *work) +{ + struct cnic_local *cp = dev->cnic_priv; + struct l4_kwq_connect_req1 *kwqe1 = + (struct l4_kwq_connect_req1 *) wqes[0]; + struct l4_kwq_connect_req3 *kwqe3; + struct l5cm_active_conn_buffer *conn_buf; + struct l5cm_conn_addr_params *conn_addr; + union l5cm_specific_data l5_data; + u32 l5_cid = kwqe1->pg_cid; + struct cnic_sock *csk = &cp->csk_tbl[l5_cid]; + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; +#if !defined (__VMKLNX__) + struct neighbour *neigh = csk->dst->neighbour; +#endif /* !defined (__VMKLNX__) */ + int ret; + + if (num < 2) { + *work = num; + return -EINVAL; + } + + if (kwqe1->conn_flags & L4_KWQ_CONNECT_REQ1_IP_V6) + *work = 3; + else + *work = 2; + + if (num < *work) { + *work = num; + return -EINVAL; + } + + if (sizeof(*conn_buf) > CNIC_KWQ16_DATA_SIZE) { + printk(KERN_ERR PFX "%s: conn_buf size too big\n", + dev->netdev->name); + return -ENOMEM; + } + conn_buf = cnic_get_kwqe_16_data(cp, l5_cid, &l5_data); + if (!conn_buf) + return -ENOMEM; + + memset(conn_buf, 0, sizeof(*conn_buf)); + + conn_addr = &conn_buf->conn_addr_buf; +#if defined (__VMKLNX__) + conn_addr->remote_addr_0 = csk->ha[0]; + conn_addr->remote_addr_1 = csk->ha[1]; + conn_addr->remote_addr_2 = csk->ha[2]; + conn_addr->remote_addr_3 = csk->ha[3]; + conn_addr->remote_addr_4 = csk->ha[4]; + conn_addr->remote_addr_5 = csk->ha[5]; + + + /* Use the stored MAC address */ + cnic_init_bnx2x_mac(dev, cp->srcMACAddr); +#else /* !defined (__VMKLNX__) */ + conn_addr->remote_addr_0 = neigh->ha[0]; + conn_addr->remote_addr_1 = neigh->ha[1]; + conn_addr->remote_addr_2 = neigh->ha[2]; + conn_addr->remote_addr_3 = neigh->ha[3]; + conn_addr->remote_addr_4 = neigh->ha[4]; + conn_addr->remote_addr_5 = neigh->ha[5]; +#endif /* defined (__VMKLNX__) */ + + if (kwqe1->conn_flags & L4_KWQ_CONNECT_REQ1_IP_V6) { + struct l4_kwq_connect_req2 *kwqe2 = + (struct l4_kwq_connect_req2 *) wqes[1]; + + conn_addr->local_ip_addr.ip_addr_hi_hi = kwqe2->src_ip_v6_4; + conn_addr->local_ip_addr.ip_addr_hi_lo = kwqe2->src_ip_v6_3; + conn_addr->local_ip_addr.ip_addr_lo_hi = kwqe2->src_ip_v6_2; + + conn_addr->remote_ip_addr.ip_addr_hi_hi = kwqe2->dst_ip_v6_4; + conn_addr->remote_ip_addr.ip_addr_hi_lo = kwqe2->dst_ip_v6_3; + conn_addr->remote_ip_addr.ip_addr_lo_hi = kwqe2->dst_ip_v6_2; + conn_addr->params |= L5CM_CONN_ADDR_PARAMS_IP_VERSION; + } + kwqe3 = (struct l4_kwq_connect_req3 *) wqes[*work - 1]; + + conn_addr->local_ip_addr.ip_addr_lo_lo = kwqe1->src_ip; + conn_addr->remote_ip_addr.ip_addr_lo_lo = kwqe1->dst_ip; + conn_addr->local_tcp_port = kwqe1->src_port; + conn_addr->remote_tcp_port = kwqe1->dst_port; + + conn_addr->pmtu = kwqe3->pmtu; + cnic_init_storm_conn_bufs(dev, kwqe1, kwqe3, conn_buf); + + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_VLAN_OFFSET(cp->func), csk->vlan_id); + + cnic_bnx2x_set_tcp_timestamp(dev, + kwqe1->tcp_flags & L4_KWQ_CONNECT_REQ1_TIME_STAMP); + + ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_TCP_CONNECT, + kwqe1->cid, ISCSI_CONNECTION_TYPE, &l5_data); + if (!ret) + set_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags); + + return ret; +} + +static int cnic_bnx2x_close(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct l4_kwq_close_req *req = (struct l4_kwq_close_req *) kwqe; + union l5cm_specific_data l5_data; + int ret; + + memset(&l5_data, 0, sizeof(l5_data)); + ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_CLOSE, + req->cid, ISCSI_CONNECTION_TYPE, &l5_data); + return ret; +} + +static int cnic_bnx2x_reset(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct l4_kwq_reset_req *req = (struct l4_kwq_reset_req *) kwqe; + union l5cm_specific_data l5_data; + int ret; + + memset(&l5_data, 0, sizeof(l5_data)); + ret = cnic_submit_kwqe_16(dev, L5CM_RAMROD_CMD_ID_ABORT, + req->cid, ISCSI_CONNECTION_TYPE, &l5_data); + return ret; +} +static int cnic_bnx2x_offload_pg(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct l4_kwq_offload_pg *req = (struct l4_kwq_offload_pg *) kwqe; + struct l4_kcq kcqe; + struct kcqe *cqes[1]; + + memset(&kcqe, 0, sizeof(kcqe)); + kcqe.pg_host_opaque = req->host_opaque; + kcqe.pg_cid = req->host_opaque; + kcqe.op_code = L4_KCQE_OPCODE_VALUE_OFFLOAD_PG; + cqes[0] = (struct kcqe *) &kcqe; + cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_L4, cqes, 1); + return 0; +} + +static int cnic_bnx2x_update_pg(struct cnic_dev *dev, struct kwqe *kwqe) +{ + struct l4_kwq_update_pg *req = (struct l4_kwq_update_pg *) kwqe; + struct l4_kcq kcqe; + struct kcqe *cqes[1]; + + memset(&kcqe, 0, sizeof(kcqe)); + kcqe.pg_host_opaque = req->pg_host_opaque; + kcqe.pg_cid = req->pg_cid; + kcqe.op_code = L4_KCQE_OPCODE_VALUE_UPDATE_PG; + cqes[0] = (struct kcqe *) &kcqe; + cnic_reply_bnx2x_kcqes(dev, CNIC_ULP_L4, cqes, 1); + return 0; +} + +static int cnic_submit_bnx2x_kwqes(struct cnic_dev *dev, struct kwqe *wqes[], + u32 num_wqes) +{ + int i, work, ret; + u32 opcode; + struct kwqe *kwqe; + + if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) + return -EAGAIN; /* bnx2 is down */ + + for (i = 0; i < num_wqes; ) { + kwqe = wqes[i]; + opcode = KWQE_OPCODE(kwqe->kwqe_op_flag); + work = 1; + + switch (opcode) { + case ISCSI_KWQE_OPCODE_INIT1: + ret = cnic_bnx2x_iscsi_init1(dev, kwqe); + break; + case ISCSI_KWQE_OPCODE_INIT2: + ret = cnic_bnx2x_iscsi_init2(dev, kwqe); + break; + case ISCSI_KWQE_OPCODE_OFFLOAD_CONN1: + ret = cnic_bnx2x_iscsi_ofld1(dev, &wqes[i], + num_wqes - i, &work); + break; + case ISCSI_KWQE_OPCODE_UPDATE_CONN: + ret = cnic_bnx2x_iscsi_update(dev, kwqe); + break; + case ISCSI_KWQE_OPCODE_DESTROY_CONN: + ret = cnic_bnx2x_iscsi_destroy(dev, kwqe); + break; + case L4_KWQE_OPCODE_VALUE_CONNECT1: + ret = cnic_bnx2x_connect(dev, &wqes[i], num_wqes - i, + &work); + break; + case L4_KWQE_OPCODE_VALUE_CLOSE: + ret = cnic_bnx2x_close(dev, kwqe); + break; + case L4_KWQE_OPCODE_VALUE_RESET: + ret = cnic_bnx2x_reset(dev, kwqe); + break; + case L4_KWQE_OPCODE_VALUE_OFFLOAD_PG: + ret = cnic_bnx2x_offload_pg(dev, kwqe); + break; + case L4_KWQE_OPCODE_VALUE_UPDATE_PG: + ret = cnic_bnx2x_update_pg(dev, kwqe); + break; + case L4_KWQE_OPCODE_VALUE_UPLOAD_PG: + ret = 0; + break; + default: + ret = 0; + printk(KERN_ERR PFX "%s: Unknown type of KWQE(0x%x)\n", + dev->netdev->name, opcode); + break; + } + if (ret < 0) + printk(KERN_ERR PFX "%s: KWQE(0x%x) failed\n", + dev->netdev->name, opcode); + i += work; + } + return 0; +} + +static void service_kcqes(struct cnic_dev *dev, int num_cqes) +{ + struct cnic_local *cp = dev->cnic_priv; + int i, j; + + i = 0; + j = 1; + while (num_cqes) { + struct cnic_ulp_ops *ulp_ops; + int ulp_type; + u32 kcqe_op_flag = cp->completed_kcq[i]->kcqe_op_flag; + u32 kcqe_layer = kcqe_op_flag & KCQE_FLAGS_LAYER_MASK; + + if (unlikely(kcqe_op_flag & KCQE_RAMROD_COMPLETION)) + cnic_kwq_completion(dev, 1); + + while (j < num_cqes) { + u32 next_op = cp->completed_kcq[i + j]->kcqe_op_flag; + + if ((next_op & KCQE_FLAGS_LAYER_MASK) != kcqe_layer) + break; + + if (unlikely(next_op & KCQE_RAMROD_COMPLETION)) + cnic_kwq_completion(dev, 1); + j++; + } + + if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L5_RDMA) + ulp_type = CNIC_ULP_RDMA; + else if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L5_ISCSI) + ulp_type = CNIC_ULP_ISCSI; + else if (kcqe_layer == KCQE_FLAGS_LAYER_MASK_L4) + ulp_type = CNIC_ULP_L4; + else { + printk(KERN_ERR PFX "%s: Unknown type of KCQE(0x%x)\n", + dev->netdev->name, kcqe_op_flag); + goto end; + } + + rcu_read_lock(); + ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); + if (likely(ulp_ops)) { + ulp_ops->indicate_kcqes(cp->ulp_handle[ulp_type], + cp->completed_kcq + i, j); + } + rcu_read_unlock(); +end: + num_cqes -= j; + i += j; + j = 1; + } + return; +} + +static u16 cnic_bnx2_next_idx(u16 idx) +{ + return (idx + 1); +} + +static u16 cnic_bnx2_hw_idx(u16 idx) +{ + return idx; +} + +static u16 cnic_bnx2x_next_idx(u16 idx) +{ + idx++; + if ((idx & MAX_KCQE_CNT) == MAX_KCQE_CNT) + idx++; + + return idx; +} + +static u16 cnic_bnx2x_hw_idx(u16 idx) +{ + if ((idx & MAX_KCQE_CNT) == MAX_KCQE_CNT) + idx++; + return idx; +} + +static int cnic_get_kcqes(struct cnic_dev *dev, u16 hw_prod, u16 *sw_prod) +{ + struct cnic_local *cp = dev->cnic_priv; + u16 i, ri, last; + struct kcqe *kcqe; + int kcqe_cnt = 0, last_cnt = 0; + + i = ri = last = *sw_prod; + ri &= MAX_KCQ_IDX; + + while ((i != hw_prod) && (kcqe_cnt < MAX_COMPLETED_KCQE)) { + kcqe = &cp->kcq[KCQ_PG(ri)][KCQ_IDX(ri)]; + cp->completed_kcq[kcqe_cnt++] = kcqe; + i = cp->next_idx(i); + ri = i & MAX_KCQ_IDX; + if (likely(!(kcqe->kcqe_op_flag & KCQE_FLAGS_NEXT))) { + last_cnt = kcqe_cnt; + last = i; + } + } + + *sw_prod = last; + return last_cnt; +} + +static int cnic_service_bnx2(void *data, void *status_blk) +{ + struct cnic_dev *dev = data; + struct status_block *sblk = status_blk; + struct cnic_local *cp = dev->cnic_priv; + u32 status_idx = sblk->status_idx; + u16 hw_prod, sw_prod; + int kcqe_cnt; + + if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) + return status_idx; + + cp->kwq_con_idx = *cp->kwq_con_idx_ptr; + + hw_prod = sblk->status_completion_producer_index; + sw_prod = cp->kcq_prod_idx; + while (sw_prod != hw_prod) { + kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); + if (kcqe_cnt == 0) + goto done; + + service_kcqes(dev, kcqe_cnt); + + /* Tell compiler that status_blk fields can change. */ + barrier(); + if (status_idx != sblk->status_idx) { + status_idx = sblk->status_idx; + cp->kwq_con_idx = *cp->kwq_con_idx_ptr; + hw_prod = sblk->status_completion_producer_index; + } else + break; + } + +done: + CNIC_WR16(dev, cp->kcq_io_addr, sw_prod); + + cp->kcq_prod_idx = sw_prod; + return status_idx; +} + +static void cnic_service_bnx2_msix(unsigned long data) +{ + struct cnic_dev *dev = (struct cnic_dev *) data; + struct cnic_local *cp = dev->cnic_priv; + struct status_block_msix *status_blk = cp->bnx2_status_blk; + u32 status_idx = status_blk->status_idx; + u16 hw_prod, sw_prod; + int kcqe_cnt; + + cp->kwq_con_idx = status_blk->status_cmd_consumer_index; + + hw_prod = status_blk->status_completion_producer_index; + sw_prod = cp->kcq_prod_idx; + while (sw_prod != hw_prod) { + kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); + if (kcqe_cnt == 0) + goto done; + + service_kcqes(dev, kcqe_cnt); + + /* Tell compiler that status_blk fields can change. */ + barrier(); + if (status_idx != status_blk->status_idx) { + status_idx = status_blk->status_idx; + cp->kwq_con_idx = status_blk->status_cmd_consumer_index; + hw_prod = status_blk->status_completion_producer_index; + } else + break; + } + +done: + CNIC_WR16(dev, cp->kcq_io_addr, sw_prod); + + cp->kcq_prod_idx = sw_prod; + cp->last_status_idx = status_idx; + CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | cp->last_status_idx); +} + +#if (LINUX_VERSION_CODE >= 0x20613) +static irqreturn_t cnic_irq(int irq, void *dev_instance) +#else +static irqreturn_t cnic_irq(int irq, void *dev_instance, struct pt_regs *regs) +#endif +{ + struct cnic_dev *dev = dev_instance; + struct cnic_local *cp = dev->cnic_priv; + u16 prod = cp->kcq_prod_idx & MAX_KCQ_IDX; + + if (cp->ack_int) + cp->ack_int(dev); + + prefetch(cp->status_blk); + prefetch(&cp->kcq[KCQ_PG(prod)][KCQ_IDX(prod)]); + + if (likely(test_bit(CNIC_F_CNIC_UP, &dev->flags))) + tasklet_schedule(&cp->cnic_irq_task); + + return IRQ_HANDLED; +} + +static inline void cnic_ack_bnx2x_int(struct cnic_dev *dev, u8 id, u8 storm, + u16 index, u8 op, u8 update) +{ + struct cnic_local *cp = dev->cnic_priv; + u32 hc_addr = (HC_REG_COMMAND_REG + CNIC_PORT(cp) * 32 + + COMMAND_REG_INT_ACK); + struct igu_ack_register igu_ack; + + igu_ack.status_block_index = index; + igu_ack.sb_id_and_flags = + ((id << IGU_ACK_REGISTER_STATUS_BLOCK_ID_SHIFT) | + (storm << IGU_ACK_REGISTER_STORM_ID_SHIFT) | + (update << IGU_ACK_REGISTER_UPDATE_INDEX_SHIFT) | + (op << IGU_ACK_REGISTER_INTERRUPT_MODE_SHIFT)); + + CNIC_WR(dev, hc_addr, (*(u32 *)&igu_ack)); +} + +static void cnic_ack_bnx2x_msix(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + + cnic_ack_bnx2x_int(dev, cp->status_blk_num, CSTORM_ID, 0, + IGU_INT_DISABLE, 0); +} + +static void cnic_service_bnx2x_bh(unsigned long data) +{ + struct cnic_dev *dev = (struct cnic_dev *) data; + struct cnic_local *cp = dev->cnic_priv; + u16 hw_prod, sw_prod; +#ifdef NEW_BNX2X_HSI + struct cstorm_status_block_c *sblk = + &cp->bnx2x_status_blk->c_status_block; +#else + struct cstorm_status_block *sblk = + &cp->bnx2x_status_blk->c_status_block; +#endif + u32 status_idx = sblk->status_block_index; + int kcqe_cnt; + + if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags))) + return; + + hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS]; + hw_prod = cp->hw_idx(hw_prod); + sw_prod = cp->kcq_prod_idx; + while (sw_prod != hw_prod) { + u32 kcq_diff; + if(hw_prod < sw_prod) + kcq_diff = (65536 + hw_prod) - sw_prod; + else + kcq_diff = hw_prod - sw_prod; + + if (kcq_diff > MAX_KCQ_IDX) + printk(KERN_WARNING PFX + "%s: kcq abs(hw_prod(%d) - sw_prod(%d))" + " > MAX_KCQ_IDX(%lu)\n", + dev->netdev->name, + hw_prod, sw_prod, MAX_KCQ_IDX); + + kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod); + if (kcqe_cnt == 0) + goto done; + + CNIC_WR16(dev, cp->kcq_io_addr, sw_prod + MAX_KCQ_IDX); + service_kcqes(dev, kcqe_cnt); + + /* Tell compiler that sblk fields can change. */ + barrier(); + if (status_idx == sblk->status_block_index) + break; + + status_idx = sblk->status_block_index; + hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS]; + hw_prod = cp->hw_idx(hw_prod); + } + +done: + cnic_ack_bnx2x_int(dev, cp->status_blk_num, CSTORM_ID, + status_idx, IGU_INT_ENABLE, 1); + + cp->kcq_prod_idx = sw_prod; + return; +} + +static int cnic_service_bnx2x(void *data, void *status_blk) +{ + struct cnic_dev *dev = data; + struct cnic_local *cp = dev->cnic_priv; + u16 prod = cp->kcq_prod_idx & MAX_KCQ_IDX; + + if (likely(test_bit(CNIC_F_CNIC_UP, &dev->flags))) { + prefetch(cp->status_blk); + prefetch(&cp->kcq[KCQ_PG(prod)][KCQ_IDX(prod)]); + + tasklet_schedule(&cp->cnic_irq_task); + } + return 0; +} + +/* Called with cnic_lock mutex held. */ +static void cnic_ulp_stop(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int if_type; + + for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { + struct cnic_ulp_ops *ulp_ops; + + ulp_ops = cp->ulp_ops[if_type]; + if (!ulp_ops) + continue; + + if (test_and_clear_bit(ULP_F_START, &cp->ulp_flags[if_type])) + ulp_ops->cnic_stop(cp->ulp_handle[if_type]); + } +} + +/* Called with cnic_lock mutex held. */ +static void cnic_ulp_start(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int if_type; + + for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { + struct cnic_ulp_ops *ulp_ops; + + ulp_ops = cp->ulp_ops[if_type]; + if (!ulp_ops) + continue; + + if (!test_and_set_bit(ULP_F_START, &cp->ulp_flags[if_type])) + ulp_ops->cnic_start(cp->ulp_handle[if_type]); + } +} + +static int cnic_ctl(void *data, struct cnic_ctl_info *info) +{ + struct cnic_dev *dev = data; + + switch (info->cmd) { + case CNIC_CTL_STOP_CMD: + cnic_hold(dev); + mutex_lock(&cnic_lock); + + if (test_bit(CNIC_F_IF_UP, &dev->flags)) { + clear_bit(CNIC_F_IF_UP, &dev->flags); + cnic_ulp_stop(dev); + cnic_stop_hw(dev); + } + + mutex_unlock(&cnic_lock); + cnic_put(dev); + break; + case CNIC_CTL_START_CMD: + cnic_hold(dev); + mutex_lock(&cnic_lock); + + if (!cnic_start_hw(dev)) + cnic_ulp_start(dev); + set_bit(CNIC_F_IF_UP, &dev->flags); + + mutex_unlock(&cnic_lock); + cnic_put(dev); + break; + case CNIC_CTL_COMPLETION_CMD: { + u32 cid = BNX2X_SW_CID(info->data.comp.cid); + u32 l5_cid; + struct cnic_local *cp = dev->cnic_priv; + + if (cnic_get_l5_cid(cp, cid, &l5_cid) == 0) { + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + + ctx->wait_cond = 1; + wake_up(&ctx->waitq); + } else { + printk(KERN_WARNING PFX "%s: %s" + "could not find l5_cid: %d cid: %d\n", + __FUNCTION__, + dev->netdev->name, l5_cid, cid); + } + break; + } + default: + return -EINVAL; + } + return 0; +} + +static void cnic_ulp_init(struct cnic_dev *dev) +{ + int i; + struct cnic_local *cp = dev->cnic_priv; + + for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { + struct cnic_ulp_ops *ulp_ops; + + mutex_lock(&cnic_lock); + ulp_ops = cnic_ulp_tbl[i]; + if (!ulp_ops || !ulp_ops->cnic_init) { + mutex_unlock(&cnic_lock); + continue; + } + ulp_get(ulp_ops); + mutex_unlock(&cnic_lock); + + if (!test_and_set_bit(ULP_F_INIT, &cp->ulp_flags[i])) + ulp_ops->cnic_init(dev); + + ulp_put(ulp_ops); + } +} + +static void cnic_ulp_exit(struct cnic_dev *dev) +{ + int i; + struct cnic_local *cp = dev->cnic_priv; + + for (i = 0; i < MAX_CNIC_ULP_TYPE_EXT; i++) { + struct cnic_ulp_ops *ulp_ops; + + mutex_lock(&cnic_lock); + ulp_ops = cnic_ulp_tbl[i]; + if (!ulp_ops || !ulp_ops->cnic_exit) { + mutex_unlock(&cnic_lock); + continue; + } + ulp_get(ulp_ops); + mutex_unlock(&cnic_lock); + + if (test_and_clear_bit(ULP_F_INIT, &cp->ulp_flags[i])) + ulp_ops->cnic_exit(dev); + + ulp_put(ulp_ops); + } +} + +static int cnic_queue_work(struct cnic_local *cp, u32 work_type, void *data) +{ + struct cnic_work_node *node; + int bytes = sizeof(u32 *); + + spin_lock_bh(&cp->wr_lock); + + node = &cp->cnic_work_ring[cp->cnic_wr_prod]; + node->work_type = work_type; + if (work_type == WORK_TYPE_KCQE) + bytes = sizeof(struct kcqe); + if (work_type == WORK_TYPE_REDIRECT) + bytes = sizeof(struct cnic_redirect_entry); + memcpy(&node->work_data, data, bytes); + cp->cnic_wr_prod++; + cp->cnic_wr_prod &= WORK_RING_SIZE_MASK; + + spin_unlock_bh(&cp->wr_lock); + return 0; +} + +static int cnic_cm_offload_pg(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_offload_pg *l4kwqe; + struct kwqe *wqes[1]; +#if defined (__VMKLNX__) + struct cnic_local *cp = dev->cnic_priv; +#else /* !defined (__VMKLNX__) */ + struct neighbour *neigh = csk->dst->neighbour; + struct net_device *netdev = neigh->dev; +#endif /* defined (__VMKLNX__) */ + +#ifndef HAVE_NETEVENT +#if !defined (__VMKLNX__) + memcpy(csk->old_ha, &neigh->ha[0], 6); +#endif /* !defined (__VMKLNX__) */ +#endif + l4kwqe = (struct l4_kwq_offload_pg *) &csk->kwqe1; + memset(l4kwqe, 0, sizeof(*l4kwqe)); + wqes[0] = (struct kwqe *) l4kwqe; + + l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_OFFLOAD_PG; + l4kwqe->flags = + L4_LAYER_CODE << L4_KWQ_OFFLOAD_PG_LAYER_CODE_SHIFT; + l4kwqe->l2hdr_nbytes = ETH_HLEN; +#if defined (__VMKLNX__) + l4kwqe->da0 = csk->ha[0]; + l4kwqe->da1 = csk->ha[1]; + l4kwqe->da2 = csk->ha[2]; + l4kwqe->da3 = csk->ha[3]; + l4kwqe->da4 = csk->ha[4]; + l4kwqe->da5 = csk->ha[5]; + + l4kwqe->sa0 = cp->srcMACAddr[0]; + l4kwqe->sa1 = cp->srcMACAddr[1]; + l4kwqe->sa2 = cp->srcMACAddr[2]; + l4kwqe->sa3 = cp->srcMACAddr[3]; + l4kwqe->sa4 = cp->srcMACAddr[4]; + l4kwqe->sa5 = cp->srcMACAddr[5]; +#else /* !defined (__VMKLNX__) */ + l4kwqe->da0 = neigh->ha[0]; + l4kwqe->da1 = neigh->ha[1]; + l4kwqe->da2 = neigh->ha[2]; + l4kwqe->da3 = neigh->ha[3]; + l4kwqe->da4 = neigh->ha[4]; + l4kwqe->da5 = neigh->ha[5]; + + l4kwqe->sa0 = netdev->dev_addr[0]; + l4kwqe->sa1 = netdev->dev_addr[1]; + l4kwqe->sa2 = netdev->dev_addr[2]; + l4kwqe->sa3 = netdev->dev_addr[3]; + l4kwqe->sa4 = netdev->dev_addr[4]; + l4kwqe->sa5 = netdev->dev_addr[5]; +#endif /* defined (__VMKLNX__) */ + + l4kwqe->etype = ETH_P_IP; + + /* All offloaded connections shall show an ipid of 0x8000+ */ + l4kwqe->ipid_start = 0x8000; + l4kwqe->ipid_count = 0; + l4kwqe->host_opaque = csk->l5_cid; + + if (csk->vlan_id) { + l4kwqe->pg_flags |= L4_KWQ_OFFLOAD_PG_VLAN_TAGGING; + l4kwqe->vlan_tag = csk->vlan_id; + l4kwqe->l2hdr_nbytes += 4; + } + + return (dev->submit_kwqes(dev, wqes, 1)); +} + +#if !defined (__VMKLNX__) +static int cnic_cm_update_pg(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_update_pg *l4kwqe; + struct kwqe *wqes[1]; + struct neighbour *neigh = csk->dst->neighbour; + +#ifndef HAVE_NETEVENT + memcpy(csk->old_ha, &neigh->ha[0], 6); +#endif + l4kwqe = (struct l4_kwq_update_pg *) &csk->kwqe1; + memset(l4kwqe, 0, sizeof(*l4kwqe)); + wqes[0] = (struct kwqe *) l4kwqe; + + l4kwqe->opcode = L4_KWQE_OPCODE_VALUE_UPDATE_PG; + l4kwqe->flags = + L4_LAYER_CODE << L4_KWQ_UPDATE_PG_LAYER_CODE_SHIFT; + l4kwqe->pg_cid = csk->pg_cid; + l4kwqe->da0 = neigh->ha[0]; + l4kwqe->da1 = neigh->ha[1]; + l4kwqe->da2 = neigh->ha[2]; + l4kwqe->da3 = neigh->ha[3]; + l4kwqe->da4 = neigh->ha[4]; + l4kwqe->da5 = neigh->ha[5]; + + l4kwqe->pg_host_opaque = csk->l5_cid; + l4kwqe->pg_valids = L4_KWQ_UPDATE_PG_VALIDS_DA; + + return (dev->submit_kwqes(dev, wqes, 1)); +} +#endif /* !defined (__VMKLNX__) */ + +static int cnic_cm_upload_pg(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_upload *l4kwqe; + struct kwqe *wqes[1]; + + l4kwqe = (struct l4_kwq_upload *) &csk->kwqe1; + memset(l4kwqe, 0, sizeof(*l4kwqe)); + wqes[0] = (struct kwqe *) l4kwqe; + + l4kwqe->opcode = L4_KWQE_OPCODE_VALUE_UPLOAD_PG; + l4kwqe->flags = + L4_LAYER_CODE << L4_KWQ_UPLOAD_LAYER_CODE_SHIFT; + l4kwqe->cid = csk->pg_cid; + + return (dev->submit_kwqes(dev, wqes, 1)); +} + +#ifdef HAVE_NETEVENT +static void cnic_redirect(struct cnic_local *cp, struct dst_entry *new, + struct dst_entry *old) +{ + int i, found = 0; + + for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { + struct cnic_sock *csk; + struct cnic_redirect_entry cnic_redir; + + csk = &cp->csk_tbl[i]; + csk_hold(csk); + if (cnic_in_use(csk) && csk->dst == old) { + found = 1; + dst_hold(new); + dst_hold(old); + + cnic_redir.old_dst = old; + cnic_redir.new_dst = new; + cnic_queue_work(cp, WORK_TYPE_REDIRECT, &cnic_redir); + tasklet_schedule(&cp->cnic_task); + } + csk_put(csk); + } +} + +static void cnic_update_neigh(struct cnic_local *cp, struct neighbour *neigh) +{ + int i, found = 0; + + for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { + struct cnic_sock *csk; + + csk = &cp->csk_tbl[i]; + csk_hold(csk); + if (cnic_in_use(csk) && csk->dst) { + if (csk->dst->neighbour == neigh) { + found = 1; + neigh_hold(neigh); + + cnic_queue_work(cp, WORK_TYPE_NEIGH_UPDATE, + &neigh); + tasklet_schedule(&cp->cnic_task); + } + } + csk_put(csk); + } +} + +static int cnic_net_callback(struct notifier_block *this, unsigned long event, + void *ptr) +{ + struct cnic_local *cp = container_of(this, struct cnic_local, cm_nb); + + if (event == NETEVENT_NEIGH_UPDATE) { + struct neighbour *neigh = ptr; + + cnic_update_neigh(cp, neigh); + + } else if (event == NETEVENT_REDIRECT) { + struct netevent_redirect *netevent = ptr; + struct dst_entry *old_dst = netevent->old; + struct dst_entry *new_dst = netevent->new; + + cnic_redirect(cp, new_dst, old_dst); + } + return 0; +} +#endif + +static int cnic_cm_conn_req(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_connect_req1 *l4kwqe1; + struct l4_kwq_connect_req2 *l4kwqe2; + struct l4_kwq_connect_req3 *l4kwqe3; + struct kwqe *wqes[3]; + u8 tcp_flags = 0; + int num_wqes = 2; + + l4kwqe1 = (struct l4_kwq_connect_req1 *) &csk->kwqe1; + l4kwqe2 = (struct l4_kwq_connect_req2 *) &csk->kwqe2; + l4kwqe3 = (struct l4_kwq_connect_req3 *) &csk->kwqe3; + memset(l4kwqe1, 0, sizeof(*l4kwqe1)); + memset(l4kwqe2, 0, sizeof(*l4kwqe2)); + memset(l4kwqe3, 0, sizeof(*l4kwqe3)); + + l4kwqe3->op_code = L4_KWQE_OPCODE_VALUE_CONNECT3; + l4kwqe3->flags = + L4_LAYER_CODE << L4_KWQ_CONNECT_REQ3_LAYER_CODE_SHIFT; + l4kwqe3->ka_timeout = csk->ka_timeout; + l4kwqe3->ka_interval = csk->ka_interval; + l4kwqe3->ka_max_probe_count = csk->ka_max_probe_count; + l4kwqe3->tos = csk->tos; + l4kwqe3->ttl = csk->ttl; + l4kwqe3->snd_seq_scale = csk->snd_seq_scale; + l4kwqe3->pmtu = csk->pmtu; + l4kwqe3->rcv_buf = csk->rcv_buf; + l4kwqe3->snd_buf = csk->snd_buf; + l4kwqe3->seed = csk->seed; + + wqes[0] = (struct kwqe *) l4kwqe1; + if (test_bit(SK_F_IPV6, &csk->flags)) { + wqes[1] = (struct kwqe *) l4kwqe2; + wqes[2] = (struct kwqe *) l4kwqe3; + num_wqes = 3; + + l4kwqe1->conn_flags = L4_KWQ_CONNECT_REQ1_IP_V6; + l4kwqe2->op_code = L4_KWQE_OPCODE_VALUE_CONNECT2; + l4kwqe2->flags = + L4_KWQ_CONNECT_REQ2_LINKED_WITH_NEXT | + L4_LAYER_CODE << L4_KWQ_CONNECT_REQ2_LAYER_CODE_SHIFT; + l4kwqe2->src_ip_v6_2 = be32_to_cpu(csk->src_ip[1]); + l4kwqe2->src_ip_v6_3 = be32_to_cpu(csk->src_ip[2]); + l4kwqe2->src_ip_v6_4 = be32_to_cpu(csk->src_ip[3]); + l4kwqe2->dst_ip_v6_2 = be32_to_cpu(csk->dst_ip[1]); + l4kwqe2->dst_ip_v6_3 = be32_to_cpu(csk->dst_ip[2]); + l4kwqe2->dst_ip_v6_4 = be32_to_cpu(csk->dst_ip[3]); + l4kwqe3->mss = l4kwqe3->pmtu - sizeof(struct ipv6hdr) - + sizeof(struct tcphdr); + } else { + wqes[1] = (struct kwqe *) l4kwqe3; + l4kwqe3->mss = l4kwqe3->pmtu - sizeof(struct iphdr) - + sizeof(struct tcphdr); + } + + l4kwqe1->op_code = L4_KWQE_OPCODE_VALUE_CONNECT1; + l4kwqe1->flags = + (L4_LAYER_CODE << L4_KWQ_CONNECT_REQ1_LAYER_CODE_SHIFT) | + L4_KWQ_CONNECT_REQ3_LINKED_WITH_NEXT; + l4kwqe1->cid = csk->cid; + l4kwqe1->pg_cid = csk->pg_cid; + l4kwqe1->src_ip = be32_to_cpu(csk->src_ip[0]); + l4kwqe1->dst_ip = be32_to_cpu(csk->dst_ip[0]); + l4kwqe1->src_port = be16_to_cpu(csk->src_port); + l4kwqe1->dst_port = be16_to_cpu(csk->dst_port); + if (csk->tcp_flags & SK_TCP_NO_DELAY_ACK) + tcp_flags |= L4_KWQ_CONNECT_REQ1_NO_DELAY_ACK; + if (csk->tcp_flags & SK_TCP_KEEP_ALIVE) + tcp_flags |= L4_KWQ_CONNECT_REQ1_KEEP_ALIVE; + if (csk->tcp_flags & SK_TCP_NAGLE) + tcp_flags |= L4_KWQ_CONNECT_REQ1_NAGLE_ENABLE; + if (csk->tcp_flags & SK_TCP_TIMESTAMP) + tcp_flags |= L4_KWQ_CONNECT_REQ1_TIME_STAMP; + if (csk->tcp_flags & SK_TCP_SACK) + tcp_flags |= L4_KWQ_CONNECT_REQ1_SACK; + if (csk->tcp_flags & SK_TCP_SEG_SCALING) + tcp_flags |= L4_KWQ_CONNECT_REQ1_SEG_SCALING; + + l4kwqe1->tcp_flags = tcp_flags; + + return (dev->submit_kwqes(dev, wqes, num_wqes)); +} + +static int cnic_cm_close_req(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_close_req *l4kwqe; + struct kwqe *wqes[1]; + + l4kwqe = (struct l4_kwq_close_req *) &csk->kwqe2; + memset(l4kwqe, 0, sizeof(*l4kwqe)); + wqes[0] = (struct kwqe *) l4kwqe; + + l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_CLOSE; + l4kwqe->flags = L4_LAYER_CODE << L4_KWQ_CLOSE_REQ_LAYER_CODE_SHIFT; + l4kwqe->cid = csk->cid; + + return (dev->submit_kwqes(dev, wqes, 1)); +} + +static int cnic_cm_abort_req(struct cnic_sock *csk) +{ + struct cnic_dev *dev = csk->dev; + struct l4_kwq_reset_req *l4kwqe; + struct kwqe *wqes[1]; + + l4kwqe = (struct l4_kwq_reset_req *) &csk->kwqe2; + memset(l4kwqe, 0, sizeof(*l4kwqe)); + wqes[0] = (struct kwqe *) l4kwqe; + + l4kwqe->op_code = L4_KWQE_OPCODE_VALUE_RESET; + l4kwqe->flags = L4_LAYER_CODE << L4_KWQ_RESET_REQ_LAYER_CODE_SHIFT; + l4kwqe->cid = csk->cid; + + return (dev->submit_kwqes(dev, wqes, 1)); +} + +static int cnic_cm_create(struct cnic_dev *dev, int ulp_type, u32 cid, + u32 l5_cid, struct cnic_sock **csk, void *context) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_sock *csk1; + + if (l5_cid >= MAX_CM_SK_TBL_SZ) + return -EINVAL; + + if (cp->ctx_tbl) { + struct cnic_context *ctx = &cp->ctx_tbl[l5_cid]; + + if (test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags)) + return -EAGAIN; + } + + csk1 = &cp->csk_tbl[l5_cid]; + if (atomic_read(&csk1->ref_count)) + return -EAGAIN; + + if (test_and_set_bit(SK_F_INUSE, &csk1->flags)) + return -EBUSY; + + csk1->dev = dev; + csk1->cid = cid; + csk1->l5_cid = l5_cid; + csk1->ulp_type = ulp_type; + csk1->context = context; + + csk1->ka_timeout = DEF_KA_TIMEOUT; + csk1->ka_interval = DEF_KA_INTERVAL; + csk1->ka_max_probe_count = DEF_KA_MAX_PROBE_COUNT; + csk1->tos = DEF_TOS; + csk1->ttl = DEF_TTL; + csk1->snd_seq_scale = DEF_SND_SEQ_SCALE; + csk1->rcv_buf = DEF_RCV_BUF; + csk1->snd_buf = DEF_SND_BUF; + csk1->seed = DEF_SEED; + + *csk = csk1; + + return 0; +} + +static void cnic_cm_cleanup(struct cnic_sock *csk) +{ +#if !defined (__VMKLNX__) + if (csk->dst) { + if (csk->dst->neighbour) + neigh_release(csk->dst->neighbour); + dst_release(csk->dst); + csk->dst = NULL; + } + csk->src_port = 0; +#endif /* !defined (__VMKLNX__) */ + if (csk->src_port) { + struct cnic_dev *dev = csk->dev; + struct cnic_local *cp = dev->cnic_priv; + + cnic_free_id(&cp->csk_port_tbl, ntohs(csk->src_port)); + csk->src_port = 0; + } +} + +static void cnic_close_conn(struct cnic_sock *csk) +{ + if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) { + cnic_cm_upload_pg(csk); + clear_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags); + } + cnic_cm_cleanup(csk); + smp_mb__before_clear_bit(); + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); +} + +static int cnic_cm_destroy(struct cnic_sock *csk) +{ + if (!cnic_in_use(csk)) + return -EINVAL; + + csk_hold(csk); + clear_bit(SK_F_INUSE, &csk->flags); + smp_mb__after_clear_bit(); + while (atomic_read(&csk->ref_count) != 1) + msleep(1); + cnic_cm_cleanup(csk); + + csk->flags = 0; + csk_put(csk); + return 0; +} + +static inline u16 cnic_get_vlan(struct net_device *dev, + struct net_device **vlan_dev) +{ +#if !defined (__VMKLNX__) + if (dev->priv_flags & IFF_802_1Q_VLAN) { +#ifdef VLAN_DEV_INFO + *vlan_dev = VLAN_DEV_INFO(dev)->real_dev; + return VLAN_DEV_INFO(dev)->vlan_id; +#else +#ifdef VLAN_TX_COOKIE_MAGIC + *vlan_dev = vlan_dev_info(dev)->real_dev; + return vlan_dev_info(dev)->vlan_id; +#else + *vlan_dev = vlan_dev_real_dev(dev); + return vlan_dev_vlan_id(dev); +#endif +#endif + } +#endif /* !defined (__VMKLNX__) */ + *vlan_dev = dev; + return 0; +} + +#if !defined (__VMKLNX__) +static int cnic_get_v4_route(struct sockaddr_in *dst_addr, + struct sockaddr_in *src_addr, + struct dst_entry **dst) +{ + struct flowi fl; + int err; + struct rtable *rt; + + memset(&fl, 0, sizeof(fl)); + fl.nl_u.ip4_u.daddr = dst_addr->sin_addr.s_addr; + if (src_addr) + fl.nl_u.ip4_u.saddr = src_addr->sin_addr.s_addr; + +#if (LINUX_VERSION_CODE >= 0x020619) + err = ip_route_output_key(&init_net, &rt, &fl); +#else + err = ip_route_output_key(&rt, &fl); +#endif + if (!err) + *dst = &rt->u.dst; + return err; +} + +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +static struct dst_entry *cnic_ip6_rte_output(struct sock *sk, struct flowi *fl) +{ +#if (LINUX_VERSION_CODE >= 0x02061a) + struct dst_entry *(*fn)(struct net *, struct sock *, struct flowi *); +#else + struct dst_entry *(*fn)(struct sock *, struct flowi *); +#endif + struct dst_entry *dst = NULL; + + fn = __symbol_get("ip6_route_output"); + if (fn) { +#if (LINUX_VERSION_CODE >= 0x02061a) + dst = (*fn)(&init_net, sk, fl); +#else + dst = (*fn)(sk, fl); +#endif + __symbol_put("ip6_route_output"); + } + return dst; +} + +static int cnic_ipv6_addr_type(const struct in6_addr *addr) +{ + int (*fn)(const struct in6_addr *addr); + int type = 0; + + fn = __symbol_get("__ipv6_addr_type"); + if (fn) { + type = fn(addr) & 0xffff; + __symbol_put("__ipv6_addr_type"); + } + return type; +} + +static int cnic_ipv6_get_saddr(struct dst_entry *dst, + const struct in6_addr *daddr, + struct in6_addr *saddr) +{ + int rc = -ENOENT; + +#if (LINUX_VERSION_CODE >= 0x02061b) + int (*fn)(struct net *, struct net_device *, + const struct in6_addr *daddr, unsigned int prefs, + struct in6_addr *saddr); + + fn = __symbol_get("ipv6_dev_get_saddr"); + if (fn) { + rc = fn(&init_net, dst->dev, daddr, 0, saddr); + __symbol_put("ipv6_dev_get_saddr"); + } + +#elif (LINUX_VERSION_CODE >= 0x02061a) + int (*fn)(struct net_device *, + const struct in6_addr *daddr, unsigned int prefs, + struct in6_addr *saddr); + + fn = __symbol_get("ipv6_dev_get_saddr"); + if (fn) { + rc = fn(dst->dev, daddr, 0, saddr); + __symbol_put("ipv6_dev_get_saddr"); + } + +#else + int (*fn)(struct dst_entry *, + const struct in6_addr *daddr, struct in6_addr *saddr); + + fn = __symbol_get("ipv6_get_saddr"); + if (fn) { + rc = fn(dst, daddr, saddr); + __symbol_put("ipv6_get_saddr"); + } +#endif + return rc; +} + +#endif + +static int cnic_get_v6_route(struct sockaddr_in6 *dst_addr, + struct sockaddr_in6 *src_addr, + struct dst_entry **dst) +{ +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + struct flowi fl; + + memset(&fl, 0, sizeof(fl)); + ipv6_addr_copy(&fl.fl6_dst, &dst_addr->sin6_addr); + if (cnic_ipv6_addr_type(&fl.fl6_dst) & IPV6_ADDR_LINKLOCAL) + fl.oif = dst_addr->sin6_scope_id; + + if (src_addr) + ipv6_addr_copy(&fl.fl6_src, &src_addr->sin6_addr); + + *dst = cnic_ip6_rte_output(NULL, &fl); + if (*dst) + return 0; +#endif + + return -ENETUNREACH; +} +#endif /* !defined (__VMKLNX__) */ + +#if defined (__VMKLNX__) +static struct cnic_dev *cnic_cm_select_dev(vmk_IscsiNetHandle iscsiNetHandle, + struct sockaddr_in *dst_addr, + int ulp_type) +{ + char devName[IFNAMSIZ]; + struct cnic_dev *dev; + int found = 0; + VMK_ReturnStatus status; + + status = vmk_IscsiTransportGetUplink(iscsiNetHandle, devName); + if (status != VMK_OK) + return NULL; + + list_for_each_entry(dev, &cnic_dev_list, list) { + struct cnic_local *cp = dev->cnic_priv; + + if (dev->netdev && test_bit(CNIC_F_IF_UP, &dev->flags)) { + if (!strcmp(dev->netdev->name, devName)) { + found = 1; + /* Retrieve the source MAC */ + if ((status = vmk_IscsiTransportGetSrcMAC( + iscsiNetHandle, + cp->srcMACAddr)) != VMK_OK) { + printk(KERN_ALERT "%s Get SRC MAC failed %d\n", + dev->netdev->name, status); + found = 0; + break; + } + /* Next hop (arp) resolve */ + if ((status = vmk_IscsiTransportGetNextHopMAC( + iscsiNetHandle, + cp->nextHopMACAddr)) != VMK_OK) { + printk(KERN_ALERT "%s Get next hop MAC failed %d\n", + dev->netdev->name, status); + found = 0; + break; + } + /* Retrieve the source IP Address */ + if ((status = vmk_IscsiTransportGetSrcIP( + iscsiNetHandle, + &cp->srcFamily, + cp->srcIPAddr)) != VMK_OK) { + printk(KERN_ALERT "%s Get SRC IP failed %d\n", + dev->netdev->name, status); + found = 0; + break; + } + /* Path MTU */ + if ((status = vmk_IscsiTransportGetPmtu( + iscsiNetHandle, + &cp->pmtu)) != VMK_OK) { + printk(KERN_ALERT "%s Get PMTU failed %d\n", + dev->netdev->name, status); + cp->pmtu = 1500; + } + /* VLAN Tag */ + if ((status = vmk_IscsiTransportGetVlan( + iscsiNetHandle, + &cp->vlan_id)) != VMK_OK) { + printk(KERN_ALERT "%s Get vlan ID failed %d\n", + dev->netdev->name, status); + cp->vlan_id = 0; + } + + + /* Allocate TCP ports, only once per device */ + if (cp->csk_port_tbl.table) + break; + + cp->cnic_local_port_nr = MAX_CM_SK_TBL_SZ; + cp->cnic_local_port_min = 1; + status = vmk_IscsiTransportGetPortReservation( + iscsiNetHandle, + &cp->cnic_local_port_nr, + &cp->cnic_local_port_min); + if (status == VMK_OK) { + cnic_init_id_tbl(&cp->csk_port_tbl, + cp->cnic_local_port_nr, + cp->cnic_local_port_min, + cp->next_tcp_port); + } else { + found = 0; + printk(KERN_ALERT "%s TCP port alloc failed %d\n", + dev->netdev->name, status); + } + break; + } + } + } + + if (!found) + dev = NULL; + return dev; +} + +#else /* !defined (__VMKLNX__) */ +static struct cnic_dev *cnic_cm_select_dev(struct sockaddr_in *dst_addr, + int ulp_type) +{ + struct cnic_dev *dev = NULL; + struct dst_entry *dst; + struct net_device *netdev = NULL; + int err = -ENETUNREACH, found = 0; + + if (dst_addr->sin_family == AF_INET) + err = cnic_get_v4_route(dst_addr, NULL, &dst); + else if (dst_addr->sin_family == AF_INET6) { + struct sockaddr_in6 *dst_addr6 = + (struct sockaddr_in6 *) dst_addr; + + err = cnic_get_v6_route(dst_addr6, NULL, &dst); + } else + return NULL; + + if (err) + return NULL; + + if (!dst->dev) + goto done; + + cnic_get_vlan(dst->dev, &netdev); + + read_lock(&cnic_dev_lock); + list_for_each_entry(dev, &cnic_dev_list, list) { + if (netdev == dev->netdev) { + found = 1; + break; + } + } + read_unlock(&cnic_dev_lock); + +done: + dst_release(dst); + if (!found) + dev = NULL; + return dev; +} +#endif /* defined (__VMKLNX__) */ + +#if !defined (__VMKLNX__) +static int cnic_resolve_addr(struct cnic_sock *csk) +{ + struct neighbour *neigh = csk->dst->neighbour; + int err = 0; +#ifndef HAVE_NETEVENT + int retry = 0; +#endif + + if (neigh->nud_state & NUD_VALID) { + err = -EINVAL; + if (cnic_offld_prep(csk)) + err = cnic_cm_offload_pg(csk); + goto done; + } + + set_bit(SK_F_NDISC_WAITING, &csk->flags); + neigh_event_send(neigh, NULL); +#ifndef HAVE_NETEVENT + while (!(neigh->nud_state & NUD_VALID) && (retry < 3)) { + msleep(1000); + retry++; + } + if (!(neigh->nud_state & NUD_VALID)) + err = -ETIMEDOUT; + else { + err = -EINVAL; + if (cnic_offld_prep(csk)) + err = cnic_cm_offload_pg(csk); + } + clear_bit(SK_F_NDISC_WAITING, &csk->flags); +#endif +done: + return err; +} + +static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) +{ + struct cnic_dev *dev = csk->dev; + int is_v6, err; + struct dst_entry *dst; + struct net_device *realdev; + + if (saddr->local.v6.sin6_family == AF_INET6 && + saddr->remote.v6.sin6_family == AF_INET6) + is_v6 = 1; + else if (saddr->local.v4.sin_family == AF_INET && + saddr->remote.v4.sin_family == AF_INET) + is_v6 = 0; + else + return -EINVAL; + + clear_bit(SK_F_IPV6, &csk->flags); + + if (is_v6) { +#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) + set_bit(SK_F_IPV6, &csk->flags); + err = cnic_get_v6_route(&saddr->remote.v6, + &saddr->local.v6, &dst); + if (err) + return err; + + if (!dst || dst->error || !dst->dev) + goto err_out; + + cnic_ipv6_get_saddr(dst, &saddr->remote.v6.sin6_addr, + &saddr->local.v6.sin6_addr); + + memcpy(&csk->src_ip[0], &saddr->local.v6.sin6_addr, + sizeof(struct in6_addr)); + memcpy(&csk->dst_ip[0], &saddr->remote.v6.sin6_addr, + sizeof(struct in6_addr)); + csk->src_port = saddr->local.v6.sin6_port; + csk->dst_port = saddr->remote.v6.sin6_port; +#else + return -ENETUNREACH; +#endif + + } else { + err = cnic_get_v4_route(&saddr->remote.v4, &saddr->local.v4, + &dst); + if (err) + return err; + + if (!dst || dst->error || !dst->dev) + goto err_out; + + csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr; + csk->src_ip[0] = saddr->local.v4.sin_addr.s_addr; + csk->src_port = saddr->local.v4.sin_port; + csk->dst_port = saddr->remote.v4.sin_port; + + if (csk->src_ip[0] == 0) { + csk->src_ip[0] = + inet_select_addr(dst->dev, csk->dst_ip[0], + RT_SCOPE_LINK); + } + } + + csk->vlan_id = cnic_get_vlan(dst->dev, &realdev); + if (realdev != dev->netdev) + goto err_out; + + csk->dst = dst; + csk->pmtu = dst_mtu(csk->dst); + return 0; + +err_out: + dst_release(dst); + return -ENETUNREACH; +} +#else /* defined (__VMKLNX__) */ + +static int cnic_get_route(struct cnic_sock *csk, struct cnic_sockaddr *saddr) +{ + struct cnic_dev *dev = csk->dev; + struct cnic_local *cp = dev->cnic_priv; + int err; + int local_port; + + if (saddr->local.v4.sin_family != AF_INET && + saddr->remote.v4.sin_family != AF_INET6) + return -EINVAL; + + /* Use stored next hop MAC address */ + if (!cp->nextHopMACAddr[0] && !cp->nextHopMACAddr[1] && + !cp->nextHopMACAddr[2]) { + printk(KERN_ALERT "Zero next hop address, aborting\n"); + return -EINVAL; + } + + if (!cnic_offld_prep(csk)) + return -EINVAL; + + clear_bit(SK_F_IPV6, &csk->flags); + + memcpy(csk->ha, cp->nextHopMACAddr, 6); + local_port = cnic_alloc_new_id(&cp->csk_port_tbl); + if (local_port == -1) { + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + return -ENOMEM; + } + + csk->pmtu = cp->pmtu; + + csk->src_ip[0] = *((vmk_uint32 *)cp->srcIPAddr); + csk->dst_ip[0] = saddr->remote.v4.sin_addr.s_addr; + csk->src_port = htons(local_port); + csk->dst_port = saddr->remote.v4.sin_port; + + csk->vlan_id = cp->vlan_id; + + err = cnic_cm_offload_pg(csk); + + return err; +} +#endif /* !defined (__VMKLNX__) */ + +static void cnic_init_csk_state(struct cnic_sock *csk) +{ + csk->state = 0; + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + clear_bit(SK_F_CLOSING, &csk->flags); +} + +static int cnic_cm_connect(struct cnic_sock *csk, struct cnic_sockaddr *saddr) +{ +#if !defined (__VMKLNX__) + struct neighbour *neigh; +#endif /* !defined (__VMKLNX__) */ + int err = 0; + + if (!cnic_in_use(csk)) + return -EINVAL; + + if (test_and_set_bit(SK_F_CONNECT_START, &csk->flags)) + return -EINVAL; + + cnic_init_csk_state(csk); + + err = cnic_get_route(csk, saddr); + if (err) + goto err_out; + +#if !defined (__VMKLNX__) + neigh = csk->dst->neighbour; + if (!neigh) + goto err_out; + + neigh_hold(neigh); + + err = cnic_resolve_addr(csk); + if (!err) + return 0; + + neigh_release(neigh); + +#endif /* !defined (__VMKLNX__) */ +err_out: +#if !defined (__VMKLNX__) + if (csk->dst) { + dst_release(csk->dst); + csk->dst = NULL; + } +#endif /* !defined (__VMKLNX__) */ + clear_bit(SK_F_CONNECT_START, &csk->flags); + return err; +} + +static int cnic_cm_abort(struct cnic_sock *csk) +{ + struct cnic_local *cp = csk->dev->cnic_priv; + u32 opcode; + + if (!cnic_in_use(csk)) + return -EINVAL; + + clear_bit(SK_F_NDISC_WAITING, &csk->flags); + clear_bit(SK_F_CONNECT_START, &csk->flags); + smp_mb__after_clear_bit(); + if (cnic_abort_prep(csk)) + return (cnic_cm_abort_req(csk)); + + /* Getting here means that we haven't started connect, or + * connect was not successful. + */ + + csk->state = L4_KCQE_OPCODE_VALUE_RESET_COMP; + if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) + opcode = csk->state; + else + opcode = L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD; + cp->close_conn(csk, opcode); + + return 0; +} + +static int cnic_cm_close(struct cnic_sock *csk) +{ + if (!cnic_in_use(csk)) + return -EINVAL; + + if (cnic_close_prep(csk)) { + csk->state = L4_KCQE_OPCODE_VALUE_CLOSE_COMP; + return (cnic_cm_close_req(csk)); + } + return 0; +} + +static void cnic_cm_upcall(struct cnic_local *cp, struct cnic_sock *csk, + u8 opcode) +{ + struct cnic_ulp_ops *ulp_ops; + int ulp_type = csk->ulp_type; + + rcu_read_lock(); + ulp_ops = rcu_dereference(cp->ulp_ops[ulp_type]); + if (ulp_ops) { + if (opcode == L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE) + ulp_ops->cm_connect_complete(csk); + else if (opcode == L4_KCQE_OPCODE_VALUE_CLOSE_COMP) + ulp_ops->cm_close_complete(csk); + else if (opcode == L4_KCQE_OPCODE_VALUE_RESET_RECEIVED) + ulp_ops->cm_remote_abort(csk); + else if (opcode == L4_KCQE_OPCODE_VALUE_RESET_COMP) + ulp_ops->cm_abort_complete(csk); + else if (opcode == L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED) + ulp_ops->cm_remote_close(csk); + } + rcu_read_unlock(); +} + +static int cnic_cm_set_pg(struct cnic_sock *csk) +{ +#if !defined (__VMKLNX__) + struct neighbour *neigh = csk->dst->neighbour; + int valid = neigh->nud_state & NUD_VALID; + + if (!valid) { + if (test_and_clear_bit(SK_F_NDISC_WAITING, &csk->flags)) { + clear_bit(SK_F_CONNECT_START, &csk->flags); + cnic_cm_cleanup(csk); + return -ETIMEDOUT; + } + } + + if (cnic_offld_prep(csk)) { + if (test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) + cnic_cm_update_pg(csk); + else + cnic_cm_offload_pg(csk); + } + clear_bit(SK_F_NDISC_WAITING, &csk->flags); +#endif /* !defined (__VMKLNX__) */ + return 0; +} + +static void cnic_cm_process_neigh(struct cnic_dev *dev, struct neighbour *neigh) +{ +#if !defined (__VMKLNX__) + struct cnic_local *cp = dev->cnic_priv; + int i; + + for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { + struct cnic_sock *csk; + int abort = 0; + + csk = &cp->csk_tbl[i]; + csk_hold(csk); + if (cnic_in_use(csk) && csk->dst && + csk->dst->neighbour == neigh) { + if (cnic_cm_set_pg(csk)) + abort = 1; + } + if (abort) + cnic_cm_upcall(cp, csk, + L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); + csk_put(csk); + } + neigh_release(neigh); +#endif /* !defined (__VMKLNX__) */ +} + +static void cnic_cm_process_redirect(struct cnic_dev *dev, + struct cnic_redirect_entry *redir) +{ +#if !defined (__VMKLNX__) + struct cnic_local *cp = dev->cnic_priv; + int i; + + for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { + struct cnic_sock *csk; + int abort = 0; + + csk = &cp->csk_tbl[i]; + csk_hold(csk); + if (cnic_in_use(csk) && csk->dst == redir->old_dst) { + csk->dst = redir->new_dst; + dst_hold(csk->dst); + neigh_hold(csk->dst->neighbour); + if (redir->old_dst->neighbour); + neigh_release(redir->old_dst->neighbour); + dst_release(redir->old_dst); + if (cnic_cm_set_pg(csk)) + abort = 1; + } + if (abort) + cnic_cm_upcall(cp, csk, + L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); + csk_put(csk); + } + + dst_release(redir->new_dst); + dst_release(redir->old_dst); +#endif /* !defined (__VMKLNX__) */ +} + +static void cnic_cm_process_offld_pg(struct cnic_dev *dev, struct l4_kcq *kcqe) +{ + struct cnic_local *cp = dev->cnic_priv; + u32 l5_cid = kcqe->pg_host_opaque; + u8 opcode = kcqe->op_code; + struct cnic_sock *csk = &cp->csk_tbl[l5_cid]; + + csk_hold(csk); + if (!cnic_in_use(csk)) + goto done; + + if (opcode == L4_KCQE_OPCODE_VALUE_UPDATE_PG) { + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + goto done; + } + /* Possible PG kcqe status: SUCCESS, OFFLOADED_PG, or CTX_ALLOC_FAIL */ + if (kcqe->status == L4_KCQE_COMPLETION_STATUS_CTX_ALLOC_FAIL) { + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + cnic_cm_upcall(cp, csk, + L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); + goto done; + } + + csk->pg_cid = kcqe->pg_cid; + set_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags); + cnic_cm_conn_req(csk); + +done: + csk_put(csk); +} + +static void cnic_cm_process_kcqe(struct cnic_dev *dev, struct kcqe *kcqe) +{ + struct cnic_local *cp = dev->cnic_priv; + struct l4_kcq *l4kcqe = (struct l4_kcq *) kcqe; + u8 opcode = l4kcqe->op_code; + u32 l5_cid; + struct cnic_sock *csk; + + if (opcode == L4_KCQE_OPCODE_VALUE_OFFLOAD_PG || + opcode == L4_KCQE_OPCODE_VALUE_UPDATE_PG) { + cnic_cm_process_offld_pg(dev, l4kcqe); + return; + } + + l5_cid = l4kcqe->conn_id; + /* Hack */ + if (opcode & 0x80) + l5_cid = l4kcqe->cid; + if (l5_cid >= MAX_CM_SK_TBL_SZ) + return; + + csk = &cp->csk_tbl[l5_cid]; + csk_hold(csk); + + if (!cnic_in_use(csk)) { + csk_put(csk); + return; + } + + switch (opcode) { + case L5CM_RAMROD_CMD_ID_TCP_CONNECT: + if (l4kcqe->status != 0) { + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + cnic_cm_upcall(cp, csk, + L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); + } + break; + case L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE: + if (l4kcqe->status == 0) + set_bit(SK_F_OFFLD_COMPLETE, &csk->flags); + + smp_mb__before_clear_bit(); + clear_bit(SK_F_OFFLD_SCHED, &csk->flags); + cnic_cm_upcall(cp, csk, opcode); + break; + + case L4_KCQE_OPCODE_VALUE_RESET_RECEIVED: + if (test_bit(CNIC_F_BNX2_CLASS, &dev->flags)) { + cnic_cm_upcall(cp, csk, opcode); + break; + } else if (test_and_clear_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) + csk->state = opcode; + /* fall through */ + case L4_KCQE_OPCODE_VALUE_CLOSE_COMP: + case L4_KCQE_OPCODE_VALUE_RESET_COMP: + case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE: + case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD: + cp->close_conn(csk, opcode); + break; + + case L4_KCQE_OPCODE_VALUE_CLOSE_RECEIVED: + cnic_cm_upcall(cp, csk, opcode); + break; + } + csk_put(csk); +} + +static void cnic_cm_indicate_kcqe(void *data, struct kcqe *kcqe[], u32 num_cqe) +{ + struct cnic_dev *dev = data; + int i; + struct cnic_local *cp = dev->cnic_priv; + + for (i = 0; i < num_cqe; i++) + cnic_queue_work(cp, WORK_TYPE_KCQE, kcqe[i]); + + tasklet_schedule(&cp->cnic_task); +} + +static void cnic_cm_indicate_event(void *data, unsigned long event) +{ +} + +static void cnic_cm_dummy(void *data) +{ +} + +static struct cnic_ulp_ops cm_ulp_ops = { + .cnic_start = cnic_cm_dummy, + .cnic_stop = cnic_cm_dummy, + .indicate_kcqes = cnic_cm_indicate_kcqe, + .indicate_netevent = cnic_cm_indicate_event, + .indicate_inetevent = cnic_cm_indicate_event, +}; + +static void cnic_task(unsigned long data) +{ + struct cnic_local *cp = (struct cnic_local *) data; + struct cnic_dev *dev = cp->dev; + u32 cons = cp->cnic_wr_cons; + u32 prod = cp->cnic_wr_prod; + + while (cons != prod) { + struct cnic_work_node *node; + + node = &cp->cnic_work_ring[cons]; + if (node->work_type == WORK_TYPE_KCQE) + cnic_cm_process_kcqe(dev, &node->work_data.kcqe); + else if (node->work_type == WORK_TYPE_NEIGH_UPDATE) + cnic_cm_process_neigh(dev, node->work_data.neigh); + else if (node->work_type == WORK_TYPE_REDIRECT) + cnic_cm_process_redirect(dev, + &node->work_data.cnic_redir); + cons++; + cons &= WORK_RING_SIZE_MASK; + } + cp->cnic_wr_cons = cons; +} + +static void cnic_free_dev(struct cnic_dev *dev) +{ + int i = 0; + + while ((atomic_read(&dev->ref_count) != 0) && i < 10) { + msleep(100); + i++; + } + if (atomic_read(&dev->ref_count) != 0) + printk(KERN_ERR PFX "%s: Failed waiting for ref count to go" + " to zero.\n", dev->netdev->name); + + printk(KERN_INFO PFX "Removed CNIC device: %s\n", dev->netdev->name); + dev_put(dev->netdev); + kfree(dev); +} + +static void cnic_cm_free_mem(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + + kfree(cp->csk_tbl); + cp->csk_tbl = NULL; + cp->next_tcp_port = cnic_free_id_tbl(&cp->csk_port_tbl); +} + +static int cnic_cm_alloc_mem(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + + cp->csk_tbl = kmalloc(sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ, + GFP_KERNEL); + if (!cp->csk_tbl) + return -ENOMEM; + memset(cp->csk_tbl, 0, sizeof(struct cnic_sock) * MAX_CM_SK_TBL_SZ); + + return 0; +} + +#ifndef HAVE_NETEVENT +#if !defined (__VMKLNX__) +static void cnic_timer(unsigned long data) +{ + struct cnic_local *cp = (struct cnic_local *) data; + struct cnic_dev *dev = cp->dev; + int i, found = 0; + struct neighbour *neigh = NULL; + + if (!test_bit(CNIC_F_CNIC_UP, &dev->flags)) + return; + + for (i = 0; i < MAX_CM_SK_TBL_SZ && !found; i++) { + struct cnic_sock *csk; + + csk = &cp->csk_tbl[i]; + csk_hold(csk); + if (cnic_in_use(csk) && csk->dst && + test_bit(SK_F_PG_OFFLD_COMPLETE, &csk->flags)) { + neigh = csk->dst->neighbour; + if (memcmp(csk->old_ha, neigh->ha, 6)) { + found = 1; + neigh_hold(neigh); + + cnic_queue_work(cp, WORK_TYPE_NEIGH_UPDATE, + &neigh); + tasklet_schedule(&cp->cnic_task); + } + } + csk_put(csk); + } + + cp->cnic_timer.expires = jiffies + cp->cnic_timer_off; + add_timer(&cp->cnic_timer); +} +#endif /* !defined (__VMKLNX__) */ +#endif + +static int cnic_ready_to_close(struct cnic_sock *csk, u32 opcode) +{ + if ((opcode == csk->state) || + (opcode == L4_KCQE_OPCODE_VALUE_RESET_RECEIVED && + csk->state == L4_KCQE_OPCODE_VALUE_CLOSE_COMP)) { + if (!test_and_set_bit(SK_F_CLOSING, &csk->flags)) + return 1; + } + /* 57710+ only workaround to handle unsolicited RESET_COMP + * which will be treated like a RESET RCVD notification + * which triggers the clean up procedure + */ + else if ((opcode != csk->state) && + (opcode == L4_KCQE_OPCODE_VALUE_RESET_COMP)) { + if (!test_and_set_bit(SK_F_CLOSING, &csk->flags)) { + csk->state = L4_KCQE_OPCODE_VALUE_RESET_RECEIVED; + return 1; + } + } + return 0; +} + +static void cnic_close_bnx2_conn(struct cnic_sock *csk, u32 opcode) +{ + struct cnic_dev *dev = csk->dev; + struct cnic_local *cp = dev->cnic_priv; + + clear_bit(SK_F_CONNECT_START, &csk->flags); + cnic_close_conn(csk); + cnic_cm_upcall(cp, csk, opcode); +} + +static void cnic_cm_stop_bnx2_hw(struct cnic_dev *dev) +{ +} + +static int cnic_cm_init_bnx2_hw(struct cnic_dev *dev) +{ + u32 seed; + +#if (LINUX_VERSION_CODE >= 0x020612) + get_random_bytes(&seed, 4); +#else + seed = 0x12345678; +#endif + cnic_ctx_wr(dev, 45, 0, seed); + return 0; +} + +static void cnic_close_bnx2x_conn(struct cnic_sock *csk, u32 opcode) +{ + struct cnic_dev *dev = csk->dev; + struct cnic_local *cp = dev->cnic_priv; + struct cnic_context *ctx = &cp->ctx_tbl[csk->l5_cid]; + union l5cm_specific_data l5_data; + u32 cmd = 0; + int close_complete = 0; + + switch (opcode) { + case L4_KCQE_OPCODE_VALUE_RESET_RECEIVED: + case L4_KCQE_OPCODE_VALUE_CLOSE_COMP: + case L4_KCQE_OPCODE_VALUE_RESET_COMP: + if (cnic_ready_to_close(csk, opcode)) + cmd = L5CM_RAMROD_CMD_ID_SEARCHER_DELETE; + break; + case L5CM_RAMROD_CMD_ID_SEARCHER_DELETE: + cmd = L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD; + break; + case L5CM_RAMROD_CMD_ID_TERMINATE_OFFLOAD: + close_complete = 1; + break; + } + if (cmd) { + memset(&l5_data, 0, sizeof(l5_data)); + + cnic_submit_kwqe_16(dev, cmd, csk->cid, ISCSI_CONNECTION_TYPE, + &l5_data); + } else if (close_complete) { + ctx->timestamp = jiffies; + cnic_close_conn(csk); + cnic_cm_upcall(cp, csk, csk->state); + } +} + +static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int i; + + if (!cp->ctx_tbl) + return; + + if (!netif_running(dev->netdev)) + return; + + for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { + struct cnic_context *ctx = &cp->ctx_tbl[i]; + + while (test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags)) + msleep(10); + } + + cancel_delayed_work(&cp->delete_task); +} + +static int cnic_cm_init_bnx2x_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int func = CNIC_FUNC(cp); + struct net_device *netdev = dev->netdev; + + cnic_init_bnx2x_mac(dev, netdev->dev_addr); + cnic_bnx2x_set_tcp_timestamp(dev, 1); + + CNIC_WR16(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_LOCAL_VLAN_OFFSET(func), 0); + + CNIC_WR(dev, BAR_XSTRORM_INTMEM + + XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_ENABLED_OFFSET(func), 1); + CNIC_WR(dev, BAR_XSTRORM_INTMEM + + XSTORM_TCP_GLOBAL_DEL_ACK_COUNTER_MAX_COUNT_OFFSET(func), + DEF_MAX_DA_COUNT); + + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_TCP_VARS_TTL_OFFSET(func), DEF_TTL); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_TCP_VARS_TOS_OFFSET(func), DEF_TOS); + CNIC_WR8(dev, BAR_XSTRORM_INTMEM + + XSTORM_ISCSI_TCP_VARS_ADV_WND_SCL_OFFSET(func), 2); + CNIC_WR(dev, BAR_XSTRORM_INTMEM + + XSTORM_TCP_TX_SWS_TIMER_VAL_OFFSET(func), DEF_SWS_TIMER); + + CNIC_WR(dev, BAR_TSTRORM_INTMEM + TSTORM_TCP_MAX_CWND_OFFSET(func), + DEF_MAX_CWND); + return 0; +} + +static void cnic_delete_task(void *data) +{ + struct cnic_local *cp = (struct cnic_local *) data; + struct cnic_dev *dev = cp->dev; + u32 i; + int need_resched = 0; + + for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { + struct cnic_context *ctx = &cp->ctx_tbl[i]; + + if (!test_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags)) + continue; + + if (!time_after(jiffies, ctx->timestamp + (2 * HZ))) { + need_resched = 1; + continue; + } + + if (!test_and_clear_bit(CTX_FL_DELETE_WAIT, &ctx->ctx_flags)) + continue; + + if (unlikely(cnic_bnx2x_destroy_ramrod(dev, i) != 0)) { + printk(KERN_ERR "%s: %s: kwqe failure " + "cid: %d l5_cid: %d\n", + __FUNCTION__, dev->netdev->name, + ctx->cid, i); + } + + cnic_free_bnx2x_conn_resc(dev, i); + atomic_dec(&cp->iscsi_conn); + clear_bit(CTX_FL_OFFLD_START, &ctx->ctx_flags); + } + + if (need_resched) + schedule_delayed_work(&cp->delete_task, msecs_to_jiffies(10)); +} + +static int cnic_cm_open(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int err; + + err = cnic_cm_alloc_mem(dev); + if (err) + return err; + + err = cp->start_cm(dev); + + if (err) + goto err_out; + + spin_lock_init(&cp->wr_lock); + + tasklet_init(&cp->cnic_task, &cnic_task, (unsigned long) cp); + + INIT_WORK(&cp->delete_task, cnic_delete_task, cp); + +#ifdef HAVE_NETEVENT + cp->cm_nb.notifier_call = cnic_net_callback; + register_netevent_notifier(&cp->cm_nb); +#else +#if !defined (__VMKLNX__) + init_timer(&cp->cnic_timer); + cp->cnic_timer_off = 2 * HZ; + cp->cnic_timer.expires = jiffies + cp->cnic_timer_off; + cp->cnic_timer.data = (unsigned long) cp; + cp->cnic_timer.function = cnic_timer; + add_timer(&cp->cnic_timer); +#endif /* !defined (__VMKLNX__) */ +#endif + + dev->cm_create = cnic_cm_create; + dev->cm_destroy = cnic_cm_destroy; + dev->cm_connect = cnic_cm_connect; + dev->cm_abort = cnic_cm_abort; + dev->cm_close = cnic_cm_close; + dev->cm_select_dev = cnic_cm_select_dev; + + cp->ulp_handle[CNIC_ULP_L4] = dev; + rcu_assign_pointer(cp->ulp_ops[CNIC_ULP_L4], &cm_ulp_ops); + return 0; + +err_out: + cnic_cm_free_mem(dev); + return err; +} + +static int cnic_cm_shutdown(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + int i; + + cp->stop_cm(dev); + +#ifdef HAVE_NETEVENT + unregister_netevent_notifier(&cp->cm_nb); +#else +#if !defined (__VMKLNX__) + del_timer_sync(&cp->cnic_timer); +#endif /* !defined (__VMKLNX__) */ +#endif + + tasklet_kill(&cp->cnic_task); + + if (!cp->csk_tbl) + return 0; + + for (i = 0; i < MAX_CM_SK_TBL_SZ; i++) { + struct cnic_sock *csk = &cp->csk_tbl[i]; + + clear_bit(SK_F_INUSE, &csk->flags); + cnic_cm_cleanup(csk); + } + cnic_cm_free_mem(dev); + + return 0; +} + +static void cnic_init_context(struct cnic_dev *dev, u32 cid) +{ + u32 cid_addr; + int i; + + cid_addr = GET_CID_ADDR(cid); + + for (i = 0; i < CTX_SIZE; i += 4) + cnic_ctx_wr(dev, cid_addr, i, 0); +} + +static int cnic_setup_5709_context(struct cnic_dev *dev, int valid) +{ + struct cnic_local *cp = dev->cnic_priv; + int ret = 0, i; + u32 valid_bit = valid ? BNX2_CTX_HOST_PAGE_TBL_DATA0_VALID : 0; + + if (CHIP_NUM(cp) != CHIP_NUM_5709) + return 0; + + for (i = 0; i < cp->ctx_blks; i++) { + int j; + u32 idx = cp->ctx_arr[i].cid / cp->cids_per_blk; + u32 val; + + memset(cp->ctx_arr[i].ctx, 0, BCM_PAGE_SIZE); + + CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA0, + (cp->ctx_arr[i].mapping & 0xffffffff) | valid_bit); + CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_DATA1, + (u64) cp->ctx_arr[i].mapping >> 32); + CNIC_WR(dev, BNX2_CTX_HOST_PAGE_TBL_CTRL, idx | + BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ); + for (j = 0; j < 10; j++) { + + val = CNIC_RD(dev, BNX2_CTX_HOST_PAGE_TBL_CTRL); + if (!(val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ)) + break; + udelay(5); + } + if (val & BNX2_CTX_HOST_PAGE_TBL_CTRL_WRITE_REQ) { + ret = -EBUSY; + break; + } + } + return ret; +} + +#if defined(__VMKLNX__) +static void cnic_stop_irq_task(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { + cp->disable_int_sync(dev); + tasklet_kill(&cp->cnic_irq_task); + } +} +#endif + +static void cnic_free_irq(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { + cp->disable_int_sync(dev); + tasklet_kill(&cp->cnic_irq_task); + if (cp->cnic_local_flags & CNIC_LCL_FL_IRQ_REQD) + free_irq(ethdev->irq_arr[0].vector, dev); + cp->cnic_local_flags &= ~CNIC_LCL_FL_IRQ_REQD; + } +} + +static int cnic_request_irq(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int err; + + if (cp->cnic_local_flags & CNIC_LCL_FL_IRQ_REQD) + return 0; + + err = request_irq(ethdev->irq_arr[0].vector, cnic_irq, 0, "cnic", dev); + if (err) + tasklet_disable(&cp->cnic_irq_task); + else + cp->cnic_local_flags |= CNIC_LCL_FL_IRQ_REQD; + + return err; +} + +static int cnic_init_bnx2_irq(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { + int err, i = 0; + int sblk_num = cp->status_blk_num; + u32 base = ((sblk_num - 1) * BNX2_HC_SB_CONFIG_SIZE) + + BNX2_HC_SB_CONFIG_1; + + CNIC_WR(dev, base, BNX2_HC_SB_CONFIG_1_ONE_SHOT); + + CNIC_WR(dev, base + BNX2_HC_COMP_PROD_TRIP_OFF, (2 << 16) | 8); + CNIC_WR(dev, base + BNX2_HC_COM_TICKS_OFF, (64 << 16) | 220); + CNIC_WR(dev, base + BNX2_HC_CMD_TICKS_OFF, (64 << 16) | 220); + + cp->bnx2_status_blk = cp->status_blk; + cp->last_status_idx = cp->bnx2_status_blk->status_idx; + + tasklet_init(&cp->cnic_irq_task, &cnic_service_bnx2_msix, + (unsigned long) dev); + err = cnic_request_irq(dev); + if (err) + return err; + + while (cp->bnx2_status_blk->status_completion_producer_index && + i < 10) { + CNIC_WR(dev, BNX2_HC_COALESCE_NOW, + 1 << (11 + sblk_num)); + udelay(10); + i++; + barrier(); + } + if (cp->bnx2_status_blk->status_completion_producer_index) { +#if !defined (__VMKLNX__) + cnic_free_irq(dev); +#else + cnic_stop_irq_task(dev); +#endif + goto failed; + } + + } else { + struct status_block *sblk = cp->status_blk; + u32 hc_cmd = CNIC_RD(dev, BNX2_HC_COMMAND); + int i = 0; + + while (sblk->status_completion_producer_index && i < 10) { + CNIC_WR(dev, BNX2_HC_COMMAND, + hc_cmd | BNX2_HC_COMMAND_COAL_NOW_WO_INT); + udelay(10); + i++; + barrier(); + } + if (sblk->status_completion_producer_index) + goto failed; + + } + return 0; + +failed: + printk(KERN_ERR PFX "%s: " "KCQ index not resetting to 0.\n", + dev->netdev->name); + return -EBUSY; +} + +static void cnic_enable_bnx2_int(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (!(ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX)) + return; + + CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | + BNX2_PCICFG_INT_ACK_CMD_INDEX_VALID | cp->last_status_idx); +} + +static void cnic_disable_bnx2_int_sync(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + + if (!(ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX)) + return; + + CNIC_WR(dev, BNX2_PCICFG_INT_ACK_CMD, cp->int_num | + BNX2_PCICFG_INT_ACK_CMD_MASK_INT); + CNIC_RD(dev, BNX2_PCICFG_INT_ACK_CMD); + synchronize_irq(ethdev->irq_arr[0].vector); +} + +static void cnic_get_bnx2_iscsi_info(struct cnic_dev *dev) +{ + u32 max_conn; + + max_conn = cnic_reg_rd_ind(dev, BNX2_FW_MAX_ISCSI_CONN); + dev->max_iscsi_conn = max_conn; +} + +static int cnic_start_bnx2_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + struct status_block *sblk = cp->status_blk; + u32 val; + int err; + + val = CNIC_RD(dev, BNX2_MQ_CONFIG); + val &= ~BNX2_MQ_CONFIG_KNL_BYP_BLK_SIZE; + if (BCM_PAGE_BITS > 12) + val |= (12 - 8) << 4; + else + val |= (BCM_PAGE_BITS - 8) << 4; + + CNIC_WR(dev, BNX2_MQ_CONFIG, val); + + CNIC_WR(dev, BNX2_HC_COMP_PROD_TRIP, (2 << 16) | 8); + CNIC_WR(dev, BNX2_HC_COM_TICKS, (64 << 16) | 220); + CNIC_WR(dev, BNX2_HC_CMD_TICKS, (64 << 16) | 220); + + err = cnic_setup_5709_context(dev, 1); + if (err) + return err; + + cnic_init_context(dev, KWQ_CID); + cnic_init_context(dev, KCQ_CID); + + cp->kwq_cid_addr = GET_CID_ADDR(KWQ_CID); + cp->kwq_io_addr = MB_GET_CID_ADDR(KWQ_CID) + L5_KRNLQ_HOST_QIDX; + + cp->max_kwq_idx = MAX_KWQ_IDX; + cp->kwq_prod_idx = 0; + cp->kwq_con_idx = 0; + cp->cnic_local_flags |= CNIC_LCL_FL_KWQ_INIT; + + if (CHIP_NUM(cp) == CHIP_NUM_5706 || CHIP_NUM(cp) == CHIP_NUM_5708) + cp->kwq_con_idx_ptr = &sblk->status_rx_quick_consumer_index15; + else + cp->kwq_con_idx_ptr = &sblk->status_cmd_consumer_index; + + /* Initialize the kernel work queue context. */ + val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | + (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_TYPE, val); + + val = (BCM_PAGE_SIZE / sizeof(struct kwqe) - 1) << 16; + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); + + val = ((BCM_PAGE_SIZE / sizeof(struct kwqe)) << 16) | KWQ_PAGE_CNT; + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); + + val = (u32) ((u64) cp->kwq_info.pgtbl_map >> 32); + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_HADDR_HI, val); + + val = (u32) cp->kwq_info.pgtbl_map; + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_PGTBL_HADDR_LO, val); + + cp->kcq_cid_addr = GET_CID_ADDR(KCQ_CID); + cp->kcq_io_addr = MB_GET_CID_ADDR(KCQ_CID) + L5_KRNLQ_HOST_QIDX; + + cp->kcq_prod_idx = 0; + + /* Initialize the kernel complete queue context. */ + val = KRNLQ_TYPE_TYPE_KRNLQ | KRNLQ_SIZE_TYPE_SIZE | + (BCM_PAGE_BITS - 8) | KRNLQ_FLAGS_QE_SELF_SEQ; + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_TYPE, val); + + val = (BCM_PAGE_SIZE / sizeof(struct kcqe) - 1) << 16; + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_QE_SELF_SEQ_MAX, val); + + val = ((BCM_PAGE_SIZE / sizeof(struct kcqe)) << 16) | KCQ_PAGE_CNT; + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_NPAGES, val); + + val = (u32) ((u64) cp->kcq_info.pgtbl_map >> 32); + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_HADDR_HI, val); + + val = (u32) cp->kcq_info.pgtbl_map; + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_PGTBL_HADDR_LO, val); + + if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { + u32 sb_id = cp->status_blk_num; + u32 sb = BNX2_L2CTX_STATUSB_NUM(sb_id); + + cp->int_num = sb_id << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT; + cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); + cnic_ctx_wr(dev, cp->kcq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); + } + + /* Enable Commnad Scheduler notification when we write to the + * host producer index of the kernel contexts. */ + CNIC_WR(dev, BNX2_MQ_KNL_CMD_MASK1, 2); + + /* Enable Command Scheduler notification when we write to either + * the Send Queue or Receive Queue producer indexes of the kernel + * bypass contexts. */ + CNIC_WR(dev, BNX2_MQ_KNL_BYP_CMD_MASK1, 7); + CNIC_WR(dev, BNX2_MQ_KNL_BYP_WRITE_MASK1, 7); + + /* Notify COM when the driver post an application buffer. */ + CNIC_WR(dev, BNX2_MQ_KNL_RX_V2P_MASK2, 0x2000); + + /* Set the CP and COM doorbells. These two processors polls the + * doorbell for a non zero value before running. This must be done + * after setting up the kernel queue contexts. */ + val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val | 1); + + val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val | 1); + + err = cnic_init_bnx2_irq(dev); + if (err) { + printk(KERN_ERR PFX "%s: cnic_init_irq failed\n", + dev->netdev->name); + + val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val & ~0x1); + + val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val & ~0x1); + + return err; + } + + cnic_get_bnx2_iscsi_info(dev); + + return 0; +} + +static void cnic_setup_bnx2x_context(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + u32 start_offset = ethdev->ctx_tbl_offset; + int i; + + for (i = 0; i < cp->ctx_blks; i++) { + struct cnic_ctx *ctx = &cp->ctx_arr[i]; + dma_addr_t map = ctx->mapping; + + if (cp->ctx_align) { + unsigned long mask = cp->ctx_align - 1; + + map = (map + mask) & ~mask; + } + + cnic_ctx_tbl_wr(dev, start_offset + i, map); + } +} + +static int cnic_init_bnx2x_irq(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int err = 0; + + cp->bnx2x_status_blk = cp->status_blk; + memset(cp->bnx2x_status_blk, 0, sizeof(struct host_status_block)); + + tasklet_init(&cp->cnic_irq_task, &cnic_service_bnx2x_bh, + (unsigned long) dev); + if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { + err = cnic_request_irq(dev); + } + return err; +} + +static void cnic_enable_bnx2x_int(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + u8 sb_id = cp->status_blk_num; + int port = CNIC_PORT(cp); + +#ifdef NEW_BNX2X_HSI + CNIC_WR8(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HC_TIMEOUT_C_OFFSET(port, sb_id, + HC_INDEX_C_ISCSI_EQ_CONS), + 64 / 12); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HC_DISABLE_C_OFFSET(port, sb_id, + HC_INDEX_C_ISCSI_EQ_CONS), 0); +#else + CNIC_WR8(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HC_TIMEOUT_OFFSET(port, sb_id, + HC_INDEX_C_ISCSI_EQ_CONS), + 64 / 12); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HC_DISABLE_OFFSET(port, sb_id, + HC_INDEX_C_ISCSI_EQ_CONS), 0); +#endif +} + +static void cnic_disable_bnx2x_int_sync(struct cnic_dev *dev) +{ +} + +static void cnic_get_bnx2x_iscsi_info(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + u32 base, addr, val; + int port = CNIC_PORT(cp); + + dev->max_iscsi_conn = 0; + base = CNIC_RD(dev, MISC_REG_SHARED_MEM_ADDR); + if (base < 0xa0000 || base >= 0xc0000) + return; + + addr = BNX2X_SHMEM_ADDR(base, validity_map[port]); + val = CNIC_RD(dev, addr); + + if (!(val & SHR_MEM_VALIDITY_LIC_NO_KEY_IN_EFFECT)) { + u16 val16; + + addr = BNX2X_SHMEM_ADDR(base, + drv_lic_key[port].max_iscsi_init_conn); + val16 = CNIC_RD16(dev, addr); + + if (val16) + val16 ^= 0x1e1e; + dev->max_iscsi_conn = val16; + } + if (BNX2X_CHIP_IS_E1H(cp->chip_id)) { + int func = CNIC_FUNC(cp); + + addr = BNX2X_SHMEM_ADDR(base, + mf_cfg.func_mf_config[func].e1hov_tag); + val = CNIC_RD(dev, addr); + val &= FUNC_MF_CFG_E1HOV_TAG_MASK; + if (val != FUNC_MF_CFG_E1HOV_TAG_DEFAULT) { + addr = BNX2X_SHMEM_ADDR(base, + mf_cfg.func_mf_config[func].config); + val = CNIC_RD(dev, addr); + val &= FUNC_MF_CFG_PROTOCOL_MASK; + if (val != FUNC_MF_CFG_PROTOCOL_ISCSI) + dev->max_iscsi_conn = 0; + } + } +} + +static int cnic_start_bnx2x_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int func = CNIC_FUNC(cp), ret, i; + int port = CNIC_PORT(cp); + u32 start_cid = ethdev->starting_cid; + u16 eq_idx; + u8 sb_id = cp->status_blk_num; + + ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ, start_cid, 0); + + if (ret) + return -ENOMEM; + + cp->kcq_io_addr = BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_PROD_OFFSET(func, 0); + cp->kcq_prod_idx = 0; + + cnic_get_bnx2x_iscsi_info(dev); + + /* Only 1 EQ */ + CNIC_WR16(dev, cp->kcq_io_addr, MAX_KCQ_IDX); + CNIC_WR(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_CONS_OFFSET(func, 0), 0); + CNIC_WR(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, 0), + cp->kcq_info.pg_map_arr[1] & 0xffffffff); + CNIC_WR(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_OFFSET(func, 0) + 4, + (u64) cp->kcq_info.pg_map_arr[1] >> 32); + CNIC_WR(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, 0), + cp->kcq_info.pg_map_arr[0] & 0xffffffff); + CNIC_WR(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_NEXT_EQE_ADDR_OFFSET(func, 0) + 4, + (u64) cp->kcq_info.pg_map_arr[0] >> 32); + CNIC_WR8(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_NEXT_PAGE_ADDR_VALID_OFFSET(func, 0), 1); + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_SB_NUM_OFFSET(func, 0), cp->status_blk_num); + CNIC_WR8(dev, BAR_CSTRORM_INTMEM + + CSTORM_ISCSI_EQ_SB_INDEX_OFFSET(func, 0), + HC_INDEX_C_ISCSI_EQ_CONS); + + for (i = 0; i < cp->conn_buf_info.num_pages; i++) { + CNIC_WR(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(func, i), + cp->conn_buf_info.pgtbl[2 * i]); + CNIC_WR(dev, BAR_TSTRORM_INTMEM + + TSTORM_ISCSI_CONN_BUF_PBL_OFFSET(func, i) + 4, + cp->conn_buf_info.pgtbl[(2 * i) + 1]); + } + + CNIC_WR(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(func), + cp->gbl_buf_info.pg_map_arr[0] & 0xffffffff); + CNIC_WR(dev, BAR_USTRORM_INTMEM + + USTORM_ISCSI_GLOBAL_BUF_PHYS_ADDR_OFFSET(func) + 4, + (u64) cp->gbl_buf_info.pg_map_arr[0] >> 32); + + cnic_setup_bnx2x_context(dev); + +#ifdef NEW_BNX2X_HSI + eq_idx = CNIC_RD16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id) + + offsetof(struct cstorm_status_block_c, + index_values[HC_INDEX_C_ISCSI_EQ_CONS])); +#else + eq_idx = CNIC_RD16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id) + + offsetof(struct cstorm_status_block, + index_values[HC_INDEX_C_ISCSI_EQ_CONS])); +#endif + if (eq_idx != 0) { + printk(KERN_ERR PFX "%s: EQ cons index %x != 0\n", + dev->netdev->name, eq_idx); + return -EBUSY; + } + ret = cnic_init_bnx2x_irq(dev); + if (ret) + return ret; + + return 0; +} + +static int cnic_start_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + struct cnic_eth_dev *ethdev = cp->ethdev; + int err; + + if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) + return -EALREADY; + +#if !defined (__VMKLNX__) + if (!try_module_get(ethdev->drv_owner)) + return -EBUSY; +#endif /* !defined (__VMKLNX__) */ + + dev->regview = ethdev->io_base; + cp->chip_id = ethdev->chip_id; + pci_dev_get(dev->pcidev); + cp->func = PCI_FUNC(dev->pcidev->devfn); + cp->status_blk = ethdev->irq_arr[0].status_blk; + cp->status_blk_num = ethdev->irq_arr[0].status_blk_num; + + err = cp->alloc_resc(dev); + if (err) { + printk(KERN_ERR PFX "%s: allocate resource failure\n", + dev->netdev->name); + goto err1; + } + + err = cp->start_hw(dev); + if (err) + goto err1; + + err = cnic_cm_open(dev); + if (err) + goto err1; + + set_bit(CNIC_F_CNIC_UP, &dev->flags); + + cp->enable_int(dev); + + return 0; + +err1: + cp->free_resc(dev); + pci_dev_put(dev->pcidev); +#if !defined (__VMKLNX__) + module_put(ethdev->drv_owner); +#endif /* !defined (__VMKLNX__) */ + return err; +} + +static void cnic_stop_bnx2_hw(struct cnic_dev *dev) +{ + u32 val; + + cnic_disable_bnx2_int_sync(dev); + + val = cnic_reg_rd_ind(dev, BNX2_CP_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, val & ~0x1); + + val = cnic_reg_rd_ind(dev, BNX2_COM_SCRATCH + 0x20); + cnic_reg_wr_ind(dev, BNX2_COM_SCRATCH + 0x20, val & ~0x1); + + cnic_init_context(dev, KWQ_CID); + cnic_init_context(dev, KCQ_CID); + + cnic_setup_5709_context(dev, 0); +#if !defined (__VMKLNX__) + cnic_free_irq(dev); +#else + cnic_stop_irq_task(dev); +#endif + + cnic_free_resc(dev); +} + +static void cnic_stop_bnx2x_hw(struct cnic_dev *dev) +{ + struct cnic_local *cp = dev->cnic_priv; + u8 sb_id = cp->status_blk_num; + int port = CNIC_PORT(cp); + +#if !defined (__VMKLNX__) + cnic_free_irq(dev); +#else + cnic_stop_irq_task(dev); +#endif +#ifdef NEW_BNX2X_HSI + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HOST_STATUS_BLOCK_C_OFFSET(port, sb_id) + + offsetof(struct cstorm_status_block_c, + index_values[HC_INDEX_C_ISCSI_EQ_CONS]), + 0); +#else + CNIC_WR16(dev, BAR_CSTRORM_INTMEM + + CSTORM_SB_HOST_STATUS_BLOCK_OFFSET(port, sb_id) + + offsetof(struct cstorm_status_block, + index_values[HC_INDEX_C_ISCSI_EQ_CONS]), + 0); +#endif + cnic_free_resc(dev); +} + +static void cnic_stop_hw(struct cnic_dev *dev) +{ + if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) { + struct cnic_local *cp = dev->cnic_priv; + + clear_bit(CNIC_F_CNIC_UP, &dev->flags); + rcu_assign_pointer(cp->ulp_ops[CNIC_ULP_L4], NULL); + synchronize_rcu(); + cnic_cm_shutdown(dev); + cp->stop_hw(dev); + pci_dev_put(dev->pcidev); +#if !defined (__VMKLNX__) + module_put(cp->ethdev->drv_owner); +#endif /* !defined (__VMKLNX__) */ + } +} + +static struct cnic_dev *alloc_cnic(struct net_device *dev) +{ + struct cnic_dev *cdev; + struct cnic_local *cp; + int alloc_size; + + alloc_size = sizeof(struct cnic_dev) + sizeof(struct cnic_local); + + cdev = kmalloc(alloc_size , GFP_KERNEL); + if (cdev == NULL) { + printk(KERN_ERR PFX "%s: allocate dev struct failure\n", + dev->name); + return NULL; + } + memset(cdev, 0, alloc_size); + + cdev->netdev = dev; + cdev->cnic_priv = (char *)cdev + sizeof(struct cnic_dev); + cdev->register_device = cnic_register_device; + cdev->unregister_device = cnic_unregister_device; + cp = cdev->cnic_priv; + cp->dev = cdev; + + spin_lock_init(&cp->cnic_ulp_lock); + printk(KERN_INFO PFX "Added CNIC device: %s\n", dev->name); + + return cdev; +} + +static struct cnic_dev *init_bnx2_cnic(struct net_device *dev) +{ + struct pci_dev *pdev; + struct cnic_dev *cdev; + struct cnic_local *cp; + struct cnic_eth_dev *ethdev = NULL; + struct cnic_eth_dev *(*probe)(void *) = NULL; + +#if defined (__VMKLNX__) + probe = vmk_ModuleGetSymbol("bnx2_cnic_probe"); +#else /* !defined (__VMKLNX__) */ + probe = __symbol_get("bnx2_cnic_probe"); +#endif /* defined (__VMKLNX__) */ + if (probe) { + ethdev = (*probe)(dev); +#if !defined (__VMKLNX__) +#if (LINUX_VERSION_CODE > 0x020610) + symbol_put_addr(probe); +#else + __symbol_put("bnx2_cnic_probe"); +#endif +#endif /* defined (__VMKLNX__) */ + } + if (!ethdev) + return NULL; + + pdev = ethdev->pdev; + if (!pdev) + return NULL; + + dev_hold(dev); + pci_dev_get(pdev); + if (pdev->device == PCI_DEVICE_ID_NX2_5709 || + pdev->device == PCI_DEVICE_ID_NX2_5709S) { + u8 rev; + + pci_read_config_byte(pdev, PCI_REVISION_ID, &rev); + if (rev < 0x10) { + pci_dev_put(pdev); + goto cnic_err; + } + } + pci_dev_put(pdev); + + cdev = alloc_cnic(dev); + if (cdev == NULL) + goto cnic_err; + + set_bit(CNIC_F_BNX2_CLASS, &cdev->flags); + cdev->submit_kwqes = cnic_submit_bnx2_kwqes; + + cp = cdev->cnic_priv; + cp->ethdev = ethdev; + cdev->pcidev = pdev; + + cp->cnic_ops = &cnic_bnx2_ops; + cp->start_hw = cnic_start_bnx2_hw; + cp->stop_hw = cnic_stop_bnx2_hw; + cp->setup_pgtbl = cnic_setup_page_tbl; + cp->alloc_resc = cnic_alloc_bnx2_resc; + cp->free_resc = cnic_free_resc; + cp->start_cm = cnic_cm_init_bnx2_hw; + cp->stop_cm = cnic_cm_stop_bnx2_hw; + cp->enable_int = cnic_enable_bnx2_int; + cp->disable_int_sync = cnic_disable_bnx2_int_sync; + cp->close_conn = cnic_close_bnx2_conn; + cp->next_idx = cnic_bnx2_next_idx; + cp->hw_idx = cnic_bnx2_hw_idx; + return cdev; + +cnic_err: + dev_put(dev); + return NULL; +} + +static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev) +{ + struct pci_dev *pdev; + struct cnic_dev *cdev; + struct cnic_local *cp; + struct cnic_eth_dev *ethdev = NULL; + struct cnic_eth_dev *(*probe)(void *) = NULL; + +#if defined (__VMKLNX__) + probe = vmk_ModuleGetSymbol("bnx2x_cnic_probe"); +#else /* !defined (__VMKLNX__) */ + probe = __symbol_get("bnx2x_cnic_probe"); +#endif /* defined (__VMKLNX__) */ + if (probe) { + ethdev = (*probe)(dev); +#if !defined (__VMKLNX__) +#if (LINUX_VERSION_CODE > 0x020610) + symbol_put_addr(probe); +#else + __symbol_put("bnx2x_cnic_probe"); +#endif +#endif /* defined (__VMKLNX__) */ + } + if (!ethdev) + return NULL; + + pdev = ethdev->pdev; + if (!pdev) + return NULL; + + dev_hold(dev); + cdev = alloc_cnic(dev); + if (cdev == NULL) { + dev_put(dev); + return NULL; + } + + set_bit(CNIC_F_BNX2X_CLASS, &cdev->flags); + cdev->submit_kwqes = cnic_submit_bnx2x_kwqes; + + cp = cdev->cnic_priv; + cp->ethdev = ethdev; + cdev->pcidev = pdev; + + cp->cnic_ops = &cnic_bnx2x_ops; + cp->start_hw = cnic_start_bnx2x_hw; + cp->stop_hw = cnic_stop_bnx2x_hw; + cp->setup_pgtbl = cnic_setup_page_tbl_le; + cp->alloc_resc = cnic_alloc_bnx2x_resc; + cp->free_resc = cnic_free_resc; + cp->start_cm = cnic_cm_init_bnx2x_hw; + cp->stop_cm = cnic_cm_stop_bnx2x_hw; + cp->enable_int = cnic_enable_bnx2x_int; + cp->disable_int_sync = cnic_disable_bnx2x_int_sync; + cp->ack_int = cnic_ack_bnx2x_msix; + cp->close_conn = cnic_close_bnx2x_conn; + cp->next_idx = cnic_bnx2x_next_idx; + cp->hw_idx = cnic_bnx2x_hw_idx; + return cdev; +} + +static struct cnic_dev *is_cnic_dev(struct net_device *dev) +{ + struct ethtool_drvinfo drvinfo; + struct cnic_dev *cdev = NULL; + + if (dev->ethtool_ops && dev->ethtool_ops->get_drvinfo) { + memset(&drvinfo, 0, sizeof(drvinfo)); + dev->ethtool_ops->get_drvinfo(dev, &drvinfo); + + if (!strcmp(drvinfo.driver, "bnx2")) + cdev = init_bnx2_cnic(dev); + if (!strcmp(drvinfo.driver, "bnx2x")) + cdev = init_bnx2x_cnic(dev); + if (cdev) { +#if !defined (__VMKLNX__) + write_lock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + list_add(&cdev->list, &cnic_dev_list); +#if !defined (__VMKLNX__) + write_unlock(&cnic_dev_lock); +#endif /* !defined (__VMKLNX__) */ + } + } + return cdev; +} + +/** + * IP event handler + */ +#if !defined (__VMKLNX__) +static int cnic_ip_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + struct in_ifaddr *ifa = (struct in_ifaddr *) ptr; + struct net_device *netdev = (struct net_device *) ifa->ifa_dev->dev; + struct cnic_dev *dev; + int if_type; + u32 my_dev = 0; + + read_lock(&cnic_dev_lock); + list_for_each_entry(dev, &cnic_dev_list, list) { + if (netdev == dev->netdev) { + my_dev = 1; + cnic_hold(dev); + break; + } + } + read_unlock(&cnic_dev_lock); + + if (my_dev) { + struct cnic_local *cp = dev->cnic_priv; + + rcu_read_lock(); + for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { + struct cnic_ulp_ops *ulp_ops; + + ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); + if (ulp_ops) { + void *ctx = cp->ulp_handle[if_type]; + + ulp_ops->indicate_inetevent(ctx, event); + } + } + rcu_read_unlock(); + + cnic_put(dev); + } + + return NOTIFY_DONE; +} + +/** + * netdev event handler + */ +static int cnic_netdev_event(struct notifier_block *this, unsigned long event, + void *ptr) +{ + struct net_device *netdev = ptr; + struct cnic_dev *dev; + int if_type; + int my_dev = 0, new_dev = 0; + + read_lock(&cnic_dev_lock); + list_for_each_entry(dev, &cnic_dev_list, list) { + if (netdev == dev->netdev) { + my_dev = 1; + cnic_hold(dev); + break; + } + } + read_unlock(&cnic_dev_lock); + + if (!my_dev && (event == NETDEV_REGISTER || event == NETDEV_UP)) { + /* Check for the hot-plug device */ + dev = is_cnic_dev(netdev); + if (dev) { + my_dev = 1; + new_dev = 1; + cnic_hold(dev); + } + } + if (my_dev) { + struct cnic_local *cp = dev->cnic_priv; + + if (new_dev) + cnic_ulp_init(dev); + if (event == NETDEV_UNREGISTER) + cnic_ulp_exit(dev); + else if (event == NETDEV_UP) { + if (cnic_register_netdev(dev) != 0) { + cnic_put(dev); + goto done; + } + mutex_lock(&cnic_lock); + set_bit(CNIC_F_IF_UP, &dev->flags); + if (dev->use_count) { + if (!cnic_start_hw(dev)) + cnic_ulp_start(dev); + } + mutex_unlock(&cnic_lock); + } + + rcu_read_lock(); + for (if_type = 0; if_type < MAX_CNIC_ULP_TYPE; if_type++) { + struct cnic_ulp_ops *ulp_ops; + void *ctx; + + ulp_ops = rcu_dereference(cp->ulp_ops[if_type]); + if (!ulp_ops) + continue; + + ctx = cp->ulp_handle[if_type]; + + ulp_ops->indicate_netevent(ctx, event); + } + rcu_read_unlock(); + + if (event == NETDEV_GOING_DOWN) { + mutex_lock(&cnic_lock); + clear_bit(CNIC_F_IF_UP, &dev->flags); + set_bit(CNIC_F_IF_GOING_DOWN, &dev->flags); + cnic_ulp_stop(dev); + cnic_stop_hw(dev); + mutex_unlock(&cnic_lock); + } else if (event == NETDEV_DOWN) { + clear_bit(CNIC_F_IF_GOING_DOWN, &dev->flags); + cnic_unregister_netdev(dev); + } else if (event == NETDEV_UNREGISTER) { + write_lock(&cnic_dev_lock); + list_del_init(&dev->list); + write_unlock(&cnic_dev_lock); + + cnic_put(dev); + cnic_free_dev(dev); + goto done; + } + cnic_put(dev); + } +done: + return NOTIFY_DONE; +} + +static struct notifier_block cnic_ip_notifier = { + cnic_ip_event, + 0 +}; + +static struct notifier_block cnic_netdev_notifier = { + cnic_netdev_event, + 0 +}; +#endif /* !defined (__VMKLNX__) */ + +static void cnic_release(void) +{ + struct cnic_dev *dev; + + while (!list_empty(&cnic_dev_list)) { + dev = list_entry(cnic_dev_list.next, struct cnic_dev, list); + if (test_bit(CNIC_F_CNIC_UP, &dev->flags)) + cnic_stop_hw(dev); + +#if defined (__VMKLNX__) + cnic_free_irq(dev); +#endif + + cnic_unregister_netdev(dev); + list_del_init(&dev->list); + cnic_free_dev(dev); + } +} + +static int __init cnic_init(void) +{ + int rc = 0; +#if defined (__VMKLNX__) + struct net_device *dev; +#endif /* defined (__VMKLNX__) */ + + printk(KERN_INFO "%s", version); + +#if defined (__VMKLNX__) + /* Find Teton devices */ +#if (LINUX_VERSION_CODE >= 0x020618) + for_each_netdev(&init_net, dev) +#elif (LINUX_VERSION_CODE >= 0x20616) + for_each_netdev(dev) +#else + for (dev = dev_base; dev; dev = dev->next) +#endif + { + struct cnic_dev *cdev; + + /* No netdev notifier in VMWare, so we find all Broadcom + * devices here and assume they will remain statically + * configured. + */ + cdev = is_cnic_dev(dev); + if (cdev && (dev->flags & IFF_UP)) { + set_bit(CNIC_F_IF_UP, &cdev->flags); + /* Register with net driver once and start hw. + * If using MSI-X, we'll request IRQ below in + * cnic_start_hw(). During cnic unload or + * CNIC_CTL_STOP_CMD, we'll call cnic_stop_hw(). + * IRQ will only be freed during cnic unload to + * prevent context mismatch in VMWare. + */ + if (cnic_register_netdev(cdev) == 0) + cnic_start_hw(cdev); + } + } + +#else /* !defined (__VMKLNX__) */ + + rc = register_inetaddr_notifier(&cnic_ip_notifier); + if (rc) + cnic_release(); + rc = register_netdevice_notifier(&cnic_netdev_notifier); + if (rc) { + unregister_inetaddr_notifier(&cnic_ip_notifier); + cnic_release(); + } +#endif /* defined (__VMKLNX__) */ + return rc; +} + +static void __exit cnic_exit(void) +{ +#if !defined (__VMKLNX__) + unregister_inetaddr_notifier(&cnic_ip_notifier); + unregister_netdevice_notifier(&cnic_netdev_notifier); +#endif /* !defined (__VMKLNX__) */ + cnic_release(); + return; +} + +module_init(cnic_init); +module_exit(cnic_exit); diff --git a/vmkdrivers/src_current/drivers/net/bnx2/cnic.h b/vmkdrivers/src_current/drivers/net/bnx2/cnic.h new file mode 100644 index 0000000..7a2f72a --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/cnic.h @@ -0,0 +1,423 @@ +/* cnic.h: Broadcom CNIC core network driver. + * + * Copyright (c) 2006-2010 Broadcom Corporation + * + * Portions Copyright (c) VMware, Inc. 2009-2010, All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + * + * Written by: John(Zongxi) Chen (zongxic@broadcom.com) + */ + + +#ifndef CNIC_H +#define CNIC_H + +#if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) + #error "Missing either LITTLE_ENDIAN or BIG_ENDIAN definition." +#endif + +#ifndef DIV_ROUND_UP +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) +#endif + +#ifndef ISCSI_DEF_FIRST_BURST_LEN +#define ISCSI_DEF_FIRST_BURST_LEN 65536 +#endif + +#ifndef ISCSI_DEF_MAX_RECV_SEG_LEN +#define ISCSI_DEF_MAX_RECV_SEG_LEN 8192 +#endif + +#ifndef ISCSI_DEF_MAX_BURST_LEN +#define ISCSI_DEF_MAX_BURST_LEN 262144 +#endif + +#define ISCSI_DEFAULT_MAX_OUTSTANDING_R2T (1) + +#define KWQ_PAGE_CNT 4 +#define KCQ_PAGE_CNT 16 + +#define KWQ_CID 24 +#define KCQ_CID 25 + +/* + * krnlq_context definition + */ +#define L5_KRNLQ_FLAGS 0x00000000 +#define L5_KRNLQ_SIZE 0x00000000 +#define L5_KRNLQ_TYPE 0x00000000 +#define KRNLQ_FLAGS_PG_SZ (0xf<<0) +#define KRNLQ_FLAGS_PG_SZ_256 (0<<0) +#define KRNLQ_FLAGS_PG_SZ_512 (1<<0) +#define KRNLQ_FLAGS_PG_SZ_1K (2<<0) +#define KRNLQ_FLAGS_PG_SZ_2K (3<<0) +#define KRNLQ_FLAGS_PG_SZ_4K (4<<0) +#define KRNLQ_FLAGS_PG_SZ_8K (5<<0) +#define KRNLQ_FLAGS_PG_SZ_16K (6<<0) +#define KRNLQ_FLAGS_PG_SZ_32K (7<<0) +#define KRNLQ_FLAGS_PG_SZ_64K (8<<0) +#define KRNLQ_FLAGS_PG_SZ_128K (9<<0) +#define KRNLQ_FLAGS_PG_SZ_256K (10<<0) +#define KRNLQ_FLAGS_PG_SZ_512K (11<<0) +#define KRNLQ_FLAGS_PG_SZ_1M (12<<0) +#define KRNLQ_FLAGS_PG_SZ_2M (13<<0) +#define KRNLQ_FLAGS_QE_SELF_SEQ (1<<15) +#define KRNLQ_SIZE_TYPE_SIZE ((((0x28 + 0x1f) & ~0x1f) / 0x20) << 16) +#define KRNLQ_TYPE_TYPE (0xf<<28) +#define KRNLQ_TYPE_TYPE_EMPTY (0<<28) +#define KRNLQ_TYPE_TYPE_KRNLQ (6<<28) + +#define L5_KRNLQ_HOST_QIDX 0x00000004 +#define L5_KRNLQ_HOST_FW_QIDX 0x00000008 +#define L5_KRNLQ_NX_QE_SELF_SEQ 0x0000000c +#define L5_KRNLQ_QE_SELF_SEQ_MAX 0x0000000c +#define L5_KRNLQ_NX_QE_HADDR_HI 0x00000010 +#define L5_KRNLQ_NX_QE_HADDR_LO 0x00000014 +#define L5_KRNLQ_PGTBL_PGIDX 0x00000018 +#define L5_KRNLQ_NX_PG_QIDX 0x00000018 +#define L5_KRNLQ_PGTBL_NPAGES 0x0000001c +#define L5_KRNLQ_QIDX_INCR 0x0000001c +#define L5_KRNLQ_PGTBL_HADDR_HI 0x00000020 +#define L5_KRNLQ_PGTBL_HADDR_LO 0x00000024 + +#define BNX2_PG_CTX_MAP 0x1a0034 +#define BNX2_ISCSI_CTX_MAP 0x1a0074 + +struct cnic_redirect_entry { + struct dst_entry *old_dst; + struct dst_entry *new_dst; +}; + +struct cnic_work_node { + u32 work_type; +#define WORK_TYPE_KCQE 1 +#define WORK_TYPE_NEIGH_UPDATE 2 +#define WORK_TYPE_REDIRECT 3 + union { + struct kcqe kcqe; + struct neighbour *neigh; + struct cnic_redirect_entry cnic_redir; + } work_data; +}; + +#define MAX_CNIC_L5_CONTEXT 256 + +#define WORK_RING_SIZE 256 +#define WORK_RING_SIZE_MASK 255 +#define MAX_CM_SK_TBL_SZ MAX_CNIC_L5_CONTEXT +#define MAX_COMPLETED_KCQE 64 + +#define MAX_ISCSI_TBL_SZ 256 + +#define KWQE_CNT (BCM_PAGE_SIZE / sizeof(struct kwqe)) +#define KCQE_CNT (BCM_PAGE_SIZE / sizeof(struct kcqe)) +#define MAX_KWQE_CNT (KWQE_CNT - 1) +#define MAX_KCQE_CNT (KCQE_CNT - 1) + +#define MAX_KWQ_IDX ((KWQ_PAGE_CNT * KWQE_CNT) - 1) +#define MAX_KCQ_IDX ((KCQ_PAGE_CNT * KCQE_CNT) - 1) + +#define KWQ_PG(x) (((x) & ~MAX_KWQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define KWQ_IDX(x) ((x) & MAX_KWQE_CNT) + +#define KCQ_PG(x) (((x) & ~MAX_KCQE_CNT) >> (BCM_PAGE_BITS - 5)) +#define KCQ_IDX(x) ((x) & MAX_KCQE_CNT) + +#define BNX2X_NEXT_KCQE(x) (((x) & (MAX_KCQE_CNT - 1)) == \ + (MAX_KCQE_CNT - 1)) ? \ + (x) + 2 : (x) + 1 + +#define BNX2X_KWQ_DATA_PG(cp, x) ((x) / (cp)->kwq_16_data_pp) +#define BNX2X_KWQ_DATA_IDX(cp, x) ((x) % (cp)->kwq_16_data_pp) +#define BNX2X_KWQ_DATA(cp, x) \ + &(cp)->kwq_16_data[BNX2X_KWQ_DATA_PG(cp, x)][BNX2X_KWQ_DATA_IDX(cp, x)] + +#define DEF_IPID_COUNT 0xc001 + +#define DEF_KA_TIMEOUT 10000 +#define DEF_KA_INTERVAL 300000 +#define DEF_KA_MAX_PROBE_COUNT 3 +#define DEF_TOS 0 +#define DEF_TTL 0xfe +#define DEF_SND_SEQ_SCALE 0 +#define DEF_RCV_BUF 0xffff +#define DEF_SND_BUF 0xffff +#define DEF_SEED 0 +#define DEF_MAX_RT_TIME 500 +#define DEF_MAX_DA_COUNT 2 +#define DEF_SWS_TIMER 1000 +#define DEF_MAX_CWND 0xffff + +struct cnic_ctx { + u32 cid; + void *ctx; + dma_addr_t mapping; +}; + +#define BNX2_MAX_CID 0x2000 + +struct cnic_dma { + int num_pages; + void **pg_arr; + dma_addr_t *pg_map_arr; + int pgtbl_size; + u32 *pgtbl; + dma_addr_t pgtbl_map; +}; + +struct cnic_id_tbl { + spinlock_t lock; + u32 start; + u32 max; + u32 next; + unsigned long *table; +}; + +#define CNIC_KWQ16_DATA_SIZE 128 + +struct kwqe_16_data { + u8 data[CNIC_KWQ16_DATA_SIZE]; +}; + +struct cnic_iscsi { + struct cnic_dma task_array_info; + struct cnic_dma r2tq_info; + struct cnic_dma hq_info; +}; + +struct cnic_context { + u32 cid; + struct kwqe_16_data *kwqe_data; + dma_addr_t kwqe_data_mapping; + wait_queue_head_t waitq; + int wait_cond; + unsigned long timestamp; + unsigned long ctx_flags; +#define CTX_FL_OFFLD_START 0 +#define CTX_FL_DELETE_WAIT 1 + u8 ulp_proto_id; + union { + struct cnic_iscsi *iscsi; + } proto; +}; + +struct l5cm_spe; + +struct cnic_local { + + spinlock_t cnic_ulp_lock; + void *ulp_handle[MAX_CNIC_ULP_TYPE]; + unsigned long ulp_flags[MAX_CNIC_ULP_TYPE]; +#define ULP_F_INIT 0 +#define ULP_F_START 1 + struct cnic_ulp_ops *ulp_ops[MAX_CNIC_ULP_TYPE]; + + /* protected by ulp_lock */ + u32 cnic_local_flags; +#define CNIC_LCL_FL_KWQ_INIT 0x00000001 +#define CNIC_LCL_FL_IRQ_REQD 0x00000002 + + struct cnic_dev *dev; + + struct cnic_eth_dev *ethdev; + + u32 kwq_cid_addr; + u32 kcq_cid_addr; + + struct cnic_dma kwq_info; + struct kwqe **kwq; + + struct cnic_dma kwq_16_data_info; + + u16 max_kwq_idx; + + u16 kwq_prod_idx; + u32 kwq_io_addr; + + volatile u16 *kwq_con_idx_ptr; + u16 kwq_con_idx; + + struct cnic_dma kcq_info; + struct kcqe **kcq; + + u16 kcq_prod_idx; + u32 kcq_io_addr; + + void *status_blk; + struct status_block_msix *bnx2_status_blk; + struct host_status_block *bnx2x_status_blk; + + u32 status_blk_num; + u32 int_num; + u32 last_status_idx; + struct tasklet_struct cnic_irq_task; + + struct kcqe *completed_kcq[MAX_COMPLETED_KCQE]; + + struct cnic_sock *csk_tbl; + struct cnic_id_tbl csk_port_tbl; + u32 next_tcp_port; + + struct cnic_dma conn_buf_info; + struct cnic_dma gbl_buf_info; + + struct cnic_iscsi *iscsi_tbl; + struct cnic_context *ctx_tbl; + struct cnic_id_tbl cid_tbl; + atomic_t iscsi_conn; + + /* per connection parameters */ + int num_iscsi_tasks; + int num_ccells; + int task_array_size; + int r2tq_size; + int hq_size; + int num_cqs; + + struct notifier_block cm_nb; + + struct cnic_work_node cnic_work_ring[WORK_RING_SIZE]; + int cnic_wr_cons; + int cnic_wr_prod; + spinlock_t wr_lock; + + struct tasklet_struct cnic_task; + + struct work_struct delete_task; + +#ifndef HAVE_NETEVENT + struct timer_list cnic_timer; + u32 cnic_timer_off; +#endif + struct cnic_ctx *ctx_arr; + int ctx_blks; + int ctx_blk_size; + unsigned long ctx_align; + int cids_per_blk; + + u32 chip_id; + int func; +#if defined (__VMKLNX__) + vmk_EthAddress srcMACAddr; + vmk_EthAddress nextHopMACAddr; + vmk_uint32 pmtu; + vmk_uint32 vlan_id; + vmk_uint32 srcFamily; + vmk_uint8 srcIPAddr[4]; // XXX NOT IPv6 compatible + vmk_uint32 cnic_local_port_min; + vmk_uint32 cnic_local_port_nr; +#endif /* defined (__VMKLNX__) */ + + struct cnic_ops *cnic_ops; + int (*start_hw)(struct cnic_dev *); + void (*stop_hw)(struct cnic_dev *); + void (*setup_pgtbl)(struct cnic_dev *, + struct cnic_dma *); + int (*alloc_resc)(struct cnic_dev *); + void (*free_resc)(struct cnic_dev *); + int (*start_cm)(struct cnic_dev *); + void (*stop_cm)(struct cnic_dev *); + void (*enable_int)(struct cnic_dev *); + void (*disable_int_sync)(struct cnic_dev *); + void (*ack_int)(struct cnic_dev *); + void (*close_conn)(struct cnic_sock *, u32 opcode); + u16 (*next_idx)(u16); + u16 (*hw_idx)(u16); +}; + +struct bnx2x_bd_chain_next { + u32 addr_lo; + u32 addr_hi; + u8 reserved[8]; +}; + +#define ISCSI_RAMROD_CMD_ID_UPDATE_CONN (ISCSI_KCQE_OPCODE_UPDATE_CONN) +#define ISCSI_RAMROD_CMD_ID_INIT (ISCSI_KCQE_OPCODE_INIT) + +#define CDU_REGION_NUMBER_XCM_AG 2 +#define CDU_REGION_NUMBER_UCM_AG 4 + +#ifndef NEW_BNX2X_HSI +static u8 calc_crc8( u32 data, u8 crc) +{ + u8 D[32]; + u8 NewCRC[8]; + u8 C[8]; + u8 crc_res; + u8 i; + + /* split the data into 31 bits */ + for (i = 0; i < 32; i++) { + D[i] = (u8)(data & 1); + data = data >> 1; + } + + /* split the crc into 8 bits */ + for (i = 0; i < 8; i++ ) { + C[i] = crc & 1; + crc = crc >> 1; + } + + NewCRC[0] = D[31] ^ D[30] ^ D[28] ^ D[23] ^ D[21] ^ D[19] ^ D[18] ^ D[16] ^ D[14] ^ D[12] ^ D[8] ^ D[7] ^ D[6] ^ D[0] ^ C[4] ^ C[6] ^ C[7]; + NewCRC[1] = D[30] ^ D[29] ^ D[28] ^ D[24] ^ D[23] ^ D[22] ^ D[21] ^ D[20] ^ D[18] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^ D[12] ^ D[9] ^ D[6] ^ D[1] ^ D[0] ^ C[0] ^ C[4] ^ C[5] ^ C[6]; + NewCRC[2] = D[29] ^ D[28] ^ D[25] ^ D[24] ^ D[22] ^ D[17] ^ D[15] ^ D[13] ^ D[12] ^ D[10] ^ D[8] ^ D[6] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[4] ^ C[5]; + NewCRC[3] = D[30] ^ D[29] ^ D[26] ^ D[25] ^ D[23] ^ D[18] ^ D[16] ^ D[14] ^ D[13] ^ D[11] ^ D[9] ^ D[7] ^ D[3] ^ D[2] ^ D[1] ^ C[1] ^ C[2] ^ C[5] ^ C[6]; + NewCRC[4] = D[31] ^ D[30] ^ D[27] ^ D[26] ^ D[24] ^ D[19] ^ D[17] ^ D[15] ^ D[14] ^ D[12] ^ D[10] ^ D[8] ^ D[4] ^ D[3] ^ D[2] ^ C[0] ^ C[2] ^ C[3] ^ C[6] ^ C[7]; + NewCRC[5] = D[31] ^ D[28] ^ D[27] ^ D[25] ^ D[20] ^ D[18] ^ D[16] ^ D[15] ^ D[13] ^ D[11] ^ D[9] ^ D[5] ^ D[4] ^ D[3] ^ C[1] ^ C[3] ^ C[4] ^ C[7]; + NewCRC[6] = D[29] ^ D[28] ^ D[26] ^ D[21] ^ D[19] ^ D[17] ^ D[16] ^ D[14] ^ D[12] ^ D[10] ^ D[6] ^ D[5] ^ D[4] ^ C[2] ^ C[4] ^ C[5]; + NewCRC[7] = D[30] ^ D[29] ^ D[27] ^ D[22] ^ D[20] ^ D[18] ^ D[17] ^ D[15] ^ D[13] ^ D[11] ^ D[7] ^ D[6] ^ D[5] ^ C[3] ^ C[5] ^ C[6]; + + crc_res = 0; + for (i = 0; i < 8; i++) { + crc_res |= (NewCRC[i] << i); + } + + return crc_res; +} +#endif + +#define CDU_VALID_DATA(_cid, _region, _type) \ + (((_cid) << 8) | (((_region)&0xf)<<4) | (((_type)&0xf))) + +#define CDU_CRC8(_cid, _region, _type) \ + (calc_crc8(CDU_VALID_DATA(_cid, _region, _type), 0xff)) + +#define CDU_RSRVD_VALUE_TYPE_A(_cid, _region, _type) \ + (0x80 | ((CDU_CRC8(_cid, _region, _type)) & 0x7f)) + +#define BNX2X_ISCSI_NUM_CONNECTIONS 128 +#define BNX2X_ISCSI_TASK_CONTEXT_SIZE 128 +#define BNX2X_ISCSI_CONTEXT_MEM_SIZE 1024 +#define BNX2X_ISCSI_MAX_PENDING_R2TS 4 +#define BNX2X_ISCSI_R2TQE_SIZE 8 +#define BNX2X_ISCSI_HQ_BD_SIZE 64 +#define BNX2X_ISCSI_CONN_BUF_SIZE 64 +#define BNX2X_ISCSI_GLB_BUF_SIZE 64 +#define BNX2X_ISCSI_PBL_NOT_CACHED 0xff +#define BNX2X_ISCSI_PDU_HEADER_NOT_CACHED 0xff +#define BNX2X_HW_CID(x, func) ((x) | (((func) % PORT_MAX) << 23) | \ + (((func) >> 1) << 17)) +#define BNX2X_SW_CID(x) (x & 0x1ffff) +#define BNX2X_CHIP_NUM_57711 0x164f +#define BNX2X_CHIP_NUM_57711E 0x1650 +#define BNX2X_CHIP_NUM(x) (x >> 16) +#define BNX2X_CHIP_IS_57711(x) \ + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711) +#define BNX2X_CHIP_IS_57711E(x) \ + (BNX2X_CHIP_NUM(x) == BNX2X_CHIP_NUM_57711E) +#define BNX2X_CHIP_IS_E1H(x) \ + (BNX2X_CHIP_IS_57711(x) || BNX2X_CHIP_IS_57711E(x)) +#define IS_E1H_OFFSET BNX2X_CHIP_IS_E1H(cp->chip_id) + +#define BNX2X_SHMEM_ADDR(base, field) (base + \ + offsetof(struct shmem_region, field)) + +#define CNIC_PORT(cp) ((cp)->func % PORT_MAX) +#define CNIC_FUNC(cp) ((cp)->func) +#define CNIC_E1HVN(cp) ((cp)->func >> 1) + +#endif + diff --git a/vmkdrivers/src_current/drivers/net/bnx2/cnic_defs.h b/vmkdrivers/src_current/drivers/net/bnx2/cnic_defs.h new file mode 100644 index 0000000..3765e76 --- /dev/null +++ b/vmkdrivers/src_current/drivers/net/bnx2/cnic_defs.h @@ -0,0 +1,570 @@ +#ifndef __57XX_L5CM_HSI_LINUX_LE__ +#define __57XX_L5CM_HSI_LINUX_LE__ + +/* KWQ (kernel work queue) request op codes */ +#define L2_KWQE_OPCODE_VALUE_FLUSH (4) + +#define L4_KWQE_OPCODE_VALUE_CONNECT1 (50) +#define L4_KWQE_OPCODE_VALUE_CONNECT2 (51) +#de