1 //------------------------------------------------------------------------------
2 // Copyright (c) 2009-2010 Atheros Corporation. All rights reserved.
5 // Permission to use, copy, modify, and/or distribute this software for any
6 // purpose with or without fee is hereby granted, provided that the above
7 // copyright notice and this permission notice appear in all copies.
9 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 //------------------------------------------------------------------------------
19 //==============================================================================
20 // HCI bridge implementation
22 // Author(s): ="Atheros"
23 //==============================================================================
25 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
26 #include <linux/etherdevice.h>
34 #include "common_drv.h"
36 #define ATH_DEBUG_HCI_BRIDGE ATH_DEBUG_MAKE_MODULE_MASK(6)
37 #define ATH_DEBUG_HCI_RECV ATH_DEBUG_MAKE_MODULE_MASK(7)
38 #define ATH_DEBUG_HCI_SEND ATH_DEBUG_MAKE_MODULE_MASK(8)
39 #define ATH_DEBUG_HCI_DUMP ATH_DEBUG_MAKE_MODULE_MASK(9)
41 #include "ar6000_drv.h"
42 #endif /* EXPORT_HCI_BRIDGE_INTERFACE */
44 #ifdef ATH_AR6K_ENABLE_GMBOX
45 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
46 #include "export_hci_transport.h"
48 #include "hci_transport_api.h"
50 #include "epping_test.h"
52 #include "ar3kconfig.h"
53 #include <net/bluetooth/bluetooth.h>
54 #include <net/bluetooth/hci_core.h>
56 /* only build on newer kernels which have BT configured */
57 #if defined(CONFIG_BT_MODULE) || defined(CONFIG_BT)
58 #define CONFIG_BLUEZ_HCI_BRIDGE
61 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
62 unsigned int ar3khcibaud = 0;
63 unsigned int hciuartscale = 0;
64 unsigned int hciuartstep = 0;
66 module_param(ar3khcibaud, int, 0644);
67 module_param(hciuartscale, int, 0644);
68 module_param(hciuartstep, int, 0644);
70 extern unsigned int ar3khcibaud;
71 extern unsigned int hciuartscale;
72 extern unsigned int hciuartstep;
73 #endif /* EXPORT_HCI_BRIDGE_INTERFACE */
75 struct ar6k_hci_bridge_info {
76 void *pHCIDev; /* HCI bridge device */
77 struct hci_transport_properties HCIProps; /* HCI bridge props */
78 struct hci_dev *pBtStackHCIDev; /* BT Stack HCI dev */
79 bool HciNormalMode; /* Actual HCI mode enabled (non-TEST)*/
80 bool HciRegistered; /* HCI device registered with stack */
81 struct htc_packet_queue HTCPacketStructHead;
83 spinlock_t BridgeLock;
84 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
85 struct hci_transport_misc_handles HCITransHdl;
88 #endif /* EXPORT_HCI_BRIDGE_INTERFACE */
91 #define MAX_ACL_RECV_BUFS 16
92 #define MAX_EVT_RECV_BUFS 8
93 #define MAX_HCI_WRITE_QUEUE_DEPTH 32
94 #define MAX_ACL_RECV_LENGTH 1200
95 #define MAX_EVT_RECV_LENGTH 257
96 #define TX_PACKET_RSV_OFFSET 32
97 #define NUM_HTC_PACKET_STRUCTS ((MAX_ACL_RECV_BUFS + MAX_EVT_RECV_BUFS + MAX_HCI_WRITE_QUEUE_DEPTH) * 2)
99 #define HCI_GET_OP_CODE(p) (((u16)((p)[1])) << 8) | ((u16)((p)[0]))
101 extern unsigned int setupbtdev;
102 struct ar3k_config_info ar3kconfig;
104 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
105 struct ar6k_hci_bridge_info *g_pHcidevInfo;
108 static int bt_setup_hci(struct ar6k_hci_bridge_info *pHcidevInfo);
109 static void bt_cleanup_hci(struct ar6k_hci_bridge_info *pHcidevInfo);
110 static int bt_register_hci(struct ar6k_hci_bridge_info *pHcidevInfo);
111 static bool bt_indicate_recv(struct ar6k_hci_bridge_info *pHcidevInfo,
112 HCI_TRANSPORT_PACKET_TYPE Type,
113 struct sk_buff *skb);
114 static struct sk_buff *bt_alloc_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, int Length);
115 static void bt_free_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, struct sk_buff *skb);
117 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
118 int ar6000_setup_hci(void *ar);
119 void ar6000_cleanup_hci(void *ar);
120 int hci_test_send(void *ar, struct sk_buff *skb);
122 int ar6000_setup_hci(struct ar6_softc *ar);
123 void ar6000_cleanup_hci(struct ar6_softc *ar);
124 /* HCI bridge testing */
125 int hci_test_send(struct ar6_softc *ar, struct sk_buff *skb);
126 #endif /* EXPORT_HCI_BRIDGE_INTERFACE */
128 #define LOCK_BRIDGE(dev) spin_lock_bh(&(dev)->BridgeLock)
129 #define UNLOCK_BRIDGE(dev) spin_unlock_bh(&(dev)->BridgeLock)
131 static inline void FreeBtOsBuf(struct ar6k_hci_bridge_info *pHcidevInfo, void *osbuf)
133 if (pHcidevInfo->HciNormalMode) {
134 bt_free_buffer(pHcidevInfo, (struct sk_buff *)osbuf);
136 /* in test mode, these are just ordinary netbuf allocations */
137 A_NETBUF_FREE(osbuf);
141 static void FreeHTCStruct(struct ar6k_hci_bridge_info *pHcidevInfo, struct htc_packet *pPacket)
143 LOCK_BRIDGE(pHcidevInfo);
144 HTC_PACKET_ENQUEUE(&pHcidevInfo->HTCPacketStructHead,pPacket);
145 UNLOCK_BRIDGE(pHcidevInfo);
148 static struct htc_packet * AllocHTCStruct(struct ar6k_hci_bridge_info *pHcidevInfo)
150 struct htc_packet *pPacket = NULL;
151 LOCK_BRIDGE(pHcidevInfo);
152 pPacket = HTC_PACKET_DEQUEUE(&pHcidevInfo->HTCPacketStructHead);
153 UNLOCK_BRIDGE(pHcidevInfo);
157 #define BLOCK_ROUND_UP_PWR2(x, align) (((int) (x) + ((align)-1)) & ~((align)-1))
159 static void RefillRecvBuffers(struct ar6k_hci_bridge_info *pHcidevInfo,
160 HCI_TRANSPORT_PACKET_TYPE Type,
165 struct htc_packet_queue queue;
166 struct htc_packet *pPacket;
168 INIT_HTC_PACKET_QUEUE(&queue);
170 if (Type == HCI_ACL_TYPE) {
171 if (pHcidevInfo->HciNormalMode) {
172 length = HCI_MAX_FRAME_SIZE;
174 length = MAX_ACL_RECV_LENGTH;
177 length = MAX_EVT_RECV_LENGTH;
180 /* add on transport head and tail room */
181 length += pHcidevInfo->HCIProps.HeadRoom + pHcidevInfo->HCIProps.TailRoom;
182 /* round up to the required I/O padding */
183 length = BLOCK_ROUND_UP_PWR2(length,pHcidevInfo->HCIProps.IOBlockPad);
185 for (i = 0; i < NumBuffers; i++) {
187 if (pHcidevInfo->HciNormalMode) {
188 osBuf = bt_alloc_buffer(pHcidevInfo,length);
190 osBuf = A_NETBUF_ALLOC(length);
197 pPacket = AllocHTCStruct(pHcidevInfo);
198 if (NULL == pPacket) {
199 FreeBtOsBuf(pHcidevInfo,osBuf);
200 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to alloc HTC struct \n"));
204 SET_HTC_PACKET_INFO_RX_REFILL(pPacket,osBuf,A_NETBUF_DATA(osBuf),length,Type);
206 HTC_PACKET_ENQUEUE(&queue,pPacket);
210 HCI_TransportAddReceivePkts(pHcidevInfo->pHCIDev, &queue);
214 #define HOST_INTEREST_ITEM_ADDRESS(ar, item) \
215 (((ar)->arTargetType == TARGET_TYPE_AR6002) ? AR6002_HOST_INTEREST_ITEM_ADDRESS(item) : \
216 (((ar)->arTargetType == TARGET_TYPE_AR6003) ? AR6003_HOST_INTEREST_ITEM_ADDRESS(item) : 0))
217 static int ar6000_hci_transport_ready(HCI_TRANSPORT_HANDLE HCIHandle,
218 struct hci_transport_properties *pProps,
221 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
223 u32 address, hci_uart_pwr_mgmt_params;
224 // struct ar3k_config_info ar3kconfig;
226 pHcidevInfo->pHCIDev = HCIHandle;
228 memcpy(&pHcidevInfo->HCIProps,pProps,sizeof(*pProps));
230 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE,("HCI ready (hci:0x%lX, headroom:%d, tailroom:%d blockpad:%d) \n",
231 (unsigned long)HCIHandle,
232 pHcidevInfo->HCIProps.HeadRoom,
233 pHcidevInfo->HCIProps.TailRoom,
234 pHcidevInfo->HCIProps.IOBlockPad));
236 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
237 A_ASSERT((pProps->HeadRoom + pProps->TailRoom) <= (struct net_device *)(pHcidevInfo->HCITransHdl.netDevice)->hard_header_len);
239 A_ASSERT((pProps->HeadRoom + pProps->TailRoom) <= pHcidevInfo->ar->arNetDev->hard_header_len);
242 /* provide buffers */
243 RefillRecvBuffers(pHcidevInfo, HCI_ACL_TYPE, MAX_ACL_RECV_BUFS);
244 RefillRecvBuffers(pHcidevInfo, HCI_EVENT_TYPE, MAX_EVT_RECV_BUFS);
247 /* start transport */
248 status = HCI_TransportStart(pHcidevInfo->pHCIDev);
254 if (!pHcidevInfo->HciNormalMode) {
255 /* in test mode, no need to go any further */
259 // The delay is required when AR6K is driving the BT reset line
260 // where time is needed after the BT chip is out of reset (HCI_TransportStart)
261 // and before the first HCI command is issued (AR3KConfigure)
263 // The delay should be configurable and be only applied when AR6K driving the BT
264 // reset line. This could be done by some module parameter or based on some HW config
265 // info. For now apply 100ms delay blindly
268 A_MEMZERO(&ar3kconfig,sizeof(ar3kconfig));
269 ar3kconfig.pHCIDev = pHcidevInfo->pHCIDev;
270 ar3kconfig.pHCIProps = &pHcidevInfo->HCIProps;
271 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
272 ar3kconfig.pHIFDevice = (struct hif_device *)(pHcidevInfo->HCITransHdl.hifDevice);
274 ar3kconfig.pHIFDevice = pHcidevInfo->ar->arHifDevice;
276 ar3kconfig.pBtStackHCIDev = pHcidevInfo->pBtStackHCIDev;
278 if (ar3khcibaud != 0) {
279 /* user wants ar3k baud rate change */
280 ar3kconfig.Flags |= AR3K_CONFIG_FLAG_SET_AR3K_BAUD;
281 ar3kconfig.Flags |= AR3K_CONFIG_FLAG_AR3K_BAUD_CHANGE_DELAY;
282 ar3kconfig.AR3KBaudRate = ar3khcibaud;
285 if ((hciuartscale != 0) || (hciuartstep != 0)) {
286 /* user wants to tune HCI bridge UART scale/step values */
287 ar3kconfig.AR6KScale = (u16)hciuartscale;
288 ar3kconfig.AR6KStep = (u16)hciuartstep;
289 ar3kconfig.Flags |= AR3K_CONFIG_FLAG_SET_AR6K_SCALE_STEP;
292 /* Fetch the address of the hi_hci_uart_pwr_mgmt_params instance in the host interest area */
293 address = TARG_VTOP(pHcidevInfo->ar->arTargetType,
294 HOST_INTEREST_ITEM_ADDRESS(pHcidevInfo->ar, hi_hci_uart_pwr_mgmt_params));
295 status = ar6000_ReadRegDiag(pHcidevInfo->ar->arHifDevice, &address, &hci_uart_pwr_mgmt_params);
297 ar3kconfig.PwrMgmtEnabled = (hci_uart_pwr_mgmt_params & 0x1);
298 ar3kconfig.IdleTimeout = (hci_uart_pwr_mgmt_params & 0xFFFF0000) >> 16;
299 ar3kconfig.WakeupTimeout = (hci_uart_pwr_mgmt_params & 0xFF00) >> 8;
301 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: failed to read hci_uart_pwr_mgmt_params! \n"));
303 /* configure the AR3K device */
304 memcpy(ar3kconfig.bdaddr,pHcidevInfo->ar->bdaddr,6);
305 status = AR3KConfigure(&ar3kconfig);
310 /* Make sure both AR6K and AR3K have power management enabled */
311 if (ar3kconfig.PwrMgmtEnabled) {
312 status = HCI_TransportEnablePowerMgmt(pHcidevInfo->pHCIDev, true);
314 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: failed to enable TLPM for AR6K! \n"));
318 status = bt_register_hci(pHcidevInfo);
325 static void ar6000_hci_transport_failure(void *pContext, int Status)
327 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
329 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: transport failure! \n"));
331 if (pHcidevInfo->HciNormalMode) {
336 static void ar6000_hci_transport_removed(void *pContext)
338 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
340 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE, ("HCI Bridge: transport removed. \n"));
342 A_ASSERT(pHcidevInfo->pHCIDev != NULL);
344 HCI_TransportDetach(pHcidevInfo->pHCIDev);
345 bt_cleanup_hci(pHcidevInfo);
346 pHcidevInfo->pHCIDev = NULL;
349 static void ar6000_hci_send_complete(void *pContext, struct htc_packet *pPacket)
351 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
352 void *osbuf = pPacket->pPktContext;
353 A_ASSERT(osbuf != NULL);
354 A_ASSERT(pHcidevInfo != NULL);
356 if (pPacket->Status) {
357 if ((pPacket->Status != A_ECANCELED) && (pPacket->Status != A_NO_RESOURCE)) {
358 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: Send Packet Failed: %d \n",pPacket->Status));
362 FreeHTCStruct(pHcidevInfo,pPacket);
363 FreeBtOsBuf(pHcidevInfo,osbuf);
367 static void ar6000_hci_pkt_recv(void *pContext, struct htc_packet *pPacket)
369 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
372 A_ASSERT(pHcidevInfo != NULL);
373 skb = (struct sk_buff *)pPacket->pPktContext;
374 A_ASSERT(skb != NULL);
378 if (pPacket->Status) {
382 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_RECV,
383 ("HCI Bridge, packet received type : %d len:%d \n",
384 HCI_GET_PACKET_TYPE(pPacket),pPacket->ActualLength));
386 /* set the actual buffer position in the os buffer, HTC recv buffers posted to HCI are set
387 * to fill the front of the buffer */
388 A_NETBUF_PUT(skb,pPacket->ActualLength + pHcidevInfo->HCIProps.HeadRoom);
389 A_NETBUF_PULL(skb,pHcidevInfo->HCIProps.HeadRoom);
391 if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_HCI_DUMP)) {
392 AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("<<< Recv HCI %s packet len:%d \n",
393 (HCI_GET_PACKET_TYPE(pPacket) == HCI_EVENT_TYPE) ? "EVENT" : "ACL",
395 AR_DEBUG_PRINTBUF(skb->data, skb->len,"BT HCI RECV Packet Dump");
398 if (pHcidevInfo->HciNormalMode) {
399 /* indicate the packet */
400 if (bt_indicate_recv(pHcidevInfo,HCI_GET_PACKET_TYPE(pPacket),skb)) {
401 /* bt stack accepted the packet */
407 /* for testing, indicate packet to the network stack */
408 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
409 skb->dev = (struct net_device *)(pHcidevInfo->HCITransHdl.netDevice);
410 if ((((struct net_device *)pHcidevInfo->HCITransHdl.netDevice)->flags & IFF_UP) == IFF_UP) {
411 skb->protocol = eth_type_trans(skb, (struct net_device *)(pHcidevInfo->HCITransHdl.netDevice));
413 skb->dev = pHcidevInfo->ar->arNetDev;
414 if ((pHcidevInfo->ar->arNetDev->flags & IFF_UP) == IFF_UP) {
415 skb->protocol = eth_type_trans(skb, pHcidevInfo->ar->arNetDev);
423 FreeHTCStruct(pHcidevInfo,pPacket);
426 /* packet was not accepted, free it */
427 FreeBtOsBuf(pHcidevInfo,skb);
432 static void ar6000_hci_pkt_refill(void *pContext, HCI_TRANSPORT_PACKET_TYPE Type, int BuffersAvailable)
434 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
437 if (Type == HCI_ACL_TYPE) {
438 refillCount = MAX_ACL_RECV_BUFS - BuffersAvailable;
440 refillCount = MAX_EVT_RECV_BUFS - BuffersAvailable;
443 if (refillCount > 0) {
444 RefillRecvBuffers(pHcidevInfo,Type,refillCount);
449 static HCI_SEND_FULL_ACTION ar6000_hci_pkt_send_full(void *pContext, struct htc_packet *pPacket)
451 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)pContext;
452 HCI_SEND_FULL_ACTION action = HCI_SEND_FULL_KEEP;
454 if (!pHcidevInfo->HciNormalMode) {
455 /* for epping testing, check packet tag, some epping packets are
456 * special and cannot be dropped */
457 if (HTC_GET_TAG_FROM_PKT(pPacket) == AR6K_DATA_PKT_TAG) {
458 action = HCI_SEND_FULL_DROP;
465 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
466 int ar6000_setup_hci(void *ar)
468 int ar6000_setup_hci(struct ar6_softc *ar)
471 struct hci_transport_config_info config;
474 struct htc_packet *pPacket;
475 struct ar6k_hci_bridge_info *pHcidevInfo;
480 pHcidevInfo = (struct ar6k_hci_bridge_info *)A_MALLOC(sizeof(struct ar6k_hci_bridge_info));
482 if (NULL == pHcidevInfo) {
483 status = A_NO_MEMORY;
487 A_MEMZERO(pHcidevInfo, sizeof(struct ar6k_hci_bridge_info));
488 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
489 g_pHcidevInfo = pHcidevInfo;
490 pHcidevInfo->HCITransHdl = *(struct hci_transport_misc_handles *)ar;
492 ar->hcidev_info = pHcidevInfo;
493 pHcidevInfo->ar = ar;
495 spin_lock_init(&pHcidevInfo->BridgeLock);
496 INIT_HTC_PACKET_QUEUE(&pHcidevInfo->HTCPacketStructHead);
498 ar->exitCallback = AR3KConfigureExit;
500 status = bt_setup_hci(pHcidevInfo);
505 if (pHcidevInfo->HciNormalMode) {
506 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE, ("HCI Bridge: running in normal mode... \n"));
508 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE, ("HCI Bridge: running in test mode... \n"));
511 pHcidevInfo->pHTCStructAlloc = (u8 *)A_MALLOC((sizeof(struct htc_packet)) * NUM_HTC_PACKET_STRUCTS);
513 if (NULL == pHcidevInfo->pHTCStructAlloc) {
514 status = A_NO_MEMORY;
518 pPacket = (struct htc_packet *)pHcidevInfo->pHTCStructAlloc;
519 for (i = 0; i < NUM_HTC_PACKET_STRUCTS; i++,pPacket++) {
520 FreeHTCStruct(pHcidevInfo,pPacket);
523 A_MEMZERO(&config,sizeof(struct hci_transport_config_info));
524 config.ACLRecvBufferWaterMark = MAX_ACL_RECV_BUFS / 2;
525 config.EventRecvBufferWaterMark = MAX_EVT_RECV_BUFS / 2;
526 config.MaxSendQueueDepth = MAX_HCI_WRITE_QUEUE_DEPTH;
527 config.pContext = pHcidevInfo;
528 config.TransportFailure = ar6000_hci_transport_failure;
529 config.TransportReady = ar6000_hci_transport_ready;
530 config.TransportRemoved = ar6000_hci_transport_removed;
531 config.pHCISendComplete = ar6000_hci_send_complete;
532 config.pHCIPktRecv = ar6000_hci_pkt_recv;
533 config.pHCIPktRecvRefill = ar6000_hci_pkt_refill;
534 config.pHCISendFull = ar6000_hci_pkt_send_full;
536 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
537 pHcidevInfo->pHCIDev = HCI_TransportAttach(pHcidevInfo->HCITransHdl.htcHandle, &config);
539 pHcidevInfo->pHCIDev = HCI_TransportAttach(ar->arHtcTarget, &config);
542 if (NULL == pHcidevInfo->pHCIDev) {
549 if (pHcidevInfo != NULL) {
550 if (NULL == pHcidevInfo->pHCIDev) {
551 /* GMBOX may not be present in older chips */
552 /* just return success */
556 ar6000_cleanup_hci(ar);
562 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
563 void ar6000_cleanup_hci(void *ar)
565 void ar6000_cleanup_hci(struct ar6_softc *ar)
568 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
569 struct ar6k_hci_bridge_info *pHcidevInfo = g_pHcidevInfo;
571 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)ar->hcidev_info;
574 if (pHcidevInfo != NULL) {
575 bt_cleanup_hci(pHcidevInfo);
577 if (pHcidevInfo->pHCIDev != NULL) {
578 HCI_TransportStop(pHcidevInfo->pHCIDev);
579 HCI_TransportDetach(pHcidevInfo->pHCIDev);
580 pHcidevInfo->pHCIDev = NULL;
583 if (pHcidevInfo->pHTCStructAlloc != NULL) {
584 kfree(pHcidevInfo->pHTCStructAlloc);
585 pHcidevInfo->pHTCStructAlloc = NULL;
589 #ifndef EXPORT_HCI_BRIDGE_INTERFACE
590 ar->hcidev_info = NULL;
597 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
598 int hci_test_send(void *ar, struct sk_buff *skb)
600 int hci_test_send(struct ar6_softc *ar, struct sk_buff *skb)
605 EPPING_HEADER *pHeader;
606 struct htc_packet *pPacket;
607 HTC_TX_TAG htc_tag = AR6K_DATA_PKT_TAG;
608 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
609 struct ar6k_hci_bridge_info *pHcidevInfo = g_pHcidevInfo;
611 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)ar->hcidev_info;
616 if (NULL == pHcidevInfo) {
621 if (NULL == pHcidevInfo->pHCIDev) {
626 if (pHcidevInfo->HciNormalMode) {
627 /* this interface cannot run when normal WMI is running */
632 pHeader = (EPPING_HEADER *)A_NETBUF_DATA(skb);
634 if (!IS_EPPING_PACKET(pHeader)) {
639 if (IS_EPING_PACKET_NO_DROP(pHeader)) {
640 htc_tag = AR6K_CONTROL_PKT_TAG;
643 length = sizeof(EPPING_HEADER) + pHeader->DataLength;
645 pPacket = AllocHTCStruct(pHcidevInfo);
646 if (NULL == pPacket) {
647 status = A_NO_MEMORY;
651 SET_HTC_PACKET_INFO_TX(pPacket,
655 HCI_ACL_TYPE, /* send every thing out as ACL */
658 HCI_TransportSendPkt(pHcidevInfo->pHCIDev,pPacket,false);
666 void ar6000_set_default_ar3kconfig(struct ar6_softc *ar, void *ar3kconfig)
668 struct ar6k_hci_bridge_info *pHcidevInfo = (struct ar6k_hci_bridge_info *)ar->hcidev_info;
669 struct ar3k_config_info *config = (struct ar3k_config_info *)ar3kconfig;
671 config->pHCIDev = pHcidevInfo->pHCIDev;
672 config->pHCIProps = &pHcidevInfo->HCIProps;
673 config->pHIFDevice = ar->arHifDevice;
674 config->pBtStackHCIDev = pHcidevInfo->pBtStackHCIDev;
675 config->Flags |= AR3K_CONFIG_FLAG_SET_AR3K_BAUD;
676 config->AR3KBaudRate = 115200;
679 #ifdef CONFIG_BLUEZ_HCI_BRIDGE
680 /*** BT Stack Entrypoints *******/
683 * bt_open - open a handle to the device
685 static int bt_open(struct hci_dev *hdev)
688 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_open - enter - x\n"));
689 set_bit(HCI_RUNNING, &hdev->flags);
690 set_bit(HCI_UP, &hdev->flags);
691 set_bit(HCI_INIT, &hdev->flags);
696 * bt_close - close handle to the device
698 static int bt_close(struct hci_dev *hdev)
700 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_close - enter\n"));
701 clear_bit(HCI_RUNNING, &hdev->flags);
706 * bt_send_frame - send data frames
708 static int bt_send_frame(struct sk_buff *skb)
710 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
711 HCI_TRANSPORT_PACKET_TYPE type;
712 struct ar6k_hci_bridge_info *pHcidevInfo;
713 struct htc_packet *pPacket;
715 struct sk_buff *txSkb = NULL;
718 AR_DEBUG_PRINTF(ATH_DEBUG_WARN, ("HCI Bridge: bt_send_frame - no device\n"));
722 if (!test_bit(HCI_RUNNING, &hdev->flags)) {
723 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_send_frame - not open\n"));
727 pHcidevInfo = (struct ar6k_hci_bridge_info *)hdev->driver_data;
728 A_ASSERT(pHcidevInfo != NULL);
730 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_SEND, ("+bt_send_frame type: %d \n",bt_cb(skb)->pkt_type));
731 type = HCI_COMMAND_TYPE;
733 switch (bt_cb(skb)->pkt_type) {
734 case HCI_COMMAND_PKT:
735 type = HCI_COMMAND_TYPE;
739 case HCI_ACLDATA_PKT:
744 case HCI_SCODATA_PKT:
745 /* we don't support SCO over the bridge */
754 if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_HCI_DUMP)) {
755 AR_DEBUG_PRINTF(ATH_DEBUG_ANY,(">>> Send HCI %s packet len: %d\n",
756 (type == HCI_COMMAND_TYPE) ? "COMMAND" : "ACL",
758 if (type == HCI_COMMAND_TYPE) {
759 u16 opcode = HCI_GET_OP_CODE(skb->data);
760 AR_DEBUG_PRINTF(ATH_DEBUG_ANY,(" HCI Command: OGF:0x%X OCF:0x%X \r\n",
761 opcode >> 10, opcode & 0x3FF));
763 AR_DEBUG_PRINTBUF(skb->data,skb->len,"BT HCI SEND Packet Dump");
768 txSkb = bt_skb_alloc(TX_PACKET_RSV_OFFSET + pHcidevInfo->HCIProps.HeadRoom +
769 pHcidevInfo->HCIProps.TailRoom + skb->len,
773 status = A_NO_MEMORY;
777 bt_cb(txSkb)->pkt_type = bt_cb(skb)->pkt_type;
778 txSkb->dev = (void *)pHcidevInfo->pBtStackHCIDev;
779 skb_reserve(txSkb, TX_PACKET_RSV_OFFSET + pHcidevInfo->HCIProps.HeadRoom);
780 memcpy(txSkb->data, skb->data, skb->len);
781 skb_put(txSkb,skb->len);
783 pPacket = AllocHTCStruct(pHcidevInfo);
784 if (NULL == pPacket) {
785 status = A_NO_MEMORY;
789 /* HCI packet length here doesn't include the 1-byte transport header which
790 * will be handled by the HCI transport layer. Enough headroom has already
791 * been reserved above for the transport header
793 SET_HTC_PACKET_INFO_TX(pPacket,
798 AR6K_CONTROL_PKT_TAG); /* HCI packets cannot be dropped */
800 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_SEND, ("HCI Bridge: bt_send_frame skb:0x%lX \n",(unsigned long)txSkb));
801 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_SEND, ("HCI Bridge: type:%d, Total Length:%d Bytes \n",
804 status = HCI_TransportSendPkt(pHcidevInfo->pHCIDev,pPacket,false);
816 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_SEND, ("-bt_send_frame \n"));
821 * bt_ioctl - ioctl processing
823 static int bt_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
825 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_ioctl - enter\n"));
830 * bt_flush - flush outstandingbpackets
832 static int bt_flush(struct hci_dev *hdev)
834 struct ar6k_hci_bridge_info *pHcidevInfo;
836 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_flush - enter\n"));
838 pHcidevInfo = (struct ar6k_hci_bridge_info *)hdev->driver_data;
849 static void bt_destruct(struct hci_dev *hdev)
851 AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HCI Bridge: bt_destruct - enter\n"));
852 /* nothing to do here */
855 static int bt_setup_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
858 struct hci_dev *pHciDev = NULL;
859 struct hif_device_os_device_info osDevInfo;
867 A_MEMZERO(&osDevInfo,sizeof(osDevInfo));
868 /* get the underlying OS device */
869 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
870 status = ar6000_get_hif_dev((struct hif_device *)(pHcidevInfo->HCITransHdl.hifDevice),
873 status = HIFConfigureDevice(pHcidevInfo->ar->arHifDevice,
874 HIF_DEVICE_GET_OS_DEVICE,
880 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to OS device info from HIF\n"));
884 /* allocate a BT HCI struct for this device */
885 pHciDev = hci_alloc_dev();
886 if (NULL == pHciDev) {
887 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge - failed to allocate bt struct \n"));
888 status = A_NO_MEMORY;
891 /* save the device, we'll register this later */
892 pHcidevInfo->pBtStackHCIDev = pHciDev;
893 SET_HCIDEV_DEV(pHciDev,osDevInfo.pOSDevice);
894 SET_HCI_BUS_TYPE(pHciDev, HCI_VIRTUAL, HCI_BREDR);
895 pHciDev->driver_data = pHcidevInfo;
896 pHciDev->open = bt_open;
897 pHciDev->close = bt_close;
898 pHciDev->send = bt_send_frame;
899 pHciDev->ioctl = bt_ioctl;
900 pHciDev->flush = bt_flush;
901 pHciDev->destruct = bt_destruct;
902 pHciDev->owner = THIS_MODULE;
903 /* driver is running in normal BT mode */
904 pHcidevInfo->HciNormalMode = true;
909 bt_cleanup_hci(pHcidevInfo);
915 static void bt_cleanup_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
919 if (pHcidevInfo->HciRegistered) {
920 pHcidevInfo->HciRegistered = false;
921 clear_bit(HCI_RUNNING, &pHcidevInfo->pBtStackHCIDev->flags);
922 clear_bit(HCI_UP, &pHcidevInfo->pBtStackHCIDev->flags);
923 clear_bit(HCI_INIT, &pHcidevInfo->pBtStackHCIDev->flags);
924 A_ASSERT(pHcidevInfo->pBtStackHCIDev != NULL);
926 if ((err = hci_unregister_dev(pHcidevInfo->pBtStackHCIDev)) < 0) {
927 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: failed to unregister with bluetooth %d\n",err));
931 kfree(pHcidevInfo->pBtStackHCIDev);
932 pHcidevInfo->pBtStackHCIDev = NULL;
935 static int bt_register_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
941 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE, ("HCI Bridge: registering HCI... \n"));
942 A_ASSERT(pHcidevInfo->pBtStackHCIDev != NULL);
943 /* mark that we are registered */
944 pHcidevInfo->HciRegistered = true;
945 if ((err = hci_register_dev(pHcidevInfo->pBtStackHCIDev)) < 0) {
946 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: failed to register with bluetooth %d\n",err));
947 pHcidevInfo->HciRegistered = false;
952 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_BRIDGE, ("HCI Bridge: HCI registered \n"));
959 static bool bt_indicate_recv(struct ar6k_hci_bridge_info *pHcidevInfo,
960 HCI_TRANSPORT_PACKET_TYPE Type,
965 bool success = false;
966 BT_HCI_EVENT_HEADER *pEvent;
970 if (!test_bit(HCI_RUNNING, &pHcidevInfo->pBtStackHCIDev->flags)) {
971 AR_DEBUG_PRINTF(ATH_DEBUG_WARN, ("HCI Bridge: bt_indicate_recv - not running\n"));
977 btType = HCI_ACLDATA_PKT;
980 btType = HCI_EVENT_PKT;
992 /* set the final type */
993 bt_cb(skb)->pkt_type = btType;
995 skb->dev = (void *)pHcidevInfo->pBtStackHCIDev;
998 if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_HCI_RECV)) {
999 if (bt_cb(skb)->pkt_type == HCI_EVENT_PKT) {
1000 pEvent = (BT_HCI_EVENT_HEADER *)skb->data;
1001 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_RECV, ("BT HCI EventCode: %d, len:%d \n",
1002 pEvent->EventCode, pEvent->ParamLength));
1006 /* pass receive packet up the stack */
1007 if (hci_recv_frame(skb) != 0) {
1008 AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HCI Bridge: hci_recv_frame failed \n"));
1011 AR_DEBUG_PRINTF(ATH_DEBUG_HCI_RECV,
1012 ("HCI Bridge: Indicated RCV of type:%d, Length:%d \n",btType,len));
1022 static struct sk_buff* bt_alloc_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, int Length)
1024 struct sk_buff *skb;
1025 /* in normal HCI mode we need to alloc from the bt core APIs */
1026 skb = bt_skb_alloc(Length, GFP_ATOMIC);
1028 AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to alloc bt sk_buff \n"));
1033 static void bt_free_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, struct sk_buff *skb)
1038 #else // { CONFIG_BLUEZ_HCI_BRIDGE
1040 /* stubs when we only want to test the HCI bridging Interface without the HT stack */
1041 static int bt_setup_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
1045 static void bt_cleanup_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
1049 static int bt_register_hci(struct ar6k_hci_bridge_info *pHcidevInfo)
1055 static bool bt_indicate_recv(struct ar6k_hci_bridge_info *pHcidevInfo,
1056 HCI_TRANSPORT_PACKET_TYPE Type,
1057 struct sk_buff *skb)
1063 static struct sk_buff* bt_alloc_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, int Length)
1068 static void bt_free_buffer(struct ar6k_hci_bridge_info *pHcidevInfo, struct sk_buff *skb)
1073 #endif // } CONFIG_BLUEZ_HCI_BRIDGE
1075 #else // { ATH_AR6K_ENABLE_GMBOX
1077 /* stubs when GMBOX support is not needed */
1079 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
1080 int ar6000_setup_hci(void *ar)
1082 int ar6000_setup_hci(struct ar6_softc *ar)
1088 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
1089 void ar6000_cleanup_hci(void *ar)
1091 void ar6000_cleanup_hci(struct ar6_softc *ar)
1097 #ifndef EXPORT_HCI_BRIDGE_INTERFACE
1098 void ar6000_set_default_ar3kconfig(struct ar6_softc *ar, void *ar3kconfig)
1104 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
1105 int hci_test_send(void *ar, struct sk_buff *skb)
1107 int hci_test_send(struct ar6_softc *ar, struct sk_buff *skb)
1113 #endif // } ATH_AR6K_ENABLE_GMBOX
1116 #ifdef EXPORT_HCI_BRIDGE_INTERFACE
1118 hcibridge_init_module(void)
1121 struct hci_transport_callbacks hciTransCallbacks;
1123 hciTransCallbacks.setupTransport = ar6000_setup_hci;
1124 hciTransCallbacks.cleanupTransport = ar6000_cleanup_hci;
1126 status = ar6000_register_hci_transport(&hciTransCallbacks);
1134 hcibridge_cleanup_module(void)
1138 module_init(hcibridge_init_module);
1139 module_exit(hcibridge_cleanup_module);
1140 MODULE_LICENSE("Dual BSD/GPL");