4fdaa5bda4125d57b7591bd89f9e9054fc47ddcb
[linux-3.10.git] / drivers / message / i2o / i2o_block.h
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         kmem_cache_t *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 transfered, 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 work_struct work;
100         struct request_queue *queue;
101 };
102
103 #endif