Commit 4605168f authored by David S. Miller's avatar David S. Miller

Merge branch 'hns3-next'

Salil Mehta says:

====================
Cleanups, minor additions & fixes for HNS3 driver

This patch-set contains cleans-ups, minor changes and fixes to the HNS3 driver.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d2f1e81a e4fd7502
...@@ -84,10 +84,11 @@ struct hnae3_queue { ...@@ -84,10 +84,11 @@ struct hnae3_queue {
/*hnae3 loop mode*/ /*hnae3 loop mode*/
enum hnae3_loop { enum hnae3_loop {
HNAE3_MAC_INTER_LOOP_MAC, HNAE3_LOOP_APP,
HNAE3_MAC_INTER_LOOP_SERDES, HNAE3_LOOP_SERIAL_SERDES,
HNAE3_MAC_INTER_LOOP_PHY, HNAE3_LOOP_PARALLEL_SERDES,
HNAE3_MAC_LOOP_NONE, HNAE3_LOOP_PHY,
HNAE3_LOOP_NONE,
}; };
enum hnae3_client_type { enum hnae3_client_type {
...@@ -402,7 +403,7 @@ struct hnae3_ae_ops { ...@@ -402,7 +403,7 @@ struct hnae3_ae_ops {
void (*get_channels)(struct hnae3_handle *handle, void (*get_channels)(struct hnae3_handle *handle,
struct ethtool_channels *ch); struct ethtool_channels *ch);
void (*get_tqps_and_rss_info)(struct hnae3_handle *h, void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
u16 *free_tqps, u16 *max_rss_size); u16 *alloc_tqps, u16 *max_rss_size);
int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num); int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num);
void (*get_flowctrl_adv)(struct hnae3_handle *handle, void (*get_flowctrl_adv)(struct hnae3_handle *handle,
u32 *flowctrl_adv); u32 *flowctrl_adv);
...@@ -478,10 +479,11 @@ struct hnae3_unic_private_info { ...@@ -478,10 +479,11 @@ struct hnae3_unic_private_info {
struct hnae3_queue **tqp; /* array base of all TQPs of this instance */ struct hnae3_queue **tqp; /* array base of all TQPs of this instance */
}; };
#define HNAE3_SUPPORT_MAC_LOOPBACK BIT(0) #define HNAE3_SUPPORT_APP_LOOPBACK BIT(0)
#define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1) #define HNAE3_SUPPORT_PHY_LOOPBACK BIT(1)
#define HNAE3_SUPPORT_SERDES_LOOPBACK BIT(2) #define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2)
#define HNAE3_SUPPORT_VF BIT(3) #define HNAE3_SUPPORT_VF BIT(3)
#define HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK BIT(4)
struct hnae3_handle { struct hnae3_handle {
struct hnae3_client *client; struct hnae3_client *client;
......
...@@ -225,8 +225,6 @@ void hns3_set_vector_coalesce_tx_gl(struct hns3_enet_tqp_vector *tqp_vector, ...@@ -225,8 +225,6 @@ void hns3_set_vector_coalesce_tx_gl(struct hns3_enet_tqp_vector *tqp_vector,
static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector, static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector,
struct hns3_nic_priv *priv) struct hns3_nic_priv *priv)
{ {
struct hnae3_handle *h = priv->ae_handle;
/* initialize the configuration for interrupt coalescing. /* initialize the configuration for interrupt coalescing.
* 1. GL (Interrupt Gap Limiter) * 1. GL (Interrupt Gap Limiter)
* 2. RL (Interrupt Rate Limiter) * 2. RL (Interrupt Rate Limiter)
...@@ -239,9 +237,6 @@ static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector, ...@@ -239,9 +237,6 @@ static void hns3_vector_gl_rl_init(struct hns3_enet_tqp_vector *tqp_vector,
tqp_vector->tx_group.coal.int_gl = HNS3_INT_GL_50K; tqp_vector->tx_group.coal.int_gl = HNS3_INT_GL_50K;
tqp_vector->rx_group.coal.int_gl = HNS3_INT_GL_50K; tqp_vector->rx_group.coal.int_gl = HNS3_INT_GL_50K;
/* Default: disable RL */
h->kinfo.int_rl_setting = 0;
tqp_vector->int_adapt_down = HNS3_INT_ADAPT_DOWN_START; tqp_vector->int_adapt_down = HNS3_INT_ADAPT_DOWN_START;
tqp_vector->rx_group.coal.flow_level = HNS3_FLOW_LOW; tqp_vector->rx_group.coal.flow_level = HNS3_FLOW_LOW;
tqp_vector->tx_group.coal.flow_level = HNS3_FLOW_LOW; tqp_vector->tx_group.coal.flow_level = HNS3_FLOW_LOW;
...@@ -307,12 +302,12 @@ static int hns3_nic_set_real_num_queue(struct net_device *netdev) ...@@ -307,12 +302,12 @@ static int hns3_nic_set_real_num_queue(struct net_device *netdev)
static u16 hns3_get_max_available_channels(struct hnae3_handle *h) static u16 hns3_get_max_available_channels(struct hnae3_handle *h)
{ {
u16 free_tqps, max_rss_size, max_tqps; u16 alloc_tqps, max_rss_size, rss_size;
h->ae_algo->ops->get_tqps_and_rss_info(h, &free_tqps, &max_rss_size); h->ae_algo->ops->get_tqps_and_rss_info(h, &alloc_tqps, &max_rss_size);
max_tqps = h->kinfo.num_tc * max_rss_size; rss_size = alloc_tqps / h->kinfo.num_tc;
return min_t(u16, max_tqps, (free_tqps + h->kinfo.num_tqps)); return min_t(u16, rss_size, max_rss_size);
} }
static int hns3_nic_net_up(struct net_device *netdev) static int hns3_nic_net_up(struct net_device *netdev)
...@@ -1491,13 +1486,11 @@ static int hns3_nic_change_mtu(struct net_device *netdev, int new_mtu) ...@@ -1491,13 +1486,11 @@ static int hns3_nic_change_mtu(struct net_device *netdev, int new_mtu)
} }
ret = h->ae_algo->ops->set_mtu(h, new_mtu); ret = h->ae_algo->ops->set_mtu(h, new_mtu);
if (ret) { if (ret)
netdev_err(netdev, "failed to change MTU in hardware %d\n", netdev_err(netdev, "failed to change MTU in hardware %d\n",
ret); ret);
return ret; else
} netdev->mtu = new_mtu;
netdev->mtu = new_mtu;
/* if the netdev was running earlier, bring it up again */ /* if the netdev was running earlier, bring it up again */
if (if_running && hns3_nic_net_open(netdev)) if (if_running && hns3_nic_net_open(netdev))
...@@ -1740,7 +1733,7 @@ static void hns3_set_default_feature(struct net_device *netdev) ...@@ -1740,7 +1733,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID; netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID;
...@@ -1752,21 +1745,21 @@ static void hns3_set_default_feature(struct net_device *netdev) ...@@ -1752,21 +1745,21 @@ static void hns3_set_default_feature(struct net_device *netdev)
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
netdev->vlan_features |= netdev->vlan_features |=
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO | NETIF_F_SG | NETIF_F_GSO | NETIF_F_GRO |
NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | netdev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_UDP_TUNNEL |
NETIF_F_GSO_UDP_TUNNEL_CSUM; NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
if (pdev->revision != 0x20) if (pdev->revision != 0x20)
netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER; netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
...@@ -3166,12 +3159,14 @@ static void hns3_nic_set_priv_ops(struct net_device *netdev) ...@@ -3166,12 +3159,14 @@ static void hns3_nic_set_priv_ops(struct net_device *netdev)
static int hns3_client_init(struct hnae3_handle *handle) static int hns3_client_init(struct hnae3_handle *handle)
{ {
struct pci_dev *pdev = handle->pdev; struct pci_dev *pdev = handle->pdev;
u16 alloc_tqps, max_rss_size;
struct hns3_nic_priv *priv; struct hns3_nic_priv *priv;
struct net_device *netdev; struct net_device *netdev;
int ret; int ret;
netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv), handle->ae_algo->ops->get_tqps_and_rss_info(handle, &alloc_tqps,
hns3_get_max_available_channels(handle)); &max_rss_size);
netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv), alloc_tqps);
if (!netdev) if (!netdev)
return -ENOMEM; return -ENOMEM;
...@@ -3490,6 +3485,31 @@ int hns3_nic_reset_all_ring(struct hnae3_handle *h) ...@@ -3490,6 +3485,31 @@ int hns3_nic_reset_all_ring(struct hnae3_handle *h)
return 0; return 0;
} }
static void hns3_store_coal(struct hns3_nic_priv *priv)
{
/* ethtool only support setting and querying one coal
* configuation for now, so save the vector 0' coal
* configuation here in order to restore it.
*/
memcpy(&priv->tx_coal, &priv->tqp_vector[0].tx_group.coal,
sizeof(struct hns3_enet_coalesce));
memcpy(&priv->rx_coal, &priv->tqp_vector[0].rx_group.coal,
sizeof(struct hns3_enet_coalesce));
}
static void hns3_restore_coal(struct hns3_nic_priv *priv)
{
u16 vector_num = priv->vector_num;
int i;
for (i = 0; i < vector_num; i++) {
memcpy(&priv->tqp_vector[i].tx_group.coal, &priv->tx_coal,
sizeof(struct hns3_enet_coalesce));
memcpy(&priv->tqp_vector[i].rx_group.coal, &priv->rx_coal,
sizeof(struct hns3_enet_coalesce));
}
}
static int hns3_reset_notify_down_enet(struct hnae3_handle *handle) static int hns3_reset_notify_down_enet(struct hnae3_handle *handle)
{ {
struct hnae3_knic_private_info *kinfo = &handle->kinfo; struct hnae3_knic_private_info *kinfo = &handle->kinfo;
...@@ -3536,6 +3556,8 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle) ...@@ -3536,6 +3556,8 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
/* Carrier off reporting is important to ethtool even BEFORE open */ /* Carrier off reporting is important to ethtool even BEFORE open */
netif_carrier_off(netdev); netif_carrier_off(netdev);
hns3_restore_coal(priv);
ret = hns3_nic_init_vector_data(priv); ret = hns3_nic_init_vector_data(priv);
if (ret) if (ret)
return ret; return ret;
...@@ -3563,6 +3585,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) ...@@ -3563,6 +3585,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
return ret; return ret;
} }
hns3_store_coal(priv);
ret = hns3_uninit_all_ring(priv); ret = hns3_uninit_all_ring(priv);
if (ret) if (ret)
netdev_err(netdev, "uninit ring error\n"); netdev_err(netdev, "uninit ring error\n");
...@@ -3597,24 +3621,7 @@ static int hns3_reset_notify(struct hnae3_handle *handle, ...@@ -3597,24 +3621,7 @@ static int hns3_reset_notify(struct hnae3_handle *handle,
return ret; return ret;
} }
static void hns3_restore_coal(struct hns3_nic_priv *priv, static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
struct hns3_enet_coalesce *tx,
struct hns3_enet_coalesce *rx)
{
u16 vector_num = priv->vector_num;
int i;
for (i = 0; i < vector_num; i++) {
memcpy(&priv->tqp_vector[i].tx_group.coal, tx,
sizeof(struct hns3_enet_coalesce));
memcpy(&priv->tqp_vector[i].rx_group.coal, rx,
sizeof(struct hns3_enet_coalesce));
}
}
static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num,
struct hns3_enet_coalesce *tx,
struct hns3_enet_coalesce *rx)
{ {
struct hns3_nic_priv *priv = netdev_priv(netdev); struct hns3_nic_priv *priv = netdev_priv(netdev);
struct hnae3_handle *h = hns3_get_handle(netdev); struct hnae3_handle *h = hns3_get_handle(netdev);
...@@ -3632,7 +3639,7 @@ static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num, ...@@ -3632,7 +3639,7 @@ static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num,
if (ret) if (ret)
goto err_alloc_vector; goto err_alloc_vector;
hns3_restore_coal(priv, tx, rx); hns3_restore_coal(priv);
ret = hns3_nic_init_vector_data(priv); ret = hns3_nic_init_vector_data(priv);
if (ret) if (ret)
...@@ -3664,7 +3671,6 @@ int hns3_set_channels(struct net_device *netdev, ...@@ -3664,7 +3671,6 @@ int hns3_set_channels(struct net_device *netdev,
struct hns3_nic_priv *priv = netdev_priv(netdev); struct hns3_nic_priv *priv = netdev_priv(netdev);
struct hnae3_handle *h = hns3_get_handle(netdev); struct hnae3_handle *h = hns3_get_handle(netdev);
struct hnae3_knic_private_info *kinfo = &h->kinfo; struct hnae3_knic_private_info *kinfo = &h->kinfo;
struct hns3_enet_coalesce tx_coal, rx_coal;
bool if_running = netif_running(netdev); bool if_running = netif_running(netdev);
u32 new_tqp_num = ch->combined_count; u32 new_tqp_num = ch->combined_count;
u16 org_tqp_num; u16 org_tqp_num;
...@@ -3696,15 +3702,7 @@ int hns3_set_channels(struct net_device *netdev, ...@@ -3696,15 +3702,7 @@ int hns3_set_channels(struct net_device *netdev,
goto open_netdev; goto open_netdev;
} }
/* Changing the tqp num may also change the vector num, hns3_store_coal(priv);
* ethtool only support setting and querying one coal
* configuation for now, so save the vector 0' coal
* configuation here in order to restore it.
*/
memcpy(&tx_coal, &priv->tqp_vector[0].tx_group.coal,
sizeof(struct hns3_enet_coalesce));
memcpy(&rx_coal, &priv->tqp_vector[0].rx_group.coal,
sizeof(struct hns3_enet_coalesce));
hns3_nic_dealloc_vector_data(priv); hns3_nic_dealloc_vector_data(priv);
...@@ -3712,10 +3710,9 @@ int hns3_set_channels(struct net_device *netdev, ...@@ -3712,10 +3710,9 @@ int hns3_set_channels(struct net_device *netdev,
hns3_put_ring_config(priv); hns3_put_ring_config(priv);
org_tqp_num = h->kinfo.num_tqps; org_tqp_num = h->kinfo.num_tqps;
ret = hns3_modify_tqp_num(netdev, new_tqp_num, &tx_coal, &rx_coal); ret = hns3_modify_tqp_num(netdev, new_tqp_num);
if (ret) { if (ret) {
ret = hns3_modify_tqp_num(netdev, org_tqp_num, ret = hns3_modify_tqp_num(netdev, org_tqp_num);
&tx_coal, &rx_coal);
if (ret) { if (ret) {
/* If revert to old tqp failed, fatal error occurred */ /* If revert to old tqp failed, fatal error occurred */
dev_err(&netdev->dev, dev_err(&netdev->dev,
......
...@@ -543,6 +543,8 @@ struct hns3_nic_priv { ...@@ -543,6 +543,8 @@ struct hns3_nic_priv {
/* Vxlan/Geneve information */ /* Vxlan/Geneve information */
struct hns3_udp_tunnel udp_tnl[HNS3_UDP_TNL_MAX]; struct hns3_udp_tunnel udp_tnl[HNS3_UDP_TNL_MAX];
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
struct hns3_enet_coalesce tx_coal;
struct hns3_enet_coalesce rx_coal;
}; };
union l3_hdr_info { union l3_hdr_info {
......
...@@ -53,7 +53,7 @@ static const struct hns3_stats hns3_rxq_stats[] = { ...@@ -53,7 +53,7 @@ static const struct hns3_stats hns3_rxq_stats[] = {
#define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT) #define HNS3_TQP_STATS_COUNT (HNS3_TXQ_STATS_COUNT + HNS3_RXQ_STATS_COUNT)
#define HNS3_SELF_TEST_TYPE_NUM 2 #define HNS3_SELF_TEST_TPYE_NUM 3
#define HNS3_NIC_LB_TEST_PKT_NUM 1 #define HNS3_NIC_LB_TEST_PKT_NUM 1
#define HNS3_NIC_LB_TEST_RING_ID 0 #define HNS3_NIC_LB_TEST_RING_ID 0
#define HNS3_NIC_LB_TEST_PACKET_SIZE 128 #define HNS3_NIC_LB_TEST_PACKET_SIZE 128
...@@ -78,8 +78,9 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en) ...@@ -78,8 +78,9 @@ static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
return -EOPNOTSUPP; return -EOPNOTSUPP;
switch (loop) { switch (loop) {
case HNAE3_MAC_INTER_LOOP_SERDES: case HNAE3_LOOP_SERIAL_SERDES:
case HNAE3_MAC_INTER_LOOP_MAC: case HNAE3_LOOP_PARALLEL_SERDES:
case HNAE3_LOOP_APP:
ret = h->ae_algo->ops->set_loopback(h, loop, en); ret = h->ae_algo->ops->set_loopback(h, loop, en);
break; break;
default: default:
...@@ -286,13 +287,18 @@ static void hns3_self_test(struct net_device *ndev, ...@@ -286,13 +287,18 @@ static void hns3_self_test(struct net_device *ndev,
if (eth_test->flags != ETH_TEST_FL_OFFLINE) if (eth_test->flags != ETH_TEST_FL_OFFLINE)
return; return;
st_param[HNAE3_MAC_INTER_LOOP_MAC][0] = HNAE3_MAC_INTER_LOOP_MAC; st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
st_param[HNAE3_MAC_INTER_LOOP_MAC][1] = st_param[HNAE3_LOOP_APP][1] =
h->flags & HNAE3_SUPPORT_MAC_LOOPBACK; h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
st_param[HNAE3_MAC_INTER_LOOP_SERDES][0] = HNAE3_MAC_INTER_LOOP_SERDES; st_param[HNAE3_LOOP_SERIAL_SERDES][0] = HNAE3_LOOP_SERIAL_SERDES;
st_param[HNAE3_MAC_INTER_LOOP_SERDES][1] = st_param[HNAE3_LOOP_SERIAL_SERDES][1] =
h->flags & HNAE3_SUPPORT_SERDES_LOOPBACK; h->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
st_param[HNAE3_LOOP_PARALLEL_SERDES][0] =
HNAE3_LOOP_PARALLEL_SERDES;
st_param[HNAE3_LOOP_PARALLEL_SERDES][1] =
h->flags & HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
if (if_running) if (if_running)
ndev->netdev_ops->ndo_stop(ndev); ndev->netdev_ops->ndo_stop(ndev);
......
...@@ -778,6 +778,7 @@ struct hclge_reset_cmd { ...@@ -778,6 +778,7 @@ struct hclge_reset_cmd {
}; };
#define HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B BIT(0) #define HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B BIT(0)
#define HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B BIT(2)
#define HCLGE_CMD_SERDES_DONE_B BIT(0) #define HCLGE_CMD_SERDES_DONE_B BIT(0)
#define HCLGE_CMD_SERDES_SUCCESS_B BIT(1) #define HCLGE_CMD_SERDES_SUCCESS_B BIT(1)
struct hclge_serdes_lb_cmd { struct hclge_serdes_lb_cmd {
......
...@@ -184,7 +184,9 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets) ...@@ -184,7 +184,9 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets)
if (ret) if (ret)
return ret; return ret;
hclge_tm_schd_info_update(hdev, num_tc); ret = hclge_tm_schd_info_update(hdev, num_tc);
if (ret)
return ret;
ret = hclge_ieee_ets_to_tm_info(hdev, ets); ret = hclge_ieee_ets_to_tm_info(hdev, ets);
if (ret) if (ret)
...@@ -310,7 +312,9 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc) ...@@ -310,7 +312,9 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
return -EINVAL; return -EINVAL;
} }
hclge_tm_schd_info_update(hdev, tc); ret = hclge_tm_schd_info_update(hdev, tc);
if (ret)
return ret;
ret = hclge_tm_prio_tc_info_update(hdev, prio_tc); ret = hclge_tm_prio_tc_info_update(hdev, prio_tc);
if (ret) if (ret)
......
...@@ -49,8 +49,9 @@ static const struct pci_device_id ae_algo_pci_tbl[] = { ...@@ -49,8 +49,9 @@ static const struct pci_device_id ae_algo_pci_tbl[] = {
MODULE_DEVICE_TABLE(pci, ae_algo_pci_tbl); MODULE_DEVICE_TABLE(pci, ae_algo_pci_tbl);
static const char hns3_nic_test_strs[][ETH_GSTRING_LEN] = { static const char hns3_nic_test_strs[][ETH_GSTRING_LEN] = {
"Mac Loopback test", "App Loopback test",
"Serdes Loopback test", "Serdes serial Loopback test",
"Serdes parallel Loopback test",
"Phy Loopback test" "Phy Loopback test"
}; };
...@@ -475,7 +476,10 @@ static void hclge_update_stats(struct hnae3_handle *handle, ...@@ -475,7 +476,10 @@ static void hclge_update_stats(struct hnae3_handle *handle,
static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset) static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
{ {
#define HCLGE_LOOPBACK_TEST_FLAGS 0x7 #define HCLGE_LOOPBACK_TEST_FLAGS (HNAE3_SUPPORT_APP_LOOPBACK |\
HNAE3_SUPPORT_PHY_LOOPBACK |\
HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK |\
HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK)
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
...@@ -489,15 +493,17 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset) ...@@ -489,15 +493,17 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
if (stringset == ETH_SS_TEST) { if (stringset == ETH_SS_TEST) {
/* clear loopback bit flags at first */ /* clear loopback bit flags at first */
handle->flags = (handle->flags & (~HCLGE_LOOPBACK_TEST_FLAGS)); handle->flags = (handle->flags & (~HCLGE_LOOPBACK_TEST_FLAGS));
if (hdev->hw.mac.speed == HCLGE_MAC_SPEED_10M || if (hdev->pdev->revision >= HNAE3_REVISION_ID_21 ||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_10M ||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_100M || hdev->hw.mac.speed == HCLGE_MAC_SPEED_100M ||
hdev->hw.mac.speed == HCLGE_MAC_SPEED_1G) { hdev->hw.mac.speed == HCLGE_MAC_SPEED_1G) {
count += 1; count += 1;
handle->flags |= HNAE3_SUPPORT_MAC_LOOPBACK; handle->flags |= HNAE3_SUPPORT_APP_LOOPBACK;
} }
count++; count += 2;
handle->flags |= HNAE3_SUPPORT_SERDES_LOOPBACK; handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
handle->flags |= HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
} else if (stringset == ETH_SS_STATS) { } else if (stringset == ETH_SS_STATS) {
count = ARRAY_SIZE(g_mac_stats_string) + count = ARRAY_SIZE(g_mac_stats_string) +
hclge_tqps_get_sset_count(handle, stringset); hclge_tqps_get_sset_count(handle, stringset);
...@@ -521,21 +527,27 @@ static void hclge_get_strings(struct hnae3_handle *handle, ...@@ -521,21 +527,27 @@ static void hclge_get_strings(struct hnae3_handle *handle,
p); p);
p = hclge_tqps_get_strings(handle, p); p = hclge_tqps_get_strings(handle, p);
} else if (stringset == ETH_SS_TEST) { } else if (stringset == ETH_SS_TEST) {
if (handle->flags & HNAE3_SUPPORT_MAC_LOOPBACK) { if (handle->flags & HNAE3_SUPPORT_APP_LOOPBACK) {
memcpy(p, memcpy(p,
hns3_nic_test_strs[HNAE3_MAC_INTER_LOOP_MAC], hns3_nic_test_strs[HNAE3_LOOP_APP],
ETH_GSTRING_LEN); ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
if (handle->flags & HNAE3_SUPPORT_SERDES_LOOPBACK) { if (handle->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK) {
memcpy(p, memcpy(p,
hns3_nic_test_strs[HNAE3_MAC_INTER_LOOP_SERDES], hns3_nic_test_strs[HNAE3_LOOP_SERIAL_SERDES],
ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN;
}
if (handle->flags & HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK) {
memcpy(p,
hns3_nic_test_strs[HNAE3_LOOP_PARALLEL_SERDES],
ETH_GSTRING_LEN); ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
if (handle->flags & HNAE3_SUPPORT_PHY_LOOPBACK) { if (handle->flags & HNAE3_SUPPORT_PHY_LOOPBACK) {
memcpy(p, memcpy(p,
hns3_nic_test_strs[HNAE3_MAC_INTER_LOOP_PHY], hns3_nic_test_strs[HNAE3_LOOP_PHY],
ETH_GSTRING_LEN); ETH_GSTRING_LEN);
p += ETH_GSTRING_LEN; p += ETH_GSTRING_LEN;
} }
...@@ -1344,11 +1356,13 @@ static int hclge_tx_buffer_calc(struct hclge_dev *hdev, ...@@ -1344,11 +1356,13 @@ static int hclge_tx_buffer_calc(struct hclge_dev *hdev,
static int hclge_rx_buffer_calc(struct hclge_dev *hdev, static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
struct hclge_pkt_buf_alloc *buf_alloc) struct hclge_pkt_buf_alloc *buf_alloc)
{ {
u32 rx_all = hdev->pkt_buf_size; #define HCLGE_BUF_SIZE_UNIT 128
u32 rx_all = hdev->pkt_buf_size, aligned_mps;
int no_pfc_priv_num, pfc_priv_num; int no_pfc_priv_num, pfc_priv_num;
struct hclge_priv_buf *priv; struct hclge_priv_buf *priv;
int i; int i;
aligned_mps = round_up(hdev->mps, HCLGE_BUF_SIZE_UNIT);
rx_all -= hclge_get_tx_buff_alloced(buf_alloc); rx_all -= hclge_get_tx_buff_alloced(buf_alloc);
/* When DCB is not supported, rx private /* When DCB is not supported, rx private
...@@ -1367,13 +1381,13 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev, ...@@ -1367,13 +1381,13 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
if (hdev->hw_tc_map & BIT(i)) { if (hdev->hw_tc_map & BIT(i)) {
priv->enable = 1; priv->enable = 1;
if (hdev->tm_info.hw_pfc_map & BIT(i)) { if (hdev->tm_info.hw_pfc_map & BIT(i)) {
priv->wl.low = hdev->mps; priv->wl.low = aligned_mps;
priv->wl.high = priv->wl.low + hdev->mps; priv->wl.high = priv->wl.low + aligned_mps;
priv->buf_size = priv->wl.high + priv->buf_size = priv->wl.high +
HCLGE_DEFAULT_DV; HCLGE_DEFAULT_DV;
} else { } else {
priv->wl.low = 0; priv->wl.low = 0;
priv->wl.high = 2 * hdev->mps; priv->wl.high = 2 * aligned_mps;
priv->buf_size = priv->wl.high; priv->buf_size = priv->wl.high;
} }
} else { } else {
...@@ -1405,11 +1419,11 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev, ...@@ -1405,11 +1419,11 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
if (hdev->tm_info.hw_pfc_map & BIT(i)) { if (hdev->tm_info.hw_pfc_map & BIT(i)) {
priv->wl.low = 128; priv->wl.low = 128;
priv->wl.high = priv->wl.low + hdev->mps; priv->wl.high = priv->wl.low + aligned_mps;
priv->buf_size = priv->wl.high + HCLGE_DEFAULT_DV; priv->buf_size = priv->wl.high + HCLGE_DEFAULT_DV;
} else { } else {
priv->wl.low = 0; priv->wl.low = 0;
priv->wl.high = hdev->mps; priv->wl.high = aligned_mps;
priv->buf_size = priv->wl.high; priv->buf_size = priv->wl.high;
} }
} }
...@@ -3345,7 +3359,7 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable) ...@@ -3345,7 +3359,7 @@ 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_mac_loopback(struct hclge_dev *hdev, bool en) static int hclge_set_app_loopback(struct hclge_dev *hdev, bool en)
{ {
struct hclge_config_mac_mode_cmd *req; struct hclge_config_mac_mode_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
...@@ -3381,22 +3395,37 @@ static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en) ...@@ -3381,22 +3395,37 @@ static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
return ret; return ret;
} }
static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en) static int hclge_set_serdes_loopback(struct hclge_dev *hdev, bool en,
enum hnae3_loop loop_mode)
{ {
#define HCLGE_SERDES_RETRY_MS 10 #define HCLGE_SERDES_RETRY_MS 10
#define HCLGE_SERDES_RETRY_NUM 100 #define HCLGE_SERDES_RETRY_NUM 100
struct hclge_serdes_lb_cmd *req; struct hclge_serdes_lb_cmd *req;
struct hclge_desc desc; struct hclge_desc desc;
int ret, i = 0; int ret, i = 0;
u8 loop_mode_b;
req = (struct hclge_serdes_lb_cmd *)desc.data; req = (struct hclge_serdes_lb_cmd *)desc.data;
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK, false); hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_SERDES_LOOPBACK, false);
switch (loop_mode) {
case HNAE3_LOOP_SERIAL_SERDES:
loop_mode_b = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
break;
case HNAE3_LOOP_PARALLEL_SERDES:
loop_mode_b = HCLGE_CMD_SERDES_PARALLEL_INNER_LOOP_B;
break;
default:
dev_err(&hdev->pdev->dev,
"unsupported serdes loopback mode %d\n", loop_mode);
return -ENOTSUPP;
}
if (en) { if (en) {
req->enable = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B; req->enable = loop_mode_b;
req->mask = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B; req->mask = loop_mode_b;
} else { } else {
req->mask = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B; req->mask = loop_mode_b;
} }
ret = hclge_cmd_send(&hdev->hw, &desc, 1); ret = hclge_cmd_send(&hdev->hw, &desc, 1);
...@@ -3459,11 +3488,12 @@ static int hclge_set_loopback(struct hnae3_handle *handle, ...@@ -3459,11 +3488,12 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
int i, ret; int i, ret;
switch (loop_mode) { switch (loop_mode) {
case HNAE3_MAC_INTER_LOOP_MAC: case HNAE3_LOOP_APP:
ret = hclge_set_mac_loopback(hdev, en); ret = hclge_set_app_loopback(hdev, en);
break; break;
case HNAE3_MAC_INTER_LOOP_SERDES: case HNAE3_LOOP_SERIAL_SERDES:
ret = hclge_set_serdes_loopback(hdev, en); case HNAE3_LOOP_PARALLEL_SERDES:
ret = hclge_set_serdes_loopback(hdev, en, loop_mode);
break; break;
default: default:
ret = -ENOTSUPP; ret = -ENOTSUPP;
...@@ -5629,18 +5659,12 @@ static void hclge_get_channels(struct hnae3_handle *handle, ...@@ -5629,18 +5659,12 @@ static void hclge_get_channels(struct hnae3_handle *handle,
} }
static void hclge_get_tqps_and_rss_info(struct hnae3_handle *handle, static void hclge_get_tqps_and_rss_info(struct hnae3_handle *handle,
u16 *free_tqps, u16 *max_rss_size) u16 *alloc_tqps, u16 *max_rss_size)
{ {
struct hclge_vport *vport = hclge_get_vport(handle); struct hclge_vport *vport = hclge_get_vport(handle);
struct hclge_dev *hdev = vport->back; struct hclge_dev *hdev = vport->back;
u16 temp_tqps = 0;
int i;
for (i = 0; i < hdev->num_tqps; i++) { *alloc_tqps = vport->alloc_tqps;
if (!hdev->htqp[i].alloced)
temp_tqps++;
}
*free_tqps = temp_tqps;
*max_rss_size = hdev->rss_size_max; *max_rss_size = hdev->rss_size_max;
} }
......
...@@ -193,6 +193,7 @@ static int hclge_pause_param_cfg(struct hclge_dev *hdev, const u8 *addr, ...@@ -193,6 +193,7 @@ static int hclge_pause_param_cfg(struct hclge_dev *hdev, const u8 *addr,
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_MAC_PARA, false); hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_CFG_MAC_PARA, false);
ether_addr_copy(pause_param->mac_addr, addr); ether_addr_copy(pause_param->mac_addr, addr);
ether_addr_copy(pause_param->mac_addr_extra, addr);
pause_param->pause_trans_gap = pause_trans_gap; pause_param->pause_trans_gap = pause_trans_gap;
pause_param->pause_trans_time = cpu_to_le16(pause_trans_time); pause_param->pause_trans_time = cpu_to_le16(pause_trans_time);
...@@ -1279,10 +1280,15 @@ int hclge_tm_prio_tc_info_update(struct hclge_dev *hdev, u8 *prio_tc) ...@@ -1279,10 +1280,15 @@ int hclge_tm_prio_tc_info_update(struct hclge_dev *hdev, u8 *prio_tc)
return 0; return 0;
} }
void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc) int hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc)
{ {
u8 i, bit_map = 0; u8 i, bit_map = 0;
for (i = 0; i < hdev->num_alloc_vport; i++) {
if (num_tc > hdev->vport[i].alloc_tqps)
return -EINVAL;
}
hdev->tm_info.num_tc = num_tc; hdev->tm_info.num_tc = num_tc;
for (i = 0; i < hdev->tm_info.num_tc; i++) for (i = 0; i < hdev->tm_info.num_tc; i++)
...@@ -1296,6 +1302,8 @@ void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc) ...@@ -1296,6 +1302,8 @@ void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc)
hdev->hw_tc_map = bit_map; hdev->hw_tc_map = bit_map;
hclge_tm_schd_info_init(hdev); hclge_tm_schd_info_init(hdev);
return 0;
} }
int hclge_tm_init_hw(struct hclge_dev *hdev) int hclge_tm_init_hw(struct hclge_dev *hdev)
......
...@@ -106,6 +106,10 @@ struct hclge_cfg_pause_param_cmd { ...@@ -106,6 +106,10 @@ struct hclge_cfg_pause_param_cmd {
u8 pause_trans_gap; u8 pause_trans_gap;
u8 rsvd; u8 rsvd;
__le16 pause_trans_time; __le16 pause_trans_time;
u8 rsvd1[6];
/* extra mac address to do double check for pause frame */
u8 mac_addr_extra[ETH_ALEN];
u16 rsvd2;
}; };
struct hclge_pfc_stats_cmd { struct hclge_pfc_stats_cmd {
...@@ -128,7 +132,7 @@ int hclge_tm_schd_init(struct hclge_dev *hdev); ...@@ -128,7 +132,7 @@ int hclge_tm_schd_init(struct hclge_dev *hdev);
int hclge_pause_setup_hw(struct hclge_dev *hdev); int hclge_pause_setup_hw(struct hclge_dev *hdev);
int hclge_tm_schd_mode_hw(struct hclge_dev *hdev); int hclge_tm_schd_mode_hw(struct hclge_dev *hdev);
int hclge_tm_prio_tc_info_update(struct hclge_dev *hdev, u8 *prio_tc); int hclge_tm_prio_tc_info_update(struct hclge_dev *hdev, u8 *prio_tc);
void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc); int hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc);
int hclge_tm_dwrr_cfg(struct hclge_dev *hdev); int hclge_tm_dwrr_cfg(struct hclge_dev *hdev);
int hclge_tm_map_cfg(struct hclge_dev *hdev); int hclge_tm_map_cfg(struct hclge_dev *hdev);
int hclge_tm_init_hw(struct hclge_dev *hdev); int hclge_tm_init_hw(struct hclge_dev *hdev);
......
...@@ -1975,11 +1975,11 @@ static void hclgevf_get_channels(struct hnae3_handle *handle, ...@@ -1975,11 +1975,11 @@ static void hclgevf_get_channels(struct hnae3_handle *handle,
} }
static void hclgevf_get_tqps_and_rss_info(struct hnae3_handle *handle, static void hclgevf_get_tqps_and_rss_info(struct hnae3_handle *handle,
u16 *free_tqps, u16 *max_rss_size) u16 *alloc_tqps, u16 *max_rss_size)
{ {
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
*free_tqps = 0; *alloc_tqps = hdev->num_tqps;
*max_rss_size = hdev->rss_size_max; *max_rss_size = hdev->rss_size_max;
} }
......
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