diff --git a/config-pvops b/config-pvops index e676bc7..a6e953f 100644 --- a/config-pvops +++ b/config-pvops @@ -1,48 +1,37 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 3.2.7 Kernel Configuration +# Linux/x86_64 3.7.6 Kernel Configuration # CONFIG_64BIT=y -# CONFIG_X86_32 is not set CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" -CONFIG_GENERIC_CMOS_UPDATE=y -CONFIG_CLOCKSOURCE_WATCHDOG=y -CONFIG_GENERIC_CLOCKEVENTS=y -CONFIG_ARCH_CLOCKSOURCE_DATA=y -CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y CONFIG_HAVE_LATENCYTOP_SUPPORT=y CONFIG_MMU=y -CONFIG_ZONE_DMA=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_GENERIC_ISA_DMA=y -CONFIG_GENERIC_IOMAP=y CONFIG_GENERIC_BUG=y CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_GPIO=y CONFIG_ARCH_MAY_HAVE_PC_FDC=y -# CONFIG_RWSEM_GENERIC_SPINLOCK is not set CONFIG_RWSEM_XCHGADD_ALGORITHM=y -CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_TIME_VSYSCALL=y CONFIG_ARCH_HAS_CPU_RELAX=y CONFIG_ARCH_HAS_DEFAULT_IDLE=y CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_CPU_AUTOPROBE=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ZONE_DMA32=y -CONFIG_ARCH_POPULATES_NODE_MAP=y CONFIG_AUDIT_ARCH=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y @@ -50,11 +39,12 @@ CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_X86_HT=y CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" -# CONFIG_KTIME_SCALAR is not set CONFIG_ARCH_CPU_PROBE_RELEASE=y +CONFIG_ARCH_SUPPORTS_UPROBES=y CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" CONFIG_HAVE_IRQ_WORK=y CONFIG_IRQ_WORK=y +CONFIG_BUILDTIME_EXTABLE_SORT=y # # General setup @@ -62,7 +52,7 @@ CONFIG_IRQ_WORK=y CONFIG_EXPERIMENTAL=y CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" -CONFIG_LOCALVERSION="-3.pvops.qubes.x86_64" +CONFIG_LOCALVERSION="-1.pvops.qubes.x86_64" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y @@ -80,38 +70,62 @@ CONFIG_SYSVIPC=y CONFIG_SYSVIPC_SYSCTL=y CONFIG_POSIX_MQUEUE=y CONFIG_POSIX_MQUEUE_SYSCTL=y -CONFIG_BSD_PROCESS_ACCT=y -CONFIG_BSD_PROCESS_ACCT_V3=y # CONFIG_FHANDLE is not set -CONFIG_TASKSTATS=y -CONFIG_TASK_DELAY_ACCT=y -CONFIG_TASK_XACCT=y -CONFIG_TASK_IO_ACCOUNTING=y CONFIG_AUDIT=y CONFIG_AUDITSYSCALL=y CONFIG_AUDIT_WATCH=y CONFIG_AUDIT_TREE=y +CONFIG_AUDIT_LOGINUID_IMMUTABLE=y CONFIG_HAVE_GENERIC_HARDIRQS=y # # IRQ subsystem # CONFIG_GENERIC_HARDIRQS=y -CONFIG_HAVE_SPARSE_IRQ=y CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_PENDING_IRQ=y CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_DOMAIN=y +# CONFIG_IRQ_DOMAIN_DEBUG is not set CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y +CONFIG_CLOCKSOURCE_WATCHDOG=y +CONFIG_ARCH_CLOCKSOURCE_DATA=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_GENERIC_CMOS_UPDATE=y + +# +# Timers subsystem +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y + +# +# CPU/Task time and stats accounting +# +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_IRQ_TIME_ACCOUNTING is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_TASKSTATS=y +CONFIG_TASK_DELAY_ACCT=y +CONFIG_TASK_XACCT=y +CONFIG_TASK_IO_ACCOUNTING=y # # RCU Subsystem # CONFIG_TREE_RCU=y # CONFIG_PREEMPT_RCU is not set -# CONFIG_RCU_TRACE is not set +# CONFIG_RCU_USER_QS is not set CONFIG_RCU_FANOUT=64 +CONFIG_RCU_FANOUT_LEAF=16 # CONFIG_RCU_FANOUT_EXACT is not set CONFIG_RCU_FAST_NO_HZ=y # CONFIG_TREE_RCU_TRACE is not set @@ -127,8 +141,7 @@ CONFIG_CPUSETS=y CONFIG_PROC_PID_CPUSET=y CONFIG_CGROUP_CPUACCT=y CONFIG_RESOURCE_COUNTERS=y -CONFIG_CGROUP_MEM_RES_CTLR=y -# CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set +# CONFIG_MEMCG is not set # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y @@ -136,14 +149,13 @@ CONFIG_CFS_BANDWIDTH=y CONFIG_RT_GROUP_SCHED=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set +# CONFIG_CHECKPOINT_RESTORE is not set CONFIG_NAMESPACES=y CONFIG_UTS_NS=y CONFIG_IPC_NS=y -CONFIG_USER_NS=y CONFIG_PID_NS=y CONFIG_NET_NS=y # CONFIG_SCHED_AUTOGROUP is not set -CONFIG_MM_OWNER=y # CONFIG_SYSFS_DEPRECATED is not set CONFIG_RELAY=y CONFIG_BLK_DEV_INITRD=y @@ -157,8 +169,10 @@ CONFIG_RD_LZO=y CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EXPERT is not set +CONFIG_HAVE_UID16=y CONFIG_UID16=y # CONFIG_SYSCTL_SYSCALL is not set +CONFIG_SYSCTL_EXCEPTION_TRACE=y CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y CONFIG_HOTPLUG=y @@ -182,7 +196,6 @@ CONFIG_HAVE_PERF_EVENTS=y # Kernel Performance Events And Counters # CONFIG_PERF_EVENTS=y -# CONFIG_PERF_COUNTERS is not set # CONFIG_DEBUG_PERF_USE_VMALLOC is not set CONFIG_VM_EVENT_COUNTERS=y CONFIG_PCI_QUIRKS=y @@ -194,9 +207,11 @@ CONFIG_TRACEPOINTS=y CONFIG_OPROFILE=m # CONFIG_OPROFILE_EVENT_MULTIPLEX is not set CONFIG_HAVE_OPROFILE=y +CONFIG_OPROFILE_NMI_TIMER=y CONFIG_KPROBES=y # CONFIG_JUMP_LABEL is not set CONFIG_OPTPROBES=y +CONFIG_UPROBES=y CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y CONFIG_KRETPROBES=y CONFIG_HAVE_IOREMAP_PROT=y @@ -206,14 +221,29 @@ CONFIG_HAVE_OPTPROBES=y CONFIG_HAVE_ARCH_TRACEHOOK=y CONFIG_HAVE_DMA_ATTRS=y CONFIG_USE_GENERIC_SMP_HELPERS=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_DMA_API_DEBUG=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y +CONFIG_HAVE_PERF_REGS=y +CONFIG_HAVE_PERF_USER_STACK_DUMP=y CONFIG_HAVE_ARCH_JUMP_LABEL=y CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y +CONFIG_HAVE_CMPXCHG_LOCAL=y +CONFIG_HAVE_CMPXCHG_DOUBLE=y +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y +CONFIG_GENERIC_KERNEL_THREAD=y +CONFIG_GENERIC_KERNEL_EXECVE=y +CONFIG_HAVE_ARCH_SECCOMP_FILTER=y +CONFIG_SECCOMP_FILTER=y +CONFIG_HAVE_RCU_USER_QS=y +CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y +CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y +CONFIG_MODULES_USE_ELF_RELA=y # # GCOV-based kernel profiling @@ -229,12 +259,36 @@ CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_MODVERSIONS=y CONFIG_MODULE_SRCVERSION_ALL=y +# CONFIG_MODULE_SIG is not set CONFIG_STOP_MACHINE=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y # CONFIG_BLK_DEV_THROTTLING is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +CONFIG_OSF_PARTITION=y +# CONFIG_AMIGA_PARTITION is not set +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_MSDOS_PARTITION=y +CONFIG_BSD_DISKLABEL=y +# CONFIG_MINIX_SUBPARTITION is not set +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_LDM_PARTITION=y +# CONFIG_LDM_DEBUG is not set +CONFIG_SGI_PARTITION=y +CONFIG_ULTRIX_PARTITION=y +CONFIG_SUN_PARTITION=y +CONFIG_KARMA_PARTITION=y +CONFIG_EFI_PARTITION=y +CONFIG_SYSV68_PARTITION=y CONFIG_BLOCK_COMPAT=y # @@ -249,45 +303,19 @@ CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_PADATA=y -# CONFIG_INLINE_SPIN_TRYLOCK is not set -# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set -# CONFIG_INLINE_SPIN_LOCK is not set -# CONFIG_INLINE_SPIN_LOCK_BH is not set -# CONFIG_INLINE_SPIN_LOCK_IRQ is not set -# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set -CONFIG_INLINE_SPIN_UNLOCK=y -# CONFIG_INLINE_SPIN_UNLOCK_BH is not set +CONFIG_ASN1=m CONFIG_INLINE_SPIN_UNLOCK_IRQ=y -# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set -# CONFIG_INLINE_READ_TRYLOCK is not set -# CONFIG_INLINE_READ_LOCK is not set -# CONFIG_INLINE_READ_LOCK_BH is not set -# CONFIG_INLINE_READ_LOCK_IRQ is not set -# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set CONFIG_INLINE_READ_UNLOCK=y -# CONFIG_INLINE_READ_UNLOCK_BH is not set CONFIG_INLINE_READ_UNLOCK_IRQ=y -# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set -# CONFIG_INLINE_WRITE_TRYLOCK is not set -# CONFIG_INLINE_WRITE_LOCK is not set -# CONFIG_INLINE_WRITE_LOCK_BH is not set -# CONFIG_INLINE_WRITE_LOCK_IRQ is not set -# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set CONFIG_INLINE_WRITE_UNLOCK=y -# CONFIG_INLINE_WRITE_UNLOCK_BH is not set CONFIG_INLINE_WRITE_UNLOCK_IRQ=y -# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set CONFIG_MUTEX_SPIN_ON_OWNER=y CONFIG_FREEZER=y # # Processor type and features # -CONFIG_TICK_ONESHOT=y -CONFIG_NO_HZ=y -CONFIG_HIGH_RES_TIMERS=y -CONFIG_GENERIC_CLOCKEVENTS_BUILD=y -CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y +CONFIG_ZONE_DMA=y CONFIG_SMP=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y @@ -301,10 +329,9 @@ CONFIG_XEN=y CONFIG_XEN_DOM0=y CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_PVHVM=y -CONFIG_XEN_MAX_DOMAIN_MEMORY=128 +CONFIG_XEN_MAX_DOMAIN_MEMORY=500 CONFIG_XEN_SAVE_RESTORE=y # CONFIG_XEN_DEBUG_FS is not set -# CONFIG_KVM_CLOCK is not set # CONFIG_KVM_GUEST is not set CONFIG_PARAVIRT=y # CONFIG_PARAVIRT_SPINLOCKS is not set @@ -319,8 +346,6 @@ CONFIG_NO_BOOTMEM=y CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_CMPXCHG=y -CONFIG_CMPXCHG_LOCAL=y -CONFIG_CMPXCHG_DOUBLE=y CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_XADD=y CONFIG_X86_WP_WORKS_OK=y @@ -343,7 +368,6 @@ CONFIG_IOMMU_HELPER=y CONFIG_NR_CPUS=512 # CONFIG_SCHED_SMT is not set CONFIG_SCHED_MC=y -# CONFIG_IRQ_TIME_ACCOUNTING is not set # CONFIG_PREEMPT_NONE is not set CONFIG_PREEMPT_VOLUNTARY=y # CONFIG_PREEMPT is not set @@ -359,7 +383,7 @@ CONFIG_X86_THERMAL_VECTOR=y CONFIG_I8K=m CONFIG_MICROCODE=m CONFIG_MICROCODE_INTEL=y -# CONFIG_MICROCODE_AMD is not set +CONFIG_MICROCODE_AMD=y CONFIG_MICROCODE_OLD_INTERFACE=y CONFIG_X86_MSR=y CONFIG_X86_CPUID=m @@ -382,6 +406,9 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_HAVE_MEMBLOCK=y +CONFIG_HAVE_MEMBLOCK_NODE_MAP=y +CONFIG_ARCH_DISCARD_MEMBLOCK=y +CONFIG_MEMORY_ISOLATION=y CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG_SPARSE=y CONFIG_MEMORY_HOTREMOVE=y @@ -402,7 +429,9 @@ CONFIG_HWPOISON_INJECT=m CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set +CONFIG_CROSS_MEMORY_ATTACH=y CONFIG_CLEANCACHE=y +CONFIG_FRONTSWAP=y # CONFIG_X86_CHECK_BIOS_CORRUPTION is not set CONFIG_X86_RESERVE_LOW=64 CONFIG_MTRR=y @@ -412,6 +441,7 @@ CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y CONFIG_ARCH_RANDOM=y +CONFIG_X86_SMAP=y # CONFIG_EFI is not set CONFIG_SECCOMP=y # CONFIG_CC_STACKPROTECTOR is not set @@ -441,12 +471,14 @@ CONFIG_HIBERNATE_CALLBACKS=y # CONFIG_HIBERNATION is not set CONFIG_PM_SLEEP=y CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set CONFIG_PM_RUNTIME=y CONFIG_PM=y CONFIG_PM_DEBUG=y CONFIG_PM_ADVANCED_DEBUG=y # CONFIG_PM_TEST_SUSPEND is not set -CONFIG_CAN_PM_TRACE=y +CONFIG_PM_SLEEP_DEBUG=y CONFIG_PM_TRACE=y CONFIG_PM_TRACE_RTC=y CONFIG_ACPI=y @@ -461,8 +493,8 @@ CONFIG_ACPI_BUTTON=m CONFIG_ACPI_VIDEO=m CONFIG_ACPI_FAN=m CONFIG_ACPI_DOCK=y -CONFIG_ACPI_PROCESSOR=m -# CONFIG_ACPI_IPMI is not set +CONFIG_ACPI_PROCESSOR=y +CONFIG_ACPI_IPMI=m CONFIG_ACPI_HOTPLUG_CPU=y CONFIG_ACPI_PROCESSOR_AGGREGATOR=m CONFIG_ACPI_THERMAL=m @@ -473,7 +505,7 @@ CONFIG_ACPI_DEBUG=y # CONFIG_ACPI_DEBUG_FUNC_TRACE is not set CONFIG_ACPI_PCI_SLOT=m CONFIG_X86_PM_TIMER=y -CONFIG_ACPI_CONTAINER=m +CONFIG_ACPI_CONTAINER=y CONFIG_ACPI_HOTPLUG_MEMORY=m CONFIG_ACPI_SBS=m # CONFIG_ACPI_HED is not set @@ -495,14 +527,15 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m -CONFIG_CPU_FREQ_GOV_ONDEMAND=y -CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=m +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m # # x86 CPU frequency scaling drivers # CONFIG_X86_PCC_CPUFREQ=m CONFIG_X86_ACPI_CPUFREQ=m +CONFIG_X86_ACPI_CPUFREQ_CPB=y CONFIG_X86_POWERNOW_K8=m CONFIG_X86_SPEEDSTEP_CENTRINO=m CONFIG_X86_P4_CLOCKMOD=m @@ -514,6 +547,7 @@ CONFIG_X86_SPEEDSTEP_LIB=m CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set CONFIG_INTEL_IDLE=y # @@ -530,7 +564,6 @@ CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y CONFIG_PCI_XEN=y CONFIG_PCI_DOMAINS=y -# CONFIG_PCI_CNB20LE_QUIRK is not set CONFIG_PCIEPORTBUS=y CONFIG_HOTPLUG_PCI_PCIE=m CONFIG_PCIEAER=y @@ -538,10 +571,14 @@ CONFIG_PCIEAER=y CONFIG_PCIEAER_INJECT=m CONFIG_PCIEASPM=y # CONFIG_PCIEASPM_DEBUG is not set +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_PERFORMANCE is not set CONFIG_PCIE_PME=y CONFIG_ARCH_SUPPORTS_MSI=y CONFIG_PCI_MSI=y # CONFIG_PCI_DEBUG is not set +# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set CONFIG_PCI_STUB=y CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_HT_IRQ=y @@ -571,7 +608,6 @@ CONFIG_PD6729=m CONFIG_I82092=m CONFIG_PCCARD_NONSTATIC=y CONFIG_HOTPLUG_PCI=m -CONFIG_HOTPLUG_PCI_FAKE=m CONFIG_HOTPLUG_PCI_ACPI=m CONFIG_HOTPLUG_PCI_ACPI_IBM=m CONFIG_HOTPLUG_PCI_CPCI=y @@ -585,16 +621,20 @@ CONFIG_HOTPLUG_PCI_SHPC=m # CONFIG_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y # CONFIG_HAVE_AOUT is not set CONFIG_BINFMT_MISC=m +CONFIG_COREDUMP=y CONFIG_IA32_EMULATION=y CONFIG_IA32_AOUT=m +# CONFIG_X86_X32 is not set CONFIG_COMPAT=y CONFIG_COMPAT_FOR_U64_ALIGNMENT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_KEYS_COMPAT=y CONFIG_HAVE_TEXT_POKE_SMP=y +CONFIG_X86_DEV_DMA_OPS=y CONFIG_NET=y CONFIG_COMPAT_NETLINK_MESSAGES=y @@ -602,8 +642,11 @@ CONFIG_COMPAT_NETLINK_MESSAGES=y # Networking options # CONFIG_PACKET=m +CONFIG_PACKET_DIAG=m CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m CONFIG_XFRM=y +CONFIG_XFRM_ALGO=m CONFIG_XFRM_USER=m CONFIG_XFRM_SUB_POLICY=y CONFIG_XFRM_MIGRATE=y @@ -624,13 +667,16 @@ CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=m -# CONFIG_NET_IPGRE_DEMUX is not set +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPGRE=m +# CONFIG_NET_IPGRE_BROADCAST is not set CONFIG_IP_MROUTE=y -# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m @@ -642,6 +688,7 @@ CONFIG_INET_XFRM_MODE_BEET=m CONFIG_INET_LRO=y CONFIG_INET_DIAG=m CONFIG_INET_TCP_DIAG=m +CONFIG_INET_UDP_DIAG=m CONFIG_TCP_CONG_ADVANCED=y CONFIG_TCP_CONG_BIC=m CONFIG_TCP_CONG_CUBIC=y @@ -678,6 +725,7 @@ CONFIG_IPV6_SIT=m # CONFIG_IPV6_SIT_6RD is not set CONFIG_IPV6_NDISC_NODETYPE=y CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m CONFIG_IPV6_MULTIPLE_TABLES=y CONFIG_IPV6_SUBTREES=y # CONFIG_IPV6_MROUTE is not set @@ -692,13 +740,16 @@ CONFIG_BRIDGE_NETFILTER=y # Core Netfilter Configuration # CONFIG_NETFILTER_NETLINK=m +CONFIG_NETFILTER_NETLINK_ACCT=m CONFIG_NETFILTER_NETLINK_QUEUE=m CONFIG_NETFILTER_NETLINK_LOG=m CONFIG_NF_CONNTRACK=m CONFIG_NF_CONNTRACK_MARK=y CONFIG_NF_CONNTRACK_SECMARK=y CONFIG_NF_CONNTRACK_ZONES=y +CONFIG_NF_CONNTRACK_PROCFS=y CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y # CONFIG_NF_CONNTRACK_TIMESTAMP is not set CONFIG_NF_CT_PROTO_DCCP=m CONFIG_NF_CT_PROTO_GRE=m @@ -716,6 +767,19 @@ CONFIG_NF_CONNTRACK_SANE=m CONFIG_NF_CONNTRACK_SIP=m CONFIG_NF_CONNTRACK_TFTP=m CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_CT_NETLINK_HELPER=m +CONFIG_NETFILTER_NETLINK_QUEUE_CT=y +CONFIG_NF_NAT=m +CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_NAT_PROTO_DCCP=m +CONFIG_NF_NAT_PROTO_UDPLITE=m +CONFIG_NF_NAT_PROTO_SCTP=m +CONFIG_NF_NAT_AMANDA=m +CONFIG_NF_NAT_FTP=m +CONFIG_NF_NAT_IRC=m +CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_TFTP=m CONFIG_NETFILTER_TPROXY=m CONFIG_NETFILTER_XTABLES=m @@ -737,13 +801,17 @@ CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m CONFIG_NETFILTER_XT_TARGET_CT=m CONFIG_NETFILTER_XT_TARGET_DSCP=m CONFIG_NETFILTER_XT_TARGET_HL=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NETMAP=m CONFIG_NETFILTER_XT_TARGET_NFLOG=m CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m CONFIG_NETFILTER_XT_TARGET_NOTRACK=m CONFIG_NETFILTER_XT_TARGET_RATEEST=m +CONFIG_NETFILTER_XT_TARGET_REDIRECT=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set CONFIG_NETFILTER_XT_TARGET_TPROXY=m CONFIG_NETFILTER_XT_TARGET_TRACE=m @@ -765,6 +833,7 @@ CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m CONFIG_NETFILTER_XT_MATCH_DCCP=m CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ECN=m CONFIG_NETFILTER_XT_MATCH_ESP=m CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m CONFIG_NETFILTER_XT_MATCH_HELPER=m @@ -776,6 +845,7 @@ CONFIG_NETFILTER_XT_MATCH_LIMIT=m CONFIG_NETFILTER_XT_MATCH_MAC=m CONFIG_NETFILTER_XT_MATCH_MARK=m CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m CONFIG_NETFILTER_XT_MATCH_OSF=m CONFIG_NETFILTER_XT_MATCH_OWNER=m CONFIG_NETFILTER_XT_MATCH_POLICY=m @@ -835,6 +905,11 @@ CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m +# +# IPVS SH scheduler +# +CONFIG_IP_VS_SH_TAB_BITS=8 + # # IPVS application helper # @@ -852,28 +927,19 @@ CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_AH=m CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m -CONFIG_NF_NAT=m -CONFIG_NF_NAT_NEEDED=y +CONFIG_NF_NAT_IPV4=m CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_NF_NAT_SNMP_BASIC=m -CONFIG_NF_NAT_PROTO_DCCP=m CONFIG_NF_NAT_PROTO_GRE=m -CONFIG_NF_NAT_PROTO_UDPLITE=m -CONFIG_NF_NAT_PROTO_SCTP=m -CONFIG_NF_NAT_FTP=m -CONFIG_NF_NAT_IRC=m -CONFIG_NF_NAT_TFTP=m -CONFIG_NF_NAT_AMANDA=m CONFIG_NF_NAT_PPTP=m CONFIG_NF_NAT_H323=m -CONFIG_NF_NAT_SIP=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_CLUSTERIP=m CONFIG_IP_NF_TARGET_ECN=m @@ -888,7 +954,6 @@ CONFIG_IP_NF_ARP_MANGLE=m # CONFIG_NF_DEFRAG_IPV6=m CONFIG_NF_CONNTRACK_IPV6=m -CONFIG_IP6_NF_QUEUE=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_AH=m CONFIG_IP6_NF_MATCH_EUI64=m @@ -897,13 +962,16 @@ CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_MH=m +CONFIG_IP6_NF_MATCH_RPFILTER=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_TARGET_HL=m -CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_REJECT=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_RAW=m +CONFIG_NF_NAT_IPV6=m +CONFIG_IP6_NF_TARGET_MASQUERADE=m +CONFIG_IP6_NF_TARGET_NPT=m # # DECnet: Netfilter Configuration @@ -975,11 +1043,6 @@ CONFIG_NET_DSA=y CONFIG_NET_DSA_TAG_DSA=y CONFIG_NET_DSA_TAG_EDSA=y CONFIG_NET_DSA_TAG_TRAILER=y -CONFIG_NET_DSA_MV88E6XXX=y -CONFIG_NET_DSA_MV88E6060=y -CONFIG_NET_DSA_MV88E6XXX_NEED_PPU=y -CONFIG_NET_DSA_MV88E6131=y -CONFIG_NET_DSA_MV88E6123_61_65=y CONFIG_VLAN_8021Q=m CONFIG_VLAN_8021Q_GVRP=y CONFIG_DECNET=m @@ -995,11 +1058,11 @@ CONFIG_IPDDP_ENCAP=y CONFIG_IPDDP_DECAP=y CONFIG_X25=m CONFIG_LAPB=m -# CONFIG_ECONET is not set CONFIG_WAN_ROUTER=m CONFIG_PHONET=m CONFIG_IEEE802154=m CONFIG_IEEE802154_6LOWPAN=m +CONFIG_MAC802154=m CONFIG_NET_SCHED=y # @@ -1023,7 +1086,10 @@ CONFIG_NET_SCH_DRR=m CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_CHOKE=m CONFIG_NET_SCH_QFQ=m +CONFIG_NET_SCH_CODEL=m +CONFIG_NET_SCH_FQ_CODEL=m CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_SCH_PLUG=m # # Classification @@ -1047,6 +1113,8 @@ CONFIG_NET_EMATCH_NBYTE=m CONFIG_NET_EMATCH_U32=m CONFIG_NET_EMATCH_META=m CONFIG_NET_EMATCH_TEXT=m +CONFIG_NET_EMATCH_CANID=m +CONFIG_NET_EMATCH_IPSET=m CONFIG_NET_CLS_ACT=y CONFIG_NET_ACT_POLICE=m CONFIG_NET_ACT_GACT=m @@ -1063,11 +1131,14 @@ CONFIG_NET_SCH_FIFO=y CONFIG_DCB=y CONFIG_DNS_RESOLVER=y CONFIG_BATMAN_ADV=m +# CONFIG_BATMAN_ADV_BLA is not set CONFIG_BATMAN_ADV_DEBUG=y +CONFIG_OPENVSWITCH=m CONFIG_RPS=y CONFIG_RFS_ACCEL=y CONFIG_XPS=y -CONFIG_HAVE_BPF_JIT=y +CONFIG_NETPRIO_CGROUP=m +CONFIG_BQL=y CONFIG_BPF_JIT=y # @@ -1112,19 +1183,26 @@ CONFIG_CAN_MCP251X=m CONFIG_CAN_JANZ_ICAN3=m # CONFIG_PCH_CAN is not set CONFIG_CAN_SJA1000=m +CONFIG_CAN_SJA1000_ISA=m CONFIG_CAN_SJA1000_PLATFORM=m CONFIG_CAN_EMS_PCMCIA=m CONFIG_CAN_EMS_PCI=m +CONFIG_CAN_PEAK_PCMCIA=m CONFIG_CAN_PEAK_PCI=m +CONFIG_CAN_PEAK_PCIEC=y CONFIG_CAN_KVASER_PCI=m CONFIG_CAN_PLX_PCI=m # CONFIG_CAN_C_CAN is not set +CONFIG_CAN_CC770=m +CONFIG_CAN_CC770_ISA=m +CONFIG_CAN_CC770_PLATFORM=m # # CAN USB interfaces # CONFIG_CAN_EMS_USB=m # CONFIG_CAN_ESD_USB2 is not set +CONFIG_CAN_PEAK_USB=m # CONFIG_CAN_SOFTING is not set # CONFIG_CAN_DEBUG_DEVICES is not set CONFIG_IRDA=m @@ -1184,8 +1262,6 @@ CONFIG_VLSI_FIR=m CONFIG_VIA_FIR=m CONFIG_MCS_FIR=m CONFIG_BT=m -CONFIG_BT_L2CAP=y -CONFIG_BT_SCO=y CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m @@ -1204,6 +1280,7 @@ CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y # CONFIG_BT_HCIUART_ATH3K is not set CONFIG_BT_HCIUART_LL=y +CONFIG_BT_HCIUART_3WIRE=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m @@ -1234,7 +1311,6 @@ CONFIG_CFG80211_DEFAULT_PS=y # CONFIG_CFG80211_DEBUGFS is not set # CONFIG_CFG80211_INTERNAL_REGDB is not set CONFIG_CFG80211_WEXT=y -CONFIG_WIRELESS_EXT_SYSFS=y CONFIG_LIB80211=m CONFIG_LIB80211_CRYPT_WEP=m CONFIG_LIB80211_CRYPT_CCMP=m @@ -1249,6 +1325,7 @@ CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" CONFIG_MAC80211_MESH=y CONFIG_MAC80211_LEDS=y CONFIG_MAC80211_DEBUGFS=y +# CONFIG_MAC80211_MESSAGE_TRACING is not set # CONFIG_MAC80211_DEBUG_MENU is not set CONFIG_WIMAX=m CONFIG_WIMAX_DEBUG_LEVEL=8 @@ -1266,13 +1343,17 @@ CONFIG_CEPH_LIB=m # CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set CONFIG_NFC=m CONFIG_NFC_NCI=m +CONFIG_NFC_HCI=m +CONFIG_NFC_SHDLC=y +# CONFIG_NFC_LLCP is not set # # Near Field Communication (NFC) devices # -CONFIG_PN544_NFC=m +CONFIG_PN544_HCI_NFC=m CONFIG_NFC_PN533=m CONFIG_NFC_WILINK=m +CONFIG_HAVE_BPF_JIT=y # # Device Drivers @@ -1292,8 +1373,17 @@ CONFIG_EXTRA_FIRMWARE="" # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set CONFIG_SYS_HYPERVISOR=y +# CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_REGMAP=y CONFIG_REGMAP_I2C=m +CONFIG_REGMAP_SPI=y +CONFIG_REGMAP_IRQ=y +CONFIG_DMA_SHARED_BUFFER=y + +# +# Bus devices +# +CONFIG_OMAP_OCP2SCP=m CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=m @@ -1405,6 +1495,8 @@ CONFIG_MTD_DOC2000=m CONFIG_MTD_DOC2001=m CONFIG_MTD_DOC2001PLUS=m CONFIG_MTD_DOCG3=m +CONFIG_BCH_CONST_M=14 +CONFIG_BCH_CONST_T=4 CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m CONFIG_MTD_DOCPROBE_ADVANCED=y @@ -1414,7 +1506,6 @@ CONFIG_MTD_DOCPROBE_55AA=y CONFIG_MTD_NAND_ECC=m CONFIG_MTD_NAND_ECC_SMC=y CONFIG_MTD_NAND=m -CONFIG_MTD_NAND_VERIFY_WRITE=y # CONFIG_MTD_NAND_ECC_BCH is not set # CONFIG_MTD_SM_COMMON is not set CONFIG_MTD_NAND_MUSEUM_IDS=y @@ -1426,6 +1517,7 @@ CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED=y CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH=y CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y +CONFIG_MTD_NAND_DOCG4=m CONFIG_MTD_NAND_CAFE=m CONFIG_MTD_NAND_NANDSIM=m CONFIG_MTD_NAND_PLATFORM=m @@ -1444,9 +1536,9 @@ CONFIG_MTD_LPDDR=m CONFIG_MTD_QINFO_PROBE=m CONFIG_MTD_UBI=m CONFIG_MTD_UBI_WL_THRESHOLD=4096 -CONFIG_MTD_UBI_BEB_RESERVE=1 +CONFIG_MTD_UBI_BEB_LIMIT=20 +# CONFIG_MTD_UBI_FASTMAP is not set CONFIG_MTD_UBI_GLUEBI=m -# CONFIG_MTD_UBI_DEBUG is not set CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_PARPORT_SERIAL=m @@ -1495,6 +1587,7 @@ CONFIG_PARIDE_KBIC=m CONFIG_PARIDE_KTTI=m CONFIG_PARIDE_ON20=m CONFIG_PARIDE_ON26=m +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m CONFIG_BLK_CPQ_DA=m CONFIG_BLK_CPQ_CISS_DA=m CONFIG_CISS_SCSI_TAPE=y @@ -1507,9 +1600,9 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m CONFIG_BLK_DEV_DRBD=m # CONFIG_DRBD_FAULT_INJECTION is not set CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_NVME=m CONFIG_BLK_DEV_OSD=m CONFIG_BLK_DEV_SX8=m -# CONFIG_BLK_DEV_UB is not set CONFIG_BLK_DEV_RAM=m CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_BLK_DEV_RAM_SIZE=131072 @@ -1523,8 +1616,11 @@ CONFIG_XEN_BLKDEV_BACKEND=m CONFIG_VIRTIO_BLK=m # CONFIG_BLK_DEV_HD is not set # CONFIG_BLK_DEV_RBD is not set + +# +# Misc devices +# CONFIG_SENSORS_LIS3LV02D=m -CONFIG_MISC_DEVICES=y CONFIG_AD525X_DPOT=m # CONFIG_AD525X_DPOT_I2C is not set # CONFIG_AD525X_DPOT_SPI is not set @@ -1551,7 +1647,9 @@ CONFIG_HMC6352=m CONFIG_DS1682=m CONFIG_TI_DAC7512=m # CONFIG_VMWARE_BALLOON is not set -CONFIG_BMP085=m +CONFIG_BMP085=y +CONFIG_BMP085_I2C=m +CONFIG_BMP085_SPI=m CONFIG_PCH_PHUB=m CONFIG_USB_SWITCH_FSA9480=m CONFIG_C2PORT=m @@ -1569,9 +1667,6 @@ CONFIG_EEPROM_93XX46=m CONFIG_CB710_CORE=m # CONFIG_CB710_DEBUG is not set CONFIG_CB710_DEBUG_ASSUMPTIONS=y -CONFIG_IWMC3200TOP=m -# CONFIG_IWMC3200TOP_DEBUG is not set -# CONFIG_IWMC3200TOP_DEBUGFS is not set # # Texas Instruments shared transport line discipline @@ -1583,6 +1678,7 @@ CONFIG_SENSORS_LIS3_I2C=m # Altera FPGA firmware download module # CONFIG_ALTERA_STAPL=m +CONFIG_INTEL_MEI=m CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -1612,7 +1708,6 @@ CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y # CONFIG_SCSI_SCAN_ASYNC is not set -CONFIG_SCSI_WAIT_SCAN=m # # SCSI Transports @@ -1671,6 +1766,7 @@ CONFIG_MEGARAID_SAS=m CONFIG_SCSI_MPT2SAS=m CONFIG_SCSI_MPT2SAS_MAX_SGE=128 # CONFIG_SCSI_MPT2SAS_LOGGING is not set +CONFIG_SCSI_UFSHCD=m CONFIG_SCSI_HPTIOP=m CONFIG_SCSI_BUSLOGIC=m # CONFIG_VMWARE_PVSCSI is not set @@ -1714,6 +1810,7 @@ CONFIG_SCSI_PMCRAID=m CONFIG_SCSI_PM8001=m CONFIG_SCSI_SRP=m CONFIG_SCSI_BFA_FC=m +CONFIG_SCSI_VIRTIO=m CONFIG_SCSI_LOWLEVEL_PCMCIA=y CONFIG_PCMCIA_AHA152X=m CONFIG_PCMCIA_FDOMAIN=m @@ -1756,6 +1853,7 @@ CONFIG_ATA_BMDMA=y # SATA SFF controllers with BMDMA # CONFIG_ATA_PIIX=m +CONFIG_SATA_HIGHBANK=m CONFIG_SATA_MV=m CONFIG_SATA_NV=m CONFIG_SATA_PROMISE=m @@ -1839,12 +1937,12 @@ CONFIG_MD_FAULTY=m CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set CONFIG_DM_BUFIO=m +CONFIG_DM_BIO_PRISON=m CONFIG_DM_PERSISTENT_DATA=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_THIN_PROVISIONING=m # CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set -# CONFIG_DM_DEBUG_SPACE_MAPS is not set CONFIG_DM_MIRROR=m CONFIG_DM_RAID=m CONFIG_DM_LOG_USERSPACE=m @@ -1855,6 +1953,7 @@ CONFIG_DM_MULTIPATH_ST=m CONFIG_DM_DELAY=m CONFIG_DM_UEVENT=y CONFIG_DM_FLAKEY=m +CONFIG_DM_VERITY=m # CONFIG_TARGET_CORE is not set CONFIG_FUSION=y CONFIG_FUSION_SPI=m @@ -1870,7 +1969,6 @@ CONFIG_FUSION_LAN=m # CONFIG_FIREWIRE=m CONFIG_FIREWIRE_OHCI=m -CONFIG_FIREWIRE_OHCI_DEBUG=y CONFIG_FIREWIRE_SBP2=m CONFIG_FIREWIRE_NET=m # CONFIG_FIREWIRE_NOSY is not set @@ -1884,7 +1982,8 @@ CONFIG_I2O_BUS=m CONFIG_I2O_BLOCK=m CONFIG_I2O_SCSI=m CONFIG_I2O_PROC=m -# CONFIG_MACINTOSH_DRIVERS is not set +CONFIG_MACINTOSH_DRIVERS=y +CONFIG_MAC_EMUMOUSEBTN=m CONFIG_NETDEVICES=y CONFIG_NET_CORE=y CONFIG_BONDING=m @@ -1892,11 +1991,15 @@ CONFIG_DUMMY=m CONFIG_EQUALIZER=m CONFIG_NET_FC=y CONFIG_MII=y -CONFIG_IEEE802154_DRIVERS=m -CONFIG_IEEE802154_FAKEHARD=m CONFIG_IFB=m +CONFIG_NET_TEAM=m +CONFIG_NET_TEAM_MODE_BROADCAST=m +CONFIG_NET_TEAM_MODE_ROUNDROBIN=m +CONFIG_NET_TEAM_MODE_ACTIVEBACKUP=m +CONFIG_NET_TEAM_MODE_LOADBALANCE=m CONFIG_MACVLAN=m CONFIG_MACVTAP=m +CONFIG_VXLAN=m CONFIG_NETCONSOLE=m CONFIG_NETCONSOLE_DYNAMIC=y CONFIG_NETPOLL=y @@ -1957,6 +2060,15 @@ CONFIG_ATM_SOLOS=m # # CAIF transport drivers # + +# +# Distributed Switch Architecture drivers +# +CONFIG_NET_DSA_MV88E6XXX=y +CONFIG_NET_DSA_MV88E6060=y +CONFIG_NET_DSA_MV88E6XXX_NEED_PPU=y +CONFIG_NET_DSA_MV88E6131=y +CONFIG_NET_DSA_MV88E6123_61_65=y CONFIG_ETHERNET=y CONFIG_MDIO=m CONFIG_NET_VENDOR_3COM=y @@ -1989,6 +2101,7 @@ CONFIG_TIGON3=m CONFIG_BNX2X=m CONFIG_NET_VENDOR_BROCADE=y CONFIG_BNA=m +CONFIG_NET_CALXEDA_XGMAC=m CONFIG_NET_VENDOR_CHELSIO=y CONFIG_CHELSIO_T1=m CONFIG_CHELSIO_T1_1G=y @@ -2034,11 +2147,14 @@ CONFIG_E1000=m CONFIG_E1000E=m CONFIG_IGB=m CONFIG_IGB_DCA=y +CONFIG_IGB_PTP=y CONFIG_IGBVF=m CONFIG_IXGB=m CONFIG_IXGBE=m +CONFIG_IXGBE_HWMON=y CONFIG_IXGBE_DCA=y CONFIG_IXGBE_DCB=y +CONFIG_IXGBE_PTP=y CONFIG_IXGBEVF=m CONFIG_NET_VENDOR_I825XX=y CONFIG_ZNET=m @@ -2052,6 +2168,7 @@ CONFIG_SKY2=m # CONFIG_SKY2_DEBUG is not set CONFIG_NET_VENDOR_MELLANOX=y CONFIG_MLX4_EN=m +CONFIG_MLX4_EN_DCB=y CONFIG_MLX4_CORE=m CONFIG_MLX4_DEBUG=y CONFIG_NET_VENDOR_MICREL=y @@ -2077,6 +2194,7 @@ CONFIG_NET_VENDOR_NVIDIA=y CONFIG_FORCEDETH=m CONFIG_NET_VENDOR_OKI=y CONFIG_PCH_GBE=m +CONFIG_PCH_PTP=y CONFIG_ETHOC=m # CONFIG_NET_PACKET_ENGINE is not set CONFIG_NET_VENDOR_QLOGIC=y @@ -2104,12 +2222,17 @@ CONFIG_SIS900=m CONFIG_SIS190=m CONFIG_SFC=m CONFIG_SFC_MTD=y +CONFIG_SFC_MCDI_MON=y +CONFIG_SFC_SRIOV=y +CONFIG_SFC_PTP=y CONFIG_NET_VENDOR_SMSC=y CONFIG_PCMCIA_SMC91C92=m CONFIG_EPIC100=m CONFIG_SMSC9420=m CONFIG_NET_VENDOR_STMICRO=y CONFIG_STMMAC_ETH=m +CONFIG_STMMAC_PLATFORM=y +# CONFIG_STMMAC_PCI is not set # CONFIG_STMMAC_DEBUG_FS is not set # CONFIG_STMMAC_DA is not set CONFIG_STMMAC_RING=y @@ -2127,6 +2250,12 @@ CONFIG_NET_VENDOR_VIA=y CONFIG_VIA_RHINE=m CONFIG_VIA_RHINE_MMIO=y CONFIG_VIA_VELOCITY=m +CONFIG_NET_VENDOR_WIZNET=y +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5300=m +# CONFIG_WIZNET_BUS_DIRECT is not set +# CONFIG_WIZNET_BUS_INDIRECT is not set +CONFIG_WIZNET_BUS_ANY=y CONFIG_NET_VENDOR_XIRCOM=y CONFIG_PCMCIA_XIRC2PS=m CONFIG_FDDI=m @@ -2142,6 +2271,8 @@ CONFIG_PHYLIB=y # # MII PHY device drivers # +CONFIG_AT803X_PHY=m +CONFIG_AMD_PHY=m CONFIG_MARVELL_PHY=m CONFIG_DAVICOM_PHY=m CONFIG_QSEMI_PHY=m @@ -2150,6 +2281,7 @@ CONFIG_CICADA_PHY=m CONFIG_VITESSE_PHY=m CONFIG_SMSC_PHY=m CONFIG_BROADCOM_PHY=m +CONFIG_BCM87XX_PHY=m CONFIG_ICPLUS_PHY=m CONFIG_REALTEK_PHY=m CONFIG_NATIONAL_PHY=m @@ -2159,6 +2291,7 @@ CONFIG_MICREL_PHY=m CONFIG_FIXED_PHY=y CONFIG_MDIO_BITBANG=m CONFIG_MDIO_GPIO=m +CONFIG_MICREL_KS8995MA=m CONFIG_PLIP=m CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m @@ -2168,6 +2301,7 @@ CONFIG_PPP_MPPE=m CONFIG_PPP_MULTILINK=y CONFIG_PPPOATM=m CONFIG_PPPOE=m +# CONFIG_PPTP is not set CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_SLIP=m @@ -2175,7 +2309,6 @@ CONFIG_SLHC=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y -# CONFIG_TR is not set # # USB Network Adapters @@ -2207,6 +2340,7 @@ CONFIG_USB_KC2190=y CONFIG_USB_NET_ZAURUS=m CONFIG_USB_NET_CX82310_ETH=m CONFIG_USB_NET_KALMIA=m +CONFIG_USB_NET_QMI_WWAN=m CONFIG_USB_HSO=m CONFIG_USB_NET_INT51X1=m CONFIG_USB_CDC_PHONET=m @@ -2242,6 +2376,7 @@ CONFIG_ATH5K=m CONFIG_ATH5K_PCI=y CONFIG_ATH9K_HW=m CONFIG_ATH9K_COMMON=m +CONFIG_ATH9K_BTCOEX_SUPPORT=y CONFIG_ATH9K=m CONFIG_ATH9K_PCI=y CONFIG_ATH9K_AHB=y @@ -2255,6 +2390,8 @@ CONFIG_CARL9170_LEDS=y CONFIG_CARL9170_WPC=y CONFIG_CARL9170_HWRNG=y CONFIG_ATH6KL=m +CONFIG_ATH6KL_SDIO=m +CONFIG_ATH6KL_USB=m # CONFIG_ATH6KL_DEBUG is not set CONFIG_B43=m CONFIG_B43_SSB=y @@ -2280,10 +2417,7 @@ CONFIG_B43LEGACY_PIO=y CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y # CONFIG_B43LEGACY_DMA_MODE is not set # CONFIG_B43LEGACY_PIO_MODE is not set -CONFIG_BRCMUTIL=m -CONFIG_BRCMSMAC=m # CONFIG_BRCMFMAC is not set -# CONFIG_BRCMDBG is not set CONFIG_HOSTAP=m CONFIG_HOSTAP_FIRMWARE=y CONFIG_HOSTAP_FIRMWARE_NVRAM=y @@ -2302,6 +2436,7 @@ CONFIG_IPW2200_QOS=y CONFIG_LIBIPW=m # CONFIG_LIBIPW_DEBUG is not set CONFIG_IWLWIFI=m +CONFIG_IWLDVM=m # # Debugging Options @@ -2309,20 +2444,18 @@ CONFIG_IWLWIFI=m # CONFIG_IWLWIFI_DEBUG is not set CONFIG_IWLWIFI_DEBUGFS=y # CONFIG_IWLWIFI_DEVICE_TRACING is not set -CONFIG_IWLWIFI_DEVICE_SVTOOL=y -CONFIG_IWLWIFI_LEGACY=m - -# -# Debugging Options -# -# CONFIG_IWLWIFI_LEGACY_DEBUG is not set -# CONFIG_IWLWIFI_LEGACY_DEBUGFS is not set -# CONFIG_IWLWIFI_LEGACY_DEVICE_TRACING is not set +CONFIG_IWLWIFI_DEVICE_TESTMODE=y +# CONFIG_IWLWIFI_P2P is not set +# CONFIG_IWLWIFI_EXPERIMENTAL_MFP is not set +CONFIG_IWLEGACY=m CONFIG_IWL4965=m CONFIG_IWL3945=m -CONFIG_IWM=m -# CONFIG_IWM_DEBUG is not set -# CONFIG_IWM_TRACING is not set + +# +# iwl3945 / iwl4965 Debugging Options +# +# CONFIG_IWLEGACY_DEBUG is not set +# CONFIG_IWLEGACY_DEBUGFS is not set CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m CONFIG_LIBERTAS_CS=m @@ -2371,28 +2504,30 @@ CONFIG_RTL8192SE=m CONFIG_RTL8192DE=m CONFIG_RTL8192CU=m CONFIG_RTLWIFI=m +# CONFIG_RTLWIFI_DEBUG is not set CONFIG_RTL8192C_COMMON=m +CONFIG_WL_TI=y CONFIG_WL1251=m CONFIG_WL1251_SPI=m CONFIG_WL1251_SDIO=m -CONFIG_WL12XX_MENU=m CONFIG_WL12XX=m -# CONFIG_WL12XX_SPI is not set -# CONFIG_WL12XX_SDIO is not set +CONFIG_WL18XX=m +CONFIG_WLCORE=m +CONFIG_WLCORE_SPI=m +CONFIG_WLCORE_SDIO=m CONFIG_WL12XX_PLATFORM_DATA=y CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m CONFIG_MWIFIEX_PCIE=m +CONFIG_MWIFIEX_USB=m # # WiMAX Wireless Broadband devices # CONFIG_WIMAX_I2400M=m CONFIG_WIMAX_I2400M_USB=m -CONFIG_WIMAX_I2400M_SDIO=m -CONFIG_WIMAX_IWMC3200_SDIO=y CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8 CONFIG_WAN=y CONFIG_LANMEDIA=m @@ -2417,6 +2552,11 @@ CONFIG_LAPBETHER=m CONFIG_X25_ASY=m CONFIG_SBNI=m CONFIG_SBNI_MULTILINE=y +CONFIG_IEEE802154_DRIVERS=m +CONFIG_IEEE802154_FAKEHARD=m +CONFIG_IEEE802154_FAKELB=m +CONFIG_IEEE802154_AT86RF230=m +CONFIG_IEEE802154_MRF24J40=m CONFIG_XEN_NETDEV_FRONTEND=m CONFIG_XEN_NETDEV_BACKEND=m # CONFIG_VMXNET3 is not set @@ -2551,9 +2691,6 @@ CONFIG_MISDN_NETJET=m CONFIG_MISDN_IPAC=m CONFIG_MISDN_ISAR=m CONFIG_ISDN_HDLC=m -CONFIG_PHONE=m -CONFIG_PHONE_IXJ=m -CONFIG_PHONE_IXJ_PCMCIA=m # # Input device support @@ -2562,6 +2699,7 @@ CONFIG_INPUT=y CONFIG_INPUT_FF_MEMLESS=m CONFIG_INPUT_POLLDEV=m CONFIG_INPUT_SPARSEKMAP=m +CONFIG_INPUT_MATRIXKMAP=m # # Userland interfaces @@ -2587,8 +2725,10 @@ CONFIG_KEYBOARD_QT2160=m CONFIG_KEYBOARD_GPIO=m CONFIG_KEYBOARD_GPIO_POLLED=m CONFIG_KEYBOARD_TCA6416=m +CONFIG_KEYBOARD_TCA8418=m CONFIG_KEYBOARD_MATRIX=m CONFIG_KEYBOARD_LM8323=m +CONFIG_KEYBOARD_LM8333=m CONFIG_KEYBOARD_MAX7359=m CONFIG_KEYBOARD_MCS=m CONFIG_KEYBOARD_MPR121=m @@ -2596,6 +2736,8 @@ CONFIG_KEYBOARD_NEWTON=m CONFIG_KEYBOARD_OPENCORES=m # CONFIG_KEYBOARD_STOWAWAY is not set CONFIG_KEYBOARD_SUNKBD=m +CONFIG_KEYBOARD_STMPE=m +CONFIG_KEYBOARD_OMAP4=m CONFIG_KEYBOARD_XTKBD=m CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y @@ -2613,6 +2755,7 @@ CONFIG_MOUSE_BCM5974=m CONFIG_MOUSE_VSXXXAA=m CONFIG_MOUSE_GPIO=m CONFIG_MOUSE_SYNAPTICS_I2C=m +CONFIG_MOUSE_SYNAPTICS_USB=m CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ANALOG=m CONFIG_JOYSTICK_A3D=m @@ -2658,24 +2801,34 @@ CONFIG_TOUCHSCREEN_AD7879=m CONFIG_TOUCHSCREEN_AD7879_I2C=m CONFIG_TOUCHSCREEN_AD7879_SPI=m CONFIG_TOUCHSCREEN_ATMEL_MXT=m +CONFIG_TOUCHSCREEN_AUO_PIXCIR=m CONFIG_TOUCHSCREEN_BU21013=m CONFIG_TOUCHSCREEN_CY8CTMG110=m +CONFIG_TOUCHSCREEN_CYTTSP_CORE=m +CONFIG_TOUCHSCREEN_CYTTSP_I2C=m +CONFIG_TOUCHSCREEN_CYTTSP_SPI=m +CONFIG_TOUCHSCREEN_DA9052=m CONFIG_TOUCHSCREEN_DYNAPRO=m CONFIG_TOUCHSCREEN_HAMPSHIRE=m CONFIG_TOUCHSCREEN_EETI=m CONFIG_TOUCHSCREEN_FUJITSU=m +CONFIG_TOUCHSCREEN_ILI210X=m CONFIG_TOUCHSCREEN_GUNZE=m CONFIG_TOUCHSCREEN_ELO=m CONFIG_TOUCHSCREEN_WACOM_W8001=m +CONFIG_TOUCHSCREEN_WACOM_I2C=m CONFIG_TOUCHSCREEN_MAX11801=m CONFIG_TOUCHSCREEN_MCS5000=m +CONFIG_TOUCHSCREEN_MMS114=m CONFIG_TOUCHSCREEN_MTOUCH=m CONFIG_TOUCHSCREEN_INEXIO=m CONFIG_TOUCHSCREEN_MK712=m CONFIG_TOUCHSCREEN_PENMOUNT=m +CONFIG_TOUCHSCREEN_EDT_FT5X06=m CONFIG_TOUCHSCREEN_TOUCHRIGHT=m CONFIG_TOUCHSCREEN_TOUCHWIN=m CONFIG_TOUCHSCREEN_UCB1400=m +CONFIG_TOUCHSCREEN_PIXCIR=m CONFIG_TOUCHSCREEN_WM97XX=m CONFIG_TOUCHSCREEN_WM9705=y CONFIG_TOUCHSCREEN_WM9712=y @@ -2694,16 +2847,19 @@ CONFIG_TOUCHSCREEN_USB_IDEALTEK=y CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH=y CONFIG_TOUCHSCREEN_USB_GOTOP=y CONFIG_TOUCHSCREEN_USB_JASTEC=y +CONFIG_TOUCHSCREEN_USB_ELO=y CONFIG_TOUCHSCREEN_USB_E2I=y CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y +CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y CONFIG_TOUCHSCREEN_TOUCHIT213=m CONFIG_TOUCHSCREEN_TSC_SERIO=m CONFIG_TOUCHSCREEN_TSC2005=m CONFIG_TOUCHSCREEN_TSC2007=m CONFIG_TOUCHSCREEN_PCAP=m CONFIG_TOUCHSCREEN_ST1232=m +CONFIG_TOUCHSCREEN_STMPE=m CONFIG_TOUCHSCREEN_TPS6507X=m CONFIG_INPUT_MISC=y CONFIG_INPUT_AD714X=m @@ -2715,6 +2871,8 @@ CONFIG_INPUT_MC13783_PWRBUTTON=m CONFIG_INPUT_MMA8450=m CONFIG_INPUT_MPU3050=m CONFIG_INPUT_APANEL=m +CONFIG_INPUT_GP2A=m +CONFIG_INPUT_GPIO_TILT_POLLED=m CONFIG_INPUT_ATLAS_BTNS=m CONFIG_INPUT_ATI_REMOTE2=m CONFIG_INPUT_KEYSPAN_REMOTE=m @@ -2726,13 +2884,14 @@ CONFIG_INPUT_CM109=m CONFIG_INPUT_UINPUT=m CONFIG_INPUT_PCF8574=m CONFIG_INPUT_GPIO_ROTARY_ENCODER=m +CONFIG_INPUT_DA9052_ONKEY=m CONFIG_INPUT_PCAP=m CONFIG_INPUT_ADXL34X=m CONFIG_INPUT_ADXL34X_I2C=m CONFIG_INPUT_ADXL34X_SPI=m CONFIG_INPUT_CMA3000=m CONFIG_INPUT_CMA3000_I2C=m -CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m +CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y # # Hardware I/O ports @@ -2787,9 +2946,9 @@ CONFIG_STALDRV=y # Serial drivers # CONFIG_SERIAL_8250=m +CONFIG_SERIAL_8250_PNP=y CONFIG_FIX_EARLYCON_MEM=y CONFIG_SERIAL_8250_PCI=m -CONFIG_SERIAL_8250_PNP=m CONFIG_SERIAL_8250_CS=m CONFIG_SERIAL_8250_NR_UARTS=16 CONFIG_SERIAL_8250_RUNTIME_UARTS=8 @@ -2799,12 +2958,13 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=8 # Non-8250 serial port support # # CONFIG_SERIAL_MAX3100 is not set -# CONFIG_SERIAL_MAX3107 is not set +# CONFIG_SERIAL_MAX310X is not set # CONFIG_SERIAL_MRST_MAX3110 is not set # CONFIG_SERIAL_MFD_HSU is not set CONFIG_SERIAL_UARTLITE=m CONFIG_SERIAL_CORE=m CONFIG_SERIAL_JSM=m +CONFIG_SERIAL_SCCNXP=m CONFIG_SERIAL_TIMBERDALE=m CONFIG_SERIAL_ALTERA_JTAGUART=m CONFIG_SERIAL_ALTERA_UART=m @@ -2819,6 +2979,7 @@ CONFIG_PPDEV=m CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y +CONFIG_HVC_XEN_FRONTEND=y CONFIG_VIRTIO_CONSOLE=m CONFIG_IPMI_HANDLER=m CONFIG_IPMI_PANIC_EVENT=y @@ -2833,6 +2994,7 @@ CONFIG_HW_RANDOM_INTEL=m CONFIG_HW_RANDOM_AMD=m CONFIG_HW_RANDOM_VIA=m CONFIG_HW_RANDOM_VIRTIO=m +CONFIG_HW_RANDOM_TPM=m CONFIG_NVRAM=y CONFIG_R3964=m CONFIG_APPLICOM=m @@ -2851,12 +3013,12 @@ CONFIG_MAX_RAW_DEVS=4096 CONFIG_HANGCHECK_TIMER=m CONFIG_TCG_TPM=m CONFIG_TCG_TIS=m +CONFIG_TCG_TIS_I2C_INFINEON=m CONFIG_TCG_NSC=m CONFIG_TCG_ATMEL=m CONFIG_TCG_INFINEON=m CONFIG_TELCLOCK=m CONFIG_DEVPORT=y -CONFIG_RAMOOPS=y CONFIG_I2C=m CONFIG_I2C_BOARDINFO=y CONFIG_I2C_COMPAT=y @@ -2908,6 +3070,7 @@ CONFIG_I2C_SCMI=m # CONFIG_I2C_DESIGNWARE_CORE=m CONFIG_I2C_DESIGNWARE_PCI=m +CONFIG_I2C_EG20T=m CONFIG_I2C_GPIO=m CONFIG_I2C_INTEL_MID=m CONFIG_I2C_OCORES=m @@ -2915,7 +3078,6 @@ CONFIG_I2C_PCA_PLATFORM=m # CONFIG_I2C_PXA_PCI is not set # CONFIG_I2C_SIMTEC is not set # CONFIG_I2C_XILINX is not set -CONFIG_I2C_EG20T=m # # External I2C/SMBus adapter drivers @@ -2947,7 +3109,9 @@ CONFIG_SPI_GPIO=m CONFIG_SPI_LM70_LLP=m CONFIG_SPI_OC_TINY=m # CONFIG_SPI_PXA2XX_PCI is not set +CONFIG_SPI_SC18IS602=m CONFIG_SPI_TOPCLIFF_PCH=m +CONFIG_SPI_XCOMM=m CONFIG_SPI_XILINX=m CONFIG_SPI_DESIGNWARE=y CONFIG_SPI_DW_PCI=m @@ -2958,6 +3122,13 @@ CONFIG_SPI_DW_PCI=m # CONFIG_SPI_SPIDEV=m CONFIG_SPI_TLE62X0=m +CONFIG_HSI=m +CONFIG_HSI_BOARDINFO=y + +# +# HSI clients +# +CONFIG_HSI_CHAR=m # # PPS support @@ -2980,12 +3151,18 @@ CONFIG_PPS_CLIENT_GPIO=m # # PTP clock support # -# CONFIG_PTP_1588_CLOCK is not set +CONFIG_PTP_1588_CLOCK=m + +# +# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks. +# +CONFIG_PTP_1588_CLOCK_PCH=m CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_GPIOLIB=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y CONFIG_GPIO_GENERIC=m +CONFIG_GPIO_DA9052=m CONFIG_GPIO_MAX730X=m # @@ -2994,15 +3171,18 @@ CONFIG_GPIO_MAX730X=m CONFIG_GPIO_GENERIC_PLATFORM=m CONFIG_GPIO_IT8761E=m CONFIG_GPIO_SCH=m +CONFIG_GPIO_ICH=m CONFIG_GPIO_VX855=m # # I2C GPIO expanders: # +CONFIG_GPIO_ARIZONA=m CONFIG_GPIO_MAX7300=m CONFIG_GPIO_MAX732X=m CONFIG_GPIO_PCA953X=m CONFIG_GPIO_PCF857X=m +CONFIG_GPIO_STMPE=y CONFIG_GPIO_TPS65912=m CONFIG_GPIO_ADP5588=m @@ -3010,6 +3190,7 @@ CONFIG_GPIO_ADP5588=m # PCI GPIO expanders: # CONFIG_GPIO_CS5535=m +CONFIG_GPIO_AMD8111=m CONFIG_GPIO_LANGWELL=y CONFIG_GPIO_PCH=m CONFIG_GPIO_ML_IOH=m @@ -3044,6 +3225,7 @@ CONFIG_W1_MASTER_DS2490=m CONFIG_W1_MASTER_DS2482=m # CONFIG_W1_MASTER_DS1WM is not set CONFIG_W1_MASTER_GPIO=m +CONFIG_HDQ_MASTER_OMAP=m # # 1-wire Slaves @@ -3057,23 +3239,32 @@ CONFIG_W1_SLAVE_DS2433=m CONFIG_W1_SLAVE_DS2433_CRC=y CONFIG_W1_SLAVE_DS2760=m # CONFIG_W1_SLAVE_DS2780 is not set +CONFIG_W1_SLAVE_DS2781=m +CONFIG_W1_SLAVE_DS28E04=m CONFIG_W1_SLAVE_BQ27000=m CONFIG_POWER_SUPPLY=y # CONFIG_POWER_SUPPLY_DEBUG is not set CONFIG_PDA_POWER=m +CONFIG_GENERIC_ADC_BATTERY=m # CONFIG_TEST_POWER is not set CONFIG_BATTERY_DS2760=m # CONFIG_BATTERY_DS2780 is not set +CONFIG_BATTERY_DS2781=m CONFIG_BATTERY_DS2782=m -CONFIG_BATTERY_BQ20Z75=m +CONFIG_BATTERY_SBS=m CONFIG_BATTERY_BQ27x00=m CONFIG_BATTERY_BQ27X00_I2C=y CONFIG_BATTERY_BQ27X00_PLATFORM=y +CONFIG_BATTERY_DA9052=m CONFIG_BATTERY_MAX17040=m CONFIG_BATTERY_MAX17042=m CONFIG_CHARGER_ISP1704=m CONFIG_CHARGER_MAX8903=m +CONFIG_CHARGER_LP8727=m CONFIG_CHARGER_GPIO=m +CONFIG_CHARGER_MANAGER=y +CONFIG_CHARGER_SMB347=m +# CONFIG_POWER_AVS is not set CONFIG_HWMON=m CONFIG_HWMON_VID=m # CONFIG_HWMON_DEBUG_CHIP is not set @@ -3093,6 +3284,7 @@ CONFIG_SENSORS_ADM1026=m CONFIG_SENSORS_ADM1029=m CONFIG_SENSORS_ADM1031=m CONFIG_SENSORS_ADM9240=m +CONFIG_SENSORS_ADT7410=m CONFIG_SENSORS_ADT7411=m CONFIG_SENSORS_ADT7462=m CONFIG_SENSORS_ADT7470=m @@ -3105,6 +3297,7 @@ CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_ATXP1=m CONFIG_SENSORS_DS620=m CONFIG_SENSORS_DS1621=m +CONFIG_SENSORS_DA9052_ADC=m CONFIG_SENSORS_I5K_AMB=m CONFIG_SENSORS_F71805F=m CONFIG_SENSORS_F71882FG=m @@ -3114,6 +3307,7 @@ CONFIG_SENSORS_G760A=m CONFIG_SENSORS_GL518SM=m CONFIG_SENSORS_GL520SM=m CONFIG_SENSORS_GPIO_FAN=m +CONFIG_SENSORS_HIH6130=m CONFIG_SENSORS_CORETEMP=m CONFIG_SENSORS_IBMAEM=m CONFIG_SENSORS_IBMPEX=m @@ -3143,9 +3337,11 @@ CONFIG_SENSORS_MAX1111=m CONFIG_SENSORS_MAX16065=m CONFIG_SENSORS_MAX1619=m CONFIG_SENSORS_MAX1668=m +CONFIG_SENSORS_MAX197=m CONFIG_SENSORS_MAX6639=m CONFIG_SENSORS_MAX6642=m CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_MCP3021=m CONFIG_SENSORS_NTC_THERMISTOR=m CONFIG_SENSORS_PC87360=m CONFIG_SENSORS_PC87427=m @@ -3179,6 +3375,7 @@ CONFIG_SENSORS_ADS1015=m CONFIG_SENSORS_ADS7828=m CONFIG_SENSORS_ADS7871=m CONFIG_SENSORS_AMC6821=m +CONFIG_SENSORS_INA2XX=m CONFIG_SENSORS_THMC50=m CONFIG_SENSORS_TMP102=m CONFIG_SENSORS_TMP401=m @@ -3205,8 +3402,8 @@ CONFIG_SENSORS_MC13783_ADC=m # CONFIG_SENSORS_ACPI_POWER=m CONFIG_SENSORS_ATK0110=m -CONFIG_THERMAL=m -CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL=y +# CONFIG_CPU_THERMAL is not set CONFIG_WATCHDOG=y CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set @@ -3215,6 +3412,7 @@ CONFIG_WATCHDOG_CORE=y # Watchdog Device Drivers # CONFIG_SOFT_WATCHDOG=m +CONFIG_DA9052_WATCHDOG=m CONFIG_ACQUIRE_WDT=m CONFIG_ADVANTECH_WDT=m CONFIG_ALIM1535_WDT=m @@ -3229,6 +3427,7 @@ CONFIG_IB700_WDT=m CONFIG_IBMASR=m CONFIG_WAFER_WDT=m CONFIG_I6300ESB_WDT=m +CONFIG_IE6XX_WDT=m CONFIG_ITCO_WDT=m CONFIG_ITCO_VENDOR_SUPPORT=y CONFIG_IT8712F_WDT=m @@ -3243,6 +3442,7 @@ CONFIG_SBC8360_WDT=m CONFIG_CPU5_WDT=m CONFIG_SMSC_SCH311X_WDT=m CONFIG_SMSC37B787_WDT=m +CONFIG_VIA_WDT=m CONFIG_W83627HF_WDT=m CONFIG_W83697HF_WDT=m CONFIG_W83697UG_WDT=m @@ -3295,22 +3495,39 @@ CONFIG_MFD_SM501=m CONFIG_MFD_SM501_GPIO=y CONFIG_HTC_PASIC3=m CONFIG_UCB1400_CORE=m +CONFIG_MFD_LM3533=m CONFIG_TPS6105X=m CONFIG_TPS65010=m CONFIG_TPS6507X=m +CONFIG_MFD_TPS65217=m CONFIG_MFD_TPS65912=y CONFIG_MFD_TPS65912_SPI=y +CONFIG_MFD_STMPE=y + +# +# STMPE Interface Drivers +# +CONFIG_STMPE_SPI=y # CONFIG_MFD_TMIO is not set -CONFIG_MFD_WM8400=m +CONFIG_PMIC_DA9052=y +CONFIG_MFD_DA9052_SPI=y +CONFIG_MFD_ARIZONA=y +CONFIG_MFD_ARIZONA_I2C=m +CONFIG_MFD_ARIZONA_SPI=m +# CONFIG_MFD_WM5102 is not set +# CONFIG_MFD_WM5110 is not set # CONFIG_MFD_WM831X_SPI is not set # CONFIG_MFD_PCF50633 is not set CONFIG_MFD_MC13783=m CONFIG_MFD_MC13XXX=m +CONFIG_MFD_MC13XXX_SPI=m +CONFIG_MFD_MC13XXX_I2C=m # CONFIG_ABX500_CORE is not set CONFIG_EZX_PCAP=y CONFIG_MFD_CS5535=m CONFIG_MFD_TIMBERDALE=m CONFIG_LPC_SCH=m +CONFIG_LPC_ICH=m CONFIG_MFD_RDC321X=m CONFIG_MFD_JANZ_CMODIO=m CONFIG_MFD_VX855=m @@ -3322,53 +3539,74 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=m CONFIG_REGULATOR_VIRTUAL_CONSUMER=m CONFIG_REGULATOR_USERSPACE_CONSUMER=m CONFIG_REGULATOR_GPIO=m -CONFIG_REGULATOR_BQ24022=m +CONFIG_REGULATOR_AD5398=m +CONFIG_REGULATOR_ARIZONA=m +CONFIG_REGULATOR_DA9052=m +CONFIG_REGULATOR_FAN53555=m +CONFIG_REGULATOR_MC13XXX_CORE=m +CONFIG_REGULATOR_MC13783=m +CONFIG_REGULATOR_MC13892=m +CONFIG_REGULATOR_ISL6271A=m CONFIG_REGULATOR_MAX1586=m CONFIG_REGULATOR_MAX8649=m CONFIG_REGULATOR_MAX8660=m CONFIG_REGULATOR_MAX8952=m -CONFIG_REGULATOR_WM8400=m +CONFIG_REGULATOR_PCAP=m CONFIG_REGULATOR_LP3971=m CONFIG_REGULATOR_LP3972=m -CONFIG_REGULATOR_PCAP=m -CONFIG_REGULATOR_MC13XXX_CORE=m -CONFIG_REGULATOR_MC13783=m -CONFIG_REGULATOR_MC13892=m CONFIG_REGULATOR_TPS6105X=m +CONFIG_REGULATOR_TPS62360=m CONFIG_REGULATOR_TPS65023=m CONFIG_REGULATOR_TPS6507X=m -CONFIG_REGULATOR_TPS65912=m -CONFIG_REGULATOR_ISL6271A=m -CONFIG_REGULATOR_AD5398=m +CONFIG_REGULATOR_TPS65217=m CONFIG_REGULATOR_TPS6524X=m +CONFIG_REGULATOR_TPS65912=m CONFIG_MEDIA_SUPPORT=m # # Multimedia core support # +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_RC_SUPPORT=y # CONFIG_MEDIA_CONTROLLER is not set CONFIG_VIDEO_DEV=m -CONFIG_VIDEO_V4L2_COMMON=m +CONFIG_VIDEO_V4L2=m +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_DMA_SG=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_VIDEOBUF_DVB=m +CONFIG_VIDEOBUF2_CORE=m +CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m +CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_DVB_CORE=m CONFIG_DVB_NET=y -CONFIG_VIDEO_MEDIA=m +CONFIG_DVB_MAX_ADAPTERS=8 +CONFIG_DVB_DYNAMIC_MINORS=y # -# Multimedia drivers +# Media drivers # -CONFIG_VIDEO_SAA7146=m -CONFIG_VIDEO_SAA7146_VV=m CONFIG_RC_CORE=m -CONFIG_LIRC=m CONFIG_RC_MAP=m +CONFIG_RC_DECODERS=y +CONFIG_LIRC=m +CONFIG_IR_LIRC_CODEC=m CONFIG_IR_NEC_DECODER=m CONFIG_IR_RC5_DECODER=m CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_RC5_SZ_DECODER=m +CONFIG_IR_SANYO_DECODER=m CONFIG_IR_MCE_KBD_DECODER=m -CONFIG_IR_LIRC_CODEC=m +CONFIG_RC_DEVICES=y CONFIG_RC_ATI_REMOTE=m # CONFIG_IR_ENE is not set CONFIG_IR_IMON=m @@ -3379,181 +3617,15 @@ CONFIG_IR_NUVOTON=m CONFIG_IR_REDRAT3=m CONFIG_IR_STREAMZAP=m CONFIG_IR_WINBOND_CIR=m +CONFIG_IR_IGUANA=m +CONFIG_IR_TTUSBIR=m CONFIG_RC_LOOPBACK=m -CONFIG_MEDIA_ATTACH=y -CONFIG_MEDIA_TUNER=m -# CONFIG_MEDIA_TUNER_CUSTOMISE is not set -CONFIG_MEDIA_TUNER_SIMPLE=m -CONFIG_MEDIA_TUNER_TDA8290=m -CONFIG_MEDIA_TUNER_TDA827X=m -CONFIG_MEDIA_TUNER_TDA18271=m -CONFIG_MEDIA_TUNER_TDA9887=m -CONFIG_MEDIA_TUNER_TEA5761=m -CONFIG_MEDIA_TUNER_TEA5767=m -CONFIG_MEDIA_TUNER_MT20XX=m -CONFIG_MEDIA_TUNER_MT2060=m -CONFIG_MEDIA_TUNER_MT2266=m -CONFIG_MEDIA_TUNER_MT2131=m -CONFIG_MEDIA_TUNER_QT1010=m -CONFIG_MEDIA_TUNER_XC2028=m -CONFIG_MEDIA_TUNER_XC5000=m -CONFIG_MEDIA_TUNER_XC4000=m -CONFIG_MEDIA_TUNER_MXL5005S=m -CONFIG_MEDIA_TUNER_MXL5007T=m -CONFIG_MEDIA_TUNER_MC44S803=m -CONFIG_MEDIA_TUNER_MAX2165=m -CONFIG_MEDIA_TUNER_TDA18218=m -CONFIG_MEDIA_TUNER_TDA18212=m -CONFIG_VIDEO_V4L2=m -CONFIG_VIDEOBUF_GEN=m -CONFIG_VIDEOBUF_DMA_SG=m -CONFIG_VIDEOBUF_VMALLOC=m -CONFIG_VIDEOBUF_DMA_CONTIG=m -CONFIG_VIDEOBUF_DVB=m -CONFIG_VIDEO_BTCX=m -CONFIG_VIDEO_TVEEPROM=m -CONFIG_VIDEO_TUNER=m -CONFIG_VIDEOBUF2_CORE=m -CONFIG_VIDEOBUF2_MEMOPS=m -CONFIG_VIDEOBUF2_DMA_CONTIG=m -CONFIG_VIDEOBUF2_VMALLOC=m -CONFIG_VIDEO_CAPTURE_DRIVERS=y -# CONFIG_VIDEO_ADV_DEBUG is not set -# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set -CONFIG_VIDEO_HELPER_CHIPS_AUTO=y -CONFIG_VIDEO_IR_I2C=m +CONFIG_IR_GPIO_CIR=m +CONFIG_MEDIA_USB_SUPPORT=y # -# Audio decoders, processors and mixers +# Webcam devices # -CONFIG_VIDEO_TVAUDIO=m -CONFIG_VIDEO_TDA7432=m -CONFIG_VIDEO_TDA9840=m -CONFIG_VIDEO_TEA6415C=m -CONFIG_VIDEO_TEA6420=m -CONFIG_VIDEO_MSP3400=m -CONFIG_VIDEO_CS5345=m -CONFIG_VIDEO_CS53L32A=m -CONFIG_VIDEO_WM8775=m -CONFIG_VIDEO_WM8739=m -CONFIG_VIDEO_VP27SMPX=m - -# -# RDS decoders -# -CONFIG_VIDEO_SAA6588=m - -# -# Video decoders -# -CONFIG_VIDEO_ADV7180=m -CONFIG_VIDEO_BT819=m -CONFIG_VIDEO_BT856=m -CONFIG_VIDEO_BT866=m -CONFIG_VIDEO_KS0127=m -CONFIG_VIDEO_SAA7110=m -CONFIG_VIDEO_SAA711X=m -CONFIG_VIDEO_TVP5150=m -CONFIG_VIDEO_VPX3220=m - -# -# Video and audio decoders -# -CONFIG_VIDEO_SAA717X=m -CONFIG_VIDEO_CX25840=m - -# -# MPEG video encoders -# -CONFIG_VIDEO_CX2341X=m - -# -# Video encoders -# -CONFIG_VIDEO_SAA7127=m -CONFIG_VIDEO_SAA7185=m -CONFIG_VIDEO_ADV7170=m -CONFIG_VIDEO_ADV7175=m - -# -# Camera sensor devices -# -CONFIG_VIDEO_OV7670=m -CONFIG_VIDEO_MT9V011=m - -# -# Flash devices -# - -# -# Video improvement chips -# -CONFIG_VIDEO_UPD64031A=m -CONFIG_VIDEO_UPD64083=m - -# -# Miscelaneous helper chips -# -CONFIG_VIDEO_M52790=m -CONFIG_VIDEO_VIVI=m -CONFIG_VIDEO_BT848=m -CONFIG_VIDEO_BT848_DVB=y -CONFIG_VIDEO_BWQCAM=m -CONFIG_VIDEO_CQCAM=m -CONFIG_VIDEO_W9966=m -CONFIG_VIDEO_CPIA2=m -CONFIG_VIDEO_ZORAN=m -CONFIG_VIDEO_ZORAN_DC30=m -CONFIG_VIDEO_ZORAN_ZR36060=m -CONFIG_VIDEO_ZORAN_BUZ=m -CONFIG_VIDEO_ZORAN_DC10=m -CONFIG_VIDEO_ZORAN_LML33=m -CONFIG_VIDEO_ZORAN_LML33R10=m -CONFIG_VIDEO_ZORAN_AVS6EYES=m -CONFIG_VIDEO_MEYE=m -CONFIG_VIDEO_SAA7134=m -CONFIG_VIDEO_SAA7134_ALSA=m -CONFIG_VIDEO_SAA7134_RC=y -CONFIG_VIDEO_SAA7134_DVB=m -CONFIG_VIDEO_MXB=m -CONFIG_VIDEO_HEXIUM_ORION=m -CONFIG_VIDEO_HEXIUM_GEMINI=m -CONFIG_VIDEO_TIMBERDALE=m -CONFIG_VIDEO_CX88=m -CONFIG_VIDEO_CX88_ALSA=m -CONFIG_VIDEO_CX88_BLACKBIRD=m -CONFIG_VIDEO_CX88_DVB=m -CONFIG_VIDEO_CX88_MPEG=m -CONFIG_VIDEO_CX88_VP3054=m -CONFIG_VIDEO_CX23885=m -CONFIG_MEDIA_ALTERA_CI=m -CONFIG_VIDEO_CX25821=m -CONFIG_VIDEO_CX25821_ALSA=m -CONFIG_VIDEO_AU0828=m -CONFIG_VIDEO_IVTV=m -CONFIG_VIDEO_FB_IVTV=m -CONFIG_VIDEO_CX18=m -CONFIG_VIDEO_CX18_ALSA=m -CONFIG_VIDEO_SAA7164=m -CONFIG_VIDEO_CAFE_CCIC=m -CONFIG_VIDEO_VIA_CAMERA=m -CONFIG_SOC_CAMERA=m -CONFIG_SOC_CAMERA_IMX074=m -CONFIG_SOC_CAMERA_MT9M001=m -CONFIG_SOC_CAMERA_MT9M111=m -CONFIG_SOC_CAMERA_MT9T031=m -CONFIG_SOC_CAMERA_MT9T112=m -CONFIG_SOC_CAMERA_MT9V022=m -CONFIG_SOC_CAMERA_RJ54N1=m -CONFIG_SOC_CAMERA_TW9910=m -CONFIG_SOC_CAMERA_PLATFORM=m -CONFIG_SOC_CAMERA_OV2640=m -CONFIG_SOC_CAMERA_OV5642=m -CONFIG_SOC_CAMERA_OV6650=m -CONFIG_SOC_CAMERA_OV772X=m -CONFIG_SOC_CAMERA_OV9640=m -CONFIG_SOC_CAMERA_OV9740=m -CONFIG_V4L_USB_DRIVERS=y CONFIG_USB_VIDEO_CLASS=m CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y CONFIG_USB_GSPCA=m @@ -3566,6 +3638,7 @@ CONFIG_USB_GSPCA_CPIA1=m CONFIG_USB_GSPCA_ETOMS=m CONFIG_USB_GSPCA_FINEPIX=m CONFIG_USB_GSPCA_JEILINJ=m +CONFIG_USB_GSPCA_JL2005BCD=m CONFIG_USB_GSPCA_KINECT=m CONFIG_USB_GSPCA_KONICA=m CONFIG_USB_GSPCA_MARS=m @@ -3602,16 +3675,32 @@ CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m CONFIG_USB_GSPCA_XIRLINK_CIT=m CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_PWC_INPUT_EVDEV=y +CONFIG_VIDEO_CPIA2=m +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +CONFIG_USB_SN9C102=m + +# +# Analog TV USB devices +# +CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_PVRUSB2=m CONFIG_VIDEO_PVRUSB2_SYSFS=y CONFIG_VIDEO_PVRUSB2_DVB=y # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set CONFIG_VIDEO_HDPVR=m -CONFIG_VIDEO_EM28XX=m -CONFIG_VIDEO_EM28XX_ALSA=m -CONFIG_VIDEO_EM28XX_DVB=m -CONFIG_VIDEO_EM28XX_RC=y CONFIG_VIDEO_TLG2300=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_STK1160=m +# CONFIG_VIDEO_STK1160_AC97 is not set + +# +# Analog/digital TV USB devices +# CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m @@ -3619,53 +3708,9 @@ CONFIG_VIDEO_CX231XX_DVB=m CONFIG_VIDEO_TM6000=m CONFIG_VIDEO_TM6000_ALSA=m CONFIG_VIDEO_TM6000_DVB=m -CONFIG_VIDEO_USBVISION=m -CONFIG_USB_ET61X251=m -CONFIG_USB_SN9C102=m -CONFIG_USB_PWC=m -# CONFIG_USB_PWC_DEBUG is not set -CONFIG_USB_PWC_INPUT_EVDEV=y -CONFIG_USB_ZR364XX=m -CONFIG_USB_STKWEBCAM=m -CONFIG_USB_S2255=m -# CONFIG_V4L_MEM2MEM_DRIVERS is not set -CONFIG_RADIO_ADAPTERS=y -CONFIG_RADIO_MAXIRADIO=m -CONFIG_I2C_SI4713=m -CONFIG_RADIO_SI4713=m -CONFIG_USB_DSBR=m -CONFIG_RADIO_SI470X=y -CONFIG_USB_SI470X=m -CONFIG_I2C_SI470X=m -CONFIG_USB_MR800=m -CONFIG_RADIO_TEA5764=m -CONFIG_RADIO_SAA7706H=m -CONFIG_RADIO_TEF6862=m -CONFIG_RADIO_TIMBERDALE=m -CONFIG_RADIO_WL1273=m # -# Texas Instruments WL128x FM driver (ST based) -# -CONFIG_RADIO_WL128X=m -CONFIG_DVB_MAX_ADAPTERS=8 -CONFIG_DVB_DYNAMIC_MINORS=y -CONFIG_DVB_CAPTURE_DRIVERS=y - -# -# Supported SAA7146 based PCI Adapters -# -CONFIG_TTPCI_EEPROM=m -CONFIG_DVB_AV7110=m -CONFIG_DVB_AV7110_OSD=y -CONFIG_DVB_BUDGET_CORE=m -CONFIG_DVB_BUDGET=m -CONFIG_DVB_BUDGET_CI=m -CONFIG_DVB_BUDGET_AV=m -CONFIG_DVB_BUDGET_PATCH=m - -# -# Supported USB Adapters +# Digital TV USB devices # CONFIG_DVB_USB=m # CONFIG_DVB_USB_DEBUG is not set @@ -3677,8 +3722,6 @@ CONFIG_DVB_USB_DIB0700=m CONFIG_DVB_USB_UMT_010=m CONFIG_DVB_USB_CXUSB=m CONFIG_DVB_USB_M920X=m -CONFIG_DVB_USB_GL861=m -CONFIG_DVB_USB_AU6610=m CONFIG_DVB_USB_DIGITV=m CONFIG_DVB_USB_VP7045=m CONFIG_DVB_USB_VP702X=m @@ -3692,82 +3735,260 @@ CONFIG_DVB_USB_AF9005_REMOTE=m CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m -CONFIG_DVB_USB_ANYSEE=m CONFIG_DVB_USB_DTV5100=m -CONFIG_DVB_USB_AF9015=m -CONFIG_DVB_USB_CE6230=m CONFIG_DVB_USB_FRIIO=m -CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_AZ6027=m -CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_CYPRESS_FIRMWARE=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m CONFIG_DVB_USB_IT913X=m +CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m -CONFIG_SMS_SIANO_MDTV=m - -# -# Siano module components -# CONFIG_SMS_USB_DRV=m -CONFIG_SMS_SDIO_DRV=m - -# -# Supported FlexCopII (B2C2) Adapters -# -CONFIG_DVB_B2C2_FLEXCOP=m -CONFIG_DVB_B2C2_FLEXCOP_PCI=m CONFIG_DVB_B2C2_FLEXCOP_USB=m -# CONFIG_DVB_B2C2_FLEXCOP_DEBUG is not set +# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set # -# Supported BT878 Adapters +# Webcam, TV (analog/digital) USB devices # +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=m +CONFIG_MEDIA_PCI_SUPPORT=y + +# +# Media capture support +# +CONFIG_VIDEO_MEYE=m + +# +# Media capture/analog TV support +# +CONFIG_VIDEO_IVTV=m +CONFIG_VIDEO_IVTV_ALSA=m +CONFIG_VIDEO_FB_IVTV=m +CONFIG_VIDEO_ZORAN=m +CONFIG_VIDEO_ZORAN_DC30=m +CONFIG_VIDEO_ZORAN_ZR36060=m +CONFIG_VIDEO_ZORAN_BUZ=m +CONFIG_VIDEO_ZORAN_DC10=m +CONFIG_VIDEO_ZORAN_LML33=m +CONFIG_VIDEO_ZORAN_LML33R10=m +CONFIG_VIDEO_ZORAN_AVS6EYES=m +CONFIG_VIDEO_HEXIUM_GEMINI=m +CONFIG_VIDEO_HEXIUM_ORION=m +CONFIG_VIDEO_MXB=m + +# +# Media capture/analog/hybrid TV support +# +CONFIG_VIDEO_CX18=m +CONFIG_VIDEO_CX18_ALSA=m +CONFIG_VIDEO_CX23885=m +CONFIG_MEDIA_ALTERA_CI=m +CONFIG_VIDEO_CX25821=m +CONFIG_VIDEO_CX25821_ALSA=m +CONFIG_VIDEO_CX88=m +CONFIG_VIDEO_CX88_ALSA=m +CONFIG_VIDEO_CX88_BLACKBIRD=m +CONFIG_VIDEO_CX88_DVB=m +CONFIG_VIDEO_CX88_VP3054=m +CONFIG_VIDEO_CX88_MPEG=m +CONFIG_VIDEO_BT848=m CONFIG_DVB_BT8XX=m +CONFIG_VIDEO_SAA7134=m +CONFIG_VIDEO_SAA7134_ALSA=m +CONFIG_VIDEO_SAA7134_RC=y +CONFIG_VIDEO_SAA7134_DVB=m +CONFIG_VIDEO_SAA7164=m # -# Supported Pluto2 Adapters +# Media digital TV PCI Adapters # +CONFIG_TTPCI_EEPROM=m +CONFIG_DVB_AV7110=m +CONFIG_DVB_AV7110_OSD=y +CONFIG_DVB_BUDGET_CORE=m +CONFIG_DVB_BUDGET=m +CONFIG_DVB_BUDGET_CI=m +CONFIG_DVB_BUDGET_AV=m +CONFIG_DVB_BUDGET_PATCH=m +CONFIG_DVB_B2C2_FLEXCOP_PCI=m +# CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set CONFIG_DVB_PLUTO2=m +CONFIG_DVB_DM1105=m +CONFIG_DVB_PT1=m +CONFIG_MANTIS_CORE=m +CONFIG_DVB_MANTIS=m +CONFIG_DVB_HOPPER=m +CONFIG_DVB_NGENE=m +CONFIG_DVB_DDBRIDGE=m +# CONFIG_V4L_PLATFORM_DRIVERS is not set +# CONFIG_V4L_MEM2MEM_DRIVERS is not set +# CONFIG_V4L_TEST_DRIVERS is not set # -# Supported SDMC DM1105 Adapters +# Supported MMC/SDIO adapters # -CONFIG_DVB_DM1105=m +CONFIG_SMS_SDIO_DRV=m +# CONFIG_MEDIA_PARPORT_SUPPORT is not set +CONFIG_RADIO_ADAPTERS=y +CONFIG_RADIO_SI470X=y +CONFIG_USB_SI470X=m +CONFIG_I2C_SI470X=m +CONFIG_USB_MR800=m +CONFIG_USB_DSBR=m +CONFIG_RADIO_MAXIRADIO=m +CONFIG_RADIO_SHARK=m +CONFIG_RADIO_SHARK2=m +CONFIG_I2C_SI4713=m +CONFIG_RADIO_SI4713=m +CONFIG_USB_KEENE=m +CONFIG_RADIO_TEA5764=m +CONFIG_RADIO_SAA7706H=m +CONFIG_RADIO_TEF6862=m +CONFIG_RADIO_TIMBERDALE=m +CONFIG_RADIO_WL1273=m + +# +# Texas Instruments WL128x FM driver (ST based) +# +CONFIG_RADIO_WL128X=m # # Supported FireWire (IEEE 1394) Adapters # CONFIG_DVB_FIREDTV=m CONFIG_DVB_FIREDTV_INPUT=y +CONFIG_DVB_B2C2_FLEXCOP=m +CONFIG_VIDEO_SAA7146=m +CONFIG_VIDEO_SAA7146_VV=m +CONFIG_SMS_SIANO_MDTV=m +CONFIG_MEDIA_SUBDRV_AUTOSELECT=y # -# Supported Earthsoft PT1 Adapters +# Media ancillary drivers (tuners, sensors, i2c, frontends) # -CONFIG_DVB_PT1=m +CONFIG_VIDEO_BTCX=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_VIDEO_IR_I2C=m # -# Supported Mantis Adapters +# Audio decoders, processors and mixers # -CONFIG_MANTIS_CORE=m -CONFIG_DVB_MANTIS=m -CONFIG_DVB_HOPPER=m +CONFIG_VIDEO_TVAUDIO=m +CONFIG_VIDEO_TDA7432=m +CONFIG_VIDEO_TDA9840=m +CONFIG_VIDEO_TEA6415C=m +CONFIG_VIDEO_TEA6420=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS5345=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_WM8739=m +CONFIG_VIDEO_VP27SMPX=m # -# Supported nGene Adapters +# RDS decoders # -CONFIG_DVB_NGENE=m +CONFIG_VIDEO_SAA6588=m # -# Supported ddbridge ('Octopus') Adapters +# Video decoders # -CONFIG_DVB_DDBRIDGE=m +CONFIG_VIDEO_BT819=m +CONFIG_VIDEO_BT856=m +CONFIG_VIDEO_BT866=m +CONFIG_VIDEO_KS0127=m +CONFIG_VIDEO_SAA7110=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_VPX3220=m # -# Supported DVB Frontends +# Video and audio decoders # -# CONFIG_DVB_FE_CUSTOMISE is not set +CONFIG_VIDEO_SAA717X=m +CONFIG_VIDEO_CX25840=m + +# +# MPEG video encoders +# +CONFIG_VIDEO_CX2341X=m + +# +# Video encoders +# +CONFIG_VIDEO_SAA7127=m +CONFIG_VIDEO_SAA7185=m +CONFIG_VIDEO_ADV7170=m +CONFIG_VIDEO_ADV7175=m + +# +# Camera sensor devices +# +CONFIG_VIDEO_MT9V011=m + +# +# Flash devices +# + +# +# Video improvement chips +# +CONFIG_VIDEO_UPD64031A=m +CONFIG_VIDEO_UPD64083=m + +# +# Miscelaneous helper chips +# +CONFIG_VIDEO_M52790=m + +# +# Sensors used on soc_camera driver +# +CONFIG_MEDIA_ATTACH=y +CONFIG_MEDIA_TUNER=m +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA827X=m +CONFIG_MEDIA_TUNER_TDA18271=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_MT2060=m +CONFIG_MEDIA_TUNER_MT2063=m +CONFIG_MEDIA_TUNER_MT2266=m +CONFIG_MEDIA_TUNER_MT2131=m +CONFIG_MEDIA_TUNER_QT1010=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_MEDIA_TUNER_XC4000=m +CONFIG_MEDIA_TUNER_MXL5005S=m +CONFIG_MEDIA_TUNER_MXL5007T=m +CONFIG_MEDIA_TUNER_MC44S803=m +CONFIG_MEDIA_TUNER_MAX2165=m +CONFIG_MEDIA_TUNER_TDA18218=m +CONFIG_MEDIA_TUNER_FC0011=m +CONFIG_MEDIA_TUNER_FC0012=m +CONFIG_MEDIA_TUNER_FC0013=m +CONFIG_MEDIA_TUNER_TDA18212=m +CONFIG_MEDIA_TUNER_E4000=m +CONFIG_MEDIA_TUNER_FC2580=m +CONFIG_MEDIA_TUNER_TUA9001=m # # Multistandard (satellite) frontends @@ -3833,6 +4054,8 @@ CONFIG_DVB_AF9013=m CONFIG_DVB_EC100=m CONFIG_DVB_STV0367=m CONFIG_DVB_CXD2820R=m +CONFIG_DVB_RTL2830=m +CONFIG_DVB_RTL2832=m # # DVB-C (cable) frontends @@ -3851,8 +4074,11 @@ CONFIG_DVB_OR51132=m CONFIG_DVB_BCM3510=m CONFIG_DVB_LGDT330X=m CONFIG_DVB_LGDT3305=m +CONFIG_DVB_LG2160=m CONFIG_DVB_S5H1409=m CONFIG_DVB_AU8522=m +CONFIG_DVB_AU8522_DTV=m +CONFIG_DVB_AU8522_V4L=m CONFIG_DVB_S5H1411=m # @@ -3883,6 +4109,8 @@ CONFIG_DVB_ATBM8830=m CONFIG_DVB_TDA665x=m CONFIG_DVB_IX2505V=m CONFIG_DVB_IT913X_FE=m +CONFIG_DVB_M88RS2000=m +CONFIG_DVB_AF9033=m # # Tools to develop new frontends @@ -3901,12 +4129,24 @@ CONFIG_VGA_ARB=y CONFIG_VGA_ARB_MAX_GPUS=16 CONFIG_VGA_SWITCHEROO=y CONFIG_DRM=m +CONFIG_DRM_USB=m CONFIG_DRM_KMS_HELPER=m +# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set CONFIG_DRM_TTM=m CONFIG_DRM_TDFX=m CONFIG_DRM_R128=m CONFIG_DRM_RADEON=m CONFIG_DRM_RADEON_KMS=y +CONFIG_DRM_NOUVEAU=m +CONFIG_NOUVEAU_DEBUG=5 +CONFIG_NOUVEAU_DEBUG_DEFAULT=3 +CONFIG_DRM_NOUVEAU_BACKLIGHT=y + +# +# I2C encoder or helper chips +# +CONFIG_DRM_I2C_CH7006=m +CONFIG_DRM_I2C_SIL164=m CONFIG_DRM_I810=m CONFIG_DRM_I915=m CONFIG_DRM_I915_KMS=y @@ -3915,6 +4155,13 @@ CONFIG_DRM_SIS=m CONFIG_DRM_VIA=m CONFIG_DRM_SAVAGE=m # CONFIG_DRM_VMWGFX is not set +CONFIG_DRM_GMA500=m +CONFIG_DRM_GMA600=y +CONFIG_DRM_GMA3600=y +CONFIG_DRM_UDL=m +CONFIG_DRM_AST=m +CONFIG_DRM_MGAG200=m +CONFIG_DRM_CIRRUS_QEMU=m CONFIG_STUB_POULSBO=m CONFIG_VGASTATE=m CONFIG_VIDEO_OUTPUT_CONTROL=m @@ -3965,6 +4212,7 @@ CONFIG_FB_RIVA=m CONFIG_FB_RIVA_I2C=y # CONFIG_FB_RIVA_DEBUG is not set CONFIG_FB_RIVA_BACKLIGHT=y +CONFIG_FB_I740=m CONFIG_FB_LE80578=m CONFIG_FB_CARILLO_RANCH=m CONFIG_FB_MATROX=m @@ -4024,6 +4272,10 @@ CONFIG_FB_MB862XX=m CONFIG_FB_MB862XX_PCI_GDC=y CONFIG_FB_MB862XX_I2C=y CONFIG_FB_BROADSHEET=m +CONFIG_FB_AUO_K190X=m +CONFIG_FB_AUO_K1900=m +CONFIG_FB_AUO_K1901=m +# CONFIG_EXYNOS_VIDEO is not set CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_LCD_CLASS_DEVICE=m CONFIG_LCD_L4F00242T03=m @@ -4038,21 +4290,18 @@ CONFIG_LCD_LD9040=m CONFIG_LCD_AMS369FG06=m CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=m -CONFIG_BACKLIGHT_PROGEAR=m +CONFIG_BACKLIGHT_LM3533=m CONFIG_BACKLIGHT_CARILLO_RANCH=m +CONFIG_BACKLIGHT_DA9052=m CONFIG_BACKLIGHT_APPLE=m CONFIG_BACKLIGHT_SAHARA=m CONFIG_BACKLIGHT_ADP8860=m CONFIG_BACKLIGHT_ADP8870=m - -# -# Display device support -# -CONFIG_DISPLAY_SUPPORT=m - -# -# Display hardware drivers -# +CONFIG_BACKLIGHT_LM3630=m +CONFIG_BACKLIGHT_LM3639=m +CONFIG_BACKLIGHT_LP855X=m +CONFIG_BACKLIGHT_OT200=m +CONFIG_BACKLIGHT_TPS65217=m # # Console display driver support @@ -4094,6 +4343,7 @@ CONFIG_SND_DEBUG=y # CONFIG_SND_DEBUG_VERBOSE is not set CONFIG_SND_PCM_XRUN_DEBUG=y CONFIG_SND_VMASTER=y +CONFIG_SND_KCTL_JACK=y CONFIG_SND_DMA_SGBUF=y CONFIG_SND_RAWMIDI_SEQ=m CONFIG_SND_OPL3_LIB_SEQ=m @@ -4173,11 +4423,10 @@ CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_HDA_HWDEP=y CONFIG_SND_HDA_RECONFIG=y CONFIG_SND_HDA_INPUT_BEEP=y -CONFIG_SND_HDA_INPUT_BEEP_MODE=2 +CONFIG_SND_HDA_INPUT_BEEP_MODE=1 CONFIG_SND_HDA_INPUT_JACK=y CONFIG_SND_HDA_PATCH_LOADER=y CONFIG_SND_HDA_CODEC_REALTEK=y -CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS=y CONFIG_SND_HDA_CODEC_ANALOG=y CONFIG_SND_HDA_CODEC_SIGMATEL=y CONFIG_SND_HDA_CODEC_VIA=y @@ -4189,7 +4438,6 @@ CONFIG_SND_HDA_CODEC_CA0132=y CONFIG_SND_HDA_CODEC_CMEDIA=y CONFIG_SND_HDA_CODEC_SI3054=y CONFIG_SND_HDA_GENERIC=y -CONFIG_SND_HDA_POWER_SAVE=y CONFIG_SND_HDA_POWER_SAVE_DEFAULT=0 CONFIG_SND_HDSP=m CONFIG_SND_HDSPM=m @@ -4254,16 +4502,14 @@ CONFIG_SC6600_JOY=y CONFIG_SC6600_CDROM=4 CONFIG_SC6600_CDROMBASE=0 CONFIG_AC97_BUS=m -CONFIG_HID_SUPPORT=y -CONFIG_HID=m -CONFIG_HIDRAW=y # -# USB Input Devices +# HID support # -CONFIG_USB_HID=m -CONFIG_HID_PID=y -CONFIG_USB_HIDDEV=y +CONFIG_HID=m +CONFIG_HIDRAW=y +# CONFIG_UHID is not set +CONFIG_HID_GENERIC=m # # Special HID drivers @@ -4272,6 +4518,7 @@ CONFIG_HID_A4TECH=m CONFIG_HID_ACRUX=m # CONFIG_HID_ACRUX_FF is not set CONFIG_HID_APPLE=m +CONFIG_HID_AUREAL=m CONFIG_HID_BELKIN=m CONFIG_HID_CHERRY=m CONFIG_HID_CHICONY=m @@ -4292,6 +4539,7 @@ CONFIG_HID_GYRATION=m CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=m CONFIG_HID_LCPOWER=m +CONFIG_HID_LENOVO_TPKBD=m CONFIG_HID_LOGITECH=m CONFIG_HID_LOGITECH_DJ=m CONFIG_LOGITECH_FF=y @@ -4312,15 +4560,11 @@ CONFIG_HID_PICOLCD_FB=y CONFIG_HID_PICOLCD_BACKLIGHT=y CONFIG_HID_PICOLCD_LCD=y CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PICOLCD_CIR=y CONFIG_HID_PRIMAX=m -CONFIG_HID_QUANTA=m +CONFIG_HID_PS3REMOTE=m CONFIG_HID_ROCCAT=m -CONFIG_HID_ROCCAT_COMMON=m -CONFIG_HID_ROCCAT_ARVO=m -CONFIG_HID_ROCCAT_KONE=m -CONFIG_HID_ROCCAT_KONEPLUS=m -CONFIG_HID_ROCCAT_KOVAPLUS=m -CONFIG_HID_ROCCAT_PYRA=m +CONFIG_HID_SAITEK=m CONFIG_HID_SAMSUNG=m CONFIG_HID_SONY=m CONFIG_HID_SPEEDLINK=m @@ -4329,21 +4573,30 @@ CONFIG_HID_GREENASIA=m CONFIG_GREENASIA_FF=y CONFIG_HID_SMARTJOYPLUS=m CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=m CONFIG_HID_TOPSEED=m CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y CONFIG_HID_WACOM=m -CONFIG_HID_WACOM_POWER_SUPPLY=y CONFIG_HID_WIIMOTE=m +CONFIG_HID_WIIMOTE_EXT=y CONFIG_HID_ZEROPLUS=m CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=m -CONFIG_USB_SUPPORT=y -CONFIG_USB_COMMON=m -CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_HID_SENSOR_HUB=m + +# +# USB HID support +# +CONFIG_USB_HID=m +CONFIG_HID_PID=y +CONFIG_USB_HIDDEV=y CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_EHCI=y CONFIG_USB_ARCH_HAS_XHCI=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=m +CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB=m # CONFIG_USB_DEBUG is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -4351,13 +4604,10 @@ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y # # Miscellaneous USB options # -CONFIG_USB_DEVICEFS=y -# CONFIG_USB_DEVICE_CLASS is not set # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set -CONFIG_USB_DWC3=m -# CONFIG_USB_DWC3_DEBUG is not set +# CONFIG_USB_DWC3 is not set CONFIG_USB_MON=m CONFIG_USB_WUSB=m CONFIG_USB_WUSB_CBAF=m @@ -4378,6 +4628,8 @@ CONFIG_USB_ISP1760_HCD=m CONFIG_USB_ISP1362_HCD=m CONFIG_USB_OHCI_HCD=m # CONFIG_USB_OHCI_HCD_SSB is not set +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set CONFIG_USB_OHCI_LITTLE_ENDIAN=y @@ -4389,6 +4641,14 @@ CONFIG_USB_SL811_CS=m CONFIG_USB_R8A66597_HCD=m CONFIG_USB_WHCI_HCD=m CONFIG_USB_HWA_HCD=m +CONFIG_USB_HCD_SSB=m +CONFIG_XEN_USBDEV_FRONTEND=m +CONFIG_XEN_USBDEV_BACKEND=m +# CONFIG_USB_MUSB_HDRC is not set +CONFIG_USB_CHIPIDEA=m +CONFIG_USB_CHIPIDEA_UDC=y +CONFIG_USB_CHIPIDEA_HOST=y +# CONFIG_USB_CHIPIDEA_DEBUG is not set # CONFIG_USB_RENESAS_USBHS is not set # @@ -4422,8 +4682,6 @@ CONFIG_USB_STORAGE_ONETOUCH=m CONFIG_USB_STORAGE_KARMA=m CONFIG_USB_STORAGE_CYPRESS_ATACB=m CONFIG_USB_STORAGE_ENE_UB6250=m -CONFIG_USB_UAS=m -# CONFIG_USB_LIBUSUAL is not set # # USB Imaging devices @@ -4436,7 +4694,6 @@ CONFIG_USB_MICROTEK=m # CONFIG_USB_USS720=m CONFIG_USB_SERIAL=m -CONFIG_USB_EZUSB=y CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m @@ -4454,6 +4711,7 @@ CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m +CONFIG_USB_SERIAL_F81232=m CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m @@ -4462,6 +4720,7 @@ CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m +CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7715_PARPORT=y CONFIG_USB_SERIAL_MOS7840=m @@ -4487,7 +4746,9 @@ CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_SERIAL_OPTICON=m CONFIG_USB_SERIAL_VIVOPAY_SERIAL=m CONFIG_USB_SERIAL_ZIO=m +CONFIG_USB_SERIAL_ZTE=m CONFIG_USB_SERIAL_SSU100=m +CONFIG_USB_SERIAL_QT2=m CONFIG_USB_SERIAL_DEBUG=m # @@ -4514,6 +4775,13 @@ CONFIG_USB_IOWARRIOR=m # CONFIG_USB_TEST is not set CONFIG_USB_ISIGHTFW=m CONFIG_USB_YUREX=m +CONFIG_USB_EZUSB_FX2=m + +# +# USB Physical Layer drivers +# +CONFIG_OMAP_USB2=m +CONFIG_USB_ISP1301=m CONFIG_USB_ATM=m CONFIG_USB_SPEEDTOUCH=m CONFIG_USB_CXACRU=m @@ -4525,18 +4793,19 @@ CONFIG_USB_GADGET=m # CONFIG_USB_GADGET_DEBUG_FS is not set CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 + +# +# USB Peripheral Controller +# # CONFIG_USB_R8A66597 is not set -# CONFIG_USB_GADGET_DWC3 is not set +# CONFIG_USB_MV_UDC is not set # CONFIG_USB_M66592 is not set # CONFIG_USB_AMD5536UDC is not set -# CONFIG_USB_CI13XXX_PCI is not set # CONFIG_USB_NET2272 is not set # CONFIG_USB_NET2280 is not set # CONFIG_USB_GOKU is not set # CONFIG_USB_EG20T is not set CONFIG_USB_DUMMY_HCD=m -CONFIG_USB_GADGET_DUALSPEED=y -CONFIG_USB_GADGET_SUPERSPEED=y # CONFIG_USB_ZERO is not set # CONFIG_USB_AUDIO is not set # CONFIG_USB_ETH is not set @@ -4617,7 +4886,8 @@ CONFIG_LEDS_CLASS=y # LED drivers # CONFIG_LEDS_LM3530=m -CONFIG_LEDS_NET5501=m +CONFIG_LEDS_LM3533=m +CONFIG_LEDS_LM3642=m CONFIG_LEDS_PCA9532=m # CONFIG_LEDS_PCA9532_GPIO is not set CONFIG_LEDS_GPIO=m @@ -4626,6 +4896,8 @@ CONFIG_LEDS_LP5521=m CONFIG_LEDS_LP5523=m CONFIG_LEDS_CLEVO_MAIL=m CONFIG_LEDS_PCA955X=m +CONFIG_LEDS_PCA9633=m +CONFIG_LEDS_DA9052=m CONFIG_LEDS_DAC124S085=m CONFIG_LEDS_REGULATOR=m CONFIG_LEDS_BD2802=m @@ -4633,20 +4905,27 @@ CONFIG_LEDS_INTEL_SS4200=m CONFIG_LEDS_LT3593=m CONFIG_LEDS_DELL_NETBOOKS=m CONFIG_LEDS_MC13783=m +CONFIG_LEDS_TCA6507=m +CONFIG_LEDS_LM355x=m +CONFIG_LEDS_OT200=m +CONFIG_LEDS_BLINKM=m CONFIG_LEDS_TRIGGERS=y # # LED Triggers # CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_ONESHOT=m CONFIG_LEDS_TRIGGER_HEARTBEAT=m CONFIG_LEDS_TRIGGER_BACKLIGHT=m +# CONFIG_LEDS_TRIGGER_CPU is not set CONFIG_LEDS_TRIGGER_GPIO=m CONFIG_LEDS_TRIGGER_DEFAULT_ON=m # # iptables trigger is under Netfilter config (LED target) # +CONFIG_LEDS_TRIGGER_TRANSIENT=m # CONFIG_ACCESSIBILITY is not set CONFIG_INFINIBAND=m CONFIG_INFINIBAND_USER_MAD=m @@ -4665,6 +4944,7 @@ CONFIG_INFINIBAND_CXGB4=m CONFIG_MLX4_INFINIBAND=m CONFIG_INFINIBAND_NES=m # CONFIG_INFINIBAND_NES_DEBUG is not set +CONFIG_INFINIBAND_OCRDMA=m CONFIG_INFINIBAND_IPOIB=m CONFIG_INFINIBAND_IPOIB_CM=y CONFIG_INFINIBAND_IPOIB_DEBUG=y @@ -4676,6 +4956,7 @@ CONFIG_EDAC=y # # Reporting subsystems # +CONFIG_EDAC_LEGACY_SYSFS=y # CONFIG_EDAC_DEBUG is not set CONFIG_EDAC_DECODE_MCE=m # CONFIG_EDAC_MCE_INJ is not set @@ -4753,6 +5034,7 @@ CONFIG_RTC_DRV_DS1286=m CONFIG_RTC_DRV_DS1511=m CONFIG_RTC_DRV_DS1553=m CONFIG_RTC_DRV_DS1742=m +CONFIG_RTC_DRV_DA9052=m CONFIG_RTC_DRV_STK17TA8=m CONFIG_RTC_DRV_M48T86=m CONFIG_RTC_DRV_M48T35=m @@ -4761,6 +5043,7 @@ CONFIG_RTC_DRV_MSM6242=m CONFIG_RTC_DRV_BQ4802=m CONFIG_RTC_DRV_RP5C01=m CONFIG_RTC_DRV_V3020=m +CONFIG_RTC_DRV_DS2404=m # # on-CPU RTC drivers @@ -4800,8 +5083,10 @@ CONFIG_UIO_AEC=m CONFIG_UIO_SERCOS3=m CONFIG_UIO_PCI_GENERIC=m CONFIG_UIO_NETX=m +CONFIG_VFIO_IOMMU_TYPE1=m +CONFIG_VFIO=m +CONFIG_VFIO_PCI=m CONFIG_VIRTIO=m -CONFIG_VIRTIO_RING=m # # Virtio drivers @@ -4809,6 +5094,12 @@ CONFIG_VIRTIO_RING=m # CONFIG_VIRTIO_PCI is not set # CONFIG_VIRTIO_BALLOON is not set CONFIG_VIRTIO_MMIO=m +# CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES is not set + +# +# Microsoft Hyper-V guest support +# +# CONFIG_HYPERV is not set # # Xen driver support @@ -4829,7 +5120,8 @@ CONFIG_SWIOTLB_XEN=y CONFIG_XEN_TMEM=y CONFIG_XEN_PCIDEV_BACKEND=m CONFIG_XEN_PRIVCMD=y -CONFIG_CPU_FREQ_GOV_XEN=m +CONFIG_XEN_ACPI_PROCESSOR=y +CONFIG_XEN_MCE_LOG=y CONFIG_STAGING=y CONFIG_ET131X=m CONFIG_SLICOSS=m @@ -4848,6 +5140,10 @@ CONFIG_PANEL_PROFILE=5 # CONFIG_PANEL_CHANGE_MESSAGE is not set CONFIG_R8187SE=m CONFIG_RTL8192U=m +CONFIG_RTLLIB=m +CONFIG_RTLLIB_CRYPTO_CCMP=m +CONFIG_RTLLIB_CRYPTO_TKIP=m +CONFIG_RTLLIB_CRYPTO_WEP=m CONFIG_RTL8192E=m CONFIG_R8712U=m CONFIG_RTS_PSTOR=m @@ -4855,8 +5151,6 @@ CONFIG_RTS_PSTOR=m CONFIG_RTS5139=m # CONFIG_RTS5139_DEBUG is not set CONFIG_TRANZPORT=m -CONFIG_POHMELFS=m -# CONFIG_POHMELFS_DEBUG is not set CONFIG_IDE_PHISON=m CONFIG_LINE6_USB=m # CONFIG_LINE6_USB_DEBUG is not set @@ -4865,43 +5159,16 @@ CONFIG_LINE6_USB=m # CONFIG_LINE6_USB_DUMP_PCM is not set # CONFIG_LINE6_USB_RAW is not set # CONFIG_LINE6_USB_IMPULSE_RESPONSE is not set -CONFIG_DRM_NOUVEAU=m -CONFIG_DRM_NOUVEAU_BACKLIGHT=y -# CONFIG_DRM_NOUVEAU_DEBUG is not set - -# -# I2C encoder or helper chips -# -CONFIG_DRM_I2C_CH7006=m -CONFIG_DRM_I2C_SIL164=m CONFIG_USB_SERIAL_QUATECH2=m -CONFIG_USB_SERIAL_QUATECH_USB2=m CONFIG_VT6655=m CONFIG_VT6656=m -CONFIG_VME_BUS=m - -# -# VME Bridge Drivers -# -CONFIG_VME_CA91CX42=m -CONFIG_VME_TSI148=m - -# -# VME Device Drivers -# -CONFIG_VME_USER=m - -# -# VME Board Drivers -# -CONFIG_VMIVME_7805=m CONFIG_DX_SEP=m -CONFIG_IIO=m -CONFIG_IIO_BUFFER=y + +# +# IIO staging drivers +# +CONFIG_IIO_ST_HWMON=m CONFIG_IIO_SW_RING=m -CONFIG_IIO_KFIFO_BUF=m -CONFIG_IIO_TRIGGER=y -CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # # Accelerometers @@ -4928,7 +5195,6 @@ CONFIG_AD7606_IFACE_PARALLEL=m CONFIG_AD7606_IFACE_SPI=m CONFIG_AD799X=m CONFIG_AD799X_RING_BUFFER=y -CONFIG_AD7476=m CONFIG_AD7887=m CONFIG_AD7780=m CONFIG_AD7793=m @@ -4954,18 +5220,6 @@ CONFIG_AD7150=m CONFIG_AD7152=m CONFIG_AD7746=m -# -# Digital to analog converters -# -CONFIG_AD5064=m -CONFIG_AD5360=m -CONFIG_AD5624R_SPI=m -CONFIG_AD5446=m -CONFIG_AD5504=m -CONFIG_AD5791=m -CONFIG_AD5686=m -CONFIG_MAX517=m - # # Direct Digital Synthesis # @@ -5000,8 +5254,10 @@ CONFIG_ADIS16400=m # Light sensors # CONFIG_SENSORS_ISL29018=m +CONFIG_SENSORS_ISL29028=m CONFIG_SENSORS_TSL2563=m CONFIG_TSL2583=m +CONFIG_TSL2x7x=m # # Magnetometer sensors @@ -5036,10 +5292,9 @@ CONFIG_IIO_SYSFS_TRIGGER=m CONFIG_IIO_SIMPLE_DUMMY=m # CONFIG_IIO_SIMPLE_DUMMY_EVENTS is not set # CONFIG_IIO_SIMPLE_DUMMY_BUFFER is not set -CONFIG_XVMALLOC=y CONFIG_ZRAM=m # CONFIG_ZRAM_DEBUG is not set -# CONFIG_ZCACHE is not set +CONFIG_ZSMALLOC=m CONFIG_WLAGS49_H2=m CONFIG_WLAGS49_H25=m CONFIG_FB_SM7XX=m @@ -5061,19 +5316,12 @@ CONFIG_FT1000_PCMCIA=m # CONFIG_SPEAKUP is not set CONFIG_TOUCHSCREEN_CLEARPAD_TM1217=m CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=m -CONFIG_DRM_PSB=m -CONFIG_DRM_PSB_MRST=y -CONFIG_DRM_PSB_MFLD=y -CONFIG_DRM_PSB_CDV=y -CONFIG_INTEL_MEI=m CONFIG_STAGING_MEDIA=y CONFIG_DVB_AS102=m CONFIG_DVB_CXD2099=m CONFIG_VIDEO_DT3155=m CONFIG_DT3155_CCIR=y CONFIG_DT3155_STREAMING=y -CONFIG_EASYCAP=m -# CONFIG_EASYCAP_DEBUG is not set # CONFIG_VIDEO_GO7007 is not set CONFIG_SOLO6X10=m CONFIG_LIRC_STAGING=y @@ -5085,8 +5333,34 @@ CONFIG_LIRC_SASEM=m CONFIG_LIRC_SERIAL=m CONFIG_LIRC_SERIAL_TRANSMITTER=y CONFIG_LIRC_SIR=m -CONFIG_LIRC_TTUSBIR=m CONFIG_LIRC_ZILOG=m + +# +# Android +# +# CONFIG_ANDROID is not set +CONFIG_PHONE=m +CONFIG_PHONE_IXJ=m +CONFIG_PHONE_IXJ_PCMCIA=m +CONFIG_USB_WPAN_HCD=m +CONFIG_USB_G_CCG=m +CONFIG_IPACK_BUS=m +CONFIG_BOARD_TPCI200=m +CONFIG_SERIAL_IPOCTAL=m +CONFIG_WIMAX_GDM72XX=m +# CONFIG_WIMAX_GDM72XX_QOS is not set +# CONFIG_WIMAX_GDM72XX_K_MODE is not set +# CONFIG_WIMAX_GDM72XX_WIMAX2 is not set +CONFIG_WIMAX_GDM72XX_USB=y +# CONFIG_WIMAX_GDM72XX_SDIO is not set +# CONFIG_WIMAX_GDM72XX_USB_PM is not set +CONFIG_CSR_WIFI=m +# CONFIG_ZCACHE2 is not set +CONFIG_NET_VENDOR_SILICOM=y +CONFIG_SBYPASS=m +CONFIG_BPCTL=m +CONFIG_CED1401=m +CONFIG_DGRP=m CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACER_WMI=m CONFIG_ACERHDF=m @@ -5096,6 +5370,8 @@ CONFIG_DELL_WMI=m CONFIG_DELL_WMI_AIO=m CONFIG_FUJITSU_LAPTOP=m # CONFIG_FUJITSU_LAPTOP_DEBUG is not set +CONFIG_FUJITSU_TABLET=m +CONFIG_AMILO_RFKILL=m CONFIG_HP_ACCEL=m CONFIG_HP_WMI=m CONFIG_MSI_LAPTOP=m @@ -5119,7 +5395,6 @@ CONFIG_ASUS_NB_WMI=m CONFIG_EEEPC_WMI=m CONFIG_ACPI_WMI=m CONFIG_MSI_WMI=m -# CONFIG_ACPI_ASUS is not set CONFIG_TOPSTAR_LAPTOP=m CONFIG_ACPI_TOSHIBA=m CONFIG_TOSHIBA_BT_RFKILL=m @@ -5131,6 +5406,7 @@ CONFIG_SAMSUNG_LAPTOP=m CONFIG_MXM_WMI=m CONFIG_INTEL_OAKTRAIL=m CONFIG_SAMSUNG_Q10=m +CONFIG_APPLE_GMUX=m # # Hardware Spinlock drivers @@ -5142,13 +5418,23 @@ CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y CONFIG_AMD_IOMMU=y # CONFIG_AMD_IOMMU_STATS is not set +CONFIG_AMD_IOMMU_V2=m CONFIG_DMAR_TABLE=y CONFIG_INTEL_IOMMU=y CONFIG_INTEL_IOMMU_DEFAULT_ON=y CONFIG_INTEL_IOMMU_FLOPPY_WA=y CONFIG_IRQ_REMAP=y + +# +# Remoteproc drivers (EXPERIMENTAL) +# +CONFIG_REMOTEPROC=m +CONFIG_STE_MODEM_RPROC=m + +# +# Rpmsg drivers (EXPERIMENTAL) +# CONFIG_VIRT_DRIVERS=y -# CONFIG_HYPERV is not set CONFIG_PM_DEVFREQ=y # @@ -5162,6 +5448,113 @@ CONFIG_DEVFREQ_GOV_USERSPACE=y # # DEVFREQ Drivers # +CONFIG_EXTCON=y + +# +# Extcon Device Drivers +# +CONFIG_EXTCON_GPIO=m +CONFIG_EXTCON_ADC_JACK=m +CONFIG_EXTCON_ARIZONA=m +# CONFIG_MEMORY is not set +CONFIG_IIO=m +CONFIG_IIO_BUFFER=y +CONFIG_IIO_KFIFO_BUF=m +CONFIG_IIO_TRIGGERED_BUFFER=m +CONFIG_IIO_TRIGGER=y +CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 + +# +# Accelerometers +# +CONFIG_HID_SENSOR_ACCEL_3D=m + +# +# Analog to digital converters +# +CONFIG_AD_SIGMA_DELTA=m +CONFIG_AD7266=m +CONFIG_AD7791=m +CONFIG_AD7476=m + +# +# Amplifiers +# +CONFIG_AD8366=m + +# +# Light sensors +# +CONFIG_ADJD_S311=m +CONFIG_SENSORS_LM3533=m +CONFIG_VCNL4000=m +CONFIG_HID_SENSOR_ALS=m + +# +# Frequency Synthesizers DDS/PLL +# + +# +# Clock Generator/Distribution +# +CONFIG_AD9523=m + +# +# Phase-Locked Loop (PLL) frequency synthesizers +# +CONFIG_ADF4350=m + +# +# Digital to analog converters +# +CONFIG_AD5064=m +CONFIG_AD5360=m +CONFIG_AD5380=m +CONFIG_AD5421=m +CONFIG_AD5624R_SPI=m +CONFIG_AD5446=m +CONFIG_AD5504=m +CONFIG_AD5755=m +CONFIG_AD5764=m +CONFIG_AD5791=m +CONFIG_AD5686=m +CONFIG_MAX517=m +CONFIG_MCP4725=m + +# +# Hid Sensor IIO Common +# +CONFIG_HID_SENSOR_IIO_COMMON=m +CONFIG_HID_SENSOR_ENUM_BASE_QUIRKS=m + +# +# Digital gyroscope sensors +# +CONFIG_HID_SENSOR_GYRO_3D=m + +# +# Magnetometer sensors +# +CONFIG_HID_SENSOR_MAGNETOMETER_3D=m +CONFIG_VME_BUS=m + +# +# VME Bridge Drivers +# +CONFIG_VME_CA91CX42=m +CONFIG_VME_TSI148=m + +# +# VME Board Drivers +# +CONFIG_VMIVME_7805=m + +# +# VME Device Drivers +# +CONFIG_VME_USER=m +CONFIG_VME_PIO2=m +# CONFIG_PWM is not set # # Firmware Drivers @@ -5175,12 +5568,12 @@ CONFIG_DMIID=y CONFIG_DMI_SYSFS=m CONFIG_ISCSI_IBFT_FIND=y CONFIG_ISCSI_IBFT=m -CONFIG_SIGMA=m # CONFIG_GOOGLE_FIRMWARE is not set # # File systems # +CONFIG_DCACHE_WORD_ACCESS=y CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y @@ -5227,6 +5620,7 @@ CONFIG_OCFS2_FS_STATS=y # CONFIG_OCFS2_DEBUG_FS is not set CONFIG_BTRFS_FS=m CONFIG_BTRFS_FS_POSIX_ACL=y +# CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set CONFIG_NILFS2_FS=m CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=m @@ -5323,11 +5717,9 @@ CONFIG_JFFS2_CMODE_PRIORITY=y # CONFIG_JFFS2_CMODE_SIZE is not set # CONFIG_JFFS2_CMODE_FAVOURLZO is not set CONFIG_UBIFS_FS=m -CONFIG_UBIFS_FS_XATTR=y CONFIG_UBIFS_FS_ADVANCED_COMPR=y CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y -# CONFIG_UBIFS_FS_DEBUG is not set CONFIG_LOGFS=m CONFIG_CRAMFS=m CONFIG_SQUASHFS=m @@ -5343,6 +5735,8 @@ CONFIG_MINIX_FS=m CONFIG_OMFS_FS=m CONFIG_HPFS_FS=m CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m +# CONFIG_QNX6FS_DEBUG is not set CONFIG_ROMFS_FS=m # CONFIG_ROMFS_BACKED_BY_BLOCK is not set # CONFIG_ROMFS_BACKED_BY_MTD is not set @@ -5359,19 +5753,21 @@ CONFIG_EXOFS_FS=m CONFIG_ORE=m CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m -CONFIG_NFS_V3=y +CONFIG_NFS_V2=m +CONFIG_NFS_V3=m CONFIG_NFS_V3_ACL=y -CONFIG_NFS_V4=y +CONFIG_NFS_V4=m +# CONFIG_NFS_SWAP is not set # CONFIG_NFS_V4_1 is not set CONFIG_NFS_FSCACHE=y # CONFIG_NFS_USE_LEGACY_DNS is not set CONFIG_NFS_USE_KERNEL_DNS=y -# CONFIG_NFS_USE_NEW_IDMAPPER is not set CONFIG_NFSD=m CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y CONFIG_NFSD_V4=y +# CONFIG_NFSD_FAULT_INJECTION is not set CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_NFS_ACL_SUPPORT=m @@ -5380,6 +5776,7 @@ CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_SUNRPC_XPRT_RDMA=m CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_SUNRPC_DEBUG is not set CONFIG_CEPH_FS=m CONFIG_CIFS=m CONFIG_CIFS_STATS=y @@ -5388,10 +5785,11 @@ CONFIG_CIFS_WEAK_PW_HASH=y CONFIG_CIFS_UPCALL=y CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y +CONFIG_CIFS_ACL=y # CONFIG_CIFS_DEBUG2 is not set CONFIG_CIFS_DFS_UPCALL=y +# CONFIG_CIFS_SMB2 is not set # CONFIG_CIFS_FSCACHE is not set -CONFIG_CIFS_ACL=y CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y CONFIG_NCPFS_IOCTL_LOCKING=y @@ -5408,29 +5806,6 @@ CONFIG_AFS_FSCACHE=y CONFIG_9P_FS=m # CONFIG_9P_FSCACHE is not set CONFIG_9P_FS_POSIX_ACL=y - -# -# Partition Types -# -CONFIG_PARTITION_ADVANCED=y -# CONFIG_ACORN_PARTITION is not set -CONFIG_OSF_PARTITION=y -# CONFIG_AMIGA_PARTITION is not set -CONFIG_ATARI_PARTITION=y -CONFIG_MAC_PARTITION=y -CONFIG_MSDOS_PARTITION=y -CONFIG_BSD_DISKLABEL=y -# CONFIG_MINIX_SUBPARTITION is not set -CONFIG_SOLARIS_X86_PARTITION=y -CONFIG_UNIXWARE_DISKLABEL=y -CONFIG_LDM_PARTITION=y -# CONFIG_LDM_DEBUG is not set -CONFIG_SGI_PARTITION=y -CONFIG_ULTRIX_PARTITION=y -CONFIG_SUN_PARTITION=y -CONFIG_KARMA_PARTITION=y -CONFIG_EFI_PARTITION=y -CONFIG_SYSV68_PARTITION=y CONFIG_NLS=y CONFIG_NLS_DEFAULT="utf8" CONFIG_NLS_CODEPAGE_437=m @@ -5470,6 +5845,17 @@ CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m +CONFIG_NLS_MAC_ROMAN=m +CONFIG_NLS_MAC_CELTIC=m +CONFIG_NLS_MAC_CENTEURO=m +CONFIG_NLS_MAC_CROATIAN=m +CONFIG_NLS_MAC_CYRILLIC=m +CONFIG_NLS_MAC_GAELIC=m +CONFIG_NLS_MAC_GREEK=m +CONFIG_NLS_MAC_ICELAND=m +CONFIG_NLS_MAC_INUIT=m +CONFIG_NLS_MAC_ROMANIAN=m +CONFIG_NLS_MAC_TURKISH=m CONFIG_NLS_UTF8=m CONFIG_DLM=m CONFIG_DLM_DEBUG=y @@ -5485,6 +5871,7 @@ CONFIG_ENABLE_MUST_CHECK=y CONFIG_FRAME_WARN=2048 CONFIG_MAGIC_SYSRQ=y CONFIG_STRIP_ASM_SYMS=y +# CONFIG_READABLE_ASM is not set CONFIG_UNUSED_SYMBOLS=y CONFIG_DEBUG_FS=y CONFIG_HEADERS_CHECK=y @@ -5492,7 +5879,8 @@ CONFIG_HEADERS_CHECK=y CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SHIRQ is not set # CONFIG_LOCKUP_DETECTOR is not set -# CONFIG_HARDLOCKUP_DETECTOR is not set +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 CONFIG_DETECT_HUNG_TASK=y CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=0 # CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set @@ -5502,6 +5890,8 @@ CONFIG_SCHEDSTATS=y CONFIG_TIMER_STATS=y # CONFIG_DEBUG_OBJECTS is not set # CONFIG_DEBUG_SLAB is not set +CONFIG_HAVE_DEBUG_KMEMLEAK=y +# CONFIG_DEBUG_KMEMLEAK is not set # CONFIG_DEBUG_RT_MUTEXES is not set # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set @@ -5531,16 +5921,17 @@ CONFIG_FRAME_POINTER=y # CONFIG_BOOT_PRINTK_DELAY is not set # CONFIG_RCU_TORTURE_TEST is not set CONFIG_RCU_CPU_STALL_TIMEOUT=60 +# CONFIG_RCU_CPU_STALL_INFO is not set +# CONFIG_RCU_TRACE is not set # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_BACKTRACE_SELF_TEST is not set # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y # CONFIG_DEBUG_PER_CPU_MAPS is not set CONFIG_LKDTM=m -# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set +# CONFIG_NOTIFIER_ERROR_INJECTION is not set # CONFIG_FAULT_INJECTION is not set CONFIG_LATENCYTOP=y -CONFIG_SYSCTL_SYSCALL_CHECK=y # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_USER_STACKTRACE_SUPPORT=y CONFIG_NOP_TRACER=y @@ -5551,7 +5942,9 @@ CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y +CONFIG_HAVE_FENTRY=y CONFIG_HAVE_C_RECORDMCOUNT=y +CONFIG_TRACE_CLOCK=y CONFIG_RING_BUFFER=y CONFIG_EVENT_TRACING=y CONFIG_EVENT_POWER_TRACING_DEPRECATED=y @@ -5571,9 +5964,13 @@ CONFIG_BRANCH_PROFILE_NONE=y # CONFIG_STACK_TRACER is not set CONFIG_BLK_DEV_IO_TRACE=y CONFIG_KPROBE_EVENT=y +CONFIG_UPROBE_EVENT=y +CONFIG_PROBE_EVENTS=y # CONFIG_FTRACE_STARTUP_TEST is not set # CONFIG_MMIOTRACE is not set CONFIG_RING_BUFFER_BENCHMARK=m +# CONFIG_RBTREE_TEST is not set +# CONFIG_INTERVAL_TREE_TEST is not set CONFIG_PROVIDE_OHCI1394_DMA_INIT=y CONFIG_FIREWIRE_OHCI_REMOTE_DMA=y CONFIG_BUILD_DOCSRC=y @@ -5597,6 +5994,7 @@ CONFIG_DEBUG_RODATA=y # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_SET_MODULE_RONX is not set # CONFIG_DEBUG_NX_TEST is not set +# CONFIG_DEBUG_TLBFLUSH is not set # CONFIG_IOMMU_DEBUG is not set # CONFIG_IOMMU_STRESS is not set CONFIG_HAVE_MMIOTRACE_SUPPORT=y @@ -5614,6 +6012,7 @@ CONFIG_DEFAULT_IO_DELAY_TYPE=0 # CONFIG_CPA_DEBUG is not set CONFIG_OPTIMIZE_INLINING=y # CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set +# CONFIG_DEBUG_NMI_SELFTEST is not set # # Security options @@ -5664,6 +6063,8 @@ CONFIG_CRYPTO_WORKQUEUE=y CONFIG_CRYPTO_CRYPTD=m CONFIG_CRYPTO_AUTHENC=m CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_ABLK_HELPER_X86=m +CONFIG_CRYPTO_GLUE_HELPER_X86=m # # Authenticated Encryption with Associated Data @@ -5714,7 +6115,7 @@ CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m # # Ciphers # -CONFIG_CRYPTO_AES=m +CONFIG_CRYPTO_AES=y CONFIG_CRYPTO_AES_X86_64=m CONFIG_CRYPTO_AES_NI_INTEL=m CONFIG_CRYPTO_ANUBIS=m @@ -5723,8 +6124,11 @@ CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_BLOWFISH_COMMON=m CONFIG_CRYPTO_BLOWFISH_X86_64=m CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAMELLIA_X86_64=m CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST5_AVX_X86_64=m CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_CAST6_AVX_X86_64=m CONFIG_CRYPTO_DES=m CONFIG_CRYPTO_FCRYPT=m CONFIG_CRYPTO_KHAZAD=m @@ -5732,11 +6136,14 @@ CONFIG_CRYPTO_SALSA20=m CONFIG_CRYPTO_SALSA20_X86_64=m CONFIG_CRYPTO_SEED=m CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m +CONFIG_CRYPTO_SERPENT_AVX_X86_64=m CONFIG_CRYPTO_TEA=m # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=m CONFIG_CRYPTO_TWOFISH_X86_64=m CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m +CONFIG_CRYPTO_TWOFISH_AVX_X86_64=m # # Compression @@ -5755,6 +6162,10 @@ CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_PADLOCK=m CONFIG_CRYPTO_DEV_PADLOCK_AES=m CONFIG_CRYPTO_DEV_PADLOCK_SHA=m +CONFIG_ASYMMETRIC_KEY_TYPE=m +CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=m +CONFIG_PUBLIC_KEY_ALGO_RSA=m +CONFIG_X509_CERTIFICATE_PARSER=m CONFIG_HAVE_KVM=y CONFIG_VIRTUALIZATION=y # CONFIG_KVM is not set @@ -5766,12 +6177,22 @@ CONFIG_BINARY_PRINTF=y # CONFIG_RAID6_PQ=m CONFIG_BITREVERSE=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y CONFIG_GENERIC_FIND_FIRST_BIT=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_IOMAP=y +CONFIG_GENERIC_IO=y CONFIG_CRC_CCITT=m CONFIG_CRC16=m CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=m CONFIG_CRC32=y +# CONFIG_CRC32_SELFTEST is not set +CONFIG_CRC32_SLICEBY8=y +# CONFIG_CRC32_SLICEBY4 is not set +# CONFIG_CRC32_SARWATE is not set +# CONFIG_CRC32_BIT is not set CONFIG_CRC7=m CONFIG_LIBCRC32C=m CONFIG_CRC8=m @@ -5796,6 +6217,8 @@ CONFIG_DECOMPRESS_LZO=y CONFIG_GENERIC_ALLOCATOR=y CONFIG_REED_SOLOMON=m CONFIG_REED_SOLOMON_DEC16=y +CONFIG_BCH=m +CONFIG_BCH_CONST_PARAMS=y CONFIG_TEXTSEARCH=y CONFIG_TEXTSEARCH_KMP=m CONFIG_TEXTSEARCH_BM=m @@ -5806,7 +6229,13 @@ CONFIG_HAS_IOPORT=y CONFIG_HAS_DMA=y CONFIG_CHECK_SIGNATURE=y CONFIG_CPU_RMAP=y +CONFIG_DQL=y CONFIG_NLATTR=y +CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y CONFIG_LRU_CACHE=m CONFIG_AVERAGE=y +CONFIG_CLZ_TAB=y CONFIG_CORDIC=m +# CONFIG_DDR is not set +CONFIG_MPILIB=m +CONFIG_OID_REGISTRY=m diff --git a/kernel.spec b/kernel.spec index 446494e..6a9fc36 100644 --- a/kernel.spec +++ b/kernel.spec @@ -133,6 +133,7 @@ fi make prepare $MAKE_ARGS make scripts $MAKE_ARGS +make scripts_basic $MAKE_ARGS krel=$(make -s kernelrelease $MAKE_ARGS) if [ "$krel" != "%kernelrelease" ]; then @@ -323,6 +324,7 @@ mkdir -p %buildroot/%vm_install_dir /sbin/dracut --nomdadmconf --nolvmconf \ --kmoddir %buildroot/lib/modules/%kernelrelease \ --include %_sourcedir/vm-initramfs / \ + --add "dm" --omit "plymouth" \ -d "xenblk xen-blkfront cdrom ext4 jbd2 crc16 dm_snapshot" \ %buildroot/%vm_install_dir/initramfs %kernelrelease diff --git a/patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch b/patches.xen/pvops-0001-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch similarity index 94% rename from patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch rename to patches.xen/pvops-0001-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch index a403093..582f7af 100644 --- a/patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch +++ b/patches.xen/pvops-0001-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch @@ -38,8 +38,8 @@ index 610001d..68cf060 100644 -extern int acpi_suspend_lowlevel(void); +extern int (*acpi_suspend_lowlevel)(void); - extern const unsigned char acpi_wakeup_code[]; - #define acpi_wakeup_address (__pa(TRAMPOLINE_SYM(acpi_wakeup_code))) + /* Physical address to resume after wakeup */ + #define acpi_wakeup_address ((unsigned long)(real_mode_header->wakeup_start)) diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index ce664f3..c3a5b95 100644 --- a/arch/x86/kernel/acpi/boot.c @@ -82,8 +82,8 @@ index 103b6ab..4d2d0b1 100644 -int acpi_suspend_lowlevel(void) +int x86_acpi_suspend_lowlevel(void) { - struct wakeup_header *header; - /* address in low memory of the wakeup routine. */ + struct wakeup_header *header = + (struct wakeup_header *) __va(real_mode_header->wakeup_header); diff --git a/arch/x86/kernel/acpi/sleep.h b/arch/x86/kernel/acpi/sleep.h index 416d4be..4d3feb5 100644 --- a/arch/x86/kernel/acpi/sleep.h diff --git a/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch b/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch deleted file mode 100644 index c2881ef..0000000 --- a/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch +++ /dev/null @@ -1,967 +0,0 @@ -From d8414d3c157dc1f83e73c17447ba41fe5afa9d3d Mon Sep 17 00:00:00 2001 -From: Bastian Blank -Date: Fri, 16 Dec 2011 11:34:33 -0500 -Subject: xen: Add privcmd device driver - -Access to arbitrary hypercalls is currently provided via xenfs. This -adds a standard character device to handle this. The support in xenfs -remains for backward compatibility and uses the device driver code. - -Signed-off-by: Bastian Blank -Acked-by: Ian Campbell -Signed-off-by: Konrad Rzeszutek Wilk ---- - drivers/xen/Kconfig | 7 + - drivers/xen/Makefile | 2 + - drivers/xen/privcmd.c | 437 +++++++++++++++++++++++++++++++++++++++++++ - drivers/xen/privcmd.h | 3 + - drivers/xen/xenfs/Makefile | 2 +- - drivers/xen/xenfs/privcmd.c | 400 --------------------------------------- - drivers/xen/xenfs/super.c | 3 +- - drivers/xen/xenfs/xenfs.h | 1 - - 8 files changed, 452 insertions(+), 403 deletions(-) - create mode 100644 drivers/xen/privcmd.c - create mode 100644 drivers/xen/privcmd.h - delete mode 100644 drivers/xen/xenfs/privcmd.c - -diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig -index 8795480..a1ced52 100644 ---- a/drivers/xen/Kconfig -+++ b/drivers/xen/Kconfig -@@ -86,6 +86,7 @@ config XEN_BACKEND - - config XENFS - tristate "Xen filesystem" -+ select XEN_PRIVCMD - default y - help - The xen filesystem provides a way for domains to share -@@ -171,4 +172,10 @@ config XEN_PCIDEV_BACKEND - xen-pciback.hide=(03:00.0)(04:00.0) - - If in doubt, say m. -+ -+config XEN_PRIVCMD -+ tristate -+ depends on XEN -+ default m -+ - endmenu -diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile -index 974fffd..aa31337 100644 ---- a/drivers/xen/Makefile -+++ b/drivers/xen/Makefile -@@ -19,7 +19,9 @@ obj-$(CONFIG_XEN_TMEM) += tmem.o - obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o - obj-$(CONFIG_XEN_DOM0) += pci.o - obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ -+obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o - - xen-evtchn-y := evtchn.o - xen-gntdev-y := gntdev.o - xen-gntalloc-y := gntalloc.o -+xen-privcmd-y := privcmd.o -diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c -new file mode 100644 -index 0000000..4e8d3da ---- /dev/null -+++ b/drivers/xen/privcmd.c -@@ -0,0 +1,437 @@ -+/****************************************************************************** -+ * privcmd.c -+ * -+ * Interface to privileged domain-0 commands. -+ * -+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "privcmd.h" -+ -+MODULE_LICENSE("GPL"); -+ -+#ifndef HAVE_ARCH_PRIVCMD_MMAP -+static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma); -+#endif -+ -+static long privcmd_ioctl_hypercall(void __user *udata) -+{ -+ struct privcmd_hypercall hypercall; -+ long ret; -+ -+ if (copy_from_user(&hypercall, udata, sizeof(hypercall))) -+ return -EFAULT; -+ -+ ret = privcmd_call(hypercall.op, -+ hypercall.arg[0], hypercall.arg[1], -+ hypercall.arg[2], hypercall.arg[3], -+ hypercall.arg[4]); -+ -+ return ret; -+} -+ -+static void free_page_list(struct list_head *pages) -+{ -+ struct page *p, *n; -+ -+ list_for_each_entry_safe(p, n, pages, lru) -+ __free_page(p); -+ -+ INIT_LIST_HEAD(pages); -+} -+ -+/* -+ * Given an array of items in userspace, return a list of pages -+ * containing the data. If copying fails, either because of memory -+ * allocation failure or a problem reading user memory, return an -+ * error code; its up to the caller to dispose of any partial list. -+ */ -+static int gather_array(struct list_head *pagelist, -+ unsigned nelem, size_t size, -+ void __user *data) -+{ -+ unsigned pageidx; -+ void *pagedata; -+ int ret; -+ -+ if (size > PAGE_SIZE) -+ return 0; -+ -+ pageidx = PAGE_SIZE; -+ pagedata = NULL; /* quiet, gcc */ -+ while (nelem--) { -+ if (pageidx > PAGE_SIZE-size) { -+ struct page *page = alloc_page(GFP_KERNEL); -+ -+ ret = -ENOMEM; -+ if (page == NULL) -+ goto fail; -+ -+ pagedata = page_address(page); -+ -+ list_add_tail(&page->lru, pagelist); -+ pageidx = 0; -+ } -+ -+ ret = -EFAULT; -+ if (copy_from_user(pagedata + pageidx, data, size)) -+ goto fail; -+ -+ data += size; -+ pageidx += size; -+ } -+ -+ ret = 0; -+ -+fail: -+ return ret; -+} -+ -+/* -+ * Call function "fn" on each element of the array fragmented -+ * over a list of pages. -+ */ -+static int traverse_pages(unsigned nelem, size_t size, -+ struct list_head *pos, -+ int (*fn)(void *data, void *state), -+ void *state) -+{ -+ void *pagedata; -+ unsigned pageidx; -+ int ret = 0; -+ -+ BUG_ON(size > PAGE_SIZE); -+ -+ pageidx = PAGE_SIZE; -+ pagedata = NULL; /* hush, gcc */ -+ -+ while (nelem--) { -+ if (pageidx > PAGE_SIZE-size) { -+ struct page *page; -+ pos = pos->next; -+ page = list_entry(pos, struct page, lru); -+ pagedata = page_address(page); -+ pageidx = 0; -+ } -+ -+ ret = (*fn)(pagedata + pageidx, state); -+ if (ret) -+ break; -+ pageidx += size; -+ } -+ -+ return ret; -+} -+ -+struct mmap_mfn_state { -+ unsigned long va; -+ struct vm_area_struct *vma; -+ domid_t domain; -+}; -+ -+static int mmap_mfn_range(void *data, void *state) -+{ -+ struct privcmd_mmap_entry *msg = data; -+ struct mmap_mfn_state *st = state; -+ struct vm_area_struct *vma = st->vma; -+ int rc; -+ -+ /* Do not allow range to wrap the address space. */ -+ if ((msg->npages > (LONG_MAX >> PAGE_SHIFT)) || -+ ((unsigned long)(msg->npages << PAGE_SHIFT) >= -st->va)) -+ return -EINVAL; -+ -+ /* Range chunks must be contiguous in va space. */ -+ if ((msg->va != st->va) || -+ ((msg->va+(msg->npages< vma->vm_end)) -+ return -EINVAL; -+ -+ rc = xen_remap_domain_mfn_range(vma, -+ msg->va & PAGE_MASK, -+ msg->mfn, msg->npages, -+ vma->vm_page_prot, -+ st->domain); -+ if (rc < 0) -+ return rc; -+ -+ st->va += msg->npages << PAGE_SHIFT; -+ -+ return 0; -+} -+ -+static long privcmd_ioctl_mmap(void __user *udata) -+{ -+ struct privcmd_mmap mmapcmd; -+ struct mm_struct *mm = current->mm; -+ struct vm_area_struct *vma; -+ int rc; -+ LIST_HEAD(pagelist); -+ struct mmap_mfn_state state; -+ -+ if (!xen_initial_domain()) -+ return -EPERM; -+ -+ if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd))) -+ return -EFAULT; -+ -+ rc = gather_array(&pagelist, -+ mmapcmd.num, sizeof(struct privcmd_mmap_entry), -+ mmapcmd.entry); -+ -+ if (rc || list_empty(&pagelist)) -+ goto out; -+ -+ down_write(&mm->mmap_sem); -+ -+ { -+ struct page *page = list_first_entry(&pagelist, -+ struct page, lru); -+ struct privcmd_mmap_entry *msg = page_address(page); -+ -+ vma = find_vma(mm, msg->va); -+ rc = -EINVAL; -+ -+ if (!vma || (msg->va != vma->vm_start) || -+ !privcmd_enforce_singleshot_mapping(vma)) -+ goto out_up; -+ } -+ -+ state.va = vma->vm_start; -+ state.vma = vma; -+ state.domain = mmapcmd.dom; -+ -+ rc = traverse_pages(mmapcmd.num, sizeof(struct privcmd_mmap_entry), -+ &pagelist, -+ mmap_mfn_range, &state); -+ -+ -+out_up: -+ up_write(&mm->mmap_sem); -+ -+out: -+ free_page_list(&pagelist); -+ -+ return rc; -+} -+ -+struct mmap_batch_state { -+ domid_t domain; -+ unsigned long va; -+ struct vm_area_struct *vma; -+ int err; -+ -+ xen_pfn_t __user *user; -+}; -+ -+static int mmap_batch_fn(void *data, void *state) -+{ -+ xen_pfn_t *mfnp = data; -+ struct mmap_batch_state *st = state; -+ -+ if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, -+ st->vma->vm_page_prot, st->domain) < 0) { -+ *mfnp |= 0xf0000000U; -+ st->err++; -+ } -+ st->va += PAGE_SIZE; -+ -+ return 0; -+} -+ -+static int mmap_return_errors(void *data, void *state) -+{ -+ xen_pfn_t *mfnp = data; -+ struct mmap_batch_state *st = state; -+ -+ return put_user(*mfnp, st->user++); -+} -+ -+static struct vm_operations_struct privcmd_vm_ops; -+ -+static long privcmd_ioctl_mmap_batch(void __user *udata) -+{ -+ int ret; -+ struct privcmd_mmapbatch m; -+ struct mm_struct *mm = current->mm; -+ struct vm_area_struct *vma; -+ unsigned long nr_pages; -+ LIST_HEAD(pagelist); -+ struct mmap_batch_state state; -+ -+ if (!xen_initial_domain()) -+ return -EPERM; -+ -+ if (copy_from_user(&m, udata, sizeof(m))) -+ return -EFAULT; -+ -+ nr_pages = m.num; -+ if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) -+ return -EINVAL; -+ -+ ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), -+ m.arr); -+ -+ if (ret || list_empty(&pagelist)) -+ goto out; -+ -+ down_write(&mm->mmap_sem); -+ -+ vma = find_vma(mm, m.addr); -+ ret = -EINVAL; -+ if (!vma || -+ vma->vm_ops != &privcmd_vm_ops || -+ (m.addr != vma->vm_start) || -+ ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || -+ !privcmd_enforce_singleshot_mapping(vma)) { -+ up_write(&mm->mmap_sem); -+ goto out; -+ } -+ -+ state.domain = m.dom; -+ state.vma = vma; -+ state.va = m.addr; -+ state.err = 0; -+ -+ ret = traverse_pages(m.num, sizeof(xen_pfn_t), -+ &pagelist, mmap_batch_fn, &state); -+ -+ up_write(&mm->mmap_sem); -+ -+ if (state.err > 0) { -+ state.user = m.arr; -+ ret = traverse_pages(m.num, sizeof(xen_pfn_t), -+ &pagelist, -+ mmap_return_errors, &state); -+ } -+ -+out: -+ free_page_list(&pagelist); -+ -+ return ret; -+} -+ -+static long privcmd_ioctl(struct file *file, -+ unsigned int cmd, unsigned long data) -+{ -+ int ret = -ENOSYS; -+ void __user *udata = (void __user *) data; -+ -+ switch (cmd) { -+ case IOCTL_PRIVCMD_HYPERCALL: -+ ret = privcmd_ioctl_hypercall(udata); -+ break; -+ -+ case IOCTL_PRIVCMD_MMAP: -+ ret = privcmd_ioctl_mmap(udata); -+ break; -+ -+ case IOCTL_PRIVCMD_MMAPBATCH: -+ ret = privcmd_ioctl_mmap_batch(udata); -+ break; -+ -+ default: -+ ret = -EINVAL; -+ break; -+ } -+ -+ return ret; -+} -+ -+#ifndef HAVE_ARCH_PRIVCMD_MMAP -+static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) -+{ -+ printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n", -+ vma, vma->vm_start, vma->vm_end, -+ vmf->pgoff, vmf->virtual_address); -+ -+ return VM_FAULT_SIGBUS; -+} -+ -+static struct vm_operations_struct privcmd_vm_ops = { -+ .fault = privcmd_fault -+}; -+ -+static int privcmd_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ /* Unsupported for auto-translate guests. */ -+ if (xen_feature(XENFEAT_auto_translated_physmap)) -+ return -ENOSYS; -+ -+ /* DONTCOPY is essential for Xen because copy_page_range doesn't know -+ * how to recreate these mappings */ -+ vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP; -+ vma->vm_ops = &privcmd_vm_ops; -+ vma->vm_private_data = NULL; -+ -+ return 0; -+} -+ -+static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma) -+{ -+ return (xchg(&vma->vm_private_data, (void *)1) == NULL); -+} -+#endif -+ -+const struct file_operations xen_privcmd_fops = { -+ .owner = THIS_MODULE, -+ .unlocked_ioctl = privcmd_ioctl, -+ .mmap = privcmd_mmap, -+}; -+EXPORT_SYMBOL_GPL(xen_privcmd_fops); -+ -+static struct miscdevice privcmd_dev = { -+ .minor = MISC_DYNAMIC_MINOR, -+ .name = "xen/privcmd", -+ .fops = &xen_privcmd_fops, -+}; -+ -+static int __init privcmd_init(void) -+{ -+ int err; -+ -+ if (!xen_domain()) -+ return -ENODEV; -+ -+ err = misc_register(&privcmd_dev); -+ if (err != 0) { -+ printk(KERN_ERR "Could not register Xen privcmd device\n"); -+ return err; -+ } -+ return 0; -+} -+ -+static void __exit privcmd_exit(void) -+{ -+ misc_deregister(&privcmd_dev); -+} -+ -+module_init(privcmd_init); -+module_exit(privcmd_exit); -diff --git a/drivers/xen/privcmd.h b/drivers/xen/privcmd.h -new file mode 100644 -index 0000000..14facae ---- /dev/null -+++ b/drivers/xen/privcmd.h -@@ -0,0 +1,3 @@ -+#include -+ -+extern const struct file_operations xen_privcmd_fops; -diff --git a/drivers/xen/xenfs/Makefile b/drivers/xen/xenfs/Makefile -index 4fde944..5d45ff1 100644 ---- a/drivers/xen/xenfs/Makefile -+++ b/drivers/xen/xenfs/Makefile -@@ -1,4 +1,4 @@ - obj-$(CONFIG_XENFS) += xenfs.o - --xenfs-y = super.o xenbus.o privcmd.o -+xenfs-y = super.o xenbus.o - xenfs-$(CONFIG_XEN_DOM0) += xenstored.o -diff --git a/drivers/xen/xenfs/privcmd.c b/drivers/xen/xenfs/privcmd.c -deleted file mode 100644 -index dbd3b16..0000000 ---- a/drivers/xen/xenfs/privcmd.c -+++ /dev/null -@@ -1,400 +0,0 @@ --/****************************************************************************** -- * privcmd.c -- * -- * Interface to privileged domain-0 commands. -- * -- * Copyright (c) 2002-2004, K A Fraser, B Dragovic -- */ -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#include --#include --#include --#include --#include -- --#include --#include --#include --#include --#include --#include -- --#ifndef HAVE_ARCH_PRIVCMD_MMAP --static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma); --#endif -- --static long privcmd_ioctl_hypercall(void __user *udata) --{ -- struct privcmd_hypercall hypercall; -- long ret; -- -- if (copy_from_user(&hypercall, udata, sizeof(hypercall))) -- return -EFAULT; -- -- ret = privcmd_call(hypercall.op, -- hypercall.arg[0], hypercall.arg[1], -- hypercall.arg[2], hypercall.arg[3], -- hypercall.arg[4]); -- -- return ret; --} -- --static void free_page_list(struct list_head *pages) --{ -- struct page *p, *n; -- -- list_for_each_entry_safe(p, n, pages, lru) -- __free_page(p); -- -- INIT_LIST_HEAD(pages); --} -- --/* -- * Given an array of items in userspace, return a list of pages -- * containing the data. If copying fails, either because of memory -- * allocation failure or a problem reading user memory, return an -- * error code; its up to the caller to dispose of any partial list. -- */ --static int gather_array(struct list_head *pagelist, -- unsigned nelem, size_t size, -- void __user *data) --{ -- unsigned pageidx; -- void *pagedata; -- int ret; -- -- if (size > PAGE_SIZE) -- return 0; -- -- pageidx = PAGE_SIZE; -- pagedata = NULL; /* quiet, gcc */ -- while (nelem--) { -- if (pageidx > PAGE_SIZE-size) { -- struct page *page = alloc_page(GFP_KERNEL); -- -- ret = -ENOMEM; -- if (page == NULL) -- goto fail; -- -- pagedata = page_address(page); -- -- list_add_tail(&page->lru, pagelist); -- pageidx = 0; -- } -- -- ret = -EFAULT; -- if (copy_from_user(pagedata + pageidx, data, size)) -- goto fail; -- -- data += size; -- pageidx += size; -- } -- -- ret = 0; -- --fail: -- return ret; --} -- --/* -- * Call function "fn" on each element of the array fragmented -- * over a list of pages. -- */ --static int traverse_pages(unsigned nelem, size_t size, -- struct list_head *pos, -- int (*fn)(void *data, void *state), -- void *state) --{ -- void *pagedata; -- unsigned pageidx; -- int ret = 0; -- -- BUG_ON(size > PAGE_SIZE); -- -- pageidx = PAGE_SIZE; -- pagedata = NULL; /* hush, gcc */ -- -- while (nelem--) { -- if (pageidx > PAGE_SIZE-size) { -- struct page *page; -- pos = pos->next; -- page = list_entry(pos, struct page, lru); -- pagedata = page_address(page); -- pageidx = 0; -- } -- -- ret = (*fn)(pagedata + pageidx, state); -- if (ret) -- break; -- pageidx += size; -- } -- -- return ret; --} -- --struct mmap_mfn_state { -- unsigned long va; -- struct vm_area_struct *vma; -- domid_t domain; --}; -- --static int mmap_mfn_range(void *data, void *state) --{ -- struct privcmd_mmap_entry *msg = data; -- struct mmap_mfn_state *st = state; -- struct vm_area_struct *vma = st->vma; -- int rc; -- -- /* Do not allow range to wrap the address space. */ -- if ((msg->npages > (LONG_MAX >> PAGE_SHIFT)) || -- ((unsigned long)(msg->npages << PAGE_SHIFT) >= -st->va)) -- return -EINVAL; -- -- /* Range chunks must be contiguous in va space. */ -- if ((msg->va != st->va) || -- ((msg->va+(msg->npages< vma->vm_end)) -- return -EINVAL; -- -- rc = xen_remap_domain_mfn_range(vma, -- msg->va & PAGE_MASK, -- msg->mfn, msg->npages, -- vma->vm_page_prot, -- st->domain); -- if (rc < 0) -- return rc; -- -- st->va += msg->npages << PAGE_SHIFT; -- -- return 0; --} -- --static long privcmd_ioctl_mmap(void __user *udata) --{ -- struct privcmd_mmap mmapcmd; -- struct mm_struct *mm = current->mm; -- struct vm_area_struct *vma; -- int rc; -- LIST_HEAD(pagelist); -- struct mmap_mfn_state state; -- -- if (!xen_initial_domain()) -- return -EPERM; -- -- if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd))) -- return -EFAULT; -- -- rc = gather_array(&pagelist, -- mmapcmd.num, sizeof(struct privcmd_mmap_entry), -- mmapcmd.entry); -- -- if (rc || list_empty(&pagelist)) -- goto out; -- -- down_write(&mm->mmap_sem); -- -- { -- struct page *page = list_first_entry(&pagelist, -- struct page, lru); -- struct privcmd_mmap_entry *msg = page_address(page); -- -- vma = find_vma(mm, msg->va); -- rc = -EINVAL; -- -- if (!vma || (msg->va != vma->vm_start) || -- !privcmd_enforce_singleshot_mapping(vma)) -- goto out_up; -- } -- -- state.va = vma->vm_start; -- state.vma = vma; -- state.domain = mmapcmd.dom; -- -- rc = traverse_pages(mmapcmd.num, sizeof(struct privcmd_mmap_entry), -- &pagelist, -- mmap_mfn_range, &state); -- -- --out_up: -- up_write(&mm->mmap_sem); -- --out: -- free_page_list(&pagelist); -- -- return rc; --} -- --struct mmap_batch_state { -- domid_t domain; -- unsigned long va; -- struct vm_area_struct *vma; -- int err; -- -- xen_pfn_t __user *user; --}; -- --static int mmap_batch_fn(void *data, void *state) --{ -- xen_pfn_t *mfnp = data; -- struct mmap_batch_state *st = state; -- -- if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, -- st->vma->vm_page_prot, st->domain) < 0) { -- *mfnp |= 0xf0000000U; -- st->err++; -- } -- st->va += PAGE_SIZE; -- -- return 0; --} -- --static int mmap_return_errors(void *data, void *state) --{ -- xen_pfn_t *mfnp = data; -- struct mmap_batch_state *st = state; -- -- return put_user(*mfnp, st->user++); --} -- --static struct vm_operations_struct privcmd_vm_ops; -- --static long privcmd_ioctl_mmap_batch(void __user *udata) --{ -- int ret; -- struct privcmd_mmapbatch m; -- struct mm_struct *mm = current->mm; -- struct vm_area_struct *vma; -- unsigned long nr_pages; -- LIST_HEAD(pagelist); -- struct mmap_batch_state state; -- -- if (!xen_initial_domain()) -- return -EPERM; -- -- if (copy_from_user(&m, udata, sizeof(m))) -- return -EFAULT; -- -- nr_pages = m.num; -- if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) -- return -EINVAL; -- -- ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), -- m.arr); -- -- if (ret || list_empty(&pagelist)) -- goto out; -- -- down_write(&mm->mmap_sem); -- -- vma = find_vma(mm, m.addr); -- ret = -EINVAL; -- if (!vma || -- vma->vm_ops != &privcmd_vm_ops || -- (m.addr != vma->vm_start) || -- ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || -- !privcmd_enforce_singleshot_mapping(vma)) { -- up_write(&mm->mmap_sem); -- goto out; -- } -- -- state.domain = m.dom; -- state.vma = vma; -- state.va = m.addr; -- state.err = 0; -- -- ret = traverse_pages(m.num, sizeof(xen_pfn_t), -- &pagelist, mmap_batch_fn, &state); -- -- up_write(&mm->mmap_sem); -- -- if (state.err > 0) { -- state.user = m.arr; -- ret = traverse_pages(m.num, sizeof(xen_pfn_t), -- &pagelist, -- mmap_return_errors, &state); -- } -- --out: -- free_page_list(&pagelist); -- -- return ret; --} -- --static long privcmd_ioctl(struct file *file, -- unsigned int cmd, unsigned long data) --{ -- int ret = -ENOSYS; -- void __user *udata = (void __user *) data; -- -- switch (cmd) { -- case IOCTL_PRIVCMD_HYPERCALL: -- ret = privcmd_ioctl_hypercall(udata); -- break; -- -- case IOCTL_PRIVCMD_MMAP: -- ret = privcmd_ioctl_mmap(udata); -- break; -- -- case IOCTL_PRIVCMD_MMAPBATCH: -- ret = privcmd_ioctl_mmap_batch(udata); -- break; -- -- default: -- ret = -EINVAL; -- break; -- } -- -- return ret; --} -- --#ifndef HAVE_ARCH_PRIVCMD_MMAP --static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) --{ -- printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n", -- vma, vma->vm_start, vma->vm_end, -- vmf->pgoff, vmf->virtual_address); -- -- return VM_FAULT_SIGBUS; --} -- --static struct vm_operations_struct privcmd_vm_ops = { -- .fault = privcmd_fault --}; -- --static int privcmd_mmap(struct file *file, struct vm_area_struct *vma) --{ -- /* Unsupported for auto-translate guests. */ -- if (xen_feature(XENFEAT_auto_translated_physmap)) -- return -ENOSYS; -- -- /* DONTCOPY is essential for Xen because copy_page_range doesn't know -- * how to recreate these mappings */ -- vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP; -- vma->vm_ops = &privcmd_vm_ops; -- vma->vm_private_data = NULL; -- -- return 0; --} -- --static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma) --{ -- return (xchg(&vma->vm_private_data, (void *)1) == NULL); --} --#endif -- --const struct file_operations privcmd_file_ops = { -- .unlocked_ioctl = privcmd_ioctl, -- .mmap = privcmd_mmap, --}; -diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c -index 1aa3897..a55fbf9 100644 ---- a/drivers/xen/xenfs/super.c -+++ b/drivers/xen/xenfs/super.c -@@ -16,6 +16,7 @@ - #include - - #include "xenfs.h" -+#include "../privcmd.h" - - #include - -@@ -84,7 +85,7 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent) - [1] = {}, - { "xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR }, - { "capabilities", &capabilities_file_ops, S_IRUGO }, -- { "privcmd", &privcmd_file_ops, S_IRUSR|S_IWUSR }, -+ { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR }, - {""}, - }; - int rc; -diff --git a/drivers/xen/xenfs/xenfs.h b/drivers/xen/xenfs/xenfs.h -index b68aa62..5056306 100644 ---- a/drivers/xen/xenfs/xenfs.h -+++ b/drivers/xen/xenfs/xenfs.h -@@ -2,7 +2,6 @@ - #define _XENFS_XENBUS_H - - extern const struct file_operations xenbus_file_ops; --extern const struct file_operations privcmd_file_ops; - extern const struct file_operations xsd_kva_file_ops; - extern const struct file_operations xsd_port_file_ops; - --- -1.7.6.4 - diff --git a/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch b/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch deleted file mode 100644 index 1a9eecb..0000000 --- a/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch +++ /dev/null @@ -1,177 +0,0 @@ -From 8fd04efb7e41da12d85ad382b7c7092fe832bebb Mon Sep 17 00:00:00 2001 -From: Tang Liang -Date: Fri, 9 Dec 2011 10:05:54 +0800 -Subject: x86, acpi, tboot: Have a ACPI os prepare sleep instead of calling - tboot_sleep. - -The ACPI suspend path makes a call to tboot_sleep right before -it writes the PM1A, PM1B values. We replace the direct call to -tboot via an registration callback similar to __acpi_register_gsi. - -CC: Thomas Gleixner -CC: "H. Peter Anvin" -CC: x86@kernel.org -CC: Len Brown -Acked-by: Joseph Cihula -CC: Shane Wang -CC: xen-devel@lists.xensource.com -CC: linux-pm@lists.linux-foundation.org -CC: tboot-devel@lists.sourceforge.net -CC: linux-acpi@vger.kernel.org -[v1: Added __attribute__ ((unused))] -[v2: Introduced a wrapper instead of changing tboot_sleep return values] -[v3: Added return value AE_CTRL_SKIP for acpi_os_sleep_prepare] -Signed-off-by: Tang Liang -[v1: Fix compile issues on IA64 and PPC64] -[v2: Fix where __acpi_os_prepare_sleep==NULL and did not go in sleep properly] -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/kernel/tboot.c | 8 ++++++++ - drivers/acpi/acpica/hwsleep.c | 10 +++++++--- - drivers/acpi/osl.c | 24 ++++++++++++++++++++++++ - include/acpi/acexcep.h | 1 + - include/linux/acpi.h | 10 ++++++++++ - include/linux/tboot.h | 1 - - 6 files changed, 50 insertions(+), 4 deletions(-) - -diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c -index e2410e2..1a4ab7d 100644 ---- a/arch/x86/kernel/tboot.c -+++ b/arch/x86/kernel/tboot.c -@@ -297,6 +297,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) - - tboot_shutdown(acpi_shutdown_map[sleep_state]); - } -+static int tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control, -+ u32 pm1b_control) -+{ -+ tboot_sleep(sleep_state, pm1a_control, pm1b_control); -+ return 0; -+} - - static atomic_t ap_wfs_count; - -@@ -345,6 +351,8 @@ static __init int tboot_late_init(void) - - atomic_set(&ap_wfs_count, 0); - register_hotcpu_notifier(&tboot_cpu_notifier); -+ -+ acpi_os_set_prepare_sleep(&tboot_sleep_wrapper); - return 0; - } - -diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c -index d52da30..992359a 100644 ---- a/drivers/acpi/acpica/hwsleep.c -+++ b/drivers/acpi/acpica/hwsleep.c -@@ -43,9 +43,9 @@ - */ - - #include -+#include - #include "accommon.h" - #include "actables.h" --#include - #include - - #define _COMPONENT ACPI_HARDWARE -@@ -344,8 +344,12 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) - - ACPI_FLUSH_CPU_CACHE(); - -- tboot_sleep(sleep_state, pm1a_control, pm1b_control); -- -+ status = acpi_os_prepare_sleep(sleep_state, pm1a_control, -+ pm1b_control); -+ if (ACPI_SKIP(status)) -+ return_ACPI_STATUS(AE_OK); -+ if (ACPI_FAILURE(status)) -+ return_ACPI_STATUS(status); - /* Write #2: Write both SLP_TYP + SLP_EN */ - - status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control); -diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c -index f31c5c5..f3aae4b 100644 ---- a/drivers/acpi/osl.c -+++ b/drivers/acpi/osl.c -@@ -76,6 +76,9 @@ EXPORT_SYMBOL(acpi_in_debugger); - extern char line_buf[80]; - #endif /*ENABLE_DEBUGGER */ - -+static int (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl, -+ u32 pm1b_ctrl); -+ - static acpi_osd_handler acpi_irq_handler; - static void *acpi_irq_context; - static struct workqueue_struct *kacpid_wq; -@@ -1659,3 +1662,24 @@ acpi_status acpi_os_terminate(void) - - return AE_OK; - } -+ -+acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control, -+ u32 pm1b_control) -+{ -+ int rc = 0; -+ if (__acpi_os_prepare_sleep) -+ rc = __acpi_os_prepare_sleep(sleep_state, -+ pm1a_control, pm1b_control); -+ if (rc < 0) -+ return AE_ERROR; -+ else if (rc > 0) -+ return AE_CTRL_SKIP; -+ -+ return AE_OK; -+} -+ -+void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state, -+ u32 pm1a_ctrl, u32 pm1b_ctrl)) -+{ -+ __acpi_os_prepare_sleep = func; -+} -diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h -index 5b6c391..fa0d22c 100644 ---- a/include/acpi/acexcep.h -+++ b/include/acpi/acexcep.h -@@ -57,6 +57,7 @@ - #define ACPI_SUCCESS(a) (!(a)) - #define ACPI_FAILURE(a) (a) - -+#define ACPI_SKIP(a) (a == AE_CTRL_SKIP) - #define AE_OK (acpi_status) 0x0000 - - /* -diff --git a/include/linux/acpi.h b/include/linux/acpi.h -index 627a3a4..9393f73 100644 ---- a/include/linux/acpi.h -+++ b/include/linux/acpi.h -@@ -363,4 +363,14 @@ static inline int suspend_nvs_register(unsigned long a, unsigned long b) - } - #endif - -+#ifdef CONFIG_ACPI -+void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state, -+ u32 pm1a_ctrl, u32 pm1b_ctrl)); -+ -+acpi_status acpi_os_prepare_sleep(u8 sleep_state, -+ u32 pm1a_control, u32 pm1b_control); -+#else -+#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0) -+#endif -+ - #endif /*_LINUX_ACPI_H*/ -diff --git a/include/linux/tboot.h b/include/linux/tboot.h -index 1dba6ee..c75128b 100644 ---- a/include/linux/tboot.h -+++ b/include/linux/tboot.h -@@ -143,7 +143,6 @@ static inline int tboot_enabled(void) - - extern void tboot_probe(void); - extern void tboot_shutdown(u32 shutdown_type); --extern void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control); - extern struct acpi_table_header *tboot_get_dmar_table( - struct acpi_table_header *dmar_tbl); - extern int tboot_force_iommu(void); --- -1.7.6.4 - diff --git a/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch b/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch deleted file mode 100644 index 86f2196..0000000 --- a/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 6f327383cd7ebef1fcc092e2d759ceb9d90dfb36 Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Thu, 8 Dec 2011 17:14:08 +0800 -Subject: tboot: Add return values for tboot_sleep - -.. as appropiately. As tboot_sleep now returns values. -remove tboot_sleep_wrapper. - -Suggested-by: "Rafael J. Wysocki" -Acked-by: Joseph Cihula -[v1: Return -1/0/+1 instead of ACPI_xx values] -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/kernel/tboot.c | 13 ++++--------- - 1 files changed, 4 insertions(+), 9 deletions(-) - -diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c -index 1a4ab7d..6410744 100644 ---- a/arch/x86/kernel/tboot.c -+++ b/arch/x86/kernel/tboot.c -@@ -272,7 +272,7 @@ static void tboot_copy_fadt(const struct acpi_table_fadt *fadt) - offsetof(struct acpi_table_facs, firmware_waking_vector); - } - --void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) -+static int tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) - { - static u32 acpi_shutdown_map[ACPI_S_STATE_COUNT] = { - /* S0,1,2: */ -1, -1, -1, -@@ -281,7 +281,7 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) - /* S5: */ TB_SHUTDOWN_S5 }; - - if (!tboot_enabled()) -- return; -+ return 0; - - tboot_copy_fadt(&acpi_gbl_FADT); - tboot->acpi_sinfo.pm1a_cnt_val = pm1a_control; -@@ -292,15 +292,10 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) - if (sleep_state >= ACPI_S_STATE_COUNT || - acpi_shutdown_map[sleep_state] == -1) { - pr_warning("unsupported sleep state 0x%x\n", sleep_state); -- return; -+ return -1; - } - - tboot_shutdown(acpi_shutdown_map[sleep_state]); --} --static int tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control, -- u32 pm1b_control) --{ -- tboot_sleep(sleep_state, pm1a_control, pm1b_control); - return 0; - } - -@@ -352,7 +347,7 @@ static __init int tboot_late_init(void) - atomic_set(&ap_wfs_count, 0); - register_hotcpu_notifier(&tboot_cpu_notifier); - -- acpi_os_set_prepare_sleep(&tboot_sleep_wrapper); -+ acpi_os_set_prepare_sleep(&tboot_sleep); - return 0; - } - --- -1.7.6.4 - diff --git a/patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch b/patches.xen/pvops-0003-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch similarity index 100% rename from patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch rename to patches.xen/pvops-0003-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch diff --git a/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch b/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch deleted file mode 100644 index 954b8ff..0000000 --- a/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch +++ /dev/null @@ -1,197 +0,0 @@ -From 9b10575276a220543b8791f2cb8268fbd4a0bc2e Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Thu, 8 Dec 2011 17:32:23 +0800 -Subject: xen/acpi/sleep: Enable ACPI sleep via the __acpi_os_prepare_sleep - -Provide the registration callback to call in the Xen's -ACPI sleep functionality. This means that during S3/S5 -we make a hypercall XENPF_enter_acpi_sleep with the -proper PM1A/PM1B registers. - -Based of Ke Yu's initial idea. -[ From http://xenbits.xensource.com/linux-2.6.18-xen.hg -change c68699484a65 ] - -[v1: Added Copyright and license] -[v2: Added check if PM1A/B the 16-bits MSB contain something. The spec - only uses 16-bits but might have more in future] -Signed-off-by: Liang Tang -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/xen/enlighten.c | 3 ++ - drivers/xen/Makefile | 2 +- - drivers/xen/acpi.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ - include/xen/acpi.h | 58 +++++++++++++++++++++++++++++++++++++++++++ - 4 files changed, 124 insertions(+), 1 deletions(-) - create mode 100644 drivers/xen/acpi.c - create mode 100644 include/xen/acpi.h - -diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c -index 12eb07b..a5277c2 100644 ---- a/arch/x86/xen/enlighten.c -+++ b/arch/x86/xen/enlighten.c -@@ -42,6 +42,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -1275,6 +1276,8 @@ asmlinkage void __init xen_start_kernel(void) - - /* Make sure ACS will be enabled */ - pci_request_acs(); -+ -+ xen_acpi_sleep_register(); - } - #ifdef CONFIG_PCI - /* PCI BIOS service won't work from a PV guest. */ -diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile -index aa31337..77a845f 100644 ---- a/drivers/xen/Makefile -+++ b/drivers/xen/Makefile -@@ -17,7 +17,7 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o - obj-$(CONFIG_XEN_PVHVM) += platform-pci.o - obj-$(CONFIG_XEN_TMEM) += tmem.o - obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o --obj-$(CONFIG_XEN_DOM0) += pci.o -+obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o - obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ - obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o - -diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c -new file mode 100644 -index 0000000..119d42a ---- /dev/null -+++ b/drivers/xen/acpi.c -@@ -0,0 +1,62 @@ -+/****************************************************************************** -+ * acpi.c -+ * acpi file for domain 0 kernel -+ * -+ * Copyright (c) 2011 Konrad Rzeszutek Wilk -+ * Copyright (c) 2011 Yu Ke ke.yu@intel.com -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License version 2 -+ * as published by the Free Software Foundation; or, when distributed -+ * separately from the Linux kernel or incorporated into other -+ * software packages, subject to the following license: -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a copy -+ * of this source file (the "Software"), to deal in the Software without -+ * restriction, including without limitation the rights to use, copy, modify, -+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included in -+ * all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -+ * IN THE SOFTWARE. -+ */ -+ -+#include -+#include -+#include -+#include -+ -+int xen_acpi_notify_hypervisor_state(u8 sleep_state, -+ u32 pm1a_cnt, u32 pm1b_cnt) -+{ -+ struct xen_platform_op op = { -+ .cmd = XENPF_enter_acpi_sleep, -+ .interface_version = XENPF_INTERFACE_VERSION, -+ .u = { -+ .enter_acpi_sleep = { -+ .pm1a_cnt_val = (u16)pm1a_cnt, -+ .pm1b_cnt_val = (u16)pm1b_cnt, -+ .sleep_state = sleep_state, -+ }, -+ }, -+ }; -+ -+ if ((pm1a_cnt & 0xffff0000) || (pm1b_cnt & 0xffff0000)) { -+ WARN(1, "Using more than 16bits of PM1A/B 0x%x/0x%x!" -+ "Email xen-devel@lists.xensource.com Thank you.\n", \ -+ pm1a_cnt, pm1b_cnt); -+ return -1; -+ } -+ -+ HYPERVISOR_dom0_op(&op); -+ return 1; -+} -diff --git a/include/xen/acpi.h b/include/xen/acpi.h -new file mode 100644 -index 0000000..48a9c01 ---- /dev/null -+++ b/include/xen/acpi.h -@@ -0,0 +1,58 @@ -+/****************************************************************************** -+ * acpi.h -+ * acpi file for domain 0 kernel -+ * -+ * Copyright (c) 2011 Konrad Rzeszutek Wilk -+ * Copyright (c) 2011 Yu Ke -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License version 2 -+ * as published by the Free Software Foundation; or, when distributed -+ * separately from the Linux kernel or incorporated into other -+ * software packages, subject to the following license: -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a copy -+ * of this source file (the "Software"), to deal in the Software without -+ * restriction, including without limitation the rights to use, copy, modify, -+ * merge, publish, distribute, sublicense, and/or sell copies of the Software, -+ * and to permit persons to whom the Software is furnished to do so, subject to -+ * the following conditions: -+ * -+ * The above copyright notice and this permission notice shall be included in -+ * all copies or substantial portions of the Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -+ * IN THE SOFTWARE. -+ */ -+ -+#ifndef _XEN_ACPI_H -+#define _XEN_ACPI_H -+ -+#include -+ -+#ifdef CONFIG_XEN_DOM0 -+#include -+#include -+#include -+ -+int xen_acpi_notify_hypervisor_state(u8 sleep_state, -+ u32 pm1a_cnt, u32 pm1b_cnd); -+ -+static inline void xen_acpi_sleep_register(void) -+{ -+ if (xen_initial_domain()) -+ acpi_os_set_prepare_sleep( -+ &xen_acpi_notify_hypervisor_state); -+} -+#else -+static inline void xen_acpi_sleep_register(void) -+{ -+} -+#endif -+ -+#endif /* _XEN_ACPI_H */ --- -1.7.6.4 - diff --git a/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch b/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch deleted file mode 100644 index a138f7d..0000000 --- a/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 86ceafdf50d67bcb2a5196122797a6972bedd279 Mon Sep 17 00:00:00 2001 -From: Tang Liang -Date: Thu, 8 Dec 2011 17:36:39 +0800 -Subject: xen: Utilize the restore_msi_irqs hook. - -to make a hypercall to restore the vectors in the MSI/MSI-X -configuration space. - -Signed-off-by: Tang Liang -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/pci/xen.c | 27 +++++++++++++++++++++++++++ - include/xen/interface/physdev.h | 7 +++++++ - 2 files changed, 34 insertions(+), 0 deletions(-) - -diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c -index 492ade8..249a5ae 100644 ---- a/arch/x86/pci/xen.c -+++ b/arch/x86/pci/xen.c -@@ -324,6 +324,32 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) - out: - return ret; - } -+ -+static void xen_initdom_restore_msi_irqs(struct pci_dev *dev, int irq) -+{ -+ int ret = 0; -+ -+ if (pci_seg_supported) { -+ struct physdev_pci_device restore_ext; -+ -+ restore_ext.seg = pci_domain_nr(dev->bus); -+ restore_ext.bus = dev->bus->number; -+ restore_ext.devfn = dev->devfn; -+ ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi_ext, -+ &restore_ext); -+ if (ret == -ENOSYS) -+ pci_seg_supported = false; -+ WARN(ret && ret != -ENOSYS, "restore_msi_ext -> %d\n", ret); -+ } -+ if (!pci_seg_supported) { -+ struct physdev_restore_msi restore; -+ -+ restore.bus = dev->bus->number; -+ restore.devfn = dev->devfn; -+ ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore); -+ WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret); -+ } -+} - #endif - - static void xen_teardown_msi_irqs(struct pci_dev *dev) -@@ -446,6 +472,7 @@ int __init pci_xen_initial_domain(void) - #ifdef CONFIG_PCI_MSI - x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs; - x86_msi.teardown_msi_irq = xen_teardown_msi_irq; -+ x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; - #endif - xen_setup_acpi_sci(); - __acpi_register_gsi = acpi_register_gsi_xen; -diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h -index c1080d9..0c28989 100644 ---- a/include/xen/interface/physdev.h -+++ b/include/xen/interface/physdev.h -@@ -145,6 +145,13 @@ struct physdev_manage_pci { - uint8_t devfn; - }; - -+#define PHYSDEVOP_restore_msi 19 -+struct physdev_restore_msi { -+ /* IN */ -+ uint8_t bus; -+ uint8_t devfn; -+}; -+ - #define PHYSDEVOP_manage_pci_add_ext 20 - struct physdev_manage_pci_ext { - /* IN */ --- -1.7.6.4 - diff --git a/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch b/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch deleted file mode 100644 index 02739ed..0000000 --- a/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch +++ /dev/null @@ -1,31 +0,0 @@ -From cfb37553f53f993c22aad05c219581dfbc726bcc Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Mon, 23 Jan 2012 10:53:57 -0500 -Subject: xen/setup/pm/acpi: Remove the call to boot_option_idle_override. - -We needed that call in the past to force the kernel to use -default_idle (which called safe_halt, which called xen_safe_halt). - -But set_pm_idle_to_default() does now that, so there is no need -to use this boot option operand. - -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/xen/setup.c | 1 - - 1 files changed, 0 insertions(+), 1 deletions(-) - -diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c -index e03c636..1236623 100644 ---- a/arch/x86/xen/setup.c -+++ b/arch/x86/xen/setup.c -@@ -420,7 +420,6 @@ void __init xen_arch_setup(void) - boot_cpu_data.hlt_works_ok = 1; - #endif - disable_cpuidle(); -- boot_option_idle_override = IDLE_HALT; - WARN_ON(set_pm_idle_to_default()); - fiddle_vdso(); - } --- -1.7.6.4 - diff --git a/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch b/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch deleted file mode 100644 index dfca7f0..0000000 --- a/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch +++ /dev/null @@ -1,216 +0,0 @@ -From d281ee8c6d58a7f5d1f4241238daa315fb959e31 Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Mon, 13 Feb 2012 22:26:32 -0500 -Subject: xen/enlighten: Expose MWAIT and MWAIT_LEAF if hypervisor OKs it. - -For the hypervisor to take advantage of the MWAIT support it needs -to extract from the ACPI _CST the register address. But the -hypervisor does not have the support to parse DSDT so it relies on -the initial domain (dom0) to parse the ACPI Power Management information -and push it up to the hypervisor. The pushing of the data is done -by the processor_harveset_xen module which parses the information that -the ACPI parser has graciously exposed in 'struct acpi_processor'. - -For the ACPI parser to also expose the Cx states for MWAIT, we need -to expose the MWAIT capability (leaf 1). Furthermore we also need to -expose the MWAIT_LEAF capability (leaf 5) for cstate.c to properly -function. - -The hypervisor could expose these flags when it traps the XEN_EMULATE_PREFIX -operations, but it can't do it since it needs to be backwards compatible. -Instead we choose to use the native CPUID to figure out if the MWAIT -capability exists and use the XEN_SET_PDC query hypercall to figure out -if the hypervisor wants us to expose the MWAIT_LEAF capability or not. - -Note: The XEN_SET_PDC query was implemented in c/s 23783: -"ACPI: add _PDC input override mechanism". - -With this in place, instead of - C3 ACPI IOPORT 415 -we get now - C3:ACPI FFH INTEL MWAIT 0x20 - -Note: The cpu_idle which would be calling the mwait variants for idling -never gets set b/c we set the default pm_idle to be the hypercall variant. - -Signed-off-by: Konrad Rzeszutek Wilk ---- - arch/x86/xen/enlighten.c | 92 +++++++++++++++++++++++++++++++++++++- - include/xen/interface/platform.h | 4 +- - 2 files changed, 94 insertions(+), 2 deletions(-) - -diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c -index 12eb07b..4c82936 100644 ---- a/arch/x86/xen/enlighten.c -+++ b/arch/x86/xen/enlighten.c -@@ -62,6 +62,14 @@ - #include - #include - #include -+#include -+ -+#ifdef CONFIG_ACPI -+#include -+#include -+#include -+#include -+#endif - - #include "xen-ops.h" - #include "mmu.h" -@@ -200,13 +208,17 @@ static void __init xen_banner(void) - static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0; - static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; - -+static __read_mostly unsigned int cpuid_leaf1_ecx_set_mask; -+static __read_mostly unsigned int cpuid_leaf5_ecx_val; -+static __read_mostly unsigned int cpuid_leaf5_edx_val; -+ - static void xen_cpuid(unsigned int *ax, unsigned int *bx, - unsigned int *cx, unsigned int *dx) - { - unsigned maskebx = ~0; - unsigned maskecx = ~0; - unsigned maskedx = ~0; -- -+ unsigned setecx = 0; - /* - * Mask out inconvenient features, to try and disable as many - * unsupported kernel subsystems as possible. -@@ -214,9 +226,18 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, - switch (*ax) { - case 1: - maskecx = cpuid_leaf1_ecx_mask; -+ setecx = cpuid_leaf1_ecx_set_mask; - maskedx = cpuid_leaf1_edx_mask; - break; - -+ case CPUID_MWAIT_LEAF: -+ /* Synthesize the values.. */ -+ *ax = 0; -+ *bx = 0; -+ *cx = cpuid_leaf5_ecx_val; -+ *dx = cpuid_leaf5_edx_val; -+ return; -+ - case CPUID_THERM_POWER_LEAF: - /* Disabling APERFMPERF for kernel usage */ - maskecx = ~(1 << APERFMPERF_PRESENT); -@@ -232,9 +253,75 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, - - *bx &= maskebx; - *cx &= maskecx; -+ *cx |= setecx; - *dx &= maskedx; -+ - } - -+static bool __init xen_check_mwait(void) -+{ -+#if CONFIG_ACPI -+ struct xen_platform_op op = { -+ .cmd = XENPF_set_processor_pminfo, -+ .u.set_pminfo.id = -1, -+ .u.set_pminfo.type = XEN_PM_PDC, -+ }; -+ uint32_t buf[3]; -+ unsigned int ax, bx, cx, dx; -+ unsigned int mwait_mask; -+ -+ /* We need to determine whether it is OK to expose the MWAIT -+ * capability to the kernel to harvest deeper than C3 states from ACPI -+ * _CST using the processor_harvest_xen.c module. For this to work, we -+ * need to gather the MWAIT_LEAF values (which the cstate.c code -+ * checks against). The hypervisor won't expose the MWAIT flag because -+ * it would break backwards compatibility; so we will find out directly -+ * from the hardware and hypercall. -+ */ -+ if (!xen_initial_domain()) -+ return false; -+ -+ ax = 1; -+ cx = 0; -+ -+ native_cpuid(&ax, &bx, &cx, &dx); -+ -+ mwait_mask = (1 << (X86_FEATURE_EST % 32)) | -+ (1 << (X86_FEATURE_MWAIT % 32)); -+ -+ if ((cx & mwait_mask) != mwait_mask) -+ return false; -+ -+ /* We need to emulate the MWAIT_LEAF and for that we need both -+ * ecx and edx. The hypercall provides only partial information. -+ */ -+ -+ ax = CPUID_MWAIT_LEAF; -+ bx = 0; -+ cx = 0; -+ dx = 0; -+ -+ native_cpuid(&ax, &bx, &cx, &dx); -+ -+ /* Ask the Hypervisor whether to clear ACPI_PDC_C_C2C3_FFH. If so, -+ * don't expose MWAIT_LEAF and let ACPI pick the IOPORT version of C3. -+ */ -+ buf[0] = ACPI_PDC_REVISION_ID; -+ buf[1] = 1; -+ buf[2] = (ACPI_PDC_C_CAPABILITY_SMP | ACPI_PDC_EST_CAPABILITY_SWSMP); -+ -+ set_xen_guest_handle(op.u.set_pminfo.pdc, buf); -+ -+ if ((HYPERVISOR_dom0_op(&op) == 0) && -+ (buf[2] & (ACPI_PDC_C_C1_FFH | ACPI_PDC_C_C2C3_FFH))) { -+ cpuid_leaf5_ecx_val = cx; -+ cpuid_leaf5_edx_val = dx; -+ } -+ return true; -+#else -+ return false; -+#endif -+} - static void __init xen_init_cpuid_mask(void) - { - unsigned int ax, bx, cx, dx; -@@ -261,6 +348,9 @@ static void __init xen_init_cpuid_mask(void) - /* Xen will set CR4.OSXSAVE if supported and not disabled by force */ - if ((cx & xsave_mask) != xsave_mask) - cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */ -+ -+ if (xen_check_mwait()) -+ cpuid_leaf1_ecx_set_mask = (1 << (X86_FEATURE_MWAIT % 32)); - } - - static void xen_set_debugreg(int reg, unsigned long val) -diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h -index c168468..6220b98 100644 ---- a/include/xen/interface/platform.h -+++ b/include/xen/interface/platform.h -@@ -200,7 +200,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); - #define XEN_PM_CX 0 - #define XEN_PM_PX 1 - #define XEN_PM_TX 2 -- -+#define XEN_PM_PDC 3 - /* Px sub info type */ - #define XEN_PX_PCT 1 - #define XEN_PX_PSS 2 -@@ -286,6 +286,7 @@ struct xen_processor_performance { - }; - DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); - -+DEFINE_GUEST_HANDLE(uint32_t); - struct xenpf_set_processor_pminfo { - /* IN variables */ - uint32_t id; /* ACPI CPU ID */ -@@ -293,6 +294,7 @@ struct xenpf_set_processor_pminfo { - union { - struct xen_processor_power power;/* Cx: _CST/_CSD */ - struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ -+ GUEST_HANDLE(uint32_t) pdc; - }; - }; - DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); --- -1.7.6.4 - diff --git a/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch b/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch deleted file mode 100644 index 1b16c78..0000000 --- a/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch +++ /dev/null @@ -1,529 +0,0 @@ -From 20e7a07fa0f8a0dbe30a0f732686d78849d29d96 Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Fri, 3 Feb 2012 16:03:20 -0500 -Subject: [CPUFREQ] xen: governor for Xen hypervisor frequency scaling. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This CPU freq governor leaves the frequency decision to the Xen hypervisor. - -To do that the driver parses the Power Management data and uploads said -information to the Xen hypervisor. Then the Xen hypervisor can select the -proper Cx and Pxx states for the initial domain and all other domains. - -To upload the information, this CPU frequency driver reads Power Management (PM) -(_Pxx and _Cx) which are populated in the 'struct acpi_processor' structure. -It simply reads the contents of that structure and pass it up the Xen hypervisor. -For that to work we depend on the appropriate CPU frequency scaling driver -to do the heavy-lifting - so that the contents is correct. - -The CPU frequency governor it has been loaded also sets up a timer -to check if the ACPI IDs count is different from the APIC ID count - which -can happen if the user choose to use dom0_max_vcpu argument. In such a case -a backup of the PM structure is used and uploaded to the hypervisor. - -[v1-v2: Initial RFC implementations that were posted] -[v3: Changed the name to passthru suggested by Pasi Kärkkäinen ] -[v4: Added vCPU != pCPU support - aka dom0_max_vcpus support] -[v5: Cleaned up the driver, fix bug under Athlon XP] -[v6: Changed the driver to a CPU frequency governor] -Signed-off-by: Konrad Rzeszutek Wilk ---- - drivers/xen/Kconfig | 15 ++ - drivers/xen/Makefile | 2 +- - drivers/xen/cpufreq_xen.c | 445 +++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 461 insertions(+), 1 deletions(-) - create mode 100644 drivers/xen/cpufreq_xen.c - -diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig -index a1ced52..28ba371 100644 ---- a/drivers/xen/Kconfig -+++ b/drivers/xen/Kconfig -@@ -178,4 +178,19 @@ config XEN_PRIVCMD - depends on XEN - default m - -+config CPU_FREQ_GOV_XEN -+ tristate "'xen' governor for hypervisor scaling" -+ depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ -+ default m -+ help -+ This cpufreq governor leaves the frequency decision to the Xen hypervisor. -+ -+ To do that the driver parses the Power Management data and uploads said -+ information to the Xen hypervisor. Then the Xen hypervisor can select the -+ proper Cx and Pxx states. -+ -+ To compile this driver as a module, choose M here: the -+ module will be called cpufreq_xen. If you do not know what to choose, -+ select M here. -+ - endmenu -diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile -index aa31337..5802220 100644 ---- a/drivers/xen/Makefile -+++ b/drivers/xen/Makefile -@@ -20,7 +20,7 @@ obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o - obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o - obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ - obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o -- -+obj-$(CONFIG_CPU_FREQ_GOV_XEN) += cpufreq_xen.o - xen-evtchn-y := evtchn.o - xen-gntdev-y := gntdev.o - xen-gntalloc-y := gntalloc.o -diff --git a/drivers/xen/cpufreq_xen.c b/drivers/xen/cpufreq_xen.c -new file mode 100644 -index 0000000..1b709bf ---- /dev/null -+++ b/drivers/xen/cpufreq_xen.c -@@ -0,0 +1,445 @@ -+/* -+ * Copyright 2012 by Oracle Inc -+ * Author: Konrad Rzeszutek Wilk -+ * -+ * This code borrows ideas from https://lkml.org/lkml/2011/11/30/249 -+ * so many thanks go to Kevin Tian -+ * and Yu Ke . -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms and conditions of the GNU General Public License, -+ * version 2, as published by the Free Software Foundation. -+ * -+ * This program is distributed in the hope 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. -+ * -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+#define DRV_NAME "cpufreq-xen" -+ -+static int no_hypercall; -+MODULE_PARM_DESC(off, "Inhibit the hypercall."); -+module_param_named(off, no_hypercall, int, 0400); -+ -+/* -+ * Mutex to protect the acpi_ids_done. -+ */ -+static DEFINE_MUTEX(acpi_ids_mutex); -+/* -+ * Don't think convert this to cpumask_var_t or use cpumask_bit - as those -+ * shrink to nr_cpu_bits (which is dependent on possible_cpu), which can be -+ * less than what we want to put in. -+ */ -+#define NR_ACPI_CPUS NR_CPUS -+#define MAX_ACPI_BITS (BITS_TO_LONGS(NR_ACPI_CPUS)) -+static unsigned long *acpi_ids_done; -+/* -+ * Again, don't convert to cpumask - as we are reading the raw ACPI CPU ids -+ * which can go beyond what we presently see. -+ */ -+static unsigned long *acpi_id_present; -+ -+/* -+ * Pertient data for the timer to be launched to check if the # of -+ * ACPI CPU ids is different from the one we have processed. -+ */ -+#define DELAY_TIMER msecs_to_jiffies(5000 /* 5 sec */) -+static struct acpi_processor *pr_backup; -+static struct delayed_work work; -+ -+static int push_cxx_to_hypervisor(struct acpi_processor *_pr) -+{ -+ struct xen_platform_op op = { -+ .cmd = XENPF_set_processor_pminfo, -+ .interface_version = XENPF_INTERFACE_VERSION, -+ .u.set_pminfo.id = _pr->acpi_id, -+ .u.set_pminfo.type = XEN_PM_CX, -+ }; -+ struct xen_processor_cx *dst_cx, *dst_cx_states = NULL; -+ struct acpi_processor_cx *cx; -+ int i, ok, ret = 0; -+ -+ dst_cx_states = kcalloc(_pr->power.count, -+ sizeof(struct xen_processor_cx), GFP_KERNEL); -+ if (!dst_cx_states) -+ return -ENOMEM; -+ -+ for (ok = 0, i = 1; i <= _pr->power.count; i++) { -+ cx = &_pr->power.states[i]; -+ if (!cx->valid) -+ continue; -+ -+ dst_cx = &(dst_cx_states[ok++]); -+ -+ dst_cx->reg.space_id = ACPI_ADR_SPACE_SYSTEM_IO; -+ if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { -+ dst_cx->reg.bit_width = 8; -+ dst_cx->reg.bit_offset = 0; -+ dst_cx->reg.access_size = 1; -+ } else { -+ dst_cx->reg.space_id = ACPI_ADR_SPACE_FIXED_HARDWARE; -+ if (cx->entry_method == ACPI_CSTATE_FFH) { -+ /* NATIVE_CSTATE_BEYOND_HALT */ -+ dst_cx->reg.bit_offset = 2; -+ dst_cx->reg.bit_width = 1; /* VENDOR_INTEL */ -+ } -+ dst_cx->reg.access_size = 0; -+ } -+ dst_cx->reg.address = cx->address; -+ -+ dst_cx->type = cx->type; -+ dst_cx->latency = cx->latency; -+ dst_cx->power = cx->power; -+ -+ dst_cx->dpcnt = 0; -+ set_xen_guest_handle(dst_cx->dp, NULL); -+#ifdef DEBUG -+ pr_debug(DRV_NAME ": CX: ID:%d [C%d:%s] entry:%d\n", -+ _pr->acpi_id, cx->type, cx->desc, cx->entry_method); -+#endif -+ } -+ if (!ok) { -+ pr_err(DRV_NAME ": No _Cx for CPU %d\n", _pr->acpi_id); -+ kfree(dst_cx_states); -+ return -EINVAL; -+ } -+ op.u.set_pminfo.power.count = ok; -+ op.u.set_pminfo.power.flags.bm_control = _pr->flags.bm_control; -+ op.u.set_pminfo.power.flags.bm_check = _pr->flags.bm_check; -+ op.u.set_pminfo.power.flags.has_cst = _pr->flags.has_cst; -+ op.u.set_pminfo.power.flags.power_setup_done = -+ _pr->flags.power_setup_done; -+ -+ set_xen_guest_handle(op.u.set_pminfo.power.states, dst_cx_states); -+ -+ if (!no_hypercall) -+ ret = HYPERVISOR_dom0_op(&op); -+ -+ if (ret) -+ pr_err(DRV_NAME "(CX): Hypervisor error (%d) for ACPI ID: %d\n", -+ ret, _pr->acpi_id); -+ -+ kfree(dst_cx_states); -+ -+ return ret; -+} -+static struct xen_processor_px * -+xen_copy_pss_data(struct acpi_processor *_pr, -+ struct xen_processor_performance *dst_perf) -+{ -+ struct xen_processor_px *dst_states = NULL; -+ int i; -+ -+ BUILD_BUG_ON(sizeof(struct xen_processor_px) != -+ sizeof(struct acpi_processor_px)); -+ -+ dst_states = kcalloc(_pr->performance->state_count, -+ sizeof(struct xen_processor_px), GFP_KERNEL); -+ if (!dst_states) -+ return ERR_PTR(-ENOMEM); -+ -+ dst_perf->state_count = _pr->performance->state_count; -+ for (i = 0; i < _pr->performance->state_count; i++) { -+ /* Fortunatly for us, they are both the same size */ -+ memcpy(&(dst_states[i]), &(_pr->performance->states[i]), -+ sizeof(struct acpi_processor_px)); -+ } -+ return dst_states; -+} -+static int xen_copy_psd_data(struct acpi_processor *_pr, -+ struct xen_processor_performance *dst) -+{ -+ BUILD_BUG_ON(sizeof(struct xen_psd_package) != -+ sizeof(struct acpi_psd_package)); -+ -+ if (_pr->performance->shared_type != CPUFREQ_SHARED_TYPE_NONE) { -+ dst->shared_type = _pr->performance->shared_type; -+ -+ memcpy(&(dst->domain_info), &(_pr->performance->domain_info), -+ sizeof(struct acpi_psd_package)); -+ } else { -+ if ((&cpu_data(0))->x86_vendor != X86_VENDOR_AMD) -+ return -EINVAL; -+ -+ /* On AMD, the powernow-k8 is loaded before acpi_cpufreq -+ * meaning that acpi_processor_preregister_performance never -+ * gets called which would parse the _PSD. The only relevant -+ * information from _PSD we need is whether it is HW_ALL or any -+ * other type. AMD K8 >= are SW_ALL or SW_ANY, AMD K7<= HW_ANY. -+ * This driver checks at the start whether it is K8 so it -+ * if we get here it can only be K8. -+ */ -+ dst->shared_type = CPUFREQ_SHARED_TYPE_ANY; -+ dst->domain_info.coord_type = DOMAIN_COORD_TYPE_SW_ANY; -+ dst->domain_info.num_processors = num_online_cpus(); -+ } -+ return 0; -+} -+static int xen_copy_pct_data(struct acpi_pct_register *pct, -+ struct xen_pct_register *dst_pct) -+{ -+ /* It would be nice if you could just do 'memcpy(pct, dst_pct') but -+ * sadly the Xen structure did not have the proper padding so the -+ * descriptor field takes two (dst_pct) bytes instead of one (pct). -+ */ -+ dst_pct->descriptor = pct->descriptor; -+ dst_pct->length = pct->length; -+ dst_pct->space_id = pct->space_id; -+ dst_pct->bit_width = pct->bit_width; -+ dst_pct->bit_offset = pct->bit_offset; -+ dst_pct->reserved = pct->reserved; -+ dst_pct->address = pct->address; -+ return 0; -+} -+static int push_pxx_to_hypervisor(struct acpi_processor *_pr) -+{ -+ int ret = 0; -+ struct xen_platform_op op = { -+ .cmd = XENPF_set_processor_pminfo, -+ .interface_version = XENPF_INTERFACE_VERSION, -+ .u.set_pminfo.id = _pr->acpi_id, -+ .u.set_pminfo.type = XEN_PM_PX, -+ }; -+ struct xen_processor_performance *dst_perf; -+ struct xen_processor_px *dst_states = NULL; -+ -+ dst_perf = &op.u.set_pminfo.perf; -+ -+ dst_perf->platform_limit = _pr->performance_platform_limit; -+ dst_perf->flags |= XEN_PX_PPC; -+ xen_copy_pct_data(&(_pr->performance->control_register), -+ &dst_perf->control_register); -+ xen_copy_pct_data(&(_pr->performance->status_register), -+ &dst_perf->status_register); -+ dst_perf->flags |= XEN_PX_PCT; -+ dst_states = xen_copy_pss_data(_pr, dst_perf); -+ if (!IS_ERR_OR_NULL(dst_states)) { -+ set_xen_guest_handle(dst_perf->states, dst_states); -+ dst_perf->flags |= XEN_PX_PSS; -+ } -+ if (!xen_copy_psd_data(_pr, dst_perf)) -+ dst_perf->flags |= XEN_PX_PSD; -+ -+ if (!no_hypercall) -+ ret = HYPERVISOR_dom0_op(&op); -+ -+ if (ret) -+ pr_err(DRV_NAME "(_PXX): Hypervisor error (%d) for ACPI ID %d\n", -+ ret, _pr->acpi_id); -+ -+ if (!IS_ERR_OR_NULL(dst_states)) -+ kfree(dst_states); -+ -+ return ret; -+} -+static int upload_pm_data(struct acpi_processor *_pr) -+{ -+ int err = 0; -+ -+ if (__test_and_set_bit(_pr->acpi_id, acpi_ids_done)) -+ return -EBUSY; -+ -+ if (_pr->flags.power) -+ err = push_cxx_to_hypervisor(_pr); -+ -+ if (_pr->performance && _pr->performance->states) -+ err |= push_pxx_to_hypervisor(_pr); -+ -+ return err; -+} -+static acpi_status -+read_acpi_id(acpi_handle handle, u32 lvl, void *context, void **rv) -+{ -+ u32 acpi_id; -+ acpi_status status; -+ acpi_object_type acpi_type; -+ unsigned long long tmp; -+ union acpi_object object = { 0 }; -+ struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; -+ -+ status = acpi_get_type(handle, &acpi_type); -+ if (ACPI_FAILURE(status)) -+ return AE_OK; -+ -+ switch (acpi_type) { -+ case ACPI_TYPE_PROCESSOR: -+ status = acpi_evaluate_object(handle, NULL, NULL, &buffer); -+ if (ACPI_FAILURE(status)) -+ return AE_OK; -+ acpi_id = object.processor.proc_id; -+ break; -+ case ACPI_TYPE_DEVICE: -+ status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); -+ if (ACPI_FAILURE(status)) -+ return AE_OK; -+ acpi_id = tmp; -+ break; -+ default: -+ return AE_OK; -+ } -+ if (acpi_id > NR_ACPI_CPUS) { -+ WARN_ONCE(1, "There are %d ACPI processors, but kernel can only do %d!\n", -+ acpi_id, NR_ACPI_CPUS); -+ return AE_OK; -+ } -+ __set_bit(acpi_id, acpi_id_present); -+ -+ return AE_OK; -+} -+static unsigned int more_acpi_ids(void) -+{ -+ unsigned int n = 0; -+ -+ acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, -+ ACPI_UINT32_MAX, -+ read_acpi_id, NULL, NULL, NULL); -+ acpi_get_devices("ACPI0007", read_acpi_id, NULL, NULL); -+ -+ mutex_lock(&acpi_ids_mutex); -+ if (!bitmap_equal(acpi_id_present, acpi_ids_done, MAX_ACPI_BITS)) -+ n = bitmap_weight(acpi_id_present, MAX_ACPI_BITS); -+ mutex_unlock(&acpi_ids_mutex); -+ -+ return n; -+} -+static void do_check_acpi_id_timer(struct work_struct *_work) -+{ -+ /* All online CPUs have been processed at this stage. Now verify -+ * whether in fact "online CPUs" == physical CPUs. -+ */ -+ acpi_id_present = kcalloc(MAX_ACPI_BITS, sizeof(unsigned long), GFP_KERNEL); -+ if (!acpi_id_present) -+ return; -+ memset(acpi_id_present, 0, MAX_ACPI_BITS * sizeof(unsigned long)); -+ -+ if (more_acpi_ids()) { -+ int cpu; -+ if (!pr_backup) { -+ schedule_delayed_work(&work, DELAY_TIMER); -+ return; -+ } -+ for_each_set_bit(cpu, acpi_id_present, MAX_ACPI_BITS) { -+ pr_backup->acpi_id = cpu; -+ mutex_lock(&acpi_ids_mutex); -+ (void)upload_pm_data(pr_backup); -+ mutex_unlock(&acpi_ids_mutex); -+ } -+ } -+ kfree(acpi_id_present); -+ acpi_id_present = NULL; -+} -+ -+static int cpufreq_governor_xen(struct cpufreq_policy *policy, -+ unsigned int event) -+{ -+ struct acpi_processor *_pr; -+ -+ switch (event) { -+ case CPUFREQ_GOV_START: -+ case CPUFREQ_GOV_LIMITS: -+ /* Set it to max and let the hypervisor take over */ -+ __cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H); -+ -+ _pr = per_cpu(processors, policy->cpu /* APIC ID */); -+ if (!_pr) -+ break; -+ -+ mutex_lock(&acpi_ids_mutex); -+ if (!pr_backup) { -+ pr_backup = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); -+ memcpy(pr_backup, _pr, sizeof(struct acpi_processor)); -+ -+ INIT_DELAYED_WORK_DEFERRABLE(&work, do_check_acpi_id_timer); -+ schedule_delayed_work(&work, DELAY_TIMER); -+ } -+ (void)upload_pm_data(_pr); -+ mutex_unlock(&acpi_ids_mutex); -+ break; -+ default: -+ break; -+ } -+ return 0; -+} -+static struct cpufreq_governor cpufreq_gov_xen = { -+ .name = "xen", -+ .governor = cpufreq_governor_xen, -+ .owner = THIS_MODULE, -+}; -+static int __init check_prereq(void) -+{ -+ struct cpuinfo_x86 *c = &cpu_data(0); -+ -+ if (!xen_initial_domain()) -+ return -ENODEV; -+ -+ if (!acpi_gbl_FADT.smi_command) -+ return -ENODEV; -+ -+ if (c->x86_vendor == X86_VENDOR_INTEL) { -+ if (!cpu_has(c, X86_FEATURE_EST)) -+ return -ENODEV; -+ -+ return 0; -+ } -+ if (c->x86_vendor == X86_VENDOR_AMD) { -+ u32 hi = 0, lo = 0; -+ /* Copied from powernow-k8.h, can't include ../cpufreq/powernow -+ * as we get compile warnings for the static functions. -+ */ -+#define MSR_PSTATE_CUR_LIMIT 0xc0010061 /* pstate current limit MSR */ -+ rdmsr(MSR_PSTATE_CUR_LIMIT, lo, hi); -+ -+ /* If the MSR cannot provide the data, the powernow-k8 -+ * won't process the data properly either. -+ */ -+ if (hi || lo) -+ return 0; -+ } -+ return -ENODEV; -+} -+ -+static int __init xen_processor_passthru_init(void) -+{ -+ int rc = check_prereq(); -+ -+ if (rc) -+ return rc; -+ -+ acpi_ids_done = kcalloc(MAX_ACPI_BITS, sizeof(unsigned long), GFP_KERNEL); -+ if (!acpi_ids_done) -+ return -ENOMEM; -+ memset(acpi_ids_done, 0, MAX_ACPI_BITS * sizeof(unsigned long)); -+ -+ return cpufreq_register_governor(&cpufreq_gov_xen); -+} -+static void __exit xen_processor_passthru_exit(void) -+{ -+ cpufreq_unregister_governor(&cpufreq_gov_xen); -+ cancel_delayed_work_sync(&work); -+ kfree(acpi_ids_done); -+ kfree(pr_backup); -+} -+ -+MODULE_AUTHOR("Konrad Rzeszutek Wilk "); -+MODULE_DESCRIPTION("CPUfreq policy governor 'xen' which uploads PM data to Xen hypervisor"); -+MODULE_LICENSE("GPL"); -+ -+late_initcall(xen_processor_passthru_init); -+module_exit(xen_processor_passthru_exit); --- -1.7.6.4 - diff --git a/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch b/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch deleted file mode 100644 index 1ecc16c..0000000 --- a/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch +++ /dev/null @@ -1,135 +0,0 @@ -From 76ccc297018d25d55b789bbd508861ef1e2cdb0c Mon Sep 17 00:00:00 2001 -From: Konrad Rzeszutek Wilk -Date: Fri, 16 Dec 2011 17:38:18 -0500 -Subject: x86/PCI: Expand the x86_msi_ops to have a restore MSIs. - -The MSI restore function will become a function pointer in an -x86_msi_ops struct. It defaults to the implementation in the -io_apic.c and msi.c. We piggyback on the indirection mechanism -introduced by "x86: Introduce x86_msi_ops". - -Cc: x86@kernel.org -Cc: Thomas Gleixner -Cc: "H. Peter Anvin" -Cc: linux-pci@vger.kernel.org -Signed-off-by: Konrad Rzeszutek Wilk -Signed-off-by: Jesse Barnes ---- - arch/x86/include/asm/pci.h | 9 +++++++++ - arch/x86/include/asm/x86_init.h | 1 + - arch/x86/kernel/x86_init.c | 1 + - drivers/pci/msi.c | 29 +++++++++++++++++++++++++++-- - 4 files changed, 38 insertions(+), 2 deletions(-) - -diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h -index d498943..df75d07 100644 ---- a/arch/x86/include/asm/pci.h -+++ b/arch/x86/include/asm/pci.h -@@ -112,19 +112,28 @@ static inline void x86_teardown_msi_irq(unsigned int irq) - { - x86_msi.teardown_msi_irq(irq); - } -+static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq) -+{ -+ x86_msi.restore_msi_irqs(dev, irq); -+} - #define arch_setup_msi_irqs x86_setup_msi_irqs - #define arch_teardown_msi_irqs x86_teardown_msi_irqs - #define arch_teardown_msi_irq x86_teardown_msi_irq -+#define arch_restore_msi_irqs x86_restore_msi_irqs - /* implemented in arch/x86/kernel/apic/io_apic. */ - int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); - void native_teardown_msi_irq(unsigned int irq); -+void native_restore_msi_irqs(struct pci_dev *dev, int irq); - /* default to the implementation in drivers/lib/msi.c */ - #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS -+#define HAVE_DEFAULT_MSI_RESTORE_IRQS - void default_teardown_msi_irqs(struct pci_dev *dev); -+void default_restore_msi_irqs(struct pci_dev *dev, int irq); - #else - #define native_setup_msi_irqs NULL - #define native_teardown_msi_irq NULL - #define default_teardown_msi_irqs NULL -+#define default_restore_msi_irqs NULL - #endif - - #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) -diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h -index 1971e65..cd52084 100644 ---- a/arch/x86/include/asm/x86_init.h -+++ b/arch/x86/include/asm/x86_init.h -@@ -177,6 +177,7 @@ struct x86_msi_ops { - int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); - void (*teardown_msi_irq)(unsigned int irq); - void (*teardown_msi_irqs)(struct pci_dev *dev); -+ void (*restore_msi_irqs)(struct pci_dev *dev, int irq); - }; - - extern struct x86_init_ops x86_init; -diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c -index c1d6cd5..83b05ad 100644 ---- a/arch/x86/kernel/x86_init.c -+++ b/arch/x86/kernel/x86_init.c -@@ -114,4 +114,5 @@ struct x86_msi_ops x86_msi = { - .setup_msi_irqs = native_setup_msi_irqs, - .teardown_msi_irq = native_teardown_msi_irq, - .teardown_msi_irqs = default_teardown_msi_irqs, -+ .restore_msi_irqs = default_restore_msi_irqs, - }; -diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c -index 82de95e..a825d78 100644 ---- a/drivers/pci/msi.c -+++ b/drivers/pci/msi.c -@@ -86,6 +86,31 @@ void default_teardown_msi_irqs(struct pci_dev *dev) - } - #endif - -+#ifndef arch_restore_msi_irqs -+# define arch_restore_msi_irqs default_restore_msi_irqs -+# define HAVE_DEFAULT_MSI_RESTORE_IRQS -+#endif -+ -+#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS -+void default_restore_msi_irqs(struct pci_dev *dev, int irq) -+{ -+ struct msi_desc *entry; -+ -+ entry = NULL; -+ if (dev->msix_enabled) { -+ list_for_each_entry(entry, &dev->msi_list, list) { -+ if (irq == entry->irq) -+ break; -+ } -+ } else if (dev->msi_enabled) { -+ entry = irq_get_msi_desc(irq); -+ } -+ -+ if (entry) -+ write_msi_msg(irq, &entry->msg); -+} -+#endif -+ - static void msi_set_enable(struct pci_dev *dev, int pos, int enable) - { - u16 control; -@@ -372,7 +397,7 @@ static void __pci_restore_msi_state(struct pci_dev *dev) - - pci_intx_for_msi(dev, 0); - msi_set_enable(dev, pos, 0); -- write_msi_msg(dev->irq, &entry->msg); -+ arch_restore_msi_irqs(dev, dev->irq); - - pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); - msi_mask_irq(entry, msi_capable_mask(control), entry->masked); -@@ -400,7 +425,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev) - pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); - - list_for_each_entry(entry, &dev->msi_list, list) { -- write_msi_msg(entry->irq, &entry->msg); -+ arch_restore_msi_irqs(dev, entry->irq); - msix_mask_irq(entry, entry->masked); - } - --- -1.7.6.4 - diff --git a/patches.xen/pvops-0100-usb-xen-pvusb-driver.patch b/patches.xen/pvops-0100-usb-xen-pvusb-driver.patch new file mode 100644 index 0000000..4eabd56 --- /dev/null +++ b/patches.xen/pvops-0100-usb-xen-pvusb-driver.patch @@ -0,0 +1,4254 @@ +From 10b675fc21702ff5a9b94fc13e2b504ca09073fd Mon Sep 17 00:00:00 2001 +From: Nathanael Rensen +Date: Tue, 7 Feb 2012 13:50:24 +0800 +Subject: [PATCH] usb: xen pvusb driver + +Port the original Xen PV USB drivers developed by Noboru Iwamatsu + to the Linux pvops kernel. The backend driver +resides in dom0 with access to the physical USB device. The frontend driver +resides in a domU to provide paravirtualised access to physical USB devices. + +For usage, see http://wiki.xensource.com/xenwiki/XenUSBPassthrough. + +Signed-off-by: Nathanael Rensen . +Signed-off-by: Konrad Rzeszutek Wilk +--- + drivers/usb/host/Kconfig | 23 + + drivers/usb/host/Makefile | 2 + + drivers/usb/host/xen-usbback/Makefile | 3 + + drivers/usb/host/xen-usbback/common.h | 170 ++++ + drivers/usb/host/xen-usbback/usbback.c | 1272 +++++++++++++++++++++++ + drivers/usb/host/xen-usbback/usbdev.c | 319 ++++++ + drivers/usb/host/xen-usbback/xenbus.c | 482 +++++++++ + drivers/usb/host/xen-usbfront.c | 1739 ++++++++++++++++++++++++++++++++ + include/xen/interface/io/usbif.h | 150 +++ + 9 files changed, 4160 insertions(+), 0 deletions(-) + create mode 100644 drivers/usb/host/xen-usbback/Makefile + create mode 100644 drivers/usb/host/xen-usbback/common.h + create mode 100644 drivers/usb/host/xen-usbback/usbback.c + create mode 100644 drivers/usb/host/xen-usbback/usbdev.c + create mode 100644 drivers/usb/host/xen-usbback/xenbus.c + create mode 100644 drivers/usb/host/xen-usbfront.c + create mode 100644 include/xen/interface/io/usbif.h + +diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig +index f788eb8..cbb0961 100644 +--- a/drivers/usb/host/Kconfig ++++ b/drivers/usb/host/Kconfig +@@ -675,3 +675,26 @@ config USB_OCTEON_OHCI + for ehci and ohci. + + If unsure, say N. ++ ++config XEN_USBDEV_FRONTEND ++ tristate "Xen pvusb device frontend driver" ++ depends on XEN && USB ++ select XEN_XENBUS_FRONTEND ++ default m ++ help ++ The pvusb device frontend driver allows the kernel to ++ access usb devices exported exported by a virtual ++ machine containing a physical usb device driver. The ++ frontend driver is intended for unprivileged guest domains; ++ if you are compiling a kernel for a Xen guest, you almost ++ certainly want to enable this. ++ ++config XEN_USBDEV_BACKEND ++ tristate "PVUSB device backend driver" ++ depends on XEN_BACKEND && USB ++ default m ++ help ++ The pvusb backend driver allows the kernel to export its usb ++ devices to other guests via a high-performance shared-memory ++ interface. This requires the guest to have the pvusb frontend ++ available. +diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile +index 0982bcc..d62fe38 100644 +--- a/drivers/usb/host/Makefile ++++ b/drivers/usb/host/Makefile +@@ -40,6 +40,8 @@ obj-$(CONFIG_USB_HWA_HCD) += hwa-hc.o + obj-$(CONFIG_USB_IMX21_HCD) += imx21-hcd.o + obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o + obj-$(CONFIG_USB_OCTEON2_COMMON) += octeon2-common.o ++obj-$(CONFIG_XEN_USBDEV_FRONTEND) += xen-usbfront.o ++obj-$(CONFIG_XEN_USBDEV_BACKEND) += xen-usbback/ + obj-$(CONFIG_MIPS_ALCHEMY) += alchemy-common.o + obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o + obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o +diff --git a/drivers/usb/host/xen-usbback/Makefile b/drivers/usb/host/xen-usbback/Makefile +new file mode 100644 +index 0000000..9f3628c +--- /dev/null ++++ b/drivers/usb/host/xen-usbback/Makefile +@@ -0,0 +1,3 @@ ++obj-$(CONFIG_XEN_USBDEV_BACKEND) := xen-usbback.o ++ ++xen-usbback-y := usbdev.o xenbus.o usbback.o +diff --git a/drivers/usb/host/xen-usbback/common.h b/drivers/usb/host/xen-usbback/common.h +new file mode 100644 +index 0000000..d9671ec +--- /dev/null ++++ b/drivers/usb/host/xen-usbback/common.h +@@ -0,0 +1,170 @@ ++/* ++ * This file is part of Xen USB backend driver. ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * 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, see . ++ * ++ * or, by your choice, ++ * ++ * When distributed separately from the Linux kernel or incorporated into ++ * other software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef __XEN_USBBACK__COMMON_H__ ++#define __XEN_USBBACK__COMMON_H__ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define DRV_PFX "xen-usbback:" ++ ++struct xen_usbdev; ++ ++#ifndef BUS_ID_SIZE ++#define XEN_USB_BUS_ID_SIZE 20 ++#else ++#define XEN_USB_BUS_ID_SIZE BUS_ID_SIZE ++#endif ++ ++#define XEN_USB_DEV_ADDR_SIZE 128 ++ ++struct xen_usbif { ++ domid_t domid; ++ unsigned int handle; ++ int num_ports; ++ enum usb_spec_version usb_ver; ++ ++ struct list_head usbif_list; ++ ++ struct xenbus_device *xbdev; ++ ++ unsigned int irq; ++ ++ void *urb_sring; ++ void *conn_sring; ++ struct usbif_urb_back_ring urb_ring; ++ struct usbif_conn_back_ring conn_ring; ++ ++ spinlock_t urb_ring_lock; ++ spinlock_t conn_ring_lock; ++ atomic_t refcnt; ++ ++ struct xenbus_watch backend_watch; ++ ++ /* device address lookup table */ ++ struct xen_usbdev *addr_table[XEN_USB_DEV_ADDR_SIZE]; ++ spinlock_t addr_lock; ++ ++ /* connected device list */ ++ struct list_head dev_list; ++ spinlock_t dev_lock; ++ ++ /* request schedule */ ++ struct task_struct *xenusbd; ++ unsigned int waiting_reqs; ++ wait_queue_head_t waiting_to_free; ++ wait_queue_head_t wq; ++}; ++ ++struct xen_usbport { ++ struct list_head port_list; ++ ++ char phys_bus[XEN_USB_BUS_ID_SIZE]; ++ domid_t domid; ++ unsigned int handle; ++ int portnum; ++ unsigned is_connected:1; ++}; ++ ++struct xen_usbdev { ++ struct kref kref; ++ struct list_head dev_list; ++ ++ struct xen_usbport *port; ++ struct usb_device *udev; ++ struct xen_usbif *usbif; ++ int addr; ++ ++ struct list_head submitting_list; ++ spinlock_t submitting_lock; ++}; ++ ++#define usbif_get(_b) (atomic_inc(&(_b)->refcnt)) ++#define usbif_put(_b) \ ++ do { \ ++ if (atomic_dec_and_test(&(_b)->refcnt)) \ ++ wake_up(&(_b)->waiting_to_free); \ ++ } while (0) ++ ++int xen_usbif_xenbus_init(void); ++void xen_usbif_xenbus_exit(void); ++struct xen_usbif *xen_usbif_find(domid_t domid, unsigned int handle); ++ ++int xen_usbdev_init(void); ++void xen_usbdev_exit(void); ++ ++void xen_usbif_attach_device(struct xen_usbif *usbif, struct xen_usbdev *dev); ++void xen_usbif_detach_device(struct xen_usbif *usbif, struct xen_usbdev *dev); ++void xen_usbif_detach_device_without_lock(struct xen_usbif *usbif, ++ struct xen_usbdev *dev); ++void xen_usbif_hotplug_notify(struct xen_usbif *usbif, int portnum, int speed); ++struct xen_usbdev *xen_usbif_find_attached_device(struct xen_usbif *usbif, ++ int port); ++irqreturn_t xen_usbif_be_int(int irq, void *dev_id); ++int xen_usbif_schedule(void *arg); ++void xen_usbif_unlink_urbs(struct xen_usbdev *dev); ++ ++struct xen_usbport *xen_usbport_find_by_busid(const char *busid); ++struct xen_usbport *xen_usbport_find(const domid_t domid, ++ const unsigned int handle, const int portnum); ++int xen_usbport_add(const char *busid, const domid_t domid, ++ const unsigned int handle, const int portnum); ++int xen_usbport_remove(const domid_t domid, const unsigned int handle, ++ const int portnum); ++#endif /* __XEN_USBBACK__COMMON_H__ */ +diff --git a/drivers/usb/host/xen-usbback/usbback.c b/drivers/usb/host/xen-usbback/usbback.c +new file mode 100644 +index 0000000..df1afa9 +--- /dev/null ++++ b/drivers/usb/host/xen-usbback/usbback.c +@@ -0,0 +1,1272 @@ ++/* ++ * Xen USB backend driver ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * 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, see . ++ * ++ * or, by your choice, ++ * ++ * When distributed separately from the Linux kernel or incorporated into ++ * other software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include ++#include "common.h" ++ ++static int xen_usbif_reqs = USBIF_BACK_MAX_PENDING_REQS; ++module_param_named(reqs, xen_usbif_reqs, int, 0); ++MODULE_PARM_DESC(reqs, "Number of usbback requests to allocate"); ++ ++struct pending_req_segment { ++ uint16_t offset; ++ uint16_t length; ++}; ++ ++struct pending_req { ++ struct xen_usbif *usbif; ++ ++ uint16_t id; /* request id */ ++ ++ struct xen_usbdev *dev; ++ struct list_head urb_list; ++ ++ /* urb */ ++ struct urb *urb; ++ void *buffer; ++ dma_addr_t transfer_dma; ++ struct usb_ctrlrequest *setup; ++ dma_addr_t setup_dma; ++ ++ /* request segments */ ++ uint16_t nr_buffer_segs; ++ /* number of urb->transfer_buffer segments */ ++ uint16_t nr_extra_segs; ++ /* number of iso_frame_desc segments (ISO) */ ++ struct pending_req_segment *seg; ++ ++ struct list_head free_list; ++}; ++ ++#define USBBACK_INVALID_HANDLE (~0) ++ ++struct xen_usbbk { ++ struct pending_req *pending_reqs; ++ struct list_head pending_free; ++ spinlock_t pending_free_lock; ++ wait_queue_head_t pending_free_wq; ++ struct list_head urb_free; ++ spinlock_t urb_free_lock; ++ struct page **pending_pages; ++ grant_handle_t *pending_grant_handles; ++}; ++ ++static struct xen_usbbk *usbbk; ++ ++static inline int vaddr_pagenr(struct pending_req *req, int seg) ++{ ++ return (req - usbbk->pending_reqs) * ++ USBIF_MAX_SEGMENTS_PER_REQUEST + seg; ++} ++ ++#define pending_page(req, seg) pending_pages[vaddr_pagenr(req, seg)] ++ ++static inline unsigned long vaddr(struct pending_req *req, int seg) ++{ ++ unsigned long pfn = page_to_pfn(usbbk->pending_page(req, seg)); ++ return (unsigned long)pfn_to_kaddr(pfn); ++} ++ ++#define pending_handle(_req, _seg) \ ++ (usbbk->pending_grant_handles[vaddr_pagenr(_req, _seg)]) ++ ++static struct pending_req *alloc_req(void) ++{ ++ struct pending_req *req = NULL; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbbk->pending_free_lock, flags); ++ if (!list_empty(&usbbk->pending_free)) { ++ req = list_entry(usbbk->pending_free.next, struct pending_req, ++ free_list); ++ list_del(&req->free_list); ++ } ++ spin_unlock_irqrestore(&usbbk->pending_free_lock, flags); ++ return req; ++} ++ ++static void free_req(struct pending_req *req) ++{ ++ unsigned long flags; ++ int was_empty; ++ ++ spin_lock_irqsave(&usbbk->pending_free_lock, flags); ++ was_empty = list_empty(&usbbk->pending_free); ++ list_add(&req->free_list, &usbbk->pending_free); ++ spin_unlock_irqrestore(&usbbk->pending_free_lock, flags); ++ if (was_empty) ++ wake_up(&usbbk->pending_free_wq); ++} ++ ++static inline void add_req_to_submitting_list(struct xen_usbdev *dev, ++ struct pending_req *pending_req) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->submitting_lock, flags); ++ list_add_tail(&pending_req->urb_list, &dev->submitting_list); ++ spin_unlock_irqrestore(&dev->submitting_lock, flags); ++} ++ ++static inline void remove_req_from_submitting_list(struct xen_usbdev *dev, ++ struct pending_req *pending_req) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->submitting_lock, flags); ++ list_del_init(&pending_req->urb_list); ++ spin_unlock_irqrestore(&dev->submitting_lock, flags); ++} ++ ++void xen_usbif_unlink_urbs(struct xen_usbdev *dev) ++{ ++ struct pending_req *req, *tmp; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&dev->submitting_lock, flags); ++ list_for_each_entry_safe(req, tmp, &dev->submitting_list, urb_list) { ++ usb_unlink_urb(req->urb); ++ } ++ spin_unlock_irqrestore(&dev->submitting_lock, flags); ++} ++ ++static void copy_buff_to_pages(void *buff, struct pending_req *pending_req, ++ int start, int nr_pages) ++{ ++ unsigned long copied = 0; ++ int i; ++ ++ for (i = start; i < start + nr_pages; i++) { ++ memcpy((void *) vaddr(pending_req, i) + ++ pending_req->seg[i].offset, ++ buff + copied, pending_req->seg[i].length); ++ copied += pending_req->seg[i].length; ++ } ++} ++ ++static void copy_pages_to_buff(void *buff, struct pending_req *pending_req, ++ int start, int nr_pages) ++{ ++ unsigned long copied = 0; ++ int i; ++ ++ for (i = start; i < start + nr_pages; i++) { ++ void *src = (void *) vaddr(pending_req, i) + ++ pending_req->seg[i].offset; ++ memcpy(buff + copied, src, pending_req->seg[i].length); ++ copied += pending_req->seg[i].length; ++ } ++} ++ ++static int usbbk_alloc_urb(struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ int ret; ++ ++ if (usb_pipeisoc(req->pipe)) ++ pending_req->urb = usb_alloc_urb(req->u.isoc.number_of_packets, ++ GFP_KERNEL); ++ else ++ pending_req->urb = usb_alloc_urb(0, GFP_KERNEL); ++ if (!pending_req->urb) { ++ pr_alert(DRV_PFX "can't alloc urb\n"); ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ if (req->buffer_length) { ++ pending_req->buffer = ++ usb_alloc_coherent(pending_req->dev->udev, ++ req->buffer_length, GFP_KERNEL, ++ &pending_req->transfer_dma); ++ if (!pending_req->buffer) { ++ pr_alert(DRV_PFX "can't alloc urb buffer\n"); ++ ret = -ENOMEM; ++ goto fail_free_urb; ++ } ++ } ++ ++ if (usb_pipecontrol(req->pipe)) { ++ pending_req->setup = usb_alloc_coherent(pending_req->dev->udev, ++ sizeof(struct usb_ctrlrequest), ++ GFP_KERNEL, &pending_req->setup_dma); ++ if (!pending_req->setup) { ++ pr_alert(DRV_PFX "can't alloc usb_ctrlrequest\n"); ++ ret = -ENOMEM; ++ goto fail_free_buffer; ++ } ++ } ++ ++ return 0; ++ ++fail_free_buffer: ++ if (req->buffer_length) ++ usb_free_coherent(pending_req->dev->udev, req->buffer_length, ++ pending_req->buffer, pending_req->transfer_dma); ++fail_free_urb: ++ usb_free_urb(pending_req->urb); ++fail: ++ return ret; ++} ++ ++static void usbbk_release_urb(struct urb *urb) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbbk->urb_free_lock, flags); ++ list_add(&urb->urb_list, &usbbk->urb_free); ++ spin_unlock_irqrestore(&usbbk->urb_free_lock, flags); ++} ++ ++static void usbbk_free_urb(struct urb *urb) ++{ ++ if (usb_pipecontrol(urb->pipe)) ++ usb_free_coherent(urb->dev, sizeof(struct usb_ctrlrequest), ++ urb->setup_packet, urb->setup_dma); ++ if (urb->transfer_buffer_length) ++ usb_free_coherent(urb->dev, urb->transfer_buffer_length, ++ urb->transfer_buffer, urb->transfer_dma); ++ barrier(); ++ usb_free_urb(urb); ++} ++ ++static void usbbk_free_urbs(void) ++{ ++ unsigned long flags; ++ struct list_head tmp_list; ++ ++ if (list_empty(&usbbk->urb_free)) ++ return; ++ ++ INIT_LIST_HEAD(&tmp_list); ++ ++ spin_lock_irqsave(&usbbk->urb_free_lock, flags); ++ list_splice_init(&usbbk->urb_free, &tmp_list); ++ spin_unlock_irqrestore(&usbbk->urb_free_lock, flags); ++ ++ while (!list_empty(&tmp_list)) { ++ struct urb *next_urb = ++ list_first_entry(&tmp_list, struct urb, urb_list); ++ list_del(&next_urb->urb_list); ++ usbbk_free_urb(next_urb); ++ } ++} ++ ++static void usbif_notify_work(struct xen_usbif *usbif) ++{ ++ usbif->waiting_reqs = 1; ++ wake_up(&usbif->wq); ++} ++ ++irqreturn_t xen_usbif_be_int(int irq, void *dev_id) ++{ ++ usbif_notify_work(dev_id); ++ return IRQ_HANDLED; ++} ++ ++static void xen_usbbk_unmap(struct pending_req *req) ++{ ++ struct gnttab_unmap_grant_ref unmap[USBIF_MAX_SEGMENTS_PER_REQUEST]; ++ unsigned int i, nr_segs, invcount = 0; ++ grant_handle_t handle; ++ int ret; ++ ++ nr_segs = req->nr_buffer_segs + req->nr_extra_segs; ++ ++ if (nr_segs == 0) ++ return; ++ ++ for (i = 0; i < nr_segs; i++) { ++ handle = pending_handle(req, i); ++ if (handle == USBBACK_INVALID_HANDLE) ++ continue; ++ gnttab_set_unmap_op(&unmap[invcount], vaddr(req, i), ++ GNTMAP_host_map, handle); ++ pending_handle(req, i) = USBBACK_INVALID_HANDLE; ++ invcount++; ++ } ++ ++ ret = HYPERVISOR_grant_table_op( ++ GNTTABOP_unmap_grant_ref, unmap, invcount); ++ BUG_ON(ret); ++ /* ++ * Note, we use invcount, not nr_segs, so we can't index ++ * using vaddr(req, i). ++ */ ++ for (i = 0; i < invcount; i++) { ++ ret = m2p_remove_override( ++ virt_to_page(unmap[i].host_addr), false); ++ if (ret) { ++ pr_alert(DRV_PFX "Failed to remove M2P override for " ++ "%lx\n", (unsigned long)unmap[i].host_addr); ++ continue; ++ } ++ } ++ ++ kfree(req->seg); ++} ++ ++static int xen_usbbk_map(struct xen_usbif *usbif, ++ struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ int i, ret; ++ unsigned int nr_segs; ++ uint32_t flags; ++ struct gnttab_map_grant_ref map[USBIF_MAX_SEGMENTS_PER_REQUEST]; ++ ++ nr_segs = pending_req->nr_buffer_segs + pending_req->nr_extra_segs; ++ ++ if (nr_segs == 0) ++ return 0; ++ ++ if (nr_segs > USBIF_MAX_SEGMENTS_PER_REQUEST) { ++ pr_alert(DRV_PFX "Bad number of segments in request\n"); ++ ret = -EINVAL; ++ goto fail; ++ } ++ ++ pending_req->seg = kmalloc(sizeof(struct pending_req_segment) * ++ nr_segs, GFP_KERNEL); ++ if (!pending_req->seg) { ++ ret = -ENOMEM; ++ goto fail; ++ } ++ ++ flags = GNTMAP_host_map; ++ if (usb_pipeout(req->pipe)) ++ flags |= GNTMAP_readonly; ++ for (i = 0; i < pending_req->nr_buffer_segs; i++) { ++ gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags, ++ req->seg[i].gref, usbif->domid); ++ } ++ ++ flags = GNTMAP_host_map; ++ for (i = pending_req->nr_buffer_segs; i < nr_segs; i++) { ++ gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags, ++ req->seg[i].gref, usbif->domid); ++ } ++ ++ ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nr_segs); ++ BUG_ON(ret); ++ ++ for (i = 0; i < nr_segs; i++) { ++ if (unlikely(map[i].status != 0)) { ++ pr_alert(DRV_PFX "invalid buffer " ++ "-- could not remap it (error %d)\n", ++ map[i].status); ++ map[i].handle = USBBACK_INVALID_HANDLE; ++ ret |= 1; ++ } ++ ++ pending_handle(pending_req, i) = map[i].handle; ++ ++ if (ret) ++ continue; ++ ++ ret = m2p_add_override(PFN_DOWN(map[i].dev_bus_addr), ++ usbbk->pending_page(pending_req, i), NULL); ++ if (ret) { ++ pr_alert(DRV_PFX "Failed to install M2P override for " ++ "%lx (ret: %d)\n", ++ (unsigned long)map[i].dev_bus_addr, ret); ++ /* We could switch over to GNTTABOP_copy */ ++ continue; ++ } ++ ++ pending_req->seg[i].offset = req->seg[i].offset; ++ pending_req->seg[i].length = req->seg[i].length; ++ ++ barrier(); ++ ++ if (pending_req->seg[i].offset >= PAGE_SIZE || ++ pending_req->seg[i].length > PAGE_SIZE || ++ pending_req->seg[i].offset + ++ pending_req->seg[i].length > PAGE_SIZE) ++ ret |= 1; ++ } ++ ++ if (ret) ++ goto fail_flush; ++ ++ return 0; ++ ++fail_flush: ++ xen_usbbk_unmap(pending_req); ++ ret = -ENOMEM; ++ ++fail: ++ return ret; ++} ++ ++static void usbbk_do_response(struct pending_req *pending_req, int32_t status, ++ int32_t actual_length, int32_t error_count, ++ uint16_t start_frame) ++{ ++ struct xen_usbif *usbif = pending_req->usbif; ++ struct usbif_urb_response *res; ++ unsigned long flags; ++ int notify; ++ ++ spin_lock_irqsave(&usbif->urb_ring_lock, flags); ++ res = RING_GET_RESPONSE(&usbif->urb_ring, usbif->urb_ring.rsp_prod_pvt); ++ res->id = pending_req->id; ++ res->status = status; ++ res->actual_length = actual_length; ++ res->error_count = error_count; ++ res->start_frame = start_frame; ++ usbif->urb_ring.rsp_prod_pvt++; ++ barrier(); ++ RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&usbif->urb_ring, notify); ++ spin_unlock_irqrestore(&usbif->urb_ring_lock, flags); ++ ++ if (notify) ++ notify_remote_via_irq(usbif->irq); ++} ++ ++static void usbbk_urb_complete(struct urb *urb) ++{ ++ struct pending_req *pending_req = (struct pending_req *)urb->context; ++ ++ if (usb_pipein(urb->pipe) && urb->status == 0 && urb->actual_length > 0) ++ copy_buff_to_pages(pending_req->buffer, pending_req, 0, ++ pending_req->nr_buffer_segs); ++ ++ if (usb_pipeisoc(urb->pipe)) ++ copy_buff_to_pages(&urb->iso_frame_desc[0], pending_req, ++ pending_req->nr_buffer_segs, ++ pending_req->nr_extra_segs); ++ ++ barrier(); ++ ++ xen_usbbk_unmap(pending_req); ++ ++ usbbk_do_response(pending_req, urb->status, urb->actual_length, ++ urb->error_count, urb->start_frame); ++ ++ remove_req_from_submitting_list(pending_req->dev, pending_req); ++ ++ barrier(); ++ usbbk_release_urb(urb); ++ usbif_put(pending_req->usbif); ++ free_req(pending_req); ++} ++ ++static void usbbk_init_urb(struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ unsigned int pipe; ++ struct usb_device *udev = pending_req->dev->udev; ++ struct urb *urb = pending_req->urb; ++ ++ switch (usb_pipetype(req->pipe)) { ++ case PIPE_ISOCHRONOUS: ++ if (usb_pipein(req->pipe)) ++ pipe = usb_rcvisocpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ else ++ pipe = usb_sndisocpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ ++ urb->dev = udev; ++ urb->pipe = pipe; ++ urb->transfer_flags = req->transfer_flags; ++ urb->transfer_flags |= URB_ISO_ASAP; ++ urb->transfer_buffer = pending_req->buffer; ++ urb->transfer_buffer_length = req->buffer_length; ++ urb->complete = usbbk_urb_complete; ++ urb->context = pending_req; ++ urb->interval = req->u.isoc.interval; ++ urb->start_frame = req->u.isoc.start_frame; ++ urb->number_of_packets = req->u.isoc.number_of_packets; ++ ++ break; ++ case PIPE_INTERRUPT: ++ if (usb_pipein(req->pipe)) ++ pipe = usb_rcvintpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ else ++ pipe = usb_sndintpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ ++ usb_fill_int_urb(urb, udev, pipe, ++ pending_req->buffer, req->buffer_length, ++ usbbk_urb_complete, ++ pending_req, req->u.intr.interval); ++ /* ++ * high speed interrupt endpoints use a logarithmic encoding of ++ * the endpoint interval, and usb_fill_int_urb() initializes a ++ * interrupt urb with the encoded interval value. ++ * ++ * req->u.intr.interval is the interval value that already ++ * encoded in the frontend part, and the above ++ * usb_fill_int_urb() initializes the urb->interval with double ++ * encoded value. ++ * ++ * so, simply overwrite the urb->interval with original value. ++ */ ++ urb->interval = req->u.intr.interval; ++ urb->transfer_flags = req->transfer_flags; ++ ++ break; ++ case PIPE_CONTROL: ++ if (usb_pipein(req->pipe)) ++ pipe = usb_rcvctrlpipe(udev, 0); ++ else ++ pipe = usb_sndctrlpipe(udev, 0); ++ ++ usb_fill_control_urb(urb, udev, pipe, ++ (unsigned char *) pending_req->setup, ++ pending_req->buffer, req->buffer_length, ++ usbbk_urb_complete, pending_req); ++ memcpy(pending_req->setup, req->u.ctrl, 8); ++ urb->setup_dma = pending_req->setup_dma; ++ urb->transfer_flags = req->transfer_flags; ++ ++ break; ++ case PIPE_BULK: ++ if (usb_pipein(req->pipe)) ++ pipe = usb_rcvbulkpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ else ++ pipe = usb_sndbulkpipe(udev, ++ usb_pipeendpoint(req->pipe)); ++ ++ usb_fill_bulk_urb(urb, udev, pipe, pending_req->buffer, ++ req->buffer_length, usbbk_urb_complete, ++ pending_req); ++ urb->transfer_flags = req->transfer_flags; ++ ++ break; ++ default: ++ break; ++ } ++ ++ if (req->buffer_length) { ++ urb->transfer_dma = pending_req->transfer_dma; ++ urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; ++ } ++} ++ ++struct set_interface_request { ++ struct pending_req *pending_req; ++ int interface; ++ int alternate; ++ struct work_struct work; ++}; ++ ++static void usbbk_set_interface_work(struct work_struct *arg) ++{ ++ struct set_interface_request *req ++ = container_of(arg, struct set_interface_request, work); ++ struct pending_req *pending_req = req->pending_req; ++ struct usb_device *udev = req->pending_req->dev->udev; ++ ++ int ret; ++ ++ usb_lock_device(udev); ++ ret = usb_set_interface(udev, req->interface, req->alternate); ++ usb_unlock_device(udev); ++ usb_put_dev(udev); ++ ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(pending_req->usbif); ++ free_req(pending_req); ++ kfree(req); ++} ++ ++static int usbbk_set_interface(struct pending_req *pending_req, int interface, ++ int alternate) ++{ ++ struct set_interface_request *req; ++ struct usb_device *udev = pending_req->dev->udev; ++ ++ req = kmalloc(sizeof(*req), GFP_KERNEL); ++ if (!req) ++ return -ENOMEM; ++ req->pending_req = pending_req; ++ req->interface = interface; ++ req->alternate = alternate; ++ INIT_WORK(&req->work, usbbk_set_interface_work); ++ usb_get_dev(udev); ++ schedule_work(&req->work); ++ return 0; ++} ++ ++struct clear_halt_request { ++ struct pending_req *pending_req; ++ int pipe; ++ struct work_struct work; ++}; ++ ++static void usbbk_clear_halt_work(struct work_struct *arg) ++{ ++ struct clear_halt_request *req = container_of(arg, ++ struct clear_halt_request, work); ++ struct pending_req *pending_req = req->pending_req; ++ struct usb_device *udev = req->pending_req->dev->udev; ++ int ret; ++ ++ usb_lock_device(udev); ++ ret = usb_clear_halt(req->pending_req->dev->udev, req->pipe); ++ usb_unlock_device(udev); ++ usb_put_dev(udev); ++ ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(pending_req->usbif); ++ free_req(pending_req); ++ kfree(req); ++} ++ ++static int usbbk_clear_halt(struct pending_req *pending_req, int pipe) ++{ ++ struct clear_halt_request *req; ++ struct usb_device *udev = pending_req->dev->udev; ++ ++ req = kmalloc(sizeof(*req), GFP_KERNEL); ++ if (!req) ++ return -ENOMEM; ++ req->pending_req = pending_req; ++ req->pipe = pipe; ++ INIT_WORK(&req->work, usbbk_clear_halt_work); ++ ++ usb_get_dev(udev); ++ schedule_work(&req->work); ++ return 0; ++} ++ ++#if 0 ++struct port_reset_request { ++ struct pending_req *pending_req; ++ struct work_struct work; ++}; ++ ++static void usbbk_port_reset_work(struct work_struct *arg) ++{ ++ struct port_reset_request *req = container_of(arg, ++ struct port_reset_request, work); ++ struct pending_req *pending_req = req->pending_req; ++ struct usb_device *udev = pending_req->dev->udev; ++ int ret, ret_lock; ++ ++ ret = ret_lock = usb_lock_device_for_reset(udev, NULL); ++ if (ret_lock >= 0) { ++ ret = usb_reset_device(udev); ++ if (ret_lock) ++ usb_unlock_device(udev); ++ } ++ usb_put_dev(udev); ++ ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(pending_req->usbif); ++ free_req(pending_req); ++ kfree(req); ++} ++ ++static int usbbk_port_reset(struct pending_req *pending_req) ++{ ++ struct port_reset_request *req; ++ struct usb_device *udev = pending_req->dev->udev; ++ ++ req = kmalloc(sizeof(*req), GFP_KERNEL); ++ if (!req) ++ return -ENOMEM; ++ ++ req->pending_req = pending_req; ++ INIT_WORK(&req->work, usbbk_port_reset_work); ++ ++ usb_get_dev(udev); ++ schedule_work(&req->work); ++ return 0; ++} ++#endif ++ ++static void usbbk_set_address(struct xen_usbif *usbif, struct xen_usbdev *dev, ++ int cur_addr, int new_addr) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbif->addr_lock, flags); ++ if (cur_addr) ++ usbif->addr_table[cur_addr] = NULL; ++ if (new_addr) ++ usbif->addr_table[new_addr] = dev; ++ dev->addr = new_addr; ++ spin_unlock_irqrestore(&usbif->addr_lock, flags); ++} ++ ++static void process_unlink_req(struct xen_usbif *usbif, ++ struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ struct pending_req *unlink_req = NULL; ++ int devnum; ++ int ret = 0; ++ unsigned long flags; ++ ++ devnum = usb_pipedevice(req->pipe); ++ if (unlikely(devnum == 0)) { ++ pending_req->dev = xen_usbif_find_attached_device(usbif, ++ usbif_pipeportnum(req->pipe)); ++ if (unlikely(!pending_req->dev)) { ++ ret = -ENODEV; ++ goto fail_response; ++ } ++ } else { ++ if (unlikely(!usbif->addr_table[devnum])) { ++ ret = -ENODEV; ++ goto fail_response; ++ } ++ pending_req->dev = usbif->addr_table[devnum]; ++ } ++ ++ spin_lock_irqsave(&pending_req->dev->submitting_lock, flags); ++ list_for_each_entry(unlink_req, &pending_req->dev->submitting_list, ++ urb_list) { ++ if (unlink_req->id == req->u.unlink.unlink_id) { ++ ret = usb_unlink_urb(unlink_req->urb); ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&pending_req->dev->submitting_lock, flags); ++ ++fail_response: ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(usbif); ++ free_req(pending_req); ++ return; ++} ++ ++static int check_and_submit_special_ctrlreq(struct xen_usbif *usbif, ++ struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ int devnum; ++ struct xen_usbdev *dev = NULL; ++ struct usb_ctrlrequest *ctrl = (struct usb_ctrlrequest *) req->u.ctrl; ++ int ret; ++ int done = 0; ++ ++ devnum = usb_pipedevice(req->pipe); ++ ++ /* ++ * When the device is first connected or reseted, USB device has no ++ * address. In this initial state, following requests are send to ++ * device address (#0), ++ * ++ * 1. GET_DESCRIPTOR (with Descriptor Type is "DEVICE") is send, and ++ * OS knows what device is connected to. ++ * ++ * 2. SET_ADDRESS is send, and then, device has its address. ++ * ++ * In the next step, SET_CONFIGURATION is send to addressed device, and ++ * then, the device is finally ready to use. ++ */ ++ if (unlikely(devnum == 0)) { ++ dev = xen_usbif_find_attached_device(usbif, ++ usbif_pipeportnum(req->pipe)); ++ if (unlikely(!dev)) { ++ ret = -ENODEV; ++ goto fail_response; ++ } ++ ++ switch (ctrl->bRequest) { ++ case USB_REQ_GET_DESCRIPTOR: ++ /* ++ * GET_DESCRIPTOR request to device #0. ++ * through to normal urb transfer. ++ */ ++ pending_req->dev = dev; ++ return 0; ++ break; ++ case USB_REQ_SET_ADDRESS: ++ /* ++ * SET_ADDRESS request to device #0. ++ * add attached device to addr_table. ++ */ ++ { ++ __u16 addr = le16_to_cpu(ctrl->wValue); ++ usbbk_set_address(usbif, dev, 0, addr); ++ } ++ ret = 0; ++ goto fail_response; ++ break; ++ default: ++ ret = -EINVAL; ++ goto fail_response; ++ } ++ } else { ++ if (unlikely(!usbif->addr_table[devnum])) { ++ ret = -ENODEV; ++ goto fail_response; ++ } ++ pending_req->dev = usbif->addr_table[devnum]; ++ } ++ ++ /* ++ * Check special request ++ */ ++ switch (ctrl->bRequest) { ++ case USB_REQ_SET_ADDRESS: ++ /* ++ * SET_ADDRESS request to addressed device. ++ * change addr or remove from addr_table. ++ */ ++ { ++ __u16 addr = le16_to_cpu(ctrl->wValue); ++ usbbk_set_address(usbif, dev, devnum, addr); ++ } ++ ret = 0; ++ goto fail_response; ++ break; ++#if 0 ++ case USB_REQ_SET_CONFIGURATION: ++ /* ++ * linux 2.6.27 or later version only! ++ */ ++ if (ctrl->RequestType == USB_RECIP_DEVICE) { ++ __u16 config = le16_to_cpu(ctrl->wValue); ++ usb_driver_set_configuration(pending_req->dev->udev, ++ config); ++ done = 1; ++ } ++ break; ++#endif ++ case USB_REQ_SET_INTERFACE: ++ if (ctrl->bRequestType == USB_RECIP_INTERFACE) { ++ __u16 alt = le16_to_cpu(ctrl->wValue); ++ __u16 intf = le16_to_cpu(ctrl->wIndex); ++ usbbk_set_interface(pending_req, intf, alt); ++ done = 1; ++ } ++ break; ++ case USB_REQ_CLEAR_FEATURE: ++ if (ctrl->bRequestType == USB_RECIP_ENDPOINT ++ && ctrl->wValue == USB_ENDPOINT_HALT) { ++ int pipe; ++ int ep = le16_to_cpu(ctrl->wIndex) & 0x0f; ++ int dir = le16_to_cpu(ctrl->wIndex) & USB_DIR_IN; ++ if (dir) ++ pipe = usb_rcvctrlpipe(pending_req->dev->udev, ++ ep); ++ else ++ pipe = usb_sndctrlpipe(pending_req->dev->udev, ++ ep); ++ usbbk_clear_halt(pending_req, pipe); ++ done = 1; ++ } ++ break; ++#if 0 /* not tested yet */ ++ case USB_REQ_SET_FEATURE: ++ if (ctrl->bRequestType == USB_RT_PORT) { ++ __u16 feat = le16_to_cpu(ctrl->wValue); ++ if (feat == USB_PORT_FEAT_RESET) { ++ usbbk_port_reset(pending_req); ++ done = 1; ++ } ++ } ++ break; ++#endif ++ default: ++ break; ++ } ++ ++ return done; ++ ++fail_response: ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(usbif); ++ free_req(pending_req); ++ return 1; ++} ++ ++static void dispatch_request_to_pending_reqs(struct xen_usbif *usbif, ++ struct usbif_urb_request *req, ++ struct pending_req *pending_req) ++{ ++ int ret; ++ ++ pending_req->id = req->id; ++ pending_req->usbif = usbif; ++ ++ barrier(); ++ ++ usbif_get(usbif); ++ ++ /* unlink request */ ++ if (unlikely(usbif_pipeunlink(req->pipe))) { ++ process_unlink_req(usbif, req, pending_req); ++ return; ++ } ++ ++ if (usb_pipecontrol(req->pipe)) { ++ if (check_and_submit_special_ctrlreq(usbif, req, pending_req)) ++ return; ++ } else { ++ int devnum = usb_pipedevice(req->pipe); ++ if (unlikely(!usbif->addr_table[devnum])) { ++ ret = -ENODEV; ++ goto fail_response; ++ } ++ pending_req->dev = usbif->addr_table[devnum]; ++ } ++ ++ barrier(); ++ ++ ret = usbbk_alloc_urb(req, pending_req); ++ if (ret) { ++ ret = -ESHUTDOWN; ++ goto fail_response; ++ } ++ ++ add_req_to_submitting_list(pending_req->dev, pending_req); ++ ++ barrier(); ++ ++ usbbk_init_urb(req, pending_req); ++ ++ barrier(); ++ ++ pending_req->nr_buffer_segs = req->nr_buffer_segs; ++ if (usb_pipeisoc(req->pipe)) ++ pending_req->nr_extra_segs = req->u.isoc.nr_frame_desc_segs; ++ else ++ pending_req->nr_extra_segs = 0; ++ ++ barrier(); ++ ++ ret = xen_usbbk_map(usbif, req, pending_req); ++ if (ret) { ++ pr_alert(DRV_PFX "invalid buffer\n"); ++ ret = -ESHUTDOWN; ++ goto fail_free_urb; ++ } ++ ++ barrier(); ++ ++ if (usb_pipeout(req->pipe) && req->buffer_length) ++ copy_pages_to_buff(pending_req->buffer, pending_req, 0, ++ pending_req->nr_buffer_segs); ++ if (usb_pipeisoc(req->pipe)) { ++ copy_pages_to_buff(&pending_req->urb->iso_frame_desc[0], ++ pending_req, pending_req->nr_buffer_segs, ++ pending_req->nr_extra_segs); ++ } ++ ++ barrier(); ++ ++ ret = usb_submit_urb(pending_req->urb, GFP_KERNEL); ++ if (ret) { ++ pr_alert(DRV_PFX "failed submitting urb, error %d\n", ret); ++ ret = -ESHUTDOWN; ++ goto fail_flush_area; ++ } ++ return; ++ ++fail_flush_area: ++ xen_usbbk_unmap(pending_req); ++fail_free_urb: ++ remove_req_from_submitting_list(pending_req->dev, pending_req); ++ barrier(); ++ usbbk_release_urb(pending_req->urb); ++fail_response: ++ usbbk_do_response(pending_req, ret, 0, 0, 0); ++ usbif_put(usbif); ++ free_req(pending_req); ++} ++ ++static int usbbk_start_submit_urb(struct xen_usbif *usbif) ++{ ++ struct usbif_urb_back_ring *urb_ring = &usbif->urb_ring; ++ struct usbif_urb_request *req; ++ struct pending_req *pending_req; ++ RING_IDX rc, rp; ++ int more_to_do = 0; ++ ++ rc = urb_ring->req_cons; ++ rp = urb_ring->sring->req_prod; ++ rmb(); ++ ++ while (rc != rp) { ++ if (RING_REQUEST_CONS_OVERFLOW(urb_ring, rc)) { ++ pr_warn(DRV_PFX "RING_REQUEST_CONS_OVERFLOW\n"); ++ break; ++ } ++ ++ pending_req = alloc_req(); ++ if (NULL == pending_req) { ++ more_to_do = 1; ++ break; ++ } ++ ++ req = RING_GET_REQUEST(urb_ring, rc); ++ urb_ring->req_cons = ++rc; ++ ++ dispatch_request_to_pending_reqs(usbif, req, pending_req); ++ } ++ ++ RING_FINAL_CHECK_FOR_REQUESTS(&usbif->urb_ring, more_to_do); ++ ++ cond_resched(); ++ ++ return more_to_do; ++} ++ ++void xen_usbif_hotplug_notify(struct xen_usbif *usbif, int portnum, int speed) ++{ ++ struct usbif_conn_back_ring *ring = &usbif->conn_ring; ++ struct usbif_conn_request *req; ++ struct usbif_conn_response *res; ++ unsigned long flags; ++ u16 id; ++ int notify; ++ ++ spin_lock_irqsave(&usbif->conn_ring_lock, flags); ++ ++ req = RING_GET_REQUEST(ring, ring->req_cons); ++ id = req->id; ++ ring->req_cons++; ++ ring->sring->req_event = ring->req_cons + 1; ++ ++ res = RING_GET_RESPONSE(ring, ring->rsp_prod_pvt); ++ res->id = id; ++ res->portnum = portnum; ++ res->speed = speed; ++ ring->rsp_prod_pvt++; ++ RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(ring, notify); ++ ++ spin_unlock_irqrestore(&usbif->conn_ring_lock, flags); ++ ++ if (notify) ++ notify_remote_via_irq(usbif->irq); ++} ++ ++int xen_usbif_schedule(void *arg) ++{ ++ struct xen_usbif *usbif = (struct xen_usbif *) arg; ++ ++ usbif_get(usbif); ++ ++ while (!kthread_should_stop()) { ++ wait_event_interruptible(usbif->wq, ++ usbif->waiting_reqs || kthread_should_stop()); ++ wait_event_interruptible(usbbk->pending_free_wq, ++ !list_empty(&usbbk->pending_free) || kthread_should_stop()); ++ usbif->waiting_reqs = 0; ++ smp_mb(); ++ ++ if (usbbk_start_submit_urb(usbif)) ++ usbif->waiting_reqs = 1; ++ ++ usbbk_free_urbs(); ++ } ++ ++ usbbk_free_urbs(); ++ usbif->xenusbd = NULL; ++ usbif_put(usbif); ++ ++ return 0; ++} ++ ++/* ++ * attach xen_usbdev device to usbif. ++ */ ++void xen_usbif_attach_device(struct xen_usbif *usbif, struct xen_usbdev *dev) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbif->dev_lock, flags); ++ list_add(&dev->dev_list, &usbif->dev_list); ++ spin_unlock_irqrestore(&usbif->dev_lock, flags); ++ dev->usbif = usbif; ++} ++ ++/* ++ * detach usbdev device from usbif. ++ */ ++void xen_usbif_detach_device(struct xen_usbif *usbif, struct xen_usbdev *dev) ++{ ++ unsigned long flags; ++ ++ if (dev->addr) ++ usbbk_set_address(usbif, dev, dev->addr, 0); ++ spin_lock_irqsave(&usbif->dev_lock, flags); ++ list_del(&dev->dev_list); ++ spin_unlock_irqrestore(&usbif->dev_lock, flags); ++ dev->usbif = NULL; ++} ++ ++void xen_usbif_detach_device_without_lock(struct xen_usbif *usbif, ++ struct xen_usbdev *dev) ++{ ++ if (dev->addr) ++ usbbk_set_address(usbif, dev, dev->addr, 0); ++ list_del(&dev->dev_list); ++ dev->usbif = NULL; ++} ++ ++static int __init xen_usbif_init(void) ++{ ++ int i, mmap_pages; ++ int rc = 0; ++ ++ if (!xen_pv_domain()) ++ return -ENODEV; ++ ++ usbbk = kzalloc(sizeof(struct xen_usbbk), GFP_KERNEL); ++ if (!usbbk) { ++ pr_alert(DRV_PFX "%s: out of memory!\n", __func__); ++ return -ENOMEM; ++ } ++ ++ mmap_pages = xen_usbif_reqs * USBIF_MAX_SEGMENTS_PER_REQUEST; ++ usbbk->pending_reqs = ++ kzalloc(sizeof(usbbk->pending_reqs[0]) * xen_usbif_reqs, ++ GFP_KERNEL); ++ usbbk->pending_grant_handles = ++ kmalloc(sizeof(usbbk->pending_grant_handles[0]) * mmap_pages, ++ GFP_KERNEL); ++ usbbk->pending_pages = ++ kzalloc(sizeof(usbbk->pending_pages[0]) * mmap_pages, ++ GFP_KERNEL); ++ ++ if (!usbbk->pending_reqs || !usbbk->pending_grant_handles || ++ !usbbk->pending_pages) { ++ rc = -ENOMEM; ++ pr_alert(DRV_PFX "%s: out of memory\n", __func__); ++ goto failed_init; ++ } ++ ++ for (i = 0; i < mmap_pages; i++) { ++ usbbk->pending_grant_handles[i] = USBBACK_INVALID_HANDLE; ++ usbbk->pending_pages[i] = alloc_page(GFP_KERNEL); ++ if (usbbk->pending_pages[i] == NULL) { ++ rc = -ENOMEM; ++ pr_alert(DRV_PFX "%s: out of memory\n", __func__); ++ goto failed_init; ++ } ++ } ++ ++ INIT_LIST_HEAD(&usbbk->pending_free); ++ spin_lock_init(&usbbk->pending_free_lock); ++ init_waitqueue_head(&usbbk->pending_free_wq); ++ ++ INIT_LIST_HEAD(&usbbk->urb_free); ++ spin_lock_init(&usbbk->urb_free_lock); ++ ++ for (i = 0; i < xen_usbif_reqs; i++) ++ list_add_tail(&usbbk->pending_reqs[i].free_list, ++ &usbbk->pending_free); ++ ++ rc = xen_usbdev_init(); ++ if (rc) ++ goto failed_init; ++ ++ rc = xen_usbif_xenbus_init(); ++ if (rc) ++ goto usb_exit; ++ ++ return 0; ++ ++ usb_exit: ++ xen_usbdev_exit(); ++ failed_init: ++ kfree(usbbk->pending_reqs); ++ kfree(usbbk->pending_grant_handles); ++ if (usbbk->pending_pages) { ++ for (i = 0; i < mmap_pages; i++) { ++ if (usbbk->pending_pages[i]) ++ __free_page(usbbk->pending_pages[i]); ++ } ++ kfree(usbbk->pending_pages); ++ } ++ kfree(usbbk); ++ usbbk = NULL; ++ return rc; ++} ++ ++struct xen_usbdev *xen_usbif_find_attached_device(struct xen_usbif *usbif, ++ int portnum) ++{ ++ struct xen_usbdev *dev; ++ int found = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbif->dev_lock, flags); ++ list_for_each_entry(dev, &usbif->dev_list, dev_list) { ++ if (dev->port->portnum == portnum) { ++ found = 1; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&usbif->dev_lock, flags); ++ ++ if (found) ++ return dev; ++ ++ return NULL; ++} ++ ++static void __exit xen_usbif_exit(void) ++{ ++ int i; ++ int mmap_pages = xen_usbif_reqs * USBIF_MAX_SEGMENTS_PER_REQUEST; ++ ++ xen_usbif_xenbus_exit(); ++ xen_usbdev_exit(); ++ kfree(usbbk->pending_reqs); ++ kfree(usbbk->pending_grant_handles); ++ for (i = 0; i < mmap_pages; i++) { ++ if (usbbk->pending_pages[i]) ++ __free_page(usbbk->pending_pages[i]); ++ } ++ kfree(usbbk->pending_pages); ++ usbbk = NULL; ++} ++ ++module_init(xen_usbif_init); ++module_exit(xen_usbif_exit); ++ ++MODULE_AUTHOR(""); ++MODULE_DESCRIPTION("Xen USB backend driver (xen_usbback)"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff --git a/drivers/usb/host/xen-usbback/usbdev.c b/drivers/usb/host/xen-usbback/usbdev.c +new file mode 100644 +index 0000000..53a14b4 +--- /dev/null ++++ b/drivers/usb/host/xen-usbback/usbdev.c +@@ -0,0 +1,319 @@ ++/* ++ * USB stub device driver - grabbing and managing USB devices. ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * 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, see . ++ * ++ * or, by your choice, ++ * ++ * When distributed separately from the Linux kernel or incorporated into ++ * other software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include "common.h" ++ ++static LIST_HEAD(port_list); ++static DEFINE_SPINLOCK(port_list_lock); ++ ++struct xen_usbport *xen_usbport_find_by_busid(const char *busid) ++{ ++ struct xen_usbport *port; ++ int found = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port_list_lock, flags); ++ list_for_each_entry(port, &port_list, port_list) { ++ if (!(strncmp(port->phys_bus, busid, XEN_USB_BUS_ID_SIZE))) { ++ found = 1; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&port_list_lock, flags); ++ ++ if (found) ++ return port; ++ ++ return NULL; ++} ++ ++struct xen_usbport *xen_usbport_find(const domid_t domid, ++ const unsigned int handle, const int portnum) ++{ ++ struct xen_usbport *port; ++ int found = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port_list_lock, flags); ++ list_for_each_entry(port, &port_list, port_list) { ++ if ((port->domid == domid) && ++ (port->handle == handle) && ++ (port->portnum == portnum)) { ++ found = 1; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&port_list_lock, flags); ++ ++ if (found) ++ return port; ++ ++ return NULL; ++} ++ ++int xen_usbport_add(const char *busid, const domid_t domid, ++ const unsigned int handle, const int portnum) ++{ ++ struct xen_usbport *port; ++ unsigned long flags; ++ ++ port = kzalloc(sizeof(*port), GFP_KERNEL); ++ if (!port) ++ return -ENOMEM; ++ ++ port->domid = domid; ++ port->handle = handle; ++ port->portnum = portnum; ++ ++ strncpy(port->phys_bus, busid, XEN_USB_BUS_ID_SIZE); ++ ++ spin_lock_irqsave(&port_list_lock, flags); ++ list_add(&port->port_list, &port_list); ++ spin_unlock_irqrestore(&port_list_lock, flags); ++ ++ return 0; ++} ++ ++int xen_usbport_remove(const domid_t domid, const unsigned int handle, ++ const int portnum) ++{ ++ struct xen_usbport *port, *tmp; ++ int err = -ENOENT; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port_list_lock, flags); ++ list_for_each_entry_safe(port, tmp, &port_list, port_list) { ++ if (port->domid == domid && ++ port->handle == handle && ++ port->portnum == portnum) { ++ list_del(&port->port_list); ++ kfree(port); ++ ++ err = 0; ++ } ++ } ++ spin_unlock_irqrestore(&port_list_lock, flags); ++ ++ return err; ++} ++ ++static struct xen_usbdev *xen_usbdev_alloc(struct usb_device *udev, ++ struct xen_usbport *port) ++{ ++ struct xen_usbdev *dev; ++ ++ dev = kzalloc(sizeof(*dev), GFP_KERNEL); ++ if (!dev) { ++ pr_alert(DRV_PFX "no memory for alloc xen_usbdev\n"); ++ return NULL; ++ } ++ kref_init(&dev->kref); ++ dev->udev = usb_get_dev(udev); ++ dev->port = port; ++ spin_lock_init(&dev->submitting_lock); ++ INIT_LIST_HEAD(&dev->submitting_list); ++ ++ return dev; ++} ++ ++static void usbdev_release(struct kref *kref) ++{ ++ struct xen_usbdev *dev; ++ ++ dev = container_of(kref, struct xen_usbdev, kref); ++ ++ usb_put_dev(dev->udev); ++ dev->udev = NULL; ++ dev->port = NULL; ++ kfree(dev); ++} ++ ++static inline void usbdev_get(struct xen_usbdev *dev) ++{ ++ kref_get(&dev->kref); ++} ++ ++static inline void usbdev_put(struct xen_usbdev *dev) ++{ ++ kref_put(&dev->kref, usbdev_release); ++} ++ ++static int usbdev_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ struct usb_device *udev = interface_to_usbdev(intf); ++ const char *busid = dev_name(intf->dev.parent); ++ struct xen_usbport *port = NULL; ++ struct xen_usbdev *dev = NULL; ++ struct xen_usbif *usbif = NULL; ++ int retval = -ENODEV; ++ ++ /* hub currently not supported, so skip. */ ++ if (udev->descriptor.bDeviceClass == USB_CLASS_HUB) ++ goto out; ++ ++ port = xen_usbport_find_by_busid(busid); ++ if (!port) ++ goto out; ++ ++ usbif = xen_usbif_find(port->domid, port->handle); ++ if (!usbif) ++ goto out; ++ ++ switch (udev->speed) { ++ case USB_SPEED_LOW: ++ case USB_SPEED_FULL: ++ break; ++ case USB_SPEED_HIGH: ++ if (usbif->usb_ver >= USB_VER_USB20) ++ break; ++ /* fall through */ ++ default: ++ goto out; ++ } ++ ++ dev = xen_usbif_find_attached_device(usbif, port->portnum); ++ if (!dev) { ++ /* new connection */ ++ dev = xen_usbdev_alloc(udev, port); ++ if (!dev) ++ return -ENOMEM; ++ xen_usbif_attach_device(usbif, dev); ++ xen_usbif_hotplug_notify(usbif, port->portnum, udev->speed); ++ } else { ++ /* maybe already called and connected by other intf */ ++ if (strncmp(dev->port->phys_bus, busid, XEN_USB_BUS_ID_SIZE)) ++ goto out; /* invalid call */ ++ } ++ ++ usbdev_get(dev); ++ usb_set_intfdata(intf, dev); ++ retval = 0; ++ ++out: ++ return retval; ++} ++ ++static void usbdev_disconnect(struct usb_interface *intf) ++{ ++ struct xen_usbdev *dev ++ = (struct xen_usbdev *) usb_get_intfdata(intf); ++ ++ usb_set_intfdata(intf, NULL); ++ ++ if (!dev) ++ return; ++ ++ if (dev->usbif) { ++ xen_usbif_hotplug_notify(dev->usbif, dev->port->portnum, 0); ++ xen_usbif_detach_device(dev->usbif, dev); ++ } ++ xen_usbif_unlink_urbs(dev); ++ usbdev_put(dev); ++} ++ ++static ssize_t usbdev_show_ports(struct device_driver *driver, char *buf) ++{ ++ struct xen_usbport *port; ++ size_t count = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port_list_lock, flags); ++ list_for_each_entry(port, &port_list, port_list) { ++ if (count >= PAGE_SIZE) ++ break; ++ count += scnprintf((char *)buf + count, PAGE_SIZE - count, ++ "%s:%d:%d:%d\n", ++ &port->phys_bus[0], ++ port->domid, ++ port->handle, ++ port->portnum); ++ } ++ spin_unlock_irqrestore(&port_list_lock, flags); ++ ++ return count; ++} ++ ++DRIVER_ATTR(port_ids, S_IRUSR, usbdev_show_ports, NULL); ++ ++/* table of devices that matches any usbdevice */ ++static const struct usb_device_id usbdev_table[] = { ++ { .driver_info = 1 }, /* wildcard, see usb_match_id() */ ++ { } /* Terminating entry */ ++}; ++MODULE_DEVICE_TABLE(usb, usbdev_table); ++ ++static struct usb_driver xen_usbdev_driver = { ++ .name = "usbback", ++ .probe = usbdev_probe, ++ .disconnect = usbdev_disconnect, ++ .id_table = usbdev_table, ++ .no_dynamic_id = 1, ++}; ++ ++int __init xen_usbdev_init(void) ++{ ++ int err; ++ ++ err = usb_register(&xen_usbdev_driver); ++ if (err < 0) { ++ pr_alert(DRV_PFX "usb_register failed (error %d)\n", ++ err); ++ goto out; ++ } ++ ++ err = driver_create_file(&xen_usbdev_driver.drvwrap.driver, ++ &driver_attr_port_ids); ++ if (err) ++ usb_deregister(&xen_usbdev_driver); ++ ++out: ++ return err; ++} ++ ++void xen_usbdev_exit(void) ++{ ++ driver_remove_file(&xen_usbdev_driver.drvwrap.driver, ++ &driver_attr_port_ids); ++ usb_deregister(&xen_usbdev_driver); ++} +diff --git a/drivers/usb/host/xen-usbback/xenbus.c b/drivers/usb/host/xen-usbback/xenbus.c +new file mode 100644 +index 0000000..5eae4ec +--- /dev/null ++++ b/drivers/usb/host/xen-usbback/xenbus.c +@@ -0,0 +1,482 @@ ++/* ++ * Xenbus interface for USB backend driver. ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * 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, see . ++ * ++ * or, by your choice, ++ * ++ * When distributed separately from the Linux kernel or incorporated into ++ * other software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include ++#include "common.h" ++ ++static LIST_HEAD(usbif_list); ++static DEFINE_SPINLOCK(usbif_list_lock); ++ ++struct xen_usbif *xen_usbif_find(domid_t domid, unsigned int handle) ++{ ++ struct xen_usbif *usbif; ++ int found = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbif_list_lock, flags); ++ list_for_each_entry(usbif, &usbif_list, usbif_list) { ++ if (usbif->domid == domid && usbif->handle == handle) { ++ found = 1; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&usbif_list_lock, flags); ++ ++ if (found) ++ return usbif; ++ ++ return NULL; ++} ++ ++struct xen_usbif *xen_usbif_alloc(domid_t domid, unsigned int handle) ++{ ++ struct xen_usbif *usbif; ++ unsigned long flags; ++ int i; ++ ++ usbif = kzalloc(sizeof(struct xen_usbif), GFP_KERNEL); ++ if (!usbif) ++ return NULL; ++ ++ usbif->domid = domid; ++ usbif->handle = handle; ++ INIT_LIST_HEAD(&usbif->usbif_list); ++ spin_lock_init(&usbif->urb_ring_lock); ++ spin_lock_init(&usbif->conn_ring_lock); ++ atomic_set(&usbif->refcnt, 0); ++ init_waitqueue_head(&usbif->wq); ++ init_waitqueue_head(&usbif->waiting_to_free); ++ spin_lock_init(&usbif->dev_lock); ++ INIT_LIST_HEAD(&usbif->dev_list); ++ spin_lock_init(&usbif->addr_lock); ++ for (i = 0; i < XEN_USB_DEV_ADDR_SIZE; i++) ++ usbif->addr_table[i] = NULL; ++ ++ spin_lock_irqsave(&usbif_list_lock, flags); ++ list_add(&usbif->usbif_list, &usbif_list); ++ spin_unlock_irqrestore(&usbif_list_lock, flags); ++ ++ return usbif; ++} ++ ++static int xen_usbif_map(struct xen_usbif *usbif, unsigned long urb_ring_ref, ++ unsigned long conn_ring_ref, unsigned int evtchn) ++{ ++ int err = -ENOMEM; ++ ++ if (usbif->irq) ++ return 0; ++ ++ err = xenbus_map_ring_valloc(usbif->xbdev, urb_ring_ref, ++ &usbif->urb_sring); ++ if (err < 0) ++ return err; ++ ++ err = xenbus_map_ring_valloc(usbif->xbdev, conn_ring_ref, ++ &usbif->conn_sring); ++ if (err < 0) ++ goto fail_alloc; ++ ++ err = bind_interdomain_evtchn_to_irqhandler(usbif->domid, evtchn, ++ xen_usbif_be_int, 0, "usbif-backend", usbif); ++ if (err < 0) ++ goto fail_evtchn; ++ usbif->irq = err; ++ ++ BACK_RING_INIT(&usbif->urb_ring, ++ (struct usbif_urb_sring *)usbif->urb_sring, PAGE_SIZE); ++ BACK_RING_INIT(&usbif->conn_ring, ++ (struct usbif_conn_sring *)usbif->conn_sring, PAGE_SIZE); ++ ++ return 0; ++ ++fail_evtchn: ++ xenbus_unmap_ring_vfree(usbif->xbdev, usbif->conn_sring); ++fail_alloc: ++ xenbus_unmap_ring_vfree(usbif->xbdev, usbif->urb_sring); ++ ++ return err; ++} ++ ++static void xen_usbif_disconnect(struct xen_usbif *usbif) ++{ ++ struct xen_usbdev *dev, *tmp; ++ unsigned long flags; ++ ++ if (usbif->xenusbd) { ++ kthread_stop(usbif->xenusbd); ++ usbif->xenusbd = NULL; ++ } ++ ++ spin_lock_irqsave(&usbif->dev_lock, flags); ++ list_for_each_entry_safe(dev, tmp, &usbif->dev_list, dev_list) { ++ xen_usbif_unlink_urbs(dev); ++ xen_usbif_detach_device_without_lock(usbif, dev); ++ } ++ spin_unlock_irqrestore(&usbif->dev_lock, flags); ++ ++ wait_event(usbif->waiting_to_free, atomic_read(&usbif->refcnt) == 0); ++ ++ if (usbif->irq) { ++ unbind_from_irqhandler(usbif->irq, usbif); ++ usbif->irq = 0; ++ } ++ ++ if (usbif->urb_ring.sring) { ++ xenbus_unmap_ring_vfree(usbif->xbdev, usbif->urb_sring); ++ usbif->urb_ring.sring = NULL; ++ xenbus_unmap_ring_vfree(usbif->xbdev, usbif->conn_sring); ++ usbif->conn_ring.sring = NULL; ++ } ++} ++ ++static void xen_usbif_free(struct xen_usbif *usbif) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&usbif_list_lock, flags); ++ list_del(&usbif->usbif_list); ++ spin_unlock_irqrestore(&usbif_list_lock, flags); ++ kfree(usbif); ++} ++ ++static void usbbk_changed(struct xenbus_watch *watch, const char **vec, ++ unsigned int len) ++{ ++ struct xenbus_transaction xbt; ++ int err; ++ int i; ++ char node[8]; ++ char *busid; ++ struct xen_usbport *port = NULL; ++ ++ struct xen_usbif *usbif = container_of(watch, struct xen_usbif, ++ backend_watch); ++ struct xenbus_device *dev = usbif->xbdev; ++ ++again: ++ err = xenbus_transaction_start(&xbt); ++ if (err) { ++ xenbus_dev_fatal(dev, err, "starting transaction"); ++ return; ++ } ++ ++ for (i = 1; i <= usbif->num_ports; i++) { ++ sprintf(node, "port/%d", i); ++ busid = xenbus_read(xbt, dev->nodename, node, NULL); ++ if (IS_ERR(busid)) { ++ err = PTR_ERR(busid); ++ xenbus_dev_fatal(dev, err, "reading port/%d", i); ++ goto abort; ++ } ++ ++ /* ++ * remove port, if the port is not connected, ++ */ ++ if (strlen(busid) == 0) { ++ port = xen_usbport_find(usbif->domid, usbif->handle, i); ++ if (port) { ++ if (port->is_connected) ++ xenbus_dev_fatal(dev, err, ++ "can't remove port/%d, " ++ "unbind first", i); ++ else ++ xen_usbport_remove(usbif->domid, ++ usbif->handle, i); ++ } ++ continue; /* never configured, ignore */ ++ } ++ ++ /* ++ * add port, ++ * if the port is not configured and not used from other usbif. ++ */ ++ port = xen_usbport_find(usbif->domid, usbif->handle, i); ++ if (port) { ++ if ((strncmp(port->phys_bus, busid, ++ XEN_USB_BUS_ID_SIZE))) ++ xenbus_dev_fatal(dev, err, "can't add port/%d, " ++ "remove first", i); ++ else ++ continue; /* already configured, ignore */ ++ } else { ++ if (xen_usbport_find_by_busid(busid)) ++ xenbus_dev_fatal(dev, err, "can't add port/%d, " ++ "busid already used", i); ++ else ++ xen_usbport_add(busid, usbif->domid, ++ usbif->handle, i); ++ } ++ } ++ ++ err = xenbus_transaction_end(xbt, 0); ++ if (err == -EAGAIN) ++ goto again; ++ if (err) ++ xenbus_dev_fatal(dev, err, "completing transaction"); ++ ++ return; ++ ++abort: ++ xenbus_transaction_end(xbt, 1); ++ ++ return; ++} ++ ++static int usbbk_remove(struct xenbus_device *dev) ++{ ++ struct xen_usbif *usbif = dev_get_drvdata(&dev->dev); ++ int i; ++ ++ if (usbif->backend_watch.node) { ++ unregister_xenbus_watch(&usbif->backend_watch); ++ kfree(usbif->backend_watch.node); ++ usbif->backend_watch.node = NULL; ++ } ++ ++ if (usbif) { ++ /* remove all ports */ ++ for (i = 1; i <= usbif->num_ports; i++) ++ xen_usbport_remove(usbif->domid, usbif->handle, i); ++ xen_usbif_disconnect(usbif); ++ xen_usbif_free(usbif); ++ } ++ dev_set_drvdata(&dev->dev, NULL); ++ ++ return 0; ++} ++ ++static int usbbk_probe(struct xenbus_device *dev, ++ const struct xenbus_device_id *id) ++{ ++ struct xen_usbif *usbif; ++ unsigned long handle; ++ int num_ports; ++ int usb_ver; ++ int err; ++ ++ if (usb_disabled()) ++ return -ENODEV; ++ ++ if (kstrtoul(strrchr(dev->otherend, '/') + 1, 0, &handle)) ++ return -ENOENT; ++ ++ usbif = xen_usbif_alloc(dev->otherend_id, handle); ++ if (!usbif) { ++ xenbus_dev_fatal(dev, -ENOMEM, "allocating backend interface"); ++ return -ENOMEM; ++ } ++ usbif->xbdev = dev; ++ dev_set_drvdata(&dev->dev, usbif); ++ ++ err = xenbus_scanf(XBT_NIL, dev->nodename, "num-ports", ++ "%d", &num_ports); ++ if (err != 1) { ++ xenbus_dev_fatal(dev, err, "reading num-ports"); ++ goto fail; ++ } ++ if (num_ports < 1 || num_ports > USB_MAXCHILDREN) { ++ xenbus_dev_fatal(dev, err, "invalid num-ports"); ++ goto fail; ++ } ++ usbif->num_ports = num_ports; ++ ++ err = xenbus_scanf(XBT_NIL, dev->nodename, "usb-ver", "%d", &usb_ver); ++ if (err != 1) { ++ xenbus_dev_fatal(dev, err, "reading usb-ver"); ++ goto fail; ++ } ++ switch (usb_ver) { ++ case USB_VER_USB11: ++ case USB_VER_USB20: ++ usbif->usb_ver = usb_ver; ++ break; ++ default: ++ xenbus_dev_fatal(dev, err, "invalid usb-ver"); ++ goto fail; ++ } ++ ++ err = xenbus_switch_state(dev, XenbusStateInitWait); ++ if (err) ++ goto fail; ++ ++ return 0; ++ ++fail: ++ usbbk_remove(dev); ++ return err; ++} ++ ++static int connect_rings(struct xen_usbif *usbif) ++{ ++ struct xenbus_device *dev = usbif->xbdev; ++ unsigned long urb_ring_ref; ++ unsigned long conn_ring_ref; ++ unsigned int evtchn; ++ int err; ++ ++ err = xenbus_gather(XBT_NIL, dev->otherend, ++ "urb-ring-ref", "%lu", &urb_ring_ref, ++ "conn-ring-ref", "%lu", &conn_ring_ref, ++ "event-channel", "%u", &evtchn, NULL); ++ if (err) { ++ xenbus_dev_fatal(dev, err, ++ "reading %s/ring-ref and event-channel", ++ dev->otherend); ++ return err; ++ } ++ ++ pr_info(DRV_PFX "urb-ring-ref %ld, conn-ring-ref %ld, " ++ "event-channel %d\n", urb_ring_ref, conn_ring_ref, evtchn); ++ ++ err = xen_usbif_map(usbif, urb_ring_ref, conn_ring_ref, evtchn); ++ if (err) { ++ xenbus_dev_fatal(dev, err, "mapping urb-ring-ref %lu " ++ "conn-ring-ref %lu port %u", ++ urb_ring_ref, conn_ring_ref, evtchn); ++ return err; ++ } ++ ++ return 0; ++} ++ ++static int start_xenusbd(struct xen_usbif *usbif) ++{ ++ int err = 0; ++ char name[TASK_COMM_LEN]; ++ ++ snprintf(name, TASK_COMM_LEN, "usbback.%d.%d", usbif->domid, ++ usbif->handle); ++ usbif->xenusbd = kthread_run(xen_usbif_schedule, usbif, name); ++ if (IS_ERR(usbif->xenusbd)) { ++ err = PTR_ERR(usbif->xenusbd); ++ usbif->xenusbd = NULL; ++ xenbus_dev_error(usbif->xbdev, err, "start xenusbd"); ++ } ++ ++ return err; ++} ++ ++static void frontend_changed(struct xenbus_device *dev, ++ enum xenbus_state frontend_state) ++{ ++ struct xen_usbif *usbif = dev_get_drvdata(&dev->dev); ++ int err; ++ ++ switch (frontend_state) { ++ case XenbusStateReconfiguring: ++ case XenbusStateReconfigured: ++ break; ++ ++ case XenbusStateInitialising: ++ if (dev->state == XenbusStateClosed) { ++ pr_info(DRV_PFX "%s: %s: prepare for reconnect\n", ++ __func__, dev->nodename); ++ xenbus_switch_state(dev, XenbusStateInitWait); ++ } ++ break; ++ ++ case XenbusStateInitialised: ++ case XenbusStateConnected: ++ if (dev->state == XenbusStateConnected) ++ break; ++ ++ xen_usbif_disconnect(usbif); ++ ++ err = connect_rings(usbif); ++ if (err) ++ break; ++ err = start_xenusbd(usbif); ++ if (err) ++ break; ++ err = xenbus_watch_pathfmt(dev, &usbif->backend_watch, ++ usbbk_changed, "%s/%s", dev->nodename, "port"); ++ if (err) ++ break; ++ xenbus_switch_state(dev, XenbusStateConnected); ++ break; ++ ++ case XenbusStateClosing: ++ xenbus_switch_state(dev, XenbusStateClosing); ++ break; ++ ++ case XenbusStateClosed: ++ xen_usbif_disconnect(usbif); ++ xenbus_switch_state(dev, XenbusStateClosed); ++ if (xenbus_dev_is_online(dev)) ++ break; ++ /* fall through if not online */ ++ case XenbusStateUnknown: ++ device_unregister(&dev->dev); ++ break; ++ ++ default: ++ xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", ++ frontend_state); ++ break; ++ } ++} ++ ++ ++/* ** Driver Registration ** */ ++ ++static const struct xenbus_device_id usbback_ids[] = { ++ { "vusb" }, ++ { "" }, ++}; ++ ++static DEFINE_XENBUS_DRIVER(usbback, , ++ .probe = usbbk_probe, ++ .remove = usbbk_remove, ++ .otherend_changed = frontend_changed, ++); ++ ++int __init xen_usbif_xenbus_init(void) ++{ ++ return xenbus_register_backend(&usbback_driver); ++} ++ ++void __exit xen_usbif_xenbus_exit(void) ++{ ++ xenbus_unregister_driver(&usbback_driver); ++} +diff --git a/drivers/usb/host/xen-usbfront.c b/drivers/usb/host/xen-usbfront.c +new file mode 100644 +index 0000000..e632de3 +--- /dev/null ++++ b/drivers/usb/host/xen-usbfront.c +@@ -0,0 +1,1739 @@ ++/* ++ * xen-usbfront.c ++ * ++ * This file is part of Xen USB Virtual Host Controller driver. ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * 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, see . ++ * ++ * or, by your choice, ++ * ++ * When distributed separately from the Linux kernel or incorporated into ++ * other software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++static inline struct usbfront_info *hcd_to_info(struct usb_hcd *hcd) ++{ ++ return (struct usbfront_info *) (hcd->hcd_priv); ++} ++ ++static inline struct usb_hcd *info_to_hcd(struct usbfront_info *info) ++{ ++ return container_of((void *) info, struct usb_hcd, hcd_priv); ++} ++ ++/* Private per-URB data */ ++struct urb_priv { ++ struct list_head list; ++ struct urb *urb; ++ int req_id; /* RING_REQUEST id for submitting */ ++ int unlink_req_id; /* RING_REQUEST id for unlinking */ ++ int status; ++ unsigned unlinked:1; /* dequeued marker */ ++}; ++ ++/* virtual roothub port status */ ++struct rhport_status { ++ u32 status; ++ unsigned resuming:1; /* in resuming */ ++ unsigned c_connection:1; /* connection changed */ ++ unsigned long timeout; ++}; ++ ++/* status of attached device */ ++struct vdevice_status { ++ int devnum; ++ enum usb_device_state status; ++ enum usb_device_speed speed; ++}; ++ ++/* RING request shadow */ ++struct usb_shadow { ++ struct usbif_urb_request req; ++ struct urb *urb; ++}; ++ ++/* statistics for tuning, monitoring, ... */ ++struct xenhcd_stats { ++ unsigned long ring_full; /* RING_FULL conditions */ ++ unsigned long complete; /* normal giveback urbs */ ++ unsigned long unlink; /* unlinked urbs */ ++}; ++ ++struct usbfront_info { ++ /* Virtual Host Controller has 4 urb queues */ ++ struct list_head pending_submit_list; ++ struct list_head pending_unlink_list; ++ struct list_head in_progress_list; ++ struct list_head giveback_waiting_list; ++ ++ spinlock_t lock; ++ ++ /* timer that kick pending and giveback waiting urbs */ ++ struct timer_list watchdog; ++ unsigned long actions; ++ ++ /* virtual root hub */ ++ int rh_numports; ++ struct rhport_status ports[USB_MAXCHILDREN]; ++ struct vdevice_status devices[USB_MAXCHILDREN]; ++ ++ /* Xen related staff */ ++ struct xenbus_device *xbdev; ++ int urb_ring_ref; ++ int conn_ring_ref; ++ struct usbif_urb_front_ring urb_ring; ++ struct usbif_conn_front_ring conn_ring; ++ ++ unsigned int evtchn, irq; /* event channel */ ++ struct usb_shadow shadow[USB_URB_RING_SIZE]; ++ unsigned long shadow_free; ++ ++ /* RING_RESPONSE thread */ ++ struct task_struct *kthread; ++ wait_queue_head_t wq; ++ unsigned int waiting_resp; ++ ++ /* xmit statistics */ ++#ifdef XENHCD_STATS ++ struct xenhcd_stats stats; ++#define COUNT(x) do { (x)++; } while (0) ++#else ++#define COUNT(x) do {} while (0) ++#endif ++}; ++ ++#define XENHCD_RING_JIFFIES (HZ/200) ++#define XENHCD_SCAN_JIFFIES 1 ++ ++enum xenhcd_timer_action { ++ TIMER_RING_WATCHDOG, ++ TIMER_SCAN_PENDING_URBS, ++}; ++ ++static inline void ++timer_action_done(struct usbfront_info *info, enum xenhcd_timer_action action) ++{ ++ clear_bit(action, &info->actions); ++} ++ ++static inline void ++timer_action(struct usbfront_info *info, enum xenhcd_timer_action action) ++{ ++ if (timer_pending(&info->watchdog) && ++ test_bit(TIMER_SCAN_PENDING_URBS, &info->actions)) ++ return; ++ ++ if (!test_and_set_bit(action, &info->actions)) { ++ unsigned long t; ++ ++ switch (action) { ++ case TIMER_RING_WATCHDOG: ++ t = XENHCD_RING_JIFFIES; ++ break; ++ default: ++ t = XENHCD_SCAN_JIFFIES; ++ break; ++ } ++ mod_timer(&info->watchdog, t + jiffies); ++ } ++} ++ ++struct kmem_cache *xenhcd_urbp_cachep; ++struct hc_driver xen_usb20_hc_driver; ++struct hc_driver xen_usb11_hc_driver; ++ ++static ssize_t show_statistics(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ struct usb_hcd *hcd; ++ struct usbfront_info *info; ++ unsigned long flags; ++ unsigned temp, size; ++ char *next; ++ ++ hcd = dev_get_drvdata(dev); ++ info = hcd_to_info(hcd); ++ next = buf; ++ size = PAGE_SIZE; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ temp = scnprintf(next, size, ++ "bus %s, device %s\n" ++ "%s\n" ++ "xenhcd, hcd state %d\n", ++ hcd->self.controller->bus->name, ++ dev_name(hcd->self.controller), ++ hcd->product_desc, ++ hcd->state); ++ size -= temp; ++ next += temp; ++ ++#ifdef XENHCD_STATS ++ temp = scnprintf(next, size, ++ "complete %ld unlink %ld ring_full %ld\n", ++ info->stats.complete, info->stats.unlink, ++ info->stats.ring_full); ++ size -= temp; ++ next += temp; ++#endif ++ ++ spin_unlock_irqrestore(&info->lock, flags); ++ ++ return PAGE_SIZE - size; ++} ++ ++static DEVICE_ATTR(statistics, S_IRUGO, show_statistics, NULL); ++ ++static inline void create_debug_file(struct usbfront_info *info) ++{ ++ struct device *dev = info_to_hcd(info)->self.controller; ++ if (device_create_file(dev, &dev_attr_statistics)) ++ printk(KERN_WARNING "statistics file not created for %s\n", ++ info_to_hcd(info)->self.bus_name); ++} ++ ++static inline void remove_debug_file(struct usbfront_info *info) ++{ ++ struct device *dev = info_to_hcd(info)->self.controller; ++ device_remove_file(dev, &dev_attr_statistics); ++} ++ ++/* ++ * set virtual port connection status ++ */ ++void set_connect_state(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ if (info->ports[port].status & USB_PORT_STAT_POWER) { ++ switch (info->devices[port].speed) { ++ case USB_SPEED_UNKNOWN: ++ info->ports[port].status &= ++ ~(USB_PORT_STAT_CONNECTION | ++ USB_PORT_STAT_ENABLE | ++ USB_PORT_STAT_LOW_SPEED | ++ USB_PORT_STAT_HIGH_SPEED | ++ USB_PORT_STAT_SUSPEND); ++ break; ++ case USB_SPEED_LOW: ++ info->ports[port].status |= USB_PORT_STAT_CONNECTION; ++ info->ports[port].status |= USB_PORT_STAT_LOW_SPEED; ++ break; ++ case USB_SPEED_FULL: ++ info->ports[port].status |= USB_PORT_STAT_CONNECTION; ++ break; ++ case USB_SPEED_HIGH: ++ info->ports[port].status |= USB_PORT_STAT_CONNECTION; ++ info->ports[port].status |= USB_PORT_STAT_HIGH_SPEED; ++ break; ++ default: /* error */ ++ return; ++ } ++ info->ports[port].status |= (USB_PORT_STAT_C_CONNECTION << 16); ++ } ++} ++ ++/* ++ * set virtual device connection status ++ */ ++void rhport_connect(struct usbfront_info *info, int portnum, ++ enum usb_device_speed speed) ++{ ++ int port; ++ ++ if (portnum < 1 || portnum > info->rh_numports) ++ return; /* invalid port number */ ++ ++ port = portnum - 1; ++ if (info->devices[port].speed != speed) { ++ switch (speed) { ++ case USB_SPEED_UNKNOWN: /* disconnect */ ++ info->devices[port].status = USB_STATE_NOTATTACHED; ++ break; ++ case USB_SPEED_LOW: ++ case USB_SPEED_FULL: ++ case USB_SPEED_HIGH: ++ info->devices[port].status = USB_STATE_ATTACHED; ++ break; ++ default: /* error */ ++ return; ++ } ++ info->devices[port].speed = speed; ++ info->ports[port].c_connection = 1; ++ ++ set_connect_state(info, portnum); ++ } ++} ++ ++/* ++ * SetPortFeature(PORT_SUSPENDED) ++ */ ++void rhport_suspend(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ info->ports[port].status |= USB_PORT_STAT_SUSPEND; ++ info->devices[port].status = USB_STATE_SUSPENDED; ++} ++ ++/* ++ * ClearPortFeature(PORT_SUSPENDED) ++ */ ++void rhport_resume(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ if (info->ports[port].status & USB_PORT_STAT_SUSPEND) { ++ info->ports[port].resuming = 1; ++ info->ports[port].timeout = jiffies + msecs_to_jiffies(20); ++ } ++} ++ ++/* ++ * SetPortFeature(PORT_POWER) ++ */ ++void rhport_power_on(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ if ((info->ports[port].status & USB_PORT_STAT_POWER) == 0) { ++ info->ports[port].status |= USB_PORT_STAT_POWER; ++ if (info->devices[port].status != USB_STATE_NOTATTACHED) ++ info->devices[port].status = USB_STATE_POWERED; ++ if (info->ports[port].c_connection) ++ set_connect_state(info, portnum); ++ } ++} ++ ++/* ++ * ClearPortFeature(PORT_POWER) ++ * SetConfiguration(non-zero) ++ * Power_Source_Off ++ * Over-current ++ */ ++void rhport_power_off(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ if (info->ports[port].status & USB_PORT_STAT_POWER) { ++ info->ports[port].status = 0; ++ if (info->devices[port].status != USB_STATE_NOTATTACHED) ++ info->devices[port].status = USB_STATE_ATTACHED; ++ } ++} ++ ++/* ++ * ClearPortFeature(PORT_ENABLE) ++ */ ++void rhport_disable(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ info->ports[port].status &= ~USB_PORT_STAT_ENABLE; ++ info->ports[port].status &= ~USB_PORT_STAT_SUSPEND; ++ info->ports[port].resuming = 0; ++ if (info->devices[port].status != USB_STATE_NOTATTACHED) ++ info->devices[port].status = USB_STATE_POWERED; ++} ++ ++/* ++ * SetPortFeature(PORT_RESET) ++ */ ++void rhport_reset(struct usbfront_info *info, int portnum) ++{ ++ int port; ++ ++ port = portnum - 1; ++ info->ports[port].status &= ~(USB_PORT_STAT_ENABLE ++ | USB_PORT_STAT_LOW_SPEED ++ | USB_PORT_STAT_HIGH_SPEED); ++ info->ports[port].status |= USB_PORT_STAT_RESET; ++ ++ if (info->devices[port].status != USB_STATE_NOTATTACHED) ++ info->devices[port].status = USB_STATE_ATTACHED; ++ ++ /* 10msec reset signaling */ ++ info->ports[port].timeout = jiffies + msecs_to_jiffies(10); ++} ++ ++#ifdef XENHCD_PM ++#ifdef CONFIG_PM ++static int xenhcd_bus_suspend(struct usb_hcd *hcd) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ int ret = 0; ++ int i, ports; ++ ++ ports = info->rh_numports; ++ ++ spin_lock_irq(&info->lock); ++ if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) ++ ret = -ESHUTDOWN; ++ else { ++ /* suspend any active ports*/ ++ for (i = 1; i <= ports; i++) ++ rhport_suspend(info, i); ++ } ++ spin_unlock_irq(&info->lock); ++ ++ del_timer_sync(&info->watchdog); ++ ++ return ret; ++} ++ ++static int xenhcd_bus_resume(struct usb_hcd *hcd) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ int ret = 0; ++ int i, ports; ++ ++ ports = info->rh_numports; ++ ++ spin_lock_irq(&info->lock); ++ if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) ++ ret = -ESHUTDOWN; ++ else { ++ /* resume any suspended ports*/ ++ for (i = 1; i <= ports; i++) ++ rhport_resume(info, i); ++ } ++ spin_unlock_irq(&info->lock); ++ ++ return ret; ++} ++#endif ++#endif ++ ++static void xenhcd_hub_descriptor(struct usbfront_info *info, ++ struct usb_hub_descriptor *desc) ++{ ++ u16 temp; ++ int ports = info->rh_numports; ++ ++ desc->bDescriptorType = 0x29; ++ desc->bPwrOn2PwrGood = 10; /* EHCI says 20ms max */ ++ desc->bHubContrCurrent = 0; ++ desc->bNbrPorts = ports; ++ ++ /* size of DeviceRemovable and PortPwrCtrlMask fields*/ ++ temp = 1 + (ports / 8); ++ desc->bDescLength = 7 + 2 * temp; ++ ++ /* bitmaps for DeviceRemovable and PortPwrCtrlMask */ ++ memset(&desc->u.hs.DeviceRemovable[0], 0, temp); ++ memset(&desc->u.hs.DeviceRemovable[temp], 0xff, temp); ++ ++ /* per-port over current reporting and no power switching */ ++ temp = 0x000a; ++ desc->wHubCharacteristics = cpu_to_le16(temp); ++} ++ ++/* port status change mask for hub_status_data */ ++#define PORT_C_MASK \ ++ ((USB_PORT_STAT_C_CONNECTION \ ++ | USB_PORT_STAT_C_ENABLE \ ++ | USB_PORT_STAT_C_SUSPEND \ ++ | USB_PORT_STAT_C_OVERCURRENT \ ++ | USB_PORT_STAT_C_RESET) << 16) ++ ++/* ++ * See USB 2.0 Spec, 11.12.4 Hub and Port Status Change Bitmap. ++ * If port status changed, writes the bitmap to buf and return ++ * that length(number of bytes). ++ * If Nothing changed, return 0. ++ */ ++static int xenhcd_hub_status_data(struct usb_hcd *hcd, char *buf) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ ++ int ports; ++ int i; ++ int length; ++ ++ unsigned long flags; ++ int ret = 0; ++ ++ int changed = 0; ++ ++ if (!HC_IS_RUNNING(hcd->state)) ++ return 0; ++ ++ /* initialize the status to no-changes */ ++ ports = info->rh_numports; ++ length = 1 + (ports / 8); ++ for (i = 0; i < length; i++) { ++ buf[i] = 0; ++ ret++; ++ } ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ for (i = 0; i < ports; i++) { ++ /* check status for each port */ ++ if (info->ports[i].status & PORT_C_MASK) { ++ if (i < 7) ++ buf[0] |= 1 << (i + 1); ++ else if (i < 15) ++ buf[1] |= 1 << (i - 7); ++ else if (i < 23) ++ buf[2] |= 1 << (i - 15); ++ else ++ buf[3] |= 1 << (i - 23); ++ changed = 1; ++ } ++ } ++ ++ if (!changed) ++ ret = 0; ++ ++ spin_unlock_irqrestore(&info->lock, flags); ++ ++ return ret; ++} ++ ++static int xenhcd_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ++ u16 wIndex, char *buf, u16 wLength) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ int ports = info->rh_numports; ++ unsigned long flags; ++ int ret = 0; ++ int i; ++ int changed = 0; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ switch (typeReq) { ++ case ClearHubFeature: ++ /* ignore this request */ ++ break; ++ case ClearPortFeature: ++ if (!wIndex || wIndex > ports) ++ goto error; ++ ++ switch (wValue) { ++ case USB_PORT_FEAT_SUSPEND: ++ rhport_resume(info, wIndex); ++ break; ++ case USB_PORT_FEAT_POWER: ++ rhport_power_off(info, wIndex); ++ break; ++ case USB_PORT_FEAT_ENABLE: ++ rhport_disable(info, wIndex); ++ break; ++ case USB_PORT_FEAT_C_CONNECTION: ++ info->ports[wIndex-1].c_connection = 0; ++ /* falling through */ ++ default: ++ info->ports[wIndex-1].status &= ~(1 << wValue); ++ break; ++ } ++ break; ++ case GetHubDescriptor: ++ xenhcd_hub_descriptor(info, (struct usb_hub_descriptor *) buf); ++ break; ++ case GetHubStatus: ++ /* always local power supply good and no over-current exists. */ ++ *(__le32 *)buf = cpu_to_le32(0); ++ break; ++ case GetPortStatus: ++ if (!wIndex || wIndex > ports) ++ goto error; ++ ++ wIndex--; ++ ++ /* resume completion */ ++ if (info->ports[wIndex].resuming && ++ time_after_eq(jiffies, info->ports[wIndex].timeout)) { ++ info->ports[wIndex].status |= ++ (USB_PORT_STAT_C_SUSPEND << 16); ++ info->ports[wIndex].status &= ~USB_PORT_STAT_SUSPEND; ++ } ++ ++ /* reset completion */ ++ if ((info->ports[wIndex].status & USB_PORT_STAT_RESET) != 0 && ++ time_after_eq(jiffies, info->ports[wIndex].timeout)) { ++ info->ports[wIndex].status |= ++ (USB_PORT_STAT_C_RESET << 16); ++ info->ports[wIndex].status &= ~USB_PORT_STAT_RESET; ++ ++ if (info->devices[wIndex].status != ++ USB_STATE_NOTATTACHED) { ++ info->ports[wIndex].status |= ++ USB_PORT_STAT_ENABLE; ++ info->devices[wIndex].status = ++ USB_STATE_DEFAULT; ++ } ++ ++ switch (info->devices[wIndex].speed) { ++ case USB_SPEED_LOW: ++ info->ports[wIndex].status |= ++ USB_PORT_STAT_LOW_SPEED; ++ break; ++ case USB_SPEED_HIGH: ++ info->ports[wIndex].status |= ++ USB_PORT_STAT_HIGH_SPEED; ++ break; ++ default: ++ break; ++ } ++ } ++ ++ ((u16 *) buf)[0] = cpu_to_le16(info->ports[wIndex].status); ++ ((u16 *) buf)[1] = cpu_to_le16(info->ports[wIndex].status ++ >> 16); ++ break; ++ case SetHubFeature: ++ /* not supported */ ++ goto error; ++ case SetPortFeature: ++ if (!wIndex || wIndex > ports) ++ goto error; ++ ++ switch (wValue) { ++ case USB_PORT_FEAT_POWER: ++ rhport_power_on(info, wIndex); ++ break; ++ case USB_PORT_FEAT_RESET: ++ rhport_reset(info, wIndex); ++ break; ++ case USB_PORT_FEAT_SUSPEND: ++ rhport_suspend(info, wIndex); ++ break; ++ default: ++ if ((info->ports[wIndex-1].status & ++ USB_PORT_STAT_POWER) != 0) ++ info->ports[wIndex-1].status |= (1 << wValue); ++ } ++ break; ++ ++ default: ++error: ++ ret = -EPIPE; ++ } ++ spin_unlock_irqrestore(&info->lock, flags); ++ ++ /* check status for each port */ ++ for (i = 0; i < ports; i++) { ++ if (info->ports[i].status & PORT_C_MASK) ++ changed = 1; ++ } ++ if (changed) ++ usb_hcd_poll_rh_status(hcd); ++ ++ return ret; ++} ++ ++struct kmem_cache *xenhcd_urbp_cachep; ++ ++static struct urb_priv *alloc_urb_priv(struct urb *urb) ++{ ++ struct urb_priv *urbp; ++ ++ urbp = kmem_cache_zalloc(xenhcd_urbp_cachep, GFP_ATOMIC); ++ if (!urbp) ++ return NULL; ++ ++ urbp->urb = urb; ++ urb->hcpriv = urbp; ++ urbp->req_id = ~0; ++ urbp->unlink_req_id = ~0; ++ INIT_LIST_HEAD(&urbp->list); ++ ++ return urbp; ++} ++ ++static void free_urb_priv(struct urb_priv *urbp) ++{ ++ urbp->urb->hcpriv = NULL; ++ kmem_cache_free(xenhcd_urbp_cachep, urbp); ++} ++ ++static inline int get_id_from_freelist(struct usbfront_info *info) ++{ ++ unsigned long free; ++ free = info->shadow_free; ++ BUG_ON(free >= USB_URB_RING_SIZE); ++ info->shadow_free = info->shadow[free].req.id; ++ info->shadow[free].req.id = (unsigned int)0x0fff; /* debug */ ++ return free; ++} ++ ++static inline void add_id_to_freelist(struct usbfront_info *info, ++ unsigned long id) ++{ ++ info->shadow[id].req.id = info->shadow_free; ++ info->shadow[id].urb = NULL; ++ info->shadow_free = id; ++} ++ ++static inline int count_pages(void *addr, int length) ++{ ++ unsigned long start = (unsigned long) addr >> PAGE_SHIFT; ++ unsigned long end = (unsigned long) ++ (addr + length + PAGE_SIZE - 1) >> PAGE_SHIFT; ++ return end - start; ++} ++ ++static inline void xenhcd_gnttab_map(struct usbfront_info *info, void *addr, ++ int length, grant_ref_t *gref_head, ++ struct usbif_request_segment *seg, ++ int nr_pages, int flags) ++{ ++ grant_ref_t ref; ++ unsigned long mfn; ++ unsigned int offset; ++ unsigned int len; ++ unsigned int bytes; ++ int i; ++ ++ len = length; ++ ++ for (i = 0; i < nr_pages; i++) { ++ BUG_ON(!len); ++ ++ mfn = virt_to_mfn(addr); ++ offset = offset_in_page(addr); ++ ++ bytes = PAGE_SIZE - offset; ++ if (bytes > len) ++ bytes = len; ++ ++ ref = gnttab_claim_grant_reference(gref_head); ++ BUG_ON(ref == -ENOSPC); ++ gnttab_grant_foreign_access_ref(ref, info->xbdev->otherend_id, ++ mfn, flags); ++ seg[i].gref = ref; ++ seg[i].offset = (uint16_t)offset; ++ seg[i].length = (uint16_t)bytes; ++ ++ addr += bytes; ++ len -= bytes; ++ } ++} ++ ++static int map_urb_for_request(struct usbfront_info *info, struct urb *urb, ++ struct usbif_urb_request *req) ++{ ++ grant_ref_t gref_head; ++ int nr_buff_pages = 0; ++ int nr_isodesc_pages = 0; ++ int ret = 0; ++ ++ if (urb->transfer_buffer_length) { ++ nr_buff_pages = count_pages(urb->transfer_buffer, ++ urb->transfer_buffer_length); ++ ++ if (usb_pipeisoc(urb->pipe)) ++ nr_isodesc_pages = count_pages(&urb->iso_frame_desc[0], ++ sizeof(struct usb_iso_packet_descriptor) * ++ urb->number_of_packets); ++ ++ if (nr_buff_pages + nr_isodesc_pages > ++ USBIF_MAX_SEGMENTS_PER_REQUEST) ++ return -E2BIG; ++ ++ ret = gnttab_alloc_grant_references( ++ USBIF_MAX_SEGMENTS_PER_REQUEST, &gref_head); ++ if (ret) { ++ printk(KERN_ERR "usbfront: " ++ "gnttab_alloc_grant_references() error\n"); ++ return -ENOMEM; ++ } ++ ++ xenhcd_gnttab_map(info, urb->transfer_buffer, ++ urb->transfer_buffer_length, &gref_head, ++ &req->seg[0], nr_buff_pages, ++ usb_pipein(urb->pipe) ? 0 : GTF_readonly); ++ ++ if (!usb_pipeisoc(urb->pipe)) ++ gnttab_free_grant_references(gref_head); ++ } ++ ++ req->pipe = usbif_setportnum_pipe(urb->pipe, urb->dev->portnum); ++ req->transfer_flags = urb->transfer_flags; ++ req->buffer_length = urb->transfer_buffer_length; ++ req->nr_buffer_segs = nr_buff_pages; ++ ++ switch (usb_pipetype(urb->pipe)) { ++ case PIPE_ISOCHRONOUS: ++ req->u.isoc.interval = urb->interval; ++ req->u.isoc.start_frame = urb->start_frame; ++ req->u.isoc.number_of_packets = urb->number_of_packets; ++ req->u.isoc.nr_frame_desc_segs = nr_isodesc_pages; ++ /* urb->number_of_packets must be > 0 */ ++ if (unlikely(urb->number_of_packets <= 0)) ++ BUG(); ++ xenhcd_gnttab_map(info, &urb->iso_frame_desc[0], ++ sizeof(struct usb_iso_packet_descriptor) * ++ urb->number_of_packets, &gref_head, ++ &req->seg[nr_buff_pages], nr_isodesc_pages, 0); ++ gnttab_free_grant_references(gref_head); ++ break; ++ case PIPE_INTERRUPT: ++ req->u.intr.interval = urb->interval; ++ break; ++ case PIPE_CONTROL: ++ if (urb->setup_packet) ++ memcpy(req->u.ctrl, urb->setup_packet, 8); ++ break; ++ case PIPE_BULK: ++ break; ++ default: ++ ret = -EINVAL; ++ } ++ ++ return ret; ++} ++ ++static void xenhcd_gnttab_done(struct usb_shadow *shadow) ++{ ++ int nr_segs = 0; ++ int i; ++ ++ nr_segs = shadow->req.nr_buffer_segs; ++ ++ if (usb_pipeisoc(shadow->req.pipe)) ++ nr_segs += shadow->req.u.isoc.nr_frame_desc_segs; ++ ++ for (i = 0; i < nr_segs; i++) ++ gnttab_end_foreign_access(shadow->req.seg[i].gref, 0, 0UL); ++ ++ shadow->req.nr_buffer_segs = 0; ++ shadow->req.u.isoc.nr_frame_desc_segs = 0; ++} ++ ++static void xenhcd_giveback_urb(struct usbfront_info *info, struct urb *urb, ++ int status) ++__releases(info->lock) ++__acquires(info->lock) ++{ ++ struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; ++ ++ list_del_init(&urbp->list); ++ free_urb_priv(urbp); ++ switch (urb->status) { ++ case -ECONNRESET: ++ case -ENOENT: ++ COUNT(info->stats.unlink); ++ break; ++ case -EINPROGRESS: ++ urb->status = status; ++ /* falling through */ ++ default: ++ COUNT(info->stats.complete); ++ } ++ spin_unlock(&info->lock); ++ usb_hcd_giveback_urb(info_to_hcd(info), urb, ++ urbp->status <= 0 ? urbp->status : urb->status); ++ spin_lock(&info->lock); ++} ++ ++static inline int xenhcd_do_request(struct usbfront_info *info, ++ struct urb_priv *urbp) ++{ ++ struct usbif_urb_request *req; ++ struct urb *urb = urbp->urb; ++ uint16_t id; ++ int notify; ++ int ret = 0; ++ ++ req = RING_GET_REQUEST(&info->urb_ring, info->urb_ring.req_prod_pvt); ++ id = get_id_from_freelist(info); ++ req->id = id; ++ ++ if (unlikely(urbp->unlinked)) { ++ req->u.unlink.unlink_id = urbp->req_id; ++ req->pipe = usbif_setunlink_pipe(usbif_setportnum_pipe( ++ urb->pipe, urb->dev->portnum)); ++ urbp->unlink_req_id = id; ++ } else { ++ ret = map_urb_for_request(info, urb, req); ++ if (ret < 0) { ++ add_id_to_freelist(info, id); ++ return ret; ++ } ++ urbp->req_id = id; ++ } ++ ++ info->urb_ring.req_prod_pvt++; ++ info->shadow[id].urb = urb; ++ info->shadow[id].req = *req; ++ ++ RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->urb_ring, notify); ++ if (notify) ++ notify_remote_via_irq(info->irq); ++ ++ return ret; ++} ++ ++static void xenhcd_kick_pending_urbs(struct usbfront_info *info) ++{ ++ struct urb_priv *urbp; ++ int ret; ++ ++ while (!list_empty(&info->pending_submit_list)) { ++ if (RING_FULL(&info->urb_ring)) { ++ COUNT(info->stats.ring_full); ++ timer_action(info, TIMER_RING_WATCHDOG); ++ goto done; ++ } ++ ++ urbp = list_entry(info->pending_submit_list.next, ++ struct urb_priv, list); ++ ret = xenhcd_do_request(info, urbp); ++ if (ret == 0) ++ list_move_tail(&urbp->list, &info->in_progress_list); ++ else ++ xenhcd_giveback_urb(info, urbp->urb, -ESHUTDOWN); ++ } ++ timer_action_done(info, TIMER_SCAN_PENDING_URBS); ++ ++done: ++ return; ++} ++ ++/* ++ * caller must lock info->lock ++ */ ++static void xenhcd_cancel_all_enqueued_urbs(struct usbfront_info *info) ++{ ++ struct urb_priv *urbp, *tmp; ++ ++ list_for_each_entry_safe(urbp, tmp, &info->in_progress_list, list) { ++ if (!urbp->unlinked) { ++ xenhcd_gnttab_done(&info->shadow[urbp->req_id]); ++ barrier(); ++ if (urbp->urb->status == -EINPROGRESS)/* not dequeued */ ++ xenhcd_giveback_urb(info, urbp->urb, ++ -ESHUTDOWN); ++ else /* dequeued */ ++ xenhcd_giveback_urb(info, urbp->urb, ++ urbp->urb->status); ++ } ++ info->shadow[urbp->req_id].urb = NULL; ++ } ++ ++ list_for_each_entry_safe(urbp, tmp, &info->pending_submit_list, list) { ++ xenhcd_giveback_urb(info, urbp->urb, -ESHUTDOWN); ++ } ++ ++ return; ++} ++ ++/* ++ * caller must lock info->lock ++ */ ++static void xenhcd_giveback_unlinked_urbs(struct usbfront_info *info) ++{ ++ struct urb_priv *urbp, *tmp; ++ ++ list_for_each_entry_safe(urbp, tmp, ++ &info->giveback_waiting_list, list) { ++ xenhcd_giveback_urb(info, urbp->urb, urbp->urb->status); ++ } ++} ++ ++static int xenhcd_submit_urb(struct usbfront_info *info, struct urb_priv *urbp) ++{ ++ int ret = 0; ++ ++ if (RING_FULL(&info->urb_ring)) { ++ list_add_tail(&urbp->list, &info->pending_submit_list); ++ COUNT(info->stats.ring_full); ++ timer_action(info, TIMER_RING_WATCHDOG); ++ goto done; ++ } ++ ++ if (!list_empty(&info->pending_submit_list)) { ++ list_add_tail(&urbp->list, &info->pending_submit_list); ++ timer_action(info, TIMER_SCAN_PENDING_URBS); ++ goto done; ++ } ++ ++ ret = xenhcd_do_request(info, urbp); ++ if (ret == 0) ++ list_add_tail(&urbp->list, &info->in_progress_list); ++ ++done: ++ return ret; ++} ++ ++static int xenhcd_unlink_urb(struct usbfront_info *info, struct urb_priv *urbp) ++{ ++ int ret = 0; ++ ++ /* already unlinked? */ ++ if (urbp->unlinked) ++ return -EBUSY; ++ ++ urbp->unlinked = 1; ++ ++ /* the urb is still in pending_submit queue */ ++ if (urbp->req_id == ~0) { ++ list_move_tail(&urbp->list, &info->giveback_waiting_list); ++ timer_action(info, TIMER_SCAN_PENDING_URBS); ++ goto done; ++ } ++ ++ /* send unlink request to backend */ ++ if (RING_FULL(&info->urb_ring)) { ++ list_move_tail(&urbp->list, &info->pending_unlink_list); ++ COUNT(info->stats.ring_full); ++ timer_action(info, TIMER_RING_WATCHDOG); ++ goto done; ++ } ++ ++ if (!list_empty(&info->pending_unlink_list)) { ++ list_move_tail(&urbp->list, &info->pending_unlink_list); ++ timer_action(info, TIMER_SCAN_PENDING_URBS); ++ goto done; ++ } ++ ++ ret = xenhcd_do_request(info, urbp); ++ if (ret == 0) ++ list_move_tail(&urbp->list, &info->in_progress_list); ++ ++done: ++ return ret; ++} ++ ++static int xenhcd_urb_request_done(struct usbfront_info *info) ++{ ++ struct usbif_urb_response *res; ++ struct urb *urb; ++ ++ RING_IDX i, rp; ++ uint16_t id; ++ int more_to_do = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ rp = info->urb_ring.sring->rsp_prod; ++ rmb(); /* ensure we see queued responses up to "rp" */ ++ ++ for (i = info->urb_ring.rsp_cons; i != rp; i++) { ++ res = RING_GET_RESPONSE(&info->urb_ring, i); ++ id = res->id; ++ ++ if (likely(usbif_pipesubmit(info->shadow[id].req.pipe))) { ++ xenhcd_gnttab_done(&info->shadow[id]); ++ urb = info->shadow[id].urb; ++ barrier(); ++ if (likely(urb)) { ++ urb->actual_length = res->actual_length; ++ urb->error_count = res->error_count; ++ urb->start_frame = res->start_frame; ++ barrier(); ++ xenhcd_giveback_urb(info, urb, res->status); ++ } ++ } ++ ++ add_id_to_freelist(info, id); ++ } ++ info->urb_ring.rsp_cons = i; ++ ++ if (i != info->urb_ring.req_prod_pvt) ++ RING_FINAL_CHECK_FOR_RESPONSES(&info->urb_ring, more_to_do); ++ else ++ info->urb_ring.sring->rsp_event = i + 1; ++ ++ spin_unlock_irqrestore(&info->lock, flags); ++ ++ cond_resched(); ++ ++ return more_to_do; ++} ++ ++static int xenhcd_conn_notify(struct usbfront_info *info) ++{ ++ struct usbif_conn_response *res; ++ struct usbif_conn_request *req; ++ RING_IDX rc, rp; ++ uint16_t id; ++ uint8_t portnum, speed; ++ int more_to_do = 0; ++ int notify; ++ int port_changed = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ rc = info->conn_ring.rsp_cons; ++ rp = info->conn_ring.sring->rsp_prod; ++ rmb(); /* ensure we see queued responses up to "rp" */ ++ ++ while (rc != rp) { ++ res = RING_GET_RESPONSE(&info->conn_ring, rc); ++ id = res->id; ++ portnum = res->portnum; ++ speed = res->speed; ++ info->conn_ring.rsp_cons = ++rc; ++ ++ rhport_connect(info, portnum, speed); ++ if (info->ports[portnum-1].c_connection) ++ port_changed = 1; ++ ++ barrier(); ++ ++ req = RING_GET_REQUEST(&info->conn_ring, ++ info->conn_ring.req_prod_pvt); ++ req->id = id; ++ info->conn_ring.req_prod_pvt++; ++ } ++ ++ if (rc != info->conn_ring.req_prod_pvt) ++ RING_FINAL_CHECK_FOR_RESPONSES(&info->conn_ring, more_to_do); ++ else ++ info->conn_ring.sring->rsp_event = rc + 1; ++ ++ RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->conn_ring, notify); ++ if (notify) ++ notify_remote_via_irq(info->irq); ++ ++ spin_unlock_irqrestore(&info->lock, flags); ++ ++ if (port_changed) ++ usb_hcd_poll_rh_status(info_to_hcd(info)); ++ ++ cond_resched(); ++ ++ return more_to_do; ++} ++ ++int xenhcd_schedule(void *arg) ++{ ++ struct usbfront_info *info = (struct usbfront_info *) arg; ++ ++ while (!kthread_should_stop()) { ++ wait_event_interruptible(info->wq, ++ info->waiting_resp || kthread_should_stop()); ++ info->waiting_resp = 0; ++ smp_mb(); ++ ++ if (xenhcd_urb_request_done(info)) ++ info->waiting_resp = 1; ++ ++ if (xenhcd_conn_notify(info)) ++ info->waiting_resp = 1; ++ } ++ ++ return 0; ++} ++ ++static void xenhcd_notify_work(struct usbfront_info *info) ++{ ++ info->waiting_resp = 1; ++ wake_up(&info->wq); ++} ++ ++irqreturn_t xenhcd_int(int irq, void *dev_id) ++{ ++ xenhcd_notify_work((struct usbfront_info *) dev_id); ++ return IRQ_HANDLED; ++} ++ ++static void xenhcd_watchdog(unsigned long param) ++{ ++ struct usbfront_info *info = (struct usbfront_info *) param; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ if (likely(HC_IS_RUNNING(info_to_hcd(info)->state))) { ++ timer_action_done(info, TIMER_RING_WATCHDOG); ++ xenhcd_giveback_unlinked_urbs(info); ++ xenhcd_kick_pending_urbs(info); ++ } ++ spin_unlock_irqrestore(&info->lock, flags); ++} ++ ++/* ++ * one-time HC init ++ */ ++static int xenhcd_setup(struct usb_hcd *hcd) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ ++ spin_lock_init(&info->lock); ++ INIT_LIST_HEAD(&info->pending_submit_list); ++ INIT_LIST_HEAD(&info->pending_unlink_list); ++ INIT_LIST_HEAD(&info->in_progress_list); ++ INIT_LIST_HEAD(&info->giveback_waiting_list); ++ init_timer(&info->watchdog); ++ info->watchdog.function = xenhcd_watchdog; ++ info->watchdog.data = (unsigned long) info; ++ return 0; ++} ++ ++/* ++ * start HC running ++ */ ++static int xenhcd_run(struct usb_hcd *hcd) ++{ ++ hcd->uses_new_polling = 1; ++ hcd->state = HC_STATE_RUNNING; ++ create_debug_file(hcd_to_info(hcd)); ++ return 0; ++} ++ ++/* ++ * stop running HC ++ */ ++static void xenhcd_stop(struct usb_hcd *hcd) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ ++ del_timer_sync(&info->watchdog); ++ remove_debug_file(info); ++ spin_lock_irq(&info->lock); ++ /* cancel all urbs */ ++ hcd->state = HC_STATE_HALT; ++ xenhcd_cancel_all_enqueued_urbs(info); ++ xenhcd_giveback_unlinked_urbs(info); ++ spin_unlock_irq(&info->lock); ++} ++ ++/* ++ * called as .urb_enqueue() ++ * non-error returns are promise to giveback the urb later ++ */ ++static int xenhcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, ++ gfp_t mem_flags) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ struct urb_priv *urbp; ++ unsigned long flags; ++ int ret = 0; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ urbp = alloc_urb_priv(urb); ++ if (!urbp) { ++ ret = -ENOMEM; ++ goto done; ++ } ++ urbp->status = 1; ++ ++ ret = xenhcd_submit_urb(info, urbp); ++ if (ret != 0) ++ free_urb_priv(urbp); ++ ++done: ++ spin_unlock_irqrestore(&info->lock, flags); ++ return ret; ++} ++ ++/* ++ * called as .urb_dequeue() ++ */ ++static int xenhcd_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ++{ ++ struct usbfront_info *info = hcd_to_info(hcd); ++ struct urb_priv *urbp; ++ unsigned long flags; ++ int ret = 0; ++ ++ spin_lock_irqsave(&info->lock, flags); ++ ++ urbp = urb->hcpriv; ++ if (!urbp) ++ goto done; ++ ++ urbp->status = status; ++ ret = xenhcd_unlink_urb(info, urbp); ++ ++done: ++ spin_unlock_irqrestore(&info->lock, flags); ++ return ret; ++} ++ ++/* ++ * called from usb_get_current_frame_number(), ++ * but, almost all drivers not use such function. ++ */ ++static int xenhcd_get_frame(struct usb_hcd *hcd) ++{ ++ /* it means error, but probably no problem :-) */ ++ return 0; ++} ++ ++static const char hcd_name[] = "xen_hcd"; ++ ++struct hc_driver xen_usb20_hc_driver = { ++ .description = hcd_name, ++ .product_desc = "Xen USB2.0 Virtual Host Controller", ++ .hcd_priv_size = sizeof(struct usbfront_info), ++ .flags = HCD_USB2, ++ ++ /* basic HC lifecycle operations */ ++ .reset = xenhcd_setup, ++ .start = xenhcd_run, ++ .stop = xenhcd_stop, ++ ++ /* managing urb I/O */ ++ .urb_enqueue = xenhcd_urb_enqueue, ++ .urb_dequeue = xenhcd_urb_dequeue, ++ .get_frame_number = xenhcd_get_frame, ++ ++ /* root hub operations */ ++ .hub_status_data = xenhcd_hub_status_data, ++ .hub_control = xenhcd_hub_control, ++#ifdef XENHCD_PM ++#ifdef CONFIG_PM ++ .bus_suspend = xenhcd_bus_suspend, ++ .bus_resume = xenhcd_bus_resume, ++#endif ++#endif ++}; ++ ++struct hc_driver xen_usb11_hc_driver = { ++ .description = hcd_name, ++ .product_desc = "Xen USB1.1 Virtual Host Controller", ++ .hcd_priv_size = sizeof(struct usbfront_info), ++ .flags = HCD_USB11, ++ ++ /* basic HC lifecycle operations */ ++ .reset = xenhcd_setup, ++ .start = xenhcd_run, ++ .stop = xenhcd_stop, ++ ++ /* managing urb I/O */ ++ .urb_enqueue = xenhcd_urb_enqueue, ++ .urb_dequeue = xenhcd_urb_dequeue, ++ .get_frame_number = xenhcd_get_frame, ++ ++ /* root hub operations */ ++ .hub_status_data = xenhcd_hub_status_data, ++ .hub_control = xenhcd_hub_control, ++#ifdef XENHCD_PM ++#ifdef CONFIG_PM ++ .bus_suspend = xenhcd_bus_suspend, ++ .bus_resume = xenhcd_bus_resume, ++#endif ++#endif ++}; ++ ++#define GRANT_INVALID_REF 0 ++ ++static void destroy_rings(struct usbfront_info *info) ++{ ++ if (info->irq) ++ unbind_from_irqhandler(info->irq, info); ++ info->evtchn = info->irq = 0; ++ ++ if (info->urb_ring_ref != GRANT_INVALID_REF) { ++ gnttab_end_foreign_access(info->urb_ring_ref, 0, ++ (unsigned long)info->urb_ring.sring); ++ info->urb_ring_ref = GRANT_INVALID_REF; ++ } ++ info->urb_ring.sring = NULL; ++ ++ if (info->conn_ring_ref != GRANT_INVALID_REF) { ++ gnttab_end_foreign_access(info->conn_ring_ref, 0, ++ (unsigned long)info->conn_ring.sring); ++ info->conn_ring_ref = GRANT_INVALID_REF; ++ } ++ info->conn_ring.sring = NULL; ++} ++ ++static int setup_rings(struct xenbus_device *dev, struct usbfront_info *info) ++{ ++ struct usbif_urb_sring *urb_sring; ++ struct usbif_conn_sring *conn_sring; ++ int err; ++ ++ info->urb_ring_ref = GRANT_INVALID_REF; ++ info->conn_ring_ref = GRANT_INVALID_REF; ++ ++ urb_sring = (struct usbif_urb_sring *) ++ get_zeroed_page(GFP_NOIO|__GFP_HIGH); ++ if (!urb_sring) { ++ xenbus_dev_fatal(dev, -ENOMEM, "allocating urb ring"); ++ return -ENOMEM; ++ } ++ SHARED_RING_INIT(urb_sring); ++ FRONT_RING_INIT(&info->urb_ring, urb_sring, PAGE_SIZE); ++ ++ err = xenbus_grant_ring(dev, virt_to_mfn(info->urb_ring.sring)); ++ if (err < 0) { ++ free_page((unsigned long)urb_sring); ++ info->urb_ring.sring = NULL; ++ goto fail; ++ } ++ info->urb_ring_ref = err; ++ ++ conn_sring = (struct usbif_conn_sring *) ++ get_zeroed_page(GFP_NOIO|__GFP_HIGH); ++ if (!conn_sring) { ++ xenbus_dev_fatal(dev, -ENOMEM, "allocating conn ring"); ++ return -ENOMEM; ++ } ++ SHARED_RING_INIT(conn_sring); ++ FRONT_RING_INIT(&info->conn_ring, conn_sring, PAGE_SIZE); ++ ++ err = xenbus_grant_ring(dev, virt_to_mfn(info->conn_ring.sring)); ++ if (err < 0) { ++ free_page((unsigned long)conn_sring); ++ info->conn_ring.sring = NULL; ++ goto fail; ++ } ++ info->conn_ring_ref = err; ++ ++ err = xenbus_alloc_evtchn(dev, &info->evtchn); ++ if (err) ++ goto fail; ++ ++ err = bind_evtchn_to_irqhandler(info->evtchn, xenhcd_int, 0, ++ "usbif", info); ++ if (err <= 0) { ++ xenbus_dev_fatal(dev, err, "bind_listening_port_to_irqhandler"); ++ goto fail; ++ } ++ info->irq = err; ++ ++ return 0; ++fail: ++ destroy_rings(info); ++ return err; ++} ++ ++static int talk_to_usbback(struct xenbus_device *dev, ++ struct usbfront_info *info) ++{ ++ const char *message; ++ struct xenbus_transaction xbt; ++ int err; ++ ++ err = setup_rings(dev, info); ++ if (err) ++ goto out; ++ ++again: ++ err = xenbus_transaction_start(&xbt); ++ if (err) { ++ xenbus_dev_fatal(dev, err, "starting transaction"); ++ goto destroy_ring; ++ } ++ ++ err = xenbus_printf(xbt, dev->nodename, "urb-ring-ref", ++ "%u", info->urb_ring_ref); ++ if (err) { ++ message = "writing urb-ring-ref"; ++ goto abort_transaction; ++ } ++ ++ err = xenbus_printf(xbt, dev->nodename, "conn-ring-ref", ++ "%u", info->conn_ring_ref); ++ if (err) { ++ message = "writing conn-ring-ref"; ++ goto abort_transaction; ++ } ++ ++ err = xenbus_printf(xbt, dev->nodename, "event-channel", ++ "%u", info->evtchn); ++ if (err) { ++ message = "writing event-channel"; ++ goto abort_transaction; ++ } ++ ++ err = xenbus_transaction_end(xbt, 0); ++ if (err) { ++ if (err == -EAGAIN) ++ goto again; ++ xenbus_dev_fatal(dev, err, "completing transaction"); ++ goto destroy_ring; ++ } ++ ++ return 0; ++ ++abort_transaction: ++ xenbus_transaction_end(xbt, 1); ++ xenbus_dev_fatal(dev, err, "%s", message); ++ ++destroy_ring: ++ destroy_rings(info); ++ ++out: ++ return err; ++} ++ ++static int connect(struct xenbus_device *dev) ++{ ++ struct usbfront_info *info = dev_get_drvdata(&dev->dev); ++ ++ struct usbif_conn_request *req; ++ int i, idx, err; ++ int notify; ++ char name[TASK_COMM_LEN]; ++ struct usb_hcd *hcd; ++ ++ hcd = info_to_hcd(info); ++ snprintf(name, TASK_COMM_LEN, "xenhcd.%d", hcd->self.busnum); ++ ++ err = talk_to_usbback(dev, info); ++ if (err) ++ return err; ++ ++ info->kthread = kthread_run(xenhcd_schedule, info, name); ++ if (IS_ERR(info->kthread)) { ++ err = PTR_ERR(info->kthread); ++ info->kthread = NULL; ++ xenbus_dev_fatal(dev, err, "Error creating thread"); ++ return err; ++ } ++ /* prepare ring for hotplug notification */ ++ for (idx = 0, i = 0; i < USB_CONN_RING_SIZE; i++) { ++ req = RING_GET_REQUEST(&info->conn_ring, idx); ++ req->id = idx; ++ idx++; ++ } ++ info->conn_ring.req_prod_pvt = idx; ++ ++ RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->conn_ring, notify); ++ if (notify) ++ notify_remote_via_irq(info->irq); ++ ++ return 0; ++} ++ ++static struct usb_hcd *create_hcd(struct xenbus_device *dev) ++{ ++ int i; ++ int err = 0; ++ int num_ports; ++ int usb_ver; ++ struct usb_hcd *hcd = NULL; ++ struct usbfront_info *info = NULL; ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "num-ports", ++ "%d", &num_ports); ++ if (err != 1) { ++ xenbus_dev_fatal(dev, err, "reading num-ports"); ++ return ERR_PTR(-EINVAL); ++ } ++ if (num_ports < 1 || num_ports > USB_MAXCHILDREN) { ++ xenbus_dev_fatal(dev, err, "invalid num-ports"); ++ return ERR_PTR(-EINVAL); ++ } ++ ++ err = xenbus_scanf(XBT_NIL, dev->otherend, "usb-ver", "%d", &usb_ver); ++ if (err != 1) { ++ xenbus_dev_fatal(dev, err, "reading usb-ver"); ++ return ERR_PTR(-EINVAL); ++ } ++ switch (usb_ver) { ++ case USB_VER_USB11: ++ hcd = usb_create_hcd(&xen_usb11_hc_driver, ++ &dev->dev, dev_name(&dev->dev)); ++ break; ++ case USB_VER_USB20: ++ hcd = usb_create_hcd(&xen_usb20_hc_driver, ++ &dev->dev, dev_name(&dev->dev)); ++ break; ++ default: ++ xenbus_dev_fatal(dev, err, "invalid usb-ver"); ++ return ERR_PTR(-EINVAL); ++ } ++ if (!hcd) { ++ xenbus_dev_fatal(dev, err, ++ "fail to allocate USB host controller"); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ info = hcd_to_info(hcd); ++ info->xbdev = dev; ++ info->rh_numports = num_ports; ++ ++ for (i = 0; i < USB_URB_RING_SIZE; i++) { ++ info->shadow[i].req.id = i + 1; ++ info->shadow[i].urb = NULL; ++ } ++ info->shadow[USB_URB_RING_SIZE-1].req.id = 0x0fff; ++ ++ return hcd; ++} ++ ++static int usbfront_probe(struct xenbus_device *dev, ++ const struct xenbus_device_id *id) ++{ ++ int err; ++ struct usb_hcd *hcd; ++ struct usbfront_info *info; ++ ++ if (usb_disabled()) ++ return -ENODEV; ++ ++ hcd = create_hcd(dev); ++ if (IS_ERR(hcd)) { ++ err = PTR_ERR(hcd); ++ xenbus_dev_fatal(dev, err, ++ "failed to create usb host controller"); ++ goto fail; ++ } ++ ++ info = hcd_to_info(hcd); ++ dev_set_drvdata(&dev->dev, info); ++ ++ err = usb_add_hcd(hcd, 0, 0); ++ if (err != 0) { ++ xenbus_dev_fatal(dev, err, "fail to add USB host controller"); ++ goto fail; ++ } ++ ++ init_waitqueue_head(&info->wq); ++ ++ return 0; ++ ++fail: ++ usb_put_hcd(hcd); ++ dev_set_drvdata(&dev->dev, NULL); ++ return err; ++} ++ ++static void usbfront_disconnect(struct xenbus_device *dev) ++{ ++ struct usbfront_info *info = dev_get_drvdata(&dev->dev); ++ struct usb_hcd *hcd = info_to_hcd(info); ++ ++ usb_remove_hcd(hcd); ++ if (info->kthread) { ++ kthread_stop(info->kthread); ++ info->kthread = NULL; ++ } ++ xenbus_frontend_closed(dev); ++} ++ ++static void usbback_changed(struct xenbus_device *dev, ++ enum xenbus_state backend_state) ++{ ++ switch (backend_state) { ++ case XenbusStateInitialising: ++ case XenbusStateInitialised: ++ case XenbusStateConnected: ++ case XenbusStateReconfiguring: ++ case XenbusStateReconfigured: ++ case XenbusStateUnknown: ++ case XenbusStateClosed: ++ break; ++ ++ case XenbusStateInitWait: ++ if (dev->state != XenbusStateInitialising) ++ break; ++ if (!connect(dev)) ++ xenbus_switch_state(dev, XenbusStateConnected); ++ break; ++ ++ case XenbusStateClosing: ++ usbfront_disconnect(dev); ++ break; ++ ++ default: ++ xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend", ++ backend_state); ++ break; ++ } ++} ++ ++static int usbfront_remove(struct xenbus_device *dev) ++{ ++ struct usbfront_info *info = dev_get_drvdata(&dev->dev); ++ struct usb_hcd *hcd = info_to_hcd(info); ++ ++ destroy_rings(info); ++ usb_put_hcd(hcd); ++ ++ return 0; ++} ++ ++static const struct xenbus_device_id usbfront_ids[] = { ++ { "vusb" }, ++ { "" }, ++}; ++MODULE_ALIAS("xen:vusb"); ++ ++static DEFINE_XENBUS_DRIVER(usbfront, , ++ .probe = usbfront_probe, ++ .remove = usbfront_remove, ++ .otherend_changed = usbback_changed, ++); ++ ++static int __init usbfront_init(void) ++{ ++ if (!xen_domain()) ++ return -ENODEV; ++ ++ xenhcd_urbp_cachep = kmem_cache_create("xenhcd_urb_priv", ++ sizeof(struct urb_priv), 0, 0, NULL); ++ if (!xenhcd_urbp_cachep) { ++ printk(KERN_ERR "usbfront failed to create kmem cache\n"); ++ return -ENOMEM; ++ } ++ ++ return xenbus_register_frontend(&usbfront_driver); ++} ++ ++static void __exit usbfront_exit(void) ++{ ++ kmem_cache_destroy(xenhcd_urbp_cachep); ++ xenbus_unregister_driver(&usbfront_driver); ++} ++ ++module_init(usbfront_init); ++module_exit(usbfront_exit); ++ ++MODULE_AUTHOR(""); ++MODULE_DESCRIPTION("Xen USB Virtual Host Controller driver (usbfront)"); ++MODULE_LICENSE("Dual BSD/GPL"); +diff --git a/include/xen/interface/io/usbif.h b/include/xen/interface/io/usbif.h +new file mode 100644 +index 0000000..f3bb1b2 +--- /dev/null ++++ b/include/xen/interface/io/usbif.h +@@ -0,0 +1,150 @@ ++/* ++ * usbif.h ++ * ++ * USB I/O interface for Xen guest OSes. ++ * ++ * Copyright (C) 2009, FUJITSU LABORATORIES LTD. ++ * Author: Noboru Iwamatsu ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this software and associated documentation files (the "Software"), to ++ * deal in the Software without restriction, including without limitation the ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ++ * sell copies of the Software, and to permit persons to whom the Software is ++ * furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ++ * DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef __XEN_PUBLIC_IO_USBIF_H__ ++#define __XEN_PUBLIC_IO_USBIF_H__ ++ ++#include "ring.h" ++#include "../grant_table.h" ++ ++enum usb_spec_version { ++ USB_VER_UNKNOWN = 0, ++ USB_VER_USB11, ++ USB_VER_USB20, ++ USB_VER_USB30, /* not supported yet */ ++}; ++ ++/* ++ * USB pipe in usbif_request ++ * ++ * bits 0-5 are specific bits for virtual USB driver. ++ * bits 7-31 are standard urb pipe. ++ * ++ * - port number(NEW): bits 0-4 ++ * (USB_MAXCHILDREN is 31) ++ * ++ * - operation flag(NEW): bit 5 ++ * (0 = submit urb, ++ * 1 = unlink urb) ++ * ++ * - direction: bit 7 ++ * (0 = Host-to-Device [Out] ++ * 1 = Device-to-Host [In]) ++ * ++ * - device address: bits 8-14 ++ * ++ * - endpoint: bits 15-18 ++ * ++ * - pipe type: bits 30-31 ++ * (00 = isochronous, 01 = interrupt, ++ * 10 = control, 11 = bulk) ++ */ ++#define usbif_pipeportnum(pipe) ((pipe) & 0x1f) ++#define usbif_setportnum_pipe(pipe, portnum) \ ++ ((pipe)|(portnum)) ++ ++#define usbif_pipeunlink(pipe) ((pipe) & 0x20) ++#define usbif_pipesubmit(pipe) (!usbif_pipeunlink(pipe)) ++#define usbif_setunlink_pipe(pipe) ((pipe)|(0x20)) ++ ++#define USBIF_BACK_MAX_PENDING_REQS (128) ++#define USBIF_MAX_SEGMENTS_PER_REQUEST (16) ++ ++/* ++ * RING for transferring urbs. ++ */ ++struct usbif_request_segment { ++ grant_ref_t gref; ++ uint16_t offset; ++ uint16_t length; ++}; ++ ++struct usbif_urb_request { ++ uint16_t id; /* request id */ ++ uint16_t nr_buffer_segs; /* number of urb->transfer_buffer segments */ ++ ++ /* basic urb parameter */ ++ uint32_t pipe; ++ uint16_t transfer_flags; ++ uint16_t buffer_length; ++ union { ++ uint8_t ctrl[8]; /* setup_packet (Ctrl) */ ++ ++ struct { ++ uint16_t interval; /* maximum (1024*8) in usb core */ ++ uint16_t start_frame; /* start frame */ ++ uint16_t number_of_packets; /* number of ISO packet */ ++ uint16_t nr_frame_desc_segs; /* number of iso_frame_desc ++ segments */ ++ } isoc; ++ ++ struct { ++ uint16_t interval; /* maximum (1024*8) in usb core */ ++ uint16_t pad[3]; ++ } intr; ++ ++ struct { ++ uint16_t unlink_id; /* unlink request id */ ++ uint16_t pad[3]; ++ } unlink; ++ ++ } u; ++ ++ /* urb data segments */ ++ struct usbif_request_segment seg[USBIF_MAX_SEGMENTS_PER_REQUEST]; ++}; ++ ++struct usbif_urb_response { ++ uint16_t id; /* request id */ ++ uint16_t start_frame; /* start frame (ISO) */ ++ int32_t status; /* status (non-ISO) */ ++ int32_t actual_length; /* actual transfer length */ ++ int32_t error_count; /* number of ISO errors */ ++}; ++ ++DEFINE_RING_TYPES(usbif_urb, struct usbif_urb_request, ++ struct usbif_urb_response); ++#define USB_URB_RING_SIZE __CONST_RING_SIZE(usbif_urb, PAGE_SIZE) ++ ++/* ++ * RING for notifying connect/disconnect events to frontend ++ */ ++struct usbif_conn_request { ++ uint16_t id; ++}; ++ ++struct usbif_conn_response { ++ uint16_t id; /* request id */ ++ uint8_t portnum; /* port number */ ++ uint8_t speed; /* usb_device_speed */ ++}; ++ ++DEFINE_RING_TYPES(usbif_conn, struct usbif_conn_request, ++ struct usbif_conn_response); ++#define USB_CONN_RING_SIZE __CONST_RING_SIZE(usbif_conn, PAGE_SIZE) ++ ++#endif /* __XEN_PUBLIC_IO_USBIF_H__ */ diff --git a/patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch b/patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch new file mode 100644 index 0000000..52a33e2 --- /dev/null +++ b/patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch @@ -0,0 +1,72 @@ +From 433928d3823f561919ead305194e46e5311b573d Mon Sep 17 00:00:00 2001 +From: Marek Marczykowski +Date: Sat, 23 Jun 2012 19:50:44 +0200 +Subject: [PATCH 1/2] Revert "xen/pat: Disable PAT support for now." +Organization: Invisible Things Lab + +This reverts commit 8eaffa67b43e99ae581622c5133e20b0f48bcef1. + +We haven't observed failure which is workarounded by this patch, but it caused +horrible GPU performance. Anyway there is "nopat" option. + +Signed-off-by: Marek Marczykowski +--- + arch/x86/xen/enlighten.c | 2 -- + arch/x86/xen/mmu.c | 8 ++++---- + 2 files changed, 4 insertions(+), 6 deletions(-) + +diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c +index 6c7f1e8..bf3319c 100644 +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -1269,9 +1269,7 @@ asmlinkage void __init xen_start_kernel(void) + + /* Prevent unwanted bits from being set in PTEs. */ + __supported_pte_mask &= ~_PAGE_GLOBAL; +-#if 0 + if (!xen_initial_domain()) +-#endif + __supported_pte_mask &= ~(_PAGE_PWT | _PAGE_PCD); + + __supported_pte_mask |= _PAGE_IOMAP; +diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c +index 69f5857..a5d252a 100644 +--- a/arch/x86/xen/mmu.c ++++ b/arch/x86/xen/mmu.c +@@ -420,13 +420,13 @@ static pteval_t iomap_pte(pteval_t val) + static pteval_t xen_pte_val(pte_t pte) + { + pteval_t pteval = pte.pte; +-#if 0 ++ + /* If this is a WC pte, convert back from Xen WC to Linux WC */ + if ((pteval & (_PAGE_PAT | _PAGE_PCD | _PAGE_PWT)) == _PAGE_PAT) { + WARN_ON(!pat_enabled); + pteval = (pteval & ~_PAGE_PAT) | _PAGE_PWT; + } +-#endif ++ + if (xen_initial_domain() && (pteval & _PAGE_IOMAP)) + return pteval; + +@@ -468,7 +468,7 @@ void xen_set_pat(u64 pat) + static pte_t xen_make_pte(pteval_t pte) + { + phys_addr_t addr = (pte & PTE_PFN_MASK); +-#if 0 ++ + /* If Linux is trying to set a WC pte, then map to the Xen WC. + * If _PAGE_PAT is set, then it probably means it is really + * _PAGE_PSE, so avoid fiddling with the PAT mapping and hope +@@ -481,7 +481,7 @@ static pte_t xen_make_pte(pteval_t pte) + if ((pte & (_PAGE_PCD | _PAGE_PWT)) == _PAGE_PWT) + pte = (pte & ~(_PAGE_PCD | _PAGE_PWT)) | _PAGE_PAT; + } +-#endif ++ + /* + * Unprivileged domains are allowed to do IOMAPpings for + * PCI passthrough, but not map ISA space. The ISA +-- +1.7.4.4 + diff --git a/patches.xen/pvops-3.4-x86-cpa-Use-pte_attrs-instead-of-pte_flags-on-CPA-se.patch b/patches.xen/pvops-3.4-x86-cpa-Use-pte_attrs-instead-of-pte_flags-on-CPA-se.patch new file mode 100644 index 0000000..52cb5eb --- /dev/null +++ b/patches.xen/pvops-3.4-x86-cpa-Use-pte_attrs-instead-of-pte_flags-on-CPA-se.patch @@ -0,0 +1,196 @@ +From f37a97dead89d07bce4d8fedc4c295c9bc700ab5 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Fri, 4 Nov 2011 11:59:34 -0400 +Subject: [PATCH 2/2] x86/cpa: Use pte_attrs instead of pte_flags on + CPA/set_p.._wb/wc operations. + +When using the paravirt interface, most of the page operations are wrapped +in the pvops interface. The one that is not is the pte_flags. The reason +being that for most cases, the "raw" PTE flag values for baremetal and whatever +pvops platform is running (in this case) - share the same bit meaning. + +Except for PAT. Under Linux, the PAT MSR is written to be: + + PAT4 PAT0 ++---+----+----+----+-----+----+----+ + WC | WC | WB | UC | UC- | WC | WB | <= Linux ++---+----+----+----+-----+----+----+ + WC | WT | WB | UC | UC- | WT | WB | <= BIOS ++---+----+----+----+-----+----+----+ + WC | WP | WC | UC | UC- | WT | WB | <= Xen ++---+----+----+----+-----+----+----+ + +The lookup of this index table translates to looking up +Bit 7, Bit 4, and Bit 3 of PTE: + + PAT/PSE (bit 7) ... PCD (bit 4) .. PWT (bit 3). + +If all bits are off, then we are using PAT0. If bit 3 turned on, +then we are using PAT1, if bit 3 and bit 4, then PAT2.. + +Back to the PAT MSR table: + +As you can see, the PAT1 translates to PAT4 under Xen. Under Linux +we only use PAT0, PAT1, and PAT2 for the caching as: + + WB = none (so PAT0) + WC = PWT (bit 3 on) + UC = PWT | PCD (bit 3 and 4 are on). + +But to make it work with Xen, we end up doing for WC a translation: + + PWT (so bit 3 on) --> PAT (so bit 7 is on) and clear bit 3 + +And to translate back (when the paravirt pte_val is used) we would: + + PAT (bit 7 on) --> PWT (bit 3 on) and clear bit 7. + +This works quite well, except if code uses the pte_flags, as pte_flags +reads the raw value and does not go through the paravirt. Which means +that if (when running under Xen): + + 1) we allocate some pages. + 2) call set_pages_array_wc, which ends up calling: + __page_change_att_set_clr(.., __pgprot(__PAGE_WC), /* set */ + , __pgprot(__PAGE_MASK), /* clear */ + which ends up reading the _raw_ PTE flags and _only_ look at the + _PTE_FLAG_MASK contents with __PAGE_MASK cleared (0x18) and + __PAGE_WC (0x8) set. + + read raw *pte -> 0x67 + *pte = 0x67 & ^0x18 | 0x8 + *pte = 0x67 & 0xfffffe7 | 0x8 + *pte = 0x6f + + [now set_pte_atomic is called, and 0x6f is written in, but under + xen_make_pte, the bit 3 is translated to bit 7, so it ends up + writting 0xa7, which is correct] + + 3) do something to them. + 4) call set_pages_array_wb + __page_change_att_set_clr(.., __pgprot(__PAGE_WB), /* set */ + , __pgprot(__PAGE_MASK), /* clear */ + which ends up reading the _raw_ PTE and _only_ look at the + _PTE_FLAG_MASK contents with _PAGE_MASK cleared (0x18) and + __PAGE_WB (0x0) set: + + read raw *pte -> 0xa7 + *pte = 0xa7 & &0x18 | 0 + *pte = 0xa7 & 0xfffffe7 | 0 + *pte = 0xa7 + + [we check whether the old PTE is different from the new one + + if (pte_val(old_pte) != pte_val(new_pte)) { + set_pte_atomic(kpte, new_pte); + ... + + and find out that 0xA7 == 0xA7 so we do not write the new PTE value in] + + End result is that we failed at removing the WC caching bit! + + 5) free them. + [and have pages with PAT4 (bit 7) set, so other subsystems end up using + the pages that have the write combined bit set resulting in crashes. Yikes!]. + +The fix, which this patch proposes, is to wrap the pte_pgprot in the CPA +code with newly introduced pte_attrs which can go through the pvops interface +to get the "emulated" value instead of the raw. Naturally if CONFIG_PARAVIRT is +not set, it would end calling native_pte_val. + +The other way to fix this is by wrapping pte_flags and go through the pvops +interface and it really is the Right Thing to do. The problem is, that past +experience with mprotect stuff demonstrates that it be really expensive in inner +loops, and pte_flags() is used in some very perf-critical areas. + +Example code to run this and see the various mysterious subsystems/applications +crashing + +MODULE_AUTHOR("Konrad Rzeszutek Wilk "); +MODULE_DESCRIPTION("wb_to_wc_and_back"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(WB_TO_WC); + +static int thread(void *arg) +{ + struct page *a[MAX_PAGES]; + unsigned int i, j; + do { + for (j = 0, i = 0;i < MAX_PAGES; i++, j++) { + a[i] = alloc_page(GFP_KERNEL); + if (!a[i]) + break; + } + set_pages_array_wc(a, j); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout_interruptible(HZ); + for (i = 0; i < j; i++) { + unsigned long *addr = page_address(a[i]); + if (addr) { + memset(addr, 0xc2, PAGE_SIZE); + } + } + set_pages_array_wb(a, j); + for (i = 0; i< MAX_PAGES; i++) { + if (a[i]) + __free_page(a[i]); + a[i] = NULL; + } + } while (!kthread_should_stop()); + return 0; +} +static struct task_struct *t; +static int __init wb_to_wc_init(void) +{ + t = kthread_run(thread, NULL, "wb_to_wc_and_back"); + return 0; +} +static void __exit wb_to_wc_exit(void) +{ + if (t) + kthread_stop(t); +} +module_init(wb_to_wc_init); +module_exit(wb_to_wc_exit); + +This fixes RH BZ #742032, #787403, and #745574 +Signed-off-by: Konrad Rzeszutek Wilk +Tested-by: Tom Goetz +CC: stable@kernel.org +--- + arch/x86/include/asm/pgtable.h | 5 +++++ + arch/x86/mm/pageattr.c | 2 +- + 2 files changed, 6 insertions(+), 1 deletions(-) + +diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h +index 49afb3f..fa7bd2c 100644 +--- a/arch/x86/include/asm/pgtable.h ++++ b/arch/x86/include/asm/pgtable.h +@@ -349,6 +349,11 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot) + return __pgprot(preservebits | addbits); + } + ++static inline pgprot_t pte_attrs(pte_t pte) ++{ ++ return __pgprot(pte_val(pte) & PTE_FLAGS_MASK); ++} ++ + #define pte_pgprot(x) __pgprot(pte_flags(x) & PTE_FLAGS_MASK) + + #define canon_pgprot(p) __pgprot(massage_pgprot(p)) +diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c +index e1ebde3..1ae1b4b 100644 +--- a/arch/x86/mm/pageattr.c ++++ b/arch/x86/mm/pageattr.c +@@ -651,7 +651,7 @@ repeat: + + if (level == PG_LEVEL_4K) { + pte_t new_pte; +- pgprot_t new_prot = pte_pgprot(old_pte); ++ pgprot_t new_prot = pte_attrs(old_pte); + unsigned long pfn = pte_pfn(old_pte); + + pgprot_val(new_prot) &= ~pgprot_val(cpa->mask_clr); +-- +1.7.4.4 + diff --git a/patches.xen/pvops-blkfront-eject-support.patch b/patches.xen/pvops-blkfront-eject-support.patch index e149ba9..e304ed6 100644 --- a/patches.xen/pvops-blkfront-eject-support.patch +++ b/patches.xen/pvops-blkfront-eject-support.patch @@ -1,9 +1,9 @@ --- linux-3.4.1.orig/drivers/block/xen-blkfront.c 2012-06-01 09:18:44.000000000 +0200 +++ linux-3.4.1/drivers/block/xen-blkfront.c 2012-07-15 15:54:31.350255623 +0200 @@ -44,6 +44,7 @@ - #include #include #include + #include +#include #include diff --git a/patches.xen/pvops-enable-netfront-in-dom0.patch b/patches.xen/pvops-enable-netfront-in-dom0.patch deleted file mode 100644 index 9830bf2..0000000 --- a/patches.xen/pvops-enable-netfront-in-dom0.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c -index 698b905..e31ebff 100644 ---- a/drivers/net/xen-netfront.c -+++ b/drivers/net/xen-netfront.c -@@ -1953,9 +1953,6 @@ static int __init netif_init(void) - if (!xen_domain()) - return -ENODEV; - -- if (xen_initial_domain()) -- return 0; -- - printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); - - return xenbus_register_frontend(&netfront_driver); -@@ -1965,9 +1962,6 @@ module_init(netif_init); - - static void __exit netif_exit(void) - { -- if (xen_initial_domain()) -- return; -- - xenbus_unregister_driver(&netfront_driver); - } - module_exit(netif_exit); diff --git a/patches.xen/pvops-netback-calculate-correctly-the-SKB-slots.patch b/patches.xen/pvops-netback-calculate-correctly-the-SKB-slots.patch deleted file mode 100644 index 84e3919..0000000 --- a/patches.xen/pvops-netback-calculate-correctly-the-SKB-slots.patch +++ /dev/null @@ -1,42 +0,0 @@ -From: Simon Graham -To: Ian Campbell , "konrad.wilk@oracle.com" - , "xen-devel@lists.xensource.com" - , "netdev@vger.kernel.org" - -Date: Thu, 24 May 2012 12:26:07 -0400 -Cc: "bhutchings@solarflare.com" , - Simon Graham , - "davem@davemloft.net" , - "adnan.misherfi@oracle.com" -Subject: [Xen-devel] [PATCH] xen/netback: Calculate the number of SKB slots - required correctly - -When calculating the number of slots required for a packet header, the code -was reserving too many slots if the header crossed a page boundary. Since -netbk_gop_skb copies the header to the start of the page, the count of -slots required for the header should be based solely on the header size. - -This problem is easy to reproduce if a VIF is bridged to a USB 3G modem -device as the skb->data value always starts near the end of the first page. - -Signed-off-by: Simon Graham ---- - drivers/net/xen-netback/netback.c | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c -index 2596401..f4a6fca 100644 ---- a/drivers/net/xen-netback/netback.c -+++ b/drivers/net/xen-netback/netback.c -@@ -325,8 +325,7 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) - unsigned int count; - int i, copy_off; - -- count = DIV_ROUND_UP( -- offset_in_page(skb->data)+skb_headlen(skb), PAGE_SIZE); -+ count = DIV_ROUND_UP(skb_headlen(skb), PAGE_SIZE); - - copy_off = skb_headlen(skb) % PAGE_SIZE; - --- -1.7.9.1 diff --git a/rel-pvops b/rel-pvops index 7f8f011..d00491f 100644 --- a/rel-pvops +++ b/rel-pvops @@ -1 +1 @@ -7 +1 diff --git a/series-pvops.conf b/series-pvops.conf index 4c9a6cf..44ffdb9 100644 --- a/series-pvops.conf +++ b/series-pvops.conf @@ -1,15 +1,12 @@ -patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch -patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch -patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch -patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch -patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch -patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch -patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch -patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch -patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch -patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch -patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch -patches.xen/pvops-enable-netfront-in-dom0.patch -patches.xen/pvops-netback-calculate-correctly-the-SKB-slots.patch +# ACPI S3 +patches.xen/pvops-0001-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch +patches.xen/pvops-0003-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch + +# fix for GPU performance (revert workaround and apply proper fix), should go in 3.5 +patches.xen/pvops-3.4-Revert-xen-pat-Disable-PAT-support-for-now.patch +patches.xen/pvops-3.4-x86-cpa-Use-pte_attrs-instead-of-pte_flags-on-CPA-se.patch + +# Additional features +patches.xen/pvops-0100-usb-xen-pvusb-driver.patch patches.xen/pvops-blkfront-removable-flag.patch patches.xen/pvops-blkfront-eject-support.patch diff --git a/version-pvops b/version-pvops index 6b5085b..897e56b 100644 --- a/version-pvops +++ b/version-pvops @@ -1 +1 @@ -3.2.30 +3.7.6