rq = esas2r_alloc_request(a);
        if (rq == NULL) {
-               up(&a->fm_api_semaphore);
                fi->status = FI_STAT_BUSY;
-               return;
+               goto free_sem;
        }
 
        if (fi == &a->firmware.header) {
                if (a->firmware.header_buff == NULL) {
                        esas2r_debug("failed to allocate header buffer!");
                        fi->status = FI_STAT_BUSY;
-                       return;
+                       goto free_req;
                }
 
                memcpy(a->firmware.header_buff, fi,
                                  a->firmware.header_buff,
                                  (dma_addr_t)a->firmware.header_buff_phys);
        }
-
-       up(&a->fm_api_semaphore);
+free_req:
        esas2r_free_request(a, (struct esas2r_request *)rq);
+free_sem:
+       up(&a->fm_api_semaphore);
        return;
 
 }