* @ep0_buff: Buffer for EP0 reply data, if needed.
  * @ctrl_buff: Buffer for EP0 control requests.
  * @ctrl_req: Request for EP0 control packets.
+ * @setup: NAK management for EP0 SETUP
  * @eps: The endpoints being supplied to the gadget framework
  */
 struct s3c_hsotg {
        u8                      ctrl_buff[8];
 
        struct usb_gadget       gadget;
+       unsigned int            setup;
        struct s3c_hsotg_ep     eps[];
 };
 
        }
 
        length = ureq->length - ureq->actual;
-
+       dev_dbg(hsotg->dev, "ureq->length:%d ureq->actual:%d\n",
+               ureq->length, ureq->actual);
        if (0)
                dev_dbg(hsotg->dev,
                        "REQ buf %p len %d dma 0x%08x noi=%d zp=%d snok=%d\n",
 
        ctrl |= S3C_DxEPCTL_EPEna;      /* ensure ep enabled */
        ctrl |= S3C_DxEPCTL_USBActEp;
-       ctrl |= S3C_DxEPCTL_CNAK;       /* clear NAK set by core */
+
+       dev_dbg(hsotg->dev, "setup req:%d\n", hsotg->setup);
+
+       /* For Setup request do not clear NAK */
+       if (hsotg->setup && index == 0)
+               hsotg->setup = 0;
+       else
+               ctrl |= S3C_DxEPCTL_CNAK;       /* clear NAK set by core */
+
 
        dev_dbg(hsotg->dev, "%s: DxEPCTL=0x%08x\n", __func__, ctrl);
        writel(ctrl, hsotg->regs + epctrl_reg);
        if (req->actual < req->length && size_left == 0) {
                s3c_hsotg_start_req(hsotg, hs_ep, hs_req, true);
                return;
+       } else if (epnum == 0) {
+               /*
+                * After was_setup = 1 =>
+                * set CNAK for non Setup requests
+                */
+               hsotg->setup = was_setup ? 0 : 1;
        }
 
        if (req->actual < req->length && req->short_not_ok) {