/* * Block OSM structures/API * * Copyright (C) 1999-2002 Red Hat Software * * Written by Alan Cox, Building Number Three Ltd * * 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 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. * * For the purpose of avoiding doubt the preferred form of the work * for making modifications shall be a standards compliant form such * gzipped tar and not one requiring a proprietary or patent encumbered * tool to unpack. * * Fixes/additions: * Steve Ralston: * Multiple device handling error fixes, * Added a queue depth. * Alan Cox: * FC920 has an rmw bug. Dont or in the end marker. * Removed queue walk, fixed for 64bitness. * Rewrote much of the code over time * Added indirect block lists * Handle 64K limits on many controllers * Don't use indirects on the Promise (breaks) * Heavily chop down the queue depths * Deepak Saxena: * Independent queues per IOP * Support for dynamic device creation/deletion * Code cleanup * Support for larger I/Os through merge* functions * (taken from DAC960 driver) * Boji T Kannanthanam: * Set the I2O Block devices to be detected in increasing * order of TIDs during boot. * Search and set the I2O block device that we boot off * from as the first device to be claimed (as /dev/i2o/hda) * Properly attach/detach I2O gendisk structure from the * system gendisk list. The I2O block devices now appear in * /proc/partitions. * Markus Lidel : * Minor bugfixes for 2.6. */ #ifndef I2O_BLOCK_OSM_H #define I2O_BLOCK_OSM_H #define I2O_BLOCK_RETRY_TIME HZ/4 #define I2O_BLOCK_MAX_OPEN_REQUESTS 50 /* request queue sizes */ #define I2O_BLOCK_REQ_MEMPOOL_SIZE 32 #define KERNEL_SECTOR_SHIFT 9 #define KERNEL_SECTOR_SIZE (1 << KERNEL_SECTOR_SHIFT) /* I2O Block OSM mempool struct */ struct i2o_block_mempool { struct kmem_cache *slab; mempool_t *pool; }; /* I2O Block device descriptor */ struct i2o_block_device { struct i2o_device *i2o_dev; /* pointer to I2O device */ struct gendisk *gd; spinlock_t lock; /* queue lock */ struct list_head open_queue; /* list of transferred, but unfinished requests */ unsigned int open_queue_depth; /* number of requests in the queue */ int rcache; /* read cache flags */ int wcache; /* write cache flags */ int flags; u16 power; /* power state */ int media_change_flag; /* media changed flag */ }; /* I2O Block device request */ struct i2o_block_request { struct list_head queue; struct request *req; /* corresponding request */ struct i2o_block_device *i2o_blk_dev; /* I2O block device */ struct device *dev; /* device used for DMA */ int sg_nents; /* number of SG elements */ struct scatterlist sg_table[I2O_MAX_PHYS_SEGMENTS]; /* SG table */ }; /* I2O Block device delayed request */ struct i2o_block_delayed_request { struct delayed_work work; struct request_queue *queue; }; #endif