Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * CTC / ESCON network driver
  3  *
  4  * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
  5  * Author(s): Fritz Elfert (elfert@de.ibm.com, felfert@millenux.com)
  6               Peter Tiedemann (ptiedem@de.ibm.com)
  7  *
  8  *
  9  * Documentation used:
 10  *  - Principles of Operation (IBM doc#: SA22-7201-06)
 11  *  - Common IO/-Device Commands and Self Description (IBM doc#: SA22-7204-02)
 12  *  - Common IO/-Device Commands and Self Description (IBM doc#: SN22-5535)
 13  *  - ESCON Channel-to-Channel Adapter (IBM doc#: SA22-7203-00)
 14  *  - ESCON I/O Interface (IBM doc#: SA22-7202-029
 15  *
 16  * This program is free software; you can redistribute it and/or modify
 17  * it under the terms of the GNU General Public License as published by
 18  * the Free Software Foundation; either version 2, or (at your option)
 19  * any later version.
 20  *
 21  * This program is distributed in the hope that it will be useful,
 22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 24  * GNU General Public License for more details.
 25  *
 26  * You should have received a copy of the GNU General Public License
 27  * along with this program; if not, write to the Free Software
 28  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 29  *
 30  */
 31 
 32 #ifndef _CTCMAIN_H_
 33 #define _CTCMAIN_H_
 34 
 35 #include <asm/ccwdev.h>
 36 #include <asm/ccwgroup.h>
 37 
 38 #include <linux/skbuff.h>
 39 #include <linux/netdevice.h>
 40 
 41 #include "fsm.h"
 42 #include "cu3088.h"
 43 
 44 
 45 /**
 46  * CCW commands, used in this driver.
 47  */
 48 #define CCW_CMD_WRITE           0x01
 49 #define CCW_CMD_READ            0x02
 50 #define CCW_CMD_SET_EXTENDED    0xc3
 51 #define CCW_CMD_PREPARE         0xe3
 52 
 53 #define CTC_PROTO_S390          0
 54 #define CTC_PROTO_LINUX         1
 55 #define CTC_PROTO_OS390         3
 56 
 57 #define CTC_BUFSIZE_LIMIT       65535
 58 #define CTC_BUFSIZE_DEFAULT     32768
 59 
 60 #define CTC_TIMEOUT_5SEC        5000
 61 
 62 #define CTC_INITIAL_BLOCKLEN    2
 63 
 64 #define READ                    0
 65 #define WRITE                   1
 66 
 67 #define CTC_ID_SIZE             BUS_ID_SIZE+3
 68 
 69 
 70 struct ctc_profile {
 71         unsigned long maxmulti;
 72         unsigned long maxcqueue;
 73         unsigned long doios_single;
 74         unsigned long doios_multi;
 75         unsigned long txlen;
 76         unsigned long tx_time;
 77         struct timespec send_stamp;
 78 };
 79 
 80 /**
 81  * Definition of one channel
 82  */
 83 struct channel {
 84 
 85         /**
 86          * Pointer to next channel in list.
 87          */
 88         struct channel *next;
 89         char id[CTC_ID_SIZE];
 90         struct ccw_device *cdev;
 91 
 92         /**
 93          * Type of this channel.
 94          * CTC/A or Escon for valid channels.
 95          */
 96         enum channel_types type;
 97 
 98         /**
 99          * Misc. flags. See CHANNEL_FLAGS_... below
100          */
101         __u32 flags;
102 
103         /**
104          * The protocol of this channel
105          */
106         __u16 protocol;
107 
108         /**
109          * I/O and irq related stuff
110          */
111         struct ccw1 *ccw;
112         struct irb *irb;
113 
114         /**
115          * RX/TX buffer size
116          */
117         int max_bufsize;
118 
119         /**
120          * Transmit/Receive buffer.
121          */
122         struct sk_buff *trans_skb;
123 
124         /**
125          * Universal I/O queue.
126          */
127         struct sk_buff_head io_queue;
128 
129         /**
130          * TX queue for collecting skb's during busy.
131          */
132         struct sk_buff_head collect_queue;
133 
134         /**
135          * Amount of data in collect_queue.
136          */
137         int collect_len;
138 
139         /**
140          * spinlock for collect_queue and collect_len
141          */
142         spinlock_t collect_lock;
143 
144         /**
145          * Timer for detecting unresposive
146          * I/O operations.
147          */
148         fsm_timer timer;
149 
150         /**
151          * Retry counter for misc. operations.
152          */
153         int retry;
154 
155         /**
156          * The finite state machine of this channel
157          */
158         fsm_instance *fsm;
159 
160         /**
161          * The corresponding net_device this channel
162          * belongs to.
163          */
164         struct net_device *netdev;
165 
166         struct ctc_profile prof;
167 
168         unsigned char *trans_skb_data;
169 
170         __u16 logflags;
171 };
172 
173 #define CHANNEL_FLAGS_READ            0
174 #define CHANNEL_FLAGS_WRITE           1
175 #define CHANNEL_FLAGS_INUSE           2
176 #define CHANNEL_FLAGS_BUFSIZE_CHANGED 4
177 #define CHANNEL_FLAGS_FAILED          8
178 #define CHANNEL_FLAGS_WAITIRQ        16
179 #define CHANNEL_FLAGS_RWMASK 1
180 #define CHANNEL_DIRECTION(f) (f & CHANNEL_FLAGS_RWMASK)
181 
182 #define LOG_FLAG_ILLEGALPKT  1
183 #define LOG_FLAG_ILLEGALSIZE 2
184 #define LOG_FLAG_OVERRUN     4
185 #define LOG_FLAG_NOMEM       8
186 
187 #define CTC_LOGLEVEL_INFO     1
188 #define CTC_LOGLEVEL_NOTICE   2
189 #define CTC_LOGLEVEL_WARN     4
190 #define CTC_LOGLEVEL_EMERG    8
191 #define CTC_LOGLEVEL_ERR     16
192 #define CTC_LOGLEVEL_DEBUG   32
193 #define CTC_LOGLEVEL_CRIT    64
194 
195 #define CTC_LOGLEVEL_DEFAULT \
196 (CTC_LOGLEVEL_INFO | CTC_LOGLEVEL_NOTICE | CTC_LOGLEVEL_WARN | CTC_LOGLEVEL_CRIT)
197 
198 #define CTC_LOGLEVEL_MAX     ((CTC_LOGLEVEL_CRIT<<1)-1)
199 
200 #define ctc_pr_debug(fmt, arg...) \
201 do { if (loglevel & CTC_LOGLEVEL_DEBUG) printk(KERN_DEBUG fmt,##arg); } while (0)
202 
203 #define ctc_pr_info(fmt, arg...) \
204 do { if (loglevel & CTC_LOGLEVEL_INFO) printk(KERN_INFO fmt,##arg); } while (0)
205 
206 #define ctc_pr_notice(fmt, arg...) \
207 do { if (loglevel & CTC_LOGLEVEL_NOTICE) printk(KERN_NOTICE fmt,##arg); } while (0)
208 
209 #define ctc_pr_warn(fmt, arg...) \
210 do { if (loglevel & CTC_LOGLEVEL_WARN) printk(KERN_WARNING fmt,##arg); } while (0)
211 
212 #define ctc_pr_emerg(fmt, arg...) \
213 do { if (loglevel & CTC_LOGLEVEL_EMERG) printk(KERN_EMERG fmt,##arg); } while (0)
214 
215 #define ctc_pr_err(fmt, arg...) \
216 do { if (loglevel & CTC_LOGLEVEL_ERR) printk(KERN_ERR fmt,##arg); } while (0)
217 
218 #define ctc_pr_crit(fmt, arg...) \
219 do { if (loglevel & CTC_LOGLEVEL_CRIT) printk(KERN_CRIT fmt,##arg); } while (0)
220 
221 struct ctc_priv {
222         struct net_device_stats stats;
223         unsigned long tbusy;
224         /**
225          * The finite state machine of this interface.
226          */
227         fsm_instance *fsm;
228         /**
229          * The protocol of this device
230          */
231         __u16 protocol;
232         /**
233          * Timer for restarting after I/O Errors
234          */
235         fsm_timer               restart_timer;
236 
237         int buffer_size;
238 
239         struct channel *channel[2];
240 };
241 
242 /**
243  * Definition of our link level header.
244  */
245 struct ll_header {
246         __u16 length;
247         __u16 type;
248         __u16 unused;
249 };
250 #define LL_HEADER_LENGTH (sizeof(struct ll_header))
251 
252 /**
253  * Compatibility macros for busy handling
254  * of network devices.
255  */
256 static __inline__ void
257 ctc_clear_busy(struct net_device * dev)
258 {
259         clear_bit(0, &(((struct ctc_priv *) dev->priv)->tbusy));
260         netif_wake_queue(dev);
261 }
262 
263 static __inline__ int
264 ctc_test_and_set_busy(struct net_device * dev)
265 {
266         netif_stop_queue(dev);
267         return test_and_set_bit(0, &((struct ctc_priv *) dev->priv)->tbusy);
268 }
269 
270 #endif
271 
  This page was automatically generated by the LXR engine.