Blog作者的回复 : wlan_add_card=> wlan_create_thread(wlan_service_main_thread, &priv->MainThread, "wlan_main_service"); =>wlan_service_main_thread=>wlan_exec_next_cmd=> 将调用wlan_enter_ps和wlan_exit_ps sbi_interrupt=>从sdio口上传来的中断数据,sdio_irq_thread=>process_sdio_pending_irqs=>调用func->irq_handler(func);即本. 在mmc_signal_sdio_irq=>将调用wake_up_process(host->sdio_irq_thread);来唤醒该irq处理线程,可能还有其他命令需要处理wlan_exec_next_cmd 这个pxamci_irq就是mmc的物理irq中断了,pxamci_irq=>mmc_signal_sdio_irq(host->mmc); wlan_exec_next_cmd=>只要cmd链表上CmdNode还存在, 那么就会执行wlan_dnld_cmd_to_fw(wlan_private * priv, CmdCtrlNode * CmdNode)将CmdNode中的数据下发下去, 然后重新触发wlan_mod_timer(&Adapter->MrvDrvCommandTimer, MRVDRV_TIMER_5S); 也就是wlan_cmd_timeout_func命令超时处理函数, 在cmd已经有了恢复之后,在主线程中调用wlan_process_cmdresp,立即调用wlan_cancel_timer(&Adapter->MrvDrvCommandTimer);来删除定时器 wlan_service_main_thread=>每次唤醒都会检查 ==== /* Execute the next command */ if (!priv->wlan_dev.cmd_sent && !Adapter->CurCmd) wlan_exec_next_cmd(priv); ==== wlan_prepare_cmd=> wlan_hostcmd_ioctl=> 获取一个空闲的CmdNode节点wlan_get_cmd_node,当完成赋值之后,执行如下语句,将CmdNode节点添加到处理队列中: wlan_insert_cmd_to_pending_q(Adapter, CmdNode, TRUE); wake_up_interruptible(&priv->MainThread.waitQ); 另外在数组中 /* * iwconfig settable callbacks */ static const iw_handler wlan_handler[]这个数组中全部是回调函数, /** wlan_handler_def */ struct iw_handler_def wlan_handler_def = { num_standard:sizeof(wlan_handler) / sizeof(iw_handler), num_private:sizeof(wlan_private_handler) / sizeof(iw_handler), num_private_args:sizeof(wlan_private_args) / sizeof(struct iw_priv_args), standard:(iw_handler *) wlan_handler, private:(iw_handler *) wlan_private_handler, private_args:(struct iw_priv_args *) wlan_private_args, #if WIRELESS_EXT > 20 get_wireless_stats:wlan_get_wireless_stats, #endif }; 在wlan_add_card函数中 dev->wireless_handlers = (struct iw_handler_def *) &wlan_handler_def; ===============在kernel的net中使用wireless extention扩展接口 static iw_handler get_handler(struct net_device *dev, unsigned int cmd) { /* Don't "optimise" the following variable, it will crash */ unsigned int index; /* *MUST* be unsigned */ /* Check if we have some wireless handlers defined */ if (dev->wireless_handlers == NULL) return NULL; /* Try as a standard command */ index = cmd - SIOCIWFIRST; if (index < dev->wireless_handlers->num_standard) return dev->wireless_handlers->standard[index]; /* Try as a private command */ index = cmd - SIOCIWFIRSTPRIV; if (index < dev->wireless_handlers->num_private) return dev->wireless_handlers->private[index]; /* Not found */ return NULL; } =>sock_ioctl =>dev_ioctl +++/* Take care of Wireless Extensions */ +++if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) +++return wext_handle_ioctl(net, &ifr, cmd, arg); =>wext_handle_ioctl =>wireless_process_ioctl(struct net *net, struct ifreq *ifr, unsigned int cmd) =>get_handler(dev, cmd);如果没有实现该cmd,那么将调用dev->do_ioctl来处理, wlan_reassoc_timer_func=> wmm_start_queue=> wlan_tx_packet=> wlan_tx_timeout=> wlan_remove_card=> wlan_hostcmd_ioctl=> wlan_auto_deep_sleep=> wlan_set_deep_sleep=> wlan_prepare_cmd=> wlan_cmd_timeout_func=> 将调用wake_up_interruptible(&priv->MainThread.waitQ);唤醒wlan_service_main_thread主处理线程. wlan_hard_start_xmit=>wlan_tx_packet发送数据包 dev->tx_timeout = wlan_tx_timeout; wlan_initialize_timer(&Adapter->MrvDrvCommandTimer, wlan_cmd_timeout_func, priv); int wlan_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd) { ... case WLAN_WAKEUP_MT: if (wrq->u.data.length > 0) Adapter->IntCounter++; wake_up_interruptible(&priv->MainThread.waitQ); break; ... } 在wlan_process_cmdresp()处理完该cmd之后,调用 wlan_insert_cmd_to_free_q=>wlan_clean_cmd_noder,从命令链表上删除已经处理完成的cmd_node, wlan_clean_cmd_noder然后pTempNode->CmdWaitQWoken = TRUE;同时如果该cmd_node是一个被阻塞等待的,那么唤醒等待的程序. wake_up_interruptible(&pTempNode->cmdwait_q); |