Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
64278fe8
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
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看板
提交
64278fe8
编写于
8月 25, 2016
作者:
D
Doug Ledford
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'hns-roce' into k.o/for-4.9
上级
d68478da
528f1deb
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
228 addition
and
75 deletion
+228
-75
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_device.h
+1
-1
drivers/infiniband/hw/hns/hns_roce_eq.c
drivers/infiniband/hw/hns/hns_roce_eq.c
+1
-1
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
+28
-9
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
+1
-1
drivers/infiniband/hw/hns/hns_roce_main.c
drivers/infiniband/hw/hns/hns_roce_main.c
+105
-22
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
+1
-16
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+34
-13
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+4
-5
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
+49
-4
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
+2
-1
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
+2
-2
未找到文件。
drivers/infiniband/hw/hns/hns_roce_device.h
浏览文件 @
64278fe8
...
...
@@ -531,7 +531,7 @@ struct hns_roce_dev {
struct
ib_device
ib_dev
;
struct
platform_device
*
pdev
;
struct
hns_roce_uar
priv_uar
;
const
char
*
irq_names
;
const
char
*
irq_names
[
HNS_ROCE_MAX_IRQ_NUM
]
;
spinlock_t
sm_lock
;
spinlock_t
cq_db_lock
;
spinlock_t
bt_cmd_lock
;
...
...
drivers/infiniband/hw/hns/hns_roce_eq.c
浏览文件 @
64278fe8
...
...
@@ -713,7 +713,7 @@ int hns_roce_init_eq_table(struct hns_roce_dev *hr_dev)
for
(
j
=
0
;
j
<
eq_num
;
j
++
)
{
ret
=
request_irq
(
eq_table
->
eq
[
j
].
irq
,
hns_roce_msi_x_interrupt
,
0
,
hr_dev
->
irq_names
,
eq_table
->
eq
+
j
);
0
,
hr_dev
->
irq_names
[
j
]
,
eq_table
->
eq
+
j
);
if
(
ret
)
{
dev_err
(
dev
,
"request irq error!
\n
"
);
goto
err_request_irq_fail
;
...
...
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
浏览文件 @
64278fe8
...
...
@@ -31,6 +31,7 @@
*/
#include <linux/platform_device.h>
#include <linux/acpi.h>
#include <rdma/ib_umem.h>
#include "hns_roce_common.h"
#include "hns_roce_device.h"
...
...
@@ -794,29 +795,47 @@ static void hns_roce_port_enable(struct hns_roce_dev *hr_dev, int enable_flag)
* @enable: true -- drop reset, false -- reset
* return 0 - success , negative --fail
*/
int
hns_roce_v1_reset
(
struct
hns_roce_dev
*
hr_dev
,
bool
enable
)
int
hns_roce_v1_reset
(
struct
hns_roce_dev
*
hr_dev
,
bool
dereset
)
{
struct
device_node
*
dsaf_node
;
struct
device
*
dev
=
&
hr_dev
->
pdev
->
dev
;
struct
device_node
*
np
=
dev
->
of_node
;
struct
fwnode_handle
*
fwnode
;
int
ret
;
dsaf_node
=
of_parse_phandle
(
np
,
"dsaf-handle"
,
0
);
if
(
!
dsaf_node
)
{
dev_err
(
dev
,
"Unable to get dsaf node by dsaf-handle!
\n
"
);
return
-
EINVAL
;
/* check if this is DT/ACPI case */
if
(
dev_of_node
(
dev
))
{
dsaf_node
=
of_parse_phandle
(
np
,
"dsaf-handle"
,
0
);
if
(
!
dsaf_node
)
{
dev_err
(
dev
,
"could not find dsaf-handle
\n
"
);
return
-
EINVAL
;
}
fwnode
=
&
dsaf_node
->
fwnode
;
}
else
if
(
is_acpi_device_node
(
dev
->
fwnode
))
{
struct
acpi_reference_args
args
;
ret
=
acpi_node_get_property_reference
(
dev
->
fwnode
,
"dsaf-handle"
,
0
,
&
args
);
if
(
ret
)
{
dev_err
(
dev
,
"could not find dsaf-handle
\n
"
);
return
ret
;
}
fwnode
=
acpi_fwnode_handle
(
args
.
adev
);
}
else
{
dev_err
(
dev
,
"cannot read data from DT or ACPI
\n
"
);
return
-
ENXIO
;
}
ret
=
hns_dsaf_roce_reset
(
&
dsaf_node
->
fwnode
,
false
);
ret
=
hns_dsaf_roce_reset
(
fwnode
,
false
);
if
(
ret
)
return
ret
;
if
(
enable
)
{
if
(
dereset
)
{
msleep
(
SLEEP_TIME_INTERVAL
);
ret
urn
hns_dsaf_roce_reset
(
&
dsaf_node
->
fwnode
,
true
);
ret
=
hns_dsaf_roce_reset
(
fwnode
,
true
);
}
return
0
;
return
ret
;
}
void
hns_roce_v1_profile
(
struct
hns_roce_dev
*
hr_dev
)
...
...
drivers/infiniband/hw/hns/hns_roce_hw_v1.h
浏览文件 @
64278fe8
...
...
@@ -976,6 +976,6 @@ struct hns_roce_v1_priv {
struct
hns_roce_raq_table
raq_table
;
};
int
hns_dsaf_roce_reset
(
struct
fwnode_handle
*
dsaf_fwnode
,
bool
enable
);
int
hns_dsaf_roce_reset
(
struct
fwnode_handle
*
dsaf_fwnode
,
bool
dereset
);
#endif
drivers/infiniband/hw/hns/hns_roce_main.c
浏览文件 @
64278fe8
...
...
@@ -30,7 +30,7 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <linux/acpi.h>
#include <linux/of_platform.h>
#include <rdma/ib_addr.h>
#include <rdma/ib_smi.h>
...
...
@@ -694,40 +694,122 @@ static int hns_roce_register_device(struct hns_roce_dev *hr_dev)
return
ret
;
}
static
const
struct
of_device_id
hns_roce_of_match
[]
=
{
{
.
compatible
=
"hisilicon,hns-roce-v1"
,
.
data
=
&
hns_roce_hw_v1
,
},
{},
};
MODULE_DEVICE_TABLE
(
of
,
hns_roce_of_match
);
static
const
struct
acpi_device_id
hns_roce_acpi_match
[]
=
{
{
"HISI00D1"
,
(
kernel_ulong_t
)
&
hns_roce_hw_v1
},
{},
};
MODULE_DEVICE_TABLE
(
acpi
,
hns_roce_acpi_match
);
static
int
hns_roce_node_match
(
struct
device
*
dev
,
void
*
fwnode
)
{
return
dev
->
fwnode
==
fwnode
;
}
static
struct
platform_device
*
hns_roce_find_pdev
(
struct
fwnode_handle
*
fwnode
)
{
struct
device
*
dev
;
/* get the 'device'corresponding to matching 'fwnode' */
dev
=
bus_find_device
(
&
platform_bus_type
,
NULL
,
fwnode
,
hns_roce_node_match
);
/* get the platform device */
return
dev
?
to_platform_device
(
dev
)
:
NULL
;
}
static
int
hns_roce_get_cfg
(
struct
hns_roce_dev
*
hr_dev
)
{
int
i
;
int
ret
;
u8
phy_port
;
int
port_cnt
=
0
;
struct
device
*
dev
=
&
hr_dev
->
pdev
->
dev
;
struct
device_node
*
np
=
dev
->
of_node
;
struct
device_node
*
net_node
;
struct
net_device
*
netdev
=
NULL
;
struct
platform_device
*
pdev
=
NULL
;
struct
resource
*
res
;
if
(
of_device_is_compatible
(
np
,
"hisilicon,hns-roce-v1"
))
{
hr_dev
->
hw
=
&
hns_roce_hw_v1
;
/* check if we are compatible with the underlying SoC */
if
(
dev_of_node
(
dev
))
{
const
struct
of_device_id
*
of_id
;
of_id
=
of_match_node
(
hns_roce_of_match
,
dev
->
of_node
);
if
(
!
of_id
)
{
dev_err
(
dev
,
"device is not compatible!
\n
"
);
return
-
ENXIO
;
}
hr_dev
->
hw
=
(
struct
hns_roce_hw
*
)
of_id
->
data
;
if
(
!
hr_dev
->
hw
)
{
dev_err
(
dev
,
"couldn't get H/W specific DT data!
\n
"
);
return
-
ENXIO
;
}
}
else
if
(
is_acpi_device_node
(
dev
->
fwnode
))
{
const
struct
acpi_device_id
*
acpi_id
;
acpi_id
=
acpi_match_device
(
hns_roce_acpi_match
,
dev
);
if
(
!
acpi_id
)
{
dev_err
(
dev
,
"device is not compatible!
\n
"
);
return
-
ENXIO
;
}
hr_dev
->
hw
=
(
struct
hns_roce_hw
*
)
acpi_id
->
driver_data
;
if
(
!
hr_dev
->
hw
)
{
dev_err
(
dev
,
"couldn't get H/W specific ACPI data!
\n
"
);
return
-
ENXIO
;
}
}
else
{
dev_err
(
dev
,
"
device no compatible!
\n
"
);
return
-
E
INVAL
;
dev_err
(
dev
,
"
can't read compatibility data from DT or ACPI
\n
"
);
return
-
E
NXIO
;
}
/* get the mapped register base address */
res
=
platform_get_resource
(
hr_dev
->
pdev
,
IORESOURCE_MEM
,
0
);
if
(
!
res
)
{
dev_err
(
dev
,
"memory resource not found!
\n
"
);
return
-
EINVAL
;
}
hr_dev
->
reg_base
=
devm_ioremap_resource
(
dev
,
res
);
if
(
IS_ERR
(
hr_dev
->
reg_base
))
return
PTR_ERR
(
hr_dev
->
reg_base
);
/* get the RoCE associated ethernet ports or netdevices */
for
(
i
=
0
;
i
<
HNS_ROCE_MAX_PORTS
;
i
++
)
{
net_node
=
of_parse_phandle
(
np
,
"eth-handle"
,
i
);
if
(
net_node
)
{
if
(
dev_of_node
(
dev
))
{
net_node
=
of_parse_phandle
(
dev
->
of_node
,
"eth-handle"
,
i
);
if
(
!
net_node
)
continue
;
pdev
=
of_find_device_by_node
(
net_node
);
}
else
if
(
is_acpi_device_node
(
dev
->
fwnode
))
{
struct
acpi_reference_args
args
;
struct
fwnode_handle
*
fwnode
;
ret
=
acpi_node_get_property_reference
(
dev
->
fwnode
,
"eth-handle"
,
i
,
&
args
);
if
(
ret
)
continue
;
fwnode
=
acpi_fwnode_handle
(
args
.
adev
);
pdev
=
hns_roce_find_pdev
(
fwnode
);
}
else
{
dev_err
(
dev
,
"cannot read data from DT or ACPI
\n
"
);
return
-
ENXIO
;
}
if
(
pdev
)
{
netdev
=
platform_get_drvdata
(
pdev
);
phy_port
=
(
u8
)
i
;
if
(
netdev
)
{
hr_dev
->
iboe
.
netdevs
[
port_cnt
]
=
netdev
;
hr_dev
->
iboe
.
phy_port
[
port_cnt
]
=
phy_port
;
}
else
{
dev_err
(
dev
,
"no netdev found with pdev %s
\n
"
,
pdev
->
name
);
return
-
ENODEV
;
}
port_cnt
++
;
...
...
@@ -735,26 +817,32 @@ static int hns_roce_get_cfg(struct hns_roce_dev *hr_dev)
}
if
(
port_cnt
==
0
)
{
dev_err
(
dev
,
"
Unable to get available port by eth-handle
!
\n
"
);
dev_err
(
dev
,
"
unable to get eth-handle for available ports
!
\n
"
);
return
-
EINVAL
;
}
hr_dev
->
caps
.
num_ports
=
port_cnt
;
/*
C
md issue mode: 0 is poll, 1 is event */
/*
c
md issue mode: 0 is poll, 1 is event */
hr_dev
->
cmd_mod
=
1
;
hr_dev
->
loop_idc
=
0
;
/* read the interrupt names from the DT or ACPI */
ret
=
device_property_read_string_array
(
dev
,
"interrupt-names"
,
hr_dev
->
irq_names
,
HNS_ROCE_MAX_IRQ_NUM
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"couldn't get interrupt names from DT or ACPI!
\n
"
);
return
ret
;
}
/* fetch the interrupt numbers */
for
(
i
=
0
;
i
<
HNS_ROCE_MAX_IRQ_NUM
;
i
++
)
{
hr_dev
->
irq
[
i
]
=
platform_get_irq
(
hr_dev
->
pdev
,
i
);
if
(
hr_dev
->
irq
[
i
]
<=
0
)
{
dev_err
(
dev
,
"
Get No.%d irq resource
failed!
\n
"
,
i
);
dev_err
(
dev
,
"
platform get of irq[=%d]
failed!
\n
"
,
i
);
return
-
EINVAL
;
}
if
(
of_property_read_string_index
(
np
,
"interrupt-names"
,
i
,
&
hr_dev
->
irq_names
))
return
-
EINVAL
;
}
return
0
;
...
...
@@ -917,7 +1005,7 @@ static int hns_roce_probe(struct platform_device *pdev)
if
(
dma_set_mask_and_coherent
(
dev
,
DMA_BIT_MASK
(
64ULL
))
&&
dma_set_mask_and_coherent
(
dev
,
DMA_BIT_MASK
(
32ULL
)))
{
dev_err
(
dev
,
"No usable DMA addressing mode
\n
"
);
dev_err
(
dev
,
"No
t
usable DMA addressing mode
\n
"
);
ret
=
-
EIO
;
goto
error_failed_get_cfg
;
}
...
...
@@ -1035,18 +1123,13 @@ static int hns_roce_remove(struct platform_device *pdev)
return
0
;
}
static
const
struct
of_device_id
hns_roce_of_match
[]
=
{
{
.
compatible
=
"hisilicon,hns-roce-v1"
,},
{},
};
MODULE_DEVICE_TABLE
(
of
,
hns_roce_of_match
);
static
struct
platform_driver
hns_roce_driver
=
{
.
probe
=
hns_roce_probe
,
.
remove
=
hns_roce_remove
,
.
driver
=
{
.
name
=
DRV_NAME
,
.
of_match_table
=
hns_roce_of_match
,
.
acpi_match_table
=
ACPI_PTR
(
hns_roce_acpi_match
),
},
};
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_mac.c
浏览文件 @
64278fe8
...
...
@@ -644,21 +644,6 @@ hns_mac_phy_parse_addr(struct device *dev, struct fwnode_handle *fwnode)
return
addr
;
}
static
int
hns_mac_phydev_match
(
struct
device
*
dev
,
void
*
fwnode
)
{
return
dev
->
fwnode
==
fwnode
;
}
static
struct
platform_device
*
hns_mac_find_platform_device
(
struct
fwnode_handle
*
fwnode
)
{
struct
device
*
dev
;
dev
=
bus_find_device
(
&
platform_bus_type
,
NULL
,
fwnode
,
hns_mac_phydev_match
);
return
dev
?
to_platform_device
(
dev
)
:
NULL
;
}
static
int
hns_mac_register_phydev
(
struct
mii_bus
*
mdio
,
struct
hns_mac_cb
*
mac_cb
,
u32
addr
)
...
...
@@ -724,7 +709,7 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
return
;
/* dev address in adev */
pdev
=
hns_
mac
_find_platform_device
(
acpi_fwnode_handle
(
args
.
adev
));
pdev
=
hns_
dsaf
_find_platform_device
(
acpi_fwnode_handle
(
args
.
adev
));
mii_bus
=
platform_get_drvdata
(
pdev
);
rc
=
hns_mac_register_phydev
(
mii_bus
,
mac_cb
,
addr
);
if
(
!
rc
)
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
浏览文件 @
64278fe8
...
...
@@ -2788,7 +2788,7 @@ module_platform_driver(g_dsaf_driver);
* @enable: false - request reset , true - drop reset
* retuen 0 - success , negative -fail
*/
int
hns_dsaf_roce_reset
(
struct
fwnode_handle
*
dsaf_fwnode
,
bool
enable
)
int
hns_dsaf_roce_reset
(
struct
fwnode_handle
*
dsaf_fwnode
,
bool
dereset
)
{
struct
dsaf_device
*
dsaf_dev
;
struct
platform_device
*
pdev
;
...
...
@@ -2817,24 +2817,44 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
{
DSAF_ROCE_SL_1
,
DSAF_ROCE_SL_1
,
DSAF_ROCE_SL_3
},
};
if
(
!
is_of_node
(
dsaf_fwnode
))
{
pr_err
(
"hisi_dsaf: Only support DT node!
\n
"
);
/* find the platform device corresponding to fwnode */
if
(
is_of_node
(
dsaf_fwnode
))
{
pdev
=
of_find_device_by_node
(
to_of_node
(
dsaf_fwnode
));
}
else
if
(
is_acpi_device_node
(
dsaf_fwnode
))
{
pdev
=
hns_dsaf_find_platform_device
(
dsaf_fwnode
);
}
else
{
pr_err
(
"fwnode is neither OF or ACPI type
\n
"
);
return
-
EINVAL
;
}
pdev
=
of_find_device_by_node
(
to_of_node
(
dsaf_fwnode
));
/* check if we were a success in fetching pdev */
if
(
!
pdev
)
{
pr_err
(
"couldn't find platform device for node
\n
"
);
return
-
ENODEV
;
}
/* retrieve the dsaf_device from the driver data */
dsaf_dev
=
dev_get_drvdata
(
&
pdev
->
dev
);
if
(
!
dsaf_dev
)
{
dev_err
(
&
pdev
->
dev
,
"dsaf_dev is NULL
\n
"
);
return
-
ENODEV
;
}
/* now, make sure we are running on compatible SoC */
if
(
AE_IS_VER1
(
dsaf_dev
->
dsaf_ver
))
{
dev_err
(
dsaf_dev
->
dev
,
"%s v1 chip doesn't support RoCE!
\n
"
,
dsaf_dev
->
ae_dev
.
name
);
return
-
ENODEV
;
}
if
(
!
enable
)
{
/* Reset rocee-channels in dsaf and rocee */
hns_dsaf_srst_chns
(
dsaf_dev
,
DSAF_CHNS_MASK
,
false
);
hns_dsaf_roce_srst
(
dsaf_dev
,
false
);
/* do reset or de-reset according to the flag */
if
(
!
dereset
)
{
/* reset rocee-channels in dsaf and rocee */
dsaf_dev
->
misc_op
->
hns_dsaf_srst_chns
(
dsaf_dev
,
DSAF_CHNS_MASK
,
false
);
dsaf_dev
->
misc_op
->
hns_dsaf_roce_srst
(
dsaf_dev
,
false
);
}
else
{
/*
C
onfigure dsaf tx roce correspond to port map and sl map */
/*
c
onfigure dsaf tx roce correspond to port map and sl map */
mp
=
dsaf_read_dev
(
dsaf_dev
,
DSAF_ROCE_PORT_MAP_REG
);
for
(
i
=
0
;
i
<
DSAF_ROCE_CREDIT_CHN
;
i
++
)
dsaf_set_field
(
mp
,
7
<<
i
*
3
,
i
*
3
,
...
...
@@ -2848,12 +2868,13 @@ int hns_dsaf_roce_reset(struct fwnode_handle *dsaf_fwnode, bool enable)
sl_map
[
i
][
DSAF_ROCE_6PORT_MODE
]);
dsaf_write_dev
(
dsaf_dev
,
DSAF_ROCE_SL_MAP_REG
,
sl
);
/* De-reset rocee-channels in dsaf and rocee */
hns_dsaf_srst_chns
(
dsaf_dev
,
DSAF_CHNS_MASK
,
true
);
/* de-reset rocee-channels in dsaf and rocee */
dsaf_dev
->
misc_op
->
hns_dsaf_srst_chns
(
dsaf_dev
,
DSAF_CHNS_MASK
,
true
);
msleep
(
SRST_TIME_INTERVAL
);
hns_dsaf_roce_srst
(
dsaf_dev
,
true
);
dsaf_dev
->
misc_op
->
hns_dsaf_roce_srst
(
dsaf_dev
,
true
);
/*
Ean
ble dsaf channel rocee credit */
/*
ena
ble dsaf channel rocee credit */
credit
=
dsaf_read_dev
(
dsaf_dev
,
DSAF_SBM_ROCEE_CFG_REG_REG
);
dsaf_set_bit
(
credit
,
DSAF_SBM_ROCEE_CFG_CRD_EN_B
,
0
);
dsaf_write_dev
(
dsaf_dev
,
DSAF_SBM_ROCEE_CFG_REG_REG
,
credit
);
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
浏览文件 @
64278fe8
...
...
@@ -305,7 +305,7 @@ struct dsaf_misc_op {
void
(
*
cpld_reset_led
)(
struct
hns_mac_cb
*
mac_cb
);
int
(
*
cpld_set_led_id
)(
struct
hns_mac_cb
*
mac_cb
,
enum
hnae_led_state
status
);
/* reset seri
s function, it will be reset if the derese
et is 0 */
/* reset seri
es function, it will be reset if the deres
et is 0 */
void
(
*
dsaf_reset
)(
struct
dsaf_device
*
dsaf_dev
,
bool
dereset
);
void
(
*
xge_srst
)(
struct
dsaf_device
*
dsaf_dev
,
u32
port
,
bool
dereset
);
void
(
*
xge_core_srst
)(
struct
dsaf_device
*
dsaf_dev
,
u32
port
,
...
...
@@ -313,6 +313,9 @@ struct dsaf_misc_op {
void
(
*
ge_srst
)(
struct
dsaf_device
*
dsaf_dev
,
u32
port
,
bool
dereset
);
void
(
*
ppe_srst
)(
struct
dsaf_device
*
dsaf_dev
,
u32
port
,
bool
dereset
);
void
(
*
ppe_comm_srst
)(
struct
dsaf_device
*
dsaf_dev
,
bool
dereset
);
void
(
*
hns_dsaf_srst_chns
)(
struct
dsaf_device
*
dsaf_dev
,
u32
msk
,
bool
dereset
);
void
(
*
hns_dsaf_roce_srst
)(
struct
dsaf_device
*
dsaf_dev
,
bool
dereset
);
phy_interface_t
(
*
get_phy_if
)(
struct
hns_mac_cb
*
mac_cb
);
int
(
*
get_sfp_prsnt
)(
struct
hns_mac_cb
*
mac_cb
,
int
*
sfp_prsnt
);
...
...
@@ -445,10 +448,6 @@ int hns_dsaf_get_mac_entry_by_index(
void
hns_dsaf_fix_mac_mode
(
struct
hns_mac_cb
*
mac_cb
);
void
hns_dsaf_srst_chns
(
struct
dsaf_device
*
dsaf_dev
,
u32
msk
,
bool
enable
);
void
hns_dsaf_roce_srst
(
struct
dsaf_device
*
dsaf_dev
,
bool
enable
);
int
hns_dsaf_ae_init
(
struct
dsaf_device
*
dsaf_dev
);
void
hns_dsaf_ae_uninit
(
struct
dsaf_device
*
dsaf_dev
);
...
...
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.c
浏览文件 @
64278fe8
...
...
@@ -26,6 +26,8 @@ enum _dsm_rst_type {
HNS_XGE_CORE_RESET_FUNC
=
0x3
,
HNS_XGE_RESET_FUNC
=
0x4
,
HNS_GE_RESET_FUNC
=
0x5
,
HNS_DSAF_CHN_RESET_FUNC
=
0x6
,
HNS_ROCE_RESET_FUNC
=
0x7
,
};
const
u8
hns_dsaf_acpi_dsm_uuid
[]
=
{
...
...
@@ -241,11 +243,11 @@ static void hns_dsaf_xge_core_srst_by_port(struct dsaf_device *dsaf_dev,
* bit18-19 for com/dfx
* @enable: false - request reset , true - drop reset
*/
void
hns_dsaf_srst_chns
(
struct
dsaf_device
*
dsaf_dev
,
u32
msk
,
bool
enable
)
void
hns_dsaf_srst_chns
(
struct
dsaf_device
*
dsaf_dev
,
u32
msk
,
bool
dereset
)
{
u32
reg_addr
;
if
(
!
enable
)
if
(
!
dereset
)
reg_addr
=
DSAF_SUB_SC_DSAF_RESET_REQ_REG
;
else
reg_addr
=
DSAF_SUB_SC_DSAF_RESET_DREQ_REG
;
...
...
@@ -253,9 +255,27 @@ void hns_dsaf_srst_chns(struct dsaf_device *dsaf_dev, u32 msk, bool enable)
dsaf_write_sub
(
dsaf_dev
,
reg_addr
,
msk
);
}
void
hns_dsaf_roce_srst
(
struct
dsaf_device
*
dsaf_dev
,
bool
enable
)
/**
* hns_dsaf_srst_chns - reset dsaf channels
* @dsaf_dev: dsaf device struct pointer
* @msk: xbar channels mask value:
* bit0-5 for xge0-5
* bit6-11 for ppe0-5
* bit12-17 for roce0-5
* bit18-19 for com/dfx
* @enable: false - request reset , true - drop reset
*/
void
hns_dsaf_srst_chns_acpi
(
struct
dsaf_device
*
dsaf_dev
,
u32
msk
,
bool
dereset
)
{
if
(
!
enable
)
{
hns_dsaf_acpi_srst_by_port
(
dsaf_dev
,
HNS_OP_RESET_FUNC
,
HNS_DSAF_CHN_RESET_FUNC
,
msk
,
dereset
);
}
void
hns_dsaf_roce_srst
(
struct
dsaf_device
*
dsaf_dev
,
bool
dereset
)
{
if
(
!
dereset
)
{
dsaf_write_sub
(
dsaf_dev
,
DSAF_SUB_SC_ROCEE_RESET_REQ_REG
,
1
);
}
else
{
dsaf_write_sub
(
dsaf_dev
,
...
...
@@ -267,6 +287,12 @@ void hns_dsaf_roce_srst(struct dsaf_device *dsaf_dev, bool enable)
}
}
void
hns_dsaf_roce_srst_acpi
(
struct
dsaf_device
*
dsaf_dev
,
bool
dereset
)
{
hns_dsaf_acpi_srst_by_port
(
dsaf_dev
,
HNS_OP_RESET_FUNC
,
HNS_ROCE_RESET_FUNC
,
0
,
dereset
);
}
static
void
hns_dsaf_xge_core_srst_by_port_acpi
(
struct
dsaf_device
*
dsaf_dev
,
u32
port
,
bool
dereset
)
...
...
@@ -575,6 +601,8 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
misc_op
->
ge_srst
=
hns_dsaf_ge_srst_by_port
;
misc_op
->
ppe_srst
=
hns_ppe_srst_by_port
;
misc_op
->
ppe_comm_srst
=
hns_ppe_com_srst
;
misc_op
->
hns_dsaf_srst_chns
=
hns_dsaf_srst_chns
;
misc_op
->
hns_dsaf_roce_srst
=
hns_dsaf_roce_srst
;
misc_op
->
get_phy_if
=
hns_mac_get_phy_if
;
misc_op
->
get_sfp_prsnt
=
hns_mac_get_sfp_prsnt
;
...
...
@@ -591,6 +619,8 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
misc_op
->
ge_srst
=
hns_dsaf_ge_srst_by_port_acpi
;
misc_op
->
ppe_srst
=
hns_ppe_srst_by_port_acpi
;
misc_op
->
ppe_comm_srst
=
hns_ppe_com_srst
;
misc_op
->
hns_dsaf_srst_chns
=
hns_dsaf_srst_chns_acpi
;
misc_op
->
hns_dsaf_roce_srst
=
hns_dsaf_roce_srst_acpi
;
misc_op
->
get_phy_if
=
hns_mac_get_phy_if_acpi
;
misc_op
->
get_sfp_prsnt
=
hns_mac_get_sfp_prsnt
;
...
...
@@ -603,3 +633,18 @@ struct dsaf_misc_op *hns_misc_op_get(struct dsaf_device *dsaf_dev)
return
(
void
*
)
misc_op
;
}
static
int
hns_dsaf_dev_match
(
struct
device
*
dev
,
void
*
fwnode
)
{
return
dev
->
fwnode
==
fwnode
;
}
struct
platform_device
*
hns_dsaf_find_platform_device
(
struct
fwnode_handle
*
fwnode
)
{
struct
device
*
dev
;
dev
=
bus_find_device
(
&
platform_bus_type
,
NULL
,
fwnode
,
hns_dsaf_dev_match
);
return
dev
?
to_platform_device
(
dev
)
:
NULL
;
}
drivers/net/ethernet/hisilicon/hns/hns_dsaf_misc.h
浏览文件 @
64278fe8
...
...
@@ -34,5 +34,6 @@
#define DSAF_LED_ANCHOR_B 5
struct
dsaf_misc_op
*
hns_misc_op_get
(
struct
dsaf_device
*
dsaf_dev
);
struct
platform_device
*
hns_dsaf_find_platform_device
(
struct
fwnode_handle
*
fwnode
);
#endif
drivers/net/ethernet/hisilicon/hns/hns_dsaf_reg.h
浏览文件 @
64278fe8
...
...
@@ -78,10 +78,10 @@
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_REQ_REG 0xA88
#define DSAF_SUB_SC_RCB_PPE_COM_RESET_DREQ_REG 0xA8C
#define DSAF_SUB_SC_DSAF_RESET_REQ_REG 0xAA8
#define DSAF_SUB_SC_ROCEE_RESET_REQ_REG 0xA50
#define DSAF_SUB_SC_DSAF_RESET_DREQ_REG 0xAAC
#define DSAF_SUB_SC_ROCEE_
CLK_DIS_REG 0x32C
#define DSAF_SUB_SC_ROCEE_
RESET_REQ_REG 0xA50
#define DSAF_SUB_SC_ROCEE_RESET_DREQ_REG 0xA54
#define DSAF_SUB_SC_ROCEE_CLK_DIS_REG 0x32C
#define DSAF_SUB_SC_ROCEE_CLK_EN_REG 0x328
#define DSAF_SUB_SC_LIGHT_MODULE_DETECT_EN_REG 0x2060
#define DSAF_SUB_SC_TCAM_MBIST_EN_REG 0x2300
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录