Merge branch 'sched/clock' into x86/cleanups
Reason: The tsc init cleanup depends on sched_clock_init moving past late_time_init. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Коммит
4152f93508
|
@ -629,7 +629,7 @@ CONFIG_SCSI_LOWLEVEL=y
|
|||
CONFIG_ATA=y
|
||||
# CONFIG_ATA_NONSTANDARD is not set
|
||||
CONFIG_SATA_PMP=y
|
||||
# CONFIG_SATA_AHCI is not set
|
||||
CONFIG_SATA_AHCI=y
|
||||
# CONFIG_SATA_SIL24 is not set
|
||||
CONFIG_ATA_SFF=y
|
||||
# CONFIG_SATA_SVW is not set
|
||||
|
|
|
@ -206,6 +206,15 @@ static void __init qnap_ts219_init(void)
|
|||
|
||||
}
|
||||
|
||||
static int __init ts219_pci_init(void)
|
||||
{
|
||||
if (machine_is_ts219())
|
||||
kirkwood_pcie_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(ts219_pci_init);
|
||||
|
||||
MACHINE_START(TS219, "QNAP TS-119/TS-219")
|
||||
/* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
|
||||
.phys_io = KIRKWOOD_REGS_PHYS_BASE,
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#ifndef __PLAT_GPIO_H
|
||||
#define __PLAT_GPIO_H
|
||||
|
||||
#include <linux/init.h>
|
||||
|
||||
/*
|
||||
* GENERIC_GPIO primitives.
|
||||
*/
|
||||
|
|
|
@ -72,6 +72,10 @@ static struct ads7846_platform_data ads7843_data = {
|
|||
.debounce_max = 20,
|
||||
.debounce_rep = 4,
|
||||
.debounce_tol = 5,
|
||||
|
||||
.keep_vref_on = true,
|
||||
.settle_delay_usecs = 500,
|
||||
.penirq_recheck_delay_usecs = 100,
|
||||
};
|
||||
|
||||
static struct spi_board_info __initdata spi1_board_info[] = {
|
||||
|
|
|
@ -24,8 +24,8 @@ memcpy:
|
|||
brne 1f
|
||||
|
||||
/* At this point, "from" is word-aligned */
|
||||
2: sub r10, 4
|
||||
mov r9, r12
|
||||
2: mov r9, r12
|
||||
5: sub r10, 4
|
||||
brlt 4f
|
||||
|
||||
3: ld.w r8, r11++
|
||||
|
@ -49,6 +49,7 @@ memcpy:
|
|||
|
||||
/* Handle unaligned "from" pointer */
|
||||
1: sub r10, 4
|
||||
movlt r9, r12
|
||||
brlt 4b
|
||||
add r10, r9
|
||||
lsl r9, 2
|
||||
|
@ -59,4 +60,13 @@ memcpy:
|
|||
st.b r12++, r8
|
||||
ld.ub r8, r11++
|
||||
st.b r12++, r8
|
||||
rjmp 2b
|
||||
mov r8, r12
|
||||
add pc, pc, r9
|
||||
sub r8, 1
|
||||
nop
|
||||
sub r8, 1
|
||||
nop
|
||||
sub r8, 1
|
||||
nop
|
||||
mov r9, r8
|
||||
rjmp 5b
|
||||
|
|
|
@ -574,10 +574,11 @@ static int a2000_hwclk(int op, struct rtc_time *t)
|
|||
|
||||
tod_2000.cntrl1 = TOD2000_CNTRL1_HOLD;
|
||||
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--) {
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) {
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
udelay(70);
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
--cnt;
|
||||
}
|
||||
|
||||
if (!cnt)
|
||||
|
@ -649,10 +650,11 @@ static int amiga_set_clock_mmss(unsigned long nowtime)
|
|||
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--) {
|
||||
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt) {
|
||||
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
|
||||
udelay(70);
|
||||
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
|
||||
--cnt;
|
||||
}
|
||||
|
||||
if (!cnt)
|
||||
|
|
|
@ -36,12 +36,10 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addres
|
|||
return NULL;
|
||||
|
||||
pte = kmap(page);
|
||||
if (pte) {
|
||||
__flush_page_to_ram(pte);
|
||||
flush_tlb_kernel_page(pte);
|
||||
nocache_page(pte);
|
||||
}
|
||||
kunmap(pte);
|
||||
__flush_page_to_ram(pte);
|
||||
flush_tlb_kernel_page(pte);
|
||||
nocache_page(pte);
|
||||
kunmap(page);
|
||||
pgtable_page_ctor(page);
|
||||
return page;
|
||||
}
|
||||
|
|
|
@ -135,8 +135,6 @@ static inline void update_mmu_cache(struct vm_area_struct *vma,
|
|||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm-generic/pgtable.h>
|
||||
|
||||
/*
|
||||
* Macro to mark a page protection value as "uncacheable".
|
||||
*/
|
||||
|
@ -154,6 +152,7 @@ static inline void update_mmu_cache(struct vm_area_struct *vma,
|
|||
? (__pgprot((pgprot_val(prot) & _CACHEMASK040) | _PAGE_NOCACHE_S)) \
|
||||
: (prot)))
|
||||
|
||||
#include <asm-generic/pgtable.h>
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
|
|
|
@ -334,10 +334,12 @@
|
|||
#define __NR_inotify_init1 328
|
||||
#define __NR_preadv 329
|
||||
#define __NR_pwritev 330
|
||||
#define __NR_rt_tgsigqueueinfo 331
|
||||
#define __NR_perf_counter_open 332
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NR_syscalls 331
|
||||
#define NR_syscalls 333
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
|
|
|
@ -755,4 +755,6 @@ sys_call_table:
|
|||
.long sys_inotify_init1
|
||||
.long sys_preadv
|
||||
.long sys_pwritev /* 330 */
|
||||
.long sys_rt_tgsigqueueinfo
|
||||
.long sys_perf_counter_open
|
||||
|
||||
|
|
|
@ -349,6 +349,8 @@ ENTRY(sys_call_table)
|
|||
.long sys_inotify_init1
|
||||
.long sys_preadv
|
||||
.long sys_pwritev /* 330 */
|
||||
.long sys_rt_tgsigqueueinfo
|
||||
.long sys_perf_counter_open
|
||||
|
||||
.rept NR_syscalls-(.-sys_call_table)/4
|
||||
.long sys_ni_syscall
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc5
|
||||
# Fri May 15 10:37:00 2009
|
||||
# Linux kernel version: 2.6.31-rc7
|
||||
# Mon Aug 24 17:38:50 2009
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
|
||||
#
|
||||
# Processor support
|
||||
#
|
||||
CONFIG_PPC_BOOK3S_64=y
|
||||
CONFIG_PPC_BOOK3S=y
|
||||
# CONFIG_POWER4_ONLY is not set
|
||||
CONFIG_POWER3=y
|
||||
|
@ -20,6 +21,7 @@ CONFIG_PPC_STD_MMU=y
|
|||
CONFIG_PPC_STD_MMU_64=y
|
||||
CONFIG_PPC_MM_SLICES=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_PPC_HAVE_PMU_SUPPORT=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
CONFIG_64BIT=y
|
||||
|
@ -31,6 +33,7 @@ CONFIG_GENERIC_TIME=y
|
|||
CONFIG_GENERIC_TIME_VSYSCALL=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
|
||||
CONFIG_IRQ_PER_CPU=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
|
@ -41,7 +44,6 @@ CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
|||
CONFIG_ARCH_HAS_ILOG2_U32=y
|
||||
CONFIG_ARCH_HAS_ILOG2_U64=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
CONFIG_PPC=y
|
||||
|
@ -62,6 +64,7 @@ CONFIG_DTC=y
|
|||
# CONFIG_PPC_DCR_MMIO is not set
|
||||
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -113,7 +116,6 @@ CONFIG_SYSCTL_SYSCALL=y
|
|||
CONFIG_KALLSYMS=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_KALLSYMS_EXTRA_PASS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
|
@ -126,7 +128,14 @@ CONFIG_TIMERFD=y
|
|||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
CONFIG_HAVE_PERF_COUNTERS=y
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
#
|
||||
# CONFIG_PERF_COUNTERS is not set
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
|
@ -145,6 +154,11 @@ CONFIG_HAVE_KRETPROBES=y
|
|||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_DMA_ATTRS=y
|
||||
CONFIG_USE_GENERIC_SMP_HELPERS=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_GCOV_KERNEL is not set
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
|
@ -210,7 +224,7 @@ CONFIG_PPC_CELL=y
|
|||
#
|
||||
# Cell Broadband Engine options
|
||||
#
|
||||
CONFIG_SPU_FS=y
|
||||
CONFIG_SPU_FS=m
|
||||
CONFIG_SPU_FS_64K_LS=y
|
||||
# CONFIG_SPU_TRACE is not set
|
||||
CONFIG_SPU_BASE=y
|
||||
|
@ -255,6 +269,7 @@ CONFIG_BINFMT_MISC=y
|
|||
CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
|
||||
# CONFIG_IOMMU_VMERGE is not set
|
||||
CONFIG_IOMMU_HELPER=y
|
||||
# CONFIG_SWIOTLB is not set
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
CONFIG_ARCH_HAS_WALK_MEMORY=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
||||
|
@ -285,9 +300,9 @@ CONFIG_MIGRATION=y
|
|||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_UNEVICTABLE_LRU=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
CONFIG_ARCH_MEMORY_PROBE=y
|
||||
CONFIG_PPC_HAS_HASH_64K=y
|
||||
CONFIG_PPC_4K_PAGES=y
|
||||
|
@ -399,6 +414,7 @@ CONFIG_IPV6_NDISC_NODETYPE=y
|
|||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_PHONET is not set
|
||||
# CONFIG_IEEE802154 is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
|
@ -433,11 +449,14 @@ CONFIG_BT_HCIBTUSB=m
|
|||
CONFIG_WIRELESS=y
|
||||
CONFIG_CFG80211=m
|
||||
# CONFIG_CFG80211_REG_DEBUG is not set
|
||||
# CONFIG_CFG80211_DEBUGFS is not set
|
||||
# CONFIG_WIRELESS_OLD_REGULATORY is not set
|
||||
CONFIG_WIRELESS_EXT=y
|
||||
# CONFIG_WIRELESS_EXT_SYSFS is not set
|
||||
# CONFIG_LIB80211 is not set
|
||||
CONFIG_MAC80211=m
|
||||
CONFIG_MAC80211_DEFAULT_PS=y
|
||||
CONFIG_MAC80211_DEFAULT_PS_VALUE=1
|
||||
|
||||
#
|
||||
# Rate control algorithm selection
|
||||
|
@ -447,7 +466,6 @@ CONFIG_MAC80211_RC_PID=y
|
|||
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
||||
# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set
|
||||
CONFIG_MAC80211_RC_DEFAULT="pid"
|
||||
# CONFIG_MAC80211_MESH is not set
|
||||
# CONFIG_MAC80211_LEDS is not set
|
||||
# CONFIG_MAC80211_DEBUGFS is not set
|
||||
# CONFIG_MAC80211_DEBUG_MENU is not set
|
||||
|
@ -472,77 +490,7 @@ CONFIG_EXTRA_FIRMWARE=""
|
|||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_DEBUG=y
|
||||
CONFIG_MTD_DEBUG_VERBOSE=0
|
||||
# CONFIG_MTD_CONCAT is not set
|
||||
# CONFIG_MTD_PARTITIONS is not set
|
||||
# CONFIG_MTD_TESTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
#
|
||||
# CONFIG_MTD_CHAR is not set
|
||||
CONFIG_MTD_BLKDEVS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
# CONFIG_MTD_CFI is not set
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
#
|
||||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
# Disk-On-Chip Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_DOC2000 is not set
|
||||
# CONFIG_MTD_DOC2001 is not set
|
||||
# CONFIG_MTD_DOC2001PLUS is not set
|
||||
# CONFIG_MTD_NAND is not set
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# LPDDR flash memory drivers
|
||||
#
|
||||
# CONFIG_MTD_LPDDR is not set
|
||||
|
||||
#
|
||||
# UBI - Unsorted block images
|
||||
#
|
||||
# CONFIG_MTD_UBI is not set
|
||||
# CONFIG_MTD is not set
|
||||
CONFIG_OF_DEVICE=y
|
||||
# CONFIG_PARPORT is not set
|
||||
CONFIG_BLK_DEV=y
|
||||
|
@ -590,10 +538,6 @@ CONFIG_BLK_DEV_SR=y
|
|||
# CONFIG_BLK_DEV_SR_VENDOR is not set
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
# CONFIG_SCSI_CONSTANTS is not set
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
@ -626,7 +570,6 @@ CONFIG_BLK_DEV_DM=m
|
|||
# CONFIG_DM_UEVENT is not set
|
||||
# CONFIG_MACINTOSH_DRIVERS is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
|
@ -646,10 +589,11 @@ CONFIG_MII=m
|
|||
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
|
||||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_GELIC_NET=y
|
||||
CONFIG_GELIC_WIRELESS=y
|
||||
CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE=y
|
||||
# CONFIG_GELIC_WIRELESS_OLD_PSK_INTERFACE is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
|
||||
#
|
||||
|
@ -669,8 +613,7 @@ CONFIG_WLAN_80211=y
|
|||
# CONFIG_HOSTAP is not set
|
||||
# CONFIG_B43 is not set
|
||||
# CONFIG_B43LEGACY is not set
|
||||
CONFIG_ZD1211RW=m
|
||||
# CONFIG_ZD1211RW_DEBUG is not set
|
||||
# CONFIG_ZD1211RW is not set
|
||||
# CONFIG_RT2X00 is not set
|
||||
|
||||
#
|
||||
|
@ -682,7 +625,7 @@ CONFIG_ZD1211RW=m
|
|||
#
|
||||
# CONFIG_USB_CATC is not set
|
||||
# CONFIG_USB_KAWETH is not set
|
||||
CONFIG_USB_PEGASUS=m
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
CONFIG_USB_USBNET=m
|
||||
CONFIG_USB_NET_AX8817X=m
|
||||
|
@ -693,10 +636,11 @@ CONFIG_USB_NET_AX8817X=m
|
|||
# CONFIG_USB_NET_GL620A is not set
|
||||
# CONFIG_USB_NET_NET1080 is not set
|
||||
# CONFIG_USB_NET_PLUSB is not set
|
||||
CONFIG_USB_NET_MCS7830=m
|
||||
# CONFIG_USB_NET_MCS7830 is not set
|
||||
# CONFIG_USB_NET_RNDIS_HOST is not set
|
||||
# CONFIG_USB_NET_CDC_SUBSET is not set
|
||||
# CONFIG_USB_NET_ZAURUS is not set
|
||||
# CONFIG_USB_NET_INT51X1 is not set
|
||||
# CONFIG_WAN is not set
|
||||
CONFIG_PPP=m
|
||||
CONFIG_PPP_MULTILINK=y
|
||||
|
@ -771,8 +715,7 @@ CONFIG_DEVKMEM=y
|
|||
#
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_HVC_UDBG is not set
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
|
@ -782,6 +725,11 @@ CONFIG_LEGACY_PTY_COUNT=16
|
|||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_GPIOLIB is not set
|
||||
# CONFIG_W1 is not set
|
||||
|
@ -805,22 +753,7 @@ CONFIG_SSB_POSSIBLE=y
|
|||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
@ -898,6 +831,11 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
|||
CONFIG_SND_VERBOSE_PROCFS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
# CONFIG_SND_RAWMIDI_SEQ is not set
|
||||
# CONFIG_SND_OPL3_LIB_SEQ is not set
|
||||
# CONFIG_SND_OPL4_LIB_SEQ is not set
|
||||
# CONFIG_SND_SBAWE_SEQ is not set
|
||||
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_PPC=y
|
||||
CONFIG_SND_PS3=m
|
||||
|
@ -930,29 +868,34 @@ CONFIG_USB_HIDDEV=y
|
|||
# Special HID drivers
|
||||
#
|
||||
# CONFIG_HID_A4TECH is not set
|
||||
# CONFIG_HID_APPLE is not set
|
||||
# CONFIG_HID_BELKIN is not set
|
||||
# CONFIG_HID_CHERRY is not set
|
||||
CONFIG_HID_APPLE=m
|
||||
CONFIG_HID_BELKIN=m
|
||||
CONFIG_HID_CHERRY=m
|
||||
# CONFIG_HID_CHICONY is not set
|
||||
# CONFIG_HID_CYPRESS is not set
|
||||
# CONFIG_DRAGONRISE_FF is not set
|
||||
# CONFIG_HID_EZKEY is not set
|
||||
# CONFIG_HID_DRAGONRISE is not set
|
||||
CONFIG_HID_EZKEY=m
|
||||
# CONFIG_HID_KYE is not set
|
||||
# CONFIG_HID_GYRATION is not set
|
||||
# CONFIG_HID_KENSINGTON is not set
|
||||
# CONFIG_HID_LOGITECH is not set
|
||||
# CONFIG_HID_MICROSOFT is not set
|
||||
CONFIG_HID_LOGITECH=m
|
||||
# CONFIG_LOGITECH_FF is not set
|
||||
# CONFIG_LOGIRUMBLEPAD2_FF is not set
|
||||
CONFIG_HID_MICROSOFT=m
|
||||
# CONFIG_HID_MONTEREY is not set
|
||||
# CONFIG_HID_NTRIG is not set
|
||||
# CONFIG_HID_PANTHERLORD is not set
|
||||
# CONFIG_HID_PETALYNX is not set
|
||||
# CONFIG_HID_SAMSUNG is not set
|
||||
CONFIG_HID_SONY=m
|
||||
# CONFIG_HID_SUNPLUS is not set
|
||||
# CONFIG_GREENASIA_FF is not set
|
||||
CONFIG_HID_SUNPLUS=m
|
||||
# CONFIG_HID_GREENASIA is not set
|
||||
CONFIG_HID_SMARTJOYPLUS=m
|
||||
# CONFIG_SMARTJOYPLUS_FF is not set
|
||||
# CONFIG_HID_TOPSEED is not set
|
||||
# CONFIG_THRUSTMASTER_FF is not set
|
||||
# CONFIG_ZEROPLUS_FF is not set
|
||||
# CONFIG_HID_THRUSTMASTER is not set
|
||||
# CONFIG_HID_WACOM is not set
|
||||
# CONFIG_HID_ZEROPLUS is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
@ -988,6 +931,8 @@ CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
|
|||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
# CONFIG_USB_ISP1760_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=m
|
||||
# CONFIG_USB_OHCI_HCD_PPC_OF_BE is not set
|
||||
# CONFIG_USB_OHCI_HCD_PPC_OF_LE is not set
|
||||
# CONFIG_USB_OHCI_HCD_PPC_OF is not set
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
|
||||
CONFIG_USB_OHCI_BIG_ENDIAN_MMIO=y
|
||||
|
@ -1115,6 +1060,10 @@ CONFIG_RTC_DRV_PS3=m
|
|||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
|
@ -1141,11 +1090,12 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
|
@ -1205,7 +1155,6 @@ CONFIG_MISC_FILESYSTEMS=y
|
|||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_SQUASHFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
|
@ -1222,6 +1171,7 @@ CONFIG_NFS_FS=y
|
|||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
CONFIG_NFS_V4=y
|
||||
# CONFIG_NFS_V4_1 is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
|
@ -1359,7 +1309,6 @@ CONFIG_DEBUG_MEMORY_INIT=y
|
|||
CONFIG_DEBUG_LIST=y
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_DEBUG_NOTIFIERS is not set
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
|
@ -1374,31 +1323,21 @@ CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
|
|||
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_RING_BUFFER=y
|
||||
CONFIG_EVENT_TRACING=y
|
||||
CONFIG_CONTEXT_SWITCH_TRACER=y
|
||||
CONFIG_TRACING=y
|
||||
CONFIG_TRACING_SUPPORT=y
|
||||
|
||||
#
|
||||
# Tracers
|
||||
#
|
||||
# CONFIG_FUNCTION_TRACER is not set
|
||||
# CONFIG_IRQSOFF_TRACER is not set
|
||||
# CONFIG_SCHED_TRACER is not set
|
||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||
# CONFIG_EVENT_TRACER is not set
|
||||
# CONFIG_BOOT_TRACER is not set
|
||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
||||
# CONFIG_STACK_TRACER is not set
|
||||
# CONFIG_KMEMTRACE is not set
|
||||
# CONFIG_WORKQUEUE_TRACER is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_FTRACE_STARTUP_TEST is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_DYNAMIC_DEBUG is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_HAVE_ARCH_KGDB=y
|
||||
# CONFIG_KGDB is not set
|
||||
# CONFIG_PPC_DISABLE_WERROR is not set
|
||||
CONFIG_PPC_WERROR=y
|
||||
CONFIG_PRINT_STACK_DEPTH=64
|
||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_PPC_EMULATED_STATS is not set
|
||||
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||
# CONFIG_MSI_BITMAP_SELFTEST is not set
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/firmware.h>
|
||||
#include <asm/rtc.h>
|
||||
#include <asm/lv1call.h>
|
||||
#include <asm/ps3.h>
|
||||
|
@ -84,6 +85,9 @@ static int __init ps3_rtc_init(void)
|
|||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!firmware_has_feature(FW_FEATURE_PS3_LV1))
|
||||
return -ENODEV;
|
||||
|
||||
pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0);
|
||||
if (IS_ERR(pdev))
|
||||
return PTR_ERR(pdev);
|
||||
|
|
|
@ -154,6 +154,20 @@ static int __init condev_setup(char *str)
|
|||
|
||||
__setup("condev=", condev_setup);
|
||||
|
||||
static void __init set_preferred_console(void)
|
||||
{
|
||||
if (MACHINE_IS_KVM) {
|
||||
add_preferred_console("hvc", 0, NULL);
|
||||
s390_virtio_console_init();
|
||||
return;
|
||||
}
|
||||
|
||||
if (CONSOLE_IS_3215 || CONSOLE_IS_SCLP)
|
||||
add_preferred_console("ttyS", 0, NULL);
|
||||
if (CONSOLE_IS_3270)
|
||||
add_preferred_console("tty3270", 0, NULL);
|
||||
}
|
||||
|
||||
static int __init conmode_setup(char *str)
|
||||
{
|
||||
#if defined(CONFIG_SCLP_CONSOLE) || defined(CONFIG_SCLP_VT220_CONSOLE)
|
||||
|
@ -168,6 +182,7 @@ static int __init conmode_setup(char *str)
|
|||
if (strncmp(str, "3270", 5) == 0)
|
||||
SET_CONSOLE_3270;
|
||||
#endif
|
||||
set_preferred_console();
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -780,9 +795,6 @@ static void __init setup_hwcaps(void)
|
|||
void __init
|
||||
setup_arch(char **cmdline_p)
|
||||
{
|
||||
/* set up preferred console */
|
||||
add_preferred_console("ttyS", 0, NULL);
|
||||
|
||||
/*
|
||||
* print what head.S has found out about the machine
|
||||
*/
|
||||
|
@ -802,11 +814,9 @@ setup_arch(char **cmdline_p)
|
|||
if (MACHINE_IS_VM)
|
||||
pr_info("Linux is running as a z/VM "
|
||||
"guest operating system in 64-bit mode\n");
|
||||
else if (MACHINE_IS_KVM) {
|
||||
else if (MACHINE_IS_KVM)
|
||||
pr_info("Linux is running under KVM in 64-bit mode\n");
|
||||
add_preferred_console("hvc", 0, NULL);
|
||||
s390_virtio_console_init();
|
||||
} else
|
||||
else
|
||||
pr_info("Linux is running natively in 64-bit mode\n");
|
||||
#endif /* CONFIG_64BIT */
|
||||
|
||||
|
@ -851,6 +861,7 @@ setup_arch(char **cmdline_p)
|
|||
|
||||
/* Setup default console */
|
||||
conmode_default();
|
||||
set_preferred_console();
|
||||
|
||||
/* Setup zfcpdump support */
|
||||
setup_zfcpdump(console_devno);
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30-rc2
|
||||
# Fri Apr 17 04:04:46 2009
|
||||
# Linux kernel version: 2.6.31-rc1
|
||||
# Tue Aug 18 23:45:52 2009
|
||||
#
|
||||
# CONFIG_64BIT is not set
|
||||
CONFIG_SPARC=y
|
||||
|
@ -17,6 +17,7 @@ CONFIG_GENERIC_ISA_DMA=y
|
|||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
CONFIG_OF=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -74,7 +75,6 @@ CONFIG_SYSCTL_SYSCALL=y
|
|||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
|
@ -87,8 +87,13 @@ CONFIG_TIMERFD=y
|
|||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_AIO=y
|
||||
|
||||
#
|
||||
# Performance Counters
|
||||
#
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_PCI_QUIRKS=y
|
||||
# CONFIG_STRIP_ASM_SYMS is not set
|
||||
CONFIG_COMPAT_BRK=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
|
@ -97,6 +102,10 @@ CONFIG_SLAB=y
|
|||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
|
@ -109,7 +118,7 @@ CONFIG_MODULE_UNLOAD=y
|
|||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
CONFIG_LBDAF=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
|
@ -154,9 +163,9 @@ CONFIG_SPLIT_PTLOCK_CPUS=4
|
|||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_UNEVICTABLE_LRU=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||
CONFIG_SUN_PM=y
|
||||
# CONFIG_SPARC_LED is not set
|
||||
CONFIG_SERIAL_CONSOLE=y
|
||||
|
@ -264,6 +273,7 @@ CONFIG_IPV6_TUNNEL=m
|
|||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_PHONET is not set
|
||||
# CONFIG_IEEE802154 is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_DCB is not set
|
||||
|
||||
|
@ -281,7 +291,11 @@ CONFIG_WIRELESS=y
|
|||
CONFIG_WIRELESS_OLD_REGULATORY=y
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_LIB80211 is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
|
||||
#
|
||||
# CFG80211 needs to be enabled for MAC80211
|
||||
#
|
||||
CONFIG_MAC80211_DEFAULT_PS_VALUE=0
|
||||
# CONFIG_WIMAX is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
@ -335,6 +349,7 @@ CONFIG_MISC_DEVICES=y
|
|||
# EEPROM support
|
||||
#
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_CB710_CORE is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
|
@ -358,10 +373,6 @@ CONFIG_BLK_DEV_SR=m
|
|||
# CONFIG_BLK_DEV_SR_VENDOR is not set
|
||||
CONFIG_CHR_DEV_SG=m
|
||||
# CONFIG_CHR_DEV_SCH is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
# CONFIG_SCSI_CONSTANTS is not set
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
@ -379,6 +390,7 @@ CONFIG_SCSI_SPI_ATTRS=y
|
|||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_CXGB3_ISCSI is not set
|
||||
# CONFIG_SCSI_BNX2_ISCSI is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
# CONFIG_SCSI_ACARD is not set
|
||||
|
@ -387,6 +399,7 @@ CONFIG_SCSI_LOWLEVEL=y
|
|||
# CONFIG_SCSI_AIC7XXX_OLD is not set
|
||||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_MVSAS is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
|
@ -401,7 +414,6 @@ CONFIG_SCSI_LOWLEVEL=y
|
|||
# CONFIG_SCSI_IPS is not set
|
||||
# CONFIG_SCSI_INITIO is not set
|
||||
# CONFIG_SCSI_INIA100 is not set
|
||||
# CONFIG_SCSI_MVSAS is not set
|
||||
# CONFIG_SCSI_STEX is not set
|
||||
# CONFIG_SCSI_SYM53C8XX_2 is not set
|
||||
# CONFIG_SCSI_QLOGIC_1280 is not set
|
||||
|
@ -426,13 +438,16 @@ CONFIG_SCSI_SUNESP=y
|
|||
#
|
||||
|
||||
#
|
||||
# Enable only one of the two stacks, unless you know what you are doing
|
||||
# You can enable one or both FireWire driver stacks.
|
||||
#
|
||||
|
||||
#
|
||||
# See the help texts for more information.
|
||||
#
|
||||
# CONFIG_FIREWIRE is not set
|
||||
# CONFIG_IEEE1394 is not set
|
||||
# CONFIG_I2O is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_COMPAT_NET_DEV_OPS=y
|
||||
CONFIG_DUMMY=m
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
|
@ -463,6 +478,7 @@ CONFIG_SUNQE=m
|
|||
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
|
||||
# CONFIG_NET_PCI is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_KS8842 is not set
|
||||
# CONFIG_ATL2 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_ACENIC is not set
|
||||
|
@ -482,6 +498,7 @@ CONFIG_NETDEV_1000=y
|
|||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
# CONFIG_CNIC is not set
|
||||
# CONFIG_QLA3XXX is not set
|
||||
# CONFIG_ATL1 is not set
|
||||
# CONFIG_ATL1E is not set
|
||||
|
@ -629,6 +646,11 @@ CONFIG_HW_RANDOM=m
|
|||
CONFIG_DEVPORT=y
|
||||
# CONFIG_I2C is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_GPIOLIB is not set
|
||||
# CONFIG_W1 is not set
|
||||
|
@ -668,22 +690,7 @@ CONFIG_SSB_POSSIBLE=y
|
|||
# CONFIG_HTC_PASIC3 is not set
|
||||
# CONFIG_MFD_TMIO is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
@ -776,6 +783,10 @@ CONFIG_RTC_DRV_M48T59=y
|
|||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
|
@ -799,10 +810,12 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
|
@ -985,6 +998,7 @@ CONFIG_KGDB=y
|
|||
CONFIG_KGDB_SERIAL_CONSOLE=y
|
||||
CONFIG_KGDB_TESTS=y
|
||||
# CONFIG_KGDB_TESTS_ON_BOOT is not set
|
||||
# CONFIG_KMEMCHECK is not set
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_STACK_DEBUG is not set
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.30
|
||||
# Tue Jun 16 04:59:36 2009
|
||||
# Linux kernel version: 2.6.31-rc1
|
||||
# Tue Aug 18 23:56:02 2009
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_SPARC=y
|
||||
|
@ -26,6 +26,7 @@ CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
|||
CONFIG_OF=y
|
||||
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
CONFIG_CONSTRUCTORS=y
|
||||
|
||||
#
|
||||
# General setup
|
||||
|
@ -119,6 +120,11 @@ CONFIG_HAVE_KPROBES=y
|
|||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_USE_GENERIC_SMP_HELPERS=y
|
||||
|
||||
#
|
||||
# GCOV-based kernel profiling
|
||||
#
|
||||
# CONFIG_GCOV_KERNEL is not set
|
||||
# CONFIG_SLOW_WORK is not set
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
|
@ -204,7 +210,6 @@ CONFIG_MIGRATION=y
|
|||
CONFIG_PHYS_ADDR_T_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=0
|
||||
CONFIG_NR_QUICK=1
|
||||
CONFIG_UNEVICTABLE_LRU=y
|
||||
CONFIG_HAVE_MLOCK=y
|
||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=8192
|
||||
|
@ -410,6 +415,7 @@ CONFIG_MISC_DEVICES=y
|
|||
#
|
||||
# CONFIG_EEPROM_AT24 is not set
|
||||
# CONFIG_EEPROM_LEGACY is not set
|
||||
# CONFIG_EEPROM_MAX6875 is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_CB710_CORE is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
|
@ -562,6 +568,7 @@ CONFIG_BLK_DEV_DM=m
|
|||
CONFIG_DM_CRYPT=m
|
||||
CONFIG_DM_SNAPSHOT=m
|
||||
CONFIG_DM_MIRROR=m
|
||||
# CONFIG_DM_LOG_USERSPACE is not set
|
||||
CONFIG_DM_ZERO=m
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
# CONFIG_DM_DELAY is not set
|
||||
|
@ -573,7 +580,11 @@ CONFIG_DM_ZERO=m
|
|||
#
|
||||
|
||||
#
|
||||
# Enable only one of the two stacks, unless you know what you are doing
|
||||
# You can enable one or both FireWire driver stacks.
|
||||
#
|
||||
|
||||
#
|
||||
# See the help texts for more information.
|
||||
#
|
||||
# CONFIG_FIREWIRE is not set
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
@ -667,6 +678,7 @@ CONFIG_E1000E=m
|
|||
# CONFIG_VIA_VELOCITY is not set
|
||||
CONFIG_TIGON3=m
|
||||
CONFIG_BNX2=m
|
||||
# CONFIG_CNIC is not set
|
||||
# CONFIG_QLA3XXX is not set
|
||||
# CONFIG_ATL1 is not set
|
||||
# CONFIG_ATL1E is not set
|
||||
|
@ -773,6 +785,7 @@ CONFIG_MOUSE_SERIAL=y
|
|||
# CONFIG_MOUSE_APPLETOUCH is not set
|
||||
# CONFIG_MOUSE_BCM5974 is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_MOUSE_SYNAPTICS_I2C is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
|
@ -870,6 +883,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
#
|
||||
# I2C system bus drivers (mostly embedded / system-on-chip)
|
||||
#
|
||||
# CONFIG_I2C_DESIGNWARE is not set
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_SIMTEC is not set
|
||||
|
||||
|
@ -898,13 +912,17 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_PCF8575 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_SENSORS_TSL2550 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
# CONFIG_SPI is not set
|
||||
|
||||
#
|
||||
# PPS support
|
||||
#
|
||||
# CONFIG_PPS is not set
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
# CONFIG_GPIOLIB is not set
|
||||
# CONFIG_W1 is not set
|
||||
|
@ -959,6 +977,7 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_ADS7828 is not set
|
||||
# CONFIG_SENSORS_THMC50 is not set
|
||||
# CONFIG_SENSORS_TMP401 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_VT8231 is not set
|
||||
|
@ -994,23 +1013,9 @@ CONFIG_SSB_POSSIBLE=y
|
|||
# CONFIG_MFD_WM8400 is not set
|
||||
# CONFIG_MFD_WM8350_I2C is not set
|
||||
# CONFIG_MFD_PCF50633 is not set
|
||||
# CONFIG_AB3100_CORE is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia core support
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
# CONFIG_VIDEO_MEDIA is not set
|
||||
|
||||
#
|
||||
# Multimedia drivers
|
||||
#
|
||||
# CONFIG_DAB is not set
|
||||
# CONFIG_MEDIA_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
@ -1284,7 +1289,6 @@ CONFIG_USB=y
|
|||
#
|
||||
# Miscellaneous USB options
|
||||
#
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
|
@ -1296,6 +1300,7 @@ CONFIG_USB_DEVICEFS=y
|
|||
# USB Host Controller Drivers
|
||||
#
|
||||
# CONFIG_USB_C67X00_HCD is not set
|
||||
# CONFIG_USB_XHCI_HCD is not set
|
||||
CONFIG_USB_EHCI_HCD=m
|
||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||
|
@ -1374,7 +1379,6 @@ CONFIG_USB_STORAGE=m
|
|||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TRANCEVIBRATOR is not set
|
||||
# CONFIG_USB_IOWARRIOR is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
# CONFIG_USB_ISIGHTFW is not set
|
||||
# CONFIG_USB_VST is not set
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
@ -1420,6 +1424,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||
# CONFIG_RTC_DRV_S35390A is not set
|
||||
# CONFIG_RTC_DRV_FM3130 is not set
|
||||
# CONFIG_RTC_DRV_RX8581 is not set
|
||||
# CONFIG_RTC_DRV_RX8025 is not set
|
||||
|
||||
#
|
||||
# SPI RTC drivers
|
||||
|
@ -1448,6 +1453,10 @@ CONFIG_RTC_DRV_STARFIRE=y
|
|||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
# TI VLYNQ
|
||||
#
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
#
|
||||
|
@ -1480,11 +1489,11 @@ CONFIG_FS_MBCACHE=y
|
|||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
CONFIG_FILE_LOCKING=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_BTRFS_FS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_FSNOTIFY=y
|
||||
CONFIG_DNOTIFY=y
|
||||
CONFIG_INOTIFY=y
|
||||
|
@ -1560,7 +1569,7 @@ CONFIG_NETWORK_FILESYSTEMS=y
|
|||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
CONFIG_SUN_PARTITION=y
|
||||
CONFIG_NLS=m
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
|
|
|
@ -726,11 +726,17 @@ extern unsigned long pte_file(pte_t);
|
|||
extern pte_t pgoff_to_pte(unsigned long);
|
||||
#define PTE_FILE_MAX_BITS (64UL - PAGE_SHIFT - 1UL)
|
||||
|
||||
extern unsigned long *sparc64_valid_addr_bitmap;
|
||||
extern unsigned long sparc64_valid_addr_bitmap[];
|
||||
|
||||
/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
||||
#define kern_addr_valid(addr) \
|
||||
(test_bit(__pa((unsigned long)(addr))>>22, sparc64_valid_addr_bitmap))
|
||||
static inline bool kern_addr_valid(unsigned long addr)
|
||||
{
|
||||
unsigned long paddr = __pa(addr);
|
||||
|
||||
if ((paddr >> 41UL) != 0UL)
|
||||
return false;
|
||||
return test_bit(paddr >> 22, sparc64_valid_addr_bitmap);
|
||||
}
|
||||
|
||||
extern int page_in_phys_avail(unsigned long paddr);
|
||||
|
||||
|
|
|
@ -151,12 +151,46 @@ kvmap_dtlb_4v:
|
|||
* Must preserve %g1 and %g6 (TAG).
|
||||
*/
|
||||
kvmap_dtlb_tsb4m_miss:
|
||||
sethi %hi(kpte_linear_bitmap), %g2
|
||||
/* Clear the PAGE_OFFSET top virtual bits, shift
|
||||
* down to get PFN, and make sure PFN is in range.
|
||||
*/
|
||||
sllx %g4, 21, %g5
|
||||
|
||||
/* Check to see if we know about valid memory at the 4MB
|
||||
* chunk this physical address will reside within.
|
||||
*/
|
||||
srlx %g5, 21 + 41, %g2
|
||||
brnz,pn %g2, kvmap_dtlb_longpath
|
||||
nop
|
||||
|
||||
/* This unconditional branch and delay-slot nop gets patched
|
||||
* by the sethi sequence once the bitmap is properly setup.
|
||||
*/
|
||||
.globl valid_addr_bitmap_insn
|
||||
valid_addr_bitmap_insn:
|
||||
ba,pt %xcc, 2f
|
||||
nop
|
||||
.subsection 2
|
||||
.globl valid_addr_bitmap_patch
|
||||
valid_addr_bitmap_patch:
|
||||
sethi %hi(sparc64_valid_addr_bitmap), %g7
|
||||
or %g7, %lo(sparc64_valid_addr_bitmap), %g7
|
||||
.previous
|
||||
|
||||
srlx %g5, 21 + 22, %g2
|
||||
srlx %g2, 6, %g5
|
||||
and %g2, 63, %g2
|
||||
sllx %g5, 3, %g5
|
||||
ldx [%g7 + %g5], %g5
|
||||
mov 1, %g7
|
||||
sllx %g7, %g2, %g7
|
||||
andcc %g5, %g7, %g0
|
||||
be,pn %xcc, kvmap_dtlb_longpath
|
||||
|
||||
2: sethi %hi(kpte_linear_bitmap), %g2
|
||||
or %g2, %lo(kpte_linear_bitmap), %g2
|
||||
|
||||
/* Clear the PAGE_OFFSET top virtual bits, then shift
|
||||
* down to get a 256MB physical address index.
|
||||
*/
|
||||
/* Get the 256MB physical address index. */
|
||||
sllx %g4, 21, %g5
|
||||
mov 1, %g7
|
||||
srlx %g5, 21 + 28, %g5
|
||||
|
|
|
@ -162,9 +162,6 @@ extern void cpu_panic(void);
|
|||
*/
|
||||
|
||||
extern struct linux_prom_registers smp_penguin_ctable;
|
||||
extern unsigned long trapbase_cpu1[];
|
||||
extern unsigned long trapbase_cpu2[];
|
||||
extern unsigned long trapbase_cpu3[];
|
||||
|
||||
void __init smp4d_boot_cpus(void)
|
||||
{
|
||||
|
@ -235,25 +232,6 @@ void __init smp4d_smp_done(void)
|
|||
*prev = first;
|
||||
local_flush_cache_all();
|
||||
|
||||
/* Free unneeded trap tables */
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu1));
|
||||
init_page_count(virt_to_page(trapbase_cpu1));
|
||||
free_page((unsigned long)trapbase_cpu1);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu2));
|
||||
init_page_count(virt_to_page(trapbase_cpu2));
|
||||
free_page((unsigned long)trapbase_cpu2);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu3));
|
||||
init_page_count(virt_to_page(trapbase_cpu3));
|
||||
free_page((unsigned long)trapbase_cpu3);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
|
||||
/* Ok, they are spinning and ready to go. */
|
||||
smp_processors_ready = 1;
|
||||
sun4d_distribute_irqs();
|
||||
|
|
|
@ -121,9 +121,6 @@ void __cpuinit smp4m_callin(void)
|
|||
*/
|
||||
|
||||
extern struct linux_prom_registers smp_penguin_ctable;
|
||||
extern unsigned long trapbase_cpu1[];
|
||||
extern unsigned long trapbase_cpu2[];
|
||||
extern unsigned long trapbase_cpu3[];
|
||||
|
||||
void __init smp4m_boot_cpus(void)
|
||||
{
|
||||
|
@ -193,29 +190,6 @@ void __init smp4m_smp_done(void)
|
|||
*prev = first;
|
||||
local_flush_cache_all();
|
||||
|
||||
/* Free unneeded trap tables */
|
||||
if (!cpu_isset(1, cpu_present_map)) {
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu1));
|
||||
init_page_count(virt_to_page(trapbase_cpu1));
|
||||
free_page((unsigned long)trapbase_cpu1);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
}
|
||||
if (!cpu_isset(2, cpu_present_map)) {
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu2));
|
||||
init_page_count(virt_to_page(trapbase_cpu2));
|
||||
free_page((unsigned long)trapbase_cpu2);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
}
|
||||
if (!cpu_isset(3, cpu_present_map)) {
|
||||
ClearPageReserved(virt_to_page(trapbase_cpu3));
|
||||
init_page_count(virt_to_page(trapbase_cpu3));
|
||||
free_page((unsigned long)trapbase_cpu3);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
}
|
||||
|
||||
/* Ok, they are spinning and ready to go. */
|
||||
}
|
||||
|
||||
|
|
|
@ -134,10 +134,12 @@ SIGN1(sys32_getpeername, sys_getpeername, %o0)
|
|||
SIGN1(sys32_getsockname, sys_getsockname, %o0)
|
||||
SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1)
|
||||
SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2)
|
||||
SIGN2(sys32_splice, sys_splice, %o0, %o1)
|
||||
SIGN2(sys32_splice, sys_splice, %o0, %o2)
|
||||
SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5)
|
||||
SIGN2(sys32_tee, sys_tee, %o0, %o1)
|
||||
SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0)
|
||||
SIGN1(sys32_truncate, sys_truncate, %o1)
|
||||
SIGN1(sys32_ftruncate, sys_ftruncate, %o1)
|
||||
|
||||
.globl sys32_mmap2
|
||||
sys32_mmap2:
|
||||
|
|
|
@ -43,8 +43,8 @@ sys_call_table32:
|
|||
/*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall
|
||||
.word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
|
||||
/*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod
|
||||
.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate
|
||||
/*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
|
||||
.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate
|
||||
/*130*/ .word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall
|
||||
.word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64
|
||||
/*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit
|
||||
.word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write
|
||||
|
|
|
@ -319,9 +319,10 @@ no_context:
|
|||
*/
|
||||
out_of_memory:
|
||||
up_read(&mm->mmap_sem);
|
||||
printk("VM: killing process %s\n", tsk->comm);
|
||||
if (from_user)
|
||||
do_group_exit(SIGKILL);
|
||||
if (from_user) {
|
||||
pagefault_out_of_memory();
|
||||
return;
|
||||
}
|
||||
goto no_context;
|
||||
|
||||
do_sigbus:
|
||||
|
|
|
@ -447,9 +447,10 @@ handle_kernel_fault:
|
|||
out_of_memory:
|
||||
insn = get_fault_insn(regs, insn);
|
||||
up_read(&mm->mmap_sem);
|
||||
printk("VM: killing process %s\n", current->comm);
|
||||
if (!(regs->tstate & TSTATE_PRIV))
|
||||
do_group_exit(SIGKILL);
|
||||
if (!(regs->tstate & TSTATE_PRIV)) {
|
||||
pagefault_out_of_memory();
|
||||
return;
|
||||
}
|
||||
goto handle_kernel_fault;
|
||||
|
||||
intr_or_no_mm:
|
||||
|
|
|
@ -145,7 +145,8 @@ static void __init read_obp_memory(const char *property,
|
|||
cmp_p64, NULL);
|
||||
}
|
||||
|
||||
unsigned long *sparc64_valid_addr_bitmap __read_mostly;
|
||||
unsigned long sparc64_valid_addr_bitmap[VALID_ADDR_BITMAP_BYTES /
|
||||
sizeof(unsigned long)];
|
||||
EXPORT_SYMBOL(sparc64_valid_addr_bitmap);
|
||||
|
||||
/* Kernel physical address base and size in bytes. */
|
||||
|
@ -1874,7 +1875,7 @@ static int pavail_rescan_ents __initdata;
|
|||
* memory list again, and make sure it provides at least as much
|
||||
* memory as 'pavail' does.
|
||||
*/
|
||||
static void __init setup_valid_addr_bitmap_from_pavail(void)
|
||||
static void __init setup_valid_addr_bitmap_from_pavail(unsigned long *bitmap)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -1897,8 +1898,7 @@ static void __init setup_valid_addr_bitmap_from_pavail(void)
|
|||
|
||||
if (new_start <= old_start &&
|
||||
new_end >= (old_start + PAGE_SIZE)) {
|
||||
set_bit(old_start >> 22,
|
||||
sparc64_valid_addr_bitmap);
|
||||
set_bit(old_start >> 22, bitmap);
|
||||
goto do_next_page;
|
||||
}
|
||||
}
|
||||
|
@ -1919,20 +1919,21 @@ static void __init setup_valid_addr_bitmap_from_pavail(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void __init patch_tlb_miss_handler_bitmap(void)
|
||||
{
|
||||
extern unsigned int valid_addr_bitmap_insn[];
|
||||
extern unsigned int valid_addr_bitmap_patch[];
|
||||
|
||||
valid_addr_bitmap_insn[1] = valid_addr_bitmap_patch[1];
|
||||
mb();
|
||||
valid_addr_bitmap_insn[0] = valid_addr_bitmap_patch[0];
|
||||
flushi(&valid_addr_bitmap_insn[0]);
|
||||
}
|
||||
|
||||
void __init mem_init(void)
|
||||
{
|
||||
unsigned long codepages, datapages, initpages;
|
||||
unsigned long addr, last;
|
||||
int i;
|
||||
|
||||
i = last_valid_pfn >> ((22 - PAGE_SHIFT) + 6);
|
||||
i += 1;
|
||||
sparc64_valid_addr_bitmap = (unsigned long *) alloc_bootmem(i << 3);
|
||||
if (sparc64_valid_addr_bitmap == NULL) {
|
||||
prom_printf("mem_init: Cannot alloc valid_addr_bitmap.\n");
|
||||
prom_halt();
|
||||
}
|
||||
memset(sparc64_valid_addr_bitmap, 0, i << 3);
|
||||
|
||||
addr = PAGE_OFFSET + kern_base;
|
||||
last = PAGE_ALIGN(kern_size) + addr;
|
||||
|
@ -1941,15 +1942,19 @@ void __init mem_init(void)
|
|||
addr += PAGE_SIZE;
|
||||
}
|
||||
|
||||
setup_valid_addr_bitmap_from_pavail();
|
||||
setup_valid_addr_bitmap_from_pavail(sparc64_valid_addr_bitmap);
|
||||
patch_tlb_miss_handler_bitmap();
|
||||
|
||||
high_memory = __va(last_valid_pfn << PAGE_SHIFT);
|
||||
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
for_each_online_node(i) {
|
||||
if (NODE_DATA(i)->node_spanned_pages != 0) {
|
||||
totalram_pages +=
|
||||
free_all_bootmem_node(NODE_DATA(i));
|
||||
{
|
||||
int i;
|
||||
for_each_online_node(i) {
|
||||
if (NODE_DATA(i)->node_spanned_pages != 0) {
|
||||
totalram_pages +=
|
||||
free_all_bootmem_node(NODE_DATA(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -5,10 +5,13 @@
|
|||
* marked non-static so that assembler code can get at them.
|
||||
*/
|
||||
|
||||
#define MAX_PHYS_ADDRESS (1UL << 42UL)
|
||||
#define KPTE_BITMAP_CHUNK_SZ (256UL * 1024UL * 1024UL)
|
||||
#define MAX_PHYS_ADDRESS (1UL << 41UL)
|
||||
#define KPTE_BITMAP_CHUNK_SZ (256UL * 1024UL * 1024UL)
|
||||
#define KPTE_BITMAP_BYTES \
|
||||
((MAX_PHYS_ADDRESS / KPTE_BITMAP_CHUNK_SZ) / 8)
|
||||
#define VALID_ADDR_BITMAP_CHUNK_SZ (4UL * 1024UL * 1024UL)
|
||||
#define VALID_ADDR_BITMAP_BYTES \
|
||||
((MAX_PHYS_ADDRESS / VALID_ADDR_BITMAP_CHUNK_SZ) / 8)
|
||||
|
||||
extern unsigned long kern_linear_pte_xor[2];
|
||||
extern unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
# create a compressed vmlinux image from the original vmlinux
|
||||
#
|
||||
|
||||
targets := vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o
|
||||
targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma head_$(BITS).o misc.o piggy.o
|
||||
|
||||
KBUILD_CFLAGS := -m$(BITS) -D__KERNEL__ $(LINUX_INCLUDE) -O2
|
||||
KBUILD_CFLAGS += -fno-strict-aliasing -fPIC
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define _ASM_X86_PGTABLE_H
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/e820.h>
|
||||
|
||||
#include <asm/pgtable_types.h>
|
||||
|
||||
|
@ -269,9 +270,16 @@ static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
|
|||
|
||||
#define canon_pgprot(p) __pgprot(massage_pgprot(p))
|
||||
|
||||
static inline int is_new_memtype_allowed(unsigned long flags,
|
||||
unsigned long new_flags)
|
||||
static inline int is_new_memtype_allowed(u64 paddr, unsigned long size,
|
||||
unsigned long flags,
|
||||
unsigned long new_flags)
|
||||
{
|
||||
/*
|
||||
* PAT type is always WB for ISA. So no need to check.
|
||||
*/
|
||||
if (is_ISA_range(paddr, paddr + size - 1))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* Certain new memtypes are not allowed with certain
|
||||
* requested memtype:
|
||||
|
|
|
@ -7,6 +7,10 @@ ifdef CONFIG_FUNCTION_TRACER
|
|||
CFLAGS_REMOVE_common.o = -pg
|
||||
endif
|
||||
|
||||
# Make sure load_percpu_segment has no stackprotector
|
||||
nostackp := $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_common.o := $(nostackp)
|
||||
|
||||
obj-y := intel_cacheinfo.o addon_cpuid_features.o
|
||||
obj-y += proc.o capflags.o powerflags.o common.o
|
||||
obj-y += vmware.o hypervisor.o
|
||||
|
|
|
@ -261,9 +261,7 @@ page_pde_offset = (__PAGE_OFFSET >> 20);
|
|||
* which will be freed later
|
||||
*/
|
||||
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
.section .init.text,"ax",@progbits
|
||||
#endif
|
||||
__CPUINIT
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
ENTRY(startup_32_smp)
|
||||
|
@ -602,11 +600,7 @@ ignore_int:
|
|||
#endif
|
||||
iret
|
||||
|
||||
#ifndef CONFIG_HOTPLUG_CPU
|
||||
__CPUINITDATA
|
||||
#else
|
||||
__REFDATA
|
||||
#endif
|
||||
.align 4
|
||||
ENTRY(initial_code)
|
||||
.long i386_start_kernel
|
||||
|
|
|
@ -519,16 +519,12 @@ static void c1e_idle(void)
|
|||
if (!cpumask_test_cpu(cpu, c1e_mask)) {
|
||||
cpumask_set_cpu(cpu, c1e_mask);
|
||||
/*
|
||||
* Force broadcast so ACPI can not interfere. Needs
|
||||
* to run with interrupts enabled as it uses
|
||||
* smp_function_call.
|
||||
* Force broadcast so ACPI can not interfere.
|
||||
*/
|
||||
local_irq_enable();
|
||||
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_FORCE,
|
||||
&cpu);
|
||||
printk(KERN_INFO "Switch to broadcast mode on CPU%d\n",
|
||||
cpu);
|
||||
local_irq_disable();
|
||||
}
|
||||
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu);
|
||||
|
||||
|
|
|
@ -46,11 +46,10 @@ PHDRS {
|
|||
data PT_LOAD FLAGS(7); /* RWE */
|
||||
#ifdef CONFIG_X86_64
|
||||
user PT_LOAD FLAGS(7); /* RWE */
|
||||
data.init PT_LOAD FLAGS(7); /* RWE */
|
||||
#ifdef CONFIG_SMP
|
||||
percpu PT_LOAD FLAGS(7); /* RWE */
|
||||
#endif
|
||||
data.init2 PT_LOAD FLAGS(7); /* RWE */
|
||||
init PT_LOAD FLAGS(7); /* RWE */
|
||||
#endif
|
||||
note PT_NOTE FLAGS(0); /* ___ */
|
||||
}
|
||||
|
@ -103,65 +102,43 @@ SECTIONS
|
|||
__stop___ex_table = .;
|
||||
} :text = 0x9090
|
||||
|
||||
RODATA
|
||||
RO_DATA(PAGE_SIZE)
|
||||
|
||||
/* Data */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data : AT(ADDR(.data) - LOAD_OFFSET) {
|
||||
/* Start of data section */
|
||||
_sdata = .;
|
||||
|
||||
/* init_task */
|
||||
INIT_TASK_DATA(THREAD_SIZE)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* 32 bit has nosave before _edata */
|
||||
NOSAVE_DATA
|
||||
#endif
|
||||
|
||||
PAGE_ALIGNED_DATA(PAGE_SIZE)
|
||||
*(.data.idt)
|
||||
|
||||
CACHELINE_ALIGNED_DATA(CONFIG_X86_L1_CACHE_BYTES)
|
||||
|
||||
DATA_DATA
|
||||
CONSTRUCTORS
|
||||
} :data
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/* 32 bit has nosave before _edata */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
||||
__nosave_begin = .;
|
||||
*(.data.nosave)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
}
|
||||
#endif
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data.page_aligned : AT(ADDR(.data.page_aligned) - LOAD_OFFSET) {
|
||||
*(.data.page_aligned)
|
||||
*(.data.idt)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
. = ALIGN(32);
|
||||
#else
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
. = ALIGN(CONFIG_X86_L1_CACHE_BYTES);
|
||||
#endif
|
||||
.data.cacheline_aligned :
|
||||
AT(ADDR(.data.cacheline_aligned) - LOAD_OFFSET) {
|
||||
*(.data.cacheline_aligned)
|
||||
}
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
#ifdef CONFIG_X86_32
|
||||
. = ALIGN(32);
|
||||
#else
|
||||
. = ALIGN(CONFIG_X86_INTERNODE_CACHE_BYTES);
|
||||
#endif
|
||||
.data.read_mostly : AT(ADDR(.data.read_mostly) - LOAD_OFFSET) {
|
||||
*(.data.read_mostly)
|
||||
/* rarely changed data like cpu maps */
|
||||
READ_MOSTLY_DATA(CONFIG_X86_INTERNODE_CACHE_BYTES)
|
||||
|
||||
/* End of data section */
|
||||
_edata = .;
|
||||
}
|
||||
} :data
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
#define VSYSCALL_ADDR (-10*1024*1024)
|
||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data.read_mostly) + \
|
||||
SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data.read_mostly) + \
|
||||
SIZEOF(.data.read_mostly) + 4095) & ~(4095))
|
||||
#define VSYSCALL_PHYS_ADDR ((LOADADDR(.data) + SIZEOF(.data) + \
|
||||
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
||||
#define VSYSCALL_VIRT_ADDR ((ADDR(.data) + SIZEOF(.data) + \
|
||||
PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
||||
|
||||
#define VLOAD_OFFSET (VSYSCALL_ADDR - VSYSCALL_PHYS_ADDR)
|
||||
#define VLOAD(x) (ADDR(x) - VLOAD_OFFSET)
|
||||
|
@ -227,35 +204,29 @@ SECTIONS
|
|||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
/* init_task */
|
||||
. = ALIGN(THREAD_SIZE);
|
||||
.data.init_task : AT(ADDR(.data.init_task) - LOAD_OFFSET) {
|
||||
*(.data.init_task)
|
||||
}
|
||||
#ifdef CONFIG_X86_64
|
||||
:data.init
|
||||
#endif
|
||||
|
||||
/*
|
||||
* smp_locks might be freed after init
|
||||
* start/end must be page aligned
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
||||
__smp_locks = .;
|
||||
*(.smp_locks)
|
||||
__smp_locks_end = .;
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
}
|
||||
|
||||
/* Init code and data - will be freed after init */
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
||||
.init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) {
|
||||
__init_begin = .; /* paired with __init_end */
|
||||
}
|
||||
|
||||
#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)
|
||||
/*
|
||||
* percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the
|
||||
* output PHDR, so the next output section - .init.text - should
|
||||
* start another segment - init.
|
||||
*/
|
||||
PERCPU_VADDR(0, :percpu)
|
||||
#endif
|
||||
|
||||
.init.text : AT(ADDR(.init.text) - LOAD_OFFSET) {
|
||||
_sinittext = .;
|
||||
INIT_TEXT
|
||||
_einittext = .;
|
||||
}
|
||||
#ifdef CONFIG_X86_64
|
||||
:init
|
||||
#endif
|
||||
|
||||
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
|
||||
INIT_DATA
|
||||
|
@ -326,17 +297,7 @@ SECTIONS
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)
|
||||
/*
|
||||
* percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the
|
||||
* output PHDR, so the next output section - __data_nosave - should
|
||||
* start another section data.init2. Also, pda should be at the head of
|
||||
* percpu area. Preallocate it and define the percpu offset symbol
|
||||
* so that it can be accessed as a percpu variable.
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
PERCPU_VADDR(0, :percpu)
|
||||
#else
|
||||
#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)
|
||||
PERCPU(PAGE_SIZE)
|
||||
#endif
|
||||
|
||||
|
@ -347,15 +308,22 @@ SECTIONS
|
|||
__init_end = .;
|
||||
}
|
||||
|
||||
/*
|
||||
* smp_locks might be freed after init
|
||||
* start/end must be page aligned
|
||||
*/
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {
|
||||
__smp_locks = .;
|
||||
*(.smp_locks)
|
||||
__smp_locks_end = .;
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_begin = .;
|
||||
*(.data.nosave)
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
} :data.init2
|
||||
/* use another section data.init2, see PERCPU_VADDR() above */
|
||||
NOSAVE_DATA
|
||||
}
|
||||
#endif
|
||||
|
||||
/* BSS */
|
||||
|
|
|
@ -796,7 +796,7 @@ int __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
|
|||
return ret;
|
||||
|
||||
#else
|
||||
reserve_bootmem(phys, len, BOOTMEM_DEFAULT);
|
||||
reserve_bootmem(phys, len, flags);
|
||||
#endif
|
||||
|
||||
if (phys+len <= MAX_DMA_PFN*PAGE_SIZE) {
|
||||
|
|
|
@ -623,7 +623,8 @@ static int reserve_pfn_range(u64 paddr, unsigned long size, pgprot_t *vma_prot,
|
|||
return ret;
|
||||
|
||||
if (flags != want_flags) {
|
||||
if (strict_prot || !is_new_memtype_allowed(want_flags, flags)) {
|
||||
if (strict_prot ||
|
||||
!is_new_memtype_allowed(paddr, size, want_flags, flags)) {
|
||||
free_memtype(paddr, paddr + size);
|
||||
printk(KERN_ERR "%s:%d map pfn expected mapping type %s"
|
||||
" for %Lx-%Lx, got %s\n",
|
||||
|
|
|
@ -5,6 +5,10 @@ CFLAGS_REMOVE_time.o = -pg
|
|||
CFLAGS_REMOVE_irq.o = -pg
|
||||
endif
|
||||
|
||||
# Make sure early boot has no stackprotector
|
||||
nostackp := $(call cc-option, -fno-stack-protector)
|
||||
CFLAGS_enlighten.o := $(nostackp)
|
||||
|
||||
obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \
|
||||
time.o xen-asm.o xen-asm_$(BITS).o \
|
||||
grant-table.o suspend.o
|
||||
|
|
|
@ -974,10 +974,6 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
|
||||
xen_domain_type = XEN_PV_DOMAIN;
|
||||
|
||||
BUG_ON(memcmp(xen_start_info->magic, "xen-3", 5) != 0);
|
||||
|
||||
xen_setup_features();
|
||||
|
||||
/* Install Xen paravirt ops */
|
||||
pv_info = xen_info;
|
||||
pv_init_ops = xen_init_ops;
|
||||
|
@ -986,8 +982,15 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
pv_apic_ops = xen_apic_ops;
|
||||
pv_mmu_ops = xen_mmu_ops;
|
||||
|
||||
xen_init_irq_ops();
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Setup percpu state. We only need to do this for 64-bit
|
||||
* because 32-bit already has %fs set properly.
|
||||
*/
|
||||
load_percpu_segment(0);
|
||||
#endif
|
||||
|
||||
xen_init_irq_ops();
|
||||
xen_init_cpuid_mask();
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
|
@ -997,6 +1000,8 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
set_xen_basic_apic_ops();
|
||||
#endif
|
||||
|
||||
xen_setup_features();
|
||||
|
||||
if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) {
|
||||
pv_mmu_ops.ptep_modify_prot_start = xen_ptep_modify_prot_start;
|
||||
pv_mmu_ops.ptep_modify_prot_commit = xen_ptep_modify_prot_commit;
|
||||
|
@ -1004,13 +1009,6 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
|
||||
machine_ops = xen_machine_ops;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* Setup percpu state. We only need to do this for 64-bit
|
||||
* because 32-bit already has %fs set properly.
|
||||
*/
|
||||
load_percpu_segment(0);
|
||||
#endif
|
||||
/*
|
||||
* The only reliable way to retain the initial address of the
|
||||
* percpu gdt_page is to remember it here, so we can go and
|
||||
|
|
|
@ -1151,6 +1151,9 @@ static int __init acpi_processor_init(void)
|
|||
{
|
||||
int result = 0;
|
||||
|
||||
if (acpi_disabled)
|
||||
return 0;
|
||||
|
||||
memset(&errata, 0, sizeof(errata));
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -1197,6 +1200,9 @@ out_proc:
|
|||
|
||||
static void __exit acpi_processor_exit(void)
|
||||
{
|
||||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
acpi_processor_ppc_exit();
|
||||
|
||||
acpi_thermal_cpufreq_exit();
|
||||
|
|
|
@ -162,8 +162,9 @@ static void lapic_timer_check_state(int state, struct acpi_processor *pr,
|
|||
pr->power.timer_broadcast_on_state = state;
|
||||
}
|
||||
|
||||
static void lapic_timer_propagate_broadcast(struct acpi_processor *pr)
|
||||
static void lapic_timer_propagate_broadcast(void *arg)
|
||||
{
|
||||
struct acpi_processor *pr = (struct acpi_processor *) arg;
|
||||
unsigned long reason;
|
||||
|
||||
reason = pr->power.timer_broadcast_on_state < INT_MAX ?
|
||||
|
@ -635,7 +636,8 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|||
working++;
|
||||
}
|
||||
|
||||
lapic_timer_propagate_broadcast(pr);
|
||||
smp_call_function_single(pr->id, lapic_timer_propagate_broadcast,
|
||||
pr, 1);
|
||||
|
||||
return (working);
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@ static int acpi_processor_apply_limit(struct acpi_processor *pr)
|
|||
if (pr->limit.thermal.tx > tx)
|
||||
tx = pr->limit.thermal.tx;
|
||||
|
||||
result = acpi_processor_set_throttling(pr, tx);
|
||||
result = acpi_processor_set_throttling(pr, tx, false);
|
||||
if (result)
|
||||
goto end;
|
||||
}
|
||||
|
@ -421,12 +421,12 @@ processor_set_cur_state(struct thermal_cooling_device *cdev,
|
|||
|
||||
if (state <= max_pstate) {
|
||||
if (pr->flags.throttling && pr->throttling.state)
|
||||
result = acpi_processor_set_throttling(pr, 0);
|
||||
result = acpi_processor_set_throttling(pr, 0, false);
|
||||
cpufreq_set_cur_state(pr->id, state);
|
||||
} else {
|
||||
cpufreq_set_cur_state(pr->id, max_pstate);
|
||||
result = acpi_processor_set_throttling(pr,
|
||||
state - max_pstate);
|
||||
state - max_pstate, false);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -62,7 +62,8 @@ struct throttling_tstate {
|
|||
#define THROTTLING_POSTCHANGE (2)
|
||||
|
||||
static int acpi_processor_get_throttling(struct acpi_processor *pr);
|
||||
int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
|
||||
int acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
int state, bool force);
|
||||
|
||||
static int acpi_processor_update_tsd_coord(void)
|
||||
{
|
||||
|
@ -361,7 +362,7 @@ int acpi_processor_tstate_has_changed(struct acpi_processor *pr)
|
|||
*/
|
||||
target_state = throttling_limit;
|
||||
}
|
||||
return acpi_processor_set_throttling(pr, target_state);
|
||||
return acpi_processor_set_throttling(pr, target_state, false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -839,10 +840,10 @@ static int acpi_processor_get_throttling_ptc(struct acpi_processor *pr)
|
|||
if (ret >= 0) {
|
||||
state = acpi_get_throttling_state(pr, value);
|
||||
if (state == -1) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Invalid throttling state, reset"));
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Invalid throttling state, reset\n"));
|
||||
state = 0;
|
||||
ret = acpi_processor_set_throttling(pr, state);
|
||||
ret = acpi_processor_set_throttling(pr, state, true);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
@ -915,7 +916,7 @@ static int acpi_processor_get_fadt_info(struct acpi_processor *pr)
|
|||
}
|
||||
|
||||
static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,
|
||||
int state)
|
||||
int state, bool force)
|
||||
{
|
||||
u32 value = 0;
|
||||
u32 duty_mask = 0;
|
||||
|
@ -930,7 +931,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,
|
|||
if (!pr->flags.throttling)
|
||||
return -ENODEV;
|
||||
|
||||
if (state == pr->throttling.state)
|
||||
if (!force && (state == pr->throttling.state))
|
||||
return 0;
|
||||
|
||||
if (state < pr->throttling_platform_limit)
|
||||
|
@ -988,7 +989,7 @@ static int acpi_processor_set_throttling_fadt(struct acpi_processor *pr,
|
|||
}
|
||||
|
||||
static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
|
||||
int state)
|
||||
int state, bool force)
|
||||
{
|
||||
int ret;
|
||||
acpi_integer value;
|
||||
|
@ -1002,7 +1003,7 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
|
|||
if (!pr->flags.throttling)
|
||||
return -ENODEV;
|
||||
|
||||
if (state == pr->throttling.state)
|
||||
if (!force && (state == pr->throttling.state))
|
||||
return 0;
|
||||
|
||||
if (state < pr->throttling_platform_limit)
|
||||
|
@ -1018,7 +1019,8 @@ static int acpi_processor_set_throttling_ptc(struct acpi_processor *pr,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
|
||||
int acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
int state, bool force)
|
||||
{
|
||||
cpumask_var_t saved_mask;
|
||||
int ret = 0;
|
||||
|
@ -1070,7 +1072,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
|
|||
/* FIXME: use work_on_cpu() */
|
||||
set_cpus_allowed_ptr(current, cpumask_of(pr->id));
|
||||
ret = p_throttling->acpi_processor_set_throttling(pr,
|
||||
t_state.target_state);
|
||||
t_state.target_state, force);
|
||||
} else {
|
||||
/*
|
||||
* When the T-state coordination is SW_ALL or HW_ALL,
|
||||
|
@ -1103,7 +1105,7 @@ int acpi_processor_set_throttling(struct acpi_processor *pr, int state)
|
|||
set_cpus_allowed_ptr(current, cpumask_of(i));
|
||||
ret = match_pr->throttling.
|
||||
acpi_processor_set_throttling(
|
||||
match_pr, t_state.target_state);
|
||||
match_pr, t_state.target_state, force);
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
@ -1201,7 +1203,7 @@ int acpi_processor_get_throttling_info(struct acpi_processor *pr)
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Disabling throttling (was T%d)\n",
|
||||
pr->throttling.state));
|
||||
result = acpi_processor_set_throttling(pr, 0);
|
||||
result = acpi_processor_set_throttling(pr, 0, false);
|
||||
if (result)
|
||||
goto end;
|
||||
}
|
||||
|
@ -1307,7 +1309,7 @@ static ssize_t acpi_processor_write_throttling(struct file *file,
|
|||
if (strcmp(tmpbuf, charp) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
result = acpi_processor_set_throttling(pr, state_val);
|
||||
result = acpi_processor_set_throttling(pr, state_val, false);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
|
|
|
@ -508,8 +508,9 @@ static void tty_ldisc_restore(struct tty_struct *tty, struct tty_ldisc *old)
|
|||
* be obtained while the delayed work queue halt ensures that no more
|
||||
* data is fed to the ldisc.
|
||||
*
|
||||
* In order to wait for any existing references to complete see
|
||||
* tty_ldisc_wait_idle.
|
||||
* You need to do a 'flush_scheduled_work()' (outside the ldisc_mutex)
|
||||
* in order to make sure any currently executing ldisc work is also
|
||||
* flushed.
|
||||
*/
|
||||
|
||||
static int tty_ldisc_halt(struct tty_struct *tty)
|
||||
|
@ -753,11 +754,14 @@ void tty_ldisc_hangup(struct tty_struct *tty)
|
|||
* N_TTY.
|
||||
*/
|
||||
if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
|
||||
/* Make sure the old ldisc is quiescent */
|
||||
tty_ldisc_halt(tty);
|
||||
flush_scheduled_work();
|
||||
|
||||
/* Avoid racing set_ldisc or tty_ldisc_release */
|
||||
mutex_lock(&tty->ldisc_mutex);
|
||||
if (tty->ldisc) { /* Not yet closed */
|
||||
/* Switch back to N_TTY */
|
||||
tty_ldisc_halt(tty);
|
||||
tty_ldisc_reinit(tty);
|
||||
/* At this point we have a closed ldisc and we want to
|
||||
reopen it. We could defer this to the next open but
|
||||
|
|
|
@ -274,12 +274,18 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
robj = gobj->driver_private;
|
||||
r = radeon_object_busy_domain(robj, &cur_placement);
|
||||
if (cur_placement == TTM_PL_VRAM)
|
||||
switch (cur_placement) {
|
||||
case TTM_PL_VRAM:
|
||||
args->domain = RADEON_GEM_DOMAIN_VRAM;
|
||||
if (cur_placement == TTM_PL_FLAG_TT)
|
||||
break;
|
||||
case TTM_PL_TT:
|
||||
args->domain = RADEON_GEM_DOMAIN_GTT;
|
||||
if (cur_placement == TTM_PL_FLAG_SYSTEM)
|
||||
break;
|
||||
case TTM_PL_SYSTEM:
|
||||
args->domain = RADEON_GEM_DOMAIN_CPU;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
drm_gem_object_unreference(gobj);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
|
|
@ -456,8 +456,11 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
|||
unsigned int cmd, void __user *argp)
|
||||
{
|
||||
struct input_dev *dev = joydev->handle.dev;
|
||||
size_t len;
|
||||
int i, j;
|
||||
const char *name;
|
||||
|
||||
/* Process fixed-sized commands. */
|
||||
switch (cmd) {
|
||||
|
||||
case JS_SET_CAL:
|
||||
|
@ -499,9 +502,22 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
|||
return copy_to_user(argp, joydev->corr,
|
||||
sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0;
|
||||
|
||||
case JSIOCSAXMAP:
|
||||
if (copy_from_user(joydev->abspam, argp,
|
||||
sizeof(__u8) * (ABS_MAX + 1)))
|
||||
}
|
||||
|
||||
/*
|
||||
* Process variable-sized commands (the axis and button map commands
|
||||
* are considered variable-sized to decouple them from the values of
|
||||
* ABS_MAX and KEY_MAX).
|
||||
*/
|
||||
switch (cmd & ~IOCSIZE_MASK) {
|
||||
|
||||
case (JSIOCSAXMAP & ~IOCSIZE_MASK):
|
||||
len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam));
|
||||
/*
|
||||
* FIXME: we should not copy into our axis map before
|
||||
* validating the data.
|
||||
*/
|
||||
if (copy_from_user(joydev->abspam, argp, len))
|
||||
return -EFAULT;
|
||||
|
||||
for (i = 0; i < joydev->nabs; i++) {
|
||||
|
@ -511,13 +527,17 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
|||
}
|
||||
return 0;
|
||||
|
||||
case JSIOCGAXMAP:
|
||||
return copy_to_user(argp, joydev->abspam,
|
||||
sizeof(__u8) * (ABS_MAX + 1)) ? -EFAULT : 0;
|
||||
case (JSIOCGAXMAP & ~IOCSIZE_MASK):
|
||||
len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam));
|
||||
return copy_to_user(argp, joydev->abspam, len) ? -EFAULT : 0;
|
||||
|
||||
case JSIOCSBTNMAP:
|
||||
if (copy_from_user(joydev->keypam, argp,
|
||||
sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)))
|
||||
case (JSIOCSBTNMAP & ~IOCSIZE_MASK):
|
||||
len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam));
|
||||
/*
|
||||
* FIXME: we should not copy into our keymap before
|
||||
* validating the data.
|
||||
*/
|
||||
if (copy_from_user(joydev->keypam, argp, len))
|
||||
return -EFAULT;
|
||||
|
||||
for (i = 0; i < joydev->nkey; i++) {
|
||||
|
@ -529,25 +549,19 @@ static int joydev_ioctl_common(struct joydev *joydev,
|
|||
|
||||
return 0;
|
||||
|
||||
case JSIOCGBTNMAP:
|
||||
return copy_to_user(argp, joydev->keypam,
|
||||
sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)) ? -EFAULT : 0;
|
||||
case (JSIOCGBTNMAP & ~IOCSIZE_MASK):
|
||||
len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam));
|
||||
return copy_to_user(argp, joydev->keypam, len) ? -EFAULT : 0;
|
||||
|
||||
default:
|
||||
if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
|
||||
int len;
|
||||
const char *name = dev->name;
|
||||
case JSIOCGNAME(0):
|
||||
name = dev->name;
|
||||
if (!name)
|
||||
return 0;
|
||||
|
||||
if (!name)
|
||||
return 0;
|
||||
len = strlen(name) + 1;
|
||||
if (len > _IOC_SIZE(cmd))
|
||||
len = _IOC_SIZE(cmd);
|
||||
if (copy_to_user(argp, name, len))
|
||||
return -EFAULT;
|
||||
return len;
|
||||
}
|
||||
len = min_t(size_t, _IOC_SIZE(cmd), strlen(name) + 1);
|
||||
return copy_to_user(argp, name, len) ? -EFAULT : len;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -74,6 +74,7 @@ static struct iforce_device iforce_device[] = {
|
|||
{ 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_avb_wheel, abs_wheel, ff_iforce },
|
||||
{ 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_avb_tw, abs_wheel, ff_iforce }, //?
|
||||
{ 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //?
|
||||
{ 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce },
|
||||
{ 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //?
|
||||
{ 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //?
|
||||
{ 0x06f8, 0x0004, "Gullemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //?
|
||||
|
|
|
@ -223,6 +223,7 @@ static struct usb_device_id iforce_usb_ids [] = {
|
|||
{ USB_DEVICE(0x05ef, 0x8884) }, /* AVB Mag Turbo Force */
|
||||
{ USB_DEVICE(0x05ef, 0x8888) }, /* AVB Top Shot FFB Racing Wheel */
|
||||
{ USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */
|
||||
{ USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */
|
||||
{ USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */
|
||||
{ USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */
|
||||
{ USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */
|
||||
|
|
|
@ -388,6 +388,32 @@ static int wacom_parse_hid(struct usb_interface *intf, struct hid_descriptor *hi
|
|||
return result;
|
||||
}
|
||||
|
||||
static int wacom_query_tablet_data(struct usb_interface *intf)
|
||||
{
|
||||
unsigned char *rep_data;
|
||||
int limit = 0;
|
||||
int error;
|
||||
|
||||
rep_data = kmalloc(2, GFP_KERNEL);
|
||||
if (!rep_data)
|
||||
return -ENOMEM;
|
||||
|
||||
do {
|
||||
rep_data[0] = 2;
|
||||
rep_data[1] = 2;
|
||||
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
|
||||
2, rep_data, 2);
|
||||
if (error >= 0)
|
||||
error = usb_get_report(intf,
|
||||
WAC_HID_FEATURE_REPORT, 2,
|
||||
rep_data, 2);
|
||||
} while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
|
||||
|
||||
kfree(rep_data);
|
||||
|
||||
return error < 0 ? error : 0;
|
||||
}
|
||||
|
||||
static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
|
@ -398,7 +424,6 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
struct wacom_features *features;
|
||||
struct input_dev *input_dev;
|
||||
int error = -ENOMEM;
|
||||
char rep_data[2], limit = 0;
|
||||
struct hid_descriptor *hid_desc;
|
||||
|
||||
wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL);
|
||||
|
@ -489,20 +514,10 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
|
||||
/*
|
||||
* Ask the tablet to report tablet data if it is not a Tablet PC.
|
||||
* Repeat until it succeeds
|
||||
* Note that if query fails it is not a hard failure.
|
||||
*/
|
||||
if (wacom_wac->features->type != TABLETPC) {
|
||||
do {
|
||||
rep_data[0] = 2;
|
||||
rep_data[1] = 2;
|
||||
error = usb_set_report(intf, WAC_HID_FEATURE_REPORT,
|
||||
2, rep_data, 2);
|
||||
if (error >= 0)
|
||||
error = usb_get_report(intf,
|
||||
WAC_HID_FEATURE_REPORT, 2,
|
||||
rep_data, 2);
|
||||
} while ((error < 0 || rep_data[1] != 2) && limit++ < 5);
|
||||
}
|
||||
if (wacom_wac->features->type != TABLETPC)
|
||||
wacom_query_tablet_data(intf);
|
||||
|
||||
usb_set_intfdata(intf, wacom);
|
||||
return 0;
|
||||
|
|
|
@ -170,11 +170,11 @@ static void ucb1400_handle_pending_irq(struct ucb1400_ts *ucb)
|
|||
ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr);
|
||||
ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0);
|
||||
|
||||
if (isr & UCB_IE_TSPX) {
|
||||
if (isr & UCB_IE_TSPX)
|
||||
ucb1400_ts_irq_disable(ucb->ac97);
|
||||
enable_irq(ucb->irq);
|
||||
} else
|
||||
printk(KERN_ERR "ucb1400: unexpected IE_STATUS = %#x\n", isr);
|
||||
else
|
||||
dev_dbg(&ucb->ts_idev->dev, "ucb1400: unexpected IE_STATUS = %#x\n", isr);
|
||||
enable_irq(ucb->irq);
|
||||
}
|
||||
|
||||
static int ucb1400_ts_thread(void *_ucb)
|
||||
|
@ -345,6 +345,7 @@ static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb)
|
|||
static int ucb1400_ts_probe(struct platform_device *dev)
|
||||
{
|
||||
int error, x_res, y_res;
|
||||
u16 fcsr;
|
||||
struct ucb1400_ts *ucb = dev->dev.platform_data;
|
||||
|
||||
ucb->ts_idev = input_allocate_device();
|
||||
|
@ -382,6 +383,14 @@ static int ucb1400_ts_probe(struct platform_device *dev)
|
|||
ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY);
|
||||
ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
|
||||
|
||||
/*
|
||||
* Enable ADC filter to prevent horrible jitter on Colibri.
|
||||
* This also further reduces jitter on boards where ADCSYNC
|
||||
* pin is connected.
|
||||
*/
|
||||
fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR);
|
||||
ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE);
|
||||
|
||||
ucb1400_adc_enable(ucb->ac97);
|
||||
x_res = ucb1400_ts_read_xres(ucb);
|
||||
y_res = ucb1400_ts_read_yres(ucb);
|
||||
|
|
|
@ -117,6 +117,9 @@ static ssize_t gpio_trig_inverted_store(struct device *dev,
|
|||
|
||||
gpio_data->inverted = !!inverted;
|
||||
|
||||
/* After inverting, we need to update the LED. */
|
||||
schedule_work(&gpio_data->work);
|
||||
|
||||
return n;
|
||||
}
|
||||
static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show,
|
||||
|
@ -146,20 +149,26 @@ static ssize_t gpio_trig_gpio_store(struct device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (gpio_data->gpio == gpio)
|
||||
return n;
|
||||
|
||||
if (!gpio) {
|
||||
free_irq(gpio_to_irq(gpio_data->gpio), led);
|
||||
if (gpio_data->gpio != 0)
|
||||
free_irq(gpio_to_irq(gpio_data->gpio), led);
|
||||
gpio_data->gpio = 0;
|
||||
return n;
|
||||
}
|
||||
|
||||
if (gpio_data->gpio > 0 && gpio_data->gpio != gpio)
|
||||
free_irq(gpio_to_irq(gpio_data->gpio), led);
|
||||
|
||||
gpio_data->gpio = gpio;
|
||||
ret = request_irq(gpio_to_irq(gpio), gpio_trig_irq,
|
||||
IRQF_SHARED | IRQF_TRIGGER_RISING
|
||||
| IRQF_TRIGGER_FALLING, "ledtrig-gpio", led);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_err(dev, "request_irq failed with error %d\n", ret);
|
||||
} else {
|
||||
if (gpio_data->gpio != 0)
|
||||
free_irq(gpio_to_irq(gpio_data->gpio), led);
|
||||
gpio_data->gpio = gpio;
|
||||
}
|
||||
|
||||
return ret ? ret : n;
|
||||
}
|
||||
|
@ -211,7 +220,8 @@ static void gpio_trig_deactivate(struct led_classdev *led)
|
|||
device_remove_file(led->dev, &dev_attr_inverted);
|
||||
device_remove_file(led->dev, &dev_attr_desired_brightness);
|
||||
flush_work(&gpio_data->work);
|
||||
free_irq(gpio_to_irq(gpio_data->gpio),led);
|
||||
if (gpio_data->gpio != 0)
|
||||
free_irq(gpio_to_irq(gpio_data->gpio), led);
|
||||
kfree(gpio_data);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -288,7 +288,7 @@ static void maciisi_sync(struct adb_request *req)
|
|||
}
|
||||
/* This could be BAD... when the ADB controller doesn't respond
|
||||
* for this long, it's probably not coming back :-( */
|
||||
if(count >= 50) /* Hopefully shouldn't happen */
|
||||
if (count > 50) /* Hopefully shouldn't happen */
|
||||
printk(KERN_ERR "maciisi_send_request: poll timed out!\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ static void orion_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int len)
|
|||
buf64 = (uint64_t *)buf;
|
||||
while (i < len/8) {
|
||||
uint64_t x;
|
||||
asm ("ldrd\t%0, [%1]" : "=r" (x) : "r" (io_base));
|
||||
asm volatile ("ldrd\t%0, [%1]" : "=&r" (x) : "r" (io_base));
|
||||
buf64[i++] = x;
|
||||
}
|
||||
i *= 8;
|
||||
|
|
|
@ -1727,12 +1727,14 @@ config KS8842
|
|||
tristate "Micrel KSZ8842"
|
||||
depends on HAS_IOMEM
|
||||
help
|
||||
This platform driver is for Micrel KSZ8842 chip.
|
||||
This platform driver is for Micrel KSZ8842 / KS8842
|
||||
2-port ethernet switch chip (managed, VLAN, QoS).
|
||||
|
||||
config KS8851
|
||||
tristate "Micrel KS8851 SPI"
|
||||
depends on SPI
|
||||
select MII
|
||||
select CRC32
|
||||
help
|
||||
SPI driver for Micrel KS8851 SPI attached network chip.
|
||||
|
||||
|
|
|
@ -1080,7 +1080,7 @@ static struct platform_driver w90p910_ether_driver = {
|
|||
.probe = w90p910_ether_probe,
|
||||
.remove = __devexit_p(w90p910_ether_remove),
|
||||
.driver = {
|
||||
.name = "w90p910-emc",
|
||||
.name = "nuc900-emc",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
@ -1101,5 +1101,5 @@ module_exit(w90p910_ether_exit);
|
|||
MODULE_AUTHOR("Wan ZongShun <mcuos.com@gmail.com>");
|
||||
MODULE_DESCRIPTION("w90p910 MAC driver!");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:w90p910-emc");
|
||||
MODULE_ALIAS("platform:nuc900-emc");
|
||||
|
||||
|
|
|
@ -1899,7 +1899,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
|
|||
nic->ru_running = RU_SUSPENDED;
|
||||
pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
|
||||
sizeof(struct rfd),
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
PCI_DMA_FROMDEVICE);
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
|
|
|
@ -309,6 +309,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
{
|
||||
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
|
||||
struct bcom_fec_bd *bd;
|
||||
unsigned long flags;
|
||||
|
||||
if (bcom_queue_full(priv->tx_dmatsk)) {
|
||||
if (net_ratelimit())
|
||||
|
@ -316,7 +317,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
spin_lock_irq(&priv->lock);
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
bd = (struct bcom_fec_bd *)
|
||||
|
@ -332,7 +333,7 @@ static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
netif_stop_queue(dev);
|
||||
}
|
||||
|
||||
spin_unlock_irq(&priv->lock);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
|
|
@ -1305,6 +1305,8 @@ static int emac_close(struct net_device *ndev)
|
|||
|
||||
free_irq(dev->emac_irq, dev);
|
||||
|
||||
netif_carrier_off(ndev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -205,9 +204,6 @@ static const struct net_device_ops au1k_irda_netdev_ops = {
|
|||
.ndo_start_xmit = au1k_irda_hard_xmit,
|
||||
.ndo_tx_timeout = au1k_tx_timeout,
|
||||
.ndo_do_ioctl = au1k_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int au1k_irda_net_init(struct net_device *dev)
|
||||
|
|
|
@ -803,9 +803,6 @@ static const struct net_device_ops pxa_irda_netdev_ops = {
|
|||
.ndo_stop = pxa_irda_stop,
|
||||
.ndo_start_xmit = pxa_irda_hard_xmit,
|
||||
.ndo_do_ioctl = pxa_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int pxa_irda_probe(struct platform_device *pdev)
|
||||
|
@ -830,6 +827,7 @@ static int pxa_irda_probe(struct platform_device *pdev)
|
|||
if (!dev)
|
||||
goto err_mem_3;
|
||||
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
si = netdev_priv(dev);
|
||||
si->dev = &pdev->dev;
|
||||
si->pdata = pdev->dev.platform_data;
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -881,9 +880,6 @@ static const struct net_device_ops sa1100_irda_netdev_ops = {
|
|||
.ndo_stop = sa1100_irda_stop,
|
||||
.ndo_start_xmit = sa1100_irda_hard_xmit,
|
||||
.ndo_do_ioctl = sa1100_irda_ioctl,
|
||||
.ndo_change_mtu = eth_change_mtu,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
};
|
||||
|
||||
static int sa1100_irda_probe(struct platform_device *pdev)
|
||||
|
|
|
@ -41,6 +41,7 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct ixpdev_priv *ip = netdev_priv(dev);
|
||||
struct ixpdev_tx_desc *desc;
|
||||
int entry;
|
||||
unsigned long flags;
|
||||
|
||||
if (unlikely(skb->len > PAGE_SIZE)) {
|
||||
/* @@@ Count drops. */
|
||||
|
@ -63,11 +64,11 @@ static int ixpdev_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
local_irq_disable();
|
||||
local_irq_save(flags);
|
||||
ip->tx_queue_entries++;
|
||||
if (ip->tx_queue_entries == TX_BUF_COUNT_PER_CHAN)
|
||||
netif_stop_queue(dev);
|
||||
local_irq_enable();
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -620,6 +620,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
dma_addr_t mapping;
|
||||
unsigned int len, entry;
|
||||
u32 ctrl;
|
||||
unsigned long flags;
|
||||
|
||||
#ifdef DEBUG
|
||||
int i;
|
||||
|
@ -635,12 +636,12 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
#endif
|
||||
|
||||
len = skb->len;
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock_irqsave(&bp->lock, flags);
|
||||
|
||||
/* This is a hard error, log it. */
|
||||
if (TX_BUFFS_AVAIL(bp) < 1) {
|
||||
netif_stop_queue(dev);
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
dev_err(&bp->pdev->dev,
|
||||
"BUG! Tx Ring full when queue awake!\n");
|
||||
dev_dbg(&bp->pdev->dev, "tx_head = %u, tx_tail = %u\n",
|
||||
|
@ -674,7 +675,7 @@ static int macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
if (TX_BUFFS_AVAIL(bp) < 1)
|
||||
netif_stop_queue(dev);
|
||||
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
|
||||
|
|
|
@ -437,6 +437,7 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
|
|||
{
|
||||
struct mlx4_en_cq *cq = &priv->tx_cq[tx_ind];
|
||||
struct mlx4_en_tx_ring *ring = &priv->tx_ring[tx_ind];
|
||||
unsigned long flags;
|
||||
|
||||
/* If we don't have a pending timer, set one up to catch our recent
|
||||
post in case the interface becomes idle */
|
||||
|
@ -445,9 +446,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
|
|||
|
||||
/* Poll the CQ every mlx4_en_TX_MODER_POLL packets */
|
||||
if ((++ring->poll_cnt & (MLX4_EN_TX_POLL_MODER - 1)) == 0)
|
||||
if (spin_trylock_irq(&ring->comp_lock)) {
|
||||
if (spin_trylock_irqsave(&ring->comp_lock, flags)) {
|
||||
mlx4_en_process_tx_cq(priv->dev, cq);
|
||||
spin_unlock_irq(&ring->comp_lock);
|
||||
spin_unlock_irqrestore(&ring->comp_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -196,21 +196,23 @@ static void PRINT_PKT(u_char *buf, int length)
|
|||
/* this enables an interrupt in the interrupt mask register */
|
||||
#define SMC_ENABLE_INT(lp, x) do { \
|
||||
unsigned char mask; \
|
||||
spin_lock_irq(&lp->lock); \
|
||||
unsigned long smc_enable_flags; \
|
||||
spin_lock_irqsave(&lp->lock, smc_enable_flags); \
|
||||
mask = SMC_GET_INT_MASK(lp); \
|
||||
mask |= (x); \
|
||||
SMC_SET_INT_MASK(lp, mask); \
|
||||
spin_unlock_irq(&lp->lock); \
|
||||
spin_unlock_irqrestore(&lp->lock, smc_enable_flags); \
|
||||
} while (0)
|
||||
|
||||
/* this disables an interrupt from the interrupt mask register */
|
||||
#define SMC_DISABLE_INT(lp, x) do { \
|
||||
unsigned char mask; \
|
||||
spin_lock_irq(&lp->lock); \
|
||||
unsigned long smc_disable_flags; \
|
||||
spin_lock_irqsave(&lp->lock, smc_disable_flags); \
|
||||
mask = SMC_GET_INT_MASK(lp); \
|
||||
mask &= ~(x); \
|
||||
SMC_SET_INT_MASK(lp, mask); \
|
||||
spin_unlock_irq(&lp->lock); \
|
||||
spin_unlock_irqrestore(&lp->lock, smc_disable_flags); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
|
@ -520,21 +522,21 @@ static inline void smc_rcv(struct net_device *dev)
|
|||
* any other concurrent access and C would always interrupt B. But life
|
||||
* isn't that easy in a SMP world...
|
||||
*/
|
||||
#define smc_special_trylock(lock) \
|
||||
#define smc_special_trylock(lock, flags) \
|
||||
({ \
|
||||
int __ret; \
|
||||
local_irq_disable(); \
|
||||
local_irq_save(flags); \
|
||||
__ret = spin_trylock(lock); \
|
||||
if (!__ret) \
|
||||
local_irq_enable(); \
|
||||
local_irq_restore(flags); \
|
||||
__ret; \
|
||||
})
|
||||
#define smc_special_lock(lock) spin_lock_irq(lock)
|
||||
#define smc_special_unlock(lock) spin_unlock_irq(lock)
|
||||
#define smc_special_lock(lock, flags) spin_lock_irqsave(lock, flags)
|
||||
#define smc_special_unlock(lock, flags) spin_unlock_irqrestore(lock, flags)
|
||||
#else
|
||||
#define smc_special_trylock(lock) (1)
|
||||
#define smc_special_lock(lock) do { } while (0)
|
||||
#define smc_special_unlock(lock) do { } while (0)
|
||||
#define smc_special_trylock(lock, flags) (1)
|
||||
#define smc_special_lock(lock, flags) do { } while (0)
|
||||
#define smc_special_unlock(lock, flags) do { } while (0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -548,10 +550,11 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
struct sk_buff *skb;
|
||||
unsigned int packet_no, len;
|
||||
unsigned char *buf;
|
||||
unsigned long flags;
|
||||
|
||||
DBG(3, "%s: %s\n", dev->name, __func__);
|
||||
|
||||
if (!smc_special_trylock(&lp->lock)) {
|
||||
if (!smc_special_trylock(&lp->lock, flags)) {
|
||||
netif_stop_queue(dev);
|
||||
tasklet_schedule(&lp->tx_task);
|
||||
return;
|
||||
|
@ -559,7 +562,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
|
||||
skb = lp->pending_tx_skb;
|
||||
if (unlikely(!skb)) {
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
return;
|
||||
}
|
||||
lp->pending_tx_skb = NULL;
|
||||
|
@ -569,7 +572,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
printk("%s: Memory allocation failed.\n", dev->name);
|
||||
dev->stats.tx_errors++;
|
||||
dev->stats.tx_fifo_errors++;
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -608,7 +611,7 @@ static void smc_hardware_send_pkt(unsigned long data)
|
|||
|
||||
/* queue the packet for TX */
|
||||
SMC_SET_MMU_CMD(lp, MC_ENQUEUE);
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
|
||||
dev->trans_start = jiffies;
|
||||
dev->stats.tx_packets++;
|
||||
|
@ -633,6 +636,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct smc_local *lp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = lp->base;
|
||||
unsigned int numPages, poll_count, status;
|
||||
unsigned long flags;
|
||||
|
||||
DBG(3, "%s: %s\n", dev->name, __func__);
|
||||
|
||||
|
@ -658,7 +662,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
smc_special_lock(&lp->lock);
|
||||
smc_special_lock(&lp->lock, flags);
|
||||
|
||||
/* now, try to allocate the memory */
|
||||
SMC_SET_MMU_CMD(lp, MC_ALLOC | numPages);
|
||||
|
@ -676,7 +680,7 @@ static int smc_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
} while (--poll_count);
|
||||
|
||||
smc_special_unlock(&lp->lock);
|
||||
smc_special_unlock(&lp->lock, flags);
|
||||
|
||||
lp->pending_tx_skb = skb;
|
||||
if (!poll_count) {
|
||||
|
|
|
@ -70,6 +70,9 @@ struct virtnet_info
|
|||
struct sk_buff_head recv;
|
||||
struct sk_buff_head send;
|
||||
|
||||
/* Work struct for refilling if we run low on memory. */
|
||||
struct delayed_work refill;
|
||||
|
||||
/* Chain pages by the private ptr. */
|
||||
struct page *pages;
|
||||
};
|
||||
|
@ -273,19 +276,22 @@ drop:
|
|||
dev_kfree_skb(skb);
|
||||
}
|
||||
|
||||
static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
||||
static bool try_fill_recv_maxbufs(struct virtnet_info *vi, gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct scatterlist sg[2+MAX_SKB_FRAGS];
|
||||
int num, err, i;
|
||||
bool oom = false;
|
||||
|
||||
sg_init_table(sg, 2+MAX_SKB_FRAGS);
|
||||
for (;;) {
|
||||
struct virtio_net_hdr *hdr;
|
||||
|
||||
skb = netdev_alloc_skb(vi->dev, MAX_PACKET_LEN + NET_IP_ALIGN);
|
||||
if (unlikely(!skb))
|
||||
if (unlikely(!skb)) {
|
||||
oom = true;
|
||||
break;
|
||||
}
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
skb_put(skb, MAX_PACKET_LEN);
|
||||
|
@ -296,7 +302,7 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
|||
if (vi->big_packets) {
|
||||
for (i = 0; i < MAX_SKB_FRAGS; i++) {
|
||||
skb_frag_t *f = &skb_shinfo(skb)->frags[i];
|
||||
f->page = get_a_page(vi, GFP_ATOMIC);
|
||||
f->page = get_a_page(vi, gfp);
|
||||
if (!f->page)
|
||||
break;
|
||||
|
||||
|
@ -325,31 +331,35 @@ static void try_fill_recv_maxbufs(struct virtnet_info *vi)
|
|||
if (unlikely(vi->num > vi->max))
|
||||
vi->max = vi->num;
|
||||
vi->rvq->vq_ops->kick(vi->rvq);
|
||||
return !oom;
|
||||
}
|
||||
|
||||
static void try_fill_recv(struct virtnet_info *vi)
|
||||
/* Returns false if we couldn't fill entirely (OOM). */
|
||||
static bool try_fill_recv(struct virtnet_info *vi, gfp_t gfp)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
struct scatterlist sg[1];
|
||||
int err;
|
||||
bool oom = false;
|
||||
|
||||
if (!vi->mergeable_rx_bufs) {
|
||||
try_fill_recv_maxbufs(vi);
|
||||
return;
|
||||
}
|
||||
if (!vi->mergeable_rx_bufs)
|
||||
return try_fill_recv_maxbufs(vi, gfp);
|
||||
|
||||
for (;;) {
|
||||
skb_frag_t *f;
|
||||
|
||||
skb = netdev_alloc_skb(vi->dev, GOOD_COPY_LEN + NET_IP_ALIGN);
|
||||
if (unlikely(!skb))
|
||||
if (unlikely(!skb)) {
|
||||
oom = true;
|
||||
break;
|
||||
}
|
||||
|
||||
skb_reserve(skb, NET_IP_ALIGN);
|
||||
|
||||
f = &skb_shinfo(skb)->frags[0];
|
||||
f->page = get_a_page(vi, GFP_ATOMIC);
|
||||
f->page = get_a_page(vi, gfp);
|
||||
if (!f->page) {
|
||||
oom = true;
|
||||
kfree_skb(skb);
|
||||
break;
|
||||
}
|
||||
|
@ -373,6 +383,7 @@ static void try_fill_recv(struct virtnet_info *vi)
|
|||
if (unlikely(vi->num > vi->max))
|
||||
vi->max = vi->num;
|
||||
vi->rvq->vq_ops->kick(vi->rvq);
|
||||
return !oom;
|
||||
}
|
||||
|
||||
static void skb_recv_done(struct virtqueue *rvq)
|
||||
|
@ -385,6 +396,23 @@ static void skb_recv_done(struct virtqueue *rvq)
|
|||
}
|
||||
}
|
||||
|
||||
static void refill_work(struct work_struct *work)
|
||||
{
|
||||
struct virtnet_info *vi;
|
||||
bool still_empty;
|
||||
|
||||
vi = container_of(work, struct virtnet_info, refill.work);
|
||||
napi_disable(&vi->napi);
|
||||
try_fill_recv(vi, GFP_KERNEL);
|
||||
still_empty = (vi->num == 0);
|
||||
napi_enable(&vi->napi);
|
||||
|
||||
/* In theory, this can happen: if we don't get any buffers in
|
||||
* we will *never* try to fill again. */
|
||||
if (still_empty)
|
||||
schedule_delayed_work(&vi->refill, HZ/2);
|
||||
}
|
||||
|
||||
static int virtnet_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi);
|
||||
|
@ -400,10 +428,10 @@ again:
|
|||
received++;
|
||||
}
|
||||
|
||||
/* FIXME: If we oom and completely run out of inbufs, we need
|
||||
* to start a timer trying to fill more. */
|
||||
if (vi->num < vi->max / 2)
|
||||
try_fill_recv(vi);
|
||||
if (vi->num < vi->max / 2) {
|
||||
if (!try_fill_recv(vi, GFP_ATOMIC))
|
||||
schedule_delayed_work(&vi->refill, 0);
|
||||
}
|
||||
|
||||
/* Out of packets? */
|
||||
if (received < budget) {
|
||||
|
@ -893,6 +921,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
vi->vdev = vdev;
|
||||
vdev->priv = vi;
|
||||
vi->pages = NULL;
|
||||
INIT_DELAYED_WORK(&vi->refill, refill_work);
|
||||
|
||||
/* If they give us a callback when all buffers are done, we don't need
|
||||
* the timer. */
|
||||
|
@ -941,7 +970,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
}
|
||||
|
||||
/* Last of all, set up some receive buffers. */
|
||||
try_fill_recv(vi);
|
||||
try_fill_recv(vi, GFP_KERNEL);
|
||||
|
||||
/* If we didn't even get one input buffer, we're useless. */
|
||||
if (vi->num == 0) {
|
||||
|
@ -958,6 +987,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|||
|
||||
unregister:
|
||||
unregister_netdev(dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
free_vqs:
|
||||
vdev->config->del_vqs(vdev);
|
||||
free:
|
||||
|
@ -986,6 +1016,7 @@ static void virtnet_remove(struct virtio_device *vdev)
|
|||
BUG_ON(vi->num != 0);
|
||||
|
||||
unregister_netdev(vi->dev);
|
||||
cancel_delayed_work_sync(&vi->refill);
|
||||
|
||||
vdev->config->del_vqs(vi->vdev);
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ int orinoco_hw_get_tkip_iv(struct orinoco_private *priv, int key, u8 *tsc)
|
|||
int err = 0;
|
||||
u8 tsc_arr[4][IW_ENCODE_SEQ_MAX_SIZE];
|
||||
|
||||
if ((key < 0) || (key > 4))
|
||||
if ((key < 0) || (key >= 4))
|
||||
return -EINVAL;
|
||||
|
||||
err = hermes_read_ltv(hw, USER_BAP, HERMES_RID_CURRENT_TKIP_IV,
|
||||
|
|
|
@ -869,6 +869,9 @@ static int rtl8187b_init_hw(struct ieee80211_hw *dev)
|
|||
priv->aifsn[3] = 3; /* AIFSN[AC_BE] */
|
||||
rtl818x_iowrite8(priv, &priv->map->ACM_CONTROL, 0);
|
||||
|
||||
/* ENEDCA flag must always be set, transmit issues? */
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, RTL818X_MSR_ENEDCA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1173,13 +1176,16 @@ static void rtl8187_bss_info_changed(struct ieee80211_hw *dev,
|
|||
rtl818x_iowrite8(priv, &priv->map->BSSID[i],
|
||||
info->bssid[i]);
|
||||
|
||||
if (priv->is_rtl8187b)
|
||||
reg = RTL818X_MSR_ENEDCA;
|
||||
else
|
||||
reg = 0;
|
||||
|
||||
if (is_valid_ether_addr(info->bssid)) {
|
||||
reg = RTL818X_MSR_INFRA;
|
||||
if (priv->is_rtl8187b)
|
||||
reg |= RTL818X_MSR_ENEDCA;
|
||||
reg |= RTL818X_MSR_INFRA;
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, reg);
|
||||
} else {
|
||||
reg = RTL818X_MSR_NO_LINK;
|
||||
reg |= RTL818X_MSR_NO_LINK;
|
||||
rtl818x_iowrite8(priv, &priv->map->MSR, reg);
|
||||
}
|
||||
|
||||
|
|
|
@ -346,7 +346,7 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
|||
static int yellowfin_open(struct net_device *dev);
|
||||
static void yellowfin_timer(unsigned long data);
|
||||
static void yellowfin_tx_timeout(struct net_device *dev);
|
||||
static void yellowfin_init_ring(struct net_device *dev);
|
||||
static int yellowfin_init_ring(struct net_device *dev);
|
||||
static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
static irqreturn_t yellowfin_interrupt(int irq, void *dev_instance);
|
||||
static int yellowfin_rx(struct net_device *dev);
|
||||
|
@ -573,19 +573,24 @@ static int yellowfin_open(struct net_device *dev)
|
|||
{
|
||||
struct yellowfin_private *yp = netdev_priv(dev);
|
||||
void __iomem *ioaddr = yp->base;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
/* Reset the chip. */
|
||||
iowrite32(0x80000000, ioaddr + DMACtrl);
|
||||
|
||||
i = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev);
|
||||
if (i) return i;
|
||||
ret = request_irq(dev->irq, &yellowfin_interrupt, IRQF_SHARED, dev->name, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (yellowfin_debug > 1)
|
||||
printk(KERN_DEBUG "%s: yellowfin_open() irq %d.\n",
|
||||
dev->name, dev->irq);
|
||||
|
||||
yellowfin_init_ring(dev);
|
||||
ret = yellowfin_init_ring(dev);
|
||||
if (ret) {
|
||||
free_irq(dev->irq, dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
iowrite32(yp->rx_ring_dma, ioaddr + RxPtr);
|
||||
iowrite32(yp->tx_ring_dma, ioaddr + TxPtr);
|
||||
|
@ -725,10 +730,10 @@ static void yellowfin_tx_timeout(struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Initialize the Rx and Tx rings, along with various 'dev' bits. */
|
||||
static void yellowfin_init_ring(struct net_device *dev)
|
||||
static int yellowfin_init_ring(struct net_device *dev)
|
||||
{
|
||||
struct yellowfin_private *yp = netdev_priv(dev);
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
yp->tx_full = 0;
|
||||
yp->cur_rx = yp->cur_tx = 0;
|
||||
|
@ -753,6 +758,11 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
yp->rx_ring[i].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
|
||||
skb->data, yp->rx_buf_sz, PCI_DMA_FROMDEVICE));
|
||||
}
|
||||
if (i != RX_RING_SIZE) {
|
||||
for (j = 0; j < i; j++)
|
||||
dev_kfree_skb(yp->rx_skbuff[j]);
|
||||
return -ENOMEM;
|
||||
}
|
||||
yp->rx_ring[i-1].dbdma_cmd = cpu_to_le32(CMD_STOP);
|
||||
yp->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
|
||||
|
||||
|
@ -769,8 +779,6 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
yp->tx_ring[--i].dbdma_cmd = cpu_to_le32(CMD_STOP | BRANCH_ALWAYS);
|
||||
#else
|
||||
{
|
||||
int j;
|
||||
|
||||
/* Tx ring needs a pair of descriptors, the second for the status. */
|
||||
for (i = 0; i < TX_RING_SIZE; i++) {
|
||||
j = 2*i;
|
||||
|
@ -805,7 +813,7 @@ static void yellowfin_init_ring(struct net_device *dev)
|
|||
}
|
||||
#endif
|
||||
yp->tx_tail_desc = &yp->tx_status[0];
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int yellowfin_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
|
|
@ -508,7 +508,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev)
|
|||
return error;
|
||||
}
|
||||
|
||||
return pci_dev->state_saved ? pci_restore_state(pci_dev) : 0;
|
||||
return pci_restore_state(pci_dev);
|
||||
}
|
||||
|
||||
static void pci_pm_default_resume_noirq(struct pci_dev *pci_dev)
|
||||
|
|
|
@ -846,6 +846,8 @@ pci_restore_state(struct pci_dev *dev)
|
|||
int i;
|
||||
u32 val;
|
||||
|
||||
if (!dev->state_saved)
|
||||
return 0;
|
||||
/* PCI Express register must be restored first */
|
||||
pci_restore_pcie_state(dev);
|
||||
|
||||
|
|
|
@ -270,7 +270,7 @@ u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out)
|
|||
acpi_status status;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object params[3];
|
||||
char method[4] = "WM";
|
||||
char method[5] = "WM";
|
||||
|
||||
if (!find_guid(guid_string, &wblock))
|
||||
return AE_ERROR;
|
||||
|
@ -328,8 +328,8 @@ struct acpi_buffer *out)
|
|||
acpi_status status, wc_status = AE_ERROR;
|
||||
struct acpi_object_list input, wc_input;
|
||||
union acpi_object wc_params[1], wq_params[1];
|
||||
char method[4];
|
||||
char wc_method[4] = "WC";
|
||||
char method[5];
|
||||
char wc_method[5] = "WC";
|
||||
|
||||
if (!guid_string || !out)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
@ -410,7 +410,7 @@ const struct acpi_buffer *in)
|
|||
acpi_handle handle;
|
||||
struct acpi_object_list input;
|
||||
union acpi_object params[2];
|
||||
char method[4] = "WS";
|
||||
char method[5] = "WS";
|
||||
|
||||
if (!guid_string || !in)
|
||||
return AE_BAD_DATA;
|
||||
|
|
|
@ -244,7 +244,7 @@ int pps_register_cdev(struct pps_device *pps)
|
|||
}
|
||||
pps->dev = device_create(pps_class, pps->info.dev, pps->devno, NULL,
|
||||
"pps%d", pps->id);
|
||||
if (err)
|
||||
if (IS_ERR(pps->dev))
|
||||
goto del_cdev;
|
||||
dev_set_drvdata(pps->dev, pps);
|
||||
|
||||
|
|
|
@ -2135,9 +2135,9 @@ static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
|
|||
struct dasd_device *base;
|
||||
|
||||
block = bdev->bd_disk->private_data;
|
||||
base = block->base;
|
||||
if (!block)
|
||||
return -ENODEV;
|
||||
base = block->base;
|
||||
|
||||
if (!base->discipline ||
|
||||
!base->discipline->fill_geometry)
|
||||
|
|
|
@ -772,10 +772,8 @@ static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch)
|
|||
cdev = io_subchannel_allocate_dev(sch);
|
||||
if (!IS_ERR(cdev)) {
|
||||
ret = io_subchannel_initialize_dev(sch, cdev);
|
||||
if (ret) {
|
||||
kfree(cdev);
|
||||
if (ret)
|
||||
cdev = ERR_PTR(ret);
|
||||
}
|
||||
}
|
||||
return cdev;
|
||||
}
|
||||
|
|
|
@ -537,8 +537,12 @@ int bbc_envctrl_init(struct bbc_i2c_bus *bp)
|
|||
}
|
||||
if (temp_index != 0 && fan_index != 0) {
|
||||
kenvctrld_task = kthread_run(kenvctrld, NULL, "kenvctrld");
|
||||
if (IS_ERR(kenvctrld_task))
|
||||
return PTR_ERR(kenvctrld_task);
|
||||
if (IS_ERR(kenvctrld_task)) {
|
||||
int err = PTR_ERR(kenvctrld_task);
|
||||
|
||||
kenvctrld_task = NULL;
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -561,7 +565,8 @@ void bbc_envctrl_cleanup(struct bbc_i2c_bus *bp)
|
|||
struct bbc_cpu_temperature *tp, *tpos;
|
||||
struct bbc_fan_control *fp, *fpos;
|
||||
|
||||
kthread_stop(kenvctrld_task);
|
||||
if (kenvctrld_task)
|
||||
kthread_stop(kenvctrld_task);
|
||||
|
||||
list_for_each_entry_safe(tp, tpos, &bp->temps, bp_list) {
|
||||
list_del(&tp->bp_list);
|
||||
|
|
|
@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work)
|
|||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* mpt2sas_base_start_watchdog - start the fault_reset_work_q
|
||||
* @ioc: pointer to scsi command object
|
||||
* Context: sleep.
|
||||
*
|
||||
* Return nothing.
|
||||
*/
|
||||
void
|
||||
mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (ioc->fault_reset_work_q)
|
||||
return;
|
||||
|
||||
/* initialize fault polling */
|
||||
INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work);
|
||||
snprintf(ioc->fault_reset_work_q_name,
|
||||
sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id);
|
||||
ioc->fault_reset_work_q =
|
||||
create_singlethread_workqueue(ioc->fault_reset_work_q_name);
|
||||
if (!ioc->fault_reset_work_q) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n",
|
||||
ioc->name, __func__, __LINE__);
|
||||
return;
|
||||
}
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (ioc->fault_reset_work_q)
|
||||
queue_delayed_work(ioc->fault_reset_work_q,
|
||||
&ioc->fault_reset_work,
|
||||
msecs_to_jiffies(FAULT_POLLING_INTERVAL));
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* mpt2sas_base_stop_watchdog - stop the fault_reset_work_q
|
||||
* @ioc: pointer to scsi command object
|
||||
* Context: sleep.
|
||||
*
|
||||
* Return nothing.
|
||||
*/
|
||||
void
|
||||
mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct workqueue_struct *wq;
|
||||
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
wq = ioc->fault_reset_work_q;
|
||||
ioc->fault_reset_work_q = NULL;
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (wq) {
|
||||
if (!cancel_delayed_work(&ioc->fault_reset_work))
|
||||
flush_workqueue(wq);
|
||||
destroy_workqueue(wq);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
||||
/**
|
||||
* _base_sas_ioc_info - verbose translation of the ioc status
|
||||
|
@ -440,6 +498,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info)
|
|||
if (sas_loginfo.dw.bus_type != 3 /*SAS*/)
|
||||
return;
|
||||
|
||||
/* each nexus loss loginfo */
|
||||
if (log_info == 0x31170000)
|
||||
return;
|
||||
|
||||
/* eat the loginfos associated with task aborts */
|
||||
if (ioc->ignore_loginfos && (log_info == 30050000 || log_info ==
|
||||
0x31140000 || log_info == 0x31130000))
|
||||
|
@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||
}
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, ioc->shost);
|
||||
_base_mask_interrupts(ioc);
|
||||
r = _base_enable_msix(ioc);
|
||||
if (r)
|
||||
|
@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||
ioc->pci_irq = -1;
|
||||
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
||||
pci_disable_device(pdev);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc)
|
|||
ioc->chip_phys = 0;
|
||||
pci_release_selected_regions(ioc->pdev, ioc->bars);
|
||||
pci_disable_device(pdev);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3205,7 +3264,6 @@ int
|
|||
mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
int r, i;
|
||||
unsigned long flags;
|
||||
|
||||
dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
||||
__func__));
|
||||
|
@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
pci_set_drvdata(ioc->pdev, ioc->shost);
|
||||
r = _base_make_ioc_ready(ioc, CAN_SLEEP, SOFT_RESET);
|
||||
if (r)
|
||||
goto out_free_resources;
|
||||
|
@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||
if (r)
|
||||
goto out_free_resources;
|
||||
|
||||
/* initialize fault polling */
|
||||
INIT_DELAYED_WORK(&ioc->fault_reset_work, _base_fault_reset_work);
|
||||
snprintf(ioc->fault_reset_work_q_name,
|
||||
sizeof(ioc->fault_reset_work_q_name), "poll_%d_status", ioc->id);
|
||||
ioc->fault_reset_work_q =
|
||||
create_singlethread_workqueue(ioc->fault_reset_work_q_name);
|
||||
if (!ioc->fault_reset_work_q) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: failed (line=%d)\n",
|
||||
ioc->name, __func__, __LINE__);
|
||||
goto out_free_resources;
|
||||
}
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (ioc->fault_reset_work_q)
|
||||
queue_delayed_work(ioc->fault_reset_work_q,
|
||||
&ioc->fault_reset_work,
|
||||
msecs_to_jiffies(FAULT_POLLING_INTERVAL));
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
mpt2sas_base_start_watchdog(ioc);
|
||||
return 0;
|
||||
|
||||
out_free_resources:
|
||||
|
@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||
ioc->remove_host = 1;
|
||||
mpt2sas_base_free_resources(ioc);
|
||||
_base_release_memory_pools(ioc);
|
||||
pci_set_drvdata(ioc->pdev, NULL);
|
||||
kfree(ioc->tm_cmds.reply);
|
||||
kfree(ioc->transport_cmds.reply);
|
||||
kfree(ioc->config_cmds.reply);
|
||||
|
@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||
void
|
||||
mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct workqueue_struct *wq;
|
||||
|
||||
dexitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
||||
__func__));
|
||||
|
||||
spin_lock_irqsave(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
wq = ioc->fault_reset_work_q;
|
||||
ioc->fault_reset_work_q = NULL;
|
||||
spin_unlock_irqrestore(&ioc->ioc_reset_in_progress_lock, flags);
|
||||
if (!cancel_delayed_work(&ioc->fault_reset_work))
|
||||
flush_workqueue(wq);
|
||||
destroy_workqueue(wq);
|
||||
|
||||
mpt2sas_base_stop_watchdog(ioc);
|
||||
mpt2sas_base_free_resources(ioc);
|
||||
_base_release_memory_pools(ioc);
|
||||
pci_set_drvdata(ioc->pdev, NULL);
|
||||
kfree(ioc->pfacts);
|
||||
kfree(ioc->ctl_cmds.reply);
|
||||
kfree(ioc->base_cmds.reply);
|
||||
|
|
|
@ -69,10 +69,10 @@
|
|||
#define MPT2SAS_DRIVER_NAME "mpt2sas"
|
||||
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
|
||||
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
|
||||
#define MPT2SAS_DRIVER_VERSION "01.100.03.00"
|
||||
#define MPT2SAS_DRIVER_VERSION "01.100.04.00"
|
||||
#define MPT2SAS_MAJOR_VERSION 01
|
||||
#define MPT2SAS_MINOR_VERSION 100
|
||||
#define MPT2SAS_BUILD_VERSION 03
|
||||
#define MPT2SAS_BUILD_VERSION 04
|
||||
#define MPT2SAS_RELEASE_VERSION 00
|
||||
|
||||
/*
|
||||
|
@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID,
|
|||
|
||||
/* base shared API */
|
||||
extern struct list_head mpt2sas_ioc_list;
|
||||
void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc);
|
||||
void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc);
|
||||
|
||||
int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc);
|
||||
void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc);
|
||||
|
|
|
@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||
Mpi2ConfigRequest_t *config_request;
|
||||
int r;
|
||||
u8 retry_count;
|
||||
u8 issue_reset;
|
||||
u8 issue_host_reset = 0;
|
||||
u16 wait_state_count;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
if (ioc->config_cmds.status != MPT2_CMD_NOT_USED) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: config_cmd in use\n",
|
||||
ioc->name, __func__);
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return -EAGAIN;
|
||||
}
|
||||
retry_count = 0;
|
||||
|
||||
retry_config:
|
||||
if (retry_count) {
|
||||
if (retry_count > 2) /* attempt only 2 retries */
|
||||
return -EFAULT;
|
||||
printk(MPT2SAS_INFO_FMT "%s: attempting retry (%d)\n",
|
||||
ioc->name, __func__, retry_count);
|
||||
}
|
||||
wait_state_count = 0;
|
||||
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
||||
while (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
|
||||
|
@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||
printk(MPT2SAS_ERR_FMT
|
||||
"%s: failed due to ioc not operational\n",
|
||||
ioc->name, __func__);
|
||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
||||
return -EFAULT;
|
||||
r = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
ssleep(1);
|
||||
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
||||
|
@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||
if (!smid) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
|
||||
ioc->name, __func__);
|
||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
||||
return -EAGAIN;
|
||||
r = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
r = 0;
|
||||
|
@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||
ioc->name, __func__);
|
||||
_debug_dump_mf(mpi_request,
|
||||
sizeof(Mpi2ConfigRequest_t)/4);
|
||||
if (!(ioc->config_cmds.status & MPT2_CMD_RESET))
|
||||
issue_reset = 1;
|
||||
goto issue_host_reset;
|
||||
retry_count++;
|
||||
if (ioc->config_cmds.smid == smid)
|
||||
mpt2sas_base_free_smid(ioc, smid);
|
||||
if ((ioc->shost_recovery) ||
|
||||
(ioc->config_cmds.status & MPT2_CMD_RESET))
|
||||
goto retry_config;
|
||||
issue_host_reset = 1;
|
||||
r = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
if (ioc->config_cmds.status & MPT2_CMD_REPLY_VALID)
|
||||
memcpy(mpi_reply, ioc->config_cmds.reply,
|
||||
|
@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
|
|||
if (retry_count)
|
||||
printk(MPT2SAS_INFO_FMT "%s: retry completed!!\n",
|
||||
ioc->name, __func__);
|
||||
out:
|
||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
||||
return r;
|
||||
|
||||
issue_host_reset:
|
||||
if (issue_reset)
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
if (issue_host_reset)
|
||||
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
|
||||
FORCE_BIG_HAMMER);
|
||||
ioc->config_cmds.status = MPT2_CMD_NOT_USED;
|
||||
if (!retry_count) {
|
||||
printk(MPT2SAS_INFO_FMT "%s: attempting retry\n",
|
||||
ioc->name, __func__);
|
||||
retry_count++;
|
||||
goto retry_config;
|
||||
}
|
||||
return -EFAULT;
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2ManufacturingPage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2BiosPage2_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2BiosPage3_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2IOUnitPage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2IOUnitPage1_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2IOCPage8_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2SasDevicePage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2SasDevicePage1_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
|
|||
Mpi2ConfigReply_t mpi_reply;
|
||||
Mpi2SasIOUnitPage0_t config_page;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER;
|
||||
|
@ -1002,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
Mpi2ConfigRequest_t mpi_request;
|
||||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sz);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sz);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2ExpanderPage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2ExpanderPage1_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2SasEnclosurePage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2SasPhyPage0_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2SasPhyPage1_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(config_page, 0, sizeof(Mpi2RaidVolPage1_t));
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
|
|||
struct config_request mem;
|
||||
u16 ioc_status;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
*num_pds = 0;
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
memset(config_page, 0, sz);
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
int r;
|
||||
struct config_request mem;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
memset(config_page, 0, sizeof(Mpi2RaidPhysDiskPage0_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
|
|||
struct config_request mem;
|
||||
u16 ioc_status;
|
||||
|
||||
mutex_lock(&ioc->config_cmds.mutex);
|
||||
*volume_handle = 0;
|
||||
memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t));
|
||||
mpi_request.Function = MPI2_FUNCTION_CONFIG;
|
||||
|
@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
|
|||
_config_free_config_dma_memory(ioc, &mem);
|
||||
|
||||
out:
|
||||
mutex_unlock(&ioc->config_cmds.mutex);
|
||||
return r;
|
||||
}
|
||||
|
||||
|
|
|
@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
|
|||
char *desc_ioc_state = NULL;
|
||||
char *desc_scsi_status = NULL;
|
||||
char *desc_scsi_state = ioc->tmp_string;
|
||||
u32 log_info = le32_to_cpu(mpi_reply->IOCLogInfo);
|
||||
|
||||
if (log_info == 0x31170000)
|
||||
return;
|
||||
|
||||
switch (ioc_status) {
|
||||
case MPI2_IOCSTATUS_SUCCESS:
|
||||
|
@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||
__le64 sas_address;
|
||||
int i;
|
||||
unsigned long flags;
|
||||
struct _sas_port *mpt2sas_port;
|
||||
struct _sas_port *mpt2sas_port = NULL;
|
||||
int rc = 0;
|
||||
|
||||
if (!handle)
|
||||
|
@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||
&expander_pg1, i, handle))) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
continue;
|
||||
rc = -1;
|
||||
goto out_fail;
|
||||
}
|
||||
sas_expander->phy[i].handle = handle;
|
||||
sas_expander->phy[i].phy_id = i;
|
||||
mpt2sas_transport_add_expander_phy(ioc, &sas_expander->phy[i],
|
||||
expander_pg1, sas_expander->parent_dev);
|
||||
|
||||
if ((mpt2sas_transport_add_expander_phy(ioc,
|
||||
&sas_expander->phy[i], expander_pg1,
|
||||
sas_expander->parent_dev))) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
rc = -1;
|
||||
goto out_fail;
|
||||
}
|
||||
}
|
||||
|
||||
if (sas_expander->enclosure_handle) {
|
||||
|
@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
|
|||
|
||||
out_fail:
|
||||
|
||||
if (sas_expander)
|
||||
kfree(sas_expander->phy);
|
||||
if (mpt2sas_port)
|
||||
mpt2sas_transport_port_remove(ioc, sas_expander->sas_address,
|
||||
sas_expander->parent_handle);
|
||||
kfree(sas_expander);
|
||||
return rc;
|
||||
}
|
||||
|
@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd)
|
|||
sas_device->hidden_raid_component = is_pd;
|
||||
|
||||
/* get enclosure_logical_id */
|
||||
if (!(mpt2sas_config_get_enclosure_pg0(ioc, &mpi_reply, &enclosure_pg0,
|
||||
MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
|
||||
sas_device->enclosure_handle))) {
|
||||
if (sas_device->enclosure_handle && !(mpt2sas_config_get_enclosure_pg0(
|
||||
ioc, &mpi_reply, &enclosure_pg0, MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE,
|
||||
sas_device->enclosure_handle)))
|
||||
sas_device->enclosure_logical_id =
|
||||
le64_to_cpu(enclosure_pg0.EnclosureLogicalID);
|
||||
}
|
||||
|
||||
/* get device name */
|
||||
sas_device->device_name = le64_to_cpu(sas_device_pg0.DeviceName);
|
||||
|
@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
|
|||
u16 handle = le16_to_cpu(element->VolDevHandle);
|
||||
int rc;
|
||||
|
||||
#if 0 /* RAID_HACKS */
|
||||
if (le32_to_cpu(event_data->Flags) &
|
||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
||||
return;
|
||||
#endif
|
||||
|
||||
mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
|
||||
if (!wwid) {
|
||||
printk(MPT2SAS_ERR_FMT
|
||||
|
@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
|
|||
unsigned long flags;
|
||||
struct MPT2SAS_TARGET *sas_target_priv_data;
|
||||
|
||||
#if 0 /* RAID_HACKS */
|
||||
if (le32_to_cpu(event_data->Flags) &
|
||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
||||
return;
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&ioc->raid_device_lock, flags);
|
||||
raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
|
||||
spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
|
||||
|
@ -4428,14 +4428,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
|
|||
struct _sas_device *sas_device;
|
||||
unsigned long flags;
|
||||
u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
|
||||
Mpi2ConfigReply_t mpi_reply;
|
||||
Mpi2SasDevicePage0_t sas_device_pg0;
|
||||
u32 ioc_status;
|
||||
|
||||
spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
||||
sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
|
||||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||
if (sas_device)
|
||||
if (sas_device) {
|
||||
sas_device->hidden_raid_component = 1;
|
||||
else
|
||||
_scsih_add_device(ioc, handle, 0, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
|
||||
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
||||
MPI2_IOCSTATUS_MASK;
|
||||
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
_scsih_link_change(ioc,
|
||||
le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
||||
handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
||||
|
||||
_scsih_add_device(ioc, handle, 0, 1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
||||
|
@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||
{
|
||||
Mpi2EventIrConfigElement_t *element;
|
||||
int i;
|
||||
u8 foreign_config;
|
||||
|
||||
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
||||
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
||||
_scsih_sas_ir_config_change_event_debug(ioc, event_data);
|
||||
|
||||
#endif
|
||||
foreign_config = (le32_to_cpu(event_data->Flags) &
|
||||
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
|
||||
|
||||
element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
||||
for (i = 0; i < event_data->NumElements; i++, element++) {
|
||||
|
@ -4548,11 +4575,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||
switch (element->ReasonCode) {
|
||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
||||
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
||||
_scsih_sas_volume_add(ioc, element);
|
||||
if (!foreign_config)
|
||||
_scsih_sas_volume_add(ioc, element);
|
||||
break;
|
||||
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
||||
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
||||
_scsih_sas_volume_delete(ioc, element);
|
||||
if (!foreign_config)
|
||||
_scsih_sas_volume_delete(ioc, element);
|
||||
break;
|
||||
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
||||
_scsih_sas_pd_hide(ioc, element);
|
||||
|
@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||
u32 state;
|
||||
struct _sas_device *sas_device;
|
||||
unsigned long flags;
|
||||
Mpi2ConfigReply_t mpi_reply;
|
||||
Mpi2SasDevicePage0_t sas_device_pg0;
|
||||
u32 ioc_status;
|
||||
|
||||
if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
|
||||
return;
|
||||
|
@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||
|
||||
switch (state) {
|
||||
#if 0
|
||||
case MPI2_RAID_PD_STATE_OFFLINE:
|
||||
if (sas_device)
|
||||
_scsih_remove_device(ioc, handle);
|
||||
break;
|
||||
#endif
|
||||
case MPI2_RAID_PD_STATE_ONLINE:
|
||||
case MPI2_RAID_PD_STATE_DEGRADED:
|
||||
case MPI2_RAID_PD_STATE_REBUILDING:
|
||||
case MPI2_RAID_PD_STATE_OPTIMAL:
|
||||
if (sas_device)
|
||||
if (sas_device) {
|
||||
sas_device->hidden_raid_component = 1;
|
||||
else
|
||||
_scsih_add_device(ioc, handle, 0, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply,
|
||||
&sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
|
||||
handle))) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
||||
MPI2_IOCSTATUS_MASK;
|
||||
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
||||
printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
||||
ioc->name, __FILE__, __LINE__, __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
_scsih_link_change(ioc,
|
||||
le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
||||
handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
||||
|
||||
_scsih_add_device(ioc, handle, 0, 1);
|
||||
|
||||
break;
|
||||
|
||||
case MPI2_RAID_PD_STATE_OFFLINE:
|
||||
case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
|
||||
case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
|
||||
case MPI2_RAID_PD_STATE_HOT_SPARE:
|
||||
|
@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
struct MPT2SAS_ADAPTER *ioc = shost_priv(shost);
|
||||
u32 device_state;
|
||||
|
||||
mpt2sas_base_stop_watchdog(ioc);
|
||||
flush_scheduled_work();
|
||||
scsi_block_requests(shost);
|
||||
device_state = pci_choose_state(pdev, state);
|
||||
|
@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev)
|
|||
|
||||
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP, SOFT_RESET);
|
||||
scsi_unblock_requests(shost);
|
||||
mpt2sas_base_start_watchdog(ioc);
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
|
|
@ -953,7 +953,12 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
|
|||
|
||||
mutex_lock(&tz->lock);
|
||||
|
||||
tz->ops->get_temp(tz, &temp);
|
||||
if (tz->ops->get_temp(tz, &temp)) {
|
||||
/* get_temp failed - retry it later */
|
||||
printk(KERN_WARNING PREFIX "failed to read out thermal zone "
|
||||
"%d\n", tz->id);
|
||||
goto leave;
|
||||
}
|
||||
|
||||
for (count = 0; count < tz->trips; count++) {
|
||||
tz->ops->get_trip_type(tz, count, &trip_type);
|
||||
|
@ -1005,6 +1010,8 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
|
|||
THERMAL_TRIPS_NONE);
|
||||
|
||||
tz->last_temperature = temp;
|
||||
|
||||
leave:
|
||||
if (tz->passive)
|
||||
thermal_zone_device_set_polling(tz, tz->passive_delay);
|
||||
else if (tz->polling_delay)
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/ar7/ar7.h>
|
||||
#include <asm/mach-ar7/ar7.h>
|
||||
|
||||
#define DRVNAME "ar7_wdt"
|
||||
#define LONGNAME "TI AR7 Watchdog Timer"
|
||||
|
|
|
@ -678,8 +678,8 @@ exit:
|
|||
}
|
||||
EXPORT_SYMBOL(open_exec);
|
||||
|
||||
int kernel_read(struct file *file, unsigned long offset,
|
||||
char *addr, unsigned long count)
|
||||
int kernel_read(struct file *file, loff_t offset,
|
||||
char *addr, unsigned long count)
|
||||
{
|
||||
mm_segment_t old_fs;
|
||||
loff_t pos = offset;
|
||||
|
|
|
@ -29,23 +29,25 @@ config EXT3_FS
|
|||
module will be called ext3.
|
||||
|
||||
config EXT3_DEFAULTS_TO_ORDERED
|
||||
bool "Default to 'data=ordered' in ext3 (legacy option)"
|
||||
bool "Default to 'data=ordered' in ext3"
|
||||
depends on EXT3_FS
|
||||
help
|
||||
If a filesystem does not explicitly specify a data ordering
|
||||
mode, and the journal capability allowed it, ext3 used to
|
||||
historically default to 'data=ordered'.
|
||||
The journal mode options for ext3 have different tradeoffs
|
||||
between when data is guaranteed to be on disk and
|
||||
performance. The use of "data=writeback" can cause
|
||||
unwritten data to appear in files after an system crash or
|
||||
power failure, which can be a security issue. However,
|
||||
"data=ordered" mode can also result in major performance
|
||||
problems, including seconds-long delays before an fsync()
|
||||
call returns. For details, see:
|
||||
|
||||
That was a rather unfortunate choice, because it leads to all
|
||||
kinds of latency problems, and the 'data=writeback' mode is more
|
||||
appropriate these days.
|
||||
http://ext4.wiki.kernel.org/index.php/Ext3_data_mode_tradeoffs
|
||||
|
||||
You should probably always answer 'n' here, and if you really
|
||||
want to use 'data=ordered' mode, set it in the filesystem itself
|
||||
with 'tune2fs -o journal_data_ordered'.
|
||||
|
||||
But if you really want to enable the legacy default, you can do
|
||||
so by answering 'y' to this question.
|
||||
If you have been historically happy with ext3's performance,
|
||||
data=ordered mode will be a safe choice and you should
|
||||
answer 'y' here. If you understand the reliability and data
|
||||
privacy issues of data=writeback and are willing to make
|
||||
that trade off, answer 'n'.
|
||||
|
||||
config EXT3_FS_XATTR
|
||||
bool "Ext3 extended attributes"
|
||||
|
|
|
@ -543,6 +543,19 @@ static inline void ext3_show_quota_options(struct seq_file *seq, struct super_bl
|
|||
#endif
|
||||
}
|
||||
|
||||
static char *data_mode_string(unsigned long mode)
|
||||
{
|
||||
switch (mode) {
|
||||
case EXT3_MOUNT_JOURNAL_DATA:
|
||||
return "journal";
|
||||
case EXT3_MOUNT_ORDERED_DATA:
|
||||
return "ordered";
|
||||
case EXT3_MOUNT_WRITEBACK_DATA:
|
||||
return "writeback";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
/*
|
||||
* Show an option if
|
||||
* - it's set to a non-default value OR
|
||||
|
@ -616,13 +629,8 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
|||
if (test_opt(sb, NOBH))
|
||||
seq_puts(seq, ",nobh");
|
||||
|
||||
if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA)
|
||||
seq_puts(seq, ",data=journal");
|
||||
else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA)
|
||||
seq_puts(seq, ",data=ordered");
|
||||
else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA)
|
||||
seq_puts(seq, ",data=writeback");
|
||||
|
||||
seq_printf(seq, ",data=%s", data_mode_string(sbi->s_mount_opt &
|
||||
EXT3_MOUNT_DATA_FLAGS));
|
||||
if (test_opt(sb, DATA_ERR_ABORT))
|
||||
seq_puts(seq, ",data_err=abort");
|
||||
|
||||
|
@ -1024,12 +1032,18 @@ static int parse_options (char *options, struct super_block *sb,
|
|||
datacheck:
|
||||
if (is_remount) {
|
||||
if ((sbi->s_mount_opt & EXT3_MOUNT_DATA_FLAGS)
|
||||
!= data_opt) {
|
||||
printk(KERN_ERR
|
||||
"EXT3-fs: cannot change data "
|
||||
"mode on remount\n");
|
||||
return 0;
|
||||
}
|
||||
== data_opt)
|
||||
break;
|
||||
printk(KERN_ERR
|
||||
"EXT3-fs (device %s): Cannot change "
|
||||
"data mode on remount. The filesystem "
|
||||
"is mounted in data=%s mode and you "
|
||||
"try to remount it in data=%s mode.\n",
|
||||
sb->s_id,
|
||||
data_mode_string(sbi->s_mount_opt &
|
||||
EXT3_MOUNT_DATA_FLAGS),
|
||||
data_mode_string(data_opt));
|
||||
return 0;
|
||||
} else {
|
||||
sbi->s_mount_opt &= ~EXT3_MOUNT_DATA_FLAGS;
|
||||
sbi->s_mount_opt |= data_opt;
|
||||
|
|
|
@ -935,26 +935,28 @@ static int can_do_hugetlb_shm(void)
|
|||
return capable(CAP_IPC_LOCK) || in_group_p(sysctl_hugetlb_shm_group);
|
||||
}
|
||||
|
||||
struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
|
||||
struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag,
|
||||
struct user_struct **user)
|
||||
{
|
||||
int error = -ENOMEM;
|
||||
int unlock_shm = 0;
|
||||
struct file *file;
|
||||
struct inode *inode;
|
||||
struct dentry *dentry, *root;
|
||||
struct qstr quick_string;
|
||||
struct user_struct *user = current_user();
|
||||
|
||||
*user = NULL;
|
||||
if (!hugetlbfs_vfsmount)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
if (!can_do_hugetlb_shm()) {
|
||||
if (user_shm_lock(size, user)) {
|
||||
unlock_shm = 1;
|
||||
*user = current_user();
|
||||
if (user_shm_lock(size, *user)) {
|
||||
WARN_ONCE(1,
|
||||
"Using mlock ulimits for SHM_HUGETLB deprecated\n");
|
||||
} else
|
||||
} else {
|
||||
*user = NULL;
|
||||
return ERR_PTR(-EPERM);
|
||||
}
|
||||
}
|
||||
|
||||
root = hugetlbfs_vfsmount->mnt_root;
|
||||
|
@ -996,8 +998,10 @@ out_inode:
|
|||
out_dentry:
|
||||
dput(dentry);
|
||||
out_shm_unlock:
|
||||
if (unlock_shm)
|
||||
user_shm_unlock(size, user);
|
||||
if (*user) {
|
||||
user_shm_unlock(size, *user);
|
||||
*user = NULL;
|
||||
}
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
|
|
|
@ -1250,8 +1250,8 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
|||
continue;
|
||||
}
|
||||
/* Initialize or reset the session */
|
||||
if (nfs4_has_session(clp) &&
|
||||
test_and_clear_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)) {
|
||||
if (test_and_clear_bit(NFS4CLNT_SESSION_SETUP, &clp->cl_state)
|
||||
&& nfs4_has_session(clp)) {
|
||||
if (clp->cl_cons_state == NFS_CS_SESSION_INITING)
|
||||
status = nfs4_initialize_session(clp);
|
||||
else
|
||||
|
|
|
@ -6851,7 +6851,7 @@ static int ocfs2_do_truncate(struct ocfs2_super *osb,
|
|||
}
|
||||
status = 0;
|
||||
bail:
|
||||
|
||||
brelse(last_eb_bh);
|
||||
mlog_exit(status);
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -122,7 +122,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
|
|||
* that still has AST's pending... */
|
||||
in_use = !list_empty(&lock->ast_list);
|
||||
spin_unlock(&dlm->ast_lock);
|
||||
if (in_use) {
|
||||
if (in_use && !(flags & LKM_CANCEL)) {
|
||||
mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock "
|
||||
"while waiting for an ast!", res->lockname.len,
|
||||
res->lockname.name);
|
||||
|
@ -131,7 +131,7 @@ static enum dlm_status dlmunlock_common(struct dlm_ctxt *dlm,
|
|||
|
||||
spin_lock(&res->spinlock);
|
||||
if (res->state & DLM_LOCK_RES_IN_PROGRESS) {
|
||||
if (master_node) {
|
||||
if (master_node && !(flags & LKM_CANCEL)) {
|
||||
mlog(ML_ERROR, "lockres in progress!\n");
|
||||
spin_unlock(&res->spinlock);
|
||||
return DLM_FORWARD;
|
||||
|
|
|
@ -108,6 +108,7 @@ static char *ocfs2_lock_type_strings[] = {
|
|||
[OCFS2_LOCK_TYPE_OPEN] = "Open",
|
||||
[OCFS2_LOCK_TYPE_FLOCK] = "Flock",
|
||||
[OCFS2_LOCK_TYPE_QINFO] = "Quota",
|
||||
[OCFS2_LOCK_TYPE_NFS_SYNC] = "NFSSync",
|
||||
[OCFS2_LOCK_TYPE_ORPHAN_SCAN] = "OrphanScan",
|
||||
};
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "sysfile.h"
|
||||
#include "dlmglue.h"
|
||||
#include "uptodate.h"
|
||||
#include "super.h"
|
||||
#include "quota.h"
|
||||
|
||||
static struct workqueue_struct *ocfs2_quota_wq = NULL;
|
||||
|
@ -114,6 +115,15 @@ int ocfs2_read_quota_block(struct inode *inode, u64 v_block,
|
|||
int rc = 0;
|
||||
struct buffer_head *tmp = *bh;
|
||||
|
||||
if (i_size_read(inode) >> inode->i_sb->s_blocksize_bits <= v_block) {
|
||||
ocfs2_error(inode->i_sb,
|
||||
"Quota file %llu is probably corrupted! Requested "
|
||||
"to read block %Lu but file has size only %Lu\n",
|
||||
(unsigned long long)OCFS2_I(inode)->ip_blkno,
|
||||
(unsigned long long)v_block,
|
||||
(unsigned long long)i_size_read(inode));
|
||||
return -EIO;
|
||||
}
|
||||
rc = ocfs2_read_virt_blocks(inode, v_block, 1, &tmp, 0,
|
||||
ocfs2_validate_quota_block);
|
||||
if (rc)
|
||||
|
|
|
@ -1218,13 +1218,17 @@ static void ocfs2_kill_sb(struct super_block *sb)
|
|||
{
|
||||
struct ocfs2_super *osb = OCFS2_SB(sb);
|
||||
|
||||
/* Failed mount? */
|
||||
if (!osb || atomic_read(&osb->vol_state) == VOLUME_DISABLED)
|
||||
goto out;
|
||||
|
||||
/* Prevent further queueing of inode drop events */
|
||||
spin_lock(&dentry_list_lock);
|
||||
ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED);
|
||||
spin_unlock(&dentry_list_lock);
|
||||
/* Wait for work to finish and/or remove it */
|
||||
cancel_work_sync(&osb->dentry_lock_work);
|
||||
|
||||
out:
|
||||
kill_block_super(sb);
|
||||
}
|
||||
|
||||
|
|
|
@ -174,7 +174,7 @@ struct acpi_processor_throttling {
|
|||
cpumask_var_t shared_cpu_map;
|
||||
int (*acpi_processor_get_throttling) (struct acpi_processor * pr);
|
||||
int (*acpi_processor_set_throttling) (struct acpi_processor * pr,
|
||||
int state);
|
||||
int state, bool force);
|
||||
|
||||
u32 address;
|
||||
u8 duty_offset;
|
||||
|
@ -321,7 +321,8 @@ static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
|
|||
/* in processor_throttling.c */
|
||||
int acpi_processor_tstate_has_changed(struct acpi_processor *pr);
|
||||
int acpi_processor_get_throttling_info(struct acpi_processor *pr);
|
||||
extern int acpi_processor_set_throttling(struct acpi_processor *pr, int state);
|
||||
extern int acpi_processor_set_throttling(struct acpi_processor *pr,
|
||||
int state, bool force);
|
||||
extern const struct file_operations acpi_processor_throttling_fops;
|
||||
extern void acpi_processor_throttling_init(void);
|
||||
/* in processor_idle.c */
|
||||
|
|
|
@ -21,7 +21,7 @@ struct flex_array {
|
|||
struct {
|
||||
int element_size;
|
||||
int total_nr_elements;
|
||||
struct flex_array_part *parts[0];
|
||||
struct flex_array_part *parts[];
|
||||
};
|
||||
/*
|
||||
* This little trick makes sure that
|
||||
|
@ -36,12 +36,14 @@ struct flex_array {
|
|||
.total_nr_elements = (total), \
|
||||
} } }
|
||||
|
||||
struct flex_array *flex_array_alloc(int element_size, int total, gfp_t flags);
|
||||
int flex_array_prealloc(struct flex_array *fa, int start, int end, gfp_t flags);
|
||||
struct flex_array *flex_array_alloc(int element_size, unsigned int total,
|
||||
gfp_t flags);
|
||||
int flex_array_prealloc(struct flex_array *fa, unsigned int start,
|
||||
unsigned int end, gfp_t flags);
|
||||
void flex_array_free(struct flex_array *fa);
|
||||
void flex_array_free_parts(struct flex_array *fa);
|
||||
int flex_array_put(struct flex_array *fa, int element_nr, void *src,
|
||||
int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src,
|
||||
gfp_t flags);
|
||||
void *flex_array_get(struct flex_array *fa, int element_nr);
|
||||
void *flex_array_get(struct flex_array *fa, unsigned int element_nr);
|
||||
|
||||
#endif /* _FLEX_ARRAY_H */
|
||||
|
|
|
@ -2123,7 +2123,7 @@ extern struct file *do_filp_open(int dfd, const char *pathname,
|
|||
int open_flag, int mode, int acc_mode);
|
||||
extern int may_open(struct path *, int, int);
|
||||
|
||||
extern int kernel_read(struct file *, unsigned long, char *, unsigned long);
|
||||
extern int kernel_read(struct file *, loff_t, char *, unsigned long);
|
||||
extern struct file * open_exec(const char *);
|
||||
|
||||
/* fs/dcache.c -- generic fs support functions */
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <asm/tlbflush.h>
|
||||
|
||||
struct ctl_table;
|
||||
struct user_struct;
|
||||
|
||||
int PageHuge(struct page *page);
|
||||
|
||||
|
@ -146,7 +147,8 @@ static inline struct hugetlbfs_sb_info *HUGETLBFS_SB(struct super_block *sb)
|
|||
|
||||
extern const struct file_operations hugetlbfs_file_operations;
|
||||
extern struct vm_operations_struct hugetlb_vm_ops;
|
||||
struct file *hugetlb_file_setup(const char *name, size_t, int);
|
||||
struct file *hugetlb_file_setup(const char *name, size_t size, int acct,
|
||||
struct user_struct **user);
|
||||
int hugetlb_get_quota(struct address_space *mapping, long delta);
|
||||
void hugetlb_put_quota(struct address_space *mapping, long delta);
|
||||
|
||||
|
@ -168,7 +170,7 @@ static inline void set_file_hugepages(struct file *file)
|
|||
|
||||
#define is_file_hugepages(file) 0
|
||||
#define set_file_hugepages(file) BUG()
|
||||
#define hugetlb_file_setup(name,size,acctflag) ERR_PTR(-ENOSYS)
|
||||
#define hugetlb_file_setup(name,size,acct,user) ERR_PTR(-ENOSYS)
|
||||
|
||||
#endif /* !CONFIG_HUGETLBFS */
|
||||
|
||||
|
|
|
@ -73,6 +73,10 @@
|
|||
|
||||
#define UCB_ADC_DATA 0x68
|
||||
#define UCB_ADC_DAT_VALID (1 << 15)
|
||||
|
||||
#define UCB_FCSR 0x6c
|
||||
#define UCB_FCSR_AVE (1 << 12)
|
||||
|
||||
#define UCB_ADC_DAT_MASK 0x3ff
|
||||
|
||||
#define UCB_ID 0x7e
|
||||
|
|
|
@ -61,8 +61,8 @@ psched_tdiff_bounded(psched_time_t tv1, psched_time_t tv2, psched_time_t bound)
|
|||
}
|
||||
|
||||
struct qdisc_watchdog {
|
||||
struct hrtimer timer;
|
||||
struct Qdisc *qdisc;
|
||||
struct tasklet_hrtimer timer;
|
||||
struct Qdisc *qdisc;
|
||||
};
|
||||
|
||||
extern void qdisc_watchdog_init(struct qdisc_watchdog *wd, struct Qdisc *qdisc);
|
||||
|
|
|
@ -631,7 +631,6 @@ asmlinkage void __init start_kernel(void)
|
|||
softirq_init();
|
||||
timekeeping_init();
|
||||
time_init();
|
||||
sched_clock_init();
|
||||
profile_init();
|
||||
if (!irqs_disabled())
|
||||
printk(KERN_CRIT "start_kernel(): bug: interrupts were "
|
||||
|
@ -682,6 +681,7 @@ asmlinkage void __init start_kernel(void)
|
|||
numa_policy_init();
|
||||
if (late_time_init)
|
||||
late_time_init();
|
||||
sched_clock_init();
|
||||
calibrate_delay();
|
||||
pidmap_init();
|
||||
anon_vma_init();
|
||||
|
@ -733,13 +733,14 @@ static void __init do_ctors(void)
|
|||
int initcall_debug;
|
||||
core_param(initcall_debug, initcall_debug, bool, 0644);
|
||||
|
||||
static char msgbuf[64];
|
||||
static struct boot_trace_call call;
|
||||
static struct boot_trace_ret ret;
|
||||
|
||||
int do_one_initcall(initcall_t fn)
|
||||
{
|
||||
int count = preempt_count();
|
||||
ktime_t calltime, delta, rettime;
|
||||
char msgbuf[64];
|
||||
struct boot_trace_call call;
|
||||
struct boot_trace_ret ret;
|
||||
|
||||
if (initcall_debug) {
|
||||
call.caller = task_pid_nr(current);
|
||||
|
|
|
@ -174,7 +174,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
|
|||
shm_unlock(shp);
|
||||
if (!is_file_hugepages(shp->shm_file))
|
||||
shmem_lock(shp->shm_file, 0, shp->mlock_user);
|
||||
else
|
||||
else if (shp->mlock_user)
|
||||
user_shm_unlock(shp->shm_file->f_path.dentry->d_inode->i_size,
|
||||
shp->mlock_user);
|
||||
fput (shp->shm_file);
|
||||
|
@ -369,8 +369,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
|
|||
/* hugetlb_file_setup applies strict accounting */
|
||||
if (shmflg & SHM_NORESERVE)
|
||||
acctflag = VM_NORESERVE;
|
||||
file = hugetlb_file_setup(name, size, acctflag);
|
||||
shp->mlock_user = current_user();
|
||||
file = hugetlb_file_setup(name, size, acctflag,
|
||||
&shp->mlock_user);
|
||||
} else {
|
||||
/*
|
||||
* Do not allow no accounting for OVERCOMMIT_NEVER, even
|
||||
|
@ -410,6 +410,8 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
|
|||
return error;
|
||||
|
||||
no_id:
|
||||
if (shp->mlock_user) /* shmflg & SHM_HUGETLB case */
|
||||
user_shm_unlock(size, shp->mlock_user);
|
||||
fput(file);
|
||||
no_file:
|
||||
security_shm_free(shp);
|
||||
|
|
|
@ -815,11 +815,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
|
|||
{
|
||||
struct signal_struct *sig;
|
||||
|
||||
if (clone_flags & CLONE_THREAD) {
|
||||
atomic_inc(¤t->signal->count);
|
||||
atomic_inc(¤t->signal->live);
|
||||
if (clone_flags & CLONE_THREAD)
|
||||
return 0;
|
||||
}
|
||||
|
||||
sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
|
||||
tsk->signal = sig;
|
||||
|
@ -877,16 +874,6 @@ void __cleanup_signal(struct signal_struct *sig)
|
|||
kmem_cache_free(signal_cachep, sig);
|
||||
}
|
||||
|
||||
static void cleanup_signal(struct task_struct *tsk)
|
||||
{
|
||||
struct signal_struct *sig = tsk->signal;
|
||||
|
||||
atomic_dec(&sig->live);
|
||||
|
||||
if (atomic_dec_and_test(&sig->count))
|
||||
__cleanup_signal(sig);
|
||||
}
|
||||
|
||||
static void copy_flags(unsigned long clone_flags, struct task_struct *p)
|
||||
{
|
||||
unsigned long new_flags = p->flags;
|
||||
|
@ -1239,6 +1226,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
|||
}
|
||||
|
||||
if (clone_flags & CLONE_THREAD) {
|
||||
atomic_inc(¤t->signal->count);
|
||||
atomic_inc(¤t->signal->live);
|
||||
p->group_leader = current->group_leader;
|
||||
list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
|
||||
}
|
||||
|
@ -1282,7 +1271,8 @@ bad_fork_cleanup_mm:
|
|||
if (p->mm)
|
||||
mmput(p->mm);
|
||||
bad_fork_cleanup_signal:
|
||||
cleanup_signal(p);
|
||||
if (!(clone_flags & CLONE_THREAD))
|
||||
__cleanup_signal(p->signal);
|
||||
bad_fork_cleanup_sighand:
|
||||
__cleanup_sighand(p->sighand);
|
||||
bad_fork_cleanup_fs:
|
||||
|
|
|
@ -1791,7 +1791,7 @@ static int perf_counter_read_group(struct perf_counter *counter,
|
|||
size += err;
|
||||
|
||||
list_for_each_entry(sub, &leader->sibling_list, list_entry) {
|
||||
err = perf_counter_read_entry(counter, read_format,
|
||||
err = perf_counter_read_entry(sub, read_format,
|
||||
buf + size);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
|
|
@ -137,11 +137,12 @@ int clockevents_program_event(struct clock_event_device *dev, ktime_t expires,
|
|||
*/
|
||||
int clockevents_register_notifier(struct notifier_block *nb)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
spin_lock(&clockevents_lock);
|
||||
spin_lock_irqsave(&clockevents_lock, flags);
|
||||
ret = raw_notifier_chain_register(&clockevents_chain, nb);
|
||||
spin_unlock(&clockevents_lock);
|
||||
spin_unlock_irqrestore(&clockevents_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -178,16 +179,18 @@ static void clockevents_notify_released(void)
|
|||
*/
|
||||
void clockevents_register_device(struct clock_event_device *dev)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
BUG_ON(dev->mode != CLOCK_EVT_MODE_UNUSED);
|
||||
BUG_ON(!dev->cpumask);
|
||||
|
||||
spin_lock(&clockevents_lock);
|
||||
spin_lock_irqsave(&clockevents_lock, flags);
|
||||
|
||||
list_add(&dev->list, &clockevent_devices);
|
||||
clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD, dev);
|
||||
clockevents_notify_released();
|
||||
|
||||
spin_unlock(&clockevents_lock);
|
||||
spin_unlock_irqrestore(&clockevents_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clockevents_register_device);
|
||||
|
||||
|
@ -235,8 +238,9 @@ void clockevents_exchange_device(struct clock_event_device *old,
|
|||
void clockevents_notify(unsigned long reason, void *arg)
|
||||
{
|
||||
struct list_head *node, *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&clockevents_lock);
|
||||
spin_lock_irqsave(&clockevents_lock, flags);
|
||||
clockevents_do_notify(reason, arg);
|
||||
|
||||
switch (reason) {
|
||||
|
@ -251,7 +255,7 @@ void clockevents_notify(unsigned long reason, void *arg)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
spin_unlock(&clockevents_lock);
|
||||
spin_unlock_irqrestore(&clockevents_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clockevents_notify);
|
||||
#endif
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче