diff options
author | Amitkumar Karwar <akarwar@marvell.com> | 2014-06-20 00:38:53 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2014-06-25 15:32:46 -0400 |
commit | 8915d73870a62c65fd7825f0ca2eb58c8bcdfb61 (patch) | |
tree | e83d23e88bcd9a299b9122cb660de5bec0a670aa | |
parent | 92c2538f55132d8e0e53945204cfb137e7d64b6b (diff) |
mwifiex: use generic 'iface_work' workqueue for SDIO interface
Existing dedicated card_reset work queue is replaced with the
interface specific workqueue pointer provided by mwifiex module.
Also new work flag is added for card reset task.
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/sdio.c | 24 |
2 files changed, 21 insertions, 4 deletions
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index 24791e2acf24..582a9f9fee93 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -431,6 +431,7 @@ enum rdwr_status { | |||
431 | 431 | ||
432 | enum mwifiex_iface_work_flags { | 432 | enum mwifiex_iface_work_flags { |
433 | MWIFIEX_IFACE_WORK_FW_DUMP, | 433 | MWIFIEX_IFACE_WORK_FW_DUMP, |
434 | MWIFIEX_IFACE_WORK_CARD_RESET, | ||
434 | }; | 435 | }; |
435 | 436 | ||
436 | struct mwifiex_adapter; | 437 | struct mwifiex_adapter; |
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 | ||
1917 | static struct mmc_host *reset_host; | 1919 | static struct mmc_host *reset_host; |
1918 | static void sdio_card_reset_worker(struct work_struct *work) | 1920 | static 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 | } |
1936 | static DECLARE_WORK(card_reset_work, sdio_card_reset_worker); | 1938 | |
1939 | static 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 */ |
1939 | static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter) | 1950 | static 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 | ||
1947 | static struct mwifiex_if_ops sdio_ops = { | 1963 | static 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 | ||