Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89b4208e authored by Sucheta Chakraborty's avatar Sucheta Chakraborty Committed by David S. Miller
Browse files

qlcnic: fix memory leak in qlcnic_blink_led.



o Memory allocated in ETHTOOL_ACTIVE mode, is not getting freed. So,
  in ETHTOOL_ID_INACTIVE mode, return after freeing allocated memory.
o Using set bit instead of blink_down field, as it is also required
  in internal Loopback test and etc.

Signed-off-by: default avatarSucheta Chakraborty <sucheta.chakraborty@qlogic.com>
Signed-off-by: default avatarAmit Kumar Salecha <amit.salecha@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 63c3a66f
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -884,6 +884,7 @@ struct qlcnic_ipaddr {
#define __QLCNIC_RESETTING		2
#define __QLCNIC_RESETTING		2
#define __QLCNIC_START_FW 		4
#define __QLCNIC_START_FW 		4
#define __QLCNIC_AER			5
#define __QLCNIC_AER			5
#define __QLCNIC_DIAG_RES_ALLOC		6


#define QLCNIC_INTERRUPT_TEST		1
#define QLCNIC_INTERRUPT_TEST		1
#define QLCNIC_LOOPBACK_TEST		2
#define QLCNIC_LOOPBACK_TEST		2
@@ -913,7 +914,6 @@ struct qlcnic_adapter {
	struct net_device *netdev;
	struct net_device *netdev;
	struct pci_dev *pdev;
	struct pci_dev *pdev;


	bool 		blink_was_down;
	unsigned long state;
	unsigned long state;
	u32 flags;
	u32 flags;


+5 −7
Original line number Original line Diff line number Diff line
@@ -772,7 +772,6 @@ static int qlcnic_set_led(struct net_device *dev,


	switch (state) {
	switch (state) {
	case ETHTOOL_ID_ACTIVE:
	case ETHTOOL_ID_ACTIVE:
		adapter->blink_was_down = false;
		if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
		if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
			if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
			if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
				return -EIO;
				return -EIO;
@@ -781,7 +780,7 @@ static int qlcnic_set_led(struct net_device *dev,
				clear_bit(__QLCNIC_RESETTING, &adapter->state);
				clear_bit(__QLCNIC_RESETTING, &adapter->state);
				return -EIO;
				return -EIO;
			}
			}
			adapter->blink_was_down = true;
			set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
		}
		}


		if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0)
		if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0)
@@ -792,18 +791,17 @@ static int qlcnic_set_led(struct net_device *dev,
		break;
		break;


	case ETHTOOL_ID_INACTIVE:
	case ETHTOOL_ID_INACTIVE:
		if (adapter->nic_ops->config_led(adapter, 0, 0xf) == 0)
		if (adapter->nic_ops->config_led(adapter, 0, 0xf))
			return 0;

			dev_err(&adapter->pdev->dev,
			dev_err(&adapter->pdev->dev,
				"Failed to reset LED blink state.\n");
				"Failed to reset LED blink state.\n");

		break;
		break;


	default:
	default:
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (adapter->blink_was_down) {
	if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) {
		qlcnic_diag_free_res(dev, max_sds_rings);
		qlcnic_diag_free_res(dev, max_sds_rings);
		clear_bit(__QLCNIC_RESETTING, &adapter->state);
		clear_bit(__QLCNIC_RESETTING, &adapter->state);
	}
	}