lcs.h (7725B)
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 sprintf(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 */ 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_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 */ 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 declarations 155 */ 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 machine 168 */ 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 declarations 182 */ 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_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 */ 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 channel 287 */ 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 card 302 */ 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_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