liquidio: free resources during shutdown
authorRaghu Vatsavayi <rvatsavayi@caviumnetworks.com>
Sun, 3 Jul 2016 20:56:52 +0000 (13:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Jul 2016 23:15:31 +0000 (16:15 -0700)
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>
drivers/net/ethernet/cavium/liquidio/cn66xx_device.c
drivers/net/ethernet/cavium/liquidio/lio_main.c
drivers/net/ethernet/cavium/liquidio/octeon_console.c
drivers/net/ethernet/cavium/liquidio/octeon_device.c

index ee40b47a0215665ebf84aecec5e90c19e9d74b26..6271c57255a6e60e7dd6aeb75291a728a8537e76 100644 (file)
@@ -64,9 +64,9 @@ void lio_cn6xxx_enable_error_reporting(struct octeon_device *oct)
        u32 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",
-                       val & 0x000f0000);
+                       val & 0x000c0000);
        }
 
        val |= 0xf;          /* Enable Link error reporting */
index a759cc9c204f9b3226ff540bcb83d179dbf2450c..e4e476f6344d28580098024225999da6ae22a4a3 100644 (file)
@@ -3957,6 +3957,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev)
                /* Release any previously allocated queues */
                for (j = 0; j < octeon_dev->num_oqs; j++)
                        octeon_delete_droq(octeon_dev, j);
+               return 1;
        }
 
        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
         */
-       octeon_setup_interrupt(octeon_dev);
+       if (octeon_setup_interrupt(octeon_dev))
+               return 1;
 
        /* Enable Octeon device interrupts */
        octeon_dev->fn_list.enable_interrupt(octeon_dev->chip);
index bceff8a263c74c00f2dbd0bc8250f8bd1e73bb70..70a8cd3cac1773b8a14ed2c83326ff064a3b55d3 100644 (file)
@@ -312,6 +312,9 @@ static u64 cvmx_bootmem_phy_named_block_find(struct octeon_device *oct,
                        if (name && named_size) {
                                char *name_tmp =
                                        kmalloc(name_length + 1, GFP_KERNEL);
+                               if (!name_tmp)
+                                       break;
+
                                CVMX_BOOTMEM_NAMED_GET_NAME(oct, named_addr,
                                                            name_tmp,
                                                            name_length);
index 046f0965fb2602eba6869b0485af56d465b00454..fda93be783e2d4bbb704ddc58d66b74d8eb425e5 100644 (file)
@@ -644,16 +644,16 @@ int octeon_download_firmware(struct octeon_device *oct, const u8 *data,
 
 void octeon_free_device_mem(struct octeon_device *oct)
 {
-       u32 i;
+       int 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++) {
-               /* 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;