Commit d24b6c62 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'hns3-next'



Huazhong Tan says:

====================
net: hns3: some code optimizations & bugfixes & features

This patch-set includes code optimizations, bugfixes and features for
the HNS3 ethernet controller driver.

[patch 1/10] checks reset status before setting channel.

[patch 2/10] adds a NULL pointer checking.

[patch 3/10] removes reset level upgrading when current reset fails.

[patch 4/10] fixes a GFP flags errors when holding spin_lock.

[patch 5/10] modifies firmware version format.

[patch 6/10] adds some print information which is off by default.

[patch 7/10 - 8/10] adds two code optimizations about interrupt handler
and work task.

[patch 9/10] adds support for using order 1 pages with a 4K buffer.

[patch 10/10] modifies messages prints with dev_info() instead of
pr_info().

Change log:
V3->V4: replace netif_info with netif_dbg in [patch 6/10]
V2->V3: fixes comments from Saeed Mahameed and Joe Perches.
V1->V2: fixes comments from Saeed Mahameed and
	removes previous [patch 4/11] and [patch 11/11]
	which needs further discussion, and adds a new
	patch [10/10] suggested by Saeed Mahameed.
====================

Reviewed-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents dda91bd7 08d80a4c
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -179,6 +179,15 @@ struct hnae3_vector_info {
#define HNAE3_RING_GL_RX 0
#define HNAE3_RING_GL_RX 0
#define HNAE3_RING_GL_TX 1
#define HNAE3_RING_GL_TX 1


#define HNAE3_FW_VERSION_BYTE3_SHIFT	24
#define HNAE3_FW_VERSION_BYTE3_MASK	GENMASK(31, 24)
#define HNAE3_FW_VERSION_BYTE2_SHIFT	16
#define HNAE3_FW_VERSION_BYTE2_MASK	GENMASK(23, 16)
#define HNAE3_FW_VERSION_BYTE1_SHIFT	8
#define HNAE3_FW_VERSION_BYTE1_MASK	GENMASK(15, 8)
#define HNAE3_FW_VERSION_BYTE0_SHIFT	0
#define HNAE3_FW_VERSION_BYTE0_MASK	GENMASK(7, 0)

struct hnae3_ring_chain_node {
struct hnae3_ring_chain_node {
	struct hnae3_ring_chain_node *next;
	struct hnae3_ring_chain_node *next;
	u32 tqp_index;
	u32 tqp_index;
+27 −6
Original line number Original line Diff line number Diff line
@@ -459,6 +459,9 @@ static int hns3_nic_net_open(struct net_device *netdev)
		h->ae_algo->ops->set_timer_task(priv->ae_handle, true);
		h->ae_algo->ops->set_timer_task(priv->ae_handle, true);


	hns3_config_xps(priv);
	hns3_config_xps(priv);

	netif_dbg(h, drv, netdev, "net open\n");

	return 0;
	return 0;
}
}


@@ -519,6 +522,8 @@ static int hns3_nic_net_stop(struct net_device *netdev)
	if (test_and_set_bit(HNS3_NIC_STATE_DOWN, &priv->state))
	if (test_and_set_bit(HNS3_NIC_STATE_DOWN, &priv->state))
		return 0;
		return 0;


	netif_dbg(h, drv, netdev, "net stop\n");

	if (h->ae_algo->ops->set_timer_task)
	if (h->ae_algo->ops->set_timer_task)
		h->ae_algo->ops->set_timer_task(priv->ae_handle, false);
		h->ae_algo->ops->set_timer_task(priv->ae_handle, false);


@@ -1550,6 +1555,8 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data)
	h = hns3_get_handle(netdev);
	h = hns3_get_handle(netdev);
	kinfo = &h->kinfo;
	kinfo = &h->kinfo;


	netif_dbg(h, drv, netdev, "setup tc: num_tc=%u\n", tc);

	return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ?
	return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ?
		kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP;
		kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP;
}
}
@@ -1593,6 +1600,10 @@ static int hns3_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan,
	struct hnae3_handle *h = hns3_get_handle(netdev);
	struct hnae3_handle *h = hns3_get_handle(netdev);
	int ret = -EIO;
	int ret = -EIO;


	netif_dbg(h, drv, netdev,
		  "set vf vlan: vf=%d, vlan=%u, qos=%u, vlan_proto=%u\n",
		  vf, vlan, qos, vlan_proto);

	if (h->ae_algo->ops->set_vf_vlan_filter)
	if (h->ae_algo->ops->set_vf_vlan_filter)
		ret = h->ae_algo->ops->set_vf_vlan_filter(h, vf, vlan,
		ret = h->ae_algo->ops->set_vf_vlan_filter(h, vf, vlan,
							  qos, vlan_proto);
							  qos, vlan_proto);
@@ -1611,6 +1622,9 @@ static int hns3_nic_change_mtu(struct net_device *netdev, int new_mtu)
	if (!h->ae_algo->ops->set_mtu)
	if (!h->ae_algo->ops->set_mtu)
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;


	netif_dbg(h, drv, netdev,
		  "change mtu from %u to %d\n", netdev->mtu, 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",
@@ -1963,7 +1977,7 @@ static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev)


	ops = ae_dev->ops;
	ops = ae_dev->ops;
	/* request the reset */
	/* request the reset */
	if (ops->reset_event) {
	if (ops->reset_event && ops->get_reset_level) {
		if (ae_dev->hw_err_reset_req) {
		if (ae_dev->hw_err_reset_req) {
			reset_type = ops->get_reset_level(ae_dev,
			reset_type = ops->get_reset_level(ae_dev,
						&ae_dev->hw_err_reset_req);
						&ae_dev->hw_err_reset_req);
@@ -2067,7 +2081,7 @@ static void hns3_set_default_feature(struct net_device *netdev)
static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
			     struct hns3_desc_cb *cb)
			     struct hns3_desc_cb *cb)
{
{
	unsigned int order = hnae3_page_order(ring);
	unsigned int order = hns3_page_order(ring);
	struct page *p;
	struct page *p;


	p = dev_alloc_pages(order);
	p = dev_alloc_pages(order);
@@ -2078,7 +2092,7 @@ static int hns3_alloc_buffer(struct hns3_enet_ring *ring,
	cb->page_offset = 0;
	cb->page_offset = 0;
	cb->reuse_flag = 0;
	cb->reuse_flag = 0;
	cb->buf  = page_address(p);
	cb->buf  = page_address(p);
	cb->length = hnae3_page_size(ring);
	cb->length = hns3_page_size(ring);
	cb->type = DESC_TYPE_PAGE;
	cb->type = DESC_TYPE_PAGE;


	return 0;
	return 0;
@@ -2381,7 +2395,7 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
{
{
	struct hns3_desc *desc = &ring->desc[ring->next_to_clean];
	struct hns3_desc *desc = &ring->desc[ring->next_to_clean];
	int size = le16_to_cpu(desc->rx.size);
	int size = le16_to_cpu(desc->rx.size);
	u32 truesize = hnae3_buf_size(ring);
	u32 truesize = hns3_buf_size(ring);


	skb_add_rx_frag(skb, i, desc_cb->priv, desc_cb->page_offset + pull_len,
	skb_add_rx_frag(skb, i, desc_cb->priv, desc_cb->page_offset + pull_len,
			size - pull_len, truesize);
			size - pull_len, truesize);
@@ -2396,7 +2410,7 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
	/* Move offset up to the next cache line */
	/* Move offset up to the next cache line */
	desc_cb->page_offset += truesize;
	desc_cb->page_offset += truesize;


	if (desc_cb->page_offset + truesize <= hnae3_page_size(ring)) {
	if (desc_cb->page_offset + truesize <= hns3_page_size(ring)) {
		desc_cb->reuse_flag = 1;
		desc_cb->reuse_flag = 1;
		/* Bump ref count on page before it is given */
		/* Bump ref count on page before it is given */
		get_page(desc_cb->priv);
		get_page(desc_cb->priv);
@@ -2678,7 +2692,7 @@ static int hns3_add_frag(struct hns3_enet_ring *ring, struct hns3_desc *desc,
		}
		}


		if (ring->tail_skb) {
		if (ring->tail_skb) {
			head_skb->truesize += hnae3_buf_size(ring);
			head_skb->truesize += hns3_buf_size(ring);
			head_skb->data_len += le16_to_cpu(desc->rx.size);
			head_skb->data_len += le16_to_cpu(desc->rx.size);
			head_skb->len += le16_to_cpu(desc->rx.size);
			head_skb->len += le16_to_cpu(desc->rx.size);
			skb = ring->tail_skb;
			skb = ring->tail_skb;
@@ -4378,6 +4392,9 @@ int hns3_set_channels(struct net_device *netdev,
	u16 org_tqp_num;
	u16 org_tqp_num;
	int ret;
	int ret;


	if (hns3_nic_resetting(netdev))
		return -EBUSY;

	if (ch->rx_count || ch->tx_count)
	if (ch->rx_count || ch->tx_count)
		return -EINVAL;
		return -EINVAL;


@@ -4392,6 +4409,10 @@ int hns3_set_channels(struct net_device *netdev,
	if (kinfo->rss_size == new_tqp_num)
	if (kinfo->rss_size == new_tqp_num)
		return 0;
		return 0;


	netif_dbg(h, drv, netdev,
		  "set channels: tqp_num=%u, rxfh=%d\n",
		  new_tqp_num, rxfh_configured);

	ret = hns3_reset_notify(h, HNAE3_DOWN_CLIENT);
	ret = hns3_reset_notify(h, HNAE3_DOWN_CLIENT);
	if (ret)
	if (ret)
		return ret;
		return ret;
+12 −3
Original line number Original line Diff line number Diff line
@@ -608,9 +608,18 @@ static inline bool hns3_nic_resetting(struct net_device *netdev)


#define tx_ring_data(priv, idx) ((priv)->ring_data[idx])
#define tx_ring_data(priv, idx) ((priv)->ring_data[idx])


#define hnae3_buf_size(_ring) ((_ring)->buf_size)
#define hns3_buf_size(_ring) ((_ring)->buf_size)
#define hnae3_page_order(_ring) (get_order(hnae3_buf_size(_ring)))

#define hnae3_page_size(_ring) (PAGE_SIZE << (u32)hnae3_page_order(_ring))
static inline unsigned int hns3_page_order(struct hns3_enet_ring *ring)
{
#if (PAGE_SIZE < 8192)
	if (ring->buf_size > (PAGE_SIZE / 2))
		return 1;
#endif
	return 0;
}

#define hns3_page_size(_ring) (PAGE_SIZE << hns3_page_order(_ring))


/* iterator for handling rings in ring group */
/* iterator for handling rings in ring group */
#define hns3_for_each_ring(pos, head) \
#define hns3_for_each_ring(pos, head) \
+32 −2
Original line number Original line Diff line number Diff line
@@ -311,6 +311,8 @@ 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;


	netif_dbg(h, drv, ndev, "self test start");

	st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
	st_param[HNAE3_LOOP_APP][0] = HNAE3_LOOP_APP;
	st_param[HNAE3_LOOP_APP][1] =
	st_param[HNAE3_LOOP_APP][1] =
			h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
			h->flags & HNAE3_SUPPORT_APP_LOOPBACK;
@@ -374,6 +376,8 @@ static void hns3_self_test(struct net_device *ndev,


	if (if_running)
	if (if_running)
		ndev->netdev_ops->ndo_open(ndev);
		ndev->netdev_ops->ndo_open(ndev);

	netif_dbg(h, drv, ndev, "self test end\n");
}
}


static int hns3_get_sset_count(struct net_device *netdev, int stringset)
static int hns3_get_sset_count(struct net_device *netdev, int stringset)
@@ -527,6 +531,7 @@ static void hns3_get_drvinfo(struct net_device *netdev,
{
{
	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;
	u32 fw_version;


	if (!h->ae_algo->ops->get_fw_version) {
	if (!h->ae_algo->ops->get_fw_version) {
		netdev_err(netdev, "could not get fw version!\n");
		netdev_err(netdev, "could not get fw version!\n");
@@ -545,8 +550,18 @@ static void hns3_get_drvinfo(struct net_device *netdev,
		sizeof(drvinfo->bus_info));
		sizeof(drvinfo->bus_info));
	drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';
	drvinfo->bus_info[ETHTOOL_BUSINFO_LEN - 1] = '\0';


	snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), "0x%08x",
	fw_version = priv->ae_handle->ae_algo->ops->get_fw_version(h);
		 priv->ae_handle->ae_algo->ops->get_fw_version(h));

	snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
		 "%lu.%lu.%lu.%lu",
		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE3_MASK,
				 HNAE3_FW_VERSION_BYTE3_SHIFT),
		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE2_MASK,
				 HNAE3_FW_VERSION_BYTE2_SHIFT),
		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE1_MASK,
				 HNAE3_FW_VERSION_BYTE1_SHIFT),
		 hnae3_get_field(fw_version, HNAE3_FW_VERSION_BYTE0_MASK,
				 HNAE3_FW_VERSION_BYTE0_SHIFT));
}
}


static u32 hns3_get_link(struct net_device *netdev)
static u32 hns3_get_link(struct net_device *netdev)
@@ -593,6 +608,10 @@ static int hns3_set_pauseparam(struct net_device *netdev,
{
{
	struct hnae3_handle *h = hns3_get_handle(netdev);
	struct hnae3_handle *h = hns3_get_handle(netdev);


	netif_dbg(h, drv, netdev,
		  "set pauseparam: autoneg=%u, rx:%u, tx:%u\n",
		  param->autoneg, param->rx_pause, param->tx_pause);

	if (h->ae_algo->ops->set_pauseparam)
	if (h->ae_algo->ops->set_pauseparam)
		return h->ae_algo->ops->set_pauseparam(h, param->autoneg,
		return h->ae_algo->ops->set_pauseparam(h, param->autoneg,
						       param->rx_pause,
						       param->rx_pause,
@@ -732,6 +751,11 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
	if (cmd->base.speed == SPEED_1000 && cmd->base.duplex == DUPLEX_HALF)
	if (cmd->base.speed == SPEED_1000 && cmd->base.duplex == DUPLEX_HALF)
		return -EINVAL;
		return -EINVAL;


	netif_dbg(handle, drv, netdev,
		  "set link(%s): autoneg=%u, speed=%u, duplex=%u\n",
		  netdev->phydev ? "phy" : "mac",
		  cmd->base.autoneg, cmd->base.speed, cmd->base.duplex);

	/* Only support ksettings_set for netdev with phy attached for now */
	/* Only support ksettings_set for netdev with phy attached for now */
	if (netdev->phydev)
	if (netdev->phydev)
		return phy_ethtool_ksettings_set(netdev->phydev, cmd);
		return phy_ethtool_ksettings_set(netdev->phydev, cmd);
@@ -973,6 +997,9 @@ static int hns3_nway_reset(struct net_device *netdev)
		return -EINVAL;
		return -EINVAL;
	}
	}


	netif_dbg(handle, drv, netdev,
		  "nway reset (using %s)\n", phy ? "phy" : "mac");

	if (phy)
	if (phy)
		return genphy_restart_aneg(phy);
		return genphy_restart_aneg(phy);


@@ -1297,6 +1324,9 @@ static int hns3_set_fecparam(struct net_device *netdev,
	if (!ops->set_fec)
	if (!ops->set_fec)
		return -EOPNOTSUPP;
		return -EOPNOTSUPP;
	fec_mode = eth_to_loc_fec(fec->fec);
	fec_mode = eth_to_loc_fec(fec->fec);

	netif_dbg(handle, drv, netdev, "set fecparam: mode=%u\n", fec_mode);

	return ops->set_fec(handle, fec_mode);
	return ops->set_fec(handle, fec_mode);
}
}


+9 −1
Original line number Original line Diff line number Diff line
@@ -419,7 +419,15 @@ int hclge_cmd_init(struct hclge_dev *hdev)
	}
	}
	hdev->fw_version = version;
	hdev->fw_version = version;


	dev_info(&hdev->pdev->dev, "The firmware version is %08x\n", version);
	dev_info(&hdev->pdev->dev, "The firmware version is %lu.%lu.%lu.%lu\n",
		 hnae3_get_field(version, HNAE3_FW_VERSION_BYTE3_MASK,
				 HNAE3_FW_VERSION_BYTE3_SHIFT),
		 hnae3_get_field(version, HNAE3_FW_VERSION_BYTE2_MASK,
				 HNAE3_FW_VERSION_BYTE2_SHIFT),
		 hnae3_get_field(version, HNAE3_FW_VERSION_BYTE1_MASK,
				 HNAE3_FW_VERSION_BYTE1_SHIFT),
		 hnae3_get_field(version, HNAE3_FW_VERSION_BYTE0_MASK,
				 HNAE3_FW_VERSION_BYTE0_SHIFT));


	return 0;
	return 0;


Loading