1e3b6e33cSJake Burkholder /* 2e3b6e33cSJake Burkholder * Copyright (c) 1997, Stefan Esser <se@freebsd.org> 3e3b6e33cSJake Burkholder * All rights reserved. 4e3b6e33cSJake Burkholder * 5e3b6e33cSJake Burkholder * Redistribution and use in source and binary forms, with or without 6e3b6e33cSJake Burkholder * modification, are permitted provided that the following conditions 7e3b6e33cSJake Burkholder * are met: 8e3b6e33cSJake Burkholder * 1. Redistributions of source code must retain the above copyright 9e3b6e33cSJake Burkholder * notice unmodified, this list of conditions, and the following 10e3b6e33cSJake Burkholder * disclaimer. 11e3b6e33cSJake Burkholder * 2. Redistributions in binary form must reproduce the above copyright 12e3b6e33cSJake Burkholder * notice, this list of conditions and the following disclaimer in the 13e3b6e33cSJake Burkholder * documentation and/or other materials provided with the distribution. 14e3b6e33cSJake Burkholder * 15e3b6e33cSJake Burkholder * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16e3b6e33cSJake Burkholder * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17e3b6e33cSJake Burkholder * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18e3b6e33cSJake Burkholder * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19e3b6e33cSJake Burkholder * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20e3b6e33cSJake Burkholder * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21e3b6e33cSJake Burkholder * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22e3b6e33cSJake Burkholder * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23e3b6e33cSJake Burkholder * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24e3b6e33cSJake Burkholder * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25e3b6e33cSJake Burkholder * 26e3b6e33cSJake Burkholder * $FreeBSD$ 27e3b6e33cSJake Burkholder */ 28e3b6e33cSJake Burkholder 29e3b6e33cSJake Burkholder #include <sys/param.h> 30e3b6e33cSJake Burkholder #include <sys/systm.h> 31e3b6e33cSJake Burkholder #include <sys/bus.h> 32e3b6e33cSJake Burkholder #include <sys/proc.h> 33e3b6e33cSJake Burkholder #include <sys/interrupt.h> 34e3b6e33cSJake Burkholder #include <sys/kernel.h> 35e3b6e33cSJake Burkholder 36e3b6e33cSJake Burkholder #include <net/netisr.h> 37e3b6e33cSJake Burkholder 38e3b6e33cSJake Burkholder static void swi_net(void *); 39e3b6e33cSJake Burkholder 40e3b6e33cSJake Burkholder void *net_ih; 41e3b6e33cSJake Burkholder volatile unsigned int netisr; 42e3b6e33cSJake Burkholder void (*netisrs[32])(void); 43e3b6e33cSJake Burkholder 44e3b6e33cSJake Burkholder void 45e3b6e33cSJake Burkholder legacy_setsoftnet(void) 46e3b6e33cSJake Burkholder { 47e3b6e33cSJake Burkholder swi_sched(net_ih, 0); 48e3b6e33cSJake Burkholder } 49e3b6e33cSJake Burkholder 50e3b6e33cSJake Burkholder int 51e3b6e33cSJake Burkholder register_netisr(int num, netisr_t *handler) 52e3b6e33cSJake Burkholder { 53e3b6e33cSJake Burkholder 54e3b6e33cSJake Burkholder if (num < 0 || num >= (sizeof(netisrs)/sizeof(*netisrs)) ) { 55e3b6e33cSJake Burkholder printf("register_netisr: bad isr number: %d\n", num); 56e3b6e33cSJake Burkholder return (EINVAL); 57e3b6e33cSJake Burkholder } 58e3b6e33cSJake Burkholder netisrs[num] = handler; 59e3b6e33cSJake Burkholder return (0); 60e3b6e33cSJake Burkholder } 61e3b6e33cSJake Burkholder 62e3b6e33cSJake Burkholder int 63e3b6e33cSJake Burkholder unregister_netisr(int num) 64e3b6e33cSJake Burkholder { 65e3b6e33cSJake Burkholder 66e3b6e33cSJake Burkholder if (num < 0 || num >= (sizeof(netisrs)/sizeof(*netisrs)) ) { 67e3b6e33cSJake Burkholder printf("unregister_netisr: bad isr number: %d\n", num); 68e3b6e33cSJake Burkholder return (EINVAL); 69e3b6e33cSJake Burkholder } 70e3b6e33cSJake Burkholder netisrs[num] = NULL; 71e3b6e33cSJake Burkholder return (0); 72e3b6e33cSJake Burkholder } 73e3b6e33cSJake Burkholder 74e3b6e33cSJake Burkholder #ifdef DEVICE_POLLING 75e3b6e33cSJake Burkholder void netisr_pollmore(void); 76e3b6e33cSJake Burkholder #endif 77e3b6e33cSJake Burkholder 78e3b6e33cSJake Burkholder static void 79e3b6e33cSJake Burkholder swi_net(void *dummy) 80e3b6e33cSJake Burkholder { 81e3b6e33cSJake Burkholder u_int bits; 82e3b6e33cSJake Burkholder int i; 83e3b6e33cSJake Burkholder 84e3b6e33cSJake Burkholder #ifdef DEVICE_POLLING 85e3b6e33cSJake Burkholder for (;;) { 86e3b6e33cSJake Burkholder int pollmore; 87e3b6e33cSJake Burkholder #endif 88e3b6e33cSJake Burkholder bits = atomic_readandclear_int(&netisr); 89e3b6e33cSJake Burkholder #ifdef DEVICE_POLLING 90e3b6e33cSJake Burkholder if (bits == 0) 91e3b6e33cSJake Burkholder return; 92e3b6e33cSJake Burkholder pollmore = bits & (1 << NETISR_POLL); 93e3b6e33cSJake Burkholder #endif 94e3b6e33cSJake Burkholder while ((i = ffs(bits)) != 0) { 95e3b6e33cSJake Burkholder i--; 96e3b6e33cSJake Burkholder if (netisrs[i] != NULL) 97e3b6e33cSJake Burkholder netisrs[i](); 98e3b6e33cSJake Burkholder else 99e3b6e33cSJake Burkholder printf("swi_net: unregistered isr number: %d.\n", i); 100e3b6e33cSJake Burkholder bits &= ~(1 << i); 101e3b6e33cSJake Burkholder } 102e3b6e33cSJake Burkholder #ifdef DEVICE_POLLING 103e3b6e33cSJake Burkholder if (pollmore) 104e3b6e33cSJake Burkholder netisr_pollmore(); 105e3b6e33cSJake Burkholder } 106e3b6e33cSJake Burkholder #endif 107e3b6e33cSJake Burkholder } 108e3b6e33cSJake Burkholder 109e3b6e33cSJake Burkholder static void 110e3b6e33cSJake Burkholder start_netisr(void *dummy) 111e3b6e33cSJake Burkholder { 112e3b6e33cSJake Burkholder 113e3b6e33cSJake Burkholder if (swi_add(NULL, "net", swi_net, NULL, SWI_NET, 0, &net_ih)) 114e3b6e33cSJake Burkholder panic("start_netisr"); 115e3b6e33cSJake Burkholder } 116e3b6e33cSJake Burkholder SYSINIT(start_netisr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_netisr, NULL) 117