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 * $FreeBSD$ 30 */ 31 32 #include "linux/interrupt.h" 33 #include "los_hwi.h" 34 35 36 int linux_request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, 37 const char *name, void *dev) 38 { 39 UINT32 ret; 40 HwiIrqParam irqParam; 41 42 if (OS_INT_ACTIVE) { 43 return OS_ERRNO_HWI_INTERR; 44 } 45 46 irqParam.swIrq = (INT32)irq; 47 irqParam.pDevId = dev; 48 irqParam.pName = name; 49 50 ret = LOS_HwiCreate(irq, IRQ_DEFAULT_PRIORITY, (HWI_MODE_T)flags, (HWI_PROC_FUNC)handler, &irqParam); 51 if (ret == LOS_OK) { 52 HalIrqUnmask(irq); 53 } 54 return (INT32)ret; 55 } 56 57 void linux_free_irq(unsigned int irq, void *devID) 58 { 59 HwiIrqParam irqParam; 60 61 if (OS_INT_ACTIVE) { 62 return; 63 } 64 65 irqParam.swIrq = (INT32)irq; 66 irqParam.pDevId = devID; 67 68 (VOID)LOS_HwiDelete(irq, &irqParam); 69 return; 70 } 71 72 void linux_enable_irq(unsigned int irq) 73 { 74 HalIrqUnmask(irq); 75 } 76 77 void linux_disable_irq(unsigned int irq) 78 { 79 HalIrqMask(irq); 80 } 81 82 #ifdef WORKQUEUE_SUPPORT_PRIORITY 83 bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data, 84 unsigned int pri) 85 #else 86 bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data) 87 #endif 88 { 89 struct work_struct *work = NULL; 90 91 if ((workQueue == NULL) || (handler == NULL)) { 92 return FALSE; 93 } 94 95 #ifdef WORKQUEUE_SUPPORT_PRIORITY 96 if ((pri >= OS_WORK_PRIORITY_DEFAULT) || (pri >= OS_WORK_PRIORITY_LOWEST)) { 97 return FALSE; 98 } 99 #endif 100 101 work = (struct work_struct *)LOS_MemAlloc(m_aucSysMem0, sizeof(struct work_struct)); 102 if (work == NULL) { 103 return FALSE; 104 } 105 106 INIT_WORK(work, handler); 107 108 work->data = (atomic_long_t)data; 109 #ifdef WORKQUEUE_SUPPORT_PRIORITY 110 work->work_pri = pri; 111 #endif 112 if (!(queue_work(workQueue, work))) { 113 (VOID)LOS_MemFree(m_aucSysMem0, work); 114 return FALSE; 115 } 116 return TRUE; 117 } 118 119