1 /**************************************************************************** 2 **+-----------------------------------------------------------------------+** 3 **| |** 4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |** 5 **| All rights reserved. |** 6 **| |** 7 **| Redistribution and use in source and binary forms, with or without |** 8 **| modification, are permitted provided that the following conditions |** 9 **| are met: |** 10 **| |** 11 **| * Redistributions of source code must retain the above copyright |** 12 **| notice, this list of conditions and the following disclaimer. |** 13 **| * Redistributions in binary form must reproduce the above copyright |** 14 **| notice, this list of conditions and the following disclaimer in |** 15 **| the documentation and/or other materials provided with the |** 16 **| distribution. |** 17 **| * Neither the name Texas Instruments nor the names of its |** 18 **| contributors may be used to endorse or promote products derived |** 19 **| from this software without specific prior written permission. |** 20 **| |** 21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |** 22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |** 23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |** 24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |** 25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |** 26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |** 27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |** 28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |** 29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |** 30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |** 31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |** 32 **| |** 33 **+-----------------------------------------------------------------------+** 34 ****************************************************************************/ 35 36 #include <linux/module.h> 37 #include <linux/kernel.h> 38 #include <linux/stddef.h> 39 #include <linux/netdevice.h> 40 #include <linux/rtnetlink.h> 41 #include <linux/netlink.h> 42 43 #include "osTIType.h" 44 #include "esta_drv.h" 45 #include "osApi.h" 46 #include "ioctl_init.h" 47 #include "cli_cu_common.h" 48 #include "TI_IPC_Api.h" 49 IPCKernelInit(TI_HANDLE hAdapter,TI_HANDLE hIPCEv)50 UINT32 IPCKernelInit (TI_HANDLE hAdapter,TI_HANDLE hIPCEv) 51 { 52 return 0; 53 } 54 IPCKernelDeInit(TI_HANDLE hAdapter)55 UINT32 IPCKernelDeInit (TI_HANDLE hAdapter) 56 { 57 return 0; 58 } 59 60 61 /*******************************************************/ IPC_EventSend(TI_HANDLE hAdapter,tiUINT8 * pEvData,UINT32 EvDataSize)62 INT32 IPC_EventSend(TI_HANDLE hAdapter, tiUINT8* pEvData, UINT32 EvDataSize) 63 { 64 struct sk_buff *skb; 65 int res; 66 tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *) hAdapter; 67 UINT32 realSize = 0; 68 UINT32 msgSize; 69 struct nlmsghdr *nlh; 70 tiUINT8 *msg; 71 72 #ifdef CONFIG_ANDROID_POWER 73 drv->receive_packet = 1; /* Remember to stay awake */ 74 #endif 75 /* This event is targetted to the OS process Id 0 is not a valid pId for LINUX*/ 76 if (((IPC_EVENT_PARAMS *)pEvData)->uProcessID == 0) 77 { 78 ((IPC_EVENT_PARAMS *)pEvData)->pfEventCallback((IPC_EV_DATA *)pEvData); 79 return 0; 80 } 81 82 /* set the payload size */ 83 msgSize = (( IPC_EV_DATA *) pEvData) ->uBufferSize + offsetof(IPC_EV_DATA,uBuffer); 84 85 /* add the netlink header size */ 86 realSize = NLMSG_SPACE(msgSize); 87 88 /* allocate the complete message */ 89 skb = dev_alloc_skb(realSize); 90 if (!skb) { 91 printk(KERN_ERR "Failed to allocate new skb with size=%u.\n",realSize); 92 return -1; 93 } 94 95 /* set the netlink header params */ 96 nlh = NLMSG_PUT(skb, 0, 0, NLMSG_DONE, realSize - sizeof(*nlh)); 97 98 /* get the payload pointer */ 99 msg = (char *)NLMSG_DATA(nlh); 100 101 /* copy the data to the payload */ 102 memcpy(msg,pEvData,msgSize); 103 104 NETLINK_CB(skb).pid = 0; /* from kernel */ 105 NETLINK_CB(skb).dst_group = RTNLGRP_LINK; 106 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23) 107 NETLINK_CB(skb).dst_pid = (( IPC_EVENT_PARAMS *) pEvData) ->uProcessID; /* Dm: */ 108 #endif 109 110 /* send the message*/ 111 res = netlink_unicast(drv->wl_sock, skb, (( IPC_EVENT_PARAMS *) pEvData) ->uProcessID, MSG_DONTWAIT); 112 113 /* Sanity checks. As far as we're concerned this error is unrecovarable.*/ 114 if (res >= 0) 115 { 116 return 0; 117 } 118 119 nlmsg_failure: 120 ti_dprintf(TIWLAN_LOG_INFO,"IPC kernel: did not send the netlink message\n"); 121 return -1; 122 } 123