net: atlantic: A2: phy loopback support
This patch adds the phy loopback support on A2. Signed-off-by: Dmitry Bogdanov <dbogdanov@marvell.com> Signed-off-by: Mark Starovoytov <mstarovoitov@marvell.com> Signed-off-by: Igor Russkikh <irusskikh@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2b53b04de3
commit
ecab78703f
|
@ -836,6 +836,7 @@ static int aq_ethtool_set_priv_flags(struct net_device *ndev, u32 flags)
|
||||||
struct aq_nic_s *aq_nic = netdev_priv(ndev);
|
struct aq_nic_s *aq_nic = netdev_priv(ndev);
|
||||||
struct aq_nic_cfg_s *cfg;
|
struct aq_nic_cfg_s *cfg;
|
||||||
u32 priv_flags;
|
u32 priv_flags;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
cfg = aq_nic_get_cfg(aq_nic);
|
cfg = aq_nic_get_cfg(aq_nic);
|
||||||
priv_flags = cfg->priv_flags;
|
priv_flags = cfg->priv_flags;
|
||||||
|
@ -857,10 +858,10 @@ static int aq_ethtool_set_priv_flags(struct net_device *ndev, u32 flags)
|
||||||
dev_open(ndev, NULL);
|
dev_open(ndev, NULL);
|
||||||
}
|
}
|
||||||
} else if ((priv_flags ^ flags) & AQ_HW_LOOPBACK_MASK) {
|
} else if ((priv_flags ^ flags) & AQ_HW_LOOPBACK_MASK) {
|
||||||
aq_nic_set_loopback(aq_nic);
|
ret = aq_nic_set_loopback(aq_nic);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct ethtool_ops aq_ethtool_ops = {
|
const struct ethtool_ops aq_ethtool_ops = {
|
||||||
|
|
|
@ -1556,7 +1556,7 @@ static int hw_atl_b0_hw_vlan_ctrl(struct aq_hw_s *self, bool enable)
|
||||||
return aq_hw_err_from_flags(self);
|
return aq_hw_err_from_flags(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hw_atl_b0_set_loopback(struct aq_hw_s *self, u32 mode, bool enable)
|
int hw_atl_b0_set_loopback(struct aq_hw_s *self, u32 mode, bool enable)
|
||||||
{
|
{
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case AQ_HW_LOOPBACK_DMA_SYS:
|
case AQ_HW_LOOPBACK_DMA_SYS:
|
||||||
|
|
|
@ -63,6 +63,7 @@ void hw_atl_b0_hw_init_rx_rss_ctrl1(struct aq_hw_s *self);
|
||||||
int hw_atl_b0_hw_mac_addr_set(struct aq_hw_s *self, u8 *mac_addr);
|
int hw_atl_b0_hw_mac_addr_set(struct aq_hw_s *self, u8 *mac_addr);
|
||||||
|
|
||||||
int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc);
|
int hw_atl_b0_set_fc(struct aq_hw_s *self, u32 fc, u32 tc);
|
||||||
|
int hw_atl_b0_set_loopback(struct aq_hw_s *self, u32 mode, bool enable);
|
||||||
|
|
||||||
int hw_atl_b0_hw_start(struct aq_hw_s *self);
|
int hw_atl_b0_hw_start(struct aq_hw_s *self);
|
||||||
|
|
||||||
|
|
|
@ -843,5 +843,6 @@ const struct aq_hw_ops hw_atl2_ops = {
|
||||||
.hw_get_hw_stats = hw_atl2_utils_get_hw_stats,
|
.hw_get_hw_stats = hw_atl2_utils_get_hw_stats,
|
||||||
.hw_get_fw_version = hw_atl2_utils_get_fw_version,
|
.hw_get_fw_version = hw_atl2_utils_get_fw_version,
|
||||||
.hw_set_offload = hw_atl_b0_hw_offload_set,
|
.hw_set_offload = hw_atl_b0_hw_offload_set,
|
||||||
|
.hw_set_loopback = hw_atl_b0_set_loopback,
|
||||||
.hw_set_fc = hw_atl_b0_set_fc,
|
.hw_set_fc = hw_atl_b0_set_fc,
|
||||||
};
|
};
|
||||||
|
|
|
@ -427,6 +427,28 @@ static u32 aq_a2_fw_get_flow_control(struct aq_hw_s *self, u32 *fcmode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int aq_a2_fw_set_phyloopback(struct aq_hw_s *self, u32 mode, bool enable)
|
||||||
|
{
|
||||||
|
struct link_options_s link_options;
|
||||||
|
|
||||||
|
hw_atl2_shared_buffer_get(self, link_options, link_options);
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case AQ_HW_LOOPBACK_PHYINT_SYS:
|
||||||
|
link_options.internal_loopback = enable;
|
||||||
|
break;
|
||||||
|
case AQ_HW_LOOPBACK_PHYEXT_SYS:
|
||||||
|
link_options.external_loopback = enable;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hw_atl2_shared_buffer_write(self, link_options, link_options);
|
||||||
|
|
||||||
|
return hw_atl2_shared_buffer_finish_ack(self);
|
||||||
|
}
|
||||||
|
|
||||||
u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self)
|
u32 hw_atl2_utils_get_fw_version(struct aq_hw_s *self)
|
||||||
{
|
{
|
||||||
struct version_s version;
|
struct version_s version;
|
||||||
|
@ -468,4 +490,5 @@ const struct aq_fw_ops aq_a2_fw_ops = {
|
||||||
.get_eee_rate = aq_a2_fw_get_eee_rate,
|
.get_eee_rate = aq_a2_fw_get_eee_rate,
|
||||||
.set_flow_control = aq_a2_fw_set_flow_control,
|
.set_flow_control = aq_a2_fw_set_flow_control,
|
||||||
.get_flow_control = aq_a2_fw_get_flow_control,
|
.get_flow_control = aq_a2_fw_get_flow_control,
|
||||||
|
.set_phyloopback = aq_a2_fw_set_phyloopback,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue
Block a user