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