aboutsummaryrefslogtreecommitdiffstats
path: root/include/net/ndisc.h
Commit message (Expand)AuthorAge
* sysctl: remove "struct file *" argument of ->proc_handlerAlexey Dobriyan2009-09-24
* ipv6: Fix sporadic sendmsg -EINVAL when sending to multicast groups.David S. Miller2009-01-04
* bonding: send IPv6 neighbor advertisement on failoverBrian Haley2008-11-06
* sysctl: simplify ->strategyAlexey Dobriyan2008-10-16
* ndisc: Add missing strategies for per-device retrans timer/reachable time set...YOSHIFUJI Hideaki2008-05-19
* [IPV6]: Make address arguments const.YOSHIFUJI Hideaki2008-04-12
* [IPV6] Remove three method declarations in include/net/ndisc.h.Rami Rosen2008-04-10
* [IPV6] SIT: Add PRL management for ISATAP.Templin, Fred L2008-04-02
* [INET]: Remove struct net_proto_family* from _init calls.Denis V. Lunev2008-02-29
* [IPV6]: remove unused method declaration (net/ndisc.h).Rami Rosen2008-02-13
* [IPv6]: Export userland ND options through netlink (RDNSS support)Pierre Ynard2007-10-11
* [IPV6]: Misc endianness annotations.Al Viro2006-12-03
* Don't include linux/config.h from anywhere else in include/David Woodhouse2006-04-26
* [IPV6]: ROUTE: Add experimental support for Route Information Option in RA (R...YOSHIFUJI Hideaki2006-03-20
* [INET_SOCK]: Move struct inet_sock & helper functions to net/inet_sock.hArnaldo Carvalho de Melo2006-01-03
* Linux-2.6.12-rc2v2.6.12-rc2Linus Torvalds2005-04-16
d
d85429a31790
0f966d74cf77
577cd7584cf5


bbfbd8b151fe


577cd7584cf5


bbfbd8b151fe

bbfbd8b151fe


577cd7584cf5


bbfbd8b151fe
bbfbd8b151fe
2be6bb0c79c7
bbfbd8b151fe
d74310d3b18a
c1e30ad98fe2
bbfbd8b151fe
43b8774dc409








bbfbd8b151fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149


                   

                         





                            










                                                        
















                                                               





                                     


                                                  


                               

















                                                               





                                                 
                 
                                                             



                            
                     









                                          

                                       

                                        

  
                                                                         
 









                                                         

                                   
                               
                                
                                  


                               


                                                                         


                                                                         

 


                                                                         


                                                                         
 
 
                                                     
                                                           
                                                             
                         
 








                                                             
                        
#ifndef __SH_INTC_H
#define __SH_INTC_H

#include <linux/ioport.h>

#ifdef CONFIG_SUPERH
#define INTC_NR_IRQS	512
#else
#define INTC_NR_IRQS	1024
#endif

/*
 * Convert back and forth between INTEVT and IRQ values.
 */
#ifdef CONFIG_CPU_HAS_INTEVT
#define evt2irq(evt)		(((evt) >> 5) - 16)
#define irq2evt(irq)		(((irq) + 16) << 5)
#else
#define evt2irq(evt)		(evt)
#define irq2evt(irq)		(irq)
#endif

typedef unsigned char intc_enum;

struct intc_vect {
	intc_enum enum_id;
	unsigned short vect;
};

#define INTC_VECT(enum_id, vect) { enum_id, vect }
#define INTC_IRQ(enum_id, irq) INTC_VECT(enum_id, irq2evt(irq))

struct intc_group {
	intc_enum enum_id;
	intc_enum enum_ids[32];
};

#define INTC_GROUP(enum_id, ids...) { enum_id, { ids } }

struct intc_subgroup {
	unsigned long reg, reg_width;
	intc_enum parent_id;
	intc_enum enum_ids[32];
};

struct intc_mask_reg {
	unsigned long set_reg, clr_reg, reg_width;
	intc_enum enum_ids[32];
#ifdef CONFIG_INTC_BALANCING
	unsigned long dist_reg;
#endif
#ifdef CONFIG_SMP
	unsigned long smp;
#endif
};

struct intc_prio_reg {
	unsigned long set_reg, clr_reg, reg_width, field_width;
	intc_enum enum_ids[16];
#ifdef CONFIG_SMP
	unsigned long smp;
#endif
};

struct intc_sense_reg {
	unsigned long reg, reg_width, field_width;
	intc_enum enum_ids[16];
};

#ifdef CONFIG_INTC_BALANCING
#define INTC_SMP_BALANCING(reg)	.dist_reg = (reg)
#else
#define INTC_SMP_BALANCING(reg)
#endif

#ifdef CONFIG_SMP
#define INTC_SMP(stride, nr)	.smp = (stride) | ((nr) << 8)
#else
#define INTC_SMP(stride, nr)
#endif

struct intc_hw_desc {
	struct intc_vect *vectors;
	unsigned int nr_vectors;
	struct intc_group *groups;
	unsigned int nr_groups;
	struct intc_mask_reg *mask_regs;
	unsigned int nr_mask_regs;
	struct intc_prio_reg *prio_regs;
	unsigned int nr_prio_regs;
	struct intc_sense_reg *sense_regs;
	unsigned int nr_sense_regs;
	struct intc_mask_reg *ack_regs;
	unsigned int nr_ack_regs;
	struct intc_subgroup *subgroups;
	unsigned int nr_subgroups;
};

#define _INTC_ARRAY(a) a, __same_type(a, NULL) ? 0 : sizeof(a)/sizeof(*a)

#define INTC_HW_DESC(vectors, groups, mask_regs,	\
		     prio_regs,	sense_regs, ack_regs)	\
{							\
	_INTC_ARRAY(vectors), _INTC_ARRAY(groups),	\
	_INTC_ARRAY(mask_regs), _INTC_ARRAY(prio_regs),	\
	_INTC_ARRAY(sense_regs), _INTC_ARRAY(ack_regs),	\
}

struct intc_desc {
	char *name;
	struct resource *resource;
	unsigned int num_resources;
	intc_enum force_enable;
	intc_enum force_disable;
	bool skip_syscore_suspend;
	struct intc_hw_desc hw;
};

#define DECLARE_INTC_DESC(symbol, chipname, vectors, groups,		\
	mask_regs, prio_regs, sense_regs)				\
struct intc_desc symbol __initdata = {					\
	.name = chipname,						\
	.hw = INTC_HW_DESC(vectors, groups, mask_regs,			\
			   prio_regs, sense_regs, NULL),		\
}

#define DECLARE_INTC_DESC_ACK(symbol, chipname, vectors, groups,	\
	mask_regs, prio_regs, sense_regs, ack_regs)			\
struct intc_desc symbol __initdata = {					\
	.name = chipname,						\
	.hw = INTC_HW_DESC(vectors, groups, mask_regs,			\
			   prio_regs, sense_regs, ack_regs),		\
}

int register_intc_controller(struct intc_desc *desc);
int intc_set_priority(unsigned int irq, unsigned int prio);
int intc_irq_lookup(const char *chipname, intc_enum enum_id);
void intc_finalize(void);

#ifdef CONFIG_INTC_USERIMASK
int register_intc_userimask(unsigned long addr);
#else
static inline int register_intc_userimask(unsigned long addr)
{
	return 0;
}
#endif

#endif /* __SH_INTC_H */