Browse Source

liquidio: free resources during shutdown

This patch fixes the issue of proper freeing of queue
memory resources during free device. It also has fix for
correct pcie error reporting.

Signed-off-by: Derek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: Satanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: Felix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: Raghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Raghu Vatsavayi 9 years ago
parent
commit
1e0d30fe21

+ 2 - 2
drivers/net/ethernet/cavium/liquidio/cn66xx_device.c

@@ -64,9 +64,9 @@ void lio_cn6xxx_enable_error_reporting(struct octeon_device *oct)
 	u32 val;
 	u32 val;
 
 
 	pci_read_config_dword(oct->pci_dev, CN6XXX_PCIE_DEVCTL, &val);
 	pci_read_config_dword(oct->pci_dev, CN6XXX_PCIE_DEVCTL, &val);
-	if (val & 0x000f0000) {
+	if (val & 0x000c0000) {
 		dev_err(&oct->pci_dev->dev, "PCI-E Link error detected: 0x%08x\n",
 		dev_err(&oct->pci_dev->dev, "PCI-E Link error detected: 0x%08x\n",
-			val & 0x000f0000);
+			val & 0x000c0000);
 	}
 	}
 
 
 	val |= 0xf;          /* Enable Link error reporting */
 	val |= 0xf;          /* Enable Link error reporting */

+ 3 - 1
drivers/net/ethernet/cavium/liquidio/lio_main.c

@@ -3957,6 +3957,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
 		/* Release any previously allocated queues */
 		/* Release any previously allocated queues */
 		for (j = 0; j < octeon_dev->num_oqs; j++)
 		for (j = 0; j < octeon_dev->num_oqs; j++)
 			octeon_delete_droq(octeon_dev, j);
 			octeon_delete_droq(octeon_dev, j);
+		return 1;
 	}
 	}
 
 
 	atomic_set(&octeon_dev->status, OCT_DEV_DROQ_INIT_DONE);
 	atomic_set(&octeon_dev->status, OCT_DEV_DROQ_INIT_DONE);
@@ -3979,7 +3980,8 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
 
 
 	/* Setup the interrupt handler and record the INT SUM register address
 	/* Setup the interrupt handler and record the INT SUM register address
 	 */
 	 */
-	octeon_setup_interrupt(octeon_dev);
+	if (octeon_setup_interrupt(octeon_dev))
+		return 1;
 
 
 	/* Enable Octeon device interrupts */
 	/* Enable Octeon device interrupts */
 	octeon_dev->fn_list.enable_interrupt(octeon_dev->chip);
 	octeon_dev->fn_list.enable_interrupt(octeon_dev->chip);

+ 3 - 0
drivers/net/ethernet/cavium/liquidio/octeon_console.c

@@ -312,6 +312,9 @@ static u64 cvmx_bootmem_phy_named_block_find(struct octeon_device *oct,
 			if (name && named_size) {
 			if (name && named_size) {
 				char *name_tmp =
 				char *name_tmp =
 					kmalloc(name_length + 1, GFP_KERNEL);
 					kmalloc(name_length + 1, GFP_KERNEL);
+				if (!name_tmp)
+					break;
+
 				CVMX_BOOTMEM_NAMED_GET_NAME(oct, named_addr,
 				CVMX_BOOTMEM_NAMED_GET_NAME(oct, named_addr,
 							    name_tmp,
 							    name_tmp,
 							    name_length);
 							    name_length);

+ 5 - 5
drivers/net/ethernet/cavium/liquidio/octeon_device.c

@@ -644,16 +644,16 @@ int octeon_download_firmware(struct octeon_device *oct, const u8 *data,
 
 
 void octeon_free_device_mem(struct octeon_device *oct)
 void octeon_free_device_mem(struct octeon_device *oct)
 {
 {
-	u32 i;
+	int i;
 
 
 	for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct); i++) {
 	for (i = 0; i < MAX_OCTEON_OUTPUT_QUEUES(oct); i++) {
-		/* could check  mask as well */
-		vfree(oct->droq[i]);
+		if (oct->io_qmask.oq & (1ULL << i))
+			vfree(oct->droq[i]);
 	}
 	}
 
 
 	for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct); i++) {
 	for (i = 0; i < MAX_OCTEON_INSTR_QUEUES(oct); i++) {
-		/* could check mask as well */
-		vfree(oct->instr_queue[i]);
+		if (oct->io_qmask.iq & (1ULL << i))
+			vfree(oct->instr_queue[i]);
 	}
 	}
 
 
 	i = oct->octeon_id;
 	i = oct->octeon_id;