Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
8400146d
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
8400146d
编写于
8月 23, 2009
作者:
R
Rafael J. Wysocki
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into for-linus
上级
39cf0518
3edf2fb9
变更
32
隐藏空白更改
内联
并排
Showing
32 changed file
with
459 addition
and
278 deletion
+459
-278
Makefile
Makefile
+1
-1
arch/x86/kernel/apic/ipi.c
arch/x86/kernel/apic/ipi.c
+3
-0
arch/x86/mm/tlb.c
arch/x86/mm/tlb.c
+10
-11
drivers/gpu/drm/drm_sysfs.c
drivers/gpu/drm/drm_sysfs.c
+29
-22
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r100.c
+10
-0
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/r300.c
+3
-1
drivers/gpu/drm/radeon/r420.c
drivers/gpu/drm/radeon/r420.c
+12
-1
drivers/gpu/drm/radeon/r520.c
drivers/gpu/drm/radeon/r520.c
+0
-1
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon.h
+1
-0
drivers/gpu/drm/radeon/radeon_cp.c
drivers/gpu/drm/radeon/radeon_cp.c
+9
-0
drivers/gpu/drm/radeon/radeon_drv.h
drivers/gpu/drm/radeon/radeon_drv.h
+4
-1
drivers/gpu/drm/radeon/radeon_gem.c
drivers/gpu/drm/radeon/radeon_gem.c
+1
-1
drivers/gpu/drm/radeon/radeon_kms.c
drivers/gpu/drm/radeon/radeon_kms.c
+4
-0
drivers/gpu/drm/radeon/radeon_reg.h
drivers/gpu/drm/radeon/radeon_reg.h
+5
-0
drivers/gpu/drm/radeon/radeon_state.c
drivers/gpu/drm/radeon/radeon_state.c
+3
-0
drivers/i2c/busses/i2c-omap.c
drivers/i2c/busses/i2c-omap.c
+12
-2
drivers/i2c/busses/i2c-stu300.c
drivers/i2c/busses/i2c-stu300.c
+92
-65
drivers/pci/pci-driver.c
drivers/pci/pci-driver.c
+1
-1
drivers/pci/pci.c
drivers/pci/pci.c
+2
-0
drivers/scsi/mpt2sas/mpt2sas_base.c
drivers/scsi/mpt2sas/mpt2sas_base.c
+67
-31
drivers/scsi/mpt2sas/mpt2sas_base.h
drivers/scsi/mpt2sas/mpt2sas_base.h
+4
-2
drivers/scsi/mpt2sas/mpt2sas_config.c
drivers/scsi/mpt2sas/mpt2sas_config.c
+26
-65
drivers/scsi/mpt2sas/mpt2sas_scsih.c
drivers/scsi/mpt2sas/mpt2sas_scsih.c
+88
-36
fs/btrfs/inode.c
fs/btrfs/inode.c
+14
-7
fs/buffer.c
fs/buffer.c
+5
-2
include/drm/radeon_drm.h
include/drm/radeon_drm.h
+4
-0
include/linux/bitmap.h
include/linux/bitmap.h
+8
-10
include/linux/cpumask.h
include/linux/cpumask.h
+10
-10
lib/bitmap.c
lib/bitmap.c
+8
-4
sound/pci/hda/patch_analog.c
sound/pci/hda/patch_analog.c
+4
-2
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_realtek.c
+13
-2
sound/pci/hda/patch_sigmatel.c
sound/pci/hda/patch_sigmatel.c
+6
-0
未找到文件。
Makefile
浏览文件 @
8400146d
VERSION
=
2
VERSION
=
2
PATCHLEVEL
=
6
PATCHLEVEL
=
6
SUBLEVEL
=
31
SUBLEVEL
=
31
EXTRAVERSION
=
-rc
6
EXTRAVERSION
=
-rc
7
NAME
=
Man-Eating Seals of Antiquity
NAME
=
Man-Eating Seals of Antiquity
# *DOCUMENTATION*
# *DOCUMENTATION*
...
...
arch/x86/kernel/apic/ipi.c
浏览文件 @
8400146d
...
@@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)
...
@@ -106,6 +106,9 @@ void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector)
unsigned
long
mask
=
cpumask_bits
(
cpumask
)[
0
];
unsigned
long
mask
=
cpumask_bits
(
cpumask
)[
0
];
unsigned
long
flags
;
unsigned
long
flags
;
if
(
WARN_ONCE
(
!
mask
,
"empty IPI mask"
))
return
;
local_irq_save
(
flags
);
local_irq_save
(
flags
);
WARN_ON
(
mask
&
~
cpumask_bits
(
cpu_online_mask
)[
0
]);
WARN_ON
(
mask
&
~
cpumask_bits
(
cpu_online_mask
)[
0
]);
__default_send_IPI_dest_field
(
mask
,
vector
,
apic
->
dest_logical
);
__default_send_IPI_dest_field
(
mask
,
vector
,
apic
->
dest_logical
);
...
...
arch/x86/mm/tlb.c
浏览文件 @
8400146d
...
@@ -183,18 +183,17 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask,
...
@@ -183,18 +183,17 @@ static void flush_tlb_others_ipi(const struct cpumask *cpumask,
f
->
flush_mm
=
mm
;
f
->
flush_mm
=
mm
;
f
->
flush_va
=
va
;
f
->
flush_va
=
va
;
cpumask_andnot
(
to_cpumask
(
f
->
flush_cpumask
),
if
(
cpumask_andnot
(
to_cpumask
(
f
->
flush_cpumask
),
cpumask
,
cpumask_of
(
smp_processor_id
())))
{
cpumask
,
cpumask_of
(
smp_processor_id
()));
/*
* We have to send the IPI only to
/*
* CPUs affected.
* We have to send the IPI only to
*/
* CPUs affected.
apic
->
send_IPI_mask
(
to_cpumask
(
f
->
flush_cpumask
),
*/
INVALIDATE_TLB_VECTOR_START
+
sender
);
apic
->
send_IPI_mask
(
to_cpumask
(
f
->
flush_cpumask
),
INVALIDATE_TLB_VECTOR_START
+
sender
);
while
(
!
cpumask_empty
(
to_cpumask
(
f
->
flush_cpumask
)))
while
(
!
cpumask_empty
(
to_cpumask
(
f
->
flush_cpumask
)))
cpu_relax
();
cpu_relax
();
}
f
->
flush_mm
=
NULL
;
f
->
flush_mm
=
NULL
;
f
->
flush_va
=
0
;
f
->
flush_va
=
0
;
...
...
drivers/gpu/drm/drm_sysfs.c
浏览文件 @
8400146d
...
@@ -22,44 +22,50 @@
...
@@ -22,44 +22,50 @@
#define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
#define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
#define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
#define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
static
struct
device_type
drm_sysfs_device_minor
=
{
.
name
=
"drm_minor"
};
/**
/**
* drm_
sysf
s_suspend - DRM class suspend hook
* drm_
clas
s_suspend - DRM class suspend hook
* @dev: Linux device to suspend
* @dev: Linux device to suspend
* @state: power state to enter
* @state: power state to enter
*
*
* Just figures out what the actual struct drm_device associated with
* Just figures out what the actual struct drm_device associated with
* @dev is and calls its suspend hook, if present.
* @dev is and calls its suspend hook, if present.
*/
*/
static
int
drm_
sysf
s_suspend
(
struct
device
*
dev
,
pm_message_t
state
)
static
int
drm_
clas
s_suspend
(
struct
device
*
dev
,
pm_message_t
state
)
{
{
struct
drm_minor
*
drm_minor
=
to_drm_minor
(
dev
);
if
(
dev
->
type
==
&
drm_sysfs_device_minor
)
{
struct
drm_device
*
drm_dev
=
drm_minor
->
dev
;
struct
drm_minor
*
drm_minor
=
to_drm_minor
(
dev
);
struct
drm_device
*
drm_dev
=
drm_minor
->
dev
;
if
(
drm_minor
->
type
==
DRM_MINOR_LEGACY
&&
!
drm_core_check_feature
(
drm_dev
,
DRIVER_MODESET
)
&&
if
(
drm_minor
->
type
==
DRM_MINOR_LEGACY
&&
drm_dev
->
driver
->
suspend
)
!
drm_core_check_feature
(
drm_dev
,
DRIVER_MODESET
)
&&
return
drm_dev
->
driver
->
suspend
(
drm_dev
,
state
);
drm_dev
->
driver
->
suspend
)
return
drm_dev
->
driver
->
suspend
(
drm_dev
,
state
);
}
return
0
;
return
0
;
}
}
/**
/**
* drm_
sysf
s_resume - DRM class resume hook
* drm_
clas
s_resume - DRM class resume hook
* @dev: Linux device to resume
* @dev: Linux device to resume
*
*
* Just figures out what the actual struct drm_device associated with
* Just figures out what the actual struct drm_device associated with
* @dev is and calls its resume hook, if present.
* @dev is and calls its resume hook, if present.
*/
*/
static
int
drm_
sysf
s_resume
(
struct
device
*
dev
)
static
int
drm_
clas
s_resume
(
struct
device
*
dev
)
{
{
struct
drm_minor
*
drm_minor
=
to_drm_minor
(
dev
);
if
(
dev
->
type
==
&
drm_sysfs_device_minor
)
{
struct
drm_device
*
drm_dev
=
drm_minor
->
dev
;
struct
drm_minor
*
drm_minor
=
to_drm_minor
(
dev
);
struct
drm_device
*
drm_dev
=
drm_minor
->
dev
;
if
(
drm_minor
->
type
==
DRM_MINOR_LEGACY
&&
!
drm_core_check_feature
(
drm_dev
,
DRIVER_MODESET
)
&&
if
(
drm_minor
->
type
==
DRM_MINOR_LEGACY
&&
drm_dev
->
driver
->
resume
)
!
drm_core_check_feature
(
drm_dev
,
DRIVER_MODESET
)
&&
return
drm_dev
->
driver
->
resume
(
drm_dev
);
drm_dev
->
driver
->
resume
)
return
drm_dev
->
driver
->
resume
(
drm_dev
);
}
return
0
;
return
0
;
}
}
...
@@ -99,8 +105,8 @@ struct class *drm_sysfs_create(struct module *owner, char *name)
...
@@ -99,8 +105,8 @@ struct class *drm_sysfs_create(struct module *owner, char *name)
goto
err_out
;
goto
err_out
;
}
}
class
->
suspend
=
drm_
sysf
s_suspend
;
class
->
suspend
=
drm_
clas
s_suspend
;
class
->
resume
=
drm_
sysf
s_resume
;
class
->
resume
=
drm_
clas
s_resume
;
err
=
class_create_file
(
class
,
&
class_attr_version
);
err
=
class_create_file
(
class
,
&
class_attr_version
);
if
(
err
)
if
(
err
)
...
@@ -480,6 +486,7 @@ int drm_sysfs_device_add(struct drm_minor *minor)
...
@@ -480,6 +486,7 @@ int drm_sysfs_device_add(struct drm_minor *minor)
minor
->
kdev
.
class
=
drm_class
;
minor
->
kdev
.
class
=
drm_class
;
minor
->
kdev
.
release
=
drm_sysfs_device_release
;
minor
->
kdev
.
release
=
drm_sysfs_device_release
;
minor
->
kdev
.
devt
=
minor
->
device
;
minor
->
kdev
.
devt
=
minor
->
device
;
minor
->
kdev
.
type
=
&
drm_sysfs_device_minor
;
if
(
minor
->
type
==
DRM_MINOR_CONTROL
)
if
(
minor
->
type
==
DRM_MINOR_CONTROL
)
minor_str
=
"controlD%d"
;
minor_str
=
"controlD%d"
;
else
if
(
minor
->
type
==
DRM_MINOR_RENDER
)
else
if
(
minor
->
type
==
DRM_MINOR_RENDER
)
...
...
drivers/gpu/drm/radeon/r100.c
浏览文件 @
8400146d
...
@@ -1091,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
...
@@ -1091,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p,
tmp
|=
tile_flags
;
tmp
|=
tile_flags
;
ib
[
idx
]
=
tmp
;
ib
[
idx
]
=
tmp
;
break
;
break
;
case
RADEON_RB3D_ZPASS_ADDR
:
r
=
r100_cs_packet_next_reloc
(
p
,
&
reloc
);
if
(
r
)
{
DRM_ERROR
(
"No reloc for ib[%d]=0x%04X
\n
"
,
idx
,
reg
);
r100_cs_dump_packet
(
p
,
pkt
);
return
r
;
}
ib
[
idx
]
=
ib_chunk
->
kdata
[
idx
]
+
((
u32
)
reloc
->
lobj
.
gpu_offset
);
break
;
default:
default:
/* FIXME: we don't want to allow anyothers packet */
/* FIXME: we don't want to allow anyothers packet */
break
;
break
;
...
...
drivers/gpu/drm/radeon/r300.c
浏览文件 @
8400146d
...
@@ -448,6 +448,7 @@ void r300_gpu_init(struct radeon_device *rdev)
...
@@ -448,6 +448,7 @@ void r300_gpu_init(struct radeon_device *rdev)
/* rv350,rv370,rv380 */
/* rv350,rv370,rv380 */
rdev
->
num_gb_pipes
=
1
;
rdev
->
num_gb_pipes
=
1
;
}
}
rdev
->
num_z_pipes
=
1
;
gb_tile_config
=
(
R300_ENABLE_TILING
|
R300_TILE_SIZE_16
);
gb_tile_config
=
(
R300_ENABLE_TILING
|
R300_TILE_SIZE_16
);
switch
(
rdev
->
num_gb_pipes
)
{
switch
(
rdev
->
num_gb_pipes
)
{
case
2
:
case
2
:
...
@@ -486,7 +487,8 @@ void r300_gpu_init(struct radeon_device *rdev)
...
@@ -486,7 +487,8 @@ void r300_gpu_init(struct radeon_device *rdev)
printk
(
KERN_WARNING
"Failed to wait MC idle while "
printk
(
KERN_WARNING
"Failed to wait MC idle while "
"programming pipes. Bad things might happen.
\n
"
);
"programming pipes. Bad things might happen.
\n
"
);
}
}
DRM_INFO
(
"radeon: %d pipes initialized.
\n
"
,
rdev
->
num_gb_pipes
);
DRM_INFO
(
"radeon: %d quad pipes, %d Z pipes initialized.
\n
"
,
rdev
->
num_gb_pipes
,
rdev
->
num_z_pipes
);
}
}
int
r300_ga_reset
(
struct
radeon_device
*
rdev
)
int
r300_ga_reset
(
struct
radeon_device
*
rdev
)
...
...
drivers/gpu/drm/radeon/r420.c
浏览文件 @
8400146d
...
@@ -165,7 +165,18 @@ void r420_pipes_init(struct radeon_device *rdev)
...
@@ -165,7 +165,18 @@ void r420_pipes_init(struct radeon_device *rdev)
printk
(
KERN_WARNING
"Failed to wait GUI idle while "
printk
(
KERN_WARNING
"Failed to wait GUI idle while "
"programming pipes. Bad things might happen.
\n
"
);
"programming pipes. Bad things might happen.
\n
"
);
}
}
DRM_INFO
(
"radeon: %d pipes initialized.
\n
"
,
rdev
->
num_gb_pipes
);
if
(
rdev
->
family
==
CHIP_RV530
)
{
tmp
=
RREG32
(
RV530_GB_PIPE_SELECT2
);
if
((
tmp
&
3
)
==
3
)
rdev
->
num_z_pipes
=
2
;
else
rdev
->
num_z_pipes
=
1
;
}
else
rdev
->
num_z_pipes
=
1
;
DRM_INFO
(
"radeon: %d quad pipes, %d z pipes initialized.
\n
"
,
rdev
->
num_gb_pipes
,
rdev
->
num_z_pipes
);
}
}
void
r420_gpu_init
(
struct
radeon_device
*
rdev
)
void
r420_gpu_init
(
struct
radeon_device
*
rdev
)
...
...
drivers/gpu/drm/radeon/r520.c
浏览文件 @
8400146d
...
@@ -177,7 +177,6 @@ void r520_gpu_init(struct radeon_device *rdev)
...
@@ -177,7 +177,6 @@ void r520_gpu_init(struct radeon_device *rdev)
*/
*/
/* workaround for RV530 */
/* workaround for RV530 */
if
(
rdev
->
family
==
CHIP_RV530
)
{
if
(
rdev
->
family
==
CHIP_RV530
)
{
WREG32
(
0x4124
,
1
);
WREG32
(
0x4128
,
0xFF
);
WREG32
(
0x4128
,
0xFF
);
}
}
r420_pipes_init
(
rdev
);
r420_pipes_init
(
rdev
);
...
...
drivers/gpu/drm/radeon/radeon.h
浏览文件 @
8400146d
...
@@ -655,6 +655,7 @@ struct radeon_device {
...
@@ -655,6 +655,7 @@ struct radeon_device {
int
usec_timeout
;
int
usec_timeout
;
enum
radeon_pll_errata
pll_errata
;
enum
radeon_pll_errata
pll_errata
;
int
num_gb_pipes
;
int
num_gb_pipes
;
int
num_z_pipes
;
int
disp_priority
;
int
disp_priority
;
/* BIOS */
/* BIOS */
uint8_t
*
bios
;
uint8_t
*
bios
;
...
...
drivers/gpu/drm/radeon/radeon_cp.c
浏览文件 @
8400146d
...
@@ -406,6 +406,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
...
@@ -406,6 +406,15 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
{
{
uint32_t
gb_tile_config
,
gb_pipe_sel
=
0
;
uint32_t
gb_tile_config
,
gb_pipe_sel
=
0
;
if
((
dev_priv
->
flags
&
RADEON_FAMILY_MASK
)
==
CHIP_RV530
)
{
uint32_t
z_pipe_sel
=
RADEON_READ
(
RV530_GB_PIPE_SELECT2
);
if
((
z_pipe_sel
&
3
)
==
3
)
dev_priv
->
num_z_pipes
=
2
;
else
dev_priv
->
num_z_pipes
=
1
;
}
else
dev_priv
->
num_z_pipes
=
1
;
/* RS4xx/RS6xx/R4xx/R5xx */
/* RS4xx/RS6xx/R4xx/R5xx */
if
((
dev_priv
->
flags
&
RADEON_FAMILY_MASK
)
>=
CHIP_R420
)
{
if
((
dev_priv
->
flags
&
RADEON_FAMILY_MASK
)
>=
CHIP_R420
)
{
gb_pipe_sel
=
RADEON_READ
(
R400_GB_PIPE_SELECT
);
gb_pipe_sel
=
RADEON_READ
(
R400_GB_PIPE_SELECT
);
...
...
drivers/gpu/drm/radeon/radeon_drv.h
浏览文件 @
8400146d
...
@@ -100,9 +100,10 @@
...
@@ -100,9 +100,10 @@
* 1.28- Add support for VBL on CRTC2
* 1.28- Add support for VBL on CRTC2
* 1.29- R500 3D cmd buffer support
* 1.29- R500 3D cmd buffer support
* 1.30- Add support for occlusion queries
* 1.30- Add support for occlusion queries
* 1.31- Add support for num Z pipes from GET_PARAM
*/
*/
#define DRIVER_MAJOR 1
#define DRIVER_MAJOR 1
#define DRIVER_MINOR 3
0
#define DRIVER_MINOR 3
1
#define DRIVER_PATCHLEVEL 0
#define DRIVER_PATCHLEVEL 0
/*
/*
...
@@ -329,6 +330,7 @@ typedef struct drm_radeon_private {
...
@@ -329,6 +330,7 @@ typedef struct drm_radeon_private {
resource_size_t
fb_aper_offset
;
resource_size_t
fb_aper_offset
;
int
num_gb_pipes
;
int
num_gb_pipes
;
int
num_z_pipes
;
int
track_flush
;
int
track_flush
;
drm_local_map_t
*
mmio
;
drm_local_map_t
*
mmio
;
...
@@ -689,6 +691,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga
...
@@ -689,6 +691,7 @@ extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pciga
/* pipe config regs */
/* pipe config regs */
#define R400_GB_PIPE_SELECT 0x402c
#define R400_GB_PIPE_SELECT 0x402c
#define RV530_GB_PIPE_SELECT2 0x4124
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d
/* PLL */
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d
/* PLL */
#define R300_GB_TILE_CONFIG 0x4018
#define R300_GB_TILE_CONFIG 0x4018
# define R300_ENABLE_TILING (1 << 0)
# define R300_ENABLE_TILING (1 << 0)
...
...
drivers/gpu/drm/radeon/radeon_gem.c
浏览文件 @
8400146d
...
@@ -283,7 +283,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
...
@@ -283,7 +283,7 @@ int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
mutex_lock
(
&
dev
->
struct_mutex
);
mutex_lock
(
&
dev
->
struct_mutex
);
drm_gem_object_unreference
(
gobj
);
drm_gem_object_unreference
(
gobj
);
mutex_unlock
(
&
dev
->
struct_mutex
);
mutex_unlock
(
&
dev
->
struct_mutex
);
return
0
;
return
r
;
}
}
int
radeon_gem_wait_idle_ioctl
(
struct
drm_device
*
dev
,
void
*
data
,
int
radeon_gem_wait_idle_ioctl
(
struct
drm_device
*
dev
,
void
*
data
,
...
...
drivers/gpu/drm/radeon/radeon_kms.c
浏览文件 @
8400146d
...
@@ -95,6 +95,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
...
@@ -95,6 +95,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
case
RADEON_INFO_NUM_GB_PIPES
:
case
RADEON_INFO_NUM_GB_PIPES
:
value
=
rdev
->
num_gb_pipes
;
value
=
rdev
->
num_gb_pipes
;
break
;
break
;
case
RADEON_INFO_NUM_Z_PIPES
:
value
=
rdev
->
num_z_pipes
;
break
;
default:
default:
DRM_DEBUG
(
"Invalid request %d
\n
"
,
info
->
request
);
DRM_DEBUG
(
"Invalid request %d
\n
"
,
info
->
request
);
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -318,5 +321,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
...
@@ -318,5 +321,6 @@ struct drm_ioctl_desc radeon_ioctls_kms[] = {
DRM_IOCTL_DEF
(
DRM_RADEON_INFO
,
radeon_info_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_INFO
,
radeon_info_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_GEM_SET_TILING
,
radeon_gem_set_tiling_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_GEM_SET_TILING
,
radeon_gem_set_tiling_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_GEM_GET_TILING
,
radeon_gem_get_tiling_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_GEM_GET_TILING
,
radeon_gem_get_tiling_ioctl
,
DRM_AUTH
),
DRM_IOCTL_DEF
(
DRM_RADEON_GEM_BUSY
,
radeon_gem_busy_ioctl
,
DRM_AUTH
),
};
};
int
radeon_max_kms_ioctl
=
DRM_ARRAY_SIZE
(
radeon_ioctls_kms
);
int
radeon_max_kms_ioctl
=
DRM_ARRAY_SIZE
(
radeon_ioctls_kms
);
drivers/gpu/drm/radeon/radeon_reg.h
浏览文件 @
8400146d
...
@@ -2337,6 +2337,9 @@
...
@@ -2337,6 +2337,9 @@
# define RADEON_RE_WIDTH_SHIFT 0
# define RADEON_RE_WIDTH_SHIFT 0
# define RADEON_RE_HEIGHT_SHIFT 16
# define RADEON_RE_HEIGHT_SHIFT 16
#define RADEON_RB3D_ZPASS_DATA 0x3290
#define RADEON_RB3D_ZPASS_ADDR 0x3294
#define RADEON_SE_CNTL 0x1c4c
#define RADEON_SE_CNTL 0x1c4c
# define RADEON_FFACE_CULL_CW (0 << 0)
# define RADEON_FFACE_CULL_CW (0 << 0)
# define RADEON_FFACE_CULL_CCW (1 << 0)
# define RADEON_FFACE_CULL_CCW (1 << 0)
...
@@ -3571,4 +3574,6 @@
...
@@ -3571,4 +3574,6 @@
#define RADEON_SCRATCH_REG4 0x15f0
#define RADEON_SCRATCH_REG4 0x15f0
#define RADEON_SCRATCH_REG5 0x15f4
#define RADEON_SCRATCH_REG5 0x15f4
#define RV530_GB_PIPE_SELECT2 0x4124
#endif
#endif
drivers/gpu/drm/radeon/radeon_state.c
浏览文件 @
8400146d
...
@@ -3081,6 +3081,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
...
@@ -3081,6 +3081,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
case
RADEON_PARAM_NUM_GB_PIPES
:
case
RADEON_PARAM_NUM_GB_PIPES
:
value
=
dev_priv
->
num_gb_pipes
;
value
=
dev_priv
->
num_gb_pipes
;
break
;
break
;
case
RADEON_PARAM_NUM_Z_PIPES
:
value
=
dev_priv
->
num_z_pipes
;
break
;
default:
default:
DRM_DEBUG
(
"Invalid parameter %d
\n
"
,
param
->
param
);
DRM_DEBUG
(
"Invalid parameter %d
\n
"
,
param
->
param
);
return
-
EINVAL
;
return
-
EINVAL
;
...
...
drivers/i2c/busses/i2c-omap.c
浏览文件 @
8400146d
...
@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
...
@@ -674,7 +674,14 @@ omap_i2c_isr(int this_irq, void *dev_id)
err
=
0
;
err
=
0
;
complete:
complete:
omap_i2c_write_reg
(
dev
,
OMAP_I2C_STAT_REG
,
stat
);
/*
* Ack the stat in one go, but [R/X]DR and [R/X]RDY should be
* acked after the data operation is complete.
* Ref: TRM SWPU114Q Figure 18-31
*/
omap_i2c_write_reg
(
dev
,
OMAP_I2C_STAT_REG
,
stat
&
~
(
OMAP_I2C_STAT_RRDY
|
OMAP_I2C_STAT_RDR
|
OMAP_I2C_STAT_XRDY
|
OMAP_I2C_STAT_XDR
));
if
(
stat
&
OMAP_I2C_STAT_NACK
)
{
if
(
stat
&
OMAP_I2C_STAT_NACK
)
{
err
|=
OMAP_I2C_STAT_NACK
;
err
|=
OMAP_I2C_STAT_NACK
;
...
@@ -687,6 +694,9 @@ omap_i2c_isr(int this_irq, void *dev_id)
...
@@ -687,6 +694,9 @@ omap_i2c_isr(int this_irq, void *dev_id)
}
}
if
(
stat
&
(
OMAP_I2C_STAT_ARDY
|
OMAP_I2C_STAT_NACK
|
if
(
stat
&
(
OMAP_I2C_STAT_ARDY
|
OMAP_I2C_STAT_NACK
|
OMAP_I2C_STAT_AL
))
{
OMAP_I2C_STAT_AL
))
{
omap_i2c_ack_stat
(
dev
,
stat
&
(
OMAP_I2C_STAT_RRDY
|
OMAP_I2C_STAT_RDR
|
OMAP_I2C_STAT_XRDY
|
OMAP_I2C_STAT_XDR
));
omap_i2c_complete_cmd
(
dev
,
err
);
omap_i2c_complete_cmd
(
dev
,
err
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
...
@@ -774,7 +784,7 @@ omap_i2c_isr(int this_irq, void *dev_id)
...
@@ -774,7 +784,7 @@ omap_i2c_isr(int this_irq, void *dev_id)
* memory to the I2C interface.
* memory to the I2C interface.
*/
*/
if
(
cpu_is_omap34xx
()
)
{
if
(
dev
->
rev
<=
OMAP_I2C_REV_ON_3430
)
{
while
(
!
(
stat
&
OMAP_I2C_STAT_XUDF
))
{
while
(
!
(
stat
&
OMAP_I2C_STAT_XUDF
))
{
if
(
stat
&
(
OMAP_I2C_STAT_NACK
|
OMAP_I2C_STAT_AL
))
{
if
(
stat
&
(
OMAP_I2C_STAT_NACK
|
OMAP_I2C_STAT_AL
))
{
omap_i2c_ack_stat
(
dev
,
stat
&
(
OMAP_I2C_STAT_XRDY
|
OMAP_I2C_STAT_XDR
));
omap_i2c_ack_stat
(
dev
,
stat
&
(
OMAP_I2C_STAT_XRDY
|
OMAP_I2C_STAT_XDR
));
...
...
drivers/i2c/busses/i2c-stu300.c
浏览文件 @
8400146d
...
@@ -117,7 +117,8 @@ enum stu300_error {
...
@@ -117,7 +117,8 @@ enum stu300_error {
STU300_ERROR_NONE
=
0
,
STU300_ERROR_NONE
=
0
,
STU300_ERROR_ACKNOWLEDGE_FAILURE
,
STU300_ERROR_ACKNOWLEDGE_FAILURE
,
STU300_ERROR_BUS_ERROR
,
STU300_ERROR_BUS_ERROR
,
STU300_ERROR_ARBITRATION_LOST
STU300_ERROR_ARBITRATION_LOST
,
STU300_ERROR_UNKNOWN
};
};
/* timeout waiting for the controller to respond */
/* timeout waiting for the controller to respond */
...
@@ -127,7 +128,7 @@ enum stu300_error {
...
@@ -127,7 +128,7 @@ enum stu300_error {
* The number of address send athemps tried before giving up.
* The number of address send athemps tried before giving up.
* If the first one failes it seems like 5 to 8 attempts are required.
* If the first one failes it seems like 5 to 8 attempts are required.
*/
*/
#define NUM_ADDR_RESEND_ATTEMPTS 1
0
#define NUM_ADDR_RESEND_ATTEMPTS 1
2
/* I2C clock speed, in Hz 0-400kHz*/
/* I2C clock speed, in Hz 0-400kHz*/
static
unsigned
int
scl_frequency
=
100000
;
static
unsigned
int
scl_frequency
=
100000
;
...
@@ -149,6 +150,7 @@ module_param(scl_frequency, uint, 0644);
...
@@ -149,6 +150,7 @@ module_param(scl_frequency, uint, 0644);
* @msg_index: index of current message
* @msg_index: index of current message
* @msg_len: length of current message
* @msg_len: length of current message
*/
*/
struct
stu300_dev
{
struct
stu300_dev
{
struct
platform_device
*
pdev
;
struct
platform_device
*
pdev
;
struct
i2c_adapter
adapter
;
struct
i2c_adapter
adapter
;
...
@@ -188,6 +190,27 @@ static inline u32 stu300_r8(void __iomem *address)
...
@@ -188,6 +190,27 @@ static inline u32 stu300_r8(void __iomem *address)
return
readl
(
address
)
&
0x000000FFU
;
return
readl
(
address
)
&
0x000000FFU
;
}
}
static
void
stu300_irq_enable
(
struct
stu300_dev
*
dev
)
{
u32
val
;
val
=
stu300_r8
(
dev
->
virtbase
+
I2C_CR
);
val
|=
I2C_CR_INTERRUPT_ENABLE
;
/* Twice paranoia (possible HW glitch) */
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
}
static
void
stu300_irq_disable
(
struct
stu300_dev
*
dev
)
{
u32
val
;
val
=
stu300_r8
(
dev
->
virtbase
+
I2C_CR
);
val
&=
~
I2C_CR_INTERRUPT_ENABLE
;
/* Twice paranoia (possible HW glitch) */
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
}
/*
/*
* Tells whether a certain event or events occurred in
* Tells whether a certain event or events occurred in
* response to a command. The events represent states in
* response to a command. The events represent states in
...
@@ -196,9 +219,10 @@ static inline u32 stu300_r8(void __iomem *address)
...
@@ -196,9 +219,10 @@ static inline u32 stu300_r8(void __iomem *address)
* documentation and can only be treated as abstract state
* documentation and can only be treated as abstract state
* machine states.
* machine states.
*
*
* @ret 0 = event has not occurred
, any other value means
* @ret 0 = event has not occurred
or unknown error, any
*
the event occurred
.
*
other value means the correct event occurred or an error
.
*/
*/
static
int
stu300_event_occurred
(
struct
stu300_dev
*
dev
,
static
int
stu300_event_occurred
(
struct
stu300_dev
*
dev
,
enum
stu300_event
mr_event
)
{
enum
stu300_event
mr_event
)
{
u32
status1
;
u32
status1
;
...
@@ -206,11 +230,28 @@ static int stu300_event_occurred(struct stu300_dev *dev,
...
@@ -206,11 +230,28 @@ static int stu300_event_occurred(struct stu300_dev *dev,
/* What event happened? */
/* What event happened? */
status1
=
stu300_r8
(
dev
->
virtbase
+
I2C_SR1
);
status1
=
stu300_r8
(
dev
->
virtbase
+
I2C_SR1
);
if
(
!
(
status1
&
I2C_SR1_EVF_IND
))
if
(
!
(
status1
&
I2C_SR1_EVF_IND
))
/* No event at all */
/* No event at all */
return
0
;
return
0
;
status2
=
stu300_r8
(
dev
->
virtbase
+
I2C_SR2
);
status2
=
stu300_r8
(
dev
->
virtbase
+
I2C_SR2
);
/* Block any multiple interrupts */
stu300_irq_disable
(
dev
);
/* Check for errors first */
if
(
status2
&
I2C_SR2_AF_IND
)
{
dev
->
cmd_err
=
STU300_ERROR_ACKNOWLEDGE_FAILURE
;
return
1
;
}
else
if
(
status2
&
I2C_SR2_BERR_IND
)
{
dev
->
cmd_err
=
STU300_ERROR_BUS_ERROR
;
return
1
;
}
else
if
(
status2
&
I2C_SR2_ARLO_IND
)
{
dev
->
cmd_err
=
STU300_ERROR_ARBITRATION_LOST
;
return
1
;
}
switch
(
mr_event
)
{
switch
(
mr_event
)
{
case
STU300_EVENT_1
:
case
STU300_EVENT_1
:
if
(
status1
&
I2C_SR1_ADSL_IND
)
if
(
status1
&
I2C_SR1_ADSL_IND
)
...
@@ -221,10 +262,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
...
@@ -221,10 +262,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
case
STU300_EVENT_7
:
case
STU300_EVENT_7
:
case
STU300_EVENT_8
:
case
STU300_EVENT_8
:
if
(
status1
&
I2C_SR1_BTF_IND
)
{
if
(
status1
&
I2C_SR1_BTF_IND
)
{
if
(
status2
&
I2C_SR2_AF_IND
)
dev
->
cmd_err
=
STU300_ERROR_ACKNOWLEDGE_FAILURE
;
else
if
(
status2
&
I2C_SR2_BERR_IND
)
dev
->
cmd_err
=
STU300_ERROR_BUS_ERROR
;
return
1
;
return
1
;
}
}
break
;
break
;
...
@@ -240,8 +277,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
...
@@ -240,8 +277,6 @@ static int stu300_event_occurred(struct stu300_dev *dev,
case
STU300_EVENT_6
:
case
STU300_EVENT_6
:
if
(
status2
&
I2C_SR2_ENDAD_IND
)
{
if
(
status2
&
I2C_SR2_ENDAD_IND
)
{
/* First check for any errors */
/* First check for any errors */
if
(
status2
&
I2C_SR2_AF_IND
)
dev
->
cmd_err
=
STU300_ERROR_ACKNOWLEDGE_FAILURE
;
return
1
;
return
1
;
}
}
break
;
break
;
...
@@ -252,8 +287,15 @@ static int stu300_event_occurred(struct stu300_dev *dev,
...
@@ -252,8 +287,15 @@ static int stu300_event_occurred(struct stu300_dev *dev,
default:
default:
break
;
break
;
}
}
if
(
status2
&
I2C_SR2_ARLO_IND
)
/* If we get here, we're on thin ice.
dev
->
cmd_err
=
STU300_ERROR_ARBITRATION_LOST
;
* Here we are in a status where we have
* gotten a response that does not match
* what we requested.
*/
dev
->
cmd_err
=
STU300_ERROR_UNKNOWN
;
dev_err
(
&
dev
->
pdev
->
dev
,
"Unhandled interrupt! %d sr1: 0x%x sr2: 0x%x
\n
"
,
mr_event
,
status1
,
status2
);
return
0
;
return
0
;
}
}
...
@@ -262,21 +304,20 @@ static irqreturn_t stu300_irh(int irq, void *data)
...
@@ -262,21 +304,20 @@ static irqreturn_t stu300_irh(int irq, void *data)
struct
stu300_dev
*
dev
=
data
;
struct
stu300_dev
*
dev
=
data
;
int
res
;
int
res
;
/* Just make sure that the block is clocked */
clk_enable
(
dev
->
clk
);
/* See if this was what we were waiting for */
/* See if this was what we were waiting for */
spin_lock
(
&
dev
->
cmd_issue_lock
);
spin_lock
(
&
dev
->
cmd_issue_lock
);
if
(
dev
->
cmd_event
!=
STU300_EVENT_NONE
)
{
res
=
stu300_event_occurred
(
dev
,
dev
->
cmd_event
);
res
=
stu300_event_occurred
(
dev
,
dev
->
cmd_event
);
if
(
res
||
dev
->
cmd_err
!=
STU300_ERROR_NONE
)
{
if
(
res
||
dev
->
cmd_err
!=
STU300_ERROR_NONE
)
u32
val
;
complete
(
&
dev
->
cmd_complete
);
complete
(
&
dev
->
cmd_complete
);
/* Block any multiple interrupts */
val
=
stu300_r8
(
dev
->
virtbase
+
I2C_CR
);
val
&=
~
I2C_CR_INTERRUPT_ENABLE
;
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
}
}
spin_unlock
(
&
dev
->
cmd_issue_lock
);
spin_unlock
(
&
dev
->
cmd_issue_lock
);
clk_disable
(
dev
->
clk
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
...
@@ -308,7 +349,6 @@ static int stu300_start_and_await_event(struct stu300_dev *dev,
...
@@ -308,7 +349,6 @@ static int stu300_start_and_await_event(struct stu300_dev *dev,
stu300_wr8
(
cr_value
,
dev
->
virtbase
+
I2C_CR
);
stu300_wr8
(
cr_value
,
dev
->
virtbase
+
I2C_CR
);
ret
=
wait_for_completion_interruptible_timeout
(
&
dev
->
cmd_complete
,
ret
=
wait_for_completion_interruptible_timeout
(
&
dev
->
cmd_complete
,
STU300_TIMEOUT
);
STU300_TIMEOUT
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
&
dev
->
pdev
->
dev
,
dev_err
(
&
dev
->
pdev
->
dev
,
"wait_for_completion_interruptible_timeout() "
"wait_for_completion_interruptible_timeout() "
...
@@ -342,7 +382,6 @@ static int stu300_await_event(struct stu300_dev *dev,
...
@@ -342,7 +382,6 @@ static int stu300_await_event(struct stu300_dev *dev,
enum
stu300_event
mr_event
)
enum
stu300_event
mr_event
)
{
{
int
ret
;
int
ret
;
u32
val
;
if
(
unlikely
(
irqs_disabled
()))
{
if
(
unlikely
(
irqs_disabled
()))
{
/* TODO: implement polling for this case if need be. */
/* TODO: implement polling for this case if need be. */
...
@@ -354,36 +393,18 @@ static int stu300_await_event(struct stu300_dev *dev,
...
@@ -354,36 +393,18 @@ static int stu300_await_event(struct stu300_dev *dev,
/* Is it already here? */
/* Is it already here? */
spin_lock_irq
(
&
dev
->
cmd_issue_lock
);
spin_lock_irq
(
&
dev
->
cmd_issue_lock
);
dev
->
cmd_err
=
STU300_ERROR_NONE
;
dev
->
cmd_err
=
STU300_ERROR_NONE
;
if
(
stu300_event_occurred
(
dev
,
mr_event
))
{
spin_unlock_irq
(
&
dev
->
cmd_issue_lock
);
goto
exit_await_check_err
;
}
init_completion
(
&
dev
->
cmd_complete
);
dev
->
cmd_err
=
STU300_ERROR_NONE
;
dev
->
cmd_event
=
mr_event
;
dev
->
cmd_event
=
mr_event
;
/* Turn on the I2C interrupt for current operation */
init_completion
(
&
dev
->
cmd_complete
);
val
=
stu300_r8
(
dev
->
virtbase
+
I2C_CR
);
val
|=
I2C_CR_INTERRUPT_ENABLE
;
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
/* Twice paranoia (possible HW glitch) */
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
/* Check again: is it already here? */
/* Turn on the I2C interrupt for current operation */
if
(
unlikely
(
stu300_event_occurred
(
dev
,
mr_event
)))
{
stu300_irq_enable
(
dev
);
/* Disable IRQ again. */
val
&=
~
I2C_CR_INTERRUPT_ENABLE
;
stu300_wr8
(
val
,
dev
->
virtbase
+
I2C_CR
);
spin_unlock_irq
(
&
dev
->
cmd_issue_lock
);
goto
exit_await_check_err
;
}
/* Unlock the command block and wait for the event to occur */
/* Unlock the command block and wait for the event to occur */
spin_unlock_irq
(
&
dev
->
cmd_issue_lock
);
spin_unlock_irq
(
&
dev
->
cmd_issue_lock
);
ret
=
wait_for_completion_interruptible_timeout
(
&
dev
->
cmd_complete
,
ret
=
wait_for_completion_interruptible_timeout
(
&
dev
->
cmd_complete
,
STU300_TIMEOUT
);
STU300_TIMEOUT
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
&
dev
->
pdev
->
dev
,
dev_err
(
&
dev
->
pdev
->
dev
,
"wait_for_completion_interruptible_timeout()"
"wait_for_completion_interruptible_timeout()"
...
@@ -401,7 +422,6 @@ static int stu300_await_event(struct stu300_dev *dev,
...
@@ -401,7 +422,6 @@ static int stu300_await_event(struct stu300_dev *dev,
return
-
ETIMEDOUT
;
return
-
ETIMEDOUT
;
}
}
exit_await_check_err:
if
(
dev
->
cmd_err
!=
STU300_ERROR_NONE
)
{
if
(
dev
->
cmd_err
!=
STU300_ERROR_NONE
)
{
if
(
mr_event
!=
STU300_EVENT_6
)
{
if
(
mr_event
!=
STU300_EVENT_6
)
{
dev_err
(
&
dev
->
pdev
->
dev
,
"controller "
dev_err
(
&
dev
->
pdev
->
dev
,
"controller "
...
@@ -457,18 +477,19 @@ struct stu300_clkset {
...
@@ -457,18 +477,19 @@ struct stu300_clkset {
};
};
static
const
struct
stu300_clkset
stu300_clktable
[]
=
{
static
const
struct
stu300_clkset
stu300_clktable
[]
=
{
{
0
,
0xFFU
},
{
0
,
0xFFU
},
{
2500000
,
I2C_OAR2_FR_25_10MHZ
},
{
2500000
,
I2C_OAR2_FR_25_10MHZ
},
{
10000000
,
I2C_OAR2_FR_10_1667MHZ
},
{
10000000
,
I2C_OAR2_FR_10_1667MHZ
},
{
16670000
,
I2C_OAR2_FR_1667_2667MHZ
},
{
16670000
,
I2C_OAR2_FR_1667_2667MHZ
},
{
26670000
,
I2C_OAR2_FR_2667_40MHZ
},
{
26670000
,
I2C_OAR2_FR_2667_40MHZ
},
{
40000000
,
I2C_OAR2_FR_40_5333MHZ
},
{
40000000
,
I2C_OAR2_FR_40_5333MHZ
},
{
53330000
,
I2C_OAR2_FR_5333_66MHZ
},
{
53330000
,
I2C_OAR2_FR_5333_66MHZ
},
{
66000000
,
I2C_OAR2_FR_66_80MHZ
},
{
66000000
,
I2C_OAR2_FR_66_80MHZ
},
{
80000000
,
I2C_OAR2_FR_80_100MHZ
},
{
80000000
,
I2C_OAR2_FR_80_100MHZ
},
{
100000000
,
0xFFU
},
{
100000000
,
0xFFU
},
};
};
static
int
stu300_set_clk
(
struct
stu300_dev
*
dev
,
unsigned
long
clkrate
)
static
int
stu300_set_clk
(
struct
stu300_dev
*
dev
,
unsigned
long
clkrate
)
{
{
...
@@ -494,10 +515,10 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
...
@@ -494,10 +515,10 @@ static int stu300_set_clk(struct stu300_dev *dev, unsigned long clkrate)
if
(
dev
->
speed
>
100000
)
if
(
dev
->
speed
>
100000
)
/* Fast Mode I2C */
/* Fast Mode I2C */
val
=
((
clkrate
/
dev
->
speed
)
-
9
)
/
3
;
val
=
((
clkrate
/
dev
->
speed
)
-
9
)
/
3
+
1
;
else
else
/* Standard Mode I2C */
/* Standard Mode I2C */
val
=
((
clkrate
/
dev
->
speed
)
-
7
)
/
2
;
val
=
((
clkrate
/
dev
->
speed
)
-
7
)
/
2
+
1
;
/* According to spec the divider must be > 2 */
/* According to spec the divider must be > 2 */
if
(
val
<
0x002
)
{
if
(
val
<
0x002
)
{
...
@@ -557,6 +578,7 @@ static int stu300_init_hw(struct stu300_dev *dev)
...
@@ -557,6 +578,7 @@ static int stu300_init_hw(struct stu300_dev *dev)
*/
*/
clkrate
=
clk_get_rate
(
dev
->
clk
);
clkrate
=
clk_get_rate
(
dev
->
clk
);
ret
=
stu300_set_clk
(
dev
,
clkrate
);
ret
=
stu300_set_clk
(
dev
,
clkrate
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
/*
/*
...
@@ -641,7 +663,6 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
...
@@ -641,7 +663,6 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
int
attempts
=
0
;
int
attempts
=
0
;
struct
stu300_dev
*
dev
=
i2c_get_adapdata
(
adap
);
struct
stu300_dev
*
dev
=
i2c_get_adapdata
(
adap
);
clk_enable
(
dev
->
clk
);
clk_enable
(
dev
->
clk
);
/* Remove this if (0) to trace each and every message. */
/* Remove this if (0) to trace each and every message. */
...
@@ -715,14 +736,15 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
...
@@ -715,14 +736,15 @@ static int stu300_xfer_msg(struct i2c_adapter *adap,
if
(
attempts
<
NUM_ADDR_RESEND_ATTEMPTS
&&
attempts
>
0
)
{
if
(
attempts
<
NUM_ADDR_RESEND_ATTEMPTS
&&
attempts
>
0
)
{
dev_dbg
(
&
dev
->
pdev
->
dev
,
"managed to get address "
dev_dbg
(
&
dev
->
pdev
->
dev
,
"managed to get address "
"through after %d attempts
\n
"
,
attempts
);
"through after %d attempts
\n
"
,
attempts
);
}
else
if
(
attempts
==
NUM_ADDR_RESEND_ATTEMPTS
)
{
}
else
if
(
attempts
==
NUM_ADDR_RESEND_ATTEMPTS
)
{
dev_dbg
(
&
dev
->
pdev
->
dev
,
"I give up, tried %d times "
dev_dbg
(
&
dev
->
pdev
->
dev
,
"I give up, tried %d times "
"to resend address.
\n
"
,
"to resend address.
\n
"
,
NUM_ADDR_RESEND_ATTEMPTS
);
NUM_ADDR_RESEND_ATTEMPTS
);
goto
exit_disable
;
goto
exit_disable
;
}
}
if
(
msg
->
flags
&
I2C_M_RD
)
{
if
(
msg
->
flags
&
I2C_M_RD
)
{
/* READ: we read the actual bytes one at a time */
/* READ: we read the actual bytes one at a time */
for
(
i
=
0
;
i
<
msg
->
len
;
i
++
)
{
for
(
i
=
0
;
i
<
msg
->
len
;
i
++
)
{
...
@@ -804,8 +826,10 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
...
@@ -804,8 +826,10 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
{
{
int
ret
=
-
1
;
int
ret
=
-
1
;
int
i
;
int
i
;
struct
stu300_dev
*
dev
=
i2c_get_adapdata
(
adap
);
struct
stu300_dev
*
dev
=
i2c_get_adapdata
(
adap
);
dev
->
msg_len
=
num
;
dev
->
msg_len
=
num
;
for
(
i
=
0
;
i
<
num
;
i
++
)
{
for
(
i
=
0
;
i
<
num
;
i
++
)
{
/*
/*
* Another driver appears to send stop for each message,
* Another driver appears to send stop for each message,
...
@@ -817,6 +841,7 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
...
@@ -817,6 +841,7 @@ static int stu300_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
dev
->
msg_index
=
i
;
dev
->
msg_index
=
i
;
ret
=
stu300_xfer_msg
(
adap
,
&
msgs
[
i
],
(
i
==
(
num
-
1
)));
ret
=
stu300_xfer_msg
(
adap
,
&
msgs
[
i
],
(
i
==
(
num
-
1
)));
if
(
ret
!=
0
)
{
if
(
ret
!=
0
)
{
num
=
ret
;
num
=
ret
;
break
;
break
;
...
@@ -845,6 +870,7 @@ stu300_probe(struct platform_device *pdev)
...
@@ -845,6 +870,7 @@ stu300_probe(struct platform_device *pdev)
struct
resource
*
res
;
struct
resource
*
res
;
int
bus_nr
;
int
bus_nr
;
int
ret
=
0
;
int
ret
=
0
;
char
clk_name
[]
=
"I2C0"
;
dev
=
kzalloc
(
sizeof
(
struct
stu300_dev
),
GFP_KERNEL
);
dev
=
kzalloc
(
sizeof
(
struct
stu300_dev
),
GFP_KERNEL
);
if
(
!
dev
)
{
if
(
!
dev
)
{
...
@@ -854,7 +880,8 @@ stu300_probe(struct platform_device *pdev)
...
@@ -854,7 +880,8 @@ stu300_probe(struct platform_device *pdev)
}
}
bus_nr
=
pdev
->
id
;
bus_nr
=
pdev
->
id
;
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
NULL
);
clk_name
[
3
]
+=
(
char
)
bus_nr
;
dev
->
clk
=
clk_get
(
&
pdev
->
dev
,
clk_name
);
if
(
IS_ERR
(
dev
->
clk
))
{
if
(
IS_ERR
(
dev
->
clk
))
{
ret
=
PTR_ERR
(
dev
->
clk
);
ret
=
PTR_ERR
(
dev
->
clk
);
dev_err
(
&
pdev
->
dev
,
"could not retrieve i2c bus clock
\n
"
);
dev_err
(
&
pdev
->
dev
,
"could not retrieve i2c bus clock
\n
"
);
...
...
drivers/pci/pci-driver.c
浏览文件 @
8400146d
...
@@ -508,7 +508,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev)
...
@@ -508,7 +508,7 @@ static int pci_restore_standard_config(struct pci_dev *pci_dev)
return
error
;
return
error
;
}
}
return
pci_
dev
->
state_saved
?
pci_restore_state
(
pci_dev
)
:
0
;
return
pci_
restore_state
(
pci_dev
)
;
}
}
static
void
pci_pm_default_resume_noirq
(
struct
pci_dev
*
pci_dev
)
static
void
pci_pm_default_resume_noirq
(
struct
pci_dev
*
pci_dev
)
...
...
drivers/pci/pci.c
浏览文件 @
8400146d
...
@@ -846,6 +846,8 @@ pci_restore_state(struct pci_dev *dev)
...
@@ -846,6 +846,8 @@ pci_restore_state(struct pci_dev *dev)
int
i
;
int
i
;
u32
val
;
u32
val
;
if
(
!
dev
->
state_saved
)
return
0
;
/* PCI Express register must be restored first */
/* PCI Express register must be restored first */
pci_restore_pcie_state
(
dev
);
pci_restore_pcie_state
(
dev
);
...
...
drivers/scsi/mpt2sas/mpt2sas_base.c
浏览文件 @
8400146d
...
@@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work)
...
@@ -119,6 +119,64 @@ _base_fault_reset_work(struct work_struct *work)
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
}
}
/**
* mpt2sas_base_start_watchdog - start the fault_reset_work_q
* @ioc: pointer to scsi command object
* Context: sleep.
*
* Return nothing.
*/
void
mpt2sas_base_start_watchdog
(
struct
MPT2SAS_ADAPTER
*
ioc
)
{
unsigned
long
flags
;
if
(
ioc
->
fault_reset_work_q
)
return
;
/* initialize fault polling */
INIT_DELAYED_WORK
(
&
ioc
->
fault_reset_work
,
_base_fault_reset_work
);
snprintf
(
ioc
->
fault_reset_work_q_name
,
sizeof
(
ioc
->
fault_reset_work_q_name
),
"poll_%d_status"
,
ioc
->
id
);
ioc
->
fault_reset_work_q
=
create_singlethread_workqueue
(
ioc
->
fault_reset_work_q_name
);
if
(
!
ioc
->
fault_reset_work_q
)
{
printk
(
MPT2SAS_ERR_FMT
"%s: failed (line=%d)
\n
"
,
ioc
->
name
,
__func__
,
__LINE__
);
return
;
}
spin_lock_irqsave
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
if
(
ioc
->
fault_reset_work_q
)
queue_delayed_work
(
ioc
->
fault_reset_work_q
,
&
ioc
->
fault_reset_work
,
msecs_to_jiffies
(
FAULT_POLLING_INTERVAL
));
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
}
/**
* mpt2sas_base_stop_watchdog - stop the fault_reset_work_q
* @ioc: pointer to scsi command object
* Context: sleep.
*
* Return nothing.
*/
void
mpt2sas_base_stop_watchdog
(
struct
MPT2SAS_ADAPTER
*
ioc
)
{
unsigned
long
flags
;
struct
workqueue_struct
*
wq
;
spin_lock_irqsave
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
wq
=
ioc
->
fault_reset_work_q
;
ioc
->
fault_reset_work_q
=
NULL
;
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
if
(
wq
)
{
if
(
!
cancel_delayed_work
(
&
ioc
->
fault_reset_work
))
flush_workqueue
(
wq
);
destroy_workqueue
(
wq
);
}
}
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
/**
/**
* _base_sas_ioc_info - verbose translation of the ioc status
* _base_sas_ioc_info - verbose translation of the ioc status
...
@@ -440,6 +498,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info)
...
@@ -440,6 +498,10 @@ _base_sas_log_info(struct MPT2SAS_ADAPTER *ioc , u32 log_info)
if
(
sas_loginfo
.
dw
.
bus_type
!=
3
/*SAS*/
)
if
(
sas_loginfo
.
dw
.
bus_type
!=
3
/*SAS*/
)
return
;
return
;
/* each nexus loss loginfo */
if
(
log_info
==
0x31170000
)
return
;
/* eat the loginfos associated with task aborts */
/* eat the loginfos associated with task aborts */
if
(
ioc
->
ignore_loginfos
&&
(
log_info
==
30050000
||
log_info
==
if
(
ioc
->
ignore_loginfos
&&
(
log_info
==
30050000
||
log_info
==
0x31140000
||
log_info
==
0x31130000
))
0x31140000
||
log_info
==
0x31130000
))
...
@@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
...
@@ -1109,7 +1171,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
}
}
}
}
pci_set_drvdata
(
pdev
,
ioc
->
shost
);
_base_mask_interrupts
(
ioc
);
_base_mask_interrupts
(
ioc
);
r
=
_base_enable_msix
(
ioc
);
r
=
_base_enable_msix
(
ioc
);
if
(
r
)
if
(
r
)
...
@@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
...
@@ -1132,7 +1193,6 @@ mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc)
ioc
->
pci_irq
=
-
1
;
ioc
->
pci_irq
=
-
1
;
pci_release_selected_regions
(
ioc
->
pdev
,
ioc
->
bars
);
pci_release_selected_regions
(
ioc
->
pdev
,
ioc
->
bars
);
pci_disable_device
(
pdev
);
pci_disable_device
(
pdev
);
pci_set_drvdata
(
pdev
,
NULL
);
return
r
;
return
r
;
}
}
...
@@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc)
...
@@ -3191,7 +3251,6 @@ mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc)
ioc
->
chip_phys
=
0
;
ioc
->
chip_phys
=
0
;
pci_release_selected_regions
(
ioc
->
pdev
,
ioc
->
bars
);
pci_release_selected_regions
(
ioc
->
pdev
,
ioc
->
bars
);
pci_disable_device
(
pdev
);
pci_disable_device
(
pdev
);
pci_set_drvdata
(
pdev
,
NULL
);
return
;
return
;
}
}
...
@@ -3205,7 +3264,6 @@ int
...
@@ -3205,7 +3264,6 @@ int
mpt2sas_base_attach
(
struct
MPT2SAS_ADAPTER
*
ioc
)
mpt2sas_base_attach
(
struct
MPT2SAS_ADAPTER
*
ioc
)
{
{
int
r
,
i
;
int
r
,
i
;
unsigned
long
flags
;
dinitprintk
(
ioc
,
printk
(
MPT2SAS_DEBUG_FMT
"%s
\n
"
,
ioc
->
name
,
dinitprintk
(
ioc
,
printk
(
MPT2SAS_DEBUG_FMT
"%s
\n
"
,
ioc
->
name
,
__func__
));
__func__
));
...
@@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
...
@@ -3214,6 +3272,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
if
(
r
)
if
(
r
)
return
r
;
return
r
;
pci_set_drvdata
(
ioc
->
pdev
,
ioc
->
shost
);
r
=
_base_make_ioc_ready
(
ioc
,
CAN_SLEEP
,
SOFT_RESET
);
r
=
_base_make_ioc_ready
(
ioc
,
CAN_SLEEP
,
SOFT_RESET
);
if
(
r
)
if
(
r
)
goto
out_free_resources
;
goto
out_free_resources
;
...
@@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
...
@@ -3288,23 +3347,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
if
(
r
)
if
(
r
)
goto
out_free_resources
;
goto
out_free_resources
;
/* initialize fault polling */
mpt2sas_base_start_watchdog
(
ioc
);
INIT_DELAYED_WORK
(
&
ioc
->
fault_reset_work
,
_base_fault_reset_work
);
snprintf
(
ioc
->
fault_reset_work_q_name
,
sizeof
(
ioc
->
fault_reset_work_q_name
),
"poll_%d_status"
,
ioc
->
id
);
ioc
->
fault_reset_work_q
=
create_singlethread_workqueue
(
ioc
->
fault_reset_work_q_name
);
if
(
!
ioc
->
fault_reset_work_q
)
{
printk
(
MPT2SAS_ERR_FMT
"%s: failed (line=%d)
\n
"
,
ioc
->
name
,
__func__
,
__LINE__
);
goto
out_free_resources
;
}
spin_lock_irqsave
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
if
(
ioc
->
fault_reset_work_q
)
queue_delayed_work
(
ioc
->
fault_reset_work_q
,
&
ioc
->
fault_reset_work
,
msecs_to_jiffies
(
FAULT_POLLING_INTERVAL
));
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
return
0
;
return
0
;
out_free_resources:
out_free_resources:
...
@@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
...
@@ -3312,6 +3355,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
ioc
->
remove_host
=
1
;
ioc
->
remove_host
=
1
;
mpt2sas_base_free_resources
(
ioc
);
mpt2sas_base_free_resources
(
ioc
);
_base_release_memory_pools
(
ioc
);
_base_release_memory_pools
(
ioc
);
pci_set_drvdata
(
ioc
->
pdev
,
NULL
);
kfree
(
ioc
->
tm_cmds
.
reply
);
kfree
(
ioc
->
tm_cmds
.
reply
);
kfree
(
ioc
->
transport_cmds
.
reply
);
kfree
(
ioc
->
transport_cmds
.
reply
);
kfree
(
ioc
->
config_cmds
.
reply
);
kfree
(
ioc
->
config_cmds
.
reply
);
...
@@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
...
@@ -3337,22 +3381,14 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
void
void
mpt2sas_base_detach
(
struct
MPT2SAS_ADAPTER
*
ioc
)
mpt2sas_base_detach
(
struct
MPT2SAS_ADAPTER
*
ioc
)
{
{
unsigned
long
flags
;
struct
workqueue_struct
*
wq
;
dexitprintk
(
ioc
,
printk
(
MPT2SAS_DEBUG_FMT
"%s
\n
"
,
ioc
->
name
,
dexitprintk
(
ioc
,
printk
(
MPT2SAS_DEBUG_FMT
"%s
\n
"
,
ioc
->
name
,
__func__
));
__func__
));
spin_lock_irqsave
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
mpt2sas_base_stop_watchdog
(
ioc
);
wq
=
ioc
->
fault_reset_work_q
;
ioc
->
fault_reset_work_q
=
NULL
;
spin_unlock_irqrestore
(
&
ioc
->
ioc_reset_in_progress_lock
,
flags
);
if
(
!
cancel_delayed_work
(
&
ioc
->
fault_reset_work
))
flush_workqueue
(
wq
);
destroy_workqueue
(
wq
);
mpt2sas_base_free_resources
(
ioc
);
mpt2sas_base_free_resources
(
ioc
);
_base_release_memory_pools
(
ioc
);
_base_release_memory_pools
(
ioc
);
pci_set_drvdata
(
ioc
->
pdev
,
NULL
);
kfree
(
ioc
->
pfacts
);
kfree
(
ioc
->
pfacts
);
kfree
(
ioc
->
ctl_cmds
.
reply
);
kfree
(
ioc
->
ctl_cmds
.
reply
);
kfree
(
ioc
->
base_cmds
.
reply
);
kfree
(
ioc
->
base_cmds
.
reply
);
...
...
drivers/scsi/mpt2sas/mpt2sas_base.h
浏览文件 @
8400146d
...
@@ -69,10 +69,10 @@
...
@@ -69,10 +69,10 @@
#define MPT2SAS_DRIVER_NAME "mpt2sas"
#define MPT2SAS_DRIVER_NAME "mpt2sas"
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
#define MPT2SAS_DRIVER_VERSION "01.100.0
3
.00"
#define MPT2SAS_DRIVER_VERSION "01.100.0
4
.00"
#define MPT2SAS_MAJOR_VERSION 01
#define MPT2SAS_MAJOR_VERSION 01
#define MPT2SAS_MINOR_VERSION 100
#define MPT2SAS_MINOR_VERSION 100
#define MPT2SAS_BUILD_VERSION 0
3
#define MPT2SAS_BUILD_VERSION 0
4
#define MPT2SAS_RELEASE_VERSION 00
#define MPT2SAS_RELEASE_VERSION 00
/*
/*
...
@@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID,
...
@@ -673,6 +673,8 @@ typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID,
/* base shared API */
/* base shared API */
extern
struct
list_head
mpt2sas_ioc_list
;
extern
struct
list_head
mpt2sas_ioc_list
;
void
mpt2sas_base_start_watchdog
(
struct
MPT2SAS_ADAPTER
*
ioc
);
void
mpt2sas_base_stop_watchdog
(
struct
MPT2SAS_ADAPTER
*
ioc
);
int
mpt2sas_base_attach
(
struct
MPT2SAS_ADAPTER
*
ioc
);
int
mpt2sas_base_attach
(
struct
MPT2SAS_ADAPTER
*
ioc
);
void
mpt2sas_base_detach
(
struct
MPT2SAS_ADAPTER
*
ioc
);
void
mpt2sas_base_detach
(
struct
MPT2SAS_ADAPTER
*
ioc
);
...
...
drivers/scsi/mpt2sas/mpt2sas_config.c
浏览文件 @
8400146d
...
@@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
...
@@ -236,17 +236,25 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
Mpi2ConfigRequest_t
*
config_request
;
Mpi2ConfigRequest_t
*
config_request
;
int
r
;
int
r
;
u8
retry_count
;
u8
retry_count
;
u8
issue_
reset
;
u8
issue_
host_reset
=
0
;
u16
wait_state_count
;
u16
wait_state_count
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
if
(
ioc
->
config_cmds
.
status
!=
MPT2_CMD_NOT_USED
)
{
if
(
ioc
->
config_cmds
.
status
!=
MPT2_CMD_NOT_USED
)
{
printk
(
MPT2SAS_ERR_FMT
"%s: config_cmd in use
\n
"
,
printk
(
MPT2SAS_ERR_FMT
"%s: config_cmd in use
\n
"
,
ioc
->
name
,
__func__
);
ioc
->
name
,
__func__
);
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
-
EAGAIN
;
return
-
EAGAIN
;
}
}
retry_count
=
0
;
retry_count
=
0
;
retry_config:
retry_config:
if
(
retry_count
)
{
if
(
retry_count
>
2
)
/* attempt only 2 retries */
return
-
EFAULT
;
printk
(
MPT2SAS_INFO_FMT
"%s: attempting retry (%d)
\n
"
,
ioc
->
name
,
__func__
,
retry_count
);
}
wait_state_count
=
0
;
wait_state_count
=
0
;
ioc_state
=
mpt2sas_base_get_iocstate
(
ioc
,
1
);
ioc_state
=
mpt2sas_base_get_iocstate
(
ioc
,
1
);
while
(
ioc_state
!=
MPI2_IOC_STATE_OPERATIONAL
)
{
while
(
ioc_state
!=
MPI2_IOC_STATE_OPERATIONAL
)
{
...
@@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
...
@@ -254,8 +262,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
printk
(
MPT2SAS_ERR_FMT
printk
(
MPT2SAS_ERR_FMT
"%s: failed due to ioc not operational
\n
"
,
"%s: failed due to ioc not operational
\n
"
,
ioc
->
name
,
__func__
);
ioc
->
name
,
__func__
);
ioc
->
config_cmds
.
status
=
MPT2_CMD_NOT_USED
;
r
=
-
EFAULT
;
return
-
EFAULT
;
goto
out
;
}
}
ssleep
(
1
);
ssleep
(
1
);
ioc_state
=
mpt2sas_base_get_iocstate
(
ioc
,
1
);
ioc_state
=
mpt2sas_base_get_iocstate
(
ioc
,
1
);
...
@@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
...
@@ -271,8 +279,8 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
if
(
!
smid
)
{
if
(
!
smid
)
{
printk
(
MPT2SAS_ERR_FMT
"%s: failed obtaining a smid
\n
"
,
printk
(
MPT2SAS_ERR_FMT
"%s: failed obtaining a smid
\n
"
,
ioc
->
name
,
__func__
);
ioc
->
name
,
__func__
);
ioc
->
config_cmds
.
status
=
MPT2_CMD_NOT_USED
;
r
=
-
EAGAIN
;
return
-
EAGAIN
;
goto
out
;
}
}
r
=
0
;
r
=
0
;
...
@@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
...
@@ -292,9 +300,15 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
ioc
->
name
,
__func__
);
ioc
->
name
,
__func__
);
_debug_dump_mf
(
mpi_request
,
_debug_dump_mf
(
mpi_request
,
sizeof
(
Mpi2ConfigRequest_t
)
/
4
);
sizeof
(
Mpi2ConfigRequest_t
)
/
4
);
if
(
!
(
ioc
->
config_cmds
.
status
&
MPT2_CMD_RESET
))
retry_count
++
;
issue_reset
=
1
;
if
(
ioc
->
config_cmds
.
smid
==
smid
)
goto
issue_host_reset
;
mpt2sas_base_free_smid
(
ioc
,
smid
);
if
((
ioc
->
shost_recovery
)
||
(
ioc
->
config_cmds
.
status
&
MPT2_CMD_RESET
))
goto
retry_config
;
issue_host_reset
=
1
;
r
=
-
EFAULT
;
goto
out
;
}
}
if
(
ioc
->
config_cmds
.
status
&
MPT2_CMD_REPLY_VALID
)
if
(
ioc
->
config_cmds
.
status
&
MPT2_CMD_REPLY_VALID
)
memcpy
(
mpi_reply
,
ioc
->
config_cmds
.
reply
,
memcpy
(
mpi_reply
,
ioc
->
config_cmds
.
reply
,
...
@@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
...
@@ -302,21 +316,13 @@ _config_request(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigRequest_t
if
(
retry_count
)
if
(
retry_count
)
printk
(
MPT2SAS_INFO_FMT
"%s: retry completed!!
\n
"
,
printk
(
MPT2SAS_INFO_FMT
"%s: retry completed!!
\n
"
,
ioc
->
name
,
__func__
);
ioc
->
name
,
__func__
);
out:
ioc
->
config_cmds
.
status
=
MPT2_CMD_NOT_USED
;
ioc
->
config_cmds
.
status
=
MPT2_CMD_NOT_USED
;
return
r
;
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
if
(
issue_host_reset
)
issue_host_reset:
if
(
issue_reset
)
mpt2sas_base_hard_reset_handler
(
ioc
,
CAN_SLEEP
,
mpt2sas_base_hard_reset_handler
(
ioc
,
CAN_SLEEP
,
FORCE_BIG_HAMMER
);
FORCE_BIG_HAMMER
);
ioc
->
config_cmds
.
status
=
MPT2_CMD_NOT_USED
;
return
r
;
if
(
!
retry_count
)
{
printk
(
MPT2SAS_INFO_FMT
"%s: attempting retry
\n
"
,
ioc
->
name
,
__func__
);
retry_count
++
;
goto
retry_config
;
}
return
-
EFAULT
;
}
}
/**
/**
...
@@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -375,7 +381,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2ManufacturingPage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2ManufacturingPage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -417,7 +422,6 @@ mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
...
@@ -438,7 +442,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2BiosPage2_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2BiosPage2_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
...
@@ -480,7 +483,6 @@ mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -501,7 +503,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2BiosPage3_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2BiosPage3_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -543,7 +544,6 @@ mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -564,7 +564,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOUnitPage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOUnitPage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -606,7 +605,6 @@ mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -627,7 +625,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOUnitPage1_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOUnitPage1_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -669,7 +666,6 @@ mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -690,7 +686,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Action
=
MPI2_CONFIG_ACTION_PAGE_HEADER
;
mpi_request
.
Action
=
MPI2_CONFIG_ACTION_PAGE_HEADER
;
...
@@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -732,7 +727,6 @@ mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
...
@@ -753,7 +747,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOCPage8_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2IOCPage8_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
...
@@ -795,7 +788,6 @@ mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -818,7 +810,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasDevicePage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasDevicePage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -863,7 +854,6 @@ mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -886,7 +876,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasDevicePage1_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasDevicePage1_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -931,7 +920,6 @@ mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
...
@@ -953,7 +941,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
Mpi2ConfigReply_t
mpi_reply
;
Mpi2ConfigReply_t
mpi_reply
;
Mpi2SasIOUnitPage0_t
config_page
;
Mpi2SasIOUnitPage0_t
config_page
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Action
=
MPI2_CONFIG_ACTION_PAGE_HEADER
;
mpi_request
.
Action
=
MPI2_CONFIG_ACTION_PAGE_HEADER
;
...
@@ -1002,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
...
@@ -1002,7 +989,6 @@ mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys)
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1026,8 +1012,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
Mpi2ConfigRequest_t
mpi_request
;
Mpi2ConfigRequest_t
mpi_request
;
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sz
);
memset
(
config_page
,
0
,
sz
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1070,7 +1054,6 @@ mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1095,7 +1078,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sz
);
memset
(
config_page
,
0
,
sz
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1138,7 +1120,6 @@ mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1161,7 +1142,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2ExpanderPage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2ExpanderPage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1206,7 +1186,6 @@ mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1230,7 +1209,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2ExpanderPage1_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2ExpanderPage1_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1277,7 +1255,6 @@ mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1300,7 +1277,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasEnclosurePage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasEnclosurePage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1345,7 +1321,6 @@ mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1367,7 +1342,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasPhyPage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasPhyPage0_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1413,7 +1387,6 @@ mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1435,7 +1408,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasPhyPage1_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2SasPhyPage1_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1481,7 +1453,6 @@ mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -1505,7 +1476,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
config_page
,
0
,
sizeof
(
Mpi2RaidVolPage1_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2RaidVolPage1_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
...
@@ -1548,7 +1518,6 @@ mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
...
@@ -1572,7 +1541,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
struct
config_request
mem
;
struct
config_request
mem
;
u16
ioc_status
;
u16
ioc_status
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
*
num_pds
=
0
;
*
num_pds
=
0
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
...
@@ -1620,7 +1588,6 @@ mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -1645,7 +1612,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
config_page
,
0
,
sz
);
memset
(
config_page
,
0
,
sz
);
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
...
@@ -1687,7 +1653,6 @@ mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1711,7 +1676,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
int
r
;
int
r
;
struct
config_request
mem
;
struct
config_request
mem
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2RaidPhysDiskPage0_t
));
memset
(
config_page
,
0
,
sizeof
(
Mpi2RaidPhysDiskPage0_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
...
@@ -1754,7 +1718,6 @@ mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
@@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
...
@@ -1778,7 +1741,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
struct
config_request
mem
;
struct
config_request
mem
;
u16
ioc_status
;
u16
ioc_status
;
mutex_lock
(
&
ioc
->
config_cmds
.
mutex
);
*
volume_handle
=
0
;
*
volume_handle
=
0
;
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
memset
(
&
mpi_request
,
0
,
sizeof
(
Mpi2ConfigRequest_t
));
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
mpi_request
.
Function
=
MPI2_FUNCTION_CONFIG
;
...
@@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
...
@@ -1842,7 +1804,6 @@ mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
_config_free_config_dma_memory
(
ioc
,
&
mem
);
_config_free_config_dma_memory
(
ioc
,
&
mem
);
out:
out:
mutex_unlock
(
&
ioc
->
config_cmds
.
mutex
);
return
r
;
return
r
;
}
}
...
...
drivers/scsi/mpt2sas/mpt2sas_scsih.c
浏览文件 @
8400146d
...
@@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
...
@@ -2767,6 +2767,10 @@ _scsih_scsi_ioc_info(struct MPT2SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
char
*
desc_ioc_state
=
NULL
;
char
*
desc_ioc_state
=
NULL
;
char
*
desc_scsi_status
=
NULL
;
char
*
desc_scsi_status
=
NULL
;
char
*
desc_scsi_state
=
ioc
->
tmp_string
;
char
*
desc_scsi_state
=
ioc
->
tmp_string
;
u32
log_info
=
le32_to_cpu
(
mpi_reply
->
IOCLogInfo
);
if
(
log_info
==
0x31170000
)
return
;
switch
(
ioc_status
)
{
switch
(
ioc_status
)
{
case
MPI2_IOCSTATUS_SUCCESS
:
case
MPI2_IOCSTATUS_SUCCESS
:
...
@@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
...
@@ -3426,7 +3430,7 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
__le64
sas_address
;
__le64
sas_address
;
int
i
;
int
i
;
unsigned
long
flags
;
unsigned
long
flags
;
struct
_sas_port
*
mpt2sas_port
;
struct
_sas_port
*
mpt2sas_port
=
NULL
;
int
rc
=
0
;
int
rc
=
0
;
if
(
!
handle
)
if
(
!
handle
)
...
@@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
...
@@ -3518,12 +3522,20 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
&
expander_pg1
,
i
,
handle
)))
{
&
expander_pg1
,
i
,
handle
)))
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
continue
;
rc
=
-
1
;
goto
out_fail
;
}
}
sas_expander
->
phy
[
i
].
handle
=
handle
;
sas_expander
->
phy
[
i
].
handle
=
handle
;
sas_expander
->
phy
[
i
].
phy_id
=
i
;
sas_expander
->
phy
[
i
].
phy_id
=
i
;
mpt2sas_transport_add_expander_phy
(
ioc
,
&
sas_expander
->
phy
[
i
],
expander_pg1
,
sas_expander
->
parent_dev
);
if
((
mpt2sas_transport_add_expander_phy
(
ioc
,
&
sas_expander
->
phy
[
i
],
expander_pg1
,
sas_expander
->
parent_dev
)))
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
rc
=
-
1
;
goto
out_fail
;
}
}
}
if
(
sas_expander
->
enclosure_handle
)
{
if
(
sas_expander
->
enclosure_handle
)
{
...
@@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
...
@@ -3540,8 +3552,9 @@ _scsih_expander_add(struct MPT2SAS_ADAPTER *ioc, u16 handle)
out_fail:
out_fail:
if
(
sas_expander
)
if
(
mpt2sas_port
)
kfree
(
sas_expander
->
phy
);
mpt2sas_transport_port_remove
(
ioc
,
sas_expander
->
sas_address
,
sas_expander
->
parent_handle
);
kfree
(
sas_expander
);
kfree
(
sas_expander
);
return
rc
;
return
rc
;
}
}
...
@@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd)
...
@@ -3663,12 +3676,11 @@ _scsih_add_device(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 phy_num, u8 is_pd)
sas_device
->
hidden_raid_component
=
is_pd
;
sas_device
->
hidden_raid_component
=
is_pd
;
/* get enclosure_logical_id */
/* get enclosure_logical_id */
if
(
!
(
mpt2sas_config_get_enclosure_pg0
(
ioc
,
&
mpi_reply
,
&
enclosure_pg0
,
if
(
sas_device
->
enclosure_handle
&&
!
(
mpt2sas_config_get_enclosure_pg0
(
MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE
,
ioc
,
&
mpi_reply
,
&
enclosure_pg0
,
MPI2_SAS_ENCLOS_PGAD_FORM_HANDLE
,
sas_device
->
enclosure_handle
)))
{
sas_device
->
enclosure_handle
)))
sas_device
->
enclosure_logical_id
=
sas_device
->
enclosure_logical_id
=
le64_to_cpu
(
enclosure_pg0
.
EnclosureLogicalID
);
le64_to_cpu
(
enclosure_pg0
.
EnclosureLogicalID
);
}
/* get device name */
/* get device name */
sas_device
->
device_name
=
le64_to_cpu
(
sas_device_pg0
.
DeviceName
);
sas_device
->
device_name
=
le64_to_cpu
(
sas_device_pg0
.
DeviceName
);
...
@@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
...
@@ -4250,12 +4262,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
u16
handle
=
le16_to_cpu
(
element
->
VolDevHandle
);
u16
handle
=
le16_to_cpu
(
element
->
VolDevHandle
);
int
rc
;
int
rc
;
#if 0 /* RAID_HACKS */
if (le32_to_cpu(event_data->Flags) &
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
return;
#endif
mpt2sas_config_get_volume_wwid
(
ioc
,
handle
,
&
wwid
);
mpt2sas_config_get_volume_wwid
(
ioc
,
handle
,
&
wwid
);
if
(
!
wwid
)
{
if
(
!
wwid
)
{
printk
(
MPT2SAS_ERR_FMT
printk
(
MPT2SAS_ERR_FMT
...
@@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
...
@@ -4310,12 +4316,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
unsigned
long
flags
;
unsigned
long
flags
;
struct
MPT2SAS_TARGET
*
sas_target_priv_data
;
struct
MPT2SAS_TARGET
*
sas_target_priv_data
;
#if 0 /* RAID_HACKS */
if (le32_to_cpu(event_data->Flags) &
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
return;
#endif
spin_lock_irqsave
(
&
ioc
->
raid_device_lock
,
flags
);
spin_lock_irqsave
(
&
ioc
->
raid_device_lock
,
flags
);
raid_device
=
_scsih_raid_device_find_by_handle
(
ioc
,
handle
);
raid_device
=
_scsih_raid_device_find_by_handle
(
ioc
,
handle
);
spin_unlock_irqrestore
(
&
ioc
->
raid_device_lock
,
flags
);
spin_unlock_irqrestore
(
&
ioc
->
raid_device_lock
,
flags
);
...
@@ -4428,14 +4428,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
...
@@ -4428,14 +4428,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
struct
_sas_device
*
sas_device
;
struct
_sas_device
*
sas_device
;
unsigned
long
flags
;
unsigned
long
flags
;
u16
handle
=
le16_to_cpu
(
element
->
PhysDiskDevHandle
);
u16
handle
=
le16_to_cpu
(
element
->
PhysDiskDevHandle
);
Mpi2ConfigReply_t
mpi_reply
;
Mpi2SasDevicePage0_t
sas_device_pg0
;
u32
ioc_status
;
spin_lock_irqsave
(
&
ioc
->
sas_device_lock
,
flags
);
spin_lock_irqsave
(
&
ioc
->
sas_device_lock
,
flags
);
sas_device
=
_scsih_sas_device_find_by_handle
(
ioc
,
handle
);
sas_device
=
_scsih_sas_device_find_by_handle
(
ioc
,
handle
);
spin_unlock_irqrestore
(
&
ioc
->
sas_device_lock
,
flags
);
spin_unlock_irqrestore
(
&
ioc
->
sas_device_lock
,
flags
);
if
(
sas_device
)
if
(
sas_device
)
{
sas_device
->
hidden_raid_component
=
1
;
sas_device
->
hidden_raid_component
=
1
;
else
return
;
_scsih_add_device
(
ioc
,
handle
,
0
,
1
);
}
if
((
mpt2sas_config_get_sas_device_pg0
(
ioc
,
&
mpi_reply
,
&
sas_device_pg0
,
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE
,
handle
)))
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
return
;
}
ioc_status
=
le16_to_cpu
(
mpi_reply
.
IOCStatus
)
&
MPI2_IOCSTATUS_MASK
;
if
(
ioc_status
!=
MPI2_IOCSTATUS_SUCCESS
)
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
return
;
}
_scsih_link_change
(
ioc
,
le16_to_cpu
(
sas_device_pg0
.
ParentDevHandle
),
handle
,
sas_device_pg0
.
PhyNum
,
MPI2_SAS_NEG_LINK_RATE_1_5
);
_scsih_add_device
(
ioc
,
handle
,
0
,
1
);
}
}
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
...
@@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
...
@@ -4535,12 +4559,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
{
{
Mpi2EventIrConfigElement_t
*
element
;
Mpi2EventIrConfigElement_t
*
element
;
int
i
;
int
i
;
u8
foreign_config
;
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
if
(
ioc
->
logging_level
&
MPT_DEBUG_EVENT_WORK_TASK
)
if
(
ioc
->
logging_level
&
MPT_DEBUG_EVENT_WORK_TASK
)
_scsih_sas_ir_config_change_event_debug
(
ioc
,
event_data
);
_scsih_sas_ir_config_change_event_debug
(
ioc
,
event_data
);
#endif
#endif
foreign_config
=
(
le32_to_cpu
(
event_data
->
Flags
)
&
MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG
)
?
1
:
0
;
element
=
(
Mpi2EventIrConfigElement_t
*
)
&
event_data
->
ConfigElement
[
0
];
element
=
(
Mpi2EventIrConfigElement_t
*
)
&
event_data
->
ConfigElement
[
0
];
for
(
i
=
0
;
i
<
event_data
->
NumElements
;
i
++
,
element
++
)
{
for
(
i
=
0
;
i
<
event_data
->
NumElements
;
i
++
,
element
++
)
{
...
@@ -4548,11 +4575,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
...
@@ -4548,11 +4575,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
switch
(
element
->
ReasonCode
)
{
switch
(
element
->
ReasonCode
)
{
case
MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED
:
case
MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED
:
case
MPI2_EVENT_IR_CHANGE_RC_ADDED
:
case
MPI2_EVENT_IR_CHANGE_RC_ADDED
:
_scsih_sas_volume_add
(
ioc
,
element
);
if
(
!
foreign_config
)
_scsih_sas_volume_add
(
ioc
,
element
);
break
;
break
;
case
MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED
:
case
MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED
:
case
MPI2_EVENT_IR_CHANGE_RC_REMOVED
:
case
MPI2_EVENT_IR_CHANGE_RC_REMOVED
:
_scsih_sas_volume_delete
(
ioc
,
element
);
if
(
!
foreign_config
)
_scsih_sas_volume_delete
(
ioc
,
element
);
break
;
break
;
case
MPI2_EVENT_IR_CHANGE_RC_PD_CREATED
:
case
MPI2_EVENT_IR_CHANGE_RC_PD_CREATED
:
_scsih_sas_pd_hide
(
ioc
,
element
);
_scsih_sas_pd_hide
(
ioc
,
element
);
...
@@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
...
@@ -4671,6 +4700,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
u32
state
;
u32
state
;
struct
_sas_device
*
sas_device
;
struct
_sas_device
*
sas_device
;
unsigned
long
flags
;
unsigned
long
flags
;
Mpi2ConfigReply_t
mpi_reply
;
Mpi2SasDevicePage0_t
sas_device_pg0
;
u32
ioc_status
;
if
(
event_data
->
ReasonCode
!=
MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED
)
if
(
event_data
->
ReasonCode
!=
MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED
)
return
;
return
;
...
@@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
...
@@ -4687,22 +4719,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
spin_unlock_irqrestore
(
&
ioc
->
sas_device_lock
,
flags
);
spin_unlock_irqrestore
(
&
ioc
->
sas_device_lock
,
flags
);
switch
(
state
)
{
switch
(
state
)
{
#if 0
case MPI2_RAID_PD_STATE_OFFLINE:
if (sas_device)
_scsih_remove_device(ioc, handle);
break;
#endif
case
MPI2_RAID_PD_STATE_ONLINE
:
case
MPI2_RAID_PD_STATE_ONLINE
:
case
MPI2_RAID_PD_STATE_DEGRADED
:
case
MPI2_RAID_PD_STATE_DEGRADED
:
case
MPI2_RAID_PD_STATE_REBUILDING
:
case
MPI2_RAID_PD_STATE_REBUILDING
:
case
MPI2_RAID_PD_STATE_OPTIMAL
:
case
MPI2_RAID_PD_STATE_OPTIMAL
:
if
(
sas_device
)
if
(
sas_device
)
{
sas_device
->
hidden_raid_component
=
1
;
sas_device
->
hidden_raid_component
=
1
;
else
return
;
_scsih_add_device
(
ioc
,
handle
,
0
,
1
);
}
if
((
mpt2sas_config_get_sas_device_pg0
(
ioc
,
&
mpi_reply
,
&
sas_device_pg0
,
MPI2_SAS_DEVICE_PGAD_FORM_HANDLE
,
handle
)))
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
return
;
}
ioc_status
=
le16_to_cpu
(
mpi_reply
.
IOCStatus
)
&
MPI2_IOCSTATUS_MASK
;
if
(
ioc_status
!=
MPI2_IOCSTATUS_SUCCESS
)
{
printk
(
MPT2SAS_ERR_FMT
"failure at %s:%d/%s()!
\n
"
,
ioc
->
name
,
__FILE__
,
__LINE__
,
__func__
);
return
;
}
_scsih_link_change
(
ioc
,
le16_to_cpu
(
sas_device_pg0
.
ParentDevHandle
),
handle
,
sas_device_pg0
.
PhyNum
,
MPI2_SAS_NEG_LINK_RATE_1_5
);
_scsih_add_device
(
ioc
,
handle
,
0
,
1
);
break
;
break
;
case
MPI2_RAID_PD_STATE_OFFLINE
:
case
MPI2_RAID_PD_STATE_NOT_CONFIGURED
:
case
MPI2_RAID_PD_STATE_NOT_CONFIGURED
:
case
MPI2_RAID_PD_STATE_NOT_COMPATIBLE
:
case
MPI2_RAID_PD_STATE_NOT_COMPATIBLE
:
case
MPI2_RAID_PD_STATE_HOT_SPARE
:
case
MPI2_RAID_PD_STATE_HOT_SPARE
:
...
@@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
...
@@ -5774,6 +5824,7 @@ _scsih_suspend(struct pci_dev *pdev, pm_message_t state)
struct
MPT2SAS_ADAPTER
*
ioc
=
shost_priv
(
shost
);
struct
MPT2SAS_ADAPTER
*
ioc
=
shost_priv
(
shost
);
u32
device_state
;
u32
device_state
;
mpt2sas_base_stop_watchdog
(
ioc
);
flush_scheduled_work
();
flush_scheduled_work
();
scsi_block_requests
(
shost
);
scsi_block_requests
(
shost
);
device_state
=
pci_choose_state
(
pdev
,
state
);
device_state
=
pci_choose_state
(
pdev
,
state
);
...
@@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev)
...
@@ -5816,6 +5867,7 @@ _scsih_resume(struct pci_dev *pdev)
mpt2sas_base_hard_reset_handler
(
ioc
,
CAN_SLEEP
,
SOFT_RESET
);
mpt2sas_base_hard_reset_handler
(
ioc
,
CAN_SLEEP
,
SOFT_RESET
);
scsi_unblock_requests
(
shost
);
scsi_unblock_requests
(
shost
);
mpt2sas_base_start_watchdog
(
ioc
);
return
0
;
return
0
;
}
}
#endif
/* CONFIG_PM */
#endif
/* CONFIG_PM */
...
...
fs/btrfs/inode.c
浏览文件 @
8400146d
...
@@ -3099,8 +3099,12 @@ static void inode_tree_add(struct inode *inode)
...
@@ -3099,8 +3099,12 @@ static void inode_tree_add(struct inode *inode)
{
{
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
struct
btrfs_inode
*
entry
;
struct
btrfs_inode
*
entry
;
struct
rb_node
**
p
=
&
root
->
inode_tree
.
rb_node
;
struct
rb_node
**
p
;
struct
rb_node
*
parent
=
NULL
;
struct
rb_node
*
parent
;
again:
p
=
&
root
->
inode_tree
.
rb_node
;
parent
=
NULL
;
spin_lock
(
&
root
->
inode_lock
);
spin_lock
(
&
root
->
inode_lock
);
while
(
*
p
)
{
while
(
*
p
)
{
...
@@ -3108,13 +3112,16 @@ static void inode_tree_add(struct inode *inode)
...
@@ -3108,13 +3112,16 @@ static void inode_tree_add(struct inode *inode)
entry
=
rb_entry
(
parent
,
struct
btrfs_inode
,
rb_node
);
entry
=
rb_entry
(
parent
,
struct
btrfs_inode
,
rb_node
);
if
(
inode
->
i_ino
<
entry
->
vfs_inode
.
i_ino
)
if
(
inode
->
i_ino
<
entry
->
vfs_inode
.
i_ino
)
p
=
&
(
*
p
)
->
rb_left
;
p
=
&
parent
->
rb_left
;
else
if
(
inode
->
i_ino
>
entry
->
vfs_inode
.
i_ino
)
else
if
(
inode
->
i_ino
>
entry
->
vfs_inode
.
i_ino
)
p
=
&
(
*
p
)
->
rb_right
;
p
=
&
parent
->
rb_right
;
else
{
else
{
WARN_ON
(
!
(
entry
->
vfs_inode
.
i_state
&
WARN_ON
(
!
(
entry
->
vfs_inode
.
i_state
&
(
I_WILL_FREE
|
I_FREEING
|
I_CLEAR
)));
(
I_WILL_FREE
|
I_FREEING
|
I_CLEAR
)));
break
;
rb_erase
(
parent
,
&
root
->
inode_tree
);
RB_CLEAR_NODE
(
parent
);
spin_unlock
(
&
root
->
inode_lock
);
goto
again
;
}
}
}
}
rb_link_node
(
&
BTRFS_I
(
inode
)
->
rb_node
,
parent
,
p
);
rb_link_node
(
&
BTRFS_I
(
inode
)
->
rb_node
,
parent
,
p
);
...
@@ -3126,12 +3133,12 @@ static void inode_tree_del(struct inode *inode)
...
@@ -3126,12 +3133,12 @@ static void inode_tree_del(struct inode *inode)
{
{
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
struct
btrfs_root
*
root
=
BTRFS_I
(
inode
)
->
root
;
spin_lock
(
&
root
->
inode_lock
);
if
(
!
RB_EMPTY_NODE
(
&
BTRFS_I
(
inode
)
->
rb_node
))
{
if
(
!
RB_EMPTY_NODE
(
&
BTRFS_I
(
inode
)
->
rb_node
))
{
spin_lock
(
&
root
->
inode_lock
);
rb_erase
(
&
BTRFS_I
(
inode
)
->
rb_node
,
&
root
->
inode_tree
);
rb_erase
(
&
BTRFS_I
(
inode
)
->
rb_node
,
&
root
->
inode_tree
);
spin_unlock
(
&
root
->
inode_lock
);
RB_CLEAR_NODE
(
&
BTRFS_I
(
inode
)
->
rb_node
);
RB_CLEAR_NODE
(
&
BTRFS_I
(
inode
)
->
rb_node
);
}
}
spin_unlock
(
&
root
->
inode_lock
);
}
}
static
noinline
void
init_btrfs_i
(
struct
inode
*
inode
)
static
noinline
void
init_btrfs_i
(
struct
inode
*
inode
)
...
...
fs/buffer.c
浏览文件 @
8400146d
...
@@ -1165,8 +1165,11 @@ void mark_buffer_dirty(struct buffer_head *bh)
...
@@ -1165,8 +1165,11 @@ void mark_buffer_dirty(struct buffer_head *bh)
if
(
!
test_set_buffer_dirty
(
bh
))
{
if
(
!
test_set_buffer_dirty
(
bh
))
{
struct
page
*
page
=
bh
->
b_page
;
struct
page
*
page
=
bh
->
b_page
;
if
(
!
TestSetPageDirty
(
page
))
if
(
!
TestSetPageDirty
(
page
))
{
__set_page_dirty
(
page
,
page_mapping
(
page
),
0
);
struct
address_space
*
mapping
=
page_mapping
(
page
);
if
(
mapping
)
__set_page_dirty
(
page
,
mapping
,
0
);
}
}
}
}
}
...
...
include/drm/radeon_drm.h
浏览文件 @
8400146d
...
@@ -508,6 +508,7 @@ typedef struct {
...
@@ -508,6 +508,7 @@ typedef struct {
#define DRM_RADEON_INFO 0x27
#define DRM_RADEON_INFO 0x27
#define DRM_RADEON_GEM_SET_TILING 0x28
#define DRM_RADEON_GEM_SET_TILING 0x28
#define DRM_RADEON_GEM_GET_TILING 0x29
#define DRM_RADEON_GEM_GET_TILING 0x29
#define DRM_RADEON_GEM_BUSY 0x2a
#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
...
@@ -548,6 +549,7 @@ typedef struct {
...
@@ -548,6 +549,7 @@ typedef struct {
#define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info)
#define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info)
#define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
#define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling)
#define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
#define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling)
#define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy)
typedef
struct
drm_radeon_init
{
typedef
struct
drm_radeon_init
{
enum
{
enum
{
...
@@ -707,6 +709,7 @@ typedef struct drm_radeon_indirect {
...
@@ -707,6 +709,7 @@ typedef struct drm_radeon_indirect {
#define RADEON_PARAM_FB_LOCATION 14
/* FB location */
#define RADEON_PARAM_FB_LOCATION 14
/* FB location */
#define RADEON_PARAM_NUM_GB_PIPES 15
/* num GB pipes */
#define RADEON_PARAM_NUM_GB_PIPES 15
/* num GB pipes */
#define RADEON_PARAM_DEVICE_ID 16
#define RADEON_PARAM_DEVICE_ID 16
#define RADEON_PARAM_NUM_Z_PIPES 17
/* num Z pipes */
typedef
struct
drm_radeon_getparam
{
typedef
struct
drm_radeon_getparam
{
int
param
;
int
param
;
...
@@ -895,6 +898,7 @@ struct drm_radeon_cs {
...
@@ -895,6 +898,7 @@ struct drm_radeon_cs {
#define RADEON_INFO_DEVICE_ID 0x00
#define RADEON_INFO_DEVICE_ID 0x00
#define RADEON_INFO_NUM_GB_PIPES 0x01
#define RADEON_INFO_NUM_GB_PIPES 0x01
#define RADEON_INFO_NUM_Z_PIPES 0x02
struct
drm_radeon_info
{
struct
drm_radeon_info
{
uint32_t
request
;
uint32_t
request
;
...
...
include/linux/bitmap.h
浏览文件 @
8400146d
...
@@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst,
...
@@ -94,13 +94,13 @@ extern void __bitmap_shift_right(unsigned long *dst,
const
unsigned
long
*
src
,
int
shift
,
int
bits
);
const
unsigned
long
*
src
,
int
shift
,
int
bits
);
extern
void
__bitmap_shift_left
(
unsigned
long
*
dst
,
extern
void
__bitmap_shift_left
(
unsigned
long
*
dst
,
const
unsigned
long
*
src
,
int
shift
,
int
bits
);
const
unsigned
long
*
src
,
int
shift
,
int
bits
);
extern
void
__bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
extern
int
__bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
);
const
unsigned
long
*
bitmap2
,
int
bits
);
extern
void
__bitmap_or
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
extern
void
__bitmap_or
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
);
const
unsigned
long
*
bitmap2
,
int
bits
);
extern
void
__bitmap_xor
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
extern
void
__bitmap_xor
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
);
const
unsigned
long
*
bitmap2
,
int
bits
);
extern
void
__bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
extern
int
__bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
);
const
unsigned
long
*
bitmap2
,
int
bits
);
extern
int
__bitmap_intersects
(
const
unsigned
long
*
bitmap1
,
extern
int
__bitmap_intersects
(
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
);
const
unsigned
long
*
bitmap2
,
int
bits
);
...
@@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
...
@@ -171,13 +171,12 @@ static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
}
}
}
}
static
inline
void
bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
static
inline
int
bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
const
unsigned
long
*
src2
,
int
nbits
)
const
unsigned
long
*
src2
,
int
nbits
)
{
{
if
(
small_const_nbits
(
nbits
))
if
(
small_const_nbits
(
nbits
))
*
dst
=
*
src1
&
*
src2
;
return
(
*
dst
=
*
src1
&
*
src2
)
!=
0
;
else
return
__bitmap_and
(
dst
,
src1
,
src2
,
nbits
);
__bitmap_and
(
dst
,
src1
,
src2
,
nbits
);
}
}
static
inline
void
bitmap_or
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
static
inline
void
bitmap_or
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
...
@@ -198,13 +197,12 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
...
@@ -198,13 +197,12 @@ static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
__bitmap_xor
(
dst
,
src1
,
src2
,
nbits
);
__bitmap_xor
(
dst
,
src1
,
src2
,
nbits
);
}
}
static
inline
void
bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
static
inline
int
bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
src1
,
const
unsigned
long
*
src2
,
int
nbits
)
const
unsigned
long
*
src2
,
int
nbits
)
{
{
if
(
small_const_nbits
(
nbits
))
if
(
small_const_nbits
(
nbits
))
*
dst
=
*
src1
&
~
(
*
src2
);
return
(
*
dst
=
*
src1
&
~
(
*
src2
))
!=
0
;
else
return
__bitmap_andnot
(
dst
,
src1
,
src2
,
nbits
);
__bitmap_andnot
(
dst
,
src1
,
src2
,
nbits
);
}
}
static
inline
void
bitmap_complement
(
unsigned
long
*
dst
,
const
unsigned
long
*
src
,
static
inline
void
bitmap_complement
(
unsigned
long
*
dst
,
const
unsigned
long
*
src
,
...
...
include/linux/cpumask.h
浏览文件 @
8400146d
...
@@ -43,10 +43,10 @@
...
@@ -43,10 +43,10 @@
* int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask
* int cpu_isset(cpu, mask) true iff bit 'cpu' set in mask
* int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask
* int cpu_test_and_set(cpu, mask) test and set bit 'cpu' in mask
*
*
*
void
cpus_and(dst, src1, src2) dst = src1 & src2 [intersection]
*
int
cpus_and(dst, src1, src2) dst = src1 & src2 [intersection]
* void cpus_or(dst, src1, src2) dst = src1 | src2 [union]
* void cpus_or(dst, src1, src2) dst = src1 | src2 [union]
* void cpus_xor(dst, src1, src2) dst = src1 ^ src2
* void cpus_xor(dst, src1, src2) dst = src1 ^ src2
*
void
cpus_andnot(dst, src1, src2) dst = src1 & ~src2
*
int
cpus_andnot(dst, src1, src2) dst = src1 & ~src2
* void cpus_complement(dst, src) dst = ~src
* void cpus_complement(dst, src) dst = ~src
*
*
* int cpus_equal(mask1, mask2) Does mask1 == mask2?
* int cpus_equal(mask1, mask2) Does mask1 == mask2?
...
@@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
...
@@ -179,10 +179,10 @@ static inline int __cpu_test_and_set(int cpu, cpumask_t *addr)
}
}
#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)
static
inline
void
__cpus_and
(
cpumask_t
*
dstp
,
const
cpumask_t
*
src1p
,
static
inline
int
__cpus_and
(
cpumask_t
*
dstp
,
const
cpumask_t
*
src1p
,
const
cpumask_t
*
src2p
,
int
nbits
)
const
cpumask_t
*
src2p
,
int
nbits
)
{
{
bitmap_and
(
dstp
->
bits
,
src1p
->
bits
,
src2p
->
bits
,
nbits
);
return
bitmap_and
(
dstp
->
bits
,
src1p
->
bits
,
src2p
->
bits
,
nbits
);
}
}
#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)
...
@@ -201,10 +201,10 @@ static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
...
@@ -201,10 +201,10 @@ static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
#define cpus_andnot(dst, src1, src2) \
#define cpus_andnot(dst, src1, src2) \
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)
static
inline
void
__cpus_andnot
(
cpumask_t
*
dstp
,
const
cpumask_t
*
src1p
,
static
inline
int
__cpus_andnot
(
cpumask_t
*
dstp
,
const
cpumask_t
*
src1p
,
const
cpumask_t
*
src2p
,
int
nbits
)
const
cpumask_t
*
src2p
,
int
nbits
)
{
{
bitmap_andnot
(
dstp
->
bits
,
src1p
->
bits
,
src2p
->
bits
,
nbits
);
return
bitmap_andnot
(
dstp
->
bits
,
src1p
->
bits
,
src2p
->
bits
,
nbits
);
}
}
#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)
...
@@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp)
...
@@ -738,11 +738,11 @@ static inline void cpumask_clear(struct cpumask *dstp)
* @src1p: the first input
* @src1p: the first input
* @src2p: the second input
* @src2p: the second input
*/
*/
static
inline
void
cpumask_and
(
struct
cpumask
*
dstp
,
static
inline
int
cpumask_and
(
struct
cpumask
*
dstp
,
const
struct
cpumask
*
src1p
,
const
struct
cpumask
*
src1p
,
const
struct
cpumask
*
src2p
)
const
struct
cpumask
*
src2p
)
{
{
bitmap_and
(
cpumask_bits
(
dstp
),
cpumask_bits
(
src1p
),
return
bitmap_and
(
cpumask_bits
(
dstp
),
cpumask_bits
(
src1p
),
cpumask_bits
(
src2p
),
nr_cpumask_bits
);
cpumask_bits
(
src2p
),
nr_cpumask_bits
);
}
}
...
@@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp,
...
@@ -779,11 +779,11 @@ static inline void cpumask_xor(struct cpumask *dstp,
* @src1p: the first input
* @src1p: the first input
* @src2p: the second input
* @src2p: the second input
*/
*/
static
inline
void
cpumask_andnot
(
struct
cpumask
*
dstp
,
static
inline
int
cpumask_andnot
(
struct
cpumask
*
dstp
,
const
struct
cpumask
*
src1p
,
const
struct
cpumask
*
src1p
,
const
struct
cpumask
*
src2p
)
const
struct
cpumask
*
src2p
)
{
{
bitmap_andnot
(
cpumask_bits
(
dstp
),
cpumask_bits
(
src1p
),
return
bitmap_andnot
(
cpumask_bits
(
dstp
),
cpumask_bits
(
src1p
),
cpumask_bits
(
src2p
),
nr_cpumask_bits
);
cpumask_bits
(
src2p
),
nr_cpumask_bits
);
}
}
...
...
lib/bitmap.c
浏览文件 @
8400146d
...
@@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst,
...
@@ -179,14 +179,16 @@ void __bitmap_shift_left(unsigned long *dst,
}
}
EXPORT_SYMBOL
(
__bitmap_shift_left
);
EXPORT_SYMBOL
(
__bitmap_shift_left
);
void
__bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
int
__bitmap_and
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
)
const
unsigned
long
*
bitmap2
,
int
bits
)
{
{
int
k
;
int
k
;
int
nr
=
BITS_TO_LONGS
(
bits
);
int
nr
=
BITS_TO_LONGS
(
bits
);
unsigned
long
result
=
0
;
for
(
k
=
0
;
k
<
nr
;
k
++
)
for
(
k
=
0
;
k
<
nr
;
k
++
)
dst
[
k
]
=
bitmap1
[
k
]
&
bitmap2
[
k
];
result
|=
(
dst
[
k
]
=
bitmap1
[
k
]
&
bitmap2
[
k
]);
return
result
!=
0
;
}
}
EXPORT_SYMBOL
(
__bitmap_and
);
EXPORT_SYMBOL
(
__bitmap_and
);
...
@@ -212,14 +214,16 @@ void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
...
@@ -212,14 +214,16 @@ void __bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
}
}
EXPORT_SYMBOL
(
__bitmap_xor
);
EXPORT_SYMBOL
(
__bitmap_xor
);
void
__bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
int
__bitmap_andnot
(
unsigned
long
*
dst
,
const
unsigned
long
*
bitmap1
,
const
unsigned
long
*
bitmap2
,
int
bits
)
const
unsigned
long
*
bitmap2
,
int
bits
)
{
{
int
k
;
int
k
;
int
nr
=
BITS_TO_LONGS
(
bits
);
int
nr
=
BITS_TO_LONGS
(
bits
);
unsigned
long
result
=
0
;
for
(
k
=
0
;
k
<
nr
;
k
++
)
for
(
k
=
0
;
k
<
nr
;
k
++
)
dst
[
k
]
=
bitmap1
[
k
]
&
~
bitmap2
[
k
];
result
|=
(
dst
[
k
]
=
bitmap1
[
k
]
&
~
bitmap2
[
k
]);
return
result
!=
0
;
}
}
EXPORT_SYMBOL
(
__bitmap_andnot
);
EXPORT_SYMBOL
(
__bitmap_andnot
);
...
...
sound/pci/hda/patch_analog.c
浏览文件 @
8400146d
...
@@ -3835,9 +3835,11 @@ static struct hda_verb ad1884a_laptop_verbs[] = {
...
@@ -3835,9 +3835,11 @@ static struct hda_verb ad1884a_laptop_verbs[] = {
/* Port-F (int speaker) mixer - route only from analog mixer */
/* Port-F (int speaker) mixer - route only from analog mixer */
{
0x0b
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x0b
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_MUTE
(
0
)},
{
0x0b
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
1
)},
{
0x0b
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_IN_UNMUTE
(
1
)},
/* Port-F pin */
/* Port-F
(int speaker)
pin */
{
0x16
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_
HP
},
{
0x16
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_
OUT
},
{
0x16
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
{
0x16
,
AC_VERB_SET_AMP_GAIN_MUTE
,
AMP_OUT_MUTE
},
/* required for compaq 6530s/6531s speaker output */
{
0x1c
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_OUT
},
/* Port-C pin - internal mic-in */
/* Port-C pin - internal mic-in */
{
0x15
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
{
0x15
,
AC_VERB_SET_PIN_WIDGET_CONTROL
,
PIN_VREF80
},
{
0x14
,
AC_VERB_SET_AMP_GAIN_MUTE
,
0x7002
},
/* raise mic as default */
{
0x14
,
AC_VERB_SET_AMP_GAIN_MUTE
,
0x7002
},
/* raise mic as default */
...
...
sound/pci/hda/patch_realtek.c
浏览文件 @
8400146d
...
@@ -12521,8 +12521,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
...
@@ -12521,8 +12521,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
ALC268_TOSHIBA),
ALC268_TOSHIBA),
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
ALC268_TOSHIBA),
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
...
@@ -12530,6 +12528,15 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
...
@@ -12530,6 +12528,15 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
{}
{}
};
};
/* Toshiba laptops have no unique PCI SSID but only codec SSID */
static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
ALC268_TOSHIBA),
{}
};
static struct alc_config_preset alc268_presets[] = {
static struct alc_config_preset alc268_presets[] = {
[ALC267_QUANTA_IL1] = {
[ALC267_QUANTA_IL1] = {
.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer },
.mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer },
...
@@ -12696,6 +12703,10 @@ static int patch_alc268(struct hda_codec *codec)
...
@@ -12696,6 +12703,10 @@ static int patch_alc268(struct hda_codec *codec)
alc268_models,
alc268_models,
alc268_cfg_tbl);
alc268_cfg_tbl);
if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
board_config = snd_hda_check_board_codec_sid_config(codec,
ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
printk(KERN_INFO "hda_codec: Unknown model for %s, "
printk(KERN_INFO "hda_codec: Unknown model for %s, "
"trying auto-probe from BIOS...\n", codec->chip_name);
"trying auto-probe from BIOS...\n", codec->chip_name);
...
...
sound/pci/hda/patch_sigmatel.c
浏览文件 @
8400146d
...
@@ -76,6 +76,7 @@ enum {
...
@@ -76,6 +76,7 @@ enum {
STAC_92HD73XX_AUTO
,
STAC_92HD73XX_AUTO
,
STAC_92HD73XX_NO_JD
,
/* no jack-detection */
STAC_92HD73XX_NO_JD
,
/* no jack-detection */
STAC_92HD73XX_REF
,
STAC_92HD73XX_REF
,
STAC_92HD73XX_INTEL
,
STAC_DELL_M6_AMIC
,
STAC_DELL_M6_AMIC
,
STAC_DELL_M6_DMIC
,
STAC_DELL_M6_DMIC
,
STAC_DELL_M6_BOTH
,
STAC_DELL_M6_BOTH
,
...
@@ -1777,6 +1778,7 @@ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
...
@@ -1777,6 +1778,7 @@ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
[
STAC_92HD73XX_AUTO
]
=
"auto"
,
[
STAC_92HD73XX_AUTO
]
=
"auto"
,
[
STAC_92HD73XX_NO_JD
]
=
"no-jd"
,
[
STAC_92HD73XX_NO_JD
]
=
"no-jd"
,
[
STAC_92HD73XX_REF
]
=
"ref"
,
[
STAC_92HD73XX_REF
]
=
"ref"
,
[
STAC_92HD73XX_INTEL
]
=
"intel"
,
[
STAC_DELL_M6_AMIC
]
=
"dell-m6-amic"
,
[
STAC_DELL_M6_AMIC
]
=
"dell-m6-amic"
,
[
STAC_DELL_M6_DMIC
]
=
"dell-m6-dmic"
,
[
STAC_DELL_M6_DMIC
]
=
"dell-m6-dmic"
,
[
STAC_DELL_M6_BOTH
]
=
"dell-m6"
,
[
STAC_DELL_M6_BOTH
]
=
"dell-m6"
,
...
@@ -1789,6 +1791,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
...
@@ -1789,6 +1791,10 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
"DFI LanParty"
,
STAC_92HD73XX_REF
),
"DFI LanParty"
,
STAC_92HD73XX_REF
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DFI
,
0x3101
,
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DFI
,
0x3101
,
"DFI LanParty"
,
STAC_92HD73XX_REF
),
"DFI LanParty"
,
STAC_92HD73XX_REF
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_INTEL
,
0x5002
,
"Intel DG45ID"
,
STAC_92HD73XX_INTEL
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_INTEL
,
0x5003
,
"Intel DG45FC"
,
STAC_92HD73XX_INTEL
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0254
,
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0254
,
"Dell Studio 1535"
,
STAC_DELL_M6_DMIC
),
"Dell Studio 1535"
,
STAC_DELL_M6_DMIC
),
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0255
,
SND_PCI_QUIRK
(
PCI_VENDOR_ID_DELL
,
0x0255
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录