Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4875c499 authored by Tony Cho's avatar Tony Cho Committed by Greg Kroah-Hartman
Browse files

staging: wilc1000: move clean up codes into wl_wlan_cleanup function



This patch moves clean up codes from exit_wilc_driver into the wl_wlan_cleanup
newly introduced in this patch. In addition, it is called by linux_sdio_remove
function.

Signed-off-by: default avatarTony Cho <tony.cho@atmel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 817f3fb9
Loading
Loading
Loading
Loading
+41 −54
Original line number Diff line number Diff line
@@ -1696,6 +1696,47 @@ void WILC_WFI_mgmt_rx(u8 *buff, u32 size)
		WILC_WFI_p2p_rx(g_linux_wlan->vif[1].ndev, buff, size);
}

void wl_wlan_cleanup(void)
{
	int i = 0;
	perInterface_wlan_t *nic[NUM_CONCURRENT_IFC];

	if (g_linux_wlan &&
	   (g_linux_wlan->vif[0].ndev || g_linux_wlan->vif[1].ndev)) {
		unregister_inetaddr_notifier(&g_dev_notifier);

		for (i = 0; i < NUM_CONCURRENT_IFC; i++)
			nic[i] = netdev_priv(g_linux_wlan->vif[i].ndev);
	}

	if (g_linux_wlan && g_linux_wlan->wilc_firmware)
		release_firmware(g_linux_wlan->wilc_firmware);

	if (g_linux_wlan &&
	   (g_linux_wlan->vif[0].ndev || g_linux_wlan->vif[1].ndev)) {
		linux_wlan_lock_timeout(&close_exit_sync, 12 * 1000);

		for (i = 0; i < NUM_CONCURRENT_IFC; i++)
			if (g_linux_wlan->vif[i].ndev)
				if (nic[i]->mac_opened)
					mac_close(g_linux_wlan->vif[i].ndev);

		for (i = 0; i < NUM_CONCURRENT_IFC; i++) {
			unregister_netdev(g_linux_wlan->vif[i].ndev);
			wilc_free_wiphy(g_linux_wlan->vif[i].ndev);
			free_netdev(g_linux_wlan->vif[i].ndev);
		}
	}

	kfree(g_linux_wlan);

#if defined(WILC_DEBUGFS)
	wilc_debugfs_remove();
#endif
	linux_wlan_device_detection(0);
	linux_wlan_device_power(0);
}

int wilc_netdev_init(void)
{

@@ -1828,49 +1869,6 @@ late_initcall(init_wilc_driver);

static void __exit exit_wilc_driver(void)
{
	int i = 0;
	perInterface_wlan_t *nic[NUM_CONCURRENT_IFC] = {NULL,};
	#define CLOSE_TIMEOUT (12 * 1000)

	if ((g_linux_wlan != NULL) && (((g_linux_wlan->vif[0].ndev) != NULL)
				       || ((g_linux_wlan->vif[1].ndev) != NULL))) {
		unregister_inetaddr_notifier(&g_dev_notifier);

		for (i = 0; i < NUM_CONCURRENT_IFC; i++)
			nic[i] = netdev_priv(g_linux_wlan->vif[i].ndev);
	}

	if ((g_linux_wlan != NULL) && g_linux_wlan->wilc_firmware != NULL) {
		release_firmware(g_linux_wlan->wilc_firmware);
		g_linux_wlan->wilc_firmware = NULL;
	}

	if ((g_linux_wlan != NULL) && (((g_linux_wlan->vif[0].ndev) != NULL)
				       || ((g_linux_wlan->vif[1].ndev) != NULL))) {
		PRINT_D(INIT_DBG, "Waiting for mac_close ....\n");

		if (linux_wlan_lock_timeout(&close_exit_sync, CLOSE_TIMEOUT) < 0)
			PRINT_D(INIT_DBG, "Closed TimedOUT\n");
		else
			PRINT_D(INIT_DBG, "mac_closed\n");

		for (i = 0; i < NUM_CONCURRENT_IFC; i++) {
			/* close all opened interfaces */
			if (g_linux_wlan->vif[i].ndev != NULL) {
				if (nic[i]->mac_opened)
					mac_close(g_linux_wlan->vif[i].ndev);
			}
		}
		for (i = 0; i < NUM_CONCURRENT_IFC; i++) {
			PRINT_D(INIT_DBG, "Unregistering netdev %p\n", g_linux_wlan->vif[i].ndev);
			unregister_netdev(g_linux_wlan->vif[i].ndev);
			PRINT_D(INIT_DBG, "Freeing Wiphy...\n");
			wilc_free_wiphy(g_linux_wlan->vif[i].ndev);
			PRINT_D(INIT_DBG, "Freeing netdev...\n");
			free_netdev(g_linux_wlan->vif[i].ndev);
		}
	}

#ifndef WILC_SDIO
	PRINT_D(INIT_DBG, "SPI unregsiter...\n");
	spi_unregister_driver(&wilc_bus);
@@ -1878,17 +1876,6 @@ static void __exit exit_wilc_driver(void)
	PRINT_D(INIT_DBG, "SDIO unregsiter...\n");
	sdio_unregister_driver(&wilc_bus);
#endif

	kfree(g_linux_wlan);
	g_linux_wlan = NULL;
	printk("Module_exit Done.\n");

#if defined(WILC_DEBUGFS)
	wilc_debugfs_remove();
#endif

	linux_wlan_device_detection(0);
	linux_wlan_device_power(0);
}
module_exit(exit_wilc_driver);

+1 −4
Original line number Diff line number Diff line
@@ -136,10 +136,7 @@ static int linux_sdio_probe(struct sdio_func *func, const struct sdio_device_id

static void linux_sdio_remove(struct sdio_func *func)
{
	/**
	 *      TODO
	 **/

	wl_wlan_cleanup();
}

struct sdio_driver wilc_bus = {
+1 −1
Original line number Diff line number Diff line
@@ -213,5 +213,5 @@ void linux_wlan_mac_indicate(int flag);
void linux_wlan_rx_complete(void);
void linux_wlan_dbg(u8 *buff);
int linux_wlan_lock_timeout(void *vp, u32 timeout);

void wl_wlan_cleanup(void);
#endif