brintos

brintos / linux-shallow public Read only

0
0
Text · 7.6 KiB · a2699b7 Raw
343 lines · c
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) \17do { \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 stuff31 */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 */39enum 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_osa251};52 53/**54 * CCW commands used in this driver55 */56#define LCS_CCW_WRITE		0x0157#define LCS_CCW_READ		0x0258#define LCS_CCW_TRANSFER	0x0859 60/**61 * LCS device status primitives62 */63#define LCS_CMD_STARTLAN	0x0164#define LCS_CMD_STOPLAN		0x0265#define LCS_CMD_LANSTAT		0x0466#define LCS_CMD_STARTUP		0x0767#define LCS_CMD_SHUTDOWN	0x0868#define LCS_CMD_QIPASSIST	0xb269#define LCS_CMD_SETIPM		0xb470#define LCS_CMD_DELIPM		0xb571 72#define LCS_INITIATOR_TCPIP	0x0073#define LCS_INITIATOR_LGW	0x0174#define LCS_STD_CMD_SIZE	1675#define LCS_MULTICAST_CMD_SIZE	40476 77/**78 * LCS IPASSIST MASKS,only used when multicast is switched on79 */80/* Not supported by LCS */81#define LCS_IPASS_ARP_PROCESSING	0x000182#define LCS_IPASS_IN_CHECKSUM_SUPPORT	0x000283#define LCS_IPASS_OUT_CHECKSUM_SUPPORT	0x000484#define LCS_IPASS_IP_FRAG_REASSEMBLY	0x000885#define LCS_IPASS_IP_FILTERING		0x001086/* Supported by lcs 3172 */87#define LCS_IPASS_IPV6_SUPPORT		0x002088#define LCS_IPASS_MULTICAST_SUPPORT	0x004089 90/**91 * LCS sense byte definitions92 */93#define LCS_SENSE_BYTE_0 		094#define LCS_SENSE_BYTE_1 		195#define LCS_SENSE_BYTE_2 		296#define LCS_SENSE_BYTE_3 		397#define LCS_SENSE_INTERFACE_DISCONNECT	0x0198#define LCS_SENSE_EQUIPMENT_CHECK	0x1099#define LCS_SENSE_BUS_OUT_CHECK		0x20100#define LCS_SENSE_INTERVENTION_REQUIRED 0x40101#define LCS_SENSE_CMD_REJECT		0x80102#define LCS_SENSE_RESETTING_EVENT	0x80103#define LCS_SENSE_DEVICE_ONLINE		0x20104 105/**106 * LCS packet type definitions107 */108#define LCS_FRAME_TYPE_CONTROL		0109#define LCS_FRAME_TYPE_ENET		1110#define LCS_FRAME_TYPE_TR		2111#define LCS_FRAME_TYPE_FDDI		7112#define LCS_FRAME_TYPE_AUTO		-1113 114/**115 * some more definitions,we will sort them later116 */117#define LCS_ILLEGAL_OFFSET		0xffff118#define LCS_IOBUFFERSIZE		0x5000119#define LCS_NUM_BUFFS			32	/* needs to be power of 2 */120#define LCS_MAC_LENGTH			6121#define LCS_INVALID_PORT_NO		-1122#define LCS_LANCMD_TIMEOUT_DEFAULT      5123 124/**125 * Multicast state126 */127#define	 LCS_IPM_STATE_SET_REQUIRED	0128#define	 LCS_IPM_STATE_DEL_REQUIRED	1129#define	 LCS_IPM_STATE_ON_CARD		2130 131/**132 * LCS IP Assist declarations133 * seems to be only used for multicast134 */135#define	 LCS_IPASS_ARP_PROCESSING	0x0001136#define	 LCS_IPASS_INBOUND_CSUM_SUPP	0x0002137#define	 LCS_IPASS_OUTBOUND_CSUM_SUPP	0x0004138#define	 LCS_IPASS_IP_FRAG_REASSEMBLY	0x0008139#define	 LCS_IPASS_IP_FILTERING		0x0010140#define	 LCS_IPASS_IPV6_SUPPORT		0x0020141#define	 LCS_IPASS_MULTICAST_SUPPORT	0x0040142 143/**144 * LCS Buffer states145 */146enum 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 declarations155 */156enum 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 machine168 */169enum lcs_dev_states {170	DEV_STATE_DOWN,171	DEV_STATE_UP,172	DEV_STATE_RECOVER,173};174 175enum lcs_threads {176	LCS_SET_MC_THREAD 	= 1,177	LCS_RECOVERY_THREAD 	= 2,178};179 180/**181 * LCS struct declarations182 */183struct lcs_header {184	__u16  offset;185	__u8   type;186	__u8   slot;187}  __attribute__ ((packed));188 189struct lcs_ip_mac_pair {190	__be32  ip_addr;191	__u8   mac_addr[LCS_MAC_LENGTH];192	__u8   reserved[2];193}  __attribute__ ((packed));194 195struct lcs_ipm_list {196	struct list_head list;197	struct lcs_ip_mac_pair ipm;198	__u8 ipm_state;199};200 201struct 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_MULTICAST238		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_pair247				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 */258struct lcs_card;259struct lcs_channel;260 261/**262 * Definition of an lcs buffer.263 */264struct 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 272struct 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 channel287 */288struct 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 card302 */303struct 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_MULTICAST327	struct list_head ipm_list;328#endif329	__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