Blame view
include/linux/i2o.h
29.7 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* * I2O kernel space accessible structures/APIs * * (c) Copyright 1999, 2000 Red Hat Software * * 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 of the License, or (at your option) any later version. * ************************************************************************* * * This header file defined the I2O APIs/structures for use by * the I2O kernel modules. * */ #ifndef _I2O_H #define _I2O_H |
1da177e4c Linux-2.6.12-rc2 |
20 21 22 23 |
#include <linux/i2o-dev.h> /* How many different OSM's are we allowing */ #define I2O_MAX_DRIVERS 8 |
1da177e4c Linux-2.6.12-rc2 |
24 25 |
#include <linux/pci.h> #include <linux/dma-mapping.h> |
4e57b6817 [PATCH] fix missi... |
26 27 28 |
#include <linux/string.h> #include <linux/slab.h> #include <linux/workqueue.h> /* work_struct */ |
a1a5ea70a [PATCH] I2O: chan... |
29 |
#include <linux/mempool.h> |
9ac162521 Use mutexes inste... |
30 |
#include <linux/mutex.h> |
ba2da2f8d i2o: sg chaining ... |
31 |
#include <linux/scatterlist.h> |
6188e10d3 Convert asm/semap... |
32 |
#include <linux/semaphore.h> /* Needed for MUTEX init macros */ |
4e57b6817 [PATCH] fix missi... |
33 34 |
#include <asm/io.h> |
1da177e4c Linux-2.6.12-rc2 |
35 36 37 38 39 |
/* message queue empty */ #define I2O_QUEUE_EMPTY 0xffffffff /* |
a1a5ea70a [PATCH] I2O: chan... |
40 |
* Cache strategies |
1da177e4c Linux-2.6.12-rc2 |
41 |
*/ |
1da177e4c Linux-2.6.12-rc2 |
42 |
|
a1a5ea70a [PATCH] I2O: chan... |
43 44 |
/* The NULL strategy leaves everything up to the controller. This tends to be a * pessimal but functional choice. |
1da177e4c Linux-2.6.12-rc2 |
45 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#define CACHE_NULL 0 /* Prefetch data when reading. We continually attempt to load the next 32 sectors * into the controller cache. */ #define CACHE_PREFETCH 1 /* Prefetch data when reading. We sometimes attempt to load the next 32 sectors * into the controller cache. When an I/O is less <= 8K we assume its probably * not sequential and don't prefetch (default) */ #define CACHE_SMARTFETCH 2 /* Data is written to the cache and then out on to the disk. The I/O must be * physically on the medium before the write is acknowledged (default without * NVRAM) */ #define CACHE_WRITETHROUGH 17 /* Data is written to the cache and then out on to the disk. The controller * is permitted to write back the cache any way it wants. (default if battery * backed NVRAM is present). It can be useful to set this for swap regardless of * battery state. */ #define CACHE_WRITEBACK 18 /* Optimise for under powered controllers, especially on RAID1 and RAID0. We * write large I/O's directly to disk bypassing the cache to avoid the extra * memory copy hits. Small writes are writeback cached */ #define CACHE_SMARTBACK 19 /* Optimise for under powered controllers, especially on RAID1 and RAID0. We * write large I/O's directly to disk bypassing the cache to avoid the extra * memory copy hits. Small writes are writethrough cached. Suitable for devices * lacking battery backup */ #define CACHE_SMARTTHROUGH 20 |
1da177e4c Linux-2.6.12-rc2 |
78 79 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
80 |
* Ioctl structures |
1da177e4c Linux-2.6.12-rc2 |
81 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
82 83 84 85 86 |
#define BLKI2OGRSTRAT _IOR('2', 1, int) #define BLKI2OGWSTRAT _IOR('2', 2, int) #define BLKI2OSRSTRAT _IOW('2', 3, int) #define BLKI2OSWSTRAT _IOW('2', 4, int) |
1da177e4c Linux-2.6.12-rc2 |
87 88 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
89 |
* I2O Function codes |
1da177e4c Linux-2.6.12-rc2 |
90 |
*/ |
1da177e4c Linux-2.6.12-rc2 |
91 92 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
93 |
* Executive Class |
1da177e4c Linux-2.6.12-rc2 |
94 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
#define I2O_CMD_ADAPTER_ASSIGN 0xB3 #define I2O_CMD_ADAPTER_READ 0xB2 #define I2O_CMD_ADAPTER_RELEASE 0xB5 #define I2O_CMD_BIOS_INFO_SET 0xA5 #define I2O_CMD_BOOT_DEVICE_SET 0xA7 #define I2O_CMD_CONFIG_VALIDATE 0xBB #define I2O_CMD_CONN_SETUP 0xCA #define I2O_CMD_DDM_DESTROY 0xB1 #define I2O_CMD_DDM_ENABLE 0xD5 #define I2O_CMD_DDM_QUIESCE 0xC7 #define I2O_CMD_DDM_RESET 0xD9 #define I2O_CMD_DDM_SUSPEND 0xAF #define I2O_CMD_DEVICE_ASSIGN 0xB7 #define I2O_CMD_DEVICE_RELEASE 0xB9 #define I2O_CMD_HRT_GET 0xA8 #define I2O_CMD_ADAPTER_CLEAR 0xBE #define I2O_CMD_ADAPTER_CONNECT 0xC9 #define I2O_CMD_ADAPTER_RESET 0xBD #define I2O_CMD_LCT_NOTIFY 0xA2 #define I2O_CMD_OUTBOUND_INIT 0xA1 #define I2O_CMD_PATH_ENABLE 0xD3 #define I2O_CMD_PATH_QUIESCE 0xC5 #define I2O_CMD_PATH_RESET 0xD7 #define I2O_CMD_STATIC_MF_CREATE 0xDD #define I2O_CMD_STATIC_MF_RELEASE 0xDF #define I2O_CMD_STATUS_GET 0xA0 #define I2O_CMD_SW_DOWNLOAD 0xA9 #define I2O_CMD_SW_UPLOAD 0xAB #define I2O_CMD_SW_REMOVE 0xAD #define I2O_CMD_SYS_ENABLE 0xD1 #define I2O_CMD_SYS_MODIFY 0xC1 #define I2O_CMD_SYS_QUIESCE 0xC3 #define I2O_CMD_SYS_TAB_SET 0xA3 |
1da177e4c Linux-2.6.12-rc2 |
128 129 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
130 |
* Utility Class |
1da177e4c Linux-2.6.12-rc2 |
131 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#define I2O_CMD_UTIL_NOP 0x00 #define I2O_CMD_UTIL_ABORT 0x01 #define I2O_CMD_UTIL_CLAIM 0x09 #define I2O_CMD_UTIL_RELEASE 0x0B #define I2O_CMD_UTIL_PARAMS_GET 0x06 #define I2O_CMD_UTIL_PARAMS_SET 0x05 #define I2O_CMD_UTIL_EVT_REGISTER 0x13 #define I2O_CMD_UTIL_EVT_ACK 0x14 #define I2O_CMD_UTIL_CONFIG_DIALOG 0x10 #define I2O_CMD_UTIL_DEVICE_RESERVE 0x0D #define I2O_CMD_UTIL_DEVICE_RELEASE 0x0F #define I2O_CMD_UTIL_LOCK 0x17 #define I2O_CMD_UTIL_LOCK_RELEASE 0x19 #define I2O_CMD_UTIL_REPLY_FAULT_NOTIFY 0x15 |
9e87545f0 [PATCH] I2O: seco... |
146 147 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
148 |
* SCSI Host Bus Adapter Class |
9e87545f0 [PATCH] I2O: seco... |
149 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
150 151 152 |
#define I2O_CMD_SCSI_EXEC 0x81 #define I2O_CMD_SCSI_ABORT 0x83 #define I2O_CMD_SCSI_BUSRESET 0x27 |
1da177e4c Linux-2.6.12-rc2 |
153 154 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
155 |
* Bus Adapter Class |
1da177e4c Linux-2.6.12-rc2 |
156 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
157 158 159 160 |
#define I2O_CMD_BUS_ADAPTER_RESET 0x85 #define I2O_CMD_BUS_RESET 0x87 #define I2O_CMD_BUS_SCAN 0x89 #define I2O_CMD_BUS_QUIESCE 0x8b |
1da177e4c Linux-2.6.12-rc2 |
161 162 |
/* |
a1a5ea70a [PATCH] I2O: chan... |
163 |
* Random Block Storage Class |
1da177e4c Linux-2.6.12-rc2 |
164 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
165 166 167 168 169 170 171 172 |
#define I2O_CMD_BLOCK_READ 0x30 #define I2O_CMD_BLOCK_WRITE 0x31 #define I2O_CMD_BLOCK_CFLUSH 0x37 #define I2O_CMD_BLOCK_MLOCK 0x49 #define I2O_CMD_BLOCK_MUNLOCK 0x4B #define I2O_CMD_BLOCK_MMOUNT 0x41 #define I2O_CMD_BLOCK_MEJECT 0x43 #define I2O_CMD_BLOCK_POWER 0x70 |
1da177e4c Linux-2.6.12-rc2 |
173 |
|
a1a5ea70a [PATCH] I2O: chan... |
174 |
#define I2O_CMD_PRIVATE 0xFF |
1da177e4c Linux-2.6.12-rc2 |
175 |
|
a1a5ea70a [PATCH] I2O: chan... |
176 |
/* Command status values */ |
1da177e4c Linux-2.6.12-rc2 |
177 |
|
a1a5ea70a [PATCH] I2O: chan... |
178 179 180 181 |
#define I2O_CMD_IN_PROGRESS 0x01 #define I2O_CMD_REJECTED 0x02 #define I2O_CMD_FAILED 0x03 #define I2O_CMD_COMPLETED 0x04 |
f88e119c4 [PATCH] I2O: firs... |
182 |
|
a1a5ea70a [PATCH] I2O: chan... |
183 |
/* I2O API function return values */ |
1da177e4c Linux-2.6.12-rc2 |
184 |
|
a1a5ea70a [PATCH] I2O: chan... |
185 186 187 188 189 190 191 192 193 194 195 196 |
#define I2O_RTN_NO_ERROR 0 #define I2O_RTN_NOT_INIT 1 #define I2O_RTN_FREE_Q_EMPTY 2 #define I2O_RTN_TCB_ERROR 3 #define I2O_RTN_TRANSACTION_ERROR 4 #define I2O_RTN_ADAPTER_ALREADY_INIT 5 #define I2O_RTN_MALLOC_ERROR 6 #define I2O_RTN_ADPTR_NOT_REGISTERED 7 #define I2O_RTN_MSG_REPLY_TIMEOUT 8 #define I2O_RTN_NO_STATUS 9 #define I2O_RTN_NO_FIRM_VER 10 #define I2O_RTN_NO_LINK_SPEED 11 |
1da177e4c Linux-2.6.12-rc2 |
197 |
|
a1a5ea70a [PATCH] I2O: chan... |
198 |
/* Reply message status defines for all messages */ |
1da177e4c Linux-2.6.12-rc2 |
199 |
|
a1a5ea70a [PATCH] I2O: chan... |
200 201 202 203 204 205 206 207 208 209 210 211 |
#define I2O_REPLY_STATUS_SUCCESS 0x00 #define I2O_REPLY_STATUS_ABORT_DIRTY 0x01 #define I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 0x02 #define I2O_REPLY_STATUS_ABORT_PARTIAL_TRANSFER 0x03 #define I2O_REPLY_STATUS_ERROR_DIRTY 0x04 #define I2O_REPLY_STATUS_ERROR_NO_DATA_TRANSFER 0x05 #define I2O_REPLY_STATUS_ERROR_PARTIAL_TRANSFER 0x06 #define I2O_REPLY_STATUS_PROCESS_ABORT_DIRTY 0x08 #define I2O_REPLY_STATUS_PROCESS_ABORT_NO_DATA_TRANSFER 0x09 #define I2O_REPLY_STATUS_PROCESS_ABORT_PARTIAL_TRANSFER 0x0A #define I2O_REPLY_STATUS_TRANSACTION_ERROR 0x0B #define I2O_REPLY_STATUS_PROGRESS_REPORT 0x80 |
1da177e4c Linux-2.6.12-rc2 |
212 |
|
a1a5ea70a [PATCH] I2O: chan... |
213 |
/* Status codes and Error Information for Parameter functions */ |
1da177e4c Linux-2.6.12-rc2 |
214 |
|
a1a5ea70a [PATCH] I2O: chan... |
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
#define I2O_PARAMS_STATUS_SUCCESS 0x00 #define I2O_PARAMS_STATUS_BAD_KEY_ABORT 0x01 #define I2O_PARAMS_STATUS_BAD_KEY_CONTINUE 0x02 #define I2O_PARAMS_STATUS_BUFFER_FULL 0x03 #define I2O_PARAMS_STATUS_BUFFER_TOO_SMALL 0x04 #define I2O_PARAMS_STATUS_FIELD_UNREADABLE 0x05 #define I2O_PARAMS_STATUS_FIELD_UNWRITEABLE 0x06 #define I2O_PARAMS_STATUS_INSUFFICIENT_FIELDS 0x07 #define I2O_PARAMS_STATUS_INVALID_GROUP_ID 0x08 #define I2O_PARAMS_STATUS_INVALID_OPERATION 0x09 #define I2O_PARAMS_STATUS_NO_KEY_FIELD 0x0A #define I2O_PARAMS_STATUS_NO_SUCH_FIELD 0x0B #define I2O_PARAMS_STATUS_NON_DYNAMIC_GROUP 0x0C #define I2O_PARAMS_STATUS_OPERATION_ERROR 0x0D #define I2O_PARAMS_STATUS_SCALAR_ERROR 0x0E #define I2O_PARAMS_STATUS_TABLE_ERROR 0x0F #define I2O_PARAMS_STATUS_WRONG_GROUP_TYPE 0x10 |
1da177e4c Linux-2.6.12-rc2 |
232 |
|
a1a5ea70a [PATCH] I2O: chan... |
233 234 |
/* DetailedStatusCode defines for Executive, DDM, Util and Transaction error * messages: Table 3-2 Detailed Status Codes.*/ |
1da177e4c Linux-2.6.12-rc2 |
235 |
|
a1a5ea70a [PATCH] I2O: chan... |
236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 |
#define I2O_DSC_SUCCESS 0x0000 #define I2O_DSC_BAD_KEY 0x0002 #define I2O_DSC_TCL_ERROR 0x0003 #define I2O_DSC_REPLY_BUFFER_FULL 0x0004 #define I2O_DSC_NO_SUCH_PAGE 0x0005 #define I2O_DSC_INSUFFICIENT_RESOURCE_SOFT 0x0006 #define I2O_DSC_INSUFFICIENT_RESOURCE_HARD 0x0007 #define I2O_DSC_CHAIN_BUFFER_TOO_LARGE 0x0009 #define I2O_DSC_UNSUPPORTED_FUNCTION 0x000A #define I2O_DSC_DEVICE_LOCKED 0x000B #define I2O_DSC_DEVICE_RESET 0x000C #define I2O_DSC_INAPPROPRIATE_FUNCTION 0x000D #define I2O_DSC_INVALID_INITIATOR_ADDRESS 0x000E #define I2O_DSC_INVALID_MESSAGE_FLAGS 0x000F #define I2O_DSC_INVALID_OFFSET 0x0010 #define I2O_DSC_INVALID_PARAMETER 0x0011 #define I2O_DSC_INVALID_REQUEST 0x0012 #define I2O_DSC_INVALID_TARGET_ADDRESS 0x0013 #define I2O_DSC_MESSAGE_TOO_LARGE 0x0014 #define I2O_DSC_MESSAGE_TOO_SMALL 0x0015 #define I2O_DSC_MISSING_PARAMETER 0x0016 #define I2O_DSC_TIMEOUT 0x0017 #define I2O_DSC_UNKNOWN_ERROR 0x0018 #define I2O_DSC_UNKNOWN_FUNCTION 0x0019 #define I2O_DSC_UNSUPPORTED_VERSION 0x001A #define I2O_DSC_DEVICE_BUSY 0x001B #define I2O_DSC_DEVICE_NOT_AVAILABLE 0x001C |
1da177e4c Linux-2.6.12-rc2 |
263 |
|
a1a5ea70a [PATCH] I2O: chan... |
264 265 |
/* DetailedStatusCode defines for Block Storage Operation: Table 6-7 Detailed Status Codes.*/ |
1da177e4c Linux-2.6.12-rc2 |
266 |
|
a1a5ea70a [PATCH] I2O: chan... |
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 |
#define I2O_BSA_DSC_SUCCESS 0x0000 #define I2O_BSA_DSC_MEDIA_ERROR 0x0001 #define I2O_BSA_DSC_ACCESS_ERROR 0x0002 #define I2O_BSA_DSC_DEVICE_FAILURE 0x0003 #define I2O_BSA_DSC_DEVICE_NOT_READY 0x0004 #define I2O_BSA_DSC_MEDIA_NOT_PRESENT 0x0005 #define I2O_BSA_DSC_MEDIA_LOCKED 0x0006 #define I2O_BSA_DSC_MEDIA_FAILURE 0x0007 #define I2O_BSA_DSC_PROTOCOL_FAILURE 0x0008 #define I2O_BSA_DSC_BUS_FAILURE 0x0009 #define I2O_BSA_DSC_ACCESS_VIOLATION 0x000A #define I2O_BSA_DSC_WRITE_PROTECTED 0x000B #define I2O_BSA_DSC_DEVICE_RESET 0x000C #define I2O_BSA_DSC_VOLUME_CHANGED 0x000D #define I2O_BSA_DSC_TIMEOUT 0x000E |
1da177e4c Linux-2.6.12-rc2 |
282 |
|
a1a5ea70a [PATCH] I2O: chan... |
283 |
/* FailureStatusCodes, Table 3-3 Message Failure Codes */ |
1da177e4c Linux-2.6.12-rc2 |
284 |
|
a1a5ea70a [PATCH] I2O: chan... |
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 |
#define I2O_FSC_TRANSPORT_SERVICE_SUSPENDED 0x81 #define I2O_FSC_TRANSPORT_SERVICE_TERMINATED 0x82 #define I2O_FSC_TRANSPORT_CONGESTION 0x83 #define I2O_FSC_TRANSPORT_FAILURE 0x84 #define I2O_FSC_TRANSPORT_STATE_ERROR 0x85 #define I2O_FSC_TRANSPORT_TIME_OUT 0x86 #define I2O_FSC_TRANSPORT_ROUTING_FAILURE 0x87 #define I2O_FSC_TRANSPORT_INVALID_VERSION 0x88 #define I2O_FSC_TRANSPORT_INVALID_OFFSET 0x89 #define I2O_FSC_TRANSPORT_INVALID_MSG_FLAGS 0x8A #define I2O_FSC_TRANSPORT_FRAME_TOO_SMALL 0x8B #define I2O_FSC_TRANSPORT_FRAME_TOO_LARGE 0x8C #define I2O_FSC_TRANSPORT_INVALID_TARGET_ID 0x8D #define I2O_FSC_TRANSPORT_INVALID_INITIATOR_ID 0x8E #define I2O_FSC_TRANSPORT_INVALID_INITIATOR_CONTEXT 0x8F #define I2O_FSC_TRANSPORT_UNKNOWN_FAILURE 0xFF |
1da177e4c Linux-2.6.12-rc2 |
301 |
|
a1a5ea70a [PATCH] I2O: chan... |
302 303 304 305 306 |
/* Device Claim Types */ #define I2O_CLAIM_PRIMARY 0x01000000 #define I2O_CLAIM_MANAGEMENT 0x02000000 #define I2O_CLAIM_AUTHORIZED 0x03000000 #define I2O_CLAIM_SECONDARY 0x04000000 |
1da177e4c Linux-2.6.12-rc2 |
307 |
|
a1a5ea70a [PATCH] I2O: chan... |
308 309 310 |
/* Message header defines for VersionOffset */ #define I2OVER15 0x0001 #define I2OVER20 0x0002 |
1da177e4c Linux-2.6.12-rc2 |
311 |
|
a1a5ea70a [PATCH] I2O: chan... |
312 313 |
/* Default is 1.5 */ #define I2OVERSION I2OVER15 |
1da177e4c Linux-2.6.12-rc2 |
314 |
|
a1a5ea70a [PATCH] I2O: chan... |
315 316 317 318 319 320 321 322 323 324 325 |
#define SGL_OFFSET_0 I2OVERSION #define SGL_OFFSET_4 (0x0040 | I2OVERSION) #define SGL_OFFSET_5 (0x0050 | I2OVERSION) #define SGL_OFFSET_6 (0x0060 | I2OVERSION) #define SGL_OFFSET_7 (0x0070 | I2OVERSION) #define SGL_OFFSET_8 (0x0080 | I2OVERSION) #define SGL_OFFSET_9 (0x0090 | I2OVERSION) #define SGL_OFFSET_10 (0x00A0 | I2OVERSION) #define SGL_OFFSET_11 (0x00B0 | I2OVERSION) #define SGL_OFFSET_12 (0x00C0 | I2OVERSION) #define SGL_OFFSET(x) (((x)<<4) | I2OVERSION) |
1da177e4c Linux-2.6.12-rc2 |
326 |
|
a1a5ea70a [PATCH] I2O: chan... |
327 328 329 330 |
/* Transaction Reply Lists (TRL) Control Word structure */ #define TRL_SINGLE_FIXED_LENGTH 0x00 #define TRL_SINGLE_VARIABLE_LENGTH 0x40 #define TRL_MULTIPLE_FIXED_LENGTH 0x80 |
1da177e4c Linux-2.6.12-rc2 |
331 |
|
a1a5ea70a [PATCH] I2O: chan... |
332 333 334 335 336 337 338 |
/* msg header defines for MsgFlags */ #define MSG_STATIC 0x0100 #define MSG_64BIT_CNTXT 0x0200 #define MSG_MULTI_TRANS 0x1000 #define MSG_FAIL 0x2000 #define MSG_FINAL 0x4000 #define MSG_REPLY 0x8000 |
f10378fff [PATCH] I2O: new ... |
339 |
|
a1a5ea70a [PATCH] I2O: chan... |
340 341 342 343 344 345 346 347 348 349 350 |
/* minimum size msg */ #define THREE_WORD_MSG_SIZE 0x00030000 #define FOUR_WORD_MSG_SIZE 0x00040000 #define FIVE_WORD_MSG_SIZE 0x00050000 #define SIX_WORD_MSG_SIZE 0x00060000 #define SEVEN_WORD_MSG_SIZE 0x00070000 #define EIGHT_WORD_MSG_SIZE 0x00080000 #define NINE_WORD_MSG_SIZE 0x00090000 #define TEN_WORD_MSG_SIZE 0x000A0000 #define ELEVEN_WORD_MSG_SIZE 0x000B0000 #define I2O_MESSAGE_SIZE(x) ((x)<<16) |
f10378fff [PATCH] I2O: new ... |
351 |
|
a1a5ea70a [PATCH] I2O: chan... |
352 353 354 |
/* special TID assignments */ #define ADAPTER_TID 0 #define HOST_TID 1 |
1da177e4c Linux-2.6.12-rc2 |
355 |
|
a1a5ea70a [PATCH] I2O: chan... |
356 357 358 |
/* outbound queue defines */ #define I2O_MAX_OUTBOUND_MSG_FRAMES 128 #define I2O_OUTBOUND_MSG_FRAME_SIZE 128 /* in 32-bit words */ |
1da177e4c Linux-2.6.12-rc2 |
359 |
|
a1a5ea70a [PATCH] I2O: chan... |
360 361 362 |
/* inbound queue definitions */ #define I2O_MSG_INPOOL_MIN 32 #define I2O_INBOUND_MSG_FRAME_SIZE 128 /* in 32-bit words */ |
1da177e4c Linux-2.6.12-rc2 |
363 |
|
a1a5ea70a [PATCH] I2O: chan... |
364 365 |
#define I2O_POST_WAIT_OK 0 #define I2O_POST_WAIT_TIMEOUT -ETIMEDOUT |
1da177e4c Linux-2.6.12-rc2 |
366 |
|
a1a5ea70a [PATCH] I2O: chan... |
367 368 369 |
#define I2O_CONTEXT_LIST_MIN_LENGTH 15 #define I2O_CONTEXT_LIST_USED 0x01 #define I2O_CONTEXT_LIST_DELETED 0x02 |
1da177e4c Linux-2.6.12-rc2 |
370 |
|
a1a5ea70a [PATCH] I2O: chan... |
371 372 373 374 375 376 377 |
/* timeouts */ #define I2O_TIMEOUT_INIT_OUTBOUND_QUEUE 15 #define I2O_TIMEOUT_MESSAGE_GET 5 #define I2O_TIMEOUT_RESET 30 #define I2O_TIMEOUT_STATUS_GET 5 #define I2O_TIMEOUT_LCT_GET 360 #define I2O_TIMEOUT_SCSI_SCB_ABORT 240 |
f10378fff [PATCH] I2O: new ... |
378 |
|
a1a5ea70a [PATCH] I2O: chan... |
379 380 381 |
/* retries */ #define I2O_HRT_GET_TRIES 3 #define I2O_LCT_GET_TRIES 3 |
f10378fff [PATCH] I2O: new ... |
382 |
|
a1a5ea70a [PATCH] I2O: chan... |
383 384 |
/* defines for max_sectors and max_phys_segments */ #define I2O_MAX_SECTORS 1024 |
dcceafe25 [PATCH] I2O: Bugf... |
385 |
#define I2O_MAX_SECTORS_LIMITED 128 |
8a78362c4 block: Consolidat... |
386 |
#define I2O_MAX_PHYS_SEGMENTS BLK_MAX_SEGMENTS |
f10378fff [PATCH] I2O: new ... |
387 |
|
a1a5ea70a [PATCH] I2O: chan... |
388 389 |
/* * Message structures |
f10378fff [PATCH] I2O: new ... |
390 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
struct i2o_message { union { struct { u8 version_offset; u8 flags; u16 size; u32 target_tid:12; u32 init_tid:12; u32 function:8; u32 icntxt; /* initiator context */ u32 tcntxt; /* transaction context */ } s; u32 head[4]; } u; /* List follows */ u32 body[0]; }; |
f10378fff [PATCH] I2O: new ... |
408 |
|
a1a5ea70a [PATCH] I2O: chan... |
409 410 411 412 |
/* MFA and I2O message used by mempool */ struct i2o_msg_mfa { u32 mfa; /* MFA returned by the controller */ struct i2o_message msg; /* I2O message */ |
f10378fff [PATCH] I2O: new ... |
413 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
414 415 |
/* * Each I2O device entity has one of these. There is one per device. |
f10378fff [PATCH] I2O: new ... |
416 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
417 418 |
struct i2o_device { i2o_lct_entry lct_data; /* Device LCT information */ |
f10378fff [PATCH] I2O: new ... |
419 |
|
a1a5ea70a [PATCH] I2O: chan... |
420 421 |
struct i2o_controller *iop; /* Controlling IOP */ struct list_head list; /* node in IOP devices list */ |
f10378fff [PATCH] I2O: new ... |
422 |
|
a1a5ea70a [PATCH] I2O: chan... |
423 |
struct device device; |
f10378fff [PATCH] I2O: new ... |
424 |
|
9ac162521 Use mutexes inste... |
425 |
struct mutex lock; /* device lock */ |
f10378fff [PATCH] I2O: new ... |
426 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
427 428 |
/* * Event structure provided to the event handling function |
f10378fff [PATCH] I2O: new ... |
429 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
430 431 432 433 434 435 436 437 438 439 |
struct i2o_event { struct work_struct work; struct i2o_device *i2o_dev; /* I2O device pointer from which the event reply was initiated */ u16 size; /* Size of data in 32-bit words */ u32 tcntxt; /* Transaction context used at registration */ u32 event_indicator; /* Event indicator from reply */ u32 data[0]; /* Event data from reply */ }; |
f10378fff [PATCH] I2O: new ... |
440 |
|
a1a5ea70a [PATCH] I2O: chan... |
441 442 443 444 445 |
/* * I2O classes which could be handled by the OSM */ struct i2o_class_id { u16 class_id:12; |
f10378fff [PATCH] I2O: new ... |
446 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
447 448 |
/* * I2O driver structure for OSMs |
f10378fff [PATCH] I2O: new ... |
449 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
450 451 452 453 |
struct i2o_driver { char *name; /* OSM name */ int context; /* Low 8 bits of the transaction info */ struct i2o_class_id *classes; /* I2O classes that this OSM handles */ |
f10378fff [PATCH] I2O: new ... |
454 |
|
a1a5ea70a [PATCH] I2O: chan... |
455 456 |
/* Message reply handler */ int (*reply) (struct i2o_controller *, u32, struct i2o_message *); |
f10378fff [PATCH] I2O: new ... |
457 |
|
a1a5ea70a [PATCH] I2O: chan... |
458 |
/* Event handler */ |
c4028958b WorkStruct: make ... |
459 |
work_func_t event; |
f10378fff [PATCH] I2O: new ... |
460 |
|
a1a5ea70a [PATCH] I2O: chan... |
461 |
struct workqueue_struct *event_queue; /* Event queue */ |
f10378fff [PATCH] I2O: new ... |
462 |
|
a1a5ea70a [PATCH] I2O: chan... |
463 |
struct device_driver driver; |
f10378fff [PATCH] I2O: new ... |
464 |
|
a1a5ea70a [PATCH] I2O: chan... |
465 466 467 468 469 |
/* notification of changes */ void (*notify_controller_add) (struct i2o_controller *); void (*notify_controller_remove) (struct i2o_controller *); void (*notify_device_add) (struct i2o_device *); void (*notify_device_remove) (struct i2o_device *); |
f10378fff [PATCH] I2O: new ... |
470 |
|
a1a5ea70a [PATCH] I2O: chan... |
471 |
struct semaphore lock; |
f10378fff [PATCH] I2O: new ... |
472 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
473 474 |
/* * Contains DMA mapped address information |
f10378fff [PATCH] I2O: new ... |
475 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
476 477 478 479 |
struct i2o_dma { void *virt; dma_addr_t phys; size_t len; |
f10378fff [PATCH] I2O: new ... |
480 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
481 482 |
/* * Contains slab cache and mempool information |
f10378fff [PATCH] I2O: new ... |
483 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
484 485 |
struct i2o_pool { char *name; |
e18b890bb [PATCH] slab: rem... |
486 |
struct kmem_cache *slab; |
a1a5ea70a [PATCH] I2O: chan... |
487 |
mempool_t *mempool; |
f10378fff [PATCH] I2O: new ... |
488 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
489 490 |
/* * Contains IO mapped address information |
1da177e4c Linux-2.6.12-rc2 |
491 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
492 493 494 495 |
struct i2o_io { void __iomem *virt; unsigned long phys; unsigned long len; |
1da177e4c Linux-2.6.12-rc2 |
496 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
497 498 |
/* * Context queue entry, used for 32-bit context on 64-bit systems |
1da177e4c Linux-2.6.12-rc2 |
499 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
500 501 502 503 504 |
struct i2o_context_list_element { struct list_head list; u32 context; void *ptr; unsigned long timestamp; |
1da177e4c Linux-2.6.12-rc2 |
505 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
506 507 |
/* * Each I2O controller has one of these objects |
1da177e4c Linux-2.6.12-rc2 |
508 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 |
struct i2o_controller { char name[16]; int unit; int type; struct pci_dev *pdev; /* PCI device */ unsigned int promise:1; /* Promise controller */ unsigned int adaptec:1; /* DPT / Adaptec controller */ unsigned int raptor:1; /* split bar */ unsigned int no_quiesce:1; /* dont quiesce before reset */ unsigned int short_req:1; /* use small block sizes */ unsigned int limit_sectors:1; /* limit number of sectors / request */ unsigned int pae_support:1; /* controller has 64-bit SGL support */ struct list_head devices; /* list of I2O devices */ struct list_head list; /* Controller list */ void __iomem *in_port; /* Inbout port address */ void __iomem *out_port; /* Outbound port address */ void __iomem *irq_status; /* Interrupt status register address */ void __iomem *irq_mask; /* Interrupt mask register address */ struct i2o_dma status; /* IOP status block */ struct i2o_dma hrt; /* HW Resource Table */ i2o_lct *lct; /* Logical Config Table */ struct i2o_dma dlct; /* Temp LCT */ |
9ac162521 Use mutexes inste... |
537 |
struct mutex lct_lock; /* Lock for LCT updates */ |
a1a5ea70a [PATCH] I2O: chan... |
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 |
struct i2o_dma status_block; /* IOP status block */ struct i2o_io base; /* controller messaging unit */ struct i2o_io in_queue; /* inbound message queue Host->IOP */ struct i2o_dma out_queue; /* outbound message queue IOP->Host */ struct i2o_pool in_msg; /* mempool for inbound messages */ unsigned int battery:1; /* Has a battery backup */ unsigned int io_alloc:1; /* An I/O resource was allocated */ unsigned int mem_alloc:1; /* A memory resource was allocated */ struct resource io_resource; /* I/O resource allocated to the IOP */ struct resource mem_resource; /* Mem resource allocated to the IOP */ struct device device; |
a1a5ea70a [PATCH] I2O: chan... |
554 555 556 557 558 559 560 561 562 |
struct i2o_device *exec; /* Executive */ #if BITS_PER_LONG == 64 spinlock_t context_list_lock; /* lock for context_list */ atomic_t context_list_counter; /* needed for unique contexts */ struct list_head context_list; /* list of context id's and pointers */ #endif spinlock_t lock; /* lock for controller configuration */ |
a1a5ea70a [PATCH] I2O: chan... |
563 |
void *driver_data[I2O_MAX_DRIVERS]; /* storage for drivers */ |
1da177e4c Linux-2.6.12-rc2 |
564 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
565 566 |
/* * I2O System table entry |
1da177e4c Linux-2.6.12-rc2 |
567 |
* |
a1a5ea70a [PATCH] I2O: chan... |
568 569 570 |
* The system table contains information about all the IOPs in the * system. It is sent to all IOPs so that they can create peer2peer * connections between them. |
1da177e4c Linux-2.6.12-rc2 |
571 |
*/ |
a1a5ea70a [PATCH] I2O: chan... |
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 |
struct i2o_sys_tbl_entry { u16 org_id; u16 reserved1; u32 iop_id:12; u32 reserved2:20; u16 seg_num:12; u16 i2o_version:4; u8 iop_state; u8 msg_type; u16 frame_size; u16 reserved3; u32 last_changed; u32 iop_capabilities; u32 inbound_low; u32 inbound_high; |
1da177e4c Linux-2.6.12-rc2 |
587 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
588 589 590 591 592 593 594 595 596 |
struct i2o_sys_tbl { u8 num_entries; u8 version; u16 reserved1; u32 change_ind; u32 reserved2; u32 reserved3; struct i2o_sys_tbl_entry iops[0]; }; |
1da177e4c Linux-2.6.12-rc2 |
597 |
|
a1a5ea70a [PATCH] I2O: chan... |
598 |
extern struct list_head i2o_controllers; |
1da177e4c Linux-2.6.12-rc2 |
599 |
|
a1a5ea70a [PATCH] I2O: chan... |
600 |
/* Message functions */ |
a1a5ea70a [PATCH] I2O: chan... |
601 |
extern struct i2o_message *i2o_msg_get_wait(struct i2o_controller *, int); |
a1a5ea70a [PATCH] I2O: chan... |
602 603 |
extern int i2o_msg_post_wait_mem(struct i2o_controller *, struct i2o_message *, unsigned long, struct i2o_dma *); |
1da177e4c Linux-2.6.12-rc2 |
604 |
|
a1a5ea70a [PATCH] I2O: chan... |
605 606 |
/* IOP functions */ extern int i2o_status_get(struct i2o_controller *); |
1da177e4c Linux-2.6.12-rc2 |
607 |
|
a1a5ea70a [PATCH] I2O: chan... |
608 609 610 611 |
extern int i2o_event_register(struct i2o_device *, struct i2o_driver *, int, u32); extern struct i2o_device *i2o_iop_find_device(struct i2o_controller *, u16); extern struct i2o_controller *i2o_find_iop(int); |
1da177e4c Linux-2.6.12-rc2 |
612 |
|
a1a5ea70a [PATCH] I2O: chan... |
613 614 615 616 617 618 |
/* Functions needed for handling 64-bit pointers in 32-bit context */ #if BITS_PER_LONG == 64 extern u32 i2o_cntxt_list_add(struct i2o_controller *, void *); extern void *i2o_cntxt_list_get(struct i2o_controller *, u32); extern u32 i2o_cntxt_list_remove(struct i2o_controller *, void *); extern u32 i2o_cntxt_list_get_ptr(struct i2o_controller *, void *); |
1da177e4c Linux-2.6.12-rc2 |
619 |
|
a1a5ea70a [PATCH] I2O: chan... |
620 621 622 |
static inline u32 i2o_ptr_low(void *ptr) { return (u32) (u64) ptr; |
1da177e4c Linux-2.6.12-rc2 |
623 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
624 |
static inline u32 i2o_ptr_high(void *ptr) |
1da177e4c Linux-2.6.12-rc2 |
625 |
{ |
a1a5ea70a [PATCH] I2O: chan... |
626 |
return (u32) ((u64) ptr >> 32); |
1da177e4c Linux-2.6.12-rc2 |
627 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
628 |
static inline u32 i2o_dma_low(dma_addr_t dma_addr) |
1da177e4c Linux-2.6.12-rc2 |
629 |
{ |
a1a5ea70a [PATCH] I2O: chan... |
630 |
return (u32) (u64) dma_addr; |
1da177e4c Linux-2.6.12-rc2 |
631 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
632 |
static inline u32 i2o_dma_high(dma_addr_t dma_addr) |
1da177e4c Linux-2.6.12-rc2 |
633 |
{ |
a1a5ea70a [PATCH] I2O: chan... |
634 635 636 637 638 639 |
return (u32) ((u64) dma_addr >> 32); }; #else static inline u32 i2o_cntxt_list_add(struct i2o_controller *c, void *ptr) { return (u32) ptr; |
1da177e4c Linux-2.6.12-rc2 |
640 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
641 |
static inline void *i2o_cntxt_list_get(struct i2o_controller *c, u32 context) |
1da177e4c Linux-2.6.12-rc2 |
642 |
{ |
a1a5ea70a [PATCH] I2O: chan... |
643 644 |
return (void *)context; }; |
1da177e4c Linux-2.6.12-rc2 |
645 |
|
a1a5ea70a [PATCH] I2O: chan... |
646 647 648 |
static inline u32 i2o_cntxt_list_remove(struct i2o_controller *c, void *ptr) { return (u32) ptr; |
1da177e4c Linux-2.6.12-rc2 |
649 |
}; |
a1a5ea70a [PATCH] I2O: chan... |
650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 |
static inline u32 i2o_cntxt_list_get_ptr(struct i2o_controller *c, void *ptr) { return (u32) ptr; }; static inline u32 i2o_ptr_low(void *ptr) { return (u32) ptr; }; static inline u32 i2o_ptr_high(void *ptr) { return 0; }; static inline u32 i2o_dma_low(dma_addr_t dma_addr) { return (u32) dma_addr; }; static inline u32 i2o_dma_high(dma_addr_t dma_addr) { return 0; }; #endif |
9d793b0bc i2o: Fix 32/64bit... |
675 676 |
extern u16 i2o_sg_tablesize(struct i2o_controller *c, u16 body_size); extern dma_addr_t i2o_dma_map_single(struct i2o_controller *c, void *ptr, |
a1a5ea70a [PATCH] I2O: chan... |
677 678 |
size_t size, enum dma_data_direction direction, |
9d793b0bc i2o: Fix 32/64bit... |
679 680 |
u32 ** sg_ptr); extern int i2o_dma_map_sg(struct i2o_controller *c, |
a1a5ea70a [PATCH] I2O: chan... |
681 682 |
struct scatterlist *sg, int sg_count, enum dma_data_direction direction, |
9d793b0bc i2o: Fix 32/64bit... |
683 684 685 686 687 688 689 690 |
u32 ** sg_ptr); extern int i2o_dma_alloc(struct device *dev, struct i2o_dma *addr, size_t len); extern void i2o_dma_free(struct device *dev, struct i2o_dma *addr); extern int i2o_dma_realloc(struct device *dev, struct i2o_dma *addr, size_t len); extern int i2o_pool_alloc(struct i2o_pool *pool, const char *name, size_t size, int min_nr); extern void i2o_pool_free(struct i2o_pool *pool); |
a1a5ea70a [PATCH] I2O: chan... |
691 692 693 |
/* I2O driver (OSM) functions */ extern int i2o_driver_register(struct i2o_driver *); extern void i2o_driver_unregister(struct i2o_driver *); |
1da177e4c Linux-2.6.12-rc2 |
694 |
|
a1a5ea70a [PATCH] I2O: chan... |
695 696 |
/** * i2o_driver_notify_controller_add - Send notification of added controller |
d9489fb60 [PATCH] kernel-do... |
697 698 |
* @drv: I2O driver * @c: I2O controller |
a1a5ea70a [PATCH] I2O: chan... |
699 700 701 702 703 704 705 706 707 |
* * Send notification of added controller to a single registered driver. */ static inline void i2o_driver_notify_controller_add(struct i2o_driver *drv, struct i2o_controller *c) { if (drv->notify_controller_add) drv->notify_controller_add(c); }; |
1da177e4c Linux-2.6.12-rc2 |
708 |
|
a1a5ea70a [PATCH] I2O: chan... |
709 |
/** |
d9489fb60 [PATCH] kernel-do... |
710 711 712 |
* i2o_driver_notify_controller_remove - Send notification of removed controller * @drv: I2O driver * @c: I2O controller |
a1a5ea70a [PATCH] I2O: chan... |
713 714 715 716 717 718 719 720 721 |
* * Send notification of removed controller to a single registered driver. */ static inline void i2o_driver_notify_controller_remove(struct i2o_driver *drv, struct i2o_controller *c) { if (drv->notify_controller_remove) drv->notify_controller_remove(c); }; |
1da177e4c Linux-2.6.12-rc2 |
722 |
|
a1a5ea70a [PATCH] I2O: chan... |
723 |
/** |
d9489fb60 [PATCH] kernel-do... |
724 725 726 |
* i2o_driver_notify_device_add - Send notification of added device * @drv: I2O driver * @i2o_dev: the added i2o_device |
a1a5ea70a [PATCH] I2O: chan... |
727 728 729 730 731 732 733 734 735 |
* * Send notification of added device to a single registered driver. */ static inline void i2o_driver_notify_device_add(struct i2o_driver *drv, struct i2o_device *i2o_dev) { if (drv->notify_device_add) drv->notify_device_add(i2o_dev); }; |
1da177e4c Linux-2.6.12-rc2 |
736 |
|
a1a5ea70a [PATCH] I2O: chan... |
737 738 |
/** * i2o_driver_notify_device_remove - Send notification of removed device |
d9489fb60 [PATCH] kernel-do... |
739 740 |
* @drv: I2O driver * @i2o_dev: the added i2o_device |
a1a5ea70a [PATCH] I2O: chan... |
741 742 743 744 745 746 747 748 749 |
* * Send notification of removed device to a single registered driver. */ static inline void i2o_driver_notify_device_remove(struct i2o_driver *drv, struct i2o_device *i2o_dev) { if (drv->notify_device_remove) drv->notify_device_remove(i2o_dev); }; |
1da177e4c Linux-2.6.12-rc2 |
750 |
|
a1a5ea70a [PATCH] I2O: chan... |
751 752 753 754 |
extern void i2o_driver_notify_controller_add_all(struct i2o_controller *); extern void i2o_driver_notify_controller_remove_all(struct i2o_controller *); extern void i2o_driver_notify_device_add_all(struct i2o_device *); extern void i2o_driver_notify_device_remove_all(struct i2o_device *); |
1da177e4c Linux-2.6.12-rc2 |
755 |
|
a1a5ea70a [PATCH] I2O: chan... |
756 757 758 |
/* I2O device functions */ extern int i2o_device_claim(struct i2o_device *); extern int i2o_device_claim_release(struct i2o_device *); |
1da177e4c Linux-2.6.12-rc2 |
759 |
|
a1a5ea70a [PATCH] I2O: chan... |
760 761 |
/* Exec OSM functions */ extern int i2o_exec_lct_get(struct i2o_controller *); |
1da177e4c Linux-2.6.12-rc2 |
762 |
|
a1a5ea70a [PATCH] I2O: chan... |
763 764 765 766 |
/* device / driver / kobject conversion functions */ #define to_i2o_driver(drv) container_of(drv,struct i2o_driver, driver) #define to_i2o_device(dev) container_of(dev, struct i2o_device, device) #define to_i2o_controller(dev) container_of(dev, struct i2o_controller, device) |
1da177e4c Linux-2.6.12-rc2 |
767 |
|
a1a5ea70a [PATCH] I2O: chan... |
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 |
/** * i2o_out_to_virt - Turn an I2O message to a virtual address * @c: controller * @m: message engine value * * Turn a receive message from an I2O controller bus address into * a Linux virtual address. The shared page frame is a linear block * so we simply have to shift the offset. This function does not * work for sender side messages as they are ioremap objects * provided by the I2O controller. */ static inline struct i2o_message *i2o_msg_out_to_virt(struct i2o_controller *c, u32 m) { BUG_ON(m < c->out_queue.phys || m >= c->out_queue.phys + c->out_queue.len); |
1da177e4c Linux-2.6.12-rc2 |
784 |
|
a1a5ea70a [PATCH] I2O: chan... |
785 786 |
return c->out_queue.virt + (m - c->out_queue.phys); }; |
1da177e4c Linux-2.6.12-rc2 |
787 |
|
a1a5ea70a [PATCH] I2O: chan... |
788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 |
/** * i2o_msg_in_to_virt - Turn an I2O message to a virtual address * @c: controller * @m: message engine value * * Turn a send message from an I2O controller bus address into * a Linux virtual address. The shared page frame is a linear block * so we simply have to shift the offset. This function does not * work for receive side messages as they are kmalloc objects * in a different pool. */ static inline struct i2o_message __iomem *i2o_msg_in_to_virt(struct i2o_controller *c, u32 m) { return c->in_queue.virt + m; }; |
1da177e4c Linux-2.6.12-rc2 |
805 |
|
a1a5ea70a [PATCH] I2O: chan... |
806 807 808 809 810 |
/** * i2o_msg_get - obtain an I2O message from the IOP * @c: I2O controller * * This function tries to get a message frame. If no message frame is |
25985edce Fix common misspe... |
811 |
* available do not wait until one is available (see also i2o_msg_get_wait). |
a1a5ea70a [PATCH] I2O: chan... |
812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 |
* The returned pointer to the message frame is not in I/O memory, it is * allocated from a mempool. But because a MFA is allocated from the * controller too it is guaranteed that i2o_msg_post() will never fail. * * On a success a pointer to the message frame is returned. If the message * queue is empty -EBUSY is returned and if no memory is available -ENOMEM * is returned. */ static inline struct i2o_message *i2o_msg_get(struct i2o_controller *c) { struct i2o_msg_mfa *mmsg = mempool_alloc(c->in_msg.mempool, GFP_ATOMIC); if (!mmsg) return ERR_PTR(-ENOMEM); mmsg->mfa = readl(c->in_port); |
8b3e09e19 [PATCH] I2O: fix ... |
827 |
if (unlikely(mmsg->mfa >= c->in_queue.len)) { |
57a62fed8 [PATCH] I2O: Bugf... |
828 |
u32 mfa = mmsg->mfa; |
a1a5ea70a [PATCH] I2O: chan... |
829 |
mempool_free(mmsg, c->in_msg.mempool); |
57a62fed8 [PATCH] I2O: Bugf... |
830 831 |
if (mfa == I2O_QUEUE_EMPTY) |
8b3e09e19 [PATCH] I2O: fix ... |
832 833 |
return ERR_PTR(-EBUSY); return ERR_PTR(-EFAULT); |
a1a5ea70a [PATCH] I2O: chan... |
834 |
} |
1da177e4c Linux-2.6.12-rc2 |
835 |
|
a1a5ea70a [PATCH] I2O: chan... |
836 837 |
return &mmsg->msg; }; |
1da177e4c Linux-2.6.12-rc2 |
838 |
|
a1a5ea70a [PATCH] I2O: chan... |
839 840 841 842 843 844 845 846 847 848 849 |
/** * i2o_msg_post - Post I2O message to I2O controller * @c: I2O controller to which the message should be send * @msg: message returned by i2o_msg_get() * * Post the message to the I2O controller and return immediately. */ static inline void i2o_msg_post(struct i2o_controller *c, struct i2o_message *msg) { struct i2o_msg_mfa *mmsg; |
1da177e4c Linux-2.6.12-rc2 |
850 |
|
a1a5ea70a [PATCH] I2O: chan... |
851 852 853 854 855 856 |
mmsg = container_of(msg, struct i2o_msg_mfa, msg); memcpy_toio(i2o_msg_in_to_virt(c, mmsg->mfa), msg, (le32_to_cpu(msg->u.head[0]) >> 16) << 2); writel(mmsg->mfa, c->in_port); mempool_free(mmsg, c->in_msg.mempool); }; |
1da177e4c Linux-2.6.12-rc2 |
857 |
|
a1a5ea70a [PATCH] I2O: chan... |
858 859 860 |
/** * i2o_msg_post_wait - Post and wait a message and wait until return * @c: controller |
d9489fb60 [PATCH] kernel-do... |
861 |
* @msg: message to post |
a1a5ea70a [PATCH] I2O: chan... |
862 863 864 865 866 867 868 869 870 871 872 873 874 875 |
* @timeout: time in seconds to wait * * This API allows an OSM to post a message and then be told whether or * not the system received a successful reply. If the message times out * then the value '-ETIMEDOUT' is returned. * * Returns 0 on success or negative error code on failure. */ static inline int i2o_msg_post_wait(struct i2o_controller *c, struct i2o_message *msg, unsigned long timeout) { return i2o_msg_post_wait_mem(c, msg, timeout, NULL); }; |
1da177e4c Linux-2.6.12-rc2 |
876 |
|
a1a5ea70a [PATCH] I2O: chan... |
877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 |
/** * i2o_msg_nop_mfa - Returns a fetched MFA back to the controller * @c: I2O controller from which the MFA was fetched * @mfa: MFA which should be returned * * This function must be used for preserved messages, because i2o_msg_nop() * also returns the allocated memory back to the msg_pool mempool. */ static inline void i2o_msg_nop_mfa(struct i2o_controller *c, u32 mfa) { struct i2o_message __iomem *msg; u32 nop[3] = { THREE_WORD_MSG_SIZE | SGL_OFFSET_0, I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | ADAPTER_TID, 0x00000000 }; msg = i2o_msg_in_to_virt(c, mfa); memcpy_toio(msg, nop, sizeof(nop)); writel(mfa, c->in_port); }; |
1da177e4c Linux-2.6.12-rc2 |
898 |
|
a1a5ea70a [PATCH] I2O: chan... |
899 900 901 902 903 904 905 906 907 908 909 910 911 912 |
/** * i2o_msg_nop - Returns a message which is not used * @c: I2O controller from which the message was created * @msg: message which should be returned * * If you fetch a message via i2o_msg_get, and can't use it, you must * return the message with this function. Otherwise the MFA is lost as well * as the allocated memory from the mempool. */ static inline void i2o_msg_nop(struct i2o_controller *c, struct i2o_message *msg) { struct i2o_msg_mfa *mmsg; mmsg = container_of(msg, struct i2o_msg_mfa, msg); |
1da177e4c Linux-2.6.12-rc2 |
913 |
|
a1a5ea70a [PATCH] I2O: chan... |
914 915 916 |
i2o_msg_nop_mfa(c, mmsg->mfa); mempool_free(mmsg, c->in_msg.mempool); }; |
1da177e4c Linux-2.6.12-rc2 |
917 |
|
a1a5ea70a [PATCH] I2O: chan... |
918 919 920 921 922 923 924 925 926 927 928 929 930 |
/** * i2o_flush_reply - Flush reply from I2O controller * @c: I2O controller * @m: the message identifier * * The I2O controller must be informed that the reply message is not needed * anymore. If you forget to flush the reply, the message frame can't be * used by the controller anymore and is therefore lost. */ static inline void i2o_flush_reply(struct i2o_controller *c, u32 m) { writel(m, c->out_port); }; |
1da177e4c Linux-2.6.12-rc2 |
931 |
|
a1a5ea70a [PATCH] I2O: chan... |
932 933 934 935 |
/* * Endian handling wrapped into the macro - keeps the core code * cleaner. */ |
1da177e4c Linux-2.6.12-rc2 |
936 |
|
a1a5ea70a [PATCH] I2O: chan... |
937 |
#define i2o_raw_writel(val, mem) __raw_writel(cpu_to_le32(val), mem) |
1da177e4c Linux-2.6.12-rc2 |
938 |
|
a1a5ea70a [PATCH] I2O: chan... |
939 940 941 |
extern int i2o_parm_field_get(struct i2o_device *, int, int, void *, int); extern int i2o_parm_table_get(struct i2o_device *, int, int, int, void *, int, void *, int); |
1da177e4c Linux-2.6.12-rc2 |
942 |
|
a1a5ea70a [PATCH] I2O: chan... |
943 944 945 |
/* debugging and troubleshooting/diagnostic helpers. */ #define osm_printk(level, format, arg...) \ printk(level "%s: " format, OSM_NAME , ## arg) |
1da177e4c Linux-2.6.12-rc2 |
946 |
|
a1a5ea70a [PATCH] I2O: chan... |
947 948 949 950 951 952 953 |
#ifdef DEBUG #define osm_debug(format, arg...) \ osm_printk(KERN_DEBUG, format , ## arg) #else #define osm_debug(format, arg...) \ do { } while (0) #endif |
1da177e4c Linux-2.6.12-rc2 |
954 |
|
a1a5ea70a [PATCH] I2O: chan... |
955 956 957 958 959 960 |
#define osm_err(format, arg...) \ osm_printk(KERN_ERR, format , ## arg) #define osm_info(format, arg...) \ osm_printk(KERN_INFO, format , ## arg) #define osm_warn(format, arg...) \ osm_printk(KERN_WARNING, format , ## arg) |
1da177e4c Linux-2.6.12-rc2 |
961 |
|
a1a5ea70a [PATCH] I2O: chan... |
962 963 964 965 966 |
/* debugging functions */ extern void i2o_report_status(const char *, const char *, struct i2o_message *); extern void i2o_dump_message(struct i2o_message *); extern void i2o_dump_hrt(struct i2o_controller *c); extern void i2o_debug_state(struct i2o_controller *c); |
1da177e4c Linux-2.6.12-rc2 |
967 |
|
1da177e4c Linux-2.6.12-rc2 |
968 |
#endif /* _I2O_H */ |