qlcnic: Skip unknown entry type while collecting firmware dump
authorShahed Shaikh <shahed.shaikh@qlogic.com>
Fri, 18 Oct 2013 16:22:34 +0000 (12:22 -0400)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Oct 2013 17:42:19 +0000 (13:42 -0400)
o Driver aborts the minidump collection operation when it finds
  an unknown entry opcode. This patch skips unknown entry type
  and resumes the minidump collection operation.
o Removed a comparision of collected dump size with expected dump size.
  Size may differ when driver decides to skip an entry.

Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c

index 15513608d4808851917f1b5294e7733a5c4ea5cd..7763962e2ec4e9128ae22cf7b8ee694248d8058d 100644 (file)
@@ -1187,41 +1187,38 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
                }
 
                if (ops_index == ops_cnt) {
-                       dev_info(&adapter->pdev->dev,
-                                "Invalid entry type %d, exiting dump\n",
+                       dev_info(dev, "Skipping unknown entry opcode %d\n",
                                 entry->hdr.type);
-                       goto error;
+                       entry->hdr.flags |= QLCNIC_DUMP_SKIP;
+                       entry_offset += entry->hdr.offset;
+                       continue;
                }
 
                /* Collect dump for this entry */
                dump = fw_dump_ops[ops_index].handler(adapter, entry, buffer);
-               if (!qlcnic_valid_dump_entry(&adapter->pdev->dev, entry, dump))
+               if (!qlcnic_valid_dump_entry(dev, entry, dump)) {
                        entry->hdr.flags |= QLCNIC_DUMP_SKIP;
+                       entry_offset += entry->hdr.offset;
+                       continue;
+               }
+
                buf_offset += entry->hdr.cap_size;
                entry_offset += entry->hdr.offset;
                buffer = fw_dump->data + buf_offset;
        }
-       if (dump_size != buf_offset) {
-               dev_info(&adapter->pdev->dev,
-                        "Captured(%d) and expected size(%d) do not match\n",
-                        buf_offset, dump_size);
-               goto error;
-       } else {
-               fw_dump->clr = 1;
-               snprintf(mesg, sizeof(mesg), "FW_DUMP=%s",
-                        adapter->netdev->name);
-               dev_info(&adapter->pdev->dev, "%s: Dump data, %d bytes captured\n",
-                        adapter->netdev->name, fw_dump->size);
-               /* Send a udev event to notify availability of FW dump */
-               kobject_uevent_env(&adapter->pdev->dev.kobj, KOBJ_CHANGE, msg);
-               return 0;
-       }
-error:
+
+       fw_dump->clr = 1;
+       snprintf(mesg, sizeof(mesg), "FW_DUMP=%s", adapter->netdev->name);
+       dev_info(dev, "%s: Dump data %d bytes captured, template header size %d bytes\n",
+                adapter->netdev->name, fw_dump->size, tmpl_hdr->size);
+       /* Send a udev event to notify availability of FW dump */
+       kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg);
+
        if (fw_dump->use_pex_dma)
                dma_free_coherent(dev, QLC_PEX_DMA_READ_SIZE,
                                  fw_dump->dma_buffer, fw_dump->phys_addr);
-       vfree(fw_dump->data);
-       return -EINVAL;
+
+       return 0;
 }
 
 void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *adapter)