OSDN Git Service

usb: gadget: renesas_usbhs: struct usbhs_pipe hold handler
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 11 Oct 2011 05:00:59 +0000 (22:00 -0700)
committerFelipe Balbi <balbi@ti.com>
Thu, 13 Oct 2011 17:41:36 +0000 (20:41 +0300)
packet handler had moved to struct usbhs_pipe from struct usbhsg_uep.
it is preparation of mod_host support

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/renesas_usbhs/fifo.c
drivers/usb/renesas_usbhs/fifo.h
drivers/usb/renesas_usbhs/mod_gadget.c
drivers/usb/renesas_usbhs/pipe.h

index 7eacacd..328238c 100644 (file)
@@ -54,7 +54,6 @@ static struct usbhs_pkt_handle usbhsf_null_handler = {
 };
 
 void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
-                   struct usbhs_pkt_handle *handler,
                    void *buf, int len, int zero)
 {
        struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
@@ -64,17 +63,22 @@ void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
        /********************  spin lock ********************/
        usbhs_lock(priv, flags);
 
-       if (!handler) {
+       if (!pipe->handler) {
                dev_err(dev, "no handler function\n");
-               handler = &usbhsf_null_handler;
+               pipe->handler = &usbhsf_null_handler;
        }
 
        list_del_init(&pkt->node);
        list_add_tail(&pkt->node, &pipe->list);
 
+       /*
+        * each pkt must hold own handler.
+        * because handler might be changed by its situation.
+        * dma handler -> pio handler.
+        */
        pkt->pipe       = pipe;
        pkt->buf        = buf;
-       pkt->handler    = handler;
+       pkt->handler    = pipe->handler;
        pkt->length     = len;
        pkt->zero       = zero;
        pkt->actual     = 0;
index 7a78440..60aa20f 100644 (file)
@@ -86,7 +86,6 @@ extern struct usbhs_pkt_handle usbhs_fifo_dma_pop_handler;
 
 void usbhs_pkt_init(struct usbhs_pkt *pkt);
 void usbhs_pkt_push(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt,
-                   struct usbhs_pkt_handle *handler,
                    void *buf, int len, int zero);
 struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt *pkt);
 void usbhs_pkt_start(struct usbhs_pipe *pipe);
index 5a697b7..babd90c 100644 (file)
@@ -39,7 +39,6 @@ struct usbhsg_uep {
        char ep_name[EP_NAME_SIZE];
 
        struct usbhsg_gpriv *gpriv;
-       struct usbhs_pkt_handle *handler;
 };
 
 struct usbhsg_gpriv {
@@ -139,8 +138,7 @@ static void usbhsg_queue_push(struct usbhsg_uep *uep,
 
        req->actual = 0;
        req->status = -EINPROGRESS;
-       usbhs_pkt_push(pipe, pkt, uep->handler,
-                      req->buf, req->length, req->zero);
+       usbhs_pkt_push(pipe, pkt, req->buf, req->length, req->zero);
 
        dev_dbg(dev, "pipe %d : queue push (%d)\n",
                usbhs_pipe_number(pipe),
@@ -389,13 +387,13 @@ static int usbhsg_irq_ctrl_stage(struct usbhs_priv *priv,
 
        switch (stage) {
        case READ_DATA_STAGE:
-               dcp->handler = &usbhs_fifo_pio_push_handler;
+               pipe->handler = &usbhs_fifo_pio_push_handler;
                break;
        case WRITE_DATA_STAGE:
-               dcp->handler = &usbhs_fifo_pio_pop_handler;
+               pipe->handler = &usbhs_fifo_pio_pop_handler;
                break;
        case NODATA_STATUS_STAGE:
-               dcp->handler = &usbhs_ctrl_stage_end_handler;
+               pipe->handler = &usbhs_ctrl_stage_end_handler;
                break;
        default:
                return ret;
@@ -501,9 +499,9 @@ static int usbhsg_ep_enable(struct usb_ep *ep,
                 * It will use pio handler if impossible.
                 */
                if (usb_endpoint_dir_in(desc))
-                       uep->handler = &usbhs_fifo_dma_push_handler;
+                       pipe->handler = &usbhs_fifo_dma_push_handler;
                else
-                       uep->handler = &usbhs_fifo_dma_pop_handler;
+                       pipe->handler = &usbhs_fifo_dma_pop_handler;
 
                ret = 0;
        }
index 1baa199..6760dff 100644 (file)
@@ -37,6 +37,8 @@ struct usbhs_pipe {
 #define USBHS_PIPE_FLAGS_IS_DIR_IN             (1 << 1)
 #define USBHS_PIPE_FLAGS_IS_DIR_HOST           (1 << 2)
 
+       struct usbhs_pkt_handle *handler;
+
        void *mod_private;
 };