mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-22 12:54:37 +00:00
usb: xhci: refactor xhci_set_configuration
In the next step endpoints for multiple interfaces are set up. Move most of the per endpoint initialization to separate function to avoid another identation level. Reviewed-by: Marek Vasut <marex@denx.de> Reviewed-by: Neal Gompa <neal@gompa.dev> Signed-off-by: Janne Grunau <j@jannau.net>
This commit is contained in:
parent
cdfcc37428
commit
f1820eb4f4
1 changed files with 73 additions and 46 deletions
|
@ -475,67 +475,34 @@ static int xhci_configure_endpoints(struct usb_device *udev, bool ctx_change)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure the endpoint, programming the device contexts.
|
* Fill endpoint contexts for interface descriptor ifdesc.
|
||||||
*
|
*
|
||||||
* @param udev pointer to the USB device structure
|
* @param udev pointer to the USB device structure
|
||||||
* Return: returns the status of the xhci_configure_endpoints
|
* @param ctrl pointer to the xhci pravte device structure
|
||||||
|
* @param virt_dev pointer to the xhci virtual device structure
|
||||||
|
* @param ifdesc pointer to the USB interface config descriptor
|
||||||
|
* Return: returns the status of xhci_init_ep_contexts_if
|
||||||
*/
|
*/
|
||||||
static int xhci_set_configuration(struct usb_device *udev)
|
static int xhci_init_ep_contexts_if(struct usb_device *udev,
|
||||||
|
struct xhci_ctrl *ctrl,
|
||||||
|
struct xhci_virt_device *virt_dev,
|
||||||
|
struct usb_interface *ifdesc
|
||||||
|
)
|
||||||
{
|
{
|
||||||
struct xhci_container_ctx *in_ctx;
|
|
||||||
struct xhci_container_ctx *out_ctx;
|
|
||||||
struct xhci_input_control_ctx *ctrl_ctx;
|
|
||||||
struct xhci_slot_ctx *slot_ctx;
|
|
||||||
struct xhci_ep_ctx *ep_ctx[MAX_EP_CTX_NUM];
|
struct xhci_ep_ctx *ep_ctx[MAX_EP_CTX_NUM];
|
||||||
int cur_ep;
|
int cur_ep;
|
||||||
int max_ep_flag = 0;
|
|
||||||
int ep_index;
|
int ep_index;
|
||||||
unsigned int dir;
|
unsigned int dir;
|
||||||
unsigned int ep_type;
|
unsigned int ep_type;
|
||||||
struct xhci_ctrl *ctrl = xhci_get_ctrl(udev);
|
|
||||||
int num_of_ep;
|
|
||||||
int ep_flag = 0;
|
|
||||||
u64 trb_64 = 0;
|
u64 trb_64 = 0;
|
||||||
int slot_id = udev->slot_id;
|
|
||||||
struct xhci_virt_device *virt_dev = ctrl->devs[slot_id];
|
|
||||||
struct usb_interface *ifdesc;
|
|
||||||
u32 max_esit_payload;
|
u32 max_esit_payload;
|
||||||
unsigned int interval;
|
unsigned int interval;
|
||||||
unsigned int mult;
|
unsigned int mult;
|
||||||
unsigned int max_burst;
|
unsigned int max_burst;
|
||||||
unsigned int avg_trb_len;
|
unsigned int avg_trb_len;
|
||||||
unsigned int err_count = 0;
|
unsigned int err_count = 0;
|
||||||
|
int num_of_ep = ifdesc->no_of_ep;
|
||||||
|
|
||||||
out_ctx = virt_dev->out_ctx;
|
|
||||||
in_ctx = virt_dev->in_ctx;
|
|
||||||
|
|
||||||
num_of_ep = udev->config.if_desc[0].no_of_ep;
|
|
||||||
ifdesc = &udev->config.if_desc[0];
|
|
||||||
|
|
||||||
ctrl_ctx = xhci_get_input_control_ctx(in_ctx);
|
|
||||||
/* Initialize the input context control */
|
|
||||||
ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG);
|
|
||||||
ctrl_ctx->drop_flags = 0;
|
|
||||||
|
|
||||||
/* EP_FLAG gives values 1 & 4 for EP1OUT and EP2IN */
|
|
||||||
for (cur_ep = 0; cur_ep < num_of_ep; cur_ep++) {
|
|
||||||
ep_flag = xhci_get_ep_index(&ifdesc->ep_desc[cur_ep]);
|
|
||||||
ctrl_ctx->add_flags |= cpu_to_le32(1 << (ep_flag + 1));
|
|
||||||
if (max_ep_flag < ep_flag)
|
|
||||||
max_ep_flag = ep_flag;
|
|
||||||
}
|
|
||||||
|
|
||||||
xhci_inval_cache((uintptr_t)out_ctx->bytes, out_ctx->size);
|
|
||||||
|
|
||||||
/* slot context */
|
|
||||||
xhci_slot_copy(ctrl, in_ctx, out_ctx);
|
|
||||||
slot_ctx = xhci_get_slot_ctx(ctrl, in_ctx);
|
|
||||||
slot_ctx->dev_info &= ~(cpu_to_le32(LAST_CTX_MASK));
|
|
||||||
slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(max_ep_flag + 1) | 0);
|
|
||||||
|
|
||||||
xhci_endpoint_copy(ctrl, in_ctx, out_ctx, 0);
|
|
||||||
|
|
||||||
/* filling up ep contexts */
|
|
||||||
for (cur_ep = 0; cur_ep < num_of_ep; cur_ep++) {
|
for (cur_ep = 0; cur_ep < num_of_ep; cur_ep++) {
|
||||||
struct usb_endpoint_descriptor *endpt_desc = NULL;
|
struct usb_endpoint_descriptor *endpt_desc = NULL;
|
||||||
struct usb_ss_ep_comp_descriptor *ss_ep_comp_desc = NULL;
|
struct usb_ss_ep_comp_descriptor *ss_ep_comp_desc = NULL;
|
||||||
|
@ -561,7 +528,8 @@ static int xhci_set_configuration(struct usb_device *udev)
|
||||||
avg_trb_len = max_esit_payload;
|
avg_trb_len = max_esit_payload;
|
||||||
|
|
||||||
ep_index = xhci_get_ep_index(endpt_desc);
|
ep_index = xhci_get_ep_index(endpt_desc);
|
||||||
ep_ctx[ep_index] = xhci_get_ep_ctx(ctrl, in_ctx, ep_index);
|
ep_ctx[ep_index] = xhci_get_ep_ctx(ctrl, virt_dev->in_ctx,
|
||||||
|
ep_index);
|
||||||
|
|
||||||
/* Allocate the ep rings */
|
/* Allocate the ep rings */
|
||||||
virt_dev->eps[ep_index].ring = xhci_ring_alloc(ctrl, 1, true);
|
virt_dev->eps[ep_index].ring = xhci_ring_alloc(ctrl, 1, true);
|
||||||
|
@ -614,6 +582,65 @@ static int xhci_set_configuration(struct usb_device *udev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the endpoint, programming the device contexts.
|
||||||
|
*
|
||||||
|
* @param udev pointer to the USB device structure
|
||||||
|
* Return: returns the status of the xhci_configure_endpoints
|
||||||
|
*/
|
||||||
|
static int xhci_set_configuration(struct usb_device *udev)
|
||||||
|
{
|
||||||
|
struct xhci_container_ctx *out_ctx;
|
||||||
|
struct xhci_container_ctx *in_ctx;
|
||||||
|
struct xhci_input_control_ctx *ctrl_ctx;
|
||||||
|
struct xhci_slot_ctx *slot_ctx;
|
||||||
|
int err;
|
||||||
|
int cur_ep;
|
||||||
|
int max_ep_flag = 0;
|
||||||
|
struct xhci_ctrl *ctrl = xhci_get_ctrl(udev);
|
||||||
|
int num_of_ep;
|
||||||
|
int ep_flag = 0;
|
||||||
|
int slot_id = udev->slot_id;
|
||||||
|
struct xhci_virt_device *virt_dev = ctrl->devs[slot_id];
|
||||||
|
struct usb_interface *ifdesc;
|
||||||
|
|
||||||
|
out_ctx = virt_dev->out_ctx;
|
||||||
|
in_ctx = virt_dev->in_ctx;
|
||||||
|
|
||||||
|
num_of_ep = udev->config.if_desc[0].no_of_ep;
|
||||||
|
ifdesc = &udev->config.if_desc[0];
|
||||||
|
|
||||||
|
ctrl_ctx = xhci_get_input_control_ctx(in_ctx);
|
||||||
|
/* Initialize the input context control */
|
||||||
|
ctrl_ctx->add_flags = cpu_to_le32(SLOT_FLAG);
|
||||||
|
ctrl_ctx->drop_flags = 0;
|
||||||
|
|
||||||
|
/* EP_FLAG gives values 1 & 4 for EP1OUT and EP2IN */
|
||||||
|
for (cur_ep = 0; cur_ep < num_of_ep; cur_ep++) {
|
||||||
|
ep_flag = xhci_get_ep_index(&ifdesc->ep_desc[cur_ep]);
|
||||||
|
ctrl_ctx->add_flags |= cpu_to_le32(1 << (ep_flag + 1));
|
||||||
|
if (max_ep_flag < ep_flag)
|
||||||
|
max_ep_flag = ep_flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
xhci_inval_cache((uintptr_t)out_ctx->bytes, out_ctx->size);
|
||||||
|
|
||||||
|
/* slot context */
|
||||||
|
xhci_slot_copy(ctrl, in_ctx, out_ctx);
|
||||||
|
slot_ctx = xhci_get_slot_ctx(ctrl, in_ctx);
|
||||||
|
slot_ctx->dev_info &= ~(cpu_to_le32(LAST_CTX_MASK));
|
||||||
|
slot_ctx->dev_info |= cpu_to_le32(LAST_CTX(max_ep_flag + 1) | 0);
|
||||||
|
|
||||||
|
xhci_endpoint_copy(ctrl, in_ctx, out_ctx, 0);
|
||||||
|
|
||||||
|
/* filling up ep contexts */
|
||||||
|
err = xhci_init_ep_contexts_if(udev, ctrl, virt_dev, ifdesc);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
return xhci_configure_endpoints(udev, false);
|
return xhci_configure_endpoints(udev, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue