2005-05-12 20:36:47 +02:00
/*
* CTC / ESCON network driver
*
* Copyright ( C ) 2001 IBM Deutschland Entwicklung GmbH , IBM Corporation
* Author ( s ) : Fritz Elfert ( elfert @ de . ibm . com , felfert @ millenux . com )
Peter Tiedemann ( ptiedem @ de . ibm . com )
*
*
* Documentation used :
* - Principles of Operation ( IBM doc # : SA22 - 7201 - 06 )
* - Common IO / - Device Commands and Self Description ( IBM doc # : SA22 - 7204 - 02 )
* - Common IO / - Device Commands and Self Description ( IBM doc # : SN22 - 5535 )
* - ESCON Channel - to - Channel Adapter ( IBM doc # : SA22 - 7203 - 00 )
* - ESCON I / O Interface ( IBM doc # : SA22 - 7202 - 02 9
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*/
# ifndef _CTCMAIN_H_
# define _CTCMAIN_H_
# include <asm/ccwdev.h>
# include <asm/ccwgroup.h>
2006-04-13 20:19:12 +02:00
# include <linux/skbuff.h>
# include <linux/netdevice.h>
2005-05-12 20:36:47 +02:00
# include "fsm.h"
# include "cu3088.h"
/**
* CCW commands , used in this driver .
*/
# define CCW_CMD_WRITE 0x01
# define CCW_CMD_READ 0x02
# define CCW_CMD_SET_EXTENDED 0xc3
# define CCW_CMD_PREPARE 0xe3
# define CTC_PROTO_S390 0
# define CTC_PROTO_LINUX 1
# define CTC_PROTO_OS390 3
# define CTC_BUFSIZE_LIMIT 65535
# define CTC_BUFSIZE_DEFAULT 32768
# define CTC_TIMEOUT_5SEC 5000
# define CTC_INITIAL_BLOCKLEN 2
# define READ 0
# define WRITE 1
# define CTC_ID_SIZE BUS_ID_SIZE+3
struct ctc_profile {
unsigned long maxmulti ;
unsigned long maxcqueue ;
unsigned long doios_single ;
unsigned long doios_multi ;
unsigned long txlen ;
unsigned long tx_time ;
struct timespec send_stamp ;
} ;
/**
* Definition of one channel
*/
struct channel {
/**
* Pointer to next channel in list .
*/
struct channel * next ;
char id [ CTC_ID_SIZE ] ;
struct ccw_device * cdev ;
/**
* Type of this channel .
* CTC / A or Escon for valid channels .
*/
enum channel_types type ;
/**
* Misc . flags . See CHANNEL_FLAGS_ . . . below
*/
__u32 flags ;
/**
* The protocol of this channel
*/
__u16 protocol ;
/**
* I / O and irq related stuff
*/
struct ccw1 * ccw ;
struct irb * irb ;
/**
* RX / TX buffer size
*/
int max_bufsize ;
/**
* Transmit / Receive buffer .
*/
struct sk_buff * trans_skb ;
/**
* Universal I / O queue .
*/
struct sk_buff_head io_queue ;
/**
* TX queue for collecting skb ' s during busy .
*/
struct sk_buff_head collect_queue ;
/**
* Amount of data in collect_queue .
*/
int collect_len ;
/**
* spinlock for collect_queue and collect_len
*/
spinlock_t collect_lock ;
/**
* Timer for detecting unresposive
* I / O operations .
*/
fsm_timer timer ;
/**
* Retry counter for misc . operations .
*/
int retry ;
/**
* The finite state machine of this channel
*/
fsm_instance * fsm ;
/**
* The corresponding net_device this channel
* belongs to .
*/
struct net_device * netdev ;
struct ctc_profile prof ;
unsigned char * trans_skb_data ;
__u16 logflags ;
} ;
# define CHANNEL_FLAGS_READ 0
# define CHANNEL_FLAGS_WRITE 1
# define CHANNEL_FLAGS_INUSE 2
# define CHANNEL_FLAGS_BUFSIZE_CHANGED 4
# define CHANNEL_FLAGS_FAILED 8
# define CHANNEL_FLAGS_WAITIRQ 16
# define CHANNEL_FLAGS_RWMASK 1
# define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK)
# define LOG_FLAG_ILLEGALPKT 1
# define LOG_FLAG_ILLEGALSIZE 2
# define LOG_FLAG_OVERRUN 4
# define LOG_FLAG_NOMEM 8
# define CTC_LOGLEVEL_INFO 1
# define CTC_LOGLEVEL_NOTICE 2
# define CTC_LOGLEVEL_WARN 4
# define CTC_LOGLEVEL_EMERG 8
# define CTC_LOGLEVEL_ERR 16
# define CTC_LOGLEVEL_DEBUG 32
# define CTC_LOGLEVEL_CRIT 64
# define CTC_LOGLEVEL_DEFAULT \
( CTC_LOGLEVEL_INFO | CTC_LOGLEVEL_NOTICE | CTC_LOGLEVEL_WARN | CTC_LOGLEVEL_CRIT )
# define CTC_LOGLEVEL_MAX ((CTC_LOGLEVEL_CRIT<<1)-1)
# define ctc_pr_debug(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_DEBUG ) printk ( KERN_DEBUG fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_info(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_INFO ) printk ( KERN_INFO fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_notice(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_NOTICE ) printk ( KERN_NOTICE fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_warn(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_WARN ) printk ( KERN_WARNING fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_emerg(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_EMERG ) printk ( KERN_EMERG fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_err(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_ERR ) printk ( KERN_ERR fmt , # # arg ) ; } while ( 0 )
# define ctc_pr_crit(fmt, arg...) \
do { if ( loglevel & CTC_LOGLEVEL_CRIT ) printk ( KERN_CRIT fmt , # # arg ) ; } while ( 0 )
struct ctc_priv {
struct net_device_stats stats ;
unsigned long tbusy ;
/**
* The finite state machine of this interface .
*/
fsm_instance * fsm ;
/**
* The protocol of this device
*/
__u16 protocol ;
/**
* Timer for restarting after I / O Errors
*/
fsm_timer restart_timer ;
int buffer_size ;
struct channel * channel [ 2 ] ;
} ;
/**
* Definition of our link level header .
*/
struct ll_header {
__u16 length ;
__u16 type ;
__u16 unused ;
} ;
# define LL_HEADER_LENGTH (sizeof(struct ll_header))
/**
* Compatibility macros for busy handling
* of network devices .
*/
static __inline__ void
ctc_clear_busy ( struct net_device * dev )
{
clear_bit ( 0 , & ( ( ( struct ctc_priv * ) dev - > priv ) - > tbusy ) ) ;
2006-04-13 20:19:12 +02:00
netif_wake_queue ( dev ) ;
2005-05-12 20:36:47 +02:00
}
static __inline__ int
ctc_test_and_set_busy ( struct net_device * dev )
{
2006-04-13 20:19:12 +02:00
netif_stop_queue ( dev ) ;
2005-05-12 20:36:47 +02:00
return test_and_set_bit ( 0 , & ( ( struct ctc_priv * ) dev - > priv ) - > tbusy ) ;
}
# endif