/** * @brief Free resource and cleanup * * @param intf Pointer to usb_interface * * @return N/A */ static void woal_usb_disconnect(struct usb_interface *intf) { struct usb_card_rec *cardp = usb_get_intfdata(intf); moal_handle *phandle = NULL; ENTER(); if (!cardp || !cardp->phandle) { PRINTM(MERROR, "Card or phandle is not valid\n"); LEAVE(); return; } phandle = (moal_handle *) cardp->phandle; /* * Update Surprise removed to TRUE * Free all the URB's allocated */ phandle->surprise_removed = MTRUE; /* Unlink and free urb */ woal_usb_free(cardp); /* Card is removed and we can call wlan_remove_card */ PRINTM(MINFO, "Call remove card\n"); woal_remove_card(cardp); /* Reset device */ usb_reset_device(cardp->udev); usb_set_intfdata(intf, NULL); usb_put_dev(interface_to_usbdev(intf)); kfree(cardp); LEAVE(); return; }
/** @brief This function handles client driver remove. * * @param func A pointer to sdio_func structure. * @return N/A */ void woal_sdio_remove(struct sdio_func *func) { struct sdio_mmc_card *card; ENTER(); PRINTM(MINFO, "SDIO func=%d\n", func->num); if (func) { card = sdio_get_drvdata(func); if (card) { woal_remove_card(card); kfree(card); } } LEAVE(); }
/** @brief This function handles client driver remove. * * @param func A pointer to sdio_func structure. * @return n/a */ static void woal_sdio_remove(struct sdio_func *func) { struct sdio_mmc_card *card; printk("[woal] : woal_sdio_remove enter\n"); ENTER(); PRINTM(MINFO, "SDIO func=%d\n", func->num); if (func) { card = sdio_get_drvdata(func); if (card) { woal_remove_card(card); kfree(card); } } //woal_bus_unregister(); //woal_bus_register(); printk("[woal] : woal_sdio_remove exit\n"); LEAVE(); }