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 34 int 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 55 void 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 70 void linux_enable_irq(unsigned int irq) 71 { 72 HalIrqUnmask(irq); 73 } 74 75 void linux_disable_irq(unsigned int irq) 76 { 77 HalIrqMask(irq); 78 } 79 80 #ifdef WORKQUEUE_SUPPORT_PRIORITY 81 bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data, 82 unsigned int pri) 83 #else 84 bool 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