1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*lcs.h*/
3  
4  #include <linux/interrupt.h>
5  #include <linux/netdevice.h>
6  #include <linux/skbuff.h>
7  #include <linux/workqueue.h>
8  #include <linux/refcount.h>
9  #include <asm/ccwdev.h>
10  
11  #define LCS_DBF_TEXT(level, name, text) \
12  	do { \
13  		debug_text_event(lcs_dbf_##name, level, text); \
14  	} while (0)
15  
16  #define LCS_DBF_HEX(level,name,addr,len) \
17  do { \
18  	debug_event(lcs_dbf_##name,level,(void*)(addr),len); \
19  } while (0)
20  
21  #define LCS_DBF_TEXT_(level,name,text...) \
22  	do { \
23  		if (debug_level_enabled(lcs_dbf_##name, level)) { \
24  			scnprintf(debug_buffer, sizeof(debug_buffer), text); \
25  			debug_text_event(lcs_dbf_##name, level, debug_buffer); \
26  		} \
27  	} while (0)
28  
29  /**
30   *	sysfs related stuff
31   */
32  #define CARD_FROM_DEV(cdev) \
33  	(struct lcs_card *) dev_get_drvdata( \
34  		&((struct ccwgroup_device *)dev_get_drvdata(&cdev->dev))->dev);
35  
36  /**
37   * Enum for classifying detected devices.
38   */
39  enum lcs_channel_types {
40  	/* Device is not a channel  */
41  	lcs_channel_type_none,
42  
43  	/* Device is a 2216 channel */
44  	lcs_channel_type_parallel,
45  
46  	/* Device is a 2216 channel */
47  	lcs_channel_type_2216,
48  
49  	/* Device is a OSA2 card */
50  	lcs_channel_type_osa2
51  };
52  
53  /**
54   * CCW commands used in this driver
55   */
56  #define LCS_CCW_WRITE		0x01
57  #define LCS_CCW_READ		0x02
58  #define LCS_CCW_TRANSFER	0x08
59  
60  /**
61   * LCS device status primitives
62   */
63  #define LCS_CMD_STARTLAN	0x01
64  #define LCS_CMD_STOPLAN		0x02
65  #define LCS_CMD_LANSTAT		0x04
66  #define LCS_CMD_STARTUP		0x07
67  #define LCS_CMD_SHUTDOWN	0x08
68  #define LCS_CMD_QIPASSIST	0xb2
69  #define LCS_CMD_SETIPM		0xb4
70  #define LCS_CMD_DELIPM		0xb5
71  
72  #define LCS_INITIATOR_TCPIP	0x00
73  #define LCS_INITIATOR_LGW	0x01
74  #define LCS_STD_CMD_SIZE	16
75  #define LCS_MULTICAST_CMD_SIZE	404
76  
77  /**
78   * LCS IPASSIST MASKS,only used when multicast is switched on
79   */
80  /* Not supported by LCS */
81  #define LCS_IPASS_ARP_PROCESSING	0x0001
82  #define LCS_IPASS_IN_CHECKSUM_SUPPORT	0x0002
83  #define LCS_IPASS_OUT_CHECKSUM_SUPPORT	0x0004
84  #define LCS_IPASS_IP_FRAG_REASSEMBLY	0x0008
85  #define LCS_IPASS_IP_FILTERING		0x0010
86  /* Supported by lcs 3172 */
87  #define LCS_IPASS_IPV6_SUPPORT		0x0020
88  #define LCS_IPASS_MULTICAST_SUPPORT	0x0040
89  
90  /**
91   * LCS sense byte definitions
92   */
93  #define LCS_SENSE_BYTE_0 		0
94  #define LCS_SENSE_BYTE_1 		1
95  #define LCS_SENSE_BYTE_2 		2
96  #define LCS_SENSE_BYTE_3 		3
97  #define LCS_SENSE_INTERFACE_DISCONNECT	0x01
98  #define LCS_SENSE_EQUIPMENT_CHECK	0x10
99  #define LCS_SENSE_BUS_OUT_CHECK		0x20
100  #define LCS_SENSE_INTERVENTION_REQUIRED 0x40
101  #define LCS_SENSE_CMD_REJECT		0x80
102  #define LCS_SENSE_RESETTING_EVENT	0x80
103  #define LCS_SENSE_DEVICE_ONLINE		0x20
104  
105  /**
106   * LCS packet type definitions
107   */
108  #define LCS_FRAME_TYPE_CONTROL		0
109  #define LCS_FRAME_TYPE_ENET		1
110  #define LCS_FRAME_TYPE_TR		2
111  #define LCS_FRAME_TYPE_FDDI		7
112  #define LCS_FRAME_TYPE_AUTO		-1
113  
114  /**
115   * some more definitions,we will sort them later
116   */
117  #define LCS_ILLEGAL_OFFSET		0xffff
118  #define LCS_IOBUFFERSIZE		0x5000
119  #define LCS_NUM_BUFFS			32	/* needs to be power of 2 */
120  #define LCS_MAC_LENGTH			6
121  #define LCS_INVALID_PORT_NO		-1
122  #define LCS_LANCMD_TIMEOUT_DEFAULT      5
123  
124  /**
125   * Multicast state
126   */
127  #define	 LCS_IPM_STATE_SET_REQUIRED	0
128  #define	 LCS_IPM_STATE_DEL_REQUIRED	1
129  #define	 LCS_IPM_STATE_ON_CARD		2
130  
131  /**
132   * LCS IP Assist declarations
133   * seems to be only used for multicast
134   */
135  #define	 LCS_IPASS_ARP_PROCESSING	0x0001
136  #define	 LCS_IPASS_INBOUND_CSUM_SUPP	0x0002
137  #define	 LCS_IPASS_OUTBOUND_CSUM_SUPP	0x0004
138  #define	 LCS_IPASS_IP_FRAG_REASSEMBLY	0x0008
139  #define	 LCS_IPASS_IP_FILTERING		0x0010
140  #define	 LCS_IPASS_IPV6_SUPPORT		0x0020
141  #define	 LCS_IPASS_MULTICAST_SUPPORT	0x0040
142  
143  /**
144   * LCS Buffer states
145   */
146  enum lcs_buffer_states {
147  	LCS_BUF_STATE_EMPTY,	/* buffer is empty */
148  	LCS_BUF_STATE_LOCKED,	/* buffer is locked, don't touch */
149  	LCS_BUF_STATE_READY,	/* buffer is ready for read/write */
150  	LCS_BUF_STATE_PROCESSED,
151  };
152  
153  /**
154   * LCS Channel State Machine declarations
155   */
156  enum lcs_channel_states {
157  	LCS_CH_STATE_INIT,
158  	LCS_CH_STATE_HALTED,
159  	LCS_CH_STATE_STOPPED,
160  	LCS_CH_STATE_RUNNING,
161  	LCS_CH_STATE_SUSPENDED,
162  	LCS_CH_STATE_CLEARED,
163  	LCS_CH_STATE_ERROR,
164  };
165  
166  /**
167   * LCS device state machine
168   */
169  enum lcs_dev_states {
170  	DEV_STATE_DOWN,
171  	DEV_STATE_UP,
172  	DEV_STATE_RECOVER,
173  };
174  
175  enum lcs_threads {
176  	LCS_SET_MC_THREAD 	= 1,
177  	LCS_RECOVERY_THREAD 	= 2,
178  };
179  
180  /**
181   * LCS struct declarations
182   */
183  struct lcs_header {
184  	__u16  offset;
185  	__u8   type;
186  	__u8   slot;
187  }  __attribute__ ((packed));
188  
189  struct lcs_ip_mac_pair {
190  	__be32  ip_addr;
191  	__u8   mac_addr[LCS_MAC_LENGTH];
192  	__u8   reserved[2];
193  }  __attribute__ ((packed));
194  
195  struct lcs_ipm_list {
196  	struct list_head list;
197  	struct lcs_ip_mac_pair ipm;
198  	__u8 ipm_state;
199  };
200  
201  struct lcs_cmd {
202  	__u16  offset;
203  	__u8   type;
204  	__u8   slot;
205  	__u8   cmd_code;
206  	__u8   initiator;
207  	__u16  sequence_no;
208  	__u16  return_code;
209  	union {
210  		struct {
211  			__u8   lan_type;
212  			__u8   portno;
213  			__u16  parameter_count;
214  			__u8   operator_flags[3];
215  			__u8   reserved[3];
216  		} lcs_std_cmd;
217  		struct {
218  			__u16  unused1;
219  			__u16  buff_size;
220  			__u8   unused2[6];
221  		} lcs_startup;
222  		struct {
223  			__u8   lan_type;
224  			__u8   portno;
225  			__u8   unused[10];
226  			__u8   mac_addr[LCS_MAC_LENGTH];
227  			__u32  num_packets_deblocked;
228  			__u32  num_packets_blocked;
229  			__u32  num_packets_tx_on_lan;
230  			__u32  num_tx_errors_detected;
231  			__u32  num_tx_packets_disgarded;
232  			__u32  num_packets_rx_from_lan;
233  			__u32  num_rx_errors_detected;
234  			__u32  num_rx_discarded_nobuffs_avail;
235  			__u32  num_rx_packets_too_large;
236  		} lcs_lanstat_cmd;
237  #ifdef CONFIG_IP_MULTICAST
238  		struct {
239  			__u8   lan_type;
240  			__u8   portno;
241  			__u16  num_ip_pairs;
242  			__u16  ip_assists_supported;
243  			__u16  ip_assists_enabled;
244  			__u16  version;
245  			struct {
246  				struct lcs_ip_mac_pair
247  				ip_mac_pair[32];
248  				__u32	  response_data;
249  			} lcs_ipass_ctlmsg __attribute ((packed));
250  		} lcs_qipassist __attribute__ ((packed));
251  #endif /*CONFIG_IP_MULTICAST */
252  	} cmd __attribute__ ((packed));
253  }  __attribute__ ((packed));
254  
255  /**
256   * Forward declarations.
257   */
258  struct lcs_card;
259  struct lcs_channel;
260  
261  /**
262   * Definition of an lcs buffer.
263   */
264  struct lcs_buffer {
265  	enum lcs_buffer_states state;
266  	void *data;
267  	int count;
268  	/* Callback for completion notification. */
269  	void (*callback)(struct lcs_channel *, struct lcs_buffer *);
270  };
271  
272  struct lcs_reply {
273  	struct list_head list;
274  	__u16 sequence_no;
275  	refcount_t refcnt;
276  	/* Callback for completion notification. */
277  	void (*callback)(struct lcs_card *, struct lcs_cmd *);
278  	wait_queue_head_t wait_q;
279  	struct lcs_card *card;
280  	struct timer_list timer;
281  	int received;
282  	int rc;
283  };
284  
285  /**
286   * Definition of an lcs channel
287   */
288  struct lcs_channel {
289  	enum lcs_channel_states state;
290  	struct ccw_device *ccwdev;
291  	struct ccw1 ccws[LCS_NUM_BUFFS + 1];
292  	wait_queue_head_t wait_q;
293  	struct tasklet_struct irq_tasklet;
294  	struct lcs_buffer iob[LCS_NUM_BUFFS];
295  	int io_idx;
296  	int buf_idx;
297  };
298  
299  
300  /**
301   * definition of the lcs card
302   */
303  struct lcs_card {
304  	spinlock_t lock;
305  	spinlock_t ipm_lock;
306  	enum lcs_dev_states state;
307  	struct net_device *dev;
308  	struct net_device_stats stats;
309  	__be16 (*lan_type_trans)(struct sk_buff *skb,
310  					 struct net_device *dev);
311  	struct ccwgroup_device *gdev;
312  	struct lcs_channel read;
313  	struct lcs_channel write;
314  	struct lcs_buffer *tx_buffer;
315  	int tx_emitted;
316  	struct list_head lancmd_waiters;
317  	int lancmd_timeout;
318  
319  	struct work_struct kernel_thread_starter;
320  	spinlock_t mask_lock;
321  	unsigned long thread_start_mask;
322  	unsigned long thread_running_mask;
323  	unsigned long thread_allowed_mask;
324  	wait_queue_head_t wait_q;
325  
326  #ifdef CONFIG_IP_MULTICAST
327  	struct list_head ipm_list;
328  #endif
329  	__u8 mac[LCS_MAC_LENGTH];
330  	__u16 ip_assists_supported;
331  	__u16 ip_assists_enabled;
332  	__s8 lan_type;
333  	__u32 pkt_seq;
334  	__u16 sequence_no;
335  	__s16 portno;
336  	/* Some info copied from probeinfo */
337  	u8 device_forced;
338  	u8 max_port_no;
339  	u8 hint_port_no;
340  	s16 port_protocol_no;
341  }  __attribute__ ((aligned(8)));
342  
343