Commit ca9354a1 authored by David S. Miller's avatar David S. Miller

Merge branch 'hns-next'

Yisen Zhuang says:

====================
net: hns: fix the typo of hns

This series includes typo fixes which review by Andy, adding
the hns maintainer to MAINTAINERS, as below:

 > from Daode: adds the maintainer for hns driver;

 > from Daode: fix the typo of hns reviewed by Andy Shevchenko;

 > from Kejian: one remove redundant function and two fix to get
configuration from DT.

changlog:
 v2 -> v3:
  match all files in and below drivers/net/ethernet/hisilicon/

 v1 -> v2:
  fix the indentations reviewed by David.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1364db42 b15dc292
...@@ -5437,6 +5437,15 @@ F: include/uapi/linux/if_hippi.h ...@@ -5437,6 +5437,15 @@ F: include/uapi/linux/if_hippi.h
F: net/802/hippi.c F: net/802/hippi.c
F: drivers/net/hippi/ F: drivers/net/hippi/
HISILICON NETWORK SUBSYSTEM DRIVER
M: Yisen Zhuang <yisen.zhuang@huawei.com>
M: Salil Mehta <salil.mehta@huawei.com>
L: netdev@vger.kernel.org
W: http://www.hisilicon.com
S: Maintained
F: drivers/net/ethernet/hisilicon/
F: Documentation/devicetree/bindings/net/hisilicon*.txt
HISILICON SAS Controller HISILICON SAS Controller
M: John Garry <john.garry@huawei.com> M: John Garry <john.garry@huawei.com>
W: http://www.hisilicon.com W: http://www.hisilicon.com
......
...@@ -363,6 +363,14 @@ enum hnae_port_type { ...@@ -363,6 +363,14 @@ enum hnae_port_type {
HNAE_PORT_DEBUG HNAE_PORT_DEBUG
}; };
/* mac media type */
enum hnae_media_type {
HNAE_MEDIA_TYPE_UNKNOWN = 0,
HNAE_MEDIA_TYPE_FIBER,
HNAE_MEDIA_TYPE_COPPER,
HNAE_MEDIA_TYPE_BACKPLANE,
};
/* This struct defines the operation on the handle. /* This struct defines the operation on the handle.
* *
* get_handle(): (mandatory) * get_handle(): (mandatory)
...@@ -525,6 +533,7 @@ struct hnae_handle { ...@@ -525,6 +533,7 @@ struct hnae_handle {
u32 eport_id; u32 eport_id;
u32 dport_id; /* v2 tx bd should fill the dport_id */ u32 dport_id; /* v2 tx bd should fill the dport_id */
enum hnae_port_type port_type; enum hnae_port_type port_type;
enum hnae_media_type media_type;
struct list_head node; /* list to hnae_ae_dev->handle_list */ struct list_head node; /* list to hnae_ae_dev->handle_list */
struct hnae_buf_ops *bops; /* operation for the buffer */ struct hnae_buf_ops *bops; /* operation for the buffer */
struct hnae_queue **qs; /* array base of all queues */ struct hnae_queue **qs; /* array base of all queues */
......
...@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev, ...@@ -134,6 +134,7 @@ struct hnae_handle *hns_ae_get_handle(struct hnae_ae_dev *dev,
ae_handle->phy_dev = vf_cb->mac_cb->phy_dev; ae_handle->phy_dev = vf_cb->mac_cb->phy_dev;
ae_handle->if_support = vf_cb->mac_cb->if_support; ae_handle->if_support = vf_cb->mac_cb->if_support;
ae_handle->port_type = vf_cb->mac_cb->mac_type; ae_handle->port_type = vf_cb->mac_cb->mac_type;
ae_handle->media_type = vf_cb->mac_cb->media_type;
ae_handle->dport_id = port_id; ae_handle->dport_id = port_id;
return ae_handle; return ae_handle;
......
...@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = { ...@@ -56,20 +56,6 @@ static const enum mac_mode g_mac_mode_1000[] = {
[PHY_INTERFACE_MODE_RTBI] = MAC_MODE_RTBI_1000 [PHY_INTERFACE_MODE_RTBI] = MAC_MODE_RTBI_1000
}; };
static enum mac_mode hns_mac_dev_to_enet_if(const struct hns_mac_cb *mac_cb)
{
switch (mac_cb->max_speed) {
case MAC_SPEED_100:
return g_mac_mode_100[mac_cb->phy_if];
case MAC_SPEED_1000:
return g_mac_mode_1000[mac_cb->phy_if];
case MAC_SPEED_10000:
return MAC_MODE_XGMII_10000;
default:
return MAC_MODE_MII_100;
}
}
static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb) static enum mac_mode hns_get_enet_interface(const struct hns_mac_cb *mac_cb)
{ {
switch (mac_cb->max_speed) { switch (mac_cb->max_speed) {
...@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int speed, int duplex) ...@@ -134,7 +120,6 @@ void hns_mac_adjust_link(struct hns_mac_cb *mac_cb, int speed, int duplex)
mac_cb->speed = speed; mac_cb->speed = speed;
mac_cb->half_duplex = !duplex; mac_cb->half_duplex = !duplex;
mac_ctrl_drv->mac_mode = hns_mac_dev_to_enet_if(mac_cb);
if (mac_ctrl_drv->adjust_link) { if (mac_ctrl_drv->adjust_link) {
ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv, ret = mac_ctrl_drv->adjust_link(mac_ctrl_drv,
...@@ -748,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb) ...@@ -748,6 +733,18 @@ static void hns_mac_register_phy(struct hns_mac_cb *mac_cb)
mac_cb->mac_id, addr); mac_cb->mac_id, addr);
} }
#define MAC_MEDIA_TYPE_MAX_LEN 16
static const struct {
enum hnae_media_type value;
const char *name;
} media_type_defs[] = {
{HNAE_MEDIA_TYPE_UNKNOWN, "unknown" },
{HNAE_MEDIA_TYPE_FIBER, "fiber" },
{HNAE_MEDIA_TYPE_COPPER, "copper" },
{HNAE_MEDIA_TYPE_BACKPLANE, "backplane" },
};
/** /**
*hns_mac_get_info - get mac information from device node *hns_mac_get_info - get mac information from device node
*@mac_cb: mac device *@mac_cb: mac device
...@@ -759,10 +756,13 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -759,10 +756,13 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
struct device_node *np; struct device_node *np;
struct regmap *syscon; struct regmap *syscon;
struct of_phandle_args cpld_args; struct of_phandle_args cpld_args;
const char *media_type;
u32 i;
u32 ret; u32 ret;
mac_cb->link = false; mac_cb->link = false;
mac_cb->half_duplex = false; mac_cb->half_duplex = false;
mac_cb->media_type = HNAE_MEDIA_TYPE_UNKNOWN;
mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if]; mac_cb->speed = mac_phy_to_speed[mac_cb->phy_if];
mac_cb->max_speed = mac_cb->speed; mac_cb->max_speed = mac_cb->speed;
...@@ -864,6 +864,17 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb) ...@@ -864,6 +864,17 @@ static int hns_mac_get_info(struct hns_mac_cb *mac_cb)
mac_cb->mac_id); mac_cb->mac_id);
} }
if (!fwnode_property_read_string(mac_cb->fw_port, "media-type",
&media_type)) {
for (i = 0; i < ARRAY_SIZE(media_type_defs); i++) {
if (!strncmp(media_type_defs[i].name, media_type,
MAC_MEDIA_TYPE_MAX_LEN)) {
mac_cb->media_type = media_type_defs[i].value;
break;
}
}
}
return 0; return 0;
} }
......
...@@ -335,6 +335,7 @@ struct hns_mac_cb { ...@@ -335,6 +335,7 @@ struct hns_mac_cb {
u64 txpkt_for_led; u64 txpkt_for_led;
u64 rxpkt_for_led; u64 rxpkt_for_led;
enum hnae_port_type mac_type; enum hnae_port_type mac_type;
enum hnae_media_type media_type;
phy_interface_t phy_if; phy_interface_t phy_if;
enum hnae_loop loop_mode; enum hnae_loop loop_mode;
......
...@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char *data, int node, ...@@ -2540,45 +2540,45 @@ static char *hns_dsaf_get_node_stats_strings(char *data, int node,
bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver); bool is_ver1 = AE_IS_VER1(dsaf_dev->dsaf_ver);
snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_pad_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_manage_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pkt_id", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_rx_pause_frame", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_release_buf_num", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_sbm_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_crc_false_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_bp_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_lookup_rslt_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_local_rslt_fail_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_vlan_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "innod%d_stp_drop_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
if ((node < DSAF_SERVICE_NW_NUM) && (!is_ver1)) { if (node < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) { for (i = 0; i < DSAF_PRIO_NR; i++) {
snprintf(buff, ETH_GSTRING_LEN, snprintf(buff + 0 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
"inod%d_pfc_prio%d_pkts", node, i); ETH_GSTRING_LEN, "inod%d_pfc_prio%d_pkts",
buff = buff + ETH_GSTRING_LEN; node, i);
} snprintf(buff + 1 * ETH_GSTRING_LEN * DSAF_PRIO_NR,
for (i = 0; i < DSAF_PRIO_NR; i++) { ETH_GSTRING_LEN, "onod%d_pfc_prio%d_pkts",
snprintf(buff, ETH_GSTRING_LEN, node, i);
"onod%d_pfc_prio%d_pkts", node, i); buff += ETH_GSTRING_LEN;
buff = buff + ETH_GSTRING_LEN;
} }
buff += 1 * DSAF_PRIO_NR * ETH_GSTRING_LEN;
} }
snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node); snprintf(buff, ETH_GSTRING_LEN, "onnod%d_tx_pkts", node);
buff = buff + ETH_GSTRING_LEN; buff += ETH_GSTRING_LEN;
return buff; return buff;
} }
...@@ -2604,10 +2604,10 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data, ...@@ -2604,10 +2604,10 @@ static u64 *hns_dsaf_get_node_stats(struct dsaf_device *ddev, u64 *data,
p[10] = hw_stats->local_addr_false; p[10] = hw_stats->local_addr_false;
p[11] = hw_stats->vlan_drop; p[11] = hw_stats->vlan_drop;
p[12] = hw_stats->stp_drop; p[12] = hw_stats->stp_drop;
if ((node_num < DSAF_SERVICE_NW_NUM) && (!is_ver1)) { if (node_num < DSAF_SERVICE_NW_NUM && !is_ver1) {
for (i = 0; i < DSAF_PRIO_NR; i++) { for (i = 0; i < DSAF_PRIO_NR; i++) {
p[13 + i] = hw_stats->rx_pfc[i]; p[13 + i + 0 * DSAF_PRIO_NR] = hw_stats->rx_pfc[i];
p[13 + i + DSAF_PRIO_NR] = hw_stats->tx_pfc[i]; p[13 + i + 1 * DSAF_PRIO_NR] = hw_stats->tx_pfc[i];
} }
p[29] = hw_stats->tx_pkts; p[29] = hw_stats->tx_pkts;
return &p[30]; return &p[30];
......
...@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port, ...@@ -253,10 +253,9 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port,
reg_val_1 = 0x1 << port; reg_val_1 = 0x1 << port;
port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off; port_rst_off = dsaf_dev->mac_cb[port]->port_rst_off;
/* there is difference between V1 and V2 in register.*/ /* there is difference between V1 and V2 in register.*/
if (AE_IS_VER1(dsaf_dev->dsaf_ver)) reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ?
reg_val_2 = 0x1041041 << port_rst_off; 0x1041041 : 0x2082082;
else reg_val_2 <<= port_rst_off;
reg_val_2 = 0x2082082 << port_rst_off;
if (!dereset) { if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG, dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
...@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port, ...@@ -272,12 +271,11 @@ static void hns_dsaf_ge_srst_by_port(struct dsaf_device *dsaf_dev, u32 port,
reg_val_1); reg_val_1);
} }
} else { } else {
reg_val_1 = 0x15540 << dsaf_dev->reset_offset; reg_val_1 = 0x15540;
reg_val_2 = AE_IS_VER1(dsaf_dev->dsaf_ver) ? 0x100 : 0x40;
if (AE_IS_VER1(dsaf_dev->dsaf_ver)) reg_val_1 <<= dsaf_dev->reset_offset;
reg_val_2 = 0x100 << dsaf_dev->reset_offset; reg_val_2 <<= dsaf_dev->reset_offset;
else
reg_val_2 = 0x40 << dsaf_dev->reset_offset;
if (!dereset) { if (!dereset) {
dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG, dsaf_write_sub(dsaf_dev, DSAF_SUB_SC_GE_RESET_REQ1_REG,
......
...@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data, ...@@ -762,13 +762,13 @@ static int hns_nic_rx_poll_one(struct hns_nic_ring_data *ring_data,
recv_pkts = 0, recv_bds = 0, clean_count = 0; recv_pkts = 0, recv_bds = 0, clean_count = 0;
recv: recv:
while (recv_pkts < budget && recv_bds < num) { while (recv_pkts < budget && recv_bds < num) {
/* reuse or realloc buffers*/ /* reuse or realloc buffers */
if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) { if (clean_count >= RCB_NOF_ALLOC_RX_BUFF_ONCE) {
hns_nic_alloc_rx_buffers(ring_data, clean_count); hns_nic_alloc_rx_buffers(ring_data, clean_count);
clean_count = 0; clean_count = 0;
} }
/* poll one pkt*/ /* poll one pkt */
err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum); err = hns_nic_poll_rx_skb(ring_data, &skb, &bnum);
if (unlikely(!skb)) /* this fault cannot be repaired */ if (unlikely(!skb)) /* this fault cannot be repaired */
goto out; goto out;
......
...@@ -165,13 +165,21 @@ static int hns_nic_get_settings(struct net_device *net_dev, ...@@ -165,13 +165,21 @@ static int hns_nic_get_settings(struct net_device *net_dev,
cmd->advertising |= ADVERTISED_10000baseKR_Full; cmd->advertising |= ADVERTISED_10000baseKR_Full;
} }
if (h->port_type == HNAE_PORT_SERVICE) { switch (h->media_type) {
case HNAE_MEDIA_TYPE_FIBER:
cmd->port = PORT_FIBRE; cmd->port = PORT_FIBRE;
cmd->supported |= SUPPORTED_Pause; break;
} else { case HNAE_MEDIA_TYPE_COPPER:
cmd->port = PORT_TP; cmd->port = PORT_TP;
break;
case HNAE_MEDIA_TYPE_UNKNOWN:
default:
break;
} }
if (!(AE_IS_VER1(priv->enet_ver) && h->port_type == HNAE_PORT_DEBUG))
cmd->supported |= SUPPORTED_Pause;
cmd->transceiver = XCVR_EXTERNAL; cmd->transceiver = XCVR_EXTERNAL;
cmd->mdio_support = (ETH_MDIO_SUPPORTS_C45 | ETH_MDIO_SUPPORTS_C22); cmd->mdio_support = (ETH_MDIO_SUPPORTS_C45 | ETH_MDIO_SUPPORTS_C22);
hns_get_mdix_mode(net_dev, cmd); hns_get_mdix_mode(net_dev, cmd);
......
...@@ -37,9 +37,19 @@ ...@@ -37,9 +37,19 @@
#define MDIO_TIMEOUT 1000000 #define MDIO_TIMEOUT 1000000
struct hns_mdio_sc_reg {
u16 mdio_clk_en;
u16 mdio_clk_dis;
u16 mdio_reset_req;
u16 mdio_reset_dreq;
u16 mdio_clk_st;
u16 mdio_reset_st;
};
struct hns_mdio_device { struct hns_mdio_device {
void *vbase; /* mdio reg base address */ void *vbase; /* mdio reg base address */
struct regmap *subctrl_vbase; struct regmap *subctrl_vbase;
struct hns_mdio_sc_reg sc_reg;
}; };
/* mdio reg */ /* mdio reg */
...@@ -93,7 +103,6 @@ enum mdio_c45_op_seq { ...@@ -93,7 +103,6 @@ enum mdio_c45_op_seq {
#define MDIO_SC_CLK_DIS 0x33C #define MDIO_SC_CLK_DIS 0x33C
#define MDIO_SC_RESET_REQ 0xA38 #define MDIO_SC_RESET_REQ 0xA38
#define MDIO_SC_RESET_DREQ 0xA3C #define MDIO_SC_RESET_DREQ 0xA3C
#define MDIO_SC_CTRL 0x2010
#define MDIO_SC_CLK_ST 0x531C #define MDIO_SC_CLK_ST 0x531C
#define MDIO_SC_RESET_ST 0x5A1C #define MDIO_SC_RESET_ST 0x5A1C
...@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum) ...@@ -353,6 +362,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
static int hns_mdio_reset(struct mii_bus *bus) static int hns_mdio_reset(struct mii_bus *bus)
{ {
struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv; struct hns_mdio_device *mdio_dev = (struct hns_mdio_device *)bus->priv;
const struct hns_mdio_sc_reg *sc_reg;
int ret; int ret;
if (dev_of_node(bus->parent)) { if (dev_of_node(bus->parent)) {
...@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus) ...@@ -361,9 +371,10 @@ static int hns_mdio_reset(struct mii_bus *bus)
return -ENODEV; return -ENODEV;
} }
sc_reg = &mdio_dev->sc_reg;
/* 1. reset req, and read reset st check */ /* 1. reset req, and read reset st check */
ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_REQ, 0x1, ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_req,
MDIO_SC_RESET_ST, 0x1, 0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_SET_ST); MDIO_CHECK_SET_ST);
if (ret) { if (ret) {
dev_err(&bus->dev, "MDIO reset fail\n"); dev_err(&bus->dev, "MDIO reset fail\n");
...@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus) ...@@ -371,8 +382,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
} }
/* 2. dis clk, and read clk st check */ /* 2. dis clk, and read clk st check */
ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_DIS, ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_dis,
0x1, MDIO_SC_CLK_ST, 0x1, 0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_CLR_ST); MDIO_CHECK_CLR_ST);
if (ret) { if (ret) {
dev_err(&bus->dev, "MDIO dis clk fail\n"); dev_err(&bus->dev, "MDIO dis clk fail\n");
...@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus) ...@@ -380,8 +391,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
} }
/* 3. reset dreq, and read reset st check */ /* 3. reset dreq, and read reset st check */
ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_RESET_DREQ, 0x1, ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_reset_dreq,
MDIO_SC_RESET_ST, 0x1, 0x1, sc_reg->mdio_reset_st, 0x1,
MDIO_CHECK_CLR_ST); MDIO_CHECK_CLR_ST);
if (ret) { if (ret) {
dev_err(&bus->dev, "MDIO dis clk fail\n"); dev_err(&bus->dev, "MDIO dis clk fail\n");
...@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus) ...@@ -389,8 +400,8 @@ static int hns_mdio_reset(struct mii_bus *bus)
} }
/* 4. en clk, and read clk st check */ /* 4. en clk, and read clk st check */
ret = mdio_sc_cfg_reg_write(mdio_dev, MDIO_SC_CLK_EN, ret = mdio_sc_cfg_reg_write(mdio_dev, sc_reg->mdio_clk_en,
0x1, MDIO_SC_CLK_ST, 0x1, 0x1, sc_reg->mdio_clk_st, 0x1,
MDIO_CHECK_SET_ST); MDIO_CHECK_SET_ST);
if (ret) if (ret)
dev_err(&bus->dev, "MDIO en clk fail\n"); dev_err(&bus->dev, "MDIO en clk fail\n");
...@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev) ...@@ -458,13 +469,54 @@ static int hns_mdio_probe(struct platform_device *pdev)
snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii", snprintf(new_bus->id, MII_BUS_ID_SIZE, "%s-%s", "Mii",
dev_name(&pdev->dev)); dev_name(&pdev->dev));
if (dev_of_node(&pdev->dev)) { if (dev_of_node(&pdev->dev)) {
mdio_dev->subctrl_vbase = syscon_node_to_regmap( struct of_phandle_args reg_args;
of_parse_phandle(pdev->dev.of_node,
"subctrl-vbase", 0)); ret = of_parse_phandle_with_fixed_args(pdev->dev.of_node,
if (IS_ERR(mdio_dev->subctrl_vbase)) { "subctrl-vbase",
dev_warn(&pdev->dev, "no syscon hisilicon,peri-c-subctrl\n"); 4,
0,
&reg_args);
if (!ret) {
mdio_dev->subctrl_vbase =
syscon_node_to_regmap(reg_args.np);
if (IS_ERR(mdio_dev->subctrl_vbase)) {
dev_warn(&pdev->dev, "syscon_node_to_regmap error\n");
mdio_dev->subctrl_vbase = NULL;
} else {
if (reg_args.args_count == 4) {
mdio_dev->sc_reg.mdio_clk_en =
(u16)reg_args.args[0];
mdio_dev->sc_reg.mdio_clk_dis =
(u16)reg_args.args[0] + 4;
mdio_dev->sc_reg.mdio_reset_req =
(u16)reg_args.args[1];
mdio_dev->sc_reg.mdio_reset_dreq =
(u16)reg_args.args[1] + 4;
mdio_dev->sc_reg.mdio_clk_st =
(u16)reg_args.args[2];
mdio_dev->sc_reg.mdio_reset_st =
(u16)reg_args.args[3];
} else {
/* for compatible */
mdio_dev->sc_reg.mdio_clk_en =
MDIO_SC_CLK_EN;
mdio_dev->sc_reg.mdio_clk_dis =
MDIO_SC_CLK_DIS;
mdio_dev->sc_reg.mdio_reset_req =
MDIO_SC_RESET_REQ;
mdio_dev->sc_reg.mdio_reset_dreq =
MDIO_SC_RESET_DREQ;
mdio_dev->sc_reg.mdio_clk_st =
MDIO_SC_CLK_ST;
mdio_dev->sc_reg.mdio_reset_st =
MDIO_SC_RESET_ST;
}
}
} else {
dev_warn(&pdev->dev, "find syscon ret = %#x\n", ret);
mdio_dev->subctrl_vbase = NULL; mdio_dev->subctrl_vbase = NULL;
} }
ret = of_mdiobus_register(new_bus, pdev->dev.of_node); ret = of_mdiobus_register(new_bus, pdev->dev.of_node);
} else if (is_acpi_node(pdev->dev.fwnode)) { } else if (is_acpi_node(pdev->dev.fwnode)) {
/* Clear all the IRQ properties */ /* Clear all the IRQ properties */
......
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