Commit 1e0d30fe authored by Raghu Vatsavayi's avatar Raghu Vatsavayi Committed by David S. Miller

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: default avatarDerek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: default avatarRaghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3dcef2ca
...@@ -64,9 +64,9 @@ void lio_cn6xxx_enable_error_reporting(struct octeon_device *oct) ...@@ -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 */
......
...@@ -3957,6 +3957,7 @@ static int octeon_device_init(struct octeon_device *octeon_dev) ...@@ -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) ...@@ -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);
......
...@@ -312,6 +312,9 @@ static u64 cvmx_bootmem_phy_named_block_find(struct octeon_device *oct, ...@@ -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);
......
...@@ -644,16 +644,16 @@ int octeon_download_firmware(struct octeon_device *oct, const u8 *data, ...@@ -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 */ if (oct->io_qmask.oq & (1ULL << i))
vfree(oct->droq[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 */ if (oct->io_qmask.iq & (1ULL << i))
vfree(oct->instr_queue[i]); vfree(oct->instr_queue[i]);
} }
i = oct->octeon_id; i = oct->octeon_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment