rval = QLA_SUCCESS;
 
        /* Try GID_PT to get device list, else GAN. */
-       swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), GFP_KERNEL);
+       if (!ha->swl)
+               ha->swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t),
+                   GFP_KERNEL);
+       swl = ha->swl;
        if (!swl) {
                /*EMPTY*/
                ql_dbg(ql_dbg_disc, vha, 0x2054,
                    "GID_PT allocations failed, fallback on GA_NXT.\n");
        } else {
+               memset(swl, 0, MAX_FIBRE_DEVICES * sizeof(sw_info_t));
                if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
-                       kfree(swl);
                        swl = NULL;
                } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
-                       kfree(swl);
                        swl = NULL;
                } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) {
-                       kfree(swl);
                        swl = NULL;
                } else if (ql2xiidmaenable &&
                    qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) {
        if (new_fcport == NULL) {
                ql_log(ql_log_warn, vha, 0x205e,
                    "Failed to allocate memory for fcport.\n");
-               kfree(swl);
                return (QLA_MEMORY_ALLOC_FAILED);
        }
        new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
                if (new_fcport == NULL) {
                        ql_log(ql_log_warn, vha, 0x2066,
                            "Memory allocation failed for fcport.\n");
-                       kfree(swl);
                        return (QLA_MEMORY_ALLOC_FAILED);
                }
                new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
                new_fcport->d_id.b24 = nxt_d_id.b24;
        }
 
-       kfree(swl);
        kfree(new_fcport);
 
        return (rval);