*buf++ = htons(RD_REG_WORD(dmp_reg++));
 }
 
+static inline void *
+qla24xx_copy_eft(struct qla_hw_data *ha, void *ptr)
+{
+       if (!ha->eft)
+               return ptr;
+
+       memcpy(ptr, ha->eft, ntohl(ha->fw_dump->eft_size));
+       return ptr + ntohl(ha->fw_dump->eft_size);
+}
+
+static inline void *
+qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
+{
+       uint32_t cnt;
+       uint32_t *iter_reg;
+       struct qla2xxx_fce_chain *fcec = ptr;
+
+       if (!ha->fce)
+               return ptr;
+
+       *last_chain = &fcec->type;
+       fcec->type = __constant_htonl(DUMP_CHAIN_FCE);
+       fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) +
+           fce_calc_size(ha->fce_bufs));
+       fcec->size = htonl(fce_calc_size(ha->fce_bufs));
+       fcec->addr_l = htonl(LSD(ha->fce_dma));
+       fcec->addr_h = htonl(MSD(ha->fce_dma));
+
+       iter_reg = fcec->eregs;
+       for (cnt = 0; cnt < 8; cnt++)
+               *iter_reg++ = htonl(ha->fce_mb[cnt]);
+
+       memcpy(iter_reg, ha->fce, ntohl(fcec->size));
+
+       return iter_reg;
+}
+
 /**
  * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
  * @ha: HA context
                goto qla24xx_fw_dump_failed_0;
 
        nxt = qla2xxx_copy_queues(ha, nxt);
-       if (ha->eft)
-               memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));
+
+       qla24xx_copy_eft(ha, nxt);
 
 qla24xx_fw_dump_failed_0:
        if (rval != QLA_SUCCESS) {
        struct qla25xx_fw_dump *fw;
        uint32_t        ext_mem_cnt;
        void            *nxt;
-       struct qla2xxx_fce_chain *fcec;
+       uint32_t        *last_chain = NULL;
        struct qla2xxx_mq_chain *mq = NULL;
        uint32_t        qreg_size;
        uint8_t         req_cnt, rsp_cnt, que_cnt;
                que_cnt = req_cnt > rsp_cnt ? req_cnt : rsp_cnt;
                mq->count = htonl(que_cnt);
                mq->chain_size = htonl(qreg_size);
+               last_chain = &mq->type;
                mq->type = __constant_htonl(DUMP_CHAIN_MQ);
                for (cnt = 0; cnt < que_cnt; cnt++) {
                        reg25 = (struct device_reg_25xxmq *) ((void *)
        if (rval != QLA_SUCCESS)
                goto qla25xx_fw_dump_failed_0;
 
-       /* Fibre Channel Trace Buffer. */
        nxt = qla2xxx_copy_queues(ha, nxt);
-       if (ha->eft)
-               memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));
 
-       /* Fibre Channel Event Buffer. */
-       if (!ha->fce)
-               goto qla25xx_fw_dump_failed_0;
-
-       ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT);
+       nxt = qla24xx_copy_eft(ha, nxt);
 
+       /* Chain entries. */
        if (ha->mqenable) {
-               nxt = nxt + ntohl(ha->fw_dump->eft_size);
                memcpy(nxt, mq, qreg_size);
                kfree(mq);
-               fcec = nxt + qreg_size;
-       } else {
-               fcec = nxt + ntohl(ha->fw_dump->eft_size);
+               nxt += qreg_size;
        }
-       fcec->type = __constant_htonl(DUMP_CHAIN_FCE | DUMP_CHAIN_LAST);
-       fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) +
-           fce_calc_size(ha->fce_bufs));
-       fcec->size = htonl(fce_calc_size(ha->fce_bufs));
-       fcec->addr_l = htonl(LSD(ha->fce_dma));
-       fcec->addr_h = htonl(MSD(ha->fce_dma));
-
-       iter_reg = fcec->eregs;
-       for (cnt = 0; cnt < 8; cnt++)
-               *iter_reg++ = htonl(ha->fce_mb[cnt]);
 
-       memcpy(iter_reg, ha->fce, ntohl(fcec->size));
+       qla25xx_copy_fce(ha, nxt, &last_chain);
+       if (last_chain) {
+               ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT);
+               *last_chain |= __constant_htonl(DUMP_CHAIN_LAST);
+       }
 
 qla25xx_fw_dump_failed_0:
        if (rval != QLA_SUCCESS) {