linux/drivers/s390/net/lcs.h
<<
>>
Prefs
   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) \
  15do { \
  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 */
  20static 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 */
  43enum 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 */
 150enum 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 */
 160enum 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 */
 173enum lcs_dev_states {
 174        DEV_STATE_DOWN,
 175        DEV_STATE_UP,
 176        DEV_STATE_RECOVER,
 177};
 178
 179enum lcs_threads {
 180        LCS_SET_MC_THREAD       = 1,
 181        LCS_RECOVERY_THREAD     = 2,
 182};
 183
 184/**
 185 * LCS struct declarations
 186 */
 187struct lcs_header {
 188        __u16  offset;
 189        __u8   type;
 190        __u8   slot;
 191}  __attribute__ ((packed));
 192
 193struct lcs_ip_mac_pair {
 194        __be32  ip_addr;
 195        __u8   mac_addr[LCS_MAC_LENGTH];
 196        __u8   reserved[2];
 197}  __attribute__ ((packed));
 198
 199struct lcs_ipm_list {
 200        struct list_head list;
 201        struct lcs_ip_mac_pair ipm;
 202        __u8 ipm_state;
 203};
 204
 205struct 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 */
 262struct lcs_card;
 263struct lcs_channel;
 264
 265/**
 266 * Definition of an lcs buffer.
 267 */
 268struct 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
 276struct 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 */
 291struct 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 */
 306struct 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