/drivers/net/wireless/tiwlan1251/pform/linux/src/ipc_k.c
C | 122 lines | 61 code | 17 blank | 44 comment | 4 complexity | 756d1791a6f81d7c2209486c0d04affa MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
- /****************************************************************************
- **+-----------------------------------------------------------------------+**
- **| |**
- **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
- **| All rights reserved. |**
- **| |**
- **| Redistribution and use in source and binary forms, with or without |**
- **| modification, are permitted provided that the following conditions |**
- **| are met: |**
- **| |**
- **| * Redistributions of source code must retain the above copyright |**
- **| notice, this list of conditions and the following disclaimer. |**
- **| * Redistributions in binary form must reproduce the above copyright |**
- **| notice, this list of conditions and the following disclaimer in |**
- **| the documentation and/or other materials provided with the |**
- **| distribution. |**
- **| * Neither the name Texas Instruments nor the names of its |**
- **| contributors may be used to endorse or promote products derived |**
- **| from this software without specific prior written permission. |**
- **| |**
- **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
- **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
- **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
- **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
- **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
- **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
- **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
- **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
- **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
- **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
- **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
- **| |**
- **+-----------------------------------------------------------------------+**
- ****************************************************************************/
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/stddef.h>
- #include <linux/netdevice.h>
- #include <linux/rtnetlink.h>
- #include <linux/netlink.h>
- #include "osTIType.h"
- #include "esta_drv.h"
- #include "osApi.h"
- #include "ioctl_init.h"
- #include "cli_cu_common.h"
- #include "TI_IPC_Api.h"
- UINT32 IPCKernelInit (TI_HANDLE hAdapter,TI_HANDLE hIPCEv)
- {
- return 0;
- }
- UINT32 IPCKernelDeInit (TI_HANDLE hAdapter)
- {
- return 0;
- }
- /*******************************************************/
- INT32 IPC_EventSend(TI_HANDLE hAdapter, tiUINT8* pEvData, UINT32 EvDataSize)
- {
- struct sk_buff *skb;
- int res;
- tiwlan_net_dev_t *drv = (tiwlan_net_dev_t *) hAdapter;
- UINT32 realSize = 0;
- UINT32 msgSize;
- struct nlmsghdr *nlh;
- tiUINT8 *msg;
- #ifdef CONFIG_ANDROID_POWER
- drv->receive_packet = 1; /* Remember to stay awake */
- #endif
- /* This event is targetted to the OS process Id 0 is not a valid pId for LINUX*/
- if (((IPC_EVENT_PARAMS *)pEvData)->uProcessID == 0)
- {
- ((IPC_EVENT_PARAMS *)pEvData)->pfEventCallback((IPC_EV_DATA *)pEvData);
- return 0;
- }
- /* set the payload size */
- msgSize = (( IPC_EV_DATA *) pEvData) ->uBufferSize + offsetof(IPC_EV_DATA,uBuffer);
- /* add the netlink header size */
- realSize = NLMSG_SPACE(msgSize);
- /* allocate the complete message */
- skb = dev_alloc_skb(realSize);
- if (!skb) {
- printk(KERN_ERR "Failed to allocate new skb with size=%u.\n",realSize);
- return -1;
- }
- /* set the netlink header params */
- nlh = NLMSG_PUT(skb, 0, 0, NLMSG_DONE, realSize - sizeof(*nlh));
- /* get the payload pointer */
- msg = (char *)NLMSG_DATA(nlh);
- /* copy the data to the payload */
- memcpy(msg,pEvData,msgSize);
- NETLINK_CB(skb).pid = 0; /* from kernel */
- NETLINK_CB(skb).dst_group = RTNLGRP_LINK;
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
- NETLINK_CB(skb).dst_pid = (( IPC_EVENT_PARAMS *) pEvData) ->uProcessID; /* Dm: */
- #endif
- /* send the message*/
- res = netlink_unicast(drv->wl_sock, skb, (( IPC_EVENT_PARAMS *) pEvData) ->uProcessID, MSG_DONTWAIT);
- /* Sanity checks. As far as we're concerned this error is unrecovarable.*/
- if (res >= 0)
- {
- return 0;
- }
- nlmsg_failure:
- ti_dprintf(TIWLAN_LOG_INFO,"IPC kernel: did not send the netlink message\n");
- return -1;
- }