struct qla_hw_data *ha = vha->hw;
        mbx_cmd_t mc;
        mbx_cmd_t *mcp = &mc;
+       u8 semaphore = 0;
+#define EXE_FW_FORCE_SEMAPHORE BIT_7
+       u8 retry = 3;
 
        ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1025,
            "Entered %s.\n", __func__);
 
+again:
        mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
        mcp->out_mb = MBX_0;
        mcp->in_mb = MBX_0;
                if (ha->flags.exchoffld_enabled)
                        mcp->mb[4] |= ENABLE_EXCHANGE_OFFLD;
 
+               if (semaphore)
+                       mcp->mb[11] |= EXE_FW_FORCE_SEMAPHORE;
+
                mcp->out_mb |= MBX_4 | MBX_3 | MBX_2 | MBX_1 | MBX_11;
                mcp->in_mb |= MBX_3 | MBX_2 | MBX_1;
        } else {
        rval = qla2x00_mailbox_command(vha, mcp);
 
        if (rval != QLA_SUCCESS) {
+               if (IS_QLA28XX(ha) && rval == QLA_COMMAND_ERROR &&
+                   mcp->mb[1] == 0x27 && retry) {
+                       semaphore = 1;
+                       retry--;
+                       ql_dbg(ql_dbg_async, vha, 0x1026,
+                           "Exe FW: force semaphore.\n");
+                       goto again;
+               }
+
                ql_dbg(ql_dbg_mbx, vha, 0x1026,
                    "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]);
                return rval;