diff options
475 files changed, 6870 insertions, 3050 deletions
diff --git a/Documentation/dmatest.txt b/Documentation/dmatest.txt index 279ac0a8c5b..132a094c7bc 100644 --- a/Documentation/dmatest.txt +++ b/Documentation/dmatest.txt @@ -34,7 +34,7 @@ command:  After a while you will start to get messages about current status or error like  in the original code. -Note that running a new test will stop any in progress test. +Note that running a new test will not stop any in progress test.  The following command should return actual state of the test.  	% cat /sys/kernel/debug/dmatest/run @@ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state.  The module parameters that is supplied to the kernel command line will be used  for the first performed test. After user gets a control, the test could be -interrupted or re-run with same or different parameters. For the details see -the above section "Part 2 - When dmatest is built as a module..." +re-run with the same or different parameters. For the details see the above +section "Part 2 - When dmatest is built as a module..."  In both cases the module parameters are used as initial values for the test case.  You always could check them at run-time by running diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 3e4b3dd1e04..83577f0232a 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt @@ -33,6 +33,9 @@ When mounting an XFS filesystem, the following options are accepted.  	removing extended attributes) the on-disk superblock feature  	bit field will be updated to reflect this format being in use. +	CRC enabled filesystems always use the attr2 format, and so +	will reject the noattr2 mount option if it is set. +    barrier  	Enables the use of block layer write barriers for writes into  	the journal and unwritten extent conversion.  This allows for diff --git a/Documentation/powerpc/transactional_memory.txt b/Documentation/powerpc/transactional_memory.txt index c907be41d60..dc23e58ae26 100644 --- a/Documentation/powerpc/transactional_memory.txt +++ b/Documentation/powerpc/transactional_memory.txt @@ -147,6 +147,25 @@ Example signal handler:        fix_the_problem(ucp->dar);      } +When in an active transaction that takes a signal, we need to be careful with +the stack.  It's possible that the stack has moved back up after the tbegin. +The obvious case here is when the tbegin is called inside a function that +returns before a tend.  In this case, the stack is part of the checkpointed +transactional memory state.  If we write over this non transactionally or in +suspend, we are in trouble because if we get a tm abort, the program counter and +stack pointer will be back at the tbegin but our in memory stack won't be valid +anymore. + +To avoid this, when taking a signal in an active transaction, we need to use +the stack pointer from the checkpointed state, rather than the speculated +state.  This ensures that the signal context (written tm suspended) will be +written below the stack required for the rollback.  The transaction is aborted +becuase of the treclaim, so any memory written between the tbegin and the +signal will be rolled back anyway. + +For signals taken in non-TM or suspended mode, we use the +normal/non-checkpointed stack pointer. +  Failure cause codes used by kernel  ================================== @@ -155,14 +174,18 @@ These are defined in <asm/reg.h>, and distinguish different reasons why the  kernel aborted a transaction:   TM_CAUSE_RESCHED       Thread was rescheduled. + TM_CAUSE_TLBI          Software TLB invalide.   TM_CAUSE_FAC_UNAV      FP/VEC/VSX unavailable trap.   TM_CAUSE_SYSCALL       Currently unused; future syscalls that must abort                          transactions for consistency will use this.   TM_CAUSE_SIGNAL        Signal delivered.   TM_CAUSE_MISC          Currently unused. + TM_CAUSE_ALIGNMENT     Alignment fault. + TM_CAUSE_EMULATE       Emulation that touched memory. -These can be checked by the user program's abort handler as TEXASR[0:7]. - +These can be checked by the user program's abort handler as TEXASR[0:7].  If +bit 7 is set, it indicates that the error is consider persistent.  For example +a TM_CAUSE_ALIGNMENT will be persistent while a TM_CAUSE_RESCHED will not.q  GDB  === diff --git a/MAINTAINERS b/MAINTAINERS index fd3a495a000..250dc970c62 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2890,8 +2890,8 @@ F:	drivers/media/dvb-frontends/ec100*  ECRYPT FILE SYSTEM  M:	Tyler Hicks <tyhicks@canonical.com> -M:	Dustin Kirkland <dustin.kirkland@gazzang.com>  L:	ecryptfs@vger.kernel.org +W:	http://ecryptfs.org  W:	https://launchpad.net/ecryptfs  S:	Supported  F:	Documentation/filesystems/ecryptfs.txt @@ -3322,11 +3322,12 @@ F:	drivers/net/wan/dlci.c  F:	drivers/net/wan/sdla.c  FRAMEBUFFER LAYER -M:	Florian Tobias Schandinat <FlorianSchandinat@gmx.de> +M:	Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com> +M:	Tomi Valkeinen <tomi.valkeinen@ti.com>  L:	linux-fbdev@vger.kernel.org  W:	http://linux-fbdev.sourceforge.net/  Q:	http://patchwork.kernel.org/project/linux-fbdev/list/ -T:	git git://github.com/schandinat/linux-2.6.git fbdev-next +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/plagnioj/linux-fbdev.git  S:	Maintained  F:	Documentation/fb/  F:	Documentation/devicetree/bindings/fb/ @@ -4447,6 +4448,16 @@ S:	Maintained  F:	drivers/scsi/*iscsi*  F:	include/scsi/*iscsi* +ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR +M:	Or Gerlitz <ogerlitz@mellanox.com> +M:	Roi Dayan <roid@mellanox.com> +L:	linux-rdma@vger.kernel.org +S:	Supported +W:	http://www.openfabrics.org +W:	www.open-iscsi.org +Q:	http://patchwork.kernel.org/project/linux-rdma/list/ +F:	drivers/infiniband/ulp/iser +  ISDN SUBSYSTEM  M:	Karsten Keil <isdn@linux-pingi.de>  L:	isdn4linux@listserv.isdn4linux.de (subscribers-only) @@ -6087,7 +6098,15 @@ T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git  T:	git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git  S:	Maintained  F:	arch/parisc/ +F:	Documentation/parisc/  F:	drivers/parisc/ +F:	drivers/char/agp/parisc-agp.c +F:	drivers/input/serio/gscps2.c +F:	drivers/parport/parport_gsc.* +F:	drivers/tty/serial/8250/8250_gsc.c +F:	drivers/video/sti* +F:	drivers/video/console/sti* +F:	drivers/video/logo/logo_parisc*  PC87360 HARDWARE MONITORING DRIVER  M:	Jim Cromie <jim.cromie@gmail.com> @@ -1,7 +1,7 @@  VERSION = 3  PATCHLEVEL = 10  SUBLEVEL = 0 -EXTRAVERSION = -rc3 +EXTRAVERSION = -rc4  NAME = Unicycling Gorilla  # *DOCUMENTATION* diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi index f0052dccf9a..1e12aeff403 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi @@ -44,6 +44,7 @@  			reg = <0x7e201000 0x1000>;  			interrupts = <2 25>;  			clock-frequency = <3000000>; +			arm,primecell-periphid = <0x00241011>;  		};  		gpio: gpio { diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 98dfc3ea5c0..0673524238a 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -497,6 +497,21 @@  		clock-names = "usbhost";  	}; +	usbphy@12130000 { +		compatible = "samsung,exynos5250-usb2phy"; +		reg = <0x12130000 0x100>; +		clocks = <&clock 1>, <&clock 285>; +		clock-names = "ext_xtal", "usbhost"; +		#address-cells = <1>; +		#size-cells = <1>; +		ranges; + +		usbphy-sys { +			reg = <0x10040704 0x8>, +			      <0x10050230 0x4>; +		}; +	}; +  	amba {  		#address-cells = <1>;  		#size-cells = <1>; diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index d2550e0bca2..701153992c6 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi @@ -141,8 +141,8 @@  				#size-cells = <0>;  				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";  				reg = <0x43fa4000 0x4000>; -				clocks = <&clks 62>; -				clock-names = "ipg"; +				clocks = <&clks 62>, <&clks 62>; +				clock-names = "ipg", "per";  				interrupts = <14>;  				status = "disabled";  			}; @@ -182,8 +182,8 @@  				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";  				reg = <0x50004000 0x4000>;  				interrupts = <0>; -				clocks = <&clks 80>; -				clock-names = "ipg"; +				clocks = <&clks 80>, <&clks 80>; +				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -210,8 +210,8 @@  				#size-cells = <0>;  				compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";  				reg = <0x50010000 0x4000>; -				clocks = <&clks 79>; -				clock-names = "ipg"; +				clocks = <&clks 79>, <&clks 79>; +				clock-names = "ipg", "per";  				interrupts = <13>;  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index ff4bd4873ed..75bd1138651 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi @@ -131,7 +131,7 @@  				compatible = "fsl,imx27-cspi";  				reg = <0x1000e000 0x1000>;  				interrupts = <16>; -				clocks = <&clks 53>, <&clks 0>; +				clocks = <&clks 53>, <&clks 53>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -142,7 +142,7 @@  				compatible = "fsl,imx27-cspi";  				reg = <0x1000f000 0x1000>;  				interrupts = <15>; -				clocks = <&clks 52>, <&clks 0>; +				clocks = <&clks 52>, <&clks 52>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; @@ -223,7 +223,7 @@  				compatible = "fsl,imx27-cspi";  				reg = <0x10017000 0x1000>;  				interrupts = <6>; -				clocks = <&clks 51>, <&clks 0>; +				clocks = <&clks 51>, <&clks 51>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 21bb786c5b3..53fdde69bbf 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi @@ -631,7 +631,7 @@  				compatible = "fsl,imx51-cspi", "fsl,imx35-cspi";  				reg = <0x83fc0000 0x4000>;  				interrupts = <38>; -				clocks = <&clks 55>, <&clks 0>; +				clocks = <&clks 55>, <&clks 55>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 845982eaac2..eb83aa039b8 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi @@ -714,7 +714,7 @@  				compatible = "fsl,imx53-cspi", "fsl,imx35-cspi";  				reg = <0x63fc0000 0x4000>;  				interrupts = <38>; -				clocks = <&clks 55>, <&clks 0>; +				clocks = <&clks 55>, <&clks 55>;  				clock-names = "ipg", "per";  				status = "disabled";  			}; diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig index e40b435d204..227abf9cc60 100644 --- a/arch/arm/configs/exynos_defconfig +++ b/arch/arm/configs/exynos_defconfig @@ -1,4 +1,4 @@ -CONFIG_EXPERIMENTAL=y +CONFIG_SYSVIPC=y  CONFIG_NO_HZ=y  CONFIG_HIGH_RES_TIMERS=y  CONFIG_BLK_DEV_INITRD=y @@ -7,17 +7,18 @@ CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y  # CONFIG_BLK_DEV_BSG is not set  CONFIG_PARTITION_ADVANCED=y -CONFIG_EFI_PARTITION=y  CONFIG_ARCH_EXYNOS=y -CONFIG_S3C_LOWLEVEL_UART_PORT=1 +CONFIG_S3C_LOWLEVEL_UART_PORT=3  CONFIG_S3C24XX_PWM=y  CONFIG_ARCH_EXYNOS5=y  CONFIG_MACH_EXYNOS4_DT=y -CONFIG_MACH_EXYNOS5_DT=y  CONFIG_SMP=y  CONFIG_NR_CPUS=2  CONFIG_PREEMPT=y  CONFIG_AEABI=y +CONFIG_HIGHMEM=y +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0  CONFIG_ARM_APPENDED_DTB=y  CONFIG_ARM_ATAG_DTB_COMPAT=y  CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M" @@ -30,35 +31,58 @@ CONFIG_NET_KEY=y  CONFIG_INET=y  CONFIG_RFKILL_REGULATOR=y  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y  CONFIG_PROC_DEVICETREE=y  CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_CRYPTOLOOP=y  CONFIG_BLK_DEV_RAM=y  CONFIG_BLK_DEV_RAM_SIZE=8192  CONFIG_SCSI=y  CONFIG_BLK_DEV_SD=y  CONFIG_CHR_DEV_SG=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=m  CONFIG_NETDEVICES=y  CONFIG_SMSC911X=y  CONFIG_USB_USBNET=y  CONFIG_USB_NET_SMSC75XX=y  CONFIG_USB_NET_SMSC95XX=y  CONFIG_INPUT_EVDEV=y -# CONFIG_INPUT_KEYBOARD is not set -# CONFIG_INPUT_MOUSE is not set +CONFIG_KEYBOARD_CROS_EC=y +# CONFIG_MOUSE_PS2 is not set +CONFIG_MOUSE_CYAPA=y  CONFIG_INPUT_TOUCHSCREEN=y  CONFIG_SERIAL_8250=y  CONFIG_SERIAL_SAMSUNG=y  CONFIG_SERIAL_SAMSUNG_CONSOLE=y  CONFIG_SERIAL_OF_PLATFORM=y  CONFIG_HW_RANDOM=y +CONFIG_TCG_TPM=y +CONFIG_TCG_TIS_I2C_INFINEON=y  CONFIG_I2C=y +CONFIG_I2C_MUX=y +CONFIG_I2C_ARB_GPIO_CHALLENGE=y +CONFIG_I2C_S3C2410=y +CONFIG_DEBUG_GPIO=y  # CONFIG_HWMON is not set +CONFIG_MFD_CROS_EC=y +CONFIG_MFD_CROS_EC_I2C=y +CONFIG_MFD_MAX77686=y +CONFIG_MFD_MAX8997=y +CONFIG_MFD_SEC_CORE=y  CONFIG_MFD_TPS65090=y  CONFIG_REGULATOR=y  CONFIG_REGULATOR_FIXED_VOLTAGE=y  CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_MAX8997=y +CONFIG_REGULATOR_MAX77686=y +CONFIG_REGULATOR_S5M8767=y  CONFIG_REGULATOR_TPS65090=y  CONFIG_FB=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_FB_SIMPLE=y  CONFIG_EXYNOS_VIDEO=y  CONFIG_EXYNOS_MIPI_DSI=y  CONFIG_EXYNOS_DP=y @@ -67,6 +91,20 @@ CONFIG_FONTS=y  CONFIG_FONT_7x14=y  CONFIG_LOGO=y  CONFIG_USB=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_S5P=y +CONFIG_USB_STORAGE=y +CONFIG_USB_DWC3=y +CONFIG_USB_PHY=y +CONFIG_SAMSUNG_USB2PHY=y +CONFIG_SAMSUNG_USB3PHY=y +CONFIG_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_S3C=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_IDMAC=y +CONFIG_MMC_DW_EXYNOS=y +CONFIG_COMMON_CLK_MAX77686=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  CONFIG_EXT4_FS=y @@ -79,6 +117,7 @@ CONFIG_ROMFS_FS=y  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_ASCII=y  CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y  CONFIG_MAGIC_SYSRQ=y  CONFIG_DEBUG_KERNEL=y  CONFIG_DETECT_HUNG_TASK=y @@ -87,6 +126,5 @@ CONFIG_DEBUG_SPINLOCK=y  CONFIG_DEBUG_MUTEXES=y  CONFIG_DEBUG_INFO=y  CONFIG_DEBUG_USER=y -CONFIG_DEBUG_LL=y -CONFIG_EARLY_PRINTK=y +CONFIG_CRYPTO_SHA256=y  CONFIG_CRC_CCITT=y diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 99a19512ee2..bdf2b8458ec 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h @@ -33,18 +33,6 @@  #include <asm/pgalloc.h>  #include <asm/tlbflush.h> -/* - * We need to delay page freeing for SMP as other CPUs can access pages - * which have been removed but not yet had their TLB entries invalidated. - * Also, as ARMv7 speculative prefetch can drag new entries into the TLB, - * we need to apply this same delaying tactic to ensure correct operation. - */ -#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7) -#define tlb_fast_mode(tlb)	0 -#else -#define tlb_fast_mode(tlb)	1 -#endif -  #define MMU_GATHER_BUNDLE	8  /* @@ -112,12 +100,10 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb)  static inline void tlb_flush_mmu(struct mmu_gather *tlb)  {  	tlb_flush(tlb); -	if (!tlb_fast_mode(tlb)) { -		free_pages_and_swap_cache(tlb->pages, tlb->nr); -		tlb->nr = 0; -		if (tlb->pages == tlb->local) -			__tlb_alloc_page(tlb); -	} +	free_pages_and_swap_cache(tlb->pages, tlb->nr); +	tlb->nr = 0; +	if (tlb->pages == tlb->local) +		__tlb_alloc_page(tlb);  }  static inline void @@ -178,11 +164,6 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)  static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)  { -	if (tlb_fast_mode(tlb)) { -		free_page_and_swap_cache(page); -		return 1; /* avoid calling tlb_flush_mmu */ -	} -  	tlb->pages[tlb->nr++] = page;  	VM_BUG_ON(tlb->nr > tlb->max);  	return tlb->max - tlb->nr; diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 37d216d814c..ef1703b9587 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c @@ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu)  	wait_event_interruptible(*wq, !vcpu->arch.pause);  } +static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) +{ +	return vcpu->arch.target >= 0; +} +  /**   * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code   * @vcpu:	The VCPU pointer @@ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)  	int ret;  	sigset_t sigsaved; -	/* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */ -	if (unlikely(vcpu->arch.target < 0)) +	if (unlikely(!kvm_vcpu_initialized(vcpu)))  		return -ENOEXEC;  	ret = kvm_vcpu_first_run_init(vcpu); @@ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,  	case KVM_SET_ONE_REG:  	case KVM_GET_ONE_REG: {  		struct kvm_one_reg reg; + +		if (unlikely(!kvm_vcpu_initialized(vcpu))) +			return -ENOEXEC; +  		if (copy_from_user(®, argp, sizeof(reg)))  			return -EFAULT;  		if (ioctl == KVM_SET_ONE_REG) @@ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,  		struct kvm_reg_list reg_list;  		unsigned n; +		if (unlikely(!kvm_vcpu_initialized(vcpu))) +			return -ENOEXEC; +  		if (copy_from_user(®_list, user_list, sizeof(reg_list)))  			return -EFAULT;  		n = reg_list.n; diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 965706578f1..84ba67b982c 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c @@ -43,7 +43,14 @@ static phys_addr_t hyp_idmap_vector;  static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)  { -	kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); +	/* +	 * This function also gets called when dealing with HYP page +	 * tables. As HYP doesn't have an associated struct kvm (and +	 * the HYP page tables are fairly static), we don't do +	 * anything there. +	 */ +	if (kvm) +		kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);  }  static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, @@ -78,18 +85,20 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)  	return p;  } -static void clear_pud_entry(pud_t *pud) +static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr)  {  	pmd_t *pmd_table = pmd_offset(pud, 0);  	pud_clear(pud); +	kvm_tlb_flush_vmid_ipa(kvm, addr);  	pmd_free(NULL, pmd_table);  	put_page(virt_to_page(pud));  } -static void clear_pmd_entry(pmd_t *pmd) +static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)  {  	pte_t *pte_table = pte_offset_kernel(pmd, 0);  	pmd_clear(pmd); +	kvm_tlb_flush_vmid_ipa(kvm, addr);  	pte_free_kernel(NULL, pte_table);  	put_page(virt_to_page(pmd));  } @@ -100,11 +109,12 @@ static bool pmd_empty(pmd_t *pmd)  	return page_count(pmd_page) == 1;  } -static void clear_pte_entry(pte_t *pte) +static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)  {  	if (pte_present(*pte)) {  		kvm_set_pte(pte, __pte(0));  		put_page(virt_to_page(pte)); +		kvm_tlb_flush_vmid_ipa(kvm, addr);  	}  } @@ -114,7 +124,8 @@ static bool pte_empty(pte_t *pte)  	return page_count(pte_page) == 1;  } -static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size) +static void unmap_range(struct kvm *kvm, pgd_t *pgdp, +			unsigned long long start, u64 size)  {  	pgd_t *pgd;  	pud_t *pud; @@ -138,15 +149,15 @@ static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size)  		}  		pte = pte_offset_kernel(pmd, addr); -		clear_pte_entry(pte); +		clear_pte_entry(kvm, pte, addr);  		range = PAGE_SIZE;  		/* If we emptied the pte, walk back up the ladder */  		if (pte_empty(pte)) { -			clear_pmd_entry(pmd); +			clear_pmd_entry(kvm, pmd, addr);  			range = PMD_SIZE;  			if (pmd_empty(pmd)) { -				clear_pud_entry(pud); +				clear_pud_entry(kvm, pud, addr);  				range = PUD_SIZE;  			}  		} @@ -165,14 +176,14 @@ void free_boot_hyp_pgd(void)  	mutex_lock(&kvm_hyp_pgd_mutex);  	if (boot_hyp_pgd) { -		unmap_range(boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); -		unmap_range(boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); +		unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); +		unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);  		kfree(boot_hyp_pgd);  		boot_hyp_pgd = NULL;  	}  	if (hyp_pgd) -		unmap_range(hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); +		unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);  	kfree(init_bounce_page);  	init_bounce_page = NULL; @@ -200,9 +211,10 @@ void free_hyp_pgds(void)  	if (hyp_pgd) {  		for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE) -			unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); +			unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);  		for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) -			unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); +			unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); +  		kfree(hyp_pgd);  		hyp_pgd = NULL;  	} @@ -393,7 +405,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)   */  static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size)  { -	unmap_range(kvm->arch.pgd, start, size); +	unmap_range(kvm, kvm->arch.pgd, start, size);  }  /** @@ -675,7 +687,6 @@ static void handle_hva_to_gpa(struct kvm *kvm,  static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data)  {  	unmap_stage2_range(kvm, gpa, PAGE_SIZE); -	kvm_tlb_flush_vmid_ipa(kvm, gpa);  }  int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig index d19edff0ea6..ff18fc2ea46 100644 --- a/arch/arm/mach-exynos/Kconfig +++ b/arch/arm/mach-exynos/Kconfig @@ -250,6 +250,7 @@ config MACH_ARMLEX4210  config MACH_UNIVERSAL_C210  	bool "Mobile UNIVERSAL_C210 Board"  	select CLKSRC_MMIO +	select CLKSRC_SAMSUNG_PWM  	select CPU_EXYNOS4210  	select EXYNOS4_SETUP_FIMC  	select EXYNOS4_SETUP_FIMD0 @@ -281,7 +282,6 @@ config MACH_UNIVERSAL_C210  	select S5P_DEV_TV  	select S5P_GPIO_INT  	select S5P_SETUP_MIPIPHY -	select SAMSUNG_HRT  	help  	  Machine support for Samsung Mobile Universal S5PC210 Reference  	  Board. @@ -410,6 +410,7 @@ config MACH_EXYNOS4_DT  	depends on ARCH_EXYNOS4  	select ARM_AMBA  	select CLKSRC_OF +	select CLKSRC_SAMSUNG_PWM if CPU_EXYNOS4210  	select CPU_EXYNOS4210  	select KEYBOARD_SAMSUNG if INPUT_KEYBOARD  	select PINCTRL diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 745e304ad0d..f7e504b7874 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c @@ -10,12 +10,14 @@   */  #include <linux/kernel.h> +#include <linux/bitops.h>  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/irqchip.h>  #include <linux/io.h>  #include <linux/device.h>  #include <linux/gpio.h> +#include <clocksource/samsung_pwm.h>  #include <linux/sched.h>  #include <linux/serial_core.h>  #include <linux/of.h> @@ -302,6 +304,13 @@ static struct map_desc exynos5440_iodesc0[] __initdata = {  	},  }; +static struct samsung_pwm_variant exynos4_pwm_variant = { +	.bits		= 32, +	.div_base	= 0, +	.has_tint_cstat	= true, +	.tclk_mask	= 0, +}; +  void exynos4_restart(char mode, const char *cmd)  {  	__raw_writel(0x1, S5P_SWRESET); @@ -317,9 +326,16 @@ void exynos5_restart(char mode, const char *cmd)  		val = 0x1;  		addr = EXYNOS_SWRESET;  	} else if (of_machine_is_compatible("samsung,exynos5440")) { +		u32 status;  		np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock"); + +		addr = of_iomap(np, 0) + 0xbc; +		status = __raw_readl(addr); +  		addr = of_iomap(np, 0) + 0xcc; -		val = (0xfff << 20) | (0x1 << 16); +		val = __raw_readl(addr); + +		val = (val & 0xffff0000) | (status & 0xffff);  	} else {  		pr_err("%s: cannot support non-DT\n", __func__);  		return; @@ -370,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,  void __init exynos_init_io(struct map_desc *mach_desc, int size)  { +	debug_ll_io_init(); +  #ifdef CONFIG_OF  	if (initial_boot_params)  		of_scan_flat_dt(exynos_fdt_map_chipid, NULL); @@ -442,8 +460,20 @@ static void __init exynos5440_map_io(void)  	iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0));  } +void __init exynos_set_timer_source(u8 channels) +{ +	exynos4_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1; +	exynos4_pwm_variant.output_mask &= ~channels; +} +  void __init exynos_init_time(void)  { +	unsigned int timer_irqs[SAMSUNG_PWM_NUM] = { +		EXYNOS4_IRQ_TIMER0_VIC, EXYNOS4_IRQ_TIMER1_VIC, +		EXYNOS4_IRQ_TIMER2_VIC, EXYNOS4_IRQ_TIMER3_VIC, +		EXYNOS4_IRQ_TIMER4_VIC, +	}; +  	if (of_have_populated_dt()) {  #ifdef CONFIG_OF  		of_clk_init(NULL); @@ -455,7 +485,14 @@ void __init exynos_init_time(void)  		exynos4_clk_init(NULL, !soc_is_exynos4210(), S5P_VA_CMU, readl(S5P_VA_CHIPID + 8) & 1);  		exynos4_clk_register_fixed_ext(xxti_f, xusbxti_f);  #endif -		mct_init(S5P_VA_SYSTIMER, EXYNOS4_IRQ_MCT_G0, EXYNOS4_IRQ_MCT_L0, EXYNOS4_IRQ_MCT_L1); +#ifdef CONFIG_CLKSRC_SAMSUNG_PWM +		if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0) +			samsung_pwm_clocksource_init(S3C_VA_TIMER, +					timer_irqs, &exynos4_pwm_variant); +		else +#endif +			mct_init(S5P_VA_SYSTIMER, EXYNOS4_IRQ_MCT_G0, +					EXYNOS4_IRQ_MCT_L0, EXYNOS4_IRQ_MCT_L1);  	}  } diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 60dd35cc01a..11fc1e29819 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h @@ -32,6 +32,8 @@ void exynos4_clk_register_fixed_ext(unsigned long, unsigned long);  void exynos_firmware_init(void); +void exynos_set_timer_source(u8 channels); +  #ifdef CONFIG_PM_GENERIC_DOMAINS  int exynos_pm_late_initcall(void);  #else diff --git a/arch/arm/mach-exynos/include/mach/pm-core.h b/arch/arm/mach-exynos/include/mach/pm-core.h index 7dbbfec13ea..296090e7f42 100644 --- a/arch/arm/mach-exynos/include/mach/pm-core.h +++ b/arch/arm/mach-exynos/include/mach/pm-core.h @@ -18,8 +18,15 @@  #ifndef __ASM_ARCH_PM_CORE_H  #define __ASM_ARCH_PM_CORE_H __FILE__ +#include <linux/of.h>  #include <mach/regs-pmu.h> +#ifdef CONFIG_PINCTRL_EXYNOS +extern u32 exynos_get_eint_wake_mask(void); +#else +static inline u32 exynos_get_eint_wake_mask(void) { return 0xffffffff; } +#endif +  static inline void s3c_pm_debug_init_uart(void)  {  	/* nothing here yet */ @@ -27,7 +34,12 @@ static inline void s3c_pm_debug_init_uart(void)  static inline void s3c_pm_arch_prepare_irqs(void)  { -	__raw_writel(s3c_irqwake_eintmask, S5P_EINT_WAKEUP_MASK); +	u32 eintmask = s3c_irqwake_eintmask; + +	if (of_have_populated_dt()) +		eintmask = exynos_get_eint_wake_mask(); + +	__raw_writel(eintmask, S5P_EINT_WAKEUP_MASK);  	__raw_writel(s3c_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);  } diff --git a/arch/arm/mach-exynos/mach-universal_c210.c b/arch/arm/mach-exynos/mach-universal_c210.c index 327d50d4681..74ddb2b5561 100644 --- a/arch/arm/mach-exynos/mach-universal_c210.c +++ b/arch/arm/mach-exynos/mach-universal_c210.c @@ -41,7 +41,6 @@  #include <plat/mfc.h>  #include <plat/sdhci.h>  #include <plat/fimc-core.h> -#include <plat/samsung-time.h>  #include <plat/camport.h>  #include <mach/map.h> @@ -1094,7 +1093,7 @@ static void __init universal_map_io(void)  {  	exynos_init_io(NULL, 0);  	s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs)); -	samsung_set_timer_source(SAMSUNG_PWM2, SAMSUNG_PWM4); +	exynos_set_timer_source(BIT(2) | BIT(4));  	xxti_f = 0;  	xusbxti_f = 24000000;  } @@ -1154,7 +1153,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")  	.map_io		= universal_map_io,  	.init_machine	= universal_machine_init,  	.init_late	= exynos_init_late, -	.init_time	= samsung_timer_init, +	.init_time	= exynos_init_time,  	.reserve        = &universal_reserve,  	.restart	= exynos4_restart,  MACHINE_END diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index dda9a2bd3ac..4e3148ce852 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c @@ -181,14 +181,14 @@ static const char *periph_clk2_sels[]	= { "pll3_usb_otg", "osc", "osc", "dummy",  static const char *periph2_clk2_sels[]	= { "pll3_usb_otg", "pll2_bus", };  static const char *periph_sels[]	= { "periph_pre", "periph_clk2", };  static const char *periph2_sels[]	= { "periph2_pre", "periph2_clk2", }; -static const char *axi_sels[]		= { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; +static const char *axi_sels[]		= { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", };  static const char *audio_sels[]	= { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", };  static const char *gpu_axi_sels[]	= { "axi", "ahb", };  static const char *gpu2d_core_sels[]	= { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };  static const char *gpu3d_core_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };  static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", };  static const char *ipu_sels[]		= { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; -static const char *ldb_di_sels[]	= { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; +static const char *ldb_di_sels[]	= { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };  static const char *ipu_di_pre_sels[]	= { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };  static const char *ipu1_di0_sels[]	= { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };  static const char *ipu1_di1_sels[]	= { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c index acb0187c7ee..4695d5f35fc 100644 --- a/arch/arm/mach-kirkwood/board-ts219.c +++ b/arch/arm/mach-kirkwood/board-ts219.c @@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void)  	pm_power_off = qnap_tsx1x_power_off;  } - -/* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ -static int __init ts219_pci_init(void) -{ -	if (machine_is_ts219()) -		kirkwood_pcie_init(KW_PCIE0); - -	return 0; -} -subsys_initcall(ts219_pci_init); diff --git a/arch/arm/mach-mvebu/coherency_ll.S b/arch/arm/mach-mvebu/coherency_ll.S index 53e8391192c..5476669ba90 100644 --- a/arch/arm/mach-mvebu/coherency_ll.S +++ b/arch/arm/mach-mvebu/coherency_ll.S @@ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent)  	/* Add CPU to SMP group - Atomic */  	add	r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET -	ldr	r2, [r3] +1: +	ldrex	r2, [r3]  	orr	r2, r2, r1 -	str	r2, [r3] +	strex 	r0, r2, [r3] +	cmp	r0, #0 +	bne 1b  	/* Enable coherency on CPU - Atomic */ -	add	r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET -	ldr	r2, [r3] +	add	r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET +1: +	ldrex	r2, [r3]  	orr	r2, r2, r1 -	str	r2, [r3] +	strex	r0, r2, [r3] +	cmp	r0, #0 +	bne 1b  	dsb diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index fdf3894b1cc..9696f364686 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c @@ -252,7 +252,7 @@ static struct sh_timer_config cmt10_platform_data = {  	.name = "CMT10",  	.channel_offset = 0x10,  	.timer_bit = 0, -	.clockevent_rating = 125, +	.clockevent_rating = 80,  	.clocksource_rating = 125,  }; diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 33c353bc1c4..d6b7c8556fa 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c @@ -374,6 +374,7 @@ static struct ab8500_regulator_reg_init ab8500_reg_init[] = {  static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {  	/* supplies to the display/camera */  	[AB8500_LDO_AUX1] = { +		.supply_regulator = "ab8500-ext-supply3",  		.constraints = {  			.name = "V-DISPLAY",  			.min_uV = 2800000, @@ -387,6 +388,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {  	},  	/* supplies to the on-board eMMC */  	[AB8500_LDO_AUX2] = { +		.supply_regulator = "ab8500-ext-supply3",  		.constraints = {  			.name = "V-eMMC1",  			.min_uV = 1100000, @@ -402,6 +404,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {  	},  	/* supply for VAUX3, supplies to SDcard slots */  	[AB8500_LDO_AUX3] = { +		.supply_regulator = "ab8500-ext-supply3",  		.constraints = {  			.name = "V-MMC-SD",  			.min_uV = 1100000, diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c index 317a2be129f..a45dd09daed 100644 --- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c @@ -21,6 +21,7 @@  #include <asm/proc-fns.h>  #include "db8500-regs.h" +#include "id.h"  static atomic_t master = ATOMIC_INIT(0);  static DEFINE_SPINLOCK(master_lock); @@ -114,6 +115,9 @@ static struct cpuidle_driver ux500_idle_driver = {  int __init ux500_idle_init(void)  { +	if (!(cpu_is_u8500_family() || cpu_is_ux540_family())) +		return -ENODEV; +  	/* Configure wake up reasons */  	prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |  			     PRCMU_WAKEUP(ABB)); diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 30c2fe243f7..0f9c3f431a5 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c @@ -311,9 +311,9 @@ struct platform_device s5p_device_jpeg = {  #ifdef CONFIG_S5P_DEV_FIMD0  static struct resource s5p_fimd0_resource[] = {  	[0] = DEFINE_RES_MEM(S5P_PA_FIMD0, SZ_32K), -	[1] = DEFINE_RES_IRQ(IRQ_FIMD0_VSYNC), -	[2] = DEFINE_RES_IRQ(IRQ_FIMD0_FIFO), -	[3] = DEFINE_RES_IRQ(IRQ_FIMD0_SYSTEM), +	[1] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_VSYNC, "vsync"), +	[2] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_FIFO, "fifo"), +	[3] = DEFINE_RES_IRQ_NAMED(IRQ_FIMD0_SYSTEM, "lcd_sys"),  };  struct platform_device s5p_device_fimd0 = { diff --git a/arch/arm/plat-samsung/include/plat/uncompress.h b/arch/arm/plat-samsung/include/plat/uncompress.h index 438b24846e7..02b66d723d1 100644 --- a/arch/arm/plat-samsung/include/plat/uncompress.h +++ b/arch/arm/plat-samsung/include/plat/uncompress.h @@ -66,6 +66,9 @@ uart_rd(unsigned int reg)  static void putc(int ch)  { +	if (!config_enabled(CONFIG_DEBUG_LL)) +		return; +  	if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {  		int level; @@ -118,7 +121,12 @@ static void arch_decomp_error(const char *x)  #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO  static inline void arch_enable_uart_fifo(void)  { -	u32 fifocon = uart_rd(S3C2410_UFCON); +	u32 fifocon; + +	if (!config_enabled(CONFIG_DEBUG_LL)) +		return; + +	fifocon = uart_rd(S3C2410_UFCON);  	if (!(fifocon & S3C2410_UFCON_FIFOMODE)) {  		fifocon |= S3C2410_UFCON_RESETBOTH; diff --git a/arch/arm64/kernel/arm64ksyms.c b/arch/arm64/kernel/arm64ksyms.c index 7df1aad29b6..41b4f626d55 100644 --- a/arch/arm64/kernel/arm64ksyms.c +++ b/arch/arm64/kernel/arm64ksyms.c @@ -34,6 +34,7 @@ EXPORT_SYMBOL(__strnlen_user);  EXPORT_SYMBOL(__strncpy_from_user);  EXPORT_SYMBOL(copy_page); +EXPORT_SYMBOL(clear_page);  EXPORT_SYMBOL(__copy_from_user);  EXPORT_SYMBOL(__copy_to_user); diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index c7e047049f2..1d1314280a0 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S @@ -390,6 +390,16 @@ el0_sync_compat:  	b.eq	el0_fpsimd_exc  	cmp	x24, #ESR_EL1_EC_UNKNOWN	// unknown exception in EL0  	b.eq	el0_undef +	cmp	x24, #ESR_EL1_EC_CP15_32	// CP15 MRC/MCR trap +	b.eq	el0_undef +	cmp	x24, #ESR_EL1_EC_CP15_64	// CP15 MRRC/MCRR trap +	b.eq	el0_undef +	cmp	x24, #ESR_EL1_EC_CP14_MR	// CP14 MRC/MCR trap +	b.eq	el0_undef +	cmp	x24, #ESR_EL1_EC_CP14_LS	// CP14 LDC/STC trap +	b.eq	el0_undef +	cmp	x24, #ESR_EL1_EC_CP14_64	// CP14 MRRC/MCRR trap +	b.eq	el0_undef  	cmp	x24, #ESR_EL1_EC_BREAKPT_EL0	// debug exception in EL0  	b.ge	el0_dbg  	b	el0_inv diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 61d7dd29f75..f30852d2859 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -267,7 +267,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)  		return;  #endif -	if (show_unhandled_signals) { +	if (show_unhandled_signals && unhandled_signal(current, SIGILL) && +	    printk_ratelimit()) {  		pr_info("%s[%d]: undefined instruction: pc=%p\n",  			current->comm, task_pid_nr(current), pc);  		dump_instr(KERN_INFO, regs); @@ -294,7 +295,7 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs)  	}  #endif -	if (show_unhandled_signals) { +	if (show_unhandled_signals && printk_ratelimit()) {  		pr_info("%s[%d]: syscall %d\n", current->comm,  			task_pid_nr(current), (int)regs->syscallno);  		dump_instr("", regs); @@ -310,14 +311,20 @@ asmlinkage long do_ni_syscall(struct pt_regs *regs)   */  asmlinkage void bad_mode(struct pt_regs *regs, int reason, unsigned int esr)  { +	siginfo_t info; +	void __user *pc = (void __user *)instruction_pointer(regs);  	console_verbose();  	pr_crit("Bad mode in %s handler detected, code 0x%08x\n",  		handler[reason], esr); +	__show_regs(regs); + +	info.si_signo = SIGILL; +	info.si_errno = 0; +	info.si_code  = ILL_ILLOPC; +	info.si_addr  = pc; -	die("Oops - bad mode", regs, 0); -	local_irq_disable(); -	panic("bad mode"); +	arm64_notify_die("Oops - bad mode", regs, &info, 0);  }  void __pte_error(const char *file, int line, unsigned long val) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 98af6e760cc..1426468b77f 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -113,7 +113,8 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,  {  	struct siginfo si; -	if (show_unhandled_signals) { +	if (show_unhandled_signals && unhandled_signal(tsk, sig) && +	    printk_ratelimit()) {  		pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n",  			tsk->comm, task_pid_nr(tsk), fault_name(esr), sig,  			addr, esr); diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index c3ffe3e54ed..ef3a9de0195 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h @@ -46,12 +46,6 @@  #include <asm/tlbflush.h>  #include <asm/machvec.h> -#ifdef CONFIG_SMP -# define tlb_fast_mode(tlb)	((tlb)->nr == ~0U) -#else -# define tlb_fast_mode(tlb)	(1) -#endif -  /*   * If we can't allocate a page to make a big batch of page pointers   * to work on, then just handle a few from the on-stack structure. @@ -60,7 +54,7 @@  struct mmu_gather {  	struct mm_struct	*mm; -	unsigned int		nr;		/* == ~0U => fast mode */ +	unsigned int		nr;  	unsigned int		max;  	unsigned char		fullmm;		/* non-zero means full mm flush */  	unsigned char		need_flush;	/* really unmapped some PTEs? */ @@ -103,6 +97,7 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS];  static inline void  ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end)  { +	unsigned long i;  	unsigned int nr;  	if (!tlb->need_flush) @@ -141,13 +136,11 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e  	/* lastly, release the freed pages */  	nr = tlb->nr; -	if (!tlb_fast_mode(tlb)) { -		unsigned long i; -		tlb->nr = 0; -		tlb->start_addr = ~0UL; -		for (i = 0; i < nr; ++i) -			free_page_and_swap_cache(tlb->pages[i]); -	} + +	tlb->nr = 0; +	tlb->start_addr = ~0UL; +	for (i = 0; i < nr; ++i) +		free_page_and_swap_cache(tlb->pages[i]);  }  static inline void __tlb_alloc_page(struct mmu_gather *tlb) @@ -167,20 +160,7 @@ tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_m  	tlb->mm = mm;  	tlb->max = ARRAY_SIZE(tlb->local);  	tlb->pages = tlb->local; -	/* -	 * Use fast mode if only 1 CPU is online. -	 * -	 * It would be tempting to turn on fast-mode for full_mm_flush as well.  But this -	 * doesn't work because of speculative accesses and software prefetching: the page -	 * table of "mm" may (and usually is) the currently active page table and even -	 * though the kernel won't do any user-space accesses during the TLB shoot down, a -	 * compiler might use speculation or lfetch.fault on what happens to be a valid -	 * user-space address.  This in turn could trigger a TLB miss fault (or a VHPT -	 * walk) and re-insert a TLB entry we just removed.  Slow mode avoids such -	 * problems.  (We could make fast-mode work by switching the current task to a -	 * different "mm" during the shootdown.) --davidm 08/02/2002 -	 */ -	tlb->nr = (num_online_cpus() == 1) ? ~0U : 0; +	tlb->nr = 0;  	tlb->fullmm = full_mm_flush;  	tlb->start_addr = ~0UL;  } @@ -214,11 +194,6 @@ static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)  {  	tlb->need_flush = 1; -	if (tlb_fast_mode(tlb)) { -		free_page_and_swap_cache(page); -		return 1; /* avoid calling tlb_flush_mmu */ -	} -  	if (!tlb->nr && tlb->pages == tlb->local)  		__tlb_alloc_page(tlb); diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig index 90d3109c82f..19325e117ee 100644 --- a/arch/m68k/configs/amiga_defconfig +++ b/arch/m68k/configs/amiga_defconfig @@ -1,55 +1,78 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-amiga"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_AMIGA=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68020=y  CONFIG_M68030=y  CONFIG_M68040=y  CONFIG_M68060=y -CONFIG_BINFMT_AOUT=m -CONFIG_BINFMT_MISC=m +CONFIG_AMIGA=y  CONFIG_ZORRO=y  CONFIG_AMIGA_PCMCIA=y -CONFIG_HEARTBEAT=y -CONFIG_PROC_HARDWARE=y  CONFIG_ZORRO_NAMES=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -57,25 +80,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -86,6 +121,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -99,22 +136,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -124,7 +170,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -133,18 +178,30 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_PARPORT=m  CONFIG_PARPORT_AMIGA=m @@ -154,11 +211,13 @@ CONFIG_AMIGA_FLOPPY=y  CONFIG_AMIGA_Z2RAM=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_ATA_OVER_ETH=m  CONFIG_IDE=y +CONFIG_IDE_GD_ATAPI=y  CONFIG_BLK_DEV_IDECD=y  CONFIG_BLK_DEV_GAYLE=y  CONFIG_BLK_DEV_BUDDHA=y @@ -172,57 +231,77 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_A3000_SCSI=y  CONFIG_A2091_SCSI=y  CONFIG_GVP11_SCSI=y  CONFIG_SCSI_A4000T=y  CONFIG_SCSI_ZORRO7XX=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y -CONFIG_ARIADNE=y +# CONFIG_NET_VENDOR_3COM is not set  CONFIG_A2065=y +CONFIG_ARIADNE=y +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CIRRUS is not set +# CONFIG_NET_VENDOR_FUJITSU is not set +# CONFIG_NET_VENDOR_HP is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set  CONFIG_HYDRA=y -CONFIG_ZORRO8390=y  CONFIG_APNE=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +CONFIG_ZORRO8390=y +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  CONFIG_KEYBOARD_AMIGA=y  # CONFIG_KEYBOARD_ATKBD is not set  # CONFIG_MOUSE_PS2 is not set @@ -233,11 +312,14 @@ CONFIG_INPUT_MISC=y  CONFIG_INPUT_M68K_BEEP=m  # CONFIG_SERIO is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  CONFIG_PRINTER=m  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FB_CIRRUS=y @@ -252,48 +334,64 @@ CONFIG_SOUND=m  CONFIG_DMASOUND_PAULA=m  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_MSM6242=m +CONFIG_RTC_DRV_RP5C01=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_HEARTBEAT=y +CONFIG_PROC_HARDWARE=y  CONFIG_AMIGA_BUILTIN_SERIAL=y  CONFIG_SERIAL_CONSOLE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -332,10 +430,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -345,19 +456,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -373,6 +481,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig index 8f4f657fdbc..14dc6ccda7f 100644 --- a/arch/m68k/configs/apollo_defconfig +++ b/arch/m68k/configs/apollo_defconfig @@ -1,55 +1,76 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-apollo"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_APOLLO=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68020=y  CONFIG_M68030=y  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_APOLLO=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_HEARTBEAT=y -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -57,25 +78,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -86,6 +119,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -99,22 +134,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -124,7 +168,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -133,21 +176,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -162,57 +218,74 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m  CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FRAMEBUFFER_CONSOLE=y @@ -221,47 +294,61 @@ CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_CLUT224 is not set  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_HEARTBEAT=y +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -300,10 +387,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -313,19 +413,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -341,6 +438,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig index 4571d33903f..6d5370c914b 100644 --- a/arch/m68k/configs/atari_defconfig +++ b/arch/m68k/configs/atari_defconfig @@ -1,53 +1,75 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-atari"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_ATARI=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68020=y  CONFIG_M68030=y  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_ATARI=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_STRAM_PROC=y -CONFIG_HEARTBEAT=y -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -55,25 +77,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -84,6 +118,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -97,22 +133,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -122,7 +167,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -131,18 +175,30 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_PARPORT=m  CONFIG_PARPORT_ATARI=m @@ -150,11 +206,13 @@ CONFIG_PARPORT_1284=y  CONFIG_ATARI_FLOPPY=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_ATA_OVER_ETH=m  CONFIG_IDE=y +CONFIG_IDE_GD_ATAPI=y  CONFIG_BLK_DEV_IDECD=y  CONFIG_BLK_DEV_FALCON_IDE=y  CONFIG_RAID_ATTRS=m @@ -167,63 +225,81 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_ATARI_SCSI=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=m -CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_MII=y +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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_VETH=m  CONFIG_ATARILANCE=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  CONFIG_KEYBOARD_ATARI=y  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_ATARI=m  CONFIG_INPUT_MISC=y  CONFIG_INPUT_M68K_BEEP=m -# CONFIG_SERIO_SERPORT is not set +# CONFIG_SERIO is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  CONFIG_PRINTER=m  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FB_ATARI=y @@ -233,47 +309,64 @@ CONFIG_SOUND=m  CONFIG_DMASOUND_ATARI=m  CONFIG_HID=m  CONFIG_HIDRAW=y -# CONFIG_USB_SUPPORT is not set +CONFIG_UHID=m +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_HEARTBEAT=y +CONFIG_PROC_HARDWARE=y +CONFIG_NATFEAT=y +CONFIG_NFBLOCK=y +CONFIG_NFCON=y +CONFIG_NFETH=y  CONFIG_ATARI_DSP56K=m  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -312,10 +405,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -325,19 +431,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -353,6 +456,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=y  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig index 12f211733ba..c015ddb6fd8 100644 --- a/arch/m68k/configs/bvme6000_defconfig +++ b/arch/m68k/configs/bvme6000_defconfig @@ -1,53 +1,74 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-bvme6000"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_VME=y -CONFIG_BVME6000=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_VME=y +CONFIG_BVME6000=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -55,25 +76,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -84,6 +117,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -97,22 +132,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -122,7 +166,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -131,21 +174,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -160,103 +216,131 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_BVME6000_SCSI=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set  CONFIG_BVME6000_NET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m -CONFIG_MOUSE_SERIAL=m -CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set +# CONFIG_MOUSE_PS2 is not set +# CONFIG_SERIO is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -295,10 +379,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -308,19 +405,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -336,7 +430,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y -CONFIG_CRC32=m +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig index 215389a5407..ec7382d8aff 100644 --- a/arch/m68k/configs/hp300_defconfig +++ b/arch/m68k/configs/hp300_defconfig @@ -1,54 +1,76 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-hp300"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_HP300=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68020=y  CONFIG_M68030=y  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_HP300=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -56,25 +78,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -85,6 +119,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -98,22 +134,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -123,7 +168,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -132,21 +176,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -161,59 +218,77 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_HPLANCE=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m  CONFIG_INPUT_MISC=y  CONFIG_HP_SDC_RTC=m -# CONFIG_SERIO_SERPORT is not set +CONFIG_SERIO_SERPORT=m  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FRAMEBUFFER_CONSOLE=y @@ -222,47 +297,60 @@ CONFIG_LOGO=y  # CONFIG_LOGO_LINUX_VGA16 is not set  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -301,10 +389,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -314,19 +415,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -342,6 +440,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig index cb9dfb30b67..7d46fbec704 100644 --- a/arch/m68k/configs/mac_defconfig +++ b/arch/m68k/configs/mac_defconfig @@ -1,49 +1,75 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-mac"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_MAC=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68020=y  CONFIG_M68030=y  CONFIG_M68040=y +CONFIG_M68KFPU_EMU=y +CONFIG_MAC=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -51,25 +77,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -80,6 +118,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -93,22 +133,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -118,7 +167,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -127,31 +175,45 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m  CONFIG_DEV_APPLETALK=m  CONFIG_IPDDP=m  CONFIG_IPDDP_ENCAP=y  CONFIG_IPDDP_DECAP=y +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m -CONFIG_BLK_DEV_SWIM=y +CONFIG_BLK_DEV_SWIM=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_ATA_OVER_ETH=m  CONFIG_IDE=y +CONFIG_IDE_GD_ATAPI=y  CONFIG_BLK_DEV_IDECD=y  CONFIG_BLK_DEV_MAC_IDE=y  CONFIG_RAID_ATTRS=m @@ -164,29 +226,30 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MAC_SCSI=y  CONFIG_SCSI_MAC_ESP=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_ADB=y  CONFIG_ADB_MACII=y -CONFIG_ADB_MACIISI=y  CONFIG_ADB_IOP=y  CONFIG_ADB_PMU68K=y  CONFIG_ADB_CUDA=y @@ -194,46 +257,61 @@ CONFIG_INPUT_ADBHID=y  CONFIG_MAC_EMUMOUSEBTN=y  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y -CONFIG_MAC8390=y -CONFIG_MAC89x0=m -CONFIG_MACSONIC=m  CONFIG_MACMACE=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +CONFIG_MAC89x0=y +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +CONFIG_MACSONIC=y +CONFIG_MAC8390=y +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m  CONFIG_INPUT_MISC=y  CONFIG_INPUT_M68K_BEEP=m  CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  CONFIG_SERIAL_PMACZILOG=y  CONFIG_SERIAL_PMACZILOG_TTYS=y  CONFIG_SERIAL_PMACZILOG_CONSOLE=y  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FB_VALKYRIE=y @@ -242,46 +320,60 @@ CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_LOGO=y  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m -CONFIG_HFS_FS=y -CONFIG_HFSPLUS_FS=y +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m -CONFIG_NFS_FS=m -CONFIG_NFS_V3=y +CONFIG_NFS_FS=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -320,10 +412,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -333,19 +438,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -361,6 +463,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig index 8d5def4a31e..0f795d8e65f 100644 --- a/arch/m68k/configs/multi_defconfig +++ b/arch/m68k/configs/multi_defconfig @@ -1,15 +1,29 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-multi"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_EFI_PARTITION is not set +CONFIG_IOSCHED_DEADLINE=m +CONFIG_M68020=y +CONFIG_M68040=y +CONFIG_M68060=y +CONFIG_M68KFPU_EMU=y  CONFIG_AMIGA=y  CONFIG_ATARI=y  CONFIG_MAC=y @@ -21,48 +35,50 @@ CONFIG_BVME6000=y  CONFIG_HP300=y  CONFIG_SUN3X=y  CONFIG_Q40=y -CONFIG_M68020=y -CONFIG_M68040=y -CONFIG_M68060=y -CONFIG_BINFMT_AOUT=m -CONFIG_BINFMT_MISC=m  CONFIG_ZORRO=y  CONFIG_AMIGA_PCMCIA=y -CONFIG_STRAM_PROC=y -CONFIG_HEARTBEAT=y -CONFIG_PROC_HARDWARE=y  CONFIG_ZORRO_NAMES=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -70,25 +86,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -99,6 +127,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -112,22 +142,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -137,7 +176,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -146,22 +184,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m  CONFIG_DEV_APPLETALK=m  CONFIG_IPDDP=m  CONFIG_IPDDP_ENCAP=y  CONFIG_IPDDP_DECAP=y +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_PARPORT=m  CONFIG_PARPORT_AMIGA=m @@ -170,15 +220,17 @@ CONFIG_PARPORT_ATARI=m  CONFIG_PARPORT_1284=y  CONFIG_AMIGA_FLOPPY=y  CONFIG_ATARI_FLOPPY=y -CONFIG_BLK_DEV_SWIM=y +CONFIG_BLK_DEV_SWIM=m  CONFIG_AMIGA_Z2RAM=y  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_ATA_OVER_ETH=m  CONFIG_IDE=y +CONFIG_IDE_GD_ATAPI=y  CONFIG_BLK_DEV_IDECD=y  CONFIG_BLK_DEV_GAYLE=y  CONFIG_BLK_DEV_BUDDHA=y @@ -195,11 +247,9 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_A3000_SCSI=y  CONFIG_A2091_SCSI=y  CONFIG_GVP11_SCSI=y @@ -213,21 +263,24 @@ CONFIG_MVME16x_SCSI=y  CONFIG_BVME6000_SCSI=y  CONFIG_SUN3X_ESP=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_ADB=y  CONFIG_ADB_MACII=y -CONFIG_ADB_MACIISI=y  CONFIG_ADB_IOP=y  CONFIG_ADB_PMU68K=y  CONFIG_ADB_CUDA=y @@ -235,49 +288,64 @@ CONFIG_INPUT_ADBHID=y  CONFIG_MAC_EMUMOUSEBTN=y  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=m -CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_MII=y -CONFIG_ARIADNE=y +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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_VETH=m +# CONFIG_NET_VENDOR_3COM is not set  CONFIG_A2065=y -CONFIG_HYDRA=y -CONFIG_ZORRO8390=y -CONFIG_APNE=y -CONFIG_MAC8390=y -CONFIG_MAC89x0=y -CONFIG_MACSONIC=y -CONFIG_MACMACE=y -CONFIG_MVME147_NET=y -CONFIG_MVME16x_NET=y -CONFIG_BVME6000_NET=y +CONFIG_ARIADNE=y  CONFIG_ATARILANCE=y -CONFIG_SUN3LANCE=y  CONFIG_HPLANCE=y +CONFIG_MVME147_NET=y +CONFIG_SUN3LANCE=y +CONFIG_MACMACE=y +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +CONFIG_MAC89x0=y +# CONFIG_NET_VENDOR_FUJITSU is not set +# CONFIG_NET_VENDOR_HP is not set +CONFIG_BVME6000_NET=y +CONFIG_MVME16x_NET=y +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +CONFIG_MACSONIC=y +CONFIG_HYDRA=y +CONFIG_MAC8390=y  CONFIG_NE2000=m -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +CONFIG_APNE=y +CONFIG_ZORRO8390=y +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  CONFIG_KEYBOARD_AMIGA=y  CONFIG_KEYBOARD_ATARI=y  # CONFIG_KEYBOARD_ATKBD is not set  CONFIG_KEYBOARD_SUNKBD=y -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m  CONFIG_MOUSE_AMIGA=m  CONFIG_MOUSE_ATARI=m @@ -285,18 +353,20 @@ CONFIG_INPUT_JOYSTICK=y  CONFIG_JOYSTICK_AMIGA=m  CONFIG_INPUT_MISC=y  CONFIG_INPUT_M68K_BEEP=m -CONFIG_HP_SDC_RTC=y -# CONFIG_SERIO_SERPORT is not set +CONFIG_HP_SDC_RTC=m  CONFIG_SERIO_Q40KBD=y  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  CONFIG_SERIAL_PMACZILOG=y  CONFIG_SERIAL_PMACZILOG_TTYS=y  CONFIG_SERIAL_PMACZILOG_CONSOLE=y  CONFIG_PRINTER=m  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=y -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FB_CIRRUS=y @@ -316,7 +386,20 @@ CONFIG_DMASOUND_PAULA=m  CONFIG_DMASOUND_Q40=m  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_MSM6242=m +CONFIG_RTC_DRV_RP5C01=m +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_HEARTBEAT=y +CONFIG_PROC_HARDWARE=y +CONFIG_NATFEAT=y +CONFIG_NFBLOCK=y +CONFIG_NFCON=y +CONFIG_NFETH=y  CONFIG_ATARI_DSP56K=m  CONFIG_AMIGA_BUILTIN_SERIAL=y  CONFIG_SERIAL_CONSOLE=y @@ -324,42 +407,49 @@ CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m -CONFIG_HFS_FS=y -CONFIG_HFSPLUS_FS=y +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y +CONFIG_HFS_FS=m +CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -398,10 +488,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -411,19 +514,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -439,6 +539,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=y  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig index e2af46f530c..5586c6529fc 100644 --- a/arch/m68k/configs/mvme147_defconfig +++ b/arch/m68k/configs/mvme147_defconfig @@ -1,52 +1,73 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-mvme147"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_IOSCHED_DEADLINE=m +CONFIG_M68030=y  CONFIG_VME=y  CONFIG_MVME147=y -CONFIG_M68030=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -54,25 +75,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -83,6 +116,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -96,22 +131,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -121,7 +165,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -130,21 +173,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -159,103 +215,132 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MVME147_SCSI=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_MVME147_NET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m -CONFIG_MOUSE_SERIAL=m -CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set +# CONFIG_MOUSE_PS2 is not set +# CONFIG_SERIO is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -294,10 +379,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -307,19 +405,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -335,6 +430,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig index 7c9402b2097..e5e8262bbac 100644 --- a/arch/m68k/configs/mvme16x_defconfig +++ b/arch/m68k/configs/mvme16x_defconfig @@ -1,53 +1,74 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-mvme16x"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_VME=y -CONFIG_MVME16x=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_VME=y +CONFIG_MVME16x=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -55,25 +76,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -84,6 +117,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -97,22 +132,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -122,7 +166,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -131,21 +174,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -160,103 +216,131 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MVME16x_SCSI=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set  CONFIG_MVME16x_NET=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m -CONFIG_MOUSE_SERIAL=m -CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set +# CONFIG_MOUSE_PS2 is not set +# CONFIG_SERIO is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -295,10 +379,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -308,19 +405,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -336,6 +430,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig index 19d23db690a..8982370e8b4 100644 --- a/arch/m68k/configs/q40_defconfig +++ b/arch/m68k/configs/q40_defconfig @@ -1,49 +1,74 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-q40"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y -CONFIG_Q40=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +CONFIG_SUN_PARTITION=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_M68040=y  CONFIG_M68060=y +CONFIG_Q40=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_HEARTBEAT=y -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -51,25 +76,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -80,6 +117,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -93,22 +132,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -118,7 +166,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -127,26 +174,40 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m  CONFIG_ATA_OVER_ETH=m  CONFIG_IDE=y +CONFIG_IDE_GD_ATAPI=y  CONFIG_BLK_DEV_IDECD=y  CONFIG_BLK_DEV_Q40IDE=y  CONFIG_RAID_ATTRS=m @@ -159,61 +220,82 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CIRRUS is not set +# CONFIG_NET_VENDOR_FUJITSU is not set +# CONFIG_NET_VENDOR_HP is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set  CONFIG_NE2000=m -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SMSC is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m  CONFIG_INPUT_MISC=y  CONFIG_INPUT_M68K_BEEP=m -CONFIG_SERIO=m -# CONFIG_SERIO_SERPORT is not set -CONFIG_SERIO_Q40KBD=m +CONFIG_SERIO_Q40KBD=y  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FRAMEBUFFER_CONSOLE=y @@ -222,46 +304,61 @@ CONFIG_SOUND=m  CONFIG_DMASOUND_Q40=m  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_HEARTBEAT=y +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y +CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -300,10 +397,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -313,19 +423,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -341,6 +448,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig index ca6c0b4cab7..54674d61e00 100644 --- a/arch/m68k/configs/sun3_defconfig +++ b/arch/m68k/configs/sun3_defconfig @@ -1,50 +1,71 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-sun3"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_SUN3=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -52,25 +73,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -81,6 +114,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -94,22 +129,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -119,7 +163,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -128,21 +171,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -157,107 +213,136 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_SUN3_SCSI=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_SUN3LANCE=y +# CONFIG_NET_CADENCE is not set  CONFIG_SUN3_82586=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set  CONFIG_KEYBOARD_SUNKBD=y -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m -# CONFIG_SERIO_SERPORT is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_LOGO=y  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -296,10 +381,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -309,19 +407,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -337,6 +432,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig index c80941c7759..832d9539f44 100644 --- a/arch/m68k/configs/sun3x_defconfig +++ b/arch/m68k/configs/sun3x_defconfig @@ -1,50 +1,71 @@ -CONFIG_EXPERIMENTAL=y  CONFIG_LOCALVERSION="-sun3x"  CONFIG_SYSVIPC=y  CONFIG_POSIX_MQUEUE=y +CONFIG_FHANDLE=y  CONFIG_BSD_PROCESS_ACCT=y -CONFIG_LOG_BUF_SHIFT=14 -CONFIG_RELAY=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_LOG_BUF_SHIFT=16 +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_PID_NS is not set +# CONFIG_NET_NS is not set  CONFIG_BLK_DEV_INITRD=y -# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set  CONFIG_SLAB=y  CONFIG_MODULES=y  CONFIG_MODULE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_AMIGA_PARTITION=y +CONFIG_ATARI_PARTITION=y +CONFIG_MAC_PARTITION=y +CONFIG_BSD_DISKLABEL=y +CONFIG_MINIX_SUBPARTITION=y +CONFIG_SOLARIS_X86_PARTITION=y +CONFIG_UNIXWARE_DISKLABEL=y +# CONFIG_EFI_PARTITION is not set +CONFIG_SYSV68_PARTITION=y +CONFIG_IOSCHED_DEADLINE=m  CONFIG_SUN3X=y +# CONFIG_COMPACTION is not set +CONFIG_CLEANCACHE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set  CONFIG_BINFMT_AOUT=m  CONFIG_BINFMT_MISC=m -CONFIG_PROC_HARDWARE=y  CONFIG_NET=y  CONFIG_PACKET=y +CONFIG_PACKET_DIAG=m  CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_MIGRATE=y  CONFIG_NET_KEY=y -CONFIG_NET_KEY_MIGRATE=y  CONFIG_INET=y  CONFIG_IP_PNP=y  CONFIG_IP_PNP_DHCP=y  CONFIG_IP_PNP_BOOTP=y  CONFIG_IP_PNP_RARP=y  CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m  CONFIG_NET_IPGRE=m  CONFIG_SYN_COOKIES=y +CONFIG_NET_IPVTI=m  CONFIG_INET_AH=m  CONFIG_INET_ESP=m  CONFIG_INET_IPCOMP=m  CONFIG_INET_XFRM_MODE_TRANSPORT=m  CONFIG_INET_XFRM_MODE_TUNNEL=m  CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set  CONFIG_INET_DIAG=m +CONFIG_INET_UDP_DIAG=m  CONFIG_IPV6_PRIVACY=y  CONFIG_IPV6_ROUTER_PREF=y -CONFIG_IPV6_ROUTE_INFO=y  CONFIG_INET6_AH=m  CONFIG_INET6_ESP=m  CONFIG_INET6_IPCOMP=m -CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m -CONFIG_IPV6_TUNNEL=m +CONFIG_IPV6_GRE=m  CONFIG_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=m  CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_ZONES=y +# CONFIG_NF_CONNTRACK_PROCFS is not set  # CONFIG_NF_CT_PROTO_DCCP is not set  CONFIG_NF_CT_PROTO_UDPLITE=m  CONFIG_NF_CONNTRACK_AMANDA=m @@ -52,25 +73,37 @@ CONFIG_NF_CONNTRACK_FTP=m  CONFIG_NF_CONNTRACK_H323=m  CONFIG_NF_CONNTRACK_IRC=m  CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m  CONFIG_NF_CONNTRACK_PPTP=m  CONFIG_NF_CONNTRACK_SANE=m  CONFIG_NF_CONNTRACK_SIP=m  CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m  CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LOG=m  CONFIG_NETFILTER_XT_TARGET_MARK=m  CONFIG_NETFILTER_XT_TARGET_NFLOG=m  CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m  CONFIG_NETFILTER_XT_TARGET_TRACE=m  CONFIG_NETFILTER_XT_TARGET_TCPMSS=m  CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m  CONFIG_NETFILTER_XT_MATCH_CLUSTER=m  CONFIG_NETFILTER_XT_MATCH_COMMENT=m  CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m  CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m  CONFIG_NETFILTER_XT_MATCH_CONNMARK=m  CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m  CONFIG_NETFILTER_XT_MATCH_DSCP=m  CONFIG_NETFILTER_XT_MATCH_ESP=m  CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m @@ -81,6 +114,8 @@ 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  CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m @@ -94,22 +129,31 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m  CONFIG_NETFILTER_XT_MATCH_TIME=m  CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=m +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m  CONFIG_NF_CONNTRACK_IPV4=m -CONFIG_IP_NF_QUEUE=m  CONFIG_IP_NF_IPTABLES=m -CONFIG_IP_NF_MATCH_ADDRTYPE=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_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_IP_NF_MANGLE=m  CONFIG_IP_NF_TARGET_CLUSTERIP=m  CONFIG_IP_NF_TARGET_ECN=m @@ -119,7 +163,6 @@ CONFIG_IP_NF_ARPTABLES=m  CONFIG_IP_NF_ARPFILTER=m  CONFIG_IP_NF_ARP_MANGLE=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 @@ -128,21 +171,34 @@ 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  CONFIG_IP_DCCP=m  # CONFIG_IP_DCCP_CCID3 is not set +CONFIG_SCTP_COOKIE_HMAC_SHA1=y +CONFIG_RDS=m +CONFIG_RDS_TCP=m +CONFIG_L2TP=m  CONFIG_ATALK=m +CONFIG_BATMAN_ADV=m +CONFIG_BATMAN_ADV_DAT=y +# CONFIG_WIRELESS is not set  CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_DEVTMPFS=y  # CONFIG_FIRMWARE_IN_KERNEL is not set +# CONFIG_FW_LOADER_USER_HELPER is not set  CONFIG_CONNECTOR=m  CONFIG_BLK_DEV_LOOP=y  CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_DRBD=m  CONFIG_BLK_DEV_NBD=m  CONFIG_BLK_DEV_RAM=y  CONFIG_CDROM_PKTCDVD=m @@ -157,106 +213,136 @@ CONFIG_BLK_DEV_SR=y  CONFIG_BLK_DEV_SR_VENDOR=y  CONFIG_CHR_DEV_SG=m  CONFIG_SCSI_CONSTANTS=y -CONFIG_SCSI_SAS_LIBSAS=m -# CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set -CONFIG_SCSI_SRP_ATTRS=m -CONFIG_SCSI_SRP_TGT_ATTRS=y +CONFIG_SCSI_SAS_ATTRS=m  CONFIG_ISCSI_TCP=m +CONFIG_ISCSI_BOOT_SYSFS=m  CONFIG_SUN3X_ESP=y  CONFIG_MD=y -CONFIG_BLK_DEV_MD=m  CONFIG_MD_LINEAR=m  CONFIG_MD_RAID0=m -CONFIG_MD_RAID1=m -CONFIG_MD_RAID456=m  CONFIG_BLK_DEV_DM=m  CONFIG_DM_CRYPT=m  CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +CONFIG_DM_CACHE=m  CONFIG_DM_MIRROR=m +CONFIG_DM_RAID=m  CONFIG_DM_ZERO=m  CONFIG_DM_MULTIPATH=m  CONFIG_DM_UEVENT=y +CONFIG_TARGET_CORE=m +CONFIG_TCM_IBLOCK=m +CONFIG_TCM_FILEIO=m +CONFIG_TCM_PSCSI=m  CONFIG_NETDEVICES=y  CONFIG_DUMMY=m -CONFIG_MACVLAN=m  CONFIG_EQUALIZER=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_VXLAN=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y  CONFIG_VETH=m -CONFIG_NET_ETHERNET=y  CONFIG_SUN3LANCE=y -# CONFIG_NETDEV_1000 is not set -# CONFIG_NETDEV_10000 is not set +# CONFIG_NET_CADENCE is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_STMICRO is not set +# CONFIG_NET_VENDOR_WIZNET is not set  CONFIG_PPP=m -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m  CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y  CONFIG_PPP_MPPE=m  CONFIG_PPPOE=m +CONFIG_PPTP=m +CONFIG_PPPOL2TP=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m  CONFIG_SLIP=m  CONFIG_SLIP_COMPRESSED=y  CONFIG_SLIP_SMART=y  CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_INPUT_FF_MEMLESS=m +# CONFIG_WLAN is not set +CONFIG_INPUT_EVDEV=m  # CONFIG_KEYBOARD_ATKBD is not set  CONFIG_KEYBOARD_SUNKBD=y -CONFIG_MOUSE_PS2=m +# CONFIG_MOUSE_PS2 is not set  CONFIG_MOUSE_SERIAL=m -# CONFIG_SERIO_SERPORT is not set  CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_LEGACY_PTYS is not set  # CONFIG_DEVKMEM is not set  # CONFIG_HW_RANDOM is not set -CONFIG_GEN_RTC=m -CONFIG_GEN_RTC_X=y +CONFIG_NTP_PPS=y +CONFIG_PPS_CLIENT_LDISC=m +CONFIG_PTP_1588_CLOCK=m  # CONFIG_HWMON is not set  CONFIG_FB=y  CONFIG_FRAMEBUFFER_CONSOLE=y  CONFIG_LOGO=y  CONFIG_HID=m  CONFIG_HIDRAW=y +CONFIG_UHID=m +# CONFIG_HID_GENERIC is not set  # CONFIG_USB_SUPPORT is not set +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_GENERIC=m +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_PROC_HARDWARE=y  CONFIG_EXT2_FS=y  CONFIG_EXT3_FS=y  # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set  # CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=y  CONFIG_REISERFS_FS=m  CONFIG_JFS_FS=m  CONFIG_XFS_FS=m  CONFIG_OCFS2_FS=m -# CONFIG_OCFS2_FS_STATS is not set  # CONFIG_OCFS2_DEBUG_MASKLOG is not set +CONFIG_FANOTIFY=y  CONFIG_QUOTA_NETLINK_INTERFACE=y  # CONFIG_PRINT_QUOTA_WARNING is not set -CONFIG_AUTOFS_FS=m  CONFIG_AUTOFS4_FS=m  CONFIG_FUSE_FS=m +CONFIG_CUSE=m  CONFIG_ISO9660_FS=y  CONFIG_JOLIET=y  CONFIG_ZISOFS=y  CONFIG_UDF_FS=m -CONFIG_MSDOS_FS=y +CONFIG_MSDOS_FS=m  CONFIG_VFAT_FS=m  CONFIG_PROC_KCORE=y  CONFIG_TMPFS=y  CONFIG_AFFS_FS=m +CONFIG_ECRYPT_FS=m +CONFIG_ECRYPT_FS_MESSAGING=y  CONFIG_HFS_FS=m  CONFIG_HFSPLUS_FS=m  CONFIG_CRAMFS=m  CONFIG_SQUASHFS=m -CONFIG_MINIX_FS=y +CONFIG_SQUASHFS_LZO=y +CONFIG_MINIX_FS=m +CONFIG_OMFS_FS=m  CONFIG_HPFS_FS=m +CONFIG_QNX4FS_FS=m +CONFIG_QNX6FS_FS=m  CONFIG_SYSV_FS=m  CONFIG_UFS_FS=m  CONFIG_NFS_FS=y -CONFIG_NFS_V3=y  CONFIG_NFS_V4=y +CONFIG_NFS_SWAP=y  CONFIG_ROOT_NFS=y  CONFIG_NFSD=m  CONFIG_NFSD_V3=y -CONFIG_SMB_FS=m -CONFIG_SMB_NLS_DEFAULT=y +CONFIG_CIFS=m +# CONFIG_CIFS_DEBUG is not set  CONFIG_CODA_FS=m  CONFIG_NLS_CODEPAGE_437=y  CONFIG_NLS_CODEPAGE_737=m @@ -295,10 +381,23 @@ 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_DLM=m  CONFIG_MAGIC_SYSRQ=y -# CONFIG_RCU_CPU_STALL_DETECTOR is not set -CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_ASYNC_RAID6_TEST=m +CONFIG_ENCRYPTED_KEYS=m +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_USER=m  CONFIG_CRYPTO_NULL=m  CONFIG_CRYPTO_CRYPTD=m  CONFIG_CRYPTO_TEST=m @@ -308,19 +407,16 @@ CONFIG_CRYPTO_CTS=m  CONFIG_CRYPTO_LRW=m  CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_XTS=m -CONFIG_CRYPTO_HMAC=y  CONFIG_CRYPTO_XCBC=m -CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_VMAC=m  CONFIG_CRYPTO_MICHAEL_MIC=m  CONFIG_CRYPTO_RMD128=m  CONFIG_CRYPTO_RMD160=m  CONFIG_CRYPTO_RMD256=m  CONFIG_CRYPTO_RMD320=m -CONFIG_CRYPTO_SHA256=m  CONFIG_CRYPTO_SHA512=m  CONFIG_CRYPTO_TGR192=m  CONFIG_CRYPTO_WP512=m -CONFIG_CRYPTO_AES=m  CONFIG_CRYPTO_ANUBIS=m  CONFIG_CRYPTO_BLOWFISH=m  CONFIG_CRYPTO_CAMELLIA=m @@ -336,6 +432,14 @@ CONFIG_CRYPTO_TWOFISH=m  CONFIG_CRYPTO_ZLIB=m  CONFIG_CRYPTO_LZO=m  # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=m +CONFIG_CRYPTO_USER_API_SKCIPHER=m  # CONFIG_CRYPTO_HW is not set -CONFIG_CRC16=m  CONFIG_CRC_T10DIF=y +CONFIG_XZ_DEC_X86=y +CONFIG_XZ_DEC_POWERPC=y +CONFIG_XZ_DEC_IA64=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_SPARC=y +CONFIG_XZ_DEC_TEST=m diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild index c7933e41f10..09d77a862da 100644 --- a/arch/m68k/include/asm/Kbuild +++ b/arch/m68k/include/asm/Kbuild @@ -6,7 +6,6 @@ generic-y += device.h  generic-y += emergency-restart.h  generic-y += errno.h  generic-y += exec.h -generic-y += futex.h  generic-y += hw_irq.h  generic-y += ioctl.h  generic-y += ipcbuf.h diff --git a/arch/m68k/include/asm/futex.h b/arch/m68k/include/asm/futex.h new file mode 100644 index 00000000000..bc868af10c9 --- /dev/null +++ b/arch/m68k/include/asm/futex.h @@ -0,0 +1,94 @@ +#ifndef _ASM_M68K_FUTEX_H +#define _ASM_M68K_FUTEX_H + +#ifdef __KERNEL__ +#if !defined(CONFIG_MMU) +#include <asm-generic/futex.h> +#else	/* CONFIG_MMU */ + +#include <linux/futex.h> +#include <linux/uaccess.h> +#include <asm/errno.h> + +static inline int +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval) +{ +	u32 val; + +	if (unlikely(get_user(val, uaddr) != 0)) +		return -EFAULT; + +	if (val == oldval && unlikely(put_user(newval, uaddr) != 0)) +		return -EFAULT; + +	*uval = val; + +	return 0; +} + +static inline int +futex_atomic_op_inuser(int encoded_op, u32 __user *uaddr) +{ +	int op = (encoded_op >> 28) & 7; +	int cmp = (encoded_op >> 24) & 15; +	int oparg = (encoded_op << 8) >> 20; +	int cmparg = (encoded_op << 20) >> 20; +	int oldval, ret; +	u32 tmp; + +	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) +		oparg = 1 << oparg; + +	pagefault_disable();	/* implies preempt_disable() */ + +	ret = -EFAULT; +	if (unlikely(get_user(oldval, uaddr) != 0)) +		goto out_pagefault_enable; + +	ret = 0; +	tmp = oldval; + +	switch (op) { +	case FUTEX_OP_SET: +		tmp = oparg; +		break; +	case FUTEX_OP_ADD: +		tmp += oparg; +		break; +	case FUTEX_OP_OR: +		tmp |= oparg; +		break; +	case FUTEX_OP_ANDN: +		tmp &= ~oparg; +		break; +	case FUTEX_OP_XOR: +		tmp ^= oparg; +		break; +	default: +		ret = -ENOSYS; +	} + +	if (ret == 0 && unlikely(put_user(tmp, uaddr) != 0)) +		ret = -EFAULT; + +out_pagefault_enable: +	pagefault_enable();	/* subsumes preempt_enable() */ + +	if (ret == 0) { +		switch (cmp) { +		case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; +		case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; +		case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; +		case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; +		case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; +		case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; +		default: ret = -ENOSYS; +		} +	} +	return ret; +} + +#endif /* CONFIG_MMU */ +#endif /* __KERNEL__ */ +#endif /* _ASM_M68K_FUTEX_H */ diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h index 8cc83431805..2f6eec1e34b 100644 --- a/arch/m68k/include/asm/gpio.h +++ b/arch/m68k/include/asm/gpio.h @@ -86,6 +86,7 @@ static inline int gpio_cansleep(unsigned gpio)  	return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);  } +#ifndef CONFIG_GPIOLIB  static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)  {  	int err; @@ -105,5 +106,5 @@ static inline int gpio_request_one(unsigned gpio, unsigned long flags, const cha  	return err;  } - +#endif /* !CONFIG_GPIOLIB */  #endif diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S index d197e7ff62c..ac85f16534a 100644 --- a/arch/m68k/kernel/head.S +++ b/arch/m68k/kernel/head.S @@ -2752,11 +2752,9 @@ func_return	get_new_page  #ifdef CONFIG_MAC  L(scc_initable_mac): -	.byte	9,12		/* Reset */  	.byte	4,0x44		/* x16, 1 stopbit, no parity */  	.byte	3,0xc0		/* receiver: 8 bpc */  	.byte	5,0xe2		/* transmitter: 8 bpc, assert dtr/rts */ -	.byte	9,0		/* no interrupts */  	.byte	10,0		/* NRZ */  	.byte	11,0x50		/* use baud rate generator */  	.byte	12,1,13,0	/* 38400 baud */ @@ -2899,6 +2897,7 @@ func_start	serial_init,%d0/%d1/%a0/%a1  	is_not_mac(L(serial_init_not_mac))  #ifdef SERIAL_DEBUG +  /* You may define either or both of these. */  #define MAC_USE_SCC_A /* Modem port */  #define MAC_USE_SCC_B /* Printer port */ @@ -2908,9 +2907,21 @@ func_start	serial_init,%d0/%d1/%a0/%a1  #define mac_scc_cha_b_data_offset	0x4  #define mac_scc_cha_a_data_offset	0x6 +#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) +	movel	%pc@(L(mac_sccbase)),%a0 +	/* Reset SCC device */ +	moveb	#9,%a0@(mac_scc_cha_a_ctrl_offset) +	moveb	#0xc0,%a0@(mac_scc_cha_a_ctrl_offset) +	/* Wait for 5 PCLK cycles, which is about 68 CPU cycles */ +	/* 5 / 3.6864 MHz = approx. 1.36 us = 68 / 50 MHz */ +	movel	#35,%d0 +5: +	subq	#1,%d0 +	jne	5b +#endif +  #ifdef MAC_USE_SCC_A  	/* Initialize channel A */ -	movel	%pc@(L(mac_sccbase)),%a0  	lea	%pc@(L(scc_initable_mac)),%a1  5:	moveb	%a1@+,%d0  	jmi	6f @@ -2922,9 +2933,6 @@ func_start	serial_init,%d0/%d1/%a0/%a1  #ifdef MAC_USE_SCC_B  	/* Initialize channel B */ -#ifndef MAC_USE_SCC_A	/* Load mac_sccbase only if needed */ -	movel	%pc@(L(mac_sccbase)),%a0 -#endif	/* MAC_USE_SCC_A */  	lea	%pc@(L(scc_initable_mac)),%a1  7:	moveb	%a1@+,%d0  	jmi	8f @@ -2933,6 +2941,7 @@ func_start	serial_init,%d0/%d1/%a0/%a1  	jra	7b  8:  #endif	/* MAC_USE_SCC_B */ +  #endif	/* SERIAL_DEBUG */  	jra	L(serial_init_done) @@ -3006,17 +3015,17 @@ func_start	serial_putc,%d0/%d1/%a0/%a1  #ifdef SERIAL_DEBUG -#ifdef MAC_USE_SCC_A +#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)  	movel	%pc@(L(mac_sccbase)),%a1 +#endif + +#ifdef MAC_USE_SCC_A  3:	btst	#2,%a1@(mac_scc_cha_a_ctrl_offset)  	jeq	3b  	moveb	%d0,%a1@(mac_scc_cha_a_data_offset)  #endif	/* MAC_USE_SCC_A */  #ifdef MAC_USE_SCC_B -#ifndef MAC_USE_SCC_A	/* Load mac_sccbase only if needed */ -	movel	%pc@(L(mac_sccbase)),%a1 -#endif	/* MAC_USE_SCC_A */  4:	btst	#2,%a1@(mac_scc_cha_b_ctrl_offset)  	jeq	4b  	moveb	%d0,%a1@(mac_scc_cha_b_data_offset) diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h index 0f553bc009a..ffea82a16d2 100644 --- a/arch/microblaze/include/asm/cacheflush.h +++ b/arch/microblaze/include/asm/cacheflush.h @@ -102,21 +102,23 @@ do { \  #define flush_cache_range(vma, start, len) do { } while (0) -#define copy_to_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	u32 addr = virt_to_phys(dst);					\ -	memcpy((dst), (src), (len));					\ -	if (vma->vm_flags & VM_EXEC) {					\ -		invalidate_icache_range((unsigned) (addr),		\ -					(unsigned) (addr) + PAGE_SIZE);	\ -		flush_dcache_range((unsigned) (addr),			\ -					(unsigned) (addr) + PAGE_SIZE);	\ -	}								\ -} while (0) +static inline void copy_to_user_page(struct vm_area_struct *vma, +				     struct page *page, unsigned long vaddr, +				     void *dst, void *src, int len) +{ +	u32 addr = virt_to_phys(dst); +	memcpy(dst, src, len); +	if (vma->vm_flags & VM_EXEC) { +		invalidate_icache_range(addr, addr + PAGE_SIZE); +		flush_dcache_range(addr, addr + PAGE_SIZE); +	} +} -#define copy_from_user_page(vma, page, vaddr, dst, src, len)		\ -do {									\ -	memcpy((dst), (src), (len));					\ -} while (0) +static inline void copy_from_user_page(struct vm_area_struct *vma, +				       struct page *page, unsigned long vaddr, +				       void *dst, void *src, int len) +{ +	memcpy(dst, src, len); +}  #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ diff --git a/arch/microblaze/include/asm/futex.h b/arch/microblaze/include/asm/futex.h index ff8cde159d9..01848f056f4 100644 --- a/arch/microblaze/include/asm/futex.h +++ b/arch/microblaze/include/asm/futex.h @@ -105,7 +105,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,  	__asm__ __volatile__ ("1:	lwx	%1, %3, r0;		\  					cmp	%2, %1, %4;		\ -					beqi	%2, 3f;			\ +					bnei	%2, 3f;			\  				2:	swx	%5, %3, r0;		\  					addic	%2, r0, 0;		\  					bnei	%2, 1b;			\ diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h index 8cb8a8566ed..2565cb94f32 100644 --- a/arch/microblaze/include/asm/io.h +++ b/arch/microblaze/include/asm/io.h @@ -123,11 +123,11 @@ static inline void writel(unsigned int v, volatile void __iomem *addr)   * inb_p/inw_p/...   * The macros don't do byte-swapping.   */ -#define inb(port)		readb((u8 *)((port))) +#define inb(port)		readb((u8 *)((unsigned long)(port)))  #define outb(val, port)		writeb((val), (u8 *)((unsigned long)(port))) -#define inw(port)		readw((u16 *)((port))) +#define inw(port)		readw((u16 *)((unsigned long)(port)))  #define outw(val, port)		writew((val), (u16 *)((unsigned long)(port))) -#define inl(port)		readl((u32 *)((port))) +#define inl(port)		readl((u32 *)((unsigned long)(port)))  #define outl(val, port)		writel((val), (u32 *)((unsigned long)(port)))  #define inb_p(port)		inb((port)) diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index efe59d88178..04e49553bdf 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h @@ -99,13 +99,13 @@ static inline int access_ok(int type, const void __user *addr,  	if ((get_fs().seg < ((unsigned long)addr)) ||  			(get_fs().seg < ((unsigned long)addr + size - 1))) {  		pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", -			type ? "WRITE" : "READ ", (u32)addr, (u32)size, +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size,  			(u32)get_fs().seg);  		return 0;  	}  ok:  	pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", -			type ? "WRITE" : "READ ", (u32)addr, (u32)size, +			type ? "WRITE" : "READ ", (__force u32)addr, (u32)size,  			(u32)get_fs().seg);  	return 1;  } diff --git a/arch/microblaze/kernel/cpu/cache.c b/arch/microblaze/kernel/cpu/cache.c index 4254514b4c8..a6e44410672 100644 --- a/arch/microblaze/kernel/cpu/cache.c +++ b/arch/microblaze/kernel/cpu/cache.c @@ -140,7 +140,7 @@ do {									\  /* It is used only first parameter for OP - for wic, wdc */  #define CACHE_RANGE_LOOP_1(start, end, line_length, op)			\  do {									\ -	int volatile temp;						\ +	int volatile temp = 0;						\  	int align = ~(line_length - 1);					\  	end = ((end & align) == end) ? end - line_length : end & align;	\  	WARN_ON(end - start < 0);					\ diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index b0baa299f89..01b1b3f94fe 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c @@ -428,13 +428,16 @@ static void octeon_restart(char *command)   */  static void octeon_kill_core(void *arg)  { -	mb(); -	if (octeon_is_simulation()) { -		/* The simulator needs the watchdog to stop for dead cores */ -		cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); +	if (octeon_is_simulation())  		/* A break instruction causes the simulator stop a core */ -		asm volatile ("sync\nbreak"); -	} +		asm volatile ("break" ::: "memory"); + +	local_irq_disable(); +	/* Disable watchdog on this core. */ +	cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); +	/* Spin in a low power mode. */ +	while (true) +		asm volatile ("wait" ::: "memory");  } diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index 143875c6c95..4d6fa0bf130 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h @@ -496,10 +496,6 @@ struct kvm_mips_callbacks {  			    uint32_t cause);  	int (*irq_clear) (struct kvm_vcpu *vcpu, unsigned int priority,  			  uint32_t cause); -	int (*vcpu_ioctl_get_regs) (struct kvm_vcpu *vcpu, -				    struct kvm_regs *regs); -	int (*vcpu_ioctl_set_regs) (struct kvm_vcpu *vcpu, -				    struct kvm_regs *regs);  };  extern struct kvm_mips_callbacks *kvm_mips_callbacks;  int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks); diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index a3186f2bb8a..5e6cd094739 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h @@ -16,6 +16,38 @@  #include <asm/isadep.h>  #include <uapi/asm/ptrace.h> +/* + * This struct defines the way the registers are stored on the stack during a + * system call/exception. As usual the registers k0/k1 aren't being saved. + */ +struct pt_regs { +#ifdef CONFIG_32BIT +	/* Pad bytes for argument save space on the stack. */ +	unsigned long pad0[6]; +#endif + +	/* Saved main processor registers. */ +	unsigned long regs[32]; + +	/* Saved special registers. */ +	unsigned long cp0_status; +	unsigned long hi; +	unsigned long lo; +#ifdef CONFIG_CPU_HAS_SMARTMIPS +	unsigned long acx; +#endif +	unsigned long cp0_badvaddr; +	unsigned long cp0_cause; +	unsigned long cp0_epc; +#ifdef CONFIG_MIPS_MT_SMTC +	unsigned long cp0_tcstatus; +#endif /* CONFIG_MIPS_MT_SMTC */ +#ifdef CONFIG_CPU_CAVIUM_OCTEON +	unsigned long long mpl[3];	  /* MTM{0,1,2} */ +	unsigned long long mtp[3];	  /* MTP{0,1,2} */ +#endif +} __aligned(8); +  struct task_struct;  extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); diff --git a/arch/mips/include/uapi/asm/kvm.h b/arch/mips/include/uapi/asm/kvm.h index 85789eacbf1..3f424f5217d 100644 --- a/arch/mips/include/uapi/asm/kvm.h +++ b/arch/mips/include/uapi/asm/kvm.h @@ -1,55 +1,138 @@  /* -* This file is subject to the terms and conditions of the GNU General Public -* License.  See the file "COPYING" in the main directory of this archive -* for more details. -* -* Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved. -* Authors: Sanjay Lal <sanjayl@kymasys.com> -*/ + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved. + * Copyright (C) 2013 Cavium, Inc. + * Authors: Sanjay Lal <sanjayl@kymasys.com> + */  #ifndef __LINUX_KVM_MIPS_H  #define __LINUX_KVM_MIPS_H  #include <linux/types.h> -#define __KVM_MIPS - -#define N_MIPS_COPROC_REGS      32 -#define N_MIPS_COPROC_SEL   	8 +/* + * KVM MIPS specific structures and definitions. + * + * Some parts derived from the x86 version of this file. + */ -/* for KVM_GET_REGS and KVM_SET_REGS */ +/* + * for KVM_GET_REGS and KVM_SET_REGS + * + * If Config[AT] is zero (32-bit CPU), the register contents are + * stored in the lower 32-bits of the struct kvm_regs fields and sign + * extended to 64-bits. + */  struct kvm_regs { -	__u32 gprs[32]; -	__u32 hi; -	__u32 lo; -	__u32 pc; - -	__u32 cp0reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL]; -}; - -/* for KVM_GET_SREGS and KVM_SET_SREGS */ -struct kvm_sregs { +	/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ +	__u64 gpr[32]; +	__u64 hi; +	__u64 lo; +	__u64 pc;  }; -/* for KVM_GET_FPU and KVM_SET_FPU */ +/* + * for KVM_GET_FPU and KVM_SET_FPU + * + * If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs + * are zero filled. + */  struct kvm_fpu { +	__u64 fpr[32]; +	__u32 fir; +	__u32 fccr; +	__u32 fexr; +	__u32 fenr; +	__u32 fcsr; +	__u32 pad;  }; + +/* + * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0 + * registers.  The id field is broken down as follows: + * + *  bits[2..0]   - Register 'sel' index. + *  bits[7..3]   - Register 'rd'  index. + *  bits[15..8]  - Must be zero. + *  bits[63..16] - 1 -> CP0 registers. + * + * Other sets registers may be added in the future.  Each set would + * have its own identifier in bits[63..16]. + * + * The addr field of struct kvm_one_reg must point to an aligned + * 64-bit wide location.  For registers that are narrower than + * 64-bits, the value is stored in the low order bits of the location, + * and sign extended to 64-bits. + * + * The registers defined in struct kvm_regs are also accessible, the + * id values for these are below. + */ + +#define KVM_REG_MIPS_R0 0 +#define KVM_REG_MIPS_R1 1 +#define KVM_REG_MIPS_R2 2 +#define KVM_REG_MIPS_R3 3 +#define KVM_REG_MIPS_R4 4 +#define KVM_REG_MIPS_R5 5 +#define KVM_REG_MIPS_R6 6 +#define KVM_REG_MIPS_R7 7 +#define KVM_REG_MIPS_R8 8 +#define KVM_REG_MIPS_R9 9 +#define KVM_REG_MIPS_R10 10 +#define KVM_REG_MIPS_R11 11 +#define KVM_REG_MIPS_R12 12 +#define KVM_REG_MIPS_R13 13 +#define KVM_REG_MIPS_R14 14 +#define KVM_REG_MIPS_R15 15 +#define KVM_REG_MIPS_R16 16 +#define KVM_REG_MIPS_R17 17 +#define KVM_REG_MIPS_R18 18 +#define KVM_REG_MIPS_R19 19 +#define KVM_REG_MIPS_R20 20 +#define KVM_REG_MIPS_R21 21 +#define KVM_REG_MIPS_R22 22 +#define KVM_REG_MIPS_R23 23 +#define KVM_REG_MIPS_R24 24 +#define KVM_REG_MIPS_R25 25 +#define KVM_REG_MIPS_R26 26 +#define KVM_REG_MIPS_R27 27 +#define KVM_REG_MIPS_R28 28 +#define KVM_REG_MIPS_R29 29 +#define KVM_REG_MIPS_R30 30 +#define KVM_REG_MIPS_R31 31 + +#define KVM_REG_MIPS_HI 32 +#define KVM_REG_MIPS_LO 33 +#define KVM_REG_MIPS_PC 34 + +/* + * KVM MIPS specific structures and definitions + * + */  struct kvm_debug_exit_arch { +	__u64 epc;  };  /* for KVM_SET_GUEST_DEBUG */  struct kvm_guest_debug_arch {  }; +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; + +/* dummy definition */ +struct kvm_sregs { +}; +  struct kvm_mips_interrupt {  	/* in */  	__u32 cpu;  	__u32 irq;  }; -/* definition of registers in kvm_run */ -struct kvm_sync_regs { -}; -  #endif /* __LINUX_KVM_MIPS_H */ diff --git a/arch/mips/include/uapi/asm/ptrace.h b/arch/mips/include/uapi/asm/ptrace.h index 4d58d846870..b26f7e31727 100644 --- a/arch/mips/include/uapi/asm/ptrace.h +++ b/arch/mips/include/uapi/asm/ptrace.h @@ -22,16 +22,12 @@  #define DSP_CONTROL	77  #define ACX		78 +#ifndef __KERNEL__  /*   * This struct defines the way the registers are stored on the stack during a   * system call/exception. As usual the registers k0/k1 aren't being saved.   */  struct pt_regs { -#ifdef CONFIG_32BIT -	/* Pad bytes for argument save space on the stack. */ -	unsigned long pad0[6]; -#endif -  	/* Saved main processor registers. */  	unsigned long regs[32]; @@ -39,20 +35,11 @@ struct pt_regs {  	unsigned long cp0_status;  	unsigned long hi;  	unsigned long lo; -#ifdef CONFIG_CPU_HAS_SMARTMIPS -	unsigned long acx; -#endif  	unsigned long cp0_badvaddr;  	unsigned long cp0_cause;  	unsigned long cp0_epc; -#ifdef CONFIG_MIPS_MT_SMTC -	unsigned long cp0_tcstatus; -#endif /* CONFIG_MIPS_MT_SMTC */ -#ifdef CONFIG_CPU_CAVIUM_OCTEON -	unsigned long long mpl[3];	  /* MTM{0,1,2} */ -	unsigned long long mtp[3];	  /* MTP{0,1,2} */ -#endif  } __attribute__ ((aligned (8))); +#endif /* __KERNEL__ */  /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */  #define PTRACE_GETREGS		12 diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c index e06f777e9c4..1188e00bb12 100644 --- a/arch/mips/kernel/binfmt_elfn32.c +++ b/arch/mips/kernel/binfmt_elfn32.c @@ -119,4 +119,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");  #undef TASK_SIZE  #define TASK_SIZE TASK_SIZE32 +#undef cputime_to_timeval +#define cputime_to_timeval cputime_to_compat_timeval +static __inline__ void +cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) +{ +	unsigned long jiffies = cputime_to_jiffies(cputime); + +	value->tv_usec = (jiffies % HZ) * (1000000L / HZ); +	value->tv_sec = jiffies / HZ; +} +  #include "../../../fs/binfmt_elf.c" diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index 97c5a1668e5..202e581e609 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c @@ -162,4 +162,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");  #undef TASK_SIZE  #define TASK_SIZE TASK_SIZE32 +#undef cputime_to_timeval +#define cputime_to_timeval cputime_to_compat_timeval +static __inline__ void +cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) +{ +	unsigned long jiffies = cputime_to_jiffies(cputime); + +	value->tv_usec = (jiffies % HZ) * (1000000L / HZ); +	value->tv_sec = jiffies / HZ; +} +  #include "../../../fs/binfmt_elf.c" diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 93c070b41b0..6fa198db899 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c @@ -40,6 +40,7 @@  #include <asm/processor.h>  #include <asm/vpe.h>  #include <asm/rtlx.h> +#include <asm/setup.h>  static struct rtlx_info *rtlx;  static int major; diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index e3be67012d7..a75ae40184a 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -897,22 +897,24 @@ out_sigsegv:  asmlinkage void do_tr(struct pt_regs *regs)  { -	unsigned int opcode, tcode = 0; +	u32 opcode, tcode = 0;  	u16 instr[2]; -	unsigned long epc = exception_epc(regs); +	unsigned long epc = msk_isa16_mode(exception_epc(regs)); -	if ((__get_user(instr[0], (u16 __user *)msk_isa16_mode(epc))) || -		(__get_user(instr[1], (u16 __user *)msk_isa16_mode(epc + 2)))) +	if (get_isa16_mode(regs->cp0_epc)) { +		if (__get_user(instr[0], (u16 __user *)(epc + 0)) || +		    __get_user(instr[1], (u16 __user *)(epc + 2)))  			goto out_sigsegv; -	opcode = (instr[0] << 16) | instr[1]; - -	/* Immediate versions don't provide a code.  */ -	if (!(opcode & OPCODE)) { -		if (get_isa16_mode(regs->cp0_epc)) -			/* microMIPS */ -			tcode = (opcode >> 12) & 0x1f; -		else -			tcode = ((opcode >> 6) & ((1 << 10) - 1)); +		opcode = (instr[0] << 16) | instr[1]; +		/* Immediate versions don't provide a code.  */ +		if (!(opcode & OPCODE)) +			tcode = (opcode >> 12) & ((1 << 4) - 1); +	} else { +		if (__get_user(opcode, (u32 __user *)epc)) +			goto out_sigsegv; +		/* Immediate versions don't provide a code.  */ +		if (!(opcode & OPCODE)) +			tcode = (opcode >> 6) & ((1 << 10) - 1);  	}  	do_trap_or_bp(regs, tcode, "Trap"); diff --git a/arch/mips/kvm/kvm_mips.c b/arch/mips/kvm/kvm_mips.c index e0dad028979..d934b017f47 100644 --- a/arch/mips/kvm/kvm_mips.c +++ b/arch/mips/kvm/kvm_mips.c @@ -195,7 +195,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)  long  kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)  { -	return -EINVAL; +	return -ENOIOCTLCMD;  }  void kvm_arch_free_memslot(struct kvm_memory_slot *free, @@ -401,7 +401,7 @@ int  kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,  				    struct kvm_guest_debug *dbg)  { -	return -EINVAL; +	return -ENOIOCTLCMD;  }  int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) @@ -475,14 +475,223 @@ int  kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,  				struct kvm_mp_state *mp_state)  { -	return -EINVAL; +	return -ENOIOCTLCMD;  }  int  kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,  				struct kvm_mp_state *mp_state)  { -	return -EINVAL; +	return -ENOIOCTLCMD; +} + +#define KVM_REG_MIPS_CP0_INDEX (0x10000 + 8 * 0 + 0) +#define KVM_REG_MIPS_CP0_ENTRYLO0 (0x10000 + 8 * 2 + 0) +#define KVM_REG_MIPS_CP0_ENTRYLO1 (0x10000 + 8 * 3 + 0) +#define KVM_REG_MIPS_CP0_CONTEXT (0x10000 + 8 * 4 + 0) +#define KVM_REG_MIPS_CP0_USERLOCAL (0x10000 + 8 * 4 + 2) +#define KVM_REG_MIPS_CP0_PAGEMASK (0x10000 + 8 * 5 + 0) +#define KVM_REG_MIPS_CP0_PAGEGRAIN (0x10000 + 8 * 5 + 1) +#define KVM_REG_MIPS_CP0_WIRED (0x10000 + 8 * 6 + 0) +#define KVM_REG_MIPS_CP0_HWRENA (0x10000 + 8 * 7 + 0) +#define KVM_REG_MIPS_CP0_BADVADDR (0x10000 + 8 * 8 + 0) +#define KVM_REG_MIPS_CP0_COUNT (0x10000 + 8 * 9 + 0) +#define KVM_REG_MIPS_CP0_ENTRYHI (0x10000 + 8 * 10 + 0) +#define KVM_REG_MIPS_CP0_COMPARE (0x10000 + 8 * 11 + 0) +#define KVM_REG_MIPS_CP0_STATUS (0x10000 + 8 * 12 + 0) +#define KVM_REG_MIPS_CP0_CAUSE (0x10000 + 8 * 13 + 0) +#define KVM_REG_MIPS_CP0_EBASE (0x10000 + 8 * 15 + 1) +#define KVM_REG_MIPS_CP0_CONFIG (0x10000 + 8 * 16 + 0) +#define KVM_REG_MIPS_CP0_CONFIG1 (0x10000 + 8 * 16 + 1) +#define KVM_REG_MIPS_CP0_CONFIG2 (0x10000 + 8 * 16 + 2) +#define KVM_REG_MIPS_CP0_CONFIG3 (0x10000 + 8 * 16 + 3) +#define KVM_REG_MIPS_CP0_CONFIG7 (0x10000 + 8 * 16 + 7) +#define KVM_REG_MIPS_CP0_XCONTEXT (0x10000 + 8 * 20 + 0) +#define KVM_REG_MIPS_CP0_ERROREPC (0x10000 + 8 * 30 + 0) + +static u64 kvm_mips_get_one_regs[] = { +	KVM_REG_MIPS_R0, +	KVM_REG_MIPS_R1, +	KVM_REG_MIPS_R2, +	KVM_REG_MIPS_R3, +	KVM_REG_MIPS_R4, +	KVM_REG_MIPS_R5, +	KVM_REG_MIPS_R6, +	KVM_REG_MIPS_R7, +	KVM_REG_MIPS_R8, +	KVM_REG_MIPS_R9, +	KVM_REG_MIPS_R10, +	KVM_REG_MIPS_R11, +	KVM_REG_MIPS_R12, +	KVM_REG_MIPS_R13, +	KVM_REG_MIPS_R14, +	KVM_REG_MIPS_R15, +	KVM_REG_MIPS_R16, +	KVM_REG_MIPS_R17, +	KVM_REG_MIPS_R18, +	KVM_REG_MIPS_R19, +	KVM_REG_MIPS_R20, +	KVM_REG_MIPS_R21, +	KVM_REG_MIPS_R22, +	KVM_REG_MIPS_R23, +	KVM_REG_MIPS_R24, +	KVM_REG_MIPS_R25, +	KVM_REG_MIPS_R26, +	KVM_REG_MIPS_R27, +	KVM_REG_MIPS_R28, +	KVM_REG_MIPS_R29, +	KVM_REG_MIPS_R30, +	KVM_REG_MIPS_R31, + +	KVM_REG_MIPS_HI, +	KVM_REG_MIPS_LO, +	KVM_REG_MIPS_PC, + +	KVM_REG_MIPS_CP0_INDEX, +	KVM_REG_MIPS_CP0_CONTEXT, +	KVM_REG_MIPS_CP0_PAGEMASK, +	KVM_REG_MIPS_CP0_WIRED, +	KVM_REG_MIPS_CP0_BADVADDR, +	KVM_REG_MIPS_CP0_ENTRYHI, +	KVM_REG_MIPS_CP0_STATUS, +	KVM_REG_MIPS_CP0_CAUSE, +	/* EPC set via kvm_regs, et al. */ +	KVM_REG_MIPS_CP0_CONFIG, +	KVM_REG_MIPS_CP0_CONFIG1, +	KVM_REG_MIPS_CP0_CONFIG2, +	KVM_REG_MIPS_CP0_CONFIG3, +	KVM_REG_MIPS_CP0_CONFIG7, +	KVM_REG_MIPS_CP0_ERROREPC +}; + +static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, +			    const struct kvm_one_reg *reg) +{ +	u64 __user *uaddr = (u64 __user *)(long)reg->addr; + +	struct mips_coproc *cop0 = vcpu->arch.cop0; +	s64 v; + +	switch (reg->id) { +	case KVM_REG_MIPS_R0 ... KVM_REG_MIPS_R31: +		v = (long)vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0]; +		break; +	case KVM_REG_MIPS_HI: +		v = (long)vcpu->arch.hi; +		break; +	case KVM_REG_MIPS_LO: +		v = (long)vcpu->arch.lo; +		break; +	case KVM_REG_MIPS_PC: +		v = (long)vcpu->arch.pc; +		break; + +	case KVM_REG_MIPS_CP0_INDEX: +		v = (long)kvm_read_c0_guest_index(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONTEXT: +		v = (long)kvm_read_c0_guest_context(cop0); +		break; +	case KVM_REG_MIPS_CP0_PAGEMASK: +		v = (long)kvm_read_c0_guest_pagemask(cop0); +		break; +	case KVM_REG_MIPS_CP0_WIRED: +		v = (long)kvm_read_c0_guest_wired(cop0); +		break; +	case KVM_REG_MIPS_CP0_BADVADDR: +		v = (long)kvm_read_c0_guest_badvaddr(cop0); +		break; +	case KVM_REG_MIPS_CP0_ENTRYHI: +		v = (long)kvm_read_c0_guest_entryhi(cop0); +		break; +	case KVM_REG_MIPS_CP0_STATUS: +		v = (long)kvm_read_c0_guest_status(cop0); +		break; +	case KVM_REG_MIPS_CP0_CAUSE: +		v = (long)kvm_read_c0_guest_cause(cop0); +		break; +	case KVM_REG_MIPS_CP0_ERROREPC: +		v = (long)kvm_read_c0_guest_errorepc(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONFIG: +		v = (long)kvm_read_c0_guest_config(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONFIG1: +		v = (long)kvm_read_c0_guest_config1(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONFIG2: +		v = (long)kvm_read_c0_guest_config2(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONFIG3: +		v = (long)kvm_read_c0_guest_config3(cop0); +		break; +	case KVM_REG_MIPS_CP0_CONFIG7: +		v = (long)kvm_read_c0_guest_config7(cop0); +		break; +	default: +		return -EINVAL; +	} +	return put_user(v, uaddr); +} + +static int kvm_mips_set_reg(struct kvm_vcpu *vcpu, +			    const struct kvm_one_reg *reg) +{ +	u64 __user *uaddr = (u64 __user *)(long)reg->addr; +	struct mips_coproc *cop0 = vcpu->arch.cop0; +	u64 v; + +	if (get_user(v, uaddr) != 0) +		return -EFAULT; + +	switch (reg->id) { +	case KVM_REG_MIPS_R0: +		/* Silently ignore requests to set $0 */ +		break; +	case KVM_REG_MIPS_R1 ... KVM_REG_MIPS_R31: +		vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0] = v; +		break; +	case KVM_REG_MIPS_HI: +		vcpu->arch.hi = v; +		break; +	case KVM_REG_MIPS_LO: +		vcpu->arch.lo = v; +		break; +	case KVM_REG_MIPS_PC: +		vcpu->arch.pc = v; +		break; + +	case KVM_REG_MIPS_CP0_INDEX: +		kvm_write_c0_guest_index(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_CONTEXT: +		kvm_write_c0_guest_context(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_PAGEMASK: +		kvm_write_c0_guest_pagemask(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_WIRED: +		kvm_write_c0_guest_wired(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_BADVADDR: +		kvm_write_c0_guest_badvaddr(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_ENTRYHI: +		kvm_write_c0_guest_entryhi(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_STATUS: +		kvm_write_c0_guest_status(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_CAUSE: +		kvm_write_c0_guest_cause(cop0, v); +		break; +	case KVM_REG_MIPS_CP0_ERROREPC: +		kvm_write_c0_guest_errorepc(cop0, v); +		break; +	default: +		return -EINVAL; +	} +	return 0;  }  long @@ -491,9 +700,38 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)  	struct kvm_vcpu *vcpu = filp->private_data;  	void __user *argp = (void __user *)arg;  	long r; -	int intr;  	switch (ioctl) { +	case KVM_SET_ONE_REG: +	case KVM_GET_ONE_REG: { +		struct kvm_one_reg reg; +		if (copy_from_user(®, argp, sizeof(reg))) +			return -EFAULT; +		if (ioctl == KVM_SET_ONE_REG) +			return kvm_mips_set_reg(vcpu, ®); +		else +			return kvm_mips_get_reg(vcpu, ®); +	} +	case KVM_GET_REG_LIST: { +		struct kvm_reg_list __user *user_list = argp; +		u64 __user *reg_dest; +		struct kvm_reg_list reg_list; +		unsigned n; + +		if (copy_from_user(®_list, user_list, sizeof(reg_list))) +			return -EFAULT; +		n = reg_list.n; +		reg_list.n = ARRAY_SIZE(kvm_mips_get_one_regs); +		if (copy_to_user(user_list, ®_list, sizeof(reg_list))) +			return -EFAULT; +		if (n < reg_list.n) +			return -E2BIG; +		reg_dest = user_list->reg; +		if (copy_to_user(reg_dest, kvm_mips_get_one_regs, +				 sizeof(kvm_mips_get_one_regs))) +			return -EFAULT; +		return 0; +	}  	case KVM_NMI:  		/* Treat the NMI as a CPU reset */  		r = kvm_mips_reset_vcpu(vcpu); @@ -505,8 +743,6 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)  			if (copy_from_user(&irq, argp, sizeof(irq)))  				goto out; -			intr = (int)irq.irq; -  			kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__,  				  irq.irq); @@ -514,7 +750,7 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)  			break;  		}  	default: -		r = -EINVAL; +		r = -ENOIOCTLCMD;  	}  out: @@ -565,7 +801,7 @@ long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)  	switch (ioctl) {  	default: -		r = -EINVAL; +		r = -ENOIOCTLCMD;  	}  	return r; @@ -593,13 +829,13 @@ void kvm_arch_exit(void)  int  kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)  { -	return -ENOTSUPP; +	return -ENOIOCTLCMD;  }  int  kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)  { -	return -ENOTSUPP; +	return -ENOIOCTLCMD;  }  int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) @@ -609,12 +845,12 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)  int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)  { -	return -ENOTSUPP; +	return -ENOIOCTLCMD;  }  int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)  { -	return -ENOTSUPP; +	return -ENOIOCTLCMD;  }  int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) @@ -627,6 +863,9 @@ int kvm_dev_ioctl_check_extension(long ext)  	int r;  	switch (ext) { +	case KVM_CAP_ONE_REG: +		r = 1; +		break;  	case KVM_CAP_COALESCED_MMIO:  		r = KVM_COALESCED_MMIO_PAGE_OFFSET;  		break; @@ -635,7 +874,6 @@ int kvm_dev_ioctl_check_extension(long ext)  		break;  	}  	return r; -  }  int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) @@ -677,28 +915,28 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)  {  	int i; -	for (i = 0; i < 32; i++) -		vcpu->arch.gprs[i] = regs->gprs[i]; - +	for (i = 1; i < ARRAY_SIZE(vcpu->arch.gprs); i++) +		vcpu->arch.gprs[i] = regs->gpr[i]; +	vcpu->arch.gprs[0] = 0; /* zero is special, and cannot be set. */  	vcpu->arch.hi = regs->hi;  	vcpu->arch.lo = regs->lo;  	vcpu->arch.pc = regs->pc; -	return kvm_mips_callbacks->vcpu_ioctl_set_regs(vcpu, regs); +	return 0;  }  int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)  {  	int i; -	for (i = 0; i < 32; i++) -		regs->gprs[i] = vcpu->arch.gprs[i]; +	for (i = 0; i < ARRAY_SIZE(vcpu->arch.gprs); i++) +		regs->gpr[i] = vcpu->arch.gprs[i];  	regs->hi = vcpu->arch.hi;  	regs->lo = vcpu->arch.lo;  	regs->pc = vcpu->arch.pc; -	return kvm_mips_callbacks->vcpu_ioctl_get_regs(vcpu, regs); +	return 0;  }  void kvm_mips_comparecount_func(unsigned long data) diff --git a/arch/mips/kvm/kvm_trap_emul.c b/arch/mips/kvm/kvm_trap_emul.c index 466aeef044b..30d725321db 100644 --- a/arch/mips/kvm/kvm_trap_emul.c +++ b/arch/mips/kvm/kvm_trap_emul.c @@ -345,54 +345,6 @@ static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu)  	return ret;  } -static int -kvm_trap_emul_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) -{ -	struct mips_coproc *cop0 = vcpu->arch.cop0; - -	kvm_write_c0_guest_index(cop0, regs->cp0reg[MIPS_CP0_TLB_INDEX][0]); -	kvm_write_c0_guest_context(cop0, regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0]); -	kvm_write_c0_guest_badvaddr(cop0, regs->cp0reg[MIPS_CP0_BAD_VADDR][0]); -	kvm_write_c0_guest_entryhi(cop0, regs->cp0reg[MIPS_CP0_TLB_HI][0]); -	kvm_write_c0_guest_epc(cop0, regs->cp0reg[MIPS_CP0_EXC_PC][0]); - -	kvm_write_c0_guest_status(cop0, regs->cp0reg[MIPS_CP0_STATUS][0]); -	kvm_write_c0_guest_cause(cop0, regs->cp0reg[MIPS_CP0_CAUSE][0]); -	kvm_write_c0_guest_pagemask(cop0, -				    regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0]); -	kvm_write_c0_guest_wired(cop0, regs->cp0reg[MIPS_CP0_TLB_WIRED][0]); -	kvm_write_c0_guest_errorepc(cop0, regs->cp0reg[MIPS_CP0_ERROR_PC][0]); - -	return 0; -} - -static int -kvm_trap_emul_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) -{ -	struct mips_coproc *cop0 = vcpu->arch.cop0; - -	regs->cp0reg[MIPS_CP0_TLB_INDEX][0] = kvm_read_c0_guest_index(cop0); -	regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0] = kvm_read_c0_guest_context(cop0); -	regs->cp0reg[MIPS_CP0_BAD_VADDR][0] = kvm_read_c0_guest_badvaddr(cop0); -	regs->cp0reg[MIPS_CP0_TLB_HI][0] = kvm_read_c0_guest_entryhi(cop0); -	regs->cp0reg[MIPS_CP0_EXC_PC][0] = kvm_read_c0_guest_epc(cop0); - -	regs->cp0reg[MIPS_CP0_STATUS][0] = kvm_read_c0_guest_status(cop0); -	regs->cp0reg[MIPS_CP0_CAUSE][0] = kvm_read_c0_guest_cause(cop0); -	regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0] = -	    kvm_read_c0_guest_pagemask(cop0); -	regs->cp0reg[MIPS_CP0_TLB_WIRED][0] = kvm_read_c0_guest_wired(cop0); -	regs->cp0reg[MIPS_CP0_ERROR_PC][0] = kvm_read_c0_guest_errorepc(cop0); - -	regs->cp0reg[MIPS_CP0_CONFIG][0] = kvm_read_c0_guest_config(cop0); -	regs->cp0reg[MIPS_CP0_CONFIG][1] = kvm_read_c0_guest_config1(cop0); -	regs->cp0reg[MIPS_CP0_CONFIG][2] = kvm_read_c0_guest_config2(cop0); -	regs->cp0reg[MIPS_CP0_CONFIG][3] = kvm_read_c0_guest_config3(cop0); -	regs->cp0reg[MIPS_CP0_CONFIG][7] = kvm_read_c0_guest_config7(cop0); - -	return 0; -} -  static int kvm_trap_emul_vm_init(struct kvm *kvm)  {  	return 0; @@ -471,8 +423,6 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = {  	.dequeue_io_int = kvm_mips_dequeue_io_int_cb,  	.irq_deliver = kvm_mips_irq_deliver_cb,  	.irq_clear = kvm_mips_irq_clear_cb, -	.vcpu_ioctl_get_regs = kvm_trap_emul_ioctl_get_regs, -	.vcpu_ioctl_set_regs = kvm_trap_emul_ioctl_set_regs,  };  int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks) diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index ce9818eef7d..afeef93f81a 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c @@ -301,10 +301,6 @@ static u32 tlb_handler[128] __cpuinitdata;  static struct uasm_label labels[128] __cpuinitdata;  static struct uasm_reloc relocs[128] __cpuinitdata; -#ifdef CONFIG_64BIT -static int check_for_high_segbits __cpuinitdata; -#endif -  static int check_for_high_segbits __cpuinitdata;  static unsigned int kscratch_used_mask __cpuinitdata; diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c index fb1569580de..6b5f3406f41 100644 --- a/arch/mips/ralink/of.c +++ b/arch/mips/ralink/of.c @@ -88,7 +88,7 @@ void __init plat_mem_setup(void)  	__dt_setup_arch(&__dtb_start);  	if (soc_info.mem_size) -		add_memory_region(soc_info.mem_base, soc_info.mem_size, +		add_memory_region(soc_info.mem_base, soc_info.mem_size * SZ_1M,  				  BOOT_MEM_RAM);  	else  		detect_memory_region(soc_info.mem_base, diff --git a/arch/mn10300/include/asm/pci.h b/arch/mn10300/include/asm/pci.h index 8137c25c4e1..6f31cc0f1a8 100644 --- a/arch/mn10300/include/asm/pci.h +++ b/arch/mn10300/include/asm/pci.h @@ -103,4 +103,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  	return channel ? 15 : 14;  } +#include <asm-generic/pci_iomap.h> +  #endif /* _ASM_PCI_H */ diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S index 68fcab8f8f6..222152a3f75 100644 --- a/arch/mn10300/kernel/entry.S +++ b/arch/mn10300/kernel/entry.S @@ -60,6 +60,7 @@ ENTRY(ret_from_kernel_thread)  	mov	(REG_D0,fp),d0  	mov	(REG_A0,fp),a0  	calls	(a0) +	GET_THREAD_INFO a2		# A2 must be set on return from sys_exit()  	clr	d0  	mov	d0,(REG_D0,fp)  	jmp	syscall_exit @@ -107,10 +108,10 @@ syscall_exit_work:  	and	EPSW_nSL,d0  	beq	resume_kernel		# returning to supervisor mode -	btst	_TIF_SYSCALL_TRACE,d2 -	beq	work_pending  	LOCAL_IRQ_ENABLE		# could let syscall_trace_exit() call  					# schedule() instead +	btst	_TIF_SYSCALL_TRACE,d2 +	beq	work_pending  	mov	fp,d0  	call	syscall_trace_exit[],0	# do_syscall_trace(regs)  	jmp	resume_userspace @@ -123,6 +124,7 @@ work_pending:  work_resched:  	call	schedule[],0 +resume_userspace:  	# make sure we don't miss an interrupt setting need_resched or  	# sigpending between sampling and the rti  	LOCAL_IRQ_DISABLE @@ -131,6 +133,8 @@ work_resched:  	mov	(TI_flags,a2),d2  	btst	_TIF_WORK_MASK,d2  	beq	restore_all + +	LOCAL_IRQ_ENABLE  	btst	_TIF_NEED_RESCHED,d2  	bne	work_resched @@ -169,17 +173,6 @@ ret_from_intr:  	and	EPSW_nSL,d0  	beq	resume_kernel		# returning to supervisor mode -ENTRY(resume_userspace) -	# make sure we don't miss an interrupt setting need_resched or -	# sigpending between sampling and the rti -	LOCAL_IRQ_DISABLE - -	# is there any work to be done on int/exception return? -	mov	(TI_flags,a2),d2 -	btst	_TIF_WORK_MASK,d2 -	bne	work_pending -	jmp	restore_all -  #ifdef CONFIG_PREEMPT  ENTRY(resume_kernel)  	LOCAL_IRQ_DISABLE diff --git a/arch/mn10300/unit-asb2305/pci.c b/arch/mn10300/unit-asb2305/pci.c index 1adcf024bb9..e37fac0461f 100644 --- a/arch/mn10300/unit-asb2305/pci.c +++ b/arch/mn10300/unit-asb2305/pci.c @@ -19,6 +19,7 @@  #include <linux/delay.h>  #include <linux/irq.h>  #include <asm/io.h> +#include <asm/irq.h>  #include "pci-asb2305.h"  unsigned int pci_probe = 1; diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile index 197690068f8..96ec3982be8 100644 --- a/arch/parisc/Makefile +++ b/arch/parisc/Makefile @@ -66,7 +66,7 @@ KBUILD_CFLAGS_KERNEL += -mlong-calls  endif  # select which processor to optimise for -cflags-$(CONFIG_PA7100)		+= -march=1.1 -mschedule=7100 +cflags-$(CONFIG_PA7000)		+= -march=1.1 -mschedule=7100  cflags-$(CONFIG_PA7200)		+= -march=1.1 -mschedule=7200  cflags-$(CONFIG_PA7100LC)	+= -march=1.1 -mschedule=7100LC  cflags-$(CONFIG_PA7300LC)	+= -march=1.1 -mschedule=7300 diff --git a/arch/parisc/include/asm/mmzone.h b/arch/parisc/include/asm/mmzone.h index 0e625ab9aae..cc50d33b7b8 100644 --- a/arch/parisc/include/asm/mmzone.h +++ b/arch/parisc/include/asm/mmzone.h @@ -39,17 +39,14 @@ extern unsigned char pfnnid_map[PFNNID_MAP_MAX];  static inline int pfn_to_nid(unsigned long pfn)  {  	unsigned int i; -	unsigned char r;  	if (unlikely(pfn_is_io(pfn)))  		return 0;  	i = pfn >> PFNNID_SHIFT;  	BUG_ON(i >= ARRAY_SIZE(pfnnid_map)); -	r = pfnnid_map[i]; -	BUG_ON(r == 0xff); -	return (int)r; +	return (int)pfnnid_map[i];  }  static inline int pfn_valid(int pfn) diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 5709c5e59be..14285caec71 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c @@ -394,7 +394,7 @@ EXPORT_SYMBOL(print_pci_hwpath);  static void setup_bus_id(struct parisc_device *padev)  {  	struct hardware_path path; -	char name[20]; +	char name[28];  	char *output = name;  	int i; diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c index 76b63e726a5..1e95b2000ce 100644 --- a/arch/parisc/kernel/setup.c +++ b/arch/parisc/kernel/setup.c @@ -69,7 +69,8 @@ void __init setup_cmdline(char **cmdline_p)  		/* called from hpux boot loader */  		boot_command_line[0] = '\0';  	} else { -		strcpy(boot_command_line, (char *)__va(boot_args[1])); +		strlcpy(boot_command_line, (char *)__va(boot_args[1]), +			COMMAND_LINE_SIZE);  #ifdef CONFIG_BLK_DEV_INITRD  		if (boot_args[2] != 0) /* did palo pass us a ramdisk? */ diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index cf4df8e2139..0c7f2bfcf13 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h @@ -264,6 +264,7 @@  #define H_GET_MPP		0x2D4  #define H_HOME_NODE_ASSOCIATIVITY 0x2EC  #define H_BEST_ENERGY		0x2F4 +#define H_XIRR_X		0x2FC  #define H_RANDOM		0x300  #define H_COP			0x304  #define H_GET_MPP_X		0x314 diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index cea8496091f..2f1b6c5f817 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -523,6 +523,17 @@ END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,946)  #define PPC440EP_ERR42  #endif +/* The following stops all load and store data streams associated with stream + * ID (ie. streams created explicitly).  The embedded and server mnemonics for + * dcbt are different so we use machine "power4" here explicitly. + */ +#define DCBT_STOP_ALL_STREAM_IDS(scratch)	\ +.machine push ;					\ +.machine "power4" ;				\ +       lis     scratch,0x60000000@h;		\ +       dcbt    r0,scratch,0b01010;		\ +.machine pop +  /*   * toreal/fromreal/tophys/tovirt macros. 32-bit BookE makes them   * keep the address intact to be compatible with code shared with diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 594db6bc093..14a65836369 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h @@ -409,21 +409,16 @@ static inline void prefetchw(const void *x)  #endif  #ifdef CONFIG_PPC64 -static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32) +static inline unsigned long get_clean_sp(unsigned long sp, int is_32)  { -	unsigned long sp; -  	if (is_32) -		sp = regs->gpr[1] & 0x0ffffffffUL; -	else -		sp = regs->gpr[1]; - +		return sp & 0x0ffffffffUL;  	return sp;  }  #else -static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32) +static inline unsigned long get_clean_sp(unsigned long sp, int is_32)  { -	return regs->gpr[1]; +	return sp;  }  #endif diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index a6136515c7f..4a9e408644f 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h @@ -111,17 +111,6 @@  #define MSR_TM_TRANSACTIONAL(x)	(((x) & MSR_TS_MASK) == MSR_TS_T)  #define MSR_TM_SUSPENDED(x)	(((x) & MSR_TS_MASK) == MSR_TS_S) -/* Reason codes describing kernel causes for transaction aborts.  By -   convention, bit0 is copied to TEXASR[56] (IBM bit 7) which is set if -   the failure is persistent. -*/ -#define TM_CAUSE_RESCHED	0xfe -#define TM_CAUSE_TLBI		0xfc -#define TM_CAUSE_FAC_UNAV	0xfa -#define TM_CAUSE_SYSCALL	0xf9 /* Persistent */ -#define TM_CAUSE_MISC		0xf6 -#define TM_CAUSE_SIGNAL		0xf4 -  #if defined(CONFIG_PPC_BOOK3S_64)  #define MSR_64BIT	MSR_SF diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h index fbe66c46389..9322c28aebd 100644 --- a/arch/powerpc/include/asm/signal.h +++ b/arch/powerpc/include/asm/signal.h @@ -3,5 +3,8 @@  #define __ARCH_HAS_SA_RESTORER  #include <uapi/asm/signal.h> +#include <uapi/asm/ptrace.h> + +extern unsigned long get_tm_stackpointer(struct pt_regs *regs);  #endif /* _ASM_POWERPC_SIGNAL_H */ diff --git a/arch/powerpc/include/asm/tm.h b/arch/powerpc/include/asm/tm.h index 4b4449abf3f..9dfbc34bdbf 100644 --- a/arch/powerpc/include/asm/tm.h +++ b/arch/powerpc/include/asm/tm.h @@ -5,6 +5,8 @@   * Copyright 2012 Matt Evans & Michael Neuling, IBM Corporation.   */ +#include <uapi/asm/tm.h> +  #ifdef CONFIG_PPC_TRANSACTIONAL_MEM  extern void do_load_up_transact_fpu(struct thread_struct *thread);  extern void do_load_up_transact_altivec(struct thread_struct *thread); diff --git a/arch/powerpc/include/uapi/asm/Kbuild b/arch/powerpc/include/uapi/asm/Kbuild index f7bca637074..5182c8622b5 100644 --- a/arch/powerpc/include/uapi/asm/Kbuild +++ b/arch/powerpc/include/uapi/asm/Kbuild @@ -40,6 +40,7 @@ header-y += statfs.h  header-y += swab.h  header-y += termbits.h  header-y += termios.h +header-y += tm.h  header-y += types.h  header-y += ucontext.h  header-y += unistd.h diff --git a/arch/powerpc/include/uapi/asm/tm.h b/arch/powerpc/include/uapi/asm/tm.h new file mode 100644 index 00000000000..85059a00f56 --- /dev/null +++ b/arch/powerpc/include/uapi/asm/tm.h @@ -0,0 +1,18 @@ +#ifndef _ASM_POWERPC_TM_H +#define _ASM_POWERPC_TM_H + +/* Reason codes describing kernel causes for transaction aborts.  By + * convention, bit0 is copied to TEXASR[56] (IBM bit 7) which is set if + * the failure is persistent.  PAPR saves 0xff-0xe0 for the hypervisor. + */ +#define TM_CAUSE_PERSISTENT	0x01 +#define TM_CAUSE_RESCHED	0xde +#define TM_CAUSE_TLBI		0xdc +#define TM_CAUSE_FAC_UNAV	0xda +#define TM_CAUSE_SYSCALL	0xd8  /* future use */ +#define TM_CAUSE_MISC		0xd6  /* future use */ +#define TM_CAUSE_SIGNAL		0xd4 +#define TM_CAUSE_ALIGNMENT	0xd2 +#define TM_CAUSE_EMULATE	0xd0 + +#endif diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index c60bbec25c1..1f0937d7d4b 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -453,7 +453,7 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.icache_bsize		= 128,  		.dcache_bsize		= 128,  		.oprofile_type		= PPC_OPROFILE_POWER4, -		.oprofile_cpu_type	= "ppc64/ibm-compat-v1", +		.oprofile_cpu_type	= 0,  		.cpu_setup		= __setup_cpu_power8,  		.cpu_restore		= __restore_cpu_power8,  		.platform		= "power8", @@ -482,7 +482,7 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.cpu_name		= "POWER7+ (raw)",  		.cpu_features		= CPU_FTRS_POWER7,  		.cpu_user_features	= COMMON_USER_POWER7, -		.cpu_user_features	= COMMON_USER2_POWER7, +		.cpu_user_features2	= COMMON_USER2_POWER7,  		.mmu_features		= MMU_FTRS_POWER7,  		.icache_bsize		= 128,  		.dcache_bsize		= 128, @@ -506,7 +506,7 @@ static struct cpu_spec __initdata cpu_specs[] = {  		.dcache_bsize		= 128,  		.num_pmcs		= 6,  		.pmc_type		= PPC_PMC_IBM, -		.oprofile_cpu_type	= "ppc64/power8", +		.oprofile_cpu_type	= 0,  		.oprofile_type		= PPC_OPROFILE_POWER4,  		.cpu_setup		= __setup_cpu_power8,  		.cpu_restore		= __restore_cpu_power8, diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index d22e73e4618..22b45a4955c 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -849,7 +849,7 @@ resume_kernel:  	/* check current_thread_info, _TIF_EMULATE_STACK_STORE */  	CURRENT_THREAD_INFO(r9, r1)  	lwz	r8,TI_FLAGS(r9) -	andis.	r8,r8,_TIF_EMULATE_STACK_STORE@h +	andis.	r0,r8,_TIF_EMULATE_STACK_STORE@h  	beq+	1f  	addi	r8,r1,INT_FRAME_SIZE	/* Get the kprobed function entry */ diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 0e9095e47b5..246b11c4fe7 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -501,6 +501,13 @@ BEGIN_FTR_SECTION  	ldarx	r6,0,r1  END_FTR_SECTION_IFSET(CPU_FTR_STCX_CHECKS_ADDRESS) +#ifdef CONFIG_PPC_BOOK3S +/* Cancel all explict user streams as they will have no use after context + * switch and will stop the HW from creating streams itself + */ +	DCBT_STOP_ALL_STREAM_IDS(r6) +#endif +  	addi	r6,r4,-THREAD	/* Convert THREAD to 'current' */  	std	r6,PACACURRENT(r13)	/* Set new 'current' */ diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index e9acf50dd5b..7f2273cc3c7 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -657,15 +657,6 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,   *     ranges. However, some machines (thanks Apple !) tend to split their   *     space into lots of small contiguous ranges. So we have to coalesce.   * - *   - We can only cope with all memory ranges having the same offset - *     between CPU addresses and PCI addresses. Unfortunately, some bridges - *     are setup for a large 1:1 mapping along with a small "window" which - *     maps PCI address 0 to some arbitrary high address of the CPU space in - *     order to give access to the ISA memory hole. - *     The way out of here that I've chosen for now is to always set the - *     offset based on the first resource found, then override it if we - *     have a different offset and the previous was set by an ISA hole. - *   *   - Some busses have IO space not starting at 0, which causes trouble with   *     the way we do our IO resource renumbering. The code somewhat deals with   *     it for 64 bits but I would expect problems on 32 bits. @@ -680,10 +671,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,  	int rlen;  	int pna = of_n_addr_cells(dev);  	int np = pna + 5; -	int memno = 0, isa_hole = -1; +	int memno = 0;  	u32 pci_space;  	unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size; -	unsigned long long isa_mb = 0;  	struct resource *res;  	printk(KERN_INFO "PCI host bridge %s %s ranges:\n", @@ -777,8 +767,6 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,  			}  			/* Handles ISA memory hole space here */  			if (pci_addr == 0) { -				isa_mb = cpu_addr; -				isa_hole = memno;  				if (primary || isa_mem_base == 0)  					isa_mem_base = cpu_addr;  				hose->isa_mem_phys = cpu_addr; diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 577a8aa69c6..457e97aa294 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c @@ -18,6 +18,7 @@  #include <asm/uaccess.h>  #include <asm/unistd.h>  #include <asm/debug.h> +#include <asm/tm.h>  #include "signal.h" @@ -30,13 +31,13 @@ int show_unhandled_signals = 1;  /*   * Allocate space for the signal frame   */ -void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, +void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp,  			   size_t frame_size, int is_32)  {          unsigned long oldsp, newsp;          /* Default to using normal stack */ -        oldsp = get_clean_sp(regs, is_32); +        oldsp = get_clean_sp(sp, is_32);  	/* Check for alt stack */  	if ((ka->sa.sa_flags & SA_ONSTACK) && @@ -175,3 +176,38 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)  	user_enter();  } + +unsigned long get_tm_stackpointer(struct pt_regs *regs) +{ +	/* When in an active transaction that takes a signal, we need to be +	 * careful with the stack.  It's possible that the stack has moved back +	 * up after the tbegin.  The obvious case here is when the tbegin is +	 * called inside a function that returns before a tend.  In this case, +	 * the stack is part of the checkpointed transactional memory state. +	 * If we write over this non transactionally or in suspend, we are in +	 * trouble because if we get a tm abort, the program counter and stack +	 * pointer will be back at the tbegin but our in memory stack won't be +	 * valid anymore. +	 * +	 * To avoid this, when taking a signal in an active transaction, we +	 * need to use the stack pointer from the checkpointed state, rather +	 * than the speculated state.  This ensures that the signal context +	 * (written tm suspended) will be written below the stack required for +	 * the rollback.  The transaction is aborted becuase of the treclaim, +	 * so any memory written between the tbegin and the signal will be +	 * rolled back anyway. +	 * +	 * For signals taken in non-TM or suspended mode, we use the +	 * normal/non-checkpointed stack pointer. +	 */ + +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +	if (MSR_TM_ACTIVE(regs->msr)) { +		tm_enable(); +		tm_reclaim(¤t->thread, regs->msr, TM_CAUSE_SIGNAL); +		if (MSR_TM_TRANSACTIONAL(regs->msr)) +			return current->thread.ckpt_regs.gpr[1]; +	} +#endif +	return regs->gpr[1]; +} diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h index ec84c901cea..c69b9aeb9f2 100644 --- a/arch/powerpc/kernel/signal.h +++ b/arch/powerpc/kernel/signal.h @@ -12,7 +12,7 @@  extern void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags); -extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, +extern void __user * get_sigframe(struct k_sigaction *ka, unsigned long sp,  				  size_t frame_size, int is_32);  extern int handle_signal32(unsigned long sig, struct k_sigaction *ka, diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index 95068bf569a..201385c3a1a 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c @@ -503,12 +503,6 @@ static int save_tm_user_regs(struct pt_regs *regs,  {  	unsigned long msr = regs->msr; -	/* tm_reclaim rolls back all reg states, updating thread.ckpt_regs, -	 * thread.transact_fpr[], thread.transact_vr[], etc. -	 */ -	tm_enable(); -	tm_reclaim(¤t->thread, msr, TM_CAUSE_SIGNAL); -  	/* Make sure floating point registers are stored in regs */  	flush_fp_to_thread(current); @@ -965,7 +959,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,  	/* Set up Signal Frame */  	/* Put a Real Time Context onto stack */ -	rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf), 1); +	rt_sf = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1);  	addr = rt_sf;  	if (unlikely(rt_sf == NULL))  		goto badframe; @@ -1403,7 +1397,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka,  	unsigned long tramp;  	/* Set up Signal Frame */ -	frame = get_sigframe(ka, regs, sizeof(*frame), 1); +	frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 1);  	if (unlikely(frame == NULL))  		goto badframe;  	sc = (struct sigcontext __user *) &frame->sctx; diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index c1794286098..345947367ec 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c @@ -154,11 +154,12 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,   * As above, but Transactional Memory is in use, so deliver sigcontexts   * containing checkpointed and transactional register states.   * - * To do this, we treclaim to gather both sets of registers and set up the - * 'normal' sigcontext registers with rolled-back register values such that a - * simple signal handler sees a correct checkpointed register state. - * If interested, a TM-aware sighandler can examine the transactional registers - * in the 2nd sigcontext to determine the real origin of the signal. + * To do this, we treclaim (done before entering here) to gather both sets of + * registers and set up the 'normal' sigcontext registers with rolled-back + * register values such that a simple signal handler sees a correct + * checkpointed register state.  If interested, a TM-aware sighandler can + * examine the transactional registers in the 2nd sigcontext to determine the + * real origin of the signal.   */  static long setup_tm_sigcontexts(struct sigcontext __user *sc,  				 struct sigcontext __user *tm_sc, @@ -184,16 +185,6 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc,  	BUG_ON(!MSR_TM_ACTIVE(regs->msr)); -	/* tm_reclaim rolls back all reg states, saving checkpointed (older) -	 * GPRs to thread.ckpt_regs and (if used) FPRs to (newer) -	 * thread.transact_fp and/or VRs to (newer) thread.transact_vr. -	 * THEN we save out FP/VRs, if necessary, to the checkpointed (older) -	 * thread.fr[]/vr[]s.  The transactional (newer) GPRs are on the -	 * stack, in *regs. -	 */ -	tm_enable(); -	tm_reclaim(¤t->thread, msr, TM_CAUSE_SIGNAL); -  	flush_fp_to_thread(current);  #ifdef CONFIG_ALTIVEC @@ -711,7 +702,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,  	unsigned long newsp = 0;  	long err = 0; -	frame = get_sigframe(ka, regs, sizeof(*frame), 0); +	frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 0);  	if (unlikely(frame == NULL))  		goto badframe; diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index a7a648f6b75..f18c79c324e 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -53,6 +53,7 @@  #ifdef CONFIG_PPC64  #include <asm/firmware.h>  #include <asm/processor.h> +#include <asm/tm.h>  #endif  #include <asm/kexec.h>  #include <asm/ppc-opcode.h> @@ -932,6 +933,28 @@ static int emulate_isel(struct pt_regs *regs, u32 instword)  	return 0;  } +#ifdef CONFIG_PPC_TRANSACTIONAL_MEM +static inline bool tm_abort_check(struct pt_regs *regs, int cause) +{ +        /* If we're emulating a load/store in an active transaction, we cannot +         * emulate it as the kernel operates in transaction suspended context. +         * We need to abort the transaction.  This creates a persistent TM +         * abort so tell the user what caused it with a new code. +	 */ +	if (MSR_TM_TRANSACTIONAL(regs->msr)) { +		tm_enable(); +		tm_abort(cause); +		return true; +	} +	return false; +} +#else +static inline bool tm_abort_check(struct pt_regs *regs, int reason) +{ +	return false; +} +#endif +  static int emulate_instruction(struct pt_regs *regs)  {  	u32 instword; @@ -971,6 +994,9 @@ static int emulate_instruction(struct pt_regs *regs)  	/* Emulate load/store string insn. */  	if ((instword & PPC_INST_STRING_GEN_MASK) == PPC_INST_STRING) { +		if (tm_abort_check(regs, +				   TM_CAUSE_EMULATE | TM_CAUSE_PERSISTENT)) +			return -EINVAL;  		PPC_WARN_EMULATED(string, regs);  		return emulate_string_inst(regs, instword);  	} @@ -1148,6 +1174,9 @@ void alignment_exception(struct pt_regs *regs)  	if (!arch_irq_disabled_regs(regs))  		local_irq_enable(); +	if (tm_abort_check(regs, TM_CAUSE_ALIGNMENT | TM_CAUSE_PERSISTENT)) +		goto bail; +  	/* we don't implement logging of alignment exceptions */  	if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS))  		fixed = fix_alignment(regs); diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c index 9de24f8e03c..550f5928b39 100644 --- a/arch/powerpc/kvm/book3s_hv.c +++ b/arch/powerpc/kvm/book3s_hv.c @@ -562,6 +562,8 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)  	case H_CPPR:  	case H_EOI:  	case H_IPI: +	case H_IPOLL: +	case H_XIRR_X:  		if (kvmppc_xics_enabled(vcpu)) {  			ret = kvmppc_xics_hcall(vcpu, req);  			break; diff --git a/arch/powerpc/kvm/book3s_pr_papr.c b/arch/powerpc/kvm/book3s_pr_papr.c index b24309c6c2d..da0e0bc268b 100644 --- a/arch/powerpc/kvm/book3s_pr_papr.c +++ b/arch/powerpc/kvm/book3s_pr_papr.c @@ -257,6 +257,8 @@ int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long cmd)  	case H_CPPR:  	case H_EOI:  	case H_IPI: +	case H_IPOLL: +	case H_XIRR_X:  		if (kvmppc_xics_enabled(vcpu))  			return kvmppc_h_pr_xics_hcall(vcpu, cmd);  		break; diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c index f7a10375661..94c1dd46b83 100644 --- a/arch/powerpc/kvm/book3s_xics.c +++ b/arch/powerpc/kvm/book3s_xics.c @@ -650,6 +650,23 @@ static noinline int kvmppc_h_ipi(struct kvm_vcpu *vcpu, unsigned long server,  	return H_SUCCESS;  } +static int kvmppc_h_ipoll(struct kvm_vcpu *vcpu, unsigned long server) +{ +	union kvmppc_icp_state state; +	struct kvmppc_icp *icp; + +	icp = vcpu->arch.icp; +	if (icp->server_num != server) { +		icp = kvmppc_xics_find_server(vcpu->kvm, server); +		if (!icp) +			return H_PARAMETER; +	} +	state = ACCESS_ONCE(icp->state); +	kvmppc_set_gpr(vcpu, 4, ((u32)state.cppr << 24) | state.xisr); +	kvmppc_set_gpr(vcpu, 5, state.mfrr); +	return H_SUCCESS; +} +  static noinline void kvmppc_h_cppr(struct kvm_vcpu *vcpu, unsigned long cppr)  {  	union kvmppc_icp_state old_state, new_state; @@ -787,6 +804,18 @@ int kvmppc_xics_hcall(struct kvm_vcpu *vcpu, u32 req)  	if (!xics || !vcpu->arch.icp)  		return H_HARDWARE; +	/* These requests don't have real-mode implementations at present */ +	switch (req) { +	case H_XIRR_X: +		res = kvmppc_h_xirr(vcpu); +		kvmppc_set_gpr(vcpu, 4, res); +		kvmppc_set_gpr(vcpu, 5, get_tb()); +		return rc; +	case H_IPOLL: +		rc = kvmppc_h_ipoll(vcpu, kvmppc_get_gpr(vcpu, 4)); +		return rc; +	} +  	/* Check for real mode returning too hard */  	if (xics->real_mode)  		return kvmppc_xics_rm_complete(vcpu, req); diff --git a/arch/powerpc/lib/copypage_power7.S b/arch/powerpc/lib/copypage_power7.S index 0ef75bf0695..395c594722a 100644 --- a/arch/powerpc/lib/copypage_power7.S +++ b/arch/powerpc/lib/copypage_power7.S @@ -28,13 +28,14 @@ _GLOBAL(copypage_power7)  	 * aligned we don't need to clear the bottom 7 bits of either  	 * address.  	 */ -	ori	r9,r3,1		/* stream=1 */ +	ori	r9,r3,1		/* stream=1 => to */  #ifdef CONFIG_PPC_64K_PAGES -	lis	r7,0x0E01	/* depth=7, units=512 */ +	lis	r7,0x0E01	/* depth=7 +				 * units/cachelines=512 */  #else  	lis	r7,0x0E00	/* depth=7 */ -	ori	r7,r7,0x1000	/* units=32 */ +	ori	r7,r7,0x1000	/* units/cachelines=32 */  #endif  	ori	r10,r7,1	/* stream=1 */ @@ -43,12 +44,14 @@ _GLOBAL(copypage_power7)  .machine push  .machine "power4" -	dcbt	r0,r4,0b01000 -	dcbt	r0,r7,0b01010 -	dcbtst	r0,r9,0b01000 -	dcbtst	r0,r10,0b01010 +	/* setup read stream 0  */ +	dcbt	r0,r4,0b01000  	/* addr from */ +	dcbt	r0,r7,0b01010   /* length and depth from */ +	/* setup write stream 1 */ +	dcbtst	r0,r9,0b01000   /* addr to */ +	dcbtst	r0,r10,0b01010  /* length and depth to */  	eieio -	dcbt	r0,r8,0b01010	/* GO */ +	dcbt	r0,r8,0b01010	/* all streams GO */  .machine pop  #ifdef CONFIG_ALTIVEC diff --git a/arch/powerpc/lib/copyuser_power7.S b/arch/powerpc/lib/copyuser_power7.S index 0d24ff15f5f..d1f11795a7a 100644 --- a/arch/powerpc/lib/copyuser_power7.S +++ b/arch/powerpc/lib/copyuser_power7.S @@ -318,12 +318,14 @@ err1;	stb	r0,0(r3)  .machine push  .machine "power4" -	dcbt	r0,r6,0b01000 -	dcbt	r0,r7,0b01010 -	dcbtst	r0,r9,0b01000 -	dcbtst	r0,r10,0b01010 +	/* setup read stream 0 */ +	dcbt	r0,r6,0b01000   /* addr from */ +	dcbt	r0,r7,0b01010   /* length and depth from */ +	/* setup write stream 1 */ +	dcbtst	r0,r9,0b01000   /* addr to */ +	dcbtst	r0,r10,0b01010  /* length and depth to */  	eieio -	dcbt	r0,r8,0b01010	/* GO */ +	dcbt	r0,r8,0b01010	/* all streams GO */  .machine pop  	beq	cr1,.Lunwind_stack_nonvmx_copy diff --git a/arch/powerpc/mm/hash_native_64.c b/arch/powerpc/mm/hash_native_64.c index 6a2aead5b0e..4c122c3f162 100644 --- a/arch/powerpc/mm/hash_native_64.c +++ b/arch/powerpc/mm/hash_native_64.c @@ -336,11 +336,18 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp,  	hpte_v = hptep->v;  	actual_psize = hpte_actual_psize(hptep, psize); +	/* +	 * We need to invalidate the TLB always because hpte_remove doesn't do +	 * a tlb invalidate. If a hash bucket gets full, we "evict" a more/less +	 * random entry from it. When we do that we don't invalidate the TLB +	 * (hpte_remove) because we assume the old translation is still +	 * technically "valid". +	 */  	if (actual_psize < 0) { -		native_unlock_hpte(hptep); -		return -1; +		actual_psize = psize; +		ret = -1; +		goto err_out;  	} -	/* Even if we miss, we need to invalidate the TLB */  	if (!HPTE_V_COMPARE(hpte_v, want_v)) {  		DBG_LOW(" -> miss\n");  		ret = -1; @@ -350,6 +357,7 @@ static long native_hpte_updatepp(unsigned long slot, unsigned long newpp,  		hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) |  			(newpp & (HPTE_R_PP | HPTE_R_N | HPTE_R_C));  	} +err_out:  	native_unlock_hpte(hptep);  	/* Ensure it is out of the tlb too. */ @@ -409,7 +417,7 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,  	hptep = htab_address + slot;  	actual_psize = hpte_actual_psize(hptep, psize);  	if (actual_psize < 0) -		return; +		actual_psize = psize;  	/* Update the HPTE */  	hptep->r = (hptep->r & ~(HPTE_R_PP | HPTE_R_N)) | @@ -437,21 +445,27 @@ static void native_hpte_invalidate(unsigned long slot, unsigned long vpn,  	hpte_v = hptep->v;  	actual_psize = hpte_actual_psize(hptep, psize); +	/* +	 * We need to invalidate the TLB always because hpte_remove doesn't do +	 * a tlb invalidate. If a hash bucket gets full, we "evict" a more/less +	 * random entry from it. When we do that we don't invalidate the TLB +	 * (hpte_remove) because we assume the old translation is still +	 * technically "valid". +	 */  	if (actual_psize < 0) { +		actual_psize = psize;  		native_unlock_hpte(hptep); -		local_irq_restore(flags); -		return; +		goto err_out;  	} -	/* Even if we miss, we need to invalidate the TLB */  	if (!HPTE_V_COMPARE(hpte_v, want_v))  		native_unlock_hpte(hptep);  	else  		/* Invalidate the hpte. NOTE: this also unlocks it */  		hptep->v = 0; +err_out:  	/* Invalidate the TLB */  	tlbie(vpn, psize, actual_psize, ssize, local); -  	local_irq_restore(flags);  } diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 426180b8497..845c867444e 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c @@ -110,7 +110,7 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}  static bool regs_use_siar(struct pt_regs *regs)  { -	return !!(regs->result & 1); +	return !!regs->result;  }  /* @@ -136,22 +136,30 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs)   * If we're not doing instruction sampling, give them the SDAR   * (sampled data address).  If we are doing instruction sampling, then   * only give them the SDAR if it corresponds to the instruction - * pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC or - * the [POWER7P_]MMCRA_SDAR_VALID bit in MMCRA. + * pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC, the + * [POWER7P_]MMCRA_SDAR_VALID bit in MMCRA, or the SDAR_VALID bit in SIER.   */  static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)  {  	unsigned long mmcra = regs->dsisr; -	unsigned long sdsync; +	bool sdar_valid; -	if (ppmu->flags & PPMU_SIAR_VALID) -		sdsync = POWER7P_MMCRA_SDAR_VALID; -	else if (ppmu->flags & PPMU_ALT_SIPR) -		sdsync = POWER6_MMCRA_SDSYNC; -	else -		sdsync = MMCRA_SDSYNC; +	if (ppmu->flags & PPMU_HAS_SIER) +		sdar_valid = regs->dar & SIER_SDAR_VALID; +	else { +		unsigned long sdsync; + +		if (ppmu->flags & PPMU_SIAR_VALID) +			sdsync = POWER7P_MMCRA_SDAR_VALID; +		else if (ppmu->flags & PPMU_ALT_SIPR) +			sdsync = POWER6_MMCRA_SDSYNC; +		else +			sdsync = MMCRA_SDSYNC; + +		sdar_valid = mmcra & sdsync; +	} -	if (!(mmcra & MMCRA_SAMPLE_ENABLE) || (mmcra & sdsync)) +	if (!(mmcra & MMCRA_SAMPLE_ENABLE) || sdar_valid)  		*addrp = mfspr(SPRN_SDAR);  } @@ -181,11 +189,6 @@ static bool regs_sipr(struct pt_regs *regs)  	return !!(regs->dsisr & sipr);  } -static bool regs_no_sipr(struct pt_regs *regs) -{ -	return !!(regs->result & 2); -} -  static inline u32 perf_flags_from_msr(struct pt_regs *regs)  {  	if (regs->msr & MSR_PR) @@ -208,7 +211,7 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs)  	 * SIAR which should give slightly more reliable  	 * results  	 */ -	if (regs_no_sipr(regs)) { +	if (ppmu->flags & PPMU_NO_SIPR) {  		unsigned long siar = mfspr(SPRN_SIAR);  		if (siar >= PAGE_OFFSET)  			return PERF_RECORD_MISC_KERNEL; @@ -239,22 +242,9 @@ static inline void perf_read_regs(struct pt_regs *regs)  	int use_siar;  	regs->dsisr = mmcra; -	regs->result = 0; - -	if (ppmu->flags & PPMU_NO_SIPR) -		regs->result |= 2; - -	/* -	 * On power8 if we're in random sampling mode, the SIER is updated. -	 * If we're in continuous sampling mode, we don't have SIPR. -	 */ -	if (ppmu->flags & PPMU_HAS_SIER) { -		if (marked) -			regs->dar = mfspr(SPRN_SIER); -		else -			regs->result |= 2; -	} +	if (ppmu->flags & PPMU_HAS_SIER) +		regs->dar = mfspr(SPRN_SIER);  	/*  	 * If this isn't a PMU exception (eg a software event) the SIAR is @@ -279,12 +269,12 @@ static inline void perf_read_regs(struct pt_regs *regs)  		use_siar = 1;  	else if ((ppmu->flags & PPMU_NO_CONT_SAMPLING))  		use_siar = 0; -	else if (!regs_no_sipr(regs) && regs_sipr(regs)) +	else if (!(ppmu->flags & PPMU_NO_SIPR) && regs_sipr(regs))  		use_siar = 0;  	else  		use_siar = 1; -	regs->result |= use_siar; +	regs->result = use_siar;  }  /* @@ -308,8 +298,13 @@ static inline int siar_valid(struct pt_regs *regs)  	unsigned long mmcra = regs->dsisr;  	int marked = mmcra & MMCRA_SAMPLE_ENABLE; -	if ((ppmu->flags & PPMU_SIAR_VALID) && marked) -		return mmcra & POWER7P_MMCRA_SIAR_VALID; +	if (marked) { +		if (ppmu->flags & PPMU_HAS_SIER) +			return regs->dar & SIER_SIAR_VALID; + +		if (ppmu->flags & PPMU_SIAR_VALID) +			return mmcra & POWER7P_MMCRA_SIAR_VALID; +	}  	return 1;  } diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index 023b288f895..4459eff7a75 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig @@ -19,6 +19,8 @@ config PPC_PSERIES  	select ZLIB_DEFLATE  	select PPC_DOORBELL  	select HAVE_CONTEXT_TRACKING +	select HOTPLUG if SMP +	select HOTPLUG_CPU if SMP  	default y  config PPC_SPLPAR diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 0a13ecb270c..3cc2f9159ab 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c @@ -54,7 +54,7 @@ static DEFINE_RAW_SPINLOCK(mpic_lock);  #ifdef CONFIG_PPC32	/* XXX for now */  #ifdef CONFIG_IRQ_ALL_CPUS -#define distribute_irqs	(!(mpic->flags & MPIC_SINGLE_DEST_CPU)) +#define distribute_irqs	(1)  #else  #define distribute_irqs	(0)  #endif @@ -1703,7 +1703,7 @@ void mpic_setup_this_cpu(void)  	 * it differently, then we should make sure we also change the default  	 * values of irq_desc[].affinity in irq.c.   	 */ -	if (distribute_irqs) { +	if (distribute_irqs && !(mpic->flags & MPIC_SINGLE_DEST_CPU)) {  	 	for (i = 0; i < mpic->num_sources ; i++)  			mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),  				mpic_irq_read(i, MPIC_INFO(IRQ_DESTINATION)) | msk); diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index bae0f402bf2..87a22092b68 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c @@ -212,7 +212,9 @@ appldata_timer_handler(ctl_table *ctl, int write,  		return 0;  	}  	if (!write) { -		len = sprintf(buf, appldata_timer_active ? "1\n" : "0\n"); +		strncpy(buf, appldata_timer_active ? "1\n" : "0\n", +			ARRAY_SIZE(buf)); +		len = strnlen(buf, ARRAY_SIZE(buf));  		if (len > *lenp)  			len = *lenp;  		if (copy_to_user(buffer, buf, len)) @@ -317,7 +319,8 @@ appldata_generic_handler(ctl_table *ctl, int write,  		return 0;  	}  	if (!write) { -		len = sprintf(buf, ops->active ? "1\n" : "0\n"); +		strncpy(buf, ops->active ? "1\n" : "0\n", ARRAY_SIZE(buf)); +		len = strnlen(buf, ARRAY_SIZE(buf));  		if (len > *lenp)  			len = *lenp;  		if (copy_to_user(buffer, buf, len)) { diff --git a/arch/s390/include/asm/dma-mapping.h b/arch/s390/include/asm/dma-mapping.h index 9411db653ba..886ac7d4937 100644 --- a/arch/s390/include/asm/dma-mapping.h +++ b/arch/s390/include/asm/dma-mapping.h @@ -71,8 +71,8 @@ static inline void dma_free_coherent(struct device *dev, size_t size,  {  	struct dma_map_ops *dma_ops = get_dma_ops(dev); -	dma_ops->free(dev, size, cpu_addr, dma_handle, NULL);  	debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); +	dma_ops->free(dev, size, cpu_addr, dma_handle, NULL);  }  #endif /* _ASM_S390_DMA_MAPPING_H */ diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h index 379d96e2105..fd9be010f9b 100644 --- a/arch/s390/include/asm/io.h +++ b/arch/s390/include/asm/io.h @@ -36,6 +36,7 @@ static inline void * phys_to_virt(unsigned long address)  }  void *xlate_dev_mem_ptr(unsigned long phys); +#define xlate_dev_mem_ptr xlate_dev_mem_ptr  void unxlate_dev_mem_ptr(unsigned long phys, void *addr);  /* diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 0f0de30e3e3..ac01463038f 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h @@ -646,7 +646,7 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)  	unsigned long address, bits;  	unsigned char skey; -	if (!pte_present(*ptep)) +	if (pte_val(*ptep) & _PAGE_INVALID)  		return pgste;  	address = pte_val(*ptep) & PAGE_MASK;  	skey = page_get_storage_key(address); @@ -680,7 +680,7 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste)  #ifdef CONFIG_PGSTE  	int young; -	if (!pte_present(*ptep)) +	if (pte_val(*ptep) & _PAGE_INVALID)  		return pgste;  	/* Get referenced bit from storage key */  	young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); @@ -706,7 +706,7 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry)  	unsigned long address;  	unsigned long okey, nkey; -	if (!pte_present(entry)) +	if (pte_val(entry) & _PAGE_INVALID)  		return;  	address = pte_val(entry) & PAGE_MASK;  	okey = nkey = page_get_storage_key(address); @@ -1098,6 +1098,9 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,  	pte = *ptep;  	if (!mm_exclusive(mm))  		__ptep_ipte(address, ptep); + +	if (mm_has_pgste(mm)) +		pgste = pgste_update_all(&pte, pgste);  	return pte;  } @@ -1105,9 +1108,13 @@ static inline void ptep_modify_prot_commit(struct mm_struct *mm,  					   unsigned long address,  					   pte_t *ptep, pte_t pte)  { +	pgste_t pgste; +  	if (mm_has_pgste(mm)) { +		pgste = *(pgste_t *)(ptep + PTRS_PER_PTE); +		pgste_set_key(ptep, pgste, pte);  		pgste_set_pte(ptep, pte); -		pgste_set_unlock(ptep, *(pgste_t *)(ptep + PTRS_PER_PTE)); +		pgste_set_unlock(ptep, pgste);  	} else  		*ptep = pte;  } diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 05674b66900..4f977d0d25c 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c @@ -428,34 +428,27 @@ void smp_stop_cpu(void)   * This is the main routine where commands issued by other   * cpus are handled.   */ -static void do_ext_call_interrupt(struct ext_code ext_code, -				  unsigned int param32, unsigned long param64) +static void smp_handle_ext_call(void)  {  	unsigned long bits; -	int cpu; - -	cpu = smp_processor_id(); -	if (ext_code.code == 0x1202) -		inc_irq_stat(IRQEXT_EXC); -	else -		inc_irq_stat(IRQEXT_EMS); -	/* -	 * handle bit signal external calls -	 */ -	bits = xchg(&pcpu_devices[cpu].ec_mask, 0); +	/* handle bit signal external calls */ +	bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0);  	if (test_bit(ec_stop_cpu, &bits))  		smp_stop_cpu(); -  	if (test_bit(ec_schedule, &bits))  		scheduler_ipi(); -  	if (test_bit(ec_call_function, &bits))  		generic_smp_call_function_interrupt(); -  	if (test_bit(ec_call_function_single, &bits))  		generic_smp_call_function_single_interrupt(); +} +static void do_ext_call_interrupt(struct ext_code ext_code, +				  unsigned int param32, unsigned long param64) +{ +	inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS); +	smp_handle_ext_call();  }  void arch_send_call_function_ipi_mask(const struct cpumask *mask) @@ -760,6 +753,8 @@ int __cpu_disable(void)  {  	unsigned long cregs[16]; +	/* Handle possible pending IPIs */ +	smp_handle_ext_call();  	set_cpu_online(smp_processor_id(), false);  	/* Disable pseudo page faults on this cpu. */  	pfault_fini(); diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 18dc417aaf7..a938b548f07 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c @@ -492,7 +492,7 @@ static int gmap_connect_pgtable(unsigned long address, unsigned long segment,  	mp = (struct gmap_pgtable *) page->index;  	rmap->gmap = gmap;  	rmap->entry = segment_ptr; -	rmap->vmaddr = address; +	rmap->vmaddr = address & PMD_MASK;  	spin_lock(&mm->page_table_lock);  	if (*segment_ptr == segment) {  		list_add(&rmap->list, &mp->mapper); diff --git a/arch/x86/crypto/crc32-pclmul_asm.S b/arch/x86/crypto/crc32-pclmul_asm.S index 94c27df8a54..f247304299a 100644 --- a/arch/x86/crypto/crc32-pclmul_asm.S +++ b/arch/x86/crypto/crc32-pclmul_asm.S @@ -240,7 +240,7 @@ fold_64:  	pand    %xmm3, %xmm1  	PCLMULQDQ 0x00, CONSTANT, %xmm1  	pxor    %xmm2, %xmm1 -	pextrd  $0x01, %xmm1, %eax +	PEXTRD  0x01, %xmm1, %eax  	ret  ENDPROC(crc32_pclmul_le_16) diff --git a/arch/x86/crypto/sha256-avx-asm.S b/arch/x86/crypto/sha256-avx-asm.S index 56610c4bf31..642f15687a0 100644 --- a/arch/x86/crypto/sha256-avx-asm.S +++ b/arch/x86/crypto/sha256-avx-asm.S @@ -118,7 +118,7 @@ y2 = %r15d  _INP_END_SIZE = 8  _INP_SIZE = 8 -_XFER_SIZE = 8 +_XFER_SIZE = 16  _XMM_SAVE_SIZE = 0  _INP_END = 0 diff --git a/arch/x86/crypto/sha256-ssse3-asm.S b/arch/x86/crypto/sha256-ssse3-asm.S index 98d3c391da8..f833b74d902 100644 --- a/arch/x86/crypto/sha256-ssse3-asm.S +++ b/arch/x86/crypto/sha256-ssse3-asm.S @@ -111,7 +111,7 @@ y2 = %r15d  _INP_END_SIZE = 8  _INP_SIZE = 8 -_XFER_SIZE = 8 +_XFER_SIZE = 16  _XMM_SAVE_SIZE = 0  _INP_END = 0 diff --git a/arch/x86/include/asm/inst.h b/arch/x86/include/asm/inst.h index 280bf7fb6ab..3e115273ed8 100644 --- a/arch/x86/include/asm/inst.h +++ b/arch/x86/include/asm/inst.h @@ -9,12 +9,68 @@  #define REG_NUM_INVALID		100 -#define REG_TYPE_R64		0 -#define REG_TYPE_XMM		1 +#define REG_TYPE_R32		0 +#define REG_TYPE_R64		1 +#define REG_TYPE_XMM		2  #define REG_TYPE_INVALID	100 +	.macro R32_NUM opd r32 +	\opd = REG_NUM_INVALID +	.ifc \r32,%eax +	\opd = 0 +	.endif +	.ifc \r32,%ecx +	\opd = 1 +	.endif +	.ifc \r32,%edx +	\opd = 2 +	.endif +	.ifc \r32,%ebx +	\opd = 3 +	.endif +	.ifc \r32,%esp +	\opd = 4 +	.endif +	.ifc \r32,%ebp +	\opd = 5 +	.endif +	.ifc \r32,%esi +	\opd = 6 +	.endif +	.ifc \r32,%edi +	\opd = 7 +	.endif +#ifdef CONFIG_X86_64 +	.ifc \r32,%r8d +	\opd = 8 +	.endif +	.ifc \r32,%r9d +	\opd = 9 +	.endif +	.ifc \r32,%r10d +	\opd = 10 +	.endif +	.ifc \r32,%r11d +	\opd = 11 +	.endif +	.ifc \r32,%r12d +	\opd = 12 +	.endif +	.ifc \r32,%r13d +	\opd = 13 +	.endif +	.ifc \r32,%r14d +	\opd = 14 +	.endif +	.ifc \r32,%r15d +	\opd = 15 +	.endif +#endif +	.endm +  	.macro R64_NUM opd r64  	\opd = REG_NUM_INVALID +#ifdef CONFIG_X86_64  	.ifc \r64,%rax  	\opd = 0  	.endif @@ -63,6 +119,7 @@  	.ifc \r64,%r15  	\opd = 15  	.endif +#endif  	.endm  	.macro XMM_NUM opd xmm @@ -118,10 +175,13 @@  	.endm  	.macro REG_TYPE type reg +	R32_NUM reg_type_r32 \reg  	R64_NUM reg_type_r64 \reg  	XMM_NUM reg_type_xmm \reg  	.if reg_type_r64 <> REG_NUM_INVALID  	\type = REG_TYPE_R64 +	.elseif reg_type_r32 <> REG_NUM_INVALID +	\type = REG_TYPE_R32  	.elseif reg_type_xmm <> REG_NUM_INVALID  	\type = REG_TYPE_XMM  	.else @@ -162,6 +222,16 @@  	.byte \imm8  	.endm +	.macro PEXTRD imm8 xmm gpr +	R32_NUM extrd_opd1 \gpr +	XMM_NUM extrd_opd2 \xmm +	PFX_OPD_SIZE +	PFX_REX extrd_opd1 extrd_opd2 +	.byte 0x0f, 0x3a, 0x16 +	MODRM 0xc0 extrd_opd1 extrd_opd2 +	.byte \imm8 +	.endm +  	.macro AESKEYGENASSIST rcon xmm1 xmm2  	XMM_NUM aeskeygen_opd1 \xmm1  	XMM_NUM aeskeygen_opd2 \xmm2 diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 08f7e803909..321d65ebaff 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S @@ -115,8 +115,10 @@ startup_64:  	movq	%rdi, %rax  	shrq	$PUD_SHIFT, %rax  	andl	$(PTRS_PER_PUD-1), %eax -	movq	%rdx, (4096+0)(%rbx,%rax,8) -	movq	%rdx, (4096+8)(%rbx,%rax,8) +	movq	%rdx, 4096(%rbx,%rax,8) +	incl	%eax +	andl	$(PTRS_PER_PUD-1), %eax +	movq	%rdx, 4096(%rbx,%rax,8)  	addq	$8192, %rbx  	movq	%rdi, %rax diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c index 245a71db401..cb339097b9e 100644 --- a/arch/x86/kernel/i387.c +++ b/arch/x86/kernel/i387.c @@ -22,23 +22,19 @@  /*   * Were we in an interrupt that interrupted kernel mode?   * - * For now, with eagerfpu we will return interrupted kernel FPU - * state as not-idle. TBD: Ideally we can change the return value - * to something like __thread_has_fpu(current). But we need to - * be careful of doing __thread_clear_has_fpu() before saving - * the FPU etc for supporting nested uses etc. For now, take - * the simple route! - *   * On others, we can do a kernel_fpu_begin/end() pair *ONLY* if that   * pair does nothing at all: the thread must not have fpu (so   * that we don't try to save the FPU state), and TS must   * be set (so that the clts/stts pair does nothing that is   * visible in the interrupted kernel thread). + * + * Except for the eagerfpu case when we return 1 unless we've already + * been eager and saved the state in kernel_fpu_begin().   */  static inline bool interrupted_kernel_fpu_idle(void)  {  	if (use_eager_fpu()) -		return 0; +		return __thread_has_fpu(current);  	return !__thread_has_fpu(current) &&  		(read_cr0() & X86_CR0_TS); @@ -78,8 +74,8 @@ void __kernel_fpu_begin(void)  	struct task_struct *me = current;  	if (__thread_has_fpu(me)) { -		__save_init_fpu(me);  		__thread_clear_has_fpu(me); +		__save_init_fpu(me);  		/* We do 'stts()' in __kernel_fpu_end() */  	} else if (!use_eager_fpu()) {  		this_cpu_write(fpu_owner_task, NULL); diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 8db0010ed15..5953dcea752 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -1240,9 +1240,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,  	ctxt->modrm_seg = VCPU_SREG_DS;  	if (ctxt->modrm_mod == 3) { +		int highbyte_regs = ctxt->rex_prefix == 0; +  		op->type = OP_REG;  		op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; -		op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, ctxt->d & ByteOp); +		op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, +					       highbyte_regs && (ctxt->d & ByteOp));  		if (ctxt->d & Sse) {  			op->type = OP_XMM;  			op->bytes = 16; @@ -3997,7 +4000,8 @@ static const struct opcode twobyte_table[256] = {  	DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,  	N, D(ImplicitOps | ModRM), N, N,  	/* 0x10 - 0x1F */ -	N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, +	N, N, N, N, N, N, N, N, +	D(ImplicitOps | ModRM), N, N, N, N, N, N, D(ImplicitOps | ModRM),  	/* 0x20 - 0x2F */  	DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read),  	DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read), @@ -4836,6 +4840,7 @@ twobyte_insn:  	case 0x08:		/* invd */  	case 0x0d:		/* GrpP (prefetch) */  	case 0x18:		/* Grp16 (prefetch/nop) */ +	case 0x1f:		/* nop */  		break;  	case 0x20: /* mov cr, reg */  		ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e1adbb4aca7..0eee2c8b64d 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1861,11 +1861,14 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)  {  	struct kvm_lapic *apic = vcpu->arch.apic;  	unsigned int sipi_vector; +	unsigned long pe; -	if (!kvm_vcpu_has_lapic(vcpu)) +	if (!kvm_vcpu_has_lapic(vcpu) || !apic->pending_events)  		return; -	if (test_and_clear_bit(KVM_APIC_INIT, &apic->pending_events)) { +	pe = xchg(&apic->pending_events, 0); + +	if (test_bit(KVM_APIC_INIT, &pe)) {  		kvm_lapic_reset(vcpu);  		kvm_vcpu_reset(vcpu);  		if (kvm_vcpu_is_bsp(apic->vcpu)) @@ -1873,7 +1876,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)  		else  			vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED;  	} -	if (test_and_clear_bit(KVM_APIC_SIPI, &apic->pending_events) && +	if (test_bit(KVM_APIC_SIPI, &pe) &&  	    vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) {  		/* evaluate pending_events before reading the vector */  		smp_rmb(); diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 305c68b8d53..981c2dbd72c 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c @@ -628,7 +628,9 @@ int pcibios_add_device(struct pci_dev *dev)  	pa_data = boot_params.hdr.setup_data;  	while (pa_data) { -		data = phys_to_virt(pa_data); +		data = ioremap(pa_data, sizeof(*rom)); +		if (!data) +			return -ENOMEM;  		if (data->type == SETUP_PCI) {  			rom = (struct pci_setup_rom *)data; @@ -645,6 +647,7 @@ int pcibios_add_device(struct pci_dev *dev)  			}  		}  		pa_data = data->next; +		iounmap(data);  	}  	return 0;  } diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 55856b2310d..82089d8b195 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c @@ -206,7 +206,7 @@ static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,  	}  	if (boot_used_size && !finished) { -		unsigned long size; +		unsigned long size = 0;  		u32 attr;  		efi_status_t s;  		void *tmp; diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index 8ff37995d54..fb44426fe93 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c @@ -576,24 +576,22 @@ void xen_send_IPI_mask_allbutself(const struct cpumask *mask,  {  	unsigned cpu;  	unsigned int this_cpu = smp_processor_id(); +	int xen_vector = xen_map_vector(vector); -	if (!(num_online_cpus() > 1)) +	if (!(num_online_cpus() > 1) || (xen_vector < 0))  		return;  	for_each_cpu_and(cpu, mask, cpu_online_mask) {  		if (this_cpu == cpu)  			continue; -		xen_smp_send_call_function_single_ipi(cpu); +		xen_send_IPI_one(cpu, xen_vector);  	}  }  void xen_send_IPI_allbutself(int vector)  { -	int xen_vector = xen_map_vector(vector); - -	if (xen_vector >= 0) -		xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); +	xen_send_IPI_mask_allbutself(cpu_online_mask, vector);  }  static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) diff --git a/arch/x86/xen/smp.h b/arch/x86/xen/smp.h index 8981a76d081..c7c2d89efd7 100644 --- a/arch/x86/xen/smp.h +++ b/arch/x86/xen/smp.h @@ -5,7 +5,6 @@ extern void xen_send_IPI_mask(const struct cpumask *mask,  extern void xen_send_IPI_mask_allbutself(const struct cpumask *mask,  				int vector);  extern void xen_send_IPI_allbutself(int vector); -extern void physflat_send_IPI_allbutself(int vector);  extern void xen_send_IPI_all(int vector);  extern void xen_send_IPI_self(int vector); diff --git a/drivers/acpi/apei/cper.c b/drivers/acpi/apei/cper.c index fefc2ca7cc3..33dc6a00480 100644 --- a/drivers/acpi/apei/cper.c +++ b/drivers/acpi/apei/cper.c @@ -250,10 +250,6 @@ static const char *cper_pcie_port_type_strs[] = {  static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,  			    const struct acpi_hest_generic_data *gdata)  { -#ifdef CONFIG_ACPI_APEI_PCIEAER -	struct pci_dev *dev; -#endif -  	if (pcie->validation_bits & CPER_PCIE_VALID_PORT_TYPE)  		printk("%s""port_type: %d, %s\n", pfx, pcie->port_type,  		       pcie->port_type < ARRAY_SIZE(cper_pcie_port_type_strs) ? @@ -285,20 +281,6 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,  		printk(  	"%s""bridge: secondary_status: 0x%04x, control: 0x%04x\n",  	pfx, pcie->bridge.secondary_status, pcie->bridge.control); -#ifdef CONFIG_ACPI_APEI_PCIEAER -	dev = pci_get_domain_bus_and_slot(pcie->device_id.segment, -			pcie->device_id.bus, pcie->device_id.function); -	if (!dev) { -		pr_err("PCI AER Cannot get PCI device %04x:%02x:%02x.%d\n", -			pcie->device_id.segment, pcie->device_id.bus, -			pcie->device_id.slot, pcie->device_id.function); -		return; -	} -	if (pcie->validation_bits & CPER_PCIE_VALID_AER_INFO) -		cper_print_aer(pfx, dev, gdata->error_severity, -				(struct aer_capability_regs *) pcie->aer_info); -	pci_dev_put(dev); -#endif  }  static const char *apei_estatus_section_flag_strs[] = { diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index d668a8ae602..fcd7d91cec3 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -454,7 +454,9 @@ static void ghes_do_proc(struct ghes *ghes,  				aer_severity = cper_severity_to_aer(sev);  				aer_recover_queue(pcie_err->device_id.segment,  						  pcie_err->device_id.bus, -						  devfn, aer_severity); +						  devfn, aer_severity, +						  (struct aer_capability_regs *) +						  pcie_err->aer_info);  			}  		} @@ -917,13 +919,14 @@ static int ghes_probe(struct platform_device *ghes_dev)  		break;  	case ACPI_HEST_NOTIFY_EXTERNAL:  		/* External interrupt vector is GSI */ -		if (acpi_gsi_to_irq(generic->notify.vector, &ghes->irq)) { +		rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq); +		if (rc) {  			pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n",  			       generic->header.source_id);  			goto err_edac_unreg;  		} -		if (request_irq(ghes->irq, ghes_irq_func, -				0, "GHES IRQ", ghes)) { +		rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes); +		if (rc) {  			pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n",  			       generic->header.source_id);  			goto err_edac_unreg; diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index bc493aa3af1..318fa32a141 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c @@ -278,11 +278,13 @@ int acpi_bus_init_power(struct acpi_device *device)  		if (result)  			return result;  	} else if (state == ACPI_STATE_UNKNOWN) { -		/* No power resources and missing _PSC? Try to force D0. */ +		/* +		 * No power resources and missing _PSC?  Cross fingers and make +		 * it D0 in hope that this is what the BIOS put the device into. +		 * [We tried to force D0 here by executing _PS0, but that broke +		 * Toshiba P870-303 in a nasty way.] +		 */  		state = ACPI_STATE_D0; -		result = acpi_dev_pm_explicit_set(device, state); -		if (result) -			return result;  	}  	device->power.state = state;  	return 0; diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 5b32e15a65c..5d7075d2570 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c @@ -458,12 +458,28 @@ static struct dmi_system_id video_dmi_table[] __initdata = {  	},  	{  	 .callback = video_ignore_initial_backlight, +	 .ident = "HP Pavilion g6 Notebook PC", +	 .matches = { +		 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), +		 DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), +		}, +	}, +	{ +	 .callback = video_ignore_initial_backlight,  	 .ident = "HP 1000 Notebook PC",  	 .matches = {  		DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),  		DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"),  		},  	}, +	{ +	 .callback = video_ignore_initial_backlight, +	 .ident = "HP Pavilion m4", +	 .matches = { +		DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), +		DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), +		}, +	},  	{}  }; diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c index 4e94ba29cb8..9d0cf019ce5 100644 --- a/drivers/ata/acard-ahci.c +++ b/drivers/ata/acard-ahci.c @@ -2,7 +2,7 @@  /*   *  acard-ahci.c - ACard AHCI SATA support   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 251e57d3894..2b50dfdf1cf 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -1,7 +1,7 @@  /*   *  ahci.c - AHCI SATA support   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * @@ -423,6 +423,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {  	  .driver_data = board_ahci_yes_fbs },			/* 88se9125 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),  	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 */ +	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), +	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),  	  .driver_data = board_ahci_yes_fbs },			/* 88se9172 on some Gigabyte */  	{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3), diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index b830e6c9fe4..10b14d45cfd 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -1,7 +1,7 @@  /*   *  ahci.h - Common AHCI SATA definitions and declarations   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 2f48123d74c..9a8a674e8fa 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c @@ -1,7 +1,7 @@  /*   *    ata_piix.c - Intel PATA/SATA controllers   * - *    Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *    Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * @@ -151,6 +151,7 @@ enum piix_controller_ids {  	piix_pata_vmw,			/* PIIX4 for VMware, spurious DMA_ERR */  	ich8_sata_snb,  	ich8_2port_sata_snb, +	ich8_2port_sata_byt,  };  struct piix_map_db { @@ -334,6 +335,9 @@ static const struct pci_device_id piix_pci_tbl[] = {  	{ 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },  	/* SATA Controller IDE (Wellsburg) */  	{ 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, +	/* SATA Controller IDE (BayTrail) */ +	{ 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, +	{ 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },  	{ }	/* terminate list */  }; @@ -441,6 +445,7 @@ static const struct piix_map_db *piix_map_db_table[] = {  	[tolapai_sata]		= &tolapai_map_db,  	[ich8_sata_snb]		= &ich8_map_db,  	[ich8_2port_sata_snb]	= &ich8_2port_map_db, +	[ich8_2port_sata_byt]	= &ich8_2port_map_db,  };  static struct pci_bits piix_enable_bits[] = { @@ -1254,6 +1259,16 @@ static struct ata_port_info piix_port_info[] = {  		.udma_mask	= ATA_UDMA6,  		.port_ops	= &piix_sata_ops,  	}, + +	[ich8_2port_sata_byt] = +	{ +		.flags          = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, +		.pio_mask       = ATA_PIO4, +		.mwdma_mask     = ATA_MWDMA2, +		.udma_mask      = ATA_UDMA6, +		.port_ops       = &piix_sata_ops, +	}, +  };  #define AHCI_PCI_BAR 5 diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 34c82167b96..a70ff154f58 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -1,7 +1,7 @@  /*   *  libahci.c - Common AHCI SATA low-level routines   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 63c743baf92..f2184276539 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -1,7 +1,7 @@  /*   *  libata-core.c - helper library for ATA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * @@ -1602,6 +1602,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,  	qc->tf = *tf;  	if (cdb)  		memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); + +	/* some SATA bridges need us to indicate data xfer direction */ +	if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) && +	    dma_dir == DMA_FROM_DEVICE) +		qc->tf.feature |= ATAPI_DMADIR; +  	qc->flags |= ATA_QCFLAG_RESULT_TF;  	qc->dma_dir = dma_dir;  	if (dma_dir != DMA_NONE) { diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index f9476fb3ac4..c69fcce505c 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c @@ -1,7 +1,7 @@  /*   *  libata-eh.c - libata error handling   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index dd310b27b24..0101af54143 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -1,7 +1,7 @@  /*   *  libata-scsi.c - helper library for ATA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index d8af325a6bd..b603720b877 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c @@ -1,7 +1,7 @@  /*   *  libata-sff.c - helper library for PCI IDE BMDMA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *    		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index 505333340ad..8ea6e6afd04 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c @@ -1,7 +1,7 @@  /*   *  pdc_adma.c - Pacific Digital Corporation ADMA   * - *  Maintained by:  Mark Lord <mlord@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *   *  Copyright 2005 Mark Lord   * diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index fb0dd87f889..958ba2a420c 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c @@ -1,7 +1,7 @@  /*   *  sata_promise.c - Promise SATA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *		    Mikael Pettersson <mikpe@it.uu.se>   *  		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails. diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c index 4799868bd73..249c8a289bf 100644 --- a/drivers/ata/sata_rcar.c +++ b/drivers/ata/sata_rcar.c @@ -549,6 +549,7 @@ static void sata_rcar_bmdma_start(struct ata_queued_cmd *qc)  	/* start host DMA transaction */  	dmactl = ioread32(priv->base + ATAPI_CONTROL1_REG); +	dmactl &= ~ATAPI_CONTROL1_STOP;  	dmactl |= ATAPI_CONTROL1_START;  	iowrite32(dmactl, priv->base + ATAPI_CONTROL1_REG);  } @@ -618,17 +619,16 @@ static struct ata_port_operations sata_rcar_port_ops = {  	.bmdma_status		= sata_rcar_bmdma_status,  }; -static int sata_rcar_serr_interrupt(struct ata_port *ap) +static void sata_rcar_serr_interrupt(struct ata_port *ap)  {  	struct sata_rcar_priv *priv = ap->host->private_data;  	struct ata_eh_info *ehi = &ap->link.eh_info;  	int freeze = 0; -	int handled = 0;  	u32 serror;  	serror = ioread32(priv->base + SCRSERR_REG);  	if (!serror) -		return 0; +		return;  	DPRINTK("SError @host_intr: 0x%x\n", serror); @@ -641,7 +641,6 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap)  		ata_ehi_push_desc(ehi, "%s", "hotplug");  		freeze = serror & SERR_COMM_WAKE ? 0 : 1; -		handled = 1;  	}  	/* freeze or abort */ @@ -649,11 +648,9 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap)  		ata_port_freeze(ap);  	else  		ata_port_abort(ap); - -	return handled;  } -static int sata_rcar_ata_interrupt(struct ata_port *ap) +static void sata_rcar_ata_interrupt(struct ata_port *ap)  {  	struct ata_queued_cmd *qc;  	int handled = 0; @@ -662,7 +659,9 @@ static int sata_rcar_ata_interrupt(struct ata_port *ap)  	if (qc)  		handled |= ata_bmdma_port_intr(ap, qc); -	return handled; +	/* be sure to clear ATA interrupt */ +	if (!handled) +		sata_rcar_check_status(ap);  }  static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) @@ -677,20 +676,21 @@ static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance)  	spin_lock_irqsave(&host->lock, flags);  	sataintstat = ioread32(priv->base + SATAINTSTAT_REG); +	sataintstat &= SATA_RCAR_INT_MASK;  	if (!sataintstat)  		goto done;  	/* ack */ -	iowrite32(sataintstat & ~SATA_RCAR_INT_MASK, -		 priv->base + SATAINTSTAT_REG); +	iowrite32(~sataintstat & 0x7ff, priv->base + SATAINTSTAT_REG);  	ap = host->ports[0];  	if (sataintstat & SATAINTSTAT_ATA) -		handled |= sata_rcar_ata_interrupt(ap); +		sata_rcar_ata_interrupt(ap);  	if (sataintstat & SATAINTSTAT_SERR) -		handled |= sata_rcar_serr_interrupt(ap); +		sata_rcar_serr_interrupt(ap); +	handled = 1;  done:  	spin_unlock_irqrestore(&host->lock, flags); diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index a7b31672c4b..0ae3ca4bf5c 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c @@ -1,7 +1,7 @@  /*   *  sata_sil.c - Silicon Image SATA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *  		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c index 7b7127a58f5..9947010afc0 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c @@ -1,7 +1,7 @@  /*   *  sata_sx4.c - Promise SATA   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   *  		    Please ALWAYS copy linux-ide@vger.kernel.org   *		    on emails.   * diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 5913ea9d57b..87f056e54a9 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c @@ -1,7 +1,7 @@  /*   *  sata_via.c - VIA Serial ATA controllers   * - *  Maintained by:  Jeff Garzik <jgarzik@pobox.com> + *  Maintained by:  Tejun Heo <tj@kernel.org>   * 		   Please ALWAYS copy linux-ide@vger.kernel.org   *		   on emails.   * diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c index 892728412e9..24f553673b7 100644 --- a/drivers/clk/clk-si5351.c +++ b/drivers/clk/clk-si5351.c @@ -932,7 +932,7 @@ static unsigned long si5351_clkout_recalc_rate(struct clk_hw *hw,  	unsigned char reg;  	unsigned char rdiv; -	if (hwdata->num > 5) +	if (hwdata->num <= 5)  		reg = si5351_msynth_params_address(hwdata->num) + 2;  	else  		reg = SI5351_CLK6_7_OUTPUT_DIVIDER; @@ -1477,6 +1477,16 @@ static int si5351_i2c_probe(struct i2c_client *client,  			return -EINVAL;  		}  		drvdata->onecell.clks[n] = clk; + +		/* set initial clkout rate */ +		if (pdata->clkout[n].rate != 0) { +			int ret; +			ret = clk_set_rate(clk, pdata->clkout[n].rate); +			if (ret != 0) { +				dev_err(&client->dev, "Cannot set rate : %d\n", +					ret); +			} +		}  	}  	ret = of_clk_add_provider(client->dev.of_node, of_clk_src_onecell_get, diff --git a/drivers/clk/clk-vt8500.c b/drivers/clk/clk-vt8500.c index debf688afa8..553ac35bcc9 100644 --- a/drivers/clk/clk-vt8500.c +++ b/drivers/clk/clk-vt8500.c @@ -183,7 +183,7 @@ static int vt8500_dclk_set_rate(struct clk_hw *hw, unsigned long rate,  	writel(divisor, cdev->div_reg);  	vt8500_pmc_wait_busy(); -	spin_lock_irqsave(cdev->lock, flags); +	spin_unlock_irqrestore(cdev->lock, flags);  	return 0;  } diff --git a/drivers/clk/mxs/clk-imx28.c b/drivers/clk/mxs/clk-imx28.c index d0e5eed146d..4faf0afc44c 100644 --- a/drivers/clk/mxs/clk-imx28.c +++ b/drivers/clk/mxs/clk-imx28.c @@ -10,6 +10,7 @@   */  #include <linux/clk.h> +#include <linux/clk/mxs.h>  #include <linux/clkdev.h>  #include <linux/err.h>  #include <linux/init.h> diff --git a/drivers/clk/samsung/clk-exynos4.c b/drivers/clk/samsung/clk-exynos4.c index d0940e69d03..3c1f88868f2 100644 --- a/drivers/clk/samsung/clk-exynos4.c +++ b/drivers/clk/samsung/clk-exynos4.c @@ -791,7 +791,8 @@ struct samsung_gate_clock exynos4210_gate_clks[] __initdata = {  	GATE(smmu_pcie, "smmu_pcie", "aclk133", GATE_IP_FSYS, 18, 0, 0),  	GATE(modemif, "modemif", "aclk100", GATE_IP_PERIL, 28, 0, 0),  	GATE(chipid, "chipid", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0), -	GATE(sysreg, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0, 0, 0), +	GATE(sysreg, "sysreg", "aclk100", E4210_GATE_IP_PERIR, 0, +			CLK_IGNORE_UNUSED, 0),  	GATE(hdmi_cec, "hdmi_cec", "aclk100", E4210_GATE_IP_PERIR, 11, 0, 0),  	GATE(smmu_rotator, "smmu_rotator", "aclk200",  			E4210_GATE_IP_IMAGE, 4, 0, 0), @@ -819,7 +820,8 @@ struct samsung_gate_clock exynos4x12_gate_clks[] __initdata = {  	GATE(smmu_mdma, "smmu_mdma", "aclk200", E4X12_GATE_IP_IMAGE, 5, 0, 0),  	GATE(mipi_hsi, "mipi_hsi", "aclk133", GATE_IP_FSYS, 10, 0, 0),  	GATE(chipid, "chipid", "aclk100", E4X12_GATE_IP_PERIR, 0, 0, 0), -	GATE(sysreg, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, 0, 0), +	GATE(sysreg, "sysreg", "aclk100", E4X12_GATE_IP_PERIR, 1, +			CLK_IGNORE_UNUSED, 0),  	GATE(hdmi_cec, "hdmi_cec", "aclk100", E4X12_GATE_IP_PERIR, 11, 0, 0),  	GATE(sclk_mdnie0, "sclk_mdnie0", "div_mdnie0",  			SRC_MASK_LCD0, 4, CLK_SET_RATE_PARENT, 0), diff --git a/drivers/clk/ux500/clk-sysctrl.c b/drivers/clk/ux500/clk-sysctrl.c index bc7e9bde792..e364c9d4aa6 100644 --- a/drivers/clk/ux500/clk-sysctrl.c +++ b/drivers/clk/ux500/clk-sysctrl.c @@ -145,7 +145,13 @@ static struct clk *clk_reg_sysctrl(struct device *dev,  		return ERR_PTR(-ENOMEM);  	} -	for (i = 0; i < num_parents; i++) { +	/* set main clock registers */ +	clk->reg_sel[0] = reg_sel[0]; +	clk->reg_bits[0] = reg_bits[0]; +	clk->reg_mask[0] = reg_mask[0]; + +	/* handle clocks with more than one parent */ +	for (i = 1; i < num_parents; i++) {  		clk->reg_sel[i] = reg_sel[i];  		clk->reg_bits[i] = reg_bits[i];  		clk->reg_mask[i] = reg_mask[i]; diff --git a/drivers/clk/ux500/u8500_clk.c b/drivers/clk/ux500/u8500_clk.c index 0b4f35a5ffc..80069c370a4 100644 --- a/drivers/clk/ux500/u8500_clk.c +++ b/drivers/clk/ux500/u8500_clk.c @@ -325,7 +325,7 @@ void u8500_clk_init(u32 clkrst1_base, u32 clkrst2_base, u32 clkrst3_base,  	clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", clkrst3_base,  				BIT(0), 0);  	clk_register_clkdev(clk, "fsmc", NULL); -	clk_register_clkdev(clk, NULL, "smsc911x"); +	clk_register_clkdev(clk, NULL, "smsc911x.0");  	clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", clkrst3_base,  				BIT(1), 0); diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 11b8b4b54ce..edc089e9d0c 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c @@ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask)  	switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) {  	case SYSTEM_INTEL_MSR_CAPABLE:  		cmd.type = SYSTEM_INTEL_MSR_CAPABLE; -		cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; +		cmd.addr.msr.reg = MSR_IA32_PERF_CTL;  		break;  	case SYSTEM_AMD_MSR_CAPABLE:  		cmd.type = SYSTEM_AMD_MSR_CAPABLE; -		cmd.addr.msr.reg = MSR_AMD_PERF_STATUS; +		cmd.addr.msr.reg = MSR_AMD_PERF_CTL;  		break;  	case SYSTEM_IO_CAPABLE:  		cmd.type = SYSTEM_IO_CAPABLE; diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c index a64eb8b7044..ad1fde27766 100644 --- a/drivers/cpufreq/cpufreq-cpu0.c +++ b/drivers/cpufreq/cpufreq-cpu0.c @@ -45,7 +45,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  	struct cpufreq_freqs freqs;  	struct opp *opp;  	unsigned long volt = 0, volt_old = 0, tol = 0; -	long freq_Hz; +	long freq_Hz, freq_exact;  	unsigned int index;  	int ret; @@ -60,6 +60,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  	freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000);  	if (freq_Hz < 0)  		freq_Hz = freq_table[index].frequency * 1000; +	freq_exact = freq_Hz;  	freqs.new = freq_Hz / 1000;  	freqs.old = clk_get_rate(cpu_clk) / 1000; @@ -98,7 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,  		}  	} -	ret = clk_set_rate(cpu_clk, freqs.new * 1000); +	ret = clk_set_rate(cpu_clk, freq_exact);  	if (ret) {  		pr_err("failed to set clock rate: %d\n", ret);  		if (cpu_reg) diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 5af40ad82d2..dc9b72e25c1 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c @@ -26,6 +26,7 @@  #include <linux/tick.h>  #include <linux/types.h>  #include <linux/workqueue.h> +#include <linux/cpu.h>  #include "cpufreq_governor.h" @@ -180,8 +181,10 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy,  	if (!all_cpus) {  		__gov_queue_work(smp_processor_id(), dbs_data, delay);  	} else { +		get_online_cpus();  		for_each_cpu(i, policy->cpus)  			__gov_queue_work(i, dbs_data, delay); +		put_online_cpus();  	}  }  EXPORT_SYMBOL_GPL(gov_queue_work); diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index 765fdf5ce57..bf416a8391a 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c @@ -1154,7 +1154,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req,  		dst_nents = sg_count(req->dst, req->cryptlen, &dst_chained);  	sgc = dma_map_sg_chained(jrdev, req->assoc, assoc_nents ? : 1, -				 DMA_BIDIRECTIONAL, assoc_chained); +				 DMA_TO_DEVICE, assoc_chained);  	if (likely(req->src == req->dst)) {  		sgc = dma_map_sg_chained(jrdev, req->src, src_nents ? : 1,  					 DMA_BIDIRECTIONAL, src_chained); @@ -1336,7 +1336,7 @@ static struct aead_edesc *aead_giv_edesc_alloc(struct aead_givcrypt_request  		dst_nents = sg_count(req->dst, req->cryptlen, &dst_chained);  	sgc = dma_map_sg_chained(jrdev, req->assoc, assoc_nents ? : 1, -				 DMA_BIDIRECTIONAL, assoc_chained); +				 DMA_TO_DEVICE, assoc_chained);  	if (likely(req->src == req->dst)) {  		sgc = dma_map_sg_chained(jrdev, req->src, src_nents ? : 1,  					 DMA_BIDIRECTIONAL, src_chained); diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index d8ce4ecfef1..e88ded2c8d2 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c @@ -716,8 +716,7 @@ static int dmatest_func(void *data)  		}  		dma_async_issue_pending(chan); -		wait_event_freezable_timeout(done_wait, -					     done.done || kthread_should_stop(), +		wait_event_freezable_timeout(done_wait, done.done,  					     msecs_to_jiffies(params->timeout));  		status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); @@ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info)  static int __restart_threaded_test(struct dmatest_info *info, bool run)  {  	struct dmatest_params *params = &info->params; -	int ret;  	/* Stop any running test first */  	__stop_threaded_test(info); @@ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run)  	memcpy(params, &info->dbgfs_params, sizeof(*params));  	/* Run test with new parameters */ -	ret = __run_threaded_test(info); -	if (ret) { -		__stop_threaded_test(info); -		pr_err("dmatest: Can't run test\n"); +	return __run_threaded_test(info); +} + +static bool __is_threaded_test_run(struct dmatest_info *info) +{ +	struct dmatest_chan *dtc; + +	list_for_each_entry(dtc, &info->channels, node) { +		struct dmatest_thread *thread; + +		list_for_each_entry(thread, &dtc->threads, node) { +			if (!thread->done) +				return true; +		}  	} -	return ret; +	return false;  }  static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, @@ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf,  {  	struct dmatest_info *info = file->private_data;  	char buf[3]; -	struct dmatest_chan *dtc; -	bool alive = false;  	mutex_lock(&info->lock); -	list_for_each_entry(dtc, &info->channels, node) { -		struct dmatest_thread *thread; - -		list_for_each_entry(thread, &dtc->threads, node) { -			if (!thread->done) { -				alive = true; -				break; -			} -		} -	} -	if (alive) { +	if (__is_threaded_test_run(info)) {  		buf[0] = 'Y';  	} else {  		__stop_threaded_test(info); @@ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf,  	if (strtobool(buf, &bv) == 0) {  		mutex_lock(&info->lock); -		ret = __restart_threaded_test(info, bv); + +		if (__is_threaded_test_run(info)) +			ret = -EBUSY; +		else +			ret = __restart_threaded_test(info, bv); +  		mutex_unlock(&info->lock);  	} diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 1734feec47b..71bf4ec300e 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c @@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c)  			return;  		} -		if (d40_queue_start(d40c) == NULL) +		if (d40_queue_start(d40c) == NULL) {  			d40c->busy = false; -		pm_runtime_mark_last_busy(d40c->base->dev); -		pm_runtime_put_autosuspend(d40c->base->dev); + +			pm_runtime_mark_last_busy(d40c->base->dev); +			pm_runtime_put_autosuspend(d40c->base->dev); +		}  		d40_desc_remove(d40d);  		d40_desc_done(d40c, d40d); diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c index b623c599e57..8bd1bb6dbe4 100644 --- a/drivers/firmware/efi/efivars.c +++ b/drivers/firmware/efi/efivars.c @@ -523,13 +523,11 @@ static void efivar_update_sysfs_entries(struct work_struct *work)  	struct efivar_entry *entry;  	int err; -	entry = kzalloc(sizeof(*entry), GFP_KERNEL); -	if (!entry) -		return; -  	/* Add new sysfs entries */  	while (1) { -		memset(entry, 0, sizeof(*entry)); +		entry = kzalloc(sizeof(*entry), GFP_KERNEL); +		if (!entry) +			return;  		err = efivar_init(efivar_update_sysfs_entry, entry,  				  true, false, &efivar_sysfs_list); diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index a6a8643a6a7..8bcce7866d3 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c @@ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off);   */  void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)  { -	/* vblank is not initialized (IRQ not installed ?) */ +	/* vblank is not initialized (IRQ not installed ?), or has been freed */  	if (!dev->num_crtcs)  		return;  	/* @@ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc)  {  	unsigned long irqflags; +	/* vblank is not initialized (IRQ not installed ?), or has been freed */ +	if (!dev->num_crtcs) +		return; +  	if (dev->vblank_inmodeset[crtc]) {  		spin_lock_irqsave(&dev->vbl_lock, irqflags);  		dev->vblank_disable_allowed = 1; diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index e8894bc9e6d..c200e4d71e3 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -48,6 +48,8 @@ struct exynos_drm_crtc {  	unsigned int			pipe;  	unsigned int			dpms;  	enum exynos_crtc_mode		mode; +	wait_queue_head_t		pending_flip_queue; +	atomic_t			pending_flip;  };  static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode) @@ -61,6 +63,13 @@ static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)  		return;  	} +	if (mode > DRM_MODE_DPMS_ON) { +		/* wait for the completion of page flip. */ +		wait_event(exynos_crtc->pending_flip_queue, +				atomic_read(&exynos_crtc->pending_flip) == 0); +		drm_vblank_off(crtc->dev, exynos_crtc->pipe); +	} +  	exynos_drm_fn_encoder(crtc, &mode, exynos_drm_encoder_crtc_dpms);  	exynos_crtc->dpms = mode;  } @@ -217,7 +226,6 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,  		ret = drm_vblank_get(dev, exynos_crtc->pipe);  		if (ret) {  			DRM_DEBUG("failed to acquire vblank counter\n"); -			list_del(&event->base.link);  			goto out;  		} @@ -225,6 +233,7 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,  		spin_lock_irq(&dev->event_lock);  		list_add_tail(&event->base.link,  				&dev_priv->pageflip_event_list); +		atomic_set(&exynos_crtc->pending_flip, 1);  		spin_unlock_irq(&dev->event_lock);  		crtc->fb = fb; @@ -344,6 +353,8 @@ int exynos_drm_crtc_create(struct drm_device *dev, unsigned int nr)  	exynos_crtc->pipe = nr;  	exynos_crtc->dpms = DRM_MODE_DPMS_OFF; +	init_waitqueue_head(&exynos_crtc->pending_flip_queue); +	atomic_set(&exynos_crtc->pending_flip, 0);  	exynos_crtc->plane = exynos_plane_init(dev, 1 << nr, true);  	if (!exynos_crtc->plane) {  		kfree(exynos_crtc); @@ -398,7 +409,8 @@ void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)  {  	struct exynos_drm_private *dev_priv = dev->dev_private;  	struct drm_pending_vblank_event *e, *t; -	struct timeval now; +	struct drm_crtc *drm_crtc = dev_priv->crtc[crtc]; +	struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(drm_crtc);  	unsigned long flags;  	DRM_DEBUG_KMS("%s\n", __FILE__); @@ -411,14 +423,11 @@ void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int crtc)  		if (crtc != e->pipe)  			continue; -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; - -		list_move_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); +		list_del(&e->base.link); +		drm_send_vblank_event(dev, -1, e);  		drm_vblank_put(dev, crtc); +		atomic_set(&exynos_crtc->pending_flip, 0); +		wake_up(&exynos_crtc->pending_flip_queue);  	}  	spin_unlock_irqrestore(&dev->event_lock, flags); diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 68f0045f86b..8f007aaeffc 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c @@ -182,7 +182,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,  	helper->fb = exynos_drm_framebuffer_init(dev, &mode_cmd,  			&exynos_gem_obj->base); -	if (IS_ERR_OR_NULL(helper->fb)) { +	if (IS_ERR(helper->fb)) {  		DRM_ERROR("failed to create drm framebuffer.\n");  		ret = PTR_ERR(helper->fb);  		goto err_destroy_gem; diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c index 773f583fa96..4a1616a18ab 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c @@ -12,9 +12,9 @@   *   */  #include <linux/kernel.h> -#include <linux/mfd/syscon.h>  #include <linux/module.h>  #include <linux/platform_device.h> +#include <linux/mfd/syscon.h>  #include <linux/regmap.h>  #include <linux/clk.h>  #include <linux/pm_runtime.h> @@ -1845,7 +1845,7 @@ static int fimc_probe(struct platform_device *pdev)  	}  	ctx->irq = res->start; -	ret = request_threaded_irq(ctx->irq, NULL, fimc_irq_handler, +	ret = devm_request_threaded_irq(dev, ctx->irq, NULL, fimc_irq_handler,  		IRQF_ONESHOT, "drm_fimc", ctx);  	if (ret < 0) {  		dev_err(dev, "failed to request irq.\n"); @@ -1854,7 +1854,7 @@ static int fimc_probe(struct platform_device *pdev)  	ret = fimc_setup_clocks(ctx);  	if (ret < 0) -		goto err_free_irq; +		return ret;  	ippdrv = &ctx->ippdrv;  	ippdrv->ops[EXYNOS_DRM_OPS_SRC] = &fimc_src_ops; @@ -1884,7 +1884,7 @@ static int fimc_probe(struct platform_device *pdev)  		goto err_pm_dis;  	} -	dev_info(&pdev->dev, "drm fimc registered successfully.\n"); +	dev_info(dev, "drm fimc registered successfully.\n");  	return 0; @@ -1892,8 +1892,6 @@ err_pm_dis:  	pm_runtime_disable(dev);  err_put_clk:  	fimc_put_clocks(ctx); -err_free_irq: -	free_irq(ctx->irq, ctx);  	return ret;  } @@ -1911,8 +1909,6 @@ static int fimc_remove(struct platform_device *pdev)  	pm_runtime_set_suspended(dev);  	pm_runtime_disable(dev); -	free_irq(ctx->irq, ctx); -  	return 0;  } diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 746b282b343..97c61dbffd8 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c @@ -885,7 +885,7 @@ static int fimd_probe(struct platform_device *pdev)  	DRM_DEBUG_KMS("%s\n", __FILE__); -	if (pdev->dev.of_node) { +	if (dev->of_node) {  		pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);  		if (!pdata) {  			DRM_ERROR("memory allocation for pdata failed\n"); @@ -899,7 +899,7 @@ static int fimd_probe(struct platform_device *pdev)  			return ret;  		}  	} else { -		pdata = pdev->dev.platform_data; +		pdata = dev->platform_data;  		if (!pdata) {  			DRM_ERROR("no platform data specified\n");  			return -EINVAL; @@ -912,7 +912,7 @@ static int fimd_probe(struct platform_device *pdev)  		return -EINVAL;  	} -	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx)  		return -ENOMEM; @@ -930,7 +930,7 @@ static int fimd_probe(struct platform_device *pdev)  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	ctx->regs = devm_ioremap_resource(&pdev->dev, res); +	ctx->regs = devm_ioremap_resource(dev, res);  	if (IS_ERR(ctx->regs))  		return PTR_ERR(ctx->regs); @@ -942,7 +942,7 @@ static int fimd_probe(struct platform_device *pdev)  	ctx->irq = res->start; -	ret = devm_request_irq(&pdev->dev, ctx->irq, fimd_irq_handler, +	ret = devm_request_irq(dev, ctx->irq, fimd_irq_handler,  							0, "drm_fimd", ctx);  	if (ret) {  		dev_err(dev, "irq request failed.\n"); diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 47a493c8a71..af75434ee4d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c @@ -1379,7 +1379,7 @@ static int g2d_probe(struct platform_device *pdev)  	struct exynos_drm_subdrv *subdrv;  	int ret; -	g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL); +	g2d = devm_kzalloc(dev, sizeof(*g2d), GFP_KERNEL);  	if (!g2d) {  		dev_err(dev, "failed to allocate driver data\n");  		return -ENOMEM; @@ -1417,7 +1417,7 @@ static int g2d_probe(struct platform_device *pdev)  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	g2d->regs = devm_ioremap_resource(&pdev->dev, res); +	g2d->regs = devm_ioremap_resource(dev, res);  	if (IS_ERR(g2d->regs)) {  		ret = PTR_ERR(g2d->regs);  		goto err_put_clk; @@ -1430,7 +1430,7 @@ static int g2d_probe(struct platform_device *pdev)  		goto err_put_clk;  	} -	ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0, +	ret = devm_request_irq(dev, g2d->irq, g2d_irq_handler, 0,  								"drm_g2d", g2d);  	if (ret < 0) {  		dev_err(dev, "irq request failed\n"); diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c index 7841c3b8a20..762f40d548b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c @@ -1704,7 +1704,7 @@ static int gsc_probe(struct platform_device *pdev)  	}  	ctx->irq = res->start; -	ret = request_threaded_irq(ctx->irq, NULL, gsc_irq_handler, +	ret = devm_request_threaded_irq(dev, ctx->irq, NULL, gsc_irq_handler,  		IRQF_ONESHOT, "drm_gsc", ctx);  	if (ret < 0) {  		dev_err(dev, "failed to request irq.\n"); @@ -1725,7 +1725,7 @@ static int gsc_probe(struct platform_device *pdev)  	ret = gsc_init_prop_list(ippdrv);  	if (ret < 0) {  		dev_err(dev, "failed to init property list.\n"); -		goto err_get_irq; +		return ret;  	}  	DRM_DEBUG_KMS("%s:id[%d]ippdrv[0x%x]\n", __func__, ctx->id, @@ -1743,15 +1743,12 @@ static int gsc_probe(struct platform_device *pdev)  		goto err_ippdrv_register;  	} -	dev_info(&pdev->dev, "drm gsc registered successfully.\n"); +	dev_info(dev, "drm gsc registered successfully.\n");  	return 0;  err_ippdrv_register: -	devm_kfree(dev, ippdrv->prop_list);  	pm_runtime_disable(dev); -err_get_irq: -	free_irq(ctx->irq, ctx);  	return ret;  } @@ -1761,15 +1758,12 @@ static int gsc_remove(struct platform_device *pdev)  	struct gsc_context *ctx = get_gsc_context(dev);  	struct exynos_drm_ippdrv *ippdrv = &ctx->ippdrv; -	devm_kfree(dev, ippdrv->prop_list);  	exynos_drm_ippdrv_unregister(ippdrv);  	mutex_destroy(&ctx->lock);  	pm_runtime_set_suspended(dev);  	pm_runtime_disable(dev); -	free_irq(ctx->irq, ctx); -  	return 0;  } diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index ba2f0f1aa05..437fb947e46 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c @@ -442,7 +442,7 @@ static int exynos_drm_hdmi_probe(struct platform_device *pdev)  	DRM_DEBUG_KMS("%s\n", __FILE__); -	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx) {  		DRM_LOG_KMS("failed to alloc common hdmi context.\n");  		return -ENOMEM; diff --git a/drivers/gpu/drm/exynos/exynos_drm_ipp.c b/drivers/gpu/drm/exynos/exynos_drm_ipp.c index 29d2ad31449..be1e8846346 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_ipp.c +++ b/drivers/gpu/drm/exynos/exynos_drm_ipp.c @@ -222,7 +222,7 @@ static struct exynos_drm_ippdrv *ipp_find_driver(struct ipp_context *ctx,  		/* find ipp driver using idr */  		ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,  			ipp_id); -		if (IS_ERR_OR_NULL(ippdrv)) { +		if (IS_ERR(ippdrv)) {  			DRM_ERROR("not found ipp%d driver.\n", ipp_id);  			return ippdrv;  		} @@ -388,7 +388,7 @@ static int ipp_find_and_set_property(struct drm_exynos_ipp_property *property)  	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, prop_id);  	ippdrv = ipp_find_drv_by_handle(prop_id); -	if (IS_ERR_OR_NULL(ippdrv)) { +	if (IS_ERR(ippdrv)) {  		DRM_ERROR("failed to get ipp driver.\n");  		return -EINVAL;  	} @@ -492,7 +492,7 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,  	/* find ipp driver using ipp id */  	ippdrv = ipp_find_driver(ctx, property); -	if (IS_ERR_OR_NULL(ippdrv)) { +	if (IS_ERR(ippdrv)) {  		DRM_ERROR("failed to get ipp driver.\n");  		return -EINVAL;  	} @@ -521,19 +521,19 @@ int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,  	c_node->state = IPP_STATE_IDLE;  	c_node->start_work = ipp_create_cmd_work(); -	if (IS_ERR_OR_NULL(c_node->start_work)) { +	if (IS_ERR(c_node->start_work)) {  		DRM_ERROR("failed to create start work.\n");  		goto err_clear;  	}  	c_node->stop_work = ipp_create_cmd_work(); -	if (IS_ERR_OR_NULL(c_node->stop_work)) { +	if (IS_ERR(c_node->stop_work)) {  		DRM_ERROR("failed to create stop work.\n");  		goto err_free_start;  	}  	c_node->event_work = ipp_create_event_work(); -	if (IS_ERR_OR_NULL(c_node->event_work)) { +	if (IS_ERR(c_node->event_work)) {  		DRM_ERROR("failed to create event work.\n");  		goto err_free_stop;  	} @@ -915,7 +915,7 @@ static int ipp_queue_buf_with_run(struct device *dev,  	DRM_DEBUG_KMS("%s\n", __func__);  	ippdrv = ipp_find_drv_by_handle(qbuf->prop_id); -	if (IS_ERR_OR_NULL(ippdrv)) { +	if (IS_ERR(ippdrv)) {  		DRM_ERROR("failed to get ipp driver.\n");  		return -EFAULT;  	} @@ -1909,7 +1909,7 @@ static int ipp_probe(struct platform_device *pdev)  	struct exynos_drm_subdrv *subdrv;  	int ret; -	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx)  		return -ENOMEM; @@ -1963,7 +1963,7 @@ static int ipp_probe(struct platform_device *pdev)  		goto err_cmd_workq;  	} -	dev_info(&pdev->dev, "drm ipp registered successfully.\n"); +	dev_info(dev, "drm ipp registered successfully.\n");  	return 0; diff --git a/drivers/gpu/drm/exynos/exynos_drm_rotator.c b/drivers/gpu/drm/exynos/exynos_drm_rotator.c index 947f09f15ad..9b6c70964d7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_rotator.c +++ b/drivers/gpu/drm/exynos/exynos_drm_rotator.c @@ -666,8 +666,8 @@ static int rotator_probe(struct platform_device *pdev)  		return rot->irq;  	} -	ret = request_threaded_irq(rot->irq, NULL, rotator_irq_handler, -			IRQF_ONESHOT, "drm_rotator", rot); +	ret = devm_request_threaded_irq(dev, rot->irq, NULL, +			rotator_irq_handler, IRQF_ONESHOT, "drm_rotator", rot);  	if (ret < 0) {  		dev_err(dev, "failed to request irq\n");  		return ret; @@ -676,8 +676,7 @@ static int rotator_probe(struct platform_device *pdev)  	rot->clock = devm_clk_get(dev, "rotator");  	if (IS_ERR(rot->clock)) {  		dev_err(dev, "failed to get clock\n"); -		ret = PTR_ERR(rot->clock); -		goto err_clk_get; +		return PTR_ERR(rot->clock);  	}  	pm_runtime_enable(dev); @@ -709,10 +708,7 @@ static int rotator_probe(struct platform_device *pdev)  	return 0;  err_ippdrv_register: -	devm_kfree(dev, ippdrv->prop_list);  	pm_runtime_disable(dev); -err_clk_get: -	free_irq(rot->irq, rot);  	return ret;  } @@ -722,13 +718,10 @@ static int rotator_remove(struct platform_device *pdev)  	struct rot_context *rot = dev_get_drvdata(dev);  	struct exynos_drm_ippdrv *ippdrv = &rot->ippdrv; -	devm_kfree(dev, ippdrv->prop_list);  	exynos_drm_ippdrv_unregister(ippdrv);  	pm_runtime_disable(dev); -	free_irq(rot->irq, rot); -  	return 0;  } diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index 9504b0cd825..24376c194a5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c @@ -594,7 +594,7 @@ static int vidi_probe(struct platform_device *pdev)  	DRM_DEBUG_KMS("%s\n", __FILE__); -	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx)  		return -ENOMEM; @@ -612,7 +612,7 @@ static int vidi_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, ctx); -	ret = device_create_file(&pdev->dev, &dev_attr_connection); +	ret = device_create_file(dev, &dev_attr_connection);  	if (ret < 0)  		DRM_INFO("failed to create connection sysfs.\n"); diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 6652597586a..fd1426dca88 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -1946,14 +1946,14 @@ static int hdmi_probe(struct platform_device *pdev)  	DRM_DEBUG_KMS("[%d]\n", __LINE__); -	if (pdev->dev.of_node) { +	if (dev->of_node) {  		pdata = drm_hdmi_dt_parse_pdata(dev);  		if (IS_ERR(pdata)) {  			DRM_ERROR("failed to parse dt\n");  			return PTR_ERR(pdata);  		}  	} else { -		pdata = pdev->dev.platform_data; +		pdata = dev->platform_data;  	}  	if (!pdata) { @@ -1961,14 +1961,14 @@ static int hdmi_probe(struct platform_device *pdev)  		return -EINVAL;  	} -	drm_hdmi_ctx = devm_kzalloc(&pdev->dev, sizeof(*drm_hdmi_ctx), +	drm_hdmi_ctx = devm_kzalloc(dev, sizeof(*drm_hdmi_ctx),  								GFP_KERNEL);  	if (!drm_hdmi_ctx) {  		DRM_ERROR("failed to allocate common hdmi context.\n");  		return -ENOMEM;  	} -	hdata = devm_kzalloc(&pdev->dev, sizeof(struct hdmi_context), +	hdata = devm_kzalloc(dev, sizeof(struct hdmi_context),  								GFP_KERNEL);  	if (!hdata) {  		DRM_ERROR("out of memory\n"); @@ -1985,7 +1985,7 @@ static int hdmi_probe(struct platform_device *pdev)  	if (dev->of_node) {  		const struct of_device_id *match;  		match = of_match_node(of_match_ptr(hdmi_match_types), -					pdev->dev.of_node); +					dev->of_node);  		if (match == NULL)  			return -ENODEV;  		hdata->type = (enum hdmi_type)match->data; @@ -2005,11 +2005,11 @@ static int hdmi_probe(struct platform_device *pdev)  	}  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	hdata->regs = devm_ioremap_resource(&pdev->dev, res); +	hdata->regs = devm_ioremap_resource(dev, res);  	if (IS_ERR(hdata->regs))  		return PTR_ERR(hdata->regs); -	ret = devm_gpio_request(&pdev->dev, hdata->hpd_gpio, "HPD"); +	ret = devm_gpio_request(dev, hdata->hpd_gpio, "HPD");  	if (ret) {  		DRM_ERROR("failed to request HPD gpio\n");  		return ret; @@ -2041,7 +2041,7 @@ static int hdmi_probe(struct platform_device *pdev)  	hdata->hpd = gpio_get_value(hdata->hpd_gpio); -	ret = request_threaded_irq(hdata->irq, NULL, +	ret = devm_request_threaded_irq(dev, hdata->irq, NULL,  			hdmi_irq_thread, IRQF_TRIGGER_RISING |  			IRQF_TRIGGER_FALLING | IRQF_ONESHOT,  			"hdmi", drm_hdmi_ctx); @@ -2070,16 +2070,11 @@ err_ddc:  static int hdmi_remove(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; -	struct exynos_drm_hdmi_context *ctx = platform_get_drvdata(pdev); -	struct hdmi_context *hdata = ctx->ctx;  	DRM_DEBUG_KMS("[%d] %s\n", __LINE__, __func__);  	pm_runtime_disable(dev); -	free_irq(hdata->irq, hdata); - -  	/* hdmiphy i2c driver */  	i2c_del_driver(&hdmiphy_driver);  	/* DDC i2c driver */ diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index ec3e376b7e0..7c197d3820c 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -1061,7 +1061,7 @@ static int mixer_resources_init(struct exynos_drm_hdmi_context *ctx,  		return -ENXIO;  	} -	mixer_res->mixer_regs = devm_ioremap(&pdev->dev, res->start, +	mixer_res->mixer_regs = devm_ioremap(dev, res->start,  							resource_size(res));  	if (mixer_res->mixer_regs == NULL) {  		dev_err(dev, "register mapping failed.\n"); @@ -1074,7 +1074,7 @@ static int mixer_resources_init(struct exynos_drm_hdmi_context *ctx,  		return -ENXIO;  	} -	ret = devm_request_irq(&pdev->dev, res->start, mixer_irq_handler, +	ret = devm_request_irq(dev, res->start, mixer_irq_handler,  							0, "drm_mixer", ctx);  	if (ret) {  		dev_err(dev, "request interrupt failed.\n"); @@ -1118,7 +1118,7 @@ static int vp_resources_init(struct exynos_drm_hdmi_context *ctx,  		return -ENXIO;  	} -	mixer_res->vp_regs = devm_ioremap(&pdev->dev, res->start, +	mixer_res->vp_regs = devm_ioremap(dev, res->start,  							resource_size(res));  	if (mixer_res->vp_regs == NULL) {  		dev_err(dev, "register mapping failed.\n"); @@ -1169,14 +1169,14 @@ static int mixer_probe(struct platform_device *pdev)  	dev_info(dev, "probe start\n"); -	drm_hdmi_ctx = devm_kzalloc(&pdev->dev, sizeof(*drm_hdmi_ctx), +	drm_hdmi_ctx = devm_kzalloc(dev, sizeof(*drm_hdmi_ctx),  								GFP_KERNEL);  	if (!drm_hdmi_ctx) {  		DRM_ERROR("failed to allocate common hdmi context.\n");  		return -ENOMEM;  	} -	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); +	ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);  	if (!ctx) {  		DRM_ERROR("failed to alloc mixer context.\n");  		return -ENOMEM; @@ -1187,14 +1187,14 @@ static int mixer_probe(struct platform_device *pdev)  	if (dev->of_node) {  		const struct of_device_id *match;  		match = of_match_node(of_match_ptr(mixer_match_types), -							  pdev->dev.of_node); +							  dev->of_node);  		drv = (struct mixer_drv_data *)match->data;  	} else {  		drv = (struct mixer_drv_data *)  			platform_get_device_id(pdev)->driver_data;  	} -	ctx->dev = &pdev->dev; +	ctx->dev = dev;  	ctx->parent_ctx = (void *)drm_hdmi_ctx;  	drm_hdmi_ctx->ctx = (void *)ctx;  	ctx->vp_enabled = drv->is_vp_enabled; diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 9ebe895c17d..a2e4953b8e8 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -364,40 +364,64 @@ static const struct pci_device_id pciidlist[] = {		/* aka */  	INTEL_VGA_DEVICE(0x016a, &intel_ivybridge_d_info), /* GT2 server */  	INTEL_VGA_DEVICE(0x0402, &intel_haswell_d_info), /* GT1 desktop */  	INTEL_VGA_DEVICE(0x0412, &intel_haswell_d_info), /* GT2 desktop */ -	INTEL_VGA_DEVICE(0x0422, &intel_haswell_d_info), /* GT2 desktop */ +	INTEL_VGA_DEVICE(0x0422, &intel_haswell_d_info), /* GT3 desktop */  	INTEL_VGA_DEVICE(0x040a, &intel_haswell_d_info), /* GT1 server */  	INTEL_VGA_DEVICE(0x041a, &intel_haswell_d_info), /* GT2 server */ -	INTEL_VGA_DEVICE(0x042a, &intel_haswell_d_info), /* GT2 server */ +	INTEL_VGA_DEVICE(0x042a, &intel_haswell_d_info), /* GT3 server */  	INTEL_VGA_DEVICE(0x0406, &intel_haswell_m_info), /* GT1 mobile */  	INTEL_VGA_DEVICE(0x0416, &intel_haswell_m_info), /* GT2 mobile */  	INTEL_VGA_DEVICE(0x0426, &intel_haswell_m_info), /* GT2 mobile */ +	INTEL_VGA_DEVICE(0x040B, &intel_haswell_d_info), /* GT1 reserved */ +	INTEL_VGA_DEVICE(0x041B, &intel_haswell_d_info), /* GT2 reserved */ +	INTEL_VGA_DEVICE(0x042B, &intel_haswell_d_info), /* GT3 reserved */ +	INTEL_VGA_DEVICE(0x040E, &intel_haswell_d_info), /* GT1 reserved */ +	INTEL_VGA_DEVICE(0x041E, &intel_haswell_d_info), /* GT2 reserved */ +	INTEL_VGA_DEVICE(0x042E, &intel_haswell_d_info), /* GT3 reserved */  	INTEL_VGA_DEVICE(0x0C02, &intel_haswell_d_info), /* SDV GT1 desktop */  	INTEL_VGA_DEVICE(0x0C12, &intel_haswell_d_info), /* SDV GT2 desktop */ -	INTEL_VGA_DEVICE(0x0C22, &intel_haswell_d_info), /* SDV GT2 desktop */ +	INTEL_VGA_DEVICE(0x0C22, &intel_haswell_d_info), /* SDV GT3 desktop */  	INTEL_VGA_DEVICE(0x0C0A, &intel_haswell_d_info), /* SDV GT1 server */  	INTEL_VGA_DEVICE(0x0C1A, &intel_haswell_d_info), /* SDV GT2 server */ -	INTEL_VGA_DEVICE(0x0C2A, &intel_haswell_d_info), /* SDV GT2 server */ +	INTEL_VGA_DEVICE(0x0C2A, &intel_haswell_d_info), /* SDV GT3 server */  	INTEL_VGA_DEVICE(0x0C06, &intel_haswell_m_info), /* SDV GT1 mobile */  	INTEL_VGA_DEVICE(0x0C16, &intel_haswell_m_info), /* SDV GT2 mobile */ -	INTEL_VGA_DEVICE(0x0C26, &intel_haswell_m_info), /* SDV GT2 mobile */ +	INTEL_VGA_DEVICE(0x0C26, &intel_haswell_m_info), /* SDV GT3 mobile */ +	INTEL_VGA_DEVICE(0x0C0B, &intel_haswell_d_info), /* SDV GT1 reserved */ +	INTEL_VGA_DEVICE(0x0C1B, &intel_haswell_d_info), /* SDV GT2 reserved */ +	INTEL_VGA_DEVICE(0x0C2B, &intel_haswell_d_info), /* SDV GT3 reserved */ +	INTEL_VGA_DEVICE(0x0C0E, &intel_haswell_d_info), /* SDV GT1 reserved */ +	INTEL_VGA_DEVICE(0x0C1E, &intel_haswell_d_info), /* SDV GT2 reserved */ +	INTEL_VGA_DEVICE(0x0C2E, &intel_haswell_d_info), /* SDV GT3 reserved */  	INTEL_VGA_DEVICE(0x0A02, &intel_haswell_d_info), /* ULT GT1 desktop */  	INTEL_VGA_DEVICE(0x0A12, &intel_haswell_d_info), /* ULT GT2 desktop */ -	INTEL_VGA_DEVICE(0x0A22, &intel_haswell_d_info), /* ULT GT2 desktop */ +	INTEL_VGA_DEVICE(0x0A22, &intel_haswell_d_info), /* ULT GT3 desktop */  	INTEL_VGA_DEVICE(0x0A0A, &intel_haswell_d_info), /* ULT GT1 server */  	INTEL_VGA_DEVICE(0x0A1A, &intel_haswell_d_info), /* ULT GT2 server */ -	INTEL_VGA_DEVICE(0x0A2A, &intel_haswell_d_info), /* ULT GT2 server */ +	INTEL_VGA_DEVICE(0x0A2A, &intel_haswell_d_info), /* ULT GT3 server */  	INTEL_VGA_DEVICE(0x0A06, &intel_haswell_m_info), /* ULT GT1 mobile */  	INTEL_VGA_DEVICE(0x0A16, &intel_haswell_m_info), /* ULT GT2 mobile */ -	INTEL_VGA_DEVICE(0x0A26, &intel_haswell_m_info), /* ULT GT2 mobile */ +	INTEL_VGA_DEVICE(0x0A26, &intel_haswell_m_info), /* ULT GT3 mobile */ +	INTEL_VGA_DEVICE(0x0A0B, &intel_haswell_d_info), /* ULT GT1 reserved */ +	INTEL_VGA_DEVICE(0x0A1B, &intel_haswell_d_info), /* ULT GT2 reserved */ +	INTEL_VGA_DEVICE(0x0A2B, &intel_haswell_d_info), /* ULT GT3 reserved */ +	INTEL_VGA_DEVICE(0x0A0E, &intel_haswell_m_info), /* ULT GT1 reserved */ +	INTEL_VGA_DEVICE(0x0A1E, &intel_haswell_m_info), /* ULT GT2 reserved */ +	INTEL_VGA_DEVICE(0x0A2E, &intel_haswell_m_info), /* ULT GT3 reserved */  	INTEL_VGA_DEVICE(0x0D02, &intel_haswell_d_info), /* CRW GT1 desktop */  	INTEL_VGA_DEVICE(0x0D12, &intel_haswell_d_info), /* CRW GT2 desktop */ -	INTEL_VGA_DEVICE(0x0D22, &intel_haswell_d_info), /* CRW GT2 desktop */ +	INTEL_VGA_DEVICE(0x0D22, &intel_haswell_d_info), /* CRW GT3 desktop */  	INTEL_VGA_DEVICE(0x0D0A, &intel_haswell_d_info), /* CRW GT1 server */  	INTEL_VGA_DEVICE(0x0D1A, &intel_haswell_d_info), /* CRW GT2 server */ -	INTEL_VGA_DEVICE(0x0D2A, &intel_haswell_d_info), /* CRW GT2 server */ +	INTEL_VGA_DEVICE(0x0D2A, &intel_haswell_d_info), /* CRW GT3 server */  	INTEL_VGA_DEVICE(0x0D06, &intel_haswell_m_info), /* CRW GT1 mobile */  	INTEL_VGA_DEVICE(0x0D16, &intel_haswell_m_info), /* CRW GT2 mobile */ -	INTEL_VGA_DEVICE(0x0D26, &intel_haswell_m_info), /* CRW GT2 mobile */ +	INTEL_VGA_DEVICE(0x0D26, &intel_haswell_m_info), /* CRW GT3 mobile */ +	INTEL_VGA_DEVICE(0x0D0B, &intel_haswell_d_info), /* CRW GT1 reserved */ +	INTEL_VGA_DEVICE(0x0D1B, &intel_haswell_d_info), /* CRW GT2 reserved */ +	INTEL_VGA_DEVICE(0x0D2B, &intel_haswell_d_info), /* CRW GT3 reserved */ +	INTEL_VGA_DEVICE(0x0D0E, &intel_haswell_d_info), /* CRW GT1 reserved */ +	INTEL_VGA_DEVICE(0x0D1E, &intel_haswell_d_info), /* CRW GT2 reserved */ +	INTEL_VGA_DEVICE(0x0D2E, &intel_haswell_d_info), /* CRW GT3 reserved */  	INTEL_VGA_DEVICE(0x0f30, &intel_valleyview_m_info),  	INTEL_VGA_DEVICE(0x0f31, &intel_valleyview_m_info),  	INTEL_VGA_DEVICE(0x0f32, &intel_valleyview_m_info), diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d5dcf7fe1ee..b9d00dcf9a2 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1943,4 +1943,19 @@ static inline void __user *to_user_ptr(u64 address)  	return (void __user *)(uintptr_t)address;  } +static inline unsigned long msecs_to_jiffies_timeout(const unsigned int m) +{ +	unsigned long j = msecs_to_jiffies(m); + +	return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1); +} + +static inline unsigned long +timespec_to_jiffies_timeout(const struct timespec *value) +{ +	unsigned long j = timespec_to_jiffies(value); + +	return min_t(unsigned long, MAX_JIFFY_OFFSET, j + 1); +} +  #endif diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6165535d15f..970ad17c99a 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error)  {  	int ret; -#define EXIT_COND (!i915_reset_in_progress(error)) +#define EXIT_COND (!i915_reset_in_progress(error) || \ +		   i915_terminally_wedged(error))  	if (EXIT_COND)  		return 0; -	/* GPU is already declared terminally dead, give up. */ -	if (i915_terminally_wedged(error)) -		return -EIO; -  	/*  	 * Only wait 10 seconds for the gpu reset to complete to avoid hanging  	 * userspace. If it takes that long something really bad is going on and @@ -1003,7 +1000,7 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,  		wait_forever = false;  	} -	timeout_jiffies = timespec_to_jiffies(&wait_time); +	timeout_jiffies = timespec_to_jiffies_timeout(&wait_time);  	if (WARN_ON(!ring->irq_get(ring)))  		return -ENODEV; diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index efe82991975..56746dcac40 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -7937,6 +7937,11 @@ intel_modeset_check_state(struct drm_device *dev)  		memset(&pipe_config, 0, sizeof(pipe_config));  		active = dev_priv->display.get_pipe_config(crtc,  							   &pipe_config); + +		/* hw state is inconsistent with the pipe A quirk */ +		if (crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) +			active = crtc->active; +  		WARN(crtc->active != active,  		     "crtc active state doesn't match with hw state "  		     "(expected %i, found %i)\n", crtc->active, active); @@ -8140,6 +8145,21 @@ static void intel_set_config_restore_state(struct drm_device *dev,  	}  } +static bool +is_crtc_connector_off(struct drm_crtc *crtc, struct drm_connector *connectors, +		      int num_connectors) +{ +	int i; + +	for (i = 0; i < num_connectors; i++) +		if (connectors[i].encoder && +		    connectors[i].encoder->crtc == crtc && +		    connectors[i].dpms != DRM_MODE_DPMS_ON) +			return true; + +	return false; +} +  static void  intel_set_config_compute_mode_changes(struct drm_mode_set *set,  				      struct intel_set_config *config) @@ -8147,7 +8167,11 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set,  	/* We should be able to check here if the fb has the same properties  	 * and then just flip_or_move it */ -	if (set->crtc->fb != set->fb) { +	if (set->connectors != NULL && +	    is_crtc_connector_off(set->crtc, *set->connectors, +				  set->num_connectors)) { +			config->mode_changed = true; +	} else if (set->crtc->fb != set->fb) {  		/* If we have no fb then treat it as a full mode set */  		if (set->crtc->fb == NULL) {  			DRM_DEBUG_KMS("crtc has no fb, full mode set\n"); @@ -8157,8 +8181,9 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set,  		} else if (set->fb->pixel_format !=  			   set->crtc->fb->pixel_format) {  			config->mode_changed = true; -		} else +		} else {  			config->fb_changed = true; +		}  	}  	if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y)) @@ -8332,11 +8357,6 @@ static int intel_crtc_set_config(struct drm_mode_set *set)  		ret = intel_set_mode(set->crtc, set->mode,  				     set->x, set->y, set->fb); -		if (ret) { -			DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n", -				  set->crtc->base.id, ret); -			goto fail; -		}  	} else if (config->fb_changed) {  		intel_crtc_wait_for_pending_flips(set->crtc); @@ -8344,18 +8364,18 @@ static int intel_crtc_set_config(struct drm_mode_set *set)  					  set->x, set->y, set->fb);  	} -	intel_set_config_free(config); - -	return 0; - +	if (ret) { +		DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n", +			  set->crtc->base.id, ret);  fail: -	intel_set_config_restore_state(dev, config); +		intel_set_config_restore_state(dev, config); -	/* Try to restore the config */ -	if (config->mode_changed && -	    intel_set_mode(save_set.crtc, save_set.mode, -			   save_set.x, save_set.y, save_set.fb)) -		DRM_ERROR("failed to restore config after modeset failure\n"); +		/* Try to restore the config */ +		if (config->mode_changed && +		    intel_set_mode(save_set.crtc, save_set.mode, +				   save_set.x, save_set.y, save_set.fb)) +			DRM_ERROR("failed to restore config after modeset failure\n"); +	}  out_config:  	intel_set_config_free(config); diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 3d704b706a8..70789b1b564 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -303,7 +303,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)  #define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)  	if (has_aux_irq)  		done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, -					  msecs_to_jiffies(10)); +					  msecs_to_jiffies_timeout(10));  	else  		done = wait_for_atomic(C, 10) == 0;  	if (!done) diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 5d245031e39..639fe192997 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c @@ -228,7 +228,7 @@ gmbus_wait_hw_status(struct drm_i915_private *dev_priv,  	 * need to wake up periodically and check that ourselves. */  	I915_WRITE(GMBUS4 + reg_offset, gmbus4_irq_en); -	for (i = 0; i < msecs_to_jiffies(50) + 1; i++) { +	for (i = 0; i < msecs_to_jiffies_timeout(50); i++) {  		prepare_to_wait(&dev_priv->gmbus_wait_queue, &wait,  				TASK_UNINTERRUPTIBLE); @@ -263,7 +263,8 @@ gmbus_wait_idle(struct drm_i915_private *dev_priv)  	/* Important: The hw handles only the first bit, so set only one! */  	I915_WRITE(GMBUS4 + reg_offset, GMBUS_IDLE_EN); -	ret = wait_event_timeout(dev_priv->gmbus_wait_queue, C, 10); +	ret = wait_event_timeout(dev_priv->gmbus_wait_queue, C, +				 msecs_to_jiffies_timeout(10));  	I915_WRITE(GMBUS4 + reg_offset, 0); diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index f36f1baabd5..29412cc89c7 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -815,10 +815,10 @@ static const struct dmi_system_id intel_no_lvds[] = {  	},  	{  		.callback = intel_no_lvds_dmi_callback, -		.ident = "Hewlett-Packard HP t5740e Thin Client", +		.ident = "Hewlett-Packard HP t5740",  		.matches = {  			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), -			DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), +			DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),  		},  	},  	{ diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d15428404b9..4c47b449b77 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -1776,7 +1776,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)  	 * Assume that the preferred modes are  	 * arranged in priority order.  	 */ -	intel_ddc_get_modes(connector, intel_sdvo->i2c); +	intel_ddc_get_modes(connector, &intel_sdvo->ddc);  	if (list_empty(&connector->probed_modes) == false)  		goto end; diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 77b8a45fb10..ee66badc8bb 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c @@ -1034,13 +1034,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,  			else  				hi_pri_lvl = 5; -			WREG8(0x1fde, 0x06); -			WREG8(0x1fdf, hi_pri_lvl); +			WREG8(MGAREG_CRTCEXT_INDEX, 0x06); +			WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl);  		} else { +			WREG8(MGAREG_CRTCEXT_INDEX, 0x06);  			if (mdev->reg_1e24 >= 0x01) -				WREG8(0x1fdf, 0x03); +				WREG8(MGAREG_CRTCEXT_DATA, 0x03);  			else -				WREG8(0x1fdf, 0x04); +				WREG8(MGAREG_CRTCEXT_DATA, 0x04);  		}  	}  	return 0; diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c index d0817d94454..f02fd9f443f 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c @@ -50,11 +50,16 @@ nv50_dac_sense(struct nv50_disp_priv *priv, int or, u32 loadval)  {  	const u32 doff = (or * 0x800);  	int load = -EINVAL; +	nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000); +	nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);  	nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); -	udelay(9500); +	mdelay(9); +	udelay(500);  	nv_wr32(priv, 0x61a00c + doff, 0x80000000);  	load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27;  	nv_wr32(priv, 0x61a00c + doff, 0x00000000); +	nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000); +	nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);  	return load;  } diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c index 0d36bdc5141..7fdade6e604 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c @@ -55,6 +55,10 @@ nv84_hdmi_ctrl(struct nv50_disp_priv *priv, int head, int or, u32 data)  	nv_wr32(priv, 0x616510 + hoff, 0x00000000);  	nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); +	nv_mask(priv, 0x6165d0 + hoff, 0x00070001, 0x00010001); /* SPARE, HW_CTS */ +	nv_mask(priv, 0x616568 + hoff, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */ +	nv_mask(priv, 0x616578 + hoff, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */ +  	/* ??? */  	nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */  	nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c index 89bf459d584..e9b8217d007 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c @@ -40,14 +40,13 @@   * FIFO channel objects   ******************************************************************************/ -void -nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) +static void +nv50_fifo_playlist_update_locked(struct nv50_fifo_priv *priv)  {  	struct nouveau_bar *bar = nouveau_bar(priv);  	struct nouveau_gpuobj *cur;  	int i, p; -	mutex_lock(&nv_subdev(priv)->mutex);  	cur = priv->playlist[priv->cur_playlist];  	priv->cur_playlist = !priv->cur_playlist; @@ -61,6 +60,13 @@ nv50_fifo_playlist_update(struct nv50_fifo_priv *priv)  	nv_wr32(priv, 0x0032f4, cur->addr >> 12);  	nv_wr32(priv, 0x0032ec, p);  	nv_wr32(priv, 0x002500, 0x00000101); +} + +void +nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) +{ +	mutex_lock(&nv_subdev(priv)->mutex); +	nv50_fifo_playlist_update_locked(priv);  	mutex_unlock(&nv_subdev(priv)->mutex);  } @@ -489,7 +495,7 @@ nv50_fifo_init(struct nouveau_object *object)  	for (i = 0; i < 128; i++)  		nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); -	nv50_fifo_playlist_update(priv); +	nv50_fifo_playlist_update_locked(priv);  	nv_wr32(priv, 0x003200, 0x00000001);  	nv_wr32(priv, 0x003250, 0x00000001); diff --git a/drivers/gpu/drm/nouveau/core/include/core/class.h b/drivers/gpu/drm/nouveau/core/include/core/class.h index 0a393f7f055..5a5961b6a6a 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/class.h +++ b/drivers/gpu/drm/nouveau/core/include/core/class.h @@ -218,7 +218,7 @@ struct nv04_display_class {  #define NV50_DISP_DAC_PWR_STATE                                      0x00000040  #define NV50_DISP_DAC_PWR_STATE_ON                                   0x00000000  #define NV50_DISP_DAC_PWR_STATE_OFF                                  0x00000040 -#define NV50_DISP_DAC_LOAD                                           0x0002000c +#define NV50_DISP_DAC_LOAD                                           0x00020100  #define NV50_DISP_DAC_LOAD_VALUE                                     0x00000007  #define NV50_DISP_PIOR_MTHD                                          0x00030000 diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 7bf22d4a3d9..f17dc2ab03e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c @@ -638,17 +638,8 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,  	}  	s = list_first_entry(&fctx->flip, struct nouveau_page_flip_state, head); -	if (s->event) { -		struct drm_pending_vblank_event *e = s->event; -		struct timeval now; - -		do_gettimeofday(&now); -		e->event.sequence = 0; -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; -		list_add_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -	} +	if (s->event) +		drm_send_vblank_event(dev, -1, s->event);  	list_del(&s->head);  	if (ps) diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index ebf0a683305..dd5e01f89f2 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c @@ -1554,7 +1554,9 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)  {  	struct nv50_disp *disp = nv50_disp(encoder->dev);  	int ret, or = nouveau_encoder(encoder)->or; -	u32 load = 0; +	u32 load = nouveau_drm(encoder->dev)->vbios.dactestval; +	if (load == 0) +		load = 340;  	ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load));  	if (ret || load != 7) diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 9c53c25e520..826586ffbe8 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -649,6 +649,9 @@ static void pdev_shutdown(struct platform_device *device)  static int pdev_probe(struct platform_device *device)  { +	if (omapdss_is_initialized() == false) +		return -EPROBE_DEFER; +  	DBG("%s", device->name);  	return drm_platform_init(&omap_drm_driver, device);  } diff --git a/drivers/gpu/drm/qxl/Kconfig b/drivers/gpu/drm/qxl/Kconfig index 2f1a57e1114..d6c12796023 100644 --- a/drivers/gpu/drm/qxl/Kconfig +++ b/drivers/gpu/drm/qxl/Kconfig @@ -4,6 +4,7 @@ config DRM_QXL  	select FB_SYS_FILLRECT  	select FB_SYS_COPYAREA  	select FB_SYS_IMAGEBLIT +	select FB_DEFERRED_IO          select DRM_KMS_HELPER          select DRM_TTM  	help diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 6db7370373e..a4b71b25fa5 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c @@ -151,7 +151,7 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,  		struct qxl_bo *cmd_bo;  		int release_type;  		struct drm_qxl_command *commands = -			(struct drm_qxl_command *)execbuffer->commands; +			(struct drm_qxl_command *)(uintptr_t)execbuffer->commands;  		if (DRM_COPY_FROM_USER(&user_cmd, &commands[cmd_num],  				       sizeof(user_cmd))) @@ -193,7 +193,7 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data,  		for (i = 0 ; i < user_cmd.relocs_num; ++i) {  			if (DRM_COPY_FROM_USER(&reloc, -					       &((struct drm_qxl_reloc *)user_cmd.relocs)[i], +					       &((struct drm_qxl_reloc *)(uintptr_t)user_cmd.relocs)[i],  					       sizeof(reloc))) {  				qxl_bo_list_unreserve(&reloc_list, true);  				qxl_release_unreserve(qdev, release); diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c index 85127ed24cf..e27ce2a907c 100644 --- a/drivers/gpu/drm/qxl/qxl_kms.c +++ b/drivers/gpu/drm/qxl/qxl_kms.c @@ -128,12 +128,13 @@ int qxl_device_init(struct qxl_device *qdev,  	qdev->vram_mapping = io_mapping_create_wc(qdev->vram_base, pci_resource_len(pdev, 0));  	qdev->surface_mapping = io_mapping_create_wc(qdev->surfaceram_base, qdev->surfaceram_size); -	DRM_DEBUG_KMS("qxl: vram %p-%p(%dM %dk), surface %p-%p(%dM %dk)\n", -		 (void *)qdev->vram_base, (void *)pci_resource_end(pdev, 0), +	DRM_DEBUG_KMS("qxl: vram %llx-%llx(%dM %dk), surface %llx-%llx(%dM %dk)\n", +		 (unsigned long long)qdev->vram_base, +		 (unsigned long long)pci_resource_end(pdev, 0),  		 (int)pci_resource_len(pdev, 0) / 1024 / 1024,  		 (int)pci_resource_len(pdev, 0) / 1024, -		 (void *)qdev->surfaceram_base, -		 (void *)pci_resource_end(pdev, 1), +		 (unsigned long long)qdev->surfaceram_base, +		 (unsigned long long)pci_resource_end(pdev, 1),  		 (int)qdev->surfaceram_size / 1024 / 1024,  		 (int)qdev->surfaceram_size / 1024); diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 44a7da66e08..8406c8251fb 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c @@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)  int  atombios_get_encoder_mode(struct drm_encoder *encoder)  { +	struct drm_device *dev = encoder->dev; +	struct radeon_device *rdev = dev->dev_private;  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	struct drm_connector *connector;  	struct radeon_connector *radeon_connector; @@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)  	case DRM_MODE_CONNECTOR_DVII:  	case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */  		if (drm_detect_hdmi_monitor(radeon_connector->edid) && -		    radeon_audio) +		    radeon_audio && +		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */  			return ATOM_ENCODER_MODE_HDMI;  		else if (radeon_connector->use_digital)  			return ATOM_ENCODER_MODE_DVI; @@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)  	case DRM_MODE_CONNECTOR_HDMIA:  	default:  		if (drm_detect_hdmi_monitor(radeon_connector->edid) && -		    radeon_audio) +		    radeon_audio && +		    !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */  			return ATOM_ENCODER_MODE_HDMI;  		else  			return ATOM_ENCODER_MODE_DVI; @@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)  		    (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))  			return ATOM_ENCODER_MODE_DP;  		else if (drm_detect_hdmi_monitor(radeon_connector->edid) && -			 radeon_audio) +			 radeon_audio && +			 !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */  			return ATOM_ENCODER_MODE_HDMI;  		else  			return ATOM_ENCODER_MODE_DVI; diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 8f9e2d31b25..0f89ce3d02b 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -4754,6 +4754,12 @@ static int evergreen_startup(struct radeon_device *rdev)  		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r = r600_irq_init(rdev);  	if (r) {  		DRM_ERROR("radeon: IH init failed (%d).\n", r); @@ -4923,10 +4929,6 @@ int evergreen_init(struct radeon_device *rdev)  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r; -  	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;  	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); @@ -4999,8 +5001,7 @@ void evergreen_fini(struct radeon_device *rdev)  void evergreen_pcie_gen2_enable(struct radeon_device *rdev)  { -	u32 link_width_cntl, speed_cntl, mask; -	int ret; +	u32 link_width_cntl, speed_cntl;  	if (radeon_pcie_gen2 == 0)  		return; @@ -5015,11 +5016,8 @@ void evergreen_pcie_gen2_enable(struct radeon_device *rdev)  	if (ASIC_IS_X2(rdev))  		return; -	ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); -	if (ret != 0) -		return; - -	if (!(mask & DRM_PCIE_SPEED_50)) +	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && +		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))  		return;  	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 7969c0c8ec2..84583302b08 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c @@ -2025,6 +2025,12 @@ static int cayman_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r = r600_irq_init(rdev);  	if (r) {  		DRM_ERROR("radeon: IH init failed (%d).\n", r); @@ -2190,10 +2196,6 @@ int cayman_init(struct radeon_device *rdev)  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r; -  	ring->ring_obj = NULL;  	r600_ring_init(rdev, ring, 1024 * 1024); diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 4973bff37fe..d0314ecbd7c 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r100_irq_set(rdev);  	rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -4024,9 +4030,6 @@ int r100_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index c60350e6872..b9b776f1e58 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c @@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r100_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -1516,9 +1522,6 @@ int r300_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 6fce2eb4dd1..4e796ecf9ea 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c @@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r100_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev)  	if (r) {  		return r;  	} -	r = radeon_irq_kms_init(rdev); -	if (r) { -		return r; -	}  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) { diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index f795a4e092c..e1aece73b37 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c @@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	rs600_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -297,9 +303,6 @@ int r520_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1a08008c978..0e534169592 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev)  	return -1;  } +uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) +{ +	uint32_t r; + +	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); +	r = RREG32(R_0028FC_MC_DATA); +	WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); +	return r; +} + +void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) +{ +	WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | +		S_0028F8_MC_IND_WR_EN(1)); +	WREG32(R_0028FC_MC_DATA, v); +	WREG32(R_0028F8_MC_INDEX, 0x7F); +} +  static void r600_mc_program(struct radeon_device *rdev)  {  	struct rv515_mc_save save; @@ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev)  {  	u32 tmp;  	int chansize, numchan; +	uint32_t h_addr, l_addr; +	unsigned long long k8_addr;  	/* Get VRAM informations */  	rdev->mc.vram_is_ddr = true; @@ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev)  	if (rdev->flags & RADEON_IS_IGP) {  		rs690_pm_info(rdev);  		rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); + +		if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { +			/* Use K8 direct mapping for fast fb access. */ +			rdev->fastfb_working = false; +			h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); +			l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); +			k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; +#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) +			if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) +#endif +			{ +				/* FastFB shall be used with UMA memory. Here it is simply disabled when sideport +		 		* memory is present. +		 		*/ +				if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { +					DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", +						(unsigned long long)rdev->mc.aper_base, k8_addr); +					rdev->mc.aper_base = (resource_size_t)k8_addr; +					rdev->fastfb_working = true; +				} +			} +  		}  	} +  	radeon_update_bandwidth_info(rdev);  	return 0;  } @@ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r = r600_irq_init(rdev);  	if (r) {  		DRM_ERROR("radeon: IH init failed (%d).\n", r); @@ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev)  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r; -  	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;  	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); @@ -4631,8 +4676,6 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev)  {  	u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp;  	u16 link_cntl2; -	u32 mask; -	int ret;  	if (radeon_pcie_gen2 == 0)  		return; @@ -4651,11 +4694,8 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev)  	if (rdev->family <= CHIP_R600)  		return; -	ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); -	if (ret != 0) -		return; - -	if (!(mask & DRM_PCIE_SPEED_50)) +	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && +		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))  		return;  	speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index acb146c0697..79df558f8c4 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h @@ -1342,6 +1342,14 @@  #define	PACKET3_STRMOUT_BASE_UPDATE			0x72 /* r7xx */  #define	PACKET3_SURFACE_BASE_UPDATE			0x73 +#define R_000011_K8_FB_LOCATION                 0x11 +#define R_000012_MC_MISC_UMA_CNTL               0x12 +#define   G_000012_K8_ADDR_EXT(x)               (((x) >> 0) & 0xFF) +#define R_0028F8_MC_INDEX			0x28F8 +#define   	S_0028F8_MC_IND_ADDR(x)                 (((x) & 0x1FF) << 0) +#define   	C_0028F8_MC_IND_ADDR                    0xFFFFFE00 +#define   	S_0028F8_MC_IND_WR_EN(x)                (((x) & 0x1) << 9) +#define R_0028FC_MC_DATA                        0x28FC  #define	R_008020_GRBM_SOFT_RESET		0x8020  #define		S_008020_SOFT_RESET_CP(x)		(((x) & 1) << 0) diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 06b8c19ab19..a2802b47ee9 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c @@ -122,6 +122,10 @@ static void radeon_register_accessor_init(struct radeon_device *rdev)  		rdev->mc_rreg = &rs600_mc_rreg;  		rdev->mc_wreg = &rs600_mc_wreg;  	} +	if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { +		rdev->mc_rreg = &rs780_mc_rreg; +		rdev->mc_wreg = &rs780_mc_wreg; +	}  	if (rdev->family >= CHIP_R600) {  		rdev->pciep_rreg = &r600_pciep_rreg;  		rdev->pciep_wreg = &r600_pciep_wreg; diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 2c87365d345..a72759ede75 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h @@ -347,6 +347,8 @@ extern bool r600_gui_idle(struct radeon_device *rdev);  extern void r600_pm_misc(struct radeon_device *rdev);  extern void r600_pm_init_profile(struct radeon_device *rdev);  extern void rs780_pm_init_profile(struct radeon_device *rdev); +extern uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg); +extern void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);  extern void r600_pm_get_dynpm_state(struct radeon_device *rdev);  extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes);  extern int r600_get_pcie_lanes(struct radeon_device *rdev); diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index c2c59fb1ea0..189973836cf 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -467,23 +467,27 @@ bool radeon_card_posted(struct radeon_device *rdev)  {  	uint32_t reg; +	/* required for EFI mode on macbook2,1 which uses an r5xx asic */  	if (efi_enabled(EFI_BOOT) && -	    rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) +	    (rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && +	    (rdev->family < CHIP_R600))  		return false; +	if (ASIC_IS_NODCE(rdev)) +		goto check_memsize; +  	/* first check CRTCs */ -	if (ASIC_IS_DCE41(rdev)) { +	if (ASIC_IS_DCE4(rdev)) {  		reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |  			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); -		if (reg & EVERGREEN_CRTC_MASTER_EN) -			return true; -	} else if (ASIC_IS_DCE4(rdev)) { -		reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) | -			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET) | -			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | -			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET) | -			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) | -			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); +			if (rdev->num_crtc >= 4) { +				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) | +					RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); +			} +			if (rdev->num_crtc >= 6) { +				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) | +					RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); +			}  		if (reg & EVERGREEN_CRTC_MASTER_EN)  			return true;  	} else if (ASIC_IS_AVIVO(rdev)) { @@ -500,6 +504,7 @@ bool radeon_card_posted(struct radeon_device *rdev)  		}  	} +check_memsize:  	/* then check MEM_SIZE, in case the crtcs are off */  	if (rdev->family >= CHIP_R600)  		reg = RREG32(R600_CONFIG_MEMSIZE); diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index e38fd559f1a..eb18bb7af1c 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c @@ -271,8 +271,6 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)  {  	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];  	struct radeon_unpin_work *work; -	struct drm_pending_vblank_event *e; -	struct timeval now;  	unsigned long flags;  	u32 update_pending;  	int vpos, hpos; @@ -328,14 +326,9 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)  	radeon_crtc->unpin_work = NULL;  	/* wakeup userspace */ -	if (work->event) { -		e = work->event; -		e->event.sequence = drm_vblank_count_and_time(rdev->ddev, crtc_id, &now); -		e->event.tv_sec = now.tv_sec; -		e->event.tv_usec = now.tv_usec; -		list_add_tail(&e->base.link, &e->base.file_priv->event_list); -		wake_up_interruptible(&e->base.file_priv->event_wait); -	} +	if (work->event) +		drm_send_vblank_event(rdev->ddev, crtc_id, work->event); +  	spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);  	drm_vblank_put(rdev->ddev, radeon_crtc->crtc_id); diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 73051ce3121..233a9b9fa1f 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c @@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r100_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -535,9 +541,6 @@ int rs400_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 46fa1b07c56..670b555d2ca 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c @@ -923,6 +923,12 @@ static int rs600_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	rs600_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -1047,9 +1053,6 @@ int rs600_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index ab4c86cfd55..55880d5962c 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c @@ -651,6 +651,12 @@ static int rs690_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	rs600_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -776,9 +782,6 @@ int rs690_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index ffcba730c57..21c7d7b26e5 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c @@ -532,6 +532,12 @@ static int rv515_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	rs600_irq_set(rdev);  	rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);  	/* 1M ring buffer */ @@ -662,9 +668,6 @@ int rv515_init(struct radeon_device *rdev)  	r = radeon_fence_driver_init(rdev);  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r;  	/* Memory manager */  	r = radeon_bo_init(rdev);  	if (r) diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 83f612a9500..4a62ad2e539 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c @@ -862,10 +862,8 @@ int rv770_uvd_resume(struct radeon_device *rdev)  		chip_id = 0x0100000b;  		break;  	case CHIP_SUMO: -		chip_id = 0x0100000c; -		break;  	case CHIP_SUMO2: -		chip_id = 0x0100000d; +		chip_id = 0x0100000c;  		break;  	case CHIP_PALM:  		chip_id = 0x0100000e; @@ -1889,6 +1887,12 @@ static int rv770_startup(struct radeon_device *rdev)  		rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r = r600_irq_init(rdev);  	if (r) {  		DRM_ERROR("radeon: IH init failed (%d).\n", r); @@ -2047,10 +2051,6 @@ int rv770_init(struct radeon_device *rdev)  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r; -  	rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;  	r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); @@ -2113,8 +2113,6 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev)  {  	u32 link_width_cntl, lanes, speed_cntl, tmp;  	u16 link_cntl2; -	u32 mask; -	int ret;  	if (radeon_pcie_gen2 == 0)  		return; @@ -2129,11 +2127,8 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev)  	if (ASIC_IS_X2(rdev))  		return; -	ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); -	if (ret != 0) -		return; - -	if (!(mask & DRM_PCIE_SPEED_50)) +	if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && +		(rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT))  		return;  	DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 5ffade69af2..a1b0da6b580 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c @@ -2616,7 +2616,7 @@ static void si_gpu_init(struct radeon_device *rdev)  	default:  		rdev->config.si.max_shader_engines = 1;  		rdev->config.si.max_tile_pipes = 4; -		rdev->config.si.max_cu_per_sh = 2; +		rdev->config.si.max_cu_per_sh = 5;  		rdev->config.si.max_sh_per_se = 2;  		rdev->config.si.max_backends_per_se = 4;  		rdev->config.si.max_texture_channel_caches = 4; @@ -5350,6 +5350,12 @@ static int si_startup(struct radeon_device *rdev)  	}  	/* Enable IRQ */ +	if (!rdev->irq.installed) { +		r = radeon_irq_kms_init(rdev); +		if (r) +			return r; +	} +  	r = si_irq_init(rdev);  	if (r) {  		DRM_ERROR("radeon: IH init failed (%d).\n", r); @@ -5533,10 +5539,6 @@ int si_init(struct radeon_device *rdev)  	if (r)  		return r; -	r = radeon_irq_kms_init(rdev); -	if (r) -		return r; -  	ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX];  	ring->ring_obj = NULL;  	r600_ring_init(rdev, ring, 1024 * 1024); diff --git a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c index 7dff49ed66e..99e2034e49c 100644 --- a/drivers/gpu/drm/shmobile/shmob_drm_crtc.c +++ b/drivers/gpu/drm/shmobile/shmob_drm_crtc.c @@ -451,27 +451,16 @@ void shmob_drm_crtc_finish_page_flip(struct shmob_drm_crtc *scrtc)  {  	struct drm_pending_vblank_event *event;  	struct drm_device *dev = scrtc->crtc.dev; -	struct timeval vblanktime;  	unsigned long flags;  	spin_lock_irqsave(&dev->event_lock, flags);  	event = scrtc->event;  	scrtc->event = NULL; +	if (event) { +		drm_send_vblank_event(dev, 0, event); +		drm_vblank_put(dev, 0); +	}  	spin_unlock_irqrestore(&dev->event_lock, flags); - -	if (event == NULL) -		return; - -	event->event.sequence = drm_vblank_count_and_time(dev, 0, &vblanktime); -	event->event.tv_sec = vblanktime.tv_sec; -	event->event.tv_usec = vblanktime.tv_usec; - -	spin_lock_irqsave(&dev->event_lock, flags); -	list_add_tail(&event->base.link, &event->base.file_priv->event_list); -	wake_up_interruptible(&event->base.file_priv->event_wait); -	spin_unlock_irqrestore(&dev->event_lock, flags); - -	drm_vblank_put(dev, 0);  }  static int shmob_drm_crtc_page_flip(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig index e461e997245..7a4d1010690 100644 --- a/drivers/gpu/drm/tilcdc/Kconfig +++ b/drivers/gpu/drm/tilcdc/Kconfig @@ -6,6 +6,7 @@ config DRM_TILCDC  	select DRM_GEM_CMA_HELPER  	select VIDEOMODE_HELPERS  	select BACKLIGHT_CLASS_DEVICE +	select BACKLIGHT_LCD_SUPPORT  	help  	  Choose this option if you have an TI SoC with LCDC display  	  controller, for example AM33xx in beagle-bone, DA8xx, or diff --git a/drivers/iio/buffer_cb.c b/drivers/iio/buffer_cb.c index 9201022945e..9d19ba74f22 100644 --- a/drivers/iio/buffer_cb.c +++ b/drivers/iio/buffer_cb.c @@ -64,7 +64,7 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,  	while (chan->indio_dev) {  		if (chan->indio_dev != indio_dev) {  			ret = -EINVAL; -			goto error_release_channels; +			goto error_free_scan_mask;  		}  		set_bit(chan->channel->scan_index,  			cb_buff->buffer.scan_mask); @@ -73,6 +73,8 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,  	return cb_buff; +error_free_scan_mask: +	kfree(cb_buff->buffer.scan_mask);  error_release_channels:  	iio_channel_release_all(cb_buff->channels);  error_free_cb_buff: @@ -100,6 +102,7 @@ EXPORT_SYMBOL_GPL(iio_channel_stop_all_cb);  void iio_channel_release_all_cb(struct iio_cb_buffer *cb_buff)  { +	kfree(cb_buff->buffer.scan_mask);  	iio_channel_release_all(cb_buff->channels);  	kfree(cb_buff);  } diff --git a/drivers/iio/frequency/adf4350.c b/drivers/iio/frequency/adf4350.c index a884252ac66..e76d4ace53f 100644 --- a/drivers/iio/frequency/adf4350.c +++ b/drivers/iio/frequency/adf4350.c @@ -212,7 +212,7 @@ static int adf4350_set_freq(struct adf4350_state *st, unsigned long long freq)  		(pdata->r2_user_settings & (ADF4350_REG2_PD_POLARITY_POS |  		ADF4350_REG2_LDP_6ns | ADF4350_REG2_LDF_INT_N |  		ADF4350_REG2_CHARGE_PUMP_CURR_uA(5000) | -		ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x9))); +		ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x3)));  	st->regs[ADF4350_REG3] = pdata->r3_user_settings &  				 (ADF4350_REG3_12BIT_CLKDIV(0xFFF) | diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 795d100b4c3..98ddc323add 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c @@ -124,7 +124,7 @@ static int __of_iio_channel_get(struct iio_channel *channel,  	channel->indio_dev = indio_dev;  	index = iiospec.args_count ? iiospec.args[0] : 0;  	if (index >= indio_dev->num_channels) { -		return -EINVAL; +		err = -EINVAL;  		goto err_put;  	}  	channel->channel = &indio_dev->channels[index]; @@ -450,7 +450,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan,  	s64 raw64 = raw;  	int ret; -	ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_SCALE); +	ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET);  	if (ret == 0)  		raw64 += offset; diff --git a/drivers/infiniband/hw/qib/qib_keys.c b/drivers/infiniband/hw/qib/qib_keys.c index 81c7b73695d..3b9afccaaad 100644 --- a/drivers/infiniband/hw/qib/qib_keys.c +++ b/drivers/infiniband/hw/qib/qib_keys.c @@ -61,7 +61,7 @@ int qib_alloc_lkey(struct qib_mregion *mr, int dma_region)  	if (dma_region) {  		struct qib_mregion *tmr; -		tmr = rcu_dereference(dev->dma_mr); +		tmr = rcu_access_pointer(dev->dma_mr);  		if (!tmr) {  			qib_get_mr(mr);  			rcu_assign_pointer(dev->dma_mr, mr); diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index f19b0998a53..2e84ef859c5 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c @@ -5,6 +5,7 @@   * Copyright (C) 2004 Alex Aizman   * Copyright (C) 2005 Mike Christie   * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved. + * Copyright (c) 2013 Mellanox Technologies. All rights reserved.   * maintained by openib-general@openib.org   *   * This software is available to you under a choice of one of two diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 06f578cde75..4f069c0d4c0 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h @@ -8,6 +8,7 @@   *   * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.   * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved. + * Copyright (c) 2013 Mellanox Technologies. All rights reserved.   *   * This software is available to you under a choice of one of two   * licenses.  You may choose to be licensed under the terms of the GNU diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c index a00ccd1ca33..b6d81a86c97 100644 --- a/drivers/infiniband/ulp/iser/iser_initiator.c +++ b/drivers/infiniband/ulp/iser/iser_initiator.c @@ -1,5 +1,6 @@  /*   * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. + * Copyright (c) 2013 Mellanox Technologies. All rights reserved.   *   * This software is available to you under a choice of one of two   * licenses.  You may choose to be licensed under the terms of the GNU diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 68ebb7fe072..7827baf455a 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c @@ -1,5 +1,6 @@  /*   * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. + * Copyright (c) 2013 Mellanox Technologies. All rights reserved.   *   * This software is available to you under a choice of one of two   * licenses.  You may choose to be licensed under the terms of the GNU diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 5278916c310..2c4941d0656 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c @@ -1,6 +1,7 @@  /*   * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved.   * Copyright (c) 2005, 2006 Cisco Systems.  All rights reserved. + * Copyright (c) 2013 Mellanox Technologies. All rights reserved.   *   * This software is available to you under a choice of one of two   * licenses.  You may choose to be licensed under the terms of the GNU @@ -292,10 +293,10 @@ out_err:  }  /** - * releases the FMR pool, QP and CMA ID objects, returns 0 on success, + * releases the FMR pool and QP objects, returns 0 on success,   * -1 on failure   */ -static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id) +static int iser_free_ib_conn_res(struct iser_conn *ib_conn)  {  	int cq_index;  	BUG_ON(ib_conn == NULL); @@ -314,13 +315,9 @@ static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id)  		rdma_destroy_qp(ib_conn->cma_id);  	} -	/* if cma handler context, the caller acts s.t the cma destroy the id */ -	if (ib_conn->cma_id != NULL && can_destroy_id) -		rdma_destroy_id(ib_conn->cma_id);  	ib_conn->fmr_pool = NULL;  	ib_conn->qp	  = NULL; -	ib_conn->cma_id   = NULL;  	kfree(ib_conn->page_vec);  	if (ib_conn->login_buf) { @@ -415,11 +412,16 @@ static void iser_conn_release(struct iser_conn *ib_conn, int can_destroy_id)  	list_del(&ib_conn->conn_list);  	mutex_unlock(&ig.connlist_mutex);  	iser_free_rx_descriptors(ib_conn); -	iser_free_ib_conn_res(ib_conn, can_destroy_id); +	iser_free_ib_conn_res(ib_conn);  	ib_conn->device = NULL;  	/* on EVENT_ADDR_ERROR there's no device yet for this conn */  	if (device != NULL)  		iser_device_try_release(device); +	/* if cma handler context, the caller actually destroy the id */ +	if (ib_conn->cma_id != NULL && can_destroy_id) { +		rdma_destroy_id(ib_conn->cma_id); +		ib_conn->cma_id = NULL; +	}  	iscsi_destroy_endpoint(ib_conn->ep);  } diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c index b08ca7a9f76..3f3f0416fbd 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.c +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c @@ -2227,6 +2227,27 @@ static void srpt_close_ch(struct srpt_rdma_ch *ch)  }  /** + * srpt_shutdown_session() - Whether or not a session may be shut down. + */ +static int srpt_shutdown_session(struct se_session *se_sess) +{ +	struct srpt_rdma_ch *ch = se_sess->fabric_sess_ptr; +	unsigned long flags; + +	spin_lock_irqsave(&ch->spinlock, flags); +	if (ch->in_shutdown) { +		spin_unlock_irqrestore(&ch->spinlock, flags); +		return true; +	} + +	ch->in_shutdown = true; +	target_sess_cmd_list_set_waiting(se_sess); +	spin_unlock_irqrestore(&ch->spinlock, flags); + +	return true; +} + +/**   * srpt_drain_channel() - Drain a channel by resetting the IB queue pair.   * @cm_id: Pointer to the CM ID of the channel to be drained.   * @@ -2264,6 +2285,9 @@ static void srpt_drain_channel(struct ib_cm_id *cm_id)  	spin_unlock_irq(&sdev->spinlock);  	if (do_reset) { +		if (ch->sess) +			srpt_shutdown_session(ch->sess); +  		ret = srpt_ch_qp_err(ch);  		if (ret < 0)  			printk(KERN_ERR "Setting queue pair in error state" @@ -2328,7 +2352,7 @@ static void srpt_release_channel_work(struct work_struct *w)  	se_sess = ch->sess;  	BUG_ON(!se_sess); -	target_wait_for_sess_cmds(se_sess, 0); +	target_wait_for_sess_cmds(se_sess);  	transport_deregister_session_configfs(se_sess);  	transport_deregister_session(se_sess); @@ -3467,14 +3491,6 @@ static void srpt_release_cmd(struct se_cmd *se_cmd)  }  /** - * srpt_shutdown_session() - Whether or not a session may be shut down. - */ -static int srpt_shutdown_session(struct se_session *se_sess) -{ -	return true; -} - -/**   * srpt_close_session() - Forcibly close a session.   *   * Callback function invoked by the TCM core to clean up sessions associated diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.h b/drivers/infiniband/ulp/srpt/ib_srpt.h index 4caf55cda7b..3dae156905d 100644 --- a/drivers/infiniband/ulp/srpt/ib_srpt.h +++ b/drivers/infiniband/ulp/srpt/ib_srpt.h @@ -325,6 +325,7 @@ struct srpt_rdma_ch {  	u8			sess_name[36];  	struct work_struct	release_work;  	struct completion	*release_done; +	bool			in_shutdown;  };  /** diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 2f78538e09d..b2420ae19e1 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c @@ -1379,6 +1379,7 @@ static int synaptics_reconnect(struct psmouse *psmouse)  {  	struct synaptics_data *priv = psmouse->private;  	struct synaptics_data old_priv = *priv; +	unsigned char param[2];  	int retry = 0;  	int error; @@ -1394,6 +1395,7 @@ static int synaptics_reconnect(struct psmouse *psmouse)  			 */  			ssleep(1);  		} +		ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID);  		error = synaptics_detect(psmouse, 0);  	} while (error && ++retry < 3); diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 5c68e448684..518282da6d8 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c @@ -1966,7 +1966,8 @@ static const struct wacom_features wacom_features_0xF4 =  	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };  static const struct wacom_features wacom_features_0xF8 =  	{ "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS,   104480, 65600, 2047, /* Pen */ -	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; +	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, +	  .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 };  static const struct wacom_features wacom_features_0xF6 =  	{ "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */  	  .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 }; @@ -2009,7 +2010,8 @@ static const struct wacom_features wacom_features_0xFA =  	  63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };  static const struct wacom_features wacom_features_0x5B =  	{ "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS,      95840, 54260, 2047, -	  63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; +	  63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, +	  .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e };  static const struct wacom_features wacom_features_0x5E =  	{ "Wacom Cintiq 22HDT", .type = WACOM_24HDT,  	  .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 }; @@ -2042,7 +2044,7 @@ static const struct wacom_features wacom_features_0xE5 =  static const struct wacom_features wacom_features_0xE6 =  	{ "Wacom ISDv4 E6",       WACOM_PKGLEN_TPC2FG,    27760, 15694,  255,  	  0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, -	.touch_max = 2 }; +	  .touch_max = 2 };  static const struct wacom_features wacom_features_0xEC =  	{ "Wacom ISDv4 EC",       WACOM_PKGLEN_GRAPHIRE,  25710, 14500,  255,  	  0, TABLETPC,    WACOM_INTUOS_RES, WACOM_INTUOS_RES }; diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c index 29889bbdcc6..63b3d4eb0ef 100644 --- a/drivers/irqchip/irq-mxs.c +++ b/drivers/irqchip/irq-mxs.c @@ -76,16 +76,10 @@ asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs)  {  	u32 irqnr; -	do { -		irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); -		if (irqnr != 0x7f) { -			__raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); -			irqnr = irq_find_mapping(icoll_domain, irqnr); -			handle_IRQ(irqnr, regs); -			continue; -		} -		break; -	} while (1); +	irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); +	__raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); +	irqnr = irq_find_mapping(icoll_domain, irqnr); +	handle_IRQ(irqnr, regs);  }  static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c index 065b7a31a47..47a52ab580d 100644 --- a/drivers/irqchip/irq-versatile-fpga.c +++ b/drivers/irqchip/irq-versatile-fpga.c @@ -119,7 +119,7 @@ static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq,  	/* Skip invalid IRQs, only register handlers for the real ones */  	if (!(f->valid & BIT(hwirq))) -		return -ENOTSUPP; +		return -EPERM;  	irq_set_chip_data(irq, f);  	irq_set_chip_and_handler(irq, &f->chip,  				handle_level_irq); diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c index 884d11c7355..2bbb00404cf 100644 --- a/drivers/irqchip/irq-vic.c +++ b/drivers/irqchip/irq-vic.c @@ -197,7 +197,7 @@ static int vic_irqdomain_map(struct irq_domain *d, unsigned int irq,  	/* Skip invalid IRQs, only register handlers for the real ones */  	if (!(v->valid_sources & (1 << hwirq))) -		return -ENOTSUPP; +		return -EPERM;  	irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq);  	irq_set_chip_data(irq, v->base);  	set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); diff --git a/drivers/media/pci/zoran/zoran.h b/drivers/media/pci/zoran/zoran.h index ca2754a3cd6..5e040085c2f 100644 --- a/drivers/media/pci/zoran/zoran.h +++ b/drivers/media/pci/zoran/zoran.h @@ -176,7 +176,7 @@ struct zoran_fh;  struct zoran_mapping {  	struct zoran_fh *fh; -	int count; +	atomic_t count;  };  struct zoran_buffer { diff --git a/drivers/media/pci/zoran/zoran_driver.c b/drivers/media/pci/zoran/zoran_driver.c index 1168a84a737..d133c30c3fd 100644 --- a/drivers/media/pci/zoran/zoran_driver.c +++ b/drivers/media/pci/zoran/zoran_driver.c @@ -2803,8 +2803,7 @@ static void  zoran_vm_open (struct vm_area_struct *vma)  {  	struct zoran_mapping *map = vma->vm_private_data; - -	map->count++; +	atomic_inc(&map->count);  }  static void @@ -2815,7 +2814,7 @@ zoran_vm_close (struct vm_area_struct *vma)  	struct zoran *zr = fh->zr;  	int i; -	if (--map->count > 0) +	if (!atomic_dec_and_mutex_lock(&map->count, &zr->resource_lock))  		return;  	dprintk(3, KERN_INFO "%s: %s - munmap(%s)\n", ZR_DEVNAME(zr), @@ -2828,14 +2827,16 @@ zoran_vm_close (struct vm_area_struct *vma)  	kfree(map);  	/* Any buffers still mapped? */ -	for (i = 0; i < fh->buffers.num_buffers; i++) -		if (fh->buffers.buffer[i].map) +	for (i = 0; i < fh->buffers.num_buffers; i++) { +		if (fh->buffers.buffer[i].map) { +			mutex_unlock(&zr->resource_lock);  			return; +		} +	}  	dprintk(3, KERN_INFO "%s: %s - free %s buffers\n", ZR_DEVNAME(zr),  		__func__, mode_name(fh->map_mode)); -	mutex_lock(&zr->resource_lock);  	if (fh->map_mode == ZORAN_MAP_MODE_RAW) {  		if (fh->buffers.active != ZORAN_FREE) { @@ -2939,7 +2940,7 @@ zoran_mmap (struct file           *file,  		goto mmap_unlock_and_return;  	}  	map->fh = fh; -	map->count = 1; +	atomic_set(&map->count, 1);  	vma->vm_ops = &zoran_vm_ops;  	vma->vm_flags |= VM_DONTEXPAND; diff --git a/drivers/media/platform/omap/omap_vout.c b/drivers/media/platform/omap/omap_vout.c index 477268a2415..d338b19da54 100644 --- a/drivers/media/platform/omap/omap_vout.c +++ b/drivers/media/platform/omap/omap_vout.c @@ -2150,6 +2150,9 @@ static int __init omap_vout_probe(struct platform_device *pdev)  	struct omap_dss_device *def_display;  	struct omap2video_device *vid_dev = NULL; +	if (omapdss_is_initialized() == false) +		return -EPROBE_DEFER; +  	ret = omapdss_compat_init();  	if (ret) {  		dev_err(&pdev->dev, "failed to init dss\n"); diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index e75774f7260..aca59d93d5a 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -2230,10 +2230,15 @@ static void __exit atmci_cleanup_slot(struct atmel_mci_slot *slot,  	mmc_free_host(slot->mmc);  } -static bool atmci_filter(struct dma_chan *chan, void *slave) +static bool atmci_filter(struct dma_chan *chan, void *pdata)  { -	struct mci_dma_data	*sl = slave; +	struct mci_platform_data *sl_pdata = pdata; +	struct mci_dma_data *sl; +	if (!sl_pdata) +		return false; + +	sl = sl_pdata->dma_slave;  	if (sl && find_slave_dev(sl) == chan->device->dev) {  		chan->private = slave_data_ptr(sl);  		return true; @@ -2245,24 +2250,18 @@ static bool atmci_filter(struct dma_chan *chan, void *slave)  static bool atmci_configure_dma(struct atmel_mci *host)  {  	struct mci_platform_data	*pdata; +	dma_cap_mask_t mask;  	if (host == NULL)  		return false;  	pdata = host->pdev->dev.platform_data; -	if (!pdata) -		return false; +	dma_cap_zero(mask); +	dma_cap_set(DMA_SLAVE, mask); -	if (pdata->dma_slave && find_slave_dev(pdata->dma_slave)) { -		dma_cap_mask_t mask; - -		/* Try to grab a DMA channel */ -		dma_cap_zero(mask); -		dma_cap_set(DMA_SLAVE, mask); -		host->dma.chan = -			dma_request_channel(mask, atmci_filter, pdata->dma_slave); -	} +	host->dma.chan = dma_request_slave_channel_compat(mask, atmci_filter, pdata, +							  &host->pdev->dev, "rxtx");  	if (!host->dma.chan) {  		dev_warn(&host->pdev->dev, "no DMA channel available\n");  		return false; diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 6e44025acf0..eccedc7d06a 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -161,6 +161,7 @@ struct omap_hsmmc_host {  	 */  	struct	regulator	*vcc;  	struct	regulator	*vcc_aux; +	int			pbias_disable;  	void	__iomem		*base;  	resource_size_t		mapbase;  	spinlock_t		irq_lock; /* Prevent races with irq handler */ @@ -255,11 +256,11 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on,  	if (!host->vcc)  		return 0;  	/* -	 * With DT, never turn OFF the regulator. This is because +	 * With DT, never turn OFF the regulator for MMC1. This is because  	 * the pbias cell programming support is still missing when  	 * booting with Device tree  	 */ -	if (dev->of_node && !vdd) +	if (host->pbias_disable && !vdd)  		return 0;  	if (mmc_slot(host).before_set_reg) @@ -1520,10 +1521,10 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  			(ios->vdd == DUAL_VOLT_OCR_BIT) &&  			/*  			 * With pbias cell programming missing, this -			 * can't be allowed when booting with device +			 * can't be allowed on MMC1 when booting with device  			 * tree.  			 */ -			!host->dev->of_node) { +			!host->pbias_disable) {  				/*  				 * The mmc_select_voltage fn of the core does  				 * not seem to set the power_mode to @@ -1871,6 +1872,10 @@ static int omap_hsmmc_probe(struct platform_device *pdev)  	omap_hsmmc_context_save(host); +	/* This can be removed once we support PBIAS with DT */ +	if (host->dev->of_node && host->mapbase == 0x4809c000) +		host->pbias_disable = 1; +  	host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck");  	/*  	 * MMC can still work without debounce clock. @@ -1906,33 +1911,41 @@ static int omap_hsmmc_probe(struct platform_device *pdev)  	omap_hsmmc_conf_bus_power(host); -	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); -	if (!res) { -		dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n"); -		ret = -ENXIO; -		goto err_irq; -	} -	tx_req = res->start; +	if (!pdev->dev.of_node) { +		res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); +		if (!res) { +			dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n"); +			ret = -ENXIO; +			goto err_irq; +		} +		tx_req = res->start; -	res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); -	if (!res) { -		dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n"); -		ret = -ENXIO; -		goto err_irq; +		res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); +		if (!res) { +			dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n"); +			ret = -ENXIO; +			goto err_irq; +		} +		rx_req = res->start;  	} -	rx_req = res->start;  	dma_cap_zero(mask);  	dma_cap_set(DMA_SLAVE, mask); -	host->rx_chan = dma_request_channel(mask, omap_dma_filter_fn, &rx_req); +	host->rx_chan = +		dma_request_slave_channel_compat(mask, omap_dma_filter_fn, +						 &rx_req, &pdev->dev, "rx"); +  	if (!host->rx_chan) {  		dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req);  		ret = -ENXIO;  		goto err_irq;  	} -	host->tx_chan = dma_request_channel(mask, omap_dma_filter_fn, &tx_req); +	host->tx_chan = +		dma_request_slave_channel_compat(mask, omap_dma_filter_fn, +						 &tx_req, &pdev->dev, "tx"); +  	if (!host->tx_chan) {  		dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req);  		ret = -ENXIO; diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index 7bcf74b1a5c..706d9cb1a49 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c @@ -87,6 +87,12 @@ static const struct sdhci_ops sdhci_acpi_ops_dflt = {  	.enable_dma = sdhci_acpi_enable_dma,  }; +static const struct sdhci_acpi_slot sdhci_acpi_slot_int_emmc = { +	.caps    = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, +	.caps2   = MMC_CAP2_HC_ERASE_SZ, +	.flags   = SDHCI_ACPI_RUNTIME_PM, +}; +  static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {  	.quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON,  	.caps    = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD, @@ -94,23 +100,67 @@ static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = {  	.pm_caps = MMC_PM_KEEP_POWER,  }; +static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sd = { +}; + +struct sdhci_acpi_uid_slot { +	const char *hid; +	const char *uid; +	const struct sdhci_acpi_slot *slot; +}; + +static const struct sdhci_acpi_uid_slot sdhci_acpi_uids[] = { +	{ "80860F14" , "1" , &sdhci_acpi_slot_int_emmc }, +	{ "80860F14" , "3" , &sdhci_acpi_slot_int_sd   }, +	{ "INT33BB"  , "2" , &sdhci_acpi_slot_int_sdio }, +	{ "INT33C6"  , NULL, &sdhci_acpi_slot_int_sdio }, +	{ "PNP0D40"  }, +	{ }, +}; +  static const struct acpi_device_id sdhci_acpi_ids[] = { -	{ "INT33C6", (kernel_ulong_t)&sdhci_acpi_slot_int_sdio }, -	{ "PNP0D40" }, +	{ "80860F14" }, +	{ "INT33BB"  }, +	{ "INT33C6"  }, +	{ "PNP0D40"  },  	{ },  };  MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids); -static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid) +static const struct sdhci_acpi_slot *sdhci_acpi_get_slot_by_ids(const char *hid, +								const char *uid)  { -	const struct acpi_device_id *id; +	const struct sdhci_acpi_uid_slot *u; -	for (id = sdhci_acpi_ids; id->id[0]; id++) -		if (!strcmp(id->id, hid)) -			return (const struct sdhci_acpi_slot *)id->driver_data; +	for (u = sdhci_acpi_uids; u->hid; u++) { +		if (strcmp(u->hid, hid)) +			continue; +		if (!u->uid) +			return u->slot; +		if (uid && !strcmp(u->uid, uid)) +			return u->slot; +	}  	return NULL;  } +static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(acpi_handle handle, +							 const char *hid) +{ +	const struct sdhci_acpi_slot *slot; +	struct acpi_device_info *info; +	const char *uid = NULL; +	acpi_status status; + +	status = acpi_get_object_info(handle, &info); +	if (!ACPI_FAILURE(status) && (info->valid & ACPI_VALID_UID)) +		uid = info->unique_id.string; + +	slot = sdhci_acpi_get_slot_by_ids(hid, uid); + +	kfree(info); +	return slot; +} +  static int sdhci_acpi_probe(struct platform_device *pdev)  {  	struct device *dev = &pdev->dev; @@ -148,7 +198,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev)  	c = sdhci_priv(host);  	c->host = host; -	c->slot = sdhci_acpi_get_slot(hid); +	c->slot = sdhci_acpi_get_slot(handle, hid);  	c->pdev = pdev;  	c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM); @@ -202,6 +252,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev)  		goto err_free;  	if (c->use_runtime_pm) { +		pm_runtime_set_active(dev);  		pm_suspend_ignore_children(dev, 1);  		pm_runtime_set_autosuspend_delay(dev, 50);  		pm_runtime_use_autosuspend(dev); diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index 67d6dde2ff1..d5f0d59e131 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c @@ -85,6 +85,12 @@ struct pltfm_imx_data {  	struct clk *clk_ipg;  	struct clk *clk_ahb;  	struct clk *clk_per; +	enum { +		NO_CMD_PENDING,      /* no multiblock command pending*/ +		MULTIBLK_IN_PROCESS, /* exact multiblock cmd in process */ +		WAIT_FOR_INT,        /* sent CMD12, waiting for response INT */ +	} multiblock_status; +  };  static struct platform_device_id imx_esdhc_devtype[] = { @@ -154,6 +160,8 @@ static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, i  static u32 esdhc_readl_le(struct sdhci_host *host, int reg)  { +	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); +	struct pltfm_imx_data *imx_data = pltfm_host->priv;  	u32 val = readl(host->ioaddr + reg);  	if (unlikely(reg == SDHCI_CAPABILITIES)) { @@ -175,6 +183,18 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg)  			val &= ~ESDHC_INT_VENDOR_SPEC_DMA_ERR;  			val |= SDHCI_INT_ADMA_ERROR;  		} + +		/* +		 * mask off the interrupt we get in response to the manually +		 * sent CMD12 +		 */ +		if ((imx_data->multiblock_status == WAIT_FOR_INT) && +		    ((val & SDHCI_INT_RESPONSE) == SDHCI_INT_RESPONSE)) { +			val &= ~SDHCI_INT_RESPONSE; +			writel(SDHCI_INT_RESPONSE, host->ioaddr + +						   SDHCI_INT_STATUS); +			imx_data->multiblock_status = NO_CMD_PENDING; +		}  	}  	return val; @@ -211,6 +231,15 @@ static void esdhc_writel_le(struct sdhci_host *host, u32 val, int reg)  			v = readl(host->ioaddr + ESDHC_VENDOR_SPEC);  			v &= ~ESDHC_VENDOR_SPEC_SDIO_QUIRK;  			writel(v, host->ioaddr + ESDHC_VENDOR_SPEC); + +			if (imx_data->multiblock_status == MULTIBLK_IN_PROCESS) +			{ +				/* send a manual CMD12 with RESPTYP=none */ +				data = MMC_STOP_TRANSMISSION << 24 | +				       SDHCI_CMD_ABORTCMD << 16; +				writel(data, host->ioaddr + SDHCI_TRANSFER_MODE); +				imx_data->multiblock_status = WAIT_FOR_INT; +			}  	}  	if (unlikely(reg == SDHCI_INT_ENABLE || reg == SDHCI_SIGNAL_ENABLE)) { @@ -277,11 +306,13 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg)  		}  		return;  	case SDHCI_COMMAND: -		if ((host->cmd->opcode == MMC_STOP_TRANSMISSION || -		     host->cmd->opcode == MMC_SET_BLOCK_COUNT) && -	            (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) +		if (host->cmd->opcode == MMC_STOP_TRANSMISSION)  			val |= SDHCI_CMD_ABORTCMD; +		if ((host->cmd->opcode == MMC_SET_BLOCK_COUNT) && +		    (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) +			imx_data->multiblock_status = MULTIBLK_IN_PROCESS; +  		if (is_imx6q_usdhc(imx_data))  			writel(val << 16,  			       host->ioaddr + SDHCI_TRANSFER_MODE); @@ -324,8 +355,10 @@ static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg)  		/*  		 * Do not touch buswidth bits here. This is done in  		 * esdhc_pltfm_bus_width. +		 * Do not touch the D3CD bit either which is used for the +		 * SDIO interrupt errata workaround.  		 */ -		mask = 0xffff & ~ESDHC_CTRL_BUSWIDTH_MASK; +		mask = 0xffff & ~(ESDHC_CTRL_BUSWIDTH_MASK | ESDHC_CTRL_D3CD);  		esdhc_clrset_le(host, mask, new_val, reg);  		return; diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 0012d3fdc99..701d06d0e1f 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c @@ -33,6 +33,9 @@   */  #define PCI_DEVICE_ID_INTEL_PCH_SDIO0	0x8809  #define PCI_DEVICE_ID_INTEL_PCH_SDIO1	0x880a +#define PCI_DEVICE_ID_INTEL_BYT_EMMC	0x0f14 +#define PCI_DEVICE_ID_INTEL_BYT_SDIO	0x0f15 +#define PCI_DEVICE_ID_INTEL_BYT_SD	0x0f16  /*   * PCI registers @@ -304,6 +307,33 @@ static const struct sdhci_pci_fixes sdhci_intel_pch_sdio = {  	.probe_slot	= pch_hc_probe_slot,  }; +static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) +{ +	slot->host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE; +	slot->host->mmc->caps2 |= MMC_CAP2_HC_ERASE_SZ; +	return 0; +} + +static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot) +{ +	slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE; +	return 0; +} + +static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = { +	.allow_runtime_pm = true, +	.probe_slot	= byt_emmc_probe_slot, +}; + +static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { +	.quirks2	= SDHCI_QUIRK2_HOST_OFF_CARD_ON, +	.allow_runtime_pm = true, +	.probe_slot	= byt_sdio_probe_slot, +}; + +static const struct sdhci_pci_fixes sdhci_intel_byt_sd = { +}; +  /* O2Micro extra registers */  #define O2_SD_LOCK_WP		0xD3  #define O2_SD_MULTI_VCC3V	0xEE @@ -856,6 +886,30 @@ static const struct pci_device_id pci_ids[] = {  	},  	{ +		.vendor		= PCI_VENDOR_ID_INTEL, +		.device		= PCI_DEVICE_ID_INTEL_BYT_EMMC, +		.subvendor	= PCI_ANY_ID, +		.subdevice	= PCI_ANY_ID, +		.driver_data	= (kernel_ulong_t)&sdhci_intel_byt_emmc, +	}, + +	{ +		.vendor		= PCI_VENDOR_ID_INTEL, +		.device		= PCI_DEVICE_ID_INTEL_BYT_SDIO, +		.subvendor	= PCI_ANY_ID, +		.subdevice	= PCI_ANY_ID, +		.driver_data	= (kernel_ulong_t)&sdhci_intel_byt_sdio, +	}, + +	{ +		.vendor		= PCI_VENDOR_ID_INTEL, +		.device		= PCI_DEVICE_ID_INTEL_BYT_SD, +		.subvendor	= PCI_ANY_ID, +		.subdevice	= PCI_ANY_ID, +		.driver_data	= (kernel_ulong_t)&sdhci_intel_byt_sd, +	}, + +	{  		.vendor		= PCI_VENDOR_ID_O2,  		.device		= PCI_DEVICE_ID_O2_8120,  		.subvendor	= PCI_ANY_ID, diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index 9b74d1e3ad4..6aa7b3266c8 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c @@ -612,9 +612,15 @@ static int esd_usb2_start(struct esd_usb2_net_priv *priv)  {  	struct esd_usb2 *dev = priv->usb2;  	struct net_device *netdev = priv->netdev; -	struct esd_usb2_msg msg; +	struct esd_usb2_msg *msg;  	int err, i; +	msg = kmalloc(sizeof(*msg), GFP_KERNEL); +	if (!msg) { +		err = -ENOMEM; +		goto out; +	} +  	/*  	 * Enable all IDs  	 * The IDADD message takes up to 64 32 bit bitmasks (2048 bits). @@ -628,33 +634,32 @@ static int esd_usb2_start(struct esd_usb2_net_priv *priv)  	 * the number of the starting bitmask (0..64) to the filter.option  	 * field followed by only some bitmasks.  	 */ -	msg.msg.hdr.cmd = CMD_IDADD; -	msg.msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; -	msg.msg.filter.net = priv->index; -	msg.msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ +	msg->msg.hdr.cmd = CMD_IDADD; +	msg->msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; +	msg->msg.filter.net = priv->index; +	msg->msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */  	for (i = 0; i < ESD_MAX_ID_SEGMENT; i++) -		msg.msg.filter.mask[i] = cpu_to_le32(0xffffffff); +		msg->msg.filter.mask[i] = cpu_to_le32(0xffffffff);  	/* enable 29bit extended IDs */ -	msg.msg.filter.mask[ESD_MAX_ID_SEGMENT] = cpu_to_le32(0x00000001); +	msg->msg.filter.mask[ESD_MAX_ID_SEGMENT] = cpu_to_le32(0x00000001); -	err = esd_usb2_send_msg(dev, &msg); +	err = esd_usb2_send_msg(dev, msg);  	if (err) -		goto failed; +		goto out;  	err = esd_usb2_setup_rx_urbs(dev);  	if (err) -		goto failed; +		goto out;  	priv->can.state = CAN_STATE_ERROR_ACTIVE; -	return 0; - -failed: +out:  	if (err == -ENODEV)  		netif_device_detach(netdev); +	if (err) +		netdev_err(netdev, "couldn't start device: %d\n", err); -	netdev_err(netdev, "couldn't start device: %d\n", err); - +	kfree(msg);  	return err;  } @@ -833,26 +838,30 @@ nourbmem:  static int esd_usb2_close(struct net_device *netdev)  {  	struct esd_usb2_net_priv *priv = netdev_priv(netdev); -	struct esd_usb2_msg msg; +	struct esd_usb2_msg *msg;  	int i; +	msg = kmalloc(sizeof(*msg), GFP_KERNEL); +	if (!msg) +		return -ENOMEM; +  	/* Disable all IDs (see esd_usb2_start()) */ -	msg.msg.hdr.cmd = CMD_IDADD; -	msg.msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; -	msg.msg.filter.net = priv->index; -	msg.msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ +	msg->msg.hdr.cmd = CMD_IDADD; +	msg->msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; +	msg->msg.filter.net = priv->index; +	msg->msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */  	for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++) -		msg.msg.filter.mask[i] = 0; -	if (esd_usb2_send_msg(priv->usb2, &msg) < 0) +		msg->msg.filter.mask[i] = 0; +	if (esd_usb2_send_msg(priv->usb2, msg) < 0)  		netdev_err(netdev, "sending idadd message failed\n");  	/* set CAN controller to reset mode */ -	msg.msg.hdr.len = 2; -	msg.msg.hdr.cmd = CMD_SETBAUD; -	msg.msg.setbaud.net = priv->index; -	msg.msg.setbaud.rsvd = 0; -	msg.msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); -	if (esd_usb2_send_msg(priv->usb2, &msg) < 0) +	msg->msg.hdr.len = 2; +	msg->msg.hdr.cmd = CMD_SETBAUD; +	msg->msg.setbaud.net = priv->index; +	msg->msg.setbaud.rsvd = 0; +	msg->msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); +	if (esd_usb2_send_msg(priv->usb2, msg) < 0)  		netdev_err(netdev, "sending setbaud message failed\n");  	priv->can.state = CAN_STATE_STOPPED; @@ -861,6 +870,8 @@ static int esd_usb2_close(struct net_device *netdev)  	close_candev(netdev); +	kfree(msg); +  	return 0;  } @@ -886,7 +897,8 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)  {  	struct esd_usb2_net_priv *priv = netdev_priv(netdev);  	struct can_bittiming *bt = &priv->can.bittiming; -	struct esd_usb2_msg msg; +	struct esd_usb2_msg *msg; +	int err;  	u32 canbtr;  	int sjw_shift; @@ -912,15 +924,22 @@ static int esd_usb2_set_bittiming(struct net_device *netdev)  	if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES)  		canbtr |= ESD_USB2_3_SAMPLES; -	msg.msg.hdr.len = 2; -	msg.msg.hdr.cmd = CMD_SETBAUD; -	msg.msg.setbaud.net = priv->index; -	msg.msg.setbaud.rsvd = 0; -	msg.msg.setbaud.baud = cpu_to_le32(canbtr); +	msg = kmalloc(sizeof(*msg), GFP_KERNEL); +	if (!msg) +		return -ENOMEM; + +	msg->msg.hdr.len = 2; +	msg->msg.hdr.cmd = CMD_SETBAUD; +	msg->msg.setbaud.net = priv->index; +	msg->msg.setbaud.rsvd = 0; +	msg->msg.setbaud.baud = cpu_to_le32(canbtr);  	netdev_info(netdev, "setting BTR=%#x\n", canbtr); -	return esd_usb2_send_msg(priv->usb2, &msg); +	err = esd_usb2_send_msg(priv->usb2, msg); + +	kfree(msg); +	return err;  }  static int esd_usb2_get_berr_counter(const struct net_device *netdev, @@ -1022,7 +1041,7 @@ static int esd_usb2_probe(struct usb_interface *intf,  			 const struct usb_device_id *id)  {  	struct esd_usb2 *dev; -	struct esd_usb2_msg msg; +	struct esd_usb2_msg *msg;  	int i, err;  	dev = kzalloc(sizeof(*dev), GFP_KERNEL); @@ -1037,27 +1056,33 @@ static int esd_usb2_probe(struct usb_interface *intf,  	usb_set_intfdata(intf, dev); +	msg = kmalloc(sizeof(*msg), GFP_KERNEL); +	if (!msg) { +		err = -ENOMEM; +		goto free_msg; +	} +  	/* query number of CAN interfaces (nets) */ -	msg.msg.hdr.cmd = CMD_VERSION; -	msg.msg.hdr.len = 2; -	msg.msg.version.rsvd = 0; -	msg.msg.version.flags = 0; -	msg.msg.version.drv_version = 0; +	msg->msg.hdr.cmd = CMD_VERSION; +	msg->msg.hdr.len = 2; +	msg->msg.version.rsvd = 0; +	msg->msg.version.flags = 0; +	msg->msg.version.drv_version = 0; -	err = esd_usb2_send_msg(dev, &msg); +	err = esd_usb2_send_msg(dev, msg);  	if (err < 0) {  		dev_err(&intf->dev, "sending version message failed\n"); -		goto free_dev; +		goto free_msg;  	} -	err = esd_usb2_wait_msg(dev, &msg); +	err = esd_usb2_wait_msg(dev, msg);  	if (err < 0) {  		dev_err(&intf->dev, "no version message answer\n"); -		goto free_dev; +		goto free_msg;  	} -	dev->net_count = (int)msg.msg.version_reply.nets; -	dev->version = le32_to_cpu(msg.msg.version_reply.version); +	dev->net_count = (int)msg->msg.version_reply.nets; +	dev->version = le32_to_cpu(msg->msg.version_reply.version);  	if (device_create_file(&intf->dev, &dev_attr_firmware))  		dev_err(&intf->dev, @@ -1075,10 +1100,10 @@ static int esd_usb2_probe(struct usb_interface *intf,  	for (i = 0; i < dev->net_count; i++)  		esd_usb2_probe_one_net(intf, i); -	return 0; - -free_dev: -	kfree(dev); +free_msg: +	kfree(msg); +	if (err) +		kfree(dev);  done:  	return err;  } diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 45cb9f3c132..3b954658824 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c @@ -136,6 +136,9 @@  #define KVASER_CTRL_MODE_SELFRECEPTION	3  #define KVASER_CTRL_MODE_OFF		4 +/* log message */ +#define KVASER_EXTENDED_FRAME		BIT(31) +  struct kvaser_msg_simple {  	u8 tid;  	u8 channel; @@ -817,8 +820,13 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev,  	priv = dev->nets[channel];  	stats = &priv->netdev->stats; -	if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | MSG_FLAG_NERR | -				  MSG_FLAG_OVERRUN)) { +	if ((msg->u.rx_can.flag & MSG_FLAG_ERROR_FRAME) && +	    (msg->id == CMD_LOG_MESSAGE)) { +		kvaser_usb_rx_error(dev, msg); +		return; +	} else if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | +					 MSG_FLAG_NERR | +					 MSG_FLAG_OVERRUN)) {  		kvaser_usb_rx_can_err(priv, msg);  		return;  	} else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) { @@ -834,22 +842,40 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev,  		return;  	} -	cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | -		     (msg->u.rx_can.msg[1] & 0x3f); -	cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); +	if (msg->id == CMD_LOG_MESSAGE) { +		cf->can_id = le32_to_cpu(msg->u.log_message.id); +		if (cf->can_id & KVASER_EXTENDED_FRAME) +			cf->can_id &= CAN_EFF_MASK | CAN_EFF_FLAG; +		else +			cf->can_id &= CAN_SFF_MASK; -	if (msg->id == CMD_RX_EXT_MESSAGE) { -		cf->can_id <<= 18; -		cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | -			      ((msg->u.rx_can.msg[3] & 0xff) << 6) | -			      (msg->u.rx_can.msg[4] & 0x3f); -		cf->can_id |= CAN_EFF_FLAG; -	} +		cf->can_dlc = get_can_dlc(msg->u.log_message.dlc); -	if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) -		cf->can_id |= CAN_RTR_FLAG; -	else -		memcpy(cf->data, &msg->u.rx_can.msg[6], cf->can_dlc); +		if (msg->u.log_message.flags & MSG_FLAG_REMOTE_FRAME) +			cf->can_id |= CAN_RTR_FLAG; +		else +			memcpy(cf->data, &msg->u.log_message.data, +			       cf->can_dlc); +	} else { +		cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | +			     (msg->u.rx_can.msg[1] & 0x3f); + +		if (msg->id == CMD_RX_EXT_MESSAGE) { +			cf->can_id <<= 18; +			cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | +				      ((msg->u.rx_can.msg[3] & 0xff) << 6) | +				      (msg->u.rx_can.msg[4] & 0x3f); +			cf->can_id |= CAN_EFF_FLAG; +		} + +		cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); + +		if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) +			cf->can_id |= CAN_RTR_FLAG; +		else +			memcpy(cf->data, &msg->u.rx_can.msg[6], +			       cf->can_dlc); +	}  	netif_rx(skb); @@ -911,6 +937,7 @@ static void kvaser_usb_handle_message(const struct kvaser_usb *dev,  	case CMD_RX_STD_MESSAGE:  	case CMD_RX_EXT_MESSAGE: +	case CMD_LOG_MESSAGE:  		kvaser_usb_rx_can_msg(dev, msg);  		break; @@ -919,11 +946,6 @@ static void kvaser_usb_handle_message(const struct kvaser_usb *dev,  		kvaser_usb_rx_error(dev, msg);  		break; -	case CMD_LOG_MESSAGE: -		if (msg->u.log_message.flags & MSG_FLAG_ERROR_FRAME) -			kvaser_usb_rx_error(dev, msg); -		break; -  	case CMD_TX_ACKNOWLEDGE:  		kvaser_usb_tx_acknowledge(dev, msg);  		break; diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index 30d79bfa5b1..8ee9d1556e6 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c @@ -504,15 +504,24 @@ static int pcan_usb_pro_restart_async(struct peak_usb_device *dev,  	return usb_submit_urb(urb, GFP_ATOMIC);  } -static void pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded) +static int pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded)  { -	u8 buffer[16]; +	u8 *buffer; +	int err; + +	buffer = kmalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL); +	if (!buffer) +		return -ENOMEM;  	buffer[0] = 0;  	buffer[1] = !!loaded; -	pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT, -			      PCAN_USBPRO_FCT_DRVLD, buffer, sizeof(buffer)); +	err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT, +				    PCAN_USBPRO_FCT_DRVLD, buffer, +				    PCAN_USBPRO_FCT_DRVLD_REQ_LEN); +	kfree(buffer); + +	return err;  }  static inline @@ -851,21 +860,24 @@ static int pcan_usb_pro_stop(struct peak_usb_device *dev)   */  static int pcan_usb_pro_init(struct peak_usb_device *dev)  { -	struct pcan_usb_pro_interface *usb_if;  	struct pcan_usb_pro_device *pdev =  			container_of(dev, struct pcan_usb_pro_device, dev); +	struct pcan_usb_pro_interface *usb_if = NULL; +	struct pcan_usb_pro_fwinfo *fi = NULL; +	struct pcan_usb_pro_blinfo *bi = NULL; +	int err;  	/* do this for 1st channel only */  	if (!dev->prev_siblings) { -		struct pcan_usb_pro_fwinfo fi; -		struct pcan_usb_pro_blinfo bi; -		int err; -  		/* allocate netdevices common structure attached to first one */  		usb_if = kzalloc(sizeof(struct pcan_usb_pro_interface),  				 GFP_KERNEL); -		if (!usb_if) -			return -ENOMEM; +		fi = kmalloc(sizeof(struct pcan_usb_pro_fwinfo), GFP_KERNEL); +		bi = kmalloc(sizeof(struct pcan_usb_pro_blinfo), GFP_KERNEL); +		if (!usb_if || !fi || !bi) { +			err = -ENOMEM; +			goto err_out; +		}  		/* number of ts msgs to ignore before taking one into account */  		usb_if->cm_ignore_count = 5; @@ -877,34 +889,34 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev)  		 */  		err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO,  					    PCAN_USBPRO_INFO_FW, -					    &fi, sizeof(fi)); +					    fi, sizeof(*fi));  		if (err) { -			kfree(usb_if);  			dev_err(dev->netdev->dev.parent,  				"unable to read %s firmware info (err %d)\n",  				pcan_usb_pro.name, err); -			return err; +			goto err_out;  		}  		err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO,  					    PCAN_USBPRO_INFO_BL, -					    &bi, sizeof(bi)); +					    bi, sizeof(*bi));  		if (err) { -			kfree(usb_if);  			dev_err(dev->netdev->dev.parent,  				"unable to read %s bootloader info (err %d)\n",  				pcan_usb_pro.name, err); -			return err; +			goto err_out;  		} +		/* tell the device the can driver is running */ +		err = pcan_usb_pro_drv_loaded(dev, 1); +		if (err) +			goto err_out; +  		dev_info(dev->netdev->dev.parent,  		     "PEAK-System %s hwrev %u serial %08X.%08X (%u channels)\n",  		     pcan_usb_pro.name, -		     bi.hw_rev, bi.serial_num_hi, bi.serial_num_lo, +		     bi->hw_rev, bi->serial_num_hi, bi->serial_num_lo,  		     pcan_usb_pro.ctrl_count); - -		/* tell the device the can driver is running */ -		pcan_usb_pro_drv_loaded(dev, 1);  	} else {  		usb_if = pcan_usb_pro_dev_if(dev->prev_siblings);  	} @@ -916,6 +928,13 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev)  	pcan_usb_pro_set_led(dev, 0, 1);  	return 0; + + err_out: +	kfree(bi); +	kfree(fi); +	kfree(usb_if); + +	return err;  }  static void pcan_usb_pro_exit(struct peak_usb_device *dev) diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h index a869918c562..32275af547e 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h @@ -29,6 +29,7 @@  /* Vendor Request value for XXX_FCT */  #define PCAN_USBPRO_FCT_DRVLD		5 /* tell device driver is loaded */ +#define PCAN_USBPRO_FCT_DRVLD_REQ_LEN	16  /* PCAN_USBPRO_INFO_BL vendor request record type */  struct __packed pcan_usb_pro_blinfo { diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index be59ec4b2c3..638e55435b0 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -3192,11 +3192,11 @@ static u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb)  		rc |= XMIT_CSUM_TCP;  	if (skb_is_gso_v6(skb)) { -		rc |= (XMIT_GSO_V6 | XMIT_CSUM_TCP | XMIT_CSUM_V6); +		rc |= (XMIT_GSO_V6 | XMIT_CSUM_TCP);  		if (rc & XMIT_CSUM_ENC)  			rc |= XMIT_GSO_ENC_V6;  	} else if (skb_is_gso(skb)) { -		rc |= (XMIT_GSO_V4 | XMIT_CSUM_V4 | XMIT_CSUM_TCP); +		rc |= (XMIT_GSO_V4 | XMIT_CSUM_TCP);  		if (rc & XMIT_CSUM_ENC)  			rc |= XMIT_GSO_ENC_V4;  	} @@ -3483,19 +3483,18 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,  {  	u16 hlen_w = 0;  	u8 outerip_off, outerip_len = 0; +  	/* from outer IP to transport */  	hlen_w = (skb_inner_transport_header(skb) -  		  skb_network_header(skb)) >> 1;  	/* transport len */ -	if (xmit_type & XMIT_CSUM_TCP) -		hlen_w += inner_tcp_hdrlen(skb) >> 1; -	else -		hlen_w += sizeof(struct udphdr) >> 1; +	hlen_w += inner_tcp_hdrlen(skb) >> 1;  	pbd2->fw_ip_hdr_to_payload_w = hlen_w; -	if (xmit_type & XMIT_CSUM_ENC_V4) { +	/* outer IP header info */ +	if (xmit_type & XMIT_CSUM_V4) {  		struct iphdr *iph = ip_hdr(skb);  		pbd2->fw_ip_csum_wo_len_flags_frag =  			bswab16(csum_fold((~iph->check) - @@ -3818,8 +3817,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)  			bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data,  					     xmit_type);  		else -			bnx2x_set_pbd_gso(skb, pbd_e1x, tx_start_bd, -					  xmit_type); +			bnx2x_set_pbd_gso(skb, pbd_e1x, first_bd, xmit_type);  	}  	/* Set the PBD's parsing_data field if not zero diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 1f2dd928888..0f493c8dc28 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -9468,6 +9468,14 @@ static void tg3_rss_write_indir_tbl(struct tg3 *tp)  	}  } +static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp) +{ +	if (tg3_asic_rev(tp) == ASIC_REV_5719) +		return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719; +	else +		return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720; +} +  /* tp->lock is held. */  static int tg3_reset_hw(struct tg3 *tp, bool reset_phy)  { @@ -10153,16 +10161,17 @@ static int tg3_reset_hw(struct tg3 *tp, bool reset_phy)  	tw32_f(RDMAC_MODE, rdmac_mode);  	udelay(40); -	if (tg3_asic_rev(tp) == ASIC_REV_5719) { +	if (tg3_asic_rev(tp) == ASIC_REV_5719 || +	    tg3_asic_rev(tp) == ASIC_REV_5720) {  		for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) {  			if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp))  				break;  		}  		if (i < TG3_NUM_RDMA_CHANNELS) {  			val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); -			val |= TG3_LSO_RD_DMA_TX_LENGTH_WA; +			val |= tg3_lso_rd_dma_workaround_bit(tp);  			tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); -			tg3_flag_set(tp, 5719_RDMA_BUG); +			tg3_flag_set(tp, 5719_5720_RDMA_BUG);  		}  	} @@ -10526,15 +10535,15 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp)  	TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST);  	TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST);  	TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); -	if (unlikely(tg3_flag(tp, 5719_RDMA_BUG) && +	if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) &&  		     (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low +  		      sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) {  		u32 val;  		val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); -		val &= ~TG3_LSO_RD_DMA_TX_LENGTH_WA; +		val &= ~tg3_lso_rd_dma_workaround_bit(tp);  		tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); -		tg3_flag_clear(tp, 5719_RDMA_BUG); +		tg3_flag_clear(tp, 5719_5720_RDMA_BUG);  	}  	TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index 9b2d3ac2474..ff6e30eeae3 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h @@ -1422,7 +1422,8 @@  #define TG3_LSO_RD_DMA_CRPTEN_CTRL	0x00004910  #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K	 0x00030000  #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K	 0x000c0000 -#define TG3_LSO_RD_DMA_TX_LENGTH_WA	 0x02000000 +#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5719	 0x02000000 +#define TG3_LSO_RD_DMA_TX_LENGTH_WA_5720	 0x00200000  /* 0x4914 --> 0x4be0 unused */  #define TG3_NUM_RDMA_CHANNELS		4 @@ -3059,7 +3060,7 @@ enum TG3_FLAGS {  	TG3_FLAG_APE_HAS_NCSI,  	TG3_FLAG_TX_TSTAMP_EN,  	TG3_FLAG_4K_FIFO_LIMIT, -	TG3_FLAG_5719_RDMA_BUG, +	TG3_FLAG_5719_5720_RDMA_BUG,  	TG3_FLAG_RESET_TASK_PENDING,  	TG3_FLAG_PTP_CAPABLE,  	TG3_FLAG_5705_PLUS, diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index f544b297c9a..0a510684e46 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h @@ -262,6 +262,7 @@ struct be_rx_compl_info {  	u8 ipv6;  	u8 vtm;  	u8 pkt_type; +	u8 ip_frag;  };  struct be_rx_obj { diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index a236ecd27cf..1db2df61b8a 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c @@ -562,7 +562,7 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter)  	resource_error = lancer_provisioning_error(adapter);  	if (resource_error) -		return -1; +		return -EAGAIN;  	status = lancer_wait_ready(adapter);  	if (!status) { @@ -590,8 +590,8 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter)  	 * when PF provisions resources.  	 */  	resource_error = lancer_provisioning_error(adapter); -	if (status == -1 && !resource_error) -		adapter->eeh_error = true; +	if (resource_error) +		status = -EAGAIN;  	return status;  } diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h index 3c1099b47f2..8780183c6d1 100644 --- a/drivers/net/ethernet/emulex/benet/be_hw.h +++ b/drivers/net/ethernet/emulex/benet/be_hw.h @@ -356,7 +356,7 @@ struct amap_eth_rx_compl_v0 {  	u8 ip_version;		/* dword 1 */  	u8 macdst[6];		/* dword 1 */  	u8 vtp;			/* dword 1 */ -	u8 rsvd0;		/* dword 1 */ +	u8 ip_frag;		/* dword 1 */  	u8 fragndx[10];		/* dword 1 */  	u8 ct[2];		/* dword 1 */  	u8 sw;			/* dword 1 */ diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index ca2967b0f18..8bc1b21b1c7 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -1599,6 +1599,8 @@ static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl,  					       compl);  	}  	rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, port, compl); +	rxcp->ip_frag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, +				      ip_frag, compl);  }  static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo) @@ -1620,6 +1622,9 @@ static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)  	else  		be_parse_rx_compl_v0(compl, rxcp); +	if (rxcp->ip_frag) +		rxcp->l4_csum = 0; +  	if (rxcp->vlanf) {  		/* vlanf could be wrongly set in some cards.  		 * ignore if vtm is not set */ @@ -2168,7 +2173,7 @@ static irqreturn_t be_msix(int irq, void *dev)  static inline bool do_gro(struct be_rx_compl_info *rxcp)  { -	return (rxcp->tcpf && !rxcp->err) ? true : false; +	return (rxcp->tcpf && !rxcp->err && rxcp->l4_csum) ? true : false;  }  static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi, @@ -4093,6 +4098,7 @@ static int be_get_initial_config(struct be_adapter *adapter)  static int lancer_recover_func(struct be_adapter *adapter)  { +	struct device *dev = &adapter->pdev->dev;  	int status;  	status = lancer_test_and_set_rdy_state(adapter); @@ -4104,8 +4110,7 @@ static int lancer_recover_func(struct be_adapter *adapter)  	be_clear(adapter); -	adapter->hw_error = false; -	adapter->fw_timeout = false; +	be_clear_all_error(adapter);  	status = be_setup(adapter);  	if (status) @@ -4117,13 +4122,13 @@ static int lancer_recover_func(struct be_adapter *adapter)  			goto err;  	} -	dev_err(&adapter->pdev->dev, -		"Adapter SLIPORT recovery succeeded\n"); +	dev_err(dev, "Error recovery successful\n");  	return 0;  err: -	if (adapter->eeh_error) -		dev_err(&adapter->pdev->dev, -			"Adapter SLIPORT recovery failed\n"); +	if (status == -EAGAIN) +		dev_err(dev, "Waiting for resource provisioning\n"); +	else +		dev_err(dev, "Error recovery failed\n");  	return status;  } @@ -4132,28 +4137,27 @@ static void be_func_recovery_task(struct work_struct *work)  {  	struct be_adapter *adapter =  		container_of(work, struct be_adapter,  func_recovery_work.work); -	int status; +	int status = 0;  	be_detect_error(adapter);  	if (adapter->hw_error && lancer_chip(adapter)) { -		if (adapter->eeh_error) -			goto out; -  		rtnl_lock();  		netif_device_detach(adapter->netdev);  		rtnl_unlock();  		status = lancer_recover_func(adapter); -  		if (!status)  			netif_device_attach(adapter->netdev);  	} -out: -	schedule_delayed_work(&adapter->func_recovery_work, -			      msecs_to_jiffies(1000)); +	/* In Lancer, for all errors other than provisioning error (-EAGAIN), +	 * no need to attempt further recovery. +	 */ +	if (!status || status == -EAGAIN) +		schedule_delayed_work(&adapter->func_recovery_work, +				      msecs_to_jiffies(1000));  }  static void be_worker(struct work_struct *work) @@ -4436,20 +4440,19 @@ static pci_ers_result_t be_eeh_err_detected(struct pci_dev *pdev,  	dev_err(&adapter->pdev->dev, "EEH error detected\n"); -	adapter->eeh_error = true; - -	cancel_delayed_work_sync(&adapter->func_recovery_work); +	if (!adapter->eeh_error) { +		adapter->eeh_error = true; -	rtnl_lock(); -	netif_device_detach(netdev); -	rtnl_unlock(); +		cancel_delayed_work_sync(&adapter->func_recovery_work); -	if (netif_running(netdev)) {  		rtnl_lock(); -		be_close(netdev); +		netif_device_detach(netdev); +		if (netif_running(netdev)) +			be_close(netdev);  		rtnl_unlock(); + +		be_clear(adapter);  	} -	be_clear(adapter);  	if (state == pci_channel_io_perm_failure)  		return PCI_ERS_RESULT_DISCONNECT; @@ -4474,7 +4477,6 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev)  	int status;  	dev_info(&adapter->pdev->dev, "EEH reset\n"); -	be_clear_all_error(adapter);  	status = pci_enable_device(pdev);  	if (status) @@ -4492,6 +4494,7 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev)  		return PCI_ERS_RESULT_DISCONNECT;  	pci_cleanup_aer_uncorrect_error_status(pdev); +	be_clear_all_error(adapter);  	return PCI_ERS_RESULT_RECOVERED;  } diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 85a06037b24..a667015be22 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -1038,6 +1038,18 @@ static void fec_get_mac(struct net_device *ndev)  		iap = &tmpaddr[0];  	} +	/* +	 * 5) random mac address +	 */ +	if (!is_valid_ether_addr(iap)) { +		/* Report it and use a random ethernet address instead */ +		netdev_err(ndev, "Invalid MAC address: %pM\n", iap); +		eth_hw_addr_random(ndev); +		netdev_info(ndev, "Using random MAC address: %pM\n", +			    ndev->dev_addr); +		return; +	} +  	memcpy(ndev->dev_addr, iap, ETH_ALEN);  	/* Adjust MAC if using macaddr */ diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 1df56cc50ee..0e572a52715 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c @@ -222,8 +222,6 @@ static int mlx4_comm_cmd_poll(struct mlx4_dev *dev, u8 cmd, u16 param,  		 * FLR process. The only non-zero result in the RESET command  		 * is MLX4_DELAY_RESET_SLAVE*/  		if ((MLX4_COMM_CMD_RESET == cmd)) { -			mlx4_warn(dev, "Got slave FLRed from Communication" -				  " channel (ret:0x%x)\n", ret_from_pending);  			err = MLX4_DELAY_RESET_SLAVE;  		} else {  			mlx4_warn(dev, "Communication channel timed out\n"); diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index b35f9470009..89c47ea84b5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c @@ -1323,6 +1323,7 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv)  			priv->last_moder_time[ring] = moder_time;  			cq = &priv->rx_cq[ring];  			cq->moder_time = moder_time; +			cq->moder_cnt = priv->rx_frames;  			err = mlx4_en_set_cq_moder(priv, cq);  			if (err)  				en_err(priv, "Failed modifying moderation for cq:%d\n", @@ -2118,6 +2119,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,  	struct mlx4_en_priv *priv;  	int i;  	int err; +	u64 mac_u64;  	dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv),  				 MAX_TX_RINGS, MAX_RX_RINGS); @@ -2191,10 +2193,17 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,  	dev->addr_len = ETH_ALEN;  	mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]);  	if (!is_valid_ether_addr(dev->dev_addr)) { -		en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n", -		       priv->port, dev->dev_addr); -		err = -EINVAL; -		goto out; +		if (mlx4_is_slave(priv->mdev->dev)) { +			eth_hw_addr_random(dev); +			en_warn(priv, "Assigned random MAC address %pM\n", dev->dev_addr); +			mac_u64 = mlx4_en_mac_to_u64(dev->dev_addr); +			mdev->dev->caps.def_mac[priv->port] = mac_u64; +		} else { +			en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n", +			       priv->port, dev->dev_addr); +			err = -EINVAL; +			goto out; +		}  	}  	memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac)); diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 58a8e535d69..2c97901c6a6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c @@ -840,12 +840,16 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,  			   MLX4_CMD_NATIVE);  	if (!err && dev->caps.function != slave) { -		/* set slave default_mac address */ -		MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); -		def_mac += slave << 8;  		/* if config MAC in DB use it */  		if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac)  			def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; +		else { +			/* set slave default_mac address */ +			MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); +			def_mac += slave << 8; +			priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac; +		} +  		MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET);  		/* get port type - currently only eth is enabled */ diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 0d32a82458b..2f4a26039e8 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c @@ -1290,7 +1290,6 @@ static int mlx4_init_slave(struct mlx4_dev *dev)  {  	struct mlx4_priv *priv = mlx4_priv(dev);  	u64 dma = (u64) priv->mfunc.vhcr_dma; -	int num_of_reset_retries = NUM_OF_RESET_RETRIES;  	int ret_from_reset = 0;  	u32 slave_read;  	u32 cmd_channel_ver; @@ -1304,18 +1303,10 @@ static int mlx4_init_slave(struct mlx4_dev *dev)  	 * NUM_OF_RESET_RETRIES times before leaving.*/  	if (ret_from_reset) {  		if (MLX4_DELAY_RESET_SLAVE == ret_from_reset) { -			msleep(SLEEP_TIME_IN_RESET); -			while (ret_from_reset && num_of_reset_retries) { -				mlx4_warn(dev, "slave is currently in the" -					  "middle of FLR. retrying..." -					  "(try num:%d)\n", -					  (NUM_OF_RESET_RETRIES - -					   num_of_reset_retries  + 1)); -				ret_from_reset = -					mlx4_comm_cmd(dev, MLX4_COMM_CMD_RESET, -						      0, MLX4_COMM_TIME); -				num_of_reset_retries = num_of_reset_retries - 1; -			} +			mlx4_warn(dev, "slave is currently in the " +				  "middle of FLR. Deferring probe.\n"); +			mutex_unlock(&priv->cmd.slave_cmd_mutex); +			return -EPROBE_DEFER;  		} else  			goto err;  	} @@ -1526,7 +1517,8 @@ static int mlx4_init_hca(struct mlx4_dev *dev)  	} else {  		err = mlx4_init_slave(dev);  		if (err) { -			mlx4_err(dev, "Failed to initialize slave\n"); +			if (err != -EPROBE_DEFER) +				mlx4_err(dev, "Failed to initialize slave\n");  			return err;  		} diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 50235d20159..f87cc216045 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c @@ -4717,6 +4717,7 @@ static int qlge_probe(struct pci_dev *pdev,  		dev_err(&pdev->dev, "net device registration failed.\n");  		ql_release_all(pdev);  		pci_disable_device(pdev); +		free_netdev(ndev);  		return err;  	}  	/* Start up the timer to trigger EEH if diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 919b983114e..b7268b3dae7 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c @@ -946,7 +946,8 @@ static int xemaclite_open(struct net_device *dev)  		phy_write(lp->phy_dev, MII_CTRL1000, 0);  		/* Advertise only 10 and 100mbps full/half duplex speeds */ -		phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL); +		phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL | +			  ADVERTISE_CSMA);  		/* Restart auto negotiation */  		bmcr = phy_read(lp->phy_dev, MII_BMCR); diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 088c5549619..ab2307b5d9a 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -31,6 +31,7 @@  #include <linux/inetdevice.h>  #include <linux/etherdevice.h>  #include <linux/skbuff.h> +#include <linux/if_vlan.h>  #include <linux/in.h>  #include <linux/slab.h>  #include <net/arp.h> @@ -284,7 +285,7 @@ int netvsc_recv_callback(struct hv_device *device_obj,  	skb->protocol = eth_type_trans(skb, net);  	skb->ip_summed = CHECKSUM_NONE; -	skb->vlan_tci = packet->vlan_tci; +	__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), packet->vlan_tci);  	net->stats.rx_packets++;  	net->stats.rx_bytes += packet->total_data_buflen; diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index c14f14741b3..38f0b312ff8 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -1044,7 +1044,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)  		adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv);  		lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp);  		idx = phy_find_setting(phydev->speed, phydev->duplex); -		if ((lp & adv & settings[idx].setting)) +		if (!(lp & adv & settings[idx].setting))  			goto eee_exit;  		if (clk_stop_enable) { diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 7c43261975b..d016a76ad44 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c @@ -2374,7 +2374,8 @@ static int team_nl_send_port_list_get(struct team *team, u32 portid, u32 seq,  	bool incomplete;  	int i; -	port = list_first_entry(&team->port_list, struct team_port, list); +	port = list_first_entry_or_null(&team->port_list, +					struct team_port, list);  start_again:  	err = __send_and_alloc_skb(&skb, team, portid, send_func); @@ -2402,8 +2403,8 @@ start_again:  		err = team_nl_fill_one_port_get(skb, one_port);  		if (err)  			goto errout; -	} else { -		list_for_each_entry(port, &team->port_list, list) { +	} else if (port) { +		list_for_each_entry_from(port, &team->port_list, list) {  			err = team_nl_fill_one_port_get(skb, port);  			if (err) {  				if (err == -EMSGSIZE) { diff --git a/drivers/net/tun.c b/drivers/net/tun.c index f042b0373e5..89776c59215 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1585,6 +1585,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)  		else  			return -EINVAL; +		if (!!(ifr->ifr_flags & IFF_MULTI_QUEUE) != +		    !!(tun->flags & TUN_TAP_MQ)) +			return -EINVAL; +  		if (tun_not_capable(tun))  			return -EPERM;  		err = security_tun_dev_open(tun->security); diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h index 54ba42f4108..874f6570bd1 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h @@ -68,13 +68,16 @@  #define AR9300_BASE_ADDR 0x3ff  #define AR9300_BASE_ADDR_512 0x1ff -#define AR9300_OTP_BASE			(AR_SREV_9340(ah) ? 0x30000 : 0x14000) -#define AR9300_OTP_STATUS		(AR_SREV_9340(ah) ? 0x30018 : 0x15f18) +#define AR9300_OTP_BASE \ +		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000) +#define AR9300_OTP_STATUS \ +		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30018 : 0x15f18)  #define AR9300_OTP_STATUS_TYPE		0x7  #define AR9300_OTP_STATUS_VALID		0x4  #define AR9300_OTP_STATUS_ACCESS_BUSY	0x2  #define AR9300_OTP_STATUS_SM_BUSY	0x1 -#define AR9300_OTP_READ_DATA		(AR_SREV_9340(ah) ? 0x3001c : 0x15f1c) +#define AR9300_OTP_READ_DATA \ +		((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3001c : 0x15f1c)  enum targetPowerHTRates {  	HT_TARGET_RATE_0_8_16, diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 2bf6548dd14..e1714d7c9ee 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c @@ -334,7 +334,8 @@ static void ar9003_hw_spur_ofdm(struct ath_hw *ah,  	REG_RMW_FIELD(ah, AR_PHY_SPUR_REG,  		      AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI, 1); -	if (REG_READ_FIELD(ah, AR_PHY_MODE, +	if (!AR_SREV_9340(ah) && +	    REG_READ_FIELD(ah, AR_PHY_MODE,  			   AR_PHY_MODE_DYNAMIC) == 0x1)  		REG_RMW_FIELD(ah, AR_PHY_SPUR_REG,  			      AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT, 1); diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 366002f266f..42b03dc39d1 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h @@ -251,10 +251,9 @@ struct ath_atx_tid {  	int tidno;  	int baw_head;   /* first un-acked tx buffer */  	int baw_tail;   /* next unused tx buffer slot */ -	int sched; -	int paused; -	u8 state; -	bool stop_cb; +	bool sched; +	bool paused; +	bool active;  };  struct ath_node { @@ -275,10 +274,6 @@ struct ath_node {  #endif  }; -#define AGGR_CLEANUP         BIT(1) -#define AGGR_ADDBA_COMPLETE  BIT(2) -#define AGGR_ADDBA_PROGRESS  BIT(3) -  struct ath_tx_control {  	struct ath_txq *txq;  	struct ath_node *an; @@ -352,8 +347,7 @@ void ath_tx_tasklet(struct ath_softc *sc);  void ath_tx_edma_tasklet(struct ath_softc *sc);  int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  		      u16 tid, u16 *ssn); -bool ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid, -		      bool flush); +void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);  void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid);  void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an); diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 7f25da8444f..15dfefcf2d0 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c @@ -1172,6 +1172,7 @@ u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)  static inline void ath9k_hw_set_dma(struct ath_hw *ah)  {  	struct ath_common *common = ath9k_hw_common(ah); +	int txbuf_size;  	ENABLE_REGWRITE_BUFFER(ah); @@ -1225,13 +1226,17 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)  		 * So set the usable tx buf size also to half to  		 * avoid data/delimiter underruns  		 */ -		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, -			  AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE); -	} else if (!AR_SREV_9271(ah)) { -		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, -			  AR_PCU_TXBUF_CTRL_USABLE_SIZE); +		txbuf_size = AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE; +	} else if (AR_SREV_9340_13_OR_LATER(ah)) { +		/* Uses fewer entries for AR934x v1.3+ to prevent rx overruns */ +		txbuf_size = AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE; +	} else { +		txbuf_size = AR_PCU_TXBUF_CTRL_USABLE_SIZE;  	} +	if (!AR_SREV_9271(ah)) +		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, txbuf_size); +  	REGWRITE_BUFFER_FLUSH(ah);  	if (AR_SREV_9300_20_OR_LATER(ah)) @@ -1306,9 +1311,13 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)  			AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET;  	} else {  		tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE); -		if (tmpReg & -		    (AR_INTR_SYNC_LOCAL_TIMEOUT | -		     AR_INTR_SYNC_RADM_CPL_TIMEOUT)) { +		if (AR_SREV_9340(ah)) +			tmpReg &= AR9340_INTR_SYNC_LOCAL_TIMEOUT; +		else +			tmpReg &= AR_INTR_SYNC_LOCAL_TIMEOUT | +				  AR_INTR_SYNC_RADM_CPL_TIMEOUT; + +		if (tmpReg) {  			u32 val;  			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 498fee04afa..566109a40fb 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c @@ -410,7 +410,7 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q)  	REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); -	if (AR_SREV_9340(ah)) +	if (AR_SREV_9340(ah) && !AR_SREV_9340_13_OR_LATER(ah))  		REG_WRITE(ah, AR_DMISC(q),  			  AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1);  	else diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 2382d1262e7..5092ecae770 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c @@ -1709,7 +1709,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,  		flush = true;  	case IEEE80211_AMPDU_TX_STOP_CONT:  		ath9k_ps_wakeup(sc); -		if (ath_tx_aggr_stop(sc, sta, tid, flush)) +		ath_tx_aggr_stop(sc, sta, tid); +		if (!flush)  			ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);  		ath9k_ps_restore(sc);  		break; diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index aa4d368d8d3..7eb1f4b458e 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c @@ -1227,10 +1227,7 @@ static bool ath_tx_aggr_check(struct ath_softc *sc, struct ieee80211_sta *sta,  		return false;  	txtid = ATH_AN_2_TID(an, tidno); - -	if (!(txtid->state & (AGGR_ADDBA_COMPLETE | AGGR_ADDBA_PROGRESS))) -			return true; -	return false; +	return !txtid->active;  } diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 5c4ab5026dc..f7c90cc58d5 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h @@ -798,6 +798,10 @@  #define AR_SREV_REVISION_9485_10	0  #define AR_SREV_REVISION_9485_11        1  #define AR_SREV_VERSION_9340		0x300 +#define AR_SREV_REVISION_9340_10	0 +#define AR_SREV_REVISION_9340_11	1 +#define AR_SREV_REVISION_9340_12	2 +#define AR_SREV_REVISION_9340_13	3  #define AR_SREV_VERSION_9580		0x1C0  #define AR_SREV_REVISION_9580_10	4 /* AR9580 1.0 */  #define AR_SREV_VERSION_9462		0x280 @@ -897,6 +901,10 @@  #define AR_SREV_9340(_ah) \  	(((_ah)->hw_version.macVersion == AR_SREV_VERSION_9340)) +#define AR_SREV_9340_13_OR_LATER(_ah) \ +	(AR_SREV_9340((_ah)) && \ +	 ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9340_13)) +  #define AR_SREV_9285E_20(_ah) \      (AR_SREV_9285_12_OR_LATER(_ah) && \       ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1)) @@ -1007,6 +1015,8 @@ enum {  				AR_INTR_SYNC_LOCAL_TIMEOUT |  				AR_INTR_SYNC_MAC_SLEEP_ACCESS), +	AR9340_INTR_SYNC_LOCAL_TIMEOUT = 0x00000010, +  	AR_INTR_SYNC_SPURIOUS = 0xFFFFFFFF,  }; @@ -1881,6 +1891,7 @@ enum {  #define AR_PCU_TXBUF_CTRL_SIZE_MASK     0x7FF  #define AR_PCU_TXBUF_CTRL_USABLE_SIZE   0x700  #define AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE   0x380 +#define AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE   0x500  #define AR_PCU_MISC_MODE2               0x8344  #define AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE           0x00000002 diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 14bb3354ea6..1c9b1bac8b0 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -125,24 +125,6 @@ static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid)  	list_add_tail(&ac->list, &txq->axq_acq);  } -static void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid) -{ -	struct ath_txq *txq = tid->ac->txq; - -	WARN_ON(!tid->paused); - -	ath_txq_lock(sc, txq); -	tid->paused = false; - -	if (skb_queue_empty(&tid->buf_q)) -		goto unlock; - -	ath_tx_queue_tid(txq, tid); -	ath_txq_schedule(sc, txq); -unlock: -	ath_txq_unlock_complete(sc, txq); -} -  static struct ath_frame_info *get_frame_info(struct sk_buff *skb)  {  	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); @@ -164,20 +146,7 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta,  			       ARRAY_SIZE(bf->rates));  } -static void ath_tx_clear_tid(struct ath_softc *sc, struct ath_atx_tid *tid) -{ -	tid->state &= ~AGGR_ADDBA_COMPLETE; -	tid->state &= ~AGGR_CLEANUP; -	if (!tid->stop_cb) -		return; - -	ieee80211_start_tx_ba_cb_irqsafe(tid->an->vif, tid->an->sta->addr, -					 tid->tidno); -	tid->stop_cb = false; -} - -static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid, -			     bool flush_packets) +static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid)  {  	struct ath_txq *txq = tid->ac->txq;  	struct sk_buff *skb; @@ -194,15 +163,16 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid,  	while ((skb = __skb_dequeue(&tid->buf_q))) {  		fi = get_frame_info(skb);  		bf = fi->bf; -		if (!bf && !flush_packets) -			bf = ath_tx_setup_buffer(sc, txq, tid, skb);  		if (!bf) { -			ieee80211_free_txskb(sc->hw, skb); -			continue; +			bf = ath_tx_setup_buffer(sc, txq, tid, skb); +			if (!bf) { +				ieee80211_free_txskb(sc->hw, skb); +				continue; +			}  		} -		if (fi->retries || flush_packets) { +		if (fi->retries) {  			list_add_tail(&bf->list, &bf_head);  			ath_tx_update_baw(sc, tid, bf->bf_state.seqno);  			ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); @@ -213,10 +183,7 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid,  		}  	} -	if (tid->baw_head == tid->baw_tail) -		ath_tx_clear_tid(sc, tid); - -	if (sendbar && !flush_packets) { +	if (sendbar) {  		ath_txq_unlock(sc, txq);  		ath_send_bar(tid, tid->seq_start);  		ath_txq_lock(sc, txq); @@ -499,19 +466,19 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  		tx_info = IEEE80211_SKB_CB(skb);  		fi = get_frame_info(skb); -		if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, seqno))) { +		if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { +			/* +			 * Outside of the current BlockAck window, +			 * maybe part of a previous session +			 */ +			txfail = 1; +		} else if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, seqno))) {  			/* transmit completion, subframe is  			 * acked by block ack */  			acked_cnt++;  		} else if (!isaggr && txok) {  			/* transmit completion */  			acked_cnt++; -		} else if (tid->state & AGGR_CLEANUP) { -			/* -			 * cleanup in progress, just fail -			 * the un-acked sub-frames -			 */ -			txfail = 1;  		} else if (flush) {  			txpending = 1;  		} else if (fi->retries < ATH_MAX_SW_RETRIES) { @@ -535,7 +502,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  		if (bf_next != NULL || !bf_last->bf_stale)  			list_move_tail(&bf->list, &bf_head); -		if (!txpending || (tid->state & AGGR_CLEANUP)) { +		if (!txpending) {  			/*  			 * complete the acked-ones/xretried ones; update  			 * block-ack window @@ -609,9 +576,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  		ath_txq_lock(sc, txq);  	} -	if (tid->state & AGGR_CLEANUP) -		ath_tx_flush_tid(sc, tid, false); -  	rcu_read_unlock();  	if (needreset) @@ -1244,9 +1208,6 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  	an = (struct ath_node *)sta->drv_priv;  	txtid = ATH_AN_2_TID(an, tid); -	if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE)) -		return -EAGAIN; -  	/* update ampdu factor/density, they may have changed. This may happen  	 * in HT IBSS when a beacon with HT-info is received after the station  	 * has already been added. @@ -1258,7 +1219,7 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  		an->mpdudensity = density;  	} -	txtid->state |= AGGR_ADDBA_PROGRESS; +	txtid->active = true;  	txtid->paused = true;  	*ssn = txtid->seq_start = txtid->seq_next;  	txtid->bar_index = -1; @@ -1269,45 +1230,17 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,  	return 0;  } -bool ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid, -		      bool flush) +void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)  {  	struct ath_node *an = (struct ath_node *)sta->drv_priv;  	struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid);  	struct ath_txq *txq = txtid->ac->txq; -	bool ret = !flush; - -	if (flush) -		txtid->stop_cb = false; - -	if (txtid->state & AGGR_CLEANUP) -		return false; - -	if (!(txtid->state & AGGR_ADDBA_COMPLETE)) { -		txtid->state &= ~AGGR_ADDBA_PROGRESS; -		return ret; -	}  	ath_txq_lock(sc, txq); +	txtid->active = false;  	txtid->paused = true; - -	/* -	 * If frames are still being transmitted for this TID, they will be -	 * cleaned up during tx completion. To prevent race conditions, this -	 * TID can only be reused after all in-progress subframes have been -	 * completed. -	 */ -	if (txtid->baw_head != txtid->baw_tail) { -		txtid->state |= AGGR_CLEANUP; -		ret = false; -		txtid->stop_cb = !flush; -	} else { -		txtid->state &= ~AGGR_ADDBA_COMPLETE; -	} - -	ath_tx_flush_tid(sc, txtid, flush); +	ath_tx_flush_tid(sc, txtid);  	ath_txq_unlock_complete(sc, txq); -	return ret;  }  void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, @@ -1371,18 +1304,28 @@ void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an)  	}  } -void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) +void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, +			u16 tidno)  { -	struct ath_atx_tid *txtid; +	struct ath_atx_tid *tid;  	struct ath_node *an; +	struct ath_txq *txq;  	an = (struct ath_node *)sta->drv_priv; +	tid = ATH_AN_2_TID(an, tidno); +	txq = tid->ac->txq; -	txtid = ATH_AN_2_TID(an, tid); -	txtid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; -	txtid->state |= AGGR_ADDBA_COMPLETE; -	txtid->state &= ~AGGR_ADDBA_PROGRESS; -	ath_tx_resume_tid(sc, txtid); +	ath_txq_lock(sc, txq); + +	tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; +	tid->paused = false; + +	if (!skb_queue_empty(&tid->buf_q)) { +		ath_tx_queue_tid(txq, tid); +		ath_txq_schedule(sc, txq); +	} + +	ath_txq_unlock_complete(sc, txq);  }  /********************/ @@ -2431,13 +2374,10 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)  		tid->baw_head  = tid->baw_tail = 0;  		tid->sched     = false;  		tid->paused    = false; -		tid->state &= ~AGGR_CLEANUP; +		tid->active	   = false;  		__skb_queue_head_init(&tid->buf_q);  		acno = TID_TO_WME_AC(tidno);  		tid->ac = &an->ac[acno]; -		tid->state &= ~AGGR_ADDBA_COMPLETE; -		tid->state &= ~AGGR_ADDBA_PROGRESS; -		tid->stop_cb = false;  	}  	for (acno = 0, ac = &an->ac[acno]; @@ -2474,7 +2414,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)  		}  		ath_tid_drain(sc, txq, tid); -		ath_tx_clear_tid(sc, tid); +		tid->active = false;  		ath_txq_unlock(sc, txq);  	} diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 830bb1d1f95..b827d51c30a 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c @@ -1624,7 +1624,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,  	netif_carrier_off(dev); -	if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv)); +	if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv))  		printk(KERN_WARNING "atmel: unable to create /proc entry.\n");  	printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %pM\n", diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index be0787cab24..9431af2465f 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c @@ -27,7 +27,6 @@  #include "tracepoint.h"  #define PKTFILTER_BUF_SIZE		128 -#define BRCMF_ARPOL_MODE		0xb	/* agent|snoop|peer_autoreply */  #define BRCMF_DEFAULT_BCN_TIMEOUT	3  #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME	40  #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME	40 @@ -338,23 +337,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)  		goto done;  	} -	/* Try to set and enable ARP offload feature, this may fail */ -	err = brcmf_fil_iovar_int_set(ifp, "arp_ol", BRCMF_ARPOL_MODE); -	if (err) { -		brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n", -			  BRCMF_ARPOL_MODE, err); -		err = 0; -	} else { -		err = brcmf_fil_iovar_int_set(ifp, "arpoe", 1); -		if (err) { -			brcmf_dbg(TRACE, "failed to enable ARP offload err = %d\n", -				  err); -			err = 0; -		} else -			brcmf_dbg(TRACE, "successfully enabled ARP offload to 0x%x\n", -				  BRCMF_ARPOL_MODE); -	} -  	/* Setup packet filter */  	brcmf_c_pktfilter_offload_set(ifp, BRCMF_DEFAULT_PACKET_FILTER);  	brcmf_c_pktfilter_offload_enable(ifp, BRCMF_DEFAULT_PACKET_FILTER, diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c index 59c25463e42..b98f2235978 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c @@ -653,10 +653,13 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)  	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name); +	ndev->destructor = free_netdev;  	return 0;  fail: +	drvr->iflist[ifp->bssidx] = NULL;  	ndev->netdev_ops = NULL; +	free_netdev(ndev);  	return -EBADE;  } @@ -720,6 +723,9 @@ static int brcmf_net_p2p_attach(struct brcmf_if *ifp)  	return 0;  fail: +	ifp->drvr->iflist[ifp->bssidx] = NULL; +	ndev->netdev_ops = NULL; +	free_netdev(ndev);  	return -EBADE;  } @@ -788,6 +794,7 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)  	struct brcmf_if *ifp;  	ifp = drvr->iflist[bssidx]; +	drvr->iflist[bssidx] = NULL;  	if (!ifp) {  		brcmf_err("Null interface, idx=%d\n", bssidx);  		return; @@ -808,15 +815,13 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx)  			cancel_work_sync(&ifp->setmacaddr_work);  			cancel_work_sync(&ifp->multicast_work);  		} - +		/* unregister will take care of freeing it */  		unregister_netdev(ifp->ndev);  		if (bssidx == 0)  			brcmf_cfg80211_detach(drvr->config); -		free_netdev(ifp->ndev);  	} else {  		kfree(ifp);  	} -	drvr->iflist[bssidx] = NULL;  }  int brcmf_attach(uint bus_hdrlen, struct device *dev) @@ -925,8 +930,6 @@ fail:  			brcmf_fws_del_interface(ifp);  			brcmf_fws_deinit(drvr);  		} -		free_netdev(ifp->ndev); -		drvr->iflist[0] = NULL;  		if (p2p_ifp) {  			free_netdev(p2p_ifp->ndev);  			drvr->iflist[1] = NULL; @@ -934,7 +937,8 @@ fail:  		return ret;  	}  	if ((brcmf_p2p_enable) && (p2p_ifp)) -		brcmf_net_p2p_attach(p2p_ifp); +		if (brcmf_net_p2p_attach(p2p_ifp) < 0) +			brcmf_p2p_enable = 0;  	return 0;  } diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c index 5a64280e648..83ee53a7c76 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c @@ -202,7 +202,8 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr,  			return;  		brcmf_fws_add_interface(ifp);  		if (!drvr->fweh.evt_handler[BRCMF_E_IF]) -			err = brcmf_net_attach(ifp, false); +			if (brcmf_net_attach(ifp, false) < 0) +				return;  	}  	if (ifevent->action == BRCMF_E_IF_CHANGE) diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h index 0f2c83bc95d..665ef69e974 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h @@ -23,6 +23,12 @@  #define BRCMF_FIL_ACTION_FRAME_SIZE	1800 +/* ARP Offload feature flags for arp_ol iovar */ +#define BRCMF_ARP_OL_AGENT		0x00000001 +#define BRCMF_ARP_OL_SNOOP		0x00000002 +#define BRCMF_ARP_OL_HOST_AUTO_REPLY	0x00000004 +#define BRCMF_ARP_OL_PEER_AUTO_REPLY	0x00000008 +  enum brcmf_fil_p2p_if_types {  	BRCMF_FIL_P2P_IF_CLIENT, diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c index e7a1a477099..79555f006d5 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c @@ -47,6 +47,7 @@  #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \  					 (channel == SOCIAL_CHAN_2) || \  					 (channel == SOCIAL_CHAN_3)) +#define BRCMF_P2P_TEMP_CHAN	SOCIAL_CHAN_3  #define SOCIAL_CHAN_CNT		3  #define AF_PEER_SEARCH_CNT	2 @@ -1954,21 +1955,21 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg)  		err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1);  		if (err < 0) {  			brcmf_err("set p2p_disc error\n"); -			brcmf_free_vif(p2p_vif); +			brcmf_free_vif(cfg, p2p_vif);  			goto exit;  		}  		/* obtain bsscfg index for P2P discovery */  		err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx);  		if (err < 0) {  			brcmf_err("retrieving discover bsscfg index failed\n"); -			brcmf_free_vif(p2p_vif); +			brcmf_free_vif(cfg, p2p_vif);  			goto exit;  		}  		/* Verify that firmware uses same bssidx as driver !! */  		if (p2p_ifp->bssidx != bssidx) {  			brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n",  				  bssidx, p2p_ifp->bssidx); -			brcmf_free_vif(p2p_vif); +			brcmf_free_vif(cfg, p2p_vif);  			goto exit;  		} @@ -1996,7 +1997,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_info *p2p)  		brcmf_p2p_cancel_remain_on_channel(vif->ifp);  		brcmf_p2p_deinit_discovery(p2p);  		/* remove discovery interface */ -		brcmf_free_vif(vif); +		brcmf_free_vif(p2p->cfg, vif);  		p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL;  	}  	/* just set it all to zero */ @@ -2013,17 +2014,30 @@ static void brcmf_p2p_get_current_chanspec(struct brcmf_p2p_info *p2p,  					   u16 *chanspec)  {  	struct brcmf_if *ifp; -	struct brcmf_fil_chan_info_le ci; +	u8 mac_addr[ETH_ALEN];  	struct brcmu_chan ch; -	s32 err; +	struct brcmf_bss_info_le *bi; +	u8 *buf;  	ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; -	ch.chnum = 11; - -	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_CHANNEL, &ci, sizeof(ci)); -	if (!err) -		ch.chnum = le32_to_cpu(ci.hw_channel); +	if (brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSSID, mac_addr, +				   ETH_ALEN) == 0) { +		buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); +		if (buf != NULL) { +			*(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); +			if (brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO, +						   buf, WL_BSS_INFO_MAX) == 0) { +				bi = (struct brcmf_bss_info_le *)(buf + 4); +				*chanspec = le16_to_cpu(bi->chanspec); +				kfree(buf); +				return; +			} +			kfree(buf); +		} +	} +	/* Use default channel for P2P */ +	ch.chnum = BRCMF_P2P_TEMP_CHAN;  	ch.bw = BRCMU_CHAN_BW_20;  	p2p->cfg->d11inf.encchspec(&ch);  	*chanspec = ch.chspec; @@ -2208,7 +2222,7 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p,  	return &p2p_vif->wdev;  fail: -	brcmf_free_vif(p2p_vif); +	brcmf_free_vif(p2p->cfg, p2p_vif);  	return ERR_PTR(err);  } @@ -2217,13 +2231,31 @@ fail:   *   * @vif: virtual interface object to delete.   */ -static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_vif *vif) +static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_info *cfg, +				    struct brcmf_cfg80211_vif *vif)  { -	struct brcmf_p2p_info *p2p = &vif->ifp->drvr->config->p2p; -  	cfg80211_unregister_wdev(&vif->wdev); -	p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; -	brcmf_free_vif(vif); +	cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; +	brcmf_free_vif(cfg, vif); +} + +/** + * brcmf_p2p_free_p2p_if() - free up net device related data. + * + * @ndev: net device that needs to be freed. + */ +static void brcmf_p2p_free_p2p_if(struct net_device *ndev) +{ +	struct brcmf_cfg80211_info *cfg; +	struct brcmf_cfg80211_vif *vif; +	struct brcmf_if *ifp; + +	ifp = netdev_priv(ndev); +	cfg = ifp->drvr->config; +	vif = ifp->vif; + +	brcmf_free_vif(cfg, vif); +	free_netdev(ifp->ndev);  }  /** @@ -2303,6 +2335,9 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,  		brcmf_err("Registering netdevice failed\n");  		goto fail;  	} +	/* override destructor */ +	ifp->ndev->destructor = brcmf_p2p_free_p2p_if; +  	cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;  	/* Disable firmware roaming for P2P interface  */  	brcmf_fil_iovar_int_set(ifp, "roam_off", 1); @@ -2314,7 +2349,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,  	return &ifp->vif->wdev;  fail: -	brcmf_free_vif(vif); +	brcmf_free_vif(cfg, vif);  	return ERR_PTR(err);  } @@ -2350,7 +2385,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)  		break;  	case NL80211_IFTYPE_P2P_DEVICE: -		brcmf_p2p_delete_p2pdev(vif); +		brcmf_p2p_delete_p2pdev(cfg, vif);  		return 0;  	default:  		return -ENOTSUPP; @@ -2378,7 +2413,6 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)  			err = 0;  	}  	brcmf_cfg80211_arm_vif_event(cfg, NULL); -	brcmf_free_vif(vif);  	p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;  	return err; diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 761f501959a..301e572e892 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c @@ -459,6 +459,38 @@ send_key_to_dongle(struct net_device *ndev, struct brcmf_wsec_key *key)  	return err;  } +static s32 +brcmf_configure_arp_offload(struct brcmf_if *ifp, bool enable) +{ +	s32 err; +	u32 mode; + +	if (enable) +		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY; +	else +		mode = 0; + +	/* Try to set and enable ARP offload feature, this may fail, then it  */ +	/* is simply not supported and err 0 will be returned                 */ +	err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode); +	if (err) { +		brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n", +			  mode, err); +		err = 0; +	} else { +		err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable); +		if (err) { +			brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n", +				  enable, err); +			err = 0; +		} else +			brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n", +				  enable, mode); +	} + +	return err; +} +  static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,  						     const char *name,  						     enum nl80211_iftype type, @@ -2216,6 +2248,11 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev,  	}  	pm = enabled ? PM_FAST : PM_OFF; +	/* Do not enable the power save after assoc if it is a p2p interface */ +	if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) { +		brcmf_dbg(INFO, "Do not enable power save for P2P clients\n"); +		pm = PM_OFF; +	}  	brcmf_dbg(INFO, "power save %s\n", (pm ? "enabled" : "disabled"));  	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm); @@ -3640,10 +3677,28 @@ brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,  }  static s32 +brcmf_cfg80211_set_channel(struct brcmf_cfg80211_info *cfg, +			   struct brcmf_if *ifp, +			   struct ieee80211_channel *channel) +{ +	u16 chanspec; +	s32 err; + +	brcmf_dbg(TRACE, "band=%d, center_freq=%d\n", channel->band, +		  channel->center_freq); + +	chanspec = channel_to_chanspec(&cfg->d11inf, channel); +	err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); + +	return err; +} + +static s32  brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,  			struct cfg80211_ap_settings *settings)  {  	s32 ie_offset; +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);  	struct brcmf_if *ifp = netdev_priv(ndev);  	struct brcmf_tlv *ssid_ie;  	struct brcmf_ssid_le ssid_le; @@ -3683,6 +3738,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,  	}  	brcmf_set_mpc(ifp, 0); +	brcmf_configure_arp_offload(ifp, false);  	/* find the RSN_IE */  	rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, @@ -3713,6 +3769,12 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,  	brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); +	err = brcmf_cfg80211_set_channel(cfg, ifp, settings->chandef.chan); +	if (err < 0) { +		brcmf_err("Set Channel failed, %d\n", err); +		goto exit; +	} +  	if (settings->beacon_interval) {  		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD,  					    settings->beacon_interval); @@ -3789,8 +3851,10 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,  	set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);  exit: -	if (err) +	if (err) {  		brcmf_set_mpc(ifp, 1); +		brcmf_configure_arp_offload(ifp, true); +	}  	return err;  } @@ -3831,6 +3895,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)  			brcmf_err("bss_enable config failed %d\n", err);  	}  	brcmf_set_mpc(ifp, 1); +	brcmf_configure_arp_offload(ifp, true);  	set_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);  	clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); @@ -4148,7 +4213,7 @@ static const struct ieee80211_iface_limit brcmf_iface_limits[] = {  static const struct ieee80211_iface_combination brcmf_iface_combos[] = {  	{  		 .max_interfaces = BRCMF_IFACE_MAX_CNT, -		 .num_different_channels = 1, /* no multi-channel for now */ +		 .num_different_channels = 2,  		 .n_limits = ARRAY_SIZE(brcmf_iface_limits),  		 .limits = brcmf_iface_limits  	} @@ -4256,20 +4321,16 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,  	return vif;  } -void brcmf_free_vif(struct brcmf_cfg80211_vif *vif) +void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, +		    struct brcmf_cfg80211_vif *vif)  { -	struct brcmf_cfg80211_info *cfg; -	struct wiphy *wiphy; - -	wiphy = vif->wdev.wiphy; -	cfg = wiphy_priv(wiphy);  	list_del(&vif->list);  	cfg->vif_cnt--;  	kfree(vif);  	if (!cfg->vif_cnt) { -		wiphy_unregister(wiphy); -		wiphy_free(wiphy); +		wiphy_unregister(cfg->wiphy); +		wiphy_free(cfg->wiphy);  	}  } @@ -4646,7 +4707,6 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp,  		return 0;  	case BRCMF_E_IF_DEL: -		ifp->vif = NULL;  		mutex_unlock(&event->vif_event_lock);  		/* event may not be upon user request */  		if (brcmf_cfg80211_vif_event_armed(cfg)) @@ -4852,8 +4912,7 @@ cfg80211_p2p_attach_out:  	wl_deinit_priv(cfg);  cfg80211_attach_out: -	brcmf_free_vif(vif); -	wiphy_free(wiphy); +	brcmf_free_vif(cfg, vif);  	return NULL;  } @@ -4865,7 +4924,7 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg)  	wl_deinit_priv(cfg);  	brcmf_btcoex_detach(cfg);  	list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) { -		brcmf_free_vif(vif); +		brcmf_free_vif(cfg, vif);  	}  } @@ -5229,6 +5288,8 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)  	if (err)  		goto default_conf_out; +	brcmf_configure_arp_offload(ifp, true); +  	cfg->dongle_up = true;  default_conf_out: diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h index a71cff84cdc..d9bdaf9a72d 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h @@ -487,7 +487,8 @@ enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp);  struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg,  					   enum nl80211_iftype type,  					   bool pm_block); -void brcmf_free_vif(struct brcmf_cfg80211_vif *vif); +void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, +	            struct brcmf_cfg80211_vif *vif);  s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag,  			  const u8 *vndr_ie_buf, u32 vndr_ie_len); diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c index db183b44e03..c3c13ce96eb 100644 --- a/drivers/net/wireless/iwlwifi/dvm/sta.c +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c @@ -735,7 +735,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)  					memcpy(&lq, priv->stations[i].lq,  					       sizeof(struct iwl_link_quality_cmd)); -				if (!memcmp(&lq, &zero_lq, sizeof(lq))) +				if (memcmp(&lq, &zero_lq, sizeof(lq)))  					send_lq = true;  			}  			spin_unlock_bh(&priv->sta_lock); diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig index 4775d4e61b8..74a852e4e41 100644 --- a/drivers/nfc/Kconfig +++ b/drivers/nfc/Kconfig @@ -28,7 +28,7 @@ config NFC_WILINK  config NFC_MEI_PHY  	tristate "MEI bus NFC device support" -	depends on INTEL_MEI_BUS_NFC && NFC_HCI +	depends on INTEL_MEI && NFC_HCI  	help  	  This adds support to use an mei bus nfc device. Select this if you  	  will use an HCI NFC driver for an NFC chip connected behind an diff --git a/drivers/nfc/mei_phy.c b/drivers/nfc/mei_phy.c index b8f8abc422f..1201bdbfb79 100644 --- a/drivers/nfc/mei_phy.c +++ b/drivers/nfc/mei_phy.c @@ -64,6 +64,15 @@ int nfc_mei_phy_enable(void *phy_id)                  return r;  	} +	r = mei_cl_register_event_cb(phy->device, nfc_mei_event_cb, phy); +	if (r) { +		pr_err("MEY_PHY: Event cb registration failed\n"); +		mei_cl_disable_device(phy->device); +		phy->powered = 0; + +		return r; +	} +  	phy->powered = 1;  	return 0; diff --git a/drivers/nfc/microread/mei.c b/drivers/nfc/microread/mei.c index 1ad044dce7b..cdf1bc53b25 100644 --- a/drivers/nfc/microread/mei.c +++ b/drivers/nfc/microread/mei.c @@ -43,24 +43,16 @@ static int microread_mei_probe(struct mei_cl_device *device,  		return -ENOMEM;  	} -	r = mei_cl_register_event_cb(device, nfc_mei_event_cb, phy); -	if (r) { -		pr_err(MICROREAD_DRIVER_NAME ": event cb registration failed\n"); -		goto err_out; -	} -  	r = microread_probe(phy, &mei_phy_ops, LLC_NOP_NAME,  			    MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,  			    &phy->hdev); -	if (r < 0) -		goto err_out; - -	return 0; +	if (r < 0) { +		nfc_mei_phy_free(phy); -err_out: -	nfc_mei_phy_free(phy); +		return r; +	} -	return r; +	return 0;  }  static int microread_mei_remove(struct mei_cl_device *device) @@ -71,8 +63,6 @@ static int microread_mei_remove(struct mei_cl_device *device)  	microread_remove(phy->hdev); -	nfc_mei_phy_disable(phy); -  	nfc_mei_phy_free(phy);  	return 0; diff --git a/drivers/nfc/pn544/mei.c b/drivers/nfc/pn544/mei.c index 1eb48848a35..b5d3d18179e 100644 --- a/drivers/nfc/pn544/mei.c +++ b/drivers/nfc/pn544/mei.c @@ -43,24 +43,16 @@ static int pn544_mei_probe(struct mei_cl_device *device,  		return -ENOMEM;  	} -	r = mei_cl_register_event_cb(device, nfc_mei_event_cb, phy); -	if (r) { -		pr_err(PN544_DRIVER_NAME ": event cb registration failed\n"); -		goto err_out; -	} -  	r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME,  			    MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD,  			    &phy->hdev); -	if (r < 0) -		goto err_out; - -	return 0; +	if (r < 0) { +		nfc_mei_phy_free(phy); -err_out: -	nfc_mei_phy_free(phy); +		return r; +	} -	return r; +	return 0;  }  static int pn544_mei_remove(struct mei_cl_device *device) @@ -71,8 +63,6 @@ static int pn544_mei_remove(struct mei_cl_device *device)  	pn544_hci_remove(phy->hdev); -	nfc_mei_phy_disable(phy); -  	nfc_mei_phy_free(phy);  	return 0; diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 2ef7103270b..1f05913ae67 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -668,7 +668,7 @@ lba_fixup_bus(struct pci_bus *bus)  			BUG();  		} -		if (ldev->hba.elmmio_space.start) { +		if (ldev->hba.elmmio_space.flags) {  			err = request_resource(&iomem_resource,  					&(ldev->hba.elmmio_space));  			if (err < 0) { @@ -993,7 +993,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)  		case PAT_LMMIO:  			/* used to fix up pre-initialized MEM BARs */ -			if (!lba_dev->hba.lmmio_space.start) { +			if (!lba_dev->hba.lmmio_space.flags) {  				sprintf(lba_dev->hba.lmmio_name,  						"PCI%02x LMMIO",  						(int)lba_dev->hba.bus_num.start); @@ -1001,7 +1001,7 @@ lba_pat_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)  					io->start;  				r = &lba_dev->hba.lmmio_space;  				r->name = lba_dev->hba.lmmio_name; -			} else if (!lba_dev->hba.elmmio_space.start) { +			} else if (!lba_dev->hba.elmmio_space.flags) {  				sprintf(lba_dev->hba.elmmio_name,  						"PCI%02x ELMMIO",  						(int)lba_dev->hba.bus_num.start); @@ -1096,6 +1096,7 @@ lba_legacy_resources(struct parisc_device *pa_dev, struct lba_device *lba_dev)  	r->name = "LBA PCI Busses";  	r->start = lba_num & 0xff;  	r->end = (lba_num>>8) & 0xff; +	r->flags = IORESOURCE_BUS;  	/* Set up local PCI Bus resources - we don't need them for  	** Legacy boxes but it's nice to see in /proc/iomem. @@ -1494,7 +1495,7 @@ lba_driver_probe(struct parisc_device *dev)  	pci_add_resource_offset(&resources, &lba_dev->hba.io_space,  				HBA_PORT_BASE(lba_dev->hba.hba_num)); -	if (lba_dev->hba.elmmio_space.start) +	if (lba_dev->hba.elmmio_space.flags)  		pci_add_resource_offset(&resources, &lba_dev->hba.elmmio_space,  					lba_dev->hba.lmmio_space_offset);  	if (lba_dev->hba.lmmio_space.flags) diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig index 24e12d4d176..a50576081b3 100644 --- a/drivers/parport/Kconfig +++ b/drivers/parport/Kconfig @@ -71,7 +71,7 @@ config PARPORT_PC_FIFO  config PARPORT_PC_SUPERIO  	bool "SuperIO chipset support" -	depends on PARPORT_PC +	depends on PARPORT_PC && !PARISC  	help  	  Saying Y here enables some probes for Super-IO chipsets in order to  	  find out things like base addresses, IRQ lines and DMA channels.  It diff --git a/drivers/parport/parport_gsc.c b/drivers/parport/parport_gsc.c index a5251cb5fb0..6e3a60c7887 100644 --- a/drivers/parport/parport_gsc.c +++ b/drivers/parport/parport_gsc.c @@ -234,7 +234,7 @@ static int parport_PS2_supported(struct parport *pb)  struct parport *parport_gsc_probe_port(unsigned long base,  				       unsigned long base_hi, int irq, -				       int dma, struct pci_dev *dev) +				       int dma, struct parisc_device *padev)  {  	struct parport_gsc_private *priv;  	struct parport_operations *ops; @@ -258,7 +258,6 @@ struct parport *parport_gsc_probe_port(unsigned long base,  	priv->ctr_writable = 0xff;  	priv->dma_buf = 0;  	priv->dma_handle = 0; -	priv->dev = dev;  	p->base = base;  	p->base_hi = base_hi;  	p->irq = irq; @@ -282,6 +281,7 @@ struct parport *parport_gsc_probe_port(unsigned long base,  		return NULL;  	} +	p->dev = &padev->dev;  	p->base_hi = base_hi;  	p->modes = tmp.modes;  	p->size = (p->modes & PARPORT_MODE_EPP)?8:3; @@ -373,7 +373,7 @@ static int parport_init_chip(struct parisc_device *dev)  	}  	p = parport_gsc_probe_port(port, 0, dev->irq, -			/* PARPORT_IRQ_NONE */ PARPORT_DMA_NONE, NULL); +			/* PARPORT_IRQ_NONE */ PARPORT_DMA_NONE, dev);  	if (p)  		parport_count++;  	dev_set_drvdata(&dev->dev, p); diff --git a/drivers/parport/parport_gsc.h b/drivers/parport/parport_gsc.h index fc9c37c5402..812214768d2 100644 --- a/drivers/parport/parport_gsc.h +++ b/drivers/parport/parport_gsc.h @@ -217,6 +217,6 @@ extern void parport_gsc_dec_use_count(void);  extern struct parport *parport_gsc_probe_port(unsigned long base,  						unsigned long base_hi,  						int irq, int dma, -						struct pci_dev *dev); +						struct parisc_device *padev);  #endif	/* __DRIVERS_PARPORT_PARPORT_GSC_H */ diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c index 8ec8b4f4856..0f4554e48cc 100644 --- a/drivers/pci/pcie/aer/aerdrv_core.c +++ b/drivers/pci/pcie/aer/aerdrv_core.c @@ -580,6 +580,7 @@ struct aer_recover_entry  	u8	devfn;  	u16	domain;  	int	severity; +	struct aer_capability_regs *regs;  };  static DEFINE_KFIFO(aer_recover_ring, struct aer_recover_entry, @@ -593,7 +594,7 @@ static DEFINE_SPINLOCK(aer_recover_ring_lock);  static DECLARE_WORK(aer_recover_work, aer_recover_work_func);  void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn, -		       int severity) +		       int severity, struct aer_capability_regs *aer_regs)  {  	unsigned long flags;  	struct aer_recover_entry entry = { @@ -601,6 +602,7 @@ void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn,  		.devfn		= devfn,  		.domain		= domain,  		.severity	= severity, +		.regs		= aer_regs,  	};  	spin_lock_irqsave(&aer_recover_ring_lock, flags); @@ -627,6 +629,7 @@ static void aer_recover_work_func(struct work_struct *work)  			       PCI_SLOT(entry.devfn), PCI_FUNC(entry.devfn));  			continue;  		} +		cper_print_aer(pdev, entry.severity, entry.regs);  		do_recovery(pdev, entry.severity);  		pci_dev_put(pdev);  	} diff --git a/drivers/pci/pcie/aer/aerdrv_errprint.c b/drivers/pci/pcie/aer/aerdrv_errprint.c index 5ab14251839..2c7c9f5f592 100644 --- a/drivers/pci/pcie/aer/aerdrv_errprint.c +++ b/drivers/pci/pcie/aer/aerdrv_errprint.c @@ -220,7 +220,7 @@ int cper_severity_to_aer(int cper_severity)  }  EXPORT_SYMBOL_GPL(cper_severity_to_aer); -void cper_print_aer(const char *prefix, struct pci_dev *dev, int cper_severity, +void cper_print_aer(struct pci_dev *dev, int cper_severity,  		    struct aer_capability_regs *aer)  {  	int aer_severity, layer, agent, status_strs_size, tlp_header_valid = 0; @@ -244,7 +244,7 @@ void cper_print_aer(const char *prefix, struct pci_dev *dev, int cper_severity,  	agent = AER_GET_AGENT(aer_severity, status);  	dev_err(&dev->dev, "aer_status: 0x%08x, aer_mask: 0x%08x\n",  	       status, mask); -	cper_print_bits(prefix, status, status_strs, status_strs_size); +	cper_print_bits("", status, status_strs, status_strs_size);  	dev_err(&dev->dev, "aer_layer=%s, aer_agent=%s\n",  	       aer_error_layer[layer], aer_agent_string[agent]);  	if (aer_severity != AER_CORRECTABLE) diff --git a/drivers/pinctrl/pinconf.c b/drivers/pinctrl/pinconf.c index c67c37e23dd..694c3ace452 100644 --- a/drivers/pinctrl/pinconf.c +++ b/drivers/pinctrl/pinconf.c @@ -610,7 +610,7 @@ static int pinconf_dbg_config_print(struct seq_file *s, void *d)  	bool found = false;  	unsigned long config; -	mutex_lock(&pctldev->mutex); +	mutex_lock(&pinctrl_maps_mutex);  	/* Parse the pinctrl map and look for the elected pin/state */  	for_each_maps(maps_node, i, map) { @@ -659,7 +659,7 @@ static int pinconf_dbg_config_print(struct seq_file *s, void *d)  		confops->pin_config_config_dbg_show(pctldev, s, config);  exit: -	mutex_unlock(&pctldev->mutex); +	mutex_unlock(&pinctrl_maps_mutex);  	return 0;  } diff --git a/drivers/pinctrl/pinctrl-coh901.c b/drivers/pinctrl/pinctrl-coh901.c index a67af419f53..d6b41747d68 100644 --- a/drivers/pinctrl/pinctrl-coh901.c +++ b/drivers/pinctrl/pinctrl-coh901.c @@ -830,7 +830,8 @@ static int __init u300_gpio_probe(struct platform_device *pdev)  	return 0;  err_no_range: -	err = gpiochip_remove(&gpio->chip); +	if (gpiochip_remove(&gpio->chip)) +		dev_err(&pdev->dev, "failed to remove gpio chip\n");  err_no_chip:  err_no_domain:  err_no_port: diff --git a/drivers/pinctrl/pinctrl-exynos.c b/drivers/pinctrl/pinctrl-exynos.c index ac742817ebc..2d76f66a2e0 100644 --- a/drivers/pinctrl/pinctrl-exynos.c +++ b/drivers/pinctrl/pinctrl-exynos.c @@ -196,6 +196,12 @@ static irqreturn_t exynos_eint_gpio_irq(int irq, void *data)  	return IRQ_HANDLED;  } +struct exynos_eint_gpio_save { +	u32 eint_con; +	u32 eint_fltcon0; +	u32 eint_fltcon1; +}; +  /*   * exynos_eint_gpio_init() - setup handling of external gpio interrupts.   * @d: driver data of samsung pinctrl driver. @@ -204,8 +210,8 @@ static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)  {  	struct samsung_pin_bank *bank;  	struct device *dev = d->dev; -	unsigned int ret; -	unsigned int i; +	int ret; +	int i;  	if (!d->irq) {  		dev_err(dev, "irq number not available\n"); @@ -227,11 +233,29 @@ static int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d)  				bank->nr_pins, &exynos_gpio_irqd_ops, bank);  		if (!bank->irq_domain) {  			dev_err(dev, "gpio irq domain add failed\n"); -			return -ENXIO; +			ret = -ENXIO; +			goto err_domains; +		} + +		bank->soc_priv = devm_kzalloc(d->dev, +			sizeof(struct exynos_eint_gpio_save), GFP_KERNEL); +		if (!bank->soc_priv) { +			irq_domain_remove(bank->irq_domain); +			ret = -ENOMEM; +			goto err_domains;  		}  	}  	return 0; + +err_domains: +	for (--i, --bank; i >= 0; --i, --bank) { +		if (bank->eint_type != EINT_TYPE_GPIO) +			continue; +		irq_domain_remove(bank->irq_domain); +	} + +	return ret;  }  static void exynos_wkup_irq_unmask(struct irq_data *irqd) @@ -326,6 +350,28 @@ static int exynos_wkup_irq_set_type(struct irq_data *irqd, unsigned int type)  	return 0;  } +static u32 exynos_eint_wake_mask = 0xffffffff; + +u32 exynos_get_eint_wake_mask(void) +{ +	return exynos_eint_wake_mask; +} + +static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on) +{ +	struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); +	unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq); + +	pr_info("wake %s for irq %d\n", on ? "enabled" : "disabled", irqd->irq); + +	if (!on) +		exynos_eint_wake_mask |= bit; +	else +		exynos_eint_wake_mask &= ~bit; + +	return 0; +} +  /*   * irq_chip for wakeup interrupts   */ @@ -335,6 +381,7 @@ static struct irq_chip exynos_wkup_irq_chip = {  	.irq_mask	= exynos_wkup_irq_mask,  	.irq_ack	= exynos_wkup_irq_ack,  	.irq_set_type	= exynos_wkup_irq_set_type, +	.irq_set_wake	= exynos_wkup_irq_set_wake,  };  /* interrupt handler for wakeup interrupts 0..15 */ @@ -505,6 +552,72 @@ static int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)  	return 0;  } +static void exynos_pinctrl_suspend_bank( +				struct samsung_pinctrl_drv_data *drvdata, +				struct samsung_pin_bank *bank) +{ +	struct exynos_eint_gpio_save *save = bank->soc_priv; +	void __iomem *regs = drvdata->virt_base; + +	save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET +						+ bank->eint_offset); +	save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET +						+ 2 * bank->eint_offset); +	save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET +						+ 2 * bank->eint_offset + 4); + +	pr_debug("%s: save     con %#010x\n", bank->name, save->eint_con); +	pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0); +	pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1); +} + +static void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata) +{ +	struct samsung_pin_ctrl *ctrl = drvdata->ctrl; +	struct samsung_pin_bank *bank = ctrl->pin_banks; +	int i; + +	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) +		if (bank->eint_type == EINT_TYPE_GPIO) +			exynos_pinctrl_suspend_bank(drvdata, bank); +} + +static void exynos_pinctrl_resume_bank( +				struct samsung_pinctrl_drv_data *drvdata, +				struct samsung_pin_bank *bank) +{ +	struct exynos_eint_gpio_save *save = bank->soc_priv; +	void __iomem *regs = drvdata->virt_base; + +	pr_debug("%s:     con %#010x => %#010x\n", bank->name, +			readl(regs + EXYNOS_GPIO_ECON_OFFSET +			+ bank->eint_offset), save->eint_con); +	pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name, +			readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET +			+ 2 * bank->eint_offset), save->eint_fltcon0); +	pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name, +			readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET +			+ 2 * bank->eint_offset + 4), save->eint_fltcon1); + +	writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET +						+ bank->eint_offset); +	writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET +						+ 2 * bank->eint_offset); +	writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET +						+ 2 * bank->eint_offset + 4); +} + +static void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata) +{ +	struct samsung_pin_ctrl *ctrl = drvdata->ctrl; +	struct samsung_pin_bank *bank = ctrl->pin_banks; +	int i; + +	for (i = 0; i < ctrl->nr_banks; ++i, ++bank) +		if (bank->eint_type == EINT_TYPE_GPIO) +			exynos_pinctrl_resume_bank(drvdata, bank); +} +  /* pin banks of exynos4210 pin-controller 0 */  static struct samsung_pin_bank exynos4210_pin_banks0[] = {  	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00), @@ -568,6 +681,8 @@ struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4210-gpio-ctrl0",  	}, {  		/* pin-controller instance 1 data */ @@ -582,6 +697,8 @@ struct samsung_pin_ctrl exynos4210_pin_ctrl[] = {  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init,  		.eint_wkup_init = exynos_eint_wkup_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4210-gpio-ctrl1",  	}, {  		/* pin-controller instance 2 data */ @@ -663,6 +780,8 @@ struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4x12-gpio-ctrl0",  	}, {  		/* pin-controller instance 1 data */ @@ -677,6 +796,8 @@ struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init,  		.eint_wkup_init = exynos_eint_wkup_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4x12-gpio-ctrl1",  	}, {  		/* pin-controller instance 2 data */ @@ -687,6 +808,8 @@ struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4x12-gpio-ctrl2",  	}, {  		/* pin-controller instance 3 data */ @@ -697,6 +820,8 @@ struct samsung_pin_ctrl exynos4x12_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos4x12-gpio-ctrl3",  	},  }; @@ -775,6 +900,8 @@ struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init,  		.eint_wkup_init = exynos_eint_wkup_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos5250-gpio-ctrl0",  	}, {  		/* pin-controller instance 1 data */ @@ -785,6 +912,8 @@ struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos5250-gpio-ctrl1",  	}, {  		/* pin-controller instance 2 data */ @@ -795,6 +924,8 @@ struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos5250-gpio-ctrl2",  	}, {  		/* pin-controller instance 3 data */ @@ -805,6 +936,8 @@ struct samsung_pin_ctrl exynos5250_pin_ctrl[] = {  		.geint_pend	= EXYNOS_GPIO_EPEND_OFFSET,  		.svc		= EXYNOS_SVC_OFFSET,  		.eint_gpio_init = exynos_eint_gpio_init, +		.suspend	= exynos_pinctrl_suspend, +		.resume		= exynos_pinctrl_resume,  		.label		= "exynos5250-gpio-ctrl3",  	},  }; diff --git a/drivers/pinctrl/pinctrl-exynos.h b/drivers/pinctrl/pinctrl-exynos.h index 9b1f77a5bf0..3c91c357792 100644 --- a/drivers/pinctrl/pinctrl-exynos.h +++ b/drivers/pinctrl/pinctrl-exynos.h @@ -19,6 +19,7 @@  /* External GPIO and wakeup interrupt related definitions */  #define EXYNOS_GPIO_ECON_OFFSET		0x700 +#define EXYNOS_GPIO_EFLTCON_OFFSET	0x800  #define EXYNOS_GPIO_EMASK_OFFSET	0x900  #define EXYNOS_GPIO_EPEND_OFFSET	0xA00  #define EXYNOS_WKUP_ECON_OFFSET		0xE00 diff --git a/drivers/pinctrl/pinctrl-samsung.c b/drivers/pinctrl/pinctrl-samsung.c index 055d0162098..63ac22e8967 100644 --- a/drivers/pinctrl/pinctrl-samsung.c +++ b/drivers/pinctrl/pinctrl-samsung.c @@ -28,6 +28,7 @@  #include <linux/gpio.h>  #include <linux/irqdomain.h>  #include <linux/spinlock.h> +#include <linux/syscore_ops.h>  #include "core.h"  #include "pinctrl-samsung.h" @@ -48,6 +49,9 @@ static struct pin_config {  	{ "samsung,pin-pud-pdn", PINCFG_TYPE_PUD_PDN },  }; +/* Global list of devices (struct samsung_pinctrl_drv_data) */ +LIST_HEAD(drvdata_list); +  static unsigned int pin_base;  static inline struct samsung_pin_bank *gc_to_pin_bank(struct gpio_chip *gc) @@ -956,9 +960,151 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)  		ctrl->eint_wkup_init(drvdata);  	platform_set_drvdata(pdev, drvdata); + +	/* Add to the global list */ +	list_add_tail(&drvdata->node, &drvdata_list); +  	return 0;  } +#ifdef CONFIG_PM + +/** + * samsung_pinctrl_suspend_dev - save pinctrl state for suspend for a device + * + * Save data for all banks handled by this device. + */ +static void samsung_pinctrl_suspend_dev( +	struct samsung_pinctrl_drv_data *drvdata) +{ +	struct samsung_pin_ctrl *ctrl = drvdata->ctrl; +	void __iomem *virt_base = drvdata->virt_base; +	int i; + +	for (i = 0; i < ctrl->nr_banks; i++) { +		struct samsung_pin_bank *bank = &ctrl->pin_banks[i]; +		void __iomem *reg = virt_base + bank->pctl_offset; + +		u8 *offs = bank->type->reg_offset; +		u8 *widths = bank->type->fld_width; +		enum pincfg_type type; + +		/* Registers without a powerdown config aren't lost */ +		if (!widths[PINCFG_TYPE_CON_PDN]) +			continue; + +		for (type = 0; type < PINCFG_TYPE_NUM; type++) +			if (widths[type]) +				bank->pm_save[type] = readl(reg + offs[type]); + +		if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) { +			/* Some banks have two config registers */ +			bank->pm_save[PINCFG_TYPE_NUM] = +				readl(reg + offs[PINCFG_TYPE_FUNC] + 4); +			pr_debug("Save %s @ %p (con %#010x %08x)\n", +				 bank->name, reg, +				 bank->pm_save[PINCFG_TYPE_FUNC], +				 bank->pm_save[PINCFG_TYPE_NUM]); +		} else { +			pr_debug("Save %s @ %p (con %#010x)\n", bank->name, +				 reg, bank->pm_save[PINCFG_TYPE_FUNC]); +		} +	} + +	if (ctrl->suspend) +		ctrl->suspend(drvdata); +} + +/** + * samsung_pinctrl_resume_dev - restore pinctrl state from suspend for a device + * + * Restore one of the banks that was saved during suspend. + * + * We don't bother doing anything complicated to avoid glitching lines since + * we're called before pad retention is turned off. + */ +static void samsung_pinctrl_resume_dev(struct samsung_pinctrl_drv_data *drvdata) +{ +	struct samsung_pin_ctrl *ctrl = drvdata->ctrl; +	void __iomem *virt_base = drvdata->virt_base; +	int i; + +	if (ctrl->resume) +		ctrl->resume(drvdata); + +	for (i = 0; i < ctrl->nr_banks; i++) { +		struct samsung_pin_bank *bank = &ctrl->pin_banks[i]; +		void __iomem *reg = virt_base + bank->pctl_offset; + +		u8 *offs = bank->type->reg_offset; +		u8 *widths = bank->type->fld_width; +		enum pincfg_type type; + +		/* Registers without a powerdown config aren't lost */ +		if (!widths[PINCFG_TYPE_CON_PDN]) +			continue; + +		if (widths[PINCFG_TYPE_FUNC] * bank->nr_pins > 32) { +			/* Some banks have two config registers */ +			pr_debug("%s @ %p (con %#010x %08x => %#010x %08x)\n", +				 bank->name, reg, +				 readl(reg + offs[PINCFG_TYPE_FUNC]), +				 readl(reg + offs[PINCFG_TYPE_FUNC] + 4), +				 bank->pm_save[PINCFG_TYPE_FUNC], +				 bank->pm_save[PINCFG_TYPE_NUM]); +			writel(bank->pm_save[PINCFG_TYPE_NUM], +			       reg + offs[PINCFG_TYPE_FUNC] + 4); +		} else { +			pr_debug("%s @ %p (con %#010x => %#010x)\n", bank->name, +				 reg, readl(reg + offs[PINCFG_TYPE_FUNC]), +				 bank->pm_save[PINCFG_TYPE_FUNC]); +		} +		for (type = 0; type < PINCFG_TYPE_NUM; type++) +			if (widths[type]) +				writel(bank->pm_save[type], reg + offs[type]); +	} +} + +/** + * samsung_pinctrl_suspend - save pinctrl state for suspend + * + * Save data for all banks across all devices. + */ +static int samsung_pinctrl_suspend(void) +{ +	struct samsung_pinctrl_drv_data *drvdata; + +	list_for_each_entry(drvdata, &drvdata_list, node) { +		samsung_pinctrl_suspend_dev(drvdata); +	} + +	return 0; +} + +/** + * samsung_pinctrl_resume - restore pinctrl state for suspend + * + * Restore data for all banks across all devices. + */ +static void samsung_pinctrl_resume(void) +{ +	struct samsung_pinctrl_drv_data *drvdata; + +	list_for_each_entry_reverse(drvdata, &drvdata_list, node) { +		samsung_pinctrl_resume_dev(drvdata); +	} +} + +#else +#define samsung_pinctrl_suspend		NULL +#define samsung_pinctrl_resume		NULL +#endif + +static struct syscore_ops samsung_pinctrl_syscore_ops = { +	.suspend	= samsung_pinctrl_suspend, +	.resume		= samsung_pinctrl_resume, +}; +  static const struct of_device_id samsung_pinctrl_dt_match[] = {  #ifdef CONFIG_PINCTRL_EXYNOS  	{ .compatible = "samsung,exynos4210-pinctrl", @@ -987,6 +1133,14 @@ static struct platform_driver samsung_pinctrl_driver = {  static int __init samsung_pinctrl_drv_register(void)  { +	/* +	 * Register syscore ops for save/restore of registers across suspend. +	 * It's important to ensure that this driver is running at an earlier +	 * initcall level than any arch-specific init calls that install syscore +	 * ops that turn off pad retention (like exynos_pm_resume). +	 */ +	register_syscore_ops(&samsung_pinctrl_syscore_ops); +  	return platform_driver_register(&samsung_pinctrl_driver);  }  postcore_initcall(samsung_pinctrl_drv_register); diff --git a/drivers/pinctrl/pinctrl-samsung.h b/drivers/pinctrl/pinctrl-samsung.h index 7c7f9ebcd05..26d3519240c 100644 --- a/drivers/pinctrl/pinctrl-samsung.h +++ b/drivers/pinctrl/pinctrl-samsung.h @@ -127,6 +127,7 @@ struct samsung_pin_bank_type {   * @gpio_chip: GPIO chip of the bank.   * @grange: linux gpio pin range supported by this bank.   * @slock: spinlock protecting bank registers + * @pm_save: saved register values during suspend   */  struct samsung_pin_bank {  	struct samsung_pin_bank_type *type; @@ -138,12 +139,15 @@ struct samsung_pin_bank {  	u32		eint_mask;  	u32		eint_offset;  	char		*name; +	void		*soc_priv;  	struct device_node *of_node;  	struct samsung_pinctrl_drv_data *drvdata;  	struct irq_domain *irq_domain;  	struct gpio_chip gpio_chip;  	struct pinctrl_gpio_range grange;  	spinlock_t slock; + +	u32 pm_save[PINCFG_TYPE_NUM + 1]; /* +1 to handle double CON registers*/  };  /** @@ -184,11 +188,15 @@ struct samsung_pin_ctrl {  	int		(*eint_gpio_init)(struct samsung_pinctrl_drv_data *);  	int		(*eint_wkup_init)(struct samsung_pinctrl_drv_data *); +	void		(*suspend)(struct samsung_pinctrl_drv_data *); +	void		(*resume)(struct samsung_pinctrl_drv_data *); +  	char		*label;  };  /**   * struct samsung_pinctrl_drv_data: wrapper for holding driver data together. + * @node: global list node   * @virt_base: register base address of the controller.   * @dev: device instance representing the controller.   * @irq: interrpt number used by the controller to notify gpio interrupts. @@ -201,6 +209,7 @@ struct samsung_pin_ctrl {   * @nr_function: number of such pin functions.   */  struct samsung_pinctrl_drv_data { +	struct list_head		node;  	void __iomem			*virt_base;  	struct device			*dev;  	int				irq; diff --git a/drivers/pinctrl/pinctrl-sunxi.c b/drivers/pinctrl/pinctrl-sunxi.c index c52fc2c0873..b7d8c890514 100644 --- a/drivers/pinctrl/pinctrl-sunxi.c +++ b/drivers/pinctrl/pinctrl-sunxi.c @@ -1990,8 +1990,10 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	}  	clk = devm_clk_get(&pdev->dev, NULL); -	if (IS_ERR(clk)) +	if (IS_ERR(clk)) { +		ret = PTR_ERR(clk);  		goto gpiochip_error; +	}  	clk_prepare_enable(clk); @@ -2000,7 +2002,8 @@ static int sunxi_pinctrl_probe(struct platform_device *pdev)  	return 0;  gpiochip_error: -	ret = gpiochip_remove(pctl->chip); +	if (gpiochip_remove(pctl->chip)) +		dev_err(&pdev->dev, "failed to remove gpio chip\n");  pinctrl_error:  	pinctrl_unregister(pctl->pctl_dev);  	return ret; diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c index 791a6719d8a..8cd90e7e945 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c @@ -2357,27 +2357,48 @@ static const unsigned int sdhi3_wp_mux[] = {  };  /* - USB0 ------------------------------------------------------------------- */  static const unsigned int usb0_pins[] = { -	/* OVC */ -	150, 154, +	/* PENC */ +	154,  };  static const unsigned int usb0_mux[] = { -	USB_OVC0_MARK, USB_PENC0_MARK, +	USB_PENC0_MARK, +}; +static const unsigned int usb0_ovc_pins[] = { +	/* USB_OVC */ +	150 +}; +static const unsigned int usb0_ovc_mux[] = { +	USB_OVC0_MARK,  };  /* - USB1 ------------------------------------------------------------------- */  static const unsigned int usb1_pins[] = { -	/* OVC */ -	152, 155, +	/* PENC */ +	155,  };  static const unsigned int usb1_mux[] = { -	USB_OVC1_MARK, USB_PENC1_MARK, +	USB_PENC1_MARK, +}; +static const unsigned int usb1_ovc_pins[] = { +	/* USB_OVC */ +	152, +}; +static const unsigned int usb1_ovc_mux[] = { +	USB_OVC1_MARK,  };  /* - USB2 ------------------------------------------------------------------- */  static const unsigned int usb2_pins[] = { -	/* OVC, PENC */ -	125, 156, +	/* PENC */ +	156,  };  static const unsigned int usb2_mux[] = { -	USB_OVC2_MARK, USB_PENC2_MARK, +	USB_PENC2_MARK, +}; +static const unsigned int usb2_ovc_pins[] = { +	/* USB_OVC */ +	125, +}; +static const unsigned int usb2_ovc_mux[] = { +	USB_OVC2_MARK,  };  static const struct sh_pfc_pin_group pinmux_groups[] = { @@ -2501,8 +2522,11 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {  	SH_PFC_PIN_GROUP(sdhi3_cd),  	SH_PFC_PIN_GROUP(sdhi3_wp),  	SH_PFC_PIN_GROUP(usb0), +	SH_PFC_PIN_GROUP(usb0_ovc),  	SH_PFC_PIN_GROUP(usb1), +	SH_PFC_PIN_GROUP(usb1_ovc),  	SH_PFC_PIN_GROUP(usb2), +	SH_PFC_PIN_GROUP(usb2_ovc),  };  static const char * const du0_groups[] = { @@ -2683,14 +2707,17 @@ static const char * const sdhi3_groups[] = {  static const char * const usb0_groups[] = {  	"usb0", +	"usb0_ovc",  };  static const char * const usb1_groups[] = {  	"usb1", +	"usb1_ovc",  };  static const char * const usb2_groups[] = {  	"usb2", +	"usb2_ovc",  };  static const struct sh_pfc_function pinmux_functions[] = { diff --git a/drivers/pinctrl/vt8500/pinctrl-wmt.c b/drivers/pinctrl/vt8500/pinctrl-wmt.c index ab63104e8dc..70d986e04af 100644 --- a/drivers/pinctrl/vt8500/pinctrl-wmt.c +++ b/drivers/pinctrl/vt8500/pinctrl-wmt.c @@ -609,8 +609,7 @@ int wmt_pinctrl_probe(struct platform_device *pdev,  	return 0;  fail_range: -	err = gpiochip_remove(&data->gpio_chip); -	if (err) +	if (gpiochip_remove(&data->gpio_chip))  		dev_err(&pdev->dev, "failed to remove gpio chip\n");  fail_gpio:  	pinctrl_unregister(data->pctl_dev); diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 8df0c5a21be..d111c8687f9 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c @@ -703,7 +703,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device)  		}  		rfkill_init_sw_state(gps_rfkill,  				     hp_wmi_get_sw_state(HPWMI_GPS)); -		rfkill_set_hw_state(bluetooth_rfkill, +		rfkill_set_hw_state(gps_rfkill,  				    hp_wmi_get_hw_state(HPWMI_GPS));  		err = rfkill_register(gps_rfkill);  		if (err) diff --git a/drivers/ptp/ptp_pch.c b/drivers/ptp/ptp_pch.c index bea94510ad2..71a2559278d 100644 --- a/drivers/ptp/ptp_pch.c +++ b/drivers/ptp/ptp_pch.c @@ -628,9 +628,10 @@ pch_probe(struct pci_dev *pdev, const struct pci_device_id *id)  	chip->caps = ptp_pch_caps;  	chip->ptp_clock = ptp_clock_register(&chip->caps, &pdev->dev); - -	if (IS_ERR(chip->ptp_clock)) -		return PTR_ERR(chip->ptp_clock); +	if (IS_ERR(chip->ptp_clock)) { +		ret = PTR_ERR(chip->ptp_clock); +		goto err_ptp_clock_reg; +	}  	spin_lock_init(&chip->register_lock); @@ -669,6 +670,7 @@ pch_probe(struct pci_dev *pdev, const struct pci_device_id *id)  err_req_irq:  	ptp_clock_unregister(chip->ptp_clock); +err_ptp_clock_reg:  	iounmap(chip->regs);  	chip->regs = NULL; diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6e501784158..815d6df8bd5 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1539,7 +1539,10 @@ static void regulator_ena_gpio_free(struct regulator_dev *rdev)  }  /** - * Balance enable_count of each GPIO and actual GPIO pin control. + * regulator_ena_gpio_ctrl - balance enable_count of each GPIO and actual GPIO pin control + * @rdev: regulator_dev structure + * @enable: enable GPIO at initial use? + *   * GPIO is enabled in case of initial use. (enable_count is 0)   * GPIO is disabled when it is not shared any more. (enable_count <= 1)   */ @@ -2702,7 +2705,7 @@ EXPORT_SYMBOL_GPL(regulator_get_voltage);  /**   * regulator_set_current_limit - set regulator output current limit   * @regulator: regulator source - * @min_uA: Minimuum supported current in uA + * @min_uA: Minimum supported current in uA   * @max_uA: Maximum supported current in uA   *   * Sets current sink to the desired output current. This can be set during diff --git a/drivers/regulator/dbx500-prcmu.c b/drivers/regulator/dbx500-prcmu.c index 89bd2faaef8..ce89f7848a5 100644 --- a/drivers/regulator/dbx500-prcmu.c +++ b/drivers/regulator/dbx500-prcmu.c @@ -24,18 +24,6 @@  static int power_state_active_cnt; /* will initialize to zero */  static DEFINE_SPINLOCK(power_state_active_lock); -int power_state_active_get(void) -{ -	unsigned long flags; -	int cnt; - -	spin_lock_irqsave(&power_state_active_lock, flags); -	cnt = power_state_active_cnt; -	spin_unlock_irqrestore(&power_state_active_lock, flags); - -	return cnt; -} -  void power_state_active_enable(void)  {  	unsigned long flags; @@ -65,6 +53,18 @@ out:  #ifdef CONFIG_REGULATOR_DEBUG +static int power_state_active_get(void) +{ +	unsigned long flags; +	int cnt; + +	spin_lock_irqsave(&power_state_active_lock, flags); +	cnt = power_state_active_cnt; +	spin_unlock_irqrestore(&power_state_active_lock, flags); + +	return cnt; +} +  static struct ux500_regulator_debug {  	struct dentry *dir;  	struct dentry *status_file; diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 92ceed0fc65..3ae44ac12a9 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -840,7 +840,7 @@ static int palmas_regulators_probe(struct platform_device *pdev)  			break;  		} -		if ((id == PALMAS_REG_SMPS6) && (id == PALMAS_REG_SMPS8)) +		if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8))  			ramp_delay_support = true;  		if (ramp_delay_support) { @@ -878,7 +878,7 @@ static int palmas_regulators_probe(struct platform_device *pdev)  			pmic->desc[id].vsel_mask = SMPS10_VSEL;  			pmic->desc[id].enable_reg =  					PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, -							PALMAS_SMPS10_STATUS); +							PALMAS_SMPS10_CTRL);  			pmic->desc[id].enable_mask = SMPS10_BOOST_EN;  			pmic->desc[id].min_uV = 3750000;  			pmic->desc[id].uV_step = 1250000; diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4361d9772c4..d72a9216ee2 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -3440,8 +3440,16 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event)  			device->path_data.opm &= ~eventlpm;  			device->path_data.ppm &= ~eventlpm;  			device->path_data.npm &= ~eventlpm; -			if (oldopm && !device->path_data.opm) -				dasd_generic_last_path_gone(device); +			if (oldopm && !device->path_data.opm) { +				dev_warn(&device->cdev->dev, +					 "No verified channel paths remain " +					 "for the device\n"); +				DBF_DEV_EVENT(DBF_WARNING, device, +					      "%s", "last verified path gone"); +				dasd_eer_write(device, NULL, DASD_EER_NOPATH); +				dasd_device_set_stop_bits(device, +							  DASD_STOPPED_DC_WAIT); +			}  		}  		if (path_event[chp] & PE_PATH_AVAILABLE) {  			device->path_data.opm &= ~eventlpm; diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index d182c96e17e..7a3870f385f 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c @@ -1370,7 +1370,7 @@ static void tcm_qla2xxx_free_session(struct qla_tgt_sess *sess)  		dump_stack();  		return;  	} -	target_wait_for_sess_cmds(se_sess, 0); +	target_wait_for_sess_cmds(se_sess);  	transport_deregister_session_configfs(sess->se_sess);  	transport_deregister_session(sess->se_sess); diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c index db66357211e..86f0c5d5c11 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -84,6 +84,7 @@ static int proc_scsi_host_open(struct inode *inode, struct file *file)  static const struct file_operations proc_scsi_fops = {  	.open = proc_scsi_host_open, +	.release = single_release,  	.read = seq_read,  	.llseek = seq_lseek,  	.write = proc_scsi_host_write diff --git a/drivers/staging/android/alarm-dev.c b/drivers/staging/android/alarm-dev.c index ceb1c643753..6dc27dac679 100644 --- a/drivers/staging/android/alarm-dev.c +++ b/drivers/staging/android/alarm-dev.c @@ -264,6 +264,8 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  	}  	rv = alarm_do_ioctl(file, cmd, &ts); +	if (rv) +		return rv;  	switch (ANDROID_ALARM_BASE_CMD(cmd)) {  	case ANDROID_ALARM_GET_TIME(0): @@ -272,7 +274,7 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  		break;  	} -	return rv; +	return 0;  }  #ifdef CONFIG_COMPAT  static long alarm_compat_ioctl(struct file *file, unsigned int cmd, @@ -295,6 +297,8 @@ static long alarm_compat_ioctl(struct file *file, unsigned int cmd,  	}  	rv = alarm_do_ioctl(file, cmd, &ts); +	if (rv) +		return rv;  	switch (ANDROID_ALARM_BASE_CMD(cmd)) {  	case ANDROID_ALARM_GET_TIME(0): /* NOTE: we modified cmd above */ @@ -303,7 +307,7 @@ static long alarm_compat_ioctl(struct file *file, unsigned int cmd,  		break;  	} -	return rv; +	return 0;  }  #endif diff --git a/drivers/staging/dwc2/hcd.c b/drivers/staging/dwc2/hcd.c index 827ab781ae9..8551ccedf03 100644 --- a/drivers/staging/dwc2/hcd.c +++ b/drivers/staging/dwc2/hcd.c @@ -2804,9 +2804,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,  	/* Set device flags indicating whether the HCD supports DMA */  	if (hsotg->core_params->dma_enable > 0) { -		if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0) -			dev_warn(hsotg->dev, -				 "can't enable workaround for >2GB RAM\n"); +		if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(32)) < 0) +			dev_warn(hsotg->dev, "can't set DMA mask\n");  		if (dma_set_coherent_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0)  			dev_warn(hsotg->dev,  				 "can't enable workaround for >2GB RAM\n"); diff --git a/drivers/staging/imx-drm/ipuv3-crtc.c b/drivers/staging/imx-drm/ipuv3-crtc.c index ea61c869110..ff5c6335093 100644 --- a/drivers/staging/imx-drm/ipuv3-crtc.c +++ b/drivers/staging/imx-drm/ipuv3-crtc.c @@ -316,31 +316,14 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,  static void ipu_crtc_handle_pageflip(struct ipu_crtc *ipu_crtc)  { -	struct drm_pending_vblank_event *e; -	struct timeval now;  	unsigned long flags;  	struct drm_device *drm = ipu_crtc->base.dev;  	spin_lock_irqsave(&drm->event_lock, flags); - -	e = ipu_crtc->page_flip_event; -	if (!e) { -		spin_unlock_irqrestore(&drm->event_lock, flags); -		return; -	} - -	do_gettimeofday(&now); -	e->event.sequence = 0; -	e->event.tv_sec = now.tv_sec; -	e->event.tv_usec = now.tv_usec; +	if (ipu_crtc->page_flip_event) +		drm_send_vblank_event(drm, -1, ipu_crtc->page_flip_event);  	ipu_crtc->page_flip_event = NULL; -  	imx_drm_crtc_vblank_put(ipu_crtc->imx_crtc); - -	list_add_tail(&e->base.link, &e->base.file_priv->event_list); - -	wake_up_interruptible(&e->base.file_priv->event_wait); -  	spin_unlock_irqrestore(&drm->event_lock, flags);  } diff --git a/drivers/staging/zcache/ramster.h b/drivers/staging/zcache/ramster.h index e1f91d5a0f6..a858666eae6 100644 --- a/drivers/staging/zcache/ramster.h +++ b/drivers/staging/zcache/ramster.h @@ -11,10 +11,6 @@  #ifndef _ZCACHE_RAMSTER_H_  #define _ZCACHE_RAMSTER_H_ -#ifdef CONFIG_RAMSTER_MODULE -#define CONFIG_RAMSTER -#endif -  #ifdef CONFIG_RAMSTER  #include "ramster/ramster.h"  #else diff --git a/drivers/staging/zcache/ramster/debug.c b/drivers/staging/zcache/ramster/debug.c index 327e4f0d98e..5b26ee977c2 100644 --- a/drivers/staging/zcache/ramster/debug.c +++ b/drivers/staging/zcache/ramster/debug.c @@ -1,6 +1,8 @@  #include <linux/atomic.h>  #include "debug.h" +ssize_t ramster_foreign_eph_pages; +ssize_t ramster_foreign_pers_pages;  #ifdef CONFIG_DEBUG_FS  #include <linux/debugfs.h> diff --git a/drivers/staging/zcache/ramster/ramster.c b/drivers/staging/zcache/ramster/ramster.c index b18b887db79..a937ce1fa27 100644 --- a/drivers/staging/zcache/ramster/ramster.c +++ b/drivers/staging/zcache/ramster/ramster.c @@ -66,8 +66,6 @@ static int ramster_remote_target_nodenum __read_mostly = -1;  /* Used by this code. */  long ramster_flnodes; -ssize_t ramster_foreign_eph_pages; -ssize_t ramster_foreign_pers_pages;  /* FIXME frontswap selfshrinking knobs in debugfs? */  static LIST_HEAD(ramster_rem_op_list); @@ -399,14 +397,18 @@ void ramster_count_foreign_pages(bool eph, int count)  			inc_ramster_foreign_eph_pages();  		} else {  			dec_ramster_foreign_eph_pages(); +#ifdef CONFIG_RAMSTER_DEBUG  			WARN_ON_ONCE(ramster_foreign_eph_pages < 0); +#endif  		}  	} else {  		if (count > 0) {  			inc_ramster_foreign_pers_pages();  		} else {  			dec_ramster_foreign_pers_pages(); +#ifdef CONFIG_RAMSTER_DEBUG  			WARN_ON_ONCE(ramster_foreign_pers_pages < 0); +#endif  		}  	}  } diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 262ef1f23b3..d7705e5824f 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -651,7 +651,7 @@ static int iscsit_add_reject(  	cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL);  	if (!cmd->buf_ptr) {  		pr_err("Unable to allocate memory for cmd->buf_ptr\n"); -		iscsit_release_cmd(cmd); +		iscsit_free_cmd(cmd, false);  		return -1;  	} @@ -697,7 +697,7 @@ int iscsit_add_reject_from_cmd(  	cmd->buf_ptr = kmemdup(buf, ISCSI_HDR_LEN, GFP_KERNEL);  	if (!cmd->buf_ptr) {  		pr_err("Unable to allocate memory for cmd->buf_ptr\n"); -		iscsit_release_cmd(cmd); +		iscsit_free_cmd(cmd, false);  		return -1;  	} @@ -1743,7 +1743,7 @@ int iscsit_handle_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd,  	return 0;  out:  	if (cmd) -		iscsit_release_cmd(cmd); +		iscsit_free_cmd(cmd, false);  ping_out:  	kfree(ping_data);  	return ret; @@ -2251,7 +2251,7 @@ iscsit_handle_logout_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,  	if (conn->conn_state != TARG_CONN_STATE_LOGGED_IN) {  		pr_err("Received logout request on connection that"  			" is not in logged in state, ignoring request.\n"); -		iscsit_release_cmd(cmd); +		iscsit_free_cmd(cmd, false);  		return 0;  	} @@ -3665,7 +3665,7 @@ iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state  		list_del(&cmd->i_conn_node);  		spin_unlock_bh(&conn->cmd_lock); -		iscsit_free_cmd(cmd); +		iscsit_free_cmd(cmd, false);  		break;  	case ISTATE_SEND_NOPIN_WANT_RESPONSE:  		iscsit_mod_nopin_response_timer(conn); @@ -4122,7 +4122,7 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)  		iscsit_increment_maxcmdsn(cmd, sess); -		iscsit_free_cmd(cmd); +		iscsit_free_cmd(cmd, true);  		spin_lock_bh(&conn->cmd_lock);  	} diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c index ba6091bf93f..45a5afd5ea1 100644 --- a/drivers/target/iscsi/iscsi_target_erl2.c +++ b/drivers/target/iscsi/iscsi_target_erl2.c @@ -143,7 +143,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess)  			list_del(&cmd->i_conn_node);  			cmd->conn = NULL;  			spin_unlock(&cr->conn_recovery_cmd_lock); -			iscsit_free_cmd(cmd); +			iscsit_free_cmd(cmd, true);  			spin_lock(&cr->conn_recovery_cmd_lock);  		}  		spin_unlock(&cr->conn_recovery_cmd_lock); @@ -165,7 +165,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess)  			list_del(&cmd->i_conn_node);  			cmd->conn = NULL;  			spin_unlock(&cr->conn_recovery_cmd_lock); -			iscsit_free_cmd(cmd); +			iscsit_free_cmd(cmd, true);  			spin_lock(&cr->conn_recovery_cmd_lock);  		}  		spin_unlock(&cr->conn_recovery_cmd_lock); @@ -248,7 +248,7 @@ void iscsit_discard_cr_cmds_by_expstatsn(  		iscsit_remove_cmd_from_connection_recovery(cmd, sess);  		spin_unlock(&cr->conn_recovery_cmd_lock); -		iscsit_free_cmd(cmd); +		iscsit_free_cmd(cmd, true);  		spin_lock(&cr->conn_recovery_cmd_lock);  	}  	spin_unlock(&cr->conn_recovery_cmd_lock); @@ -302,7 +302,7 @@ int iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(struct iscsi_conn *conn)  		list_del(&cmd->i_conn_node);  		spin_unlock_bh(&conn->cmd_lock); -		iscsit_free_cmd(cmd); +		iscsit_free_cmd(cmd, true);  		spin_lock_bh(&conn->cmd_lock);  	}  	spin_unlock_bh(&conn->cmd_lock); @@ -355,7 +355,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)  			list_del(&cmd->i_conn_node);  			spin_unlock_bh(&conn->cmd_lock); -			iscsit_free_cmd(cmd); +			iscsit_free_cmd(cmd, true);  			spin_lock_bh(&conn->cmd_lock);  			continue;  		} @@ -375,7 +375,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn)  		     iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) {  			list_del(&cmd->i_conn_node);  			spin_unlock_bh(&conn->cmd_lock); -			iscsit_free_cmd(cmd); +			iscsit_free_cmd(cmd, true);  			spin_lock_bh(&conn->cmd_lock);  			continue;  		} diff --git a/drivers/target/iscsi/iscsi_target_parameters.c b/drivers/target/iscsi/iscsi_target_parameters.c index c2185fc3113..e38222191a3 100644 --- a/drivers/target/iscsi/iscsi_target_parameters.c +++ b/drivers/target/iscsi/iscsi_target_parameters.c @@ -758,9 +758,9 @@ static int iscsi_add_notunderstood_response(  	}  	INIT_LIST_HEAD(&extra_response->er_list); -	strncpy(extra_response->key, key, strlen(key) + 1); -	strncpy(extra_response->value, NOTUNDERSTOOD, -			strlen(NOTUNDERSTOOD) + 1); +	strlcpy(extra_response->key, key, sizeof(extra_response->key)); +	strlcpy(extra_response->value, NOTUNDERSTOOD, +		sizeof(extra_response->value));  	list_add_tail(&extra_response->er_list,  			¶m_list->extra_response_list); @@ -1629,8 +1629,6 @@ int iscsi_decode_text_input(  		if (phase & PHASE_SECURITY) {  			if (iscsi_check_for_auth_key(key) > 0) { -				char *tmpptr = key + strlen(key); -				*tmpptr = '=';  				kfree(tmpbuf);  				return 1;  			} diff --git a/drivers/target/iscsi/iscsi_target_parameters.h b/drivers/target/iscsi/iscsi_target_parameters.h index 915b0679850..a47046a752a 100644 --- a/drivers/target/iscsi/iscsi_target_parameters.h +++ b/drivers/target/iscsi/iscsi_target_parameters.h @@ -1,8 +1,10 @@  #ifndef ISCSI_PARAMETERS_H  #define ISCSI_PARAMETERS_H +#include <scsi/iscsi_proto.h> +  struct iscsi_extra_response { -	char key[64]; +	char key[KEY_MAXLEN];  	char value[32];  	struct list_head er_list;  } ____cacheline_aligned; diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 2cc6c9a3ffb..08a3bacef0c 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c @@ -676,40 +676,56 @@ void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *conn)  void iscsit_release_cmd(struct iscsi_cmd *cmd)  { -	struct iscsi_conn *conn = cmd->conn; - -	iscsit_free_r2ts_from_list(cmd); -	iscsit_free_all_datain_reqs(cmd); -  	kfree(cmd->buf_ptr);  	kfree(cmd->pdu_list);  	kfree(cmd->seq_list);  	kfree(cmd->tmr_req);  	kfree(cmd->iov_data); -	if (conn) { +	kmem_cache_free(lio_cmd_cache, cmd); +} + +static void __iscsit_free_cmd(struct iscsi_cmd *cmd, bool scsi_cmd, +			      bool check_queues) +{ +	struct iscsi_conn *conn = cmd->conn; + +	if (scsi_cmd) { +		if (cmd->data_direction == DMA_TO_DEVICE) { +			iscsit_stop_dataout_timer(cmd); +			iscsit_free_r2ts_from_list(cmd); +		} +		if (cmd->data_direction == DMA_FROM_DEVICE) +			iscsit_free_all_datain_reqs(cmd); +	} + +	if (conn && check_queues) {  		iscsit_remove_cmd_from_immediate_queue(cmd, conn);  		iscsit_remove_cmd_from_response_queue(cmd, conn);  	} - -	kmem_cache_free(lio_cmd_cache, cmd);  } -void iscsit_free_cmd(struct iscsi_cmd *cmd) +void iscsit_free_cmd(struct iscsi_cmd *cmd, bool shutdown)  { +	struct se_cmd *se_cmd = NULL; +	int rc;  	/*  	 * Determine if a struct se_cmd is associated with  	 * this struct iscsi_cmd.  	 */  	switch (cmd->iscsi_opcode) {  	case ISCSI_OP_SCSI_CMD: -		if (cmd->data_direction == DMA_TO_DEVICE) -			iscsit_stop_dataout_timer(cmd); +		se_cmd = &cmd->se_cmd; +		__iscsit_free_cmd(cmd, true, shutdown);  		/*  		 * Fallthrough  		 */  	case ISCSI_OP_SCSI_TMFUNC: -		transport_generic_free_cmd(&cmd->se_cmd, 1); +		rc = transport_generic_free_cmd(&cmd->se_cmd, 1); +		if (!rc && shutdown && se_cmd && se_cmd->se_sess) { +			__iscsit_free_cmd(cmd, true, shutdown); +			target_put_sess_cmd(se_cmd->se_sess, se_cmd); +		}  		break;  	case ISCSI_OP_REJECT:  		/* @@ -718,11 +734,19 @@ void iscsit_free_cmd(struct iscsi_cmd *cmd)  		 * associated cmd->se_cmd needs to be released.  		 */  		if (cmd->se_cmd.se_tfo != NULL) { -			transport_generic_free_cmd(&cmd->se_cmd, 1); +			se_cmd = &cmd->se_cmd; +			__iscsit_free_cmd(cmd, true, shutdown); + +			rc = transport_generic_free_cmd(&cmd->se_cmd, 1); +			if (!rc && shutdown && se_cmd->se_sess) { +				__iscsit_free_cmd(cmd, true, shutdown); +				target_put_sess_cmd(se_cmd->se_sess, se_cmd); +			}  			break;  		}  		/* Fall-through */  	default: +		__iscsit_free_cmd(cmd, false, shutdown);  		cmd->release_cmd(cmd);  		break;  	} diff --git a/drivers/target/iscsi/iscsi_target_util.h b/drivers/target/iscsi/iscsi_target_util.h index 4f8e01a4708..a4422659d04 100644 --- a/drivers/target/iscsi/iscsi_target_util.h +++ b/drivers/target/iscsi/iscsi_target_util.h @@ -29,7 +29,7 @@ extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_co  extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *);  extern void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *);  extern void iscsit_release_cmd(struct iscsi_cmd *); -extern void iscsit_free_cmd(struct iscsi_cmd *); +extern void iscsit_free_cmd(struct iscsi_cmd *, bool);  extern int iscsit_check_session_usage_count(struct iscsi_session *);  extern void iscsit_dec_session_usage_count(struct iscsi_session *);  extern void iscsit_inc_session_usage_count(struct iscsi_session *); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 1b1d544e927..b11890d8512 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -153,6 +153,7 @@ static int fd_configure_device(struct se_device *dev)  		struct request_queue *q = bdev_get_queue(inode->i_bdev);  		unsigned long long dev_size; +		fd_dev->fd_block_size = bdev_logical_block_size(inode->i_bdev);  		/*  		 * Determine the number of bytes from i_size_read() minus  		 * one (1) logical sector from underlying struct block_device @@ -199,6 +200,7 @@ static int fd_configure_device(struct se_device *dev)  			goto fail;  		} +		fd_dev->fd_block_size = FD_BLOCKSIZE;  		/*  		 * Limit UNMAP emulation to 8k Number of LBAs (NoLB)  		 */ @@ -217,9 +219,7 @@ static int fd_configure_device(struct se_device *dev)  		dev->dev_attrib.max_write_same_len = 0x1000;  	} -	fd_dev->fd_block_size = dev->dev_attrib.hw_block_size; - -	dev->dev_attrib.hw_block_size = FD_BLOCKSIZE; +	dev->dev_attrib.hw_block_size = fd_dev->fd_block_size;  	dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS;  	dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH; @@ -694,11 +694,12 @@ static sector_t fd_get_blocks(struct se_device *dev)  	 * to handle underlying block_device resize operations.  	 */  	if (S_ISBLK(i->i_mode)) -		dev_size = (i_size_read(i) - fd_dev->fd_block_size); +		dev_size = i_size_read(i);  	else  		dev_size = fd_dev->fd_dev_size; -	return div_u64(dev_size, dev->dev_attrib.block_size); +	return div_u64(dev_size - dev->dev_attrib.block_size, +		       dev->dev_attrib.block_size);  }  static struct sbc_ops fd_sbc_ops = { diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4a793362309..21e315874a5 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -65,7 +65,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd);  static void transport_handle_queue_full(struct se_cmd *cmd,  		struct se_device *dev);  static int transport_generic_get_mem(struct se_cmd *cmd); -static void transport_put_cmd(struct se_cmd *cmd); +static int transport_put_cmd(struct se_cmd *cmd);  static void target_complete_ok_work(struct work_struct *work);  int init_se_kmem_caches(void) @@ -221,6 +221,7 @@ struct se_session *transport_init_session(void)  	INIT_LIST_HEAD(&se_sess->sess_list);  	INIT_LIST_HEAD(&se_sess->sess_acl_list);  	INIT_LIST_HEAD(&se_sess->sess_cmd_list); +	INIT_LIST_HEAD(&se_sess->sess_wait_list);  	spin_lock_init(&se_sess->sess_cmd_lock);  	kref_init(&se_sess->sess_kref); @@ -1943,7 +1944,7 @@ static inline void transport_free_pages(struct se_cmd *cmd)   * This routine unconditionally frees a command, and reference counting   * or list removal must be done in the caller.   */ -static void transport_release_cmd(struct se_cmd *cmd) +static int transport_release_cmd(struct se_cmd *cmd)  {  	BUG_ON(!cmd->se_tfo); @@ -1955,11 +1956,11 @@ static void transport_release_cmd(struct se_cmd *cmd)  	 * If this cmd has been setup with target_get_sess_cmd(), drop  	 * the kref and call ->release_cmd() in kref callback.  	 */ -	 if (cmd->check_release != 0) { -		target_put_sess_cmd(cmd->se_sess, cmd); -		return; -	} +	 if (cmd->check_release != 0) +		return target_put_sess_cmd(cmd->se_sess, cmd); +  	cmd->se_tfo->release_cmd(cmd); +	return 1;  }  /** @@ -1968,7 +1969,7 @@ static void transport_release_cmd(struct se_cmd *cmd)   *   * This routine releases our reference to the command and frees it if possible.   */ -static void transport_put_cmd(struct se_cmd *cmd) +static int transport_put_cmd(struct se_cmd *cmd)  {  	unsigned long flags; @@ -1976,7 +1977,7 @@ static void transport_put_cmd(struct se_cmd *cmd)  	if (atomic_read(&cmd->t_fe_count) &&  	    !atomic_dec_and_test(&cmd->t_fe_count)) {  		spin_unlock_irqrestore(&cmd->t_state_lock, flags); -		return; +		return 0;  	}  	if (cmd->transport_state & CMD_T_DEV_ACTIVE) { @@ -1986,8 +1987,7 @@ static void transport_put_cmd(struct se_cmd *cmd)  	spin_unlock_irqrestore(&cmd->t_state_lock, flags);  	transport_free_pages(cmd); -	transport_release_cmd(cmd); -	return; +	return transport_release_cmd(cmd);  }  void *transport_kmap_data_sg(struct se_cmd *cmd) @@ -2152,13 +2152,15 @@ static void transport_write_pending_qf(struct se_cmd *cmd)  	}  } -void transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks) +int transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)  { +	int ret = 0; +  	if (!(cmd->se_cmd_flags & SCF_SE_LUN_CMD)) {  		if (wait_for_tasks && (cmd->se_cmd_flags & SCF_SCSI_TMR_CDB))  			 transport_wait_for_tasks(cmd); -		transport_release_cmd(cmd); +		ret = transport_release_cmd(cmd);  	} else {  		if (wait_for_tasks)  			transport_wait_for_tasks(cmd); @@ -2166,8 +2168,9 @@ void transport_generic_free_cmd(struct se_cmd *cmd, int wait_for_tasks)  		if (cmd->se_lun)  			transport_lun_remove_cmd(cmd); -		transport_put_cmd(cmd); +		ret = transport_put_cmd(cmd);  	} +	return ret;  }  EXPORT_SYMBOL(transport_generic_free_cmd); @@ -2250,11 +2253,14 @@ void target_sess_cmd_list_set_waiting(struct se_session *se_sess)  	unsigned long flags;  	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); - -	WARN_ON(se_sess->sess_tearing_down); +	if (se_sess->sess_tearing_down) { +		spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); +		return; +	}  	se_sess->sess_tearing_down = 1; +	list_splice_init(&se_sess->sess_cmd_list, &se_sess->sess_wait_list); -	list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) +	list_for_each_entry(se_cmd, &se_sess->sess_wait_list, se_cmd_list)  		se_cmd->cmd_wait_set = 1;  	spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); @@ -2263,44 +2269,32 @@ EXPORT_SYMBOL(target_sess_cmd_list_set_waiting);  /* target_wait_for_sess_cmds - Wait for outstanding descriptors   * @se_sess:    session to wait for active I/O - * @wait_for_tasks:	Make extra transport_wait_for_tasks call   */ -void target_wait_for_sess_cmds( -	struct se_session *se_sess, -	int wait_for_tasks) +void target_wait_for_sess_cmds(struct se_session *se_sess)  {  	struct se_cmd *se_cmd, *tmp_cmd; -	bool rc = false; +	unsigned long flags;  	list_for_each_entry_safe(se_cmd, tmp_cmd, -				&se_sess->sess_cmd_list, se_cmd_list) { +				&se_sess->sess_wait_list, se_cmd_list) {  		list_del(&se_cmd->se_cmd_list);  		pr_debug("Waiting for se_cmd: %p t_state: %d, fabric state:"  			" %d\n", se_cmd, se_cmd->t_state,  			se_cmd->se_tfo->get_cmd_state(se_cmd)); -		if (wait_for_tasks) { -			pr_debug("Calling transport_wait_for_tasks se_cmd: %p t_state: %d," -				" fabric state: %d\n", se_cmd, se_cmd->t_state, -				se_cmd->se_tfo->get_cmd_state(se_cmd)); - -			rc = transport_wait_for_tasks(se_cmd); - -			pr_debug("After transport_wait_for_tasks se_cmd: %p t_state: %d," -				" fabric state: %d\n", se_cmd, se_cmd->t_state, -				se_cmd->se_tfo->get_cmd_state(se_cmd)); -		} - -		if (!rc) { -			wait_for_completion(&se_cmd->cmd_wait_comp); -			pr_debug("After cmd_wait_comp: se_cmd: %p t_state: %d" -				" fabric state: %d\n", se_cmd, se_cmd->t_state, -				se_cmd->se_tfo->get_cmd_state(se_cmd)); -		} +		wait_for_completion(&se_cmd->cmd_wait_comp); +		pr_debug("After cmd_wait_comp: se_cmd: %p t_state: %d" +			" fabric state: %d\n", se_cmd, se_cmd->t_state, +			se_cmd->se_tfo->get_cmd_state(se_cmd));  		se_cmd->se_tfo->release_cmd(se_cmd);  	} + +	spin_lock_irqsave(&se_sess->sess_cmd_lock, flags); +	WARN_ON(!list_empty(&se_sess->sess_cmd_list)); +	spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); +  }  EXPORT_SYMBOL(target_wait_for_sess_cmds); diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 46528d57be7..86c00b1c558 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -2755,7 +2755,7 @@ static void __init serial8250_isa_init_ports(void)  	if (nr_uarts > UART_NR)  		nr_uarts = UART_NR; -	for (i = 0; i < UART_NR; i++) { +	for (i = 0; i < nr_uarts; i++) {  		struct uart_8250_port *up = &serial8250_ports[i];  		struct uart_port *port = &up->port; @@ -2916,7 +2916,7 @@ static int __init serial8250_console_setup(struct console *co, char *options)  	 * if so, search for the first available port that does have  	 * console support.  	 */ -	if (co->index >= UART_NR) +	if (co->index >= nr_uarts)  		co->index = 0;  	port = &serial8250_ports[co->index].port;  	if (!port->iobase && !port->membase) @@ -2957,7 +2957,7 @@ int serial8250_find_port(struct uart_port *p)  	int line;  	struct uart_port *port; -	for (line = 0; line < UART_NR; line++) { +	for (line = 0; line < nr_uarts; line++) {  		port = &serial8250_ports[line].port;  		if (uart_match_port(p, port))  			return line; @@ -3110,7 +3110,7 @@ static int serial8250_remove(struct platform_device *dev)  {  	int i; -	for (i = 0; i < UART_NR; i++) { +	for (i = 0; i < nr_uarts; i++) {  		struct uart_8250_port *up = &serial8250_ports[i];  		if (up->port.dev == &dev->dev) @@ -3178,7 +3178,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *  	/*  	 * First, find a port entry which matches.  	 */ -	for (i = 0; i < UART_NR; i++) +	for (i = 0; i < nr_uarts; i++)  		if (uart_match_port(&serial8250_ports[i].port, port))  			return &serial8250_ports[i]; @@ -3187,7 +3187,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *  	 * free entry.  We look for one which hasn't been previously  	 * used (indicated by zero iobase).  	 */ -	for (i = 0; i < UART_NR; i++) +	for (i = 0; i < nr_uarts; i++)  		if (serial8250_ports[i].port.type == PORT_UNKNOWN &&  		    serial8250_ports[i].port.iobase == 0)  			return &serial8250_ports[i]; @@ -3196,7 +3196,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *  	 * That also failed.  Last resort is to find any entry which  	 * doesn't have a real port associated with it.  	 */ -	for (i = 0; i < UART_NR; i++) +	for (i = 0; i < nr_uarts; i++)  		if (serial8250_ports[i].port.type == PORT_UNKNOWN)  			return &serial8250_ports[i]; diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 147c9e19359..8cdfbd36589 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -761,6 +761,8 @@ static int imx_startup(struct uart_port *port)  	temp = readl(sport->port.membase + UCR2);  	temp |= (UCR2_RXEN | UCR2_TXEN); +	if (!sport->have_rtscts) +		temp |= UCR2_IRTS;  	writel(temp, sport->port.membase + UCR2);  	if (USE_IRDA(sport)) { diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 89429410a24..0c8a9fa2be6 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c @@ -1166,6 +1166,18 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,  		ourport->tx_irq = ret;  	ourport->clk	= clk_get(&platdev->dev, "uart"); +	if (IS_ERR(ourport->clk)) { +		pr_err("%s: Controller clock not found\n", +				dev_name(&platdev->dev)); +		return PTR_ERR(ourport->clk); +	} + +	ret = clk_prepare_enable(ourport->clk); +	if (ret) { +		pr_err("uart: clock failed to prepare+enable: %d\n", ret); +		clk_put(ourport->clk); +		return ret; +	}  	/* Keep all interrupts masked and cleared */  	if (s3c24xx_serial_has_interrupt_mask(port)) { @@ -1180,6 +1192,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,  	/* reset the fifos (and setup the uart) */  	s3c24xx_serial_resetport(port, cfg); +	clk_disable_unprepare(ourport->clk);  	return 0;  } diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index caefc800f29..c88c4fb9459 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -1287,9 +1287,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,  			goto error;  		}  		for (totlen = u = 0; u < uurb->number_of_packets; u++) { -			/* arbitrary limit, -			 * sufficient for USB 2.0 high-bandwidth iso */ -			if (isopkt[u].length > 8192) { +			/* +			 * arbitrary limit need for USB 3.0 +			 * bMaxBurst (0~15 allowed, 1~16 packets) +			 * bmAttributes (bit 1:0, mult 0~2, 1~3 packets) +			 * sizemax: 1024 * 16 * 3 = 49152 +			 */ +			if (isopkt[u].length > 49152) {  				ret = -EINVAL;  				goto error;  			} diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c index 929e7dd6e58..8ce9d7fd6cf 100644 --- a/drivers/usb/dwc3/dwc3-exynos.c +++ b/drivers/usb/dwc3/dwc3-exynos.c @@ -164,9 +164,9 @@ static int dwc3_exynos_remove(struct platform_device *pdev)  {  	struct dwc3_exynos	*exynos = platform_get_drvdata(pdev); +	device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child);  	platform_device_unregister(exynos->usb2_phy);  	platform_device_unregister(exynos->usb3_phy); -	device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child);  	clk_disable_unprepare(exynos->clk); diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 227d4a7acad..eba9e2baf32 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c @@ -196,9 +196,9 @@ static void dwc3_pci_remove(struct pci_dev *pci)  {  	struct dwc3_pci	*glue = pci_get_drvdata(pci); +	platform_device_unregister(glue->dwc3);  	platform_device_unregister(glue->usb2_phy);  	platform_device_unregister(glue->usb3_phy); -	platform_device_unregister(glue->dwc3);  	pci_set_drvdata(pci, NULL);  	pci_disable_device(pci);  } diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 2b6e7e00120..b5e5b35df49 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1706,11 +1706,19 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc)  		dep = dwc->eps[epnum];  		if (!dep)  			continue; - -		dwc3_free_trb_pool(dep); - -		if (epnum != 0 && epnum != 1) +		/* +		 * Physical endpoints 0 and 1 are special; they form the +		 * bi-directional USB endpoint 0. +		 * +		 * For those two physical endpoints, we don't allocate a TRB +		 * pool nor do we add them the endpoints list. Due to that, we +		 * shouldn't do these two operations otherwise we would end up +		 * with all sorts of bugs when removing dwc3.ko. +		 */ +		if (epnum != 0 && epnum != 1) { +			dwc3_free_trb_pool(dep);  			list_del(&dep->endpoint.ep_list); +		}  		kfree(dep);  	} diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index acff5b8f6e8..f80d0330d54 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -213,7 +213,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask)  }  static const unsigned char -max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; +max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 };  /* carryover low/fullspeed bandwidth that crosses uframe boundries */  static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) @@ -646,6 +646,10 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh)  	/* reschedule QH iff another request is queued */  	if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) {  		rc = qh_schedule(ehci, qh); +		if (rc == 0) { +			qh_refresh(ehci, qh); +			qh_link_periodic(ehci, qh); +		}  		/* An error here likely indicates handshake failure  		 * or no space left in the schedule.  Neither fault @@ -653,9 +657,10 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh)  		 *  		 * FIXME kill the now-dysfunctional queued urbs  		 */ -		if (rc != 0) +		else {  			ehci_err(ehci, "can't reschedule qh %p, err %d\n",  					qh, rc); +		}  	}  	/* maybe turn off periodic schedule */ diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 2cfc465925b..fbf75e57628 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1827,6 +1827,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)  	}  	spin_unlock_irqrestore(&xhci->lock, flags); +	if (!xhci->rh_bw) +		goto no_bw; +  	num_ports = HCS_MAX_PORTS(xhci->hcs_params1);  	for (i = 0; i < num_ports; i++) {  		struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; @@ -1845,6 +1848,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)  		}  	} +no_bw:  	xhci->num_usb2_ports = 0;  	xhci->num_usb3_ports = 0;  	xhci->num_active_eps = 0; @@ -2256,6 +2260,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)  	u32 page_size, temp;  	int i; +	INIT_LIST_HEAD(&xhci->lpm_failed_devs); +	INIT_LIST_HEAD(&xhci->cancel_cmd_list); +  	page_size = xhci_readl(xhci, &xhci->op_regs->page_size);  	xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size);  	for (i = 0; i < 16; i++) { @@ -2334,7 +2341,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)  	xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags);  	if (!xhci->cmd_ring)  		goto fail; -	INIT_LIST_HEAD(&xhci->cancel_cmd_list);  	xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring);  	xhci_dbg(xhci, "First segment DMA is 0x%llx\n",  			(unsigned long long)xhci->cmd_ring->first_seg->dma); @@ -2445,8 +2451,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)  	if (xhci_setup_port_arrays(xhci, flags))  		goto fail; -	INIT_LIST_HEAD(&xhci->lpm_failed_devs); -  	/* Enable USB 3.0 device notifications for function remote wake, which  	 * is necessary for allowing USB 3.0 devices to do remote wakeup from  	 * U3 (device suspend). diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 1a30c380043..cc24e39b97d 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -221,6 +221,14 @@ static void xhci_pci_remove(struct pci_dev *dev)  static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)  {  	struct xhci_hcd	*xhci = hcd_to_xhci(hcd); +	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller); + +	/* +	 * Systems with the TI redriver that loses port status change events +	 * need to have the registers polled during D3, so avoid D3cold. +	 */ +	if (xhci_compliance_mode_recovery_timer_quirk_check()) +		pdev->no_d3cold = true;  	return xhci_suspend(xhci);  } diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index b4aa79d154b..d8f640b12dd 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -466,7 +466,7 @@ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)   * Systems:   * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820   */ -static bool compliance_mode_recovery_timer_quirk_check(void) +bool xhci_compliance_mode_recovery_timer_quirk_check(void)  {  	const char *dmi_product_name, *dmi_sys_vendor; @@ -517,7 +517,7 @@ int xhci_init(struct usb_hcd *hcd)  	xhci_dbg(xhci, "Finished xhci_init\n");  	/* Initializing Compliance Mode Recovery Data If Needed */ -	if (compliance_mode_recovery_timer_quirk_check()) { +	if (xhci_compliance_mode_recovery_timer_quirk_check()) {  		xhci->quirks |= XHCI_COMP_MODE_QUIRK;  		compliance_mode_recovery_timer_init(xhci);  	} @@ -956,6 +956,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  	struct usb_hcd		*hcd = xhci_to_hcd(xhci);  	struct usb_hcd		*secondary_hcd;  	int			retval = 0; +	bool			comp_timer_running = false;  	/* Wait a bit if either of the roothubs need to settle from the  	 * transition into bus suspend. @@ -993,6 +994,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  	/* If restore operation fails, re-initialize the HC during resume */  	if ((temp & STS_SRE) || hibernated) { + +		if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && +				!(xhci_all_ports_seen_u0(xhci))) { +			del_timer_sync(&xhci->comp_mode_recovery_timer); +			xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n"); +		} +  		/* Let the USB core know _both_ roothubs lost power. */  		usb_root_hub_lost_power(xhci->main_hcd->self.root_hub);  		usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub); @@ -1035,6 +1043,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  		retval = xhci_init(hcd->primary_hcd);  		if (retval)  			return retval; +		comp_timer_running = true; +  		xhci_dbg(xhci, "Start the primary HCD\n");  		retval = xhci_run(hcd->primary_hcd);  		if (!retval) { @@ -1076,7 +1086,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)  	 * to suffer the Compliance Mode issue again. It doesn't matter if  	 * ports have entered previously to U0 before system's suspension.  	 */ -	if (xhci->quirks & XHCI_COMP_MODE_QUIRK) +	if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running)  		compliance_mode_recovery_timer_init(xhci);  	/* Re-enable port polling. */ diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 29c978e3713..77600cefcaf 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1853,4 +1853,7 @@ struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci,  struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx);  struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index); +/* xHCI quirks */ +bool xhci_compliance_mode_recovery_timer_quirk_check(void); +  #endif /* __LINUX_XHCI_HCD_H */ diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 8914dec49f0..9d3044bdebe 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -1232,7 +1232,6 @@ void musb_host_tx(struct musb *musb, u8 epnum)  	void __iomem		*mbase = musb->mregs;  	struct dma_channel	*dma;  	bool			transfer_pending = false; -	static bool use_sg;  	musb_ep_select(mbase, epnum);  	tx_csr = musb_readw(epio, MUSB_TXCSR); @@ -1463,9 +1462,9 @@ done:  	 * NULL.  	 */  	if (!urb->transfer_buffer) -		use_sg = true; +		qh->use_sg = true; -	if (use_sg) { +	if (qh->use_sg) {  		/* sg_miter_start is already done in musb_ep_program */  		if (!sg_miter_next(&qh->sg_miter)) {  			dev_err(musb->controller, "error: sg list empty\n"); @@ -1484,9 +1483,9 @@ done:  	qh->segsize = length; -	if (use_sg) { +	if (qh->use_sg) {  		if (offset + length >= urb->transfer_buffer_length) -			use_sg = false; +			qh->use_sg = false;  	}  	musb_ep_select(mbase, epnum); @@ -1552,7 +1551,6 @@ void musb_host_rx(struct musb *musb, u8 epnum)  	bool			done = false;  	u32			status;  	struct dma_channel	*dma; -	static bool use_sg;  	unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG;  	musb_ep_select(mbase, epnum); @@ -1878,12 +1876,12 @@ void musb_host_rx(struct musb *musb, u8 epnum)  			 * NULL.  			 */  			if (!urb->transfer_buffer) { -				use_sg = true; +				qh->use_sg = true;  				sg_miter_start(&qh->sg_miter, urb->sg, 1,  						sg_flags);  			} -			if (use_sg) { +			if (qh->use_sg) {  				if (!sg_miter_next(&qh->sg_miter)) {  					dev_err(musb->controller, "error: sg list empty\n");  					sg_miter_stop(&qh->sg_miter); @@ -1913,8 +1911,8 @@ finish:  	urb->actual_length += xfer_len;  	qh->offset += xfer_len;  	if (done) { -		if (use_sg) -			use_sg = false; +		if (qh->use_sg) +			qh->use_sg = false;  		if (urb->status == -EINPROGRESS)  			urb->status = status; diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h index 5a9c8feec10..738f7eb60df 100644 --- a/drivers/usb/musb/musb_host.h +++ b/drivers/usb/musb/musb_host.h @@ -74,6 +74,7 @@ struct musb_qh {  	u16			frame;		/* for periodic schedule */  	unsigned		iso_idx;	/* in urb->iso_frame_desc[] */  	struct sg_mapping_iter sg_miter;	/* for highmem in PIO mode */ +	bool			use_sg;		/* to track urb using sglist */  };  /* map from control or bulk queue head to the first qh on that ring */ diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 3b16118cbf6..40e7fd94646 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -43,7 +43,7 @@  #define DRIVER_NAME "ark3116"  /* usb timeout of 1 second */ -#define ARK_TIMEOUT (1*HZ) +#define ARK_TIMEOUT 1000  static const struct usb_device_id id_table[] = {  	{ USB_DEVICE(0x6547, 0x0232) }, diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index d341555d37d..082120198f8 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -65,6 +65,7 @@ static const struct usb_device_id id_table_earthmate[] = {  static const struct usb_device_id id_table_cyphidcomrs232[] = {  	{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },  	{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, +	{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },  	{ }						/* Terminating entry */  }; @@ -78,6 +79,7 @@ static const struct usb_device_id id_table_combined[] = {  	{ USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) },  	{ USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) },  	{ USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, +	{ USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) },  	{ USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) },  	{ }						/* Terminating entry */  }; @@ -229,6 +231,12 @@ static struct usb_serial_driver * const serial_drivers[] = {   * Cypress serial helper functions   *****************************************************************************/ +/* FRWD Dongle hidcom needs to skip reset and speed checks */ +static inline bool is_frwd(struct usb_device *dev) +{ +	return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) && +		(le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD)); +}  static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)  { @@ -238,6 +246,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate)  	if (unstable_bauds)  		return new_rate; +	/* FRWD Dongle uses 115200 bps */ +	if (is_frwd(port->serial->dev)) +		return new_rate; +  	/*  	 * The general purpose firmware for the Cypress M8 allows for  	 * a maximum speed of 57600bps (I have no idea whether DeLorme @@ -448,7 +460,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port)  		return -ENOMEM;  	} -	usb_reset_configuration(serial->dev); +	/* Skip reset for FRWD device. It is a workaound: +	   device hangs if it receives SET_CONFIGURE in Configured +	   state. */ +	if (!is_frwd(serial->dev)) +		usb_reset_configuration(serial->dev);  	priv->cmd_ctrl = 0;  	priv->line_control = 0; diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index 67cf6082688..b461311a2ae 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h @@ -24,6 +24,10 @@  #define VENDOR_ID_CYPRESS		0x04b4  #define PRODUCT_ID_CYPHIDCOM		0x5500 +/* FRWD Dongle - a GPS sports watch */ +#define VENDOR_ID_FRWD			0x6737 +#define PRODUCT_ID_CYPHIDCOM_FRWD	0x0001 +  /* Powercom UPS, chip CY7C63723 */  #define VENDOR_ID_POWERCOM		0x0d9f  #define PRODUCT_ID_UPS			0x0002 diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 9d74c278b7b..790673e5faa 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c @@ -287,7 +287,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count)  	    usb_bulk_msg(serial->dev,  			 usb_sndbulkpipe(serial->dev,  					 port->bulk_out_endpointAddress), buf, -			 count, &actual, HZ * 1); +			 count, &actual, 1000);  	if (status != IUU_OPERATION_OK)  		dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); @@ -307,7 +307,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count)  	    usb_bulk_msg(serial->dev,  			 usb_rcvbulkpipe(serial->dev,  					 port->bulk_in_endpointAddress), buf, -			 count, &actual, HZ * 1); +			 count, &actual, 1000);  	if (status != IUU_OPERATION_OK)  		dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index eb30d7b01f3..3549d073df2 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -1548,7 +1548,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	struct keyspan_serial_private 		*s_priv;  	struct keyspan_port_private 		*p_priv;  	const struct keyspan_device_details	*d_details; -	int 					outcont_urb;  	struct urb				*this_urb;  	int 					device_port, err; @@ -1559,7 +1558,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	d_details = s_priv->device_details;  	device_port = port->number - port->serial->minor; -	outcont_urb = d_details->outcont_endpoints[port->number];  	this_urb = p_priv->outcont_urb;  	dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); @@ -1685,14 +1683,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0)  		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err); -#if 0 -	else { -		dev_dbg(&port->dev, "%s - usb_submit_urb(%d) OK %d bytes (end %d)\n", __func__ -			outcont_urb, this_urb->transfer_buffer_length, -			usb_pipeendpoint(this_urb->pipe)); -	} -#endif -  	return 0;  } diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index cc0e54345df..f27c621a929 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c @@ -40,7 +40,7 @@  #define DRIVER_DESC "Moschip USB Serial Driver"  /* default urb timeout */ -#define MOS_WDR_TIMEOUT	(HZ * 5) +#define MOS_WDR_TIMEOUT	5000  #define MOS_MAX_PORT	0x02  #define MOS_WRITE	0x0E @@ -227,11 +227,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum,  	__u8 requesttype = (__u8)0xc0;  	__u16 index = get_reg_index(reg);  	__u16 value = get_reg_value(reg, serial_portnum); -	int status = usb_control_msg(usbdev, pipe, request, requesttype, value, -				     index, data, 1, MOS_WDR_TIMEOUT); -	if (status < 0) +	u8 *buf; +	int status; + +	buf = kmalloc(1, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	status = usb_control_msg(usbdev, pipe, request, requesttype, value, +				     index, buf, 1, MOS_WDR_TIMEOUT); +	if (status == 1) +		*data = *buf; +	else if (status < 0)  		dev_err(&usbdev->dev,  			"mos7720: usb_control_msg() failed: %d", status); +	kfree(buf); +  	return status;  } @@ -1618,7 +1629,7 @@ static void change_port_settings(struct tty_struct *tty,  		mos7720_port->shadowMCR |= (UART_MCR_XONANY);  		/* To set hardware flow control to the specified *  		 * serial port, in SP1/2_CONTROL_REG             */ -		if (port->number) +		if (port_number)  			write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01);  		else  			write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); @@ -1927,7 +1938,7 @@ static int mos7720_startup(struct usb_serial *serial)  	/* setting configuration feature to one */  	usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), -			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ); +			(__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000);  	/* start the interrupt urb */  	ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); @@ -1970,7 +1981,7 @@ static void mos7720_release(struct usb_serial *serial)  		/* wait for synchronous usb calls to return */  		if (mos_parport->msg_pending)  			wait_for_completion_timeout(&mos_parport->syncmsg_compl, -						    MOS_WDR_TIMEOUT); +					    msecs_to_jiffies(MOS_WDR_TIMEOUT));  		parport_remove_port(mos_parport->pp);  		usb_set_serial_data(serial, NULL); diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index a0d5ea54598..7e998081e1c 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -2142,13 +2142,21 @@ static int mos7840_ioctl(struct tty_struct *tty,  static int mos7810_check(struct usb_serial *serial)  {  	int i, pass_count = 0; +	u8 *buf;  	__u16 data = 0, mcr_data = 0;  	__u16 test_pattern = 0x55AA; +	int res; + +	buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); +	if (!buf) +		return 0;	/* failed to identify 7810 */  	/* Store MCR setting */ -	usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), +	res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0),  		MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, -		&mcr_data, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +		buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +	if (res == VENDOR_READ_LENGTH) +		mcr_data = *buf;  	for (i = 0; i < 16; i++) {  		/* Send the 1-bit test pattern out to MCS7810 test pin */ @@ -2158,9 +2166,12 @@ static int mos7810_check(struct usb_serial *serial)  			MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT);  		/* Read the test pattern back */ -		usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), -			MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, -			VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +		res = usb_control_msg(serial->dev, +				usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, +				MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, +				VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +		if (res == VENDOR_READ_LENGTH) +			data = *buf;  		/* If this is a MCS7810 device, both test patterns must match */  		if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) @@ -2174,6 +2185,8 @@ static int mos7810_check(struct usb_serial *serial)  		MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL,  		0, MOS_WDR_TIMEOUT); +	kfree(buf); +  	if (pass_count == 16)  		return 1; @@ -2183,11 +2196,17 @@ static int mos7810_check(struct usb_serial *serial)  static int mos7840_calc_num_ports(struct usb_serial *serial)  {  	__u16 data = 0x00; +	u8 *buf;  	int mos7840_num_ports; -	usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), -		MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, -		VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +	buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); +	if (buf) { +		usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), +			MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, +			VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); +		data = *buf; +		kfree(buf); +	}  	if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 ||  		serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 93d02bc4eb5..bd4323ddae1 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -250,13 +250,7 @@ static void option_instat_callback(struct urb *urb);  #define ZTE_PRODUCT_MF622			0x0001  #define ZTE_PRODUCT_MF628			0x0015  #define ZTE_PRODUCT_MF626			0x0031 -#define ZTE_PRODUCT_CDMA_TECH			0xfffe -#define ZTE_PRODUCT_AC8710			0xfff1 -#define ZTE_PRODUCT_AC2726			0xfff5 -#define ZTE_PRODUCT_AC8710T			0xffff  #define ZTE_PRODUCT_MC2718			0xffe8 -#define ZTE_PRODUCT_AD3812			0xffeb -#define ZTE_PRODUCT_MC2716			0xffed  #define BENQ_VENDOR_ID				0x04a5  #define BENQ_PRODUCT_H10			0x4068 @@ -495,18 +489,10 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = {  	.reserved = BIT(4),  }; -static const struct option_blacklist_info zte_ad3812_z_blacklist = { -	.sendsetup = BIT(0) | BIT(1) | BIT(2), -}; -  static const struct option_blacklist_info zte_mc2718_z_blacklist = {  	.sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4),  }; -static const struct option_blacklist_info zte_mc2716_z_blacklist = { -	.sendsetup = BIT(1) | BIT(2) | BIT(3), -}; -  static const struct option_blacklist_info huawei_cdc12_blacklist = {  	.reserved = BIT(1) | BIT(2),  }; @@ -593,6 +579,8 @@ static const struct usb_device_id option_ids[] = {  		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff),	/* Huawei E1820 */ +		.driver_info = (kernel_ulong_t) &net_intf1_blacklist },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },  	{ USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, @@ -797,7 +785,6 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) },  	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) },  	{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, -	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */  	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */  	{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */  	{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ @@ -1199,16 +1186,9 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t)&net_intf3_blacklist }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, +	/* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */  	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff),  	 .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff), -	 .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, -	{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), -	 .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist },  	{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) },  	{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) },  	{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 59b32b78212..bd794b43898 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c @@ -118,6 +118,7 @@ static const struct usb_device_id id_table[] = {  	{USB_DEVICE(0x1199, 0x901b)},	/* Sierra Wireless MC7770 */  	{USB_DEVICE(0x12D1, 0x14F0)},	/* Sony Gobi 3000 QDL */  	{USB_DEVICE(0x12D1, 0x14F1)},	/* Sony Gobi 3000 Composite */ +	{USB_DEVICE(0x0AF0, 0x8120)},	/* Option GTM681W */  	/* non Gobi Qualcomm serial devices */  	{USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)},	/* Sierra Wireless MC7700 Device Management */ diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 4753c005cfb..5f6b1ff9d29 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -408,7 +408,7 @@ static int serial_ioctl(struct tty_struct *tty,  					unsigned int cmd, unsigned long arg)  {  	struct usb_serial_port *port = tty->driver_data; -	int retval = -ENODEV; +	int retval = -ENOIOCTLCMD;  	dev_dbg(tty->dev, "%s - cmd 0x%.4x\n", __func__, cmd); @@ -420,8 +420,6 @@ static int serial_ioctl(struct tty_struct *tty,  	default:  		if (port->serial->type->ioctl)  			retval = port->serial->type->ioctl(tty, cmd, arg); -		else -			retval = -ENOIOCTLCMD;  	}  	return retval; diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 7573ec8a084..9910aa2edf4 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c @@ -560,10 +560,19 @@ static int treo_attach(struct usb_serial *serial)  	*/  #define COPY_PORT(dest, src)						\  	do { \ +		int i;							\ +									\ +		for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) {	\ +			dest->read_urbs[i] = src->read_urbs[i];		\ +			dest->read_urbs[i]->context = dest;		\ +			dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \ +		}							\  		dest->read_urb = src->read_urb;				\  		dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\  		dest->bulk_in_buffer = src->bulk_in_buffer;		\ +		dest->bulk_in_size = src->bulk_in_size;			\  		dest->interrupt_in_urb = src->interrupt_in_urb;		\ +		dest->interrupt_in_urb->context = dest;			\  		dest->interrupt_in_endpointAddress = \  					src->interrupt_in_endpointAddress;\  		dest->interrupt_in_buffer = src->interrupt_in_buffer;	\ diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index b9fca3586d7..347caad47a1 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -649,7 +649,7 @@ static void firm_setup_port(struct tty_struct *tty)  	struct whiteheat_port_settings port_settings;  	unsigned int cflag = tty->termios.c_cflag; -	port_settings.port = port->number + 1; +	port_settings.port = port->number - port->serial->minor + 1;  	/* get the byte size */  	switch (cflag & CSIZE) { diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c index 39ee7373b4e..fca4c752a4e 100644 --- a/drivers/usb/serial/zte_ev.c +++ b/drivers/usb/serial/zte_ev.c @@ -41,9 +41,6 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	int len;  	unsigned char *buf; -	if (port->number != 0) -		return -ENODEV; -  	buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL);  	if (!buf)  		return -ENOMEM; @@ -53,7 +50,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0001, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	/* send  2st cmd and recieve data */ @@ -65,7 +62,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),  				 0x21, 0xa1,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 3 cmd */ @@ -84,7 +81,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x20, 0x21,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 4 cmd */ @@ -95,7 +92,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0003, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	/* send 5 cmd */ @@ -107,7 +104,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),  				 0x21, 0xa1,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 6 cmd */ @@ -126,7 +123,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty,  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x20, 0x21,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	kfree(buf); @@ -166,9 +163,6 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	int len;  	unsigned char *buf; -	if (port->number != 0) -		return; -  	buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL);  	if (!buf)  		return; @@ -178,7 +172,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0002, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	/* send 2st ctl cmd(CTL    21 22 03 00  00 00 00 00 ) */ @@ -186,7 +180,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0003, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	/* send  3st cmd and recieve data */ @@ -198,7 +192,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),  				 0x21, 0xa1,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 4 cmd */ @@ -217,7 +211,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x20, 0x21,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 5 cmd */ @@ -228,7 +222,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0003, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	/* send 6 cmd */ @@ -240,7 +234,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),  				 0x21, 0xa1,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 7 cmd */ @@ -259,7 +253,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x20, 0x21,  				 0x0000, 0x0000, buf, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	debug_data(dev, __func__, len, buf, result);  	/* send 8 cmd */ @@ -270,7 +264,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  	result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),  				 0x22, 0x21,  				 0x0003, 0x0000, NULL, len, -				 HZ * USB_CTRL_GET_TIMEOUT); +				 USB_CTRL_GET_TIMEOUT);  	dev_dbg(dev, "result = %d\n", result);  	kfree(buf); @@ -279,11 +273,29 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port)  }  static const struct usb_device_id id_table[] = { -	{ USB_DEVICE(0x19d2, 0xffff) },	/* AC8700 */ -	{ USB_DEVICE(0x19d2, 0xfffe) }, -	{ USB_DEVICE(0x19d2, 0xfffd) }, /* MG880 */ +	/* AC8710, AC8710T */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) }, +	 /* AC8700 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) }, +	/* MG880 */ +	{ USB_DEVICE(0x19d2, 0xfffd) }, +	{ USB_DEVICE(0x19d2, 0xfffc) }, +	{ USB_DEVICE(0x19d2, 0xfffb) }, +	/* AC2726, AC8710_V3 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) }, +	{ USB_DEVICE(0x19d2, 0xfff6) }, +	{ USB_DEVICE(0x19d2, 0xfff7) }, +	{ USB_DEVICE(0x19d2, 0xfff8) }, +	{ USB_DEVICE(0x19d2, 0xfff9) }, +	{ USB_DEVICE(0x19d2, 0xffee) }, +	/* AC2716, MC2716 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) }, +	/* AD3812 */ +	{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) }, +	{ USB_DEVICE(0x19d2, 0xffec) },  	{ USB_DEVICE(0x05C6, 0x3197) },  	{ USB_DEVICE(0x05C6, 0x6000) }, +	{ USB_DEVICE(0x05C6, 0x9008) },  	{ },  };  MODULE_DEVICE_TABLE(usb, id_table); diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index acb7121a931..6d78736563d 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c @@ -1360,7 +1360,7 @@ static const struct file_operations vfio_device_fops = {   */  static char *vfio_devnode(struct device *dev, umode_t *mode)  { -	if (MINOR(dev->devt) == 0) +	if (mode && (MINOR(dev->devt) == 0))  		*mode = S_IRUGO | S_IWUGO;  	return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev)); diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 540909de624..effdb373b8d 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c @@ -223,8 +223,14 @@ static void init_backlight(struct atmel_lcdfb_info *sinfo)  static void exit_backlight(struct atmel_lcdfb_info *sinfo)  { -	if (sinfo->backlight) -		backlight_device_unregister(sinfo->backlight); +	if (!sinfo->backlight) +		return; + +	if (sinfo->backlight->ops) { +		sinfo->backlight->props.power = FB_BLANK_POWERDOWN; +		sinfo->backlight->ops->update_status(sinfo->backlight); +	} +	backlight_device_unregister(sinfo->backlight);  }  #else @@ -461,8 +467,11 @@ static int atmel_lcdfb_check_var(struct fb_var_screeninfo *var,  	if (info->fix.smem_len) {  		unsigned int smem_len = (var->xres_virtual * var->yres_virtual  					 * ((var->bits_per_pixel + 7) / 8)); -		if (smem_len > info->fix.smem_len) +		if (smem_len > info->fix.smem_len) { +			dev_err(dev, "Frame buffer is too small (%u) for screen size (need at least %u)\n", +				info->fix.smem_len, smem_len);  			return -EINVAL; +		}  	}  	/* Saturate vertical and horizontal timings at maximum values */ diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 60cc6fee654..c9c2252e371 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c @@ -53,6 +53,8 @@ static char *def_disp_name;  module_param_named(def_disp, def_disp_name, charp, 0);  MODULE_PARM_DESC(def_disp, "default display name"); +static bool dss_initialized; +  const char *omapdss_get_default_display_name(void)  {  	return core.default_display_name; @@ -66,6 +68,12 @@ enum omapdss_version omapdss_get_version(void)  }  EXPORT_SYMBOL(omapdss_get_version); +bool omapdss_is_initialized(void) +{ +	return dss_initialized; +} +EXPORT_SYMBOL(omapdss_is_initialized); +  struct platform_device *dss_get_core_pdev(void)  {  	return core.pdev; @@ -603,6 +611,8 @@ static int __init omap_dss_init(void)  		return r;  	} +	dss_initialized = true; +  	return 0;  } @@ -633,7 +643,15 @@ static int __init omap_dss_init(void)  static int __init omap_dss_init2(void)  { -	return omap_dss_register_drivers(); +	int r; + +	r = omap_dss_register_drivers(); +	if (r) +		return r; + +	dss_initialized = true; + +	return 0;  }  core_initcall(omap_dss_init); diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c index c84bb8a4d0c..856917b3361 100644 --- a/drivers/video/omap2/omapfb/omapfb-main.c +++ b/drivers/video/omap2/omapfb/omapfb-main.c @@ -2416,6 +2416,9 @@ static int omapfb_probe(struct platform_device *pdev)  	DBG("omapfb_probe\n"); +	if (omapdss_is_initialized() == false) +		return -EPROBE_DEFER; +  	if (pdev->num_resources != 0) {  		dev_err(&pdev->dev, "probed for an unknown device\n");  		r = -ENODEV; diff --git a/drivers/video/ps3fb.c b/drivers/video/ps3fb.c index d9f08c653d6..dbfe2c18a43 100644 --- a/drivers/video/ps3fb.c +++ b/drivers/video/ps3fb.c @@ -710,7 +710,7 @@ static int ps3fb_mmap(struct fb_info *info, struct vm_area_struct *vma)  	r = vm_iomap_memory(vma, info->fix.smem_start, info->fix.smem_len);  	dev_dbg(info->device, "ps3fb: mmap framebuffer P(%lx)->V(%lx)\n", -		info->fix.smem_start + vma->vm_pgoff << PAGE_SHIFT, +		info->fix.smem_start + (vma->vm_pgoff << PAGE_SHIFT),  		vma->vm_start);  	return r; diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c index 18e8bd8fa94..cc072c66c76 100644 --- a/drivers/xen/tmem.c +++ b/drivers/xen/tmem.c @@ -41,6 +41,8 @@ module_param(selfballooning, bool, S_IRUGO);  #ifdef CONFIG_FRONTSWAP  static bool frontswap __read_mostly = true;  module_param(frontswap, bool, S_IRUGO); +#else /* CONFIG_FRONTSWAP */ +#define frontswap (0)  #endif /* CONFIG_FRONTSWAP */  #ifdef CONFIG_XEN_SELFBALLOONING diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index a2278ba7fb2..4e8ba38aa0c 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c @@ -106,7 +106,7 @@ static void pcistub_device_release(struct kref *kref)  	else  		pci_restore_state(dev); -	if (pci_find_capability(dev, PCI_CAP_ID_MSIX)) { +	if (dev->msix_cap) {  		struct physdev_pci_device ppdev = {  			.seg = pci_domain_nr(dev->bus),  			.bus = dev->bus->number, @@ -371,7 +371,7 @@ static int pcistub_init_device(struct pci_dev *dev)  	if (err)  		goto config_release; -	if (pci_find_capability(dev, PCI_CAP_ID_MSIX)) { +	if (dev->msix_cap) {  		struct physdev_pci_device ppdev = {  			.seg = pci_domain_nr(dev->bus),  			.bus = dev->bus->number, diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c index 61786be9138..ec097d6f964 100644 --- a/drivers/xen/xenbus/xenbus_client.c +++ b/drivers/xen/xenbus/xenbus_client.c @@ -534,7 +534,7 @@ static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,  	err = xenbus_map_ring(dev, gnt_ref, &node->handle, addr);  	if (err) -		goto out_err; +		goto out_err_free_ballooned_pages;  	spin_lock(&xenbus_valloc_lock);  	list_add(&node->next, &xenbus_valloc_pages); @@ -543,8 +543,9 @@ static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,  	*vaddr = addr;  	return 0; - out_err: + out_err_free_ballooned_pages:  	free_xenballooned_pages(1, &node->page); + out_err:  	kfree(node);  	return err;  } diff --git a/drivers/xen/xenbus/xenbus_comms.h b/drivers/xen/xenbus/xenbus_comms.h index c8abd3b8a6c..e74f9c1fbd8 100644 --- a/drivers/xen/xenbus/xenbus_comms.h +++ b/drivers/xen/xenbus/xenbus_comms.h @@ -45,6 +45,7 @@ int xb_wait_for_data_to_read(void);  int xs_input_avail(void);  extern struct xenstore_domain_interface *xen_store_interface;  extern int xen_store_evtchn; +extern enum xenstore_init xen_store_domain_type;  extern const struct file_operations xen_xenbus_fops; diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index 3325884c693..56cfaaa9d00 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -69,6 +69,9 @@ EXPORT_SYMBOL_GPL(xen_store_evtchn);  struct xenstore_domain_interface *xen_store_interface;  EXPORT_SYMBOL_GPL(xen_store_interface); +enum xenstore_init xen_store_domain_type; +EXPORT_SYMBOL_GPL(xen_store_domain_type); +  static unsigned long xen_store_mfn;  static BLOCKING_NOTIFIER_HEAD(xenstore_chain); @@ -719,17 +722,11 @@ static int __init xenstored_local_init(void)  	return err;  } -enum xenstore_init { -	UNKNOWN, -	PV, -	HVM, -	LOCAL, -};  static int __init xenbus_init(void)  {  	int err = 0; -	enum xenstore_init usage = UNKNOWN;  	uint64_t v = 0; +	xen_store_domain_type = XS_UNKNOWN;  	if (!xen_domain())  		return -ENODEV; @@ -737,29 +734,29 @@ static int __init xenbus_init(void)  	xenbus_ring_ops_init();  	if (xen_pv_domain()) -		usage = PV; +		xen_store_domain_type = XS_PV;  	if (xen_hvm_domain()) -		usage = HVM; +		xen_store_domain_type = XS_HVM;  	if (xen_hvm_domain() && xen_initial_domain()) -		usage = LOCAL; +		xen_store_domain_type = XS_LOCAL;  	if (xen_pv_domain() && !xen_start_info->store_evtchn) -		usage = LOCAL; +		xen_store_domain_type = XS_LOCAL;  	if (xen_pv_domain() && xen_start_info->store_evtchn)  		xenstored_ready = 1; -	switch (usage) { -	case LOCAL: +	switch (xen_store_domain_type) { +	case XS_LOCAL:  		err = xenstored_local_init();  		if (err)  			goto out_error;  		xen_store_interface = mfn_to_virt(xen_store_mfn);  		break; -	case PV: +	case XS_PV:  		xen_store_evtchn = xen_start_info->store_evtchn;  		xen_store_mfn = xen_start_info->store_mfn;  		xen_store_interface = mfn_to_virt(xen_store_mfn);  		break; -	case HVM: +	case XS_HVM:  		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);  		if (err)  			goto out_error; diff --git a/drivers/xen/xenbus/xenbus_probe.h b/drivers/xen/xenbus/xenbus_probe.h index bb4f92ed873..146f857a36f 100644 --- a/drivers/xen/xenbus/xenbus_probe.h +++ b/drivers/xen/xenbus/xenbus_probe.h @@ -47,6 +47,13 @@ struct xen_bus_type {  	struct bus_type bus;  }; +enum xenstore_init { +	XS_UNKNOWN, +	XS_PV, +	XS_HVM, +	XS_LOCAL, +}; +  extern struct device_attribute xenbus_dev_attrs[];  extern int xenbus_match(struct device *_dev, struct device_driver *_drv); diff --git a/drivers/xen/xenbus/xenbus_probe_frontend.c b/drivers/xen/xenbus/xenbus_probe_frontend.c index 3159a37d966..a7e25073de1 100644 --- a/drivers/xen/xenbus/xenbus_probe_frontend.c +++ b/drivers/xen/xenbus/xenbus_probe_frontend.c @@ -29,6 +29,8 @@  #include "xenbus_probe.h" +static struct workqueue_struct *xenbus_frontend_wq; +  /* device/<type>/<id> => <type>-<id> */  static int frontend_bus_id(char bus_id[XEN_BUS_ID_SIZE], const char *nodename)  { @@ -89,9 +91,40 @@ static void backend_changed(struct xenbus_watch *watch,  	xenbus_otherend_changed(watch, vec, len, 1);  } +static void xenbus_frontend_delayed_resume(struct work_struct *w) +{ +	struct xenbus_device *xdev = container_of(w, struct xenbus_device, work); + +	xenbus_dev_resume(&xdev->dev); +} + +static int xenbus_frontend_dev_resume(struct device *dev) +{ +	/* +	 * If xenstored is running in this domain, we cannot access the backend +	 * state at the moment, so we need to defer xenbus_dev_resume +	 */ +	if (xen_store_domain_type == XS_LOCAL) { +		struct xenbus_device *xdev = to_xenbus_device(dev); + +		if (!xenbus_frontend_wq) { +			pr_err("%s: no workqueue to process delayed resume\n", +			       xdev->nodename); +			return -EFAULT; +		} + +		INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume); +		queue_work(xenbus_frontend_wq, &xdev->work); + +		return 0; +	} + +	return xenbus_dev_resume(dev); +} +  static const struct dev_pm_ops xenbus_pm_ops = {  	.suspend	= xenbus_dev_suspend, -	.resume		= xenbus_dev_resume, +	.resume		= xenbus_frontend_dev_resume,  	.freeze		= xenbus_dev_suspend,  	.thaw		= xenbus_dev_cancel,  	.restore	= xenbus_dev_resume, @@ -440,6 +473,8 @@ static int __init xenbus_probe_frontend_init(void)  	register_xenstore_notifier(&xenstore_notifier); +	xenbus_frontend_wq = create_workqueue("xenbus_frontend"); +  	return 0;  }  subsys_initcall(xenbus_probe_frontend_init); diff --git a/fs/befs/linuxvfs.c b/fs/befs/linuxvfs.c index 8615ee89ab5..f95dddced96 100644 --- a/fs/befs/linuxvfs.c +++ b/fs/befs/linuxvfs.c @@ -265,8 +265,8 @@ befs_readdir(struct file *filp, void *dirent, filldir_t filldir)  		result = filldir(dirent, keybuf, keysize, filp->f_pos,  				 (ino_t) value, d_type);  	} - -	filp->f_pos++; +	if (!result) +		filp->f_pos++;  	befs_debug(sb, "<--- befs_readdir() filp->f_pos %Ld", filp->f_pos); diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c index 8e33ec65847..58df174deb1 100644 --- a/fs/cifs/cifs_dfs_ref.c +++ b/fs/cifs/cifs_dfs_ref.c @@ -18,6 +18,7 @@  #include <linux/slab.h>  #include <linux/vfs.h>  #include <linux/fs.h> +#include <linux/inet.h>  #include "cifsglob.h"  #include "cifsproto.h"  #include "cifsfs.h" @@ -48,58 +49,74 @@ void cifs_dfs_release_automount_timer(void)  }  /** - * cifs_get_share_name	-	extracts share name from UNC - * @node_name:	pointer to UNC string + * cifs_build_devname - build a devicename from a UNC and optional prepath + * @nodename:	pointer to UNC string + * @prepath:	pointer to prefixpath (or NULL if there isn't one)   * - * Extracts sharename form full UNC. - * i.e. strips from UNC trailing path that is not part of share - * name and fixup missing '\' in the beginning of DFS node refferal - * if necessary. - * Returns pointer to share name on success or ERR_PTR on error. - * Caller is responsible for freeing returned string. + * Build a new cifs devicename after chasing a DFS referral. Allocate a buffer + * big enough to hold the final thing. Copy the UNC from the nodename, and + * concatenate the prepath onto the end of it if there is one. + * + * Returns pointer to the built string, or a ERR_PTR. Caller is responsible + * for freeing the returned string.   */ -static char *cifs_get_share_name(const char *node_name) +static char * +cifs_build_devname(char *nodename, const char *prepath)  { -	int len; -	char *UNC; -	char *pSep; +	size_t pplen; +	size_t unclen; +	char *dev; +	char *pos; -	len = strlen(node_name); -	UNC = kmalloc(len+2 /*for term null and additional \ if it's missed */, -			 GFP_KERNEL); -	if (!UNC) -		return ERR_PTR(-ENOMEM); +	/* skip over any preceding delimiters */ +	nodename += strspn(nodename, "\\"); +	if (!*nodename) +		return ERR_PTR(-EINVAL); -	/* get share name and server name */ -	if (node_name[1] != '\\') { -		UNC[0] = '\\'; -		strncpy(UNC+1, node_name, len); -		len++; -		UNC[len] = 0; -	} else { -		strncpy(UNC, node_name, len); -		UNC[len] = 0; -	} +	/* get length of UNC and set pos to last char */ +	unclen = strlen(nodename); +	pos = nodename + unclen - 1; -	/* find server name end */ -	pSep = memchr(UNC+2, '\\', len-2); -	if (!pSep) { -		cifs_dbg(VFS, "%s: no server name end in node name: %s\n", -			 __func__, node_name); -		kfree(UNC); -		return ERR_PTR(-EINVAL); +	/* trim off any trailing delimiters */ +	while (*pos == '\\') { +		--pos; +		--unclen;  	} -	/* find sharename end */ -	pSep++; -	pSep = memchr(UNC+(pSep-UNC), '\\', len-(pSep-UNC)); -	if (pSep) { -		/* trim path up to sharename end -		 * now we have share name in UNC */ -		*pSep = 0; +	/* allocate a buffer: +	 * +2 for preceding "//" +	 * +1 for delimiter between UNC and prepath +	 * +1 for trailing NULL +	 */ +	pplen = prepath ? strlen(prepath) : 0; +	dev = kmalloc(2 + unclen + 1 + pplen + 1, GFP_KERNEL); +	if (!dev) +		return ERR_PTR(-ENOMEM); + +	pos = dev; +	/* add the initial "//" */ +	*pos = '/'; +	++pos; +	*pos = '/'; +	++pos; + +	/* copy in the UNC portion from referral */ +	memcpy(pos, nodename, unclen); +	pos += unclen; + +	/* copy the prefixpath remainder (if there is one) */ +	if (pplen) { +		*pos = '/'; +		++pos; +		memcpy(pos, prepath, pplen); +		pos += pplen;  	} -	return UNC; +	/* NULL terminator */ +	*pos = '\0'; + +	convert_delimiter(dev, '/'); +	return dev;  } @@ -123,6 +140,7 @@ char *cifs_compose_mount_options(const char *sb_mountdata,  {  	int rc;  	char *mountdata = NULL; +	const char *prepath = NULL;  	int md_len;  	char *tkn_e;  	char *srvIP = NULL; @@ -132,7 +150,10 @@ char *cifs_compose_mount_options(const char *sb_mountdata,  	if (sb_mountdata == NULL)  		return ERR_PTR(-EINVAL); -	*devname = cifs_get_share_name(ref->node_name); +	if (strlen(fullpath) - ref->path_consumed) +		prepath = fullpath + ref->path_consumed; + +	*devname = cifs_build_devname(ref->node_name, prepath);  	if (IS_ERR(*devname)) {  		rc = PTR_ERR(*devname);  		*devname = NULL; @@ -146,12 +167,14 @@ char *cifs_compose_mount_options(const char *sb_mountdata,  		goto compose_mount_options_err;  	} -	/* md_len = strlen(...) + 12 for 'sep+prefixpath=' -	 * assuming that we have 'unc=' and 'ip=' in -	 * the original sb_mountdata +	/* +	 * In most cases, we'll be building a shorter string than the original, +	 * but we do have to assume that the address in the ip= option may be +	 * much longer than the original. Add the max length of an address +	 * string to the length of the original string to allow for worst case.  	 */ -	md_len = strlen(sb_mountdata) + rc + strlen(ref->node_name) + 12; -	mountdata = kzalloc(md_len+1, GFP_KERNEL); +	md_len = strlen(sb_mountdata) + INET6_ADDRSTRLEN; +	mountdata = kzalloc(md_len + 1, GFP_KERNEL);  	if (mountdata == NULL) {  		rc = -ENOMEM;  		goto compose_mount_options_err; @@ -195,26 +218,6 @@ char *cifs_compose_mount_options(const char *sb_mountdata,  		strncat(mountdata, &sep, 1);  	strcat(mountdata, "ip=");  	strcat(mountdata, srvIP); -	strncat(mountdata, &sep, 1); -	strcat(mountdata, "unc="); -	strcat(mountdata, *devname); - -	/* find & copy prefixpath */ -	tkn_e = strchr(ref->node_name + 2, '\\'); -	if (tkn_e == NULL) { -		/* invalid unc, missing share name*/ -		rc = -EINVAL; -		goto compose_mount_options_err; -	} - -	tkn_e = strchr(tkn_e + 1, '\\'); -	if (tkn_e || (strlen(fullpath) - ref->path_consumed)) { -		strncat(mountdata, &sep, 1); -		strcat(mountdata, "prefixpath="); -		if (tkn_e) -			strcat(mountdata, tkn_e + 1); -		strcat(mountdata, fullpath + ref->path_consumed); -	}  	/*cifs_dbg(FYI, "%s: parent mountdata: %s\n", __func__, sb_mountdata);*/  	/*cifs_dbg(FYI, "%s: submount mountdata: %s\n", __func__, mountdata );*/ diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 72e4efee138..3752b9f6d9e 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -372,9 +372,6 @@ cifs_show_options(struct seq_file *s, struct dentry *root)  	cifs_show_security(s, tcon->ses->server);  	cifs_show_cache_flavor(s, cifs_sb); -	seq_printf(s, ",unc="); -	seq_escape(s, tcon->treeName, " \t\n\\"); -  	if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)  		seq_printf(s, ",multiuser");  	else if (tcon->ses->user_name) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 99eeaa17ee0..e3bc39bb9d1 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1061,6 +1061,7 @@ static int cifs_parse_security_flavors(char *value,  #endif  	case Opt_sec_none:  		vol->nullauth = 1; +		vol->secFlg |= CIFSSEC_MAY_NTLM;  		break;  	default:  		cifs_dbg(VFS, "bad security option: %s\n", value); @@ -1257,14 +1258,18 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,  	vol->backupuid_specified = false; /* no backup intent for a user */  	vol->backupgid_specified = false; /* no backup intent for a group */ -	/* -	 * For now, we ignore -EINVAL errors under the assumption that the -	 * unc= and prefixpath= options will be usable. -	 */ -	if (cifs_parse_devname(devname, vol) == -ENOMEM) { -		printk(KERN_ERR "CIFS: Unable to allocate memory to parse " -				"device string.\n"); -		goto out_nomem; +	switch (cifs_parse_devname(devname, vol)) { +	case 0: +		break; +	case -ENOMEM: +		cifs_dbg(VFS, "Unable to allocate memory for devname.\n"); +		goto cifs_parse_mount_err; +	case -EINVAL: +		cifs_dbg(VFS, "Malformed UNC in devname.\n"); +		goto cifs_parse_mount_err; +	default: +		cifs_dbg(VFS, "Unknown error parsing devname.\n"); +		goto cifs_parse_mount_err;  	}  	while ((data = strsep(&options, separator)) != NULL) { @@ -1826,7 +1831,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,  	}  #endif  	if (!vol->UNC) { -		cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string or in unc= option!\n"); +		cifs_dbg(VFS, "CIFS mount error: No usable UNC path provided in device string!\n");  		goto cifs_parse_mount_err;  	} @@ -3274,8 +3279,8 @@ build_unc_path_to_root(const struct smb_vol *vol,  	pos = full_path + unc_len;  	if (pplen) { -		*pos++ = CIFS_DIR_SEP(cifs_sb); -		strncpy(pos, vol->prepath, pplen); +		*pos = CIFS_DIR_SEP(cifs_sb); +		strncpy(pos + 1, vol->prepath, pplen);  		pos += pplen;  	} diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c index e7512e49761..7ede7306599 100644 --- a/fs/cifs/dns_resolve.c +++ b/fs/cifs/dns_resolve.c @@ -34,7 +34,7 @@  /**   * dns_resolve_server_name_to_ip - Resolve UNC server name to ip address. - * @unc: UNC path specifying the server + * @unc: UNC path specifying the server (with '/' as delimiter)   * @ip_addr: Where to return the IP address.   *   * The IP address will be returned in string form, and the caller is @@ -64,7 +64,7 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)  	hostname = unc + 2;  	/* Search for server name delimiter */ -	sep = memchr(hostname, '\\', len); +	sep = memchr(hostname, '/', len);  	if (sep)  		len = sep - hostname;  	else diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 201f0a0d6b0..a7abbea2c09 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -295,6 +295,12 @@ static int ecryptfs_release(struct inode *inode, struct file *file)  static int  ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync)  { +	int rc; + +	rc = filemap_write_and_wait(file->f_mapping); +	if (rc) +		return rc; +  	return vfs_fsync(ecryptfs_file_to_lower(file), datasync);  } diff --git a/fs/efivarfs/file.c b/fs/efivarfs/file.c index bfb53156431..8dd524f3228 100644 --- a/fs/efivarfs/file.c +++ b/fs/efivarfs/file.c @@ -44,8 +44,11 @@ static ssize_t efivarfs_file_write(struct file *file,  	bytes = efivar_entry_set_get_size(var, attributes, &datasize,  					  data, &set); -	if (!set && bytes) +	if (!set && bytes) { +		if (bytes == -ENOENT) +			bytes = -EIO;  		goto out; +	}  	if (bytes == -ENOENT) {  		drop_nlink(inode); @@ -76,7 +79,14 @@ static ssize_t efivarfs_file_read(struct file *file, char __user *userbuf,  	int err;  	err = efivar_entry_size(var, &datasize); -	if (err) + +	/* +	 * efivarfs represents uncommitted variables with +	 * zero-length files. Reading them should return EOF. +	 */ +	if (err == -ENOENT) +		return 0; +	else if (err)  		return err;  	data = kmalloc(datasize + sizeof(attributes), GFP_KERNEL); diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 254df56b847..f3f783dc4f7 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -180,6 +180,8 @@ u64 fuse_get_attr_version(struct fuse_conn *fc)  static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)  {  	struct inode *inode; +	struct dentry *parent; +	struct fuse_conn *fc;  	inode = ACCESS_ONCE(entry->d_inode);  	if (inode && is_bad_inode(inode)) @@ -187,10 +189,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)  	else if (fuse_dentry_time(entry) < get_jiffies_64()) {  		int err;  		struct fuse_entry_out outarg; -		struct fuse_conn *fc;  		struct fuse_req *req;  		struct fuse_forget_link *forget; -		struct dentry *parent;  		u64 attr_version;  		/* For negative dentries, always do a fresh lookup */ @@ -241,8 +241,14 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)  				       entry_attr_timeout(&outarg),  				       attr_version);  		fuse_change_entry_timeout(entry, &outarg); +	} else if (inode) { +		fc = get_fuse_conn(inode); +		if (fc->readdirplus_auto) { +			parent = dget_parent(entry); +			fuse_advise_use_readdirplus(parent->d_inode); +			dput(parent); +		}  	} -	fuse_advise_use_readdirplus(inode);  	return 1;  } diff --git a/fs/fuse/file.c b/fs/fuse/file.c index d1c9b85b3f5..e570081f9f7 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -16,6 +16,7 @@  #include <linux/compat.h>  #include <linux/swap.h>  #include <linux/aio.h> +#include <linux/falloc.h>  static const struct file_operations fuse_direct_io_file_operations; @@ -1278,7 +1279,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov,  	iov_iter_init(&ii, iov, nr_segs, count, 0); -	req = fuse_get_req(fc, fuse_iter_npages(&ii)); +	if (io->async) +		req = fuse_get_req_for_background(fc, fuse_iter_npages(&ii)); +	else +		req = fuse_get_req(fc, fuse_iter_npages(&ii));  	if (IS_ERR(req))  		return PTR_ERR(req); @@ -1314,7 +1318,11 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov,  			break;  		if (count) {  			fuse_put_request(fc, req); -			req = fuse_get_req(fc, fuse_iter_npages(&ii)); +			if (io->async) +				req = fuse_get_req_for_background(fc, +					fuse_iter_npages(&ii)); +			else +				req = fuse_get_req(fc, fuse_iter_npages(&ii));  			if (IS_ERR(req))  				break;  		} @@ -2365,6 +2373,11 @@ static void fuse_do_truncate(struct file *file)  	fuse_do_setattr(inode, &attr, file);  } +static inline loff_t fuse_round_up(loff_t off) +{ +	return round_up(off, FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT); +} +  static ssize_t  fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  			loff_t offset, unsigned long nr_segs) @@ -2372,6 +2385,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  	ssize_t ret = 0;  	struct file *file = iocb->ki_filp;  	struct fuse_file *ff = file->private_data; +	bool async_dio = ff->fc->async_dio;  	loff_t pos = 0;  	struct inode *inode;  	loff_t i_size; @@ -2383,10 +2397,10 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  	i_size = i_size_read(inode);  	/* optimization for short read */ -	if (rw != WRITE && offset + count > i_size) { +	if (async_dio && rw != WRITE && offset + count > i_size) {  		if (offset >= i_size)  			return 0; -		count = i_size - offset; +		count = min_t(loff_t, count, fuse_round_up(i_size - offset));  	}  	io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); @@ -2404,7 +2418,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  	 * By default, we want to optimize all I/Os with async request  	 * submission to the client filesystem if supported.  	 */ -	io->async = ff->fc->async_dio; +	io->async = async_dio;  	io->iocb = iocb;  	/* @@ -2412,7 +2426,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  	 * to wait on real async I/O requests, so we must submit this request  	 * synchronously.  	 */ -	if (!is_sync_kiocb(iocb) && (offset + count > i_size)) +	if (!is_sync_kiocb(iocb) && (offset + count > i_size) && rw == WRITE)  		io->async = false;  	if (rw == WRITE) @@ -2424,7 +2438,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,  		fuse_aio_complete(io, ret < 0 ? ret : 0, -1);  		/* we have a non-extending, async request, so return */ -		if (ret > 0 && !is_sync_kiocb(iocb)) +		if (!is_sync_kiocb(iocb))  			return -EIOCBQUEUED;  		ret = wait_on_sync_kiocb(iocb); @@ -2446,6 +2460,7 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,  				loff_t length)  {  	struct fuse_file *ff = file->private_data; +	struct inode *inode = file->f_inode;  	struct fuse_conn *fc = ff->fc;  	struct fuse_req *req;  	struct fuse_fallocate_in inarg = { @@ -2459,9 +2474,16 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,  	if (fc->no_fallocate)  		return -EOPNOTSUPP; +	if (mode & FALLOC_FL_PUNCH_HOLE) { +		mutex_lock(&inode->i_mutex); +		fuse_set_nowrite(inode); +	} +  	req = fuse_get_req_nopages(fc); -	if (IS_ERR(req)) -		return PTR_ERR(req); +	if (IS_ERR(req)) { +		err = PTR_ERR(req); +		goto out; +	}  	req->in.h.opcode = FUSE_FALLOCATE;  	req->in.h.nodeid = ff->nodeid; @@ -2476,6 +2498,24 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,  	}  	fuse_put_request(fc, req); +	if (err) +		goto out; + +	/* we could have extended the file */ +	if (!(mode & FALLOC_FL_KEEP_SIZE)) +		fuse_write_update_size(inode, offset + length); + +	if (mode & FALLOC_FL_PUNCH_HOLE) +		truncate_pagecache_range(inode, offset, offset + length - 1); + +	fuse_invalidate_attr(inode); + +out: +	if (mode & FALLOC_FL_PUNCH_HOLE) { +		fuse_release_nowrite(inode); +		mutex_unlock(&inode->i_mutex); +	} +  	return err;  } diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 6201f81e4d3..9a0cdde14a0 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -867,10 +867,11 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)  				fc->dont_mask = 1;  			if (arg->flags & FUSE_AUTO_INVAL_DATA)  				fc->auto_inval_data = 1; -			if (arg->flags & FUSE_DO_READDIRPLUS) +			if (arg->flags & FUSE_DO_READDIRPLUS) {  				fc->do_readdirplus = 1; -			if (arg->flags & FUSE_READDIRPLUS_AUTO) -				fc->readdirplus_auto = 1; +				if (arg->flags & FUSE_READDIRPLUS_AUTO) +					fc->readdirplus_auto = 1; +			}  			if (arg->flags & FUSE_ASYNC_DIO)  				fc->async_dio = 1;  		} else { diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 1dc9a13ce6b..93b5809c20b 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -1286,17 +1286,26 @@ int gfs2_setattr_size(struct inode *inode, u64 newsize)  	if (ret)  		return ret; +	ret = get_write_access(inode); +	if (ret) +		return ret; +  	inode_dio_wait(inode);  	ret = gfs2_rs_alloc(GFS2_I(inode));  	if (ret) -		return ret; +		goto out;  	oldsize = inode->i_size; -	if (newsize >= oldsize) -		return do_grow(inode, newsize); +	if (newsize >= oldsize) { +		ret = do_grow(inode, newsize); +		goto out; +	} -	return do_shrink(inode, oldsize, newsize); +	ret = do_shrink(inode, oldsize, newsize); +out: +	put_write_access(inode); +	return ret;  }  int gfs2_truncatei_resume(struct gfs2_inode *ip) diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index c3e82bd2317..b631c904346 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c @@ -354,22 +354,31 @@ static __be64 *gfs2_dir_get_hash_table(struct gfs2_inode *ip)  		return ERR_PTR(-EIO);  	} -	hc = kmalloc(hsize, GFP_NOFS); -	ret = -ENOMEM; +	hc = kmalloc(hsize, GFP_NOFS | __GFP_NOWARN); +	if (hc == NULL) +		hc = __vmalloc(hsize, GFP_NOFS, PAGE_KERNEL); +  	if (hc == NULL)  		return ERR_PTR(-ENOMEM);  	ret = gfs2_dir_read_data(ip, hc, hsize);  	if (ret < 0) { -		kfree(hc); +		if (is_vmalloc_addr(hc)) +			vfree(hc); +		else +			kfree(hc);  		return ERR_PTR(ret);  	}  	spin_lock(&inode->i_lock); -	if (ip->i_hash_cache) -		kfree(hc); -	else +	if (ip->i_hash_cache) { +		if (is_vmalloc_addr(hc)) +			vfree(hc); +		else +			kfree(hc); +	} else {  		ip->i_hash_cache = hc; +	}  	spin_unlock(&inode->i_lock);  	return ip->i_hash_cache; @@ -385,7 +394,10 @@ void gfs2_dir_hash_inval(struct gfs2_inode *ip)  {  	__be64 *hc = ip->i_hash_cache;  	ip->i_hash_cache = NULL; -	kfree(hc); +	if (is_vmalloc_addr(hc)) +		vfree(hc); +	else +		kfree(hc);  }  static inline int gfs2_dirent_sentinel(const struct gfs2_dirent *dent) @@ -1113,7 +1125,10 @@ static int dir_double_exhash(struct gfs2_inode *dip)  	if (IS_ERR(hc))  		return PTR_ERR(hc); -	h = hc2 = kmalloc(hsize_bytes * 2, GFP_NOFS); +	h = hc2 = kmalloc(hsize_bytes * 2, GFP_NOFS | __GFP_NOWARN); +	if (hc2 == NULL) +		hc2 = __vmalloc(hsize_bytes * 2, GFP_NOFS, PAGE_KERNEL); +  	if (!hc2)  		return -ENOMEM; @@ -1145,7 +1160,10 @@ fail:  	gfs2_dinode_out(dip, dibh->b_data);  	brelse(dibh);  out_kfree: -	kfree(hc2); +	if (is_vmalloc_addr(hc2)) +		vfree(hc2); +	else +		kfree(hc2);  	return error;  } @@ -1846,6 +1864,8 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,  	memset(&rlist, 0, sizeof(struct gfs2_rgrp_list));  	ht = kzalloc(size, GFP_NOFS); +	if (ht == NULL) +		ht = vzalloc(size);  	if (!ht)  		return -ENOMEM; @@ -1933,7 +1953,10 @@ out_rlist:  	gfs2_rlist_free(&rlist);  	gfs2_quota_unhold(dip);  out: -	kfree(ht); +	if (is_vmalloc_addr(ht)) +		vfree(ht); +	else +		kfree(ht);  	return error;  } diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index acd16764b13..ad0dc38d87a 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -402,16 +402,20 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)  	/* Update file times before taking page lock */  	file_update_time(vma->vm_file); +	ret = get_write_access(inode); +	if (ret) +		goto out; +  	ret = gfs2_rs_alloc(ip);  	if (ret) -		return ret; +		goto out_write_access;  	gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE);  	gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);  	ret = gfs2_glock_nq(&gh);  	if (ret) -		goto out; +		goto out_uninit;  	set_bit(GLF_DIRTY, &ip->i_gl->gl_flags);  	set_bit(GIF_SW_PAGED, &ip->i_flags); @@ -480,12 +484,15 @@ out_quota_unlock:  	gfs2_quota_unlock(ip);  out_unlock:  	gfs2_glock_dq(&gh); -out: +out_uninit:  	gfs2_holder_uninit(&gh);  	if (ret == 0) {  		set_page_dirty(page);  		wait_for_stable_page(page);  	} +out_write_access: +	put_write_access(inode); +out:  	sb_end_pagefault(inode->i_sb);  	return block_page_mkwrite_return(ret);  } @@ -594,10 +601,10 @@ static int gfs2_release(struct inode *inode, struct file *file)  	kfree(file->private_data);  	file->private_data = NULL; -	if ((file->f_mode & FMODE_WRITE) && -	    (atomic_read(&inode->i_writecount) == 1)) -		gfs2_rs_delete(ip); +	if (!(file->f_mode & FMODE_WRITE)) +		return 0; +	gfs2_rs_delete(ip);  	return 0;  } diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 8833a4f264e..62b484e4a9e 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c @@ -189,6 +189,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type,  	return inode;  fail_refresh: +	ip->i_iopen_gh.gh_flags |= GL_NOCACHE;  	ip->i_iopen_gh.gh_gl->gl_object = NULL;  	gfs2_glock_dq_uninit(&ip->i_iopen_gh);  fail_iopen: diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index 68b4c8f1fce..6c33d7b6e0c 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c @@ -419,7 +419,9 @@ static void gfs2_before_commit(struct gfs2_sbd *sdp, unsigned int limit,  		if (total > limit)  			num = limit;  		gfs2_log_unlock(sdp); -		page = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA, num + 1, num); +		page = gfs2_get_log_desc(sdp, +					 is_databuf ? GFS2_LOG_DESC_JDATA : +					 GFS2_LOG_DESC_METADATA, num + 1, num);  		ld = page_address(page);  		gfs2_log_lock(sdp);  		ptr = (__be64 *)(ld + 1); diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 5232525934a..9809156e3d0 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -638,8 +638,10 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs)   */  void gfs2_rs_delete(struct gfs2_inode *ip)  { +	struct inode *inode = &ip->i_inode; +  	down_write(&ip->i_rw_mutex); -	if (ip->i_res) { +	if (ip->i_res && atomic_read(&inode->i_writecount) <= 1) {  		gfs2_rs_deltree(ip->i_res);  		BUG_ON(ip->i_res->rs_free);  		kmem_cache_free(gfs2_rsrv_cachep, ip->i_res); diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 917c8e1eb4a..e5639dec66c 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c @@ -1444,6 +1444,7 @@ static void gfs2_evict_inode(struct inode *inode)  	/* Must not read inode block until block type has been verified */  	error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh);  	if (unlikely(error)) { +		ip->i_iopen_gh.gh_flags |= GL_NOCACHE;  		gfs2_glock_dq_uninit(&ip->i_iopen_gh);  		goto out;  	} @@ -1514,8 +1515,10 @@ out_unlock:  	if (gfs2_rs_active(ip->i_res))  		gfs2_rs_deltree(ip->i_res); -	if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) +	if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) { +		ip->i_iopen_gh.gh_flags |= GL_NOCACHE;  		gfs2_glock_dq(&ip->i_iopen_gh); +	}  	gfs2_holder_uninit(&ip->i_iopen_gh);  	gfs2_glock_dq_uninit(&gh);  	if (error && error != GLR_TRYFAILED && error != -EROFS) @@ -1534,6 +1537,7 @@ out:  	ip->i_gl = NULL;  	if (ip->i_iopen_gh.gh_gl) {  		ip->i_iopen_gh.gh_gl->gl_object = NULL; +		ip->i_iopen_gh.gh_flags |= GL_NOCACHE;  		gfs2_glock_dq_uninit(&ip->i_iopen_gh);  	}  } diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index 546f6d39713..834ac13c04b 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c @@ -33,25 +33,27 @@ static loff_t hpfs_dir_lseek(struct file *filp, loff_t off, int whence)  	if (whence == SEEK_DATA || whence == SEEK_HOLE)  		return -EINVAL; +	mutex_lock(&i->i_mutex);  	hpfs_lock(s);  	/*printk("dir lseek\n");*/  	if (new_off == 0 || new_off == 1 || new_off == 11 || new_off == 12 || new_off == 13) goto ok; -	mutex_lock(&i->i_mutex);  	pos = ((loff_t) hpfs_de_as_down_as_possible(s, hpfs_inode->i_dno) << 4) + 1;  	while (pos != new_off) {  		if (map_pos_dirent(i, &pos, &qbh)) hpfs_brelse4(&qbh);  		else goto fail;  		if (pos == 12) goto fail;  	} -	mutex_unlock(&i->i_mutex); +	hpfs_add_pos(i, &filp->f_pos);  ok: +	filp->f_pos = new_off;  	hpfs_unlock(s); -	return filp->f_pos = new_off; -fail:  	mutex_unlock(&i->i_mutex); +	return new_off; +fail:  	/*printk("illegal lseek: %016llx\n", new_off);*/  	hpfs_unlock(s); +	mutex_unlock(&i->i_mutex);  	return -ESPIPE;  } diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index c57499dca89..360d27c4888 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -2009,7 +2009,13 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp)  	bio->bi_end_io = lbmIODone;  	bio->bi_private = bp; -	submit_bio(READ_SYNC, bio); +	/*check if journaling to disk has been disabled*/ +	if (log->no_integrity) { +		bio->bi_size = 0; +		lbmIODone(bio, 0); +	} else { +		submit_bio(READ_SYNC, bio); +	}  	wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 2003e830ed1..788e0a9c1fb 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c @@ -611,11 +611,28 @@ static int jfs_freeze(struct super_block *sb)  {  	struct jfs_sb_info *sbi = JFS_SBI(sb);  	struct jfs_log *log = sbi->log; +	int rc = 0;  	if (!(sb->s_flags & MS_RDONLY)) {  		txQuiesce(sb); -		lmLogShutdown(log); -		updateSuper(sb, FM_CLEAN); +		rc = lmLogShutdown(log); +		if (rc) { +			jfs_error(sb, "jfs_freeze: lmLogShutdown failed"); + +			/* let operations fail rather than hang */ +			txResume(sb); + +			return rc; +		} +		rc = updateSuper(sb, FM_CLEAN); +		if (rc) { +			jfs_err("jfs_freeze: updateSuper failed\n"); +			/* +			 * Don't fail here. Everything succeeded except +			 * marking the superblock clean, so there's really +			 * no harm in leaving it frozen for now. +			 */ +		}  	}  	return 0;  } @@ -627,13 +644,18 @@ static int jfs_unfreeze(struct super_block *sb)  	int rc = 0;  	if (!(sb->s_flags & MS_RDONLY)) { -		updateSuper(sb, FM_MOUNT); -		if ((rc = lmLogInit(log))) -			jfs_err("jfs_unlock failed with return code %d", rc); -		else -			txResume(sb); +		rc = updateSuper(sb, FM_MOUNT); +		if (rc) { +			jfs_error(sb, "jfs_unfreeze: updateSuper failed"); +			goto out; +		} +		rc = lmLogInit(log); +		if (rc) +			jfs_error(sb, "jfs_unfreeze: lmLogInit failed"); +out: +		txResume(sb);  	} -	return 0; +	return rc;  }  static struct dentry *jfs_do_mount(struct file_system_type *fs_type, diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 4e2fe714d5c..d7ba5616989 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1078,7 +1078,7 @@ static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)  	struct nfs4_state *state = opendata->state;  	struct nfs_inode *nfsi = NFS_I(state->inode);  	struct nfs_delegation *delegation; -	int open_mode = opendata->o_arg.open_flags & (O_EXCL|O_TRUNC); +	int open_mode = opendata->o_arg.open_flags;  	fmode_t fmode = opendata->o_arg.fmode;  	nfs4_stateid stateid;  	int ret = -EAGAIN; diff --git a/fs/nfs/super.c b/fs/nfs/super.c index a366107a733..2d7525fbcf2 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c @@ -1942,6 +1942,7 @@ static int nfs23_validate_mount_data(void *options,  		args->namlen		= data->namlen;  		args->bsize		= data->bsize; +		args->auth_flavors[0] = RPC_AUTH_UNIX;  		if (data->flags & NFS_MOUNT_SECFLAVOUR)  			args->auth_flavors[0] = data->pseudoflavor;  		if (!args->nfs_server.hostname) @@ -2637,6 +2638,7 @@ static int nfs4_validate_mount_data(void *options,  			goto out_no_address;  		args->nfs_server.port = ntohs(((struct sockaddr_in *)sap)->sin_port); +		args->auth_flavors[0] = RPC_AUTH_UNIX;  		if (data->auth_flavourlen) {  			if (data->auth_flavourlen > 1)  				goto out_inval_auth; diff --git a/fs/pnode.c b/fs/pnode.c index 3d2a7141b87..9af0df15256 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -83,7 +83,8 @@ static int do_make_slave(struct mount *mnt)  		if (peer_mnt == mnt)  			peer_mnt = NULL;  	} -	if (IS_MNT_SHARED(mnt) && list_empty(&mnt->mnt_share)) +	if (mnt->mnt_group_id && IS_MNT_SHARED(mnt) && +	    list_empty(&mnt->mnt_share))  		mnt_release_group_id(mnt);  	list_del_init(&mnt->mnt_share); diff --git a/fs/qnx6/dir.c b/fs/qnx6/dir.c index 8798d065e40..afa6be6fc39 100644 --- a/fs/qnx6/dir.c +++ b/fs/qnx6/dir.c @@ -120,7 +120,7 @@ static int qnx6_readdir(struct file *filp, void *dirent, filldir_t filldir)  	struct inode *inode = file_inode(filp);  	struct super_block *s = inode->i_sb;  	struct qnx6_sb_info *sbi = QNX6_SB(s); -	loff_t pos = filp->f_pos & (QNX6_DIR_ENTRY_SIZE - 1); +	loff_t pos = filp->f_pos & ~(QNX6_DIR_ENTRY_SIZE - 1);  	unsigned long npages = dir_pages(inode);  	unsigned long n = pos >> PAGE_CACHE_SHIFT;  	unsigned start = (pos & ~PAGE_CACHE_MASK) / QNX6_DIR_ENTRY_SIZE; diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c index 66c53b642a8..6c2d136561c 100644 --- a/fs/reiserfs/dir.c +++ b/fs/reiserfs/dir.c @@ -204,6 +204,8 @@ int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,  				next_pos = deh_offset(deh) + 1;  				if (item_moved(&tmp_ih, &path_to_entry)) { +					set_cpu_key_k_offset(&pos_key, +							     next_pos);  					goto research;  				}  			}	/* for */ diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 77d6d47abc8..f844533792e 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -1811,11 +1811,16 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th,  				  TYPE_STAT_DATA, SD_SIZE, MAX_US_INT);  	memcpy(INODE_PKEY(inode), &(ih.ih_key), KEY_SIZE);  	args.dirid = le32_to_cpu(ih.ih_key.k_dir_id); -	if (insert_inode_locked4(inode, args.objectid, -			     reiserfs_find_actor, &args) < 0) { + +	reiserfs_write_unlock(inode->i_sb); +	err = insert_inode_locked4(inode, args.objectid, +			     reiserfs_find_actor, &args); +	reiserfs_write_lock(inode->i_sb); +	if (err) {  		err = -EINVAL;  		goto out_bad_inode;  	} +  	if (old_format_only(sb))  		/* not a perfect generation count, as object ids can be reused, but  		 ** this is as good as reiserfs can do right now. diff --git a/fs/reiserfs/xattr.c b/fs/reiserfs/xattr.c index 4cce1d9552f..821bcf70e46 100644 --- a/fs/reiserfs/xattr.c +++ b/fs/reiserfs/xattr.c @@ -318,7 +318,19 @@ static int delete_one_xattr(struct dentry *dentry, void *data)  static int chown_one_xattr(struct dentry *dentry, void *data)  {  	struct iattr *attrs = data; -	return reiserfs_setattr(dentry, attrs); +	int ia_valid = attrs->ia_valid; +	int err; + +	/* +	 * We only want the ownership bits. Otherwise, we'll do +	 * things like change a directory to a regular file if +	 * ATTR_MODE is set. +	 */ +	attrs->ia_valid &= (ATTR_UID|ATTR_GID); +	err = reiserfs_setattr(dentry, attrs); +	attrs->ia_valid = ia_valid; + +	return err;  }  /* No i_mutex, but the inode is unconnected. */ diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index d7c01ef64ed..6c8767fdfc6 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c @@ -443,6 +443,9 @@ int reiserfs_acl_chmod(struct inode *inode)  	int depth;  	int error; +	if (IS_PRIVATE(inode)) +		return 0; +  	if (S_ISLNK(inode->i_mode))  		return -EOPNOTSUPP; diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 1d32f1d5276..306d883d89b 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -21,6 +21,8 @@  #include "xfs_bmap_btree.h"  #include "xfs_inode.h"  #include "xfs_vnodeops.h" +#include "xfs_sb.h" +#include "xfs_mount.h"  #include "xfs_trace.h"  #include <linux/slab.h>  #include <linux/xattr.h> @@ -34,7 +36,9 @@   */  STATIC struct posix_acl * -xfs_acl_from_disk(struct xfs_acl *aclp) +xfs_acl_from_disk( +	struct xfs_acl	*aclp, +	int		max_entries)  {  	struct posix_acl_entry *acl_e;  	struct posix_acl *acl; @@ -42,7 +46,7 @@ xfs_acl_from_disk(struct xfs_acl *aclp)  	unsigned int count, i;  	count = be32_to_cpu(aclp->acl_cnt); -	if (count > XFS_ACL_MAX_ENTRIES) +	if (count > max_entries)  		return ERR_PTR(-EFSCORRUPTED);  	acl = posix_acl_alloc(count, GFP_KERNEL); @@ -108,9 +112,9 @@ xfs_get_acl(struct inode *inode, int type)  	struct xfs_inode *ip = XFS_I(inode);  	struct posix_acl *acl;  	struct xfs_acl *xfs_acl; -	int len = sizeof(struct xfs_acl);  	unsigned char *ea_name;  	int error; +	int len;  	acl = get_cached_acl(inode, type);  	if (acl != ACL_NOT_CACHED) @@ -133,8 +137,8 @@ xfs_get_acl(struct inode *inode, int type)  	 * If we have a cached ACLs value just return it, not need to  	 * go out to the disk.  	 */ - -	xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); +	len = XFS_ACL_MAX_SIZE(ip->i_mount); +	xfs_acl = kzalloc(len, GFP_KERNEL);  	if (!xfs_acl)  		return ERR_PTR(-ENOMEM); @@ -153,7 +157,7 @@ xfs_get_acl(struct inode *inode, int type)  		goto out;  	} -	acl = xfs_acl_from_disk(xfs_acl); +	acl = xfs_acl_from_disk(xfs_acl, XFS_ACL_MAX_ENTRIES(ip->i_mount));  	if (IS_ERR(acl))  		goto out; @@ -189,16 +193,17 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)  	if (acl) {  		struct xfs_acl *xfs_acl; -		int len; +		int len = XFS_ACL_MAX_SIZE(ip->i_mount); -		xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); +		xfs_acl = kzalloc(len, GFP_KERNEL);  		if (!xfs_acl)  			return -ENOMEM;  		xfs_acl_to_disk(xfs_acl, acl); -		len = sizeof(struct xfs_acl) - -			(sizeof(struct xfs_acl_entry) * -			 (XFS_ACL_MAX_ENTRIES - acl->a_count)); + +		/* subtract away the unused acl entries */ +		len -= sizeof(struct xfs_acl_entry) * +			 (XFS_ACL_MAX_ENTRIES(ip->i_mount) - acl->a_count);  		error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl,  				len, ATTR_ROOT); @@ -243,7 +248,7 @@ xfs_set_mode(struct inode *inode, umode_t mode)  static int  xfs_acl_exists(struct inode *inode, unsigned char *name)  { -	int len = sizeof(struct xfs_acl); +	int len = XFS_ACL_MAX_SIZE(XFS_M(inode->i_sb));  	return (xfs_attr_get(XFS_I(inode), name, NULL, &len,  			    ATTR_ROOT|ATTR_KERNOVAL) == 0); @@ -379,7 +384,7 @@ xfs_xattr_acl_set(struct dentry *dentry, const char *name,  		goto out_release;  	error = -EINVAL; -	if (acl->a_count > XFS_ACL_MAX_ENTRIES) +	if (acl->a_count > XFS_ACL_MAX_ENTRIES(XFS_M(inode->i_sb)))  		goto out_release;  	if (type == ACL_TYPE_ACCESS) { diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 39632d94135..4016a567b83 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h @@ -22,19 +22,36 @@ struct inode;  struct posix_acl;  struct xfs_inode; -#define XFS_ACL_MAX_ENTRIES 25  #define XFS_ACL_NOT_PRESENT (-1)  /* On-disk XFS access control list structure */ +struct xfs_acl_entry { +	__be32	ae_tag; +	__be32	ae_id; +	__be16	ae_perm; +	__be16	ae_pad;		/* fill the implicit hole in the structure */ +}; +  struct xfs_acl { -	__be32		acl_cnt; -	struct xfs_acl_entry { -		__be32	ae_tag; -		__be32	ae_id; -		__be16	ae_perm; -	} acl_entry[XFS_ACL_MAX_ENTRIES]; +	__be32			acl_cnt; +	struct xfs_acl_entry	acl_entry[0];  }; +/* + * The number of ACL entries allowed is defined by the on-disk format. + * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is + * limited only by the maximum size of the xattr that stores the information. + */ +#define XFS_ACL_MAX_ENTRIES(mp)	\ +	(xfs_sb_version_hascrc(&mp->m_sb) \ +		?  (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ +						sizeof(struct xfs_acl_entry) \ +		: 25) + +#define XFS_ACL_MAX_SIZE(mp) \ +	(sizeof(struct xfs_acl) + \ +		sizeof(struct xfs_acl_entry) * XFS_ACL_MAX_ENTRIES((mp))) +  /* On-disk XFS extended attribute names */  #define SGI_ACL_FILE		(unsigned char *)"SGI_ACL_FILE"  #define SGI_ACL_DEFAULT		(unsigned char *)"SGI_ACL_DEFAULT" diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 0bce1b34858..31d3cd12926 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c @@ -1412,7 +1412,7 @@ xfs_attr3_leaf_add_work(  		name_rmt->valuelen = 0;  		name_rmt->valueblk = 0;  		args->rmtblkno = 1; -		args->rmtblkcnt = XFS_B_TO_FSB(mp, args->valuelen); +		args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);  	}  	xfs_trans_log_buf(args->trans, bp,  	     XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index), @@ -1445,11 +1445,12 @@ xfs_attr3_leaf_add_work(  STATIC void  xfs_attr3_leaf_compact(  	struct xfs_da_args	*args, -	struct xfs_attr3_icleaf_hdr *ichdr_d, +	struct xfs_attr3_icleaf_hdr *ichdr_dst,  	struct xfs_buf		*bp)  { -	xfs_attr_leafblock_t	*leaf_s, *leaf_d; -	struct xfs_attr3_icleaf_hdr ichdr_s; +	struct xfs_attr_leafblock *leaf_src; +	struct xfs_attr_leafblock *leaf_dst; +	struct xfs_attr3_icleaf_hdr ichdr_src;  	struct xfs_trans	*trans = args->trans;  	struct xfs_mount	*mp = trans->t_mountp;  	char			*tmpbuffer; @@ -1457,29 +1458,38 @@ xfs_attr3_leaf_compact(  	trace_xfs_attr_leaf_compact(args);  	tmpbuffer = kmem_alloc(XFS_LBSIZE(mp), KM_SLEEP); -	ASSERT(tmpbuffer != NULL);  	memcpy(tmpbuffer, bp->b_addr, XFS_LBSIZE(mp));  	memset(bp->b_addr, 0, XFS_LBSIZE(mp)); +	leaf_src = (xfs_attr_leafblock_t *)tmpbuffer; +	leaf_dst = bp->b_addr;  	/* -	 * Copy basic information +	 * Copy the on-disk header back into the destination buffer to ensure +	 * all the information in the header that is not part of the incore +	 * header structure is preserved.  	 */ -	leaf_s = (xfs_attr_leafblock_t *)tmpbuffer; -	leaf_d = bp->b_addr; -	ichdr_s = *ichdr_d;	/* struct copy */ -	ichdr_d->firstused = XFS_LBSIZE(mp); -	ichdr_d->usedbytes = 0; -	ichdr_d->count = 0; -	ichdr_d->holes = 0; -	ichdr_d->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_s); -	ichdr_d->freemap[0].size = ichdr_d->firstused - ichdr_d->freemap[0].base; +	memcpy(bp->b_addr, tmpbuffer, xfs_attr3_leaf_hdr_size(leaf_src)); + +	/* Initialise the incore headers */ +	ichdr_src = *ichdr_dst;	/* struct copy */ +	ichdr_dst->firstused = XFS_LBSIZE(mp); +	ichdr_dst->usedbytes = 0; +	ichdr_dst->count = 0; +	ichdr_dst->holes = 0; +	ichdr_dst->freemap[0].base = xfs_attr3_leaf_hdr_size(leaf_src); +	ichdr_dst->freemap[0].size = ichdr_dst->firstused - +						ichdr_dst->freemap[0].base; + + +	/* write the header back to initialise the underlying buffer */ +	xfs_attr3_leaf_hdr_to_disk(leaf_dst, ichdr_dst);  	/*  	 * Copy all entry's in the same (sorted) order,  	 * but allocate name/value pairs packed and in sequence.  	 */ -	xfs_attr3_leaf_moveents(leaf_s, &ichdr_s, 0, leaf_d, ichdr_d, 0, -				ichdr_s.count, mp); +	xfs_attr3_leaf_moveents(leaf_src, &ichdr_src, 0, leaf_dst, ichdr_dst, 0, +				ichdr_src.count, mp);  	/*  	 * this logs the entire buffer, but the caller must write the header  	 * back to the buffer when it is finished modifying it. @@ -2181,14 +2191,24 @@ xfs_attr3_leaf_unbalance(  		struct xfs_attr_leafblock *tmp_leaf;  		struct xfs_attr3_icleaf_hdr tmphdr; -		tmp_leaf = kmem_alloc(state->blocksize, KM_SLEEP); -		memset(tmp_leaf, 0, state->blocksize); -		memset(&tmphdr, 0, sizeof(tmphdr)); +		tmp_leaf = kmem_zalloc(state->blocksize, KM_SLEEP); +		/* +		 * Copy the header into the temp leaf so that all the stuff +		 * not in the incore header is present and gets copied back in +		 * once we've moved all the entries. +		 */ +		memcpy(tmp_leaf, save_leaf, xfs_attr3_leaf_hdr_size(save_leaf)); + +		memset(&tmphdr, 0, sizeof(tmphdr));  		tmphdr.magic = savehdr.magic;  		tmphdr.forw = savehdr.forw;  		tmphdr.back = savehdr.back;  		tmphdr.firstused = state->blocksize; + +		/* write the header to the temp buffer to initialise it */ +		xfs_attr3_leaf_hdr_to_disk(tmp_leaf, &tmphdr); +  		if (xfs_attr3_leaf_order(save_blk->bp, &savehdr,  					 drop_blk->bp, &drophdr)) {  			xfs_attr3_leaf_moveents(drop_leaf, &drophdr, 0, @@ -2334,8 +2354,9 @@ xfs_attr3_leaf_lookup_int(  			args->index = probe;  			args->valuelen = be32_to_cpu(name_rmt->valuelen);  			args->rmtblkno = be32_to_cpu(name_rmt->valueblk); -			args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, -						       args->valuelen); +			args->rmtblkcnt = xfs_attr3_rmt_blocks( +							args->dp->i_mount, +							args->valuelen);  			return XFS_ERROR(EEXIST);  		}  	} @@ -2386,7 +2407,8 @@ xfs_attr3_leaf_getvalue(  		ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);  		valuelen = be32_to_cpu(name_rmt->valuelen);  		args->rmtblkno = be32_to_cpu(name_rmt->valueblk); -		args->rmtblkcnt = XFS_B_TO_FSB(args->dp->i_mount, valuelen); +		args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount, +						       valuelen);  		if (args->flags & ATTR_KERNOVAL) {  			args->valuelen = valuelen;  			return 0; @@ -2712,7 +2734,8 @@ xfs_attr3_leaf_list_int(  				args.valuelen = valuelen;  				args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS);  				args.rmtblkno = be32_to_cpu(name_rmt->valueblk); -				args.rmtblkcnt = XFS_B_TO_FSB(args.dp->i_mount, valuelen); +				args.rmtblkcnt = xfs_attr3_rmt_blocks( +							args.dp->i_mount, valuelen);  				retval = xfs_attr_rmtval_get(&args);  				if (retval)  					return retval; @@ -3235,7 +3258,7 @@ xfs_attr3_leaf_inactive(  			name_rmt = xfs_attr3_leaf_name_remote(leaf, i);  			if (name_rmt->valueblk) {  				lp->valueblk = be32_to_cpu(name_rmt->valueblk); -				lp->valuelen = XFS_B_TO_FSB(dp->i_mount, +				lp->valuelen = xfs_attr3_rmt_blocks(dp->i_mount,  						    be32_to_cpu(name_rmt->valuelen));  				lp++;  			} diff --git a/fs/xfs/xfs_attr_remote.c b/fs/xfs/xfs_attr_remote.c index dee84466dcc..ef6b0c12452 100644 --- a/fs/xfs/xfs_attr_remote.c +++ b/fs/xfs/xfs_attr_remote.c @@ -47,22 +47,55 @@   * Each contiguous block has a header, so it is not just a simple attribute   * length to FSB conversion.   */ -static int +int  xfs_attr3_rmt_blocks(  	struct xfs_mount *mp,  	int		attrlen)  { -	int		buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, -							 mp->m_sb.sb_blocksize); -	return (attrlen + buflen - 1) / buflen; +	if (xfs_sb_version_hascrc(&mp->m_sb)) { +		int buflen = XFS_ATTR3_RMT_BUF_SPACE(mp, mp->m_sb.sb_blocksize); +		return (attrlen + buflen - 1) / buflen; +	} +	return XFS_B_TO_FSB(mp, attrlen); +} + +/* + * Checking of the remote attribute header is split into two parts. The verifier + * does CRC, location and bounds checking, the unpacking function checks the + * attribute parameters and owner. + */ +static bool +xfs_attr3_rmt_hdr_ok( +	struct xfs_mount	*mp, +	void			*ptr, +	xfs_ino_t		ino, +	uint32_t		offset, +	uint32_t		size, +	xfs_daddr_t		bno) +{ +	struct xfs_attr3_rmt_hdr *rmt = ptr; + +	if (bno != be64_to_cpu(rmt->rm_blkno)) +		return false; +	if (offset != be32_to_cpu(rmt->rm_offset)) +		return false; +	if (size != be32_to_cpu(rmt->rm_bytes)) +		return false; +	if (ino != be64_to_cpu(rmt->rm_owner)) +		return false; + +	/* ok */ +	return true;  }  static bool  xfs_attr3_rmt_verify( -	struct xfs_buf		*bp) +	struct xfs_mount	*mp, +	void			*ptr, +	int			fsbsize, +	xfs_daddr_t		bno)  { -	struct xfs_mount	*mp = bp->b_target->bt_mount; -	struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; +	struct xfs_attr3_rmt_hdr *rmt = ptr;  	if (!xfs_sb_version_hascrc(&mp->m_sb))  		return false; @@ -70,7 +103,9 @@ xfs_attr3_rmt_verify(  		return false;  	if (!uuid_equal(&rmt->rm_uuid, &mp->m_sb.sb_uuid))  		return false; -	if (bp->b_bn != be64_to_cpu(rmt->rm_blkno)) +	if (be64_to_cpu(rmt->rm_blkno) != bno) +		return false; +	if (be32_to_cpu(rmt->rm_bytes) > fsbsize - sizeof(*rmt))  		return false;  	if (be32_to_cpu(rmt->rm_offset) +  				be32_to_cpu(rmt->rm_bytes) >= XATTR_SIZE_MAX) @@ -86,17 +121,40 @@ xfs_attr3_rmt_read_verify(  	struct xfs_buf	*bp)  {  	struct xfs_mount *mp = bp->b_target->bt_mount; +	char		*ptr; +	int		len; +	bool		corrupt = false; +	xfs_daddr_t	bno;  	/* no verification of non-crc buffers */  	if (!xfs_sb_version_hascrc(&mp->m_sb))  		return; -	if (!xfs_verify_cksum(bp->b_addr, BBTOB(bp->b_length), -			      XFS_ATTR3_RMT_CRC_OFF) || -	    !xfs_attr3_rmt_verify(bp)) { +	ptr = bp->b_addr; +	bno = bp->b_bn; +	len = BBTOB(bp->b_length); +	ASSERT(len >= XFS_LBSIZE(mp)); + +	while (len > 0) { +		if (!xfs_verify_cksum(ptr, XFS_LBSIZE(mp), +				      XFS_ATTR3_RMT_CRC_OFF)) { +			corrupt = true; +			break; +		} +		if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { +			corrupt = true; +			break; +		} +		len -= XFS_LBSIZE(mp); +		ptr += XFS_LBSIZE(mp); +		bno += mp->m_bsize; +	} + +	if (corrupt) {  		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr);  		xfs_buf_ioerror(bp, EFSCORRUPTED); -	} +	} else +		ASSERT(len == 0);  }  static void @@ -105,23 +163,39 @@ xfs_attr3_rmt_write_verify(  {  	struct xfs_mount *mp = bp->b_target->bt_mount;  	struct xfs_buf_log_item	*bip = bp->b_fspriv; +	char		*ptr; +	int		len; +	xfs_daddr_t	bno;  	/* no verification of non-crc buffers */  	if (!xfs_sb_version_hascrc(&mp->m_sb))  		return; -	if (!xfs_attr3_rmt_verify(bp)) { -		XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); -		xfs_buf_ioerror(bp, EFSCORRUPTED); -		return; -	} +	ptr = bp->b_addr; +	bno = bp->b_bn; +	len = BBTOB(bp->b_length); +	ASSERT(len >= XFS_LBSIZE(mp)); -	if (bip) { -		struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; -		rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); +	while (len > 0) { +		if (!xfs_attr3_rmt_verify(mp, ptr, XFS_LBSIZE(mp), bno)) { +			XFS_CORRUPTION_ERROR(__func__, +					    XFS_ERRLEVEL_LOW, mp, bp->b_addr); +			xfs_buf_ioerror(bp, EFSCORRUPTED); +			return; +		} +		if (bip) { +			struct xfs_attr3_rmt_hdr *rmt; + +			rmt = (struct xfs_attr3_rmt_hdr *)ptr; +			rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn); +		} +		xfs_update_cksum(ptr, XFS_LBSIZE(mp), XFS_ATTR3_RMT_CRC_OFF); + +		len -= XFS_LBSIZE(mp); +		ptr += XFS_LBSIZE(mp); +		bno += mp->m_bsize;  	} -	xfs_update_cksum(bp->b_addr, BBTOB(bp->b_length), -			 XFS_ATTR3_RMT_CRC_OFF); +	ASSERT(len == 0);  }  const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = { @@ -129,15 +203,16 @@ const struct xfs_buf_ops xfs_attr3_rmt_buf_ops = {  	.verify_write = xfs_attr3_rmt_write_verify,  }; -static int +STATIC int  xfs_attr3_rmt_hdr_set(  	struct xfs_mount	*mp, +	void			*ptr,  	xfs_ino_t		ino,  	uint32_t		offset,  	uint32_t		size, -	struct xfs_buf		*bp) +	xfs_daddr_t		bno)  { -	struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; +	struct xfs_attr3_rmt_hdr *rmt = ptr;  	if (!xfs_sb_version_hascrc(&mp->m_sb))  		return 0; @@ -147,36 +222,107 @@ xfs_attr3_rmt_hdr_set(  	rmt->rm_bytes = cpu_to_be32(size);  	uuid_copy(&rmt->rm_uuid, &mp->m_sb.sb_uuid);  	rmt->rm_owner = cpu_to_be64(ino); -	rmt->rm_blkno = cpu_to_be64(bp->b_bn); -	bp->b_ops = &xfs_attr3_rmt_buf_ops; +	rmt->rm_blkno = cpu_to_be64(bno);  	return sizeof(struct xfs_attr3_rmt_hdr);  }  /* - * Checking of the remote attribute header is split into two parts. the verifier - * does CRC, location and bounds checking, the unpacking function checks the - * attribute parameters and owner. + * Helper functions to copy attribute data in and out of the one disk extents   */ -static bool -xfs_attr3_rmt_hdr_ok( -	struct xfs_mount	*mp, -	xfs_ino_t		ino, -	uint32_t		offset, -	uint32_t		size, -	struct xfs_buf		*bp) +STATIC int +xfs_attr_rmtval_copyout( +	struct xfs_mount *mp, +	struct xfs_buf	*bp, +	xfs_ino_t	ino, +	int		*offset, +	int		*valuelen, +	char		**dst)  { -	struct xfs_attr3_rmt_hdr *rmt = bp->b_addr; +	char		*src = bp->b_addr; +	xfs_daddr_t	bno = bp->b_bn; +	int		len = BBTOB(bp->b_length); -	if (offset != be32_to_cpu(rmt->rm_offset)) -		return false; -	if (size != be32_to_cpu(rmt->rm_bytes)) -		return false; -	if (ino != be64_to_cpu(rmt->rm_owner)) -		return false; +	ASSERT(len >= XFS_LBSIZE(mp)); -	/* ok */ -	return true; +	while (len > 0 && *valuelen > 0) { +		int hdr_size = 0; +		int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + +		byte_cnt = min_t(int, *valuelen, byte_cnt); + +		if (xfs_sb_version_hascrc(&mp->m_sb)) { +			if (!xfs_attr3_rmt_hdr_ok(mp, src, ino, *offset, +						  byte_cnt, bno)) { +				xfs_alert(mp, +"remote attribute header mismatch bno/off/len/owner (0x%llx/0x%x/Ox%x/0x%llx)", +					bno, *offset, byte_cnt, ino); +				return EFSCORRUPTED; +			} +			hdr_size = sizeof(struct xfs_attr3_rmt_hdr); +		} + +		memcpy(*dst, src + hdr_size, byte_cnt); + +		/* roll buffer forwards */ +		len -= XFS_LBSIZE(mp); +		src += XFS_LBSIZE(mp); +		bno += mp->m_bsize; + +		/* roll attribute data forwards */ +		*valuelen -= byte_cnt; +		*dst += byte_cnt; +		*offset += byte_cnt; +	} +	return 0; +} + +STATIC void +xfs_attr_rmtval_copyin( +	struct xfs_mount *mp, +	struct xfs_buf	*bp, +	xfs_ino_t	ino, +	int		*offset, +	int		*valuelen, +	char		**src) +{ +	char		*dst = bp->b_addr; +	xfs_daddr_t	bno = bp->b_bn; +	int		len = BBTOB(bp->b_length); + +	ASSERT(len >= XFS_LBSIZE(mp)); + +	while (len > 0 && *valuelen > 0) { +		int hdr_size; +		int byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, XFS_LBSIZE(mp)); + +		byte_cnt = min(*valuelen, byte_cnt); +		hdr_size = xfs_attr3_rmt_hdr_set(mp, dst, ino, *offset, +						 byte_cnt, bno); + +		memcpy(dst + hdr_size, *src, byte_cnt); + +		/* +		 * If this is the last block, zero the remainder of it. +		 * Check that we are actually the last block, too. +		 */ +		if (byte_cnt + hdr_size < XFS_LBSIZE(mp)) { +			ASSERT(*valuelen - byte_cnt == 0); +			ASSERT(len == XFS_LBSIZE(mp)); +			memset(dst + hdr_size + byte_cnt, 0, +					XFS_LBSIZE(mp) - hdr_size - byte_cnt); +		} + +		/* roll buffer forwards */ +		len -= XFS_LBSIZE(mp); +		dst += XFS_LBSIZE(mp); +		bno += mp->m_bsize; + +		/* roll attribute data forwards */ +		*valuelen -= byte_cnt; +		*src += byte_cnt; +		*offset += byte_cnt; +	}  }  /* @@ -190,13 +336,12 @@ xfs_attr_rmtval_get(  	struct xfs_bmbt_irec	map[ATTR_RMTVALUE_MAPSIZE];  	struct xfs_mount	*mp = args->dp->i_mount;  	struct xfs_buf		*bp; -	xfs_daddr_t		dblkno;  	xfs_dablk_t		lblkno = args->rmtblkno; -	void			*dst = args->value; +	char			*dst = args->value;  	int			valuelen = args->valuelen;  	int			nmap;  	int			error; -	int			blkcnt; +	int			blkcnt = args->rmtblkcnt;  	int			i;  	int			offset = 0; @@ -207,52 +352,36 @@ xfs_attr_rmtval_get(  	while (valuelen > 0) {  		nmap = ATTR_RMTVALUE_MAPSIZE;  		error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, -				       args->rmtblkcnt, map, &nmap, +				       blkcnt, map, &nmap,  				       XFS_BMAPI_ATTRFORK);  		if (error)  			return error;  		ASSERT(nmap >= 1);  		for (i = 0; (i < nmap) && (valuelen > 0); i++) { -			int	byte_cnt; -			char	*src; +			xfs_daddr_t	dblkno; +			int		dblkcnt;  			ASSERT((map[i].br_startblock != DELAYSTARTBLOCK) &&  			       (map[i].br_startblock != HOLESTARTBLOCK));  			dblkno = XFS_FSB_TO_DADDR(mp, map[i].br_startblock); -			blkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount); +			dblkcnt = XFS_FSB_TO_BB(mp, map[i].br_blockcount);  			error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, -						   dblkno, blkcnt, 0, &bp, +						   dblkno, dblkcnt, 0, &bp,  						   &xfs_attr3_rmt_buf_ops);  			if (error)  				return error; -			byte_cnt = min_t(int, valuelen, BBTOB(bp->b_length)); -			byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); - -			src = bp->b_addr; -			if (xfs_sb_version_hascrc(&mp->m_sb)) { -				if (!xfs_attr3_rmt_hdr_ok(mp, args->dp->i_ino, -							offset, byte_cnt, bp)) { -					xfs_alert(mp, -"remote attribute header does not match required off/len/owner (0x%x/Ox%x,0x%llx)", -						offset, byte_cnt, args->dp->i_ino); -					xfs_buf_relse(bp); -					return EFSCORRUPTED; - -				} - -				src += sizeof(struct xfs_attr3_rmt_hdr); -			} - -			memcpy(dst, src, byte_cnt); +			error = xfs_attr_rmtval_copyout(mp, bp, args->dp->i_ino, +							&offset, &valuelen, +							&dst);  			xfs_buf_relse(bp); +			if (error) +				return error; -			offset += byte_cnt; -			dst += byte_cnt; -			valuelen -= byte_cnt; - +			/* roll attribute extent map forwards */  			lblkno += map[i].br_blockcount; +			blkcnt -= map[i].br_blockcount;  		}  	}  	ASSERT(valuelen == 0); @@ -270,17 +399,13 @@ xfs_attr_rmtval_set(  	struct xfs_inode	*dp = args->dp;  	struct xfs_mount	*mp = dp->i_mount;  	struct xfs_bmbt_irec	map; -	struct xfs_buf		*bp; -	xfs_daddr_t		dblkno;  	xfs_dablk_t		lblkno;  	xfs_fileoff_t		lfileoff = 0; -	void			*src = args->value; +	char			*src = args->value;  	int			blkcnt;  	int			valuelen;  	int			nmap;  	int			error; -	int			hdrcnt = 0; -	bool			crcs = xfs_sb_version_hascrc(&mp->m_sb);  	int			offset = 0;  	trace_xfs_attr_rmtval_set(args); @@ -289,24 +414,14 @@ xfs_attr_rmtval_set(  	 * Find a "hole" in the attribute address space large enough for  	 * us to drop the new attribute's value into. Because CRC enable  	 * attributes have headers, we can't just do a straight byte to FSB -	 * conversion. We calculate the worst case block count in this case -	 * and we may not need that many, so we have to handle this when -	 * allocating the blocks below.  +	 * conversion and have to take the header space into account.  	 */ -	if (!crcs) -		blkcnt = XFS_B_TO_FSB(mp, args->valuelen); -	else -		blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen); - +	blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);  	error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff,  						   XFS_ATTR_FORK);  	if (error)  		return error; -	/* Start with the attribute data. We'll allocate the rest afterwards. */ -	if (crcs) -		blkcnt = XFS_B_TO_FSB(mp, args->valuelen); -  	args->rmtblkno = lblkno = (xfs_dablk_t)lfileoff;  	args->rmtblkcnt = blkcnt; @@ -349,26 +464,6 @@ xfs_attr_rmtval_set(  		       (map.br_startblock != HOLESTARTBLOCK));  		lblkno += map.br_blockcount;  		blkcnt -= map.br_blockcount; -		hdrcnt++; - -		/* -		 * If we have enough blocks for the attribute data, calculate -		 * how many extra blocks we need for headers. We might run -		 * through this multiple times in the case that the additional -		 * headers in the blocks needed for the data fragments spills -		 * into requiring more blocks. e.g. for 512 byte blocks, we'll -		 * spill for another block every 9 headers we require in this -		 * loop. -		 */ -		if (crcs && blkcnt == 0) { -			int total_len; - -			total_len = args->valuelen + -				    hdrcnt * sizeof(struct xfs_attr3_rmt_hdr); -			blkcnt = XFS_B_TO_FSB(mp, total_len); -			blkcnt -= args->rmtblkcnt; -			args->rmtblkcnt += blkcnt; -		}  		/*  		 * Start the next trans in the chain. @@ -385,18 +480,19 @@ xfs_attr_rmtval_set(  	 * the INCOMPLETE flag.  	 */  	lblkno = args->rmtblkno; +	blkcnt = args->rmtblkcnt;  	valuelen = args->valuelen;  	while (valuelen > 0) { -		int	byte_cnt; -		char	*buf; +		struct xfs_buf	*bp; +		xfs_daddr_t	dblkno; +		int		dblkcnt; + +		ASSERT(blkcnt > 0); -		/* -		 * Try to remember where we decided to put the value. -		 */  		xfs_bmap_init(args->flist, args->firstblock);  		nmap = 1;  		error = xfs_bmapi_read(dp, (xfs_fileoff_t)lblkno, -				       args->rmtblkcnt, &map, &nmap, +				       blkcnt, &map, &nmap,  				       XFS_BMAPI_ATTRFORK);  		if (error)  			return(error); @@ -405,41 +501,27 @@ xfs_attr_rmtval_set(  		       (map.br_startblock != HOLESTARTBLOCK));  		dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), -		blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); +		dblkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); -		bp = xfs_buf_get(mp->m_ddev_targp, dblkno, blkcnt, 0); +		bp = xfs_buf_get(mp->m_ddev_targp, dblkno, dblkcnt, 0);  		if (!bp)  			return ENOMEM;  		bp->b_ops = &xfs_attr3_rmt_buf_ops; -		byte_cnt = BBTOB(bp->b_length); -		byte_cnt = XFS_ATTR3_RMT_BUF_SPACE(mp, byte_cnt); -		if (valuelen < byte_cnt) -			byte_cnt = valuelen; - -		buf = bp->b_addr; -		buf += xfs_attr3_rmt_hdr_set(mp, dp->i_ino, offset, -					     byte_cnt, bp); -		memcpy(buf, src, byte_cnt); - -		if (byte_cnt < BBTOB(bp->b_length)) -			xfs_buf_zero(bp, byte_cnt, -				     BBTOB(bp->b_length) - byte_cnt); +		xfs_attr_rmtval_copyin(mp, bp, args->dp->i_ino, &offset, +				       &valuelen, &src);  		error = xfs_bwrite(bp);	/* GROT: NOTE: synchronous write */  		xfs_buf_relse(bp);  		if (error)  			return error; -		src += byte_cnt; -		valuelen -= byte_cnt; -		offset += byte_cnt; -		hdrcnt--; +		/* roll attribute extent map forwards */  		lblkno += map.br_blockcount; +		blkcnt -= map.br_blockcount;  	}  	ASSERT(valuelen == 0); -	ASSERT(hdrcnt == 0);  	return 0;  } @@ -448,33 +530,40 @@ xfs_attr_rmtval_set(   * out-of-line buffer that it is stored on.   */  int -xfs_attr_rmtval_remove(xfs_da_args_t *args) +xfs_attr_rmtval_remove( +	struct xfs_da_args	*args)  { -	xfs_mount_t *mp; -	xfs_bmbt_irec_t map; -	xfs_buf_t *bp; -	xfs_daddr_t dblkno; -	xfs_dablk_t lblkno; -	int valuelen, blkcnt, nmap, error, done, committed; +	struct xfs_mount	*mp = args->dp->i_mount; +	xfs_dablk_t		lblkno; +	int			blkcnt; +	int			error; +	int			done;  	trace_xfs_attr_rmtval_remove(args); -	mp = args->dp->i_mount; -  	/* -	 * Roll through the "value", invalidating the attribute value's -	 * blocks. +	 * Roll through the "value", invalidating the attribute value's blocks. +	 * Note that args->rmtblkcnt is the minimum number of data blocks we'll +	 * see for a CRC enabled remote attribute. Each extent will have a +	 * header, and so we may have more blocks than we realise here.  If we +	 * fail to map the blocks correctly, we'll have problems with the buffer +	 * lookups.  	 */  	lblkno = args->rmtblkno; -	valuelen = args->rmtblkcnt; -	while (valuelen > 0) { +	blkcnt = args->rmtblkcnt; +	while (blkcnt > 0) { +		struct xfs_bmbt_irec	map; +		struct xfs_buf		*bp; +		xfs_daddr_t		dblkno; +		int			dblkcnt; +		int			nmap; +  		/*  		 * Try to remember where we decided to put the value.  		 */  		nmap = 1;  		error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno, -				       args->rmtblkcnt, &map, &nmap, -				       XFS_BMAPI_ATTRFORK); +				       blkcnt, &map, &nmap, XFS_BMAPI_ATTRFORK);  		if (error)  			return(error);  		ASSERT(nmap == 1); @@ -482,21 +571,20 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)  		       (map.br_startblock != HOLESTARTBLOCK));  		dblkno = XFS_FSB_TO_DADDR(mp, map.br_startblock), -		blkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount); +		dblkcnt = XFS_FSB_TO_BB(mp, map.br_blockcount);  		/*  		 * If the "remote" value is in the cache, remove it.  		 */ -		bp = xfs_incore(mp->m_ddev_targp, dblkno, blkcnt, XBF_TRYLOCK); +		bp = xfs_incore(mp->m_ddev_targp, dblkno, dblkcnt, XBF_TRYLOCK);  		if (bp) {  			xfs_buf_stale(bp);  			xfs_buf_relse(bp);  			bp = NULL;  		} -		valuelen -= map.br_blockcount; -  		lblkno += map.br_blockcount; +		blkcnt -= map.br_blockcount;  	}  	/* @@ -506,6 +594,8 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args)  	blkcnt = args->rmtblkcnt;  	done = 0;  	while (!done) { +		int committed; +  		xfs_bmap_init(args->flist, args->firstblock);  		error = xfs_bunmapi(args->trans, args->dp, lblkno, blkcnt,  				    XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA, diff --git a/fs/xfs/xfs_attr_remote.h b/fs/xfs/xfs_attr_remote.h index c7cca60a062..92a8fd7977c 100644 --- a/fs/xfs/xfs_attr_remote.h +++ b/fs/xfs/xfs_attr_remote.h @@ -20,6 +20,14 @@  #define XFS_ATTR3_RMT_MAGIC	0x5841524d	/* XARM */ +/* + * There is one of these headers per filesystem block in a remote attribute. + * This is done to ensure there is a 1:1 mapping between the attribute value + * length and the number of blocks needed to store the attribute. This makes the + * verification of a buffer a little more complex, but greatly simplifies the + * allocation, reading and writing of these attributes as we don't have to guess + * the number of blocks needed to store the attribute data. + */  struct xfs_attr3_rmt_hdr {  	__be32	rm_magic;  	__be32	rm_offset; @@ -39,6 +47,8 @@ struct xfs_attr3_rmt_hdr {  extern const struct xfs_buf_ops xfs_attr3_rmt_buf_ops; +int xfs_attr3_rmt_blocks(struct xfs_mount *mp, int attrlen); +  int xfs_attr_rmtval_get(struct xfs_da_args *args);  int xfs_attr_rmtval_set(struct xfs_da_args *args);  int xfs_attr_rmtval_remove(struct xfs_da_args *args); diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 0d255429968..1b2472a46e4 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -513,6 +513,7 @@ _xfs_buf_find(  		xfs_alert(btp->bt_mount,  			  "%s: Block out of range: block 0x%llx, EOFS 0x%llx ",  			  __func__, blkno, eofs); +		WARN_ON(1);  		return NULL;  	} diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index cf263476d6b..4ec43177704 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -262,12 +262,7 @@ xfs_buf_item_format_segment(  			vecp->i_addr = xfs_buf_offset(bp, buffer_offset);  			vecp->i_len = nbits * XFS_BLF_CHUNK;  			vecp->i_type = XLOG_REG_TYPE_BCHUNK; -/* - * You would think we need to bump the nvecs here too, but we do not - * this number is used by recovery, and it gets confused by the boundary - * split here - *			nvecs++; - */ +			nvecs++;  			vecp++;  			first_bit = next_bit;  			last_bit = next_bit; diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index f852b082a08..c407e1ccff4 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c @@ -219,6 +219,14 @@ xfs_swap_extents(  	int		taforkblks = 0;  	__uint64_t	tmp; +	/* +	 * We have no way of updating owner information in the BMBT blocks for +	 * each inode on CRC enabled filesystems, so to avoid corrupting the +	 * this metadata we simply don't allow extent swaps to occur. +	 */ +	if (xfs_sb_version_hascrc(&mp->m_sb)) +		return XFS_ERROR(EINVAL); +  	tempifp = kmem_alloc(sizeof(xfs_ifork_t), KM_MAYFAIL);  	if (!tempifp) {  		error = XFS_ERROR(ENOMEM); diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index a3b1bd841a8..995f1f505a5 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h @@ -715,6 +715,7 @@ struct xfs_dir3_free_hdr {  	__be32			firstdb;	/* db of first entry */  	__be32			nvalid;		/* count of valid entries */  	__be32			nused;		/* count of used entries */ +	__be32			pad;		/* 64 bit alignment. */  };  struct xfs_dir3_free { diff --git a/fs/xfs/xfs_dir2_node.c b/fs/xfs/xfs_dir2_node.c index 5246de4912d..2226a00acd1 100644 --- a/fs/xfs/xfs_dir2_node.c +++ b/fs/xfs/xfs_dir2_node.c @@ -263,18 +263,19 @@ xfs_dir3_free_get_buf(  	 * Initialize the new block to be empty, and remember  	 * its first slot as our empty slot.  	 */ -	hdr.magic = XFS_DIR2_FREE_MAGIC; -	hdr.firstdb = 0; -	hdr.nused = 0; -	hdr.nvalid = 0; +	memset(bp->b_addr, 0, sizeof(struct xfs_dir3_free_hdr)); +	memset(&hdr, 0, sizeof(hdr)); +  	if (xfs_sb_version_hascrc(&mp->m_sb)) {  		struct xfs_dir3_free_hdr *hdr3 = bp->b_addr;  		hdr.magic = XFS_DIR3_FREE_MAGIC; +  		hdr3->hdr.blkno = cpu_to_be64(bp->b_bn);  		hdr3->hdr.owner = cpu_to_be64(dp->i_ino);  		uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid); -	} +	} else +		hdr.magic = XFS_DIR2_FREE_MAGIC;  	xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr);  	*bpp = bp;  	return 0; @@ -1921,8 +1922,6 @@ xfs_dir2_node_addname_int(  			 */  			freehdr.firstdb = (fbno - XFS_DIR2_FREE_FIRSTDB(mp)) *  					xfs_dir3_free_max_bests(mp); -			free->hdr.nvalid = 0; -			free->hdr.nused = 0;  		} else {  			free = fbp->b_addr;  			bests = xfs_dir3_free_bests_p(mp, free); diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index a41f8bf1da3..044e97a33c8 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c @@ -249,8 +249,11 @@ xfs_qm_init_dquot_blk(  		d->dd_diskdq.d_version = XFS_DQUOT_VERSION;  		d->dd_diskdq.d_id = cpu_to_be32(curid);  		d->dd_diskdq.d_flags = type; -		if (xfs_sb_version_hascrc(&mp->m_sb)) +		if (xfs_sb_version_hascrc(&mp->m_sb)) {  			uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); +			xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), +					 XFS_DQUOT_CRC_OFF); +		}  	}  	xfs_trans_dquot_buf(tp, bp, @@ -286,23 +289,6 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp)  	dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5;  } -STATIC void -xfs_dquot_buf_calc_crc( -	struct xfs_mount	*mp, -	struct xfs_buf		*bp) -{ -	struct xfs_dqblk	*d = (struct xfs_dqblk *)bp->b_addr; -	int			i; - -	if (!xfs_sb_version_hascrc(&mp->m_sb)) -		return; - -	for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { -		xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), -				 offsetof(struct xfs_dqblk, dd_crc)); -	} -} -  STATIC bool  xfs_dquot_buf_verify_crc(  	struct xfs_mount	*mp, @@ -328,12 +314,11 @@ xfs_dquot_buf_verify_crc(  	for (i = 0; i < ndquots; i++, d++) {  		if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), -				 offsetof(struct xfs_dqblk, dd_crc))) +				 XFS_DQUOT_CRC_OFF))  			return false;  		if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid))  			return false;  	} -  	return true;  } @@ -393,6 +378,11 @@ xfs_dquot_buf_read_verify(  	}  } +/* + * we don't calculate the CRC here as that is done when the dquot is flushed to + * the buffer after the update is done. This ensures that the dquot in the + * buffer always has an up-to-date CRC value. + */  void  xfs_dquot_buf_write_verify(  	struct xfs_buf	*bp) @@ -404,7 +394,6 @@ xfs_dquot_buf_write_verify(  		xfs_buf_ioerror(bp, EFSCORRUPTED);  		return;  	} -	xfs_dquot_buf_calc_crc(mp, bp);  }  const struct xfs_buf_ops xfs_dquot_buf_ops = { @@ -1151,11 +1140,17 @@ xfs_qm_dqflush(  	 * copy the lsn into the on-disk dquot now while we have the in memory  	 * dquot here. This can't be done later in the write verifier as we  	 * can't get access to the log item at that point in time. +	 * +	 * We also calculate the CRC here so that the on-disk dquot in the +	 * buffer always has a valid CRC. This ensures there is no possibility +	 * of a dquot without an up-to-date CRC getting to disk.  	 */  	if (xfs_sb_version_hascrc(&mp->m_sb)) {  		struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp;  		dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); +		xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk), +				 XFS_DQUOT_CRC_OFF);  	}  	/* diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 6dda3f949b0..d0469554539 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -236,6 +236,7 @@ typedef struct xfs_fsop_resblks {  #define XFS_FSOP_GEOM_FLAGS_PROJID32	0x0800  /* 32-bit project IDs	*/  #define XFS_FSOP_GEOM_FLAGS_DIRV2CI	0x1000	/* ASCII only CI names	*/  #define XFS_FSOP_GEOM_FLAGS_LAZYSB	0x4000	/* lazy superblock counters */ +#define XFS_FSOP_GEOM_FLAGS_V5SB	0x8000	/* version 5 superblock */  /* diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index 87595b211da..3c3644ea825 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -99,7 +99,9 @@ xfs_fs_geometry(  			(xfs_sb_version_hasattr2(&mp->m_sb) ?  				XFS_FSOP_GEOM_FLAGS_ATTR2 : 0) |  			(xfs_sb_version_hasprojid32bit(&mp->m_sb) ? -				XFS_FSOP_GEOM_FLAGS_PROJID32 : 0); +				XFS_FSOP_GEOM_FLAGS_PROJID32 : 0) | +			(xfs_sb_version_hascrc(&mp->m_sb) ? +				XFS_FSOP_GEOM_FLAGS_V5SB : 0);  		geo->logsectsize = xfs_sb_version_hassector(&mp->m_sb) ?  				mp->m_sb.sb_logsectsize : BBSIZE;  		geo->rtsectsize = mp->m_sb.sb_blocksize; diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index efbe1accb6c..7f7be5f98f5 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1638,6 +1638,10 @@ xfs_iunlink(  		dip->di_next_unlinked = agi->agi_unlinked[bucket_index];  		offset = ip->i_imap.im_boffset +  			offsetof(xfs_dinode_t, di_next_unlinked); + +		/* need to recalc the inode CRC if appropriate */ +		xfs_dinode_calc_crc(mp, dip); +  		xfs_trans_inode_buf(tp, ibp);  		xfs_trans_log_buf(tp, ibp, offset,  				  (offset + sizeof(xfs_agino_t) - 1)); @@ -1723,6 +1727,10 @@ xfs_iunlink_remove(  			dip->di_next_unlinked = cpu_to_be32(NULLAGINO);  			offset = ip->i_imap.im_boffset +  				offsetof(xfs_dinode_t, di_next_unlinked); + +			/* need to recalc the inode CRC if appropriate */ +			xfs_dinode_calc_crc(mp, dip); +  			xfs_trans_inode_buf(tp, ibp);  			xfs_trans_log_buf(tp, ibp, offset,  					  (offset + sizeof(xfs_agino_t) - 1)); @@ -1796,6 +1804,10 @@ xfs_iunlink_remove(  			dip->di_next_unlinked = cpu_to_be32(NULLAGINO);  			offset = ip->i_imap.im_boffset +  				offsetof(xfs_dinode_t, di_next_unlinked); + +			/* need to recalc the inode CRC if appropriate */ +			xfs_dinode_calc_crc(mp, dip); +  			xfs_trans_inode_buf(tp, ibp);  			xfs_trans_log_buf(tp, ibp, offset,  					  (offset + sizeof(xfs_agino_t) - 1)); @@ -1809,6 +1821,10 @@ xfs_iunlink_remove(  		last_dip->di_next_unlinked = cpu_to_be32(next_agino);  		ASSERT(next_agino != 0);  		offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked); + +		/* need to recalc the inode CRC if appropriate */ +		xfs_dinode_calc_crc(mp, last_dip); +  		xfs_trans_inode_buf(tp, last_ibp);  		xfs_trans_log_buf(tp, last_ibp, offset,  				  (offset + sizeof(xfs_agino_t) - 1)); diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index d82efaa2ac7..ca9ecaa8111 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -455,6 +455,28 @@ xfs_vn_getattr(  	return 0;  } +static void +xfs_setattr_mode( +	struct xfs_trans	*tp, +	struct xfs_inode	*ip, +	struct iattr		*iattr) +{ +	struct inode	*inode = VFS_I(ip); +	umode_t		mode = iattr->ia_mode; + +	ASSERT(tp); +	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + +	if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) +		mode &= ~S_ISGID; + +	ip->i_d.di_mode &= S_IFMT; +	ip->i_d.di_mode |= mode & ~S_IFMT; + +	inode->i_mode &= S_IFMT; +	inode->i_mode |= mode & ~S_IFMT; +} +  int  xfs_setattr_nonsize(  	struct xfs_inode	*ip, @@ -606,18 +628,8 @@ xfs_setattr_nonsize(  	/*  	 * Change file access modes.  	 */ -	if (mask & ATTR_MODE) { -		umode_t mode = iattr->ia_mode; - -		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID)) -			mode &= ~S_ISGID; - -		ip->i_d.di_mode &= S_IFMT; -		ip->i_d.di_mode |= mode & ~S_IFMT; - -		inode->i_mode &= S_IFMT; -		inode->i_mode |= mode & ~S_IFMT; -	} +	if (mask & ATTR_MODE) +		xfs_setattr_mode(tp, ip, iattr);  	/*  	 * Change file access or modified times. @@ -714,9 +726,8 @@ xfs_setattr_size(  		return XFS_ERROR(error);  	ASSERT(S_ISREG(ip->i_d.di_mode)); -	ASSERT((mask & (ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| -			ATTR_MTIME_SET|ATTR_KILL_SUID|ATTR_KILL_SGID| -			ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0); +	ASSERT((mask & (ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_ATIME_SET| +			ATTR_MTIME_SET|ATTR_KILL_PRIV|ATTR_TIMES_SET)) == 0);  	if (!(flags & XFS_ATTR_NOLOCK)) {  		lock_flags |= XFS_IOLOCK_EXCL; @@ -860,6 +871,12 @@ xfs_setattr_size(  		xfs_inode_clear_eofblocks_tag(ip);  	} +	/* +	 * Change file access modes. +	 */ +	if (mask & ATTR_MODE) +		xfs_setattr_mode(tp, ip, iattr); +  	if (mask & ATTR_CTIME) {  		inode->i_ctime = iattr->ia_ctime;  		ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 93f03ec17ee..45a85ff84da 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1599,10 +1599,43 @@ xlog_recover_add_to_trans(  }  /* - * Sort the log items in the transaction. Cancelled buffers need - * to be put first so they are processed before any items that might - * modify the buffers. If they are cancelled, then the modifications - * don't need to be replayed. + * Sort the log items in the transaction. + * + * The ordering constraints are defined by the inode allocation and unlink + * behaviour. The rules are: + * + *	1. Every item is only logged once in a given transaction. Hence it + *	   represents the last logged state of the item. Hence ordering is + *	   dependent on the order in which operations need to be performed so + *	   required initial conditions are always met. + * + *	2. Cancelled buffers are recorded in pass 1 in a separate table and + *	   there's nothing to replay from them so we can simply cull them + *	   from the transaction. However, we can't do that until after we've + *	   replayed all the other items because they may be dependent on the + *	   cancelled buffer and replaying the cancelled buffer can remove it + *	   form the cancelled buffer table. Hence they have tobe done last. + * + *	3. Inode allocation buffers must be replayed before inode items that + *	   read the buffer and replay changes into it. + * + *	4. Inode unlink buffers must be replayed after inode items are replayed. + *	   This ensures that inodes are completely flushed to the inode buffer + *	   in a "free" state before we remove the unlinked inode list pointer. + * + * Hence the ordering needs to be inode allocation buffers first, inode items + * second, inode unlink buffers third and cancelled buffers last. + * + * But there's a problem with that - we can't tell an inode allocation buffer + * apart from a regular buffer, so we can't separate them. We can, however, + * tell an inode unlink buffer from the others, and so we can separate them out + * from all the other buffers and move them to last. + * + * Hence, 4 lists, in order from head to tail: + * 	- buffer_list for all buffers except cancelled/inode unlink buffers + * 	- item_list for all non-buffer items + * 	- inode_buffer_list for inode unlink buffers + * 	- cancel_list for the cancelled buffers   */  STATIC int  xlog_recover_reorder_trans( @@ -1612,6 +1645,10 @@ xlog_recover_reorder_trans(  {  	xlog_recover_item_t	*item, *n;  	LIST_HEAD(sort_list); +	LIST_HEAD(cancel_list); +	LIST_HEAD(buffer_list); +	LIST_HEAD(inode_buffer_list); +	LIST_HEAD(inode_list);  	list_splice_init(&trans->r_itemq, &sort_list);  	list_for_each_entry_safe(item, n, &sort_list, ri_list) { @@ -1619,12 +1656,18 @@ xlog_recover_reorder_trans(  		switch (ITEM_TYPE(item)) {  		case XFS_LI_BUF: -			if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { +			if (buf_f->blf_flags & XFS_BLF_CANCEL) {  				trace_xfs_log_recover_item_reorder_head(log,  							trans, item, pass); -				list_move(&item->ri_list, &trans->r_itemq); +				list_move(&item->ri_list, &cancel_list);  				break;  			} +			if (buf_f->blf_flags & XFS_BLF_INODE_BUF) { +				list_move(&item->ri_list, &inode_buffer_list); +				break; +			} +			list_move_tail(&item->ri_list, &buffer_list); +			break;  		case XFS_LI_INODE:  		case XFS_LI_DQUOT:  		case XFS_LI_QUOTAOFF: @@ -1632,7 +1675,7 @@ xlog_recover_reorder_trans(  		case XFS_LI_EFI:  			trace_xfs_log_recover_item_reorder_tail(log,  							trans, item, pass); -			list_move_tail(&item->ri_list, &trans->r_itemq); +			list_move_tail(&item->ri_list, &inode_list);  			break;  		default:  			xfs_warn(log->l_mp, @@ -1643,6 +1686,14 @@ xlog_recover_reorder_trans(  		}  	}  	ASSERT(list_empty(&sort_list)); +	if (!list_empty(&buffer_list)) +		list_splice(&buffer_list, &trans->r_itemq); +	if (!list_empty(&inode_list)) +		list_splice_tail(&inode_list, &trans->r_itemq); +	if (!list_empty(&inode_buffer_list)) +		list_splice_tail(&inode_buffer_list, &trans->r_itemq); +	if (!list_empty(&cancel_list)) +		list_splice_tail(&cancel_list, &trans->r_itemq);  	return 0;  } @@ -1861,6 +1912,15 @@ xlog_recover_do_inode_buffer(  		buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp,  					      next_unlinked_offset);  		*buffer_nextp = *logged_nextp; + +		/* +		 * If necessary, recalculate the CRC in the on-disk inode. We +		 * have to leave the inode in a consistent state for whoever +		 * reads it next.... +		 */ +		xfs_dinode_calc_crc(mp, (struct xfs_dinode *) +				xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize)); +  	}  	return 0; @@ -2097,6 +2157,17 @@ xlog_recover_do_reg_buffer(  		       ((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT));  		/* +		 * The dirty regions logged in the buffer, even though +		 * contiguous, may span multiple chunks. This is because the +		 * dirty region may span a physical page boundary in a buffer +		 * and hence be split into two separate vectors for writing into +		 * the log. Hence we need to trim nbits back to the length of +		 * the current region being copied out of the log. +		 */ +		if (item->ri_buf[i].i_len < (nbits << XFS_BLF_SHIFT)) +			nbits = item->ri_buf[i].i_len >> XFS_BLF_SHIFT; + +		/*  		 * Do a sanity check if this is a dquot buffer. Just checking  		 * the first dquot in the buffer should do. XXXThis is  		 * probably a good thing to do for other buf types also. @@ -2255,6 +2326,12 @@ xfs_qm_dqcheck(  	d->dd_diskdq.d_flags = type;  	d->dd_diskdq.d_id = cpu_to_be32(id); +	if (xfs_sb_version_hascrc(&mp->m_sb)) { +		uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); +		xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), +				 XFS_DQUOT_CRC_OFF); +	} +  	return errs;  } @@ -2782,6 +2859,10 @@ xlog_recover_dquot_pass2(  	}  	memcpy(ddq, recddq, item->ri_buf[1].i_len); +	if (xfs_sb_version_hascrc(&mp->m_sb)) { +		xfs_update_cksum((char *)ddq, sizeof(struct xfs_dqblk), +				 XFS_DQUOT_CRC_OFF); +	}  	ASSERT(dq_f->qlf_size == 2);  	ASSERT(bp->b_target->bt_mount == mp); diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index f41702b4300..b75c9bb6e71 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -41,6 +41,7 @@  #include "xfs_qm.h"  #include "xfs_trace.h"  #include "xfs_icache.h" +#include "xfs_cksum.h"  /*   * The global quota manager. There is only one of these for the entire @@ -839,7 +840,7 @@ xfs_qm_reset_dqcounts(  	xfs_dqid_t	id,  	uint		type)  { -	xfs_disk_dquot_t	*ddq; +	struct xfs_dqblk	*dqb;  	int			j;  	trace_xfs_reset_dqcounts(bp, _RET_IP_); @@ -853,8 +854,12 @@ xfs_qm_reset_dqcounts(  	do_div(j, sizeof(xfs_dqblk_t));  	ASSERT(mp->m_quotainfo->qi_dqperchunk == j);  #endif -	ddq = bp->b_addr; +	dqb = bp->b_addr;  	for (j = 0; j < mp->m_quotainfo->qi_dqperchunk; j++) { +		struct xfs_disk_dquot	*ddq; + +		ddq = (struct xfs_disk_dquot *)&dqb[j]; +  		/*  		 * Do a sanity check, and if needed, repair the dqblk. Don't  		 * output any warnings because it's perfectly possible to @@ -871,7 +876,12 @@ xfs_qm_reset_dqcounts(  		ddq->d_bwarns = 0;  		ddq->d_iwarns = 0;  		ddq->d_rtbwarns = 0; -		ddq = (xfs_disk_dquot_t *) ((xfs_dqblk_t *)ddq + 1); + +		if (xfs_sb_version_hascrc(&mp->m_sb)) { +			xfs_update_cksum((char *)&dqb[j], +					 sizeof(struct xfs_dqblk), +					 XFS_DQUOT_CRC_OFF); +		}  	}  } @@ -907,19 +917,29 @@ xfs_qm_dqiter_bufs(  			      XFS_FSB_TO_DADDR(mp, bno),  			      mp->m_quotainfo->qi_dqchunklen, 0, &bp,  			      &xfs_dquot_buf_ops); -		if (error) -			break;  		/* -		 * XXX(hch): need to figure out if it makes sense to validate -		 *	     the CRC here. +		 * CRC and validation errors will return a EFSCORRUPTED here. If +		 * this occurs, re-read without CRC validation so that we can +		 * repair the damage via xfs_qm_reset_dqcounts(). This process +		 * will leave a trace in the log indicating corruption has +		 * been detected.  		 */ +		if (error == EFSCORRUPTED) { +			error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, +				      XFS_FSB_TO_DADDR(mp, bno), +				      mp->m_quotainfo->qi_dqchunklen, 0, &bp, +				      NULL); +		} + +		if (error) +			break; +  		xfs_qm_reset_dqcounts(mp, bp, firstid, type);  		xfs_buf_delwri_queue(bp, buffer_list);  		xfs_buf_relse(bp); -		/* -		 * goto the next block. -		 */ + +		/* goto the next block. */  		bno++;  		firstid += mp->m_quotainfo->qi_dqperchunk;  	} diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index c41190cad6e..6cdf6ffc36a 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -489,31 +489,36 @@ xfs_qm_scall_setqlim(  	if ((newlim->d_fieldmask & XFS_DQ_MASK) == 0)  		return 0; -	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); -	error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), -				  0, 0, XFS_DEFAULT_LOG_COUNT); -	if (error) { -		xfs_trans_cancel(tp, 0); -		return (error); -	} -  	/*  	 * We don't want to race with a quotaoff so take the quotaoff lock. -	 * (We don't hold an inode lock, so there's nothing else to stop -	 * a quotaoff from happening). (XXXThis doesn't currently happen -	 * because we take the vfslock before calling xfs_qm_sysent). +	 * We don't hold an inode lock, so there's nothing else to stop +	 * a quotaoff from happening.  	 */  	mutex_lock(&q->qi_quotaofflock);  	/* -	 * Get the dquot (locked), and join it to the transaction. -	 * Allocate the dquot if this doesn't exist. +	 * Get the dquot (locked) before we start, as we need to do a +	 * transaction to allocate it if it doesn't exist. Once we have the +	 * dquot, unlock it so we can start the next transaction safely. We hold +	 * a reference to the dquot, so it's safe to do this unlock/lock without +	 * it being reclaimed in the mean time.  	 */ -	if ((error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp))) { -		xfs_trans_cancel(tp, XFS_TRANS_ABORT); +	error = xfs_qm_dqget(mp, NULL, id, type, XFS_QMOPT_DQALLOC, &dqp); +	if (error) {  		ASSERT(error != ENOENT);  		goto out_unlock;  	} +	xfs_dqunlock(dqp); + +	tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SETQLIM); +	error = xfs_trans_reserve(tp, 0, XFS_QM_SETQLIM_LOG_RES(mp), +				  0, 0, XFS_DEFAULT_LOG_COUNT); +	if (error) { +		xfs_trans_cancel(tp, 0); +		goto out_rele; +	} + +	xfs_dqlock(dqp);  	xfs_trans_dqjoin(tp, dqp);  	ddq = &dqp->q_core; @@ -621,9 +626,10 @@ xfs_qm_scall_setqlim(  	xfs_trans_log_dquot(tp, dqp);  	error = xfs_trans_commit(tp, 0); -	xfs_qm_dqrele(dqp); - out_unlock: +out_rele: +	xfs_qm_dqrele(dqp); +out_unlock:  	mutex_unlock(&q->qi_quotaofflock);  	return error;  } diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index c61e31c7d99..c38068f26c5 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h @@ -87,6 +87,8 @@ typedef struct xfs_dqblk {  	uuid_t		  dd_uuid;	/* location information */  } xfs_dqblk_t; +#define XFS_DQUOT_CRC_OFF	offsetof(struct xfs_dqblk, dd_crc) +  /*   * flags for q_flags field in the dquot.   */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ea341cea68c..3033ba5e976 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1373,6 +1373,17 @@ xfs_finish_flags(  	}  	/* +	 * V5 filesystems always use attr2 format for attributes. +	 */ +	if (xfs_sb_version_hascrc(&mp->m_sb) && +	    (mp->m_flags & XFS_MOUNT_NOATTR2)) { +		xfs_warn(mp, +"Cannot mount a V5 filesystem as %s. %s is always enabled for V5 filesystems.", +			MNTOPT_NOATTR2, MNTOPT_ATTR2); +		return XFS_ERROR(EINVAL); +	} + +	/*  	 * mkfs'ed attr2 will turn on attr2 mount unless explicitly  	 * told by noattr2 to turn it off  	 */ diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 5f234389327..195a403e152 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -56,16 +56,9 @@ xfs_symlink_blocks(  	struct xfs_mount *mp,  	int		pathlen)  { -	int		fsblocks = 0; -	int		len = pathlen; +	int buflen = XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); -	do { -		fsblocks++; -		len -= XFS_SYMLINK_BUF_SPACE(mp, mp->m_sb.sb_blocksize); -	} while (len > 0); - -	ASSERT(fsblocks <= XFS_SYMLINK_MAPS); -	return fsblocks; +	return (pathlen + buflen - 1) / buflen;  }  static int @@ -405,7 +398,7 @@ xfs_symlink(  	if (pathlen <= XFS_LITINO(mp, dp->i_d.di_version))  		fs_blocks = 0;  	else -		fs_blocks = XFS_B_TO_FSB(mp, pathlen); +		fs_blocks = xfs_symlink_blocks(mp, pathlen);  	resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);  	error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,  			XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT); @@ -512,7 +505,7 @@ xfs_symlink(  		cur_chunk = target_path;  		offset = 0;  		for (n = 0; n < nmaps; n++) { -			char *buf; +			char	*buf;  			d = XFS_FSB_TO_DADDR(mp, mval[n].br_startblock);  			byte_cnt = XFS_FSB_TO_B(mp, mval[n].br_blockcount); @@ -525,9 +518,7 @@ xfs_symlink(  			bp->b_ops = &xfs_symlink_buf_ops;  			byte_cnt = XFS_SYMLINK_BUF_SPACE(mp, byte_cnt); -			if (pathlen < byte_cnt) { -				byte_cnt = pathlen; -			} +			byte_cnt = min(byte_cnt, pathlen);  			buf = bp->b_addr;  			buf += xfs_symlink_hdr_set(mp, ip->i_ino, offset, @@ -542,6 +533,7 @@ xfs_symlink(  			xfs_trans_log_buf(tp, bp, 0, (buf + byte_cnt - 1) -  							(char *)bp->b_addr);  		} +		ASSERT(pathlen == 0);  	}  	/* diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index ac9da00e9f2..d5afe96adba 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h @@ -343,8 +343,12 @@ extern void ioport_unmap(void __iomem *p);  #endif /* CONFIG_GENERIC_IOMAP */  #endif /* CONFIG_HAS_IOPORT */ +#ifndef xlate_dev_kmem_ptr  #define xlate_dev_kmem_ptr(p)	p +#endif +#ifndef xlate_dev_mem_ptr  #define xlate_dev_mem_ptr(p)	__va(p) +#endif  #ifdef CONFIG_VIRT_TO_BUS  #ifndef virt_to_bus diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index b1b1fa6ffff..13821c339a4 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h @@ -97,11 +97,9 @@ struct mmu_gather {  	unsigned long		start;  	unsigned long		end;  	unsigned int		need_flush : 1,	/* Did free PTEs */ -				fast_mode  : 1; /* No batching   */ -  	/* we are in the middle of an operation to clear  	 * a full mm and can make some optimizations */ -	unsigned int		fullmm : 1, +				fullmm : 1,  	/* we have performed an operation which  	 * requires a complete flush of the tlb */  				need_flush_all : 1; @@ -114,19 +112,6 @@ struct mmu_gather {  #define HAVE_GENERIC_MMU_GATHER -static inline int tlb_fast_mode(struct mmu_gather *tlb) -{ -#ifdef CONFIG_SMP -	return tlb->fast_mode; -#else -	/* -	 * For UP we don't need to worry about TLB flush -	 * and page free order so much.. -	 */ -	return 1; -#endif -} -  void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm);  void tlb_flush_mmu(struct mmu_gather *tlb);  void tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, diff --git a/include/linux/aer.h b/include/linux/aer.h index ec10e1b24c1..737f90ab4b6 100644 --- a/include/linux/aer.h +++ b/include/linux/aer.h @@ -49,10 +49,11 @@ static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)  }  #endif -extern void cper_print_aer(const char *prefix, struct pci_dev *dev, +extern void cper_print_aer(struct pci_dev *dev,  			   int cper_severity, struct aer_capability_regs *aer);  extern int cper_severity_to_aer(int cper_severity);  extern void aer_recover_queue(int domain, unsigned int bus, unsigned int devfn, -			      int severity); +			      int severity, +			      struct aer_capability_regs *aer_regs);  #endif //_AER_H_ diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 5047355b9a0..8bda1294c03 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -707,7 +707,7 @@ struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos);   *   * If a subsystem synchronizes against the parent in its ->css_online() and   * before starting iterating, and synchronizes against @pos on each - * iteration, any descendant cgroup which finished ->css_offline() is + * iteration, any descendant cgroup which finished ->css_online() is   * guaranteed to be visible in the future iterations.   *   * In other words, the following guarantees that a descendant can't escape diff --git a/include/linux/list.h b/include/linux/list.h index 6a1f8df9144..b83e5657365 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -362,6 +362,17 @@ static inline void list_splice_tail_init(struct list_head *list,  	list_entry((ptr)->next, type, member)  /** + * list_first_entry_or_null - get the first element from a list + * @ptr:	the list head to take the element from. + * @type:	the type of the struct this is embedded in. + * @member:	the name of the list_struct within the struct. + * + * Note that if the list is empty, it returns NULL. + */ +#define list_first_entry_or_null(ptr, type, member) \ +	(!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) + +/**   * list_for_each	-	iterate over a list   * @pos:	the &struct list_head to use as a loop cursor.   * @head:	the head for your list. diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index 98ffb54988b..2d4df6ce043 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h @@ -17,6 +17,22 @@ extern __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook,  extern int ipv6_netfilter_init(void);  extern void ipv6_netfilter_fini(void); + +/* + * Hook functions for ipv6 to allow xt_* modules to be built-in even + * if IPv6 is a module. + */ +struct nf_ipv6_ops { +	int (*chk_addr)(struct net *net, const struct in6_addr *addr, +			const struct net_device *dev, int strict); +}; + +extern const struct nf_ipv6_ops __rcu *nf_ipv6_ops; +static inline const struct nf_ipv6_ops *nf_get_ipv6_ops(void) +{ +	return rcu_dereference(nf_ipv6_ops); +} +  #else /* CONFIG_NETFILTER */  static inline int ipv6_netfilter_init(void) { return 0; }  static inline void ipv6_netfilter_fini(void) { return; } diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 8089e35d47a..f4b1001a467 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h @@ -461,6 +461,26 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev,  			&(pos)->member)), typeof(*(pos)), member))  /** + * hlist_for_each_entry_rcu_notrace - iterate over rcu list of given type (for tracing) + * @pos:	the type * to use as a loop cursor. + * @head:	the head for your list. + * @member:	the name of the hlist_node within the struct. + * + * This list-traversal primitive may safely run concurrently with + * the _rcu list-mutation primitives such as hlist_add_head_rcu() + * as long as the traversal is guarded by rcu_read_lock(). + * + * This is the same as hlist_for_each_entry_rcu() except that it does + * not do any RCU debugging or tracing. + */ +#define hlist_for_each_entry_rcu_notrace(pos, head, member)			\ +	for (pos = hlist_entry_safe (rcu_dereference_raw_notrace(hlist_first_rcu(head)),\ +			typeof(*(pos)), member);			\ +		pos;							\ +		pos = hlist_entry_safe(rcu_dereference_raw_notrace(hlist_next_rcu(\ +			&(pos)->member)), typeof(*(pos)), member)) + +/**   * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type   * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list. diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h index 2ae13714828..1c33dd7da4a 100644 --- a/include/linux/rculist_nulls.h +++ b/include/linux/rculist_nulls.h @@ -105,9 +105,14 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n,   * @head:	the head for your list.   * @member:	the name of the hlist_nulls_node within the struct.   * + * The barrier() is needed to make sure compiler doesn't cache first element [1], + * as this loop can be restarted [2] + * [1] Documentation/atomic_ops.txt around line 114 + * [2] Documentation/RCU/rculist_nulls.txt around line 146   */  #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member)			\ -	for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head));		\ +	for (({barrier();}),							\ +	     pos = rcu_dereference_raw(hlist_nulls_first_rcu(head));		\  		(!is_a_nulls(pos)) &&						\  		({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \  		pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos))) diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 4ccd68e49b0..ddcc7826d90 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h @@ -640,6 +640,15 @@ static inline void rcu_preempt_sleep_check(void)  #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ +/* + * The tracing infrastructure traces RCU (we want that), but unfortunately + * some of the RCU checks causes tracing to lock up the system. + * + * The tracing version of rcu_dereference_raw() must not call + * rcu_read_lock_held(). + */ +#define rcu_dereference_raw_notrace(p) __rcu_dereference_check((p), 1, __rcu) +  /**   * rcu_access_index() - fetch RCU index with no dereferencing   * @p: The index to read diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 2e0ced1af3b..9c676eae396 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -2852,6 +2852,21 @@ static inline int skb_tnl_header_len(const struct sk_buff *inner_skb)  		SKB_GSO_CB(inner_skb)->mac_offset;  } +static inline int gso_pskb_expand_head(struct sk_buff *skb, int extra) +{ +	int new_headroom, headroom; +	int ret; + +	headroom = skb_headroom(skb); +	ret = pskb_expand_head(skb, extra, 0, GFP_ATOMIC); +	if (ret) +		return ret; + +	new_headroom = skb_headroom(skb); +	SKB_GSO_CB(skb)->mac_offset += (new_headroom - headroom); +	return 0; +} +  static inline bool skb_is_gso(const struct sk_buff *skb)  {  	return skb_shinfo(skb)->gso_size; diff --git a/include/linux/socket.h b/include/linux/socket.h index 33bf2dfab19..b10ce4b341e 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -320,6 +320,9 @@ extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data);  struct timespec; +/* The __sys_...msg variants allow MSG_CMSG_COMPAT */ +extern long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); +extern long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags);  extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  			  unsigned int flags, struct timespec *timeout);  extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 84a6440f1f1..21f702704f2 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -65,7 +65,7 @@ extern int			addrconf_set_dstaddr(struct net *net,  extern int			ipv6_chk_addr(struct net *net,  					      const struct in6_addr *addr, -					      struct net_device *dev, +					      const struct net_device *dev,  					      int strict);  #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index f10818fc880..e7f4e21cc3e 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h @@ -679,22 +679,26 @@ static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask,  #endif  struct psched_ratecfg { -	u64 rate_bps; -	u32 mult; -	u32 shift; +	u64	rate_bps; +	u32	mult; +	u16	overhead; +	u8	shift;  };  static inline u64 psched_l2t_ns(const struct psched_ratecfg *r,  				unsigned int len)  { -	return ((u64)len * r->mult) >> r->shift; +	return ((u64)(len + r->overhead) * r->mult) >> r->shift;  } -extern void psched_ratecfg_precompute(struct psched_ratecfg *r, u32 rate); +extern void psched_ratecfg_precompute(struct psched_ratecfg *r, const struct tc_ratespec *conf); -static inline u32 psched_ratecfg_getrate(const struct psched_ratecfg *r) +static inline void psched_ratecfg_getrate(struct tc_ratespec *res, +					  const struct psched_ratecfg *r)  { -	return r->rate_bps >> 3; +	memset(res, 0, sizeof(*res)); +	res->rate = r->rate_bps >> 3; +	res->overhead = r->overhead;  }  #endif diff --git a/include/net/xfrm.h b/include/net/xfrm.h index ae16531d0d3..94ce082b29d 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h @@ -1160,6 +1160,8 @@ static inline void xfrm_sk_free_policy(struct sock *sk)  	}  } +extern void xfrm_garbage_collect(struct net *net); +  #else  static inline void xfrm_sk_free_policy(struct sock *sk) {} @@ -1194,6 +1196,9 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir,  {  	return 1;  } +static inline void xfrm_garbage_collect(struct net *net) +{ +}  #endif  static __inline__ diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index e773dfa5f98..4ea4f985f39 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -543,6 +543,7 @@ struct se_session {  	struct list_head	sess_list;  	struct list_head	sess_acl_list;  	struct list_head	sess_cmd_list; +	struct list_head	sess_wait_list;  	spinlock_t		sess_cmd_lock;  	struct kref		sess_kref;  }; diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index ba3471b73c0..1dcce9cc99b 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h @@ -114,7 +114,7 @@ sense_reason_t	transport_generic_new_cmd(struct se_cmd *);  void	target_execute_cmd(struct se_cmd *cmd); -void	transport_generic_free_cmd(struct se_cmd *, int); +int	transport_generic_free_cmd(struct se_cmd *, int);  bool	transport_wait_for_tasks(struct se_cmd *);  int	transport_check_aborted_status(struct se_cmd *, int); @@ -123,7 +123,7 @@ int	transport_send_check_condition_and_sense(struct se_cmd *,  int	target_get_sess_cmd(struct se_session *, struct se_cmd *, bool);  int	target_put_sess_cmd(struct se_session *, struct se_cmd *);  void	target_sess_cmd_list_set_waiting(struct se_session *); -void	target_wait_for_sess_cmds(struct se_session *, int); +void	target_wait_for_sess_cmds(struct se_session *);  int	core_alua_check_nonop_delay(struct se_cmd *); diff --git a/include/video/omapdss.h b/include/video/omapdss.h index 62ca9a77c1d..aeb4e9a0c5d 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -748,6 +748,7 @@ struct omap_dss_driver {  };  enum omapdss_version omapdss_get_version(void); +bool omapdss_is_initialized(void);  int omap_dss_register_driver(struct omap_dss_driver *);  void omap_dss_unregister_driver(struct omap_dss_driver *); diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h index 0a7515c1e3a..569c07f2e34 100644 --- a/include/xen/xenbus.h +++ b/include/xen/xenbus.h @@ -70,6 +70,7 @@ struct xenbus_device {  	struct device dev;  	enum xenbus_state state;  	struct completion down; +	struct work_struct work;  };  static inline struct xenbus_device *to_xenbus_device(struct device *dev) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 2a9926275f8..a7c9e6ddb97 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1686,11 +1686,14 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type,  		 */  		cgroup_drop_root(opts.new_root); -		if (((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) && -		    root->flags != opts.flags) { -			pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); -			ret = -EINVAL; -			goto drop_new_super; +		if (root->flags != opts.flags) { +			if ((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) { +				pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); +				ret = -EINVAL; +				goto drop_new_super; +			} else { +				pr_warning("cgroup: new mount options do not match the existing superblock, will be ignored\n"); +			}  		}  		/* no subsys rebinding, so refcounts don't change */ @@ -2699,13 +2702,14 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys,  		goto out;  	} +	cfe->type = (void *)cft; +	cfe->dentry = dentry; +	dentry->d_fsdata = cfe; +	simple_xattrs_init(&cfe->xattrs); +  	mode = cgroup_file_mode(cft);  	error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb);  	if (!error) { -		cfe->type = (void *)cft; -		cfe->dentry = dentry; -		dentry->d_fsdata = cfe; -		simple_xattrs_init(&cfe->xattrs);  		list_add_tail(&cfe->node, &parent->files);  		cfe = NULL;  	} @@ -2953,11 +2957,8 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,  	WARN_ON_ONCE(!rcu_read_lock_held());  	/* if first iteration, pretend we just visited @cgroup */ -	if (!pos) { -		if (list_empty(&cgroup->children)) -			return NULL; +	if (!pos)  		pos = cgroup; -	}  	/* visit the first child if exists */  	next = list_first_or_null_rcu(&pos->children, struct cgroup, sibling); @@ -2965,14 +2966,14 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos,  		return next;  	/* no child, visit my or the closest ancestor's next sibling */ -	do { +	while (pos != cgroup) {  		next = list_entry_rcu(pos->sibling.next, struct cgroup,  				      sibling);  		if (&next->sibling != &pos->parent->children)  			return next;  		pos = pos->parent; -	} while (pos != cgroup); +	}  	return NULL;  } diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 5a83dde8ca0..54a4d522323 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -143,7 +143,10 @@ static unsigned int irq_domain_legacy_revmap(struct irq_domain *domain,   * irq_domain_add_simple() - Allocate and register a simple irq_domain.   * @of_node: pointer to interrupt controller's device tree node.   * @size: total number of irqs in mapping - * @first_irq: first number of irq block assigned to the domain + * @first_irq: first number of irq block assigned to the domain, + *	pass zero to assign irqs on-the-fly. This will result in a + *	linear IRQ domain so it is important to use irq_create_mapping() + *	for each used IRQ, especially when SPARSE_IRQ is enabled.   * @ops: map/unmap domain callbacks   * @host_data: Controller private data pointer   * @@ -191,6 +194,7 @@ struct irq_domain *irq_domain_add_simple(struct device_node *of_node,  	/* A linear domain is the default */  	return irq_domain_add_linear(of_node, size, ops, host_data);  } +EXPORT_SYMBOL_GPL(irq_domain_add_simple);  /**   * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. @@ -397,11 +401,12 @@ static void irq_domain_disassociate_many(struct irq_domain *domain,  	while (count--) {  		int irq = irq_base + count;  		struct irq_data *irq_data = irq_get_irq_data(irq); -		irq_hw_number_t hwirq = irq_data->hwirq; +		irq_hw_number_t hwirq;  		if (WARN_ON(!irq_data || irq_data->domain != domain))  			continue; +		hwirq = irq_data->hwirq;  		irq_set_status_flags(irq, IRQ_NOREQUEST);  		/* remove chip and handler */ diff --git a/kernel/range.c b/kernel/range.c index 071b0ab455c..eb911dbce26 100644 --- a/kernel/range.c +++ b/kernel/range.c @@ -48,9 +48,11 @@ int add_range_with_merge(struct range *range, int az, int nr_range,  		final_start = min(range[i].start, start);  		final_end = max(range[i].end, end); -		range[i].start = final_start; -		range[i].end =  final_end; -		return nr_range; +		/* clear it and add it back for further merge */ +		range[i].start = 0; +		range[i].end =  0; +		return add_range_with_merge(range, az, nr_range, +			final_start, final_end);  	}  	/* Need to add it: */ diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index b549b0f5b97..6c508ff33c6 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -120,22 +120,22 @@ static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip);  /*   * Traverse the ftrace_global_list, invoking all entries.  The reason that we - * can use rcu_dereference_raw() is that elements removed from this list + * can use rcu_dereference_raw_notrace() is that elements removed from this list   * are simply leaked, so there is no need to interact with a grace-period - * mechanism.  The rcu_dereference_raw() calls are needed to handle + * mechanism.  The rcu_dereference_raw_notrace() calls are needed to handle   * concurrent insertions into the ftrace_global_list.   *   * Silly Alpha and silly pointer-speculation compiler optimizations!   */  #define do_for_each_ftrace_op(op, list)			\ -	op = rcu_dereference_raw(list);			\ +	op = rcu_dereference_raw_notrace(list);			\  	do  /*   * Optimized for just a single item in the list (as that is the normal case).   */  #define while_for_each_ftrace_op(op)				\ -	while (likely(op = rcu_dereference_raw((op)->next)) &&	\ +	while (likely(op = rcu_dereference_raw_notrace((op)->next)) &&	\  	       unlikely((op) != &ftrace_list_end))  static inline void ftrace_ops_init(struct ftrace_ops *ops) @@ -779,7 +779,7 @@ ftrace_find_profiled_func(struct ftrace_profile_stat *stat, unsigned long ip)  	if (hlist_empty(hhd))  		return NULL; -	hlist_for_each_entry_rcu(rec, hhd, node) { +	hlist_for_each_entry_rcu_notrace(rec, hhd, node) {  		if (rec->ip == ip)  			return rec;  	} @@ -1165,7 +1165,7 @@ ftrace_lookup_ip(struct ftrace_hash *hash, unsigned long ip)  	hhd = &hash->buckets[key]; -	hlist_for_each_entry_rcu(entry, hhd, hlist) { +	hlist_for_each_entry_rcu_notrace(entry, hhd, hlist) {  		if (entry->ip == ip)  			return entry;  	} @@ -1422,8 +1422,8 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip)  	struct ftrace_hash *notrace_hash;  	int ret; -	filter_hash = rcu_dereference_raw(ops->filter_hash); -	notrace_hash = rcu_dereference_raw(ops->notrace_hash); +	filter_hash = rcu_dereference_raw_notrace(ops->filter_hash); +	notrace_hash = rcu_dereference_raw_notrace(ops->notrace_hash);  	if ((ftrace_hash_empty(filter_hash) ||  	     ftrace_lookup_ip(filter_hash, ip)) && @@ -2920,7 +2920,7 @@ static void function_trace_probe_call(unsigned long ip, unsigned long parent_ip,  	 * on the hash. rcu_read_lock is too dangerous here.  	 */  	preempt_disable_notrace(); -	hlist_for_each_entry_rcu(entry, hhd, node) { +	hlist_for_each_entry_rcu_notrace(entry, hhd, node) {  		if (entry->ip == ip)  			entry->ops->func(ip, parent_ip, &entry->data);  	} diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index b59aea2c48c..e444ff88f0a 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -620,6 +620,9 @@ int ring_buffer_poll_wait(struct ring_buffer *buffer, int cpu,  	if (cpu == RING_BUFFER_ALL_CPUS)  		work = &buffer->irq_work;  	else { +		if (!cpumask_test_cpu(cpu, buffer->cpumask)) +			return -EINVAL; +  		cpu_buffer = buffer->buffers[cpu];  		work = &cpu_buffer->irq_work;  	} diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index ae6fa2d1cdf..1a41023a1f8 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -843,7 +843,15 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)  	memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN);  	max_data->pid = tsk->pid; -	max_data->uid = task_uid(tsk); +	/* +	 * If tsk == current, then use current_uid(), as that does not use +	 * RCU. The irq tracer can be called out of RCU scope. +	 */ +	if (tsk == current) +		max_data->uid = current_uid(); +	else +		max_data->uid = task_uid(tsk); +  	max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO;  	max_data->policy = tsk->policy;  	max_data->rt_priority = tsk->rt_priority; @@ -6216,10 +6224,15 @@ __init static int tracer_alloc_buffers(void)  	trace_init_cmdlines(); -	register_tracer(&nop_trace); - +	/* +	 * register_tracer() might reference current_trace, so it +	 * needs to be set before we register anything. This is +	 * just a bootstrap of current_trace anyway. +	 */  	global_trace.current_trace = &nop_trace; +	register_tracer(&nop_trace); +  	/* All seems OK, enable tracing */  	tracing_disabled = 0; diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 55e2cf66967..2901e3b8859 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -1159,7 +1159,7 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr)  	/* stop the tracing. */  	tracing_stop();  	/* check the trace buffer */ -	ret = trace_test_buffer(tr, &count); +	ret = trace_test_buffer(&tr->trace_buffer, &count);  	trace->reset(tr);  	tracing_start(); diff --git a/mm/memory.c b/mm/memory.c index 6dc1882fbd7..61a262b08e5 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -220,7 +220,6 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm)  	tlb->start	= -1UL;  	tlb->end	= 0;  	tlb->need_flush = 0; -	tlb->fast_mode  = (num_possible_cpus() == 1);  	tlb->local.next = NULL;  	tlb->local.nr   = 0;  	tlb->local.max  = ARRAY_SIZE(tlb->__pages); @@ -244,9 +243,6 @@ void tlb_flush_mmu(struct mmu_gather *tlb)  	tlb_table_flush(tlb);  #endif -	if (tlb_fast_mode(tlb)) -		return; -  	for (batch = &tlb->local; batch; batch = batch->next) {  		free_pages_and_swap_cache(batch->pages, batch->nr);  		batch->nr = 0; @@ -288,11 +284,6 @@ int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)  	VM_BUG_ON(!tlb->need_flush); -	if (tlb_fast_mode(tlb)) { -		free_page_and_swap_cache(page); -		return 1; /* avoid calling tlb_flush_mmu() */ -	} -  	batch = tlb->active;  	batch->pages[batch->nr++] = page;  	if (batch->nr == batch->max) { diff --git a/net/compat.c b/net/compat.c index 79ae8848500..f0a1ba6c808 100644 --- a/net/compat.c +++ b/net/compat.c @@ -734,19 +734,25 @@ static unsigned char nas[21] = {  asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)  { -	return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);  }  asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,  				    unsigned int vlen, unsigned int flags)  { +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL;  	return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,  			      flags | MSG_CMSG_COMPAT);  }  asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags)  { -	return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT);  }  asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, unsigned int flags) @@ -768,6 +774,9 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,  	int datagrams;  	struct timespec ktspec; +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +  	if (COMPAT_USE_64BIT_TIME)  		return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen,  				      flags | MSG_CMSG_COMPAT, diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index c013f38482a..6cda4e2c213 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c @@ -39,6 +39,7 @@ static int __hw_addr_create_ex(struct netdev_hw_addr_list *list,  	ha->refcount = 1;  	ha->global_use = global;  	ha->synced = sync; +	ha->sync_cnt = 0;  	list_add_tail_rcu(&ha->list, &list->list);  	list->count++; @@ -66,7 +67,7 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list,  			}  			if (sync) {  				if (ha->synced) -					return 0; +					return -EEXIST;  				else  					ha->synced = true;  			} @@ -139,10 +140,13 @@ static int __hw_addr_sync_one(struct netdev_hw_addr_list *to_list,  	err = __hw_addr_add_ex(to_list, ha->addr, addr_len, ha->type,  			       false, true); -	if (err) +	if (err && err != -EEXIST)  		return err; -	ha->sync_cnt++; -	ha->refcount++; + +	if (!err) { +		ha->sync_cnt++; +		ha->refcount++; +	}  	return 0;  } @@ -159,7 +163,8 @@ static void __hw_addr_unsync_one(struct netdev_hw_addr_list *to_list,  	if (err)  		return;  	ha->sync_cnt--; -	__hw_addr_del_entry(from_list, ha, false, true); +	/* address on from list is not marked synced */ +	__hw_addr_del_entry(from_list, ha, false, false);  }  static int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, @@ -796,7 +801,7 @@ int dev_mc_sync_multiple(struct net_device *to, struct net_device *from)  		return -EINVAL;  	netif_addr_lock_nested(to); -	err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len); +	err = __hw_addr_sync_multiple(&to->mc, &from->mc, to->addr_len);  	if (!err)  		__dev_set_rx_mode(to);  	netif_addr_unlock(to); diff --git a/net/core/skbuff.c b/net/core/skbuff.c index af9185d0be6..cfd777bd6bd 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -195,7 +195,7 @@ struct sk_buff *__alloc_skb_head(gfp_t gfp_mask, int node)  	 * the tail pointer in struct sk_buff!  	 */  	memset(skb, 0, offsetof(struct sk_buff, tail)); -	skb->data = NULL; +	skb->head = NULL;  	skb->truesize = sizeof(struct sk_buff);  	atomic_set(&skb->users, 1); @@ -611,7 +611,7 @@ static void skb_release_head_state(struct sk_buff *skb)  static void skb_release_all(struct sk_buff *skb)  {  	skb_release_head_state(skb); -	if (likely(skb->data)) +	if (likely(skb->head))  		skb_release_data(skb);  } diff --git a/net/core/sock.c b/net/core/sock.c index 6ba327da79e..88868a9d21d 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -210,7 +210,7 @@ static const char *const af_family_key_strings[AF_MAX+1] = {    "sk_lock-AF_TIPC"  , "sk_lock-AF_BLUETOOTH", "sk_lock-IUCV"        ,    "sk_lock-AF_RXRPC" , "sk_lock-AF_ISDN"     , "sk_lock-AF_PHONET"   ,    "sk_lock-AF_IEEE802154", "sk_lock-AF_CAIF" , "sk_lock-AF_ALG"      , -  "sk_lock-AF_NFC"   , "sk_lock-AF_MAX" +  "sk_lock-AF_NFC"   , "sk_lock-AF_VSOCK"    , "sk_lock-AF_MAX"  };  static const char *const af_family_slock_key_strings[AF_MAX+1] = {    "slock-AF_UNSPEC", "slock-AF_UNIX"     , "slock-AF_INET"     , @@ -226,7 +226,7 @@ static const char *const af_family_slock_key_strings[AF_MAX+1] = {    "slock-AF_TIPC"  , "slock-AF_BLUETOOTH", "slock-AF_IUCV"     ,    "slock-AF_RXRPC" , "slock-AF_ISDN"     , "slock-AF_PHONET"   ,    "slock-AF_IEEE802154", "slock-AF_CAIF" , "slock-AF_ALG"      , -  "slock-AF_NFC"   , "slock-AF_MAX" +  "slock-AF_NFC"   , "slock-AF_VSOCK"    ,"slock-AF_MAX"  };  static const char *const af_family_clock_key_strings[AF_MAX+1] = {    "clock-AF_UNSPEC", "clock-AF_UNIX"     , "clock-AF_INET"     , @@ -242,7 +242,7 @@ static const char *const af_family_clock_key_strings[AF_MAX+1] = {    "clock-AF_TIPC"  , "clock-AF_BLUETOOTH", "clock-AF_IUCV"     ,    "clock-AF_RXRPC" , "clock-AF_ISDN"     , "clock-AF_PHONET"   ,    "clock-AF_IEEE802154", "clock-AF_CAIF" , "clock-AF_ALG"      , -  "clock-AF_NFC"   , "clock-AF_MAX" +  "clock-AF_NFC"   , "clock-AF_VSOCK"    , "clock-AF_MAX"  };  /* diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index e4147ec1665..be2f8da0ae8 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -503,6 +503,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,  	inner_iph = (const struct iphdr *)skb_inner_network_header(skb); +	memset(IPCB(skb), 0, sizeof(*IPCB(skb)));  	dst = tnl_params->daddr;  	if (dst == 0) {  		/* NBMA tunnel */ @@ -658,7 +659,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev,  	skb_dst_drop(skb);  	skb_dst_set(skb, &rt->dst); -	memset(IPCB(skb), 0, sizeof(*IPCB(skb)));  	/* Push down and install the IP header. */  	skb_push(skb, sizeof(struct iphdr)); diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index cf08218ddbc..ff4b781b105 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c @@ -231,8 +231,10 @@ static void ipt_ulog_packet(struct net *net,  	put_unaligned(tv.tv_usec, &pm->timestamp_usec);  	put_unaligned(skb->mark, &pm->mark);  	pm->hook = hooknum; -	if (prefix != NULL) -		strncpy(pm->prefix, prefix, sizeof(pm->prefix)); +	if (prefix != NULL) { +		strncpy(pm->prefix, prefix, sizeof(pm->prefix) - 1); +		pm->prefix[sizeof(pm->prefix) - 1] = '\0'; +	}  	else if (loginfo->prefix[0] != '\0')  		strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix));  	else diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 550781a17b3..d35bbf0cf40 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -737,10 +737,15 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buf  {  	struct rtable *rt;  	struct flowi4 fl4; +	const struct iphdr *iph = (const struct iphdr *) skb->data; +	int oif = skb->dev->ifindex; +	u8 tos = RT_TOS(iph->tos); +	u8 prot = iph->protocol; +	u32 mark = skb->mark;  	rt = (struct rtable *) dst; -	ip_rt_build_flow_key(&fl4, sk, skb); +	__build_flow_key(&fl4, sk, iph, oif, tos, prot, mark, 0);  	__ip_do_redirect(rt, skb, &fl4, true);  } diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d1ab6ab29a5..1bbf744c2cc 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -1487,7 +1487,7 @@ static int ipv6_count_addresses(struct inet6_dev *idev)  }  int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, -		  struct net_device *dev, int strict) +		  const struct net_device *dev, int strict)  {  	struct inet6_ifaddr *ifp;  	unsigned int hash = inet6_addr_hash(addr); @@ -2658,8 +2658,10 @@ static void init_loopback(struct net_device *dev)  			sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0);  			/* Failure cases are ignored */ -			if (!IS_ERR(sp_rt)) +			if (!IS_ERR(sp_rt)) { +				sp_ifa->rt = sp_rt;  				ip6_ins_rt(sp_rt); +			}  		}  		read_unlock_bh(&idev->lock);  	} diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 72836f40b73..95f3f1da0d7 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c @@ -10,6 +10,7 @@  #include <linux/netfilter.h>  #include <linux/netfilter_ipv6.h>  #include <linux/export.h> +#include <net/addrconf.h>  #include <net/dst.h>  #include <net/ipv6.h>  #include <net/ip6_route.h> @@ -186,6 +187,10 @@ static __sum16 nf_ip6_checksum_partial(struct sk_buff *skb, unsigned int hook,  	return csum;  }; +static const struct nf_ipv6_ops ipv6ops = { +	.chk_addr	= ipv6_chk_addr, +}; +  static const struct nf_afinfo nf_ip6_afinfo = {  	.family			= AF_INET6,  	.checksum		= nf_ip6_checksum, @@ -198,6 +203,7 @@ static const struct nf_afinfo nf_ip6_afinfo = {  int __init ipv6_netfilter_init(void)  { +	RCU_INIT_POINTER(nf_ipv6_ops, &ipv6ops);  	return nf_register_afinfo(&nf_ip6_afinfo);  } @@ -206,5 +212,6 @@ int __init ipv6_netfilter_init(void)   */  void ipv6_netfilter_fini(void)  { +	RCU_INIT_POINTER(nf_ipv6_ops, NULL);  	nf_unregister_afinfo(&nf_ip6_afinfo);  } diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index f3c1ff4357f..51c3285b5d9 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c @@ -90,7 +90,7 @@ static const struct snmp_mib snmp6_ipstats_list[] = {  	SNMP_MIB_ITEM("Ip6OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS),  	SNMP_MIB_ITEM("Ip6InBcastOctets", IPSTATS_MIB_INBCASTOCTETS),  	SNMP_MIB_ITEM("Ip6OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS), -	SNMP_MIB_ITEM("InCsumErrors", IPSTATS_MIB_CSUMERRORS), +	/* IPSTATS_MIB_CSUMERRORS is not relevant in IPv6 (no checksum) */  	SNMP_MIB_SENTINEL  }; diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index 3bb3a891a42..d3cfaf9c7a0 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c @@ -46,11 +46,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  	unsigned int mss;  	unsigned int unfrag_ip6hlen, unfrag_len;  	struct frag_hdr *fptr; -	u8 *mac_start, *prevhdr; +	u8 *packet_start, *prevhdr;  	u8 nexthdr;  	u8 frag_hdr_sz = sizeof(struct frag_hdr);  	int offset;  	__wsum csum; +	int tnl_hlen;  	mss = skb_shinfo(skb)->gso_size;  	if (unlikely(skb->len <= mss)) @@ -83,9 +84,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  	skb->ip_summed = CHECKSUM_NONE;  	/* Check if there is enough headroom to insert fragment header. */ -	if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && -	    pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) -		goto out; +	tnl_hlen = skb_tnl_header_len(skb); +	if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) { +		if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz)) +			goto out; +	}  	/* Find the unfragmentable header and shift it left by frag_hdr_sz  	 * bytes to insert fragment header. @@ -93,11 +96,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,  	unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr);  	nexthdr = *prevhdr;  	*prevhdr = NEXTHDR_FRAGMENT; -	unfrag_len = skb_network_header(skb) - skb_mac_header(skb) + -		     unfrag_ip6hlen; -	mac_start = skb_mac_header(skb); -	memmove(mac_start-frag_hdr_sz, mac_start, unfrag_len); +	unfrag_len = (skb_network_header(skb) - skb_mac_header(skb)) + +		     unfrag_ip6hlen + tnl_hlen; +	packet_start = (u8 *) skb->head + SKB_GSO_CB(skb)->mac_offset; +	memmove(packet_start-frag_hdr_sz, packet_start, unfrag_len); +	SKB_GSO_CB(skb)->mac_offset -= frag_hdr_sz;  	skb->mac_header -= frag_hdr_sz;  	skb->network_header -= frag_hdr_sz; diff --git a/net/key/af_key.c b/net/key/af_key.c index 5b1e5af2571..c5fbd758968 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c @@ -2366,6 +2366,8 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, const struct sa  out:  	xfrm_pol_put(xp); +	if (err == 0) +		xfrm_garbage_collect(net);  	return err;  } @@ -2615,6 +2617,8 @@ static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, const struct sadb_  out:  	xfrm_pol_put(xp); +	if (delete && err == 0) +		xfrm_garbage_collect(net);  	return err;  } diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 60f1ce5e5e5..98d20c0f6fe 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -159,9 +159,10 @@ static int ieee80211_change_mtu(struct net_device *dev, int new_mtu)  	return 0;  } -static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr) +static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr)  { -	struct ieee80211_sub_if_data *sdata; +	struct ieee80211_local *local = sdata->local; +	struct ieee80211_sub_if_data *iter;  	u64 new, mask, tmp;  	u8 *m;  	int ret = 0; @@ -181,11 +182,14 @@ static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr)  	mutex_lock(&local->iflist_mtx); -	list_for_each_entry(sdata, &local->interfaces, list) { -		if (sdata->vif.type == NL80211_IFTYPE_MONITOR) +	list_for_each_entry(iter, &local->interfaces, list) { +		if (iter == sdata) +			continue; + +		if (iter->vif.type == NL80211_IFTYPE_MONITOR)  			continue; -		m = sdata->vif.addr; +		m = iter->vif.addr;  		tmp =	((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |  			((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |  			((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); @@ -209,7 +213,7 @@ static int ieee80211_change_mac(struct net_device *dev, void *addr)  	if (ieee80211_sdata_running(sdata))  		return -EBUSY; -	ret = ieee80211_verify_mac(sdata->local, sa->sa_data); +	ret = ieee80211_verify_mac(sdata, sa->sa_data);  	if (ret)  		return ret; @@ -474,6 +478,9 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)  			master->control_port_protocol;  		sdata->control_port_no_encrypt =  			master->control_port_no_encrypt; +		sdata->vif.cab_queue = master->vif.cab_queue; +		memcpy(sdata->vif.hw_queue, master->vif.hw_queue, +		       sizeof(sdata->vif.hw_queue));  		break;  		}  	case NL80211_IFTYPE_AP: @@ -653,7 +660,11 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)  	ieee80211_recalc_ps(local, -1); -	if (dev) { +	if (sdata->vif.type == NL80211_IFTYPE_MONITOR || +	    sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { +		/* XXX: for AP_VLAN, actually track AP queues */ +		netif_tx_start_all_queues(dev); +	} else if (dev) {  		unsigned long flags;  		int n_acs = IEEE80211_NUM_ACS;  		int ac; @@ -1479,7 +1490,17 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,  			break;  		} +		/* +		 * Pick address of existing interface in case user changed +		 * MAC address manually, default to perm_addr. +		 */  		m = local->hw.wiphy->perm_addr; +		list_for_each_entry(sdata, &local->interfaces, list) { +			if (sdata->vif.type == NL80211_IFTYPE_MONITOR) +				continue; +			m = sdata->vif.addr; +			break; +		}  		start = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) |  			((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) |  			((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); @@ -1696,6 +1717,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)  	ASSERT_RTNL(); +	/* +	 * Close all AP_VLAN interfaces first, as otherwise they +	 * might be closed while the AP interface they belong to +	 * is closed, causing unregister_netdevice_many() to crash. +	 */ +	list_for_each_entry(sdata, &local->interfaces, list) +		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) +			dev_close(sdata->dev); +  	mutex_lock(&local->iflist_mtx);  	list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {  		list_del(&sdata->list); diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index a46e490f20d..a8c2130c8ba 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -3321,10 +3321,6 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)  	if (WARN_ON_ONCE(!auth_data))  		return -EINVAL; -	if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) -		tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | -			   IEEE80211_TX_INTFL_MLME_CONN_TX; -  	auth_data->tries++;  	if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) { @@ -3358,6 +3354,10 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)  			auth_data->expected_transaction = trans;  		} +		if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) +			tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | +				   IEEE80211_TX_INTFL_MLME_CONN_TX; +  		ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,  				    auth_data->data, auth_data->data_len,  				    auth_data->bss->bssid, @@ -3381,12 +3381,12 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)  		 * will not answer to direct packet in unassociated state.  		 */  		ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1], -					 NULL, 0, (u32) -1, true, tx_flags, +					 NULL, 0, (u32) -1, true, 0,  					 auth_data->bss->channel, false);  		rcu_read_unlock();  	} -	if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { +	if (tx_flags == 0) {  		auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;  		ifmgd->auth_data->timeout_started = true;  		run_again(ifmgd, auth_data->timeout); diff --git a/net/netfilter/core.c b/net/netfilter/core.c index 07c865a31a3..857ca9f3517 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c @@ -30,6 +30,8 @@ static DEFINE_MUTEX(afinfo_mutex);  const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly;  EXPORT_SYMBOL(nf_afinfo); +const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly; +EXPORT_SYMBOL_GPL(nf_ipv6_ops);  int nf_register_afinfo(const struct nf_afinfo *afinfo)  { diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index 085b5880ab0..05565d2b3a6 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c @@ -1001,6 +1001,32 @@ static inline int is_tcp_reset(const struct sk_buff *skb, int nh_len)  	return th->rst;  } +static inline bool is_new_conn(const struct sk_buff *skb, +			       struct ip_vs_iphdr *iph) +{ +	switch (iph->protocol) { +	case IPPROTO_TCP: { +		struct tcphdr _tcph, *th; + +		th = skb_header_pointer(skb, iph->len, sizeof(_tcph), &_tcph); +		if (th == NULL) +			return false; +		return th->syn; +	} +	case IPPROTO_SCTP: { +		sctp_chunkhdr_t *sch, schunk; + +		sch = skb_header_pointer(skb, iph->len + sizeof(sctp_sctphdr_t), +					 sizeof(schunk), &schunk); +		if (sch == NULL) +			return false; +		return sch->type == SCTP_CID_INIT; +	} +	default: +		return false; +	} +} +  /* Handle response packets: rewrite addresses and send away...   */  static unsigned int @@ -1612,6 +1638,15 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af)  	 * Check if the packet belongs to an existing connection entry  	 */  	cp = pp->conn_in_get(af, skb, &iph, 0); + +	if (unlikely(sysctl_expire_nodest_conn(ipvs)) && cp && cp->dest && +	    unlikely(!atomic_read(&cp->dest->weight)) && !iph.fragoffs && +	    is_new_conn(skb, &iph)) { +		ip_vs_conn_expire_now(cp); +		__ip_vs_conn_put(cp); +		cp = NULL; +	} +  	if (unlikely(!cp) && !iph.fragoffs) {  		/* No (second) fragments need to enter here, as nf_defrag_ipv6  		 * replayed fragment zero will already have created the cp diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c index 0df269d7c99..a65edfe4b16 100644 --- a/net/netfilter/ipvs/ip_vs_sh.c +++ b/net/netfilter/ipvs/ip_vs_sh.c @@ -67,8 +67,8 @@ struct ip_vs_sh_bucket {  #define IP_VS_SH_TAB_MASK               (IP_VS_SH_TAB_SIZE - 1)  struct ip_vs_sh_state { -	struct ip_vs_sh_bucket		buckets[IP_VS_SH_TAB_SIZE];  	struct rcu_head			rcu_head; +	struct ip_vs_sh_bucket		buckets[IP_VS_SH_TAB_SIZE];  };  /* diff --git a/net/netfilter/xt_LOG.c b/net/netfilter/xt_LOG.c index 491c7d821a0..5ab24843370 100644 --- a/net/netfilter/xt_LOG.c +++ b/net/netfilter/xt_LOG.c @@ -737,7 +737,7 @@ static void dump_ipv6_packet(struct sbuff *m,  		dump_sk_uid_gid(m, skb->sk);  	/* Max length: 16 "MARK=0xFFFFFFFF " */ -	if (!recurse && skb->mark) +	if (recurse && skb->mark)  		sb_add(m, "MARK=0x%x ", skb->mark);  } diff --git a/net/netfilter/xt_addrtype.c b/net/netfilter/xt_addrtype.c index 49c5ff7f6dd..68ff29f6086 100644 --- a/net/netfilter/xt_addrtype.c +++ b/net/netfilter/xt_addrtype.c @@ -22,6 +22,7 @@  #include <net/ip6_fib.h>  #endif +#include <linux/netfilter_ipv6.h>  #include <linux/netfilter/xt_addrtype.h>  #include <linux/netfilter/x_tables.h> @@ -33,12 +34,12 @@ MODULE_ALIAS("ip6t_addrtype");  #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)  static u32 match_lookup_rt6(struct net *net, const struct net_device *dev, -			    const struct in6_addr *addr) +			    const struct in6_addr *addr, u16 mask)  {  	const struct nf_afinfo *afinfo;  	struct flowi6 flow;  	struct rt6_info *rt; -	u32 ret; +	u32 ret = 0;  	int route_err;  	memset(&flow, 0, sizeof(flow)); @@ -49,12 +50,19 @@ static u32 match_lookup_rt6(struct net *net, const struct net_device *dev,  	rcu_read_lock();  	afinfo = nf_get_afinfo(NFPROTO_IPV6); -	if (afinfo != NULL) +	if (afinfo != NULL) { +		const struct nf_ipv6_ops *v6ops; + +		if (dev && (mask & XT_ADDRTYPE_LOCAL)) { +			v6ops = nf_get_ipv6_ops(); +			if (v6ops && v6ops->chk_addr(net, addr, dev, true)) +				ret = XT_ADDRTYPE_LOCAL; +		}  		route_err = afinfo->route(net, (struct dst_entry **)&rt, -					flowi6_to_flowi(&flow), !!dev); -	else +					  flowi6_to_flowi(&flow), false); +	} else {  		route_err = 1; - +	}  	rcu_read_unlock();  	if (route_err) @@ -62,15 +70,12 @@ static u32 match_lookup_rt6(struct net *net, const struct net_device *dev,  	if (rt->rt6i_flags & RTF_REJECT)  		ret = XT_ADDRTYPE_UNREACHABLE; -	else -		ret = 0; -	if (rt->rt6i_flags & RTF_LOCAL) +	if (dev == NULL && rt->rt6i_flags & RTF_LOCAL)  		ret |= XT_ADDRTYPE_LOCAL;  	if (rt->rt6i_flags & RTF_ANYCAST)  		ret |= XT_ADDRTYPE_ANYCAST; -  	dst_release(&rt->dst);  	return ret;  } @@ -90,7 +95,7 @@ static bool match_type6(struct net *net, const struct net_device *dev,  	if ((XT_ADDRTYPE_LOCAL | XT_ADDRTYPE_ANYCAST |  	     XT_ADDRTYPE_UNREACHABLE) & mask) -		return !!(mask & match_lookup_rt6(net, dev, addr)); +		return !!(mask & match_lookup_rt6(net, dev, addr, mask));  	return true;  } diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 12ac6b47a35..d0b3dd60d38 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -747,7 +747,7 @@ static void netlink_skb_destructor(struct sk_buff *skb)  		atomic_dec(&ring->pending);  		sock_put(sk); -		skb->data = NULL; +		skb->head = NULL;  	}  #endif  	if (skb->sk != NULL) diff --git a/net/nfc/Makefile b/net/nfc/Makefile index fb799deaed4..a76f4533cb6 100644 --- a/net/nfc/Makefile +++ b/net/nfc/Makefile @@ -5,7 +5,6 @@  obj-$(CONFIG_NFC) += nfc.o  obj-$(CONFIG_NFC_NCI) += nci/  obj-$(CONFIG_NFC_HCI) += hci/ -#obj-$(CONFIG_NFC_LLCP) += llcp/  nfc-objs := core.o netlink.o af_nfc.o rawsock.o llcp_core.o llcp_commands.o \  		llcp_sock.o diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 823463adbd2..189e3c5b3d0 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c @@ -231,14 +231,14 @@ override:  	}  	if (R_tab) {  		police->rate_present = true; -		psched_ratecfg_precompute(&police->rate, R_tab->rate.rate); +		psched_ratecfg_precompute(&police->rate, &R_tab->rate);  		qdisc_put_rtab(R_tab);  	} else {  		police->rate_present = false;  	}  	if (P_tab) {  		police->peak_present = true; -		psched_ratecfg_precompute(&police->peak, P_tab->rate.rate); +		psched_ratecfg_precompute(&police->peak, &P_tab->rate);  		qdisc_put_rtab(P_tab);  	} else {  		police->peak_present = false; @@ -376,9 +376,9 @@ tcf_act_police_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref)  	};  	if (police->rate_present) -		opt.rate.rate = psched_ratecfg_getrate(&police->rate); +		psched_ratecfg_getrate(&opt.rate, &police->rate);  	if (police->peak_present) -		opt.peakrate.rate = psched_ratecfg_getrate(&police->peak); +		psched_ratecfg_getrate(&opt.peakrate, &police->peak);  	if (nla_put(skb, TCA_POLICE_TBF, sizeof(opt), &opt))  		goto nla_put_failure;  	if (police->tcfp_result && diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index eac7e0ee23c..20224086cc2 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -898,14 +898,16 @@ void dev_shutdown(struct net_device *dev)  	WARN_ON(timer_pending(&dev->watchdog_timer));  } -void psched_ratecfg_precompute(struct psched_ratecfg *r, u32 rate) +void psched_ratecfg_precompute(struct psched_ratecfg *r, +			       const struct tc_ratespec *conf)  {  	u64 factor;  	u64 mult;  	int shift; -	r->rate_bps = (u64)rate << 3; -	r->shift = 0; +	memset(r, 0, sizeof(*r)); +	r->overhead = conf->overhead; +	r->rate_bps = (u64)conf->rate << 3;  	r->mult = 1;  	/*  	 * Calibrate mult, shift so that token counting is accurate diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 79b1876b6cd..adaedd79389 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -109,7 +109,7 @@ struct htb_class {  	} un;  	struct rb_node node[TC_HTB_NUMPRIO];	/* node for self or feed tree */  	struct rb_node pq_node;	/* node for event queue */ -	psched_time_t pq_key; +	s64	pq_key;  	int prio_activity;	/* for which prios are we active */  	enum htb_cmode cmode;	/* current mode of the class */ @@ -121,10 +121,10 @@ struct htb_class {  	/* token bucket parameters */  	struct psched_ratecfg rate;  	struct psched_ratecfg ceil; -	s64 buffer, cbuffer;	/* token bucket depth/rate */ -	psched_tdiff_t mbuffer;	/* max wait time */ -	s64 tokens, ctokens;	/* current number of tokens */ -	psched_time_t t_c;	/* checkpoint time */ +	s64	buffer, cbuffer;	/* token bucket depth/rate */ +	s64	mbuffer;		/* max wait time */ +	s64	tokens, ctokens;	/* current number of tokens */ +	s64	t_c;			/* checkpoint time */  };  struct htb_sched { @@ -141,15 +141,15 @@ struct htb_sched {  	struct rb_root wait_pq[TC_HTB_MAXDEPTH];  	/* time of nearest event per level (row) */ -	psched_time_t near_ev_cache[TC_HTB_MAXDEPTH]; +	s64	near_ev_cache[TC_HTB_MAXDEPTH];  	int defcls;		/* class where unclassified flows go to */  	/* filters for qdisc itself */  	struct tcf_proto *filter_list; -	int rate2quantum;	/* quant = rate / rate2quantum */ -	psched_time_t now;	/* cached dequeue time */ +	int	rate2quantum;	/* quant = rate / rate2quantum */ +	s64	now;	/* cached dequeue time */  	struct qdisc_watchdog watchdog;  	/* non shaped skbs; let them go directly thru */ @@ -664,8 +664,8 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl,   * next pending event (0 for no event in pq, q->now for too many events).   * Note: Applied are events whose have cl->pq_key <= q->now.   */ -static psched_time_t htb_do_events(struct htb_sched *q, int level, -				   unsigned long start) +static s64 htb_do_events(struct htb_sched *q, int level, +			 unsigned long start)  {  	/* don't run for longer than 2 jiffies; 2 is used instead of  	 * 1 to simplify things when jiffy is going to be incremented @@ -857,7 +857,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)  	struct sk_buff *skb;  	struct htb_sched *q = qdisc_priv(sch);  	int level; -	psched_time_t next_event; +	s64 next_event;  	unsigned long start_at;  	/* try to dequeue direct packets as high prio (!) to minimize cpu work */ @@ -880,7 +880,7 @@ ok:  	for (level = 0; level < TC_HTB_MAXDEPTH; level++) {  		/* common case optimization - skip event handler quickly */  		int m; -		psched_time_t event; +		s64 event;  		if (q->now >= q->near_ev_cache[level]) {  			event = htb_do_events(q, level, start_at); @@ -1090,9 +1090,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg,  	memset(&opt, 0, sizeof(opt)); -	opt.rate.rate = psched_ratecfg_getrate(&cl->rate); +	psched_ratecfg_getrate(&opt.rate, &cl->rate);  	opt.buffer = PSCHED_NS2TICKS(cl->buffer); -	opt.ceil.rate = psched_ratecfg_getrate(&cl->ceil); +	psched_ratecfg_getrate(&opt.ceil, &cl->ceil);  	opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer);  	opt.quantum = cl->quantum;  	opt.prio = cl->prio; @@ -1117,8 +1117,8 @@ htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d)  	if (!cl->level && cl->un.leaf.q)  		cl->qstats.qlen = cl->un.leaf.q->q.qlen; -	cl->xstats.tokens = cl->tokens; -	cl->xstats.ctokens = cl->ctokens; +	cl->xstats.tokens = PSCHED_NS2TICKS(cl->tokens); +	cl->xstats.ctokens = PSCHED_NS2TICKS(cl->ctokens);  	if (gnet_stats_copy_basic(d, &cl->bstats) < 0 ||  	    gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 || @@ -1200,7 +1200,7 @@ static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl,  	parent->un.leaf.q = new_q ? new_q : &noop_qdisc;  	parent->tokens = parent->buffer;  	parent->ctokens = parent->cbuffer; -	parent->t_c = psched_get_time(); +	parent->t_c = ktime_to_ns(ktime_get());  	parent->cmode = HTB_CAN_SEND;  } @@ -1417,8 +1417,8 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,  		/* set class to be in HTB_CAN_SEND state */  		cl->tokens = PSCHED_TICKS2NS(hopt->buffer);  		cl->ctokens = PSCHED_TICKS2NS(hopt->cbuffer); -		cl->mbuffer = 60 * PSCHED_TICKS_PER_SEC;	/* 1min */ -		cl->t_c = psched_get_time(); +		cl->mbuffer = 60ULL * NSEC_PER_SEC;	/* 1min */ +		cl->t_c = ktime_to_ns(ktime_get());  		cl->cmode = HTB_CAN_SEND;  		/* attach to the hash list and parent's family */ @@ -1459,8 +1459,8 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,  			cl->prio = TC_HTB_NUMPRIO - 1;  	} -	psched_ratecfg_precompute(&cl->rate, hopt->rate.rate); -	psched_ratecfg_precompute(&cl->ceil, hopt->ceil.rate); +	psched_ratecfg_precompute(&cl->rate, &hopt->rate); +	psched_ratecfg_precompute(&cl->ceil, &hopt->ceil);  	cl->buffer = PSCHED_TICKS2NS(hopt->buffer);  	cl->cbuffer = PSCHED_TICKS2NS(hopt->buffer); diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index c8388f3c342..e478d316602 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c @@ -298,9 +298,9 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt)  	q->tokens = q->buffer;  	q->ptokens = q->mtu; -	psched_ratecfg_precompute(&q->rate, rtab->rate.rate); +	psched_ratecfg_precompute(&q->rate, &rtab->rate);  	if (ptab) { -		psched_ratecfg_precompute(&q->peak, ptab->rate.rate); +		psched_ratecfg_precompute(&q->peak, &ptab->rate);  		q->peak_present = true;  	} else {  		q->peak_present = false; @@ -350,9 +350,9 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)  		goto nla_put_failure;  	opt.limit = q->limit; -	opt.rate.rate = psched_ratecfg_getrate(&q->rate); +	psched_ratecfg_getrate(&opt.rate, &q->rate);  	if (q->peak_present) -		opt.peakrate.rate = psched_ratecfg_getrate(&q->peak); +		psched_ratecfg_getrate(&opt.peakrate, &q->peak);  	else  		memset(&opt.peakrate, 0, sizeof(opt.peakrate));  	opt.mtu = PSCHED_NS2TICKS(q->mtu); diff --git a/net/socket.c b/net/socket.c index 6b94633ca61..4ca1526db75 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1956,7 +1956,7 @@ struct used_address {  	unsigned int name_len;  }; -static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, +static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg,  			 struct msghdr *msg_sys, unsigned int flags,  			 struct used_address *used_address)  { @@ -2071,22 +2071,30 @@ out:   *	BSD sendmsg interface   */ -SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) +long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)  {  	int fput_needed, err;  	struct msghdr msg_sys; -	struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); +	struct socket *sock; +	sock = sockfd_lookup_light(fd, &err, &fput_needed);  	if (!sock)  		goto out; -	err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL); +	err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL);  	fput_light(sock->file, fput_needed);  out:  	return err;  } +SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) +{ +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_sendmsg(fd, msg, flags); +} +  /*   *	Linux sendmmsg interface   */ @@ -2117,15 +2125,16 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  	while (datagrams < vlen) {  		if (MSG_CMSG_COMPAT & flags) { -			err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, -					    &msg_sys, flags, &used_address); +			err = ___sys_sendmsg(sock, (struct msghdr __user *)compat_entry, +					     &msg_sys, flags, &used_address);  			if (err < 0)  				break;  			err = __put_user(err, &compat_entry->msg_len);  			++compat_entry;  		} else { -			err = __sys_sendmsg(sock, (struct msghdr __user *)entry, -					    &msg_sys, flags, &used_address); +			err = ___sys_sendmsg(sock, +					     (struct msghdr __user *)entry, +					     &msg_sys, flags, &used_address);  			if (err < 0)  				break;  			err = put_user(err, &entry->msg_len); @@ -2149,10 +2158,12 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,  		unsigned int, vlen, unsigned int, flags)  { +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL;  	return __sys_sendmmsg(fd, mmsg, vlen, flags);  } -static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, +static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg,  			 struct msghdr *msg_sys, unsigned int flags, int nosec)  {  	struct compat_msghdr __user *msg_compat = @@ -2244,23 +2255,31 @@ out:   *	BSD recvmsg interface   */ -SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, -		unsigned int, flags) +long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags)  {  	int fput_needed, err;  	struct msghdr msg_sys; -	struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); +	struct socket *sock; +	sock = sockfd_lookup_light(fd, &err, &fput_needed);  	if (!sock)  		goto out; -	err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0); +	err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);  	fput_light(sock->file, fput_needed);  out:  	return err;  } +SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, +		unsigned int, flags) +{ +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +	return __sys_recvmsg(fd, msg, flags); +} +  /*   *     Linux recvmmsg interface   */ @@ -2298,17 +2317,18 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,  		 * No need to ask LSM for more than the first datagram.  		 */  		if (MSG_CMSG_COMPAT & flags) { -			err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry, -					    &msg_sys, flags & ~MSG_WAITFORONE, -					    datagrams); +			err = ___sys_recvmsg(sock, (struct msghdr __user *)compat_entry, +					     &msg_sys, flags & ~MSG_WAITFORONE, +					     datagrams);  			if (err < 0)  				break;  			err = __put_user(err, &compat_entry->msg_len);  			++compat_entry;  		} else { -			err = __sys_recvmsg(sock, (struct msghdr __user *)entry, -					    &msg_sys, flags & ~MSG_WAITFORONE, -					    datagrams); +			err = ___sys_recvmsg(sock, +					     (struct msghdr __user *)entry, +					     &msg_sys, flags & ~MSG_WAITFORONE, +					     datagrams);  			if (err < 0)  				break;  			err = put_user(err, &entry->msg_len); @@ -2375,6 +2395,9 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,  	int datagrams;  	struct timespec timeout_sys; +	if (flags & MSG_CMSG_COMPAT) +		return -EINVAL; +  	if (!timeout)  		return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL); diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index 871c73c9216..29b4ba93ab3 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c @@ -1287,7 +1287,7 @@ static bool use_gss_proxy(struct net *net)  #ifdef CONFIG_PROC_FS -static bool set_gss_proxy(struct net *net, int type) +static int set_gss_proxy(struct net *net, int type)  {  	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);  	int ret = 0; @@ -1317,10 +1317,12 @@ static inline bool gssp_ready(struct sunrpc_net *sn)  	return false;  } -static int wait_for_gss_proxy(struct net *net) +static int wait_for_gss_proxy(struct net *net, struct file *file)  {  	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); +	if (file->f_flags & O_NONBLOCK && !gssp_ready(sn)) +		return -EAGAIN;  	return wait_event_interruptible(sn->gssp_wq, gssp_ready(sn));  } @@ -1362,7 +1364,7 @@ static ssize_t read_gssp(struct file *file, char __user *buf,  	size_t len;  	int ret; -	ret = wait_for_gss_proxy(net); +	ret = wait_for_gss_proxy(net, file);  	if (ret)  		return ret; diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index c3f9e1ef7f5..06bdf5a1082 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c @@ -810,11 +810,15 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)  		goto badcred;  	argv->iov_base = (void*)((__be32*)argv->iov_base + slen);	/* skip machname */  	argv->iov_len -= slen*4; - +	/* +	 * Note: we skip uid_valid()/gid_valid() checks here for +	 * backwards compatibility with clients that use -1 id's. +	 * Instead, -1 uid or gid is later mapped to the +	 * (export-specific) anonymous id by nfsd_setuser. +	 * Supplementary gid's will be left alone. +	 */  	cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */  	cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */ -	if (!uid_valid(cred->cr_uid) || !gid_valid(cred->cr_gid)) -		goto badcred;  	slen = svc_getnl(argv);			/* gids length */  	if (slen > 16 || (len -= (slen + 2)*4) < 0)  		goto badcred; @@ -823,8 +827,6 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)  		return SVC_CLOSE;  	for (i = 0; i < slen; i++) {  		kgid_t kgid = make_kgid(&init_user_ns, svc_getnl(argv)); -		if (!gid_valid(kgid)) -			goto badcred;  		GROUP_AT(cred->cr_group_info, i) = kgid;  	}  	if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) { diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index dfdb5e64321..d5aed3bb394 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -3411,7 +3411,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,  			(u32)sinfo->rx_bytes))  		goto nla_put_failure;  	if ((sinfo->filled & (STATION_INFO_TX_BYTES | -			      NL80211_STA_INFO_TX_BYTES64)) && +			      STATION_INFO_TX_BYTES64)) &&  	    nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,  			(u32)sinfo->tx_bytes))  		goto nla_put_failure; diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 8b5eddfba1e..3ed35c345ca 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c @@ -231,6 +231,9 @@ void cfg80211_conn_work(struct work_struct *work)  	mutex_lock(&rdev->sched_scan_mtx);  	list_for_each_entry(wdev, &rdev->wdev_list, list) { +		if (!wdev->netdev) +			continue; +  		wdev_lock(wdev);  		if (!netif_running(wdev->netdev)) {  			wdev_unlock(wdev); diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 23cea0f7433..ea970b8002a 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -2557,11 +2557,12 @@ static void __xfrm_garbage_collect(struct net *net)  	}  } -static void xfrm_garbage_collect(struct net *net) +void xfrm_garbage_collect(struct net *net)  {  	flow_cache_flush();  	__xfrm_garbage_collect(net);  } +EXPORT_SYMBOL(xfrm_garbage_collect);  static void xfrm_garbage_collect_deferred(struct net *net)  { diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index aa778748c56..3f565e495ac 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -1681,6 +1681,8 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,  out:  	xfrm_pol_put(xp); +	if (delete && err == 0) +		xfrm_garbage_collect(net);  	return err;  } diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 51bb3de680b..8337663aa29 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -264,7 +264,7 @@ $(obj)/%.dtb.S: $(obj)/%.dtb  quiet_cmd_dtc = DTC     $@  cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \  	$(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ -		-i $(srctree)/arch/$(SRCARCH)/boot/dts $(DTC_FLAGS) \ +		-i $(dir $<) $(DTC_FLAGS) \  		-d $(depfile).dtc $(dtc-tmp) ; \  	cat $(depfile).pre $(depfile).dtc > $(depfile) diff --git a/scripts/config b/scripts/config index bb4d3deb6d1..a65ecbbdd32 100755 --- a/scripts/config +++ b/scripts/config @@ -105,7 +105,7 @@ while [ "$1" != "" ] ; do  		;;  	--refresh)  		;; -	--*-after) +	--*-after|-E|-D|-M)  		checkarg "$1"  		A=$ARG  		checkarg "$2" diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index 48d382e7e37..38cd69c5660 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c @@ -303,10 +303,11 @@ do_resize:  				}  		} -		if (i < max_choice || -		    key == KEY_UP || key == KEY_DOWN || -		    key == '-' || key == '+' || -		    key == KEY_PPAGE || key == KEY_NPAGE) { +		if (item_count() != 0 && +		    (i < max_choice || +		     key == KEY_UP || key == KEY_DOWN || +		     key == '-' || key == '+' || +		     key == KEY_PPAGE || key == KEY_NPAGE)) {  			/* Remove highligt of current item */  			print_item(scroll + choice, choice, FALSE); diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 387dc8daf7b..a69cbd78fb3 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -670,11 +670,12 @@ static void conf(struct menu *menu, struct menu *active_menu)  				  active_menu, &s_scroll);  		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)  			break; -		if (!item_activate_selected()) -			continue; -		if (!item_tag()) -			continue; - +		if (item_count() != 0) { +			if (!item_activate_selected()) +				continue; +			if (!item_tag()) +				continue; +		}  		submenu = item_data();  		active_menu = item_data();  		if (submenu) diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index b5c7d90df9d..fd3f0180e08 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -146,11 +146,24 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e  			struct menu *menu = current_entry;  			while ((menu = menu->parent) != NULL) { +				struct expr *dup_expr; +  				if (!menu->visibility)  					continue; +				/* +				 * Do not add a reference to the +				 * menu's visibility expression but +				 * use a copy of it.  Otherwise the +				 * expression reduction functions +				 * will modify expressions that have +				 * multiple references which can +				 * cause unwanted side effects. +				 */ +				dup_expr = expr_copy(menu->visibility); +  				prop->visible.expr  					= expr_alloc_and(prop->visible.expr, -							 menu->visibility); +							 dup_expr);  			}  		} diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 8ab29515451..d0308188621 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -316,6 +316,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,  		memcpy(new_ctx, old_ctx, sizeof(*new_ctx));  		memcpy(new_ctx->ctx_str, old_ctx->ctx_str, new_ctx->ctx_len); +		atomic_inc(&selinux_xfrm_refcount);  		*new_ctxp = new_ctx;  	}  	return 0; @@ -326,6 +327,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx,   */  void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx)  { +	atomic_dec(&selinux_xfrm_refcount);  	kfree(ctx);  } @@ -335,17 +337,13 @@ void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx)  int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)  {  	const struct task_security_struct *tsec = current_security(); -	int rc = 0; -	if (ctx) { -		rc = avc_has_perm(tsec->sid, ctx->ctx_sid, -				  SECCLASS_ASSOCIATION, -				  ASSOCIATION__SETCONTEXT, NULL); -		if (rc == 0) -			atomic_dec(&selinux_xfrm_refcount); -	} +	if (!ctx) +		return 0; -	return rc; +	return avc_has_perm(tsec->sid, ctx->ctx_sid, +			    SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, +			    NULL);  }  /* @@ -370,8 +368,8 @@ int selinux_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *uct   */  void selinux_xfrm_state_free(struct xfrm_state *x)  { -	struct xfrm_sec_ctx *ctx = x->security; -	kfree(ctx); +	atomic_dec(&selinux_xfrm_refcount); +	kfree(x->security);  }   /* @@ -381,17 +379,13 @@ int selinux_xfrm_state_delete(struct xfrm_state *x)  {  	const struct task_security_struct *tsec = current_security();  	struct xfrm_sec_ctx *ctx = x->security; -	int rc = 0; -	if (ctx) { -		rc = avc_has_perm(tsec->sid, ctx->ctx_sid, -				  SECCLASS_ASSOCIATION, -				  ASSOCIATION__SETCONTEXT, NULL); -		if (rc == 0) -			atomic_dec(&selinux_xfrm_refcount); -	} +	if (!ctx) +		return 0; -	return rc; +	return avc_has_perm(tsec->sid, ctx->ctx_sid, +			    SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, +			    NULL);  }  /* diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ae85bbd2e6f..4b1524a861f 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c @@ -788,6 +788,8 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable)  		return;  	if (codec->inv_eapd)  		enable = !enable; +	if (spec->keep_eapd_on && !enable) +		return;  	snd_hda_codec_update_cache(codec, pin, 0,  				   AC_VERB_SET_EAPD_BTLENABLE,  				   enable ? 0x02 : 0x00); @@ -1938,17 +1940,7 @@ static int create_speaker_out_ctls(struct hda_codec *codec)   * independent HP controls   */ -/* update HP auto-mute state too */ -static void update_hp_automute_hook(struct hda_codec *codec) -{ -	struct hda_gen_spec *spec = codec->spec; - -	if (spec->hp_automute_hook) -		spec->hp_automute_hook(codec, NULL); -	else -		snd_hda_gen_hp_automute(codec, NULL); -} - +static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack);  static int indep_hp_info(struct snd_kcontrol *kcontrol,  			 struct snd_ctl_elem_info *uinfo)  { @@ -2009,7 +2001,7 @@ static int indep_hp_put(struct snd_kcontrol *kcontrol,  		else  			*dacp = spec->alt_dac_nid; -		update_hp_automute_hook(codec); +		call_hp_automute(codec, NULL);  		ret = 1;  	}   unlock: @@ -2305,7 +2297,7 @@ static void update_hp_mic(struct hda_codec *codec, int adc_mux, bool force)  		else  			val = PIN_HP;  		set_pin_target(codec, pin, val, true); -		update_hp_automute_hook(codec); +		call_hp_automute(codec, NULL);  	}  } @@ -2714,7 +2706,7 @@ static int hp_mic_jack_mode_put(struct snd_kcontrol *kcontrol,  			val = snd_hda_get_default_vref(codec, nid);  	}  	snd_hda_set_pin_ctl_cache(codec, nid, val); -	update_hp_automute_hook(codec); +	call_hp_automute(codec, NULL);  	return 1;  } @@ -3859,20 +3851,42 @@ void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *ja  }  EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch); -/* update jack retasking */ -static void update_automute_all(struct hda_codec *codec) +/* call appropriate hooks */ +static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack)  {  	struct hda_gen_spec *spec = codec->spec; +	if (spec->hp_automute_hook) +		spec->hp_automute_hook(codec, jack); +	else +		snd_hda_gen_hp_automute(codec, jack); +} -	update_hp_automute_hook(codec); +static void call_line_automute(struct hda_codec *codec, +			       struct hda_jack_tbl *jack) +{ +	struct hda_gen_spec *spec = codec->spec;  	if (spec->line_automute_hook) -		spec->line_automute_hook(codec, NULL); +		spec->line_automute_hook(codec, jack);  	else -		snd_hda_gen_line_automute(codec, NULL); +		snd_hda_gen_line_automute(codec, jack); +} + +static void call_mic_autoswitch(struct hda_codec *codec, +				struct hda_jack_tbl *jack) +{ +	struct hda_gen_spec *spec = codec->spec;  	if (spec->mic_autoswitch_hook) -		spec->mic_autoswitch_hook(codec, NULL); +		spec->mic_autoswitch_hook(codec, jack);  	else -		snd_hda_gen_mic_autoswitch(codec, NULL); +		snd_hda_gen_mic_autoswitch(codec, jack); +} + +/* update jack retasking */ +static void update_automute_all(struct hda_codec *codec) +{ +	call_hp_automute(codec, NULL); +	call_line_automute(codec, NULL); +	call_mic_autoswitch(codec, NULL);  }  /* @@ -4009,9 +4023,7 @@ static int check_auto_mute_availability(struct hda_codec *codec)  		snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n",  			    nid);  		snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, -						    spec->hp_automute_hook ? -						    spec->hp_automute_hook : -						    snd_hda_gen_hp_automute); +						    call_hp_automute);  		spec->detect_hp = 1;  	} @@ -4024,9 +4036,7 @@ static int check_auto_mute_availability(struct hda_codec *codec)  				snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid);  				snd_hda_jack_detect_enable_callback(codec, nid,  								    HDA_GEN_FRONT_EVENT, -								    spec->line_automute_hook ? -								    spec->line_automute_hook : -								    snd_hda_gen_line_automute); +								    call_line_automute);  				spec->detect_lo = 1;  			}  		spec->automute_lo_possible = spec->detect_hp; @@ -4068,9 +4078,7 @@ static bool auto_mic_check_imux(struct hda_codec *codec)  		snd_hda_jack_detect_enable_callback(codec,  						    spec->am_entry[i].pin,  						    HDA_GEN_MIC_EVENT, -						    spec->mic_autoswitch_hook ? -						    spec->mic_autoswitch_hook : -						    snd_hda_gen_mic_autoswitch); +						    call_mic_autoswitch);  	return true;  } diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 54e66516037..76200314ee9 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h @@ -222,6 +222,7 @@ struct hda_gen_spec {  	unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */  	unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */  	unsigned int own_eapd_ctl:1; /* set EAPD by own function */ +	unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */  	unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */  	unsigned int indep_hp:1; /* independent HP supported */  	unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 59d2e91a9ab..02e22b4458d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -3493,6 +3493,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), +	SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), +	SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),  	SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),  	SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),  	SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), @@ -3530,6 +3532,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {  	SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), +	SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),  	SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),  	SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index e0dadcf2030..e5245544eb5 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -136,6 +136,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec)  		spec->codec_type = VT1708S;  	spec->no_pin_power_ctl = 1;  	spec->gen.indep_hp = 1; +	spec->gen.keep_eapd_on = 1;  	spec->gen.pcm_playback_hook = via_playback_pcm_hook;  	return spec;  } @@ -231,9 +232,14 @@ static void vt1708_update_hp_work(struct hda_codec *codec)  static void set_widgets_power_state(struct hda_codec *codec)  { +#if 0 /* FIXME: the assumed connections don't match always with the +       * actual routes by the generic parser, so better to disable +       * the control for safety. +       */  	struct via_spec *spec = codec->spec;  	if (spec->set_widgets_power_state)  		spec->set_widgets_power_state(codec); +#endif  }  static void update_power_state(struct hda_codec *codec, hda_nid_t nid, @@ -478,7 +484,9 @@ static int via_suspend(struct hda_codec *codec)  		/* Fix pop noise on headphones */  		int i;  		for (i = 0; i < spec->gen.autocfg.hp_outs; i++) -			snd_hda_set_pin_ctl(codec, spec->gen.autocfg.hp_pins[i], 0); +			snd_hda_codec_write(codec, spec->gen.autocfg.hp_pins[i], +					    0, AC_VERB_SET_PIN_WIDGET_CONTROL, +					    0x00);  	}  	return 0; diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index d59abe1682c..748e82d4d25 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c @@ -1341,7 +1341,8 @@ static int sis_chip_create(struct snd_card *card,  	if (rc)  		goto error_out; -	if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0) { +	rc = pci_set_dma_mask(pci, DMA_BIT_MASK(30)); +	if (rc < 0) {  		dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA");  		goto error_out_enabled;  	} diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 0f6f481cec0..030f53c96ec 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c @@ -86,7 +86,7 @@ static const struct reg_default cs42l52_reg_defaults[] = {  	{ CS42L52_BEEP_VOL, 0x00 },	/* r1D Beep Volume off Time */  	{ CS42L52_BEEP_TONE_CTL, 0x00 },	/* r1E Beep Tone Cfg. */  	{ CS42L52_TONE_CTL, 0x00 },	/* r1F Tone Ctl */ -	{ CS42L52_MASTERA_VOL, 0x88 },	/* r20 Master A Volume */ +	{ CS42L52_MASTERA_VOL, 0x00 },	/* r20 Master A Volume */  	{ CS42L52_MASTERB_VOL, 0x00 },	/* r21 Master B Volume */  	{ CS42L52_HPA_VOL, 0x00 },	/* r22 Headphone A Volume */  	{ CS42L52_HPB_VOL, 0x00 },	/* r23 Headphone B Volume */ @@ -225,7 +225,7 @@ static const char * const mic_bias_level_text[] = {  };  static const struct soc_enum mic_bias_level_enum = -	SOC_ENUM_SINGLE(CS42L52_IFACE_CTL1, 0, +	SOC_ENUM_SINGLE(CS42L52_IFACE_CTL2, 0,  			ARRAY_SIZE(mic_bias_level_text), mic_bias_level_text);  static const char * const cs42l52_mic_text[] = { "Single", "Differential" }; @@ -413,7 +413,7 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {  	SOC_ENUM("Headphone Analog Gain", hp_gain_enum),  	SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL, -			      CS42L52_SPKB_VOL, 7, 0x1, 0xff, hl_tlv), +			      CS42L52_SPKB_VOL, 0, 0x1, 0xff, hl_tlv),  	SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,  			      CS42L52_PASSTHRUB_VOL, 6, 0x18, 0x90, pga_tlv), @@ -441,7 +441,7 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {  	SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",  			    CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, -				6, 0x7f, 0x19, hl_tlv), +				0, 0x7f, 0x19, hl_tlv),  	SOC_DOUBLE_R("PCM Mixer Switch",  		     CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), diff --git a/sound/soc/codecs/cs42l52.h b/sound/soc/codecs/cs42l52.h index 60985c05907..4277012c471 100644 --- a/sound/soc/codecs/cs42l52.h +++ b/sound/soc/codecs/cs42l52.h @@ -157,7 +157,7 @@  #define CS42L52_PB_CTL1_INV_PCMA		(1 << 2)  #define CS42L52_PB_CTL1_MSTB_MUTE		(1 << 1)  #define CS42L52_PB_CTL1_MSTA_MUTE		(1 << 0) -#define CS42L52_PB_CTL1_MUTE_MASK		0xFFFD +#define CS42L52_PB_CTL1_MUTE_MASK		0x03  #define CS42L52_PB_CTL1_MUTE			3  #define CS42L52_PB_CTL1_UNMUTE			0 diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index ce0d36412c9..8d14a76c724 100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c @@ -2233,7 +2233,7 @@ static int max98090_probe(struct snd_soc_codec *codec)  	dev_dbg(codec->dev, "irq = %d\n", max98090->irq);  	ret = request_threaded_irq(max98090->irq, NULL, -		max98090_interrupt, IRQF_TRIGGER_FALLING, +		max98090_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT,  		"max98090_interrupt", codec);  	if (ret < 0) {  		dev_err(codec->dev, "request_irq failed: %d\n", diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index 731884e0477..ba38f067966 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c @@ -190,7 +190,7 @@ ARIZONA_MIXER_CONTROLS("DSP2R", ARIZONA_DSP2RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("DSP3L", ARIZONA_DSP3LMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("DSP3R", ARIZONA_DSP3RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("DSP4L", ARIZONA_DSP4LMIX_INPUT_1_SOURCE), -ARIZONA_MIXER_CONTROLS("DSP5R", ARIZONA_DSP4RMIX_INPUT_1_SOURCE), +ARIZONA_MIXER_CONTROLS("DSP4R", ARIZONA_DSP4RMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("Mic", ARIZONA_MICMIX_INPUT_1_SOURCE),  ARIZONA_MIXER_CONTROLS("Noise", ARIZONA_NOISEMIX_INPUT_1_SOURCE), @@ -976,6 +976,8 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)  	if (ret != 0)  		return ret; +	arizona_init_spk(codec); +  	snd_soc_dapm_disable_pin(&codec->dapm, "HAPTICS");  	priv->core.arizona->dapm = &codec->dapm; diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 1eb152cb109..dfd997aaadf 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -383,6 +383,8 @@ static int wm8994_get_drc_enum(struct snd_kcontrol *kcontrol,  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	int drc = wm8994_get_drc(kcontrol->id.name); +	if (drc < 0) +		return drc;  	ucontrol->value.enumerated.item[0] = wm8994->drc_cfg[drc];  	return 0; @@ -488,6 +490,9 @@ static int wm8994_get_retune_mobile_enum(struct snd_kcontrol *kcontrol,  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);  	int block = wm8994_get_retune_mobile_block(kcontrol->id.name); +	if (block < 0) +		return block; +  	ucontrol->value.enumerated.item[0] = wm8994->retune_mobile_cfg[block];  	return 0; @@ -1031,7 +1036,7 @@ static int aif1clk_ev(struct snd_soc_dapm_widget *w,  {  	struct snd_soc_codec *codec = w->codec;  	struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); -	struct wm8994 *control = codec->control_data; +	struct wm8994 *control = wm8994->wm8994;  	int mask = WM8994_AIF1DAC1L_ENA | WM8994_AIF1DAC1R_ENA;  	int i;  	int dac; @@ -3833,6 +3838,11 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data)  			dev_dbg(codec->dev, "Ignoring removed jack\n");  			return IRQ_HANDLED;  		} +	} else if (!(reg & WM8958_MICD_STS)) { +		snd_soc_jack_report(wm8994->micdet[0].jack, 0, +				    SND_JACK_MECHANICAL | SND_JACK_HEADSET | +				    wm8994->btn_mask); +		goto out;  	}  	if (wm8994->mic_detecting) diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 56ecfc72f2e..81490febac6 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -631,7 +631,8 @@ static int davinci_config_channel_size(struct davinci_audio_dev *dev,  				       int word_length)  {  	u32 fmt; -	u32 rotate = (word_length / 4) & 0x7; +	u32 tx_rotate = (word_length / 4) & 0x7; +	u32 rx_rotate = (32 - word_length) / 4;  	u32 mask = (1ULL << word_length) - 1;  	/* @@ -655,9 +656,9 @@ static int davinci_config_channel_size(struct davinci_audio_dev *dev,  		mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMT_REG,  				TXSSZ(fmt), TXSSZ(0x0F));  		mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, -				TXROT(rotate), TXROT(7)); +				TXROT(tx_rotate), TXROT(7));  		mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMT_REG, -				RXROT(rotate), RXROT(7)); +				RXROT(rx_rotate), RXROT(7));  		mcasp_set_reg(dev->base + DAVINCI_MCASP_RXMASK_REG,  				mask);  	} diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index 3853f7eb3f2..06a8000aa07 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c @@ -220,8 +220,12 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,  			goto err;  	} -	snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK, -				SND_SOC_DAPM_STREAM_START); +	if (cstream->direction == SND_COMPRESS_PLAYBACK) +		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK, +					SND_SOC_DAPM_STREAM_START); +	else +		snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE, +					SND_SOC_DAPM_STREAM_START);  	/* cancel any delayed stream shutdown that is pending */  	rtd->pop_wait = 0; diff --git a/sound/usb/6fire/firmware.c b/sound/usb/6fire/firmware.c index a1d9b0792a1..b9defcdeb7e 100644 --- a/sound/usb/6fire/firmware.c +++ b/sound/usb/6fire/firmware.c @@ -42,8 +42,8 @@ static const u8 ep_w_max_packet_size[] = {  	0x94, 0x01, 0x5c, 0x02  /* alt 3: 404 EP2 and 604 EP6 (25 fpp) */  }; -static const u8 known_fw_versions[][4] = { -	{ 0x03, 0x01, 0x0b, 0x00 } +static const u8 known_fw_versions[][2] = { +	{ 0x03, 0x01 }  };  struct ihex_record { @@ -343,7 +343,7 @@ static int usb6fire_fw_check(u8 *version)  	int i;  	for (i = 0; i < ARRAY_SIZE(known_fw_versions); i++) -		if (!memcmp(version, known_fw_versions + i, 4)) +		if (!memcmp(version, known_fw_versions + i, 2))  			return 0;  	snd_printk(KERN_ERR PREFIX "invalid fimware version in device: %*ph. " diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index ca4739c3f65..e5c7f9f20fd 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -886,6 +886,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,  	case USB_ID(0x046d, 0x0808):  	case USB_ID(0x046d, 0x0809):  	case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ +	case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */  	case USB_ID(0x046d, 0x0991):  	/* Most audio usb devices lie about volume resolution.  	 * Most Logitech webcams have res = 384. diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 7f1722f82c8..8b75bcf136f 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h @@ -215,7 +215,13 @@  	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL  },  { -	USB_DEVICE(0x046d, 0x0990), +	.match_flags = USB_DEVICE_ID_MATCH_DEVICE | +		       USB_DEVICE_ID_MATCH_INT_CLASS | +		       USB_DEVICE_ID_MATCH_INT_SUBCLASS, +	.idVendor = 0x046d, +	.idProduct = 0x0990, +	.bInterfaceClass = USB_CLASS_AUDIO, +	.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL,  	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {  		.vendor_name = "Logitech, Inc.",  		.product_name = "QuickCam Pro 9000", @@ -1792,7 +1798,11 @@ YAMAHA_DEVICE(0x7010, "UB99"),  	USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108),  	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {  		.ifnum = 0, -		.type = QUIRK_MIDI_STANDARD_INTERFACE +		.type = QUIRK_MIDI_FIXED_ENDPOINT, +		.data = & (const struct snd_usb_midi_endpoint_info) { +			.out_cables = 0x0007, +			.in_cables  = 0x0007 +		}  	}  },  {  |