linux/drivers/s390/net/lcs.h
<<
>>
Prefs
   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
 343