[PATCH 1/3] usb: hub: Fix usb_get_port_status() for big-endian platforms

From: Aaron Williams awilliams@marvell.com
Add missing endianness conversions to usb_get_port_status(). This (amongst others) is necessary to enable the use of USB 3 hubs on big-endian platforms like MIPS Octeon.
Signed-off-by: Aaron Williams awilliams@marvell.com Signed-off-by: Stefan Roese sr@denx.de Cc: Chandrakala Chavva cchavva@marvell.com Cc: Bin Meng bmeng.cn@gmail.com Cc: Marek Vasut marex@denx.de --- common/usb_hub.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/common/usb_hub.c b/common/usb_hub.c index 3d856e7de792..ba11a188ca64 100644 --- a/common/usb_hub.c +++ b/common/usb_hub.c @@ -144,7 +144,8 @@ int usb_get_port_status(struct usb_device *dev, int port, void *data)
if (!usb_hub_is_root_hub(dev->dev) && usb_hub_is_superspeed(dev)) { struct usb_port_status *status = (struct usb_port_status *)data; - u16 tmp = (status->wPortStatus) & USB_SS_PORT_STAT_MASK; + u16 tmp = le16_to_cpu(status->wPortStatus) & + USB_SS_PORT_STAT_MASK;
if (status->wPortStatus & USB_SS_PORT_STAT_POWER) tmp |= USB_PORT_STAT_POWER; @@ -152,7 +153,7 @@ int usb_get_port_status(struct usb_device *dev, int port, void *data) USB_SS_PORT_STAT_SPEED_5GBPS) tmp |= USB_PORT_STAT_SUPER_SPEED;
- status->wPortStatus = tmp; + status->wPortStatus = cpu_to_le16(tmp); } #endif

From: Aaron Williams awilliams@marvell.com
Accessing the xHCI controller registers should be done via the xhci_readl/writel functions. This patch adds this to a few missing places.
Signed-off-by: Aaron Williams awilliams@marvell.com Signed-off-by: Stefan Roese sr@denx.de Cc: Chandrakala Chavva cchavva@marvell.com Cc: Bin Meng bmeng.cn@gmail.com Cc: Marek Vasut marex@denx.de --- drivers/usb/host/xhci-mem.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 83147d51b5c0..1c11c2e7e04d 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -434,9 +434,9 @@ static struct xhci_container_ctx BUG_ON((type != XHCI_CTX_TYPE_DEVICE) && (type != XHCI_CTX_TYPE_INPUT)); ctx->type = type; ctx->size = (MAX_EP_CTX_NUM + 1) * - CTX_SIZE(readl(&ctrl->hccr->cr_hccparams)); + CTX_SIZE(xhci_readl(&ctrl->hccr->cr_hccparams)); if (type == XHCI_CTX_TYPE_INPUT) - ctx->size += CTX_SIZE(readl(&ctrl->hccr->cr_hccparams)); + ctx->size += CTX_SIZE(xhci_readl(&ctrl->hccr->cr_hccparams));
ctx->bytes = xhci_malloc(ctx->size);
@@ -636,7 +636,7 @@ struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_ctrl *ctrl, return (struct xhci_slot_ctx *)ctx->bytes;
return (struct xhci_slot_ctx *) - (ctx->bytes + CTX_SIZE(readl(&ctrl->hccr->cr_hccparams))); + (ctx->bytes + CTX_SIZE(xhci_readl(&ctrl->hccr->cr_hccparams))); }
/** @@ -658,7 +658,7 @@ struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_ctrl *ctrl,
return (struct xhci_ep_ctx *) (ctx->bytes + - (ep_index * CTX_SIZE(readl(&ctrl->hccr->cr_hccparams)))); + (ep_index * CTX_SIZE(xhci_readl(&ctrl->hccr->cr_hccparams)))); }
/**

This change makes debugging a bit easier as the output is better readable with the added space. The explicit le16_to_cpu() is not needed in the output. Also this patch moves the strings into one line to make the patch checkpatch clean.
Signed-off-by: Stefan Roese sr@denx.de Cc: Aaron Williams awilliams@marvell.com Cc: Chandrakala Chavva cchavva@marvell.com Cc: Bin Meng bmeng.cn@gmail.com Cc: Marek Vasut marex@denx.de --- drivers/usb/host/xhci-ring.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 46c137f85781..35bd5cd29e15 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -849,12 +849,9 @@ int xhci_ctrl_tx(struct usb_device *udev, unsigned long pipe, } }
- debug("req->requesttype = %d, req->request = %d," - "le16_to_cpu(req->value) = %d," - "le16_to_cpu(req->index) = %d," - "le16_to_cpu(req->length) = %d\n", - req->requesttype, req->request, le16_to_cpu(req->value), - le16_to_cpu(req->index), le16_to_cpu(req->length)); + debug("req->requesttype = %d, req->request = %d, req->value = %d, req->index = %d, req->length = %d\n", + req->requesttype, req->request, le16_to_cpu(req->value), + le16_to_cpu(req->index), le16_to_cpu(req->length));
trb_fields[0] = req->requesttype | req->request << 8 | le16_to_cpu(req->value) << 16;

On 4/6/21 12:10 PM, Stefan Roese wrote:
From: Aaron Williams awilliams@marvell.com
Add missing endianness conversions to usb_get_port_status(). This (amongst others) is necessary to enable the use of USB 3 hubs on big-endian platforms like MIPS Octeon.
Applied all, thanks.
participants (2)
-
Marek Vasut
-
Stefan Roese