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

Merge branch 'hns3-misc-fixes'

Salil Mehta says:

====================
Misc bug fixes for HNS3 Ethernet Driver

Fixes to some of the bugs found during system test, internal review
and clean-up
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents bfcbcb67 e4d68dae
...@@ -273,10 +273,6 @@ struct hnae3_ae_dev { ...@@ -273,10 +273,6 @@ struct hnae3_ae_dev {
* Map rings to vector * Map rings to vector
* unmap_ring_from_vector() * unmap_ring_from_vector()
* Unmap rings from vector * Unmap rings from vector
* add_tunnel_udp()
* Add tunnel information to hardware
* del_tunnel_udp()
* Delete tunnel information from hardware
* reset_queue() * reset_queue()
* Reset queue * Reset queue
* get_fw_version() * get_fw_version()
...@@ -388,9 +384,6 @@ struct hnae3_ae_ops { ...@@ -388,9 +384,6 @@ struct hnae3_ae_ops {
int vector_num, int vector_num,
struct hnae3_ring_chain_node *vr_chain); struct hnae3_ring_chain_node *vr_chain);
int (*add_tunnel_udp)(struct hnae3_handle *handle, u16 port_num);
int (*del_tunnel_udp)(struct hnae3_handle *handle, u16 port_num);
void (*reset_queue)(struct hnae3_handle *handle, u16 queue_id); void (*reset_queue)(struct hnae3_handle *handle, u16 queue_id);
u32 (*get_fw_version)(struct hnae3_handle *handle); u32 (*get_fw_version)(struct hnae3_handle *handle);
void (*get_mdix_mode)(struct hnae3_handle *handle, void (*get_mdix_mode)(struct hnae3_handle *handle,
......
...@@ -1244,93 +1244,6 @@ static void hns3_nic_get_stats64(struct net_device *netdev, ...@@ -1244,93 +1244,6 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
stats->tx_compressed = netdev->stats.tx_compressed; stats->tx_compressed = netdev->stats.tx_compressed;
} }
static void hns3_add_tunnel_port(struct net_device *netdev, u16 port,
enum hns3_udp_tnl_type type)
{
struct hns3_nic_priv *priv = netdev_priv(netdev);
struct hns3_udp_tunnel *udp_tnl = &priv->udp_tnl[type];
struct hnae3_handle *h = priv->ae_handle;
if (udp_tnl->used && udp_tnl->dst_port == port) {
udp_tnl->used++;
return;
}
if (udp_tnl->used) {
netdev_warn(netdev,
"UDP tunnel [%d], port [%d] offload\n", type, port);
return;
}
udp_tnl->dst_port = port;
udp_tnl->used = 1;
/* TBD send command to hardware to add port */
if (h->ae_algo->ops->add_tunnel_udp)
h->ae_algo->ops->add_tunnel_udp(h, port);
}
static void hns3_del_tunnel_port(struct net_device *netdev, u16 port,
enum hns3_udp_tnl_type type)
{
struct hns3_nic_priv *priv = netdev_priv(netdev);
struct hns3_udp_tunnel *udp_tnl = &priv->udp_tnl[type];
struct hnae3_handle *h = priv->ae_handle;
if (!udp_tnl->used || udp_tnl->dst_port != port) {
netdev_warn(netdev,
"Invalid UDP tunnel port %d\n", port);
return;
}
udp_tnl->used--;
if (udp_tnl->used)
return;
udp_tnl->dst_port = 0;
/* TBD send command to hardware to del port */
if (h->ae_algo->ops->del_tunnel_udp)
h->ae_algo->ops->del_tunnel_udp(h, port);
}
/* hns3_nic_udp_tunnel_add - Get notifiacetion about UDP tunnel ports
* @netdev: This physical ports's netdev
* @ti: Tunnel information
*/
static void hns3_nic_udp_tunnel_add(struct net_device *netdev,
struct udp_tunnel_info *ti)
{
u16 port_n = ntohs(ti->port);
switch (ti->type) {
case UDP_TUNNEL_TYPE_VXLAN:
hns3_add_tunnel_port(netdev, port_n, HNS3_UDP_TNL_VXLAN);
break;
case UDP_TUNNEL_TYPE_GENEVE:
hns3_add_tunnel_port(netdev, port_n, HNS3_UDP_TNL_GENEVE);
break;
default:
netdev_err(netdev, "unsupported tunnel type %d\n", ti->type);
break;
}
}
static void hns3_nic_udp_tunnel_del(struct net_device *netdev,
struct udp_tunnel_info *ti)
{
u16 port_n = ntohs(ti->port);
switch (ti->type) {
case UDP_TUNNEL_TYPE_VXLAN:
hns3_del_tunnel_port(netdev, port_n, HNS3_UDP_TNL_VXLAN);
break;
case UDP_TUNNEL_TYPE_GENEVE:
hns3_del_tunnel_port(netdev, port_n, HNS3_UDP_TNL_GENEVE);
break;
default:
break;
}
}
static int hns3_setup_tc(struct net_device *netdev, void *type_data) static int hns3_setup_tc(struct net_device *netdev, void *type_data)
{ {
struct tc_mqprio_qopt_offload *mqprio_qopt = type_data; struct tc_mqprio_qopt_offload *mqprio_qopt = type_data;
...@@ -1569,8 +1482,6 @@ static const struct net_device_ops hns3_nic_netdev_ops = { ...@@ -1569,8 +1482,6 @@ static const struct net_device_ops hns3_nic_netdev_ops = {
.ndo_get_stats64 = hns3_nic_get_stats64, .ndo_get_stats64 = hns3_nic_get_stats64,
.ndo_setup_tc = hns3_nic_setup_tc, .ndo_setup_tc = hns3_nic_setup_tc,
.ndo_set_rx_mode = hns3_nic_set_rx_mode, .ndo_set_rx_mode = hns3_nic_set_rx_mode,
.ndo_udp_tunnel_add = hns3_nic_udp_tunnel_add,
.ndo_udp_tunnel_del = hns3_nic_udp_tunnel_del,
.ndo_vlan_rx_add_vid = hns3_vlan_rx_add_vid, .ndo_vlan_rx_add_vid = hns3_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid = hns3_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = hns3_vlan_rx_kill_vid,
.ndo_set_vf_vlan = hns3_ndo_set_vf_vlan, .ndo_set_vf_vlan = hns3_ndo_set_vf_vlan,
...@@ -3046,13 +2957,13 @@ int hns3_uninit_all_ring(struct hns3_nic_priv *priv) ...@@ -3046,13 +2957,13 @@ int hns3_uninit_all_ring(struct hns3_nic_priv *priv)
} }
/* Set mac addr if it is configured. or leave it to the AE driver */ /* Set mac addr if it is configured. or leave it to the AE driver */
static void hns3_init_mac_addr(struct net_device *netdev) static void hns3_init_mac_addr(struct net_device *netdev, bool init)
{ {
struct hns3_nic_priv *priv = netdev_priv(netdev); struct hns3_nic_priv *priv = netdev_priv(netdev);
struct hnae3_handle *h = priv->ae_handle; struct hnae3_handle *h = priv->ae_handle;
u8 mac_addr_temp[ETH_ALEN]; u8 mac_addr_temp[ETH_ALEN];
if (h->ae_algo->ops->get_mac_addr) { if (h->ae_algo->ops->get_mac_addr && init) {
h->ae_algo->ops->get_mac_addr(h, mac_addr_temp); h->ae_algo->ops->get_mac_addr(h, mac_addr_temp);
ether_addr_copy(netdev->dev_addr, mac_addr_temp); ether_addr_copy(netdev->dev_addr, mac_addr_temp);
} }
...@@ -3106,7 +3017,7 @@ static int hns3_client_init(struct hnae3_handle *handle) ...@@ -3106,7 +3017,7 @@ static int hns3_client_init(struct hnae3_handle *handle)
handle->kinfo.netdev = netdev; handle->kinfo.netdev = netdev;
handle->priv = (void *)priv; handle->priv = (void *)priv;
hns3_init_mac_addr(netdev); hns3_init_mac_addr(netdev, true);
hns3_set_default_feature(netdev); hns3_set_default_feature(netdev);
...@@ -3292,9 +3203,35 @@ static void hns3_recover_hw_addr(struct net_device *ndev) ...@@ -3292,9 +3203,35 @@ static void hns3_recover_hw_addr(struct net_device *ndev)
hns3_nic_mc_sync(ndev, ha->addr); hns3_nic_mc_sync(ndev, ha->addr);
} }
static void hns3_drop_skb_data(struct hns3_enet_ring *ring, struct sk_buff *skb) static void hns3_clear_tx_ring(struct hns3_enet_ring *ring)
{ {
dev_kfree_skb_any(skb); if (!HNAE3_IS_TX_RING(ring))
return;
while (ring->next_to_clean != ring->next_to_use) {
hns3_free_buffer_detach(ring, ring->next_to_clean);
ring_ptr_move_fw(ring, next_to_clean);
}
}
static void hns3_clear_rx_ring(struct hns3_enet_ring *ring)
{
if (HNAE3_IS_TX_RING(ring))
return;
while (ring->next_to_use != ring->next_to_clean) {
/* When a buffer is not reused, it's memory has been
* freed in hns3_handle_rx_bd or will be freed by
* stack, so only need to unmap the buffer here.
*/
if (!ring->desc_cb[ring->next_to_use].reuse_flag) {
hns3_unmap_buffer(ring,
&ring->desc_cb[ring->next_to_use]);
ring->desc_cb[ring->next_to_use].dma = 0;
}
ring_ptr_move_fw(ring, next_to_use);
}
} }
static void hns3_clear_all_ring(struct hnae3_handle *h) static void hns3_clear_all_ring(struct hnae3_handle *h)
...@@ -3308,13 +3245,13 @@ static void hns3_clear_all_ring(struct hnae3_handle *h) ...@@ -3308,13 +3245,13 @@ static void hns3_clear_all_ring(struct hnae3_handle *h)
struct hns3_enet_ring *ring; struct hns3_enet_ring *ring;
ring = priv->ring_data[i].ring; ring = priv->ring_data[i].ring;
hns3_clean_tx_ring(ring, ring->desc_num); hns3_clear_tx_ring(ring);
dev_queue = netdev_get_tx_queue(ndev, dev_queue = netdev_get_tx_queue(ndev,
priv->ring_data[i].queue_index); priv->ring_data[i].queue_index);
netdev_tx_reset_queue(dev_queue); netdev_tx_reset_queue(dev_queue);
ring = priv->ring_data[i + h->kinfo.num_tqps].ring; ring = priv->ring_data[i + h->kinfo.num_tqps].ring;
hns3_clean_rx_ring(ring, ring->desc_num, hns3_drop_skb_data); hns3_clear_rx_ring(ring);
} }
} }
...@@ -3353,7 +3290,7 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle) ...@@ -3353,7 +3290,7 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
struct hns3_nic_priv *priv = netdev_priv(netdev); struct hns3_nic_priv *priv = netdev_priv(netdev);
int ret; int ret;
hns3_init_mac_addr(netdev); hns3_init_mac_addr(netdev, false);
hns3_nic_set_rx_mode(netdev); hns3_nic_set_rx_mode(netdev);
hns3_recover_hw_addr(netdev); hns3_recover_hw_addr(netdev);
......
...@@ -74,7 +74,7 @@ struct hns3_link_mode_mapping { ...@@ -74,7 +74,7 @@ struct hns3_link_mode_mapping {
u32 ethtool_link_mode; u32 ethtool_link_mode;
}; };
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
{ {
struct hnae3_handle *h = hns3_get_handle(ndev); struct hnae3_handle *h = hns3_get_handle(ndev);
int ret; int ret;
...@@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) ...@@ -85,11 +85,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
switch (loop) { switch (loop) {
case HNAE3_MAC_INTER_LOOP_MAC: case HNAE3_MAC_INTER_LOOP_MAC:
ret = h->ae_algo->ops->set_loopback(h, loop, true); ret = h->ae_algo->ops->set_loopback(h, loop, en);
break;
case HNAE3_MAC_LOOP_NONE:
ret = h->ae_algo->ops->set_loopback(h,
HNAE3_MAC_INTER_LOOP_MAC, false);
break; break;
default: default:
ret = -ENOTSUPP; ret = -ENOTSUPP;
...@@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop) ...@@ -99,10 +95,7 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop)
if (ret) if (ret)
return ret; return ret;
if (loop == HNAE3_MAC_LOOP_NONE) h->ae_algo->ops->set_promisc_mode(h, en);
h->ae_algo->ops->set_promisc_mode(h, ndev->flags & IFF_PROMISC);
else
h->ae_algo->ops->set_promisc_mode(h, 1);
return ret; return ret;
} }
...@@ -122,13 +115,13 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode) ...@@ -122,13 +115,13 @@ static int hns3_lp_up(struct net_device *ndev, enum hnae3_loop loop_mode)
return ret; return ret;
} }
ret = hns3_lp_setup(ndev, loop_mode); ret = hns3_lp_setup(ndev, loop_mode, true);
usleep_range(10000, 20000); usleep_range(10000, 20000);
return ret; return ret;
} }
static int hns3_lp_down(struct net_device *ndev) static int hns3_lp_down(struct net_device *ndev, enum hnae3_loop loop_mode)
{ {
struct hnae3_handle *h = hns3_get_handle(ndev); struct hnae3_handle *h = hns3_get_handle(ndev);
int ret; int ret;
...@@ -136,7 +129,7 @@ static int hns3_lp_down(struct net_device *ndev) ...@@ -136,7 +129,7 @@ static int hns3_lp_down(struct net_device *ndev)
if (!h->ae_algo->ops->stop) if (!h->ae_algo->ops->stop)
return -EOPNOTSUPP; return -EOPNOTSUPP;
ret = hns3_lp_setup(ndev, HNAE3_MAC_LOOP_NONE); ret = hns3_lp_setup(ndev, loop_mode, false);
if (ret) { if (ret) {
netdev_err(ndev, "lb_setup return error: %d\n", ret); netdev_err(ndev, "lb_setup return error: %d\n", ret);
return ret; return ret;
...@@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -332,7 +325,7 @@ static void hns3_self_test(struct net_device *ndev,
data[test_index] = hns3_lp_up(ndev, loop_type); data[test_index] = hns3_lp_up(ndev, loop_type);
if (!data[test_index]) { if (!data[test_index]) {
data[test_index] = hns3_lp_run_test(ndev, loop_type); data[test_index] = hns3_lp_run_test(ndev, loop_type);
hns3_lp_down(ndev); hns3_lp_down(ndev, loop_type);
} }
if (data[test_index]) if (data[test_index])
......
...@@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable) ...@@ -3682,48 +3682,50 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
"mac enable fail, ret =%d.\n", ret); "mac enable fail, ret =%d.\n", ret);
} }
static int hclge_set_loopback(struct hnae3_handle *handle, static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
enum hnae3_loop loop_mode, bool en)
{ {
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_config_mac_mode_cmd *req; struct hclge_config_mac_mode_cmd *req;
struct hclge_dev *hdev = vport->back;
struct hclge_desc desc; struct hclge_desc desc;
u32 loop_en; u32 loop_en;
int ret; int ret;
switch (loop_mode) { req = (struct hclge_config_mac_mode_cmd *)&desc.data[0];
case HNAE3_MAC_INTER_LOOP_MAC: /* 1 Read out the MAC mode config at first */
req = (struct hclge_config_mac_mode_cmd *)&desc.data[0]; hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CONFIG_MAC_MODE, true);
/* 1 Read out the MAC mode config at first */ ret = hclge_cmd_send(&hdev->hw, &desc, 1);
hclge_cmd_setup_basic_desc(&desc, if (ret) {
HCLGE_OPC_CONFIG_MAC_MODE, dev_err(&hdev->pdev->dev,
true); "mac loopback get fail, ret =%d.\n", ret);
ret = hclge_cmd_send(&hdev->hw, &desc, 1); return ret;
if (ret) { }
dev_err(&hdev->pdev->dev,
"mac loopback get fail, ret =%d.\n",
ret);
return ret;
}
/* 2 Then setup the loopback flag */ /* 2 Then setup the loopback flag */
loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en); loop_en = le32_to_cpu(req->txrx_pad_fcs_loop_en);
if (en) hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, en ? 1 : 0);
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 1);
else
hnae_set_bit(loop_en, HCLGE_MAC_APP_LP_B, 0);
req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en); req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en);
/* 3 Config mac work mode with loopback flag /* 3 Config mac work mode with loopback flag
* and its original configure parameters * and its original configure parameters
*/ */
hclge_cmd_reuse_desc(&desc, false); hclge_cmd_reuse_desc(&desc, false);
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
if (ret) if (ret)
dev_err(&hdev->pdev->dev, dev_err(&hdev->pdev->dev,
"mac loopback set fail, ret =%d.\n", ret); "mac loopback set fail, ret =%d.\n", ret);
return ret;
}
static int hclge_set_loopback(struct hnae3_handle *handle,
enum hnae3_loop loop_mode, bool en)
{
struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back;
int ret;
switch (loop_mode) {
case HNAE3_MAC_INTER_LOOP_MAC:
ret = hclge_set_mac_loopback(hdev, en);
break; break;
default: default:
ret = -ENOTSUPP; ret = -ENOTSUPP;
......
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