/* * Callback function invoked by Netlink service for all netlink * messages (from user space) addressed to WLAN_NL_MSG_BTC */ int btc_msg_callback (struct sk_buff * skb) { struct nlmsghdr *nlh; tAniMsgHdr *msg_hdr; tSmeBtEvent *btEvent = NULL; nlh = (struct nlmsghdr *)skb->data; msg_hdr = NLMSG_DATA(nlh); /* Continue with parsing payload. */ switch(msg_hdr->type) { case WLAN_BTC_QUERY_STATE_REQ: VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "BTC: Received probe from BTC Service\n"); send_btc_nlink_msg(WLAN_BTC_QUERY_STATE_RSP, nlh->nlmsg_pid); break; case WLAN_BTC_BT_EVENT_IND: VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "BTC: Received Bluetooth event indication\n"); if(msg_hdr->length != sizeof(tSmeBtEvent)) { VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "BTC: Size mismatch in BT event data\n"); break; } btEvent = (tSmeBtEvent*)((char*)msg_hdr + sizeof(tAniMsgHdr)); (void)sme_BtcSignalBtEvent(pHddCtx->hHal, btEvent); break; default: VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "BTC: Received Invalid Msg type [%d]\n", msg_hdr->type); break; } return 0; }
static int hif_usb_probe(struct usb_interface *interface, const struct usb_device_id *id) { int ret = 0; struct hif_usb_softc *sc; struct ol_softc *ol_sc; struct usb_device *pdev = interface_to_usbdev(interface); int vendor_id, product_id; pr_info("hif_usb_probe\n"); usb_get_dev(pdev); vendor_id = le16_to_cpu(pdev->descriptor.idVendor); product_id = le16_to_cpu(pdev->descriptor.idProduct); ret = 0; sc = A_MALLOC(sizeof(*sc)); if (!sc) { ret = -ENOMEM; goto err_alloc; } OS_MEMZERO(sc, sizeof(*sc)); sc->pdev = (void *)pdev; sc->dev = &pdev->dev; sc->aps_osdev.bdev = pdev; sc->aps_osdev.device = &pdev->dev; sc->aps_osdev.bc.bc_bustype = HAL_BUS_TYPE_AHB; sc->devid = id->idProduct; adf_os_spinlock_init(&sc->target_lock); ol_sc = A_MALLOC(sizeof(*ol_sc)); if (!ol_sc) goto err_attach; OS_MEMZERO(ol_sc, sizeof(*ol_sc)); ol_sc->sc_osdev = &sc->aps_osdev; ol_sc->hif_sc = (void *)sc; sc->ol_sc = ol_sc; if ((usb_control_msg(pdev, usb_sndctrlpipe(pdev, 0), USB_REQ_SET_CONFIGURATION, 0, 1, 0, NULL, 0, HZ)) < 0) { pr_info("%s[%d]\n\r", __func__, __LINE__); } usb_set_interface(pdev, 0, 0); if (hif_usb_configure(sc, &ol_sc->hif_hdl, interface)) goto err_config; ol_sc->enableuartprint = 1; ol_sc->enablefwlog = 0; ol_sc->enablesinglebinary = FALSE; ol_sc->max_no_of_peers = 1; init_waitqueue_head(&ol_sc->sc_osdev->event_queue); ret = hdd_wlan_startup(&pdev->dev, ol_sc); if (ret) { hif_nointrs(sc); if (sc->hif_device != NULL) { ((HIF_DEVICE_USB *)(sc->hif_device))->sc = NULL; } athdiag_procfs_remove(); goto err_config; } sc->hdd_removed = 0; sc->hdd_removed_processing = 0; sc->hdd_removed_wait_cnt = 0; #ifndef REMOVE_PKT_LOG if (vos_get_conparam() != VOS_FTM_MODE && !WLAN_IS_EPPING_ENABLED(vos_get_conparam())) { /* * pktlog initialization */ ol_pl_sethandle(&ol_sc->pdev_txrx_handle->pl_dev, ol_sc); if (pktlogmod_init(ol_sc)) pr_err("%s: pktlogmod_init failed\n", __func__); } #endif #ifdef WLAN_BTAMP_FEATURE /* Send WLAN UP indication to Nlink Service */ send_btc_nlink_msg(WLAN_MODULE_UP_IND, 0); #endif sc->interface = interface; sc->reboot_notifier.notifier_call = hif_usb_reboot; register_reboot_notifier(&sc->reboot_notifier); usb_sc = sc; return 0; err_config: A_FREE(ol_sc); err_attach: ret = -EIO; usb_sc = NULL; A_FREE(sc); err_alloc: usb_put_dev(pdev); return ret; }