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

Merge branch 'octeontx2-pf-Miscellaneous-fixes'



Sunil Goutham says:

====================
octeontx2-pf: Miscellaneous fixes

This patchset fixes couple of issues related to missing
page refcount updation and taking a mutex lock in atomic
context.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1455ea1d e99b7c84
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -243,6 +243,8 @@ struct otx2_nic {
	struct workqueue_struct	*flr_wq;
	struct flr_work		*flr_wrk;
	struct refill_work	*refill_wrk;
	struct workqueue_struct	*otx2_wq;
	struct work_struct	rx_mode_work;

	/* Ethtool stuff */
	u32			msg_enable;
+27 −2
Original line number Diff line number Diff line
@@ -1679,6 +1679,14 @@ static netdev_tx_t otx2_xmit(struct sk_buff *skb, struct net_device *netdev)
static void otx2_set_rx_mode(struct net_device *netdev)
{
	struct otx2_nic *pf = netdev_priv(netdev);

	queue_work(pf->otx2_wq, &pf->rx_mode_work);
}

static void otx2_do_set_rx_mode(struct work_struct *work)
{
	struct otx2_nic *pf = container_of(work, struct otx2_nic, rx_mode_work);
	struct net_device *netdev = pf->netdev;
	struct nix_rx_mode *req;

	if (!(netdev->flags & IFF_UP))
@@ -1740,6 +1748,17 @@ static const struct net_device_ops otx2_netdev_ops = {
	.ndo_get_stats64	= otx2_get_stats64,
};

static int otx2_wq_init(struct otx2_nic *pf)
{
	pf->otx2_wq = create_singlethread_workqueue("otx2_wq");
	if (!pf->otx2_wq)
		return -ENOMEM;

	INIT_WORK(&pf->rx_mode_work, otx2_do_set_rx_mode);
	INIT_WORK(&pf->reset_task, otx2_reset_task);
	return 0;
}

static int otx2_check_pf_usable(struct otx2_nic *nic)
{
	u64 rev;
@@ -1924,14 +1943,16 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
	netdev->min_mtu = OTX2_MIN_MTU;
	netdev->max_mtu = OTX2_MAX_MTU;

	INIT_WORK(&pf->reset_task, otx2_reset_task);

	err = register_netdev(netdev);
	if (err) {
		dev_err(dev, "Failed to register netdevice\n");
		goto err_detach_rsrc;
	}

	err = otx2_wq_init(pf);
	if (err)
		goto err_unreg_netdev;

	otx2_set_ethtool_ops(netdev);

	/* Enable link notifications */
@@ -1943,6 +1964,8 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)

	return 0;

err_unreg_netdev:
	unregister_netdev(netdev);
err_detach_rsrc:
	otx2_detach_resources(&pf->mbox);
err_disable_mbox_intr:
@@ -2089,6 +2112,8 @@ static void otx2_remove(struct pci_dev *pdev)

	unregister_netdev(netdev);
	otx2_sriov_disable(pf->pdev);
	if (pf->otx2_wq)
		destroy_workqueue(pf->otx2_wq);

	otx2_detach_resources(&pf->mbox);
	otx2_disable_mbox_intr(pf);
+1 −0
Original line number Diff line number Diff line
@@ -304,6 +304,7 @@ static int otx2_rx_napi_handler(struct otx2_nic *pfvf,
		otx2_aura_freeptr(pfvf, cq->cq_idx, bufptr + OTX2_HEAD_ROOM);
		cq->pool_ptrs--;
	}
	otx2_get_page(cq->rbpool);

	return processed_cqe;
}