Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f0248a9 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "usb: gadget: prevent sending packets to IPA when in suspend"

parents 32441ec1 2955018e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -3195,6 +3195,16 @@ int usb_bam_get_qdss_idx(u8 num)
}
EXPORT_SYMBOL(usb_bam_get_qdss_idx);

bool usb_bam_get_prod_granted(u8 idx)
{
	struct usb_bam_pipe_connect *pipe_connect = &usb_bam_connections[idx];
	enum usb_bam cur_bam = pipe_connect->bam_type;

	return (info[cur_bam].cur_prod_state == IPA_RM_RESOURCE_GRANTED);
}
EXPORT_SYMBOL(usb_bam_get_prod_granted);


void usb_bam_set_qdss_core(const char *qdss_core)
{
	strlcpy(ctx.qdss_core_name, qdss_core, USB_BAM_MAX_STR_LEN);
+13 −2
Original line number Diff line number Diff line
@@ -455,7 +455,8 @@ static void gbam_data_write_tobam(struct work_struct *w)
		return;
	}

	while (d->pending_with_bam < bam_pending_limit) {
	while (d->pending_with_bam < bam_pending_limit &&
	       usb_bam_get_prod_granted(d->dst_connection_idx)) {
		skb =  __skb_dequeue(&d->rx_skb_q);
		if (!skb)
			break;
@@ -568,8 +569,14 @@ gbam_epout_complete(struct usb_ep *ep, struct usb_request *req)
	}

	spin_lock(&port->port_lock_ul);

	if (queue) {
		__skb_queue_tail(&d->rx_skb_q, skb);
		if (!usb_bam_get_prod_granted(d->dst_connection_idx)) {
			list_add_tail(&req->list, &d->rx_idle);
			spin_unlock(&port->port_lock_ul);
			return;
		} else
			queue_work(gbam_wq, &d->write_tobam_w);
	}

@@ -686,6 +693,10 @@ static void gbam_start_rx(struct gbam_port *port)
			break;
		}
	}

	/* If this function was called from resume, send pending skbs to BAM */
	queue_work(gbam_wq, &d->write_tobam_w);

	spin_unlock_irqrestore(&port->port_lock_ul, flags);
}

+11 −2
Original line number Diff line number Diff line
@@ -255,6 +255,9 @@ static void bam_data_start_rx(struct bam_data_port *port)
		}
	}

	/* If this function was called from resume, send pending skbs to BAM */
	queue_work(bam_data_wq, &d->write_tobam_w);

	spin_unlock_irqrestore(&port->port_lock_ul, flags);
}

@@ -288,6 +291,11 @@ static void bam_data_epout_complete(struct usb_ep *ep, struct usb_request *req)
	spin_lock(&port->port_lock_ul);
	if (queue) {
		__skb_queue_tail(&d->rx_skb_q, skb);
		if (!usb_bam_get_prod_granted(d->dst_connection_idx)) {
			list_add_tail(&req->list, &d->rx_idle);
			spin_unlock(&port->port_lock_ul);
			return;
		} else
			queue_work(bam_data_wq, &d->write_tobam_w);
	}

@@ -373,7 +381,8 @@ static void bam_data_write_toipa(struct work_struct *w)
		return;
	}

	while (d->pending_with_bam < BAM_PENDING_LIMIT) {
	while (d->pending_with_bam < BAM_PENDING_LIMIT &&
	       usb_bam_get_prod_granted(d->dst_connection_idx)) {
		skb =  __skb_dequeue(&d->rx_skb_q);
		if (!skb)
			break;
+14 −0
Original line number Diff line number Diff line
@@ -388,6 +388,14 @@ int usb_bam_get_connection_idx(const char *name, enum peer_bam client,
* @return 0 on success, negative value on error
*/
int usb_bam_get_pipe_type(u8 idx, enum usb_bam_pipe_type *type);

/**
* Indicates whether USB producer is granted to IPA resource manager.
*
* @return true when producer granted, false when prodcuer is released.
*/
bool usb_bam_get_prod_granted(u8 idx);

#else
static inline int usb_bam_connect(u8 idx, u32 *bam_pipe_idx)
{
@@ -487,5 +495,11 @@ static inline int usb_bam_get_pipe_type(u8 idx, enum usb_bam_pipe_type *type)
{
	return -ENODEV;
}

static inline bool usb_bam_get_prod_granted(u8 idx)
{
	return false;
}

#endif
#endif				/* _USB_BAM_H_ */