Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
df797679
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
“18308c94723e162ed121942335bc186e66820a7a”上不存在“README.md”
提交
df797679
编写于
13年前
作者:
K
Keith Packard
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'drm-intel-fixes' into drm-intel-next
上级
f0b69efc
9c54c0dd
无相关合并请求
变更
152
隐藏空白更改
内联
并排
Showing
152 changed file
with
1265 addition
and
680 deletion
+1265
-680
Documentation/filesystems/nilfs2.txt
Documentation/filesystems/nilfs2.txt
+0
-1
Documentation/networking/ip-sysctl.txt
Documentation/networking/ip-sysctl.txt
+1
-1
Documentation/x86/boot.txt
Documentation/x86/boot.txt
+1
-1
Makefile
Makefile
+1
-1
arch/arm/mach-davinci/board-dm365-evm.c
arch/arm/mach-davinci/board-dm365-evm.c
+2
-2
arch/arm/mach-davinci/gpio.c
arch/arm/mach-davinci/gpio.c
+16
-5
arch/arm/mach-davinci/irq.c
arch/arm/mach-davinci/irq.c
+7
-1
arch/arm/mach-ixp4xx/common.c
arch/arm/mach-ixp4xx/common.c
+8
-2
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mmp/pxa168.c
+1
-1
arch/arm/mach-mmp/pxa910.c
arch/arm/mach-mmp/pxa910.c
+1
-1
arch/arm/mach-pxa/mfp-pxa2xx.c
arch/arm/mach-pxa/mfp-pxa2xx.c
+2
-2
arch/arm/mach-pxa/raumfeld.c
arch/arm/mach-pxa/raumfeld.c
+19
-17
arch/arm/mach-s3c64xx/dma.c
arch/arm/mach-s3c64xx/dma.c
+7
-7
arch/arm/plat-orion/gpio.c
arch/arm/plat-orion/gpio.c
+1
-1
arch/arm/plat-pxa/gpio.c
arch/arm/plat-pxa/gpio.c
+5
-5
arch/arm/plat-s3c24xx/dma.c
arch/arm/plat-s3c24xx/dma.c
+6
-6
arch/arm/plat-s5p/irq-gpioint.c
arch/arm/plat-s5p/irq-gpioint.c
+1
-1
arch/arm/plat-samsung/dma.c
arch/arm/plat-samsung/dma.c
+3
-3
arch/arm/plat-samsung/include/plat/dma.h
arch/arm/plat-samsung/include/plat/dma.h
+11
-10
arch/arm/plat-samsung/irq-uart.c
arch/arm/plat-samsung/irq-uart.c
+8
-1
arch/arm/plat-samsung/irq-vic-timer.c
arch/arm/plat-samsung/irq-vic-timer.c
+7
-0
arch/mips/kernel/i8259.c
arch/mips/kernel/i8259.c
+6
-16
arch/powerpc/platforms/pseries/hotplug-memory.c
arch/powerpc/platforms/pseries/hotplug-memory.c
+19
-11
arch/sparc/include/asm/irqflags_32.h
arch/sparc/include/asm/irqflags_32.h
+4
-4
arch/sparc/include/asm/irqflags_64.h
arch/sparc/include/asm/irqflags_64.h
+7
-7
arch/sparc/include/asm/ptrace.h
arch/sparc/include/asm/ptrace.h
+1
-0
arch/sparc/kernel/entry.S
arch/sparc/kernel/entry.S
+1
-1
arch/sparc/mm/leon_mm.c
arch/sparc/mm/leon_mm.c
+1
-1
arch/x86/Kconfig
arch/x86/Kconfig
+1
-1
arch/x86/kernel/reboot.c
arch/x86/kernel/reboot.c
+24
-0
arch/x86/mm/init_64.c
arch/x86/mm/init_64.c
+1
-2
drivers/acpi/apei/hest.c
drivers/acpi/apei/hest.c
+11
-1
drivers/acpi/osl.c
drivers/acpi/osl.c
+0
-17
drivers/base/memory.c
drivers/base/memory.c
+0
-1
drivers/char/agp/intel-agp.h
drivers/char/agp/intel-agp.h
+4
-3
drivers/gpio/wm831x-gpio.c
drivers/gpio/wm831x-gpio.c
+1
-0
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_dma.c
+2
-4
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_drv.h
+4
-1
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem.c
+35
-36
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_gem_tiling.c
+3
-1
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_display.c
+20
-3
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_ringbuffer.c
+3
-0
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreen.c
+1
-1
drivers/gpu/drm/radeon/evergreen_blit_kms.c
drivers/gpu/drm/radeon/evergreen_blit_kms.c
+7
-2
drivers/gpu/drm/radeon/radeon_bios.c
drivers/gpu/drm/radeon/radeon_bios.c
+15
-6
drivers/gpu/drm/radeon/radeon_connectors.c
drivers/gpu/drm/radeon/radeon_connectors.c
+6
-0
drivers/gpu/drm/radeon/radeon_reg.h
drivers/gpu/drm/radeon/radeon_reg.h
+2
-0
drivers/gpu/drm/radeon/rs600.c
drivers/gpu/drm/radeon/rs600.c
+3
-3
drivers/hwmon/adm1275.c
drivers/hwmon/adm1275.c
+5
-5
drivers/hwmon/asus_atk0110.c
drivers/hwmon/asus_atk0110.c
+1
-0
drivers/hwmon/it87.c
drivers/hwmon/it87.c
+1
-1
drivers/hwmon/max1111.c
drivers/hwmon/max1111.c
+11
-0
drivers/hwmon/pmbus_core.c
drivers/hwmon/pmbus_core.c
+10
-10
drivers/media/dvb/dvb-core/dvb_frontend.c
drivers/media/dvb/dvb-core/dvb_frontend.c
+8
-0
drivers/media/radio/Kconfig
drivers/media/radio/Kconfig
+2
-2
drivers/media/radio/si4713-i2c.c
drivers/media/radio/si4713-i2c.c
+2
-2
drivers/media/rc/mceusb.c
drivers/media/rc/mceusb.c
+5
-4
drivers/media/rc/nuvoton-cir.c
drivers/media/rc/nuvoton-cir.c
+1
-1
drivers/media/video/cx23885/cx23885-core.c
drivers/media/video/cx23885/cx23885-core.c
+2
-7
drivers/media/video/tuner-core.c
drivers/media/video/tuner-core.c
+12
-4
drivers/mmc/core/mmc.c
drivers/mmc/core/mmc.c
+50
-27
drivers/net/bonding/bond_main.c
drivers/net/bonding/bond_main.c
+3
-3
drivers/net/gianfar.c
drivers/net/gianfar.c
+19
-5
drivers/net/gianfar.h
drivers/net/gianfar.h
+2
-1
drivers/net/natsemi.c
drivers/net/natsemi.c
+3
-3
drivers/net/pppoe.c
drivers/net/pppoe.c
+2
-1
drivers/net/r6040.c
drivers/net/r6040.c
+5
-3
drivers/net/slip.c
drivers/net/slip.c
+1
-1
drivers/net/tulip/dmfe.c
drivers/net/tulip/dmfe.c
+0
-4
drivers/net/usb/hso.c
drivers/net/usb/hso.c
+4
-3
drivers/net/wireless/ath/ath5k/pci.c
drivers/net/wireless/ath/ath5k/pci.c
+5
-2
drivers/net/wireless/ath/ath5k/sysfs.c
drivers/net/wireless/ath/ath5k/sysfs.c
+6
-3
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ath/ath9k/xmit.c
+2
-1
drivers/net/wireless/ath/carl9170/usb.c
drivers/net/wireless/ath/carl9170/usb.c
+2
-0
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+1
-0
drivers/pcmcia/pxa2xx_vpac270.c
drivers/pcmcia/pxa2xx_vpac270.c
+2
-2
drivers/ssb/driver_pcicore.c
drivers/ssb/driver_pcicore.c
+9
-9
drivers/watchdog/Kconfig
drivers/watchdog/Kconfig
+1
-2
fs/ceph/mds_client.c
fs/ceph/mds_client.c
+16
-3
fs/cifs/cifsfs.c
fs/cifs/cifsfs.c
+29
-71
fs/cifs/cifsfs.h
fs/cifs/cifsfs.h
+1
-1
fs/cifs/connect.c
fs/cifs/connect.c
+1
-1
fs/cifs/dir.c
fs/cifs/dir.c
+12
-1
fs/cifs/file.c
fs/cifs/file.c
+1
-1
fs/cifs/sess.c
fs/cifs/sess.c
+5
-5
fs/cramfs/inode.c
fs/cramfs/inode.c
+12
-10
fs/dcache.c
fs/dcache.c
+34
-19
fs/exofs/super.c
fs/exofs/super.c
+1
-1
fs/fscache/page.c
fs/fscache/page.c
+5
-9
fs/gfs2/aops.c
fs/gfs2/aops.c
+3
-0
fs/gfs2/glops.c
fs/gfs2/glops.c
+5
-3
fs/gfs2/incore.h
fs/gfs2/incore.h
+2
-0
fs/gfs2/log.c
fs/gfs2/log.c
+1
-0
fs/gfs2/ops_fstype.c
fs/gfs2/ops_fstype.c
+3
-0
fs/gfs2/super.c
fs/gfs2/super.c
+30
-6
fs/gfs2/sys.c
fs/gfs2/sys.c
+6
-1
fs/hppfs/hppfs.c
fs/hppfs/hppfs.c
+9
-22
fs/libfs.c
fs/libfs.c
+1
-1
fs/namei.c
fs/namei.c
+8
-1
fs/nfs/nfs4filelayout.c
fs/nfs/nfs4filelayout.c
+0
-1
fs/nfs/nfs4xdr.c
fs/nfs/nfs4xdr.c
+1
-1
fs/nfs/write.c
fs/nfs/write.c
+2
-0
fs/ufs/namei.c
fs/ufs/namei.c
+4
-8
include/acpi/acpi_bus.h
include/acpi/acpi_bus.h
+1
-1
include/acpi/acpiosxf.h
include/acpi/acpiosxf.h
+3
-0
include/acpi/platform/aclinux.h
include/acpi/platform/aclinux.h
+18
-0
include/drm/drm_pciids.h
include/drm/drm_pciids.h
+2
-0
include/drm/i915_drm.h
include/drm/i915_drm.h
+1
-1
include/linux/irq.h
include/linux/irq.h
+2
-1
include/linux/memory.h
include/linux/memory.h
+2
-0
include/linux/mmc/card.h
include/linux/mmc/card.h
+13
-0
include/linux/netdevice.h
include/linux/netdevice.h
+0
-6
include/linux/sched.h
include/linux/sched.h
+13
-4
include/linux/sdla.h
include/linux/sdla.h
+1
-5
include/net/sctp/command.h
include/net/sctp/command.h
+1
-0
include/net/sctp/ulpevent.h
include/net/sctp/ulpevent.h
+1
-1
kernel/irq/generic-chip.c
kernel/irq/generic-chip.c
+16
-2
kernel/rcutree.c
kernel/rcutree.c
+25
-1
kernel/rcutree_plugin.h
kernel/rcutree_plugin.h
+50
-18
kernel/sched.c
kernel/sched.c
+196
-40
kernel/sched_fair.c
kernel/sched_fair.c
+23
-23
kernel/sched_features.h
kernel/sched_features.h
+2
-0
kernel/signal.c
kernel/signal.c
+13
-6
kernel/softirq.c
kernel/softirq.c
+10
-2
mm/vmscan.c
mm/vmscan.c
+2
-1
net/8021q/vlan_dev.c
net/8021q/vlan_dev.c
+5
-1
net/bluetooth/hci_conn.c
net/bluetooth/hci_conn.c
+3
-0
net/bluetooth/hidp/core.c
net/bluetooth/hidp/core.c
+11
-7
net/bluetooth/hidp/hidp.h
net/bluetooth/hidp/hidp.h
+1
-0
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_core.c
+6
-4
net/ceph/ceph_fs.c
net/ceph/ceph_fs.c
+10
-7
net/mac80211/scan.c
net/mac80211/scan.c
+2
-1
net/mac80211/wpa.c
net/mac80211/wpa.c
+13
-3
net/sctp/output.c
net/sctp/output.c
+8
-11
net/sctp/outqueue.c
net/sctp/outqueue.c
+19
-1
net/sctp/sm_sideeffect.c
net/sctp/sm_sideeffect.c
+18
-2
net/sctp/sm_statefuns.c
net/sctp/sm_statefuns.c
+23
-9
net/sctp/sm_statetable.c
net/sctp/sm_statetable.c
+1
-1
net/sctp/socket.c
net/sctp/socket.c
+8
-5
net/sctp/ulpevent.c
net/sctp/ulpevent.c
+13
-3
net/sunrpc/rpcb_clnt.c
net/sunrpc/rpcb_clnt.c
+1
-1
net/sunrpc/sched.c
net/sunrpc/sched.c
+11
-16
net/wireless/core.c
net/wireless/core.c
+9
-3
net/wireless/core.h
net/wireless/core.h
+2
-0
net/wireless/nl80211.c
net/wireless/nl80211.c
+18
-6
net/wireless/scan.c
net/wireless/scan.c
+5
-5
net/xfrm/xfrm_state.c
net/xfrm/xfrm_state.c
+2
-0
scripts/depmod.sh
scripts/depmod.sh
+6
-4
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+5
-4
sound/soc/sh/fsi-ak4642.c
sound/soc/sh/fsi-ak4642.c
+8
-8
sound/soc/sh/fsi-da7210.c
sound/soc/sh/fsi-da7210.c
+1
-1
sound/soc/sh/fsi-hdmi.c
sound/soc/sh/fsi-hdmi.c
+2
-2
未找到文件。
Documentation/filesystems/nilfs2.txt
浏览文件 @
df797679
...
...
@@ -40,7 +40,6 @@ Features which NILFS2 does not support yet:
- POSIX ACLs
- quotas
- fsck
- resize
- defragmentation
Mount options
...
...
This diff is collapsed.
Click to expand it.
Documentation/networking/ip-sysctl.txt
浏览文件 @
df797679
...
...
@@ -346,7 +346,7 @@ tcp_orphan_retries - INTEGER
when RTO retransmissions remain unacknowledged.
See tcp_retries2 for more details.
The default value is
7
.
The default value is
8
.
If your machine is a loaded WEB server,
you should think about lowering this value, such sockets
may consume significant resources. Cf. tcp_max_orphans.
...
...
This diff is collapsed.
Click to expand it.
Documentation/x86/boot.txt
浏览文件 @
df797679
...
...
@@ -674,7 +674,7 @@ Protocol: 2.10+
Field name: init_size
Type: read
Offset/size: 0x2
5c
/4
Offset/size: 0x2
60
/4
This field indicates the amount of linear contiguous memory starting
at the kernel runtime start address that the kernel needs before it
...
...
This diff is collapsed.
Click to expand it.
Makefile
浏览文件 @
df797679
VERSION
=
3
PATCHLEVEL
=
0
SUBLEVEL
=
0
EXTRAVERSION
=
-rc7
EXTRAVERSION
=
NAME
=
Sneaky Weasel
# *DOCUMENTATION*
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-davinci/board-dm365-evm.c
浏览文件 @
df797679
...
...
@@ -520,7 +520,7 @@ static void __init evm_init_cpld(void)
*/
if
(
have_imager
())
{
label
=
"HD imager"
;
mux
|=
1
;
mux
|=
2
;
/* externally mux MMC1/ENET/AIC33 to imager */
mux
|=
BIT
(
6
)
|
BIT
(
5
)
|
BIT
(
3
);
...
...
@@ -540,7 +540,7 @@ static void __init evm_init_cpld(void)
resets
&=
~
BIT
(
1
);
if
(
have_tvp7002
())
{
mux
|=
2
;
mux
|=
1
;
resets
&=
~
BIT
(
2
);
label
=
"tvp7002 HD"
;
}
else
{
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-davinci/gpio.c
浏览文件 @
df797679
...
...
@@ -254,8 +254,10 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
{
struct
davinci_gpio_regs
__iomem
*
g
;
u32
mask
=
0xffff
;
struct
davinci_gpio_controller
*
d
;
g
=
(
__force
struct
davinci_gpio_regs
__iomem
*
)
irq_desc_get_handler_data
(
desc
);
d
=
(
struct
davinci_gpio_controller
*
)
irq_desc_get_handler_data
(
desc
);
g
=
(
struct
davinci_gpio_regs
__iomem
*
)
d
->
regs
;
/* we only care about one bank */
if
(
irq
&
1
)
...
...
@@ -274,11 +276,14 @@ gpio_irq_handler(unsigned irq, struct irq_desc *desc)
if
(
!
status
)
break
;
__raw_writel
(
status
,
&
g
->
intstat
);
if
(
irq
&
1
)
status
>>=
16
;
/* now demux them to the right lowlevel handler */
n
=
(
int
)
irq_get_handler_data
(
irq
);
n
=
d
->
irq_base
;
if
(
irq
&
1
)
{
n
+=
16
;
status
>>=
16
;
}
while
(
status
)
{
res
=
ffs
(
status
);
n
+=
res
;
...
...
@@ -424,7 +429,13 @@ static int __init davinci_gpio_irq_setup(void)
/* set up all irqs in this bank */
irq_set_chained_handler
(
bank_irq
,
gpio_irq_handler
);
irq_set_handler_data
(
bank_irq
,
(
__force
void
*
)
g
);
/*
* Each chip handles 32 gpios, and each irq bank consists of 16
* gpio irqs. Pass the irq bank's corresponding controller to
* the chained irq handler.
*/
irq_set_handler_data
(
bank_irq
,
&
chips
[
gpio
/
32
]);
for
(
i
=
0
;
i
<
16
&&
gpio
<
ngpio
;
i
++
,
irq
++
,
gpio
++
)
{
irq_set_chip
(
irq
,
&
gpio_irqchip
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-davinci/irq.c
浏览文件 @
df797679
...
...
@@ -52,8 +52,14 @@ davinci_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
struct
irq_chip_type
*
ct
;
gc
=
irq_alloc_generic_chip
(
"AINTC"
,
1
,
irq_start
,
base
,
handle_edge_irq
);
if
(
!
gc
)
{
pr_err
(
"%s: irq_alloc_generic_chip for IRQ %u failed
\n
"
,
__func__
,
irq_start
);
return
;
}
ct
=
gc
->
chip_types
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
_set_bit
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_clr_bit
;
ct
->
chip
.
irq_unmask
=
irq_gc_mask_set_bit
;
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-ixp4xx/common.c
浏览文件 @
df797679
...
...
@@ -419,14 +419,20 @@ static void notrace ixp4xx_update_sched_clock(void)
/*
* clocksource
*/
static
cycle_t
ixp4xx_clocksource_read
(
struct
clocksource
*
c
)
{
return
*
IXP4XX_OSTS
;
}
unsigned
long
ixp4xx_timer_freq
=
IXP4XX_TIMER_FREQ
;
EXPORT_SYMBOL
(
ixp4xx_timer_freq
);
static
void
__init
ixp4xx_clocksource_init
(
void
)
{
init_sched_clock
(
&
cd
,
ixp4xx_update_sched_clock
,
32
,
ixp4xx_timer_freq
);
clocksource_mmio_init
(
&
IXP4XX_OSTS
,
"OSTS"
,
ixp4xx_timer_freq
,
200
,
32
,
clocksource_mmio_readl_up
);
clocksource_mmio_init
(
NULL
,
"OSTS"
,
ixp4xx_timer_freq
,
200
,
32
,
ixp4xx_clocksource_read
);
}
/*
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-mmp/pxa168.c
浏览文件 @
df797679
...
...
@@ -79,7 +79,7 @@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);
static
APBC_CLK
(
ssp5
,
PXA168_SSP5
,
4
,
0
);
static
APBC_CLK
(
keypad
,
PXA168_KPC
,
0
,
32000
);
static
APMU_CLK
(
nand
,
NAND
,
0x
01db
,
208
000000
);
static
APMU_CLK
(
nand
,
NAND
,
0x
19b
,
156
000000
);
static
APMU_CLK
(
lcd
,
LCD
,
0x7f
,
312000000
);
/* device and clock bindings */
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-mmp/pxa910.c
浏览文件 @
df797679
...
...
@@ -110,7 +110,7 @@ static APBC_CLK(pwm2, PXA910_PWM2, 1, 13000000);
static
APBC_CLK
(
pwm3
,
PXA910_PWM3
,
1
,
13000000
);
static
APBC_CLK
(
pwm4
,
PXA910_PWM4
,
1
,
13000000
);
static
APMU_CLK
(
nand
,
NAND
,
0x
01db
,
208
000000
);
static
APMU_CLK
(
nand
,
NAND
,
0x
19b
,
156
000000
);
static
APMU_CLK
(
u2o
,
USB
,
0x1b
,
480000000
);
/* device and clock bindings */
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-pxa/mfp-pxa2xx.c
浏览文件 @
df797679
...
...
@@ -347,9 +347,9 @@ static int pxa2xx_mfp_suspend(void)
if
((
gpio_desc
[
i
].
config
&
MFP_LPM_KEEP_OUTPUT
)
&&
(
GPDR
(
i
)
&
GPIO_bit
(
i
)))
{
if
(
GPLR
(
i
)
&
GPIO_bit
(
i
))
PGSR
(
i
)
|=
GPIO_bit
(
i
);
PGSR
(
gpio_to_bank
(
i
)
)
|=
GPIO_bit
(
i
);
else
PGSR
(
i
)
&=
~
GPIO_bit
(
i
);
PGSR
(
gpio_to_bank
(
i
)
)
&=
~
GPIO_bit
(
i
);
}
}
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-pxa/raumfeld.c
浏览文件 @
df797679
...
...
@@ -573,10 +573,10 @@ static struct pxafb_mode_info sharp_lq043t3dx02_mode = {
.
xres
=
480
,
.
yres
=
272
,
.
bpp
=
16
,
.
hsync_len
=
4
,
.
hsync_len
=
4
1
,
.
left_margin
=
2
,
.
right_margin
=
1
,
.
vsync_len
=
1
,
.
vsync_len
=
1
0
,
.
upper_margin
=
3
,
.
lower_margin
=
1
,
.
sync
=
0
,
...
...
@@ -596,29 +596,31 @@ static void __init raumfeld_lcd_init(void)
{
int
ret
;
pxa_set_fb_info
(
NULL
,
&
raumfeld_sharp_lcd_info
);
/* Earlier devices had the backlight regulator controlled
* via PWM, later versions use another controller for that */
if
((
system_rev
&
0xff
)
<
2
)
{
mfp_cfg_t
raumfeld_pwm_pin_config
=
GPIO17_PWM0_OUT
;
pxa3xx_mfp_config
(
&
raumfeld_pwm_pin_config
,
1
);
platform_device_register
(
&
raumfeld_pwm_backlight_device
);
}
else
platform_device_register
(
&
raumfeld_lt3593_device
);
ret
=
gpio_request
(
GPIO_TFT_VA_EN
,
"display VA enable"
);
if
(
ret
<
0
)
pr_warning
(
"Unable to request GPIO_TFT_VA_EN
\n
"
);
else
gpio_direction_output
(
GPIO_TFT_VA_EN
,
1
);
msleep
(
100
);
ret
=
gpio_request
(
GPIO_DISPLAY_ENABLE
,
"display enable"
);
if
(
ret
<
0
)
pr_warning
(
"Unable to request GPIO_DISPLAY_ENABLE
\n
"
);
else
gpio_direction_output
(
GPIO_DISPLAY_ENABLE
,
1
);
/* Hardware revision 2 has the backlight regulator controlled
* by an LT3593, earlier and later devices use PWM for that. */
if
((
system_rev
&
0xff
)
==
2
)
{
platform_device_register
(
&
raumfeld_lt3593_device
);
}
else
{
mfp_cfg_t
raumfeld_pwm_pin_config
=
GPIO17_PWM0_OUT
;
pxa3xx_mfp_config
(
&
raumfeld_pwm_pin_config
,
1
);
platform_device_register
(
&
raumfeld_pwm_backlight_device
);
}
pxa_set_fb_info
(
NULL
,
&
raumfeld_sharp_lcd_info
);
platform_device_register
(
&
pxa3xx_device_gcu
);
}
...
...
@@ -657,10 +659,10 @@ static struct lis3lv02d_platform_data lis3_pdata = {
#define SPI_AK4104 \
{ \
.modalias = "ak4104", \
.max_speed_hz = 10000, \
.bus_num = 0, \
.chip_select = 0, \
.modalias = "ak4104
-codec
", \
.max_speed_hz = 10000,
\
.bus_num = 0,
\
.chip_select = 0,
\
.controller_data = (void *) GPIO_SPDIF_CS, \
}
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c64xx/dma.c
浏览文件 @
df797679
...
...
@@ -113,7 +113,7 @@ static struct s3c2410_dma_chan *s3c64xx_dma_map_channel(unsigned int channel)
return
chan
;
}
int
s3c2410_dma_config
(
unsigned
int
channel
,
int
xferunit
)
int
s3c2410_dma_config
(
enum
dma_ch
channel
,
int
xferunit
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -297,7 +297,7 @@ static int s3c64xx_dma_flush(struct s3c2410_dma_chan *chan)
return
0
;
}
int
s3c2410_dma_ctrl
(
unsigned
int
channel
,
enum
s3c2410_chan_op
op
)
int
s3c2410_dma_ctrl
(
enum
dma_ch
channel
,
enum
s3c2410_chan_op
op
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -331,7 +331,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);
*
*/
int
s3c2410_dma_enqueue
(
unsigned
int
channel
,
void
*
id
,
int
s3c2410_dma_enqueue
(
enum
dma_ch
channel
,
void
*
id
,
dma_addr_t
data
,
int
size
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -415,7 +415,7 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
EXPORT_SYMBOL
(
s3c2410_dma_enqueue
);
int
s3c2410_dma_devconfig
(
unsigned
int
channel
,
int
s3c2410_dma_devconfig
(
enum
dma_ch
channel
,
enum
s3c2410_dmasrc
source
,
unsigned
long
devaddr
)
{
...
...
@@ -463,7 +463,7 @@ int s3c2410_dma_devconfig(unsigned int channel,
EXPORT_SYMBOL
(
s3c2410_dma_devconfig
);
int
s3c2410_dma_getposition
(
unsigned
int
channel
,
int
s3c2410_dma_getposition
(
enum
dma_ch
channel
,
dma_addr_t
*
src
,
dma_addr_t
*
dst
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -487,7 +487,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);
* get control of an dma channel
*/
int
s3c2410_dma_request
(
unsigned
int
channel
,
int
s3c2410_dma_request
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
client
,
void
*
dev
)
{
...
...
@@ -533,7 +533,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
* allowed to go through.
*/
int
s3c2410_dma_free
(
unsigned
int
channel
,
struct
s3c2410_dma_client
*
client
)
int
s3c2410_dma_free
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
client
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
unsigned
long
flags
;
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-orion/gpio.c
浏览文件 @
df797679
...
...
@@ -432,7 +432,7 @@ void __init orion_gpio_init(int gpio_base, int ngpio,
ct
->
regs
.
mask
=
ochip
->
mask_offset
+
GPIO_EDGE_MASK_OFF
;
ct
->
regs
.
ack
=
GPIO_EDGE_CAUSE_OFF
;
ct
->
type
=
IRQ_TYPE_EDGE_RISING
|
IRQ_TYPE_EDGE_FALLING
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
_clr_bit
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_clr_bit
;
ct
->
chip
.
irq_unmask
=
irq_gc_mask_set_bit
;
ct
->
chip
.
irq_set_type
=
gpio_irq_set_type
;
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-pxa/gpio.c
浏览文件 @
df797679
...
...
@@ -50,7 +50,7 @@ static inline void __iomem *gpio_chip_base(struct gpio_chip *c)
return
container_of
(
c
,
struct
pxa_gpio_chip
,
chip
)
->
regbase
;
}
static
inline
struct
pxa_gpio_chip
*
gpio_to_chip
(
unsigned
gpio
)
static
inline
struct
pxa_gpio_chip
*
gpio_to_
pxa
chip
(
unsigned
gpio
)
{
return
&
pxa_gpio_chips
[
gpio_to_bank
(
gpio
)];
}
...
...
@@ -161,7 +161,7 @@ static int pxa_gpio_irq_type(struct irq_data *d, unsigned int type)
int
gpio
=
irq_to_gpio
(
d
->
irq
);
unsigned
long
gpdr
,
mask
=
GPIO_bit
(
gpio
);
c
=
gpio_to_chip
(
gpio
);
c
=
gpio_to_
pxa
chip
(
gpio
);
if
(
type
==
IRQ_TYPE_PROBE
)
{
/* Don't mess with enabled GPIOs using preconfigured edges or
...
...
@@ -230,7 +230,7 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
static
void
pxa_ack_muxed_gpio
(
struct
irq_data
*
d
)
{
int
gpio
=
irq_to_gpio
(
d
->
irq
);
struct
pxa_gpio_chip
*
c
=
gpio_to_chip
(
gpio
);
struct
pxa_gpio_chip
*
c
=
gpio_to_
pxa
chip
(
gpio
);
__raw_writel
(
GPIO_bit
(
gpio
),
c
->
regbase
+
GEDR_OFFSET
);
}
...
...
@@ -238,7 +238,7 @@ static void pxa_ack_muxed_gpio(struct irq_data *d)
static
void
pxa_mask_muxed_gpio
(
struct
irq_data
*
d
)
{
int
gpio
=
irq_to_gpio
(
d
->
irq
);
struct
pxa_gpio_chip
*
c
=
gpio_to_chip
(
gpio
);
struct
pxa_gpio_chip
*
c
=
gpio_to_
pxa
chip
(
gpio
);
uint32_t
grer
,
gfer
;
c
->
irq_mask
&=
~
GPIO_bit
(
gpio
);
...
...
@@ -252,7 +252,7 @@ static void pxa_mask_muxed_gpio(struct irq_data *d)
static
void
pxa_unmask_muxed_gpio
(
struct
irq_data
*
d
)
{
int
gpio
=
irq_to_gpio
(
d
->
irq
);
struct
pxa_gpio_chip
*
c
=
gpio_to_chip
(
gpio
);
struct
pxa_gpio_chip
*
c
=
gpio_to_
pxa
chip
(
gpio
);
c
->
irq_mask
|=
GPIO_bit
(
gpio
);
update_edge_detect
(
c
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-s3c24xx/dma.c
浏览文件 @
df797679
...
...
@@ -712,7 +712,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel);
* get control of an dma channel
*/
int
s3c2410_dma_request
(
unsigned
int
channel
,
int
s3c2410_dma_request
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
client
,
void
*
dev
)
{
...
...
@@ -783,7 +783,7 @@ EXPORT_SYMBOL(s3c2410_dma_request);
* allowed to go through.
*/
int
s3c2410_dma_free
(
unsigned
int
channel
,
struct
s3c2410_dma_client
*
client
)
int
s3c2410_dma_free
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
client
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
unsigned
long
flags
;
...
...
@@ -974,7 +974,7 @@ static int s3c2410_dma_started(struct s3c2410_dma_chan *chan)
}
int
s3c2410_dma_ctrl
(
unsigned
int
channel
,
enum
s3c2410_chan_op
op
)
s3c2410_dma_ctrl
(
enum
dma_ch
channel
,
enum
s3c2410_chan_op
op
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -1021,7 +1021,7 @@ EXPORT_SYMBOL(s3c2410_dma_ctrl);
* xfersize: size of unit in bytes (1,2,4)
*/
int
s3c2410_dma_config
(
unsigned
int
channel
,
int
s3c2410_dma_config
(
enum
dma_ch
channel
,
int
xferunit
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -1100,7 +1100,7 @@ EXPORT_SYMBOL(s3c2410_dma_config);
* devaddr: physical address of the source
*/
int
s3c2410_dma_devconfig
(
unsigned
int
channel
,
int
s3c2410_dma_devconfig
(
enum
dma_ch
channel
,
enum
s3c2410_dmasrc
source
,
unsigned
long
devaddr
)
{
...
...
@@ -1173,7 +1173,7 @@ EXPORT_SYMBOL(s3c2410_dma_devconfig);
* returns the current transfer points for the dma source and destination
*/
int
s3c2410_dma_getposition
(
unsigned
int
channel
,
dma_addr_t
*
src
,
dma_addr_t
*
dst
)
int
s3c2410_dma_getposition
(
enum
dma_ch
channel
,
dma_addr_t
*
src
,
dma_addr_t
*
dst
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-s5p/irq-gpioint.c
浏览文件 @
df797679
...
...
@@ -152,7 +152,7 @@ static __init int s5p_gpioint_add(struct s3c_gpio_chip *chip)
if
(
!
gc
)
return
-
ENOMEM
;
ct
=
gc
->
chip_types
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
_set_bit
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_set_bit
;
ct
->
chip
.
irq_unmask
=
irq_gc_mask_clr_bit
;
ct
->
chip
.
irq_set_type
=
s5p_gpioint_set_type
,
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-samsung/dma.c
浏览文件 @
df797679
...
...
@@ -41,7 +41,7 @@ struct s3c2410_dma_chan *s3c_dma_lookup_channel(unsigned int channel)
* irq?
*/
int
s3c2410_dma_set_opfn
(
unsigned
int
channel
,
s3c2410_dma_opfn_t
rtn
)
int
s3c2410_dma_set_opfn
(
enum
dma_ch
channel
,
s3c2410_dma_opfn_t
rtn
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -56,7 +56,7 @@ int s3c2410_dma_set_opfn(unsigned int channel, s3c2410_dma_opfn_t rtn)
}
EXPORT_SYMBOL
(
s3c2410_dma_set_opfn
);
int
s3c2410_dma_set_buffdone_fn
(
unsigned
int
channel
,
s3c2410_dma_cbfn_t
rtn
)
int
s3c2410_dma_set_buffdone_fn
(
enum
dma_ch
channel
,
s3c2410_dma_cbfn_t
rtn
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
@@ -71,7 +71,7 @@ int s3c2410_dma_set_buffdone_fn(unsigned int channel, s3c2410_dma_cbfn_t rtn)
}
EXPORT_SYMBOL
(
s3c2410_dma_set_buffdone_fn
);
int
s3c2410_dma_setflags
(
unsigned
int
channel
,
unsigned
int
flags
)
int
s3c2410_dma_setflags
(
enum
dma_ch
channel
,
unsigned
int
flags
)
{
struct
s3c2410_dma_chan
*
chan
=
s3c_dma_lookup_channel
(
channel
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-samsung/include/plat/dma.h
浏览文件 @
df797679
...
...
@@ -42,6 +42,7 @@ struct s3c2410_dma_client {
};
struct
s3c2410_dma_chan
;
enum
dma_ch
;
/* s3c2410_dma_cbfn_t
*
...
...
@@ -62,7 +63,7 @@ typedef int (*s3c2410_dma_opfn_t)(struct s3c2410_dma_chan *,
* request a dma channel exclusivley
*/
extern
int
s3c2410_dma_request
(
unsigned
int
channel
,
extern
int
s3c2410_dma_request
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
,
void
*
dev
);
...
...
@@ -71,14 +72,14 @@ extern int s3c2410_dma_request(unsigned int channel,
* change the state of the dma channel
*/
extern
int
s3c2410_dma_ctrl
(
unsigned
int
channel
,
enum
s3c2410_chan_op
op
);
extern
int
s3c2410_dma_ctrl
(
enum
dma_ch
channel
,
enum
s3c2410_chan_op
op
);
/* s3c2410_dma_setflags
*
* set the channel's flags to a given state
*/
extern
int
s3c2410_dma_setflags
(
unsigned
int
channel
,
extern
int
s3c2410_dma_setflags
(
enum
dma_ch
channel
,
unsigned
int
flags
);
/* s3c2410_dma_free
...
...
@@ -86,7 +87,7 @@ extern int s3c2410_dma_setflags(unsigned int channel,
* free the dma channel (will also abort any outstanding operations)
*/
extern
int
s3c2410_dma_free
(
unsigned
int
channel
,
struct
s3c2410_dma_client
*
);
extern
int
s3c2410_dma_free
(
enum
dma_ch
channel
,
struct
s3c2410_dma_client
*
);
/* s3c2410_dma_enqueue
*
...
...
@@ -95,7 +96,7 @@ extern int s3c2410_dma_free(unsigned int channel, struct s3c2410_dma_client *);
* drained before the buffer is given to the DMA system.
*/
extern
int
s3c2410_dma_enqueue
(
unsigned
int
channel
,
void
*
id
,
extern
int
s3c2410_dma_enqueue
(
enum
dma_ch
channel
,
void
*
id
,
dma_addr_t
data
,
int
size
);
/* s3c2410_dma_config
...
...
@@ -103,14 +104,14 @@ extern int s3c2410_dma_enqueue(unsigned int channel, void *id,
* configure the dma channel
*/
extern
int
s3c2410_dma_config
(
unsigned
int
channel
,
int
xferunit
);
extern
int
s3c2410_dma_config
(
enum
dma_ch
channel
,
int
xferunit
);
/* s3c2410_dma_devconfig
*
* configure the device we're talking to
*/
extern
int
s3c2410_dma_devconfig
(
unsigned
int
channel
,
extern
int
s3c2410_dma_devconfig
(
enum
dma_ch
channel
,
enum
s3c2410_dmasrc
source
,
unsigned
long
devaddr
);
/* s3c2410_dma_getposition
...
...
@@ -118,10 +119,10 @@ extern int s3c2410_dma_devconfig(unsigned int channel,
* get the position that the dma transfer is currently at
*/
extern
int
s3c2410_dma_getposition
(
unsigned
int
channel
,
extern
int
s3c2410_dma_getposition
(
enum
dma_ch
channel
,
dma_addr_t
*
src
,
dma_addr_t
*
dest
);
extern
int
s3c2410_dma_set_opfn
(
unsigned
int
,
s3c2410_dma_opfn_t
rtn
);
extern
int
s3c2410_dma_set_buffdone_fn
(
unsigned
int
,
s3c2410_dma_cbfn_t
rtn
);
extern
int
s3c2410_dma_set_opfn
(
enum
dma_ch
,
s3c2410_dma_opfn_t
rtn
);
extern
int
s3c2410_dma_set_buffdone_fn
(
enum
dma_ch
,
s3c2410_dma_cbfn_t
rtn
);
This diff is collapsed.
Click to expand it.
arch/arm/plat-samsung/irq-uart.c
浏览文件 @
df797679
...
...
@@ -54,8 +54,15 @@ static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq)
gc
=
irq_alloc_generic_chip
(
"s3c-uart"
,
1
,
uirq
->
base_irq
,
reg_base
,
handle_level_irq
);
if
(
!
gc
)
{
pr_err
(
"%s: irq_alloc_generic_chip for IRQ %u failed
\n
"
,
__func__
,
uirq
->
base_irq
);
return
;
}
ct
=
gc
->
chip_types
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
;
ct
->
chip
.
irq_ack
=
irq_gc_ack
_set_bit
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_set_bit
;
ct
->
chip
.
irq_unmask
=
irq_gc_mask_clr_bit
;
ct
->
regs
.
ack
=
S3C64XX_UINTP
;
...
...
This diff is collapsed.
Click to expand it.
arch/arm/plat-samsung/irq-vic-timer.c
浏览文件 @
df797679
...
...
@@ -54,6 +54,13 @@ void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)
s3c_tgc
=
irq_alloc_generic_chip
(
"s3c-timer"
,
1
,
timer_irq
,
S3C64XX_TINT_CSTAT
,
handle_level_irq
);
if
(
!
s3c_tgc
)
{
pr_err
(
"%s: irq_alloc_generic_chip for IRQ %d failed
\n
"
,
__func__
,
timer_irq
);
return
;
}
ct
=
s3c_tgc
->
chip_types
;
ct
->
chip
.
irq_mask
=
irq_gc_mask_clr_bit
;
ct
->
chip
.
irq_unmask
=
irq_gc_mask_set_bit
;
...
...
This diff is collapsed.
Click to expand it.
arch/mips/kernel/i8259.c
浏览文件 @
df797679
...
...
@@ -14,7 +14,7 @@
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/sys
dev
.h>
#include <linux/sys
core_ops
.h>
#include <linux/irq.h>
#include <asm/i8259.h>
...
...
@@ -215,14 +215,13 @@ static void mask_and_ack_8259A(struct irq_data *d)
}
}
static
int
i8259A_resume
(
struct
sys_device
*
dev
)
static
void
i8259A_resume
(
void
)
{
if
(
i8259A_auto_eoi
>=
0
)
init_8259A
(
i8259A_auto_eoi
);
return
0
;
}
static
int
i8259A_shutdown
(
struct
sys_device
*
dev
)
static
void
i8259A_shutdown
(
void
)
{
/* Put the i8259A into a quiescent state that
* the kernel initialization code can get it
...
...
@@ -232,26 +231,17 @@ static int i8259A_shutdown(struct sys_device *dev)
outb
(
0xff
,
PIC_MASTER_IMR
);
/* mask all of 8259A-1 */
outb
(
0xff
,
PIC_SLAVE_IMR
);
/* mask all of 8259A-1 */
}
return
0
;
}
static
struct
sysdev_class
i8259_sysdev_class
=
{
.
name
=
"i8259"
,
static
struct
syscore_ops
i8259_syscore_ops
=
{
.
resume
=
i8259A_resume
,
.
shutdown
=
i8259A_shutdown
,
};
static
struct
sys_device
device_i8259A
=
{
.
id
=
0
,
.
cls
=
&
i8259_sysdev_class
,
};
static
int
__init
i8259A_init_sysfs
(
void
)
{
int
error
=
sysdev_class_register
(
&
i8259_sysdev_class
);
if
(
!
error
)
error
=
sysdev_register
(
&
device_i8259A
);
return
error
;
register_syscore_ops
(
&
i8259_syscore_ops
);
return
0
;
}
device_initcall
(
i8259A_init_sysfs
);
...
...
This diff is collapsed.
Click to expand it.
arch/powerpc/platforms/pseries/hotplug-memory.c
浏览文件 @
df797679
...
...
@@ -12,6 +12,8 @@
#include <linux/of.h>
#include <linux/memblock.h>
#include <linux/vmalloc.h>
#include <linux/memory.h>
#include <asm/firmware.h>
#include <asm/machdep.h>
#include <asm/pSeries_reconfig.h>
...
...
@@ -20,24 +22,25 @@
static
unsigned
long
get_memblock_size
(
void
)
{
struct
device_node
*
np
;
unsigned
int
memblock_size
=
0
;
unsigned
int
memblock_size
=
MIN_MEMORY_BLOCK_SIZE
;
struct
resource
r
;
np
=
of_find_node_by_path
(
"/ibm,dynamic-reconfiguration-memory"
);
if
(
np
)
{
const
unsigned
long
*
size
;
const
__be64
*
size
;
size
=
of_get_property
(
np
,
"ibm,lmb-size"
,
NULL
);
memblock_size
=
size
?
*
size
:
0
;
if
(
size
)
memblock_size
=
be64_to_cpup
(
size
);
of_node_put
(
np
);
}
else
{
}
else
if
(
machine_is
(
pseries
))
{
/* This fallback really only applies to pseries */
unsigned
int
memzero_size
=
0
;
const
unsigned
int
*
regs
;
np
=
of_find_node_by_path
(
"/memory@0"
);
if
(
np
)
{
regs
=
of_get_property
(
np
,
"reg"
,
NULL
);
memzero_size
=
regs
?
regs
[
3
]
:
0
;
if
(
!
of_address_to_resource
(
np
,
0
,
&
r
))
memzero_size
=
resource_size
(
&
r
)
;
of_node_put
(
np
);
}
...
...
@@ -50,16 +53,21 @@ static unsigned long get_memblock_size(void)
sprintf
(
buf
,
"/memory@%x"
,
memzero_size
);
np
=
of_find_node_by_path
(
buf
);
if
(
np
)
{
regs
=
of_get_property
(
np
,
"reg"
,
NULL
);
memblock_size
=
regs
?
regs
[
3
]
:
0
;
if
(
!
of_address_to_resource
(
np
,
0
,
&
r
))
memblock_size
=
resource_size
(
&
r
)
;
of_node_put
(
np
);
}
}
}
return
memblock_size
;
}
/* WARNING: This is going to override the generic definition whenever
* pseries is built-in regardless of what platform is active at boot
* time. This is fine for now as this is the only "option" and it
* should work everywhere. If not, we'll have to turn this into a
* ppc_md. callback
*/
unsigned
long
memory_block_size_bytes
(
void
)
{
return
get_memblock_size
();
...
...
This diff is collapsed.
Click to expand it.
arch/sparc/include/asm/irqflags_32.h
浏览文件 @
df797679
...
...
@@ -18,7 +18,7 @@ extern void arch_local_irq_restore(unsigned long);
extern
unsigned
long
arch_local_irq_save
(
void
);
extern
void
arch_local_irq_enable
(
void
);
static
inline
unsigned
long
arch_local_save_flags
(
void
)
static
inline
notrace
unsigned
long
arch_local_save_flags
(
void
)
{
unsigned
long
flags
;
...
...
@@ -26,17 +26,17 @@ static inline unsigned long arch_local_save_flags(void)
return
flags
;
}
static
inline
void
arch_local_irq_disable
(
void
)
static
inline
notrace
void
arch_local_irq_disable
(
void
)
{
arch_local_irq_save
();
}
static
inline
bool
arch_irqs_disabled_flags
(
unsigned
long
flags
)
static
inline
notrace
bool
arch_irqs_disabled_flags
(
unsigned
long
flags
)
{
return
(
flags
&
PSR_PIL
)
!=
0
;
}
static
inline
bool
arch_irqs_disabled
(
void
)
static
inline
notrace
bool
arch_irqs_disabled
(
void
)
{
return
arch_irqs_disabled_flags
(
arch_local_save_flags
());
}
...
...
This diff is collapsed.
Click to expand it.
arch/sparc/include/asm/irqflags_64.h
浏览文件 @
df797679
...
...
@@ -14,7 +14,7 @@
#ifndef __ASSEMBLY__
static
inline
unsigned
long
arch_local_save_flags
(
void
)
static
inline
notrace
unsigned
long
arch_local_save_flags
(
void
)
{
unsigned
long
flags
;
...
...
@@ -26,7 +26,7 @@ static inline unsigned long arch_local_save_flags(void)
return
flags
;
}
static
inline
void
arch_local_irq_restore
(
unsigned
long
flags
)
static
inline
notrace
void
arch_local_irq_restore
(
unsigned
long
flags
)
{
__asm__
__volatile__
(
"wrpr %0, %%pil"
...
...
@@ -36,7 +36,7 @@ static inline void arch_local_irq_restore(unsigned long flags)
);
}
static
inline
void
arch_local_irq_disable
(
void
)
static
inline
notrace
void
arch_local_irq_disable
(
void
)
{
__asm__
__volatile__
(
"wrpr %0, %%pil"
...
...
@@ -46,7 +46,7 @@ static inline void arch_local_irq_disable(void)
);
}
static
inline
void
arch_local_irq_enable
(
void
)
static
inline
notrace
void
arch_local_irq_enable
(
void
)
{
__asm__
__volatile__
(
"wrpr 0, %%pil"
...
...
@@ -56,17 +56,17 @@ static inline void arch_local_irq_enable(void)
);
}
static
inline
int
arch_irqs_disabled_flags
(
unsigned
long
flags
)
static
inline
notrace
int
arch_irqs_disabled_flags
(
unsigned
long
flags
)
{
return
(
flags
>
0
);
}
static
inline
int
arch_irqs_disabled
(
void
)
static
inline
notrace
int
arch_irqs_disabled
(
void
)
{
return
arch_irqs_disabled_flags
(
arch_local_save_flags
());
}
static
inline
unsigned
long
arch_local_irq_save
(
void
)
static
inline
notrace
unsigned
long
arch_local_irq_save
(
void
)
{
unsigned
long
flags
,
tmp
;
...
...
This diff is collapsed.
Click to expand it.
arch/sparc/include/asm/ptrace.h
浏览文件 @
df797679
...
...
@@ -205,6 +205,7 @@ do { current_thread_info()->syscall_noerror = 1; \
} while (0)
#define user_mode(regs) (!((regs)->tstate & TSTATE_PRIV))
#define instruction_pointer(regs) ((regs)->tpc)
#define instruction_pointer_set(regs, val) ((regs)->tpc = (val))
#define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
#define regs_return_value(regs) ((regs)->u_regs[UREG_I0])
#ifdef CONFIG_SMP
...
...
This diff is collapsed.
Click to expand it.
arch/sparc/kernel/entry.S
浏览文件 @
df797679
...
...
@@ -293,7 +293,7 @@ maybe_smp4m_msg:
WRITE_PAUSE
wr
%
l4
,
PSR_ET
,
%
psr
WRITE_PAUSE
s
l
l
%
o3
,
28
,
%
o2
!
shift
for
simpler
checks
below
s
r
l
%
o3
,
28
,
%
o2
!
shift
for
simpler
checks
below
maybe_smp4m_msg_check_single
:
andcc
%
o2
,
0x1
,
%
g0
beq
,
a
maybe_smp4m_msg_check_mask
...
...
This diff is collapsed.
Click to expand it.
arch/sparc/mm/leon_mm.c
浏览文件 @
df797679
...
...
@@ -226,7 +226,7 @@ void leon3_getCacheRegs(struct leon3_cacheregs *regs)
* Leon2 and Leon3 differ in their way of telling cache information
*
*/
int
leon_flush_needed
(
void
)
int
__init
leon_flush_needed
(
void
)
{
int
flush_needed
=
-
1
;
unsigned
int
ssize
,
sets
;
...
...
This diff is collapsed.
Click to expand it.
arch/x86/Kconfig
浏览文件 @
df797679
...
...
@@ -1170,7 +1170,7 @@ comment "NUMA (Summit) requires SMP, 64GB highmem support, ACPI"
config AMD_NUMA
def_bool y
prompt "Old style AMD Opteron NUMA detection"
depends on NUMA && PCI
depends on
X86_64 &&
NUMA && PCI
---help---
Enable AMD NUMA node topology detection. You should say Y here if
you have a multi processor AMD system. This uses an old method to
...
...
This diff is collapsed.
Click to expand it.
arch/x86/kernel/reboot.c
浏览文件 @
df797679
...
...
@@ -419,6 +419,30 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"iMac9,1"
),
},
},
{
/* Handle problems with rebooting on the Latitude E6320. */
.
callback
=
set_pci_reboot
,
.
ident
=
"Dell Latitude E6320"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Latitude E6320"
),
},
},
{
/* Handle problems with rebooting on the Latitude E5420. */
.
callback
=
set_pci_reboot
,
.
ident
=
"Dell Latitude E5420"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Latitude E5420"
),
},
},
{
/* Handle problems with rebooting on the Latitude E6420. */
.
callback
=
set_pci_reboot
,
.
ident
=
"Dell Latitude E6420"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Dell Inc."
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Latitude E6420"
),
},
},
{
}
};
...
...
This diff is collapsed.
Click to expand it.
arch/x86/mm/init_64.c
浏览文件 @
df797679
...
...
@@ -28,6 +28,7 @@
#include <linux/poison.h>
#include <linux/dma-mapping.h>
#include <linux/module.h>
#include <linux/memory.h>
#include <linux/memory_hotplug.h>
#include <linux/nmi.h>
#include <linux/gfp.h>
...
...
@@ -895,8 +896,6 @@ const char *arch_vma_name(struct vm_area_struct *vma)
}
#ifdef CONFIG_X86_UV
#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS)
unsigned
long
memory_block_size_bytes
(
void
)
{
if
(
is_uv_system
())
{
...
...
This diff is collapsed.
Click to expand it.
drivers/acpi/apei/hest.c
浏览文件 @
df797679
...
...
@@ -139,13 +139,23 @@ static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)
{
struct
platform_device
*
ghes_dev
;
struct
ghes_arr
*
ghes_arr
=
data
;
int
rc
;
int
rc
,
i
;
if
(
hest_hdr
->
type
!=
ACPI_HEST_TYPE_GENERIC_ERROR
)
return
0
;
if
(
!
((
struct
acpi_hest_generic
*
)
hest_hdr
)
->
enabled
)
return
0
;
for
(
i
=
0
;
i
<
ghes_arr
->
count
;
i
++
)
{
struct
acpi_hest_header
*
hdr
;
ghes_dev
=
ghes_arr
->
ghes_devs
[
i
];
hdr
=
*
(
struct
acpi_hest_header
**
)
ghes_dev
->
dev
.
platform_data
;
if
(
hdr
->
source_id
==
hest_hdr
->
source_id
)
{
pr_warning
(
FW_WARN
HEST_PFX
"Duplicated hardware error source ID: %d.
\n
"
,
hdr
->
source_id
);
return
-
EIO
;
}
}
ghes_dev
=
platform_device_alloc
(
"GHES"
,
hest_hdr
->
source_id
);
if
(
!
ghes_dev
)
return
-
ENOMEM
;
...
...
This diff is collapsed.
Click to expand it.
drivers/acpi/osl.c
浏览文件 @
df797679
...
...
@@ -1332,23 +1332,6 @@ int acpi_resources_are_enforced(void)
}
EXPORT_SYMBOL
(
acpi_resources_are_enforced
);
/*
* Create and initialize a spinlock.
*/
acpi_status
acpi_os_create_lock
(
acpi_spinlock
*
out_handle
)
{
spinlock_t
*
lock
;
lock
=
ACPI_ALLOCATE
(
sizeof
(
spinlock_t
));
if
(
!
lock
)
return
AE_NO_MEMORY
;
spin_lock_init
(
lock
);
*
out_handle
=
lock
;
return
AE_OK
;
}
/*
* Deallocate the memory for a spinlock.
*/
...
...
This diff is collapsed.
Click to expand it.
drivers/base/memory.c
浏览文件 @
df797679
...
...
@@ -30,7 +30,6 @@
static
DEFINE_MUTEX
(
mem_sysfs_mutex
);
#define MEMORY_CLASS_NAME "memory"
#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS)
static
int
sections_per_block
;
...
...
This diff is collapsed.
Click to expand it.
drivers/char/agp/intel-agp.h
浏览文件 @
df797679
...
...
@@ -90,9 +90,10 @@
#define G4x_GMCH_SIZE_MASK (0xf << 8)
#define G4x_GMCH_SIZE_1M (0x1 << 8)
#define G4x_GMCH_SIZE_2M (0x3 << 8)
#define G4x_GMCH_SIZE_VT_1M (0x9 << 8)
#define G4x_GMCH_SIZE_VT_1_5M (0xa << 8)
#define G4x_GMCH_SIZE_VT_2M (0xc << 8)
#define G4x_GMCH_SIZE_VT_EN (0x8 << 8)
#define G4x_GMCH_SIZE_VT_1M (G4x_GMCH_SIZE_1M | G4x_GMCH_SIZE_VT_EN)
#define G4x_GMCH_SIZE_VT_1_5M ((0x2 << 8) | G4x_GMCH_SIZE_VT_EN)
#define G4x_GMCH_SIZE_VT_2M (G4x_GMCH_SIZE_2M | G4x_GMCH_SIZE_VT_EN)
#define GFX_FLSH_CNTL 0x2170
/* 915+ */
...
...
This diff is collapsed.
Click to expand it.
drivers/gpio/wm831x-gpio.c
浏览文件 @
df797679
...
...
@@ -180,6 +180,7 @@ static void wm831x_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
break
;
case
WM831X_GPIO_PULL_UP
:
pull
=
"pullup"
;
break
;
default:
pull
=
"INVALID PULL"
;
break
;
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/i915_dma.c
浏览文件 @
df797679
...
...
@@ -61,7 +61,6 @@ static void i915_write_hws_pga(struct drm_device *dev)
static
int
i915_init_phys_hws
(
struct
drm_device
*
dev
)
{
drm_i915_private_t
*
dev_priv
=
dev
->
dev_private
;
struct
intel_ring_buffer
*
ring
=
LP_RING
(
dev_priv
);
/* Program Hardware Status Page */
dev_priv
->
status_page_dmah
=
...
...
@@ -71,10 +70,9 @@ static int i915_init_phys_hws(struct drm_device *dev)
DRM_ERROR
(
"Can not allocate hardware status page
\n
"
);
return
-
ENOMEM
;
}
ring
->
status_page
.
page_addr
=
(
void
__force
__iomem
*
)
dev_priv
->
status_page_dmah
->
vaddr
;
memset_io
(
ring
->
status_page
.
page_addr
,
0
,
PAGE_SIZE
);
memset_io
((
void
__force
__iomem
*
)
dev_priv
->
status_page_dmah
->
vaddr
,
0
,
PAGE_SIZE
);
i915_write_hws_pga
(
dev
);
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/i915_drv.h
浏览文件 @
df797679
...
...
@@ -264,6 +264,7 @@ enum intel_pch {
};
#define QUIRK_PIPEA_FORCE (1<<0)
#define QUIRK_LVDS_SSC_DISABLE (1<<1)
struct
intel_fbdev
;
struct
intel_fbc_work
;
...
...
@@ -1199,7 +1200,9 @@ void i915_gem_free_all_phys_object(struct drm_device *dev);
void
i915_gem_release
(
struct
drm_device
*
dev
,
struct
drm_file
*
file
);
uint32_t
i915_gem_get_unfenced_gtt_alignment
(
struct
drm_i915_gem_object
*
obj
);
i915_gem_get_unfenced_gtt_alignment
(
struct
drm_device
*
dev
,
uint32_t
size
,
int
tiling_mode
);
int
i915_gem_object_set_cache_level
(
struct
drm_i915_gem_object
*
obj
,
enum
i915_cache_level
cache_level
);
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/i915_gem.c
浏览文件 @
df797679
...
...
@@ -1374,25 +1374,24 @@ i915_gem_free_mmap_offset(struct drm_i915_gem_object *obj)
}
static
uint32_t
i915_gem_get_gtt_size
(
struct
drm_
i915_gem_object
*
obj
)
i915_gem_get_gtt_size
(
struct
drm_
device
*
dev
,
uint32_t
size
,
int
tiling_mode
)
{
struct
drm_device
*
dev
=
obj
->
base
.
dev
;
uint32_t
size
;
uint32_t
gtt_size
;
if
(
INTEL_INFO
(
dev
)
->
gen
>=
4
||
obj
->
tiling_mode
==
I915_TILING_NONE
)
return
obj
->
base
.
size
;
tiling_mode
==
I915_TILING_NONE
)
return
size
;
/* Previous chips need a power-of-two fence region when tiling */
if
(
INTEL_INFO
(
dev
)
->
gen
==
3
)
size
=
1024
*
1024
;
gtt_
size
=
1024
*
1024
;
else
size
=
512
*
1024
;
gtt_
size
=
512
*
1024
;
while
(
size
<
obj
->
base
.
size
)
size
<<=
1
;
while
(
gtt_size
<
size
)
gtt_
size
<<=
1
;
return
size
;
return
gtt_
size
;
}
/**
...
...
@@ -1403,59 +1402,52 @@ i915_gem_get_gtt_size(struct drm_i915_gem_object *obj)
* potential fence register mapping.
*/
static
uint32_t
i915_gem_get_gtt_alignment
(
struct
drm_i915_gem_object
*
obj
)
i915_gem_get_gtt_alignment
(
struct
drm_device
*
dev
,
uint32_t
size
,
int
tiling_mode
)
{
struct
drm_device
*
dev
=
obj
->
base
.
dev
;
/*
* Minimum alignment is 4k (GTT page size), but might be greater
* if a fence register is needed for the object.
*/
if
(
INTEL_INFO
(
dev
)
->
gen
>=
4
||
obj
->
tiling_mode
==
I915_TILING_NONE
)
tiling_mode
==
I915_TILING_NONE
)
return
4096
;
/*
* Previous chips need to be aligned to the size of the smallest
* fence register that can contain the object.
*/
return
i915_gem_get_gtt_size
(
obj
);
return
i915_gem_get_gtt_size
(
dev
,
size
,
tiling_mode
);
}
/**
* i915_gem_get_unfenced_gtt_alignment - return required GTT alignment for an
* unfenced object
* @obj: object to check
* @dev: the device
* @size: size of the object
* @tiling_mode: tiling mode of the object
*
* Return the required GTT alignment for an object, only taking into account
* unfenced tiled surface requirements.
*/
uint32_t
i915_gem_get_unfenced_gtt_alignment
(
struct
drm_i915_gem_object
*
obj
)
i915_gem_get_unfenced_gtt_alignment
(
struct
drm_device
*
dev
,
uint32_t
size
,
int
tiling_mode
)
{
struct
drm_device
*
dev
=
obj
->
base
.
dev
;
int
tile_height
;
/*
* Minimum alignment is 4k (GTT page size) for sane hw.
*/
if
(
INTEL_INFO
(
dev
)
->
gen
>=
4
||
IS_G33
(
dev
)
||
obj
->
tiling_mode
==
I915_TILING_NONE
)
tiling_mode
==
I915_TILING_NONE
)
return
4096
;
/*
* Older chips need unfenced tiled buffers to be aligned to the left
* edge of an even tile row (where tile rows are counted as if the bo is
* placed in a fenced gtt region).
/* Previous hardware however needs to be aligned to a power-of-two
* tile height. The simplest method for determining this is to reuse
* the power-of-tile object size.
*/
if
(
IS_GEN2
(
dev
))
tile_height
=
16
;
else
if
(
obj
->
tiling_mode
==
I915_TILING_Y
&&
HAS_128_BYTE_Y_TILING
(
dev
))
tile_height
=
32
;
else
tile_height
=
8
;
return
tile_height
*
obj
->
stride
*
2
;
return
i915_gem_get_gtt_size
(
dev
,
size
,
tiling_mode
);
}
int
...
...
@@ -2776,9 +2768,16 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
return
-
EINVAL
;
}
fence_size
=
i915_gem_get_gtt_size
(
obj
);
fence_alignment
=
i915_gem_get_gtt_alignment
(
obj
);
unfenced_alignment
=
i915_gem_get_unfenced_gtt_alignment
(
obj
);
fence_size
=
i915_gem_get_gtt_size
(
dev
,
obj
->
base
.
size
,
obj
->
tiling_mode
);
fence_alignment
=
i915_gem_get_gtt_alignment
(
dev
,
obj
->
base
.
size
,
obj
->
tiling_mode
);
unfenced_alignment
=
i915_gem_get_unfenced_gtt_alignment
(
dev
,
obj
->
base
.
size
,
obj
->
tiling_mode
);
if
(
alignment
==
0
)
alignment
=
map_and_fenceable
?
fence_alignment
:
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/i915_gem_tiling.c
浏览文件 @
df797679
...
...
@@ -348,7 +348,9 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
/* Rebind if we need a change of alignment */
if
(
!
obj
->
map_and_fenceable
)
{
u32
unfenced_alignment
=
i915_gem_get_unfenced_gtt_alignment
(
obj
);
i915_gem_get_unfenced_gtt_alignment
(
dev
,
obj
->
base
.
size
,
args
->
tiling_mode
);
if
(
obj
->
gtt_offset
&
(
unfenced_alignment
-
1
))
ret
=
i915_gem_object_unbind
(
obj
);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/intel_display.c
浏览文件 @
df797679
...
...
@@ -2865,14 +2865,18 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
I915_WRITE
(
PF_WIN_SZ
(
pipe
),
dev_priv
->
pch_pf_size
);
}
/*
* On ILK+ LUT must be loaded before the pipe is running but with
* clocks enabled
*/
intel_crtc_load_lut
(
crtc
);
intel_enable_pipe
(
dev_priv
,
pipe
,
is_pch_port
);
intel_enable_plane
(
dev_priv
,
plane
,
pipe
);
if
(
is_pch_port
)
ironlake_pch_enable
(
crtc
);
intel_crtc_load_lut
(
crtc
);
mutex_lock
(
&
dev
->
struct_mutex
);
intel_update_fbc
(
dev
);
mutex_unlock
(
&
dev
->
struct_mutex
);
...
...
@@ -4469,7 +4473,8 @@ static void intel_update_watermarks(struct drm_device *dev)
static
inline
bool
intel_panel_use_ssc
(
struct
drm_i915_private
*
dev_priv
)
{
return
dev_priv
->
lvds_use_ssc
&&
i915_panel_use_ssc
;
return
dev_priv
->
lvds_use_ssc
&&
i915_panel_use_ssc
&&
!
(
dev_priv
->
quirks
&
QUIRK_LVDS_SSC_DISABLE
);
}
/**
...
...
@@ -8140,6 +8145,15 @@ static void quirk_pipea_force (struct drm_device *dev)
DRM_DEBUG_DRIVER
(
"applying pipe a force quirk
\n
"
);
}
/*
* Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
*/
static
void
quirk_ssc_force_disable
(
struct
drm_device
*
dev
)
{
struct
drm_i915_private
*
dev_priv
=
dev
->
dev_private
;
dev_priv
->
quirks
|=
QUIRK_LVDS_SSC_DISABLE
;
}
struct
intel_quirk
{
int
device
;
int
subsystem_vendor
;
...
...
@@ -8168,6 +8182,9 @@ struct intel_quirk intel_quirks[] = {
/* 855 & before need to leave pipe A & dpll A up */
{
0x3582
,
PCI_ANY_ID
,
PCI_ANY_ID
,
quirk_pipea_force
},
{
0x2562
,
PCI_ANY_ID
,
PCI_ANY_ID
,
quirk_pipea_force
},
/* Lenovo U160 cannot use SSC on LVDS */
{
0x0046
,
0x17aa
,
0x3920
,
quirk_ssc_force_disable
},
};
static
void
intel_init_quirks
(
struct
drm_device
*
dev
)
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/i915/intel_ringbuffer.c
浏览文件 @
df797679
...
...
@@ -1321,6 +1321,9 @@ int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
ring
->
get_seqno
=
pc_render_get_seqno
;
}
if
(
!
I915_NEED_GFX_HWS
(
dev
))
ring
->
status_page
.
page_addr
=
dev_priv
->
status_page_dmah
->
vaddr
;
ring
->
dev
=
dev
;
INIT_LIST_HEAD
(
&
ring
->
active_list
);
INIT_LIST_HEAD
(
&
ring
->
request_list
);
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/evergreen.c
浏览文件 @
df797679
...
...
@@ -2000,7 +2000,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
gb_backend_map
=
0x66442200
;
break
;
case
CHIP_JUNIPER
:
gb_backend_map
=
0x0000
642
0
;
gb_backend_map
=
0x0000
220
0
;
break
;
default:
gb_backend_map
=
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/evergreen_blit_kms.c
浏览文件 @
df797679
...
...
@@ -252,7 +252,7 @@ draw_auto(struct radeon_device *rdev)
}
/* emits 3
6
*/
/* emits 3
9
*/
static
void
set_default_state
(
struct
radeon_device
*
rdev
)
{
...
...
@@ -531,6 +531,11 @@ set_default_state(struct radeon_device *rdev)
radeon_ring_write
(
rdev
,
(
SQ_DYN_GPR_CNTL_PS_FLUSH_REQ
-
PACKET3_SET_CONFIG_REG_START
)
>>
2
);
radeon_ring_write
(
rdev
,
0
);
/* setup LDS */
radeon_ring_write
(
rdev
,
PACKET3
(
PACKET3_SET_CONFIG_REG
,
1
));
radeon_ring_write
(
rdev
,
(
SQ_LDS_RESOURCE_MGMT
-
PACKET3_SET_CONFIG_REG_START
)
>>
2
);
radeon_ring_write
(
rdev
,
0x10001000
);
/* SQ config */
radeon_ring_write
(
rdev
,
PACKET3
(
PACKET3_SET_CONFIG_REG
,
11
));
radeon_ring_write
(
rdev
,
(
SQ_CONFIG
-
PACKET3_SET_CONFIG_REG_START
)
>>
2
);
...
...
@@ -773,7 +778,7 @@ int evergreen_blit_prepare_copy(struct radeon_device *rdev, int size_bytes)
/* calculate number of loops correctly */
ring_size
=
num_loops
*
dwords_per_loop
;
/* set default + shaders */
ring_size
+=
5
2
;
/* shaders + def state */
ring_size
+=
5
5
;
/* shaders + def state */
ring_size
+=
10
;
/* fence emit for VB IB */
ring_size
+=
5
;
/* done copy */
ring_size
+=
10
;
/* fence emit for done copy */
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/radeon_bios.c
浏览文件 @
df797679
...
...
@@ -331,7 +331,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
seprom_cntl1
=
RREG32
(
RADEON_SEPROM_CNTL1
);
viph_control
=
RREG32
(
RADEON_VIPH_CONTROL
);
bus_cntl
=
RREG32
(
R
ADEON
_BUS_CNTL
);
bus_cntl
=
RREG32
(
R
V370
_BUS_CNTL
);
d1vga_control
=
RREG32
(
AVIVO_D1VGA_CONTROL
);
d2vga_control
=
RREG32
(
AVIVO_D2VGA_CONTROL
);
vga_render_control
=
RREG32
(
AVIVO_VGA_RENDER_CONTROL
);
...
...
@@ -350,7 +350,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
WREG32
(
RADEON_VIPH_CONTROL
,
(
viph_control
&
~
RADEON_VIPH_EN
));
/* enable the rom */
WREG32
(
R
ADEON_BUS_CNTL
,
(
bus_cntl
&
~
RADEON
_BUS_BIOS_DIS_ROM
));
WREG32
(
R
V370_BUS_CNTL
,
(
bus_cntl
&
~
RV370
_BUS_BIOS_DIS_ROM
));
/* Disable VGA mode */
WREG32
(
AVIVO_D1VGA_CONTROL
,
...
...
@@ -367,7 +367,7 @@ static bool avivo_read_disabled_bios(struct radeon_device *rdev)
/* restore regs */
WREG32
(
RADEON_SEPROM_CNTL1
,
seprom_cntl1
);
WREG32
(
RADEON_VIPH_CONTROL
,
viph_control
);
WREG32
(
R
ADEON
_BUS_CNTL
,
bus_cntl
);
WREG32
(
R
V370
_BUS_CNTL
,
bus_cntl
);
WREG32
(
AVIVO_D1VGA_CONTROL
,
d1vga_control
);
WREG32
(
AVIVO_D2VGA_CONTROL
,
d2vga_control
);
WREG32
(
AVIVO_VGA_RENDER_CONTROL
,
vga_render_control
);
...
...
@@ -390,7 +390,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
seprom_cntl1
=
RREG32
(
RADEON_SEPROM_CNTL1
);
viph_control
=
RREG32
(
RADEON_VIPH_CONTROL
);
bus_cntl
=
RREG32
(
RADEON_BUS_CNTL
);
if
(
rdev
->
flags
&
RADEON_IS_PCIE
)
bus_cntl
=
RREG32
(
RV370_BUS_CNTL
);
else
bus_cntl
=
RREG32
(
RADEON_BUS_CNTL
);
crtc_gen_cntl
=
RREG32
(
RADEON_CRTC_GEN_CNTL
);
crtc2_gen_cntl
=
0
;
crtc_ext_cntl
=
RREG32
(
RADEON_CRTC_EXT_CNTL
);
...
...
@@ -412,7 +415,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
WREG32
(
RADEON_VIPH_CONTROL
,
(
viph_control
&
~
RADEON_VIPH_EN
));
/* enable the rom */
WREG32
(
RADEON_BUS_CNTL
,
(
bus_cntl
&
~
RADEON_BUS_BIOS_DIS_ROM
));
if
(
rdev
->
flags
&
RADEON_IS_PCIE
)
WREG32
(
RV370_BUS_CNTL
,
(
bus_cntl
&
~
RV370_BUS_BIOS_DIS_ROM
));
else
WREG32
(
RADEON_BUS_CNTL
,
(
bus_cntl
&
~
RADEON_BUS_BIOS_DIS_ROM
));
/* Turn off mem requests and CRTC for both controllers */
WREG32
(
RADEON_CRTC_GEN_CNTL
,
...
...
@@ -439,7 +445,10 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
/* restore regs */
WREG32
(
RADEON_SEPROM_CNTL1
,
seprom_cntl1
);
WREG32
(
RADEON_VIPH_CONTROL
,
viph_control
);
WREG32
(
RADEON_BUS_CNTL
,
bus_cntl
);
if
(
rdev
->
flags
&
RADEON_IS_PCIE
)
WREG32
(
RV370_BUS_CNTL
,
bus_cntl
);
else
WREG32
(
RADEON_BUS_CNTL
,
bus_cntl
);
WREG32
(
RADEON_CRTC_GEN_CNTL
,
crtc_gen_cntl
);
if
(
!
(
rdev
->
flags
&
RADEON_SINGLE_CRTC
))
{
WREG32
(
RADEON_CRTC2_GEN_CNTL
,
crtc2_gen_cntl
);
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/radeon_connectors.c
浏览文件 @
df797679
...
...
@@ -52,6 +52,12 @@ void radeon_connector_hotplug(struct drm_connector *connector)
struct
radeon_device
*
rdev
=
dev
->
dev_private
;
struct
radeon_connector
*
radeon_connector
=
to_radeon_connector
(
connector
);
/* bail if the connector does not have hpd pin, e.g.,
* VGA, TV, etc.
*/
if
(
radeon_connector
->
hpd
.
hpd
==
RADEON_HPD_NONE
)
return
;
radeon_hpd_set_polarity
(
rdev
,
radeon_connector
->
hpd
.
hpd
);
/* powering up/down the eDP panel generates hpd events which
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/radeon_reg.h
浏览文件 @
df797679
...
...
@@ -300,6 +300,8 @@
# define RADEON_BUS_READ_BURST (1 << 30)
#define RADEON_BUS_CNTL1 0x0034
# define RADEON_BUS_WAIT_ON_LOCK_EN (1 << 4)
#define RV370_BUS_CNTL 0x004c
# define RV370_BUS_BIOS_DIS_ROM (1 << 2)
/* rv370/rv380, rv410, r423/r430/r480, r5xx */
#define RADEON_MSI_REARM_EN 0x0160
# define RV370_MSI_REARM_EN (1 << 0)
...
...
This diff is collapsed.
Click to expand it.
drivers/gpu/drm/radeon/rs600.c
浏览文件 @
df797679
...
...
@@ -426,7 +426,7 @@ int rs600_gart_init(struct radeon_device *rdev)
return
radeon_gart_table_vram_alloc
(
rdev
);
}
int
rs600_gart_enable
(
struct
radeon_device
*
rdev
)
static
int
rs600_gart_enable
(
struct
radeon_device
*
rdev
)
{
u32
tmp
;
int
r
,
i
;
...
...
@@ -440,8 +440,8 @@ int rs600_gart_enable(struct radeon_device *rdev)
return
r
;
radeon_gart_restore
(
rdev
);
/* Enable bus master */
tmp
=
RREG32
(
R
_00004C_BUS_CNTL
)
&
C_00004C
_BUS_MASTER_DIS
;
WREG32
(
R
_00004C
_BUS_CNTL
,
tmp
);
tmp
=
RREG32
(
R
ADEON_BUS_CNTL
)
&
~
RS600
_BUS_MASTER_DIS
;
WREG32
(
R
ADEON
_BUS_CNTL
,
tmp
);
/* FIXME: setup default page */
WREG32_MC
(
R_000100_MC_PT0_CNTL
,
(
S_000100_EFFECTIVE_L2_CACHE_SIZE
(
6
)
|
...
...
This diff is collapsed.
Click to expand it.
drivers/hwmon/adm1275.c
浏览文件 @
df797679
...
...
@@ -53,23 +53,23 @@ static int adm1275_probe(struct i2c_client *client,
info
->
direct
[
PSC_VOLTAGE_IN
]
=
true
;
info
->
direct
[
PSC_VOLTAGE_OUT
]
=
true
;
info
->
direct
[
PSC_CURRENT_OUT
]
=
true
;
info
->
m
[
PSC_CURRENT_OUT
]
=
80
0
;
info
->
m
[
PSC_CURRENT_OUT
]
=
80
7
;
info
->
b
[
PSC_CURRENT_OUT
]
=
20475
;
info
->
R
[
PSC_CURRENT_OUT
]
=
-
1
;
info
->
func
[
0
]
=
PMBUS_HAVE_IOUT
|
PMBUS_HAVE_STATUS_IOUT
;
if
(
config
&
ADM1275_VRANGE
)
{
info
->
m
[
PSC_VOLTAGE_IN
]
=
19
045
;
info
->
m
[
PSC_VOLTAGE_IN
]
=
19
199
;
info
->
b
[
PSC_VOLTAGE_IN
]
=
0
;
info
->
R
[
PSC_VOLTAGE_IN
]
=
-
2
;
info
->
m
[
PSC_VOLTAGE_OUT
]
=
19
045
;
info
->
m
[
PSC_VOLTAGE_OUT
]
=
19
199
;
info
->
b
[
PSC_VOLTAGE_OUT
]
=
0
;
info
->
R
[
PSC_VOLTAGE_OUT
]
=
-
2
;
}
else
{
info
->
m
[
PSC_VOLTAGE_IN
]
=
6
666
;
info
->
m
[
PSC_VOLTAGE_IN
]
=
6
720
;
info
->
b
[
PSC_VOLTAGE_IN
]
=
0
;
info
->
R
[
PSC_VOLTAGE_IN
]
=
-
1
;
info
->
m
[
PSC_VOLTAGE_OUT
]
=
6
666
;
info
->
m
[
PSC_VOLTAGE_OUT
]
=
6
720
;
info
->
b
[
PSC_VOLTAGE_OUT
]
=
0
;
info
->
R
[
PSC_VOLTAGE_OUT
]
=
-
1
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/hwmon/asus_atk0110.c
浏览文件 @
df797679
...
...
@@ -674,6 +674,7 @@ static int atk_debugfs_gitm_get(void *p, u64 *val)
else
err
=
-
EIO
;
ACPI_FREE
(
ret
);
return
err
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/hwmon/it87.c
浏览文件 @
df797679
...
...
@@ -1538,7 +1538,7 @@ static struct attribute *it87_attributes_label[] = {
};
static
const
struct
attribute_group
it87_group_label
=
{
.
attrs
=
it87_attributes_
vid
,
.
attrs
=
it87_attributes_
label
,
};
/* SuperIO detection - will change isa_address if a chip is found */
...
...
This diff is collapsed.
Click to expand it.
drivers/hwmon/max1111.c
浏览文件 @
df797679
...
...
@@ -40,6 +40,8 @@ struct max1111_data {
struct
spi_transfer
xfer
[
2
];
uint8_t
*
tx_buf
;
uint8_t
*
rx_buf
;
struct
mutex
drvdata_lock
;
/* protect msg, xfer and buffers from multiple access */
};
static
int
max1111_read
(
struct
device
*
dev
,
int
channel
)
...
...
@@ -48,6 +50,9 @@ static int max1111_read(struct device *dev, int channel)
uint8_t
v1
,
v2
;
int
err
;
/* writing to drvdata struct is not thread safe, wait on mutex */
mutex_lock
(
&
data
->
drvdata_lock
);
data
->
tx_buf
[
0
]
=
(
channel
<<
MAX1111_CTRL_SEL_SH
)
|
MAX1111_CTRL_PD0
|
MAX1111_CTRL_PD1
|
MAX1111_CTRL_SGL
|
MAX1111_CTRL_UNI
|
MAX1111_CTRL_STR
;
...
...
@@ -55,12 +60,15 @@ static int max1111_read(struct device *dev, int channel)
err
=
spi_sync
(
data
->
spi
,
&
data
->
msg
);
if
(
err
<
0
)
{
dev_err
(
dev
,
"spi_sync failed with %d
\n
"
,
err
);
mutex_unlock
(
&
data
->
drvdata_lock
);
return
err
;
}
v1
=
data
->
rx_buf
[
0
];
v2
=
data
->
rx_buf
[
1
];
mutex_unlock
(
&
data
->
drvdata_lock
);
if
((
v1
&
0xc0
)
||
(
v2
&
0x3f
))
return
-
EINVAL
;
...
...
@@ -176,6 +184,8 @@ static int __devinit max1111_probe(struct spi_device *spi)
if
(
err
)
goto
err_free_data
;
mutex_init
(
&
data
->
drvdata_lock
);
data
->
spi
=
spi
;
spi_set_drvdata
(
spi
,
data
);
...
...
@@ -213,6 +223,7 @@ static int __devexit max1111_remove(struct spi_device *spi)
hwmon_device_unregister
(
data
->
hwmon_dev
);
sysfs_remove_group
(
&
spi
->
dev
.
kobj
,
&
max1111_attr_group
);
mutex_destroy
(
&
data
->
drvdata_lock
);
kfree
(
data
->
rx_buf
);
kfree
(
data
->
tx_buf
);
kfree
(
data
);
...
...
This diff is collapsed.
Click to expand it.
drivers/hwmon/pmbus_core.c
浏览文件 @
df797679
...
...
@@ -362,8 +362,8 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
* Convert linear sensor values to milli- or micro-units
* depending on sensor type.
*/
static
int
pmbus_reg2data_linear
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
static
long
pmbus_reg2data_linear
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
{
s16
exponent
;
s32
mantissa
;
...
...
@@ -397,15 +397,15 @@ static int pmbus_reg2data_linear(struct pmbus_data *data,
else
val
>>=
-
exponent
;
return
(
int
)
val
;
return
val
;
}
/*
* Convert direct sensor values to milli- or micro-units
* depending on sensor type.
*/
static
int
pmbus_reg2data_direct
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
static
long
pmbus_reg2data_direct
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
{
long
val
=
(
s16
)
sensor
->
data
;
long
m
,
b
,
R
;
...
...
@@ -440,12 +440,12 @@ static int pmbus_reg2data_direct(struct pmbus_data *data,
R
++
;
}
return
(
int
)((
val
-
b
)
/
m
)
;
return
(
val
-
b
)
/
m
;
}
static
int
pmbus_reg2data
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
static
long
pmbus_reg2data
(
struct
pmbus_data
*
data
,
struct
pmbus_sensor
*
sensor
)
{
int
val
;
long
val
;
if
(
data
->
info
->
direct
[
sensor
->
class
])
val
=
pmbus_reg2data_direct
(
data
,
sensor
);
...
...
@@ -619,7 +619,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, int index, int *val)
if
(
!
s1
&&
!
s2
)
*
val
=
!!
regval
;
else
{
int
v1
,
v2
;
long
v1
,
v2
;
struct
pmbus_sensor
*
sensor1
,
*
sensor2
;
sensor1
=
&
data
->
sensors
[
s1
];
...
...
@@ -661,7 +661,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,
if
(
sensor
->
data
<
0
)
return
sensor
->
data
;
return
snprintf
(
buf
,
PAGE_SIZE
,
"%d
\n
"
,
pmbus_reg2data
(
data
,
sensor
));
return
snprintf
(
buf
,
PAGE_SIZE
,
"%
l
d
\n
"
,
pmbus_reg2data
(
data
,
sensor
));
}
static
ssize_t
pmbus_set_sensor
(
struct
device
*
dev
,
...
...
This diff is collapsed.
Click to expand it.
drivers/media/dvb/dvb-core/dvb_frontend.c
浏览文件 @
df797679
...
...
@@ -1988,6 +1988,14 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
if
(
dvbdev
->
users
==
-
1
&&
fe
->
ops
.
ts_bus_ctrl
)
{
if
((
ret
=
fe
->
ops
.
ts_bus_ctrl
(
fe
,
1
))
<
0
)
goto
err0
;
/* If we took control of the bus, we need to force
reinitialization. This is because many ts_bus_ctrl()
functions strobe the RESET pin on the demod, and if the
frontend thread already exists then the dvb_init() routine
won't get called (which is what usually does initial
register configuration). */
fepriv
->
reinitialise
=
1
;
}
if
((
ret
=
dvb_generic_open
(
inode
,
file
))
<
0
)
...
...
This diff is collapsed.
Click to expand it.
drivers/media/radio/Kconfig
浏览文件 @
df797679
...
...
@@ -168,7 +168,7 @@ config RADIO_MAXIRADIO
config RADIO_MIROPCM20
tristate "miroSOUND PCM20 radio"
depends on ISA && VIDEO_V4L2 && SND
depends on ISA &&
ISA_DMA_API &&
VIDEO_V4L2 && SND
select SND_ISA
select SND_MIRO
---help---
...
...
@@ -201,7 +201,7 @@ config RADIO_SF16FMI
config RADIO_SF16FMR2
tristate "SF16FMR2 Radio"
depends on ISA && VIDEO_V4L2
depends on ISA && VIDEO_V4L2
&& SND
---help---
Choose Y here if you have one of these FM radio cards.
...
...
This diff is collapsed.
Click to expand it.
drivers/media/radio/si4713-i2c.c
浏览文件 @
df797679
...
...
@@ -1033,7 +1033,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,
char
ps_name
[
MAX_RDS_PS_NAME
+
1
];
len
=
control
->
size
-
1
;
if
(
len
>
MAX_RDS_PS_NAME
)
{
if
(
len
<
0
||
len
>
MAX_RDS_PS_NAME
)
{
rval
=
-
ERANGE
;
goto
exit
;
}
...
...
@@ -1057,7 +1057,7 @@ static int si4713_write_econtrol_string(struct si4713_device *sdev,
char
radio_text
[
MAX_RDS_RADIO_TEXT
+
1
];
len
=
control
->
size
-
1
;
if
(
len
>
MAX_RDS_RADIO_TEXT
)
{
if
(
len
<
0
||
len
>
MAX_RDS_RADIO_TEXT
)
{
rval
=
-
ERANGE
;
goto
exit
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/media/rc/mceusb.c
浏览文件 @
df797679
...
...
@@ -558,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
inout
,
data1
);
break
;
case
MCE_CMD_S_TIMEOUT
:
/* value is in units of 50us, so x*50/100
or x/2
ms */
/* value is in units of 50us, so x*50/100
0
ms */
dev_info
(
dev
,
"%s receive timeout of %d ms
\n
"
,
inout
,
((
data1
<<
8
)
|
data2
)
/
2
);
inout
,
((
data1
<<
8
)
|
data2
)
*
MCE_TIME_UNIT
/
1000
);
break
;
case
MCE_CMD_G_TIMEOUT
:
dev_info
(
dev
,
"Get receive timeout
\n
"
);
...
...
@@ -847,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
switch
(
ir
->
buf_in
[
index
])
{
/* 2-byte return value commands */
case
MCE_CMD_S_TIMEOUT
:
ir
->
rc
->
timeout
=
US_TO_NS
((
hi
<<
8
|
lo
)
/
2
);
ir
->
rc
->
timeout
=
US_TO_NS
((
hi
<<
8
|
lo
)
*
MCE_TIME_UNIT
);
break
;
/* 1-byte return value commands */
...
...
@@ -1078,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
rc
->
priv
=
ir
;
rc
->
driver_type
=
RC_DRIVER_IR_RAW
;
rc
->
allowed_protos
=
RC_TYPE_ALL
;
rc
->
timeout
=
US_TO_NS
(
10
00
);
rc
->
timeout
=
MS_TO_NS
(
1
00
);
if
(
!
ir
->
flags
.
no_tx
)
{
rc
->
s_tx_mask
=
mceusb_set_tx_mask
;
rc
->
s_tx_carrier
=
mceusb_set_tx_carrier
;
...
...
This diff is collapsed.
Click to expand it.
drivers/media/rc/nuvoton-cir.c
浏览文件 @
df797679
...
...
@@ -1110,7 +1110,7 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
rdev
->
dev
.
parent
=
&
pdev
->
dev
;
rdev
->
driver_name
=
NVT_DRIVER_NAME
;
rdev
->
map_name
=
RC_MAP_RC6_MCE
;
rdev
->
timeout
=
US_TO_NS
(
10
00
);
rdev
->
timeout
=
MS_TO_NS
(
1
00
);
/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
rdev
->
rx_resolution
=
US_TO_NS
(
CIR_SAMPLE_PERIOD
);
#if 0
...
...
This diff is collapsed.
Click to expand it.
drivers/media/video/cx23885/cx23885-core.c
浏览文件 @
df797679
...
...
@@ -2060,12 +2060,8 @@ static int __devinit cx23885_initdev(struct pci_dev *pci_dev,
goto
fail_irq
;
}
if
(
!
pci_enable_msi
(
pci_dev
))
err
=
request_irq
(
pci_dev
->
irq
,
cx23885_irq
,
IRQF_DISABLED
,
dev
->
name
,
dev
);
else
err
=
request_irq
(
pci_dev
->
irq
,
cx23885_irq
,
IRQF_SHARED
|
IRQF_DISABLED
,
dev
->
name
,
dev
);
err
=
request_irq
(
pci_dev
->
irq
,
cx23885_irq
,
IRQF_SHARED
|
IRQF_DISABLED
,
dev
->
name
,
dev
);
if
(
err
<
0
)
{
printk
(
KERN_ERR
"%s: can't get IRQ %d
\n
"
,
dev
->
name
,
pci_dev
->
irq
);
...
...
@@ -2114,7 +2110,6 @@ static void __devexit cx23885_finidev(struct pci_dev *pci_dev)
/* unregister stuff */
free_irq
(
pci_dev
->
irq
,
dev
);
pci_disable_msi
(
pci_dev
);
cx23885_dev_unregister
(
dev
);
v4l2_device_unregister
(
v4l2_dev
);
...
...
This diff is collapsed.
Click to expand it.
drivers/media/video/tuner-core.c
浏览文件 @
df797679
...
...
@@ -714,10 +714,19 @@ static int tuner_remove(struct i2c_client *client)
* returns 0.
* This function is needed for boards that have a separate tuner for
* radio (like devices with tea5767).
* NOTE: mt20xx uses V4L2_TUNER_DIGITAL_TV and calls set_tv_freq to
* select a TV frequency. So, t_mode = T_ANALOG_TV could actually
* be used to represent a Digital TV too.
*/
static
inline
int
check_mode
(
struct
tuner
*
t
,
enum
v4l2_tuner_type
mode
)
{
if
((
1
<<
mode
&
t
->
mode_mask
)
==
0
)
int
t_mode
;
if
(
mode
==
V4L2_TUNER_RADIO
)
t_mode
=
T_RADIO
;
else
t_mode
=
T_ANALOG_TV
;
if
((
t_mode
&
t
->
mode_mask
)
==
0
)
return
-
EINVAL
;
return
0
;
...
...
@@ -984,7 +993,7 @@ static void tuner_status(struct dvb_frontend *fe)
case
V4L2_TUNER_RADIO
:
p
=
"radio"
;
break
;
case
V4L2_TUNER_DIGITAL_TV
:
case
V4L2_TUNER_DIGITAL_TV
:
/* Used by mt20xx */
p
=
"digital TV"
;
break
;
case
V4L2_TUNER_ANALOG_TV
:
...
...
@@ -1135,9 +1144,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
return
0
;
if
(
vt
->
type
==
t
->
mode
&&
analog_ops
->
get_afc
)
vt
->
afc
=
analog_ops
->
get_afc
(
&
t
->
fe
);
if
(
vt
->
type
==
V4L2_TUNER_ANALOG_TV
)
if
(
t
->
mode
!=
V4L2_TUNER_RADIO
)
{
vt
->
capability
|=
V4L2_TUNER_CAP_NORM
;
if
(
vt
->
type
!=
V4L2_TUNER_RADIO
)
{
vt
->
rangelow
=
tv_range
[
0
]
*
16
;
vt
->
rangehigh
=
tv_range
[
1
]
*
16
;
return
0
;
...
...
This diff is collapsed.
Click to expand it.
drivers/mmc/core/mmc.c
浏览文件 @
df797679
...
...
@@ -247,12 +247,12 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
return
0
;
/* Version is coded in the CSD_STRUCTURE byte in the EXT_CSD register */
card
->
ext_csd
.
raw_ext_csd_structure
=
ext_csd
[
EXT_CSD_STRUCTURE
];
if
(
card
->
csd
.
structure
==
3
)
{
int
ext_csd_struct
=
ext_csd
[
EXT_CSD_STRUCTURE
];
if
(
ext_csd_struct
>
2
)
{
if
(
card
->
ext_csd
.
raw_ext_csd_structure
>
2
)
{
printk
(
KERN_ERR
"%s: unrecognised EXT_CSD structure "
"version %d
\n
"
,
mmc_hostname
(
card
->
host
),
ext_csd_struct
);
card
->
ext_csd
.
raw_ext_csd_structure
);
err
=
-
EINVAL
;
goto
out
;
}
...
...
@@ -266,6 +266,10 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
goto
out
;
}
card
->
ext_csd
.
raw_sectors
[
0
]
=
ext_csd
[
EXT_CSD_SEC_CNT
+
0
];
card
->
ext_csd
.
raw_sectors
[
1
]
=
ext_csd
[
EXT_CSD_SEC_CNT
+
1
];
card
->
ext_csd
.
raw_sectors
[
2
]
=
ext_csd
[
EXT_CSD_SEC_CNT
+
2
];
card
->
ext_csd
.
raw_sectors
[
3
]
=
ext_csd
[
EXT_CSD_SEC_CNT
+
3
];
if
(
card
->
ext_csd
.
rev
>=
2
)
{
card
->
ext_csd
.
sectors
=
ext_csd
[
EXT_CSD_SEC_CNT
+
0
]
<<
0
|
...
...
@@ -277,7 +281,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
if
(
card
->
ext_csd
.
sectors
>
(
2u
*
1024
*
1024
*
1024
)
/
512
)
mmc_card_set_blockaddr
(
card
);
}
card
->
ext_csd
.
raw_card_type
=
ext_csd
[
EXT_CSD_CARD_TYPE
];
switch
(
ext_csd
[
EXT_CSD_CARD_TYPE
]
&
EXT_CSD_CARD_TYPE_MASK
)
{
case
EXT_CSD_CARD_TYPE_DDR_52
|
EXT_CSD_CARD_TYPE_52
|
EXT_CSD_CARD_TYPE_26:
...
...
@@ -307,6 +311,11 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
mmc_hostname
(
card
->
host
));
}
card
->
ext_csd
.
raw_s_a_timeout
=
ext_csd
[
EXT_CSD_S_A_TIMEOUT
];
card
->
ext_csd
.
raw_erase_timeout_mult
=
ext_csd
[
EXT_CSD_ERASE_TIMEOUT_MULT
];
card
->
ext_csd
.
raw_hc_erase_grp_size
=
ext_csd
[
EXT_CSD_HC_ERASE_GRP_SIZE
];
if
(
card
->
ext_csd
.
rev
>=
3
)
{
u8
sa_shift
=
ext_csd
[
EXT_CSD_S_A_TIMEOUT
];
card
->
ext_csd
.
part_config
=
ext_csd
[
EXT_CSD_PART_CONFIG
];
...
...
@@ -334,6 +343,16 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
card
->
ext_csd
.
boot_size
=
ext_csd
[
EXT_CSD_BOOT_MULT
]
<<
17
;
}
card
->
ext_csd
.
raw_hc_erase_gap_size
=
ext_csd
[
EXT_CSD_PARTITION_ATTRIBUTE
];
card
->
ext_csd
.
raw_sec_trim_mult
=
ext_csd
[
EXT_CSD_SEC_TRIM_MULT
];
card
->
ext_csd
.
raw_sec_erase_mult
=
ext_csd
[
EXT_CSD_SEC_ERASE_MULT
];
card
->
ext_csd
.
raw_sec_feature_support
=
ext_csd
[
EXT_CSD_SEC_FEATURE_SUPPORT
];
card
->
ext_csd
.
raw_trim_mult
=
ext_csd
[
EXT_CSD_TRIM_MULT
];
if
(
card
->
ext_csd
.
rev
>=
4
)
{
/*
* Enhanced area feature support -- check whether the eMMC
...
...
@@ -341,7 +360,7 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
* area offset and size to user by adding sysfs interface.
*/
if
((
ext_csd
[
EXT_CSD_PARTITION_SUPPORT
]
&
0x2
)
&&
(
ext_csd
[
EXT_CSD_PARTITION_ATTRIBUTE
]
&
0x1
))
{
(
ext_csd
[
EXT_CSD_PARTITION_ATTRIBUTE
]
&
0x1
))
{
u8
hc_erase_grp_sz
=
ext_csd
[
EXT_CSD_HC_ERASE_GRP_SIZE
];
u8
hc_wp_grp_sz
=
...
...
@@ -401,17 +420,17 @@ static inline void mmc_free_ext_csd(u8 *ext_csd)
}
static
int
mmc_compare_ext_csds
(
struct
mmc_card
*
card
,
u8
*
ext_csd
,
unsigned
bus_width
)
static
int
mmc_compare_ext_csds
(
struct
mmc_card
*
card
,
unsigned
bus_width
)
{
u8
*
bw_ext_csd
;
int
err
;
if
(
bus_width
==
MMC_BUS_WIDTH_1
)
return
0
;
err
=
mmc_get_ext_csd
(
card
,
&
bw_ext_csd
);
if
(
err
)
return
err
;
if
(
(
ext_csd
==
NULL
||
bw_ext_csd
==
NULL
)
)
{
if
(
err
||
bw_ext_csd
==
NULL
)
{
if
(
bus_width
!=
MMC_BUS_WIDTH_1
)
err
=
-
EINVAL
;
goto
out
;
...
...
@@ -421,35 +440,40 @@ static int mmc_compare_ext_csds(struct mmc_card *card, u8 *ext_csd,
goto
out
;
/* only compare read only fields */
err
=
(
!
(
ext_csd
[
EXT_CSD_PARTITION_SUPPORT
]
==
err
=
(
!
(
card
->
ext_csd
.
raw_partition_support
==
bw_ext_csd
[
EXT_CSD_PARTITION_SUPPORT
])
&&
(
ext_csd
[
EXT_CSD_ERASED_MEM_CONT
]
==
(
card
->
ext_csd
.
raw_erased_mem_count
==
bw_ext_csd
[
EXT_CSD_ERASED_MEM_CONT
])
&&
(
ext_csd
[
EXT_CSD_REV
]
==
(
card
->
ext_csd
.
rev
==
bw_ext_csd
[
EXT_CSD_REV
])
&&
(
ext_csd
[
EXT_CSD_STRUCTURE
]
==
(
card
->
ext_csd
.
raw_ext_csd_structure
==
bw_ext_csd
[
EXT_CSD_STRUCTURE
])
&&
(
ext_csd
[
EXT_CSD_CARD_TYPE
]
==
(
card
->
ext_csd
.
raw_card_type
==
bw_ext_csd
[
EXT_CSD_CARD_TYPE
])
&&
(
ext_csd
[
EXT_CSD_S_A_TIMEOUT
]
==
(
card
->
ext_csd
.
raw_s_a_timeout
==
bw_ext_csd
[
EXT_CSD_S_A_TIMEOUT
])
&&
(
ext_csd
[
EXT_CSD_HC_WP_GRP_SIZE
]
==
(
card
->
ext_csd
.
raw_hc_erase_gap_size
==
bw_ext_csd
[
EXT_CSD_HC_WP_GRP_SIZE
])
&&
(
ext_csd
[
EXT_CSD_ERASE_TIMEOUT_MULT
]
==
(
card
->
ext_csd
.
raw_erase_timeout_mult
==
bw_ext_csd
[
EXT_CSD_ERASE_TIMEOUT_MULT
])
&&
(
ext_csd
[
EXT_CSD_HC_ERASE_GRP_SIZE
]
==
(
card
->
ext_csd
.
raw_hc_erase_grp_size
==
bw_ext_csd
[
EXT_CSD_HC_ERASE_GRP_SIZE
])
&&
(
ext_csd
[
EXT_CSD_SEC_TRIM_MULT
]
==
(
card
->
ext_csd
.
raw_sec_trim_mult
==
bw_ext_csd
[
EXT_CSD_SEC_TRIM_MULT
])
&&
(
ext_csd
[
EXT_CSD_SEC_ERASE_MULT
]
==
(
card
->
ext_csd
.
raw_sec_erase_mult
==
bw_ext_csd
[
EXT_CSD_SEC_ERASE_MULT
])
&&
(
ext_csd
[
EXT_CSD_SEC_FEATURE_SUPPORT
]
==
(
card
->
ext_csd
.
raw_sec_feature_support
==
bw_ext_csd
[
EXT_CSD_SEC_FEATURE_SUPPORT
])
&&
(
ext_csd
[
EXT_CSD_TRIM_MULT
]
==
(
card
->
ext_csd
.
raw_trim_mult
==
bw_ext_csd
[
EXT_CSD_TRIM_MULT
])
&&
memcmp
(
&
ext_csd
[
EXT_CSD_SEC_CNT
],
&
bw_ext_csd
[
EXT_CSD_SEC_CNT
],
4
)
!=
0
);
(
card
->
ext_csd
.
raw_sectors
[
0
]
==
bw_ext_csd
[
EXT_CSD_SEC_CNT
+
0
])
&&
(
card
->
ext_csd
.
raw_sectors
[
1
]
==
bw_ext_csd
[
EXT_CSD_SEC_CNT
+
1
])
&&
(
card
->
ext_csd
.
raw_sectors
[
2
]
==
bw_ext_csd
[
EXT_CSD_SEC_CNT
+
2
])
&&
(
card
->
ext_csd
.
raw_sectors
[
3
]
==
bw_ext_csd
[
EXT_CSD_SEC_CNT
+
3
]));
if
(
err
)
err
=
-
EINVAL
;
...
...
@@ -770,7 +794,6 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
*/
if
(
!
(
host
->
caps
&
MMC_CAP_BUS_WIDTH_TEST
))
err
=
mmc_compare_ext_csds
(
card
,
ext_csd
,
bus_width
);
else
err
=
mmc_bus_test
(
card
,
bus_width
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/bonding/bond_main.c
浏览文件 @
df797679
...
...
@@ -1428,9 +1428,9 @@ static u32 bond_fix_features(struct net_device *dev, u32 features)
return
features
;
}
#define BOND_VLAN_FEATURES (NETIF_F_ALL_
TX_OFFLOADS
| \
NETIF_F_
SOFT_FEATURES
| \
NETIF_F_LRO)
#define BOND_VLAN_FEATURES (NETIF_F_ALL_
CSUM | NETIF_F_SG
| \
NETIF_F_
FRAGLIST | NETIF_F_ALL_TSO
| \
NETIF_F_
HIGHDMA | NETIF_F_
LRO)
static
void
bond_compute_features
(
struct
bonding
*
bond
)
{
...
...
This diff is collapsed.
Click to expand it.
drivers/net/gianfar.c
浏览文件 @
df797679
...
...
@@ -2289,6 +2289,23 @@ static int gfar_set_mac_address(struct net_device *dev)
return
0
;
}
/* Check if rx parser should be activated */
void
gfar_check_rx_parser_mode
(
struct
gfar_private
*
priv
)
{
struct
gfar
__iomem
*
regs
;
u32
tempval
;
regs
=
priv
->
gfargrp
[
0
].
regs
;
tempval
=
gfar_read
(
&
regs
->
rctrl
);
/* If parse is no longer required, then disable parser */
if
(
tempval
&
RCTRL_REQ_PARSER
)
tempval
|=
RCTRL_PRSDEP_INIT
;
else
tempval
&=
~
RCTRL_PRSDEP_INIT
;
gfar_write
(
&
regs
->
rctrl
,
tempval
);
}
/* Enables and disables VLAN insertion/extraction */
static
void
gfar_vlan_rx_register
(
struct
net_device
*
dev
,
...
...
@@ -2325,12 +2342,9 @@ static void gfar_vlan_rx_register(struct net_device *dev,
/* Disable VLAN tag extraction */
tempval
=
gfar_read
(
&
regs
->
rctrl
);
tempval
&=
~
RCTRL_VLEX
;
/* If parse is no longer required, then disable parser */
if
(
tempval
&
RCTRL_REQ_PARSER
)
tempval
|=
RCTRL_PRSDEP_INIT
;
else
tempval
&=
~
RCTRL_PRSDEP_INIT
;
gfar_write
(
&
regs
->
rctrl
,
tempval
);
gfar_check_rx_parser_mode
(
priv
);
}
gfar_change_mtu
(
dev
,
dev
->
mtu
);
...
...
This diff is collapsed.
Click to expand it.
drivers/net/gianfar.h
浏览文件 @
df797679
...
...
@@ -274,7 +274,7 @@ extern const char gfar_driver_version[];
#define RCTRL_PROM 0x00000008
#define RCTRL_EMEN 0x00000002
#define RCTRL_REQ_PARSER (RCTRL_VLEX | RCTRL_IPCSEN | \
RCTRL_TUCSEN)
RCTRL_TUCSEN
| RCTRL_FILREN
)
#define RCTRL_CHECKSUMMING (RCTRL_IPCSEN | RCTRL_TUCSEN | \
RCTRL_PRSDEP_INIT)
#define RCTRL_EXTHASH (RCTRL_GHTX)
...
...
@@ -1156,6 +1156,7 @@ extern void gfar_configure_coalescing(struct gfar_private *priv,
unsigned
long
tx_mask
,
unsigned
long
rx_mask
);
void
gfar_init_sysfs
(
struct
net_device
*
dev
);
int
gfar_set_features
(
struct
net_device
*
dev
,
u32
features
);
extern
void
gfar_check_rx_parser_mode
(
struct
gfar_private
*
priv
);
extern
const
struct
ethtool_ops
gfar_ethtool_ops
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/natsemi.c
浏览文件 @
df797679
...
...
@@ -140,7 +140,7 @@ MODULE_LICENSE("GPL");
module_param
(
mtu
,
int
,
0
);
module_param
(
debug
,
int
,
0
);
module_param
(
rx_copybreak
,
int
,
0
);
module_param
(
dspcfg_workaround
,
int
,
1
);
module_param
(
dspcfg_workaround
,
int
,
0
);
module_param_array
(
options
,
int
,
NULL
,
0
);
module_param_array
(
full_duplex
,
int
,
NULL
,
0
);
MODULE_PARM_DESC
(
mtu
,
"DP8381x MTU (all boards)"
);
...
...
@@ -2028,8 +2028,8 @@ static void drain_rx(struct net_device *dev)
np
->
rx_ring
[
i
].
cmd_status
=
0
;
np
->
rx_ring
[
i
].
addr
=
cpu_to_le32
(
0xBADF00D0
);
/* An invalid address. */
if
(
np
->
rx_skbuff
[
i
])
{
pci_unmap_single
(
np
->
pci_dev
,
np
->
rx_dma
[
i
],
buflen
,
pci_unmap_single
(
np
->
pci_dev
,
np
->
rx_dma
[
i
],
buflen
+
NATSEMI_PADDING
,
PCI_DMA_FROMDEVICE
);
dev_kfree_skb
(
np
->
rx_skbuff
[
i
]);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/pppoe.c
浏览文件 @
df797679
...
...
@@ -348,8 +348,9 @@ static int pppoe_device_event(struct notifier_block *this,
/* Only look at sockets that are using this specific device. */
switch
(
event
)
{
case
NETDEV_CHANGEADDR
:
case
NETDEV_CHANGEMTU
:
/* A change in mtu is a bad thing, requiring
/* A change in mtu
or address
is a bad thing, requiring
* LCP re-negotiation.
*/
...
...
This diff is collapsed.
Click to expand it.
drivers/net/r6040.c
浏览文件 @
df797679
...
...
@@ -677,9 +677,11 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
if
(
status
&
RX_FIFO_FULL
)
dev
->
stats
.
rx_fifo_errors
++
;
/* Mask off RX interrupt */
misr
&=
~
RX_INTS
;
napi_schedule
(
&
lp
->
napi
);
if
(
likely
(
napi_schedule_prep
(
&
lp
->
napi
)))
{
/* Mask off RX interrupt */
misr
&=
~
RX_INTS
;
__napi_schedule
(
&
lp
->
napi
);
}
}
/* TX interrupt request */
...
...
This diff is collapsed.
Click to expand it.
drivers/net/slip.c
浏览文件 @
df797679
...
...
@@ -182,10 +182,10 @@ static int sl_alloc_bufs(struct slip *sl, int mtu)
#ifdef SL_INCLUDE_CSLIP
cbuff
=
xchg
(
&
sl
->
cbuff
,
cbuff
);
slcomp
=
xchg
(
&
sl
->
slcomp
,
slcomp
);
#endif
#ifdef CONFIG_SLIP_MODE_SLIP6
sl
->
xdata
=
0
;
sl
->
xbits
=
0
;
#endif
#endif
spin_unlock_bh
(
&
sl
->
lock
);
err
=
0
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/tulip/dmfe.c
浏览文件 @
df797679
...
...
@@ -879,7 +879,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)
txptr
=
db
->
tx_remove_ptr
;
while
(
db
->
tx_packet_cnt
)
{
tdes0
=
le32_to_cpu
(
txptr
->
tdes0
);
pr_debug
(
"tdes0=%x
\n
"
,
tdes0
);
if
(
tdes0
&
0x80000000
)
break
;
...
...
@@ -889,7 +888,6 @@ static void dmfe_free_tx_pkt(struct DEVICE *dev, struct dmfe_board_info * db)
/* Transmit statistic counter */
if
(
tdes0
!=
0x7fffffff
)
{
pr_debug
(
"tdes0=%x
\n
"
,
tdes0
);
dev
->
stats
.
collisions
+=
(
tdes0
>>
3
)
&
0xf
;
dev
->
stats
.
tx_bytes
+=
le32_to_cpu
(
txptr
->
tdes1
)
&
0x7ff
;
if
(
tdes0
&
TDES0_ERR_MASK
)
{
...
...
@@ -986,7 +984,6 @@ static void dmfe_rx_packet(struct DEVICE *dev, struct dmfe_board_info * db)
/* error summary bit check */
if
(
rdes0
&
0x8000
)
{
/* This is a error packet */
pr_debug
(
"rdes0: %x
\n
"
,
rdes0
);
dev
->
stats
.
rx_errors
++
;
if
(
rdes0
&
1
)
dev
->
stats
.
rx_fifo_errors
++
;
...
...
@@ -1638,7 +1635,6 @@ static u8 dmfe_sense_speed(struct dmfe_board_info * db)
else
/* DM9102/DM9102A */
phy_mode
=
phy_read
(
db
->
ioaddr
,
db
->
phy_addr
,
17
,
db
->
chip_id
)
&
0xf000
;
pr_debug
(
"Phy_mode %x
\n
"
,
phy_mode
);
switch
(
phy_mode
)
{
case
0x1000
:
db
->
op_mode
=
DMFE_10MHF
;
break
;
case
0x2000
:
db
->
op_mode
=
DMFE_10MFD
;
break
;
...
...
This diff is collapsed.
Click to expand it.
drivers/net/usb/hso.c
浏览文件 @
df797679
...
...
@@ -2421,10 +2421,8 @@ static void hso_free_net_device(struct hso_device *hso_dev)
remove_net_device
(
hso_net
->
parent
);
if
(
hso_net
->
net
)
{
if
(
hso_net
->
net
)
unregister_netdev
(
hso_net
->
net
);
free_netdev
(
hso_net
->
net
);
}
/* start freeing */
for
(
i
=
0
;
i
<
MUX_BULK_RX_BUF_COUNT
;
i
++
)
{
...
...
@@ -2436,6 +2434,9 @@ static void hso_free_net_device(struct hso_device *hso_dev)
kfree
(
hso_net
->
mux_bulk_tx_buf
);
hso_net
->
mux_bulk_tx_buf
=
NULL
;
if
(
hso_net
->
net
)
free_netdev
(
hso_net
->
net
);
kfree
(
hso_dev
);
}
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath5k/pci.c
浏览文件 @
df797679
...
...
@@ -297,7 +297,9 @@ ath5k_pci_remove(struct pci_dev *pdev)
#ifdef CONFIG_PM_SLEEP
static
int
ath5k_pci_suspend
(
struct
device
*
dev
)
{
struct
ath5k_softc
*
sc
=
pci_get_drvdata
(
to_pci_dev
(
dev
));
struct
pci_dev
*
pdev
=
to_pci_dev
(
dev
);
struct
ieee80211_hw
*
hw
=
pci_get_drvdata
(
pdev
);
struct
ath5k_softc
*
sc
=
hw
->
priv
;
ath5k_led_off
(
sc
);
return
0
;
...
...
@@ -306,7 +308,8 @@ static int ath5k_pci_suspend(struct device *dev)
static
int
ath5k_pci_resume
(
struct
device
*
dev
)
{
struct
pci_dev
*
pdev
=
to_pci_dev
(
dev
);
struct
ath5k_softc
*
sc
=
pci_get_drvdata
(
pdev
);
struct
ieee80211_hw
*
hw
=
pci_get_drvdata
(
pdev
);
struct
ath5k_softc
*
sc
=
hw
->
priv
;
/*
* Suspend/Resume resets the PCI configuration space, so we have to
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath5k/sysfs.c
浏览文件 @
df797679
...
...
@@ -10,7 +10,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
struct ath5k_softc *sc = dev_get_drvdata(dev); \
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
struct ath5k_softc *sc = hw->priv; \
return snprintf(buf, PAGE_SIZE, "%d\n", get); \
} \
\
...
...
@@ -18,7 +19,8 @@ static ssize_t ath5k_attr_store_##name(struct device *dev, \
struct device_attribute *attr, \
const char *buf, size_t count) \
{ \
struct ath5k_softc *sc = dev_get_drvdata(dev); \
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
struct ath5k_softc *sc = hw->priv; \
int val; \
\
val = (int)simple_strtoul(buf, NULL, 10); \
...
...
@@ -33,7 +35,8 @@ static ssize_t ath5k_attr_show_##name(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
struct ath5k_softc *sc = dev_get_drvdata(dev); \
struct ieee80211_hw *hw = dev_get_drvdata(dev); \
struct ath5k_softc *sc = hw->priv; \
return snprintf(buf, PAGE_SIZE, "%d\n", get); \
} \
static DEVICE_ATTR(name, S_IRUGO, ath5k_attr_show_##name, NULL)
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/ath9k/xmit.c
浏览文件 @
df797679
...
...
@@ -671,7 +671,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid,
* TODO - this could be improved to be dependent on the rate.
* The hardware can keep up at lower rates, but not higher rates
*/
if
(
fi
->
keyix
!=
ATH9K_TXKEYIX_INVALID
)
if
((
fi
->
keyix
!=
ATH9K_TXKEYIX_INVALID
)
&&
!
(
sc
->
sc_ah
->
caps
.
hw_caps
&
ATH9K_HW_CAP_EDMA
))
ndelim
+=
ATH_AGGR_ENCRYPTDELIM
;
/*
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/ath/carl9170/usb.c
浏览文件 @
df797679
...
...
@@ -112,6 +112,8 @@ static struct usb_device_id carl9170_usb_ids[] = {
{
USB_DEVICE
(
0x04bb
,
0x093f
)
},
/* NEC WL300NU-G */
{
USB_DEVICE
(
0x0409
,
0x0249
)
},
/* NEC WL300NU-AG */
{
USB_DEVICE
(
0x0409
,
0x02b4
)
},
/* AVM FRITZ!WLAN USB Stick N */
{
USB_DEVICE
(
0x057c
,
0x8401
)
},
/* AVM FRITZ!WLAN USB Stick N 2.4 */
...
...
This diff is collapsed.
Click to expand it.
drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
浏览文件 @
df797679
...
...
@@ -298,6 +298,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
{
RTL_USB_DEVICE
(
0x06f8
,
0xe033
,
rtl92cu_hal_cfg
)},
/*Hercules - Edimax*/
{
RTL_USB_DEVICE
(
0x07b8
,
0x8188
,
rtl92cu_hal_cfg
)},
/*Abocom - Abocom*/
{
RTL_USB_DEVICE
(
0x07b8
,
0x8189
,
rtl92cu_hal_cfg
)},
/*Funai - Abocom*/
{
RTL_USB_DEVICE
(
0x0846
,
0x9041
,
rtl92cu_hal_cfg
)},
/*NetGear WNA1000M*/
{
RTL_USB_DEVICE
(
0x0Df6
,
0x0052
,
rtl92cu_hal_cfg
)},
/*Sitecom - Edimax*/
{
RTL_USB_DEVICE
(
0x0eb0
,
0x9071
,
rtl92cu_hal_cfg
)},
/*NO Brand - Etop*/
/* HP - Lite-On ,8188CUS Slim Combo */
...
...
This diff is collapsed.
Click to expand it.
drivers/pcmcia/pxa2xx_vpac270.c
浏览文件 @
df797679
...
...
@@ -76,10 +76,10 @@ static int vpac270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
static
void
vpac270_pcmcia_hw_shutdown
(
struct
soc_pcmcia_socket
*
skt
)
{
if
(
skt
->
nr
==
0
)
gpio_
request
_array
(
vpac270_pcmcia_gpios
,
gpio_
free
_array
(
vpac270_pcmcia_gpios
,
ARRAY_SIZE
(
vpac270_pcmcia_gpios
));
else
gpio_
request
_array
(
vpac270_cf_gpios
,
gpio_
free
_array
(
vpac270_cf_gpios
,
ARRAY_SIZE
(
vpac270_cf_gpios
));
}
...
...
This diff is collapsed.
Click to expand it.
drivers/ssb/driver_pcicore.c
浏览文件 @
df797679
...
...
@@ -516,8 +516,17 @@ static void ssb_pcicore_pcie_setup_workarounds(struct ssb_pcicore *pc)
static
void
ssb_pcicore_init_clientmode
(
struct
ssb_pcicore
*
pc
)
{
ssb_pcicore_fix_sprom_core_index
(
pc
);
/* Disable PCI interrupts. */
ssb_write32
(
pc
->
dev
,
SSB_INTVEC
,
0
);
/* Additional PCIe always once-executed workarounds */
if
(
pc
->
dev
->
id
.
coreid
==
SSB_DEV_PCIE
)
{
ssb_pcicore_serdes_workaround
(
pc
);
/* TODO: ASPM */
/* TODO: Clock Request Update */
}
}
void
ssb_pcicore_init
(
struct
ssb_pcicore
*
pc
)
...
...
@@ -529,8 +538,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
if
(
!
ssb_device_is_enabled
(
dev
))
ssb_device_enable
(
dev
,
0
);
ssb_pcicore_fix_sprom_core_index
(
pc
);
#ifdef CONFIG_SSB_PCICORE_HOSTMODE
pc
->
hostmode
=
pcicore_is_in_hostmode
(
pc
);
if
(
pc
->
hostmode
)
...
...
@@ -538,13 +545,6 @@ void ssb_pcicore_init(struct ssb_pcicore *pc)
#endif
/* CONFIG_SSB_PCICORE_HOSTMODE */
if
(
!
pc
->
hostmode
)
ssb_pcicore_init_clientmode
(
pc
);
/* Additional PCIe always once-executed workarounds */
if
(
dev
->
id
.
coreid
==
SSB_DEV_PCIE
)
{
ssb_pcicore_serdes_workaround
(
pc
);
/* TODO: ASPM */
/* TODO: Clock Request Update */
}
}
static
u32
ssb_pcie_read
(
struct
ssb_pcicore
*
pc
,
u32
address
)
...
...
This diff is collapsed.
Click to expand it.
drivers/watchdog/Kconfig
浏览文件 @
df797679
...
...
@@ -599,8 +599,7 @@ config IT87_WDT
config HP_WATCHDOG
tristate "HP ProLiant iLO2+ Hardware Watchdog Timer"
depends on X86
default m
depends on X86 && PCI
help
A software monitoring watchdog and NMI sourcing driver. This driver
will detect lockups and provide a stack trace. This is a driver that
...
...
This diff is collapsed.
Click to expand it.
fs/ceph/mds_client.c
浏览文件 @
df797679
...
...
@@ -1438,12 +1438,15 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
struct
dentry
*
temp
;
char
*
path
;
int
len
,
pos
;
unsigned
seq
;
if
(
dentry
==
NULL
)
return
ERR_PTR
(
-
EINVAL
);
retry:
len
=
0
;
seq
=
read_seqbegin
(
&
rename_lock
);
rcu_read_lock
();
for
(
temp
=
dentry
;
!
IS_ROOT
(
temp
);)
{
struct
inode
*
inode
=
temp
->
d_inode
;
if
(
inode
&&
ceph_snap
(
inode
)
==
CEPH_SNAPDIR
)
...
...
@@ -1455,10 +1458,12 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
len
+=
1
+
temp
->
d_name
.
len
;
temp
=
temp
->
d_parent
;
if
(
temp
==
NULL
)
{
rcu_read_unlock
();
pr_err
(
"build_path corrupt dentry %p
\n
"
,
dentry
);
return
ERR_PTR
(
-
EINVAL
);
}
}
rcu_read_unlock
();
if
(
len
)
len
--
;
/* no leading '/' */
...
...
@@ -1467,9 +1472,12 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
return
ERR_PTR
(
-
ENOMEM
);
pos
=
len
;
path
[
pos
]
=
0
;
/* trailing null */
rcu_read_lock
();
for
(
temp
=
dentry
;
!
IS_ROOT
(
temp
)
&&
pos
!=
0
;
)
{
struct
inode
*
inode
=
temp
->
d_inode
;
struct
inode
*
inode
;
spin_lock
(
&
temp
->
d_lock
);
inode
=
temp
->
d_inode
;
if
(
inode
&&
ceph_snap
(
inode
)
==
CEPH_SNAPDIR
)
{
dout
(
"build_path path+%d: %p SNAPDIR
\n
"
,
pos
,
temp
);
...
...
@@ -1478,21 +1486,26 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
break
;
}
else
{
pos
-=
temp
->
d_name
.
len
;
if
(
pos
<
0
)
if
(
pos
<
0
)
{
spin_unlock
(
&
temp
->
d_lock
);
break
;
}
strncpy
(
path
+
pos
,
temp
->
d_name
.
name
,
temp
->
d_name
.
len
);
}
spin_unlock
(
&
temp
->
d_lock
);
if
(
pos
)
path
[
--
pos
]
=
'/'
;
temp
=
temp
->
d_parent
;
if
(
temp
==
NULL
)
{
rcu_read_unlock
();
pr_err
(
"build_path corrupt dentry
\n
"
);
kfree
(
path
);
return
ERR_PTR
(
-
EINVAL
);
}
}
if
(
pos
!=
0
)
{
rcu_read_unlock
();
if
(
pos
!=
0
||
read_seqretry
(
&
rename_lock
,
seq
))
{
pr_err
(
"build_path did not end path lookup where "
"expected, namelen is %d, pos is %d
\n
"
,
len
,
pos
);
/* presumably this is only possible if racing with a
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifsfs.c
浏览文件 @
df797679
...
...
@@ -35,6 +35,7 @@
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/freezer.h>
#include <linux/namei.h>
#include <net/ipv6.h>
#include "cifsfs.h"
#include "cifspdu.h"
...
...
@@ -542,14 +543,12 @@ static const struct super_operations cifs_super_ops = {
static
struct
dentry
*
cifs_get_root
(
struct
smb_vol
*
vol
,
struct
super_block
*
sb
)
{
int
xid
,
rc
;
struct
inode
*
inode
;
struct
qstr
name
;
struct
dentry
*
dparent
=
NULL
,
*
dchild
=
NULL
,
*
alias
;
struct
dentry
*
dentry
;
struct
cifs_sb_info
*
cifs_sb
=
CIFS_SB
(
sb
);
unsigned
int
i
,
full_len
,
len
;
char
*
full_path
=
NULL
,
*
pstart
;
char
*
full_path
=
NULL
;
char
*
s
,
*
p
;
char
sep
;
int
xid
;
full_path
=
cifs_build_path_to_root
(
vol
,
cifs_sb
,
cifs_sb_master_tcon
(
cifs_sb
));
...
...
@@ -560,73 +559,32 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb)
xid
=
GetXid
();
sep
=
CIFS_DIR_SEP
(
cifs_sb
);
dparent
=
dget
(
sb
->
s_root
);
full_len
=
strlen
(
full_path
);
full_path
[
full_len
]
=
sep
;
pstart
=
full_path
+
1
;
for
(
i
=
1
,
len
=
0
;
i
<=
full_len
;
i
++
)
{
if
(
full_path
[
i
]
!=
sep
||
!
len
)
{
len
++
;
continue
;
}
full_path
[
i
]
=
0
;
cFYI
(
1
,
"get dentry for %s"
,
pstart
);
name
.
name
=
pstart
;
name
.
len
=
len
;
name
.
hash
=
full_name_hash
(
pstart
,
len
);
dchild
=
d_lookup
(
dparent
,
&
name
);
if
(
dchild
==
NULL
)
{
cFYI
(
1
,
"not exists"
);
dchild
=
d_alloc
(
dparent
,
&
name
);
if
(
dchild
==
NULL
)
{
dput
(
dparent
);
dparent
=
ERR_PTR
(
-
ENOMEM
);
goto
out
;
}
}
cFYI
(
1
,
"get inode"
);
if
(
dchild
->
d_inode
==
NULL
)
{
cFYI
(
1
,
"not exists"
);
inode
=
NULL
;
if
(
cifs_sb_master_tcon
(
CIFS_SB
(
sb
))
->
unix_ext
)
rc
=
cifs_get_inode_info_unix
(
&
inode
,
full_path
,
sb
,
xid
);
else
rc
=
cifs_get_inode_info
(
&
inode
,
full_path
,
NULL
,
sb
,
xid
,
NULL
);
if
(
rc
)
{
dput
(
dchild
);
dput
(
dparent
);
dparent
=
ERR_PTR
(
rc
);
goto
out
;
}
alias
=
d_materialise_unique
(
dchild
,
inode
);
if
(
alias
!=
NULL
)
{
dput
(
dchild
);
if
(
IS_ERR
(
alias
))
{
dput
(
dparent
);
dparent
=
ERR_PTR
(
-
EINVAL
);
/* XXX */
goto
out
;
}
dchild
=
alias
;
}
}
cFYI
(
1
,
"parent %p, child %p"
,
dparent
,
dchild
);
dput
(
dparent
);
dparent
=
dchild
;
len
=
0
;
pstart
=
full_path
+
i
+
1
;
full_path
[
i
]
=
sep
;
}
out:
dentry
=
dget
(
sb
->
s_root
);
p
=
s
=
full_path
;
do
{
struct
inode
*
dir
=
dentry
->
d_inode
;
struct
dentry
*
child
;
/* skip separators */
while
(
*
s
==
sep
)
s
++
;
if
(
!*
s
)
break
;
p
=
s
++
;
/* next separator */
while
(
*
s
&&
*
s
!=
sep
)
s
++
;
mutex_lock
(
&
dir
->
i_mutex
);
child
=
lookup_one_len
(
p
,
dentry
,
s
-
p
);
mutex_unlock
(
&
dir
->
i_mutex
);
dput
(
dentry
);
dentry
=
child
;
}
while
(
!
IS_ERR
(
dentry
));
_FreeXid
(
xid
);
kfree
(
full_path
);
return
d
parent
;
return
d
entry
;
}
static
int
cifs_set_super
(
struct
super_block
*
sb
,
void
*
data
)
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/cifsfs.h
浏览文件 @
df797679
...
...
@@ -129,5 +129,5 @@ extern long cifs_ioctl(struct file *filep, unsigned int cmd, unsigned long arg);
extern
const
struct
export_operations
cifs_export_ops
;
#endif
/* CIFS_NFSD_EXPORT */
#define CIFS_VERSION "1.7
3
"
#define CIFS_VERSION "1.7
4
"
#endif
/* _CIFSFS_H */
This diff is collapsed.
Click to expand it.
fs/cifs/connect.c
浏览文件 @
df797679
...
...
@@ -3485,7 +3485,7 @@ cifs_construct_tcon(struct cifs_sb_info *cifs_sb, uid_t fsuid)
goto
out
;
}
snprintf
(
username
,
MAX_USERNAME_SIZE
,
"krb50x%x"
,
fsuid
);
snprintf
(
username
,
sizeof
(
username
)
,
"krb50x%x"
,
fsuid
);
vol_info
->
username
=
username
;
vol_info
->
local_nls
=
cifs_sb
->
local_nls
;
vol_info
->
linux_uid
=
fsuid
;
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/dir.c
浏览文件 @
df797679
...
...
@@ -55,6 +55,7 @@ build_path_from_dentry(struct dentry *direntry)
char
dirsep
;
struct
cifs_sb_info
*
cifs_sb
=
CIFS_SB
(
direntry
->
d_sb
);
struct
cifs_tcon
*
tcon
=
cifs_sb_master_tcon
(
cifs_sb
);
unsigned
seq
;
if
(
direntry
==
NULL
)
return
NULL
;
/* not much we can do if dentry is freed and
...
...
@@ -68,22 +69,29 @@ build_path_from_dentry(struct dentry *direntry)
dfsplen
=
0
;
cifs_bp_rename_retry:
namelen
=
dfsplen
;
seq
=
read_seqbegin
(
&
rename_lock
);
rcu_read_lock
();
for
(
temp
=
direntry
;
!
IS_ROOT
(
temp
);)
{
namelen
+=
(
1
+
temp
->
d_name
.
len
);
temp
=
temp
->
d_parent
;
if
(
temp
==
NULL
)
{
cERROR
(
1
,
"corrupt dentry"
);
rcu_read_unlock
();
return
NULL
;
}
}
rcu_read_unlock
();
full_path
=
kmalloc
(
namelen
+
1
,
GFP_KERNEL
);
if
(
full_path
==
NULL
)
return
full_path
;
full_path
[
namelen
]
=
0
;
/* trailing null */
rcu_read_lock
();
for
(
temp
=
direntry
;
!
IS_ROOT
(
temp
);)
{
spin_lock
(
&
temp
->
d_lock
);
namelen
-=
1
+
temp
->
d_name
.
len
;
if
(
namelen
<
0
)
{
spin_unlock
(
&
temp
->
d_lock
);
break
;
}
else
{
full_path
[
namelen
]
=
dirsep
;
...
...
@@ -91,14 +99,17 @@ build_path_from_dentry(struct dentry *direntry)
temp
->
d_name
.
len
);
cFYI
(
0
,
"name: %s"
,
full_path
+
namelen
);
}
spin_unlock
(
&
temp
->
d_lock
);
temp
=
temp
->
d_parent
;
if
(
temp
==
NULL
)
{
cERROR
(
1
,
"corrupt dentry"
);
rcu_read_unlock
();
kfree
(
full_path
);
return
NULL
;
}
}
if
(
namelen
!=
dfsplen
)
{
rcu_read_unlock
();
if
(
namelen
!=
dfsplen
||
read_seqretry
(
&
rename_lock
,
seq
))
{
cERROR
(
1
,
"did not end path lookup where expected namelen is %d"
,
namelen
);
/* presumably this is only possible if racing with a rename
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/file.c
浏览文件 @
df797679
...
...
@@ -1737,7 +1737,7 @@ cifs_iovec_read(struct file *file, const struct iovec *iov,
io_parms
.
pid
=
pid
;
io_parms
.
tcon
=
pTcon
;
io_parms
.
offset
=
*
poffset
;
io_parms
.
length
=
len
;
io_parms
.
length
=
cur_
len
;
rc
=
CIFSSMBRead
(
xid
,
&
io_parms
,
&
bytes_read
,
&
read_data
,
&
buf_type
);
pSMBr
=
(
struct
smb_com_read_rsp
*
)
read_data
;
...
...
This diff is collapsed.
Click to expand it.
fs/cifs/sess.c
浏览文件 @
df797679
...
...
@@ -428,8 +428,7 @@ static void build_ntlmssp_negotiate_blob(unsigned char *pbuffer,
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
{
flags
|=
NTLMSSP_NEGOTIATE_SIGN
;
if
(
!
ses
->
server
->
session_estab
)
flags
|=
NTLMSSP_NEGOTIATE_KEY_XCH
|
NTLMSSP_NEGOTIATE_EXTENDED_SEC
;
flags
|=
NTLMSSP_NEGOTIATE_KEY_XCH
;
}
sec_blob
->
NegotiateFlags
=
cpu_to_le32
(
flags
);
...
...
@@ -465,10 +464,11 @@ static int build_ntlmssp_auth_blob(unsigned char *pbuffer,
NTLMSSP_NEGOTIATE_128
|
NTLMSSP_NEGOTIATE_UNICODE
|
NTLMSSP_NEGOTIATE_NTLM
|
NTLMSSP_NEGOTIATE_EXTENDED_SEC
;
if
(
ses
->
server
->
sec_mode
&
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
(
SECMODE_SIGN_REQUIRED
|
SECMODE_SIGN_ENABLED
))
{
flags
|=
NTLMSSP_NEGOTIATE_SIGN
;
if
(
ses
->
server
->
sec_mode
&
SECMODE_SIGN_REQUIRED
)
flags
|=
NTLMSSP_NEGOTIATE_ALWAYS_SIGN
;
if
(
!
ses
->
server
->
session_estab
)
flags
|=
NTLMSSP_NEGOTIATE_KEY_XCH
;
}
tmp
=
pbuffer
+
sizeof
(
AUTHENTICATE_MESSAGE
);
sec_blob
->
NegotiateFlags
=
cpu_to_le32
(
flags
);
...
...
This diff is collapsed.
Click to expand it.
fs/cramfs/inode.c
浏览文件 @
df797679
...
...
@@ -37,7 +37,7 @@ static DEFINE_MUTEX(read_mutex);
/* These macros may change in future, to provide better st_ino semantics. */
#define OFFSET(x) ((x)->i_ino)
static
unsigned
long
cramino
(
struct
cramfs_inode
*
cino
,
unsigned
int
offset
)
static
unsigned
long
cramino
(
const
struct
cramfs_inode
*
cino
,
unsigned
int
offset
)
{
if
(
!
cino
->
offset
)
return
offset
+
1
;
...
...
@@ -61,7 +61,7 @@ static unsigned long cramino(struct cramfs_inode *cino, unsigned int offset)
}
static
struct
inode
*
get_cramfs_inode
(
struct
super_block
*
sb
,
struct
cramfs_inode
*
cramfs_inode
,
unsigned
int
offset
)
const
struct
cramfs_inode
*
cramfs_inode
,
unsigned
int
offset
)
{
struct
inode
*
inode
;
static
struct
timespec
zerotime
;
...
...
@@ -317,7 +317,7 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
/* Set it all up.. */
sb
->
s_op
=
&
cramfs_ops
;
root
=
get_cramfs_inode
(
sb
,
&
super
.
root
,
0
);
if
(
!
root
)
if
(
IS_ERR
(
root
)
)
goto
out
;
sb
->
s_root
=
d_alloc_root
(
root
);
if
(
!
sb
->
s_root
)
{
...
...
@@ -423,6 +423,7 @@ static int cramfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
static
struct
dentry
*
cramfs_lookup
(
struct
inode
*
dir
,
struct
dentry
*
dentry
,
struct
nameidata
*
nd
)
{
unsigned
int
offset
=
0
;
struct
inode
*
inode
=
NULL
;
int
sorted
;
mutex_lock
(
&
read_mutex
);
...
...
@@ -449,8 +450,8 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s
for
(;;)
{
if
(
!
namelen
)
{
mutex_unlock
(
&
read_mutex
);
return
ERR_PTR
(
-
EIO
)
;
inode
=
ERR_PTR
(
-
EIO
);
goto
out
;
}
if
(
name
[
namelen
-
1
])
break
;
...
...
@@ -462,17 +463,18 @@ static struct dentry * cramfs_lookup(struct inode *dir, struct dentry *dentry, s
if
(
retval
>
0
)
continue
;
if
(
!
retval
)
{
struct
cramfs_inode
entry
=
*
de
;
mutex_unlock
(
&
read_mutex
);
d_add
(
dentry
,
get_cramfs_inode
(
dir
->
i_sb
,
&
entry
,
dir_off
));
return
NULL
;
inode
=
get_cramfs_inode
(
dir
->
i_sb
,
de
,
dir_off
);
break
;
}
/* else (retval < 0) */
if
(
sorted
)
break
;
}
out:
mutex_unlock
(
&
read_mutex
);
d_add
(
dentry
,
NULL
);
if
(
IS_ERR
(
inode
))
return
ERR_CAST
(
inode
);
d_add
(
dentry
,
inode
);
return
NULL
;
}
...
...
This diff is collapsed.
Click to expand it.
fs/dcache.c
浏览文件 @
df797679
...
...
@@ -1813,8 +1813,6 @@ struct dentry *__d_lookup_rcu(struct dentry *parent, struct qstr *name,
tname
=
dentry
->
d_name
.
name
;
i
=
dentry
->
d_inode
;
prefetch
(
tname
);
if
(
i
)
prefetch
(
i
);
/*
* This seqcount check is required to ensure name and
* len are loaded atomically, so as not to walk off the
...
...
@@ -2213,14 +2211,15 @@ static void dentry_unlock_parents_for_move(struct dentry *dentry,
* The hash value has to match the hash queue that the dentry is on..
*/
/*
* d_move - move a dentry
*
__
d_move - move a dentry
* @dentry: entry to move
* @target: new dentry
*
* Update the dcache to reflect the move of a file name. Negative
* dcache entries should not be moved in this way.
* dcache entries should not be moved in this way. Caller hold
* rename_lock.
*/
void
d_move
(
struct
dentry
*
dentry
,
struct
dentry
*
target
)
static
void
__
d_move
(
struct
dentry
*
dentry
,
struct
dentry
*
target
)
{
if
(
!
dentry
->
d_inode
)
printk
(
KERN_WARNING
"VFS: moving negative dcache entry
\n
"
);
...
...
@@ -2228,8 +2227,6 @@ void d_move(struct dentry * dentry, struct dentry * target)
BUG_ON
(
d_ancestor
(
dentry
,
target
));
BUG_ON
(
d_ancestor
(
target
,
dentry
));
write_seqlock
(
&
rename_lock
);
dentry_lock_for_move
(
dentry
,
target
);
write_seqcount_begin
(
&
dentry
->
d_seq
);
...
...
@@ -2275,6 +2272,20 @@ void d_move(struct dentry * dentry, struct dentry * target)
spin_unlock
(
&
target
->
d_lock
);
fsnotify_d_move
(
dentry
);
spin_unlock
(
&
dentry
->
d_lock
);
}
/*
* d_move - move a dentry
* @dentry: entry to move
* @target: new dentry
*
* Update the dcache to reflect the move of a file name. Negative
* dcache entries should not be moved in this way.
*/
void
d_move
(
struct
dentry
*
dentry
,
struct
dentry
*
target
)
{
write_seqlock
(
&
rename_lock
);
__d_move
(
dentry
,
target
);
write_sequnlock
(
&
rename_lock
);
}
EXPORT_SYMBOL
(
d_move
);
...
...
@@ -2302,7 +2313,7 @@ struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
* This helper attempts to cope with remotely renamed directories
*
* It assumes that the caller is already holding
* dentry->d_parent->d_inode->i_mutex
and the inode->i
_lock
* dentry->d_parent->d_inode->i_mutex
, inode->i_lock and rename
_lock
*
* Note: If ever the locking in lock_rename() changes, then please
* remember to update this too...
...
...
@@ -2317,11 +2328,6 @@ static struct dentry *__d_unalias(struct inode *inode,
if
(
alias
->
d_parent
==
dentry
->
d_parent
)
goto
out_unalias
;
/* Check for loops */
ret
=
ERR_PTR
(
-
ELOOP
);
if
(
d_ancestor
(
alias
,
dentry
))
goto
out_err
;
/* See lock_rename() */
ret
=
ERR_PTR
(
-
EBUSY
);
if
(
!
mutex_trylock
(
&
dentry
->
d_sb
->
s_vfs_rename_mutex
))
...
...
@@ -2331,7 +2337,7 @@ static struct dentry *__d_unalias(struct inode *inode,
goto
out_err
;
m2
=
&
alias
->
d_parent
->
d_inode
->
i_mutex
;
out_unalias:
d_move
(
alias
,
dentry
);
__
d_move
(
alias
,
dentry
);
ret
=
alias
;
out_err:
spin_unlock
(
&
inode
->
i_lock
);
...
...
@@ -2416,15 +2422,24 @@ struct dentry *d_materialise_unique(struct dentry *dentry, struct inode *inode)
alias
=
__d_find_alias
(
inode
,
0
);
if
(
alias
)
{
actual
=
alias
;
/* Is this an anonymous mountpoint that we could splice
* into our tree? */
if
(
IS_ROOT
(
alias
))
{
write_seqlock
(
&
rename_lock
);
if
(
d_ancestor
(
alias
,
dentry
))
{
/* Check for loops */
actual
=
ERR_PTR
(
-
ELOOP
);
}
else
if
(
IS_ROOT
(
alias
))
{
/* Is this an anonymous mountpoint that we
* could splice into our tree? */
__d_materialise_dentry
(
dentry
,
alias
);
write_sequnlock
(
&
rename_lock
);
__d_drop
(
alias
);
goto
found
;
}
else
{
/* Nope, but we must(!) avoid directory
* aliasing */
actual
=
__d_unalias
(
inode
,
dentry
,
alias
);
}
/* Nope, but we must(!) avoid directory aliasing */
actual
=
__d_unalias
(
inode
,
dentry
,
alias
);
write_sequnlock
(
&
rename_lock
);
if
(
IS_ERR
(
actual
))
dput
(
alias
);
goto
out_nolock
;
...
...
This diff is collapsed.
Click to expand it.
fs/exofs/super.c
浏览文件 @
df797679
...
...
@@ -913,7 +913,7 @@ struct dentry *exofs_get_parent(struct dentry *child)
unsigned
long
ino
=
exofs_parent_ino
(
child
);
if
(
!
ino
)
return
NULL
;
return
ERR_PTR
(
-
ESTALE
)
;
return
d_obtain_alias
(
exofs_iget
(
child
->
d_inode
->
i_sb
,
ino
));
}
...
...
This diff is collapsed.
Click to expand it.
fs/fscache/page.c
浏览文件 @
df797679
...
...
@@ -976,16 +976,12 @@ void __fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
pagevec_init
(
&
pvec
,
0
);
next
=
0
;
while
(
next
<=
(
loff_t
)
-
1
&&
pagevec_lookup
(
&
pvec
,
mapping
,
next
,
PAGEVEC_SIZE
)
)
{
do
{
if
(
!
pagevec_lookup
(
&
pvec
,
mapping
,
next
,
PAGEVEC_SIZE
)
)
break
;
for
(
i
=
0
;
i
<
pagevec_count
(
&
pvec
);
i
++
)
{
struct
page
*
page
=
pvec
.
pages
[
i
];
pgoff_t
page_index
=
page
->
index
;
ASSERTCMP
(
page_index
,
>=
,
next
);
next
=
page_index
+
1
;
next
=
page
->
index
;
if
(
PageFsCache
(
page
))
{
__fscache_wait_on_page_write
(
cookie
,
page
);
__fscache_uncache_page
(
cookie
,
page
);
...
...
@@ -993,7 +989,7 @@ void __fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
}
pagevec_release
(
&
pvec
);
cond_resched
();
}
}
while
(
++
next
);
_leave
(
""
);
}
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/aops.c
浏览文件 @
df797679
...
...
@@ -1069,6 +1069,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
return
0
;
gfs2_log_lock
(
sdp
);
spin_lock
(
&
sdp
->
sd_ail_lock
);
head
=
bh
=
page_buffers
(
page
);
do
{
if
(
atomic_read
(
&
bh
->
b_count
))
...
...
@@ -1080,6 +1081,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
goto
not_possible
;
bh
=
bh
->
b_this_page
;
}
while
(
bh
!=
head
);
spin_unlock
(
&
sdp
->
sd_ail_lock
);
gfs2_log_unlock
(
sdp
);
head
=
bh
=
page_buffers
(
page
);
...
...
@@ -1112,6 +1114,7 @@ int gfs2_releasepage(struct page *page, gfp_t gfp_mask)
WARN_ON
(
buffer_dirty
(
bh
));
WARN_ON
(
buffer_pinned
(
bh
));
cannot_release:
spin_unlock
(
&
sdp
->
sd_ail_lock
);
gfs2_log_unlock
(
sdp
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/glops.c
浏览文件 @
df797679
...
...
@@ -47,10 +47,10 @@ static void __gfs2_ail_flush(struct gfs2_glock *gl)
bd_ail_gl_list
);
bh
=
bd
->
bd_bh
;
gfs2_remove_from_ail
(
bd
);
spin_unlock
(
&
sdp
->
sd_ail_lock
);
bd
->
bd_bh
=
NULL
;
bh
->
b_private
=
NULL
;
spin_unlock
(
&
sdp
->
sd_ail_lock
);
bd
->
bd_blkno
=
bh
->
b_blocknr
;
gfs2_log_lock
(
sdp
);
gfs2_assert_withdraw
(
sdp
,
!
buffer_busy
(
bh
));
...
...
@@ -221,8 +221,10 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags)
}
}
if
(
ip
==
GFS2_I
(
gl
->
gl_sbd
->
sd_rindex
))
if
(
ip
==
GFS2_I
(
gl
->
gl_sbd
->
sd_rindex
))
{
gfs2_log_flush
(
gl
->
gl_sbd
,
NULL
);
gl
->
gl_sbd
->
sd_rindex_uptodate
=
0
;
}
if
(
ip
&&
S_ISREG
(
ip
->
i_inode
.
i_mode
))
truncate_inode_pages
(
ip
->
i_inode
.
i_mapping
,
0
);
}
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/incore.h
浏览文件 @
df797679
...
...
@@ -17,6 +17,7 @@
#include <linux/buffer_head.h>
#include <linux/rcupdate.h>
#include <linux/rculist_bl.h>
#include <linux/completion.h>
#define DIO_WAIT 0x00000010
#define DIO_METADATA 0x00000020
...
...
@@ -546,6 +547,7 @@ struct gfs2_sbd {
struct
gfs2_glock
*
sd_trans_gl
;
wait_queue_head_t
sd_glock_wait
;
atomic_t
sd_glock_disposal
;
struct
completion
sd_locking_init
;
/* Inode Stuff */
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/log.c
浏览文件 @
df797679
...
...
@@ -903,6 +903,7 @@ void gfs2_meta_syncfs(struct gfs2_sbd *sdp)
if
(
gfs2_ail1_empty
(
sdp
))
break
;
}
gfs2_log_flush
(
sdp
,
NULL
);
}
static
inline
int
gfs2_jrnl_flush_reqd
(
struct
gfs2_sbd
*
sdp
)
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/ops_fstype.c
浏览文件 @
df797679
...
...
@@ -72,6 +72,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
init_waitqueue_head
(
&
sdp
->
sd_glock_wait
);
atomic_set
(
&
sdp
->
sd_glock_disposal
,
0
);
init_completion
(
&
sdp
->
sd_locking_init
);
spin_lock_init
(
&
sdp
->
sd_statfs_spin
);
spin_lock_init
(
&
sdp
->
sd_rindex_spin
);
...
...
@@ -1017,11 +1018,13 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent)
fsname
++
;
if
(
lm
->
lm_mount
==
NULL
)
{
fs_info
(
sdp
,
"Now mounting FS...
\n
"
);
complete
(
&
sdp
->
sd_locking_init
);
return
0
;
}
ret
=
lm
->
lm_mount
(
sdp
,
fsname
);
if
(
ret
==
0
)
fs_info
(
sdp
,
"Joined cluster. Now mounting FS...
\n
"
);
complete
(
&
sdp
->
sd_locking_init
);
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/super.c
浏览文件 @
df797679
...
...
@@ -757,13 +757,17 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
struct
timespec
atime
;
struct
gfs2_dinode
*
di
;
int
ret
=
-
EAGAIN
;
int
unlock_required
=
0
;
/* Skip timestamp update, if this is from a memalloc */
if
(
current
->
flags
&
PF_MEMALLOC
)
goto
do_flush
;
ret
=
gfs2_glock_nq_init
(
ip
->
i_gl
,
LM_ST_EXCLUSIVE
,
0
,
&
gh
);
if
(
ret
)
goto
do_flush
;
if
(
!
gfs2_glock_is_locked_by_me
(
ip
->
i_gl
))
{
ret
=
gfs2_glock_nq_init
(
ip
->
i_gl
,
LM_ST_EXCLUSIVE
,
0
,
&
gh
);
if
(
ret
)
goto
do_flush
;
unlock_required
=
1
;
}
ret
=
gfs2_trans_begin
(
sdp
,
RES_DINODE
,
0
);
if
(
ret
)
goto
do_unlock
;
...
...
@@ -780,7 +784,8 @@ static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc)
}
gfs2_trans_end
(
sdp
);
do_unlock:
gfs2_glock_dq_uninit
(
&
gh
);
if
(
unlock_required
)
gfs2_glock_dq_uninit
(
&
gh
);
do_flush:
if
(
wbc
->
sync_mode
==
WB_SYNC_ALL
)
gfs2_log_flush
(
GFS2_SB
(
inode
),
ip
->
i_gl
);
...
...
@@ -1427,7 +1432,20 @@ static int gfs2_dinode_dealloc(struct gfs2_inode *ip)
return
error
;
}
/*
/**
* gfs2_evict_inode - Remove an inode from cache
* @inode: The inode to evict
*
* There are three cases to consider:
* 1. i_nlink == 0, we are final opener (and must deallocate)
* 2. i_nlink == 0, we are not the final opener (and cannot deallocate)
* 3. i_nlink > 0
*
* If the fs is read only, then we have to treat all cases as per #3
* since we are unable to do any deallocation. The inode will be
* deallocated by the next read/write node to attempt an allocation
* in the same resource group
*
* We have to (at the moment) hold the inodes main lock to cover
* the gap between unlocking the shared lock on the iopen lock and
* taking the exclusive lock. I'd rather do a shared -> exclusive
...
...
@@ -1470,6 +1488,8 @@ static void gfs2_evict_inode(struct inode *inode)
if
(
error
)
goto
out_truncate
;
/* Case 1 starts here */
if
(
S_ISDIR
(
inode
->
i_mode
)
&&
(
ip
->
i_diskflags
&
GFS2_DIF_EXHASH
))
{
error
=
gfs2_dir_exhash_dealloc
(
ip
);
...
...
@@ -1493,13 +1513,16 @@ static void gfs2_evict_inode(struct inode *inode)
goto
out_unlock
;
out_truncate:
/* Case 2 starts here */
error
=
gfs2_trans_begin
(
sdp
,
0
,
sdp
->
sd_jdesc
->
jd_blocks
);
if
(
error
)
goto
out_unlock
;
gfs2_final_release_pages
(
ip
);
/* Needs to be done before glock release & also in a transaction */
truncate_inode_pages
(
&
inode
->
i_data
,
0
);
gfs2_trans_end
(
sdp
);
out_unlock:
/* Error path for case 1 */
if
(
test_bit
(
HIF_HOLDER
,
&
ip
->
i_iopen_gh
.
gh_iflags
))
gfs2_glock_dq
(
&
ip
->
i_iopen_gh
);
gfs2_holder_uninit
(
&
ip
->
i_iopen_gh
);
...
...
@@ -1507,6 +1530,7 @@ static void gfs2_evict_inode(struct inode *inode)
if
(
error
&&
error
!=
GLR_TRYFAILED
&&
error
!=
-
EROFS
)
fs_warn
(
sdp
,
"gfs2_evict_inode: %d
\n
"
,
error
);
out:
/* Case 3 starts here */
truncate_inode_pages
(
&
inode
->
i_data
,
0
);
end_writeback
(
inode
);
...
...
This diff is collapsed.
Click to expand it.
fs/gfs2/sys.c
浏览文件 @
df797679
...
...
@@ -338,6 +338,9 @@ static ssize_t lkfirst_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
rv
=
sscanf
(
buf
,
"%u"
,
&
first
);
if
(
rv
!=
1
||
first
>
1
)
return
-
EINVAL
;
rv
=
wait_for_completion_killable
(
&
sdp
->
sd_locking_init
);
if
(
rv
)
return
rv
;
spin_lock
(
&
sdp
->
sd_jindex_spin
);
rv
=
-
EBUSY
;
if
(
test_bit
(
SDF_NOJOURNALID
,
&
sdp
->
sd_flags
)
==
0
)
...
...
@@ -414,7 +417,9 @@ static ssize_t jid_store(struct gfs2_sbd *sdp, const char *buf, size_t len)
rv
=
sscanf
(
buf
,
"%d"
,
&
jid
);
if
(
rv
!=
1
)
return
-
EINVAL
;
rv
=
wait_for_completion_killable
(
&
sdp
->
sd_locking_init
);
if
(
rv
)
return
rv
;
spin_lock
(
&
sdp
->
sd_jindex_spin
);
rv
=
-
EINVAL
;
if
(
sdp
->
sd_lockstruct
.
ls_ops
->
lm_mount
==
NULL
)
...
...
This diff is collapsed.
Click to expand it.
fs/hppfs/hppfs.c
浏览文件 @
df797679
...
...
@@ -139,7 +139,8 @@ static int file_removed(struct dentry *dentry, const char *file)
static
struct
dentry
*
hppfs_lookup
(
struct
inode
*
ino
,
struct
dentry
*
dentry
,
struct
nameidata
*
nd
)
{
struct
dentry
*
proc_dentry
,
*
new
,
*
parent
;
struct
dentry
*
proc_dentry
,
*
parent
;
struct
qstr
*
name
=
&
dentry
->
d_name
;
struct
inode
*
inode
;
int
err
,
deleted
;
...
...
@@ -149,23 +150,9 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
else
if
(
deleted
)
return
ERR_PTR
(
-
ENOENT
);
err
=
-
ENOMEM
;
parent
=
HPPFS_I
(
ino
)
->
proc_dentry
;
mutex_lock
(
&
parent
->
d_inode
->
i_mutex
);
proc_dentry
=
d_lookup
(
parent
,
&
dentry
->
d_name
);
if
(
proc_dentry
==
NULL
)
{
proc_dentry
=
d_alloc
(
parent
,
&
dentry
->
d_name
);
if
(
proc_dentry
==
NULL
)
{
mutex_unlock
(
&
parent
->
d_inode
->
i_mutex
);
goto
out
;
}
new
=
(
*
parent
->
d_inode
->
i_op
->
lookup
)(
parent
->
d_inode
,
proc_dentry
,
NULL
);
if
(
new
)
{
dput
(
proc_dentry
);
proc_dentry
=
new
;
}
}
proc_dentry
=
lookup_one_len
(
name
->
name
,
parent
,
name
->
len
);
mutex_unlock
(
&
parent
->
d_inode
->
i_mutex
);
if
(
IS_ERR
(
proc_dentry
))
...
...
@@ -174,13 +161,11 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry,
err
=
-
ENOMEM
;
inode
=
get_inode
(
ino
->
i_sb
,
proc_dentry
);
if
(
!
inode
)
goto
out
_dput
;
goto
out
;
d_add
(
dentry
,
inode
);
return
NULL
;
out_dput:
dput
(
proc_dentry
);
out:
return
ERR_PTR
(
err
);
}
...
...
@@ -690,8 +675,10 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry)
struct
inode
*
proc_ino
=
dentry
->
d_inode
;
struct
inode
*
inode
=
new_inode
(
sb
);
if
(
!
inode
)
if
(
!
inode
)
{
dput
(
dentry
);
return
ERR_PTR
(
-
ENOMEM
);
}
if
(
S_ISDIR
(
dentry
->
d_inode
->
i_mode
))
{
inode
->
i_op
=
&
hppfs_dir_iops
;
...
...
@@ -704,7 +691,7 @@ static struct inode *get_inode(struct super_block *sb, struct dentry *dentry)
inode
->
i_fop
=
&
hppfs_file_fops
;
}
HPPFS_I
(
inode
)
->
proc_dentry
=
d
get
(
dentry
)
;
HPPFS_I
(
inode
)
->
proc_dentry
=
d
entry
;
inode
->
i_uid
=
proc_ino
->
i_uid
;
inode
->
i_gid
=
proc_ino
->
i_gid
;
...
...
@@ -737,7 +724,7 @@ static int hppfs_fill_super(struct super_block *sb, void *d, int silent)
sb
->
s_fs_info
=
proc_mnt
;
err
=
-
ENOMEM
;
root_inode
=
get_inode
(
sb
,
proc_mnt
->
mnt_sb
->
s_root
);
root_inode
=
get_inode
(
sb
,
dget
(
proc_mnt
->
mnt_sb
->
s_root
)
);
if
(
!
root_inode
)
goto
out_mntput
;
...
...
This diff is collapsed.
Click to expand it.
fs/libfs.c
浏览文件 @
df797679
...
...
@@ -822,7 +822,7 @@ ssize_t simple_attr_write(struct file *file, const char __user *buf,
goto
out
;
attr
->
set_buf
[
size
]
=
'\0'
;
val
=
simple_strtol
(
attr
->
set_buf
,
NULL
,
0
);
val
=
simple_strtol
l
(
attr
->
set_buf
,
NULL
,
0
);
ret
=
attr
->
set
(
attr
->
data
,
val
);
if
(
ret
==
0
)
ret
=
len
;
/* on success, claim we got the whole input */
...
...
This diff is collapsed.
Click to expand it.
fs/namei.c
浏览文件 @
df797679
...
...
@@ -433,6 +433,8 @@ static int unlazy_walk(struct nameidata *nd, struct dentry *dentry)
goto
err_parent
;
BUG_ON
(
nd
->
inode
!=
parent
->
d_inode
);
}
else
{
if
(
dentry
->
d_parent
!=
parent
)
goto
err_parent
;
spin_lock_nested
(
&
dentry
->
d_lock
,
DENTRY_D_LOCK_NESTED
);
if
(
!
__d_rcu_to_refcount
(
dentry
,
nd
->
seq
))
goto
err_child
;
...
...
@@ -940,7 +942,6 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
* Don't forget we might have a non-mountpoint managed dentry
* that wants to block transit.
*/
*
inode
=
path
->
dentry
->
d_inode
;
if
(
unlikely
(
managed_dentry_might_block
(
path
->
dentry
)))
return
false
;
...
...
@@ -953,6 +954,12 @@ static bool __follow_mount_rcu(struct nameidata *nd, struct path *path,
path
->
mnt
=
mounted
;
path
->
dentry
=
mounted
->
mnt_root
;
nd
->
seq
=
read_seqcount_begin
(
&
path
->
dentry
->
d_seq
);
/*
* Update the inode too. We don't need to re-check the
* dentry sequence number here after this d_inode read,
* because a mount-point is always pinned.
*/
*
inode
=
path
->
dentry
->
d_inode
;
}
return
true
;
}
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/nfs4filelayout.c
浏览文件 @
df797679
...
...
@@ -398,7 +398,6 @@ filelayout_write_pagelist(struct nfs_write_data *data, int sync)
* this offset and save the original offset.
*/
data
->
args
.
offset
=
filelayout_get_dserver_offset
(
lseg
,
offset
);
data
->
mds_offset
=
offset
;
/* Perform an asynchronous write */
status
=
nfs_initiate_write
(
data
,
ds
->
ds_clp
->
cl_rpcclient
,
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/nfs4xdr.c
浏览文件 @
df797679
...
...
@@ -91,7 +91,7 @@ static int nfs4_stat_to_errno(int);
#define encode_getfh_maxsz (op_encode_hdr_maxsz)
#define decode_getfh_maxsz (op_decode_hdr_maxsz + 1 + \
((3+NFS4_FHSIZE) >> 2))
#define nfs4_fattr_bitmap_maxsz
3
#define nfs4_fattr_bitmap_maxsz
4
#define encode_getattr_maxsz (op_encode_hdr_maxsz + nfs4_fattr_bitmap_maxsz)
#define nfs4_name_maxsz (1 + ((3 + NFS4_MAXNAMLEN) >> 2))
#define nfs4_path_maxsz (1 + ((3 + NFS4_MAXPATHLEN) >> 2))
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/write.c
浏览文件 @
df797679
...
...
@@ -864,6 +864,8 @@ static int nfs_write_rpcsetup(struct nfs_page *req,
data
->
args
.
fh
=
NFS_FH
(
inode
);
data
->
args
.
offset
=
req_offset
(
req
)
+
offset
;
/* pnfs_set_layoutcommit needs this */
data
->
mds_offset
=
data
->
args
.
offset
;
data
->
args
.
pgbase
=
req
->
wb_pgbase
+
offset
;
data
->
args
.
pages
=
data
->
pagevec
;
data
->
args
.
count
=
count
;
...
...
This diff is collapsed.
Click to expand it.
fs/ufs/namei.c
浏览文件 @
df797679
...
...
@@ -56,16 +56,12 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru
lock_ufs
(
dir
->
i_sb
);
ino
=
ufs_inode_by_name
(
dir
,
&
dentry
->
d_name
);
if
(
ino
)
{
if
(
ino
)
inode
=
ufs_iget
(
dir
->
i_sb
,
ino
);
if
(
IS_ERR
(
inode
))
{
unlock_ufs
(
dir
->
i_sb
);
return
ERR_CAST
(
inode
);
}
}
unlock_ufs
(
dir
->
i_sb
);
d_add
(
dentry
,
inode
);
return
NULL
;
if
(
IS_ERR
(
inode
))
return
ERR_CAST
(
inode
);
return
d_splice_alias
(
inode
,
dentry
);
}
/*
...
...
This diff is collapsed.
Click to expand it.
include/acpi/acpi_bus.h
浏览文件 @
df797679
...
...
@@ -210,7 +210,7 @@ struct acpi_device_power_state {
struct
acpi_device_power
{
int
state
;
/* Current state */
struct
acpi_device_power_flags
flags
;
struct
acpi_device_power_state
states
[
4
];
/* Power states (D0-D3
) */
struct
acpi_device_power_state
states
[
ACPI_D_STATE_COUNT
];
/* Power states (D0-D3Cold
) */
};
/* Performance Management */
...
...
This diff is collapsed.
Click to expand it.
include/acpi/acpiosxf.h
浏览文件 @
df797679
...
...
@@ -98,8 +98,11 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
/*
* Spinlock primitives
*/
#ifndef acpi_os_create_lock
acpi_status
acpi_os_create_lock
(
acpi_spinlock
*
out_handle
);
#endif
void
acpi_os_delete_lock
(
acpi_spinlock
handle
);
...
...
This diff is collapsed.
Click to expand it.
include/acpi/platform/aclinux.h
浏览文件 @
df797679
...
...
@@ -159,6 +159,24 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
} while (0)
#endif
/*
* When lockdep is enabled, the spin_lock_init() macro stringifies it's
* argument and uses that as a name for the lock in debugging.
* By executing spin_lock_init() in a macro the key changes from "lock" for
* all locks to the name of the argument of acpi_os_create_lock(), which
* prevents lockdep from reporting false positives for ACPICA locks.
*/
#define acpi_os_create_lock(__handle) \
({ \
spinlock_t *lock = ACPI_ALLOCATE(sizeof(*lock)); \
\
if (lock) { \
*(__handle) = lock; \
spin_lock_init(*(__handle)); \
} \
lock ? AE_OK : AE_NO_MEMORY; \
})
#endif
/* __KERNEL__ */
#endif
/* __ACLINUX_H__ */
This diff is collapsed.
Click to expand it.
include/drm/drm_pciids.h
浏览文件 @
df797679
...
...
@@ -182,6 +182,7 @@
{0x1002, 0x6750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6758, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6759, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x675F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TURKS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6760, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6761, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6762, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
...
...
@@ -192,6 +193,7 @@
{0x1002, 0x6767, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6768, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6770, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6778, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6779, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CAICOS|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6880, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
{0x1002, 0x6888, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CYPRESS|RADEON_NEW_MEMMAP}, \
...
...
This diff is collapsed.
Click to expand it.
include/drm/i915_drm.h
浏览文件 @
df797679
...
...
@@ -237,7 +237,7 @@ typedef struct _drm_i915_sarea {
#define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture)
#define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_i915_get_pipe_from_crtc_id)
#define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise)
#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I
OCTL_I915_OVERLAY_ATTRS
, struct drm_intel_overlay_put_image)
#define DRM_IOCTL_I915_OVERLAY_PUT_IMAGE DRM_IOW(DRM_COMMAND_BASE + DRM_I
915_OVERLAY_PUT_IMAGE
, struct drm_intel_overlay_put_image)
#define DRM_IOCTL_I915_OVERLAY_ATTRS DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_OVERLAY_ATTRS, struct drm_intel_overlay_attrs)
/* Allow drivers to submit batchbuffers directly to hardware, relying
...
...
This diff is collapsed.
Click to expand it.
include/linux/irq.h
浏览文件 @
df797679
...
...
@@ -676,7 +676,8 @@ void irq_gc_mask_disable_reg(struct irq_data *d);
void
irq_gc_mask_set_bit
(
struct
irq_data
*
d
);
void
irq_gc_mask_clr_bit
(
struct
irq_data
*
d
);
void
irq_gc_unmask_enable_reg
(
struct
irq_data
*
d
);
void
irq_gc_ack
(
struct
irq_data
*
d
);
void
irq_gc_ack_set_bit
(
struct
irq_data
*
d
);
void
irq_gc_ack_clr_bit
(
struct
irq_data
*
d
);
void
irq_gc_mask_disable_reg_and_ack
(
struct
irq_data
*
d
);
void
irq_gc_eoi
(
struct
irq_data
*
d
);
int
irq_gc_set_wake
(
struct
irq_data
*
d
,
unsigned
int
on
);
...
...
This diff is collapsed.
Click to expand it.
include/linux/memory.h
浏览文件 @
df797679
...
...
@@ -20,6 +20,8 @@
#include <linux/compiler.h>
#include <linux/mutex.h>
#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS)
struct
memory_block
{
unsigned
long
start_section_nr
;
unsigned
long
end_section_nr
;
...
...
This diff is collapsed.
Click to expand it.
include/linux/mmc/card.h
浏览文件 @
df797679
...
...
@@ -64,6 +64,19 @@ struct mmc_ext_csd {
unsigned
long
long
enhanced_area_offset
;
/* Units: Byte */
unsigned
int
enhanced_area_size
;
/* Units: KB */
unsigned
int
boot_size
;
/* in bytes */
u8
raw_partition_support
;
/* 160 */
u8
raw_erased_mem_count
;
/* 181 */
u8
raw_ext_csd_structure
;
/* 194 */
u8
raw_card_type
;
/* 196 */
u8
raw_s_a_timeout
;
/* 217 */
u8
raw_hc_erase_gap_size
;
/* 221 */
u8
raw_erase_timeout_mult
;
/* 223 */
u8
raw_hc_erase_grp_size
;
/* 224 */
u8
raw_sec_trim_mult
;
/* 229 */
u8
raw_sec_erase_mult
;
/* 230 */
u8
raw_sec_feature_support
;
/* 231 */
u8
raw_trim_mult
;
/* 232 */
u8
raw_sectors
[
4
];
/* 212 - 4 bytes */
};
struct
sd_scr
{
...
...
This diff is collapsed.
Click to expand it.
include/linux/netdevice.h
浏览文件 @
df797679
...
...
@@ -1097,12 +1097,6 @@ struct net_device {
#define NETIF_F_ALL_FCOE (NETIF_F_FCOE_CRC | NETIF_F_FCOE_MTU | \
NETIF_F_FSO)
#define NETIF_F_ALL_TX_OFFLOADS (NETIF_F_ALL_CSUM | NETIF_F_SG | \
NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
NETIF_F_HIGHDMA | \
NETIF_F_SCTP_CSUM | \
NETIF_F_ALL_FCOE)
/*
* If one device supports one of these features, then enable them
* for all in netdev_increment_features.
...
...
This diff is collapsed.
Click to expand it.
include/linux/sched.h
浏览文件 @
df797679
...
...
@@ -844,6 +844,7 @@ enum cpu_idle_type {
#define SD_SERIALIZE 0x0400
/* Only a single load balancing instance */
#define SD_ASYM_PACKING 0x0800
/* Place busy groups earlier in the domain */
#define SD_PREFER_SIBLING 0x1000
/* Prefer to place tasks in a sibling domain */
#define SD_OVERLAP 0x2000
/* sched_domains of this level overlap */
enum
powersavings_balance_level
{
POWERSAVINGS_BALANCE_NONE
=
0
,
/* No power saving load balance */
...
...
@@ -893,16 +894,21 @@ static inline int sd_power_saving_flags(void)
return
0
;
}
struct
sched_group
{
struct
sched_group
*
next
;
/* Must be a circular list */
struct
sched_group_power
{
atomic_t
ref
;
/*
* CPU power of this group, SCHED_LOAD_SCALE being max power for a
* single CPU.
*/
unsigned
int
cpu_power
,
cpu_power_orig
;
unsigned
int
power
,
power_orig
;
};
struct
sched_group
{
struct
sched_group
*
next
;
/* Must be a circular list */
atomic_t
ref
;
unsigned
int
group_weight
;
struct
sched_group_power
*
sgp
;
/*
* The CPUs this group covers.
...
...
@@ -1254,6 +1260,9 @@ struct task_struct {
#ifdef CONFIG_PREEMPT_RCU
int
rcu_read_lock_nesting
;
char
rcu_read_unlock_special
;
#if defined(CONFIG_RCU_BOOST) && defined(CONFIG_TREE_PREEMPT_RCU)
int
rcu_boosted
;
#endif
/* #if defined(CONFIG_RCU_BOOST) && defined(CONFIG_TREE_PREEMPT_RCU) */
struct
list_head
rcu_node_entry
;
#endif
/* #ifdef CONFIG_PREEMPT_RCU */
#ifdef CONFIG_TREE_PREEMPT_RCU
...
...
This diff is collapsed.
Click to expand it.
include/linux/sdla.h
浏览文件 @
df797679
...
...
@@ -112,11 +112,7 @@ struct sdla_dlci_conf {
short
Tb_max
;
};
#ifndef __KERNEL__
void
sdla
(
void
*
cfg_info
,
char
*
dev
,
struct
frad_conf
*
conf
,
int
quiet
);
#else
#ifdef __KERNEL__
/* important Z80 window addresses */
#define SDLA_CONTROL_WND 0xE000
...
...
This diff is collapsed.
Click to expand it.
include/net/sctp/command.h
浏览文件 @
df797679
...
...
@@ -63,6 +63,7 @@ typedef enum {
SCTP_CMD_ECN_ECNE
,
/* Do delayed ECNE processing. */
SCTP_CMD_ECN_CWR
,
/* Do delayed CWR processing. */
SCTP_CMD_TIMER_START
,
/* Start a timer. */
SCTP_CMD_TIMER_START_ONCE
,
/* Start a timer once */
SCTP_CMD_TIMER_RESTART
,
/* Restart a timer. */
SCTP_CMD_TIMER_STOP
,
/* Stop a timer. */
SCTP_CMD_INIT_CHOOSE_TRANSPORT
,
/* Choose transport for an INIT. */
...
...
This diff is collapsed.
Click to expand it.
include/net/sctp/ulpevent.h
浏览文件 @
df797679
...
...
@@ -80,7 +80,7 @@ static inline struct sctp_ulpevent *sctp_skb2event(struct sk_buff *skb)
void
sctp_ulpevent_free
(
struct
sctp_ulpevent
*
);
int
sctp_ulpevent_is_notification
(
const
struct
sctp_ulpevent
*
);
void
sctp_queue_purge_ulpevents
(
struct
sk_buff_head
*
list
);
unsigned
int
sctp_queue_purge_ulpevents
(
struct
sk_buff_head
*
list
);
struct
sctp_ulpevent
*
sctp_ulpevent_make_assoc_change
(
const
struct
sctp_association
*
asoc
,
...
...
This diff is collapsed.
Click to expand it.
kernel/irq/generic-chip.c
浏览文件 @
df797679
...
...
@@ -101,10 +101,10 @@ void irq_gc_unmask_enable_reg(struct irq_data *d)
}
/**
* irq_gc_ack
- Ack pending interrup
t
* irq_gc_ack
_set_bit - Ack pending interrupt via setting bi
t
* @d: irq_data
*/
void
irq_gc_ack
(
struct
irq_data
*
d
)
void
irq_gc_ack
_set_bit
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
1
<<
(
d
->
irq
-
gc
->
irq_base
);
...
...
@@ -114,6 +114,20 @@ void irq_gc_ack(struct irq_data *d)
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_ack_clr_bit - Ack pending interrupt via clearing bit
* @d: irq_data
*/
void
irq_gc_ack_clr_bit
(
struct
irq_data
*
d
)
{
struct
irq_chip_generic
*
gc
=
irq_data_get_irq_chip_data
(
d
);
u32
mask
=
~
(
1
<<
(
d
->
irq
-
gc
->
irq_base
));
irq_gc_lock
(
gc
);
irq_reg_writel
(
mask
,
gc
->
reg_base
+
cur_regs
(
d
)
->
ack
);
irq_gc_unlock
(
gc
);
}
/**
* irq_gc_mask_disable_reg_and_ack- Mask and ack pending interrupt
* @d: irq_data
...
...
This diff is collapsed.
Click to expand it.
kernel/rcutree.c
浏览文件 @
df797679
...
...
@@ -84,9 +84,32 @@ DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
static
struct
rcu_state
*
rcu_state
;
/*
* The rcu_scheduler_active variable transitions from zero to one just
* before the first task is spawned. So when this variable is zero, RCU
* can assume that there is but one task, allowing RCU to (for example)
* optimized synchronize_sched() to a simple barrier(). When this variable
* is one, RCU must actually do all the hard work required to detect real
* grace periods. This variable is also used to suppress boot-time false
* positives from lockdep-RCU error checking.
*/
int
rcu_scheduler_active
__read_mostly
;
EXPORT_SYMBOL_GPL
(
rcu_scheduler_active
);
/*
* The rcu_scheduler_fully_active variable transitions from zero to one
* during the early_initcall() processing, which is after the scheduler
* is capable of creating new tasks. So RCU processing (for example,
* creating tasks for RCU priority boosting) must be delayed until after
* rcu_scheduler_fully_active transitions from zero to one. We also
* currently delay invocation of any RCU callbacks until after this point.
*
* It might later prove better for people registering RCU callbacks during
* early boot to take responsibility for these callbacks, but one step at
* a time.
*/
static
int
rcu_scheduler_fully_active
__read_mostly
;
#ifdef CONFIG_RCU_BOOST
/*
...
...
@@ -98,7 +121,6 @@ DEFINE_PER_CPU(unsigned int, rcu_cpu_kthread_status);
DEFINE_PER_CPU
(
int
,
rcu_cpu_kthread_cpu
);
DEFINE_PER_CPU
(
unsigned
int
,
rcu_cpu_kthread_loops
);
DEFINE_PER_CPU
(
char
,
rcu_cpu_has_work
);
static
char
rcu_kthreads_spawnable
;
#endif
/* #ifdef CONFIG_RCU_BOOST */
...
...
@@ -1467,6 +1489,8 @@ static void rcu_process_callbacks(struct softirq_action *unused)
*/
static
void
invoke_rcu_callbacks
(
struct
rcu_state
*
rsp
,
struct
rcu_data
*
rdp
)
{
if
(
unlikely
(
!
ACCESS_ONCE
(
rcu_scheduler_fully_active
)))
return
;
if
(
likely
(
!
rsp
->
boost
))
{
rcu_do_batch
(
rsp
,
rdp
);
return
;
...
...
This diff is collapsed.
Click to expand it.
kernel/rcutree_plugin.h
浏览文件 @
df797679
...
...
@@ -68,6 +68,7 @@ struct rcu_state rcu_preempt_state = RCU_STATE_INITIALIZER(rcu_preempt_state);
DEFINE_PER_CPU
(
struct
rcu_data
,
rcu_preempt_data
);
static
struct
rcu_state
*
rcu_state
=
&
rcu_preempt_state
;
static
void
rcu_read_unlock_special
(
struct
task_struct
*
t
);
static
int
rcu_preempted_readers_exp
(
struct
rcu_node
*
rnp
);
/*
...
...
@@ -147,7 +148,7 @@ static void rcu_preempt_note_context_switch(int cpu)
struct
rcu_data
*
rdp
;
struct
rcu_node
*
rnp
;
if
(
t
->
rcu_read_lock_nesting
&&
if
(
t
->
rcu_read_lock_nesting
>
0
&&
(
t
->
rcu_read_unlock_special
&
RCU_READ_UNLOCK_BLOCKED
)
==
0
)
{
/* Possibly blocking in an RCU read-side critical section. */
...
...
@@ -190,6 +191,14 @@ static void rcu_preempt_note_context_switch(int cpu)
rnp
->
gp_tasks
=
&
t
->
rcu_node_entry
;
}
raw_spin_unlock_irqrestore
(
&
rnp
->
lock
,
flags
);
}
else
if
(
t
->
rcu_read_lock_nesting
<
0
&&
t
->
rcu_read_unlock_special
)
{
/*
* Complete exit from RCU read-side critical section on
* behalf of preempted instance of __rcu_read_unlock().
*/
rcu_read_unlock_special
(
t
);
}
/*
...
...
@@ -284,7 +293,7 @@ static struct list_head *rcu_next_node_entry(struct task_struct *t,
* notify RCU core processing or task having blocked during the RCU
* read-side critical section.
*/
static
void
rcu_read_unlock_special
(
struct
task_struct
*
t
)
static
noinline
void
rcu_read_unlock_special
(
struct
task_struct
*
t
)
{
int
empty
;
int
empty_exp
;
...
...
@@ -309,7 +318,7 @@ static void rcu_read_unlock_special(struct task_struct *t)
}
/* Hardware IRQ handlers cannot block. */
if
(
in_irq
())
{
if
(
in_irq
()
||
in_serving_softirq
()
)
{
local_irq_restore
(
flags
);
return
;
}
...
...
@@ -342,6 +351,11 @@ static void rcu_read_unlock_special(struct task_struct *t)
#ifdef CONFIG_RCU_BOOST
if
(
&
t
->
rcu_node_entry
==
rnp
->
boost_tasks
)
rnp
->
boost_tasks
=
np
;
/* Snapshot and clear ->rcu_boosted with rcu_node lock held. */
if
(
t
->
rcu_boosted
)
{
special
|=
RCU_READ_UNLOCK_BOOSTED
;
t
->
rcu_boosted
=
0
;
}
#endif
/* #ifdef CONFIG_RCU_BOOST */
t
->
rcu_blocked_node
=
NULL
;
...
...
@@ -358,7 +372,6 @@ static void rcu_read_unlock_special(struct task_struct *t)
#ifdef CONFIG_RCU_BOOST
/* Unboost if we were boosted. */
if
(
special
&
RCU_READ_UNLOCK_BOOSTED
)
{
t
->
rcu_read_unlock_special
&=
~
RCU_READ_UNLOCK_BOOSTED
;
rt_mutex_unlock
(
t
->
rcu_boost_mutex
);
t
->
rcu_boost_mutex
=
NULL
;
}
...
...
@@ -387,13 +400,22 @@ void __rcu_read_unlock(void)
struct
task_struct
*
t
=
current
;
barrier
();
/* needed if we ever invoke rcu_read_unlock in rcutree.c */
--
t
->
rcu_read_lock_nesting
;
barrier
();
/* decrement before load of ->rcu_read_unlock_special */
if
(
t
->
rcu_read_lock_nesting
==
0
&&
unlikely
(
ACCESS_ONCE
(
t
->
rcu_read_unlock_special
)))
rcu_read_unlock_special
(
t
);
if
(
t
->
rcu_read_lock_nesting
!=
1
)
--
t
->
rcu_read_lock_nesting
;
else
{
t
->
rcu_read_lock_nesting
=
INT_MIN
;
barrier
();
/* assign before ->rcu_read_unlock_special load */
if
(
unlikely
(
ACCESS_ONCE
(
t
->
rcu_read_unlock_special
)))
rcu_read_unlock_special
(
t
);
barrier
();
/* ->rcu_read_unlock_special load before assign */
t
->
rcu_read_lock_nesting
=
0
;
}
#ifdef CONFIG_PROVE_LOCKING
WARN_ON_ONCE
(
ACCESS_ONCE
(
t
->
rcu_read_lock_nesting
)
<
0
);
{
int
rrln
=
ACCESS_ONCE
(
t
->
rcu_read_lock_nesting
);
WARN_ON_ONCE
(
rrln
<
0
&&
rrln
>
INT_MIN
/
2
);
}
#endif
/* #ifdef CONFIG_PROVE_LOCKING */
}
EXPORT_SYMBOL_GPL
(
__rcu_read_unlock
);
...
...
@@ -589,7 +611,8 @@ static void rcu_preempt_check_callbacks(int cpu)
rcu_preempt_qs
(
cpu
);
return
;
}
if
(
per_cpu
(
rcu_preempt_data
,
cpu
).
qs_pending
)
if
(
t
->
rcu_read_lock_nesting
>
0
&&
per_cpu
(
rcu_preempt_data
,
cpu
).
qs_pending
)
t
->
rcu_read_unlock_special
|=
RCU_READ_UNLOCK_NEED_QS
;
}
...
...
@@ -695,9 +718,12 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
raw_spin_lock_irqsave
(
&
rnp
->
lock
,
flags
);
for
(;;)
{
if
(
!
sync_rcu_preempt_exp_done
(
rnp
))
if
(
!
sync_rcu_preempt_exp_done
(
rnp
))
{
raw_spin_unlock_irqrestore
(
&
rnp
->
lock
,
flags
);
break
;
}
if
(
rnp
->
parent
==
NULL
)
{
raw_spin_unlock_irqrestore
(
&
rnp
->
lock
,
flags
);
wake_up
(
&
sync_rcu_preempt_exp_wq
);
break
;
}
...
...
@@ -707,7 +733,6 @@ static void rcu_report_exp_rnp(struct rcu_state *rsp, struct rcu_node *rnp)
raw_spin_lock
(
&
rnp
->
lock
);
/* irqs already disabled */
rnp
->
expmask
&=
~
mask
;
}
raw_spin_unlock_irqrestore
(
&
rnp
->
lock
,
flags
);
}
/*
...
...
@@ -1174,7 +1199,7 @@ static int rcu_boost(struct rcu_node *rnp)
t
=
container_of
(
tb
,
struct
task_struct
,
rcu_node_entry
);
rt_mutex_init_proxy_locked
(
&
mtx
,
t
);
t
->
rcu_boost_mutex
=
&
mtx
;
t
->
rcu_
read_unlock_special
|=
RCU_READ_UNLOCK_BOOSTED
;
t
->
rcu_
boosted
=
1
;
raw_spin_unlock_irqrestore
(
&
rnp
->
lock
,
flags
);
rt_mutex_lock
(
&
mtx
);
/* Side effect: boosts task t's priority. */
rt_mutex_unlock
(
&
mtx
);
/* Keep lockdep happy. */
...
...
@@ -1532,7 +1557,7 @@ static int __cpuinit rcu_spawn_one_cpu_kthread(int cpu)
struct
sched_param
sp
;
struct
task_struct
*
t
;
if
(
!
rcu_
kthreads_spawnabl
e
||
if
(
!
rcu_
scheduler_fully_activ
e
||
per_cpu
(
rcu_cpu_kthread_task
,
cpu
)
!=
NULL
)
return
0
;
t
=
kthread_create
(
rcu_cpu_kthread
,
(
void
*
)(
long
)
cpu
,
"rcuc%d"
,
cpu
);
...
...
@@ -1639,7 +1664,7 @@ static int __cpuinit rcu_spawn_one_node_kthread(struct rcu_state *rsp,
struct
sched_param
sp
;
struct
task_struct
*
t
;
if
(
!
rcu_
kthreads_spawnabl
e
||
if
(
!
rcu_
scheduler_fully_activ
e
||
rnp
->
qsmaskinit
==
0
)
return
0
;
if
(
rnp
->
node_kthread_task
==
NULL
)
{
...
...
@@ -1665,7 +1690,7 @@ static int __init rcu_spawn_kthreads(void)
int
cpu
;
struct
rcu_node
*
rnp
;
rcu_
kthreads_spawnabl
e
=
1
;
rcu_
scheduler_fully_activ
e
=
1
;
for_each_possible_cpu
(
cpu
)
{
per_cpu
(
rcu_cpu_has_work
,
cpu
)
=
0
;
if
(
cpu_online
(
cpu
))
...
...
@@ -1687,7 +1712,7 @@ static void __cpuinit rcu_prepare_kthreads(int cpu)
struct
rcu_node
*
rnp
=
rdp
->
mynode
;
/* Fire up the incoming CPU's kthread and leaf rcu_node kthread. */
if
(
rcu_
kthreads_spawnabl
e
)
{
if
(
rcu_
scheduler_fully_activ
e
)
{
(
void
)
rcu_spawn_one_cpu_kthread
(
cpu
);
if
(
rnp
->
node_kthread_task
==
NULL
)
(
void
)
rcu_spawn_one_node_kthread
(
rcu_state
,
rnp
);
...
...
@@ -1726,6 +1751,13 @@ static void rcu_cpu_kthread_setrt(int cpu, int to_rt)
{
}
static
int
__init
rcu_scheduler_really_started
(
void
)
{
rcu_scheduler_fully_active
=
1
;
return
0
;
}
early_initcall
(
rcu_scheduler_really_started
);
static
void
__cpuinit
rcu_prepare_kthreads
(
int
cpu
)
{
}
...
...
This diff is collapsed.
Click to expand it.
kernel/sched.c
浏览文件 @
df797679
...
...
@@ -2544,13 +2544,9 @@ static int ttwu_remote(struct task_struct *p, int wake_flags)
}
#ifdef CONFIG_SMP
static
void
sched_ttwu_
pending
(
void
)
static
void
sched_ttwu_
do_pending
(
struct
task_struct
*
list
)
{
struct
rq
*
rq
=
this_rq
();
struct
task_struct
*
list
=
xchg
(
&
rq
->
wake_list
,
NULL
);
if
(
!
list
)
return
;
raw_spin_lock
(
&
rq
->
lock
);
...
...
@@ -2563,9 +2559,45 @@ static void sched_ttwu_pending(void)
raw_spin_unlock
(
&
rq
->
lock
);
}
#ifdef CONFIG_HOTPLUG_CPU
static
void
sched_ttwu_pending
(
void
)
{
struct
rq
*
rq
=
this_rq
();
struct
task_struct
*
list
=
xchg
(
&
rq
->
wake_list
,
NULL
);
if
(
!
list
)
return
;
sched_ttwu_do_pending
(
list
);
}
#endif
/* CONFIG_HOTPLUG_CPU */
void
scheduler_ipi
(
void
)
{
sched_ttwu_pending
();
struct
rq
*
rq
=
this_rq
();
struct
task_struct
*
list
=
xchg
(
&
rq
->
wake_list
,
NULL
);
if
(
!
list
)
return
;
/*
* Not all reschedule IPI handlers call irq_enter/irq_exit, since
* traditionally all their work was done from the interrupt return
* path. Now that we actually do some work, we need to make sure
* we do call them.
*
* Some archs already do call them, luckily irq_enter/exit nest
* properly.
*
* Arguably we should visit all archs and update all handlers,
* however a fair share of IPIs are still resched only so this would
* somewhat pessimize the simple resched case.
*/
irq_enter
();
sched_ttwu_do_pending
(
list
);
irq_exit
();
}
static
void
ttwu_queue_remote
(
struct
task_struct
*
p
,
int
cpu
)
...
...
@@ -6557,7 +6589,7 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
break
;
}
if
(
!
group
->
cpu_
power
)
{
if
(
!
group
->
sgp
->
power
)
{
printk
(
KERN_CONT
"
\n
"
);
printk
(
KERN_ERR
"ERROR: domain->cpu_power not "
"set
\n
"
);
...
...
@@ -6581,9 +6613,9 @@ static int sched_domain_debug_one(struct sched_domain *sd, int cpu, int level,
cpulist_scnprintf
(
str
,
sizeof
(
str
),
sched_group_cpus
(
group
));
printk
(
KERN_CONT
" %s"
,
str
);
if
(
group
->
cpu_
power
!=
SCHED_POWER_SCALE
)
{
if
(
group
->
sgp
->
power
!=
SCHED_POWER_SCALE
)
{
printk
(
KERN_CONT
" (cpu_power = %d)"
,
group
->
cpu_
power
);
group
->
sgp
->
power
);
}
group
=
group
->
next
;
...
...
@@ -6774,11 +6806,39 @@ static struct root_domain *alloc_rootdomain(void)
return
rd
;
}
static
void
free_sched_groups
(
struct
sched_group
*
sg
,
int
free_sgp
)
{
struct
sched_group
*
tmp
,
*
first
;
if
(
!
sg
)
return
;
first
=
sg
;
do
{
tmp
=
sg
->
next
;
if
(
free_sgp
&&
atomic_dec_and_test
(
&
sg
->
sgp
->
ref
))
kfree
(
sg
->
sgp
);
kfree
(
sg
);
sg
=
tmp
;
}
while
(
sg
!=
first
);
}
static
void
free_sched_domain
(
struct
rcu_head
*
rcu
)
{
struct
sched_domain
*
sd
=
container_of
(
rcu
,
struct
sched_domain
,
rcu
);
if
(
atomic_dec_and_test
(
&
sd
->
groups
->
ref
))
/*
* If its an overlapping domain it has private groups, iterate and
* nuke them all.
*/
if
(
sd
->
flags
&
SD_OVERLAP
)
{
free_sched_groups
(
sd
->
groups
,
1
);
}
else
if
(
atomic_dec_and_test
(
&
sd
->
groups
->
ref
))
{
kfree
(
sd
->
groups
->
sgp
);
kfree
(
sd
->
groups
);
}
kfree
(
sd
);
}
...
...
@@ -6945,6 +7005,7 @@ int sched_smt_power_savings = 0, sched_mc_power_savings = 0;
struct
sd_data
{
struct
sched_domain
**
__percpu
sd
;
struct
sched_group
**
__percpu
sg
;
struct
sched_group_power
**
__percpu
sgp
;
};
struct
s_data
{
...
...
@@ -6964,15 +7025,73 @@ struct sched_domain_topology_level;
typedef
struct
sched_domain
*
(
*
sched_domain_init_f
)(
struct
sched_domain_topology_level
*
tl
,
int
cpu
);
typedef
const
struct
cpumask
*
(
*
sched_domain_mask_f
)(
int
cpu
);
#define SDTL_OVERLAP 0x01
struct
sched_domain_topology_level
{
sched_domain_init_f
init
;
sched_domain_mask_f
mask
;
int
flags
;
struct
sd_data
data
;
};
/*
* Assumes the sched_domain tree is fully constructed
*/
static
int
build_overlap_sched_groups
(
struct
sched_domain
*
sd
,
int
cpu
)
{
struct
sched_group
*
first
=
NULL
,
*
last
=
NULL
,
*
groups
=
NULL
,
*
sg
;
const
struct
cpumask
*
span
=
sched_domain_span
(
sd
);
struct
cpumask
*
covered
=
sched_domains_tmpmask
;
struct
sd_data
*
sdd
=
sd
->
private
;
struct
sched_domain
*
child
;
int
i
;
cpumask_clear
(
covered
);
for_each_cpu
(
i
,
span
)
{
struct
cpumask
*
sg_span
;
if
(
cpumask_test_cpu
(
i
,
covered
))
continue
;
sg
=
kzalloc_node
(
sizeof
(
struct
sched_group
)
+
cpumask_size
(),
GFP_KERNEL
,
cpu_to_node
(
i
));
if
(
!
sg
)
goto
fail
;
sg_span
=
sched_group_cpus
(
sg
);
child
=
*
per_cpu_ptr
(
sdd
->
sd
,
i
);
if
(
child
->
child
)
{
child
=
child
->
child
;
cpumask_copy
(
sg_span
,
sched_domain_span
(
child
));
}
else
cpumask_set_cpu
(
i
,
sg_span
);
cpumask_or
(
covered
,
covered
,
sg_span
);
sg
->
sgp
=
*
per_cpu_ptr
(
sdd
->
sgp
,
cpumask_first
(
sg_span
));
atomic_inc
(
&
sg
->
sgp
->
ref
);
if
(
cpumask_test_cpu
(
cpu
,
sg_span
))
groups
=
sg
;
if
(
!
first
)
first
=
sg
;
if
(
last
)
last
->
next
=
sg
;
last
=
sg
;
last
->
next
=
first
;
}
sd
->
groups
=
groups
;
return
0
;
fail:
free_sched_groups
(
first
,
0
);
return
-
ENOMEM
;
}
static
int
get_group
(
int
cpu
,
struct
sd_data
*
sdd
,
struct
sched_group
**
sg
)
{
struct
sched_domain
*
sd
=
*
per_cpu_ptr
(
sdd
->
sd
,
cpu
);
...
...
@@ -6981,24 +7100,24 @@ static int get_group(int cpu, struct sd_data *sdd, struct sched_group **sg)
if
(
child
)
cpu
=
cpumask_first
(
sched_domain_span
(
child
));
if
(
sg
)
if
(
sg
)
{
*
sg
=
*
per_cpu_ptr
(
sdd
->
sg
,
cpu
);
(
*
sg
)
->
sgp
=
*
per_cpu_ptr
(
sdd
->
sgp
,
cpu
);
atomic_set
(
&
(
*
sg
)
->
sgp
->
ref
,
1
);
/* for claim_allocations */
}
return
cpu
;
}
/*
* build_sched_groups takes the cpumask we wish to span, and a pointer
* to a function which identifies what group(along with sched group) a CPU
* belongs to. The return value of group_fn must be a >= 0 and < nr_cpu_ids
* (due to the fact that we keep track of groups covered with a struct cpumask).
*
* build_sched_groups will build a circular linked list of the groups
* covered by the given span, and will set each group's ->cpumask correctly,
* and ->cpu_power to 0.
*
* Assumes the sched_domain tree is fully constructed
*/
static
void
build_sched_groups
(
struct
sched_domain
*
sd
)
static
int
build_sched_groups
(
struct
sched_domain
*
sd
,
int
cpu
)
{
struct
sched_group
*
first
=
NULL
,
*
last
=
NULL
;
struct
sd_data
*
sdd
=
sd
->
private
;
...
...
@@ -7006,6 +7125,12 @@ build_sched_groups(struct sched_domain *sd)
struct
cpumask
*
covered
;
int
i
;
get_group
(
cpu
,
sdd
,
&
sd
->
groups
);
atomic_inc
(
&
sd
->
groups
->
ref
);
if
(
cpu
!=
cpumask_first
(
sched_domain_span
(
sd
)))
return
0
;
lockdep_assert_held
(
&
sched_domains_mutex
);
covered
=
sched_domains_tmpmask
;
...
...
@@ -7020,7 +7145,7 @@ build_sched_groups(struct sched_domain *sd)
continue
;
cpumask_clear
(
sched_group_cpus
(
sg
));
sg
->
cpu_
power
=
0
;
sg
->
sgp
->
power
=
0
;
for_each_cpu
(
j
,
span
)
{
if
(
get_group
(
j
,
sdd
,
NULL
)
!=
group
)
...
...
@@ -7037,6 +7162,8 @@ build_sched_groups(struct sched_domain *sd)
last
=
sg
;
}
last
->
next
=
first
;
return
0
;
}
/*
...
...
@@ -7051,12 +7178,17 @@ build_sched_groups(struct sched_domain *sd)
*/
static
void
init_sched_groups_power
(
int
cpu
,
struct
sched_domain
*
sd
)
{
WARN_ON
(
!
sd
||
!
sd
->
groups
)
;
struct
sched_group
*
sg
=
sd
->
groups
;
if
(
cpu
!=
group_first_cpu
(
sd
->
groups
))
return
;
WARN_ON
(
!
sd
||
!
sg
);
do
{
sg
->
group_weight
=
cpumask_weight
(
sched_group_cpus
(
sg
));
sg
=
sg
->
next
;
}
while
(
sg
!=
sd
->
groups
);
sd
->
groups
->
group_weight
=
cpumask_weight
(
sched_group_cpus
(
sd
->
groups
));
if
(
cpu
!=
group_first_cpu
(
sg
))
return
;
update_group_power
(
sd
,
cpu
);
}
...
...
@@ -7177,15 +7309,15 @@ static enum s_alloc __visit_domain_allocation_hell(struct s_data *d,
static
void
claim_allocations
(
int
cpu
,
struct
sched_domain
*
sd
)
{
struct
sd_data
*
sdd
=
sd
->
private
;
struct
sched_group
*
sg
=
sd
->
groups
;
WARN_ON_ONCE
(
*
per_cpu_ptr
(
sdd
->
sd
,
cpu
)
!=
sd
);
*
per_cpu_ptr
(
sdd
->
sd
,
cpu
)
=
NULL
;
if
(
cpu
==
cpumask_first
(
sched_group_cpus
(
sg
)))
{
WARN_ON_ONCE
(
*
per_cpu_ptr
(
sdd
->
sg
,
cpu
)
!=
sg
);
if
(
atomic_read
(
&
(
*
per_cpu_ptr
(
sdd
->
sg
,
cpu
))
->
ref
))
*
per_cpu_ptr
(
sdd
->
sg
,
cpu
)
=
NULL
;
}
if
(
atomic_read
(
&
(
*
per_cpu_ptr
(
sdd
->
sgp
,
cpu
))
->
ref
))
*
per_cpu_ptr
(
sdd
->
sgp
,
cpu
)
=
NULL
;
}
#ifdef CONFIG_SCHED_SMT
...
...
@@ -7210,7 +7342,7 @@ static struct sched_domain_topology_level default_topology[] = {
#endif
{
sd_init_CPU
,
cpu_cpu_mask
,
},
#ifdef CONFIG_NUMA
{
sd_init_NODE
,
cpu_node_mask
,
},
{
sd_init_NODE
,
cpu_node_mask
,
SDTL_OVERLAP
,
},
{
sd_init_ALLNODES
,
cpu_allnodes_mask
,
},
#endif
{
NULL
,
},
...
...
@@ -7234,9 +7366,14 @@ static int __sdt_alloc(const struct cpumask *cpu_map)
if
(
!
sdd
->
sg
)
return
-
ENOMEM
;
sdd
->
sgp
=
alloc_percpu
(
struct
sched_group_power
*
);
if
(
!
sdd
->
sgp
)
return
-
ENOMEM
;
for_each_cpu
(
j
,
cpu_map
)
{
struct
sched_domain
*
sd
;
struct
sched_group
*
sg
;
struct
sched_group_power
*
sgp
;
sd
=
kzalloc_node
(
sizeof
(
struct
sched_domain
)
+
cpumask_size
(),
GFP_KERNEL
,
cpu_to_node
(
j
));
...
...
@@ -7251,6 +7388,13 @@ static int __sdt_alloc(const struct cpumask *cpu_map)
return
-
ENOMEM
;
*
per_cpu_ptr
(
sdd
->
sg
,
j
)
=
sg
;
sgp
=
kzalloc_node
(
sizeof
(
struct
sched_group_power
),
GFP_KERNEL
,
cpu_to_node
(
j
));
if
(
!
sgp
)
return
-
ENOMEM
;
*
per_cpu_ptr
(
sdd
->
sgp
,
j
)
=
sgp
;
}
}
...
...
@@ -7266,11 +7410,15 @@ static void __sdt_free(const struct cpumask *cpu_map)
struct
sd_data
*
sdd
=
&
tl
->
data
;
for_each_cpu
(
j
,
cpu_map
)
{
kfree
(
*
per_cpu_ptr
(
sdd
->
sd
,
j
));
struct
sched_domain
*
sd
=
*
per_cpu_ptr
(
sdd
->
sd
,
j
);
if
(
sd
&&
(
sd
->
flags
&
SD_OVERLAP
))
free_sched_groups
(
sd
->
groups
,
0
);
kfree
(
*
per_cpu_ptr
(
sdd
->
sg
,
j
));
kfree
(
*
per_cpu_ptr
(
sdd
->
sgp
,
j
));
}
free_percpu
(
sdd
->
sd
);
free_percpu
(
sdd
->
sg
);
free_percpu
(
sdd
->
sgp
);
}
}
...
...
@@ -7316,8 +7464,13 @@ static int build_sched_domains(const struct cpumask *cpu_map,
struct
sched_domain_topology_level
*
tl
;
sd
=
NULL
;
for
(
tl
=
sched_domain_topology
;
tl
->
init
;
tl
++
)
for
(
tl
=
sched_domain_topology
;
tl
->
init
;
tl
++
)
{
sd
=
build_sched_domain
(
tl
,
&
d
,
cpu_map
,
attr
,
sd
,
i
);
if
(
tl
->
flags
&
SDTL_OVERLAP
||
sched_feat
(
FORCE_SD_OVERLAP
))
sd
->
flags
|=
SD_OVERLAP
;
if
(
cpumask_equal
(
cpu_map
,
sched_domain_span
(
sd
)))
break
;
}
while
(
sd
->
child
)
sd
=
sd
->
child
;
...
...
@@ -7329,13 +7482,13 @@ static int build_sched_domains(const struct cpumask *cpu_map,
for_each_cpu
(
i
,
cpu_map
)
{
for
(
sd
=
*
per_cpu_ptr
(
d
.
sd
,
i
);
sd
;
sd
=
sd
->
parent
)
{
sd
->
span_weight
=
cpumask_weight
(
sched_domain_span
(
sd
));
get_group
(
i
,
sd
->
private
,
&
sd
->
groups
);
atomic_inc
(
&
sd
->
groups
->
ref
);
if
(
i
!=
cpumask_first
(
sched_domain_span
(
sd
)))
continue
;
build_sched_groups
(
sd
);
if
(
sd
->
flags
&
SD_OVERLAP
)
{
if
(
build_overlap_sched_groups
(
sd
,
i
))
goto
error
;
}
else
{
if
(
build_sched_groups
(
sd
,
i
))
goto
error
;
}
}
}
...
...
@@ -7757,6 +7910,9 @@ static void init_cfs_rq(struct cfs_rq *cfs_rq, struct rq *rq)
#endif
#endif
cfs_rq
->
min_vruntime
=
(
u64
)(
-
(
1LL
<<
20
));
#ifndef CONFIG_64BIT
cfs_rq
->
min_vruntime_copy
=
cfs_rq
->
min_vruntime
;
#endif
}
static
void
init_rt_rq
(
struct
rt_rq
*
rt_rq
,
struct
rq
*
rq
)
...
...
This diff is collapsed.
Click to expand it.
kernel/sched_fair.c
浏览文件 @
df797679
...
...
@@ -1585,7 +1585,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p,
}
/* Adjust by relative CPU power of the group */
avg_load
=
(
avg_load
*
SCHED_POWER_SCALE
)
/
group
->
cpu_
power
;
avg_load
=
(
avg_load
*
SCHED_POWER_SCALE
)
/
group
->
sgp
->
power
;
if
(
local_group
)
{
this_load
=
avg_load
;
...
...
@@ -2631,7 +2631,7 @@ static void update_cpu_power(struct sched_domain *sd, int cpu)
power
>>=
SCHED_POWER_SHIFT
;
}
sdg
->
cpu_
power_orig
=
power
;
sdg
->
sgp
->
power_orig
=
power
;
if
(
sched_feat
(
ARCH_POWER
))
power
*=
arch_scale_freq_power
(
sd
,
cpu
);
...
...
@@ -2647,7 +2647,7 @@ static void update_cpu_power(struct sched_domain *sd, int cpu)
power
=
1
;
cpu_rq
(
cpu
)
->
cpu_power
=
power
;
sdg
->
cpu_
power
=
power
;
sdg
->
sgp
->
power
=
power
;
}
static
void
update_group_power
(
struct
sched_domain
*
sd
,
int
cpu
)
...
...
@@ -2665,11 +2665,11 @@ static void update_group_power(struct sched_domain *sd, int cpu)
group
=
child
->
groups
;
do
{
power
+=
group
->
cpu_
power
;
power
+=
group
->
sgp
->
power
;
group
=
group
->
next
;
}
while
(
group
!=
child
->
groups
);
sdg
->
cpu_
power
=
power
;
sdg
->
sgp
->
power
=
power
;
}
/*
...
...
@@ -2691,7 +2691,7 @@ fix_small_capacity(struct sched_domain *sd, struct sched_group *group)
/*
* If ~90% of the cpu_power is still there, we're good.
*/
if
(
group
->
cpu_power
*
32
>
group
->
cpu_
power_orig
*
29
)
if
(
group
->
sgp
->
power
*
32
>
group
->
sgp
->
power_orig
*
29
)
return
1
;
return
0
;
...
...
@@ -2771,7 +2771,7 @@ static inline void update_sg_lb_stats(struct sched_domain *sd,
}
/* Adjust by relative CPU power of the group */
sgs
->
avg_load
=
(
sgs
->
group_load
*
SCHED_POWER_SCALE
)
/
group
->
cpu_
power
;
sgs
->
avg_load
=
(
sgs
->
group_load
*
SCHED_POWER_SCALE
)
/
group
->
sgp
->
power
;
/*
* Consider the group unbalanced when the imbalance is larger
...
...
@@ -2788,7 +2788,7 @@ static inline void update_sg_lb_stats(struct sched_domain *sd,
if
((
max_cpu_load
-
min_cpu_load
)
>=
avg_load_per_task
&&
max_nr_running
>
1
)
sgs
->
group_imb
=
1
;
sgs
->
group_capacity
=
DIV_ROUND_CLOSEST
(
group
->
cpu_
power
,
sgs
->
group_capacity
=
DIV_ROUND_CLOSEST
(
group
->
sgp
->
power
,
SCHED_POWER_SCALE
);
if
(
!
sgs
->
group_capacity
)
sgs
->
group_capacity
=
fix_small_capacity
(
sd
,
group
);
...
...
@@ -2877,7 +2877,7 @@ static inline void update_sd_lb_stats(struct sched_domain *sd, int this_cpu,
return
;
sds
->
total_load
+=
sgs
.
group_load
;
sds
->
total_pwr
+=
sg
->
cpu_
power
;
sds
->
total_pwr
+=
sg
->
sgp
->
power
;
/*
* In case the child domain prefers tasks go to siblings
...
...
@@ -2962,7 +2962,7 @@ static int check_asym_packing(struct sched_domain *sd,
if
(
this_cpu
>
busiest_cpu
)
return
0
;
*
imbalance
=
DIV_ROUND_CLOSEST
(
sds
->
max_load
*
sds
->
busiest
->
cpu_
power
,
*
imbalance
=
DIV_ROUND_CLOSEST
(
sds
->
max_load
*
sds
->
busiest
->
sgp
->
power
,
SCHED_POWER_SCALE
);
return
1
;
}
...
...
@@ -2993,7 +2993,7 @@ static inline void fix_small_imbalance(struct sd_lb_stats *sds,
scaled_busy_load_per_task
=
sds
->
busiest_load_per_task
*
SCHED_POWER_SCALE
;
scaled_busy_load_per_task
/=
sds
->
busiest
->
cpu_
power
;
scaled_busy_load_per_task
/=
sds
->
busiest
->
sgp
->
power
;
if
(
sds
->
max_load
-
sds
->
this_load
+
scaled_busy_load_per_task
>=
(
scaled_busy_load_per_task
*
imbn
))
{
...
...
@@ -3007,28 +3007,28 @@ static inline void fix_small_imbalance(struct sd_lb_stats *sds,
* moving them.
*/
pwr_now
+=
sds
->
busiest
->
cpu_
power
*
pwr_now
+=
sds
->
busiest
->
sgp
->
power
*
min
(
sds
->
busiest_load_per_task
,
sds
->
max_load
);
pwr_now
+=
sds
->
this
->
cpu_
power
*
pwr_now
+=
sds
->
this
->
sgp
->
power
*
min
(
sds
->
this_load_per_task
,
sds
->
this_load
);
pwr_now
/=
SCHED_POWER_SCALE
;
/* Amount of load we'd subtract */
tmp
=
(
sds
->
busiest_load_per_task
*
SCHED_POWER_SCALE
)
/
sds
->
busiest
->
cpu_
power
;
sds
->
busiest
->
sgp
->
power
;
if
(
sds
->
max_load
>
tmp
)
pwr_move
+=
sds
->
busiest
->
cpu_
power
*
pwr_move
+=
sds
->
busiest
->
sgp
->
power
*
min
(
sds
->
busiest_load_per_task
,
sds
->
max_load
-
tmp
);
/* Amount of load we'd add */
if
(
sds
->
max_load
*
sds
->
busiest
->
cpu_
power
<
if
(
sds
->
max_load
*
sds
->
busiest
->
sgp
->
power
<
sds
->
busiest_load_per_task
*
SCHED_POWER_SCALE
)
tmp
=
(
sds
->
max_load
*
sds
->
busiest
->
cpu_
power
)
/
sds
->
this
->
cpu_
power
;
tmp
=
(
sds
->
max_load
*
sds
->
busiest
->
sgp
->
power
)
/
sds
->
this
->
sgp
->
power
;
else
tmp
=
(
sds
->
busiest_load_per_task
*
SCHED_POWER_SCALE
)
/
sds
->
this
->
cpu_
power
;
pwr_move
+=
sds
->
this
->
cpu_
power
*
sds
->
this
->
sgp
->
power
;
pwr_move
+=
sds
->
this
->
sgp
->
power
*
min
(
sds
->
this_load_per_task
,
sds
->
this_load
+
tmp
);
pwr_move
/=
SCHED_POWER_SCALE
;
...
...
@@ -3074,7 +3074,7 @@ static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu,
load_above_capacity
*=
(
SCHED_LOAD_SCALE
*
SCHED_POWER_SCALE
);
load_above_capacity
/=
sds
->
busiest
->
cpu_
power
;
load_above_capacity
/=
sds
->
busiest
->
sgp
->
power
;
}
/*
...
...
@@ -3090,8 +3090,8 @@ static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu,
max_pull
=
min
(
sds
->
max_load
-
sds
->
avg_load
,
load_above_capacity
);
/* How much load to actually move to equalise the imbalance */
*
imbalance
=
min
(
max_pull
*
sds
->
busiest
->
cpu_
power
,
(
sds
->
avg_load
-
sds
->
this_load
)
*
sds
->
this
->
cpu_
power
)
*
imbalance
=
min
(
max_pull
*
sds
->
busiest
->
sgp
->
power
,
(
sds
->
avg_load
-
sds
->
this_load
)
*
sds
->
this
->
sgp
->
power
)
/
SCHED_POWER_SCALE
;
/*
...
...
This diff is collapsed.
Click to expand it.
kernel/sched_features.h
浏览文件 @
df797679
...
...
@@ -70,3 +70,5 @@ SCHED_FEAT(NONIRQ_POWER, 1)
* using the scheduler IPI. Reduces rq->lock contention/bounces.
*/
SCHED_FEAT
(
TTWU_QUEUE
,
1
)
SCHED_FEAT
(
FORCE_SD_OVERLAP
,
0
)
This diff is collapsed.
Click to expand it.
kernel/signal.c
浏览文件 @
df797679
...
...
@@ -1178,18 +1178,25 @@ struct sighand_struct *__lock_task_sighand(struct task_struct *tsk,
{
struct
sighand_struct
*
sighand
;
rcu_read_lock
();
for
(;;)
{
local_irq_save
(
*
flags
);
rcu_read_lock
();
sighand
=
rcu_dereference
(
tsk
->
sighand
);
if
(
unlikely
(
sighand
==
NULL
))
if
(
unlikely
(
sighand
==
NULL
))
{
rcu_read_unlock
();
local_irq_restore
(
*
flags
);
break
;
}
spin_lock_irqsave
(
&
sighand
->
siglock
,
*
flags
);
if
(
likely
(
sighand
==
tsk
->
sighand
))
spin_lock
(
&
sighand
->
siglock
);
if
(
likely
(
sighand
==
tsk
->
sighand
))
{
rcu_read_unlock
();
break
;
spin_unlock_irqrestore
(
&
sighand
->
siglock
,
*
flags
);
}
spin_unlock
(
&
sighand
->
siglock
);
rcu_read_unlock
();
local_irq_restore
(
*
flags
);
}
rcu_read_unlock
();
return
sighand
;
}
...
...
This diff is collapsed.
Click to expand it.
kernel/softirq.c
浏览文件 @
df797679
...
...
@@ -315,16 +315,24 @@ static inline void invoke_softirq(void)
{
if
(
!
force_irqthreads
)
__do_softirq
();
else
else
{
__local_bh_disable
((
unsigned
long
)
__builtin_return_address
(
0
),
SOFTIRQ_OFFSET
);
wakeup_softirqd
();
__local_bh_enable
(
SOFTIRQ_OFFSET
);
}
}
#else
static
inline
void
invoke_softirq
(
void
)
{
if
(
!
force_irqthreads
)
do_softirq
();
else
else
{
__local_bh_disable
((
unsigned
long
)
__builtin_return_address
(
0
),
SOFTIRQ_OFFSET
);
wakeup_softirqd
();
__local_bh_enable
(
SOFTIRQ_OFFSET
);
}
}
#endif
...
...
This diff is collapsed.
Click to expand it.
mm/vmscan.c
浏览文件 @
df797679
...
...
@@ -2310,7 +2310,8 @@ static bool pgdat_balanced(pg_data_t *pgdat, unsigned long balanced_pages,
for
(
i
=
0
;
i
<=
classzone_idx
;
i
++
)
present_pages
+=
pgdat
->
node_zones
[
i
].
present_pages
;
return
balanced_pages
>
(
present_pages
>>
2
);
/* A special case here: if zone has no page, we think it's balanced */
return
balanced_pages
>=
(
present_pages
>>
2
);
}
/* is kswapd sleeping prematurely? */
...
...
This diff is collapsed.
Click to expand it.
net/8021q/vlan_dev.c
浏览文件 @
df797679
...
...
@@ -528,7 +528,11 @@ static int vlan_dev_init(struct net_device *dev)
(
1
<<
__LINK_STATE_DORMANT
)))
|
(
1
<<
__LINK_STATE_PRESENT
);
dev
->
hw_features
=
NETIF_F_ALL_TX_OFFLOADS
;
dev
->
hw_features
=
NETIF_F_ALL_CSUM
|
NETIF_F_SG
|
NETIF_F_FRAGLIST
|
NETIF_F_ALL_TSO
|
NETIF_F_HIGHDMA
|
NETIF_F_SCTP_CSUM
|
NETIF_F_ALL_FCOE
;
dev
->
features
|=
real_dev
->
vlan_features
|
NETIF_F_LLTX
;
dev
->
gso_max_size
=
real_dev
->
gso_max_size
;
...
...
This diff is collapsed.
Click to expand it.
net/bluetooth/hci_conn.c
浏览文件 @
df797679
...
...
@@ -393,6 +393,9 @@ int hci_conn_del(struct hci_conn *conn)
hci_dev_put
(
hdev
);
if
(
conn
->
handle
==
0
)
kfree
(
conn
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
net/bluetooth/hidp/core.c
浏览文件 @
df797679
...
...
@@ -464,7 +464,8 @@ static void hidp_idle_timeout(unsigned long arg)
{
struct
hidp_session
*
session
=
(
struct
hidp_session
*
)
arg
;
kthread_stop
(
session
->
task
);
atomic_inc
(
&
session
->
terminate
);
wake_up_process
(
session
->
task
);
}
static
void
hidp_set_timer
(
struct
hidp_session
*
session
)
...
...
@@ -535,7 +536,8 @@ static void hidp_process_hid_control(struct hidp_session *session,
skb_queue_purge
(
&
session
->
ctrl_transmit
);
skb_queue_purge
(
&
session
->
intr_transmit
);
kthread_stop
(
session
->
task
);
atomic_inc
(
&
session
->
terminate
);
wake_up_process
(
current
);
}
}
...
...
@@ -706,9 +708,8 @@ static int hidp_session(void *arg)
add_wait_queue
(
sk_sleep
(
intr_sk
),
&
intr_wait
);
session
->
waiting_for_startup
=
0
;
wake_up_interruptible
(
&
session
->
startup_queue
);
while
(
!
kthread_should_stop
())
{
set_current_state
(
TASK_INTERRUPTIBLE
);
set_current_state
(
TASK_INTERRUPTIBLE
);
while
(
!
atomic_read
(
&
session
->
terminate
))
{
if
(
ctrl_sk
->
sk_state
!=
BT_CONNECTED
||
intr_sk
->
sk_state
!=
BT_CONNECTED
)
break
;
...
...
@@ -726,6 +727,7 @@ static int hidp_session(void *arg)
hidp_process_transmit
(
session
);
schedule
();
set_current_state
(
TASK_INTERRUPTIBLE
);
}
set_current_state
(
TASK_RUNNING
);
remove_wait_queue
(
sk_sleep
(
intr_sk
),
&
intr_wait
);
...
...
@@ -1060,7 +1062,8 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,
err_add_device:
hid_destroy_device
(
session
->
hid
);
session
->
hid
=
NULL
;
kthread_stop
(
session
->
task
);
atomic_inc
(
&
session
->
terminate
);
wake_up_process
(
session
->
task
);
unlink:
hidp_del_timer
(
session
);
...
...
@@ -1111,7 +1114,8 @@ int hidp_del_connection(struct hidp_conndel_req *req)
skb_queue_purge
(
&
session
->
ctrl_transmit
);
skb_queue_purge
(
&
session
->
intr_transmit
);
kthread_stop
(
session
->
task
);
atomic_inc
(
&
session
->
terminate
);
wake_up_process
(
session
->
task
);
}
}
else
err
=
-
ENOENT
;
...
...
This diff is collapsed.
Click to expand it.
net/bluetooth/hidp/hidp.h
浏览文件 @
df797679
...
...
@@ -142,6 +142,7 @@ struct hidp_session {
uint
ctrl_mtu
;
uint
intr_mtu
;
atomic_t
terminate
;
struct
task_struct
*
task
;
unsigned
char
keys
[
8
];
...
...
This diff is collapsed.
Click to expand it.
net/bluetooth/l2cap_core.c
浏览文件 @
df797679
...
...
@@ -620,7 +620,8 @@ static void l2cap_conn_start(struct l2cap_conn *conn)
struct
sock
*
parent
=
bt_sk
(
sk
)
->
parent
;
rsp
.
result
=
cpu_to_le16
(
L2CAP_CR_PEND
);
rsp
.
status
=
cpu_to_le16
(
L2CAP_CS_AUTHOR_PEND
);
parent
->
sk_data_ready
(
parent
,
0
);
if
(
parent
)
parent
->
sk_data_ready
(
parent
,
0
);
}
else
{
sk
->
sk_state
=
BT_CONFIG
;
...
...
@@ -2323,7 +2324,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
sk
=
chan
->
sk
;
if
(
sk
->
sk_state
!=
BT_CONFIG
)
{
if
(
sk
->
sk_state
!=
BT_CONFIG
&&
sk
->
sk_state
!=
BT_CONNECT2
)
{
struct
l2cap_cmd_rej
rej
;
rej
.
reason
=
cpu_to_le16
(
0x0002
);
...
...
@@ -2334,7 +2335,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
/* Reject if config buffer is too small. */
len
=
cmd_len
-
sizeof
(
*
req
);
if
(
chan
->
conf_len
+
len
>
sizeof
(
chan
->
conf_req
))
{
if
(
len
<
0
||
chan
->
conf_len
+
len
>
sizeof
(
chan
->
conf_req
))
{
l2cap_send_cmd
(
conn
,
cmd
->
ident
,
L2CAP_CONF_RSP
,
l2cap_build_conf_rsp
(
chan
,
rsp
,
L2CAP_CONF_REJECT
,
flags
),
rsp
);
...
...
@@ -4009,7 +4010,8 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
struct
sock
*
parent
=
bt_sk
(
sk
)
->
parent
;
res
=
L2CAP_CR_PEND
;
stat
=
L2CAP_CS_AUTHOR_PEND
;
parent
->
sk_data_ready
(
parent
,
0
);
if
(
parent
)
parent
->
sk_data_ready
(
parent
,
0
);
}
else
{
sk
->
sk_state
=
BT_CONFIG
;
res
=
L2CAP_CR_SUCCESS
;
...
...
This diff is collapsed.
Click to expand it.
net/ceph/ceph_fs.c
浏览文件 @
df797679
...
...
@@ -36,16 +36,19 @@ int ceph_flags_to_mode(int flags)
if
((
flags
&
O_DIRECTORY
)
==
O_DIRECTORY
)
return
CEPH_FILE_MODE_PIN
;
#endif
if
((
flags
&
O_APPEND
)
==
O_APPEND
)
flags
|=
O_WRONLY
;
if
((
flags
&
O_ACCMODE
)
==
O_RDWR
)
mode
=
CEPH_FILE_MODE_RDWR
;
else
if
((
flags
&
O_ACCMODE
)
==
O_WRONLY
)
switch
(
flags
&
O_ACCMODE
)
{
case
O_WRONLY
:
mode
=
CEPH_FILE_MODE_WR
;
else
break
;
case
O_RDONLY
:
mode
=
CEPH_FILE_MODE_RD
;
break
;
case
O_RDWR
:
case
O_ACCMODE
:
/* this is what the VFS does */
mode
=
CEPH_FILE_MODE_RDWR
;
break
;
}
#ifdef O_LAZY
if
(
flags
&
O_LAZY
)
mode
|=
CEPH_FILE_MODE_LAZY
;
...
...
This diff is collapsed.
Click to expand it.
net/mac80211/scan.c
浏览文件 @
df797679
...
...
@@ -877,7 +877,8 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
for
(
i
=
0
;
i
<
IEEE80211_NUM_BANDS
;
i
++
)
{
local
->
sched_scan_ies
.
ie
[
i
]
=
kzalloc
(
2
+
IEEE80211_MAX_SSID_LEN
+
local
->
scan_ies_len
,
local
->
scan_ies_len
+
req
->
ie_len
,
GFP_KERNEL
);
if
(
!
local
->
sched_scan_ies
.
ie
[
i
])
{
ret
=
-
ENOMEM
;
...
...
This diff is collapsed.
Click to expand it.
net/mac80211/wpa.c
浏览文件 @
df797679
...
...
@@ -86,6 +86,11 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
struct
sk_buff
*
skb
=
rx
->
skb
;
struct
ieee80211_rx_status
*
status
=
IEEE80211_SKB_RXCB
(
skb
);
struct
ieee80211_hdr
*
hdr
=
(
struct
ieee80211_hdr
*
)
skb
->
data
;
int
queue
=
rx
->
queue
;
/* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */
if
(
rx
->
queue
==
NUM_RX_DATA_QUEUES
-
1
)
queue
=
0
;
/*
* it makes no sense to check for MIC errors on anything other
...
...
@@ -148,8 +153,8 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
update_iv:
/* update IV in key information to be able to detect replays */
rx
->
key
->
u
.
tkip
.
rx
[
rx
->
queue
].
iv32
=
rx
->
tkip_iv32
;
rx
->
key
->
u
.
tkip
.
rx
[
rx
->
queue
].
iv16
=
rx
->
tkip_iv16
;
rx
->
key
->
u
.
tkip
.
rx
[
queue
].
iv32
=
rx
->
tkip_iv32
;
rx
->
key
->
u
.
tkip
.
rx
[
queue
].
iv16
=
rx
->
tkip_iv16
;
return
RX_CONTINUE
;
...
...
@@ -241,6 +246,11 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
struct
ieee80211_key
*
key
=
rx
->
key
;
struct
sk_buff
*
skb
=
rx
->
skb
;
struct
ieee80211_rx_status
*
status
=
IEEE80211_SKB_RXCB
(
skb
);
int
queue
=
rx
->
queue
;
/* otherwise, TKIP is vulnerable to TID 0 vs. non-QoS replays */
if
(
rx
->
queue
==
NUM_RX_DATA_QUEUES
-
1
)
queue
=
0
;
hdrlen
=
ieee80211_hdrlen
(
hdr
->
frame_control
);
...
...
@@ -261,7 +271,7 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx)
res
=
ieee80211_tkip_decrypt_data
(
rx
->
local
->
wep_rx_tfm
,
key
,
skb
->
data
+
hdrlen
,
skb
->
len
-
hdrlen
,
rx
->
sta
->
sta
.
addr
,
hdr
->
addr1
,
hwaccel
,
rx
->
queue
,
hdr
->
addr1
,
hwaccel
,
queue
,
&
rx
->
tkip_iv32
,
&
rx
->
tkip_iv16
);
if
(
res
!=
TKIP_DECRYPT_OK
)
...
...
This diff is collapsed.
Click to expand it.
net/sctp/output.c
浏览文件 @
df797679
...
...
@@ -500,23 +500,20 @@ int sctp_packet_transmit(struct sctp_packet *packet)
* Note: Adler-32 is no longer applicable, as has been replaced
* by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>.
*/
if
(
!
sctp_checksum_disable
&&
!
(
dst
->
dev
->
features
&
(
NETIF_F_NO_CSUM
|
NETIF_F_SCTP_CSUM
)
))
{
__u32
crc32
=
sctp_start_cksum
((
__u8
*
)
sh
,
cksum_buf_len
);
if
(
!
sctp_checksum_disable
)
{
if
(
!
(
dst
->
dev
->
features
&
NETIF_F_SCTP_CSUM
))
{
__u32
crc32
=
sctp_start_cksum
((
__u8
*
)
sh
,
cksum_buf_len
);
/* 3) Put the resultant value into the checksum field in the
* common header, and leave the rest of the bits unchanged.
*/
sh
->
checksum
=
sctp_end_cksum
(
crc32
);
}
else
{
if
(
dst
->
dev
->
features
&
NETIF_F_SCTP_CSUM
)
{
/* 3) Put the resultant value into the checksum field in the
* common header, and leave the rest of the bits unchanged.
*/
sh
->
checksum
=
sctp_end_cksum
(
crc32
);
}
else
{
/* no need to seed pseudo checksum for SCTP */
nskb
->
ip_summed
=
CHECKSUM_PARTIAL
;
nskb
->
csum_start
=
(
skb_transport_header
(
nskb
)
-
nskb
->
head
);
nskb
->
csum_offset
=
offsetof
(
struct
sctphdr
,
checksum
);
}
else
{
nskb
->
ip_summed
=
CHECKSUM_UNNECESSARY
;
}
}
...
...
This diff is collapsed.
Click to expand it.
net/sctp/outqueue.c
浏览文件 @
df797679
...
...
@@ -1582,6 +1582,8 @@ static void sctp_check_transmitted(struct sctp_outq *q,
#endif
/* SCTP_DEBUG */
if
(
transport
)
{
if
(
bytes_acked
)
{
struct
sctp_association
*
asoc
=
transport
->
asoc
;
/* We may have counted DATA that was migrated
* to this transport due to DEL-IP operation.
* Subtract those bytes, since the were never
...
...
@@ -1600,6 +1602,17 @@ static void sctp_check_transmitted(struct sctp_outq *q,
transport
->
error_count
=
0
;
transport
->
asoc
->
overall_error_count
=
0
;
/*
* While in SHUTDOWN PENDING, we may have started
* the T5 shutdown guard timer after reaching the
* retransmission limit. Stop that timer as soon
* as the receiver acknowledged any data.
*/
if
(
asoc
->
state
==
SCTP_STATE_SHUTDOWN_PENDING
&&
del_timer
(
&
asoc
->
timers
[
SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD
]))
sctp_association_put
(
asoc
);
/* Mark the destination transport address as
* active if it is not so marked.
*/
...
...
@@ -1629,10 +1642,15 @@ static void sctp_check_transmitted(struct sctp_outq *q,
* A sender is doing zero window probing when the
* receiver's advertised window is zero, and there is
* only one data chunk in flight to the receiver.
*
* Allow the association to timeout while in SHUTDOWN
* PENDING or SHUTDOWN RECEIVED in case the receiver
* stays in zero window mode forever.
*/
if
(
!
q
->
asoc
->
peer
.
rwnd
&&
!
list_empty
(
&
tlist
)
&&
(
sack_ctsn
+
2
==
q
->
asoc
->
next_tsn
))
{
(
sack_ctsn
+
2
==
q
->
asoc
->
next_tsn
)
&&
q
->
asoc
->
state
<
SCTP_STATE_SHUTDOWN_PENDING
)
{
SCTP_DEBUG_PRINTK
(
"%s: SACK received for zero "
"window probe: %u
\n
"
,
__func__
,
sack_ctsn
);
...
...
This diff is collapsed.
Click to expand it.
net/sctp/sm_sideeffect.c
浏览文件 @
df797679
...
...
@@ -670,10 +670,19 @@ static void sctp_cmd_transport_on(sctp_cmd_seq_t *cmds,
/* 8.3 Upon the receipt of the HEARTBEAT ACK, the sender of the
* HEARTBEAT should clear the error counter of the destination
* transport address to which the HEARTBEAT was sent.
* The association's overall error count is also cleared.
*/
t
->
error_count
=
0
;
t
->
asoc
->
overall_error_count
=
0
;
/*
* Although RFC4960 specifies that the overall error count must
* be cleared when a HEARTBEAT ACK is received, we make an
* exception while in SHUTDOWN PENDING. If the peer keeps its
* window shut forever, we may never be able to transmit our
* outstanding data and rely on the retransmission limit be reached
* to shutdown the association.
*/
if
(
t
->
asoc
->
state
!=
SCTP_STATE_SHUTDOWN_PENDING
)
t
->
asoc
->
overall_error_count
=
0
;
/* Clear the hb_sent flag to signal that we had a good
* acknowledgement.
...
...
@@ -1437,6 +1446,13 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
sctp_cmd_setup_t2
(
commands
,
asoc
,
cmd
->
obj
.
ptr
);
break
;
case
SCTP_CMD_TIMER_START_ONCE
:
timer
=
&
asoc
->
timers
[
cmd
->
obj
.
to
];
if
(
timer_pending
(
timer
))
break
;
/* fall through */
case
SCTP_CMD_TIMER_START
:
timer
=
&
asoc
->
timers
[
cmd
->
obj
.
to
];
timeout
=
asoc
->
timeouts
[
cmd
->
obj
.
to
];
...
...
This diff is collapsed.
Click to expand it.
net/sctp/sm_statefuns.c
浏览文件 @
df797679
...
...
@@ -5154,7 +5154,7 @@ sctp_disposition_t sctp_sf_do_9_2_start_shutdown(
* The sender of the SHUTDOWN MAY also start an overall guard timer
* 'T5-shutdown-guard' to bound the overall time for shutdown sequence.
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_START
,
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_
RE
START
,
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD
));
if
(
asoc
->
autoclose
)
...
...
@@ -5299,14 +5299,28 @@ sctp_disposition_t sctp_sf_do_6_3_3_rtx(const struct sctp_endpoint *ep,
SCTP_INC_STATS
(
SCTP_MIB_T3_RTX_EXPIREDS
);
if
(
asoc
->
overall_error_count
>=
asoc
->
max_retrans
)
{
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SET_SK_ERR
,
SCTP_ERROR
(
ETIMEDOUT
));
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_PERR
(
SCTP_ERROR_NO_ERROR
));
SCTP_INC_STATS
(
SCTP_MIB_ABORTEDS
);
SCTP_DEC_STATS
(
SCTP_MIB_CURRESTAB
);
return
SCTP_DISPOSITION_DELETE_TCB
;
if
(
asoc
->
state
==
SCTP_STATE_SHUTDOWN_PENDING
)
{
/*
* We are here likely because the receiver had its rwnd
* closed for a while and we have not been able to
* transmit the locally queued data within the maximum
* retransmission attempts limit. Start the T5
* shutdown guard timer to give the receiver one last
* chance and some additional time to recover before
* aborting.
*/
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_TIMER_START_ONCE
,
SCTP_TO
(
SCTP_EVENT_TIMEOUT_T5_SHUTDOWN_GUARD
));
}
else
{
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_SET_SK_ERR
,
SCTP_ERROR
(
ETIMEDOUT
));
/* CMD_ASSOC_FAILED calls CMD_DELETE_TCB. */
sctp_add_cmd_sf
(
commands
,
SCTP_CMD_ASSOC_FAILED
,
SCTP_PERR
(
SCTP_ERROR_NO_ERROR
));
SCTP_INC_STATS
(
SCTP_MIB_ABORTEDS
);
SCTP_DEC_STATS
(
SCTP_MIB_CURRESTAB
);
return
SCTP_DISPOSITION_DELETE_TCB
;
}
}
/* E1) For the destination address for which the timer
...
...
This diff is collapsed.
Click to expand it.
net/sctp/sm_statetable.c
浏览文件 @
df797679
...
...
@@ -827,7 +827,7 @@ static const sctp_sm_table_entry_t other_event_table[SCTP_NUM_OTHER_TYPES][SCTP_
/* SCTP_STATE_ESTABLISHED */
\
TYPE_SCTP_FUNC(sctp_sf_timer_ignore), \
/* SCTP_STATE_SHUTDOWN_PENDING */
\
TYPE_SCTP_FUNC(sctp_sf_t
imer_igno
re), \
TYPE_SCTP_FUNC(sctp_sf_t
5_timer_expi
re), \
/* SCTP_STATE_SHUTDOWN_SENT */
\
TYPE_SCTP_FUNC(sctp_sf_t5_timer_expire), \
/* SCTP_STATE_SHUTDOWN_RECEIVED */
\
...
...
This diff is collapsed.
Click to expand it.
net/sctp/socket.c
浏览文件 @
df797679
...
...
@@ -1384,6 +1384,7 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
struct
sctp_endpoint
*
ep
;
struct
sctp_association
*
asoc
;
struct
list_head
*
pos
,
*
temp
;
unsigned
int
data_was_unread
;
SCTP_DEBUG_PRINTK
(
"sctp_close(sk: 0x%p, timeout:%ld)
\n
"
,
sk
,
timeout
);
...
...
@@ -1393,6 +1394,10 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
ep
=
sctp_sk
(
sk
)
->
ep
;
/* Clean up any skbs sitting on the receive queue. */
data_was_unread
=
sctp_queue_purge_ulpevents
(
&
sk
->
sk_receive_queue
);
data_was_unread
+=
sctp_queue_purge_ulpevents
(
&
sctp_sk
(
sk
)
->
pd_lobby
);
/* Walk all associations on an endpoint. */
list_for_each_safe
(
pos
,
temp
,
&
ep
->
asocs
)
{
asoc
=
list_entry
(
pos
,
struct
sctp_association
,
asocs
);
...
...
@@ -1410,7 +1415,9 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
}
}
if
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
!
sk
->
sk_lingertime
)
{
if
(
data_was_unread
||
!
skb_queue_empty
(
&
asoc
->
ulpq
.
lobby
)
||
!
skb_queue_empty
(
&
asoc
->
ulpq
.
reasm
)
||
(
sock_flag
(
sk
,
SOCK_LINGER
)
&&
!
sk
->
sk_lingertime
))
{
struct
sctp_chunk
*
chunk
;
chunk
=
sctp_make_abort_user
(
asoc
,
NULL
,
0
);
...
...
@@ -1420,10 +1427,6 @@ SCTP_STATIC void sctp_close(struct sock *sk, long timeout)
sctp_primitive_SHUTDOWN
(
asoc
,
NULL
);
}
/* Clean up any skbs sitting on the receive queue. */
sctp_queue_purge_ulpevents
(
&
sk
->
sk_receive_queue
);
sctp_queue_purge_ulpevents
(
&
sctp_sk
(
sk
)
->
pd_lobby
);
/* On a TCP-style socket, block for at most linger_time if set. */
if
(
sctp_style
(
sk
,
TCP
)
&&
timeout
)
sctp_wait_for_close
(
sk
,
timeout
);
...
...
This diff is collapsed.
Click to expand it.
net/sctp/ulpevent.c
浏览文件 @
df797679
...
...
@@ -1081,9 +1081,19 @@ void sctp_ulpevent_free(struct sctp_ulpevent *event)
}
/* Purge the skb lists holding ulpevents. */
void
sctp_queue_purge_ulpevents
(
struct
sk_buff_head
*
list
)
unsigned
int
sctp_queue_purge_ulpevents
(
struct
sk_buff_head
*
list
)
{
struct
sk_buff
*
skb
;
while
((
skb
=
skb_dequeue
(
list
))
!=
NULL
)
sctp_ulpevent_free
(
sctp_skb2event
(
skb
));
unsigned
int
data_unread
=
0
;
while
((
skb
=
skb_dequeue
(
list
))
!=
NULL
)
{
struct
sctp_ulpevent
*
event
=
sctp_skb2event
(
skb
);
if
(
!
sctp_ulpevent_is_notification
(
event
))
data_unread
+=
skb
->
len
;
sctp_ulpevent_free
(
event
);
}
return
data_unread
;
}
This diff is collapsed.
Click to expand it.
net/sunrpc/rpcb_clnt.c
浏览文件 @
df797679
...
...
@@ -597,7 +597,7 @@ void rpcb_getport_async(struct rpc_task *task)
u32
bind_version
;
struct
rpc_xprt
*
xprt
;
struct
rpc_clnt
*
rpcb_clnt
;
st
atic
st
ruct
rpcbind_args
*
map
;
struct
rpcbind_args
*
map
;
struct
rpc_task
*
child
;
struct
sockaddr_storage
addr
;
struct
sockaddr
*
sap
=
(
struct
sockaddr
*
)
&
addr
;
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/sched.c
浏览文件 @
df797679
...
...
@@ -616,30 +616,25 @@ static void __rpc_execute(struct rpc_task *task)
BUG_ON
(
RPC_IS_QUEUED
(
task
));
for
(;;)
{
void
(
*
do_action
)(
struct
rpc_task
*
);
/*
* Execute any pending callback.
* Execute any pending callback
first
.
*/
if
(
task
->
tk_callback
)
{
void
(
*
save_callback
)(
struct
rpc_task
*
);
/*
* We set tk_callback to NULL before calling it,
* in case it sets the tk_callback field itself:
*/
save_callback
=
task
->
tk_callback
;
task
->
tk_callback
=
NULL
;
save_callback
(
task
);
}
else
{
do_action
=
task
->
tk_callback
;
task
->
tk_callback
=
NULL
;
if
(
do_action
==
NULL
)
{
/*
* Perform the next FSM step.
* tk_action may be NULL when the task has been killed
* by someone else.
* tk_action may be NULL if the task has been killed.
* In particular, note that rpc_killall_tasks may
* do this at any time, so beware when dereferencing.
*/
if
(
task
->
tk_action
==
NULL
)
do_action
=
task
->
tk_action
;
if
(
do_action
==
NULL
)
break
;
task
->
tk_action
(
task
);
}
do_action
(
task
);
/*
* Lockless check for whether task is sleeping or not.
...
...
This diff is collapsed.
Click to expand it.
net/wireless/core.c
浏览文件 @
df797679
...
...
@@ -366,6 +366,7 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
mutex_init
(
&
rdev
->
mtx
);
mutex_init
(
&
rdev
->
devlist_mtx
);
mutex_init
(
&
rdev
->
sched_scan_mtx
);
INIT_LIST_HEAD
(
&
rdev
->
netdev_list
);
spin_lock_init
(
&
rdev
->
bss_lock
);
INIT_LIST_HEAD
(
&
rdev
->
bss_list
);
...
...
@@ -701,6 +702,7 @@ void cfg80211_dev_free(struct cfg80211_registered_device *rdev)
rfkill_destroy
(
rdev
->
rfkill
);
mutex_destroy
(
&
rdev
->
mtx
);
mutex_destroy
(
&
rdev
->
devlist_mtx
);
mutex_destroy
(
&
rdev
->
sched_scan_mtx
);
list_for_each_entry_safe
(
scan
,
tmp
,
&
rdev
->
bss_list
,
list
)
cfg80211_put_bss
(
&
scan
->
pub
);
cfg80211_rdev_free_wowlan
(
rdev
);
...
...
@@ -737,12 +739,16 @@ static void wdev_cleanup_work(struct work_struct *work)
___cfg80211_scan_done
(
rdev
,
true
);
}
cfg80211_unlock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
if
(
WARN_ON
(
rdev
->
sched_scan_req
&&
rdev
->
sched_scan_req
->
dev
==
wdev
->
netdev
))
{
__cfg80211_stop_sched_scan
(
rdev
,
false
);
}
cfg80211_unlock_rdev
(
rdev
);
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
mutex_lock
(
&
rdev
->
devlist_mtx
);
rdev
->
opencount
--
;
...
...
@@ -830,9 +836,9 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
break
;
case
NL80211_IFTYPE_P2P_CLIENT
:
case
NL80211_IFTYPE_STATION
:
cfg80211_lock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
__cfg80211_stop_sched_scan
(
rdev
,
false
);
cfg80211_unlock_rdev
(
rdev
);
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
wdev_lock
(
wdev
);
#ifdef CONFIG_CFG80211_WEXT
...
...
This diff is collapsed.
Click to expand it.
net/wireless/core.h
浏览文件 @
df797679
...
...
@@ -65,6 +65,8 @@ struct cfg80211_registered_device {
struct
work_struct
scan_done_wk
;
struct
work_struct
sched_scan_results_wk
;
struct
mutex
sched_scan_mtx
;
#ifdef CONFIG_NL80211_TESTMODE
struct
genl_info
*
testmode_info
;
#endif
...
...
This diff is collapsed.
Click to expand it.
net/wireless/nl80211.c
浏览文件 @
df797679
...
...
@@ -3461,9 +3461,6 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
if
(
!
is_valid_ie_attr
(
info
->
attrs
[
NL80211_ATTR_IE
]))
return
-
EINVAL
;
if
(
rdev
->
sched_scan_req
)
return
-
EINPROGRESS
;
if
(
!
info
->
attrs
[
NL80211_ATTR_SCHED_SCAN_INTERVAL
])
return
-
EINVAL
;
...
...
@@ -3502,12 +3499,21 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
if
(
ie_len
>
wiphy
->
max_scan_ie_len
)
return
-
EINVAL
;
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
if
(
rdev
->
sched_scan_req
)
{
err
=
-
EINPROGRESS
;
goto
out
;
}
request
=
kzalloc
(
sizeof
(
*
request
)
+
sizeof
(
*
request
->
ssids
)
*
n_ssids
+
sizeof
(
*
request
->
channels
)
*
n_channels
+
ie_len
,
GFP_KERNEL
);
if
(
!
request
)
return
-
ENOMEM
;
if
(
!
request
)
{
err
=
-
ENOMEM
;
goto
out
;
}
if
(
n_ssids
)
request
->
ssids
=
(
void
*
)
&
request
->
channels
[
n_channels
];
...
...
@@ -3605,6 +3611,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
out_free:
kfree
(
request
);
out:
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
return
err
;
}
...
...
@@ -3612,12 +3619,17 @@ static int nl80211_stop_sched_scan(struct sk_buff *skb,
struct
genl_info
*
info
)
{
struct
cfg80211_registered_device
*
rdev
=
info
->
user_ptr
[
0
];
int
err
;
if
(
!
(
rdev
->
wiphy
.
flags
&
WIPHY_FLAG_SUPPORTS_SCHED_SCAN
)
||
!
rdev
->
ops
->
sched_scan_stop
)
return
-
EOPNOTSUPP
;
return
__cfg80211_stop_sched_scan
(
rdev
,
false
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
err
=
__cfg80211_stop_sched_scan
(
rdev
,
false
);
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
return
err
;
}
static
int
nl80211_send_bss
(
struct
sk_buff
*
msg
,
u32
pid
,
u32
seq
,
int
flags
,
...
...
This diff is collapsed.
Click to expand it.
net/wireless/scan.c
浏览文件 @
df797679
...
...
@@ -100,14 +100,14 @@ void __cfg80211_sched_scan_results(struct work_struct *wk)
rdev
=
container_of
(
wk
,
struct
cfg80211_registered_device
,
sched_scan_results_wk
);
cfg80211_lock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
/* we don't have sched_scan_req anymore if the scan is stopping */
if
(
rdev
->
sched_scan_req
)
nl80211_send_sched_scan_results
(
rdev
,
rdev
->
sched_scan_req
->
dev
);
cfg80211_unlock_rdev
(
rdev
);
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
}
void
cfg80211_sched_scan_results
(
struct
wiphy
*
wiphy
)
...
...
@@ -123,9 +123,9 @@ void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
{
struct
cfg80211_registered_device
*
rdev
=
wiphy_to_dev
(
wiphy
);
cfg80211_lock_rdev
(
rdev
);
mutex_lock
(
&
rdev
->
sched_scan_mtx
);
__cfg80211_stop_sched_scan
(
rdev
,
true
);
cfg80211_unlock_rdev
(
rdev
);
mutex_unlock
(
&
rdev
->
sched_scan_mtx
);
}
EXPORT_SYMBOL
(
cfg80211_sched_scan_stopped
);
...
...
@@ -135,7 +135,7 @@ int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
int
err
;
struct
net_device
*
dev
;
ASSERT_RDEV_LOCK
(
rdev
);
lockdep_assert_held
(
&
rdev
->
sched_scan_mtx
);
if
(
!
rdev
->
sched_scan_req
)
return
0
;
...
...
This diff is collapsed.
Click to expand it.
net/xfrm/xfrm_state.c
浏览文件 @
df797679
...
...
@@ -1345,6 +1345,8 @@ int xfrm_state_update(struct xfrm_state *x)
xfrm_state_check_expire
(
x1
);
err
=
0
;
x
->
km
.
state
=
XFRM_STATE_DEAD
;
__xfrm_state_put
(
x
);
}
spin_unlock_bh
(
&
x1
->
lock
);
...
...
This diff is collapsed.
Click to expand it.
scripts/depmod.sh
浏览文件 @
df797679
...
...
@@ -21,13 +21,15 @@ fi
# older versions of depmod require the version string to start with three
# numbers, so we cheat with a symlink here
depmod_hack_needed
=
true
mkdir
-p
.tmp_depmod/lib/modules/
$KERNELRELEASE
if
"
$DEPMOD
"
-b
.tmp_depmod
$KERNELRELEASE
2>/dev/null
;
then
if
test
-e
.tmp_depmod/lib/modules/
$KERNELRELEASE
/modules.dep
-o
\
-e
.tmp_depmod/lib/modules/
$KERNELRELEASE
/modules.dep.bin
;
then
tmp_dir
=
$(
mktemp
-d
${
TMPDIR
:-
/tmp
}
/depmod.XXXXXX
)
mkdir
-p
"
$tmp_dir
/lib/modules/
$KERNELRELEASE
"
if
"
$DEPMOD
"
-b
"
$tmp_dir
"
$KERNELRELEASE
2>/dev/null
;
then
if
test
-e
"
$tmp_dir
/lib/modules/
$KERNELRELEASE
/modules.dep"
-o
\
-e
"
$tmp_dir
/lib/modules/
$KERNELRELEASE
/modules.dep.bin"
;
then
depmod_hack_needed
=
false
fi
fi
rm
-rf
"
$tmp_dir
"
if
$depmod_hack_needed
;
then
symlink
=
"
$INSTALL_MOD_PATH
/lib/modules/99.98.
$KERNELRELEASE
"
ln
-s
"
$KERNELRELEASE
"
"
$symlink
"
...
...
This diff is collapsed.
Click to expand it.
sound/soc/codecs/wm8994.c
浏览文件 @
df797679
...
...
@@ -1190,7 +1190,6 @@ SND_SOC_DAPM_INPUT("DMIC1DAT"),
SND_SOC_DAPM_INPUT
(
"DMIC2DAT"
),
SND_SOC_DAPM_INPUT
(
"Clock"
),
SND_SOC_DAPM_MICBIAS
(
"MICBIAS"
,
WM8994_MICBIAS
,
2
,
0
),
SND_SOC_DAPM_SUPPLY_S
(
"MICBIAS Supply"
,
1
,
SND_SOC_NOPM
,
0
,
0
,
micbias_ev
,
SND_SOC_DAPM_PRE_PMU
),
...
...
@@ -1509,8 +1508,10 @@ static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {
{
"AIF2DACDAT"
,
NULL
,
"AIF1DACDAT"
},
{
"AIF1ADCDAT"
,
NULL
,
"AIF2ADCDAT"
},
{
"AIF2ADCDAT"
,
NULL
,
"AIF1ADCDAT"
},
{
"MICBIAS"
,
NULL
,
"CLK_SYS"
},
{
"MICBIAS"
,
NULL
,
"MICBIAS Supply"
},
{
"MICBIAS1"
,
NULL
,
"CLK_SYS"
},
{
"MICBIAS1"
,
NULL
,
"MICBIAS Supply"
},
{
"MICBIAS2"
,
NULL
,
"CLK_SYS"
},
{
"MICBIAS2"
,
NULL
,
"MICBIAS Supply"
},
};
static
const
struct
snd_soc_dapm_route
wm8994_intercon
[]
=
{
...
...
@@ -2763,7 +2764,7 @@ static void wm8958_default_micdet(u16 status, void *data)
report
=
SND_JACK_MICROPHONE
;
/* Everything else is buttons; just assign slots */
if
(
status
&
0x1c
0
)
if
(
status
&
0x1c
)
report
|=
SND_JACK_BTN_0
;
done:
...
...
This diff is collapsed.
Click to expand it.
sound/soc/sh/fsi-ak4642.c
浏览文件 @
df797679
...
...
@@ -97,7 +97,7 @@ static int fsi_ak4642_remove(struct platform_device *pdev)
static
struct
fsi_ak4642_data
fsi_a_ak4642
=
{
.
name
=
"AK4642"
,
.
card
=
"FSIA
(AK4642)
"
,
.
card
=
"FSIA
-AK4642
"
,
.
cpu_dai
=
"fsia-dai"
,
.
codec
=
"ak4642-codec.0-0012"
,
.
platform
=
"sh_fsi.0"
,
...
...
@@ -106,7 +106,7 @@ static struct fsi_ak4642_data fsi_a_ak4642 = {
static
struct
fsi_ak4642_data
fsi_b_ak4642
=
{
.
name
=
"AK4642"
,
.
card
=
"FSIB
(AK4642)
"
,
.
card
=
"FSIB
-AK4642
"
,
.
cpu_dai
=
"fsib-dai"
,
.
codec
=
"ak4642-codec.0-0012"
,
.
platform
=
"sh_fsi.0"
,
...
...
@@ -115,7 +115,7 @@ static struct fsi_ak4642_data fsi_b_ak4642 = {
static
struct
fsi_ak4642_data
fsi_a_ak4643
=
{
.
name
=
"AK4643"
,
.
card
=
"FSIA
(AK4643)
"
,
.
card
=
"FSIA
-AK4643
"
,
.
cpu_dai
=
"fsia-dai"
,
.
codec
=
"ak4642-codec.0-0013"
,
.
platform
=
"sh_fsi.0"
,
...
...
@@ -124,7 +124,7 @@ static struct fsi_ak4642_data fsi_a_ak4643 = {
static
struct
fsi_ak4642_data
fsi_b_ak4643
=
{
.
name
=
"AK4643"
,
.
card
=
"FSIB
(AK4643)
"
,
.
card
=
"FSIB
-AK4643
"
,
.
cpu_dai
=
"fsib-dai"
,
.
codec
=
"ak4642-codec.0-0013"
,
.
platform
=
"sh_fsi.0"
,
...
...
@@ -133,7 +133,7 @@ static struct fsi_ak4642_data fsi_b_ak4643 = {
static
struct
fsi_ak4642_data
fsi2_a_ak4642
=
{
.
name
=
"AK4642"
,
.
card
=
"FSI2A
(AK4642)
"
,
.
card
=
"FSI2A
-AK4642
"
,
.
cpu_dai
=
"fsia-dai"
,
.
codec
=
"ak4642-codec.0-0012"
,
.
platform
=
"sh_fsi2"
,
...
...
@@ -142,7 +142,7 @@ static struct fsi_ak4642_data fsi2_a_ak4642 = {
static
struct
fsi_ak4642_data
fsi2_b_ak4642
=
{
.
name
=
"AK4642"
,
.
card
=
"FSI2B
(AK4642)
"
,
.
card
=
"FSI2B
-AK4642
"
,
.
cpu_dai
=
"fsib-dai"
,
.
codec
=
"ak4642-codec.0-0012"
,
.
platform
=
"sh_fsi2"
,
...
...
@@ -151,7 +151,7 @@ static struct fsi_ak4642_data fsi2_b_ak4642 = {
static
struct
fsi_ak4642_data
fsi2_a_ak4643
=
{
.
name
=
"AK4643"
,
.
card
=
"FSI2A
(AK4643)
"
,
.
card
=
"FSI2A
-AK4643
"
,
.
cpu_dai
=
"fsia-dai"
,
.
codec
=
"ak4642-codec.0-0013"
,
.
platform
=
"sh_fsi2"
,
...
...
@@ -160,7 +160,7 @@ static struct fsi_ak4642_data fsi2_a_ak4643 = {
static
struct
fsi_ak4642_data
fsi2_b_ak4643
=
{
.
name
=
"AK4643"
,
.
card
=
"FSI2B
(AK4643)
"
,
.
card
=
"FSI2B
-AK4643
"
,
.
cpu_dai
=
"fsib-dai"
,
.
codec
=
"ak4642-codec.0-0013"
,
.
platform
=
"sh_fsi2"
,
...
...
This diff is collapsed.
Click to expand it.
sound/soc/sh/fsi-da7210.c
浏览文件 @
df797679
...
...
@@ -42,7 +42,7 @@ static struct snd_soc_dai_link fsi_da7210_dai = {
};
static
struct
snd_soc_card
fsi_soc_card
=
{
.
name
=
"FSI
(DA7210)
"
,
.
name
=
"FSI
-DA7210
"
,
.
dai_link
=
&
fsi_da7210_dai
,
.
num_links
=
1
,
};
...
...
This diff is collapsed.
Click to expand it.
sound/soc/sh/fsi-hdmi.c
浏览文件 @
df797679
...
...
@@ -83,13 +83,13 @@ static int fsi_hdmi_remove(struct platform_device *pdev)
static
struct
fsi_hdmi_data
fsi2_a_hdmi
=
{
.
cpu_dai
=
"fsia-dai"
,
.
card
=
"FSI2A
(SH MOBILE HDMI)
"
,
.
card
=
"FSI2A
-HDMI
"
,
.
id
=
FSI_PORT_A
,
};
static
struct
fsi_hdmi_data
fsi2_b_hdmi
=
{
.
cpu_dai
=
"fsib-dai"
,
.
card
=
"FSI2B
(SH MOBILE HDMI)
"
,
.
card
=
"FSI2B
-HDMI
"
,
.
id
=
FSI_PORT_B
,
};
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部