1 /* 2 * Block OSM structures/API 3 * 4 * Copyright (C) 1999-2002 Red Hat Software 5 * 6 * Written by Alan Cox, Building Number Three Ltd 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, but 14 * WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * General Public License for more details. 17 * 18 * For the purpose of avoiding doubt the preferred form of the work 19 * for making modifications shall be a standards compliant form such 20 * gzipped tar and not one requiring a proprietary or patent encumbered 21 * tool to unpack. 22 * 23 * Fixes/additions: 24 * Steve Ralston: 25 * Multiple device handling error fixes, 26 * Added a queue depth. 27 * Alan Cox: 28 * FC920 has an rmw bug. Dont or in the end marker. 29 * Removed queue walk, fixed for 64bitness. 30 * Rewrote much of the code over time 31 * Added indirect block lists 32 * Handle 64K limits on many controllers 33 * Don't use indirects on the Promise (breaks) 34 * Heavily chop down the queue depths 35 * Deepak Saxena: 36 * Independent queues per IOP 37 * Support for dynamic device creation/deletion 38 * Code cleanup 39 * Support for larger I/Os through merge* functions 40 * (taken from DAC960 driver) 41 * Boji T Kannanthanam: 42 * Set the I2O Block devices to be detected in increasing 43 * order of TIDs during boot. 44 * Search and set the I2O block device that we boot off 45 * from as the first device to be claimed (as /dev/i2o/hda) 46 * Properly attach/detach I2O gendisk structure from the 47 * system gendisk list. The I2O block devices now appear in 48 * /proc/partitions. 49 * Markus Lidel <Markus.Lidel@shadowconnect.com>: 50 * Minor bugfixes for 2.6. 51 */ 52 53 #ifndef I2O_BLOCK_OSM_H 54 #define I2O_BLOCK_OSM_H 55 56 #define I2O_BLOCK_RETRY_TIME HZ/4 57 #define I2O_BLOCK_MAX_OPEN_REQUESTS 50 58 59 /* request queue sizes */ 60 #define I2O_BLOCK_REQ_MEMPOOL_SIZE 32 61 62 #define KERNEL_SECTOR_SHIFT 9 63 #define KERNEL_SECTOR_SIZE (1 << KERNEL_SECTOR_SHIFT) 64 65 /* I2O Block OSM mempool struct */ 66 struct i2o_block_mempool { 67 struct kmem_cache *slab; 68 mempool_t *pool; 69 }; 70 71 /* I2O Block device descriptor */ 72 struct i2o_block_device { 73 struct i2o_device *i2o_dev; /* pointer to I2O device */ 74 struct gendisk *gd; 75 spinlock_t lock; /* queue lock */ 76 struct list_head open_queue; /* list of transferred, but unfinished 77 requests */ 78 unsigned int open_queue_depth; /* number of requests in the queue */ 79 80 int rcache; /* read cache flags */ 81 int wcache; /* write cache flags */ 82 int flags; 83 u16 power; /* power state */ 84 int media_change_flag; /* media changed flag */ 85 }; 86 87 /* I2O Block device request */ 88 struct i2o_block_request { 89 struct list_head queue; 90 struct request *req; /* corresponding request */ 91 struct i2o_block_device *i2o_blk_dev; /* I2O block device */ 92 struct device *dev; /* device used for DMA */ 93 int sg_nents; /* number of SG elements */ 94 struct scatterlist sg_table[I2O_MAX_PHYS_SEGMENTS]; /* SG table */ 95 }; 96 97 /* I2O Block device delayed request */ 98 struct i2o_block_delayed_request { 99 struct delayed_work work; 100 struct request_queue *queue; 101 }; 102 103 #endif 104