/* Ring channel doorbell */
        writel(1, bp->bar0 + 0x100);
 
+       if (!timeout)
+               timeout = DFLT_HWRM_CMD_TIMEOUT;
+
        i = 0;
        if (intr_process) {
                /* Wait until hwrm response cmpl interrupt is processed */
                 resp->hwrm_fw_maj, resp->hwrm_fw_min, resp->hwrm_fw_bld,
                 resp->hwrm_intf_maj, resp->hwrm_intf_min, resp->hwrm_intf_upd);
 
+       bp->hwrm_cmd_timeout = le16_to_cpu(resp->def_req_timeout);
+       if (!bp->hwrm_cmd_timeout)
+               bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT;
+
 hwrm_ver_get_exit:
        mutex_unlock(&bp->hwrm_cmd_lock);
        return rc;
 
 #define RING_CMP(idx)          ((idx) & bp->cp_ring_mask)
 #define NEXT_CMP(idx)          RING_CMP(ADV_RAW_CMP(idx, 1))
 
-#define HWRM_CMD_TIMEOUT               500
+#define DFLT_HWRM_CMD_TIMEOUT          500
+#define HWRM_CMD_TIMEOUT               (bp->hwrm_cmd_timeout)
 #define HWRM_RESET_TIMEOUT             ((HWRM_CMD_TIMEOUT) * 4)
 #define HWRM_RESP_ERR_CODE_MASK                0xffff
 #define HWRM_RESP_LEN_MASK             0xffff0000
        void                    *hwrm_dbg_resp_addr;
        dma_addr_t              hwrm_dbg_resp_dma_addr;
 #define HWRM_DBG_REG_BUF_SIZE  128
+       int                     hwrm_cmd_timeout;
        struct mutex            hwrm_cmd_lock;  /* serialize hwrm messages */
        struct hwrm_ver_get_output      ver_resp;
 #define FW_VER_STR_LEN         32