drivers: usbhost_hub: usb communication memory should use DRVR_ALLOC

- usb communication memory should use DRVR_ALLOC

Signed-off-by: Zhihong Chen <zhihong.chen@hpmicro.com>
This commit is contained in:
Zhihong Chen 2023-07-18 14:32:59 +08:00 committed by Xiang Xiao
parent fcc2398078
commit 3d8324962a

View File

@ -515,9 +515,10 @@ static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
FAR struct usbhost_hubpriv_s *priv; FAR struct usbhost_hubpriv_s *priv;
FAR struct usbhost_hubport_s *hport; FAR struct usbhost_hubport_s *hport;
FAR struct usb_ctrlreq_s *ctrlreq; FAR struct usb_ctrlreq_s *ctrlreq;
struct usb_hubdesc_s hubdesc; FAR struct usb_hubdesc_s *hubdesc;
uint16_t hubchar; uint16_t hubchar;
int ret; int ret;
size_t maxlen;
uinfo("Read hub descriptor\n"); uinfo("Read hub descriptor\n");
@ -538,17 +539,25 @@ static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
usbhost_putle16(ctrlreq->index, 0); usbhost_putle16(ctrlreq->index, 0);
usbhost_putle16(ctrlreq->len, USB_SIZEOF_HUBDESC); usbhost_putle16(ctrlreq->len, USB_SIZEOF_HUBDESC);
ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ret = DRVR_ALLOC(hport->drvr, (FAR uint8_t **)&hubdesc, &maxlen);
ctrlreq, (FAR uint8_t *)&hubdesc);
if (ret < 0) if (ret < 0)
{ {
uerr("ERROR: DRVR_ALLOC failed: %d\n", ret);
return ret;
}
ret = DRVR_CTRLIN(hport->drvr, hport->ep0,
ctrlreq, (FAR uint8_t *)hubdesc);
if (ret < 0)
{
DRVR_FREE(hport->drvr, (FAR uint8_t *)hubdesc);
uerr("ERROR: Failed to read hub descriptor: %d\n", ret); uerr("ERROR: Failed to read hub descriptor: %d\n", ret);
return ret; return ret;
} }
priv->nports = hubdesc.nports; priv->nports = hubdesc->nports;
hubchar = usbhost_getle16(hubdesc.characteristics); hubchar = usbhost_getle16(hubdesc->characteristics);
priv->lpsm = (hubchar & USBHUB_CHAR_LPSM_MASK) >> priv->lpsm = (hubchar & USBHUB_CHAR_LPSM_MASK) >>
USBHUB_CHAR_LPSM_SHIFT; USBHUB_CHAR_LPSM_SHIFT;
priv->compounddev = (hubchar & USBHUB_CHAR_COMPOUND) ? true : false; priv->compounddev = (hubchar & USBHUB_CHAR_COMPOUND) ? true : false;
@ -556,24 +565,26 @@ static inline int usbhost_hubdesc(FAR struct usbhost_class_s *hubclass)
USBHUB_CHAR_OCPM_SHIFT; USBHUB_CHAR_OCPM_SHIFT;
priv->indicator = (hubchar & USBHUB_CHAR_PORTIND) ? true : false; priv->indicator = (hubchar & USBHUB_CHAR_PORTIND) ? true : false;
priv->pwrondelay = (2 * hubdesc.pwrondelay); priv->pwrondelay = (2 * hubdesc->pwrondelay);
priv->ctrlcurrent = hubdesc.ctrlcurrent; priv->ctrlcurrent = hubdesc->ctrlcurrent;
uinfo("Hub Descriptor:\n"); uinfo("Hub Descriptor:\n");
uinfo(" bDescLength: %d\n", hubdesc.len); uinfo(" bDescLength: %d\n", hubdesc->len);
uinfo(" bDescriptorType: 0x%02x\n", hubdesc.type); uinfo(" bDescriptorType: 0x%02x\n", hubdesc->type);
uinfo(" bNbrPorts: %d\n", hubdesc.nports); uinfo(" bNbrPorts: %d\n", hubdesc->nports);
uinfo(" wHubCharacteristics: 0x%04x\n", uinfo(" wHubCharacteristics: 0x%04x\n",
usbhost_getle16(hubdesc.characteristics)); usbhost_getle16(hubdesc->characteristics));
uinfo(" lpsm: %d\n", priv->lpsm); uinfo(" lpsm: %d\n", priv->lpsm);
uinfo(" compounddev: %s\n", priv->compounddev ? "TRUE" : "FALSE"); uinfo(" compounddev: %s\n", priv->compounddev ? "TRUE" : "FALSE");
uinfo(" ocmode: %d\n", priv->ocmode); uinfo(" ocmode: %d\n", priv->ocmode);
uinfo(" indicator: %s\n", priv->indicator ? "TRUE" : "FALSE"); uinfo(" indicator: %s\n", priv->indicator ? "TRUE" : "FALSE");
uinfo(" bPwrOn2PwrGood: %d\n", hubdesc.pwrondelay); uinfo(" bPwrOn2PwrGood: %d\n", hubdesc->pwrondelay);
uinfo(" pwrondelay: %d\n", priv->pwrondelay); uinfo(" pwrondelay: %d\n", priv->pwrondelay);
uinfo(" bHubContrCurrent: %d\n", hubdesc.ctrlcurrent); uinfo(" bHubContrCurrent: %d\n", hubdesc->ctrlcurrent);
uinfo(" DeviceRemovable: %d\n", hubdesc.devattached); uinfo(" DeviceRemovable: %d\n", hubdesc->devattached);
uinfo(" PortPwrCtrlMask: %d\n", hubdesc.pwrctrlmask); uinfo(" PortPwrCtrlMask: %d\n", hubdesc->pwrctrlmask);
DRVR_FREE(hport->drvr, (FAR uint8_t *)hubdesc);
return OK; return OK;
} }
@ -687,7 +698,7 @@ static void usbhost_hub_event(FAR void *arg)
FAR struct usbhost_hubport_s *connport; FAR struct usbhost_hubport_s *connport;
FAR struct usbhost_hubpriv_s *priv; FAR struct usbhost_hubpriv_s *priv;
FAR struct usb_ctrlreq_s *ctrlreq; FAR struct usb_ctrlreq_s *ctrlreq;
struct usb_portstatus_s portstatus; FAR struct usb_portstatus_s *portstatus;
irqstate_t flags; irqstate_t flags;
uint16_t status; uint16_t status;
uint16_t change; uint16_t change;
@ -696,6 +707,7 @@ static void usbhost_hub_event(FAR void *arg)
uint8_t statuschange; uint8_t statuschange;
int port; int port;
int ret; int ret;
size_t maxlen;
DEBUGASSERT(arg != NULL); DEBUGASSERT(arg != NULL);
hubclass = (FAR struct usbhost_class_s *)arg; hubclass = (FAR struct usbhost_class_s *)arg;
@ -720,6 +732,13 @@ static void usbhost_hub_event(FAR void *arg)
statuschange = priv->buffer[0]; statuschange = priv->buffer[0];
uinfo("StatusChange: %02x\n", statuschange); uinfo("StatusChange: %02x\n", statuschange);
ret = DRVR_ALLOC(hport->drvr, (FAR uint8_t **)&portstatus, &maxlen);
if (ret < 0)
{
uerr("ERROR: DRVR_ALLOC failed: %d\n", ret);
return;
}
/* Check for status change on any port */ /* Check for status change on any port */
for (port = 1; port <= priv->nports; port++) for (port = 1; port <= priv->nports; port++)
@ -746,15 +765,15 @@ static void usbhost_hub_event(FAR void *arg)
usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS); usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS);
ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq, ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq,
(FAR uint8_t *)&portstatus); (FAR uint8_t *)portstatus);
if (ret < 0) if (ret < 0)
{ {
uerr("ERROR: Failed to read port %d status: %d\n", port, ret); uerr("ERROR: Failed to read port %d status: %d\n", port, ret);
continue; continue;
} }
status = usbhost_getle16(portstatus.status); status = usbhost_getle16(portstatus->status);
change = usbhost_getle16(portstatus.change); change = usbhost_getle16(portstatus->change);
/* First, clear all change bits */ /* First, clear all change bits */
@ -785,7 +804,7 @@ static void usbhost_hub_event(FAR void *arg)
feat++; feat++;
} }
change = usbhost_getle16(portstatus.change); change = usbhost_getle16(portstatus->change);
/* Handle connect or disconnect, no power management */ /* Handle connect or disconnect, no power management */
@ -808,7 +827,7 @@ static void usbhost_hub_event(FAR void *arg)
usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS); usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS);
ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq, ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq,
(FAR uint8_t *)&portstatus); (FAR uint8_t *)portstatus);
if (ret < 0) if (ret < 0)
{ {
uerr("ERROR: Failed to get port %d status: %d\n", uerr("ERROR: Failed to get port %d status: %d\n",
@ -816,8 +835,8 @@ static void usbhost_hub_event(FAR void *arg)
break; break;
} }
status = usbhost_getle16(portstatus.status); status = usbhost_getle16(portstatus->status);
change = usbhost_getle16(portstatus.change); change = usbhost_getle16(portstatus->change);
if ((change & USBHUB_PORT_STAT_CCONNECTION) == 0 && if ((change & USBHUB_PORT_STAT_CCONNECTION) == 0 &&
(status & USBHUB_PORT_STAT_CONNECTION) == connection) (status & USBHUB_PORT_STAT_CONNECTION) == connection)
@ -886,7 +905,7 @@ static void usbhost_hub_event(FAR void *arg)
usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS); usbhost_putle16(ctrlreq->len, USB_SIZEOF_PORTSTS);
ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq, ret = DRVR_CTRLIN(hport->drvr, hport->ep0, ctrlreq,
(FAR uint8_t *)&portstatus); (FAR uint8_t *)portstatus);
if (ret < 0) if (ret < 0)
{ {
uerr("ERROR: Failed to get port %d status: %d\n", uerr("ERROR: Failed to get port %d status: %d\n",
@ -894,8 +913,8 @@ static void usbhost_hub_event(FAR void *arg)
continue; continue;
} }
status = usbhost_getle16(portstatus.status); status = usbhost_getle16(portstatus->status);
change = usbhost_getle16(portstatus.change); change = usbhost_getle16(portstatus->change);
uinfo("port %d status %04x change %04x after reset\n", uinfo("port %d status %04x change %04x after reset\n",
port, status, change); port, status, change);
@ -1010,6 +1029,10 @@ static void usbhost_hub_event(FAR void *arg)
} }
} }
/* Free portstatus memory */
DRVR_FREE(hport->drvr, (FAR uint8_t *)portstatus);
/* Check for hub status change */ /* Check for hub status change */
if ((statuschange & 1) != 0) if ((statuschange & 1) != 0)