Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
7ab24855
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
7ab24855
编写于
2月 17, 2010
作者:
D
Dominik Brodowski
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
pcmcia: add locking to pcmcia_{read,write}_cis_mem
Signed-off-by:
N
Dominik Brodowski
<
linux@dominikbrodowski.net
>
上级
44961a03
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
26 addition
and
6 deletion
+26
-6
drivers/pcmcia/cistpl.c
drivers/pcmcia/cistpl.c
+21
-6
drivers/pcmcia/rsrc_nonstatic.c
drivers/pcmcia/rsrc_nonstatic.c
+5
-0
未找到文件。
drivers/pcmcia/cistpl.c
浏览文件 @
7ab24855
...
...
@@ -83,6 +83,8 @@ void release_cis_mem(struct pcmcia_socket *s)
* Map the card memory at "card_offset" into virtual space.
* If flags & MAP_ATTRIB, map the attribute space, otherwise
* map the memory space.
*
* Must be called with ops_mutex held.
*/
static
void
__iomem
*
set_cis_map
(
struct
pcmcia_socket
*
s
,
unsigned
int
card_offset
,
unsigned
int
flags
)
...
...
@@ -90,13 +92,11 @@ set_cis_map(struct pcmcia_socket *s, unsigned int card_offset, unsigned int flag
pccard_mem_map
*
mem
=
&
s
->
cis_mem
;
int
ret
;
mutex_lock
(
&
s
->
ops_mutex
);
if
(
!
(
s
->
features
&
SS_CAP_STATIC_MAP
)
&&
(
mem
->
res
==
NULL
))
{
mem
->
res
=
pcmcia_find_mem_region
(
0
,
s
->
map_size
,
s
->
map_size
,
0
,
s
);
if
(
mem
->
res
==
NULL
)
{
dev_printk
(
KERN_NOTICE
,
&
s
->
dev
,
"cs: unable to map card memory!
\n
"
);
mutex_unlock
(
&
s
->
ops_mutex
);
return
NULL
;
}
s
->
cis_virt
=
NULL
;
...
...
@@ -112,7 +112,6 @@ set_cis_map(struct pcmcia_socket *s, unsigned int card_offset, unsigned int flag
if
(
ret
)
{
iounmap
(
s
->
cis_virt
);
s
->
cis_virt
=
NULL
;
mutex_unlock
(
&
s
->
ops_mutex
);
return
NULL
;
}
...
...
@@ -122,7 +121,6 @@ set_cis_map(struct pcmcia_socket *s, unsigned int card_offset, unsigned int flag
s
->
cis_virt
=
ioremap
(
mem
->
static_start
,
s
->
map_size
);
}
mutex_unlock
(
&
s
->
ops_mutex
);
return
s
->
cis_virt
;
}
...
...
@@ -145,6 +143,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
dev_dbg
(
&
s
->
dev
,
"pcmcia_read_cis_mem(%d, %#x, %u)
\n
"
,
attr
,
addr
,
len
);
mutex_lock
(
&
s
->
ops_mutex
);
if
(
attr
&
IS_INDIRECT
)
{
/* Indirect accesses use a bunch of special registers at fixed
locations in common memory */
...
...
@@ -156,7 +155,9 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
sys
=
set_cis_map
(
s
,
0
,
MAP_ACTIVE
|
((
cis_width
)
?
MAP_16BIT
:
0
));
if
(
!
sys
)
{
dev_dbg
(
&
s
->
dev
,
"could not map memory
\n
"
);
memset
(
ptr
,
0xff
,
len
);
mutex_unlock
(
&
s
->
ops_mutex
);
return
-
1
;
}
...
...
@@ -170,6 +171,9 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
}
else
{
u_int
inc
=
1
,
card_offset
,
flags
;
if
(
addr
>
CISTPL_MAX_CIS_SIZE
)
dev_dbg
(
&
s
->
dev
,
"attempt to read CIS mem at addr %#x"
,
addr
);
flags
=
MAP_ACTIVE
|
((
cis_width
)
?
MAP_16BIT
:
0
);
if
(
attr
)
{
flags
|=
MAP_ATTRIB
;
...
...
@@ -181,7 +185,9 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
while
(
len
)
{
sys
=
set_cis_map
(
s
,
card_offset
,
flags
);
if
(
!
sys
)
{
dev_dbg
(
&
s
->
dev
,
"could not map memory
\n
"
);
memset
(
ptr
,
0xff
,
len
);
mutex_unlock
(
&
s
->
ops_mutex
);
return
-
1
;
}
end
=
sys
+
s
->
map_size
;
...
...
@@ -195,6 +201,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
addr
=
0
;
}
}
mutex_unlock
(
&
s
->
ops_mutex
);
dev_dbg
(
&
s
->
dev
,
" %#2.2x %#2.2x %#2.2x %#2.2x ...
\n
"
,
*
(
u_char
*
)(
ptr
+
0
),
*
(
u_char
*
)(
ptr
+
1
),
*
(
u_char
*
)(
ptr
+
2
),
*
(
u_char
*
)(
ptr
+
3
));
...
...
@@ -210,6 +217,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
dev_dbg
(
&
s
->
dev
,
"pcmcia_write_cis_mem(%d, %#x, %u)
\n
"
,
attr
,
addr
,
len
);
mutex_lock
(
&
s
->
ops_mutex
);
if
(
attr
&
IS_INDIRECT
)
{
/* Indirect accesses use a bunch of special registers at fixed
locations in common memory */
...
...
@@ -220,8 +228,11 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
}
sys
=
set_cis_map
(
s
,
0
,
MAP_ACTIVE
|
((
cis_width
)
?
MAP_16BIT
:
0
));
if
(
!
sys
)
if
(
!
sys
)
{
dev_dbg
(
&
s
->
dev
,
"could not map memory
\n
"
);
mutex_unlock
(
&
s
->
ops_mutex
);
return
;
/* FIXME: Error */
}
writeb
(
flags
,
sys
+
CISREG_ICTRL0
);
writeb
(
addr
&
0xff
,
sys
+
CISREG_IADDR0
);
...
...
@@ -243,8 +254,11 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
card_offset
=
addr
&
~
(
s
->
map_size
-
1
);
while
(
len
)
{
sys
=
set_cis_map
(
s
,
card_offset
,
flags
);
if
(
!
sys
)
if
(
!
sys
)
{
dev_dbg
(
&
s
->
dev
,
"could not map memory
\n
"
);
mutex_unlock
(
&
s
->
ops_mutex
);
return
;
/* FIXME: error */
}
end
=
sys
+
s
->
map_size
;
sys
=
sys
+
(
addr
&
(
s
->
map_size
-
1
));
...
...
@@ -257,6 +271,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
addr
=
0
;
}
}
mutex_unlock
(
&
s
->
ops_mutex
);
}
...
...
drivers/pcmcia/rsrc_nonstatic.c
浏览文件 @
7ab24855
...
...
@@ -273,6 +273,11 @@ static int readable(struct pcmcia_socket *s, struct resource *res,
{
int
ret
=
-
EINVAL
;
if
(
s
->
fake_cis
)
{
dev_dbg
(
&
s
->
dev
,
"fake CIS is being used: can't validate mem
\n
"
);
return
0
;
}
s
->
cis_mem
.
res
=
res
;
s
->
cis_virt
=
ioremap
(
res
->
start
,
s
->
map_size
);
if
(
s
->
cis_virt
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录