xref: /freebsd/sys/net/netisr.c (revision e3b6e33c07b11798e5e24baaa7d596902debdcba)
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