Commit 3e5c6dc7 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Greg Kroah-Hartman

musb_host: factor out musb_ep_{get|set}_qh()

Factor out the often used code to get/set the active 'qh'
pointer for the hardware endpoint.  Change the way the case
of a shared FIFO is handled by setting *both* 'in_qh' and
'out_qh' fields of 'struct musb_hw_ep'.  That seems more
consistent and makes getting to the current 'qh' easy when
the code knows the direction beforehand.

While at it, turn some assignments into intializers and
fix declaration style in the vicinity.
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 846099a6
...@@ -181,6 +181,19 @@ static inline void musb_h_tx_dma_start(struct musb_hw_ep *ep) ...@@ -181,6 +181,19 @@ static inline void musb_h_tx_dma_start(struct musb_hw_ep *ep)
musb_writew(ep->regs, MUSB_TXCSR, txcsr); musb_writew(ep->regs, MUSB_TXCSR, txcsr);
} }
static void musb_ep_set_qh(struct musb_hw_ep *ep, int is_in, struct musb_qh *qh)
{
if (is_in != 0 || ep->is_shared_fifo)
ep->in_qh = qh;
if (is_in == 0 || ep->is_shared_fifo)
ep->out_qh = qh;
}
static struct musb_qh *musb_ep_get_qh(struct musb_hw_ep *ep, int is_in)
{
return is_in ? ep->in_qh : ep->out_qh;
}
/* /*
* Start the URB at the front of an endpoint's queue * Start the URB at the front of an endpoint's queue
* end must be claimed from the caller. * end must be claimed from the caller.
...@@ -210,7 +223,6 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) ...@@ -210,7 +223,6 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
case USB_ENDPOINT_XFER_CONTROL: case USB_ENDPOINT_XFER_CONTROL:
/* control transfers always start with SETUP */ /* control transfers always start with SETUP */
is_in = 0; is_in = 0;
hw_ep->out_qh = qh;
musb->ep0_stage = MUSB_EP0_START; musb->ep0_stage = MUSB_EP0_START;
buf = urb->setup_packet; buf = urb->setup_packet;
len = 8; len = 8;
...@@ -239,10 +251,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh) ...@@ -239,10 +251,7 @@ musb_start_urb(struct musb *musb, int is_in, struct musb_qh *qh)
epnum, buf + offset, len); epnum, buf + offset, len);
/* Configure endpoint */ /* Configure endpoint */
if (is_in || hw_ep->is_shared_fifo) musb_ep_set_qh(hw_ep, is_in, qh);
hw_ep->in_qh = qh;
else
hw_ep->out_qh = qh;
musb_ep_program(musb, epnum, urb, !is_in, buf, offset, len); musb_ep_program(musb, epnum, urb, !is_in, buf, offset, len);
/* transmit may have more work: start it when it is time */ /* transmit may have more work: start it when it is time */
...@@ -377,11 +386,8 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) ...@@ -377,11 +386,8 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
else else
ep->tx_reinit = 1; ep->tx_reinit = 1;
/* clobber old pointers to this qh */ /* Clobber old pointers to this qh */
if (is_in || ep->is_shared_fifo) musb_ep_set_qh(ep, is_in, NULL);
ep->in_qh = NULL;
else
ep->out_qh = NULL;
qh->hep->hcpriv = NULL; qh->hep->hcpriv = NULL;
switch (qh->type) { switch (qh->type) {
...@@ -424,12 +430,7 @@ static void ...@@ -424,12 +430,7 @@ static void
musb_advance_schedule(struct musb *musb, struct urb *urb, musb_advance_schedule(struct musb *musb, struct urb *urb,
struct musb_hw_ep *hw_ep, int is_in) struct musb_hw_ep *hw_ep, int is_in)
{ {
struct musb_qh *qh; struct musb_qh *qh = musb_ep_get_qh(hw_ep, is_in);
if (is_in || hw_ep->is_shared_fifo)
qh = hw_ep->in_qh;
else
qh = hw_ep->out_qh;
if (urb->status == -EINPROGRESS) if (urb->status == -EINPROGRESS)
qh = musb_giveback(qh, urb, 0); qh = musb_giveback(qh, urb, 0);
...@@ -692,15 +693,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum, ...@@ -692,15 +693,8 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
void __iomem *mbase = musb->mregs; void __iomem *mbase = musb->mregs;
struct musb_hw_ep *hw_ep = musb->endpoints + epnum; struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
void __iomem *epio = hw_ep->regs; void __iomem *epio = hw_ep->regs;
struct musb_qh *qh; struct musb_qh *qh = musb_ep_get_qh(hw_ep, !is_out);
u16 packet_sz; u16 packet_sz = qh->maxpacket;
if (!is_out || hw_ep->is_shared_fifo)
qh = hw_ep->in_qh;
else
qh = hw_ep->out_qh;
packet_sz = qh->maxpacket;
DBG(3, "%s hw%d urb %p spd%d dev%d ep%d%s " DBG(3, "%s hw%d urb %p spd%d dev%d ep%d%s "
"h_addr%02x h_port%02x bytes %d\n", "h_addr%02x h_port%02x bytes %d\n",
...@@ -1118,17 +1112,14 @@ void musb_host_tx(struct musb *musb, u8 epnum) ...@@ -1118,17 +1112,14 @@ void musb_host_tx(struct musb *musb, u8 epnum)
u16 tx_csr; u16 tx_csr;
size_t length = 0; size_t length = 0;
size_t offset = 0; size_t offset = 0;
struct urb *urb;
struct musb_hw_ep *hw_ep = musb->endpoints + epnum; struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
void __iomem *epio = hw_ep->regs; void __iomem *epio = hw_ep->regs;
struct musb_qh *qh = hw_ep->is_shared_fifo ? hw_ep->in_qh struct musb_qh *qh = hw_ep->out_qh;
: hw_ep->out_qh; struct urb *urb = next_urb(qh);
u32 status = 0; u32 status = 0;
void __iomem *mbase = musb->mregs; void __iomem *mbase = musb->mregs;
struct dma_channel *dma; struct dma_channel *dma;
urb = next_urb(qh);
musb_ep_select(mbase, epnum); musb_ep_select(mbase, epnum);
tx_csr = musb_readw(epio, MUSB_TXCSR); tx_csr = musb_readw(epio, MUSB_TXCSR);
...@@ -1806,10 +1797,7 @@ static int musb_schedule( ...@@ -1806,10 +1797,7 @@ static int musb_schedule(
epnum++, hw_ep++) { epnum++, hw_ep++) {
int diff; int diff;
if (is_in || hw_ep->is_shared_fifo) { if (musb_ep_get_qh(hw_ep, is_in) != NULL)
if (hw_ep->in_qh != NULL)
continue;
} else if (hw_ep->out_qh != NULL)
continue; continue;
if (hw_ep == musb->bulk_ep) if (hw_ep == musb->bulk_ep)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment