Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
1c361efb
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看板
提交
1c361efb
编写于
6月 17, 2011
作者:
F
Francois Romieu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
r8169: explicit firmware format check.
Signed-off-by:
N
Francois Romieu
<
romieu@fr.zoreil.com
>
上级
b6ffd97f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
13 deletion
+49
-13
drivers/net/r8169.c
drivers/net/r8169.c
+49
-13
未找到文件。
drivers/net/r8169.c
浏览文件 @
1c361efb
...
...
@@ -669,6 +669,15 @@ struct rtl8169_private {
struct
rtl_fw
{
const
struct
firmware
*
fw
;
#define RTL_VER_SIZE 32
char
version
[
RTL_VER_SIZE
];
struct
rtl_fw_phy_action
{
__le32
*
code
;
size_t
size
;
}
phy_action
;
}
*
rtl_fw
;
#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN);
};
...
...
@@ -1229,8 +1238,9 @@ static void rtl8169_get_drvinfo(struct net_device *dev,
strcpy
(
info
->
driver
,
MODULENAME
);
strcpy
(
info
->
version
,
RTL8169_VERSION
);
strcpy
(
info
->
bus_info
,
pci_name
(
tp
->
pci_dev
));
strncpy
(
info
->
fw_version
,
IS_ERR_OR_NULL
(
rtl_fw
)
?
"N/A"
:
rtl_lookup_firmware_name
(
tp
),
sizeof
(
info
->
fw_version
)
-
1
);
BUILD_BUG_ON
(
sizeof
(
info
->
fw_version
)
<
sizeof
(
rtl_fw
->
version
));
strcpy
(
info
->
fw_version
,
IS_ERR_OR_NULL
(
rtl_fw
)
?
"N/A"
:
rtl_fw
->
version
);
}
static
int
rtl8169_get_regs_len
(
struct
net_device
*
dev
)
...
...
@@ -1744,21 +1754,47 @@ static void rtl_writephy_batch(struct rtl8169_private *tp,
#define PHY_DELAY_MS 0xe0000000
#define PHY_WRITE_ERI_WORD 0xf0000000
static
void
rtl_phy_write_fw
(
struct
rtl8169_private
*
tp
,
struct
rtl_fw
*
rtl_fw
)
#define FW_OPCODE_SIZE sizeof(typeof(*((struct rtl_fw_phy_action *)0)->code))
static
bool
rtl_fw_format_ok
(
struct
rtl8169_private
*
tp
,
struct
rtl_fw
*
rtl_fw
)
{
const
struct
firmware
*
fw
=
rtl_fw
->
fw
;
__le32
*
phytable
=
(
__le32
*
)
fw
->
data
;
struct
rtl_fw_phy_action
*
pa
=
&
rtl_fw
->
phy_action
;
char
*
version
=
rtl_fw
->
version
;
bool
rc
=
false
;
if
(
fw
->
size
<
FW_OPCODE_SIZE
)
goto
out
;
else
{
if
(
fw
->
size
%
FW_OPCODE_SIZE
)
goto
out
;
strlcpy
(
version
,
rtl_lookup_firmware_name
(
tp
),
RTL_VER_SIZE
);
pa
->
code
=
(
__le32
*
)
fw
->
data
;
pa
->
size
=
fw
->
size
/
FW_OPCODE_SIZE
;
}
version
[
RTL_VER_SIZE
-
1
]
=
0
;
rc
=
true
;
out:
return
rc
;
}
static
void
rtl_phy_write_fw
(
struct
rtl8169_private
*
tp
,
struct
rtl_fw
*
rtl_fw
)
{
struct
rtl_fw_phy_action
*
pa
=
&
rtl_fw
->
phy_action
;
struct
net_device
*
dev
=
tp
->
dev
;
size_t
index
,
fw_size
=
fw
->
size
/
sizeof
(
*
phytable
);
u32
predata
,
count
;
size_t
index
;
if
(
fw
->
size
%
sizeof
(
*
phytable
))
{
netif_err
(
tp
,
probe
,
dev
,
"
odd sized firmware %zd
\n
"
,
fw
->
size
);
if
(
!
rtl_fw_format_ok
(
tp
,
rtl_fw
))
{
netif_err
(
tp
,
probe
,
dev
,
"
invalid firwmare
\n
"
);
return
;
}
for
(
index
=
0
;
index
<
fw_
size
;
index
++
)
{
u32
action
=
le32_to_cpu
(
p
hytabl
e
[
index
]);
for
(
index
=
0
;
index
<
pa
->
size
;
index
++
)
{
u32
action
=
le32_to_cpu
(
p
a
->
cod
e
[
index
]);
u32
regno
=
(
action
&
0x0fff0000
)
>>
16
;
switch
(
action
&
0xf0000000
)
{
...
...
@@ -1780,7 +1816,7 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
}
break
;
case
PHY_READCOUNT_EQ_SKIP
:
if
(
index
+
2
>=
fw_
size
)
{
if
(
index
+
2
>=
pa
->
size
)
{
netif_err
(
tp
,
probe
,
tp
->
dev
,
"Out of range of firmware
\n
"
);
return
;
...
...
@@ -1789,7 +1825,7 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
case
PHY_COMP_EQ_SKIPN
:
case
PHY_COMP_NEQ_SKIPN
:
case
PHY_SKIPN
:
if
(
index
+
1
+
regno
>=
fw_
size
)
{
if
(
index
+
1
+
regno
>=
pa
->
size
)
{
netif_err
(
tp
,
probe
,
tp
->
dev
,
"Out of range of firmware
\n
"
);
return
;
...
...
@@ -1809,8 +1845,8 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
predata
=
0
;
count
=
0
;
for
(
index
=
0
;
index
<
fw_
size
;
)
{
u32
action
=
le32_to_cpu
(
p
hytabl
e
[
index
]);
for
(
index
=
0
;
index
<
pa
->
size
;
)
{
u32
action
=
le32_to_cpu
(
p
a
->
cod
e
[
index
]);
u32
data
=
action
&
0x0000ffff
;
u32
regno
=
(
action
&
0x0fff0000
)
>>
16
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录