return;
        }
 
-       if (totlen > MAX_PAYLOAD) {
+       if (totlen > ELS_MAX_PAYLOAD) {
                ql_dbg(ql_dbg_edif, vha, 0x0910d,
                    "%s WARNING: verbose ELS frame received (totlen=%x)\n",
                    __func__, totlen);
 
 };
 
 #define        NUM_ENTRIES     256
-#define        MAX_PAYLOAD     1024
 #define        PUR_GET         1
 
 struct dinfo {
        } u;
 };
 
+#define RX_ELS_SIZE (roundup(sizeof(struct enode) + ELS_MAX_PAYLOAD, SMP_CACHE_BYTES))
+
 #define EDIF_SESSION_DOWN(_s) \
        (qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \
         _s->disc_state == DSC_DELETED || \
 
 #define __QLA_EDIF_BSG_H
 
 /* BSG Vendor specific commands */
-#define        ELS_MAX_PAYLOAD         1024
+#define        ELS_MAX_PAYLOAD         2112
 #ifndef        WWN_SIZE
 #define WWN_SIZE               8
 #endif
 
                    (ha->flags.fawwpn_enabled) ? "enabled" : "disabled");
        }
 
+       /* ELS pass through payload is limit by frame size. */
+       if (ha->flags.edif_enabled)
+               mid_init_cb->init_cb.frame_payload_size = cpu_to_le16(ELS_MAX_PAYLOAD);
+
        rval = qla2x00_init_firmware(vha, ha->init_cb_size);
 next_check:
        if (rval) {
 
 
        /* allocate the purex dma pool */
        ha->purex_dma_pool = dma_pool_create(name, &ha->pdev->dev,
-           MAX_PAYLOAD, 8, 0);
+           ELS_MAX_PAYLOAD, 8, 0);
 
        if (!ha->purex_dma_pool) {
                ql_dbg_pci(ql_dbg_init, ha->pdev, 0x011b,