Lines Matching full:adapter

34  *      - Allocate adapter structure
35 * - Save interface specific operations table in adapter
38 * - Set default adapter structure parameters
47 struct mwifiex_adapter *adapter; in mwifiex_register() local
50 adapter = kzalloc(sizeof(struct mwifiex_adapter), GFP_KERNEL); in mwifiex_register()
51 if (!adapter) in mwifiex_register()
54 *padapter = adapter; in mwifiex_register()
55 adapter->card = card; in mwifiex_register()
57 /* Save interface specific operations in adapter */ in mwifiex_register()
58 memmove(&adapter->if_ops, if_ops, sizeof(struct mwifiex_if_ops)); in mwifiex_register()
61 if (adapter->if_ops.init_if(adapter)) in mwifiex_register()
64 adapter->priv_num = 0; in mwifiex_register()
67 adapter->priv[0] = kzalloc(sizeof(struct mwifiex_private), in mwifiex_register()
69 if (!adapter->priv[0]) { in mwifiex_register()
70 dev_err(adapter->dev, "%s: failed to alloc priv[0]\n", in mwifiex_register()
75 adapter->priv_num++; in mwifiex_register()
77 adapter->priv[0]->adapter = adapter; in mwifiex_register()
78 mwifiex_init_lock_list(adapter); in mwifiex_register()
80 init_timer(&adapter->cmd_timer); in mwifiex_register()
81 adapter->cmd_timer.function = mwifiex_cmd_timeout_func; in mwifiex_register()
82 adapter->cmd_timer.data = (unsigned long) adapter; in mwifiex_register()
87 dev_dbg(adapter->dev, "info: leave mwifiex_register with error\n"); in mwifiex_register()
89 for (i = 0; i < adapter->priv_num; i++) in mwifiex_register()
90 kfree(adapter->priv[i]); in mwifiex_register()
92 kfree(adapter); in mwifiex_register()
105 * - Free adapter structure
107 static int mwifiex_unregister(struct mwifiex_adapter *adapter) in mwifiex_unregister() argument
111 del_timer(&adapter->cmd_timer); in mwifiex_unregister()
114 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_unregister()
115 if (adapter->priv[i]) { in mwifiex_unregister()
116 mwifiex_free_curr_bcn(adapter->priv[i]); in mwifiex_unregister()
117 kfree(adapter->priv[i]); in mwifiex_unregister()
121 kfree(adapter); in mwifiex_unregister()
140 int mwifiex_main_process(struct mwifiex_adapter *adapter) in mwifiex_main_process() argument
145 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_main_process()
148 if (adapter->mwifiex_processing) { in mwifiex_main_process()
149 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_main_process()
152 adapter->mwifiex_processing = true; in mwifiex_main_process()
153 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_main_process()
157 if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) || in mwifiex_main_process()
158 (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)) in mwifiex_main_process()
162 if (adapter->int_status) { in mwifiex_main_process()
163 if (adapter->hs_activated) in mwifiex_main_process()
164 mwifiex_process_hs_config(adapter); in mwifiex_main_process()
165 adapter->if_ops.process_int_status(adapter); in mwifiex_main_process()
169 if ((adapter->ps_state == PS_STATE_SLEEP) && in mwifiex_main_process()
170 (adapter->pm_wakeup_card_req && in mwifiex_main_process()
171 !adapter->pm_wakeup_fw_try) && in mwifiex_main_process()
172 (is_command_pending(adapter) in mwifiex_main_process()
173 || !mwifiex_wmm_lists_empty(adapter))) { in mwifiex_main_process()
174 adapter->pm_wakeup_fw_try = true; in mwifiex_main_process()
175 adapter->if_ops.wakeup(adapter); in mwifiex_main_process()
178 if (IS_CARD_RX_RCVD(adapter)) { in mwifiex_main_process()
179 adapter->pm_wakeup_fw_try = false; in mwifiex_main_process()
180 if (adapter->ps_state == PS_STATE_SLEEP) in mwifiex_main_process()
181 adapter->ps_state = PS_STATE_AWAKE; in mwifiex_main_process()
184 if (adapter->pm_wakeup_fw_try) in mwifiex_main_process()
186 if (adapter->ps_state != PS_STATE_AWAKE || in mwifiex_main_process()
187 adapter->tx_lock_flag) in mwifiex_main_process()
190 if (adapter->scan_processing || adapter->data_sent in mwifiex_main_process()
191 || mwifiex_wmm_lists_empty(adapter)) { in mwifiex_main_process()
192 if (adapter->cmd_sent || adapter->curr_cmd in mwifiex_main_process()
193 || (!is_command_pending(adapter))) in mwifiex_main_process()
199 if (adapter->cmd_resp_received) { in mwifiex_main_process()
200 adapter->cmd_resp_received = false; in mwifiex_main_process()
201 mwifiex_process_cmdresp(adapter); in mwifiex_main_process()
204 if (adapter->hw_status == MWIFIEX_HW_STATUS_INIT_DONE) { in mwifiex_main_process()
205 adapter->hw_status = MWIFIEX_HW_STATUS_READY; in mwifiex_main_process()
206 mwifiex_init_fw_complete(adapter); in mwifiex_main_process()
211 if (adapter->event_received) { in mwifiex_main_process()
212 adapter->event_received = false; in mwifiex_main_process()
213 mwifiex_process_event(adapter); in mwifiex_main_process()
218 if (adapter->ps_state == PS_STATE_PRE_SLEEP) { in mwifiex_main_process()
219 if (!adapter->cmd_sent && !adapter->curr_cmd) in mwifiex_main_process()
220 mwifiex_check_ps_cond(adapter); in mwifiex_main_process()
226 if ((adapter->ps_state == PS_STATE_SLEEP) in mwifiex_main_process()
227 || (adapter->ps_state == PS_STATE_PRE_SLEEP) in mwifiex_main_process()
228 || (adapter->ps_state == PS_STATE_SLEEP_CFM) in mwifiex_main_process()
229 || adapter->tx_lock_flag) in mwifiex_main_process()
232 if (!adapter->cmd_sent && !adapter->curr_cmd) { in mwifiex_main_process()
233 if (mwifiex_exec_next_cmd(adapter) == -1) { in mwifiex_main_process()
239 if (!adapter->scan_processing && !adapter->data_sent && in mwifiex_main_process()
240 !mwifiex_wmm_lists_empty(adapter)) { in mwifiex_main_process()
241 mwifiex_wmm_process_tx(adapter); in mwifiex_main_process()
242 if (adapter->hs_activated) { in mwifiex_main_process()
243 adapter->is_hs_configured = false; in mwifiex_main_process()
246 (adapter, MWIFIEX_BSS_ROLE_ANY), in mwifiex_main_process()
251 if (adapter->delay_null_pkt && !adapter->cmd_sent && in mwifiex_main_process()
252 !adapter->curr_cmd && !is_command_pending(adapter) in mwifiex_main_process()
253 && mwifiex_wmm_lists_empty(adapter)) { in mwifiex_main_process()
255 (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA), in mwifiex_main_process()
258 adapter->delay_null_pkt = false; in mwifiex_main_process()
259 adapter->ps_state = PS_STATE_SLEEP; in mwifiex_main_process()
265 if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) in mwifiex_main_process()
268 spin_lock_irqsave(&adapter->main_proc_lock, flags); in mwifiex_main_process()
269 adapter->mwifiex_processing = false; in mwifiex_main_process()
270 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); in mwifiex_main_process()
273 if (adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) in mwifiex_main_process()
274 mwifiex_shutdown_drv(adapter); in mwifiex_main_process()
279 * This function frees the adapter structure.
284 static void mwifiex_free_adapter(struct mwifiex_adapter *adapter) in mwifiex_free_adapter() argument
286 if (!adapter) { in mwifiex_free_adapter()
287 pr_err("%s: adapter is NULL\n", __func__); in mwifiex_free_adapter()
291 mwifiex_unregister(adapter); in mwifiex_free_adapter()
292 pr_debug("info: %s: free adapter\n", __func__); in mwifiex_free_adapter()
300 * - Allocate and initialize the adapter structure
304 static int mwifiex_init_hw_fw(struct mwifiex_adapter *adapter) in mwifiex_init_hw_fw() argument
311 err = request_firmware(&adapter->firmware, adapter->fw_name, in mwifiex_init_hw_fw()
312 adapter->dev); in mwifiex_init_hw_fw()
314 dev_err(adapter->dev, "request_firmware() returned" in mwifiex_init_hw_fw()
319 fw.fw_buf = (u8 *) adapter->firmware->data; in mwifiex_init_hw_fw()
320 fw.fw_len = adapter->firmware->size; in mwifiex_init_hw_fw()
322 ret = mwifiex_dnld_fw(adapter, &fw); in mwifiex_init_hw_fw()
326 dev_notice(adapter->dev, "WLAN FW is active\n"); in mwifiex_init_hw_fw()
328 adapter->init_wait_q_woken = false; in mwifiex_init_hw_fw()
329 ret = mwifiex_init_fw(adapter); in mwifiex_init_hw_fw()
333 adapter->hw_status = MWIFIEX_HW_STATUS_READY; in mwifiex_init_hw_fw()
337 wait_event_interruptible(adapter->init_wait_q, in mwifiex_init_hw_fw()
338 adapter->init_wait_q_woken); in mwifiex_init_hw_fw()
339 if (adapter->hw_status != MWIFIEX_HW_STATUS_READY) { in mwifiex_init_hw_fw()
346 if (adapter->firmware) in mwifiex_init_hw_fw()
347 release_firmware(adapter->firmware); in mwifiex_init_hw_fw()
427 dev_dbg(priv->adapter->dev, "data: %lu BSS(%d): Data <= kernel\n", in mwifiex_hard_start_xmit()
430 if (priv->adapter->surprise_removed) { in mwifiex_hard_start_xmit()
436 dev_err(priv->adapter->dev, "Tx: bad skb len %d\n", skb->len); in mwifiex_hard_start_xmit()
442 dev_dbg(priv->adapter->dev, in mwifiex_hard_start_xmit()
449 dev_err(priv->adapter->dev, "Tx: cannot alloca new_skb\n"); in mwifiex_hard_start_xmit()
456 dev_dbg(priv->adapter->dev, "info: new skb headroomd %d\n", in mwifiex_hard_start_xmit()
464 mwifiex_wmm_add_buf_txqueue(priv->adapter, skb); in mwifiex_hard_start_xmit()
465 atomic_inc(&priv->adapter->tx_pending); in mwifiex_hard_start_xmit()
467 if (atomic_read(&priv->adapter->tx_pending) >= MAX_TX_PENDING) { in mwifiex_hard_start_xmit()
469 mwifiex_stop_net_dev_queue(priv->netdev, priv->adapter); in mwifiex_hard_start_xmit()
472 queue_work(priv->adapter->workqueue, &priv->adapter->main_work); in mwifiex_hard_start_xmit()
496 dev_err(priv->adapter->dev, "set mac address failed: ret=%d" in mwifiex_set_mac_address()
534 dev_err(priv->adapter->dev, "%lu : Tx timeout, bss_index=%d\n", in mwifiex_tx_timeout()
595 int is_command_pending(struct mwifiex_adapter *adapter) in is_command_pending() argument
600 spin_lock_irqsave(&adapter->cmd_pending_q_lock, flags); in is_command_pending()
601 is_cmd_pend_q_empty = list_empty(&adapter->cmd_pending_q); in is_command_pending()
602 spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, flags); in is_command_pending()
612 mwifiex_bss_index_to_priv(struct mwifiex_adapter *adapter, u8 bss_index) in mwifiex_bss_index_to_priv() argument
614 if (!adapter || (bss_index >= adapter->priv_num)) in mwifiex_bss_index_to_priv()
616 return adapter->priv[bss_index]; in mwifiex_bss_index_to_priv()
627 struct mwifiex_adapter *adapter = in mwifiex_main_work_queue() local
630 if (adapter->surprise_removed) in mwifiex_main_work_queue()
632 mwifiex_main_process(adapter); in mwifiex_main_work_queue()
640 mwifiex_terminate_workqueue(struct mwifiex_adapter *adapter) in mwifiex_terminate_workqueue() argument
642 flush_workqueue(adapter->workqueue); in mwifiex_terminate_workqueue()
643 destroy_workqueue(adapter->workqueue); in mwifiex_terminate_workqueue()
644 adapter->workqueue = NULL; in mwifiex_terminate_workqueue()
653 * adapter structure
664 struct mwifiex_adapter *adapter; in mwifiex_add_card() local
671 if (mwifiex_register(card, if_ops, (void **)&adapter)) { in mwifiex_add_card()
676 adapter->iface_type = iface_type; in mwifiex_add_card()
678 adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING; in mwifiex_add_card()
679 adapter->surprise_removed = false; in mwifiex_add_card()
680 init_waitqueue_head(&adapter->init_wait_q); in mwifiex_add_card()
681 adapter->is_suspended = false; in mwifiex_add_card()
682 adapter->hs_activated = false; in mwifiex_add_card()
683 init_waitqueue_head(&adapter->hs_activate_wait_q); in mwifiex_add_card()
684 adapter->cmd_wait_q_required = false; in mwifiex_add_card()
685 init_waitqueue_head(&adapter->cmd_wait_q.wait); in mwifiex_add_card()
686 adapter->cmd_wait_q.status = 0; in mwifiex_add_card()
687 adapter->scan_wait_q_woken = false; in mwifiex_add_card()
689 adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE"); in mwifiex_add_card()
690 if (!adapter->workqueue) in mwifiex_add_card()
693 INIT_WORK(&adapter->main_work, mwifiex_main_work_queue); in mwifiex_add_card()
697 if (adapter->if_ops.register_dev(adapter)) { in mwifiex_add_card()
702 if (mwifiex_init_hw_fw(adapter)) { in mwifiex_add_card()
707 priv = adapter->priv[0]; in mwifiex_add_card()
710 dev_err(adapter->dev, "cannot register netdevice" in mwifiex_add_card()
720 dev_err(adapter->dev, "cannot create default station" in mwifiex_add_card()
729 mwifiex_drv_get_driver_version(adapter, fmt, sizeof(fmt) - 1); in mwifiex_add_card()
730 dev_notice(adapter->dev, "driver_version = %s\n", fmt); in mwifiex_add_card()
740 adapter->if_ops.unregister_dev(adapter); in mwifiex_add_card()
742 adapter->surprise_removed = true; in mwifiex_add_card()
743 mwifiex_terminate_workqueue(adapter); in mwifiex_add_card()
745 if ((adapter->hw_status == MWIFIEX_HW_STATUS_FW_READY) || in mwifiex_add_card()
746 (adapter->hw_status == MWIFIEX_HW_STATUS_READY)) { in mwifiex_add_card()
748 adapter->init_wait_q_woken = false; in mwifiex_add_card()
750 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS) in mwifiex_add_card()
751 wait_event_interruptible(adapter->init_wait_q, in mwifiex_add_card()
752 adapter->init_wait_q_woken); in mwifiex_add_card()
755 mwifiex_free_adapter(adapter); in mwifiex_add_card()
774 * - Free the adapter structure
776 int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem) in mwifiex_remove_card() argument
784 if (!adapter) in mwifiex_remove_card()
787 adapter->surprise_removed = true; in mwifiex_remove_card()
790 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_remove_card()
791 priv = adapter->priv[i]; in mwifiex_remove_card()
795 adapter); in mwifiex_remove_card()
801 dev_dbg(adapter->dev, "cmd: calling mwifiex_shutdown_drv...\n"); in mwifiex_remove_card()
802 adapter->init_wait_q_woken = false; in mwifiex_remove_card()
804 if (mwifiex_shutdown_drv(adapter) == -EINPROGRESS) in mwifiex_remove_card()
805 wait_event_interruptible(adapter->init_wait_q, in mwifiex_remove_card()
806 adapter->init_wait_q_woken); in mwifiex_remove_card()
807 dev_dbg(adapter->dev, "cmd: mwifiex_shutdown_drv done\n"); in mwifiex_remove_card()
808 if (atomic_read(&adapter->rx_pending) || in mwifiex_remove_card()
809 atomic_read(&adapter->tx_pending) || in mwifiex_remove_card()
810 atomic_read(&adapter->cmd_pending)) { in mwifiex_remove_card()
811 dev_err(adapter->dev, "rx_pending=%d, tx_pending=%d, " in mwifiex_remove_card()
813 atomic_read(&adapter->rx_pending), in mwifiex_remove_card()
814 atomic_read(&adapter->tx_pending), in mwifiex_remove_card()
815 atomic_read(&adapter->cmd_pending)); in mwifiex_remove_card()
818 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_remove_card()
819 priv = adapter->priv[i]; in mwifiex_remove_card()
831 priv = adapter->priv[0]; in mwifiex_remove_card()
841 mwifiex_terminate_workqueue(adapter); in mwifiex_remove_card()
844 dev_dbg(adapter->dev, "info: unregister device\n"); in mwifiex_remove_card()
845 adapter->if_ops.unregister_dev(adapter); in mwifiex_remove_card()
846 /* Free adapter structure */ in mwifiex_remove_card()
847 dev_dbg(adapter->dev, "info: free adapter\n"); in mwifiex_remove_card()
848 mwifiex_free_adapter(adapter); in mwifiex_remove_card()