diff options
author | Ralph Campbell <ralph.campbell@qlogic.com> | 2010-07-01 22:25:45 +0200 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2010-07-06 23:14:04 +0200 |
commit | 756a33b8dc3ed5c27685a130339de8a894d528a7 (patch) | |
tree | 1434ca4afa40f03d935b6563a4f4acdd4aef24bb /drivers | |
parent | IB/qib: Completion queue callback needs to be single threaded (diff) | |
download | linux-756a33b8dc3ed5c27685a130339de8a894d528a7.tar.xz linux-756a33b8dc3ed5c27685a130339de8a894d528a7.zip |
IB/qib: Clean up properly if qib_init() fails
If qib_init() fails, the driver fails to free memory, unregister
device files, and unregister with the PCIe framework. The driver will
unload without error but a subsequent driver load will cause the
system to panic. This was found by changing the 7220 code to load the
serdes microcode separately and not installing the microcode file.
Signed-off-by: Ralph Campbell <ralph.campbell@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_init.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c index 7831ff835d15..a873dd596e81 100644 --- a/drivers/infiniband/hw/qib/qib_init.c +++ b/drivers/infiniband/hw/qib/qib_init.c @@ -1289,8 +1289,18 @@ static int __devinit qib_init_one(struct pci_dev *pdev, if (qib_mini_init || initfail || ret) { qib_stop_timers(dd); + flush_scheduled_work(); for (pidx = 0; pidx < dd->num_pports; ++pidx) dd->f_quiet_serdes(dd->pport + pidx); + if (qib_mini_init) + goto bail; + if (!j) { + (void) qibfs_remove(dd); + qib_device_remove(dd); + } + if (!ret) + qib_unregister_ib_device(dd); + qib_postinit_cleanup(dd); if (initfail) ret = initfail; goto bail; |