[SCSI] hpsa: remove scan thread
[safe/jmp/linux-2.6] / drivers / scsi / hpsa.h
1 /*
2  *    Disk Array driver for HP Smart Array SAS controllers
3  *    Copyright 2000, 2009 Hewlett-Packard Development Company, L.P.
4  *
5  *    This program is free software; you can redistribute it and/or modify
6  *    it under the terms of the GNU General Public License as published by
7  *    the Free Software Foundation; version 2 of the License.
8  *
9  *    This program is distributed in the hope that it will be useful,
10  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *    MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12  *    NON INFRINGEMENT.  See the GNU General Public License for more details.
13  *
14  *    You should have received a copy of the GNU General Public License
15  *    along with this program; if not, write to the Free Software
16  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  *
18  *    Questions/Comments/Bugfixes to iss_storagedev@hp.com
19  *
20  */
21 #ifndef HPSA_H
22 #define HPSA_H
23
24 #include <scsi/scsicam.h>
25
26 #define IO_OK           0
27 #define IO_ERROR        1
28
29 struct ctlr_info;
30
31 struct access_method {
32         void (*submit_command)(struct ctlr_info *h,
33                 struct CommandList *c);
34         void (*set_intr_mask)(struct ctlr_info *h, unsigned long val);
35         unsigned long (*fifo_full)(struct ctlr_info *h);
36         bool (*intr_pending)(struct ctlr_info *h);
37         unsigned long (*command_completed)(struct ctlr_info *h);
38 };
39
40 struct hpsa_scsi_dev_t {
41         int devtype;
42         int bus, target, lun;           /* as presented to the OS */
43         unsigned char scsi3addr[8];     /* as presented to the HW */
44 #define RAID_CTLR_LUNID "\0\0\0\0\0\0\0\0"
45         unsigned char device_id[16];    /* from inquiry pg. 0x83 */
46         unsigned char vendor[8];        /* bytes 8-15 of inquiry data */
47         unsigned char model[16];        /* bytes 16-31 of inquiry data */
48         unsigned char revision[4];      /* bytes 32-35 of inquiry data */
49         unsigned char raid_level;       /* from inquiry page 0xC1 */
50 };
51
52 struct ctlr_info {
53         int     ctlr;
54         char    devname[8];
55         char    *product_name;
56         char    firm_ver[4]; /* Firmware version */
57         struct pci_dev *pdev;
58         u32     board_id;
59         void __iomem *vaddr;
60         unsigned long paddr;
61         int     nr_cmds; /* Number of commands allowed on this controller */
62         struct CfgTable __iomem *cfgtable;
63         int     max_sg_entries;
64         int     interrupts_enabled;
65         int     major;
66         int     max_commands;
67         int     commands_outstanding;
68         int     max_outstanding; /* Debug */
69         int     usage_count;  /* number of opens all all minor devices */
70 #       define PERF_MODE_INT    0
71 #       define DOORBELL_INT     1
72 #       define SIMPLE_MODE_INT  2
73 #       define MEMQ_MODE_INT    3
74         unsigned int intr[4];
75         unsigned int msix_vector;
76         unsigned int msi_vector;
77         struct access_method access;
78
79         /* queue and queue Info */
80         struct hlist_head reqQ;
81         struct hlist_head cmpQ;
82         unsigned int Qdepth;
83         unsigned int maxQsinceinit;
84         unsigned int maxSG;
85         spinlock_t lock;
86
87         /* pointers to command and error info pool */
88         struct CommandList      *cmd_pool;
89         dma_addr_t              cmd_pool_dhandle;
90         struct ErrorInfo        *errinfo_pool;
91         dma_addr_t              errinfo_pool_dhandle;
92         unsigned long           *cmd_pool_bits;
93         int                     nr_allocs;
94         int                     nr_frees;
95         int                     busy_initializing;
96         int                     busy_scanning;
97         int                     scan_finished;
98         spinlock_t              scan_lock;
99         wait_queue_head_t       scan_wait_queue;
100
101         struct Scsi_Host *scsi_host;
102         spinlock_t devlock; /* to protect hba[ctlr]->dev[];  */
103         int ndevices; /* number of used elements in .dev[] array. */
104 #define HPSA_MAX_SCSI_DEVS_PER_HBA 256
105         struct hpsa_scsi_dev_t *dev[HPSA_MAX_SCSI_DEVS_PER_HBA];
106         /*
107          * Performant mode tables.
108          */
109         u32 trans_support;
110         u32 trans_offset;
111         struct TransTable_struct *transtable;
112         unsigned long transMethod;
113
114         /*
115          * Performant mode completion buffer
116          */
117         u64 *reply_pool;
118         dma_addr_t reply_pool_dhandle;
119         u64 *reply_pool_head;
120         size_t reply_pool_size;
121         unsigned char reply_pool_wraparound;
122         u32 *blockFetchTable;
123         unsigned char *hba_inquiry_data;
124 };
125 #define HPSA_ABORT_MSG 0
126 #define HPSA_DEVICE_RESET_MSG 1
127 #define HPSA_BUS_RESET_MSG 2
128 #define HPSA_HOST_RESET_MSG 3
129 #define HPSA_MSG_SEND_RETRY_LIMIT 10
130 #define HPSA_MSG_SEND_RETRY_INTERVAL_MSECS 1000
131
132 /* Maximum time in seconds driver will wait for command completions
133  * when polling before giving up.
134  */
135 #define HPSA_MAX_POLL_TIME_SECS (20)
136
137 /* During SCSI error recovery, HPSA_TUR_RETRY_LIMIT defines
138  * how many times to retry TEST UNIT READY on a device
139  * while waiting for it to become ready before giving up.
140  * HPSA_MAX_WAIT_INTERVAL_SECS is the max wait interval
141  * between sending TURs while waiting for a device
142  * to become ready.
143  */
144 #define HPSA_TUR_RETRY_LIMIT (20)
145 #define HPSA_MAX_WAIT_INTERVAL_SECS (30)
146
147 /* HPSA_BOARD_READY_WAIT_SECS is how long to wait for a board
148  * to become ready, in seconds, before giving up on it.
149  * HPSA_BOARD_READY_POLL_INTERVAL_MSECS * is how long to wait
150  * between polling the board to see if it is ready, in
151  * milliseconds.  HPSA_BOARD_READY_POLL_INTERVAL and
152  * HPSA_BOARD_READY_ITERATIONS are derived from those.
153  */
154 #define HPSA_BOARD_READY_WAIT_SECS (120)
155 #define HPSA_BOARD_READY_POLL_INTERVAL_MSECS (100)
156 #define HPSA_BOARD_READY_POLL_INTERVAL \
157         ((HPSA_BOARD_READY_POLL_INTERVAL_MSECS * HZ) / 1000)
158 #define HPSA_BOARD_READY_ITERATIONS \
159         ((HPSA_BOARD_READY_WAIT_SECS * 1000) / \
160                 HPSA_BOARD_READY_POLL_INTERVAL_MSECS)
161 #define HPSA_POST_RESET_PAUSE_MSECS (3000)
162 #define HPSA_POST_RESET_NOOP_RETRIES (12)
163
164 /*  Defining the diffent access_menthods */
165 /*
166  * Memory mapped FIFO interface (SMART 53xx cards)
167  */
168 #define SA5_DOORBELL    0x20
169 #define SA5_REQUEST_PORT_OFFSET 0x40
170 #define SA5_REPLY_INTR_MASK_OFFSET      0x34
171 #define SA5_REPLY_PORT_OFFSET           0x44
172 #define SA5_INTR_STATUS         0x30
173 #define SA5_SCRATCHPAD_OFFSET   0xB0
174
175 #define SA5_CTCFG_OFFSET        0xB4
176 #define SA5_CTMEM_OFFSET        0xB8
177
178 #define SA5_INTR_OFF            0x08
179 #define SA5B_INTR_OFF           0x04
180 #define SA5_INTR_PENDING        0x08
181 #define SA5B_INTR_PENDING       0x04
182 #define FIFO_EMPTY              0xffffffff
183 #define HPSA_FIRMWARE_READY     0xffff0000 /* value in scratchpad register */
184
185 #define HPSA_ERROR_BIT          0x02
186
187 /* Performant mode flags */
188 #define SA5_PERF_INTR_PENDING   0x04
189 #define SA5_PERF_INTR_OFF       0x05
190 #define SA5_OUTDB_STATUS_PERF_BIT       0x01
191 #define SA5_OUTDB_CLEAR_PERF_BIT        0x01
192 #define SA5_OUTDB_CLEAR         0xA0
193 #define SA5_OUTDB_CLEAR_PERF_BIT        0x01
194 #define SA5_OUTDB_STATUS        0x9C
195
196
197 #define HPSA_INTR_ON    1
198 #define HPSA_INTR_OFF   0
199 /*
200         Send the command to the hardware
201 */
202 static void SA5_submit_command(struct ctlr_info *h,
203         struct CommandList *c)
204 {
205         dev_dbg(&h->pdev->dev, "Sending %x, tag = %x\n", c->busaddr,
206                 c->Header.Tag.lower);
207         writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET);
208         h->commands_outstanding++;
209         if (h->commands_outstanding > h->max_outstanding)
210                 h->max_outstanding = h->commands_outstanding;
211 }
212
213 /*
214  *  This card is the opposite of the other cards.
215  *   0 turns interrupts on...
216  *   0x08 turns them off...
217  */
218 static void SA5_intr_mask(struct ctlr_info *h, unsigned long val)
219 {
220         if (val) { /* Turn interrupts on */
221                 h->interrupts_enabled = 1;
222                 writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
223         } else { /* Turn them off */
224                 h->interrupts_enabled = 0;
225                 writel(SA5_INTR_OFF,
226                         h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
227         }
228 }
229
230 static void SA5_performant_intr_mask(struct ctlr_info *h, unsigned long val)
231 {
232         if (val) { /* turn on interrupts */
233                 h->interrupts_enabled = 1;
234                 writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
235         } else {
236                 h->interrupts_enabled = 0;
237                 writel(SA5_PERF_INTR_OFF,
238                         h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
239         }
240 }
241
242 static unsigned long SA5_performant_completed(struct ctlr_info *h)
243 {
244         unsigned long register_value = FIFO_EMPTY;
245
246         /* flush the controller write of the reply queue by reading
247          * outbound doorbell status register.
248          */
249         register_value = readl(h->vaddr + SA5_OUTDB_STATUS);
250         /* msi auto clears the interrupt pending bit. */
251         if (!(h->msi_vector || h->msix_vector)) {
252                 writel(SA5_OUTDB_CLEAR_PERF_BIT, h->vaddr + SA5_OUTDB_CLEAR);
253                 /* Do a read in order to flush the write to the controller
254                  * (as per spec.)
255                  */
256                 register_value = readl(h->vaddr + SA5_OUTDB_STATUS);
257         }
258
259         if ((*(h->reply_pool_head) & 1) == (h->reply_pool_wraparound)) {
260                 register_value = *(h->reply_pool_head);
261                 (h->reply_pool_head)++;
262                 h->commands_outstanding--;
263         } else {
264                 register_value = FIFO_EMPTY;
265         }
266         /* Check for wraparound */
267         if (h->reply_pool_head == (h->reply_pool + h->max_commands)) {
268                 h->reply_pool_head = h->reply_pool;
269                 h->reply_pool_wraparound ^= 1;
270         }
271
272         return register_value;
273 }
274
275 /*
276  *  Returns true if fifo is full.
277  *
278  */
279 static unsigned long SA5_fifo_full(struct ctlr_info *h)
280 {
281         if (h->commands_outstanding >= h->max_commands)
282                 return 1;
283         else
284                 return 0;
285
286 }
287 /*
288  *   returns value read from hardware.
289  *     returns FIFO_EMPTY if there is nothing to read
290  */
291 static unsigned long SA5_completed(struct ctlr_info *h)
292 {
293         unsigned long register_value
294                 = readl(h->vaddr + SA5_REPLY_PORT_OFFSET);
295
296         if (register_value != FIFO_EMPTY)
297                 h->commands_outstanding--;
298
299 #ifdef HPSA_DEBUG
300         if (register_value != FIFO_EMPTY)
301                 dev_dbg(&h->pdev->dev, "Read %lx back from board\n",
302                         register_value);
303         else
304                 dev_dbg(&h->pdev->dev, "hpsa: FIFO Empty read\n");
305 #endif
306
307         return register_value;
308 }
309 /*
310  *      Returns true if an interrupt is pending..
311  */
312 static bool SA5_intr_pending(struct ctlr_info *h)
313 {
314         unsigned long register_value  =
315                 readl(h->vaddr + SA5_INTR_STATUS);
316         dev_dbg(&h->pdev->dev, "intr_pending %lx\n", register_value);
317         return register_value & SA5_INTR_PENDING;
318 }
319
320 static bool SA5_performant_intr_pending(struct ctlr_info *h)
321 {
322         unsigned long register_value = readl(h->vaddr + SA5_INTR_STATUS);
323
324         if (!register_value)
325                 return false;
326
327         if (h->msi_vector || h->msix_vector)
328                 return true;
329
330         /* Read outbound doorbell to flush */
331         register_value = readl(h->vaddr + SA5_OUTDB_STATUS);
332         return register_value & SA5_OUTDB_STATUS_PERF_BIT;
333 }
334
335 static struct access_method SA5_access = {
336         SA5_submit_command,
337         SA5_intr_mask,
338         SA5_fifo_full,
339         SA5_intr_pending,
340         SA5_completed,
341 };
342
343 static struct access_method SA5_performant_access = {
344         SA5_submit_command,
345         SA5_performant_intr_mask,
346         SA5_fifo_full,
347         SA5_performant_intr_pending,
348         SA5_performant_completed,
349 };
350
351 struct board_type {
352         u32     board_id;
353         char    *product_name;
354         struct access_method *access;
355 };
356
357 #endif /* HPSA_H */
358