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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
4605168f71
|
@ -84,10 +84,11 @@ struct hnae3_queue {
|
|||
|
||||
/*hnae3 loop mode*/
|
||||
enum hnae3_loop {
|
||||
HNAE3_MAC_INTER_LOOP_MAC,
|
||||
HNAE3_MAC_INTER_LOOP_SERDES,
|
||||
HNAE3_MAC_INTER_LOOP_PHY,
|
||||
HNAE3_MAC_LOOP_NONE,
|
||||
HNAE3_LOOP_APP,
|
||||
HNAE3_LOOP_SERIAL_SERDES,
|
||||
HNAE3_LOOP_PARALLEL_SERDES,
|
||||
HNAE3_LOOP_PHY,
|
||||
HNAE3_LOOP_NONE,
|
||||
};
|
||||
|
||||
enum hnae3_client_type {
|
||||
|
@ -402,7 +403,7 @@ struct hnae3_ae_ops {
|
|||
void (*get_channels)(struct hnae3_handle *handle,
|
||||
struct ethtool_channels *ch);
|
||||
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);
|
||||
void (*get_flowctrl_adv)(struct hnae3_handle *handle,
|
||||
u32 *flowctrl_adv);
|
||||
|
@ -478,10 +479,11 @@ struct hnae3_unic_private_info {
|
|||
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_SERDES_LOOPBACK BIT(2)
|
||||
#define HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK BIT(2)
|
||||
#define HNAE3_SUPPORT_VF BIT(3)
|
||||
#define HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK BIT(4)
|
||||
|
||||
struct hnae3_handle {
|
||||
struct hnae3_client *client;
|
||||
|
|
|
@ -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,
|
||||
struct hns3_nic_priv *priv)
|
||||
{
|
||||
struct hnae3_handle *h = priv->ae_handle;
|
||||
|
||||
/* initialize the configuration for interrupt coalescing.
|
||||
* 1. GL (Interrupt Gap Limiter)
|
||||
* 2. RL (Interrupt Rate Limiter)
|
||||
|
@ -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->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->rx_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)
|
|||
|
||||
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);
|
||||
max_tqps = h->kinfo.num_tc * max_rss_size;
|
||||
h->ae_algo->ops->get_tqps_and_rss_info(h, &alloc_tqps, &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)
|
||||
|
@ -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);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
netdev_err(netdev, "failed to change MTU in hardware %d\n",
|
||||
ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
netdev->mtu = new_mtu;
|
||||
else
|
||||
netdev->mtu = new_mtu;
|
||||
|
||||
/* if the netdev was running earlier, bring it up again */
|
||||
if (if_running && hns3_nic_net_open(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_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
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;
|
||||
|
||||
|
@ -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_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GSO_GRE |
|
||||
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 |=
|
||||
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
|
||||
NETIF_F_SG | NETIF_F_GSO | 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_UDP_TUNNEL_CSUM;
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
|
||||
|
||||
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_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
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_UDP_TUNNEL_CSUM;
|
||||
NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_SCTP_CRC;
|
||||
|
||||
if (pdev->revision != 0x20)
|
||||
netdev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
|
||||
|
@ -3166,12 +3159,14 @@ static void hns3_nic_set_priv_ops(struct net_device *netdev)
|
|||
static int hns3_client_init(struct hnae3_handle *handle)
|
||||
{
|
||||
struct pci_dev *pdev = handle->pdev;
|
||||
u16 alloc_tqps, max_rss_size;
|
||||
struct hns3_nic_priv *priv;
|
||||
struct net_device *netdev;
|
||||
int ret;
|
||||
|
||||
netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv),
|
||||
hns3_get_max_available_channels(handle));
|
||||
handle->ae_algo->ops->get_tqps_and_rss_info(handle, &alloc_tqps,
|
||||
&max_rss_size);
|
||||
netdev = alloc_etherdev_mq(sizeof(struct hns3_nic_priv), alloc_tqps);
|
||||
if (!netdev)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -3490,6 +3485,31 @@ int hns3_nic_reset_all_ring(struct hnae3_handle *h)
|
|||
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)
|
||||
{
|
||||
struct hnae3_knic_private_info *kinfo = &handle->kinfo;
|
||||
|
@ -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 */
|
||||
netif_carrier_off(netdev);
|
||||
|
||||
hns3_restore_coal(priv);
|
||||
|
||||
ret = hns3_nic_init_vector_data(priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -3563,6 +3585,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle)
|
|||
return ret;
|
||||
}
|
||||
|
||||
hns3_store_coal(priv);
|
||||
|
||||
ret = hns3_uninit_all_ring(priv);
|
||||
if (ret)
|
||||
netdev_err(netdev, "uninit ring error\n");
|
||||
|
@ -3597,24 +3621,7 @@ static int hns3_reset_notify(struct hnae3_handle *handle,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void hns3_restore_coal(struct hns3_nic_priv *priv,
|
||||
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)
|
||||
static int hns3_modify_tqp_num(struct net_device *netdev, u16 new_tqp_num)
|
||||
{
|
||||
struct hns3_nic_priv *priv = netdev_priv(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,
|
|||
if (ret)
|
||||
goto err_alloc_vector;
|
||||
|
||||
hns3_restore_coal(priv, tx, rx);
|
||||
hns3_restore_coal(priv);
|
||||
|
||||
ret = hns3_nic_init_vector_data(priv);
|
||||
if (ret)
|
||||
|
@ -3664,7 +3671,6 @@ int hns3_set_channels(struct net_device *netdev,
|
|||
struct hns3_nic_priv *priv = netdev_priv(netdev);
|
||||
struct hnae3_handle *h = hns3_get_handle(netdev);
|
||||
struct hnae3_knic_private_info *kinfo = &h->kinfo;
|
||||
struct hns3_enet_coalesce tx_coal, rx_coal;
|
||||
bool if_running = netif_running(netdev);
|
||||
u32 new_tqp_num = ch->combined_count;
|
||||
u16 org_tqp_num;
|
||||
|
@ -3696,15 +3702,7 @@ int hns3_set_channels(struct net_device *netdev,
|
|||
goto open_netdev;
|
||||
}
|
||||
|
||||
/* Changing the tqp num may also change the vector num,
|
||||
* 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_store_coal(priv);
|
||||
|
||||
hns3_nic_dealloc_vector_data(priv);
|
||||
|
||||
|
@ -3712,10 +3710,9 @@ int hns3_set_channels(struct net_device *netdev,
|
|||
hns3_put_ring_config(priv);
|
||||
|
||||
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) {
|
||||
ret = hns3_modify_tqp_num(netdev, org_tqp_num,
|
||||
&tx_coal, &rx_coal);
|
||||
ret = hns3_modify_tqp_num(netdev, org_tqp_num);
|
||||
if (ret) {
|
||||
/* If revert to old tqp failed, fatal error occurred */
|
||||
dev_err(&netdev->dev,
|
||||
|
|
|
@ -543,6 +543,8 @@ struct hns3_nic_priv {
|
|||
/* Vxlan/Geneve information */
|
||||
struct hns3_udp_tunnel udp_tnl[HNS3_UDP_TNL_MAX];
|
||||
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 {
|
||||
|
|
|
@ -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_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_RING_ID 0
|
||||
#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)
|
|||
return -EOPNOTSUPP;
|
||||
|
||||
switch (loop) {
|
||||
case HNAE3_MAC_INTER_LOOP_SERDES:
|
||||
case HNAE3_MAC_INTER_LOOP_MAC:
|
||||
case HNAE3_LOOP_SERIAL_SERDES:
|
||||
case HNAE3_LOOP_PARALLEL_SERDES:
|
||||
case HNAE3_LOOP_APP:
|
||||
ret = h->ae_algo->ops->set_loopback(h, loop, en);
|
||||
break;
|
||||
default:
|
||||
|
@ -286,13 +287,18 @@ static void hns3_self_test(struct net_device *ndev,
|
|||
if (eth_test->flags != ETH_TEST_FL_OFFLINE)
|
||||
return;
|
||||
|
||||
st_param[HNAE3_MAC_INTER_LOOP_MAC][0] = HNAE3_MAC_INTER_LOOP_MAC;
|
||||
st_param[HNAE3_MAC_INTER_LOOP_MAC][1] =
|
||||
h->flags & HNAE3_SUPPORT_MAC_LOOPBACK;
|
||||
st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
|
||||
st_param[HNAE3_LOOP_APP][1] =
|
||||
h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
|
||||
|
||||
st_param[HNAE3_MAC_INTER_LOOP_SERDES][0] = HNAE3_MAC_INTER_LOOP_SERDES;
|
||||
st_param[HNAE3_MAC_INTER_LOOP_SERDES][1] =
|
||||
h->flags & HNAE3_SUPPORT_SERDES_LOOPBACK;
|
||||
st_param[HNAE3_LOOP_SERIAL_SERDES][0] = HNAE3_LOOP_SERIAL_SERDES;
|
||||
st_param[HNAE3_LOOP_SERIAL_SERDES][1] =
|
||||
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)
|
||||
ndev->netdev_ops->ndo_stop(ndev);
|
||||
|
|
|
@ -778,6 +778,7 @@ struct hclge_reset_cmd {
|
|||
};
|
||||
|
||||
#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_SUCCESS_B BIT(1)
|
||||
struct hclge_serdes_lb_cmd {
|
||||
|
|
|
@ -184,7 +184,9 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets)
|
|||
if (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);
|
||||
if (ret)
|
||||
|
@ -310,7 +312,9 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
|
|||
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);
|
||||
if (ret)
|
||||
|
|
|
@ -49,8 +49,9 @@ static const struct pci_device_id ae_algo_pci_tbl[] = {
|
|||
MODULE_DEVICE_TABLE(pci, ae_algo_pci_tbl);
|
||||
|
||||
static const char hns3_nic_test_strs[][ETH_GSTRING_LEN] = {
|
||||
"Mac Loopback test",
|
||||
"Serdes Loopback test",
|
||||
"App Loopback test",
|
||||
"Serdes serial Loopback test",
|
||||
"Serdes parallel Loopback test",
|
||||
"Phy Loopback test"
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
#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_dev *hdev = vport->back;
|
||||
|
@ -489,15 +493,17 @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset)
|
|||
if (stringset == ETH_SS_TEST) {
|
||||
/* clear loopback bit flags at first */
|
||||
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_1G) {
|
||||
count += 1;
|
||||
handle->flags |= HNAE3_SUPPORT_MAC_LOOPBACK;
|
||||
handle->flags |= HNAE3_SUPPORT_APP_LOOPBACK;
|
||||
}
|
||||
|
||||
count++;
|
||||
handle->flags |= HNAE3_SUPPORT_SERDES_LOOPBACK;
|
||||
count += 2;
|
||||
handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK;
|
||||
handle->flags |= HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK;
|
||||
} else if (stringset == ETH_SS_STATS) {
|
||||
count = ARRAY_SIZE(g_mac_stats_string) +
|
||||
hclge_tqps_get_sset_count(handle, stringset);
|
||||
|
@ -521,21 +527,27 @@ static void hclge_get_strings(struct hnae3_handle *handle,
|
|||
p);
|
||||
p = hclge_tqps_get_strings(handle, p);
|
||||
} else if (stringset == ETH_SS_TEST) {
|
||||
if (handle->flags & HNAE3_SUPPORT_MAC_LOOPBACK) {
|
||||
if (handle->flags & HNAE3_SUPPORT_APP_LOOPBACK) {
|
||||
memcpy(p,
|
||||
hns3_nic_test_strs[HNAE3_MAC_INTER_LOOP_MAC],
|
||||
hns3_nic_test_strs[HNAE3_LOOP_APP],
|
||||
ETH_GSTRING_LEN);
|
||||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
if (handle->flags & HNAE3_SUPPORT_SERDES_LOOPBACK) {
|
||||
if (handle->flags & HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK) {
|
||||
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);
|
||||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
if (handle->flags & HNAE3_SUPPORT_PHY_LOOPBACK) {
|
||||
memcpy(p,
|
||||
hns3_nic_test_strs[HNAE3_MAC_INTER_LOOP_PHY],
|
||||
hns3_nic_test_strs[HNAE3_LOOP_PHY],
|
||||
ETH_GSTRING_LEN);
|
||||
p += ETH_GSTRING_LEN;
|
||||
}
|
||||
|
@ -1344,11 +1356,13 @@ static int hclge_tx_buffer_calc(struct hclge_dev *hdev,
|
|||
static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
|
||||
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;
|
||||
struct hclge_priv_buf *priv;
|
||||
int i;
|
||||
|
||||
aligned_mps = round_up(hdev->mps, HCLGE_BUF_SIZE_UNIT);
|
||||
rx_all -= hclge_get_tx_buff_alloced(buf_alloc);
|
||||
|
||||
/* When DCB is not supported, rx private
|
||||
|
@ -1367,13 +1381,13 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
|
|||
if (hdev->hw_tc_map & BIT(i)) {
|
||||
priv->enable = 1;
|
||||
if (hdev->tm_info.hw_pfc_map & BIT(i)) {
|
||||
priv->wl.low = hdev->mps;
|
||||
priv->wl.high = priv->wl.low + hdev->mps;
|
||||
priv->wl.low = aligned_mps;
|
||||
priv->wl.high = priv->wl.low + aligned_mps;
|
||||
priv->buf_size = priv->wl.high +
|
||||
HCLGE_DEFAULT_DV;
|
||||
} else {
|
||||
priv->wl.low = 0;
|
||||
priv->wl.high = 2 * hdev->mps;
|
||||
priv->wl.high = 2 * aligned_mps;
|
||||
priv->buf_size = priv->wl.high;
|
||||
}
|
||||
} else {
|
||||
|
@ -1405,11 +1419,11 @@ static int hclge_rx_buffer_calc(struct hclge_dev *hdev,
|
|||
|
||||
if (hdev->tm_info.hw_pfc_map & BIT(i)) {
|
||||
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;
|
||||
} else {
|
||||
priv->wl.low = 0;
|
||||
priv->wl.high = hdev->mps;
|
||||
priv->wl.high = aligned_mps;
|
||||
priv->buf_size = priv->wl.high;
|
||||
}
|
||||
}
|
||||
|
@ -3345,7 +3359,7 @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable)
|
|||
"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_desc desc;
|
||||
|
@ -3381,22 +3395,37 @@ static int hclge_set_mac_loopback(struct hclge_dev *hdev, bool en)
|
|||
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_NUM 100
|
||||
struct hclge_serdes_lb_cmd *req;
|
||||
struct hclge_desc desc;
|
||||
int ret, i = 0;
|
||||
u8 loop_mode_b;
|
||||
|
||||
req = (struct hclge_serdes_lb_cmd *)desc.data;
|
||||
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) {
|
||||
req->enable = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
|
||||
req->mask = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
|
||||
req->enable = loop_mode_b;
|
||||
req->mask = loop_mode_b;
|
||||
} else {
|
||||
req->mask = HCLGE_CMD_SERDES_SERIAL_INNER_LOOP_B;
|
||||
req->mask = loop_mode_b;
|
||||
}
|
||||
|
||||
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
|
||||
|
@ -3459,11 +3488,12 @@ static int hclge_set_loopback(struct hnae3_handle *handle,
|
|||
int i, ret;
|
||||
|
||||
switch (loop_mode) {
|
||||
case HNAE3_MAC_INTER_LOOP_MAC:
|
||||
ret = hclge_set_mac_loopback(hdev, en);
|
||||
case HNAE3_LOOP_APP:
|
||||
ret = hclge_set_app_loopback(hdev, en);
|
||||
break;
|
||||
case HNAE3_MAC_INTER_LOOP_SERDES:
|
||||
ret = hclge_set_serdes_loopback(hdev, en);
|
||||
case HNAE3_LOOP_SERIAL_SERDES:
|
||||
case HNAE3_LOOP_PARALLEL_SERDES:
|
||||
ret = hclge_set_serdes_loopback(hdev, en, loop_mode);
|
||||
break;
|
||||
default:
|
||||
ret = -ENOTSUPP;
|
||||
|
@ -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,
|
||||
u16 *free_tqps, u16 *max_rss_size)
|
||||
u16 *alloc_tqps, u16 *max_rss_size)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u16 temp_tqps = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < hdev->num_tqps; i++) {
|
||||
if (!hdev->htqp[i].alloced)
|
||||
temp_tqps++;
|
||||
}
|
||||
*free_tqps = temp_tqps;
|
||||
*alloc_tqps = vport->alloc_tqps;
|
||||
*max_rss_size = hdev->rss_size_max;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
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_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)
|
|||
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;
|
||||
|
||||
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;
|
||||
|
||||
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)
|
|||
hdev->hw_tc_map = bit_map;
|
||||
|
||||
hclge_tm_schd_info_init(hdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int hclge_tm_init_hw(struct hclge_dev *hdev)
|
||||
|
|
|
@ -106,6 +106,10 @@ struct hclge_cfg_pause_param_cmd {
|
|||
u8 pause_trans_gap;
|
||||
u8 rsvd;
|
||||
__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 {
|
||||
|
@ -128,7 +132,7 @@ int hclge_tm_schd_init(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_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_map_cfg(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,
|
|||
}
|
||||
|
||||
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);
|
||||
|
||||
*free_tqps = 0;
|
||||
*alloc_tqps = hdev->num_tqps;
|
||||
*max_rss_size = hdev->rss_size_max;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue