Commit 82ee1e6c authored by Fabien Parent's avatar Fabien Parent Committed by Greg Kroah-Hartman
Browse files

greybus: es2: implement cport reset control request



Toshiba UniPro IP requires to reset the CPort that has been used in a previous
connection. This commit implement a new control request in order to
reset CPorts on an APBridgeA.

Signed-off-by: default avatarFabien Parent <fparent@baylibre.com>
Reviewed-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent f064b872
Loading
Loading
Loading
Loading
+37 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,9 @@ static DEFINE_KFIFO(apb1_log_fifo, char, APB1_LOG_SIZE);
/* vendor request to get the number of cports available */
/* vendor request to get the number of cports available */
#define REQUEST_CPORT_COUNT	0x04
#define REQUEST_CPORT_COUNT	0x04


/* vendor request to reset a cport state */
#define REQUEST_RESET_CPORT	0x05

/*
/*
 * @endpoint: bulk in endpoint for CPort data
 * @endpoint: bulk in endpoint for CPort data
 * @urb: array of urbs for the CPort in messages
 * @urb: array of urbs for the CPort in messages
@@ -376,10 +379,44 @@ static void message_cancel(struct gb_message *message)
	usb_free_urb(urb);
	usb_free_urb(urb);
}
}


static int cport_reset(struct greybus_host_device *hd, u16 cport_id)
{
	struct es1_ap_dev *es1 = hd_to_es1(hd);
	struct usb_device *udev = es1->usb_dev;
	int retval;

	retval = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
				 REQUEST_RESET_CPORT,
				 USB_DIR_OUT | USB_TYPE_VENDOR |
				 USB_RECIP_INTERFACE, 0, cport_id,
				 NULL, 0, ES1_TIMEOUT);
	if (retval < 0) {
		dev_err(&udev->dev, "failed to reset cport %hu: %d\n", cport_id,
			retval);
		return retval;
	}

	return 0;
}

static int cport_enable(struct greybus_host_device *hd, u16 cport_id)
{
	int retval;

	if (cport_id != GB_SVC_CPORT_ID) {
		retval = cport_reset(hd, cport_id);
		if (retval)
			return retval;
	}

	return 0;
}

static struct greybus_host_driver es1_driver = {
static struct greybus_host_driver es1_driver = {
	.hd_priv_size		= sizeof(struct es1_ap_dev),
	.hd_priv_size		= sizeof(struct es1_ap_dev),
	.message_send		= message_send,
	.message_send		= message_send,
	.message_cancel		= message_cancel,
	.message_cancel		= message_cancel,
	.cport_enable		= cport_enable,
};
};


/* Common function to report consistent warnings based on URB status */
/* Common function to report consistent warnings based on URB status */