Commit 31d4446d authored by Yisen.Zhuang\(Zhuangyuzeng\)'s avatar Yisen.Zhuang\(Zhuangyuzeng\) Committed by David S. Miller

net: hns: add attribute cpld_ctrl for dsaf port node

This patch adds attribute cpld_ctrl for dsaf port node, parses the syscon
for mac_cb from dts, and changes the method of access the cpld related
registers through syscon.
Signed-off-by: default avatarDaode Huang <huangdaode@hisilicon.com>
Signed-off-by: default avatarYisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 831d828b
...@@ -664,7 +664,7 @@ void hns_ae_update_led_status(struct hnae_handle *handle) ...@@ -664,7 +664,7 @@ void hns_ae_update_led_status(struct hnae_handle *handle)
assert(handle); assert(handle);
mac_cb = hns_get_mac_cb(handle); mac_cb = hns_get_mac_cb(handle);
if (!mac_cb->cpld_vaddr) if (!mac_cb->cpld_ctrl)
return; return;
hns_set_led_opt(mac_cb); hns_set_led_opt(mac_cb);
} }
......
...@@ -82,17 +82,6 @@ static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb) ...@@ -82,17 +82,6 @@ static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
} }
} }
int hns_mac_get_sfp_prsnt(struct hns_mac_cb *mac_cb, int *sfp_prsnt)
{
if (!mac_cb->cpld_vaddr)
return -ENODEV;
*sfp_prsnt = !dsaf_read_b((u8 *)mac_cb->cpld_vaddr
+ MAC_SFP_PORT_OFFSET);
return 0;
}
void hns_mac_get_link_status(struct hns_mac_cb *mac_cb, u32 *link_status) void hns_mac_get_link_status(struct hns_mac_cb *mac_cb, u32 *link_status)
{ {
struct mac_driver *mac_ctrl_drv; struct mac_driver *mac_ctrl_drv;
...@@ -658,6 +647,8 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -658,6 +647,8 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
{ {
struct device_node *np = mac_cb->dev->of_node; struct device_node *np = mac_cb->dev->of_node;
struct regmap *syscon; struct regmap *syscon;
u32 ret;
mac_cb->link = false; mac_cb->link = false;
mac_cb->half_duplex = false; mac_cb->half_duplex = false;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if]; mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
...@@ -701,6 +692,23 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -701,6 +692,23 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
return -EINVAL; return -EINVAL;
} }
mac_cb->serdes_ctrl = syscon; mac_cb->serdes_ctrl = syscon;
syscon = syscon_node_to_regmap(
of_parse_phandle(to_of_node(mac_cb->fw_port),
"cpld-syscon", 0));
if (IS_ERR_OR_NULL(syscon)) {
dev_dbg(mac_cb->dev, "no cpld-syscon found!\n");
mac_cb->cpld_ctrl = NULL;
} else {
mac_cb->cpld_ctrl = syscon;
ret = fwnode_property_read_u32(mac_cb->fw_port,
"cpld-ctrl-reg",
&mac_cb->cpld_ctrl_reg);
if (ret) {
dev_err(mac_cb->dev, "get cpld-ctrl-reg fail!\n");
return ret;
}
}
return 0; return 0;
} }
...@@ -751,11 +759,6 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb) ...@@ -751,11 +759,6 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb)
mac_cb->sys_ctl_vaddr = dsaf_dev->sc_base; mac_cb->sys_ctl_vaddr = dsaf_dev->sc_base;
mac_cb->serdes_vaddr = dsaf_dev->sds_base; mac_cb->serdes_vaddr = dsaf_dev->sds_base;
if (dsaf_dev->cpld_base && !HNS_DSAF_IS_DEBUG(dsaf_dev)) {
mac_cb->cpld_vaddr = dsaf_dev->cpld_base +
mac_cb->mac_id * CPLD_ADDR_PORT_OFFSET;
cpld_led_reset(mac_cb);
}
mac_cb->sfp_prsnt = 0; mac_cb->sfp_prsnt = 0;
mac_cb->txpkt_for_led = 0; mac_cb->txpkt_for_led = 0;
mac_cb->rxpkt_for_led = 0; mac_cb->rxpkt_for_led = 0;
...@@ -780,6 +783,7 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb) ...@@ -780,6 +783,7 @@ int hns_mac_get_cfg(struct dsaf_device *dsaf_dev, struct hns_mac_cb *mac_cb)
if (ret) if (ret)
return ret; return ret;
cpld_led_reset(mac_cb);
mac_cb->vaddr = hns_mac_get_vaddr(dsaf_dev, mac_cb, mac_mode_idx); mac_cb->vaddr = hns_mac_get_vaddr(dsaf_dev, mac_cb, mac_mode_idx);
return 0; return 0;
...@@ -956,7 +960,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb) ...@@ -956,7 +960,7 @@ void hns_set_led_opt(struct hns_mac_cb *mac_cb)
int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb, int hns_cpld_led_set_id(struct hns_mac_cb *mac_cb,
enum hnae_led_state status) enum hnae_led_state status)
{ {
if (!mac_cb || !mac_cb->cpld_vaddr) if (!mac_cb || !mac_cb->cpld_ctrl)
return 0; return 0;
return cpld_set_led_id(mac_cb, status); return cpld_set_led_id(mac_cb, status);
......
...@@ -313,10 +313,11 @@ struct hns_mac_cb { ...@@ -313,10 +313,11 @@ struct hns_mac_cb {
struct mac_priv priv; struct mac_priv priv;
struct fwnode_handle *fw_port; struct fwnode_handle *fw_port;
u8 __iomem *vaddr; u8 __iomem *vaddr;
u8 __iomem *cpld_vaddr;
u8 __iomem *sys_ctl_vaddr; u8 __iomem *sys_ctl_vaddr;
u8 __iomem *serdes_vaddr; u8 __iomem *serdes_vaddr;
struct regmap *serdes_ctrl; struct regmap *serdes_ctrl;
struct regmap *cpld_ctrl;
u32 cpld_ctrl_reg;
struct mac_entry_idx addr_entry_idx[DSAF_MAX_VM_NUM]; struct mac_entry_idx addr_entry_idx[DSAF_MAX_VM_NUM];
u8 sfp_prsnt; u8 sfp_prsnt;
u8 cpld_led_value; u8 cpld_led_value;
......
...@@ -189,8 +189,6 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev) ...@@ -189,8 +189,6 @@ int hns_dsaf_get_cfg(struct dsaf_device *dsaf_dev)
iounmap(dsaf_dev->sds_base); iounmap(dsaf_dev->sds_base);
if (dsaf_dev->sc_base) if (dsaf_dev->sc_base)
iounmap(dsaf_dev->sc_base); iounmap(dsaf_dev->sc_base);
if (dsaf_dev->cpld_base)
iounmap(dsaf_dev->cpld_base);
return ret; return ret;
} }
...@@ -207,9 +205,6 @@ static void hns_dsaf_free_cfg(struct dsaf_device *dsaf_dev) ...@@ -207,9 +205,6 @@ static void hns_dsaf_free_cfg(struct dsaf_device *dsaf_dev)
if (dsaf_dev->sc_base) if (dsaf_dev->sc_base)
iounmap(dsaf_dev->sc_base); iounmap(dsaf_dev->sc_base);
if (dsaf_dev->cpld_base)
iounmap(dsaf_dev->cpld_base);
} }
/** /**
......
...@@ -277,7 +277,6 @@ struct dsaf_device { ...@@ -277,7 +277,6 @@ struct dsaf_device {
u8 __iomem *sds_base; u8 __iomem *sds_base;
u8 __iomem *ppe_base; u8 __iomem *ppe_base;
u8 __iomem *io_base; u8 __iomem *io_base;
u8 __iomem *cpld_base;
struct regmap *sub_ctrl; struct regmap *sub_ctrl;
phys_addr_t ppe_paddr; phys_addr_t ppe_paddr;
......
...@@ -42,8 +42,8 @@ void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status, ...@@ -42,8 +42,8 @@ void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
pr_err("sfp_led_opt mac_dev is null!\n"); pr_err("sfp_led_opt mac_dev is null!\n");
return; return;
} }
if (!mac_cb->cpld_vaddr) { if (!mac_cb->cpld_ctrl) {
dev_err(mac_cb->dev, "mac_id=%d, cpld_vaddr is null !\n", dev_err(mac_cb->dev, "mac_id=%d, cpld syscon is null !\n",
mac_cb->mac_id); mac_cb->mac_id);
return; return;
} }
...@@ -60,21 +60,24 @@ void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status, ...@@ -60,21 +60,24 @@ void hns_cpld_set_led(struct hns_mac_cb *mac_cb, int link_status,
dsaf_set_bit(value, DSAF_LED_DATA_B, data); dsaf_set_bit(value, DSAF_LED_DATA_B, data);
if (value != mac_cb->cpld_led_value) { if (value != mac_cb->cpld_led_value) {
dsaf_write_b(mac_cb->cpld_vaddr, value); dsaf_write_syscon(mac_cb->cpld_ctrl,
mac_cb->cpld_ctrl_reg, value);
mac_cb->cpld_led_value = value; mac_cb->cpld_led_value = value;
} }
} else { } else {
dsaf_write_b(mac_cb->cpld_vaddr, CPLD_LED_DEFAULT_VALUE); dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
CPLD_LED_DEFAULT_VALUE);
mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE; mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE;
} }
} }
void cpld_led_reset(struct hns_mac_cb *mac_cb) void cpld_led_reset(struct hns_mac_cb *mac_cb)
{ {
if (!mac_cb || !mac_cb->cpld_vaddr) if (!mac_cb || !mac_cb->cpld_ctrl)
return; return;
dsaf_write_b(mac_cb->cpld_vaddr, CPLD_LED_DEFAULT_VALUE); dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
CPLD_LED_DEFAULT_VALUE);
mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE; mac_cb->cpld_led_value = CPLD_LED_DEFAULT_VALUE;
} }
...@@ -83,15 +86,19 @@ int cpld_set_led_id(struct hns_mac_cb *mac_cb, ...@@ -83,15 +86,19 @@ int cpld_set_led_id(struct hns_mac_cb *mac_cb,
{ {
switch (status) { switch (status) {
case HNAE_LED_ACTIVE: case HNAE_LED_ACTIVE:
mac_cb->cpld_led_value = dsaf_read_b(mac_cb->cpld_vaddr); mac_cb->cpld_led_value =
dsaf_read_syscon(mac_cb->cpld_ctrl,
mac_cb->cpld_ctrl_reg);
dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B, dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B,
CPLD_LED_ON_VALUE); CPLD_LED_ON_VALUE);
dsaf_write_b(mac_cb->cpld_vaddr, mac_cb->cpld_led_value); dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
mac_cb->cpld_led_value);
return 2; return 2;
case HNAE_LED_INACTIVE: case HNAE_LED_INACTIVE:
dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B, dsaf_set_bit(mac_cb->cpld_led_value, DSAF_LED_ANCHOR_B,
CPLD_LED_DEFAULT_VALUE); CPLD_LED_DEFAULT_VALUE);
dsaf_write_b(mac_cb->cpld_vaddr, mac_cb->cpld_led_value); dsaf_write_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg,
mac_cb->cpld_led_value);
break; break;
default: default:
break; break;
...@@ -301,6 +308,17 @@ phy_interface_t hns_mac_get_phy_if(struct hns_mac_cb *mac_cb) ...@@ -301,6 +308,17 @@ phy_interface_t hns_mac_get_phy_if(struct hns_mac_cb *mac_cb)
return phy_if; return phy_if;
} }
int hns_mac_get_sfp_prsnt(struct hns_mac_cb *mac_cb, int *sfp_prsnt)
{
if (!mac_cb->cpld_ctrl)
return -ENODEV;
*sfp_prsnt = !dsaf_read_syscon(mac_cb->cpld_ctrl, mac_cb->cpld_ctrl_reg
+ MAC_SFP_PORT_OFFSET);
return 0;
}
/** /**
* hns_mac_config_sds_loopback - set loop back for serdes * hns_mac_config_sds_loopback - set loop back for serdes
* @mac_cb: mac control block * @mac_cb: mac control block
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment