Correct errors in hub class destructor logic
This commit is contained in:
parent
ab17603ceb
commit
adb50640c0
@ -125,10 +125,6 @@ struct usbhost_hubclass_s
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Memory allocation services */
|
|
||||||
|
|
||||||
static inline void usbhost_class_free(FAR struct usbhost_class_s *devclass);
|
|
||||||
|
|
||||||
/* Worker thread actions */
|
/* Worker thread actions */
|
||||||
|
|
||||||
static void usbhost_destroy(FAR void *arg);
|
static void usbhost_destroy(FAR void *arg);
|
||||||
@ -205,7 +201,7 @@ static struct usbhost_registry_s g_hub =
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
|
static void usbhost_hport_deactivate(FAR struct usbhost_hubport_s *hport)
|
||||||
{
|
{
|
||||||
uvdbg("Deactivating: %d\n", hport->port);
|
uvdbg("Deactivating: %d\n", hport->port);
|
||||||
|
|
||||||
@ -269,41 +265,6 @@ static int usbhost_hport_activate(FAR struct usbhost_hubport_s *hport)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: usbhost_class_free
|
|
||||||
*
|
|
||||||
* Description:
|
|
||||||
* Free a class instance previously allocated by usbhost_create().
|
|
||||||
*
|
|
||||||
* Input Parameters:
|
|
||||||
* devclass - A reference to the class instance to be freed.
|
|
||||||
*
|
|
||||||
* Returned Values:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static inline void usbhost_class_free(FAR struct usbhost_class_s *devclass)
|
|
||||||
{
|
|
||||||
FAR struct usbhost_hubport_s *hport;
|
|
||||||
DEBUGASSERT(devclass != NULL);
|
|
||||||
|
|
||||||
uvdbg("Freeing: %p\n", devclass);
|
|
||||||
DEBUGASSERT(devclass != NULL && devclass->hport != NULL);
|
|
||||||
hport = devclass->hport;
|
|
||||||
|
|
||||||
/* Detach the class from the hub port */
|
|
||||||
|
|
||||||
usbhost_devaddr_destroy(hport);
|
|
||||||
hport->funcaddr = 0;
|
|
||||||
|
|
||||||
/* Free the class instance */
|
|
||||||
|
|
||||||
DEBUGASSERT(hport->devclass == devclass);
|
|
||||||
kmm_free(devclass);
|
|
||||||
hport->devclass = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: usbhost_destroy
|
* Name: usbhost_destroy
|
||||||
*
|
*
|
||||||
@ -325,6 +286,7 @@ static void usbhost_destroy(FAR void *arg)
|
|||||||
FAR struct usbhost_class_s *hubclass = (FAR struct usbhost_class_s *)arg;
|
FAR struct usbhost_class_s *hubclass = (FAR struct usbhost_class_s *)arg;
|
||||||
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 usbhost_hubport_s *child;
|
||||||
int port;
|
int port;
|
||||||
|
|
||||||
DEBUGASSERT(hubclass != NULL && hubclass->hport != NULL);
|
DEBUGASSERT(hubclass != NULL && hubclass->hport != NULL);
|
||||||
@ -347,24 +309,29 @@ static void usbhost_destroy(FAR void *arg)
|
|||||||
{
|
{
|
||||||
/* Free any devices classes connect on this hub port */
|
/* Free any devices classes connect on this hub port */
|
||||||
|
|
||||||
hport = &priv->hport[port];
|
child = &priv->hport[port];
|
||||||
if (hport->devclass != NULL)
|
if (child->devclass != NULL)
|
||||||
{
|
{
|
||||||
CLASS_DISCONNECTED(hport->devclass);
|
CLASS_DISCONNECTED(child->devclass);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free any resource use by the hub port */
|
/* Free any resources used by the hub port */
|
||||||
|
|
||||||
usbhost_hport_deactivate(hport);
|
usbhost_hport_deactivate(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Destroy the semaphores */
|
/* Destroy the semaphores */
|
||||||
|
|
||||||
sem_destroy(&priv->exclsem);
|
sem_destroy(&priv->exclsem);
|
||||||
|
|
||||||
/* Free the hub class structure */
|
/* Deactivate the parent hub port (unless it is the root hub port) */
|
||||||
|
|
||||||
usbhost_class_free(hubclass);
|
usbhost_hport_deactivate(hport);
|
||||||
|
|
||||||
|
/* Free the class instance */
|
||||||
|
|
||||||
|
kmm_free(hubclass);
|
||||||
|
hport->devclass = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user