]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
usb: xhci: refactor xhci_set_configuration
authorJanne Grunau <j@jannau.net>
Thu, 4 Apr 2024 06:25:49 +0000 (08:25 +0200)
committerMarek Vasut <marex@denx.de>
Fri, 5 Apr 2024 01:25:14 +0000 (03:25 +0200)
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>
drivers/usb/host/xhci.c

index d13cbff9b3726f6f8f6ef26662157f991cac1a1a..534c4b973fb578af062950a28605238686a5cf25 100644 (file)
@@ -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
- * Return: returns the status of the xhci_configure_endpoints
+ * @param udev         pointer to the USB device structure
+ * @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];
        int cur_ep;
-       int max_ep_flag = 0;
        int ep_index;
        unsigned int dir;
        unsigned int ep_type;
-       struct xhci_ctrl *ctrl = xhci_get_ctrl(udev);
-       int num_of_ep;
-       int ep_flag = 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;
        unsigned int interval;
        unsigned int mult;
        unsigned int max_burst;
        unsigned int avg_trb_len;
        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++) {
                struct usb_endpoint_descriptor *endpt_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;
 
                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 */
                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);
 }