diff options
Diffstat (limited to 'drivers/usb/cdns3')
| -rw-r--r-- | drivers/usb/cdns3/cdns3-gadget.c | 20 | ||||
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-gadget.c | 12 | ||||
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-mem.c | 3 | ||||
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-ring.c | 11 | ||||
| -rw-r--r-- | drivers/usb/cdns3/cdnsp-trace.h | 4 | ||||
| -rw-r--r-- | drivers/usb/cdns3/host.c | 1 | 
6 files changed, 32 insertions, 19 deletions
| diff --git a/drivers/usb/cdns3/cdns3-gadget.c b/drivers/usb/cdns3/cdns3-gadget.c index 1f3b4a142212..f9af7ebe003d 100644 --- a/drivers/usb/cdns3/cdns3-gadget.c +++ b/drivers/usb/cdns3/cdns3-gadget.c @@ -337,19 +337,6 @@ static void cdns3_ep_inc_deq(struct cdns3_endpoint *priv_ep)  	cdns3_ep_inc_trb(&priv_ep->dequeue, &priv_ep->ccs, priv_ep->num_trbs);  } -static void cdns3_move_deq_to_next_trb(struct cdns3_request *priv_req) -{ -	struct cdns3_endpoint *priv_ep = priv_req->priv_ep; -	int current_trb = priv_req->start_trb; - -	while (current_trb != priv_req->end_trb) { -		cdns3_ep_inc_deq(priv_ep); -		current_trb = priv_ep->dequeue; -	} - -	cdns3_ep_inc_deq(priv_ep); -} -  /**   * cdns3_allow_enable_l1 - enable/disable permits to transition to L1.   * @priv_dev: Extended gadget object @@ -1517,10 +1504,11 @@ static void cdns3_transfer_completed(struct cdns3_device *priv_dev,  		trb = priv_ep->trb_pool + priv_ep->dequeue; -		/* Request was dequeued and TRB was changed to TRB_LINK. */ -		if (TRB_FIELD_TO_TYPE(le32_to_cpu(trb->control)) == TRB_LINK) { +		/* The TRB was changed as link TRB, and the request was handled at ep_dequeue */ +		while (TRB_FIELD_TO_TYPE(le32_to_cpu(trb->control)) == TRB_LINK) {  			trace_cdns3_complete_trb(priv_ep, trb); -			cdns3_move_deq_to_next_trb(priv_req); +			cdns3_ep_inc_deq(priv_ep); +			trb = priv_ep->trb_pool + priv_ep->dequeue;  		}  		if (!request->stream_id) { diff --git a/drivers/usb/cdns3/cdnsp-gadget.c b/drivers/usb/cdns3/cdnsp-gadget.c index 27df0c697897..e85bf768c66d 100644 --- a/drivers/usb/cdns3/cdnsp-gadget.c +++ b/drivers/usb/cdns3/cdnsp-gadget.c @@ -1541,15 +1541,27 @@ static int cdnsp_gadget_pullup(struct usb_gadget *gadget, int is_on)  {  	struct cdnsp_device *pdev = gadget_to_cdnsp(gadget);  	struct cdns *cdns = dev_get_drvdata(pdev->dev); +	unsigned long flags;  	trace_cdnsp_pullup(is_on); +	/* +	 * Disable events handling while controller is being +	 * enabled/disabled. +	 */ +	disable_irq(cdns->dev_irq); +	spin_lock_irqsave(&pdev->lock, flags); +  	if (!is_on) {  		cdnsp_reset_device(pdev);  		cdns_clear_vbus(cdns);  	} else {  		cdns_set_vbus(cdns);  	} + +	spin_unlock_irqrestore(&pdev->lock, flags); +	enable_irq(cdns->dev_irq); +  	return 0;  } diff --git a/drivers/usb/cdns3/cdnsp-mem.c b/drivers/usb/cdns3/cdnsp-mem.c index ad9aee3f1e39..97866bfb2da9 100644 --- a/drivers/usb/cdns3/cdnsp-mem.c +++ b/drivers/usb/cdns3/cdnsp-mem.c @@ -987,6 +987,9 @@ int cdnsp_endpoint_init(struct cdnsp_device *pdev,  	/* Set up the endpoint ring. */  	pep->ring = cdnsp_ring_alloc(pdev, 2, ring_type, max_packet, mem_flags); +	if (!pep->ring) +		return -ENOMEM; +  	pep->skip = false;  	/* Fill the endpoint context */ diff --git a/drivers/usb/cdns3/cdnsp-ring.c b/drivers/usb/cdns3/cdnsp-ring.c index 1b1438457fb0..e45c3d6e1536 100644 --- a/drivers/usb/cdns3/cdnsp-ring.c +++ b/drivers/usb/cdns3/cdnsp-ring.c @@ -1029,6 +1029,8 @@ static void cdnsp_process_ctrl_td(struct cdnsp_device *pdev,  		return;  	} +	*status = 0; +  	cdnsp_finish_td(pdev, td, event, pep, status);  } @@ -1523,7 +1525,14 @@ irqreturn_t cdnsp_thread_irq_handler(int irq, void *data)  	spin_lock_irqsave(&pdev->lock, flags);  	if (pdev->cdnsp_state & (CDNSP_STATE_HALTED | CDNSP_STATE_DYING)) { -		cdnsp_died(pdev); +		/* +		 * While removing or stopping driver there may still be deferred +		 * not handled interrupt which should not be treated as error. +		 * Driver should simply ignore it. +		 */ +		if (pdev->gadget_driver) +			cdnsp_died(pdev); +  		spin_unlock_irqrestore(&pdev->lock, flags);  		return IRQ_HANDLED;  	} diff --git a/drivers/usb/cdns3/cdnsp-trace.h b/drivers/usb/cdns3/cdnsp-trace.h index 6a2571c6aa9e..5983dfb99653 100644 --- a/drivers/usb/cdns3/cdnsp-trace.h +++ b/drivers/usb/cdns3/cdnsp-trace.h @@ -57,9 +57,9 @@ DECLARE_EVENT_CLASS(cdnsp_log_ep,  		__entry->first_prime_det = pep->stream_info.first_prime_det;  		__entry->drbls_count = pep->stream_info.drbls_count;  	), -	TP_printk("%s: SID: %08x ep state: %x stream: enabled: %d num  %d " +	TP_printk("%s: SID: %08x, ep state: %x, stream: enabled: %d num %d "  		  "tds %d, first prime: %d drbls %d", -		  __get_str(name), __entry->state, __entry->stream_id, +		  __get_str(name), __entry->stream_id, __entry->state,  		  __entry->enabled, __entry->num_streams, __entry->td_count,  		  __entry->first_prime_det, __entry->drbls_count)  ); diff --git a/drivers/usb/cdns3/host.c b/drivers/usb/cdns3/host.c index 84dadfa726aa..9643b905e2d8 100644 --- a/drivers/usb/cdns3/host.c +++ b/drivers/usb/cdns3/host.c @@ -10,6 +10,7 @@   */  #include <linux/platform_device.h> +#include <linux/slab.h>  #include "core.h"  #include "drd.h"  #include "host-export.h" |