| /*lcs.h*/ | |
| #include <linux/interrupt.h> | |
| #include <linux/netdevice.h> | |
| #include <linux/skbuff.h> | |
| #include <linux/workqueue.h> | |
| #include <asm/ccwdev.h> | |
| #define VERSION_LCS_H "$Revision: 1.19 $" | |
| #define LCS_DBF_TEXT(level, name, text) \ | |
| do { \ | |
| debug_text_event(lcs_dbf_##name, level, text); \ | |
| } while (0) | |
| #define LCS_DBF_HEX(level,name,addr,len) \ | |
| do { \ | |
| debug_event(lcs_dbf_##name,level,(void*)(addr),len); \ | |
| } while (0) | |
| #define LCS_DBF_TEXT_(level,name,text...) \ | |
| do { \ | |
| sprintf(debug_buffer, text); \ | |
| debug_text_event(lcs_dbf_##name,level, debug_buffer);\ | |
| } while (0) | |
| /** | |
| * some more definitions for debug or output stuff | |
| */ | |
| #define PRINTK_HEADER " lcs: " | |
| /** | |
| * sysfs related stuff | |
| */ | |
| #define CARD_FROM_DEV(cdev) \ | |
| (struct lcs_card *) \ | |
| ((struct ccwgroup_device *)cdev->dev.driver_data)->dev.driver_data; | |
| /** | |
| * CCW commands used in this driver | |
| */ | |
| #define LCS_CCW_WRITE 0x01 | |
| #define LCS_CCW_READ 0x02 | |
| #define LCS_CCW_TRANSFER 0x08 | |
| /** | |
| * LCS device status primitives | |
| */ | |
| #define LCS_CMD_STARTLAN 0x01 | |
| #define LCS_CMD_STOPLAN 0x02 | |
| #define LCS_CMD_LANSTAT 0x04 | |
| #define LCS_CMD_STARTUP 0x07 | |
| #define LCS_CMD_SHUTDOWN 0x08 | |
| #define LCS_CMD_QIPASSIST 0xb2 | |
| #define LCS_CMD_SETIPM 0xb4 | |
| #define LCS_CMD_DELIPM 0xb5 | |
| #define LCS_INITIATOR_TCPIP 0x00 | |
| #define LCS_INITIATOR_LGW 0x01 | |
| #define LCS_STD_CMD_SIZE 16 | |
| #define LCS_MULTICAST_CMD_SIZE 404 | |
| /** | |
| * LCS IPASSIST MASKS,only used when multicast is switched on | |
| */ | |
| /* Not supported by LCS */ | |
| #define LCS_IPASS_ARP_PROCESSING 0x0001 | |
| #define LCS_IPASS_IN_CHECKSUM_SUPPORT 0x0002 | |
| #define LCS_IPASS_OUT_CHECKSUM_SUPPORT 0x0004 | |
| #define LCS_IPASS_IP_FRAG_REASSEMBLY 0x0008 | |
| #define LCS_IPASS_IP_FILTERING 0x0010 | |
| /* Supported by lcs 3172 */ | |
| #define LCS_IPASS_IPV6_SUPPORT 0x0020 | |
| #define LCS_IPASS_MULTICAST_SUPPORT 0x0040 | |
| /** | |
| * LCS sense byte definitions | |
| */ | |
| #define LCS_SENSE_INTERFACE_DISCONNECT 0x01 | |
| #define LCS_SENSE_EQUIPMENT_CHECK 0x10 | |
| #define LCS_SENSE_BUS_OUT_CHECK 0x20 | |
| #define LCS_SENSE_INTERVENTION_REQUIRED 0x40 | |
| #define LCS_SENSE_CMD_REJECT 0x80 | |
| #define LCS_SENSE_RESETTING_EVENT 0x0080 | |
| #define LCS_SENSE_DEVICE_ONLINE 0x0020 | |
| /** | |
| * LCS packet type definitions | |
| */ | |
| #define LCS_FRAME_TYPE_CONTROL 0 | |
| #define LCS_FRAME_TYPE_ENET 1 | |
| #define LCS_FRAME_TYPE_TR 2 | |
| #define LCS_FRAME_TYPE_FDDI 7 | |
| #define LCS_FRAME_TYPE_AUTO -1 | |
| /** | |
| * some more definitions,we will sort them later | |
| */ | |
| #define LCS_ILLEGAL_OFFSET 0xffff | |
| #define LCS_IOBUFFERSIZE 0x5000 | |
| #define LCS_NUM_BUFFS 8 /* needs to be power of 2 */ | |
| #define LCS_MAC_LENGTH 6 | |
| #define LCS_INVALID_PORT_NO -1 | |
| #define LCS_LANCMD_TIMEOUT_DEFAULT 5 | |
| /** | |
| * Multicast state | |
| */ | |
| #define LCS_IPM_STATE_SET_REQUIRED 0 | |
| #define LCS_IPM_STATE_DEL_REQUIRED 1 | |
| #define LCS_IPM_STATE_ON_CARD 2 | |
| /** | |
| * LCS IP Assist declarations | |
| * seems to be only used for multicast | |
| */ | |
| #define LCS_IPASS_ARP_PROCESSING 0x0001 | |
| #define LCS_IPASS_INBOUND_CSUM_SUPP 0x0002 | |
| #define LCS_IPASS_OUTBOUND_CSUM_SUPP 0x0004 | |
| #define LCS_IPASS_IP_FRAG_REASSEMBLY 0x0008 | |
| #define LCS_IPASS_IP_FILTERING 0x0010 | |
| #define LCS_IPASS_IPV6_SUPPORT 0x0020 | |
| #define LCS_IPASS_MULTICAST_SUPPORT 0x0040 | |
| /** | |
| * LCS Buffer states | |
| */ | |
| enum lcs_buffer_states { | |
| BUF_STATE_EMPTY, /* buffer is empty */ | |
| BUF_STATE_LOCKED, /* buffer is locked, don't touch */ | |
| BUF_STATE_READY, /* buffer is ready for read/write */ | |
| BUF_STATE_PROCESSED, | |
| }; | |
| /** | |
| * LCS Channel State Machine declarations | |
| */ | |
| enum lcs_channel_states { | |
| CH_STATE_INIT, | |
| CH_STATE_HALTED, | |
| CH_STATE_STOPPED, | |
| CH_STATE_RUNNING, | |
| CH_STATE_SUSPENDED, | |
| CH_STATE_CLEARED, | |
| }; | |
| /** | |
| * LCS device state machine | |
| */ | |
| enum lcs_dev_states { | |
| DEV_STATE_DOWN, | |
| DEV_STATE_UP, | |
| DEV_STATE_RECOVER, | |
| }; | |
| enum lcs_threads { | |
| LCS_SET_MC_THREAD = 1, | |
| LCS_STARTLAN_THREAD = 2, | |
| LCS_STOPLAN_THREAD = 4, | |
| LCS_STARTUP_THREAD = 8, | |
| }; | |
| /** | |
| * LCS struct declarations | |
| */ | |
| struct lcs_header { | |
| __u16 offset; | |
| __u8 type; | |
| __u8 slot; | |
| } __attribute__ ((packed)); | |
| struct lcs_ip_mac_pair { | |
| __u32 ip_addr; | |
| __u8 mac_addr[LCS_MAC_LENGTH]; | |
| __u8 reserved[2]; | |
| } __attribute__ ((packed)); | |
| struct lcs_ipm_list { | |
| struct list_head list; | |
| struct lcs_ip_mac_pair ipm; | |
| __u8 ipm_state; | |
| }; | |
| struct lcs_cmd { | |
| __u16 offset; | |
| __u8 type; | |
| __u8 slot; | |
| __u8 cmd_code; | |
| __u8 initiator; | |
| __u16 sequence_no; | |
| __u16 return_code; | |
| union { | |
| struct { | |
| __u8 lan_type; | |
| __u8 portno; | |
| __u16 parameter_count; | |
| __u8 operator_flags[3]; | |
| __u8 reserved[3]; | |
| } lcs_std_cmd; | |
| struct { | |
| __u16 unused1; | |
| __u16 buff_size; | |
| __u8 unused2[6]; | |
| } lcs_startup; | |
| struct { | |
| __u8 lan_type; | |
| __u8 portno; | |
| __u8 unused[10]; | |
| __u8 mac_addr[LCS_MAC_LENGTH]; | |
| __u32 num_packets_deblocked; | |
| __u32 num_packets_blocked; | |
| __u32 num_packets_tx_on_lan; | |
| __u32 num_tx_errors_detected; | |
| __u32 num_tx_packets_disgarded; | |
| __u32 num_packets_rx_from_lan; | |
| __u32 num_rx_errors_detected; | |
| __u32 num_rx_discarded_nobuffs_avail; | |
| __u32 num_rx_packets_too_large; | |
| } lcs_lanstat_cmd; | |
| #ifdef CONFIG_IP_MULTICAST | |
| struct { | |
| __u8 lan_type; | |
| __u8 portno; | |
| __u16 num_ip_pairs; | |
| __u16 ip_assists_supported; | |
| __u16 ip_assists_enabled; | |
| __u16 version; | |
| struct { | |
| struct lcs_ip_mac_pair | |
| ip_mac_pair[32]; | |
| __u32 response_data; | |
| } lcs_ipass_ctlmsg __attribute ((packed)); | |
| } lcs_qipassist __attribute__ ((packed)); | |
| #endif /*CONFIG_IP_MULTICAST */ | |
| } cmd __attribute__ ((packed)); | |
| } __attribute__ ((packed)); | |
| /** | |
| * Forward declarations. | |
| */ | |
| struct lcs_card; | |
| struct lcs_channel; | |
| /** | |
| * Definition of an lcs buffer. | |
| */ | |
| struct lcs_buffer { | |
| enum lcs_buffer_states state; | |
| void *data; | |
| int count; | |
| /* Callback for completion notification. */ | |
| void (*callback)(struct lcs_channel *, struct lcs_buffer *); | |
| }; | |
| struct lcs_reply { | |
| struct list_head list; | |
| __u16 sequence_no; | |
| atomic_t refcnt; | |
| /* Callback for completion notification. */ | |
| void (*callback)(struct lcs_card *, struct lcs_cmd *); | |
| wait_queue_head_t wait_q; | |
| struct lcs_card *card; | |
| int received; | |
| int rc; | |
| }; | |
| /** | |
| * Definition of an lcs channel | |
| */ | |
| struct lcs_channel { | |
| enum lcs_channel_states state; | |
| struct ccw_device *ccwdev; | |
| struct ccw1 ccws[LCS_NUM_BUFFS + 1]; | |
| wait_queue_head_t wait_q; | |
| struct tasklet_struct irq_tasklet; | |
| struct lcs_buffer iob[LCS_NUM_BUFFS]; | |
| int io_idx; | |
| int buf_idx; | |
| }; | |
| /** | |
| * definition of the lcs card | |
| */ | |
| struct lcs_card { | |
| spinlock_t lock; | |
| spinlock_t ipm_lock; | |
| enum lcs_dev_states state; | |
| struct net_device *dev; | |
| struct net_device_stats stats; | |
| unsigned short (*lan_type_trans)(struct sk_buff *skb, | |
| struct net_device *dev); | |
| struct lcs_channel read; | |
| struct lcs_channel write; | |
| struct lcs_buffer *tx_buffer; | |
| int tx_emitted; | |
| struct list_head lancmd_waiters; | |
| int lancmd_timeout; | |
| struct work_struct kernel_thread_starter; | |
| spinlock_t mask_lock; | |
| unsigned long thread_start_mask; | |
| unsigned long thread_running_mask; | |
| unsigned long thread_allowed_mask; | |
| wait_queue_head_t wait_q; | |
| #ifdef CONFIG_IP_MULTICAST | |
| struct list_head ipm_list; | |
| #endif | |
| __u8 mac[LCS_MAC_LENGTH]; | |
| __u16 ip_assists_supported; | |
| __u16 ip_assists_enabled; | |
| __s8 lan_type; | |
| __u32 pkt_seq; | |
| __u16 sequence_no; | |
| __s16 portno; | |
| /* Some info copied from probeinfo */ | |
| u8 device_forced; | |
| u8 max_port_no; | |
| u8 hint_port_no; | |
| s16 port_protocol_no; | |
| } __attribute__ ((aligned(8))); | |