• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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