|
@@ -110,8 +110,7 @@ static int setdma_rx(struct s3c_ep *ep, struct s3c_request *req)
|
|
|
|
|
|
ctrl = readl(®->out_endp[ep_num].doepctl);
|
|
|
|
|
|
- writel(the_controller->dma_addr[ep_index(ep)+1],
|
|
|
- ®->out_endp[ep_num].doepdma);
|
|
|
+ writel((unsigned int) ep->dma_buf, ®->out_endp[ep_num].doepdma);
|
|
|
writel(DOEPT_SIZ_PKT_CNT(pktcnt) | DOEPT_SIZ_XFER_SIZE(length),
|
|
|
®->out_endp[ep_num].doeptsiz);
|
|
|
writel(DEPCTL_EPENA|DEPCTL_CNAK|ctrl, ®->out_endp[ep_num].doepctl);
|
|
@@ -134,7 +133,6 @@ int setdma_tx(struct s3c_ep *ep, struct s3c_request *req)
|
|
|
u32 *buf, ctrl = 0;
|
|
|
u32 length, pktcnt;
|
|
|
u32 ep_num = ep_index(ep);
|
|
|
- u32 *p = the_controller->dma_buf[ep_index(ep)+1];
|
|
|
|
|
|
buf = req->req.buf + req->req.actual;
|
|
|
length = req->req.length - req->req.actual;
|
|
@@ -144,10 +142,10 @@ int setdma_tx(struct s3c_ep *ep, struct s3c_request *req)
|
|
|
|
|
|
ep->len = length;
|
|
|
ep->dma_buf = buf;
|
|
|
- memcpy(p, ep->dma_buf, length);
|
|
|
|
|
|
- flush_dcache_range((unsigned long) p ,
|
|
|
- (unsigned long) p + DMA_BUFFER_SIZE);
|
|
|
+ flush_dcache_range((unsigned long) ep->dma_buf,
|
|
|
+ (unsigned long) ep->dma_buf +
|
|
|
+ ROUND(ep->len, CONFIG_SYS_CACHELINE_SIZE));
|
|
|
|
|
|
if (length == 0)
|
|
|
pktcnt = 1;
|
|
@@ -160,8 +158,7 @@ int setdma_tx(struct s3c_ep *ep, struct s3c_request *req)
|
|
|
while (readl(®->grstctl) & TX_FIFO_FLUSH)
|
|
|
;
|
|
|
|
|
|
- writel(the_controller->dma_addr[ep_index(ep)+1],
|
|
|
- ®->in_endp[ep_num].diepdma);
|
|
|
+ writel((unsigned long) ep->dma_buf, ®->in_endp[ep_num].diepdma);
|
|
|
writel(DIEPT_SIZ_PKT_CNT(pktcnt) | DIEPT_SIZ_XFER_SIZE(length),
|
|
|
®->in_endp[ep_num].dieptsiz);
|
|
|
|
|
@@ -194,7 +191,6 @@ static void complete_rx(struct s3c_udc *dev, u8 ep_num)
|
|
|
struct s3c_ep *ep = &dev->ep[ep_num];
|
|
|
struct s3c_request *req = NULL;
|
|
|
u32 ep_tsr = 0, xfer_size = 0, is_short = 0;
|
|
|
- u32 *p = the_controller->dma_buf[ep_index(ep)+1];
|
|
|
|
|
|
if (list_empty(&ep->queue)) {
|
|
|
debug_cond(DEBUG_OUT_EP != 0,
|
|
@@ -214,10 +210,23 @@ static void complete_rx(struct s3c_udc *dev, u8 ep_num)
|
|
|
|
|
|
xfer_size = ep->len - xfer_size;
|
|
|
|
|
|
- invalidate_dcache_range((unsigned long) p,
|
|
|
- (unsigned long) p + DMA_BUFFER_SIZE);
|
|
|
-
|
|
|
- memcpy(ep->dma_buf, p, ep->len);
|
|
|
+ /*
|
|
|
+ * NOTE:
|
|
|
+ *
|
|
|
+ * Please be careful with proper buffer allocation for USB request,
|
|
|
+ * which needs to be aligned to CONFIG_SYS_CACHELINE_SIZE, not only
|
|
|
+ * with starting address, but also its size shall be a cache line
|
|
|
+ * multiplication.
|
|
|
+ *
|
|
|
+ * This will prevent from corruption of data allocated immediatelly
|
|
|
+ * before or after the buffer.
|
|
|
+ *
|
|
|
+ * For armv7, the cache_v7.c provides proper code to emit "ERROR"
|
|
|
+ * message to warn users.
|
|
|
+ */
|
|
|
+ invalidate_dcache_range((unsigned long) ep->dma_buf,
|
|
|
+ (unsigned long) ep->dma_buf +
|
|
|
+ ROUND(xfer_size, CONFIG_SYS_CACHELINE_SIZE));
|
|
|
|
|
|
req->req.actual += min(xfer_size, req->req.length - req->req.actual);
|
|
|
is_short = (xfer_size < ep->ep.maxpacket);
|
|
@@ -711,19 +720,14 @@ static int write_fifo_ep0(struct s3c_ep *ep, struct s3c_request *req)
|
|
|
|
|
|
int s3c_fifo_read(struct s3c_ep *ep, u32 *cp, int max)
|
|
|
{
|
|
|
- u32 bytes;
|
|
|
-
|
|
|
- bytes = sizeof(struct usb_ctrlrequest);
|
|
|
-
|
|
|
- invalidate_dcache_range((unsigned long) ep->dev->dma_buf[ep_index(ep)],
|
|
|
- (unsigned long) ep->dev->dma_buf[ep_index(ep)]
|
|
|
- + DMA_BUFFER_SIZE);
|
|
|
+ invalidate_dcache_range((unsigned long)cp, (unsigned long)cp +
|
|
|
+ ROUND(max, CONFIG_SYS_CACHELINE_SIZE));
|
|
|
|
|
|
debug_cond(DEBUG_EP0 != 0,
|
|
|
- "%s: bytes=%d, ep_index=%d %p\n", __func__,
|
|
|
- bytes, ep_index(ep), ep->dev->dma_buf[ep_index(ep)]);
|
|
|
+ "%s: bytes=%d, ep_index=%d 0x%p\n", __func__,
|
|
|
+ max, ep_index(ep), cp);
|
|
|
|
|
|
- return bytes;
|
|
|
+ return max;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -855,14 +859,12 @@ static int s3c_ep0_write(struct s3c_udc *dev)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-u16 g_status;
|
|
|
-
|
|
|
int s3c_udc_get_status(struct s3c_udc *dev,
|
|
|
struct usb_ctrlrequest *crq)
|
|
|
{
|
|
|
u8 ep_num = crq->wIndex & 0x7F;
|
|
|
+ u16 g_status = 0;
|
|
|
u32 ep_ctrl;
|
|
|
- u32 *p = the_controller->dma_buf[1];
|
|
|
|
|
|
debug_cond(DEBUG_SETUP != 0,
|
|
|
"%s: *** USB_REQ_GET_STATUS\n", __func__);
|
|
@@ -900,12 +902,13 @@ int s3c_udc_get_status(struct s3c_udc *dev,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
- memcpy(p, &g_status, sizeof(g_status));
|
|
|
+ memcpy(usb_ctrl, &g_status, sizeof(g_status));
|
|
|
|
|
|
- flush_dcache_range((unsigned long) p,
|
|
|
- (unsigned long) p + DMA_BUFFER_SIZE);
|
|
|
+ flush_dcache_range((unsigned long) usb_ctrl,
|
|
|
+ (unsigned long) usb_ctrl +
|
|
|
+ ROUND(sizeof(g_status), CONFIG_SYS_CACHELINE_SIZE));
|
|
|
|
|
|
- writel(the_controller->dma_addr[1], ®->in_endp[EP0_CON].diepdma);
|
|
|
+ writel(usb_ctrl_dma_addr, ®->in_endp[EP0_CON].diepdma);
|
|
|
writel(DIEPT_SIZ_PKT_CNT(1) | DIEPT_SIZ_XFER_SIZE(2),
|
|
|
®->in_endp[EP0_CON].dieptsiz);
|
|
|
|