aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwifiex/sdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/mwifiex/sdio.c')
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 4ce3d7b33991..2ae4dd754226 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -179,6 +179,8 @@ mwifiex_sdio_remove(struct sdio_func *func)
179 if (!adapter || !adapter->priv_num) 179 if (!adapter || !adapter->priv_num)
180 return; 180 return;
181 181
182 cancel_work_sync(&adapter->iface_work);
183
182 if (user_rmmod) { 184 if (user_rmmod) {
183 if (adapter->is_suspended) 185 if (adapter->is_suspended)
184 mwifiex_sdio_resume(adapter->dev); 186 mwifiex_sdio_resume(adapter->dev);
@@ -1915,7 +1917,7 @@ mwifiex_update_mp_end_port(struct mwifiex_adapter *adapter, u16 port)
1915} 1917}
1916 1918
1917static struct mmc_host *reset_host; 1919static struct mmc_host *reset_host;
1918static void sdio_card_reset_worker(struct work_struct *work) 1920static void mwifiex_sdio_card_reset_work(struct work_struct *work)
1919{ 1921{
1920 struct mmc_host *target = reset_host; 1922 struct mmc_host *target = reset_host;
1921 1923
@@ -1933,15 +1935,29 @@ static void sdio_card_reset_worker(struct work_struct *work)
1933 mdelay(20); 1935 mdelay(20);
1934 mmc_add_host(target); 1936 mmc_add_host(target);
1935} 1937}
1936static DECLARE_WORK(card_reset_work, sdio_card_reset_worker); 1938
1939static void mwifiex_sdio_work(struct work_struct *work)
1940{
1941 struct mwifiex_adapter *adapter =
1942 container_of(work, struct mwifiex_adapter, iface_work);
1943
1944 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
1945 &adapter->iface_work_flags))
1946 mwifiex_sdio_card_reset_work(work);
1947}
1937 1948
1938/* This function resets the card */ 1949/* This function resets the card */
1939static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter) 1950static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter)
1940{ 1951{
1941 struct sdio_mmc_card *card = adapter->card; 1952 struct sdio_mmc_card *card = adapter->card;
1942 1953
1954 if (test_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &adapter->iface_work_flags))
1955 return;
1956
1957 set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &adapter->iface_work_flags);
1958
1943 reset_host = card->func->card->host; 1959 reset_host = card->func->card->host;
1944 schedule_work(&card_reset_work); 1960 schedule_work(&adapter->iface_work);
1945} 1961}
1946 1962
1947static struct mwifiex_if_ops sdio_ops = { 1963static struct mwifiex_if_ops sdio_ops = {
@@ -1964,6 +1980,7 @@ static struct mwifiex_if_ops sdio_ops = {
1964 .cmdrsp_complete = mwifiex_sdio_cmdrsp_complete, 1980 .cmdrsp_complete = mwifiex_sdio_cmdrsp_complete,
1965 .event_complete = mwifiex_sdio_event_complete, 1981 .event_complete = mwifiex_sdio_event_complete,
1966 .card_reset = mwifiex_sdio_card_reset, 1982 .card_reset = mwifiex_sdio_card_reset,
1983 .iface_work = mwifiex_sdio_work,
1967}; 1984};
1968 1985
1969/* 1986/*
@@ -2001,7 +2018,6 @@ mwifiex_sdio_cleanup_module(void)
2001 /* Set the flag as user is removing this module. */ 2018 /* Set the flag as user is removing this module. */
2002 user_rmmod = 1; 2019 user_rmmod = 1;
2003 2020
2004 cancel_work_sync(&card_reset_work);
2005 sdio_unregister_driver(&mwifiex_sdio); 2021 sdio_unregister_driver(&mwifiex_sdio);
2006} 2022}
2007 2023