blob: 33f8341887d036e4805334e11aefe8ce9c1d1806 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Disk Array driver for HP SA 5xxx and 6xxx Controllers
Mike Miller3de0a702005-06-27 14:36:48 -07003 * Copyright 2000, 2005 Hewlett-Packard Development Company, L.P.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004 *
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; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
13 * NON INFRINGEMENT. See the GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 * Questions/Comments/Bugfixes to iss_storagedev@hp.com
20 *
21 */
22
23#include <linux/config.h> /* CONFIG_PROC_FS */
24#include <linux/module.h>
25#include <linux/interrupt.h>
26#include <linux/types.h>
27#include <linux/pci.h>
28#include <linux/kernel.h>
29#include <linux/slab.h>
30#include <linux/delay.h>
31#include <linux/major.h>
32#include <linux/fs.h>
33#include <linux/bio.h>
34#include <linux/blkpg.h>
35#include <linux/timer.h>
36#include <linux/proc_fs.h>
37#include <linux/init.h>
38#include <linux/hdreg.h>
39#include <linux/spinlock.h>
40#include <linux/compat.h>
41#include <asm/uaccess.h>
42#include <asm/io.h>
43
mike.miller@hp.comeb0df992005-06-10 14:51:04 -050044#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070045#include <linux/blkdev.h>
46#include <linux/genhd.h>
47#include <linux/completion.h>
48
49#define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
Mike Miller9dc7a862005-09-13 01:25:19 -070050#define DRIVER_NAME "HP CISS Driver (v 2.6.8)"
51#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,6,8)
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
53/* Embedded module documentation macros - see modules.h */
54MODULE_AUTHOR("Hewlett-Packard Company");
Mike Miller9dc7a862005-09-13 01:25:19 -070055MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 2.6.8");
Linus Torvalds1da177e2005-04-16 15:20:36 -070056MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400"
Mike Miller9dc7a862005-09-13 01:25:19 -070057 " SA6i P600 P800 P400 P400i E200 E200i");
Linus Torvalds1da177e2005-04-16 15:20:36 -070058MODULE_LICENSE("GPL");
59
60#include "cciss_cmd.h"
61#include "cciss.h"
62#include <linux/cciss_ioctl.h>
63
64/* define the PCI info for the cards we can control */
65static const struct pci_device_id cciss_pci_device_id[] = {
66 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISS,
67 0x0E11, 0x4070, 0, 0, 0},
68 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
69 0x0E11, 0x4080, 0, 0, 0},
70 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
71 0x0E11, 0x4082, 0, 0, 0},
72 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
73 0x0E11, 0x4083, 0, 0, 0},
74 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
75 0x0E11, 0x409A, 0, 0, 0},
76 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
77 0x0E11, 0x409B, 0, 0, 0},
78 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
79 0x0E11, 0x409C, 0, 0, 0},
80 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
81 0x0E11, 0x409D, 0, 0, 0},
82 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
83 0x0E11, 0x4091, 0, 0, 0},
84 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSA,
85 0x103C, 0x3225, 0, 0, 0},
Mike Miller9dc7a862005-09-13 01:25:19 -070086 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Linus Torvalds1da177e2005-04-16 15:20:36 -070087 0x103c, 0x3223, 0, 0, 0},
Mike Miller3de0a702005-06-27 14:36:48 -070088 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Mike Miller9dc7a862005-09-13 01:25:19 -070089 0x103c, 0x3234, 0, 0, 0},
Mike Miller3de0a702005-06-27 14:36:48 -070090 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Mike Miller9dc7a862005-09-13 01:25:19 -070091 0x103c, 0x3235, 0, 0, 0},
92 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
93 0x103c, 0x3211, 0, 0, 0},
94 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
95 0x103c, 0x3212, 0, 0, 0},
96 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
97 0x103c, 0x3213, 0, 0, 0},
98 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
99 0x103c, 0x3214, 0, 0, 0},
100 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
101 0x103c, 0x3215, 0, 0, 0},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102 {0,}
103};
104MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
105
106#define NR_PRODUCTS (sizeof(products)/sizeof(struct board_type))
107
108/* board_id = Subsystem Device ID & Vendor ID
109 * product = Marketing Name for the board
110 * access = Address of the struct of function pointers
111 */
112static struct board_type products[] = {
113 { 0x40700E11, "Smart Array 5300", &SA5_access },
114 { 0x40800E11, "Smart Array 5i", &SA5B_access},
115 { 0x40820E11, "Smart Array 532", &SA5B_access},
116 { 0x40830E11, "Smart Array 5312", &SA5B_access},
117 { 0x409A0E11, "Smart Array 641", &SA5_access},
118 { 0x409B0E11, "Smart Array 642", &SA5_access},
119 { 0x409C0E11, "Smart Array 6400", &SA5_access},
120 { 0x409D0E11, "Smart Array 6400 EM", &SA5_access},
121 { 0x40910E11, "Smart Array 6i", &SA5_access},
122 { 0x3225103C, "Smart Array P600", &SA5_access},
123 { 0x3223103C, "Smart Array P800", &SA5_access},
Mike Miller9dc7a862005-09-13 01:25:19 -0700124 { 0x3234103C, "Smart Array P400", &SA5_access},
125 { 0x3235103C, "Smart Array P400i", &SA5_access},
126 { 0x3211103C, "Smart Array E200i", &SA5_access},
127 { 0x3212103C, "Smart Array E200", &SA5_access},
128 { 0x3213103C, "Smart Array E200i", &SA5_access},
129 { 0x3214103C, "Smart Array E200i", &SA5_access},
130 { 0x3215103C, "Smart Array E200i", &SA5_access},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131};
132
133/* How long to wait (in millesconds) for board to go into simple mode */
134#define MAX_CONFIG_WAIT 30000
135#define MAX_IOCTL_CONFIG_WAIT 1000
136
137/*define how many times we will try a command because of bus resets */
138#define MAX_CMD_RETRIES 3
139
140#define READ_AHEAD 1024
141#define NR_CMDS 384 /* #commands that can be outstanding */
142#define MAX_CTLR 32
143
144/* Originally cciss driver only supports 8 major numbers */
145#define MAX_CTLR_ORIG 8
146
147
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148static ctlr_info_t *hba[MAX_CTLR];
149
150static void do_cciss_request(request_queue_t *q);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -0600151static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700152static int cciss_open(struct inode *inode, struct file *filep);
153static int cciss_release(struct inode *inode, struct file *filep);
154static int cciss_ioctl(struct inode *inode, struct file *filep,
155 unsigned int cmd, unsigned long arg);
156
157static int revalidate_allvol(ctlr_info_t *host);
158static int cciss_revalidate(struct gendisk *disk);
Mike Millerddd47442005-09-13 01:25:22 -0700159static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk);
160static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, int clear_all);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161
Mike Millerddd47442005-09-13 01:25:22 -0700162static void cciss_read_capacity(int ctlr, int logvol, ReadCapdata_struct *buf,
163 int withirq, unsigned int *total_size, unsigned int *block_size);
164static void cciss_geometry_inquiry(int ctlr, int logvol,
165 int withirq, unsigned int total_size,
166 unsigned int block_size, InquiryData_struct *inq_buff,
167 drive_info_struct *drv);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168static void cciss_getgeometry(int cntl_num);
169
170static void start_io( ctlr_info_t *h);
171static int sendcmd( __u8 cmd, int ctlr, void *buff, size_t size,
172 unsigned int use_unit_num, unsigned int log_unit, __u8 page_code,
173 unsigned char *scsi3addr, int cmd_type);
Mike Millerddd47442005-09-13 01:25:22 -0700174static int sendcmd_withirq(__u8 cmd, int ctlr, void *buff, size_t size,
175 unsigned int use_unit_num, unsigned int log_unit, __u8 page_code,
176 int cmd_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177
Mike Miller33079b22005-09-13 01:25:22 -0700178static void fail_all_cmds(unsigned long ctlr);
179
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180#ifdef CONFIG_PROC_FS
181static int cciss_proc_get_info(char *buffer, char **start, off_t offset,
182 int length, int *eof, void *data);
183static void cciss_procinit(int i);
184#else
185static void cciss_procinit(int i) {}
186#endif /* CONFIG_PROC_FS */
187
188#ifdef CONFIG_COMPAT
189static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg);
190#endif
191
192static struct block_device_operations cciss_fops = {
193 .owner = THIS_MODULE,
194 .open = cciss_open,
195 .release = cciss_release,
196 .ioctl = cciss_ioctl,
197#ifdef CONFIG_COMPAT
198 .compat_ioctl = cciss_compat_ioctl,
199#endif
200 .revalidate_disk= cciss_revalidate,
201};
202
203/*
204 * Enqueuing and dequeuing functions for cmdlists.
205 */
206static inline void addQ(CommandList_struct **Qptr, CommandList_struct *c)
207{
208 if (*Qptr == NULL) {
209 *Qptr = c;
210 c->next = c->prev = c;
211 } else {
212 c->prev = (*Qptr)->prev;
213 c->next = (*Qptr);
214 (*Qptr)->prev->next = c;
215 (*Qptr)->prev = c;
216 }
217}
218
219static inline CommandList_struct *removeQ(CommandList_struct **Qptr,
220 CommandList_struct *c)
221{
222 if (c && c->next != c) {
223 if (*Qptr == c) *Qptr = c->next;
224 c->prev->next = c->next;
225 c->next->prev = c->prev;
226 } else {
227 *Qptr = NULL;
228 }
229 return c;
230}
231
232#include "cciss_scsi.c" /* For SCSI tape support */
233
234#ifdef CONFIG_PROC_FS
235
236/*
237 * Report information about this controller.
238 */
239#define ENG_GIG 1000000000
240#define ENG_GIG_FACTOR (ENG_GIG/512)
241#define RAID_UNKNOWN 6
242static const char *raid_label[] = {"0","4","1(1+0)","5","5+1","ADG",
243 "UNKNOWN"};
244
245static struct proc_dir_entry *proc_cciss;
246
247static int cciss_proc_get_info(char *buffer, char **start, off_t offset,
248 int length, int *eof, void *data)
249{
250 off_t pos = 0;
251 off_t len = 0;
252 int size, i, ctlr;
253 ctlr_info_t *h = (ctlr_info_t*)data;
254 drive_info_struct *drv;
255 unsigned long flags;
256 sector_t vol_sz, vol_sz_frac;
257
258 ctlr = h->ctlr;
259
260 /* prevent displaying bogus info during configuration
261 * or deconfiguration of a logical volume
262 */
263 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
264 if (h->busy_configuring) {
265 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
266 return -EBUSY;
267 }
268 h->busy_configuring = 1;
269 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
270
271 size = sprintf(buffer, "%s: HP %s Controller\n"
272 "Board ID: 0x%08lx\n"
273 "Firmware Version: %c%c%c%c\n"
274 "IRQ: %d\n"
275 "Logical drives: %d\n"
276 "Current Q depth: %d\n"
277 "Current # commands on controller: %d\n"
278 "Max Q depth since init: %d\n"
279 "Max # commands on controller since init: %d\n"
280 "Max SG entries since init: %d\n\n",
281 h->devname,
282 h->product_name,
283 (unsigned long)h->board_id,
284 h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], h->firm_ver[3],
285 (unsigned int)h->intr,
286 h->num_luns,
287 h->Qdepth, h->commands_outstanding,
288 h->maxQsinceinit, h->max_outstanding, h->maxSG);
289
290 pos += size; len += size;
291 cciss_proc_tape_report(ctlr, buffer, &pos, &len);
292 for(i=0; i<=h->highest_lun; i++) {
293
294 drv = &h->drv[i];
Mike Millerddd47442005-09-13 01:25:22 -0700295 if (drv->heads == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700296 continue;
297
298 vol_sz = drv->nr_blocks;
299 vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR);
300 vol_sz_frac *= 100;
301 sector_div(vol_sz_frac, ENG_GIG_FACTOR);
302
303 if (drv->raid_level > 5)
304 drv->raid_level = RAID_UNKNOWN;
305 size = sprintf(buffer+len, "cciss/c%dd%d:"
306 "\t%4u.%02uGB\tRAID %s\n",
307 ctlr, i, (int)vol_sz, (int)vol_sz_frac,
308 raid_label[drv->raid_level]);
309 pos += size; len += size;
310 }
311
312 *eof = 1;
313 *start = buffer+offset;
314 len -= offset;
315 if (len>length)
316 len = length;
317 h->busy_configuring = 0;
318 return len;
319}
320
321static int
322cciss_proc_write(struct file *file, const char __user *buffer,
323 unsigned long count, void *data)
324{
325 unsigned char cmd[80];
326 int len;
327#ifdef CONFIG_CISS_SCSI_TAPE
328 ctlr_info_t *h = (ctlr_info_t *) data;
329 int rc;
330#endif
331
332 if (count > sizeof(cmd)-1) return -EINVAL;
333 if (copy_from_user(cmd, buffer, count)) return -EFAULT;
334 cmd[count] = '\0';
335 len = strlen(cmd); // above 3 lines ensure safety
336 if (len && cmd[len-1] == '\n')
337 cmd[--len] = '\0';
338# ifdef CONFIG_CISS_SCSI_TAPE
339 if (strcmp("engage scsi", cmd)==0) {
340 rc = cciss_engage_scsi(h->ctlr);
341 if (rc != 0) return -rc;
342 return count;
343 }
344 /* might be nice to have "disengage" too, but it's not
345 safely possible. (only 1 module use count, lock issues.) */
346# endif
347 return -EINVAL;
348}
349
350/*
351 * Get us a file in /proc/cciss that says something about each controller.
352 * Create /proc/cciss if it doesn't exist yet.
353 */
354static void __devinit cciss_procinit(int i)
355{
356 struct proc_dir_entry *pde;
357
358 if (proc_cciss == NULL) {
359 proc_cciss = proc_mkdir("cciss", proc_root_driver);
360 if (!proc_cciss)
361 return;
362 }
363
364 pde = create_proc_read_entry(hba[i]->devname,
365 S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH,
366 proc_cciss, cciss_proc_get_info, hba[i]);
367 pde->write_proc = cciss_proc_write;
368}
369#endif /* CONFIG_PROC_FS */
370
371/*
372 * For operations that cannot sleep, a command block is allocated at init,
373 * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track
374 * which ones are free or in use. For operations that can wait for kmalloc
375 * to possible sleep, this routine can be called with get_from_pool set to 0.
376 * cmd_free() MUST be called with a got_from_pool set to 0 if cmd_alloc was.
377 */
378static CommandList_struct * cmd_alloc(ctlr_info_t *h, int get_from_pool)
379{
380 CommandList_struct *c;
381 int i;
382 u64bit temp64;
383 dma_addr_t cmd_dma_handle, err_dma_handle;
384
385 if (!get_from_pool)
386 {
387 c = (CommandList_struct *) pci_alloc_consistent(
388 h->pdev, sizeof(CommandList_struct), &cmd_dma_handle);
389 if(c==NULL)
390 return NULL;
391 memset(c, 0, sizeof(CommandList_struct));
392
Mike Miller33079b22005-09-13 01:25:22 -0700393 c->cmdindex = -1;
394
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 c->err_info = (ErrorInfo_struct *)pci_alloc_consistent(
396 h->pdev, sizeof(ErrorInfo_struct),
397 &err_dma_handle);
398
399 if (c->err_info == NULL)
400 {
401 pci_free_consistent(h->pdev,
402 sizeof(CommandList_struct), c, cmd_dma_handle);
403 return NULL;
404 }
405 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
406 } else /* get it out of the controllers pool */
407 {
408 do {
409 i = find_first_zero_bit(h->cmd_pool_bits, NR_CMDS);
410 if (i == NR_CMDS)
411 return NULL;
412 } while(test_and_set_bit(i & (BITS_PER_LONG - 1), h->cmd_pool_bits+(i/BITS_PER_LONG)) != 0);
413#ifdef CCISS_DEBUG
414 printk(KERN_DEBUG "cciss: using command buffer %d\n", i);
415#endif
416 c = h->cmd_pool + i;
417 memset(c, 0, sizeof(CommandList_struct));
418 cmd_dma_handle = h->cmd_pool_dhandle
419 + i*sizeof(CommandList_struct);
420 c->err_info = h->errinfo_pool + i;
421 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
422 err_dma_handle = h->errinfo_pool_dhandle
423 + i*sizeof(ErrorInfo_struct);
424 h->nr_allocs++;
Mike Miller33079b22005-09-13 01:25:22 -0700425
426 c->cmdindex = i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700427 }
428
429 c->busaddr = (__u32) cmd_dma_handle;
430 temp64.val = (__u64) err_dma_handle;
431 c->ErrDesc.Addr.lower = temp64.val32.lower;
432 c->ErrDesc.Addr.upper = temp64.val32.upper;
433 c->ErrDesc.Len = sizeof(ErrorInfo_struct);
434
435 c->ctlr = h->ctlr;
436 return c;
437
438
439}
440
441/*
442 * Frees a command block that was previously allocated with cmd_alloc().
443 */
444static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool)
445{
446 int i;
447 u64bit temp64;
448
449 if( !got_from_pool)
450 {
451 temp64.val32.lower = c->ErrDesc.Addr.lower;
452 temp64.val32.upper = c->ErrDesc.Addr.upper;
453 pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct),
454 c->err_info, (dma_addr_t) temp64.val);
455 pci_free_consistent(h->pdev, sizeof(CommandList_struct),
456 c, (dma_addr_t) c->busaddr);
457 } else
458 {
459 i = c - h->cmd_pool;
460 clear_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG));
461 h->nr_frees++;
462 }
463}
464
465static inline ctlr_info_t *get_host(struct gendisk *disk)
466{
467 return disk->queue->queuedata;
468}
469
470static inline drive_info_struct *get_drv(struct gendisk *disk)
471{
472 return disk->private_data;
473}
474
475/*
476 * Open. Make sure the device is really there.
477 */
478static int cciss_open(struct inode *inode, struct file *filep)
479{
480 ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
481 drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
482
483#ifdef CCISS_DEBUG
484 printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
485#endif /* CCISS_DEBUG */
486
Mike Millerddd47442005-09-13 01:25:22 -0700487 if (host->busy_initializing || drv->busy_configuring)
488 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 /*
490 * Root is allowed to open raw volume zero even if it's not configured
491 * so array config can still work. Root is also allowed to open any
492 * volume that has a LUN ID, so it can issue IOCTL to reread the
493 * disk information. I don't think I really like this
494 * but I'm already using way to many device nodes to claim another one
495 * for "raw controller".
496 */
497 if (drv->nr_blocks == 0) {
498 if (iminor(inode) != 0) { /* not node 0? */
499 /* if not node 0 make sure it is a partition = 0 */
500 if (iminor(inode) & 0x0f) {
501 return -ENXIO;
502 /* if it is, make sure we have a LUN ID */
503 } else if (drv->LunID == 0) {
504 return -ENXIO;
505 }
506 }
507 if (!capable(CAP_SYS_ADMIN))
508 return -EPERM;
509 }
510 drv->usage_count++;
511 host->usage_count++;
512 return 0;
513}
514/*
515 * Close. Sync first.
516 */
517static int cciss_release(struct inode *inode, struct file *filep)
518{
519 ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
520 drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
521
522#ifdef CCISS_DEBUG
523 printk(KERN_DEBUG "cciss_release %s\n", inode->i_bdev->bd_disk->disk_name);
524#endif /* CCISS_DEBUG */
525
526 drv->usage_count--;
527 host->usage_count--;
528 return 0;
529}
530
531#ifdef CONFIG_COMPAT
532
533static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg)
534{
535 int ret;
536 lock_kernel();
537 ret = cciss_ioctl(f->f_dentry->d_inode, f, cmd, arg);
538 unlock_kernel();
539 return ret;
540}
541
542static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, unsigned long arg);
543static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd, unsigned long arg);
544
545static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
546{
547 switch (cmd) {
548 case CCISS_GETPCIINFO:
549 case CCISS_GETINTINFO:
550 case CCISS_SETINTINFO:
551 case CCISS_GETNODENAME:
552 case CCISS_SETNODENAME:
553 case CCISS_GETHEARTBEAT:
554 case CCISS_GETBUSTYPES:
555 case CCISS_GETFIRMVER:
556 case CCISS_GETDRIVVER:
557 case CCISS_REVALIDVOLS:
558 case CCISS_DEREGDISK:
559 case CCISS_REGNEWDISK:
560 case CCISS_REGNEWD:
561 case CCISS_RESCANDISK:
562 case CCISS_GETLUNINFO:
563 return do_ioctl(f, cmd, arg);
564
565 case CCISS_PASSTHRU32:
566 return cciss_ioctl32_passthru(f, cmd, arg);
567 case CCISS_BIG_PASSTHRU32:
568 return cciss_ioctl32_big_passthru(f, cmd, arg);
569
570 default:
571 return -ENOIOCTLCMD;
572 }
573}
574
575static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, unsigned long arg)
576{
577 IOCTL32_Command_struct __user *arg32 =
578 (IOCTL32_Command_struct __user *) arg;
579 IOCTL_Command_struct arg64;
580 IOCTL_Command_struct __user *p = compat_alloc_user_space(sizeof(arg64));
581 int err;
582 u32 cp;
583
584 err = 0;
585 err |= copy_from_user(&arg64.LUN_info, &arg32->LUN_info, sizeof(arg64.LUN_info));
586 err |= copy_from_user(&arg64.Request, &arg32->Request, sizeof(arg64.Request));
587 err |= copy_from_user(&arg64.error_info, &arg32->error_info, sizeof(arg64.error_info));
588 err |= get_user(arg64.buf_size, &arg32->buf_size);
589 err |= get_user(cp, &arg32->buf);
590 arg64.buf = compat_ptr(cp);
591 err |= copy_to_user(p, &arg64, sizeof(arg64));
592
593 if (err)
594 return -EFAULT;
595
596 err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long) p);
597 if (err)
598 return err;
599 err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info));
600 if (err)
601 return -EFAULT;
602 return err;
603}
604
605static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, unsigned long arg)
606{
607 BIG_IOCTL32_Command_struct __user *arg32 =
608 (BIG_IOCTL32_Command_struct __user *) arg;
609 BIG_IOCTL_Command_struct arg64;
610 BIG_IOCTL_Command_struct __user *p = compat_alloc_user_space(sizeof(arg64));
611 int err;
612 u32 cp;
613
614 err = 0;
615 err |= copy_from_user(&arg64.LUN_info, &arg32->LUN_info, sizeof(arg64.LUN_info));
616 err |= copy_from_user(&arg64.Request, &arg32->Request, sizeof(arg64.Request));
617 err |= copy_from_user(&arg64.error_info, &arg32->error_info, sizeof(arg64.error_info));
618 err |= get_user(arg64.buf_size, &arg32->buf_size);
619 err |= get_user(arg64.malloc_size, &arg32->malloc_size);
620 err |= get_user(cp, &arg32->buf);
621 arg64.buf = compat_ptr(cp);
622 err |= copy_to_user(p, &arg64, sizeof(arg64));
623
624 if (err)
625 return -EFAULT;
626
627 err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long) p);
628 if (err)
629 return err;
630 err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info));
631 if (err)
632 return -EFAULT;
633 return err;
634}
635#endif
636/*
637 * ioctl
638 */
639static int cciss_ioctl(struct inode *inode, struct file *filep,
640 unsigned int cmd, unsigned long arg)
641{
642 struct block_device *bdev = inode->i_bdev;
643 struct gendisk *disk = bdev->bd_disk;
644 ctlr_info_t *host = get_host(disk);
645 drive_info_struct *drv = get_drv(disk);
646 int ctlr = host->ctlr;
647 void __user *argp = (void __user *)arg;
648
649#ifdef CCISS_DEBUG
650 printk(KERN_DEBUG "cciss_ioctl: Called with cmd=%x %lx\n", cmd, arg);
651#endif /* CCISS_DEBUG */
652
653 switch(cmd) {
654 case HDIO_GETGEO:
655 {
656 struct hd_geometry driver_geo;
657 if (drv->cylinders) {
658 driver_geo.heads = drv->heads;
659 driver_geo.sectors = drv->sectors;
660 driver_geo.cylinders = drv->cylinders;
661 } else
662 return -ENXIO;
663 driver_geo.start= get_start_sect(inode->i_bdev);
664 if (copy_to_user(argp, &driver_geo, sizeof(struct hd_geometry)))
665 return -EFAULT;
666 return(0);
667 }
668
669 case CCISS_GETPCIINFO:
670 {
671 cciss_pci_info_struct pciinfo;
672
673 if (!arg) return -EINVAL;
Mike Millercd6fb582005-06-27 14:36:49 -0700674 pciinfo.domain = pci_domain_nr(host->pdev->bus);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700675 pciinfo.bus = host->pdev->bus->number;
676 pciinfo.dev_fn = host->pdev->devfn;
677 pciinfo.board_id = host->board_id;
678 if (copy_to_user(argp, &pciinfo, sizeof( cciss_pci_info_struct )))
679 return -EFAULT;
680 return(0);
681 }
682 case CCISS_GETINTINFO:
683 {
684 cciss_coalint_struct intinfo;
685 if (!arg) return -EINVAL;
686 intinfo.delay = readl(&host->cfgtable->HostWrite.CoalIntDelay);
687 intinfo.count = readl(&host->cfgtable->HostWrite.CoalIntCount);
688 if (copy_to_user(argp, &intinfo, sizeof( cciss_coalint_struct )))
689 return -EFAULT;
690 return(0);
691 }
692 case CCISS_SETINTINFO:
693 {
694 cciss_coalint_struct intinfo;
695 unsigned long flags;
696 int i;
697
698 if (!arg) return -EINVAL;
699 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
700 if (copy_from_user(&intinfo, argp, sizeof( cciss_coalint_struct)))
701 return -EFAULT;
702 if ( (intinfo.delay == 0 ) && (intinfo.count == 0))
703
704 {
705// printk("cciss_ioctl: delay and count cannot be 0\n");
706 return( -EINVAL);
707 }
708 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
709 /* Update the field, and then ring the doorbell */
710 writel( intinfo.delay,
711 &(host->cfgtable->HostWrite.CoalIntDelay));
712 writel( intinfo.count,
713 &(host->cfgtable->HostWrite.CoalIntCount));
714 writel( CFGTBL_ChangeReq, host->vaddr + SA5_DOORBELL);
715
716 for(i=0;i<MAX_IOCTL_CONFIG_WAIT;i++) {
717 if (!(readl(host->vaddr + SA5_DOORBELL)
718 & CFGTBL_ChangeReq))
719 break;
720 /* delay and try again */
721 udelay(1000);
722 }
723 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
724 if (i >= MAX_IOCTL_CONFIG_WAIT)
725 return -EAGAIN;
726 return(0);
727 }
728 case CCISS_GETNODENAME:
729 {
730 NodeName_type NodeName;
731 int i;
732
733 if (!arg) return -EINVAL;
734 for(i=0;i<16;i++)
735 NodeName[i] = readb(&host->cfgtable->ServerName[i]);
736 if (copy_to_user(argp, NodeName, sizeof( NodeName_type)))
737 return -EFAULT;
738 return(0);
739 }
740 case CCISS_SETNODENAME:
741 {
742 NodeName_type NodeName;
743 unsigned long flags;
744 int i;
745
746 if (!arg) return -EINVAL;
747 if (!capable(CAP_SYS_ADMIN)) return -EPERM;
748
749 if (copy_from_user(NodeName, argp, sizeof( NodeName_type)))
750 return -EFAULT;
751
752 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
753
754 /* Update the field, and then ring the doorbell */
755 for(i=0;i<16;i++)
756 writeb( NodeName[i], &host->cfgtable->ServerName[i]);
757
758 writel( CFGTBL_ChangeReq, host->vaddr + SA5_DOORBELL);
759
760 for(i=0;i<MAX_IOCTL_CONFIG_WAIT;i++) {
761 if (!(readl(host->vaddr + SA5_DOORBELL)
762 & CFGTBL_ChangeReq))
763 break;
764 /* delay and try again */
765 udelay(1000);
766 }
767 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
768 if (i >= MAX_IOCTL_CONFIG_WAIT)
769 return -EAGAIN;
770 return(0);
771 }
772
773 case CCISS_GETHEARTBEAT:
774 {
775 Heartbeat_type heartbeat;
776
777 if (!arg) return -EINVAL;
778 heartbeat = readl(&host->cfgtable->HeartBeat);
779 if (copy_to_user(argp, &heartbeat, sizeof( Heartbeat_type)))
780 return -EFAULT;
781 return(0);
782 }
783 case CCISS_GETBUSTYPES:
784 {
785 BusTypes_type BusTypes;
786
787 if (!arg) return -EINVAL;
788 BusTypes = readl(&host->cfgtable->BusTypes);
789 if (copy_to_user(argp, &BusTypes, sizeof( BusTypes_type) ))
790 return -EFAULT;
791 return(0);
792 }
793 case CCISS_GETFIRMVER:
794 {
795 FirmwareVer_type firmware;
796
797 if (!arg) return -EINVAL;
798 memcpy(firmware, host->firm_ver, 4);
799
800 if (copy_to_user(argp, firmware, sizeof( FirmwareVer_type)))
801 return -EFAULT;
802 return(0);
803 }
804 case CCISS_GETDRIVVER:
805 {
806 DriverVer_type DriverVer = DRIVER_VERSION;
807
808 if (!arg) return -EINVAL;
809
810 if (copy_to_user(argp, &DriverVer, sizeof( DriverVer_type) ))
811 return -EFAULT;
812 return(0);
813 }
814
815 case CCISS_REVALIDVOLS:
816 if (bdev != bdev->bd_contains || drv != host->drv)
817 return -ENXIO;
818 return revalidate_allvol(host);
819
820 case CCISS_GETLUNINFO: {
821 LogvolInfo_struct luninfo;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822
823 luninfo.LunID = drv->LunID;
824 luninfo.num_opens = drv->usage_count;
825 luninfo.num_parts = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700826 if (copy_to_user(argp, &luninfo,
827 sizeof(LogvolInfo_struct)))
828 return -EFAULT;
829 return(0);
830 }
831 case CCISS_DEREGDISK:
Mike Millerddd47442005-09-13 01:25:22 -0700832 return rebuild_lun_table(host, disk);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700833
834 case CCISS_REGNEWD:
Mike Millerddd47442005-09-13 01:25:22 -0700835 return rebuild_lun_table(host, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700836
837 case CCISS_PASSTHRU:
838 {
839 IOCTL_Command_struct iocommand;
840 CommandList_struct *c;
841 char *buff = NULL;
842 u64bit temp64;
843 unsigned long flags;
844 DECLARE_COMPLETION(wait);
845
846 if (!arg) return -EINVAL;
847
848 if (!capable(CAP_SYS_RAWIO)) return -EPERM;
849
850 if (copy_from_user(&iocommand, argp, sizeof( IOCTL_Command_struct) ))
851 return -EFAULT;
852 if((iocommand.buf_size < 1) &&
853 (iocommand.Request.Type.Direction != XFER_NONE))
854 {
855 return -EINVAL;
856 }
857#if 0 /* 'buf_size' member is 16-bits, and always smaller than kmalloc limit */
858 /* Check kmalloc limits */
859 if(iocommand.buf_size > 128000)
860 return -EINVAL;
861#endif
862 if(iocommand.buf_size > 0)
863 {
864 buff = kmalloc(iocommand.buf_size, GFP_KERNEL);
865 if( buff == NULL)
866 return -EFAULT;
867 }
868 if (iocommand.Request.Type.Direction == XFER_WRITE)
869 {
870 /* Copy the data into the buffer we created */
871 if (copy_from_user(buff, iocommand.buf, iocommand.buf_size))
872 {
873 kfree(buff);
874 return -EFAULT;
875 }
876 } else {
877 memset(buff, 0, iocommand.buf_size);
878 }
879 if ((c = cmd_alloc(host , 0)) == NULL)
880 {
881 kfree(buff);
882 return -ENOMEM;
883 }
884 // Fill in the command type
885 c->cmd_type = CMD_IOCTL_PEND;
886 // Fill in Command Header
887 c->Header.ReplyQueue = 0; // unused in simple mode
888 if( iocommand.buf_size > 0) // buffer to fill
889 {
890 c->Header.SGList = 1;
891 c->Header.SGTotal= 1;
892 } else // no buffers to fill
893 {
894 c->Header.SGList = 0;
895 c->Header.SGTotal= 0;
896 }
897 c->Header.LUN = iocommand.LUN_info;
898 c->Header.Tag.lower = c->busaddr; // use the kernel address the cmd block for tag
899
900 // Fill in Request block
901 c->Request = iocommand.Request;
902
903 // Fill in the scatter gather information
904 if (iocommand.buf_size > 0 )
905 {
906 temp64.val = pci_map_single( host->pdev, buff,
907 iocommand.buf_size,
908 PCI_DMA_BIDIRECTIONAL);
909 c->SG[0].Addr.lower = temp64.val32.lower;
910 c->SG[0].Addr.upper = temp64.val32.upper;
911 c->SG[0].Len = iocommand.buf_size;
912 c->SG[0].Ext = 0; // we are not chaining
913 }
914 c->waiting = &wait;
915
916 /* Put the request on the tail of the request queue */
917 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
918 addQ(&host->reqQ, c);
919 host->Qdepth++;
920 start_io(host);
921 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
922
923 wait_for_completion(&wait);
924
925 /* unlock the buffers from DMA */
926 temp64.val32.lower = c->SG[0].Addr.lower;
927 temp64.val32.upper = c->SG[0].Addr.upper;
928 pci_unmap_single( host->pdev, (dma_addr_t) temp64.val,
929 iocommand.buf_size, PCI_DMA_BIDIRECTIONAL);
930
931 /* Copy the error information out */
932 iocommand.error_info = *(c->err_info);
933 if ( copy_to_user(argp, &iocommand, sizeof( IOCTL_Command_struct) ) )
934 {
935 kfree(buff);
936 cmd_free(host, c, 0);
937 return( -EFAULT);
938 }
939
940 if (iocommand.Request.Type.Direction == XFER_READ)
941 {
942 /* Copy the data out of the buffer we created */
943 if (copy_to_user(iocommand.buf, buff, iocommand.buf_size))
944 {
945 kfree(buff);
946 cmd_free(host, c, 0);
947 return -EFAULT;
948 }
949 }
950 kfree(buff);
951 cmd_free(host, c, 0);
952 return(0);
953 }
954 case CCISS_BIG_PASSTHRU: {
955 BIG_IOCTL_Command_struct *ioc;
956 CommandList_struct *c;
957 unsigned char **buff = NULL;
958 int *buff_size = NULL;
959 u64bit temp64;
960 unsigned long flags;
961 BYTE sg_used = 0;
962 int status = 0;
963 int i;
964 DECLARE_COMPLETION(wait);
965 __u32 left;
966 __u32 sz;
967 BYTE __user *data_ptr;
968
969 if (!arg)
970 return -EINVAL;
971 if (!capable(CAP_SYS_RAWIO))
972 return -EPERM;
973 ioc = (BIG_IOCTL_Command_struct *)
974 kmalloc(sizeof(*ioc), GFP_KERNEL);
975 if (!ioc) {
976 status = -ENOMEM;
977 goto cleanup1;
978 }
979 if (copy_from_user(ioc, argp, sizeof(*ioc))) {
980 status = -EFAULT;
981 goto cleanup1;
982 }
983 if ((ioc->buf_size < 1) &&
984 (ioc->Request.Type.Direction != XFER_NONE)) {
985 status = -EINVAL;
986 goto cleanup1;
987 }
988 /* Check kmalloc limits using all SGs */
989 if (ioc->malloc_size > MAX_KMALLOC_SIZE) {
990 status = -EINVAL;
991 goto cleanup1;
992 }
993 if (ioc->buf_size > ioc->malloc_size * MAXSGENTRIES) {
994 status = -EINVAL;
995 goto cleanup1;
996 }
997 buff = (unsigned char **) kmalloc(MAXSGENTRIES *
998 sizeof(char *), GFP_KERNEL);
999 if (!buff) {
1000 status = -ENOMEM;
1001 goto cleanup1;
1002 }
1003 memset(buff, 0, MAXSGENTRIES);
1004 buff_size = (int *) kmalloc(MAXSGENTRIES * sizeof(int),
1005 GFP_KERNEL);
1006 if (!buff_size) {
1007 status = -ENOMEM;
1008 goto cleanup1;
1009 }
1010 left = ioc->buf_size;
1011 data_ptr = ioc->buf;
1012 while (left) {
1013 sz = (left > ioc->malloc_size) ? ioc->malloc_size : left;
1014 buff_size[sg_used] = sz;
1015 buff[sg_used] = kmalloc(sz, GFP_KERNEL);
1016 if (buff[sg_used] == NULL) {
1017 status = -ENOMEM;
1018 goto cleanup1;
1019 }
Jens Axboe15534d32005-11-18 22:02:44 +01001020 if (ioc->Request.Type.Direction == XFER_WRITE) {
1021 if (copy_from_user(buff[sg_used], data_ptr, sz)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001022 status = -ENOMEM;
Jens Axboe15534d32005-11-18 22:02:44 +01001023 goto cleanup1;
1024 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001025 } else {
1026 memset(buff[sg_used], 0, sz);
1027 }
1028 left -= sz;
1029 data_ptr += sz;
1030 sg_used++;
1031 }
1032 if ((c = cmd_alloc(host , 0)) == NULL) {
1033 status = -ENOMEM;
1034 goto cleanup1;
1035 }
1036 c->cmd_type = CMD_IOCTL_PEND;
1037 c->Header.ReplyQueue = 0;
1038
1039 if( ioc->buf_size > 0) {
1040 c->Header.SGList = sg_used;
1041 c->Header.SGTotal= sg_used;
1042 } else {
1043 c->Header.SGList = 0;
1044 c->Header.SGTotal= 0;
1045 }
1046 c->Header.LUN = ioc->LUN_info;
1047 c->Header.Tag.lower = c->busaddr;
1048
1049 c->Request = ioc->Request;
1050 if (ioc->buf_size > 0 ) {
1051 int i;
1052 for(i=0; i<sg_used; i++) {
1053 temp64.val = pci_map_single( host->pdev, buff[i],
1054 buff_size[i],
1055 PCI_DMA_BIDIRECTIONAL);
1056 c->SG[i].Addr.lower = temp64.val32.lower;
1057 c->SG[i].Addr.upper = temp64.val32.upper;
1058 c->SG[i].Len = buff_size[i];
1059 c->SG[i].Ext = 0; /* we are not chaining */
1060 }
1061 }
1062 c->waiting = &wait;
1063 /* Put the request on the tail of the request queue */
1064 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1065 addQ(&host->reqQ, c);
1066 host->Qdepth++;
1067 start_io(host);
1068 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1069 wait_for_completion(&wait);
1070 /* unlock the buffers from DMA */
1071 for(i=0; i<sg_used; i++) {
1072 temp64.val32.lower = c->SG[i].Addr.lower;
1073 temp64.val32.upper = c->SG[i].Addr.upper;
1074 pci_unmap_single( host->pdev, (dma_addr_t) temp64.val,
1075 buff_size[i], PCI_DMA_BIDIRECTIONAL);
1076 }
1077 /* Copy the error information out */
1078 ioc->error_info = *(c->err_info);
1079 if (copy_to_user(argp, ioc, sizeof(*ioc))) {
1080 cmd_free(host, c, 0);
1081 status = -EFAULT;
1082 goto cleanup1;
1083 }
1084 if (ioc->Request.Type.Direction == XFER_READ) {
1085 /* Copy the data out of the buffer we created */
1086 BYTE __user *ptr = ioc->buf;
1087 for(i=0; i< sg_used; i++) {
1088 if (copy_to_user(ptr, buff[i], buff_size[i])) {
1089 cmd_free(host, c, 0);
1090 status = -EFAULT;
1091 goto cleanup1;
1092 }
1093 ptr += buff_size[i];
1094 }
1095 }
1096 cmd_free(host, c, 0);
1097 status = 0;
1098cleanup1:
1099 if (buff) {
1100 for(i=0; i<sg_used; i++)
Jesper Juhl6044ec82005-11-07 01:01:32 -08001101 kfree(buff[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001102 kfree(buff);
1103 }
Jesper Juhl6044ec82005-11-07 01:01:32 -08001104 kfree(buff_size);
1105 kfree(ioc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001106 return(status);
1107 }
1108 default:
1109 return -ENOTTY;
1110 }
1111
1112}
1113
1114/*
1115 * revalidate_allvol is for online array config utilities. After a
1116 * utility reconfigures the drives in the array, it can use this function
1117 * (through an ioctl) to make the driver zap any previous disk structs for
1118 * that controller and get new ones.
1119 *
1120 * Right now I'm using the getgeometry() function to do this, but this
1121 * function should probably be finer grained and allow you to revalidate one
1122 * particualar logical volume (instead of all of them on a particular
1123 * controller).
1124 */
1125static int revalidate_allvol(ctlr_info_t *host)
1126{
1127 int ctlr = host->ctlr, i;
1128 unsigned long flags;
1129
1130 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1131 if (host->usage_count > 1) {
1132 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1133 printk(KERN_WARNING "cciss: Device busy for volume"
1134 " revalidation (usage=%d)\n", host->usage_count);
1135 return -EBUSY;
1136 }
1137 host->usage_count++;
1138 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1139
1140 for(i=0; i< NWD; i++) {
1141 struct gendisk *disk = host->gendisk[i];
1142 if (disk->flags & GENHD_FL_UP)
1143 del_gendisk(disk);
1144 }
1145
1146 /*
1147 * Set the partition and block size structures for all volumes
1148 * on this controller to zero. We will reread all of this data
1149 */
1150 memset(host->drv, 0, sizeof(drive_info_struct)
1151 * CISS_MAX_LUN);
1152 /*
1153 * Tell the array controller not to give us any interrupts while
1154 * we check the new geometry. Then turn interrupts back on when
1155 * we're done.
1156 */
1157 host->access.set_intr_mask(host, CCISS_INTR_OFF);
1158 cciss_getgeometry(ctlr);
1159 host->access.set_intr_mask(host, CCISS_INTR_ON);
1160
1161 /* Loop through each real device */
1162 for (i = 0; i < NWD; i++) {
1163 struct gendisk *disk = host->gendisk[i];
1164 drive_info_struct *drv = &(host->drv[i]);
1165 /* we must register the controller even if no disks exist */
1166 /* this is for the online array utilities */
1167 if (!drv->heads && i)
1168 continue;
Mike Millerad2b9312005-07-28 01:07:31 -07001169 blk_queue_hardsect_size(drv->queue, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001170 set_capacity(disk, drv->nr_blocks);
1171 add_disk(disk);
1172 }
1173 host->usage_count--;
1174 return 0;
1175}
1176
Mike Millerddd47442005-09-13 01:25:22 -07001177/* This function will check the usage_count of the drive to be updated/added.
1178 * If the usage_count is zero then the drive information will be updated and
1179 * the disk will be re-registered with the kernel. If not then it will be
1180 * left alone for the next reboot. The exception to this is disk 0 which
1181 * will always be left registered with the kernel since it is also the
1182 * controller node. Any changes to disk 0 will show up on the next
1183 * reboot.
1184*/
1185static void cciss_update_drive_info(int ctlr, int drv_index)
1186 {
1187 ctlr_info_t *h = hba[ctlr];
1188 struct gendisk *disk;
1189 ReadCapdata_struct *size_buff = NULL;
1190 InquiryData_struct *inq_buff = NULL;
1191 unsigned int block_size;
1192 unsigned int total_size;
1193 unsigned long flags = 0;
1194 int ret = 0;
1195
1196 /* if the disk already exists then deregister it before proceeding*/
1197 if (h->drv[drv_index].raid_level != -1){
1198 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
1199 h->drv[drv_index].busy_configuring = 1;
1200 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1201 ret = deregister_disk(h->gendisk[drv_index],
1202 &h->drv[drv_index], 0);
1203 h->drv[drv_index].busy_configuring = 0;
1204 }
1205
1206 /* If the disk is in use return */
1207 if (ret)
1208 return;
1209
1210
1211 /* Get information about the disk and modify the driver sturcture */
1212 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
1213 if (size_buff == NULL)
1214 goto mem_msg;
1215 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
1216 if (inq_buff == NULL)
1217 goto mem_msg;
1218
1219 cciss_read_capacity(ctlr, drv_index, size_buff, 1,
1220 &total_size, &block_size);
1221 cciss_geometry_inquiry(ctlr, drv_index, 1, total_size, block_size,
1222 inq_buff, &h->drv[drv_index]);
1223
1224 ++h->num_luns;
1225 disk = h->gendisk[drv_index];
1226 set_capacity(disk, h->drv[drv_index].nr_blocks);
1227
1228
1229 /* if it's the controller it's already added */
1230 if (drv_index){
1231 disk->queue = blk_init_queue(do_cciss_request, &h->lock);
1232
1233 /* Set up queue information */
1234 disk->queue->backing_dev_info.ra_pages = READ_AHEAD;
1235 blk_queue_bounce_limit(disk->queue, hba[ctlr]->pdev->dma_mask);
1236
1237 /* This is a hardware imposed limit. */
1238 blk_queue_max_hw_segments(disk->queue, MAXSGENTRIES);
1239
1240 /* This is a limit in the driver and could be eliminated. */
1241 blk_queue_max_phys_segments(disk->queue, MAXSGENTRIES);
1242
1243 blk_queue_max_sectors(disk->queue, 512);
1244
1245 disk->queue->queuedata = hba[ctlr];
1246
1247 blk_queue_hardsect_size(disk->queue,
1248 hba[ctlr]->drv[drv_index].block_size);
1249
1250 h->drv[drv_index].queue = disk->queue;
1251 add_disk(disk);
1252 }
1253
1254freeret:
1255 kfree(size_buff);
1256 kfree(inq_buff);
1257 return;
1258mem_msg:
1259 printk(KERN_ERR "cciss: out of memory\n");
1260 goto freeret;
1261}
1262
1263/* This function will find the first index of the controllers drive array
1264 * that has a -1 for the raid_level and will return that index. This is
1265 * where new drives will be added. If the index to be returned is greater
1266 * than the highest_lun index for the controller then highest_lun is set
1267 * to this new index. If there are no available indexes then -1 is returned.
1268*/
1269static int cciss_find_free_drive_index(int ctlr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001270{
Mike Millerddd47442005-09-13 01:25:22 -07001271 int i;
1272
1273 for (i=0; i < CISS_MAX_LUN; i++){
1274 if (hba[ctlr]->drv[i].raid_level == -1){
1275 if (i > hba[ctlr]->highest_lun)
1276 hba[ctlr]->highest_lun = i;
1277 return i;
1278 }
1279 }
1280 return -1;
1281}
1282
1283/* This function will add and remove logical drives from the Logical
1284 * drive array of the controller and maintain persistancy of ordering
1285 * so that mount points are preserved until the next reboot. This allows
1286 * for the removal of logical drives in the middle of the drive array
1287 * without a re-ordering of those drives.
1288 * INPUT
1289 * h = The controller to perform the operations on
1290 * del_disk = The disk to remove if specified. If the value given
1291 * is NULL then no disk is removed.
1292*/
1293static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk)
1294{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001295 int ctlr = h->ctlr;
Mike Millerddd47442005-09-13 01:25:22 -07001296 int num_luns;
1297 ReportLunData_struct *ld_buff = NULL;
1298 drive_info_struct *drv = NULL;
1299 int return_code;
1300 int listlength = 0;
1301 int i;
1302 int drv_found;
1303 int drv_index = 0;
1304 __u32 lunid = 0;
1305 unsigned long flags;
1306
1307 /* Set busy_configuring flag for this operation */
1308 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
1309 if (h->num_luns >= CISS_MAX_LUN){
1310 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1311 return -EINVAL;
1312 }
1313
1314 if (h->busy_configuring){
1315 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1316 return -EBUSY;
1317 }
1318 h->busy_configuring = 1;
1319
1320 /* if del_disk is NULL then we are being called to add a new disk
1321 * and update the logical drive table. If it is not NULL then
1322 * we will check if the disk is in use or not.
1323 */
1324 if (del_disk != NULL){
1325 drv = get_drv(del_disk);
1326 drv->busy_configuring = 1;
1327 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1328 return_code = deregister_disk(del_disk, drv, 1);
1329 drv->busy_configuring = 0;
1330 h->busy_configuring = 0;
1331 return return_code;
1332 } else {
1333 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1334 if (!capable(CAP_SYS_RAWIO))
1335 return -EPERM;
1336
1337 ld_buff = kzalloc(sizeof(ReportLunData_struct), GFP_KERNEL);
1338 if (ld_buff == NULL)
1339 goto mem_msg;
1340
1341 return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff,
1342 sizeof(ReportLunData_struct), 0, 0, 0,
1343 TYPE_CMD);
1344
1345 if (return_code == IO_OK){
1346 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24;
1347 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16;
1348 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8;
1349 listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]);
1350 } else{ /* reading number of logical volumes failed */
1351 printk(KERN_WARNING "cciss: report logical volume"
1352 " command failed\n");
1353 listlength = 0;
1354 goto freeret;
1355 }
1356
1357 num_luns = listlength / 8; /* 8 bytes per entry */
1358 if (num_luns > CISS_MAX_LUN){
1359 num_luns = CISS_MAX_LUN;
1360 printk(KERN_WARNING "cciss: more luns configured"
1361 " on controller than can be handled by"
1362 " this driver.\n");
1363 }
1364
1365 /* Compare controller drive array to drivers drive array.
1366 * Check for updates in the drive information and any new drives
1367 * on the controller.
1368 */
1369 for (i=0; i < num_luns; i++){
1370 int j;
1371
1372 drv_found = 0;
1373
1374 lunid = (0xff &
1375 (unsigned int)(ld_buff->LUN[i][3])) << 24;
1376 lunid |= (0xff &
1377 (unsigned int)(ld_buff->LUN[i][2])) << 16;
1378 lunid |= (0xff &
1379 (unsigned int)(ld_buff->LUN[i][1])) << 8;
1380 lunid |= 0xff &
1381 (unsigned int)(ld_buff->LUN[i][0]);
1382
1383 /* Find if the LUN is already in the drive array
1384 * of the controller. If so then update its info
1385 * if not is use. If it does not exist then find
1386 * the first free index and add it.
1387 */
1388 for (j=0; j <= h->highest_lun; j++){
1389 if (h->drv[j].LunID == lunid){
1390 drv_index = j;
1391 drv_found = 1;
1392 }
1393 }
1394
1395 /* check if the drive was found already in the array */
1396 if (!drv_found){
1397 drv_index = cciss_find_free_drive_index(ctlr);
1398 if (drv_index == -1)
1399 goto freeret;
1400
1401 }
1402 h->drv[drv_index].LunID = lunid;
1403 cciss_update_drive_info(ctlr, drv_index);
1404 } /* end for */
1405 } /* end else */
1406
1407freeret:
1408 kfree(ld_buff);
1409 h->busy_configuring = 0;
1410 /* We return -1 here to tell the ACU that we have registered/updated
1411 * all of the drives that we can and to keep it from calling us
1412 * additional times.
1413 */
1414 return -1;
1415mem_msg:
1416 printk(KERN_ERR "cciss: out of memory\n");
1417 goto freeret;
1418}
1419
1420/* This function will deregister the disk and it's queue from the
1421 * kernel. It must be called with the controller lock held and the
1422 * drv structures busy_configuring flag set. It's parameters are:
1423 *
1424 * disk = This is the disk to be deregistered
1425 * drv = This is the drive_info_struct associated with the disk to be
1426 * deregistered. It contains information about the disk used
1427 * by the driver.
1428 * clear_all = This flag determines whether or not the disk information
1429 * is going to be completely cleared out and the highest_lun
1430 * reset. Sometimes we want to clear out information about
1431 * the disk in preperation for re-adding it. In this case
1432 * the highest_lun should be left unchanged and the LunID
1433 * should not be cleared.
1434*/
1435static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
1436 int clear_all)
1437{
1438 ctlr_info_t *h = get_host(disk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001439
1440 if (!capable(CAP_SYS_RAWIO))
1441 return -EPERM;
1442
Linus Torvalds1da177e2005-04-16 15:20:36 -07001443 /* make sure logical volume is NOT is use */
Mike Millerddd47442005-09-13 01:25:22 -07001444 if(clear_all || (h->gendisk[0] == disk)) {
1445 if (drv->usage_count > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446 return -EBUSY;
1447 }
Mike Millerddd47442005-09-13 01:25:22 -07001448 else
1449 if( drv->usage_count > 0 )
1450 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001451
Mike Millerddd47442005-09-13 01:25:22 -07001452 /* invalidate the devices and deregister the disk. If it is disk
1453 * zero do not deregister it but just zero out it's values. This
1454 * allows us to delete disk zero but keep the controller registered.
1455 */
1456 if (h->gendisk[0] != disk){
1457 if (disk->flags & GENHD_FL_UP){
1458 blk_cleanup_queue(disk->queue);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001459 del_gendisk(disk);
Mike Millerddd47442005-09-13 01:25:22 -07001460 drv->queue = NULL;
1461 }
1462 }
1463
1464 --h->num_luns;
1465 /* zero out the disk size info */
1466 drv->nr_blocks = 0;
1467 drv->block_size = 0;
1468 drv->heads = 0;
1469 drv->sectors = 0;
1470 drv->cylinders = 0;
1471 drv->raid_level = -1; /* This can be used as a flag variable to
1472 * indicate that this element of the drive
1473 * array is free.
1474 */
1475
1476 if (clear_all){
Linus Torvalds1da177e2005-04-16 15:20:36 -07001477 /* check to see if it was the last disk */
1478 if (drv == h->drv + h->highest_lun) {
1479 /* if so, find the new hightest lun */
1480 int i, newhighest =-1;
1481 for(i=0; i<h->highest_lun; i++) {
1482 /* if the disk has size > 0, it is available */
Mike Millerddd47442005-09-13 01:25:22 -07001483 if (h->drv[i].heads)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001484 newhighest = i;
1485 }
1486 h->highest_lun = newhighest;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001487 }
Mike Millerddd47442005-09-13 01:25:22 -07001488
Linus Torvalds1da177e2005-04-16 15:20:36 -07001489 drv->LunID = 0;
Mike Millerddd47442005-09-13 01:25:22 -07001490 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491 return(0);
1492}
Mike Millerddd47442005-09-13 01:25:22 -07001493
Linus Torvalds1da177e2005-04-16 15:20:36 -07001494static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff,
1495 size_t size,
1496 unsigned int use_unit_num, /* 0: address the controller,
1497 1: address logical volume log_unit,
1498 2: periph device address is scsi3addr */
1499 unsigned int log_unit, __u8 page_code, unsigned char *scsi3addr,
1500 int cmd_type)
1501{
1502 ctlr_info_t *h= hba[ctlr];
1503 u64bit buff_dma_handle;
1504 int status = IO_OK;
1505
1506 c->cmd_type = CMD_IOCTL_PEND;
1507 c->Header.ReplyQueue = 0;
1508 if( buff != NULL) {
1509 c->Header.SGList = 1;
1510 c->Header.SGTotal= 1;
1511 } else {
1512 c->Header.SGList = 0;
1513 c->Header.SGTotal= 0;
1514 }
1515 c->Header.Tag.lower = c->busaddr;
1516
1517 c->Request.Type.Type = cmd_type;
1518 if (cmd_type == TYPE_CMD) {
1519 switch(cmd) {
1520 case CISS_INQUIRY:
1521 /* If the logical unit number is 0 then, this is going
1522 to controller so It's a physical command
1523 mode = 0 target = 0. So we have nothing to write.
1524 otherwise, if use_unit_num == 1,
1525 mode = 1(volume set addressing) target = LUNID
1526 otherwise, if use_unit_num == 2,
1527 mode = 0(periph dev addr) target = scsi3addr */
1528 if (use_unit_num == 1) {
1529 c->Header.LUN.LogDev.VolId=
1530 h->drv[log_unit].LunID;
1531 c->Header.LUN.LogDev.Mode = 1;
1532 } else if (use_unit_num == 2) {
1533 memcpy(c->Header.LUN.LunAddrBytes,scsi3addr,8);
1534 c->Header.LUN.LogDev.Mode = 0;
1535 }
1536 /* are we trying to read a vital product page */
1537 if(page_code != 0) {
1538 c->Request.CDB[1] = 0x01;
1539 c->Request.CDB[2] = page_code;
1540 }
1541 c->Request.CDBLen = 6;
1542 c->Request.Type.Attribute = ATTR_SIMPLE;
1543 c->Request.Type.Direction = XFER_READ;
1544 c->Request.Timeout = 0;
1545 c->Request.CDB[0] = CISS_INQUIRY;
1546 c->Request.CDB[4] = size & 0xFF;
1547 break;
1548 case CISS_REPORT_LOG:
1549 case CISS_REPORT_PHYS:
1550 /* Talking to controller so It's a physical command
1551 mode = 00 target = 0. Nothing to write.
1552 */
1553 c->Request.CDBLen = 12;
1554 c->Request.Type.Attribute = ATTR_SIMPLE;
1555 c->Request.Type.Direction = XFER_READ;
1556 c->Request.Timeout = 0;
1557 c->Request.CDB[0] = cmd;
1558 c->Request.CDB[6] = (size >> 24) & 0xFF; //MSB
1559 c->Request.CDB[7] = (size >> 16) & 0xFF;
1560 c->Request.CDB[8] = (size >> 8) & 0xFF;
1561 c->Request.CDB[9] = size & 0xFF;
1562 break;
1563
1564 case CCISS_READ_CAPACITY:
1565 c->Header.LUN.LogDev.VolId = h->drv[log_unit].LunID;
1566 c->Header.LUN.LogDev.Mode = 1;
1567 c->Request.CDBLen = 10;
1568 c->Request.Type.Attribute = ATTR_SIMPLE;
1569 c->Request.Type.Direction = XFER_READ;
1570 c->Request.Timeout = 0;
1571 c->Request.CDB[0] = cmd;
1572 break;
1573 case CCISS_CACHE_FLUSH:
1574 c->Request.CDBLen = 12;
1575 c->Request.Type.Attribute = ATTR_SIMPLE;
1576 c->Request.Type.Direction = XFER_WRITE;
1577 c->Request.Timeout = 0;
1578 c->Request.CDB[0] = BMIC_WRITE;
1579 c->Request.CDB[6] = BMIC_CACHE_FLUSH;
1580 break;
1581 default:
1582 printk(KERN_WARNING
1583 "cciss%d: Unknown Command 0x%c\n", ctlr, cmd);
1584 return(IO_ERROR);
1585 }
1586 } else if (cmd_type == TYPE_MSG) {
1587 switch (cmd) {
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001588 case 0: /* ABORT message */
1589 c->Request.CDBLen = 12;
1590 c->Request.Type.Attribute = ATTR_SIMPLE;
1591 c->Request.Type.Direction = XFER_WRITE;
1592 c->Request.Timeout = 0;
1593 c->Request.CDB[0] = cmd; /* abort */
1594 c->Request.CDB[1] = 0; /* abort a command */
1595 /* buff contains the tag of the command to abort */
1596 memcpy(&c->Request.CDB[4], buff, 8);
1597 break;
1598 case 1: /* RESET message */
1599 c->Request.CDBLen = 12;
1600 c->Request.Type.Attribute = ATTR_SIMPLE;
1601 c->Request.Type.Direction = XFER_WRITE;
1602 c->Request.Timeout = 0;
1603 memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB));
1604 c->Request.CDB[0] = cmd; /* reset */
1605 c->Request.CDB[1] = 0x04; /* reset a LUN */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001606 case 3: /* No-Op message */
1607 c->Request.CDBLen = 1;
1608 c->Request.Type.Attribute = ATTR_SIMPLE;
1609 c->Request.Type.Direction = XFER_WRITE;
1610 c->Request.Timeout = 0;
1611 c->Request.CDB[0] = cmd;
1612 break;
1613 default:
1614 printk(KERN_WARNING
1615 "cciss%d: unknown message type %d\n",
1616 ctlr, cmd);
1617 return IO_ERROR;
1618 }
1619 } else {
1620 printk(KERN_WARNING
1621 "cciss%d: unknown command type %d\n", ctlr, cmd_type);
1622 return IO_ERROR;
1623 }
1624 /* Fill in the scatter gather information */
1625 if (size > 0) {
1626 buff_dma_handle.val = (__u64) pci_map_single(h->pdev,
1627 buff, size, PCI_DMA_BIDIRECTIONAL);
1628 c->SG[0].Addr.lower = buff_dma_handle.val32.lower;
1629 c->SG[0].Addr.upper = buff_dma_handle.val32.upper;
1630 c->SG[0].Len = size;
1631 c->SG[0].Ext = 0; /* we are not chaining */
1632 }
1633 return status;
1634}
1635static int sendcmd_withirq(__u8 cmd,
1636 int ctlr,
1637 void *buff,
1638 size_t size,
1639 unsigned int use_unit_num,
1640 unsigned int log_unit,
1641 __u8 page_code,
1642 int cmd_type)
1643{
1644 ctlr_info_t *h = hba[ctlr];
1645 CommandList_struct *c;
1646 u64bit buff_dma_handle;
1647 unsigned long flags;
1648 int return_status;
1649 DECLARE_COMPLETION(wait);
1650
1651 if ((c = cmd_alloc(h , 0)) == NULL)
1652 return -ENOMEM;
1653 return_status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num,
1654 log_unit, page_code, NULL, cmd_type);
1655 if (return_status != IO_OK) {
1656 cmd_free(h, c, 0);
1657 return return_status;
1658 }
1659resend_cmd2:
1660 c->waiting = &wait;
1661
1662 /* Put the request on the tail of the queue and send it */
1663 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1664 addQ(&h->reqQ, c);
1665 h->Qdepth++;
1666 start_io(h);
1667 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1668
1669 wait_for_completion(&wait);
1670
1671 if(c->err_info->CommandStatus != 0)
1672 { /* an error has occurred */
1673 switch(c->err_info->CommandStatus)
1674 {
1675 case CMD_TARGET_STATUS:
1676 printk(KERN_WARNING "cciss: cmd %p has "
1677 " completed with errors\n", c);
1678 if( c->err_info->ScsiStatus)
1679 {
1680 printk(KERN_WARNING "cciss: cmd %p "
1681 "has SCSI Status = %x\n",
1682 c,
1683 c->err_info->ScsiStatus);
1684 }
1685
1686 break;
1687 case CMD_DATA_UNDERRUN:
1688 case CMD_DATA_OVERRUN:
1689 /* expected for inquire and report lun commands */
1690 break;
1691 case CMD_INVALID:
1692 printk(KERN_WARNING "cciss: Cmd %p is "
1693 "reported invalid\n", c);
1694 return_status = IO_ERROR;
1695 break;
1696 case CMD_PROTOCOL_ERR:
1697 printk(KERN_WARNING "cciss: cmd %p has "
1698 "protocol error \n", c);
1699 return_status = IO_ERROR;
1700 break;
1701case CMD_HARDWARE_ERR:
1702 printk(KERN_WARNING "cciss: cmd %p had "
1703 " hardware error\n", c);
1704 return_status = IO_ERROR;
1705 break;
1706 case CMD_CONNECTION_LOST:
1707 printk(KERN_WARNING "cciss: cmd %p had "
1708 "connection lost\n", c);
1709 return_status = IO_ERROR;
1710 break;
1711 case CMD_ABORTED:
1712 printk(KERN_WARNING "cciss: cmd %p was "
1713 "aborted\n", c);
1714 return_status = IO_ERROR;
1715 break;
1716 case CMD_ABORT_FAILED:
1717 printk(KERN_WARNING "cciss: cmd %p reports "
1718 "abort failed\n", c);
1719 return_status = IO_ERROR;
1720 break;
1721 case CMD_UNSOLICITED_ABORT:
1722 printk(KERN_WARNING
1723 "cciss%d: unsolicited abort %p\n",
1724 ctlr, c);
1725 if (c->retry_count < MAX_CMD_RETRIES) {
1726 printk(KERN_WARNING
1727 "cciss%d: retrying %p\n",
1728 ctlr, c);
1729 c->retry_count++;
1730 /* erase the old error information */
1731 memset(c->err_info, 0,
1732 sizeof(ErrorInfo_struct));
1733 return_status = IO_OK;
1734 INIT_COMPLETION(wait);
1735 goto resend_cmd2;
1736 }
1737 return_status = IO_ERROR;
1738 break;
1739 default:
1740 printk(KERN_WARNING "cciss: cmd %p returned "
1741 "unknown status %x\n", c,
1742 c->err_info->CommandStatus);
1743 return_status = IO_ERROR;
1744 }
1745 }
1746 /* unlock the buffers from DMA */
Mike Millerbb2a37b2005-09-13 01:25:24 -07001747 buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
1748 buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001749 pci_unmap_single( h->pdev, (dma_addr_t) buff_dma_handle.val,
Mike Millerbb2a37b2005-09-13 01:25:24 -07001750 c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001751 cmd_free(h, c, 0);
1752 return(return_status);
1753
1754}
1755static void cciss_geometry_inquiry(int ctlr, int logvol,
1756 int withirq, unsigned int total_size,
1757 unsigned int block_size, InquiryData_struct *inq_buff,
1758 drive_info_struct *drv)
1759{
1760 int return_code;
1761 memset(inq_buff, 0, sizeof(InquiryData_struct));
1762 if (withirq)
1763 return_code = sendcmd_withirq(CISS_INQUIRY, ctlr,
1764 inq_buff, sizeof(*inq_buff), 1, logvol ,0xC1, TYPE_CMD);
1765 else
1766 return_code = sendcmd(CISS_INQUIRY, ctlr, inq_buff,
1767 sizeof(*inq_buff), 1, logvol ,0xC1, NULL, TYPE_CMD);
1768 if (return_code == IO_OK) {
1769 if(inq_buff->data_byte[8] == 0xFF) {
1770 printk(KERN_WARNING
1771 "cciss: reading geometry failed, volume "
1772 "does not support reading geometry\n");
1773 drv->block_size = block_size;
1774 drv->nr_blocks = total_size;
1775 drv->heads = 255;
1776 drv->sectors = 32; // Sectors per track
1777 drv->cylinders = total_size / 255 / 32;
1778 } else {
1779 unsigned int t;
1780
1781 drv->block_size = block_size;
1782 drv->nr_blocks = total_size;
1783 drv->heads = inq_buff->data_byte[6];
1784 drv->sectors = inq_buff->data_byte[7];
1785 drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8;
1786 drv->cylinders += inq_buff->data_byte[5];
1787 drv->raid_level = inq_buff->data_byte[8];
1788 t = drv->heads * drv->sectors;
1789 if (t > 1) {
1790 drv->cylinders = total_size/t;
1791 }
1792 }
1793 } else { /* Get geometry failed */
1794 printk(KERN_WARNING "cciss: reading geometry failed\n");
1795 }
1796 printk(KERN_INFO " heads= %d, sectors= %d, cylinders= %d\n\n",
1797 drv->heads, drv->sectors, drv->cylinders);
1798}
1799static void
1800cciss_read_capacity(int ctlr, int logvol, ReadCapdata_struct *buf,
1801 int withirq, unsigned int *total_size, unsigned int *block_size)
1802{
1803 int return_code;
1804 memset(buf, 0, sizeof(*buf));
1805 if (withirq)
1806 return_code = sendcmd_withirq(CCISS_READ_CAPACITY,
1807 ctlr, buf, sizeof(*buf), 1, logvol, 0, TYPE_CMD);
1808 else
1809 return_code = sendcmd(CCISS_READ_CAPACITY,
1810 ctlr, buf, sizeof(*buf), 1, logvol, 0, NULL, TYPE_CMD);
1811 if (return_code == IO_OK) {
1812 *total_size = be32_to_cpu(*((__be32 *) &buf->total_size[0]))+1;
1813 *block_size = be32_to_cpu(*((__be32 *) &buf->block_size[0]));
1814 } else { /* read capacity command failed */
1815 printk(KERN_WARNING "cciss: read capacity failed\n");
1816 *total_size = 0;
1817 *block_size = BLOCK_SIZE;
1818 }
1819 printk(KERN_INFO " blocks= %u block_size= %d\n",
1820 *total_size, *block_size);
1821 return;
1822}
1823
Linus Torvalds1da177e2005-04-16 15:20:36 -07001824static int cciss_revalidate(struct gendisk *disk)
1825{
1826 ctlr_info_t *h = get_host(disk);
1827 drive_info_struct *drv = get_drv(disk);
1828 int logvol;
1829 int FOUND=0;
1830 unsigned int block_size;
1831 unsigned int total_size;
1832 ReadCapdata_struct *size_buff = NULL;
1833 InquiryData_struct *inq_buff = NULL;
1834
1835 for(logvol=0; logvol < CISS_MAX_LUN; logvol++)
1836 {
1837 if(h->drv[logvol].LunID == drv->LunID) {
1838 FOUND=1;
1839 break;
1840 }
1841 }
1842
1843 if (!FOUND) return 1;
1844
1845 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
1846 if (size_buff == NULL)
1847 {
1848 printk(KERN_WARNING "cciss: out of memory\n");
1849 return 1;
1850 }
1851 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
1852 if (inq_buff == NULL)
1853 {
1854 printk(KERN_WARNING "cciss: out of memory\n");
1855 kfree(size_buff);
1856 return 1;
1857 }
1858
1859 cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, &block_size);
1860 cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, inq_buff, drv);
1861
Mike Millerad2b9312005-07-28 01:07:31 -07001862 blk_queue_hardsect_size(drv->queue, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001863 set_capacity(disk, drv->nr_blocks);
1864
1865 kfree(size_buff);
1866 kfree(inq_buff);
1867 return 0;
1868}
1869
1870/*
1871 * Wait polling for a command to complete.
1872 * The memory mapped FIFO is polled for the completion.
1873 * Used only at init time, interrupts from the HBA are disabled.
1874 */
1875static unsigned long pollcomplete(int ctlr)
1876{
1877 unsigned long done;
1878 int i;
1879
1880 /* Wait (up to 20 seconds) for a command to complete */
1881
1882 for (i = 20 * HZ; i > 0; i--) {
1883 done = hba[ctlr]->access.command_completed(hba[ctlr]);
Nishanth Aravamudan86e84862005-09-10 00:27:28 -07001884 if (done == FIFO_EMPTY)
1885 schedule_timeout_uninterruptible(1);
1886 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001887 return (done);
1888 }
1889 /* Invalid address to tell caller we ran out of time */
1890 return 1;
1891}
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001892
1893static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete)
1894{
1895 /* We get in here if sendcmd() is polling for completions
1896 and gets some command back that it wasn't expecting --
1897 something other than that which it just sent down.
1898 Ordinarily, that shouldn't happen, but it can happen when
1899 the scsi tape stuff gets into error handling mode, and
1900 starts using sendcmd() to try to abort commands and
1901 reset tape drives. In that case, sendcmd may pick up
1902 completions of commands that were sent to logical drives
1903 through the block i/o system, or cciss ioctls completing, etc.
1904 In that case, we need to save those completions for later
1905 processing by the interrupt handler.
1906 */
1907
1908#ifdef CONFIG_CISS_SCSI_TAPE
1909 struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects;
1910
1911 /* If it's not the scsi tape stuff doing error handling, (abort */
1912 /* or reset) then we don't expect anything weird. */
1913 if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) {
1914#endif
1915 printk( KERN_WARNING "cciss cciss%d: SendCmd "
1916 "Invalid command list address returned! (%lx)\n",
1917 ctlr, complete);
1918 /* not much we can do. */
1919#ifdef CONFIG_CISS_SCSI_TAPE
1920 return 1;
1921 }
1922
1923 /* We've sent down an abort or reset, but something else
1924 has completed */
1925 if (srl->ncompletions >= (NR_CMDS + 2)) {
1926 /* Uh oh. No room to save it for later... */
1927 printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, "
1928 "reject list overflow, command lost!\n", ctlr);
1929 return 1;
1930 }
1931 /* Save it for later */
1932 srl->complete[srl->ncompletions] = complete;
1933 srl->ncompletions++;
1934#endif
1935 return 0;
1936}
1937
Linus Torvalds1da177e2005-04-16 15:20:36 -07001938/*
1939 * Send a command to the controller, and wait for it to complete.
1940 * Only used at init time.
1941 */
1942static int sendcmd(
1943 __u8 cmd,
1944 int ctlr,
1945 void *buff,
1946 size_t size,
1947 unsigned int use_unit_num, /* 0: address the controller,
1948 1: address logical volume log_unit,
1949 2: periph device address is scsi3addr */
1950 unsigned int log_unit,
1951 __u8 page_code,
1952 unsigned char *scsi3addr,
1953 int cmd_type)
1954{
1955 CommandList_struct *c;
1956 int i;
1957 unsigned long complete;
1958 ctlr_info_t *info_p= hba[ctlr];
1959 u64bit buff_dma_handle;
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001960 int status, done = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001961
1962 if ((c = cmd_alloc(info_p, 1)) == NULL) {
1963 printk(KERN_WARNING "cciss: unable to get memory");
1964 return(IO_ERROR);
1965 }
1966 status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num,
1967 log_unit, page_code, scsi3addr, cmd_type);
1968 if (status != IO_OK) {
1969 cmd_free(info_p, c, 1);
1970 return status;
1971 }
1972resend_cmd1:
1973 /*
1974 * Disable interrupt
1975 */
1976#ifdef CCISS_DEBUG
1977 printk(KERN_DEBUG "cciss: turning intr off\n");
1978#endif /* CCISS_DEBUG */
1979 info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF);
1980
1981 /* Make sure there is room in the command FIFO */
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001982 /* Actually it should be completely empty at this time */
1983 /* unless we are in here doing error handling for the scsi */
1984 /* tape side of the driver. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001985 for (i = 200000; i > 0; i--)
1986 {
1987 /* if fifo isn't full go */
1988 if (!(info_p->access.fifo_full(info_p)))
1989 {
1990
1991 break;
1992 }
1993 udelay(10);
1994 printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full,"
1995 " waiting!\n", ctlr);
1996 }
1997 /*
1998 * Send the cmd
1999 */
2000 info_p->access.submit_command(info_p, c);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002001 done = 0;
2002 do {
2003 complete = pollcomplete(ctlr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002004
2005#ifdef CCISS_DEBUG
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002006 printk(KERN_DEBUG "cciss: command completed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002007#endif /* CCISS_DEBUG */
2008
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002009 if (complete == 1) {
2010 printk( KERN_WARNING
2011 "cciss cciss%d: SendCmd Timeout out, "
2012 "No command list address returned!\n",
2013 ctlr);
2014 status = IO_ERROR;
2015 done = 1;
2016 break;
2017 }
2018
2019 /* This will need to change for direct lookup completions */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002020 if ( (complete & CISS_ERROR_BIT)
2021 && (complete & ~CISS_ERROR_BIT) == c->busaddr)
2022 {
2023 /* if data overrun or underun on Report command
2024 ignore it
2025 */
2026 if (((c->Request.CDB[0] == CISS_REPORT_LOG) ||
2027 (c->Request.CDB[0] == CISS_REPORT_PHYS) ||
2028 (c->Request.CDB[0] == CISS_INQUIRY)) &&
2029 ((c->err_info->CommandStatus ==
2030 CMD_DATA_OVERRUN) ||
2031 (c->err_info->CommandStatus ==
2032 CMD_DATA_UNDERRUN)
2033 ))
2034 {
2035 complete = c->busaddr;
2036 } else {
2037 if (c->err_info->CommandStatus ==
2038 CMD_UNSOLICITED_ABORT) {
2039 printk(KERN_WARNING "cciss%d: "
2040 "unsolicited abort %p\n",
2041 ctlr, c);
2042 if (c->retry_count < MAX_CMD_RETRIES) {
2043 printk(KERN_WARNING
2044 "cciss%d: retrying %p\n",
2045 ctlr, c);
2046 c->retry_count++;
2047 /* erase the old error */
2048 /* information */
2049 memset(c->err_info, 0,
2050 sizeof(ErrorInfo_struct));
2051 goto resend_cmd1;
2052 } else {
2053 printk(KERN_WARNING
2054 "cciss%d: retried %p too "
2055 "many times\n", ctlr, c);
2056 status = IO_ERROR;
2057 goto cleanup1;
2058 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002059 } else if (c->err_info->CommandStatus == CMD_UNABORTABLE) {
2060 printk(KERN_WARNING "cciss%d: command could not be aborted.\n", ctlr);
2061 status = IO_ERROR;
2062 goto cleanup1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002063 }
2064 printk(KERN_WARNING "ciss ciss%d: sendcmd"
2065 " Error %x \n", ctlr,
2066 c->err_info->CommandStatus);
2067 printk(KERN_WARNING "ciss ciss%d: sendcmd"
2068 " offensive info\n"
2069 " size %x\n num %x value %x\n", ctlr,
2070 c->err_info->MoreErrInfo.Invalid_Cmd.offense_size,
2071 c->err_info->MoreErrInfo.Invalid_Cmd.offense_num,
2072 c->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
2073 status = IO_ERROR;
2074 goto cleanup1;
2075 }
2076 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002077 /* This will need changing for direct lookup completions */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078 if (complete != c->busaddr) {
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002079 if (add_sendcmd_reject(cmd, ctlr, complete) != 0) {
2080 BUG(); /* we are pretty much hosed if we get here. */
2081 }
2082 continue;
2083 } else
2084 done = 1;
2085 } while (!done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002086
2087cleanup1:
2088 /* unlock the data buffer from DMA */
Mike Millerbb2a37b2005-09-13 01:25:24 -07002089 buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
2090 buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091 pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val,
Mike Millerbb2a37b2005-09-13 01:25:24 -07002092 c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002093#ifdef CONFIG_CISS_SCSI_TAPE
2094 /* if we saved some commands for later, process them now. */
2095 if (info_p->scsi_rejects.ncompletions > 0)
2096 do_cciss_intr(0, info_p, NULL);
2097#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002098 cmd_free(info_p, c, 1);
2099 return (status);
2100}
2101/*
2102 * Map (physical) PCI mem into (virtual) kernel space
2103 */
2104static void __iomem *remap_pci_mem(ulong base, ulong size)
2105{
2106 ulong page_base = ((ulong) base) & PAGE_MASK;
2107 ulong page_offs = ((ulong) base) - page_base;
2108 void __iomem *page_remapped = ioremap(page_base, page_offs+size);
2109
2110 return page_remapped ? (page_remapped + page_offs) : NULL;
2111}
2112
2113/*
2114 * Takes jobs of the Q and sends them to the hardware, then puts it on
2115 * the Q to wait for completion.
2116 */
2117static void start_io( ctlr_info_t *h)
2118{
2119 CommandList_struct *c;
2120
2121 while(( c = h->reqQ) != NULL )
2122 {
2123 /* can't do anything if fifo is full */
2124 if ((h->access.fifo_full(h))) {
2125 printk(KERN_WARNING "cciss: fifo full\n");
2126 break;
2127 }
2128
2129 /* Get the frist entry from the Request Q */
2130 removeQ(&(h->reqQ), c);
2131 h->Qdepth--;
2132
2133 /* Tell the controller execute command */
2134 h->access.submit_command(h, c);
2135
2136 /* Put job onto the completed Q */
2137 addQ (&(h->cmpQ), c);
2138 }
2139}
2140
2141static inline void complete_buffers(struct bio *bio, int status)
2142{
2143 while (bio) {
2144 struct bio *xbh = bio->bi_next;
2145 int nr_sectors = bio_sectors(bio);
2146
2147 bio->bi_next = NULL;
2148 blk_finished_io(len);
2149 bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
2150 bio = xbh;
2151 }
2152
2153}
2154/* Assumes that CCISS_LOCK(h->ctlr) is held. */
2155/* Zeros out the error record and then resends the command back */
2156/* to the controller */
2157static inline void resend_cciss_cmd( ctlr_info_t *h, CommandList_struct *c)
2158{
2159 /* erase the old error information */
2160 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
2161
2162 /* add it to software queue and then send it to the controller */
2163 addQ(&(h->reqQ),c);
2164 h->Qdepth++;
2165 if(h->Qdepth > h->maxQsinceinit)
2166 h->maxQsinceinit = h->Qdepth;
2167
2168 start_io(h);
2169}
2170/* checks the status of the job and calls complete buffers to mark all
2171 * buffers for the completed job.
2172 */
2173static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd,
2174 int timeout)
2175{
2176 int status = 1;
2177 int i;
2178 int retry_cmd = 0;
2179 u64bit temp64;
2180
2181 if (timeout)
2182 status = 0;
2183
2184 if(cmd->err_info->CommandStatus != 0)
2185 { /* an error has occurred */
2186 switch(cmd->err_info->CommandStatus)
2187 {
2188 unsigned char sense_key;
2189 case CMD_TARGET_STATUS:
2190 status = 0;
2191
2192 if( cmd->err_info->ScsiStatus == 0x02)
2193 {
2194 printk(KERN_WARNING "cciss: cmd %p "
2195 "has CHECK CONDITION "
2196 " byte 2 = 0x%x\n", cmd,
2197 cmd->err_info->SenseInfo[2]
2198 );
2199 /* check the sense key */
2200 sense_key = 0xf &
2201 cmd->err_info->SenseInfo[2];
2202 /* no status or recovered error */
2203 if((sense_key == 0x0) ||
2204 (sense_key == 0x1))
2205 {
2206 status = 1;
2207 }
2208 } else
2209 {
2210 printk(KERN_WARNING "cciss: cmd %p "
2211 "has SCSI Status 0x%x\n",
2212 cmd, cmd->err_info->ScsiStatus);
2213 }
2214 break;
2215 case CMD_DATA_UNDERRUN:
2216 printk(KERN_WARNING "cciss: cmd %p has"
2217 " completed with data underrun "
2218 "reported\n", cmd);
2219 break;
2220 case CMD_DATA_OVERRUN:
2221 printk(KERN_WARNING "cciss: cmd %p has"
2222 " completed with data overrun "
2223 "reported\n", cmd);
2224 break;
2225 case CMD_INVALID:
2226 printk(KERN_WARNING "cciss: cmd %p is "
2227 "reported invalid\n", cmd);
2228 status = 0;
2229 break;
2230 case CMD_PROTOCOL_ERR:
2231 printk(KERN_WARNING "cciss: cmd %p has "
2232 "protocol error \n", cmd);
2233 status = 0;
2234 break;
2235 case CMD_HARDWARE_ERR:
2236 printk(KERN_WARNING "cciss: cmd %p had "
2237 " hardware error\n", cmd);
2238 status = 0;
2239 break;
2240 case CMD_CONNECTION_LOST:
2241 printk(KERN_WARNING "cciss: cmd %p had "
2242 "connection lost\n", cmd);
2243 status=0;
2244 break;
2245 case CMD_ABORTED:
2246 printk(KERN_WARNING "cciss: cmd %p was "
2247 "aborted\n", cmd);
2248 status=0;
2249 break;
2250 case CMD_ABORT_FAILED:
2251 printk(KERN_WARNING "cciss: cmd %p reports "
2252 "abort failed\n", cmd);
2253 status=0;
2254 break;
2255 case CMD_UNSOLICITED_ABORT:
2256 printk(KERN_WARNING "cciss%d: unsolicited "
2257 "abort %p\n", h->ctlr, cmd);
2258 if (cmd->retry_count < MAX_CMD_RETRIES) {
2259 retry_cmd=1;
2260 printk(KERN_WARNING
2261 "cciss%d: retrying %p\n",
2262 h->ctlr, cmd);
2263 cmd->retry_count++;
2264 } else
2265 printk(KERN_WARNING
2266 "cciss%d: %p retried too "
2267 "many times\n", h->ctlr, cmd);
2268 status=0;
2269 break;
2270 case CMD_TIMEOUT:
2271 printk(KERN_WARNING "cciss: cmd %p timedout\n",
2272 cmd);
2273 status=0;
2274 break;
2275 default:
2276 printk(KERN_WARNING "cciss: cmd %p returned "
2277 "unknown status %x\n", cmd,
2278 cmd->err_info->CommandStatus);
2279 status=0;
2280 }
2281 }
2282 /* We need to return this command */
2283 if(retry_cmd) {
2284 resend_cciss_cmd(h,cmd);
2285 return;
2286 }
2287 /* command did not need to be retried */
2288 /* unmap the DMA mapping for all the scatter gather elements */
2289 for(i=0; i<cmd->Header.SGList; i++) {
2290 temp64.val32.lower = cmd->SG[i].Addr.lower;
2291 temp64.val32.upper = cmd->SG[i].Addr.upper;
2292 pci_unmap_page(hba[cmd->ctlr]->pdev,
2293 temp64.val, cmd->SG[i].Len,
2294 (cmd->Request.Type.Direction == XFER_READ) ?
2295 PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
2296 }
2297 complete_buffers(cmd->rq->bio, status);
2298
2299#ifdef CCISS_DEBUG
2300 printk("Done with %p\n", cmd->rq);
2301#endif /* CCISS_DEBUG */
2302
2303 end_that_request_last(cmd->rq);
2304 cmd_free(h,cmd,1);
2305}
2306
2307/*
2308 * Get a request and submit it to the controller.
2309 */
2310static void do_cciss_request(request_queue_t *q)
2311{
2312 ctlr_info_t *h= q->queuedata;
2313 CommandList_struct *c;
2314 int start_blk, seg;
2315 struct request *creq;
2316 u64bit temp64;
2317 struct scatterlist tmp_sg[MAXSGENTRIES];
2318 drive_info_struct *drv;
2319 int i, dir;
2320
2321 /* We call start_io here in case there is a command waiting on the
2322 * queue that has not been sent.
2323 */
2324 if (blk_queue_plugged(q))
2325 goto startio;
2326
2327queue:
2328 creq = elv_next_request(q);
2329 if (!creq)
2330 goto startio;
2331
2332 if (creq->nr_phys_segments > MAXSGENTRIES)
2333 BUG();
2334
2335 if (( c = cmd_alloc(h, 1)) == NULL)
2336 goto full;
2337
2338 blkdev_dequeue_request(creq);
2339
2340 spin_unlock_irq(q->queue_lock);
2341
2342 c->cmd_type = CMD_RWREQ;
2343 c->rq = creq;
2344
2345 /* fill in the request */
2346 drv = creq->rq_disk->private_data;
2347 c->Header.ReplyQueue = 0; // unused in simple mode
Mike Miller33079b22005-09-13 01:25:22 -07002348 /* got command from pool, so use the command block index instead */
2349 /* for direct lookups. */
2350 /* The first 2 bits are reserved for controller error reporting. */
2351 c->Header.Tag.lower = (c->cmdindex << 3);
2352 c->Header.Tag.lower |= 0x04; /* flag for direct lookup. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002353 c->Header.LUN.LogDev.VolId= drv->LunID;
2354 c->Header.LUN.LogDev.Mode = 1;
2355 c->Request.CDBLen = 10; // 12 byte commands not in FW yet;
2356 c->Request.Type.Type = TYPE_CMD; // It is a command.
2357 c->Request.Type.Attribute = ATTR_SIMPLE;
2358 c->Request.Type.Direction =
2359 (rq_data_dir(creq) == READ) ? XFER_READ: XFER_WRITE;
2360 c->Request.Timeout = 0; // Don't time out
2361 c->Request.CDB[0] = (rq_data_dir(creq) == READ) ? CCISS_READ : CCISS_WRITE;
2362 start_blk = creq->sector;
2363#ifdef CCISS_DEBUG
2364 printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%d\n",(int) creq->sector,
2365 (int) creq->nr_sectors);
2366#endif /* CCISS_DEBUG */
2367
2368 seg = blk_rq_map_sg(q, creq, tmp_sg);
2369
2370 /* get the DMA records for the setup */
2371 if (c->Request.Type.Direction == XFER_READ)
2372 dir = PCI_DMA_FROMDEVICE;
2373 else
2374 dir = PCI_DMA_TODEVICE;
2375
2376 for (i=0; i<seg; i++)
2377 {
2378 c->SG[i].Len = tmp_sg[i].length;
2379 temp64.val = (__u64) pci_map_page(h->pdev, tmp_sg[i].page,
2380 tmp_sg[i].offset, tmp_sg[i].length,
2381 dir);
2382 c->SG[i].Addr.lower = temp64.val32.lower;
2383 c->SG[i].Addr.upper = temp64.val32.upper;
2384 c->SG[i].Ext = 0; // we are not chaining
2385 }
2386 /* track how many SG entries we are using */
2387 if( seg > h->maxSG)
2388 h->maxSG = seg;
2389
2390#ifdef CCISS_DEBUG
2391 printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", creq->nr_sectors, seg);
2392#endif /* CCISS_DEBUG */
2393
2394 c->Header.SGList = c->Header.SGTotal = seg;
2395 c->Request.CDB[1]= 0;
2396 c->Request.CDB[2]= (start_blk >> 24) & 0xff; //MSB
2397 c->Request.CDB[3]= (start_blk >> 16) & 0xff;
2398 c->Request.CDB[4]= (start_blk >> 8) & 0xff;
2399 c->Request.CDB[5]= start_blk & 0xff;
2400 c->Request.CDB[6]= 0; // (sect >> 24) & 0xff; MSB
2401 c->Request.CDB[7]= (creq->nr_sectors >> 8) & 0xff;
2402 c->Request.CDB[8]= creq->nr_sectors & 0xff;
2403 c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0;
2404
2405 spin_lock_irq(q->queue_lock);
2406
2407 addQ(&(h->reqQ),c);
2408 h->Qdepth++;
2409 if(h->Qdepth > h->maxQsinceinit)
2410 h->maxQsinceinit = h->Qdepth;
2411
2412 goto queue;
2413full:
2414 blk_stop_queue(q);
2415startio:
2416 /* We will already have the driver lock here so not need
2417 * to lock it.
2418 */
2419 start_io(h);
2420}
2421
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002422static inline unsigned long get_next_completion(ctlr_info_t *h)
2423{
2424#ifdef CONFIG_CISS_SCSI_TAPE
2425 /* Any rejects from sendcmd() lying around? Process them first */
2426 if (h->scsi_rejects.ncompletions == 0)
2427 return h->access.command_completed(h);
2428 else {
2429 struct sendcmd_reject_list *srl;
2430 int n;
2431 srl = &h->scsi_rejects;
2432 n = --srl->ncompletions;
2433 /* printk("cciss%d: processing saved reject\n", h->ctlr); */
2434 printk("p");
2435 return srl->complete[n];
2436 }
2437#else
2438 return h->access.command_completed(h);
2439#endif
2440}
2441
2442static inline int interrupt_pending(ctlr_info_t *h)
2443{
2444#ifdef CONFIG_CISS_SCSI_TAPE
2445 return ( h->access.intr_pending(h)
2446 || (h->scsi_rejects.ncompletions > 0));
2447#else
2448 return h->access.intr_pending(h);
2449#endif
2450}
2451
2452static inline long interrupt_not_for_us(ctlr_info_t *h)
2453{
2454#ifdef CONFIG_CISS_SCSI_TAPE
2455 return (((h->access.intr_pending(h) == 0) ||
2456 (h->interrupts_enabled == 0))
2457 && (h->scsi_rejects.ncompletions == 0));
2458#else
2459 return (((h->access.intr_pending(h) == 0) ||
2460 (h->interrupts_enabled == 0)));
2461#endif
2462}
2463
Linus Torvalds1da177e2005-04-16 15:20:36 -07002464static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
2465{
2466 ctlr_info_t *h = dev_id;
2467 CommandList_struct *c;
2468 unsigned long flags;
Mike Miller33079b22005-09-13 01:25:22 -07002469 __u32 a, a1, a2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002470 int j;
2471 int start_queue = h->next_to_run;
2472
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002473 if (interrupt_not_for_us(h))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002474 return IRQ_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002475 /*
2476 * If there are completed commands in the completion queue,
2477 * we had better do something about it.
2478 */
2479 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002480 while (interrupt_pending(h)) {
2481 while((a = get_next_completion(h)) != FIFO_EMPTY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002482 a1 = a;
Mike Miller33079b22005-09-13 01:25:22 -07002483 if ((a & 0x04)) {
2484 a2 = (a >> 3);
2485 if (a2 >= NR_CMDS) {
2486 printk(KERN_WARNING "cciss: controller cciss%d failed, stopping.\n", h->ctlr);
2487 fail_all_cmds(h->ctlr);
2488 return IRQ_HANDLED;
2489 }
2490
2491 c = h->cmd_pool + a2;
2492 a = c->busaddr;
2493
2494 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002495 a &= ~3;
Mike Miller33079b22005-09-13 01:25:22 -07002496 if ((c = h->cmpQ) == NULL) {
2497 printk(KERN_WARNING "cciss: Completion of %08x ignored\n", a1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002498 continue;
2499 }
2500 while(c->busaddr != a) {
2501 c = c->next;
2502 if (c == h->cmpQ)
2503 break;
2504 }
Mike Miller33079b22005-09-13 01:25:22 -07002505 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002506 /*
2507 * If we've found the command, take it off the
2508 * completion Q and free it
2509 */
2510 if (c->busaddr == a) {
2511 removeQ(&h->cmpQ, c);
2512 if (c->cmd_type == CMD_RWREQ) {
2513 complete_command(h, c, 0);
2514 } else if (c->cmd_type == CMD_IOCTL_PEND) {
2515 complete(c->waiting);
2516 }
2517# ifdef CONFIG_CISS_SCSI_TAPE
2518 else if (c->cmd_type == CMD_SCSI)
2519 complete_scsi_command(c, 0, a1);
2520# endif
2521 continue;
2522 }
2523 }
2524 }
2525
2526 /* check to see if we have maxed out the number of commands that can
2527 * be placed on the queue. If so then exit. We do this check here
2528 * in case the interrupt we serviced was from an ioctl and did not
2529 * free any new commands.
2530 */
2531 if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
2532 goto cleanup;
2533
2534 /* We have room on the queue for more commands. Now we need to queue
2535 * them up. We will also keep track of the next queue to run so
2536 * that every queue gets a chance to be started first.
2537 */
Mike Millerad2b9312005-07-28 01:07:31 -07002538 for (j=0; j < h->highest_lun + 1; j++){
2539 int curr_queue = (start_queue + j) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002540 /* make sure the disk has been added and the drive is real
2541 * because this can be called from the middle of init_one.
2542 */
Mike Millerad2b9312005-07-28 01:07:31 -07002543 if(!(h->drv[curr_queue].queue) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002544 !(h->drv[curr_queue].heads))
2545 continue;
2546 blk_start_queue(h->gendisk[curr_queue]->queue);
2547
2548 /* check to see if we have maxed out the number of commands
2549 * that can be placed on the queue.
2550 */
2551 if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
2552 {
2553 if (curr_queue == start_queue){
Mike Millerad2b9312005-07-28 01:07:31 -07002554 h->next_to_run = (start_queue + 1) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555 goto cleanup;
2556 } else {
2557 h->next_to_run = curr_queue;
2558 goto cleanup;
2559 }
2560 } else {
Mike Millerad2b9312005-07-28 01:07:31 -07002561 curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 }
2563 }
2564
2565cleanup:
2566 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
2567 return IRQ_HANDLED;
2568}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002569/*
2570 * We cannot read the structure directly, for portablity we must use
2571 * the io functions.
2572 * This is for debug only.
2573 */
2574#ifdef CCISS_DEBUG
2575static void print_cfg_table( CfgTable_struct *tb)
2576{
2577 int i;
2578 char temp_name[17];
2579
2580 printk("Controller Configuration information\n");
2581 printk("------------------------------------\n");
2582 for(i=0;i<4;i++)
2583 temp_name[i] = readb(&(tb->Signature[i]));
2584 temp_name[4]='\0';
2585 printk(" Signature = %s\n", temp_name);
2586 printk(" Spec Number = %d\n", readl(&(tb->SpecValence)));
2587 printk(" Transport methods supported = 0x%x\n",
2588 readl(&(tb-> TransportSupport)));
2589 printk(" Transport methods active = 0x%x\n",
2590 readl(&(tb->TransportActive)));
2591 printk(" Requested transport Method = 0x%x\n",
2592 readl(&(tb->HostWrite.TransportRequest)));
2593 printk(" Coalese Interrupt Delay = 0x%x\n",
2594 readl(&(tb->HostWrite.CoalIntDelay)));
2595 printk(" Coalese Interrupt Count = 0x%x\n",
2596 readl(&(tb->HostWrite.CoalIntCount)));
2597 printk(" Max outstanding commands = 0x%d\n",
2598 readl(&(tb->CmdsOutMax)));
2599 printk(" Bus Types = 0x%x\n", readl(&(tb-> BusTypes)));
2600 for(i=0;i<16;i++)
2601 temp_name[i] = readb(&(tb->ServerName[i]));
2602 temp_name[16] = '\0';
2603 printk(" Server Name = %s\n", temp_name);
2604 printk(" Heartbeat Counter = 0x%x\n\n\n",
2605 readl(&(tb->HeartBeat)));
2606}
2607#endif /* CCISS_DEBUG */
2608
2609static void release_io_mem(ctlr_info_t *c)
2610{
2611 /* if IO mem was not protected do nothing */
2612 if( c->io_mem_addr == 0)
2613 return;
2614 release_region(c->io_mem_addr, c->io_mem_length);
2615 c->io_mem_addr = 0;
2616 c->io_mem_length = 0;
2617}
2618
2619static int find_PCI_BAR_index(struct pci_dev *pdev,
2620 unsigned long pci_bar_addr)
2621{
2622 int i, offset, mem_type, bar_type;
2623 if (pci_bar_addr == PCI_BASE_ADDRESS_0) /* looking for BAR zero? */
2624 return 0;
2625 offset = 0;
2626 for (i=0; i<DEVICE_COUNT_RESOURCE; i++) {
2627 bar_type = pci_resource_flags(pdev, i) &
2628 PCI_BASE_ADDRESS_SPACE;
2629 if (bar_type == PCI_BASE_ADDRESS_SPACE_IO)
2630 offset += 4;
2631 else {
2632 mem_type = pci_resource_flags(pdev, i) &
2633 PCI_BASE_ADDRESS_MEM_TYPE_MASK;
2634 switch (mem_type) {
2635 case PCI_BASE_ADDRESS_MEM_TYPE_32:
2636 case PCI_BASE_ADDRESS_MEM_TYPE_1M:
2637 offset += 4; /* 32 bit */
2638 break;
2639 case PCI_BASE_ADDRESS_MEM_TYPE_64:
2640 offset += 8;
2641 break;
2642 default: /* reserved in PCI 2.2 */
2643 printk(KERN_WARNING "Base address is invalid\n");
2644 return -1;
2645 break;
2646 }
2647 }
2648 if (offset == pci_bar_addr - PCI_BASE_ADDRESS_0)
2649 return i+1;
2650 }
2651 return -1;
2652}
2653
2654static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
2655{
2656 ushort subsystem_vendor_id, subsystem_device_id, command;
2657 __u32 board_id, scratchpad = 0;
2658 __u64 cfg_offset;
2659 __u32 cfg_base_addr;
2660 __u64 cfg_base_addr_index;
2661 int i;
2662
2663 /* check to see if controller has been disabled */
2664 /* BEFORE trying to enable it */
2665 (void) pci_read_config_word(pdev, PCI_COMMAND,&command);
2666 if(!(command & 0x02))
2667 {
2668 printk(KERN_WARNING "cciss: controller appears to be disabled\n");
2669 return(-1);
2670 }
2671
2672 if (pci_enable_device(pdev))
2673 {
2674 printk(KERN_ERR "cciss: Unable to Enable PCI device\n");
2675 return( -1);
2676 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002677
2678 subsystem_vendor_id = pdev->subsystem_vendor;
2679 subsystem_device_id = pdev->subsystem_device;
2680 board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) |
2681 subsystem_vendor_id);
2682
2683 /* search for our IO range so we can protect it */
2684 for(i=0; i<DEVICE_COUNT_RESOURCE; i++)
2685 {
2686 /* is this an IO range */
2687 if( pci_resource_flags(pdev, i) & 0x01 ) {
2688 c->io_mem_addr = pci_resource_start(pdev, i);
2689 c->io_mem_length = pci_resource_end(pdev, i) -
2690 pci_resource_start(pdev, i) +1;
2691#ifdef CCISS_DEBUG
2692 printk("IO value found base_addr[%d] %lx %lx\n", i,
2693 c->io_mem_addr, c->io_mem_length);
2694#endif /* CCISS_DEBUG */
2695 /* register the IO range */
2696 if(!request_region( c->io_mem_addr,
2697 c->io_mem_length, "cciss"))
2698 {
2699 printk(KERN_WARNING "cciss I/O memory range already in use addr=%lx length=%ld\n",
2700 c->io_mem_addr, c->io_mem_length);
2701 c->io_mem_addr= 0;
2702 c->io_mem_length = 0;
2703 }
2704 break;
2705 }
2706 }
2707
2708#ifdef CCISS_DEBUG
2709 printk("command = %x\n", command);
2710 printk("irq = %x\n", pdev->irq);
2711 printk("board_id = %x\n", board_id);
2712#endif /* CCISS_DEBUG */
2713
2714 c->intr = pdev->irq;
2715
2716 /*
2717 * Memory base addr is first addr , the second points to the config
2718 * table
2719 */
2720
2721 c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */
2722#ifdef CCISS_DEBUG
2723 printk("address 0 = %x\n", c->paddr);
2724#endif /* CCISS_DEBUG */
2725 c->vaddr = remap_pci_mem(c->paddr, 200);
2726
2727 /* Wait for the board to become ready. (PCI hotplug needs this.)
2728 * We poll for up to 120 secs, once per 100ms. */
2729 for (i=0; i < 1200; i++) {
2730 scratchpad = readl(c->vaddr + SA5_SCRATCHPAD_OFFSET);
2731 if (scratchpad == CCISS_FIRMWARE_READY)
2732 break;
2733 set_current_state(TASK_INTERRUPTIBLE);
2734 schedule_timeout(HZ / 10); /* wait 100ms */
2735 }
2736 if (scratchpad != CCISS_FIRMWARE_READY) {
2737 printk(KERN_WARNING "cciss: Board not ready. Timed out.\n");
2738 return -1;
2739 }
2740
2741 /* get the address index number */
2742 cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET);
2743 cfg_base_addr &= (__u32) 0x0000ffff;
2744#ifdef CCISS_DEBUG
2745 printk("cfg base address = %x\n", cfg_base_addr);
2746#endif /* CCISS_DEBUG */
2747 cfg_base_addr_index =
2748 find_PCI_BAR_index(pdev, cfg_base_addr);
2749#ifdef CCISS_DEBUG
2750 printk("cfg base address index = %x\n", cfg_base_addr_index);
2751#endif /* CCISS_DEBUG */
2752 if (cfg_base_addr_index == -1) {
2753 printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n");
2754 release_io_mem(c);
2755 return -1;
2756 }
2757
2758 cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
2759#ifdef CCISS_DEBUG
2760 printk("cfg offset = %x\n", cfg_offset);
2761#endif /* CCISS_DEBUG */
2762 c->cfgtable = remap_pci_mem(pci_resource_start(pdev,
2763 cfg_base_addr_index) + cfg_offset,
2764 sizeof(CfgTable_struct));
2765 c->board_id = board_id;
2766
2767#ifdef CCISS_DEBUG
2768 print_cfg_table(c->cfgtable);
2769#endif /* CCISS_DEBUG */
2770
2771 for(i=0; i<NR_PRODUCTS; i++) {
2772 if (board_id == products[i].board_id) {
2773 c->product_name = products[i].product_name;
2774 c->access = *(products[i].access);
2775 break;
2776 }
2777 }
2778 if (i == NR_PRODUCTS) {
2779 printk(KERN_WARNING "cciss: Sorry, I don't know how"
2780 " to access the Smart Array controller %08lx\n",
2781 (unsigned long)board_id);
2782 return -1;
2783 }
2784 if ( (readb(&c->cfgtable->Signature[0]) != 'C') ||
2785 (readb(&c->cfgtable->Signature[1]) != 'I') ||
2786 (readb(&c->cfgtable->Signature[2]) != 'S') ||
2787 (readb(&c->cfgtable->Signature[3]) != 'S') )
2788 {
2789 printk("Does not appear to be a valid CISS config table\n");
2790 return -1;
2791 }
2792
2793#ifdef CONFIG_X86
2794{
2795 /* Need to enable prefetch in the SCSI core for 6400 in x86 */
2796 __u32 prefetch;
2797 prefetch = readl(&(c->cfgtable->SCSI_Prefetch));
2798 prefetch |= 0x100;
2799 writel(prefetch, &(c->cfgtable->SCSI_Prefetch));
2800}
2801#endif
2802
2803#ifdef CCISS_DEBUG
2804 printk("Trying to put board into Simple mode\n");
2805#endif /* CCISS_DEBUG */
2806 c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
2807 /* Update the field, and then ring the doorbell */
2808 writel( CFGTBL_Trans_Simple,
2809 &(c->cfgtable->HostWrite.TransportRequest));
2810 writel( CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL);
2811
2812 /* under certain very rare conditions, this can take awhile.
2813 * (e.g.: hot replace a failed 144GB drive in a RAID 5 set right
2814 * as we enter this code.) */
2815 for(i=0;i<MAX_CONFIG_WAIT;i++) {
2816 if (!(readl(c->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq))
2817 break;
2818 /* delay and try again */
2819 set_current_state(TASK_INTERRUPTIBLE);
2820 schedule_timeout(10);
2821 }
2822
2823#ifdef CCISS_DEBUG
2824 printk(KERN_DEBUG "I counter got to %d %x\n", i, readl(c->vaddr + SA5_DOORBELL));
2825#endif /* CCISS_DEBUG */
2826#ifdef CCISS_DEBUG
2827 print_cfg_table(c->cfgtable);
2828#endif /* CCISS_DEBUG */
2829
2830 if (!(readl(&(c->cfgtable->TransportActive)) & CFGTBL_Trans_Simple))
2831 {
2832 printk(KERN_WARNING "cciss: unable to get board into"
2833 " simple mode\n");
2834 return -1;
2835 }
2836 return 0;
2837
2838}
2839
2840/*
2841 * Gets information about the local volumes attached to the controller.
2842 */
2843static void cciss_getgeometry(int cntl_num)
2844{
2845 ReportLunData_struct *ld_buff;
2846 ReadCapdata_struct *size_buff;
2847 InquiryData_struct *inq_buff;
2848 int return_code;
2849 int i;
2850 int listlength = 0;
2851 __u32 lunid = 0;
2852 int block_size;
2853 int total_size;
2854
2855 ld_buff = kmalloc(sizeof(ReportLunData_struct), GFP_KERNEL);
2856 if (ld_buff == NULL)
2857 {
2858 printk(KERN_ERR "cciss: out of memory\n");
2859 return;
2860 }
2861 memset(ld_buff, 0, sizeof(ReportLunData_struct));
2862 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
2863 if (size_buff == NULL)
2864 {
2865 printk(KERN_ERR "cciss: out of memory\n");
2866 kfree(ld_buff);
2867 return;
2868 }
2869 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
2870 if (inq_buff == NULL)
2871 {
2872 printk(KERN_ERR "cciss: out of memory\n");
2873 kfree(ld_buff);
2874 kfree(size_buff);
2875 return;
2876 }
2877 /* Get the firmware version */
2878 return_code = sendcmd(CISS_INQUIRY, cntl_num, inq_buff,
2879 sizeof(InquiryData_struct), 0, 0 ,0, NULL, TYPE_CMD);
2880 if (return_code == IO_OK)
2881 {
2882 hba[cntl_num]->firm_ver[0] = inq_buff->data_byte[32];
2883 hba[cntl_num]->firm_ver[1] = inq_buff->data_byte[33];
2884 hba[cntl_num]->firm_ver[2] = inq_buff->data_byte[34];
2885 hba[cntl_num]->firm_ver[3] = inq_buff->data_byte[35];
2886 } else /* send command failed */
2887 {
2888 printk(KERN_WARNING "cciss: unable to determine firmware"
2889 " version of controller\n");
2890 }
2891 /* Get the number of logical volumes */
2892 return_code = sendcmd(CISS_REPORT_LOG, cntl_num, ld_buff,
2893 sizeof(ReportLunData_struct), 0, 0, 0, NULL, TYPE_CMD);
2894
2895 if( return_code == IO_OK)
2896 {
2897#ifdef CCISS_DEBUG
2898 printk("LUN Data\n--------------------------\n");
2899#endif /* CCISS_DEBUG */
2900
2901 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24;
2902 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16;
2903 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8;
2904 listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]);
2905 } else /* reading number of logical volumes failed */
2906 {
2907 printk(KERN_WARNING "cciss: report logical volume"
2908 " command failed\n");
2909 listlength = 0;
2910 }
2911 hba[cntl_num]->num_luns = listlength / 8; // 8 bytes pre entry
2912 if (hba[cntl_num]->num_luns > CISS_MAX_LUN)
2913 {
2914 printk(KERN_ERR "ciss: only %d number of logical volumes supported\n",
2915 CISS_MAX_LUN);
2916 hba[cntl_num]->num_luns = CISS_MAX_LUN;
2917 }
2918#ifdef CCISS_DEBUG
2919 printk(KERN_DEBUG "Length = %x %x %x %x = %d\n", ld_buff->LUNListLength[0],
2920 ld_buff->LUNListLength[1], ld_buff->LUNListLength[2],
2921 ld_buff->LUNListLength[3], hba[cntl_num]->num_luns);
2922#endif /* CCISS_DEBUG */
2923
2924 hba[cntl_num]->highest_lun = hba[cntl_num]->num_luns-1;
Mike Millerddd47442005-09-13 01:25:22 -07002925// for(i=0; i< hba[cntl_num]->num_luns; i++)
2926 for(i=0; i < CISS_MAX_LUN; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002927 {
Mike Millerddd47442005-09-13 01:25:22 -07002928 if (i < hba[cntl_num]->num_luns){
2929 lunid = (0xff & (unsigned int)(ld_buff->LUN[i][3]))
2930 << 24;
2931 lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][2]))
2932 << 16;
2933 lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][1]))
2934 << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002935 lunid |= 0xff & (unsigned int)(ld_buff->LUN[i][0]);
2936
2937 hba[cntl_num]->drv[i].LunID = lunid;
2938
2939
2940#ifdef CCISS_DEBUG
2941 printk(KERN_DEBUG "LUN[%d]: %x %x %x %x = %x\n", i,
Mike Millerddd47442005-09-13 01:25:22 -07002942 ld_buff->LUN[i][0], ld_buff->LUN[i][1],
2943 ld_buff->LUN[i][2], ld_buff->LUN[i][3],
2944 hba[cntl_num]->drv[i].LunID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002945#endif /* CCISS_DEBUG */
2946 cciss_read_capacity(cntl_num, i, size_buff, 0,
2947 &total_size, &block_size);
Mike Millerddd47442005-09-13 01:25:22 -07002948 cciss_geometry_inquiry(cntl_num, i, 0, total_size,
2949 block_size, inq_buff, &hba[cntl_num]->drv[i]);
2950 } else {
2951 /* initialize raid_level to indicate a free space */
2952 hba[cntl_num]->drv[i].raid_level = -1;
2953 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002954 }
2955 kfree(ld_buff);
2956 kfree(size_buff);
2957 kfree(inq_buff);
2958}
2959
2960/* Function to find the first free pointer into our hba[] array */
2961/* Returns -1 if no free entries are left. */
2962static int alloc_cciss_hba(void)
2963{
2964 struct gendisk *disk[NWD];
2965 int i, n;
2966 for (n = 0; n < NWD; n++) {
2967 disk[n] = alloc_disk(1 << NWD_SHIFT);
2968 if (!disk[n])
2969 goto out;
2970 }
2971
2972 for(i=0; i< MAX_CTLR; i++) {
2973 if (!hba[i]) {
2974 ctlr_info_t *p;
2975 p = kmalloc(sizeof(ctlr_info_t), GFP_KERNEL);
2976 if (!p)
2977 goto Enomem;
2978 memset(p, 0, sizeof(ctlr_info_t));
2979 for (n = 0; n < NWD; n++)
2980 p->gendisk[n] = disk[n];
2981 hba[i] = p;
2982 return i;
2983 }
2984 }
2985 printk(KERN_WARNING "cciss: This driver supports a maximum"
2986 " of %d controllers.\n", MAX_CTLR);
2987 goto out;
2988Enomem:
2989 printk(KERN_ERR "cciss: out of memory.\n");
2990out:
2991 while (n--)
2992 put_disk(disk[n]);
2993 return -1;
2994}
2995
2996static void free_hba(int i)
2997{
2998 ctlr_info_t *p = hba[i];
2999 int n;
3000
3001 hba[i] = NULL;
3002 for (n = 0; n < NWD; n++)
3003 put_disk(p->gendisk[n]);
3004 kfree(p);
3005}
3006
3007/*
3008 * This is it. Find all the controllers and register them. I really hate
3009 * stealing all these major device numbers.
3010 * returns the number of block devices registered.
3011 */
3012static int __devinit cciss_init_one(struct pci_dev *pdev,
3013 const struct pci_device_id *ent)
3014{
3015 request_queue_t *q;
3016 int i;
3017 int j;
3018 int rc;
3019
3020 printk(KERN_DEBUG "cciss: Device 0x%x has been found at"
3021 " bus %d dev %d func %d\n",
3022 pdev->device, pdev->bus->number, PCI_SLOT(pdev->devfn),
3023 PCI_FUNC(pdev->devfn));
3024 i = alloc_cciss_hba();
3025 if(i < 0)
3026 return (-1);
Mike Miller1f8ef382005-09-13 01:25:21 -07003027
3028 hba[i]->busy_initializing = 1;
3029
Linus Torvalds1da177e2005-04-16 15:20:36 -07003030 if (cciss_pci_init(hba[i], pdev) != 0)
3031 goto clean1;
3032
3033 sprintf(hba[i]->devname, "cciss%d", i);
3034 hba[i]->ctlr = i;
3035 hba[i]->pdev = pdev;
3036
3037 /* configure PCI DMA stuff */
mike.miller@hp.comeb0df992005-06-10 14:51:04 -05003038 if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003039 printk("cciss: using DAC cycles\n");
mike.miller@hp.comeb0df992005-06-10 14:51:04 -05003040 else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003041 printk("cciss: not using DAC cycles\n");
3042 else {
3043 printk("cciss: no suitable DMA available\n");
3044 goto clean1;
3045 }
3046
3047 /*
3048 * register with the major number, or get a dynamic major number
3049 * by passing 0 as argument. This is done for greater than
3050 * 8 controller support.
3051 */
3052 if (i < MAX_CTLR_ORIG)
3053 hba[i]->major = MAJOR_NR + i;
3054 rc = register_blkdev(hba[i]->major, hba[i]->devname);
3055 if(rc == -EBUSY || rc == -EINVAL) {
3056 printk(KERN_ERR
3057 "cciss: Unable to get major number %d for %s "
3058 "on hba %d\n", hba[i]->major, hba[i]->devname, i);
3059 goto clean1;
3060 }
3061 else {
3062 if (i >= MAX_CTLR_ORIG)
3063 hba[i]->major = rc;
3064 }
3065
3066 /* make sure the board interrupts are off */
3067 hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_OFF);
3068 if( request_irq(hba[i]->intr, do_cciss_intr,
3069 SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM,
3070 hba[i]->devname, hba[i])) {
3071 printk(KERN_ERR "cciss: Unable to get irq %d for %s\n",
3072 hba[i]->intr, hba[i]->devname);
3073 goto clean2;
3074 }
3075 hba[i]->cmd_pool_bits = kmalloc(((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long), GFP_KERNEL);
3076 hba[i]->cmd_pool = (CommandList_struct *)pci_alloc_consistent(
3077 hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
3078 &(hba[i]->cmd_pool_dhandle));
3079 hba[i]->errinfo_pool = (ErrorInfo_struct *)pci_alloc_consistent(
3080 hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
3081 &(hba[i]->errinfo_pool_dhandle));
3082 if((hba[i]->cmd_pool_bits == NULL)
3083 || (hba[i]->cmd_pool == NULL)
3084 || (hba[i]->errinfo_pool == NULL)) {
3085 printk( KERN_ERR "cciss: out of memory");
3086 goto clean4;
3087 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003088#ifdef CONFIG_CISS_SCSI_TAPE
3089 hba[i]->scsi_rejects.complete =
3090 kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) *
3091 (NR_CMDS + 5), GFP_KERNEL);
3092 if (hba[i]->scsi_rejects.complete == NULL) {
3093 printk( KERN_ERR "cciss: out of memory");
3094 goto clean4;
3095 }
3096#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003097 spin_lock_init(&hba[i]->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003098
3099 /* Initialize the pdev driver private data.
3100 have it point to hba[i]. */
3101 pci_set_drvdata(pdev, hba[i]);
3102 /* command and error info recs zeroed out before
3103 they are used */
3104 memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long));
3105
3106#ifdef CCISS_DEBUG
3107 printk(KERN_DEBUG "Scanning for drives on controller cciss%d\n",i);
3108#endif /* CCISS_DEBUG */
3109
3110 cciss_getgeometry(i);
3111
3112 cciss_scsi_setup(i);
3113
3114 /* Turn the interrupts on so we can service requests */
3115 hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_ON);
3116
3117 cciss_procinit(i);
Mike Millerd6dbf422005-09-21 09:55:32 -07003118 hba[i]->busy_initializing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119
Mike Millerad2b9312005-07-28 01:07:31 -07003120 for(j=0; j < NWD; j++) { /* mfm */
3121 drive_info_struct *drv = &(hba[i]->drv[j]);
3122 struct gendisk *disk = hba[i]->gendisk[j];
3123
3124 q = blk_init_queue(do_cciss_request, &hba[i]->lock);
3125 if (!q) {
3126 printk(KERN_ERR
3127 "cciss: unable to allocate queue for disk %d\n",
3128 j);
3129 break;
3130 }
3131 drv->queue = q;
3132
3133 q->backing_dev_info.ra_pages = READ_AHEAD;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003134 blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
3135
3136 /* This is a hardware imposed limit. */
3137 blk_queue_max_hw_segments(q, MAXSGENTRIES);
3138
3139 /* This is a limit in the driver and could be eliminated. */
3140 blk_queue_max_phys_segments(q, MAXSGENTRIES);
3141
3142 blk_queue_max_sectors(q, 512);
3143
Mike Millerad2b9312005-07-28 01:07:31 -07003144 q->queuedata = hba[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003145 sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
3146 sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
3147 disk->major = hba[i]->major;
3148 disk->first_minor = j << NWD_SHIFT;
3149 disk->fops = &cciss_fops;
Mike Millerad2b9312005-07-28 01:07:31 -07003150 disk->queue = q;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003151 disk->private_data = drv;
3152 /* we must register the controller even if no disks exist */
3153 /* this is for the online array utilities */
3154 if(!drv->heads && j)
3155 continue;
Mike Millerad2b9312005-07-28 01:07:31 -07003156 blk_queue_hardsect_size(q, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003157 set_capacity(disk, drv->nr_blocks);
3158 add_disk(disk);
3159 }
Mike Millerad2b9312005-07-28 01:07:31 -07003160
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 return(1);
3162
3163clean4:
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003164#ifdef CONFIG_CISS_SCSI_TAPE
3165 if(hba[i]->scsi_rejects.complete)
3166 kfree(hba[i]->scsi_rejects.complete);
3167#endif
Jesper Juhl6044ec82005-11-07 01:01:32 -08003168 kfree(hba[i]->cmd_pool_bits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003169 if(hba[i]->cmd_pool)
3170 pci_free_consistent(hba[i]->pdev,
3171 NR_CMDS * sizeof(CommandList_struct),
3172 hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
3173 if(hba[i]->errinfo_pool)
3174 pci_free_consistent(hba[i]->pdev,
3175 NR_CMDS * sizeof( ErrorInfo_struct),
3176 hba[i]->errinfo_pool,
3177 hba[i]->errinfo_pool_dhandle);
3178 free_irq(hba[i]->intr, hba[i]);
3179clean2:
3180 unregister_blkdev(hba[i]->major, hba[i]->devname);
3181clean1:
3182 release_io_mem(hba[i]);
3183 free_hba(i);
Mike Miller1f8ef382005-09-13 01:25:21 -07003184 hba[i]->busy_initializing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003185 return(-1);
3186}
3187
3188static void __devexit cciss_remove_one (struct pci_dev *pdev)
3189{
3190 ctlr_info_t *tmp_ptr;
3191 int i, j;
3192 char flush_buf[4];
3193 int return_code;
3194
3195 if (pci_get_drvdata(pdev) == NULL)
3196 {
3197 printk( KERN_ERR "cciss: Unable to remove device \n");
3198 return;
3199 }
3200 tmp_ptr = pci_get_drvdata(pdev);
3201 i = tmp_ptr->ctlr;
3202 if (hba[i] == NULL)
3203 {
3204 printk(KERN_ERR "cciss: device appears to "
3205 "already be removed \n");
3206 return;
3207 }
3208 /* Turn board interrupts off and send the flush cache command */
3209 /* sendcmd will turn off interrupt, and send the flush...
3210 * To write all data in the battery backed cache to disks */
3211 memset(flush_buf, 0, 4);
3212 return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL,
3213 TYPE_CMD);
3214 if(return_code != IO_OK)
3215 {
3216 printk(KERN_WARNING "Error Flushing cache on controller %d\n",
3217 i);
3218 }
3219 free_irq(hba[i]->intr, hba[i]);
3220 pci_set_drvdata(pdev, NULL);
3221 iounmap(hba[i]->vaddr);
3222 cciss_unregister_scsi(i); /* unhook from SCSI subsystem */
3223 unregister_blkdev(hba[i]->major, hba[i]->devname);
3224 remove_proc_entry(hba[i]->devname, proc_cciss);
3225
3226 /* remove it from the disk list */
3227 for (j = 0; j < NWD; j++) {
3228 struct gendisk *disk = hba[i]->gendisk[j];
Mike Miller6a445d32005-09-13 01:25:23 -07003229 if (disk->flags & GENHD_FL_UP) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003230 del_gendisk(disk);
Mike Miller6a445d32005-09-13 01:25:23 -07003231 blk_cleanup_queue(disk->queue);
3232 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003233 }
3234
Linus Torvalds1da177e2005-04-16 15:20:36 -07003235 pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
3236 hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
3237 pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
3238 hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle);
3239 kfree(hba[i]->cmd_pool_bits);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003240#ifdef CONFIG_CISS_SCSI_TAPE
3241 kfree(hba[i]->scsi_rejects.complete);
3242#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003243 release_io_mem(hba[i]);
3244 free_hba(i);
3245}
3246
3247static struct pci_driver cciss_pci_driver = {
3248 .name = "cciss",
3249 .probe = cciss_init_one,
3250 .remove = __devexit_p(cciss_remove_one),
3251 .id_table = cciss_pci_device_id, /* id_table */
3252};
3253
3254/*
3255 * This is it. Register the PCI driver information for the cards we control
3256 * the OS will call our registered routines when it finds one of our cards.
3257 */
3258static int __init cciss_init(void)
3259{
3260 printk(KERN_INFO DRIVER_NAME "\n");
3261
3262 /* Register for our PCI devices */
3263 return pci_module_init(&cciss_pci_driver);
3264}
3265
3266static void __exit cciss_cleanup(void)
3267{
3268 int i;
3269
3270 pci_unregister_driver(&cciss_pci_driver);
3271 /* double check that all controller entrys have been removed */
3272 for (i=0; i< MAX_CTLR; i++)
3273 {
3274 if (hba[i] != NULL)
3275 {
3276 printk(KERN_WARNING "cciss: had to remove"
3277 " controller %d\n", i);
3278 cciss_remove_one(hba[i]->pdev);
3279 }
3280 }
3281 remove_proc_entry("cciss", proc_root_driver);
3282}
3283
Mike Miller33079b22005-09-13 01:25:22 -07003284static void fail_all_cmds(unsigned long ctlr)
3285{
3286 /* If we get here, the board is apparently dead. */
3287 ctlr_info_t *h = hba[ctlr];
3288 CommandList_struct *c;
3289 unsigned long flags;
3290
3291 printk(KERN_WARNING "cciss%d: controller not responding.\n", h->ctlr);
3292 h->alive = 0; /* the controller apparently died... */
3293
3294 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
3295
3296 pci_disable_device(h->pdev); /* Make sure it is really dead. */
3297
3298 /* move everything off the request queue onto the completed queue */
3299 while( (c = h->reqQ) != NULL ) {
3300 removeQ(&(h->reqQ), c);
3301 h->Qdepth--;
3302 addQ (&(h->cmpQ), c);
3303 }
3304
3305 /* Now, fail everything on the completed queue with a HW error */
3306 while( (c = h->cmpQ) != NULL ) {
3307 removeQ(&h->cmpQ, c);
3308 c->err_info->CommandStatus = CMD_HARDWARE_ERR;
3309 if (c->cmd_type == CMD_RWREQ) {
3310 complete_command(h, c, 0);
3311 } else if (c->cmd_type == CMD_IOCTL_PEND)
3312 complete(c->waiting);
3313#ifdef CONFIG_CISS_SCSI_TAPE
3314 else if (c->cmd_type == CMD_SCSI)
3315 complete_scsi_command(c, 0, 0);
3316#endif
3317 }
3318 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
3319 return;
3320}
3321
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322module_init(cciss_init);
3323module_exit(cciss_cleanup);