1/*- 2 * Copyright (c) 2010 Isilon Systems, Inc. 3 * Copyright (c) 2010 iX Systems, Inc. 4 * Copyright (c) 2010 Panasas, Inc. 5 * Copyright (c) 2013-2015 Mellanox Technologies, Ltd. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice unmodified, this list of conditions, and the following 13 * disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#include "linux/interrupt.h" 31#include "los_hwi.h" 32 33 34int linux_request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, 35 const char *name, void *dev) 36{ 37 UINT32 ret; 38 HwiIrqParam irqParam; 39 40 if (OS_INT_ACTIVE) { 41 return OS_ERRNO_HWI_INTERR; 42 } 43 44 irqParam.swIrq = (INT32)irq; 45 irqParam.pDevId = dev; 46 irqParam.pName = name; 47 48 ret = LOS_HwiCreate(irq, IRQ_DEFAULT_PRIORITY, (HWI_MODE_T)flags, (HWI_PROC_FUNC)handler, &irqParam); 49 if (ret == LOS_OK) { 50 HalIrqUnmask(irq); 51 } 52 return (INT32)ret; 53} 54 55void linux_free_irq(unsigned int irq, void *devID) 56{ 57 HwiIrqParam irqParam; 58 59 if (OS_INT_ACTIVE) { 60 return; 61 } 62 63 irqParam.swIrq = (INT32)irq; 64 irqParam.pDevId = devID; 65 66 (VOID)LOS_HwiDelete(irq, &irqParam); 67 return; 68} 69 70void linux_enable_irq(unsigned int irq) 71{ 72 HalIrqUnmask(irq); 73} 74 75void linux_disable_irq(unsigned int irq) 76{ 77 HalIrqMask(irq); 78} 79 80#ifdef WORKQUEUE_SUPPORT_PRIORITY 81bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data, 82 unsigned int pri) 83#else 84bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data) 85#endif 86{ 87 struct work_struct *work = NULL; 88 89 if ((workQueue == NULL) || (handler == NULL)) { 90 return FALSE; 91 } 92 93#ifdef WORKQUEUE_SUPPORT_PRIORITY 94 if ((pri >= OS_WORK_PRIORITY_DEFAULT) || (pri >= OS_WORK_PRIORITY_LOWEST)) { 95 return FALSE; 96 } 97#endif 98 99 work = (struct work_struct *)LOS_MemAlloc(m_aucSysMem0, sizeof(struct work_struct)); 100 if (work == NULL) { 101 return FALSE; 102 } 103 104 INIT_WORK(work, handler); 105 106 work->data = (atomic_long_t)data; 107#ifdef WORKQUEUE_SUPPORT_PRIORITY 108 work->work_pri = pri; 109#endif 110 if (!(queue_work(workQueue, work))) { 111 (VOID)LOS_MemFree(m_aucSysMem0, work); 112 return FALSE; 113 } 114 return TRUE; 115} 116 117