1293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 2293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * drivers/s390/net/ctcm_main.h 3293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * 4293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Copyright IBM Corp. 2001, 2007 5293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Authors: Fritz Elfert (felfert@millenux.com) 6293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Peter Tiedemann (ptiedem@de.ibm.com) 7293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 8293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 9293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#ifndef _CTCM_MAIN_H_ 10293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define _CTCM_MAIN_H_ 11293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 12293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include <asm/ccwdev.h> 13293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include <asm/ccwgroup.h> 14293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 15293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include <linux/skbuff.h> 16293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include <linux/netdevice.h> 17293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 18293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include "fsm.h" 19293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include "ctcm_dbug.h" 20293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#include "ctcm_mpc.h" 21293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 22293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTC_DRIVER_NAME "ctcm" 23293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTC_DEVICE_NAME "ctc" 24293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define MPC_DEVICE_NAME "mpc" 25aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define CTC_DEVICE_GENE CTC_DEVICE_NAME "%d" 26aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define MPC_DEVICE_GENE MPC_DEVICE_NAME "%d" 27293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 28293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_READ 0 29293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_WRITE 1 30293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_INUSE 2 31293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_BUFSIZE_CHANGED 4 32293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_FAILED 8 33293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_WAITIRQ 16 34293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_FLAGS_RWMASK 1 35293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK) 36293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 37293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define LOG_FLAG_ILLEGALPKT 1 38293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define LOG_FLAG_ILLEGALSIZE 2 39293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define LOG_FLAG_OVERRUN 4 40293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define LOG_FLAG_NOMEM 8 41293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 42293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define ctcm_pr_debug(fmt, arg...) printk(KERN_DEBUG fmt, ##arg) 43293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 44aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define CTCM_PR_DEBUG(fmt, arg...) \ 45aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann do { \ 46aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann if (do_debug) \ 47aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann printk(KERN_DEBUG fmt, ##arg); \ 48aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann } while (0) 49aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann 50aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define CTCM_PR_DBGDATA(fmt, arg...) \ 51aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann do { \ 52aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann if (do_debug_data) \ 53aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann printk(KERN_DEBUG fmt, ##arg); \ 54aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann } while (0) 55aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann 56aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define CTCM_D3_DUMP(buf, len) \ 57aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann do { \ 58aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann if (do_debug_data) \ 59aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann ctcmpc_dumpit(buf, len); \ 60aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann } while (0) 61aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann 62aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann#define CTCM_CCW_DUMP(buf, len) \ 63aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann do { \ 64aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann if (do_debug_ccw) \ 65aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann ctcmpc_dumpit(buf, len); \ 66aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann } while (0) 67aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann 680ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun/** 690ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun * Enum for classifying detected devices 700ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun */ 710ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braunenum ctcm_channel_types { 720ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun /* Device is not a channel */ 730ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun ctcm_channel_type_none, 740ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun 750ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun /* Device is a CTC/A */ 760ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun ctcm_channel_type_parallel, 770ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun 780ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun /* Device is a FICON channel */ 790ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun ctcm_channel_type_ficon, 800ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun 810ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun /* Device is a ESCON channel */ 820ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun ctcm_channel_type_escon 830ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun}; 840ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun 85293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 86293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * CCW commands, used in this driver. 87293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 88293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_WRITE 0x01 89293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_READ 0x02 90293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_NOOP 0x03 91293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_TIC 0x08 92293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_SENSE_CMD 0x14 93293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_WRITE_CTL 0x17 94293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_SET_EXTENDED 0xc3 95293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CCW_CMD_PREPARE 0xe3 96293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 97293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_S390 0 98293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_LINUX 1 99293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_LINUX_TTY 2 100293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_OS390 3 101293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_MPC 4 102293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_PROTO_MAX 4 103293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 104293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_BUFSIZE_LIMIT 65535 105293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_BUFSIZE_DEFAULT 32768 106293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define MPC_BUFSIZE_DEFAULT CTCM_BUFSIZE_LIMIT 107293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 108293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_TIME_1_SEC 1000 109293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_TIME_5_SEC 5000 110293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_TIME_10_SEC 10000 111293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 112293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define CTCM_INITIAL_BLOCKLEN 2 113293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 1143c09e2647b5e1f1f9fd383971468823c2505e1b0Ursula Braun#define CTCM_READ 0 1153c09e2647b5e1f1f9fd383971468823c2505e1b0Ursula Braun#define CTCM_WRITE 1 116293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 1172a0217d5c7d22d6dd28f8ae5d20b06d24dc426b8Kay Sievers#define CTCM_ID_SIZE 20+3 118293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 119293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstruct ctcm_profile { 120293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long maxmulti; 121293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long maxcqueue; 122293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long doios_single; 123293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long doios_multi; 124293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long txlen; 125293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long tx_time; 126293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct timespec send_stamp; 127293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann}; 128293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 129293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 130293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Definition of one channel 131293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 132293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstruct channel { 133293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct channel *next; 134293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann char id[CTCM_ID_SIZE]; 135293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct ccw_device *cdev; 136293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 137293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Type of this channel. 138293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * CTC/A or Escon for valid channels. 139293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 1400ca8cc6fe7e1acd42a8a3741473ad7540f13893aUrsula Braun enum ctcm_channel_types type; 141293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 142293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Misc. flags. See CHANNEL_FLAGS_... below 143293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 144293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u32 flags; 145293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 protocol; /* protocol of this channel (4 = MPC) */ 146293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 147293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * I/O and irq related stuff 148293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 149293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct ccw1 *ccw; 150293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct irb *irb; 151293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 152293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * RX/TX buffer size 153293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 154293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann int max_bufsize; 155293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct sk_buff *trans_skb; /* transmit/receive buffer */ 156293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct sk_buff_head io_queue; /* universal I/O queue */ 157293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct tasklet_struct ch_tasklet; /* MPC ONLY */ 158293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 159293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * TX queue for collecting skb's during busy. 160293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 161293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct sk_buff_head collect_queue; 162293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 163293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Amount of data in collect_queue. 164293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 165293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann int collect_len; 166293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 167293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * spinlock for collect_queue and collect_len 168293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 169293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann spinlock_t collect_lock; 170293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* 171293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Timer for detecting unresposive 172293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * I/O operations. 173293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 174293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann fsm_timer timer; 175293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* MPC ONLY section begin */ 176293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u32 th_seq_num; /* SNA TH seq number */ 177293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u8 th_seg; 178293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u32 pdu_seq; 179293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct sk_buff *xid_skb; 180293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann char *xid_skb_data; 181293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct th_header *xid_th; 182293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct xid2 *xid; 183293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann char *xid_id; 184293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct th_header *rcvd_xid_th; 185293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct xid2 *rcvd_xid; 186293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann char *rcvd_xid_id; 187293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u8 in_mpcgroup; 188293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann fsm_timer sweep_timer; 189293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct sk_buff_head sweep_queue; 190293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct th_header *discontact_th; 191293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct tasklet_struct ch_disc_tasklet; 192293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* MPC ONLY section end */ 193293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 194293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann int retry; /* retry counter for misc. operations */ 195293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann fsm_instance *fsm; /* finite state machine of this channel */ 196293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct net_device *netdev; /* corresponding net_device */ 197293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct ctcm_profile prof; 198aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann __u8 *trans_skb_data; 199293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 logflags; 200aa3f2cb63086e474a2ac3836d01fc6d9db393846Peter Tiedemann __u8 sense_rc; /* last unit check sense code report control */ 201293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann}; 202293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 203293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstruct ctcm_priv { 204293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct net_device_stats stats; 205293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long tbusy; 206293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 207293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* The MPC group struct of this interface */ 208293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct mpc_group *mpcg; /* MPC only */ 209293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct xid2 *xid; /* MPC only */ 210293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 211293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* The finite state machine of this interface */ 212293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann fsm_instance *fsm; 213293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 214293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* The protocol of this device */ 215293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 protocol; 216293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 217293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann /* Timer for restarting after I/O Errors */ 218293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann fsm_timer restart_timer; 219293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 220293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann int buffer_size; /* ctc only */ 221293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 222293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct channel *channel[2]; 223293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann}; 224293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 225293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannint ctcm_open(struct net_device *dev); 226293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannint ctcm_close(struct net_device *dev); 227293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 228293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 229293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * prototypes for non-static sysfs functions 230293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 231293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannint ctcm_add_attributes(struct device *dev); 232293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannvoid ctcm_remove_attributes(struct device *dev); 233293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannint ctcm_add_files(struct device *dev); 234293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannvoid ctcm_remove_files(struct device *dev); 235293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 236293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 237293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Compatibility macros for busy handling 238293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * of network devices. 239293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 240293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline void ctcm_clear_busy_do(struct net_device *dev) 241293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 242261893d30b0ddb5587f9143df18a6efed39a7ed6Peter Tiedemann clear_bit(0, &(((struct ctcm_priv *)dev->ml_priv)->tbusy)); 243293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann netif_wake_queue(dev); 244293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 245293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 246293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline void ctcm_clear_busy(struct net_device *dev) 247293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 248293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann struct mpc_group *grp; 249261893d30b0ddb5587f9143df18a6efed39a7ed6Peter Tiedemann grp = ((struct ctcm_priv *)dev->ml_priv)->mpcg; 250293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 251293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann if (!(grp && grp->in_sweep)) 252293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann ctcm_clear_busy_do(dev); 253293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 254293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 255293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 256293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline int ctcm_test_and_set_busy(struct net_device *dev) 257293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 258293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann netif_stop_queue(dev); 259261893d30b0ddb5587f9143df18a6efed39a7ed6Peter Tiedemann return test_and_set_bit(0, 260261893d30b0ddb5587f9143df18a6efed39a7ed6Peter Tiedemann &(((struct ctcm_priv *)dev->ml_priv)->tbusy)); 261293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 262293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 263293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannextern int loglevel; 264293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannextern struct channel *channels; 265293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 266293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannvoid ctcm_unpack_skb(struct channel *ch, struct sk_buff *pskb); 267293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 268293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 269293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Functions related to setup and device detection. 270293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 271293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 272293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline int ctcm_less_than(char *id1, char *id2) 273293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 274293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann unsigned long dev1, dev2; 275293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 276293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann id1 = id1 + 5; 277293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann id2 = id2 + 5; 278293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 279293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann dev1 = simple_strtoul(id1, &id1, 16); 280293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann dev2 = simple_strtoul(id2, &id2, 16); 281293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 282293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann return (dev1 < dev2); 283293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 284293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 285293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannint ctcm_ch_alloc_buffer(struct channel *ch); 286293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 287293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline int ctcm_checkalloc_buffer(struct channel *ch) 288293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 289293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann if (ch->trans_skb == NULL) 290293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann return ctcm_ch_alloc_buffer(ch); 291293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann if (ch->flags & CHANNEL_FLAGS_BUFSIZE_CHANGED) { 292293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann dev_kfree_skb(ch->trans_skb); 293293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann return ctcm_ch_alloc_buffer(ch); 294293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann } 295293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann return 0; 296293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 297293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 298293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstruct mpc_group *ctcmpc_init_mpc_group(struct ctcm_priv *priv); 299293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 300293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* test if protocol attribute (of struct ctcm_priv or struct channel) 301293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * has MPC protocol setting. Type is not checked 302293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 303293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define IS_MPC(p) ((p)->protocol == CTCM_PROTO_MPC) 304293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 305293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* test if struct ctcm_priv of struct net_device has MPC protocol setting */ 306261893d30b0ddb5587f9143df18a6efed39a7ed6Peter Tiedemann#define IS_MPCDEV(dev) IS_MPC((struct ctcm_priv *)dev->ml_priv) 307293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 308293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstatic inline gfp_t gfp_type(void) 309293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann{ 310293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann return in_interrupt() ? GFP_ATOMIC : GFP_KERNEL; 311293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann} 312293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 313293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann/* 314293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann * Definition of our link level header. 315293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann */ 316293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemannstruct ll_header { 317293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 length; 318293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 type; 319293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann __u16 unused; 320293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann}; 321293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#define LL_HEADER_LENGTH (sizeof(struct ll_header)) 322293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann 323293d984f0e3604c04dcdbf00117ddc1e5d4b1909Peter Tiedemann#endif 324