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