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