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

Commit 7ac8839a 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: Add support for rndis flow control callback"

parents 86577a24 c4326337
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -984,7 +984,8 @@ rndis_qc_bind(struct usb_configuration *c, struct usb_function *f)
	rndis->port.open = rndis_qc_open;
	rndis->port.close = rndis_qc_close;

	status = rndis_register(rndis_qc_response_available, rndis);
	status = rndis_register(rndis_qc_response_available, rndis,
			bam_data_flow_control_enable);
	if (status < 0)
		goto fail;
	rndis->config = status;
@@ -1082,11 +1083,6 @@ rndis_qc_unbind(struct usb_configuration *c, struct usb_function *f)
	spin_unlock_irqrestore(&rndis_lock, flags);
}

bool is_rndis_ipa_supported(void)
{
	return rndis_ipa_supported;
}

void rndis_ipa_reset_trigger(void)
{
	struct f_rndis_qc *rndis;
+2 −2
Original line number Diff line number Diff line
@@ -1010,7 +1010,7 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
	rndis->port.func.setup = rndis_setup;
	rndis->port.func.disable = rndis_disable;

	status = rndis_register(rndis_response_available, rndis);
	status = rndis_register(rndis_response_available, rndis, NULL);
	if (status < 0) {
		kfree(rndis);
		return status;
@@ -1186,7 +1186,7 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
	rndis->port.func.disable = rndis_disable;
	rndis->port.func.free_func = rndis_free;

	status = rndis_register(rndis_response_available, rndis);
	status = rndis_register(rndis_response_available, rndis, NULL);
	if (status < 0) {
		kfree(rndis);
		return ERR_PTR(status);
+29 −22
Original line number Diff line number Diff line
@@ -859,16 +859,17 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
		pr_debug("%s: RNDIS_MSG_HALT\n",
			__func__);

		if (!is_rndis_ipa_supported()) {
		if (params->state == RNDIS_DATA_INITIALIZED) {
			if (params->flow_ctrl_enable) {
				params->flow_ctrl_enable(true);
			} else {
				if (params->dev) {
					netif_carrier_off(params->dev);
					netif_stop_queue(params->dev);
				}
		} else {
			if (params->state == RNDIS_DATA_INITIALIZED)
				u_bam_data_stop_rndis_ipa();
			}
			params->state = RNDIS_UNINITIALIZED;
		}
		return 0;

	case RNDIS_MSG_QUERY:
@@ -910,7 +911,8 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
}
EXPORT_SYMBOL_GPL(rndis_msg_parser);

int rndis_register(void (*resp_avail)(void *v), void *v)
int rndis_register(void (*resp_avail)(void *v), void *v,
	void (*flow_ctrl_enable)(bool enable))
{
	u8 i;

@@ -921,6 +923,8 @@ int rndis_register(void (*resp_avail)(void *v), void *v)
		if (!rndis_per_dev_params[i].used) {
			rndis_per_dev_params[i].used = 1;
			rndis_per_dev_params[i].resp_avail = resp_avail;
			rndis_per_dev_params[i].flow_ctrl_enable =
				flow_ctrl_enable;
			rndis_per_dev_params[i].v = v;
			rndis_per_dev_params[i].max_pkt_per_xfer = 1;
			rndis_per_dev_params[i].pkt_alignment_factor = 0;
@@ -940,6 +944,7 @@ void rndis_deregister(int configNr)

	if (configNr >= RNDIS_MAX_CONFIGS) return;
	rndis_per_dev_params[configNr].used = 0;
	rndis_per_dev_params[configNr].flow_ctrl_enable = NULL;
}
EXPORT_SYMBOL_GPL(rndis_deregister);

@@ -1027,23 +1032,25 @@ void rndis_flow_control(u8 confignr, bool enable_flow_control)
	params = &rndis_per_dev_params[confignr];
	pr_debug("%s(): params->state:%x\n", __func__, params->state);
	if (enable_flow_control) {
		if (is_rndis_ipa_supported()) {
			if (params->state == RNDIS_DATA_INITIALIZED)
				u_bam_data_stop_rndis_ipa();
		if (params->state == RNDIS_DATA_INITIALIZED) {
			if (params->flow_ctrl_enable) {
				params->flow_ctrl_enable(enable_flow_control);
			} else {
				netif_carrier_off(params->dev);
				netif_stop_queue(params->dev);
			}
		}
		params->state = RNDIS_INITIALIZED;
	} else {
		if (is_rndis_ipa_supported()) {
			if (params->state != RNDIS_DATA_INITIALIZED)
				u_bam_data_start_rndis_ipa();
		if (params->state != RNDIS_DATA_INITIALIZED) {
			if (params->flow_ctrl_enable) {
				params->flow_ctrl_enable(enable_flow_control);
			} else {
				netif_carrier_on(params->dev);
				if (netif_running(params->dev))
					netif_wake_queue(params->dev);
			}
		}
		params->state = RNDIS_DATA_INITIALIZED;
	}
}
+4 −2
Original line number Diff line number Diff line
@@ -194,6 +194,8 @@ typedef struct rndis_params
	u8			pkt_alignment_factor;
	const char		*vendorDescr;
	void			(*resp_avail)(void *v);
	void			(*flow_ctrl_enable)(bool enable);

	void			*v;
	struct list_head	resp_queue;
	spinlock_t		lock;
@@ -205,7 +207,8 @@ typedef struct rndis_params

/* RNDIS Message parser and other useless functions */
int  rndis_msg_parser (u8 configNr, u8 *buf);
int  rndis_register(void (*resp_avail)(void *v), void *v);
int  rndis_register(void (*resp_avail)(void *v), void *v,
	void (*flow_ctrl_enable)(bool enable));
void rndis_deregister (int configNr);
int  rndis_set_param_dev (u8 configNr, struct net_device *dev,
			 u16 *cdc_filter);
@@ -226,7 +229,6 @@ int rndis_signal_connect (int configNr);
int  rndis_signal_disconnect (int configNr);
int  rndis_state (int configNr);
extern void rndis_set_host_mac (int configNr, const u8 *addr);
extern bool is_rndis_ipa_supported(void);
void rndis_flow_control(u8 confignr, bool enable_flow_control);

#endif  /* _LINUX_RNDIS_H */
+8 −0
Original line number Diff line number Diff line
@@ -1282,6 +1282,14 @@ void u_bam_data_stop_rndis_ipa(void)
	}
}

void bam_data_flow_control_enable(bool enable)
{
	if (enable)
		u_bam_data_stop_rndis_ipa();
	else
		u_bam_data_start_rndis_ipa();
}

static void bam_data_free_reqs(struct bam_data_port *port)
{

Loading