[PATCH 2/2] staging: wilc1000: remove RX_BH_TYPE
Tony Cho
tony.cho at atmel.com
Tue Sep 15 01:17:41 UTC 2015
Hi Greg,
I am sorry but please ignore this patch in this time.
It's my mistake to include this patch from my queue into the series of 7 patches.
Thanks,
Tony.
On 2015년 09월 11일 16:52, Tony Cho wrote:
> This patch removes the preprocessor definition, RX_BH_TYPE and uses the
> request_threaded_irq instead of kernel thread to execute the interrupt
> handler.
>
> As a result, linux_wlan_enable_irq() and linux_wlan_disable_irq() are also
> removed from the linux_wlan.c file.
>
> Signed-off-by: Tony Cho <tony.cho at atmel.com>
> ---
> drivers/staging/wilc1000/linux_wlan.c | 148 +-------------------------
> drivers/staging/wilc1000/linux_wlan_common.h | 3 -
> drivers/staging/wilc1000/wilc_wfi_netdevice.h | 16 ---
> drivers/staging/wilc1000/wilc_wlan.c | 3 -
> 4 files changed, 2 insertions(+), 168 deletions(-)
>
> diff --git a/drivers/staging/wilc1000/linux_wlan.c b/drivers/staging/wilc1000/linux_wlan.c
> index 9be0282..7265f93 100644
> --- a/drivers/staging/wilc1000/linux_wlan.c
> +++ b/drivers/staging/wilc1000/linux_wlan.c
> @@ -300,89 +300,31 @@ static int dev_state_ev_handler(struct notifier_block *this, unsigned long event
> }
> #endif
>
> -/*
> - * Interrupt initialization and handling functions
> - */
> -
> -void linux_wlan_enable_irq(void)
> -{
> -
> -#if (RX_BH_TYPE != RX_BH_THREADED_IRQ)
> -#if (defined WILC_SPI) || (defined WILC_SDIO_IRQ_GPIO)
> - PRINT_D(INT_DBG, "Enabling IRQ ...\n");
> - enable_irq(g_linux_wlan->dev_irq_num);
> -#endif
> -#endif
> -}
> -
> -void linux_wlan_disable_irq(int wait)
> -{
> -#if (defined WILC_SPI) || (defined WILC_SDIO_IRQ_GPIO)
> - if (wait) {
> - PRINT_D(INT_DBG, "Disabling IRQ ...\n");
> - disable_irq(g_linux_wlan->dev_irq_num);
> - } else {
> - PRINT_D(INT_DBG, "Disabling IRQ ...\n");
> - disable_irq_nosync(g_linux_wlan->dev_irq_num);
> - }
> -#endif
> -}
> -
> #if (defined WILC_SPI) || (defined WILC_SDIO_IRQ_GPIO)
> static irqreturn_t isr_uh_routine(int irq, void *user_data)
> {
> -#if (RX_BH_TYPE != RX_BH_THREADED_IRQ)
> - linux_wlan_disable_irq(IRQ_NO_WAIT);
> -#endif
> PRINT_D(INT_DBG, "Interrupt received UH\n");
>
> /*While mac is closing cacncel the handling of any interrupts received*/
> if (g_linux_wlan->close) {
> PRINT_ER("Driver is CLOSING: Can't handle UH interrupt\n");
> - #if (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> return IRQ_HANDLED;
> - #else
> - return IRQ_NONE;
> - #endif
> -
> }
> -#if (RX_BH_TYPE == RX_BH_WORK_QUEUE)
> - schedule_work(&g_linux_wlan->rx_work_queue);
> - return IRQ_HANDLED;
> -#elif (RX_BH_TYPE == RX_BH_KTHREAD)
> - up(&g_linux_wlan->rx_sem);
> - return IRQ_HANDLED;
> -#elif (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> return IRQ_WAKE_THREAD;
> -#endif
>
> }
> #endif
>
> -#if (RX_BH_TYPE == RX_BH_WORK_QUEUE || RX_BH_TYPE == RX_BH_THREADED_IRQ)
> -
> -#if (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> irqreturn_t isr_bh_routine(int irq, void *userdata)
> {
> linux_wlan_t *nic;
>
> nic = (linux_wlan_t *)userdata;
> -#else
> -static void isr_bh_routine(struct work_struct *work)
> -{
> - perInterface_wlan_t *nic;
> -
> - nic = (perInterface_wlan_t *)container_of(work, linux_wlan_t, rx_work_queue);
> -#endif
>
> /*While mac is closing cacncel the handling of any interrupts received*/
> if (g_linux_wlan->close) {
> PRINT_ER("Driver is CLOSING: Can't handle BH interrupt\n");
> - #if (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> return IRQ_HANDLED;
> - #else
> - return;
> - #endif
> }
>
> PRINT_D(INT_DBG, "Interrupt received BH\n");
> @@ -391,36 +333,8 @@ static void isr_bh_routine(struct work_struct *work)
> else
> PRINT_ER("wlan_handle_rx_isr() hasn't been initialized\n");
>
> -#if (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> return IRQ_HANDLED;
> -#endif
> -}
> -#elif (RX_BH_TYPE == RX_BH_KTHREAD)
> -static int isr_bh_routine(void *vp)
> -{
> - linux_wlan_t *nic;
> -
> - nic = (linux_wlan_t *)vp;
> -
> - while (1) {
> - down(&nic->rx_sem);
> - if (g_linux_wlan->close) {
> -
> - while (!kthread_should_stop())
> - schedule();
> -
> - break;
> - }
> - PRINT_D(INT_DBG, "Interrupt received BH\n");
> - if (g_linux_wlan->oup.wlan_handle_rx_isr != 0)
> - g_linux_wlan->oup.wlan_handle_rx_isr();
> - else
> - PRINT_ER("wlan_handle_rx_isr() hasn't been initialized\n");
> - }
> -
> - return 0;
> }
> -#endif
>
> #if (defined WILC_SPI) || (defined WILC_SDIO_IRQ_GPIO)
> static int init_irq(linux_wlan_t *p_nic)
> @@ -446,17 +360,10 @@ static int init_irq(linux_wlan_t *p_nic)
> PRINT_ER("could not obtain gpio for WILC_INTR\n");
> }
>
> -#if (RX_BH_TYPE == RX_BH_THREADED_IRQ)
> if ((ret != -1) && (request_threaded_irq(nic->dev_irq_num, isr_uh_routine, isr_bh_routine,
> IRQF_TRIGGER_LOW | IRQF_ONESHOT, /*Without IRQF_ONESHOT the uh will remain kicked in and dont gave a chance to bh*/
> "WILC_IRQ", nic)) < 0) {
>
> -#else
> - /*Request IRQ*/
> - if ((ret != -1) && (request_irq(nic->dev_irq_num, isr_uh_routine,
> - IRQF_TRIGGER_LOW, "WILC_IRQ", nic) < 0)) {
> -
> -#endif
> PRINT_ER("Failed to request IRQ for GPIO: %d\n", GPIO_NUM);
> ret = -1;
> } else {
> @@ -1105,18 +1012,11 @@ void wilc1000_wlan_deinit(linux_wlan_t *nic)
> #endif
>
> PRINT_D(INIT_DBG, "Disabling IRQ\n");
> - #if (!defined WILC_SDIO) || (defined WILC_SDIO_IRQ_GPIO)
> - linux_wlan_disable_irq(IRQ_WAIT);
> - #else
> - #if defined(PLAT_ALLWINNER_A20) || defined(PLAT_ALLWINNER_A23) || defined(PLAT_ALLWINNER_A31)
> -
> - #else
> + #ifdef WILC_SDIO
> mutex_lock(&g_linux_wlan->hif_cs);
> disable_sdio_interrupt();
> mutex_unlock(&g_linux_wlan->hif_cs);
> - #endif
> - #endif
> -
> + #endif
> /* not sure if the following unlocks are needed or not*/
> if (&g_linux_wlan->rxq_event != NULL)
> up(&g_linux_wlan->rxq_event);
> @@ -1124,16 +1024,6 @@ void wilc1000_wlan_deinit(linux_wlan_t *nic)
> if (&g_linux_wlan->txq_event != NULL)
> up(&g_linux_wlan->txq_event);
>
> - #if (RX_BH_TYPE == RX_BH_WORK_QUEUE)
> - /*Removing the work struct from the linux kernel workqueue*/
> - if (&g_linux_wlan->rx_work_queue != NULL)
> - flush_work(&g_linux_wlan->rx_work_queue);
> -
> - #elif (RX_BH_TYPE == RX_BH_KTHREAD)
> - /* if(&nic->rx_sem != NULL) */
> - /* up(&nic->rx_sem); */
> - #endif
> -
> PRINT_D(INIT_DBG, "Deinitializing Threads\n");
> wlan_deinitialize_threads(nic);
>
> @@ -1193,10 +1083,6 @@ int wlan_init_locks(linux_wlan_t *p_nic)
> sema_init(&g_linux_wlan->rxq_thread_started, 0);
> sema_init(&g_linux_wlan->txq_thread_started, 0);
>
> - #if (RX_BH_TYPE == RX_BH_KTHREAD)
> - sema_init(&g_linux_wlan->rx_sem, 0);
> - #endif
> -
> return 0;
> }
>
> @@ -1274,19 +1160,6 @@ int wlan_initialize_threads(perInterface_wlan_t *nic)
>
> PRINT_D(INIT_DBG, "Initializing Threads ...\n");
>
> -#if (RX_BH_TYPE == RX_BH_WORK_QUEUE)
> - /*Initialize rx work queue task*/
> - INIT_WORK(&g_linux_wlan->rx_work_queue, isr_bh_routine);
> -#elif (RX_BH_TYPE == RX_BH_KTHREAD)
> - PRINT_D(INIT_DBG, "Creating kthread for Rxq BH\n");
> - g_linux_wlan->rx_bh_thread = kthread_run(isr_bh_routine, (void *)g_linux_wlan, "K_RXQ_BH");
> - if (g_linux_wlan->rx_bh_thread == 0) {
> - PRINT_ER("couldn't create RX BH thread\n");
> - ret = -ENOBUFS;
> - goto _fail_;
> - }
> -#endif
> -
> #ifndef TCP_ENHANCEMENTS
> /* create rx task */
> PRINT_D(INIT_DBG, "Creating kthread for reception\n");
> @@ -1333,13 +1206,6 @@ _fail_2:
> #ifndef TCP_ENHANCEMENTS
> _fail_1:
> #endif
> - #if (RX_BH_TYPE == RX_BH_KTHREAD)
> - /*De-Initialize 1st thread*/
> - g_linux_wlan->close = 1;
> - up(&g_linux_wlan->rx_sem);
> - kthread_stop(g_linux_wlan->rx_bh_thread);
> -_fail_:
> - #endif
> g_linux_wlan->close = 0;
> return ret;
> }
> @@ -1364,16 +1230,6 @@ static void wlan_deinitialize_threads(linux_wlan_t *nic)
> kthread_stop(g_linux_wlan->txq_thread);
> g_linux_wlan->txq_thread = NULL;
> }
> -
> - #if (RX_BH_TYPE == RX_BH_KTHREAD)
> - if (&g_linux_wlan->rx_sem != NULL)
> - up(&g_linux_wlan->rx_sem);
> -
> - if (g_linux_wlan->rx_bh_thread != NULL) {
> - kthread_stop(g_linux_wlan->rx_bh_thread);
> - g_linux_wlan->rx_bh_thread = NULL;
> - }
> - #endif
> }
>
> #ifdef COMPLEMENT_BOOT
> diff --git a/drivers/staging/wilc1000/linux_wlan_common.h b/drivers/staging/wilc1000/linux_wlan_common.h
> index 5d13c15..28bdc40 100644
> --- a/drivers/staging/wilc1000/linux_wlan_common.h
> +++ b/drivers/staging/wilc1000/linux_wlan_common.h
> @@ -168,7 +168,4 @@ extern atomic_t DEBUG_LEVEL;
> #define MODALIAS "WILC_SPI"
> #define GPIO_NUM 0x44
> #endif
> -
> -
> -void linux_wlan_enable_irq(void);
> #endif
> diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
> index f8064f0..cd80934 100644
> --- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
> +++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
> @@ -70,17 +70,7 @@ struct WILC_WFI_stats {
> * This structure is private to each device. It is used to pass
> * packets in and out, so there is place for a packet
> */
> -
> -#define RX_BH_KTHREAD 0
> -#define RX_BH_WORK_QUEUE 1
> -#define RX_BH_THREADED_IRQ 2
> #define num_reg_frame 2
> -/*
> - * If you use RX_BH_WORK_QUEUE on LPC3131: You may lose the first interrupt on
> - * LPC3131 which is important to get the MAC start status when you are blocked
> - * inside linux_wlan_firmware_download() which blocks mac_open().
> - */
> - #define RX_BH_TYPE RX_BH_KTHREAD
>
> struct wilc_wfi_key {
> u8 *key;
> @@ -197,12 +187,6 @@ typedef struct {
> struct semaphore sync_event;
> struct semaphore txq_event;
>
> -#if (RX_BH_TYPE == RX_BH_WORK_QUEUE)
> - struct work_struct rx_work_queue;
> -#elif (RX_BH_TYPE == RX_BH_KTHREAD)
> - struct task_struct *rx_bh_thread;
> - struct semaphore rx_sem;
> -#endif
> struct semaphore rxq_thread_started;
> struct semaphore txq_thread_started;
>
> diff --git a/drivers/staging/wilc1000/wilc_wlan.c b/drivers/staging/wilc1000/wilc_wlan.c
> index 39716ba..44100a5 100644
> --- a/drivers/staging/wilc1000/wilc_wlan.c
> +++ b/drivers/staging/wilc1000/wilc_wlan.c
> @@ -1448,9 +1448,6 @@ void wilc_handle_isr(void)
> #endif
> wilc_unknown_isr_ext();
> }
> -#if ((!defined WILC_SDIO) || (defined WILC_SDIO_IRQ_GPIO))
> - linux_wlan_enable_irq();
> -#endif
> release_bus(RELEASE_ALLOW_SLEEP);
> }
>
More information about the devel
mailing list