blob: 349654598d2ea942ebf13f151a0d2d2e97cb3925 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * Disk Array driver for HP SA 5xxx and 6xxx Controllers
Mike Millerfb86a352006-01-08 01:03:50 -08003 * Copyright 2000, 2006 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>
Jens Axboe2056a782006-03-23 20:00:26 +010041#include <linux/blktrace_api.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070042#include <asm/uaccess.h>
43#include <asm/io.h>
44
mike.miller@hp.comeb0df992005-06-10 14:51:04 -050045#include <linux/dma-mapping.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070046#include <linux/blkdev.h>
47#include <linux/genhd.h>
48#include <linux/completion.h>
49
50#define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
Mike Millerfb86a352006-01-08 01:03:50 -080051#define DRIVER_NAME "HP CISS Driver (v 2.6.10)"
52#define DRIVER_VERSION CCISS_DRIVER_VERSION(2,6,10)
Linus Torvalds1da177e2005-04-16 15:20:36 -070053
54/* Embedded module documentation macros - see modules.h */
55MODULE_AUTHOR("Hewlett-Packard Company");
Mike Millerfb86a352006-01-08 01:03:50 -080056MODULE_DESCRIPTION("Driver for HP Controller SA5xxx SA6xxx version 2.6.10");
Linus Torvalds1da177e2005-04-16 15:20:36 -070057MODULE_SUPPORTED_DEVICE("HP SA5i SA5i+ SA532 SA5300 SA5312 SA641 SA642 SA6400"
Mike Miller9dc7a862005-09-13 01:25:19 -070058 " SA6i P600 P800 P400 P400i E200 E200i");
Linus Torvalds1da177e2005-04-16 15:20:36 -070059MODULE_LICENSE("GPL");
60
61#include "cciss_cmd.h"
62#include "cciss.h"
63#include <linux/cciss_ioctl.h>
64
65/* define the PCI info for the cards we can control */
66static const struct pci_device_id cciss_pci_device_id[] = {
67 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISS,
68 0x0E11, 0x4070, 0, 0, 0},
69 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
70 0x0E11, 0x4080, 0, 0, 0},
71 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
72 0x0E11, 0x4082, 0, 0, 0},
73 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
74 0x0E11, 0x4083, 0, 0, 0},
75 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
76 0x0E11, 0x409A, 0, 0, 0},
77 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
78 0x0E11, 0x409B, 0, 0, 0},
79 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
80 0x0E11, 0x409C, 0, 0, 0},
81 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
82 0x0E11, 0x409D, 0, 0, 0},
83 { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSC,
84 0x0E11, 0x4091, 0, 0, 0},
85 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSA,
86 0x103C, 0x3225, 0, 0, 0},
Mike Miller9dc7a862005-09-13 01:25:19 -070087 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Linus Torvalds1da177e2005-04-16 15:20:36 -070088 0x103c, 0x3223, 0, 0, 0},
Mike Miller3de0a702005-06-27 14:36:48 -070089 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Mike Miller9dc7a862005-09-13 01:25:19 -070090 0x103c, 0x3234, 0, 0, 0},
Mike Miller3de0a702005-06-27 14:36:48 -070091 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSC,
Mike Miller9dc7a862005-09-13 01:25:19 -070092 0x103c, 0x3235, 0, 0, 0},
93 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
94 0x103c, 0x3211, 0, 0, 0},
95 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
96 0x103c, 0x3212, 0, 0, 0},
97 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
98 0x103c, 0x3213, 0, 0, 0},
99 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
100 0x103c, 0x3214, 0, 0, 0},
101 { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_CISSD,
102 0x103c, 0x3215, 0, 0, 0},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103 {0,}
104};
105MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
106
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107/* board_id = Subsystem Device ID & Vendor ID
108 * product = Marketing Name for the board
109 * access = Address of the struct of function pointers
110 */
111static struct board_type products[] = {
112 { 0x40700E11, "Smart Array 5300", &SA5_access },
113 { 0x40800E11, "Smart Array 5i", &SA5B_access},
114 { 0x40820E11, "Smart Array 532", &SA5B_access},
115 { 0x40830E11, "Smart Array 5312", &SA5B_access},
116 { 0x409A0E11, "Smart Array 641", &SA5_access},
117 { 0x409B0E11, "Smart Array 642", &SA5_access},
118 { 0x409C0E11, "Smart Array 6400", &SA5_access},
119 { 0x409D0E11, "Smart Array 6400 EM", &SA5_access},
120 { 0x40910E11, "Smart Array 6i", &SA5_access},
121 { 0x3225103C, "Smart Array P600", &SA5_access},
122 { 0x3223103C, "Smart Array P800", &SA5_access},
Mike Miller9dc7a862005-09-13 01:25:19 -0700123 { 0x3234103C, "Smart Array P400", &SA5_access},
124 { 0x3235103C, "Smart Array P400i", &SA5_access},
125 { 0x3211103C, "Smart Array E200i", &SA5_access},
126 { 0x3212103C, "Smart Array E200", &SA5_access},
127 { 0x3213103C, "Smart Array E200i", &SA5_access},
128 { 0x3214103C, "Smart Array E200i", &SA5_access},
129 { 0x3215103C, "Smart Array E200i", &SA5_access},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130};
131
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -0700132/* How long to wait (in milliseconds) for board to go into simple mode */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133#define MAX_CONFIG_WAIT 30000
134#define MAX_IOCTL_CONFIG_WAIT 1000
135
136/*define how many times we will try a command because of bus resets */
137#define MAX_CMD_RETRIES 3
138
139#define READ_AHEAD 1024
140#define NR_CMDS 384 /* #commands that can be outstanding */
141#define MAX_CTLR 32
142
143/* Originally cciss driver only supports 8 major numbers */
144#define MAX_CTLR_ORIG 8
145
146
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147static ctlr_info_t *hba[MAX_CTLR];
148
149static void do_cciss_request(request_queue_t *q);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -0600150static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151static int cciss_open(struct inode *inode, struct file *filep);
152static int cciss_release(struct inode *inode, struct file *filep);
153static int cciss_ioctl(struct inode *inode, struct file *filep,
154 unsigned int cmd, unsigned long arg);
Christoph Hellwiga885c8c2006-01-08 01:02:50 -0800155static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700156
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);
Mike Millerfb86a352006-01-08 01:03:50 -0800169static void __devinit cciss_interrupt_mode(ctlr_info_t *, struct pci_dev *, __u32);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700170static 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,
Christoph Hellwiga885c8c2006-01-08 01:02:50 -0800197 .getgeo = cciss_getgeo,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198#ifdef CONFIG_COMPAT
199 .compat_ioctl = cciss_compat_ioctl,
200#endif
201 .revalidate_disk= cciss_revalidate,
202};
203
204/*
205 * Enqueuing and dequeuing functions for cmdlists.
206 */
207static inline void addQ(CommandList_struct **Qptr, CommandList_struct *c)
208{
209 if (*Qptr == NULL) {
210 *Qptr = c;
211 c->next = c->prev = c;
212 } else {
213 c->prev = (*Qptr)->prev;
214 c->next = (*Qptr);
215 (*Qptr)->prev->next = c;
216 (*Qptr)->prev = c;
217 }
218}
219
220static inline CommandList_struct *removeQ(CommandList_struct **Qptr,
221 CommandList_struct *c)
222{
223 if (c && c->next != c) {
224 if (*Qptr == c) *Qptr = c->next;
225 c->prev->next = c->next;
226 c->next->prev = c->prev;
227 } else {
228 *Qptr = NULL;
229 }
230 return c;
231}
232
233#include "cciss_scsi.c" /* For SCSI tape support */
234
235#ifdef CONFIG_PROC_FS
236
237/*
238 * Report information about this controller.
239 */
240#define ENG_GIG 1000000000
241#define ENG_GIG_FACTOR (ENG_GIG/512)
242#define RAID_UNKNOWN 6
243static const char *raid_label[] = {"0","4","1(1+0)","5","5+1","ADG",
244 "UNKNOWN"};
245
246static struct proc_dir_entry *proc_cciss;
247
248static int cciss_proc_get_info(char *buffer, char **start, off_t offset,
249 int length, int *eof, void *data)
250{
251 off_t pos = 0;
252 off_t len = 0;
253 int size, i, ctlr;
254 ctlr_info_t *h = (ctlr_info_t*)data;
255 drive_info_struct *drv;
256 unsigned long flags;
257 sector_t vol_sz, vol_sz_frac;
258
259 ctlr = h->ctlr;
260
261 /* prevent displaying bogus info during configuration
262 * or deconfiguration of a logical volume
263 */
264 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
265 if (h->busy_configuring) {
266 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
267 return -EBUSY;
268 }
269 h->busy_configuring = 1;
270 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
271
272 size = sprintf(buffer, "%s: HP %s Controller\n"
273 "Board ID: 0x%08lx\n"
274 "Firmware Version: %c%c%c%c\n"
275 "IRQ: %d\n"
276 "Logical drives: %d\n"
277 "Current Q depth: %d\n"
278 "Current # commands on controller: %d\n"
279 "Max Q depth since init: %d\n"
280 "Max # commands on controller since init: %d\n"
281 "Max SG entries since init: %d\n\n",
282 h->devname,
283 h->product_name,
284 (unsigned long)h->board_id,
285 h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], h->firm_ver[3],
Mike Millerfb86a352006-01-08 01:03:50 -0800286 (unsigned int)h->intr[SIMPLE_MODE_INT],
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 h->num_luns,
288 h->Qdepth, h->commands_outstanding,
289 h->maxQsinceinit, h->max_outstanding, h->maxSG);
290
291 pos += size; len += size;
292 cciss_proc_tape_report(ctlr, buffer, &pos, &len);
293 for(i=0; i<=h->highest_lun; i++) {
294
295 drv = &h->drv[i];
Mike Millerddd47442005-09-13 01:25:22 -0700296 if (drv->heads == 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700297 continue;
298
299 vol_sz = drv->nr_blocks;
300 vol_sz_frac = sector_div(vol_sz, ENG_GIG_FACTOR);
301 vol_sz_frac *= 100;
302 sector_div(vol_sz_frac, ENG_GIG_FACTOR);
303
304 if (drv->raid_level > 5)
305 drv->raid_level = RAID_UNKNOWN;
306 size = sprintf(buffer+len, "cciss/c%dd%d:"
307 "\t%4u.%02uGB\tRAID %s\n",
308 ctlr, i, (int)vol_sz, (int)vol_sz_frac,
309 raid_label[drv->raid_level]);
310 pos += size; len += size;
311 }
312
313 *eof = 1;
314 *start = buffer+offset;
315 len -= offset;
316 if (len>length)
317 len = length;
318 h->busy_configuring = 0;
319 return len;
320}
321
322static int
323cciss_proc_write(struct file *file, const char __user *buffer,
324 unsigned long count, void *data)
325{
326 unsigned char cmd[80];
327 int len;
328#ifdef CONFIG_CISS_SCSI_TAPE
329 ctlr_info_t *h = (ctlr_info_t *) data;
330 int rc;
331#endif
332
333 if (count > sizeof(cmd)-1) return -EINVAL;
334 if (copy_from_user(cmd, buffer, count)) return -EFAULT;
335 cmd[count] = '\0';
336 len = strlen(cmd); // above 3 lines ensure safety
337 if (len && cmd[len-1] == '\n')
338 cmd[--len] = '\0';
339# ifdef CONFIG_CISS_SCSI_TAPE
340 if (strcmp("engage scsi", cmd)==0) {
341 rc = cciss_engage_scsi(h->ctlr);
342 if (rc != 0) return -rc;
343 return count;
344 }
345 /* might be nice to have "disengage" too, but it's not
346 safely possible. (only 1 module use count, lock issues.) */
347# endif
348 return -EINVAL;
349}
350
351/*
352 * Get us a file in /proc/cciss that says something about each controller.
353 * Create /proc/cciss if it doesn't exist yet.
354 */
355static void __devinit cciss_procinit(int i)
356{
357 struct proc_dir_entry *pde;
358
359 if (proc_cciss == NULL) {
360 proc_cciss = proc_mkdir("cciss", proc_root_driver);
361 if (!proc_cciss)
362 return;
363 }
364
365 pde = create_proc_read_entry(hba[i]->devname,
366 S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH,
367 proc_cciss, cciss_proc_get_info, hba[i]);
368 pde->write_proc = cciss_proc_write;
369}
370#endif /* CONFIG_PROC_FS */
371
372/*
373 * For operations that cannot sleep, a command block is allocated at init,
374 * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track
375 * which ones are free or in use. For operations that can wait for kmalloc
376 * to possible sleep, this routine can be called with get_from_pool set to 0.
377 * cmd_free() MUST be called with a got_from_pool set to 0 if cmd_alloc was.
378 */
379static CommandList_struct * cmd_alloc(ctlr_info_t *h, int get_from_pool)
380{
381 CommandList_struct *c;
382 int i;
383 u64bit temp64;
384 dma_addr_t cmd_dma_handle, err_dma_handle;
385
386 if (!get_from_pool)
387 {
388 c = (CommandList_struct *) pci_alloc_consistent(
389 h->pdev, sizeof(CommandList_struct), &cmd_dma_handle);
390 if(c==NULL)
391 return NULL;
392 memset(c, 0, sizeof(CommandList_struct));
393
Mike Miller33079b22005-09-13 01:25:22 -0700394 c->cmdindex = -1;
395
Linus Torvalds1da177e2005-04-16 15:20:36 -0700396 c->err_info = (ErrorInfo_struct *)pci_alloc_consistent(
397 h->pdev, sizeof(ErrorInfo_struct),
398 &err_dma_handle);
399
400 if (c->err_info == NULL)
401 {
402 pci_free_consistent(h->pdev,
403 sizeof(CommandList_struct), c, cmd_dma_handle);
404 return NULL;
405 }
406 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
407 } else /* get it out of the controllers pool */
408 {
409 do {
410 i = find_first_zero_bit(h->cmd_pool_bits, NR_CMDS);
411 if (i == NR_CMDS)
412 return NULL;
413 } while(test_and_set_bit(i & (BITS_PER_LONG - 1), h->cmd_pool_bits+(i/BITS_PER_LONG)) != 0);
414#ifdef CCISS_DEBUG
415 printk(KERN_DEBUG "cciss: using command buffer %d\n", i);
416#endif
417 c = h->cmd_pool + i;
418 memset(c, 0, sizeof(CommandList_struct));
419 cmd_dma_handle = h->cmd_pool_dhandle
420 + i*sizeof(CommandList_struct);
421 c->err_info = h->errinfo_pool + i;
422 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
423 err_dma_handle = h->errinfo_pool_dhandle
424 + i*sizeof(ErrorInfo_struct);
425 h->nr_allocs++;
Mike Miller33079b22005-09-13 01:25:22 -0700426
427 c->cmdindex = i;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 }
429
430 c->busaddr = (__u32) cmd_dma_handle;
431 temp64.val = (__u64) err_dma_handle;
432 c->ErrDesc.Addr.lower = temp64.val32.lower;
433 c->ErrDesc.Addr.upper = temp64.val32.upper;
434 c->ErrDesc.Len = sizeof(ErrorInfo_struct);
435
436 c->ctlr = h->ctlr;
437 return c;
438
439
440}
441
442/*
443 * Frees a command block that was previously allocated with cmd_alloc().
444 */
445static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool)
446{
447 int i;
448 u64bit temp64;
449
450 if( !got_from_pool)
451 {
452 temp64.val32.lower = c->ErrDesc.Addr.lower;
453 temp64.val32.upper = c->ErrDesc.Addr.upper;
454 pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct),
455 c->err_info, (dma_addr_t) temp64.val);
456 pci_free_consistent(h->pdev, sizeof(CommandList_struct),
457 c, (dma_addr_t) c->busaddr);
458 } else
459 {
460 i = c - h->cmd_pool;
461 clear_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG));
462 h->nr_frees++;
463 }
464}
465
466static inline ctlr_info_t *get_host(struct gendisk *disk)
467{
468 return disk->queue->queuedata;
469}
470
471static inline drive_info_struct *get_drv(struct gendisk *disk)
472{
473 return disk->private_data;
474}
475
476/*
477 * Open. Make sure the device is really there.
478 */
479static int cciss_open(struct inode *inode, struct file *filep)
480{
481 ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
482 drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
483
484#ifdef CCISS_DEBUG
485 printk(KERN_DEBUG "cciss_open %s\n", inode->i_bdev->bd_disk->disk_name);
486#endif /* CCISS_DEBUG */
487
Mike Millerddd47442005-09-13 01:25:22 -0700488 if (host->busy_initializing || drv->busy_configuring)
489 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490 /*
491 * Root is allowed to open raw volume zero even if it's not configured
492 * so array config can still work. Root is also allowed to open any
493 * volume that has a LUN ID, so it can issue IOCTL to reread the
494 * disk information. I don't think I really like this
495 * but I'm already using way to many device nodes to claim another one
496 * for "raw controller".
497 */
498 if (drv->nr_blocks == 0) {
499 if (iminor(inode) != 0) { /* not node 0? */
500 /* if not node 0 make sure it is a partition = 0 */
501 if (iminor(inode) & 0x0f) {
502 return -ENXIO;
503 /* if it is, make sure we have a LUN ID */
504 } else if (drv->LunID == 0) {
505 return -ENXIO;
506 }
507 }
508 if (!capable(CAP_SYS_ADMIN))
509 return -EPERM;
510 }
511 drv->usage_count++;
512 host->usage_count++;
513 return 0;
514}
515/*
516 * Close. Sync first.
517 */
518static int cciss_release(struct inode *inode, struct file *filep)
519{
520 ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
521 drive_info_struct *drv = get_drv(inode->i_bdev->bd_disk);
522
523#ifdef CCISS_DEBUG
524 printk(KERN_DEBUG "cciss_release %s\n", inode->i_bdev->bd_disk->disk_name);
525#endif /* CCISS_DEBUG */
526
527 drv->usage_count--;
528 host->usage_count--;
529 return 0;
530}
531
532#ifdef CONFIG_COMPAT
533
534static int do_ioctl(struct file *f, unsigned cmd, unsigned long arg)
535{
536 int ret;
537 lock_kernel();
538 ret = cciss_ioctl(f->f_dentry->d_inode, f, cmd, arg);
539 unlock_kernel();
540 return ret;
541}
542
543static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, unsigned long arg);
544static int cciss_ioctl32_big_passthru(struct file *f, unsigned cmd, unsigned long arg);
545
546static long cciss_compat_ioctl(struct file *f, unsigned cmd, unsigned long arg)
547{
548 switch (cmd) {
549 case CCISS_GETPCIINFO:
550 case CCISS_GETINTINFO:
551 case CCISS_SETINTINFO:
552 case CCISS_GETNODENAME:
553 case CCISS_SETNODENAME:
554 case CCISS_GETHEARTBEAT:
555 case CCISS_GETBUSTYPES:
556 case CCISS_GETFIRMVER:
557 case CCISS_GETDRIVVER:
558 case CCISS_REVALIDVOLS:
559 case CCISS_DEREGDISK:
560 case CCISS_REGNEWDISK:
561 case CCISS_REGNEWD:
562 case CCISS_RESCANDISK:
563 case CCISS_GETLUNINFO:
564 return do_ioctl(f, cmd, arg);
565
566 case CCISS_PASSTHRU32:
567 return cciss_ioctl32_passthru(f, cmd, arg);
568 case CCISS_BIG_PASSTHRU32:
569 return cciss_ioctl32_big_passthru(f, cmd, arg);
570
571 default:
572 return -ENOIOCTLCMD;
573 }
574}
575
576static int cciss_ioctl32_passthru(struct file *f, unsigned cmd, unsigned long arg)
577{
578 IOCTL32_Command_struct __user *arg32 =
579 (IOCTL32_Command_struct __user *) arg;
580 IOCTL_Command_struct arg64;
581 IOCTL_Command_struct __user *p = compat_alloc_user_space(sizeof(arg64));
582 int err;
583 u32 cp;
584
585 err = 0;
586 err |= copy_from_user(&arg64.LUN_info, &arg32->LUN_info, sizeof(arg64.LUN_info));
587 err |= copy_from_user(&arg64.Request, &arg32->Request, sizeof(arg64.Request));
588 err |= copy_from_user(&arg64.error_info, &arg32->error_info, sizeof(arg64.error_info));
589 err |= get_user(arg64.buf_size, &arg32->buf_size);
590 err |= get_user(cp, &arg32->buf);
591 arg64.buf = compat_ptr(cp);
592 err |= copy_to_user(p, &arg64, sizeof(arg64));
593
594 if (err)
595 return -EFAULT;
596
597 err = do_ioctl(f, CCISS_PASSTHRU, (unsigned long) p);
598 if (err)
599 return err;
600 err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info));
601 if (err)
602 return -EFAULT;
603 return err;
604}
605
606static int cciss_ioctl32_big_passthru(struct file *file, unsigned cmd, unsigned long arg)
607{
608 BIG_IOCTL32_Command_struct __user *arg32 =
609 (BIG_IOCTL32_Command_struct __user *) arg;
610 BIG_IOCTL_Command_struct arg64;
611 BIG_IOCTL_Command_struct __user *p = compat_alloc_user_space(sizeof(arg64));
612 int err;
613 u32 cp;
614
615 err = 0;
616 err |= copy_from_user(&arg64.LUN_info, &arg32->LUN_info, sizeof(arg64.LUN_info));
617 err |= copy_from_user(&arg64.Request, &arg32->Request, sizeof(arg64.Request));
618 err |= copy_from_user(&arg64.error_info, &arg32->error_info, sizeof(arg64.error_info));
619 err |= get_user(arg64.buf_size, &arg32->buf_size);
620 err |= get_user(arg64.malloc_size, &arg32->malloc_size);
621 err |= get_user(cp, &arg32->buf);
622 arg64.buf = compat_ptr(cp);
623 err |= copy_to_user(p, &arg64, sizeof(arg64));
624
625 if (err)
626 return -EFAULT;
627
628 err = do_ioctl(file, CCISS_BIG_PASSTHRU, (unsigned long) p);
629 if (err)
630 return err;
631 err |= copy_in_user(&arg32->error_info, &p->error_info, sizeof(arg32->error_info));
632 if (err)
633 return -EFAULT;
634 return err;
635}
636#endif
Christoph Hellwiga885c8c2006-01-08 01:02:50 -0800637
638static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo)
639{
640 drive_info_struct *drv = get_drv(bdev->bd_disk);
641
642 if (!drv->cylinders)
643 return -ENXIO;
644
645 geo->heads = drv->heads;
646 geo->sectors = drv->sectors;
647 geo->cylinders = drv->cylinders;
648 return 0;
649}
650
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651/*
652 * ioctl
653 */
654static int cciss_ioctl(struct inode *inode, struct file *filep,
655 unsigned int cmd, unsigned long arg)
656{
657 struct block_device *bdev = inode->i_bdev;
658 struct gendisk *disk = bdev->bd_disk;
659 ctlr_info_t *host = get_host(disk);
660 drive_info_struct *drv = get_drv(disk);
661 int ctlr = host->ctlr;
662 void __user *argp = (void __user *)arg;
663
664#ifdef CCISS_DEBUG
665 printk(KERN_DEBUG "cciss_ioctl: Called with cmd=%x %lx\n", cmd, arg);
666#endif /* CCISS_DEBUG */
667
668 switch(cmd) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700669 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 }
Eric Sesterhenn06ff37f2006-03-08 11:21:52 +0100997 buff = kzalloc(MAXSGENTRIES * sizeof(char *), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700998 if (!buff) {
999 status = -ENOMEM;
1000 goto cleanup1;
1001 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001002 buff_size = (int *) kmalloc(MAXSGENTRIES * sizeof(int),
1003 GFP_KERNEL);
1004 if (!buff_size) {
1005 status = -ENOMEM;
1006 goto cleanup1;
1007 }
1008 left = ioc->buf_size;
1009 data_ptr = ioc->buf;
1010 while (left) {
1011 sz = (left > ioc->malloc_size) ? ioc->malloc_size : left;
1012 buff_size[sg_used] = sz;
1013 buff[sg_used] = kmalloc(sz, GFP_KERNEL);
1014 if (buff[sg_used] == NULL) {
1015 status = -ENOMEM;
1016 goto cleanup1;
1017 }
Jens Axboe15534d32005-11-18 22:02:44 +01001018 if (ioc->Request.Type.Direction == XFER_WRITE) {
1019 if (copy_from_user(buff[sg_used], data_ptr, sz)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001020 status = -ENOMEM;
Jens Axboe15534d32005-11-18 22:02:44 +01001021 goto cleanup1;
1022 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001023 } else {
1024 memset(buff[sg_used], 0, sz);
1025 }
1026 left -= sz;
1027 data_ptr += sz;
1028 sg_used++;
1029 }
1030 if ((c = cmd_alloc(host , 0)) == NULL) {
1031 status = -ENOMEM;
1032 goto cleanup1;
1033 }
1034 c->cmd_type = CMD_IOCTL_PEND;
1035 c->Header.ReplyQueue = 0;
1036
1037 if( ioc->buf_size > 0) {
1038 c->Header.SGList = sg_used;
1039 c->Header.SGTotal= sg_used;
1040 } else {
1041 c->Header.SGList = 0;
1042 c->Header.SGTotal= 0;
1043 }
1044 c->Header.LUN = ioc->LUN_info;
1045 c->Header.Tag.lower = c->busaddr;
1046
1047 c->Request = ioc->Request;
1048 if (ioc->buf_size > 0 ) {
1049 int i;
1050 for(i=0; i<sg_used; i++) {
1051 temp64.val = pci_map_single( host->pdev, buff[i],
1052 buff_size[i],
1053 PCI_DMA_BIDIRECTIONAL);
1054 c->SG[i].Addr.lower = temp64.val32.lower;
1055 c->SG[i].Addr.upper = temp64.val32.upper;
1056 c->SG[i].Len = buff_size[i];
1057 c->SG[i].Ext = 0; /* we are not chaining */
1058 }
1059 }
1060 c->waiting = &wait;
1061 /* Put the request on the tail of the request queue */
1062 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1063 addQ(&host->reqQ, c);
1064 host->Qdepth++;
1065 start_io(host);
1066 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1067 wait_for_completion(&wait);
1068 /* unlock the buffers from DMA */
1069 for(i=0; i<sg_used; i++) {
1070 temp64.val32.lower = c->SG[i].Addr.lower;
1071 temp64.val32.upper = c->SG[i].Addr.upper;
1072 pci_unmap_single( host->pdev, (dma_addr_t) temp64.val,
1073 buff_size[i], PCI_DMA_BIDIRECTIONAL);
1074 }
1075 /* Copy the error information out */
1076 ioc->error_info = *(c->err_info);
1077 if (copy_to_user(argp, ioc, sizeof(*ioc))) {
1078 cmd_free(host, c, 0);
1079 status = -EFAULT;
1080 goto cleanup1;
1081 }
1082 if (ioc->Request.Type.Direction == XFER_READ) {
1083 /* Copy the data out of the buffer we created */
1084 BYTE __user *ptr = ioc->buf;
1085 for(i=0; i< sg_used; i++) {
1086 if (copy_to_user(ptr, buff[i], buff_size[i])) {
1087 cmd_free(host, c, 0);
1088 status = -EFAULT;
1089 goto cleanup1;
1090 }
1091 ptr += buff_size[i];
1092 }
1093 }
1094 cmd_free(host, c, 0);
1095 status = 0;
1096cleanup1:
1097 if (buff) {
1098 for(i=0; i<sg_used; i++)
Jesper Juhl6044ec82005-11-07 01:01:32 -08001099 kfree(buff[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001100 kfree(buff);
1101 }
Jesper Juhl6044ec82005-11-07 01:01:32 -08001102 kfree(buff_size);
1103 kfree(ioc);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001104 return(status);
1105 }
1106 default:
1107 return -ENOTTY;
1108 }
1109
1110}
1111
1112/*
1113 * revalidate_allvol is for online array config utilities. After a
1114 * utility reconfigures the drives in the array, it can use this function
1115 * (through an ioctl) to make the driver zap any previous disk structs for
1116 * that controller and get new ones.
1117 *
1118 * Right now I'm using the getgeometry() function to do this, but this
1119 * function should probably be finer grained and allow you to revalidate one
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07001120 * particular logical volume (instead of all of them on a particular
Linus Torvalds1da177e2005-04-16 15:20:36 -07001121 * controller).
1122 */
1123static int revalidate_allvol(ctlr_info_t *host)
1124{
1125 int ctlr = host->ctlr, i;
1126 unsigned long flags;
1127
1128 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1129 if (host->usage_count > 1) {
1130 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1131 printk(KERN_WARNING "cciss: Device busy for volume"
1132 " revalidation (usage=%d)\n", host->usage_count);
1133 return -EBUSY;
1134 }
1135 host->usage_count++;
1136 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1137
1138 for(i=0; i< NWD; i++) {
1139 struct gendisk *disk = host->gendisk[i];
mikem6f5a0f72005-11-18 22:05:36 +01001140 if (disk) {
1141 request_queue_t *q = disk->queue;
1142
1143 if (disk->flags & GENHD_FL_UP)
1144 del_gendisk(disk);
1145 if (q)
1146 blk_cleanup_queue(q);
mikem6f5a0f72005-11-18 22:05:36 +01001147 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001148 }
1149
1150 /*
1151 * Set the partition and block size structures for all volumes
1152 * on this controller to zero. We will reread all of this data
1153 */
1154 memset(host->drv, 0, sizeof(drive_info_struct)
1155 * CISS_MAX_LUN);
1156 /*
1157 * Tell the array controller not to give us any interrupts while
1158 * we check the new geometry. Then turn interrupts back on when
1159 * we're done.
1160 */
1161 host->access.set_intr_mask(host, CCISS_INTR_OFF);
1162 cciss_getgeometry(ctlr);
1163 host->access.set_intr_mask(host, CCISS_INTR_ON);
1164
1165 /* Loop through each real device */
1166 for (i = 0; i < NWD; i++) {
1167 struct gendisk *disk = host->gendisk[i];
1168 drive_info_struct *drv = &(host->drv[i]);
1169 /* we must register the controller even if no disks exist */
1170 /* this is for the online array utilities */
1171 if (!drv->heads && i)
1172 continue;
Mike Millerad2b9312005-07-28 01:07:31 -07001173 blk_queue_hardsect_size(drv->queue, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001174 set_capacity(disk, drv->nr_blocks);
1175 add_disk(disk);
1176 }
1177 host->usage_count--;
1178 return 0;
1179}
1180
Mike Millerca1e0482006-04-10 15:38:07 -07001181static inline void complete_buffers(struct bio *bio, int status)
1182{
1183 while (bio) {
1184 struct bio *xbh = bio->bi_next;
1185 int nr_sectors = bio_sectors(bio);
1186
1187 bio->bi_next = NULL;
1188 blk_finished_io(len);
1189 bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO);
1190 bio = xbh;
1191 }
1192
1193}
1194
1195static void cciss_softirq_done(struct request *rq)
1196{
1197 CommandList_struct *cmd = rq->completion_data;
1198 ctlr_info_t *h = hba[cmd->ctlr];
1199 unsigned long flags;
1200 u64bit temp64;
1201 int i, ddir;
1202
1203 if (cmd->Request.Type.Direction == XFER_READ)
1204 ddir = PCI_DMA_FROMDEVICE;
1205 else
1206 ddir = PCI_DMA_TODEVICE;
1207
1208 /* command did not need to be retried */
1209 /* unmap the DMA mapping for all the scatter gather elements */
1210 for(i=0; i<cmd->Header.SGList; i++) {
1211 temp64.val32.lower = cmd->SG[i].Addr.lower;
1212 temp64.val32.upper = cmd->SG[i].Addr.upper;
1213 pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir);
1214 }
1215
1216 complete_buffers(rq->bio, rq->errors);
1217
1218#ifdef CCISS_DEBUG
1219 printk("Done with %p\n", rq);
1220#endif /* CCISS_DEBUG */
1221
Matt Mackall8bd0b972006-06-25 05:47:11 -07001222 add_disk_randomness(rq->rq_disk);
Mike Millerca1e0482006-04-10 15:38:07 -07001223 spin_lock_irqsave(&h->lock, flags);
1224 end_that_request_last(rq, rq->errors);
1225 cmd_free(h, cmd,1);
1226 spin_unlock_irqrestore(&h->lock, flags);
1227}
1228
Mike Millerddd47442005-09-13 01:25:22 -07001229/* This function will check the usage_count of the drive to be updated/added.
1230 * If the usage_count is zero then the drive information will be updated and
1231 * the disk will be re-registered with the kernel. If not then it will be
1232 * left alone for the next reboot. The exception to this is disk 0 which
1233 * will always be left registered with the kernel since it is also the
1234 * controller node. Any changes to disk 0 will show up on the next
1235 * reboot.
1236*/
1237static void cciss_update_drive_info(int ctlr, int drv_index)
1238 {
1239 ctlr_info_t *h = hba[ctlr];
1240 struct gendisk *disk;
1241 ReadCapdata_struct *size_buff = NULL;
1242 InquiryData_struct *inq_buff = NULL;
1243 unsigned int block_size;
1244 unsigned int total_size;
1245 unsigned long flags = 0;
1246 int ret = 0;
1247
1248 /* if the disk already exists then deregister it before proceeding*/
1249 if (h->drv[drv_index].raid_level != -1){
1250 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
1251 h->drv[drv_index].busy_configuring = 1;
1252 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1253 ret = deregister_disk(h->gendisk[drv_index],
1254 &h->drv[drv_index], 0);
1255 h->drv[drv_index].busy_configuring = 0;
1256 }
1257
1258 /* If the disk is in use return */
1259 if (ret)
1260 return;
1261
1262
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07001263 /* Get information about the disk and modify the driver structure */
Mike Millerddd47442005-09-13 01:25:22 -07001264 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
1265 if (size_buff == NULL)
1266 goto mem_msg;
1267 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
1268 if (inq_buff == NULL)
1269 goto mem_msg;
1270
1271 cciss_read_capacity(ctlr, drv_index, size_buff, 1,
1272 &total_size, &block_size);
1273 cciss_geometry_inquiry(ctlr, drv_index, 1, total_size, block_size,
1274 inq_buff, &h->drv[drv_index]);
1275
1276 ++h->num_luns;
1277 disk = h->gendisk[drv_index];
1278 set_capacity(disk, h->drv[drv_index].nr_blocks);
1279
1280
1281 /* if it's the controller it's already added */
1282 if (drv_index){
1283 disk->queue = blk_init_queue(do_cciss_request, &h->lock);
1284
1285 /* Set up queue information */
1286 disk->queue->backing_dev_info.ra_pages = READ_AHEAD;
1287 blk_queue_bounce_limit(disk->queue, hba[ctlr]->pdev->dma_mask);
1288
1289 /* This is a hardware imposed limit. */
1290 blk_queue_max_hw_segments(disk->queue, MAXSGENTRIES);
1291
1292 /* This is a limit in the driver and could be eliminated. */
1293 blk_queue_max_phys_segments(disk->queue, MAXSGENTRIES);
1294
1295 blk_queue_max_sectors(disk->queue, 512);
1296
Mike Millerca1e0482006-04-10 15:38:07 -07001297 blk_queue_softirq_done(disk->queue, cciss_softirq_done);
1298
Mike Millerddd47442005-09-13 01:25:22 -07001299 disk->queue->queuedata = hba[ctlr];
1300
1301 blk_queue_hardsect_size(disk->queue,
1302 hba[ctlr]->drv[drv_index].block_size);
1303
1304 h->drv[drv_index].queue = disk->queue;
1305 add_disk(disk);
1306 }
1307
1308freeret:
1309 kfree(size_buff);
1310 kfree(inq_buff);
1311 return;
1312mem_msg:
1313 printk(KERN_ERR "cciss: out of memory\n");
1314 goto freeret;
1315}
1316
1317/* This function will find the first index of the controllers drive array
1318 * that has a -1 for the raid_level and will return that index. This is
1319 * where new drives will be added. If the index to be returned is greater
1320 * than the highest_lun index for the controller then highest_lun is set
1321 * to this new index. If there are no available indexes then -1 is returned.
1322*/
1323static int cciss_find_free_drive_index(int ctlr)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001324{
Mike Millerddd47442005-09-13 01:25:22 -07001325 int i;
1326
1327 for (i=0; i < CISS_MAX_LUN; i++){
1328 if (hba[ctlr]->drv[i].raid_level == -1){
1329 if (i > hba[ctlr]->highest_lun)
1330 hba[ctlr]->highest_lun = i;
1331 return i;
1332 }
1333 }
1334 return -1;
1335}
1336
1337/* This function will add and remove logical drives from the Logical
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07001338 * drive array of the controller and maintain persistency of ordering
Mike Millerddd47442005-09-13 01:25:22 -07001339 * so that mount points are preserved until the next reboot. This allows
1340 * for the removal of logical drives in the middle of the drive array
1341 * without a re-ordering of those drives.
1342 * INPUT
1343 * h = The controller to perform the operations on
1344 * del_disk = The disk to remove if specified. If the value given
1345 * is NULL then no disk is removed.
1346*/
1347static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk)
1348{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001349 int ctlr = h->ctlr;
Mike Millerddd47442005-09-13 01:25:22 -07001350 int num_luns;
1351 ReportLunData_struct *ld_buff = NULL;
1352 drive_info_struct *drv = NULL;
1353 int return_code;
1354 int listlength = 0;
1355 int i;
1356 int drv_found;
1357 int drv_index = 0;
1358 __u32 lunid = 0;
1359 unsigned long flags;
1360
1361 /* Set busy_configuring flag for this operation */
1362 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
1363 if (h->num_luns >= CISS_MAX_LUN){
1364 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1365 return -EINVAL;
1366 }
1367
1368 if (h->busy_configuring){
1369 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1370 return -EBUSY;
1371 }
1372 h->busy_configuring = 1;
1373
1374 /* if del_disk is NULL then we are being called to add a new disk
1375 * and update the logical drive table. If it is not NULL then
1376 * we will check if the disk is in use or not.
1377 */
1378 if (del_disk != NULL){
1379 drv = get_drv(del_disk);
1380 drv->busy_configuring = 1;
1381 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1382 return_code = deregister_disk(del_disk, drv, 1);
1383 drv->busy_configuring = 0;
1384 h->busy_configuring = 0;
1385 return return_code;
1386 } else {
1387 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
1388 if (!capable(CAP_SYS_RAWIO))
1389 return -EPERM;
1390
1391 ld_buff = kzalloc(sizeof(ReportLunData_struct), GFP_KERNEL);
1392 if (ld_buff == NULL)
1393 goto mem_msg;
1394
1395 return_code = sendcmd_withirq(CISS_REPORT_LOG, ctlr, ld_buff,
1396 sizeof(ReportLunData_struct), 0, 0, 0,
1397 TYPE_CMD);
1398
1399 if (return_code == IO_OK){
1400 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24;
1401 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16;
1402 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8;
1403 listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]);
1404 } else{ /* reading number of logical volumes failed */
1405 printk(KERN_WARNING "cciss: report logical volume"
1406 " command failed\n");
1407 listlength = 0;
1408 goto freeret;
1409 }
1410
1411 num_luns = listlength / 8; /* 8 bytes per entry */
1412 if (num_luns > CISS_MAX_LUN){
1413 num_luns = CISS_MAX_LUN;
1414 printk(KERN_WARNING "cciss: more luns configured"
1415 " on controller than can be handled by"
1416 " this driver.\n");
1417 }
1418
1419 /* Compare controller drive array to drivers drive array.
1420 * Check for updates in the drive information and any new drives
1421 * on the controller.
1422 */
1423 for (i=0; i < num_luns; i++){
1424 int j;
1425
1426 drv_found = 0;
1427
1428 lunid = (0xff &
1429 (unsigned int)(ld_buff->LUN[i][3])) << 24;
1430 lunid |= (0xff &
1431 (unsigned int)(ld_buff->LUN[i][2])) << 16;
1432 lunid |= (0xff &
1433 (unsigned int)(ld_buff->LUN[i][1])) << 8;
1434 lunid |= 0xff &
1435 (unsigned int)(ld_buff->LUN[i][0]);
1436
1437 /* Find if the LUN is already in the drive array
1438 * of the controller. If so then update its info
1439 * if not is use. If it does not exist then find
1440 * the first free index and add it.
1441 */
1442 for (j=0; j <= h->highest_lun; j++){
1443 if (h->drv[j].LunID == lunid){
1444 drv_index = j;
1445 drv_found = 1;
1446 }
1447 }
1448
1449 /* check if the drive was found already in the array */
1450 if (!drv_found){
1451 drv_index = cciss_find_free_drive_index(ctlr);
1452 if (drv_index == -1)
1453 goto freeret;
1454
1455 }
1456 h->drv[drv_index].LunID = lunid;
1457 cciss_update_drive_info(ctlr, drv_index);
1458 } /* end for */
1459 } /* end else */
1460
1461freeret:
1462 kfree(ld_buff);
1463 h->busy_configuring = 0;
1464 /* We return -1 here to tell the ACU that we have registered/updated
1465 * all of the drives that we can and to keep it from calling us
1466 * additional times.
1467 */
1468 return -1;
1469mem_msg:
1470 printk(KERN_ERR "cciss: out of memory\n");
1471 goto freeret;
1472}
1473
1474/* This function will deregister the disk and it's queue from the
1475 * kernel. It must be called with the controller lock held and the
1476 * drv structures busy_configuring flag set. It's parameters are:
1477 *
1478 * disk = This is the disk to be deregistered
1479 * drv = This is the drive_info_struct associated with the disk to be
1480 * deregistered. It contains information about the disk used
1481 * by the driver.
1482 * clear_all = This flag determines whether or not the disk information
1483 * is going to be completely cleared out and the highest_lun
1484 * reset. Sometimes we want to clear out information about
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07001485 * the disk in preparation for re-adding it. In this case
Mike Millerddd47442005-09-13 01:25:22 -07001486 * the highest_lun should be left unchanged and the LunID
1487 * should not be cleared.
1488*/
1489static int deregister_disk(struct gendisk *disk, drive_info_struct *drv,
1490 int clear_all)
1491{
1492 ctlr_info_t *h = get_host(disk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001493
1494 if (!capable(CAP_SYS_RAWIO))
1495 return -EPERM;
1496
Linus Torvalds1da177e2005-04-16 15:20:36 -07001497 /* make sure logical volume is NOT is use */
Mike Millerddd47442005-09-13 01:25:22 -07001498 if(clear_all || (h->gendisk[0] == disk)) {
1499 if (drv->usage_count > 1)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001500 return -EBUSY;
1501 }
Mike Millerddd47442005-09-13 01:25:22 -07001502 else
1503 if( drv->usage_count > 0 )
1504 return -EBUSY;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001505
Mike Millerddd47442005-09-13 01:25:22 -07001506 /* invalidate the devices and deregister the disk. If it is disk
1507 * zero do not deregister it but just zero out it's values. This
1508 * allows us to delete disk zero but keep the controller registered.
1509 */
1510 if (h->gendisk[0] != disk){
mikem6f5a0f72005-11-18 22:05:36 +01001511 if (disk) {
1512 request_queue_t *q = disk->queue;
1513 if (disk->flags & GENHD_FL_UP)
1514 del_gendisk(disk);
Mike Miller2f6331f2005-12-12 22:17:14 -08001515 if (q) {
mikem6f5a0f72005-11-18 22:05:36 +01001516 blk_cleanup_queue(q);
Mike Miller2f6331f2005-12-12 22:17:14 -08001517 drv->queue = NULL;
1518 }
Mike Millerddd47442005-09-13 01:25:22 -07001519 }
1520 }
1521
1522 --h->num_luns;
1523 /* zero out the disk size info */
1524 drv->nr_blocks = 0;
1525 drv->block_size = 0;
1526 drv->heads = 0;
1527 drv->sectors = 0;
1528 drv->cylinders = 0;
1529 drv->raid_level = -1; /* This can be used as a flag variable to
1530 * indicate that this element of the drive
1531 * array is free.
1532 */
1533
1534 if (clear_all){
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 /* check to see if it was the last disk */
1536 if (drv == h->drv + h->highest_lun) {
1537 /* if so, find the new hightest lun */
1538 int i, newhighest =-1;
1539 for(i=0; i<h->highest_lun; i++) {
1540 /* if the disk has size > 0, it is available */
Mike Millerddd47442005-09-13 01:25:22 -07001541 if (h->drv[i].heads)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001542 newhighest = i;
1543 }
1544 h->highest_lun = newhighest;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001545 }
Mike Millerddd47442005-09-13 01:25:22 -07001546
Linus Torvalds1da177e2005-04-16 15:20:36 -07001547 drv->LunID = 0;
Mike Millerddd47442005-09-13 01:25:22 -07001548 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001549 return(0);
1550}
Mike Millerddd47442005-09-13 01:25:22 -07001551
Linus Torvalds1da177e2005-04-16 15:20:36 -07001552static int fill_cmd(CommandList_struct *c, __u8 cmd, int ctlr, void *buff,
1553 size_t size,
1554 unsigned int use_unit_num, /* 0: address the controller,
1555 1: address logical volume log_unit,
1556 2: periph device address is scsi3addr */
1557 unsigned int log_unit, __u8 page_code, unsigned char *scsi3addr,
1558 int cmd_type)
1559{
1560 ctlr_info_t *h= hba[ctlr];
1561 u64bit buff_dma_handle;
1562 int status = IO_OK;
1563
1564 c->cmd_type = CMD_IOCTL_PEND;
1565 c->Header.ReplyQueue = 0;
1566 if( buff != NULL) {
1567 c->Header.SGList = 1;
1568 c->Header.SGTotal= 1;
1569 } else {
1570 c->Header.SGList = 0;
1571 c->Header.SGTotal= 0;
1572 }
1573 c->Header.Tag.lower = c->busaddr;
1574
1575 c->Request.Type.Type = cmd_type;
1576 if (cmd_type == TYPE_CMD) {
1577 switch(cmd) {
1578 case CISS_INQUIRY:
1579 /* If the logical unit number is 0 then, this is going
1580 to controller so It's a physical command
1581 mode = 0 target = 0. So we have nothing to write.
1582 otherwise, if use_unit_num == 1,
1583 mode = 1(volume set addressing) target = LUNID
1584 otherwise, if use_unit_num == 2,
1585 mode = 0(periph dev addr) target = scsi3addr */
1586 if (use_unit_num == 1) {
1587 c->Header.LUN.LogDev.VolId=
1588 h->drv[log_unit].LunID;
1589 c->Header.LUN.LogDev.Mode = 1;
1590 } else if (use_unit_num == 2) {
1591 memcpy(c->Header.LUN.LunAddrBytes,scsi3addr,8);
1592 c->Header.LUN.LogDev.Mode = 0;
1593 }
1594 /* are we trying to read a vital product page */
1595 if(page_code != 0) {
1596 c->Request.CDB[1] = 0x01;
1597 c->Request.CDB[2] = page_code;
1598 }
1599 c->Request.CDBLen = 6;
1600 c->Request.Type.Attribute = ATTR_SIMPLE;
1601 c->Request.Type.Direction = XFER_READ;
1602 c->Request.Timeout = 0;
1603 c->Request.CDB[0] = CISS_INQUIRY;
1604 c->Request.CDB[4] = size & 0xFF;
1605 break;
1606 case CISS_REPORT_LOG:
1607 case CISS_REPORT_PHYS:
1608 /* Talking to controller so It's a physical command
1609 mode = 00 target = 0. Nothing to write.
1610 */
1611 c->Request.CDBLen = 12;
1612 c->Request.Type.Attribute = ATTR_SIMPLE;
1613 c->Request.Type.Direction = XFER_READ;
1614 c->Request.Timeout = 0;
1615 c->Request.CDB[0] = cmd;
1616 c->Request.CDB[6] = (size >> 24) & 0xFF; //MSB
1617 c->Request.CDB[7] = (size >> 16) & 0xFF;
1618 c->Request.CDB[8] = (size >> 8) & 0xFF;
1619 c->Request.CDB[9] = size & 0xFF;
1620 break;
1621
1622 case CCISS_READ_CAPACITY:
1623 c->Header.LUN.LogDev.VolId = h->drv[log_unit].LunID;
1624 c->Header.LUN.LogDev.Mode = 1;
1625 c->Request.CDBLen = 10;
1626 c->Request.Type.Attribute = ATTR_SIMPLE;
1627 c->Request.Type.Direction = XFER_READ;
1628 c->Request.Timeout = 0;
1629 c->Request.CDB[0] = cmd;
1630 break;
1631 case CCISS_CACHE_FLUSH:
1632 c->Request.CDBLen = 12;
1633 c->Request.Type.Attribute = ATTR_SIMPLE;
1634 c->Request.Type.Direction = XFER_WRITE;
1635 c->Request.Timeout = 0;
1636 c->Request.CDB[0] = BMIC_WRITE;
1637 c->Request.CDB[6] = BMIC_CACHE_FLUSH;
1638 break;
1639 default:
1640 printk(KERN_WARNING
1641 "cciss%d: Unknown Command 0x%c\n", ctlr, cmd);
1642 return(IO_ERROR);
1643 }
1644 } else if (cmd_type == TYPE_MSG) {
1645 switch (cmd) {
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001646 case 0: /* ABORT message */
1647 c->Request.CDBLen = 12;
1648 c->Request.Type.Attribute = ATTR_SIMPLE;
1649 c->Request.Type.Direction = XFER_WRITE;
1650 c->Request.Timeout = 0;
1651 c->Request.CDB[0] = cmd; /* abort */
1652 c->Request.CDB[1] = 0; /* abort a command */
1653 /* buff contains the tag of the command to abort */
1654 memcpy(&c->Request.CDB[4], buff, 8);
1655 break;
1656 case 1: /* RESET message */
1657 c->Request.CDBLen = 12;
1658 c->Request.Type.Attribute = ATTR_SIMPLE;
1659 c->Request.Type.Direction = XFER_WRITE;
1660 c->Request.Timeout = 0;
1661 memset(&c->Request.CDB[0], 0, sizeof(c->Request.CDB));
1662 c->Request.CDB[0] = cmd; /* reset */
1663 c->Request.CDB[1] = 0x04; /* reset a LUN */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001664 case 3: /* No-Op message */
1665 c->Request.CDBLen = 1;
1666 c->Request.Type.Attribute = ATTR_SIMPLE;
1667 c->Request.Type.Direction = XFER_WRITE;
1668 c->Request.Timeout = 0;
1669 c->Request.CDB[0] = cmd;
1670 break;
1671 default:
1672 printk(KERN_WARNING
1673 "cciss%d: unknown message type %d\n",
1674 ctlr, cmd);
1675 return IO_ERROR;
1676 }
1677 } else {
1678 printk(KERN_WARNING
1679 "cciss%d: unknown command type %d\n", ctlr, cmd_type);
1680 return IO_ERROR;
1681 }
1682 /* Fill in the scatter gather information */
1683 if (size > 0) {
1684 buff_dma_handle.val = (__u64) pci_map_single(h->pdev,
1685 buff, size, PCI_DMA_BIDIRECTIONAL);
1686 c->SG[0].Addr.lower = buff_dma_handle.val32.lower;
1687 c->SG[0].Addr.upper = buff_dma_handle.val32.upper;
1688 c->SG[0].Len = size;
1689 c->SG[0].Ext = 0; /* we are not chaining */
1690 }
1691 return status;
1692}
1693static int sendcmd_withirq(__u8 cmd,
1694 int ctlr,
1695 void *buff,
1696 size_t size,
1697 unsigned int use_unit_num,
1698 unsigned int log_unit,
1699 __u8 page_code,
1700 int cmd_type)
1701{
1702 ctlr_info_t *h = hba[ctlr];
1703 CommandList_struct *c;
1704 u64bit buff_dma_handle;
1705 unsigned long flags;
1706 int return_status;
1707 DECLARE_COMPLETION(wait);
1708
1709 if ((c = cmd_alloc(h , 0)) == NULL)
1710 return -ENOMEM;
1711 return_status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num,
1712 log_unit, page_code, NULL, cmd_type);
1713 if (return_status != IO_OK) {
1714 cmd_free(h, c, 0);
1715 return return_status;
1716 }
1717resend_cmd2:
1718 c->waiting = &wait;
1719
1720 /* Put the request on the tail of the queue and send it */
1721 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
1722 addQ(&h->reqQ, c);
1723 h->Qdepth++;
1724 start_io(h);
1725 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
1726
1727 wait_for_completion(&wait);
1728
1729 if(c->err_info->CommandStatus != 0)
1730 { /* an error has occurred */
1731 switch(c->err_info->CommandStatus)
1732 {
1733 case CMD_TARGET_STATUS:
1734 printk(KERN_WARNING "cciss: cmd %p has "
1735 " completed with errors\n", c);
1736 if( c->err_info->ScsiStatus)
1737 {
1738 printk(KERN_WARNING "cciss: cmd %p "
1739 "has SCSI Status = %x\n",
1740 c,
1741 c->err_info->ScsiStatus);
1742 }
1743
1744 break;
1745 case CMD_DATA_UNDERRUN:
1746 case CMD_DATA_OVERRUN:
1747 /* expected for inquire and report lun commands */
1748 break;
1749 case CMD_INVALID:
1750 printk(KERN_WARNING "cciss: Cmd %p is "
1751 "reported invalid\n", c);
1752 return_status = IO_ERROR;
1753 break;
1754 case CMD_PROTOCOL_ERR:
1755 printk(KERN_WARNING "cciss: cmd %p has "
1756 "protocol error \n", c);
1757 return_status = IO_ERROR;
1758 break;
1759case CMD_HARDWARE_ERR:
1760 printk(KERN_WARNING "cciss: cmd %p had "
1761 " hardware error\n", c);
1762 return_status = IO_ERROR;
1763 break;
1764 case CMD_CONNECTION_LOST:
1765 printk(KERN_WARNING "cciss: cmd %p had "
1766 "connection lost\n", c);
1767 return_status = IO_ERROR;
1768 break;
1769 case CMD_ABORTED:
1770 printk(KERN_WARNING "cciss: cmd %p was "
1771 "aborted\n", c);
1772 return_status = IO_ERROR;
1773 break;
1774 case CMD_ABORT_FAILED:
1775 printk(KERN_WARNING "cciss: cmd %p reports "
1776 "abort failed\n", c);
1777 return_status = IO_ERROR;
1778 break;
1779 case CMD_UNSOLICITED_ABORT:
1780 printk(KERN_WARNING
1781 "cciss%d: unsolicited abort %p\n",
1782 ctlr, c);
1783 if (c->retry_count < MAX_CMD_RETRIES) {
1784 printk(KERN_WARNING
1785 "cciss%d: retrying %p\n",
1786 ctlr, c);
1787 c->retry_count++;
1788 /* erase the old error information */
1789 memset(c->err_info, 0,
1790 sizeof(ErrorInfo_struct));
1791 return_status = IO_OK;
1792 INIT_COMPLETION(wait);
1793 goto resend_cmd2;
1794 }
1795 return_status = IO_ERROR;
1796 break;
1797 default:
1798 printk(KERN_WARNING "cciss: cmd %p returned "
1799 "unknown status %x\n", c,
1800 c->err_info->CommandStatus);
1801 return_status = IO_ERROR;
1802 }
1803 }
1804 /* unlock the buffers from DMA */
Mike Millerbb2a37b2005-09-13 01:25:24 -07001805 buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
1806 buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001807 pci_unmap_single( h->pdev, (dma_addr_t) buff_dma_handle.val,
Mike Millerbb2a37b2005-09-13 01:25:24 -07001808 c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001809 cmd_free(h, c, 0);
1810 return(return_status);
1811
1812}
1813static void cciss_geometry_inquiry(int ctlr, int logvol,
1814 int withirq, unsigned int total_size,
1815 unsigned int block_size, InquiryData_struct *inq_buff,
1816 drive_info_struct *drv)
1817{
1818 int return_code;
1819 memset(inq_buff, 0, sizeof(InquiryData_struct));
1820 if (withirq)
1821 return_code = sendcmd_withirq(CISS_INQUIRY, ctlr,
1822 inq_buff, sizeof(*inq_buff), 1, logvol ,0xC1, TYPE_CMD);
1823 else
1824 return_code = sendcmd(CISS_INQUIRY, ctlr, inq_buff,
1825 sizeof(*inq_buff), 1, logvol ,0xC1, NULL, TYPE_CMD);
1826 if (return_code == IO_OK) {
1827 if(inq_buff->data_byte[8] == 0xFF) {
1828 printk(KERN_WARNING
1829 "cciss: reading geometry failed, volume "
1830 "does not support reading geometry\n");
1831 drv->block_size = block_size;
1832 drv->nr_blocks = total_size;
1833 drv->heads = 255;
1834 drv->sectors = 32; // Sectors per track
1835 drv->cylinders = total_size / 255 / 32;
1836 } else {
1837 unsigned int t;
1838
1839 drv->block_size = block_size;
1840 drv->nr_blocks = total_size;
1841 drv->heads = inq_buff->data_byte[6];
1842 drv->sectors = inq_buff->data_byte[7];
1843 drv->cylinders = (inq_buff->data_byte[4] & 0xff) << 8;
1844 drv->cylinders += inq_buff->data_byte[5];
1845 drv->raid_level = inq_buff->data_byte[8];
1846 t = drv->heads * drv->sectors;
1847 if (t > 1) {
1848 drv->cylinders = total_size/t;
1849 }
1850 }
1851 } else { /* Get geometry failed */
1852 printk(KERN_WARNING "cciss: reading geometry failed\n");
1853 }
1854 printk(KERN_INFO " heads= %d, sectors= %d, cylinders= %d\n\n",
1855 drv->heads, drv->sectors, drv->cylinders);
1856}
1857static void
1858cciss_read_capacity(int ctlr, int logvol, ReadCapdata_struct *buf,
1859 int withirq, unsigned int *total_size, unsigned int *block_size)
1860{
1861 int return_code;
1862 memset(buf, 0, sizeof(*buf));
1863 if (withirq)
1864 return_code = sendcmd_withirq(CCISS_READ_CAPACITY,
1865 ctlr, buf, sizeof(*buf), 1, logvol, 0, TYPE_CMD);
1866 else
1867 return_code = sendcmd(CCISS_READ_CAPACITY,
1868 ctlr, buf, sizeof(*buf), 1, logvol, 0, NULL, TYPE_CMD);
1869 if (return_code == IO_OK) {
1870 *total_size = be32_to_cpu(*((__be32 *) &buf->total_size[0]))+1;
1871 *block_size = be32_to_cpu(*((__be32 *) &buf->block_size[0]));
1872 } else { /* read capacity command failed */
1873 printk(KERN_WARNING "cciss: read capacity failed\n");
1874 *total_size = 0;
1875 *block_size = BLOCK_SIZE;
1876 }
1877 printk(KERN_INFO " blocks= %u block_size= %d\n",
1878 *total_size, *block_size);
1879 return;
1880}
1881
Linus Torvalds1da177e2005-04-16 15:20:36 -07001882static int cciss_revalidate(struct gendisk *disk)
1883{
1884 ctlr_info_t *h = get_host(disk);
1885 drive_info_struct *drv = get_drv(disk);
1886 int logvol;
1887 int FOUND=0;
1888 unsigned int block_size;
1889 unsigned int total_size;
1890 ReadCapdata_struct *size_buff = NULL;
1891 InquiryData_struct *inq_buff = NULL;
1892
1893 for(logvol=0; logvol < CISS_MAX_LUN; logvol++)
1894 {
1895 if(h->drv[logvol].LunID == drv->LunID) {
1896 FOUND=1;
1897 break;
1898 }
1899 }
1900
1901 if (!FOUND) return 1;
1902
1903 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
1904 if (size_buff == NULL)
1905 {
1906 printk(KERN_WARNING "cciss: out of memory\n");
1907 return 1;
1908 }
1909 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
1910 if (inq_buff == NULL)
1911 {
1912 printk(KERN_WARNING "cciss: out of memory\n");
1913 kfree(size_buff);
1914 return 1;
1915 }
1916
1917 cciss_read_capacity(h->ctlr, logvol, size_buff, 1, &total_size, &block_size);
1918 cciss_geometry_inquiry(h->ctlr, logvol, 1, total_size, block_size, inq_buff, drv);
1919
Mike Millerad2b9312005-07-28 01:07:31 -07001920 blk_queue_hardsect_size(drv->queue, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001921 set_capacity(disk, drv->nr_blocks);
1922
1923 kfree(size_buff);
1924 kfree(inq_buff);
1925 return 0;
1926}
1927
1928/*
1929 * Wait polling for a command to complete.
1930 * The memory mapped FIFO is polled for the completion.
1931 * Used only at init time, interrupts from the HBA are disabled.
1932 */
1933static unsigned long pollcomplete(int ctlr)
1934{
1935 unsigned long done;
1936 int i;
1937
1938 /* Wait (up to 20 seconds) for a command to complete */
1939
1940 for (i = 20 * HZ; i > 0; i--) {
1941 done = hba[ctlr]->access.command_completed(hba[ctlr]);
Nishanth Aravamudan86e84862005-09-10 00:27:28 -07001942 if (done == FIFO_EMPTY)
1943 schedule_timeout_uninterruptible(1);
1944 else
Linus Torvalds1da177e2005-04-16 15:20:36 -07001945 return (done);
1946 }
1947 /* Invalid address to tell caller we ran out of time */
1948 return 1;
1949}
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06001950
1951static int add_sendcmd_reject(__u8 cmd, int ctlr, unsigned long complete)
1952{
1953 /* We get in here if sendcmd() is polling for completions
1954 and gets some command back that it wasn't expecting --
1955 something other than that which it just sent down.
1956 Ordinarily, that shouldn't happen, but it can happen when
1957 the scsi tape stuff gets into error handling mode, and
1958 starts using sendcmd() to try to abort commands and
1959 reset tape drives. In that case, sendcmd may pick up
1960 completions of commands that were sent to logical drives
1961 through the block i/o system, or cciss ioctls completing, etc.
1962 In that case, we need to save those completions for later
1963 processing by the interrupt handler.
1964 */
1965
1966#ifdef CONFIG_CISS_SCSI_TAPE
1967 struct sendcmd_reject_list *srl = &hba[ctlr]->scsi_rejects;
1968
1969 /* If it's not the scsi tape stuff doing error handling, (abort */
1970 /* or reset) then we don't expect anything weird. */
1971 if (cmd != CCISS_RESET_MSG && cmd != CCISS_ABORT_MSG) {
1972#endif
1973 printk( KERN_WARNING "cciss cciss%d: SendCmd "
1974 "Invalid command list address returned! (%lx)\n",
1975 ctlr, complete);
1976 /* not much we can do. */
1977#ifdef CONFIG_CISS_SCSI_TAPE
1978 return 1;
1979 }
1980
1981 /* We've sent down an abort or reset, but something else
1982 has completed */
1983 if (srl->ncompletions >= (NR_CMDS + 2)) {
1984 /* Uh oh. No room to save it for later... */
1985 printk(KERN_WARNING "cciss%d: Sendcmd: Invalid command addr, "
1986 "reject list overflow, command lost!\n", ctlr);
1987 return 1;
1988 }
1989 /* Save it for later */
1990 srl->complete[srl->ncompletions] = complete;
1991 srl->ncompletions++;
1992#endif
1993 return 0;
1994}
1995
Linus Torvalds1da177e2005-04-16 15:20:36 -07001996/*
1997 * Send a command to the controller, and wait for it to complete.
1998 * Only used at init time.
1999 */
2000static int sendcmd(
2001 __u8 cmd,
2002 int ctlr,
2003 void *buff,
2004 size_t size,
2005 unsigned int use_unit_num, /* 0: address the controller,
2006 1: address logical volume log_unit,
2007 2: periph device address is scsi3addr */
2008 unsigned int log_unit,
2009 __u8 page_code,
2010 unsigned char *scsi3addr,
2011 int cmd_type)
2012{
2013 CommandList_struct *c;
2014 int i;
2015 unsigned long complete;
2016 ctlr_info_t *info_p= hba[ctlr];
2017 u64bit buff_dma_handle;
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002018 int status, done = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002019
2020 if ((c = cmd_alloc(info_p, 1)) == NULL) {
2021 printk(KERN_WARNING "cciss: unable to get memory");
2022 return(IO_ERROR);
2023 }
2024 status = fill_cmd(c, cmd, ctlr, buff, size, use_unit_num,
2025 log_unit, page_code, scsi3addr, cmd_type);
2026 if (status != IO_OK) {
2027 cmd_free(info_p, c, 1);
2028 return status;
2029 }
2030resend_cmd1:
2031 /*
2032 * Disable interrupt
2033 */
2034#ifdef CCISS_DEBUG
2035 printk(KERN_DEBUG "cciss: turning intr off\n");
2036#endif /* CCISS_DEBUG */
2037 info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF);
2038
2039 /* Make sure there is room in the command FIFO */
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002040 /* Actually it should be completely empty at this time */
2041 /* unless we are in here doing error handling for the scsi */
2042 /* tape side of the driver. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002043 for (i = 200000; i > 0; i--)
2044 {
2045 /* if fifo isn't full go */
2046 if (!(info_p->access.fifo_full(info_p)))
2047 {
2048
2049 break;
2050 }
2051 udelay(10);
2052 printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full,"
2053 " waiting!\n", ctlr);
2054 }
2055 /*
2056 * Send the cmd
2057 */
2058 info_p->access.submit_command(info_p, c);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002059 done = 0;
2060 do {
2061 complete = pollcomplete(ctlr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002062
2063#ifdef CCISS_DEBUG
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002064 printk(KERN_DEBUG "cciss: command completed\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002065#endif /* CCISS_DEBUG */
2066
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002067 if (complete == 1) {
2068 printk( KERN_WARNING
2069 "cciss cciss%d: SendCmd Timeout out, "
2070 "No command list address returned!\n",
2071 ctlr);
2072 status = IO_ERROR;
2073 done = 1;
2074 break;
2075 }
2076
2077 /* This will need to change for direct lookup completions */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002078 if ( (complete & CISS_ERROR_BIT)
2079 && (complete & ~CISS_ERROR_BIT) == c->busaddr)
2080 {
2081 /* if data overrun or underun on Report command
2082 ignore it
2083 */
2084 if (((c->Request.CDB[0] == CISS_REPORT_LOG) ||
2085 (c->Request.CDB[0] == CISS_REPORT_PHYS) ||
2086 (c->Request.CDB[0] == CISS_INQUIRY)) &&
2087 ((c->err_info->CommandStatus ==
2088 CMD_DATA_OVERRUN) ||
2089 (c->err_info->CommandStatus ==
2090 CMD_DATA_UNDERRUN)
2091 ))
2092 {
2093 complete = c->busaddr;
2094 } else {
2095 if (c->err_info->CommandStatus ==
2096 CMD_UNSOLICITED_ABORT) {
2097 printk(KERN_WARNING "cciss%d: "
2098 "unsolicited abort %p\n",
2099 ctlr, c);
2100 if (c->retry_count < MAX_CMD_RETRIES) {
2101 printk(KERN_WARNING
2102 "cciss%d: retrying %p\n",
2103 ctlr, c);
2104 c->retry_count++;
2105 /* erase the old error */
2106 /* information */
2107 memset(c->err_info, 0,
2108 sizeof(ErrorInfo_struct));
2109 goto resend_cmd1;
2110 } else {
2111 printk(KERN_WARNING
2112 "cciss%d: retried %p too "
2113 "many times\n", ctlr, c);
2114 status = IO_ERROR;
2115 goto cleanup1;
2116 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002117 } else if (c->err_info->CommandStatus == CMD_UNABORTABLE) {
2118 printk(KERN_WARNING "cciss%d: command could not be aborted.\n", ctlr);
2119 status = IO_ERROR;
2120 goto cleanup1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002121 }
2122 printk(KERN_WARNING "ciss ciss%d: sendcmd"
2123 " Error %x \n", ctlr,
2124 c->err_info->CommandStatus);
2125 printk(KERN_WARNING "ciss ciss%d: sendcmd"
2126 " offensive info\n"
2127 " size %x\n num %x value %x\n", ctlr,
2128 c->err_info->MoreErrInfo.Invalid_Cmd.offense_size,
2129 c->err_info->MoreErrInfo.Invalid_Cmd.offense_num,
2130 c->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
2131 status = IO_ERROR;
2132 goto cleanup1;
2133 }
2134 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002135 /* This will need changing for direct lookup completions */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002136 if (complete != c->busaddr) {
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002137 if (add_sendcmd_reject(cmd, ctlr, complete) != 0) {
2138 BUG(); /* we are pretty much hosed if we get here. */
2139 }
2140 continue;
2141 } else
2142 done = 1;
2143 } while (!done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144
2145cleanup1:
2146 /* unlock the data buffer from DMA */
Mike Millerbb2a37b2005-09-13 01:25:24 -07002147 buff_dma_handle.val32.lower = c->SG[0].Addr.lower;
2148 buff_dma_handle.val32.upper = c->SG[0].Addr.upper;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002149 pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val,
Mike Millerbb2a37b2005-09-13 01:25:24 -07002150 c->SG[0].Len, PCI_DMA_BIDIRECTIONAL);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002151#ifdef CONFIG_CISS_SCSI_TAPE
2152 /* if we saved some commands for later, process them now. */
2153 if (info_p->scsi_rejects.ncompletions > 0)
2154 do_cciss_intr(0, info_p, NULL);
2155#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 cmd_free(info_p, c, 1);
2157 return (status);
2158}
2159/*
2160 * Map (physical) PCI mem into (virtual) kernel space
2161 */
2162static void __iomem *remap_pci_mem(ulong base, ulong size)
2163{
2164 ulong page_base = ((ulong) base) & PAGE_MASK;
2165 ulong page_offs = ((ulong) base) - page_base;
2166 void __iomem *page_remapped = ioremap(page_base, page_offs+size);
2167
2168 return page_remapped ? (page_remapped + page_offs) : NULL;
2169}
2170
2171/*
2172 * Takes jobs of the Q and sends them to the hardware, then puts it on
2173 * the Q to wait for completion.
2174 */
2175static void start_io( ctlr_info_t *h)
2176{
2177 CommandList_struct *c;
2178
2179 while(( c = h->reqQ) != NULL )
2180 {
2181 /* can't do anything if fifo is full */
2182 if ((h->access.fifo_full(h))) {
2183 printk(KERN_WARNING "cciss: fifo full\n");
2184 break;
2185 }
2186
Uwe Zeisberger80682fa2006-03-22 00:21:33 +01002187 /* Get the first entry from the Request Q */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002188 removeQ(&(h->reqQ), c);
2189 h->Qdepth--;
2190
2191 /* Tell the controller execute command */
2192 h->access.submit_command(h, c);
2193
2194 /* Put job onto the completed Q */
2195 addQ (&(h->cmpQ), c);
2196 }
2197}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002198/* Assumes that CCISS_LOCK(h->ctlr) is held. */
2199/* Zeros out the error record and then resends the command back */
2200/* to the controller */
2201static inline void resend_cciss_cmd( ctlr_info_t *h, CommandList_struct *c)
2202{
2203 /* erase the old error information */
2204 memset(c->err_info, 0, sizeof(ErrorInfo_struct));
2205
2206 /* add it to software queue and then send it to the controller */
2207 addQ(&(h->reqQ),c);
2208 h->Qdepth++;
2209 if(h->Qdepth > h->maxQsinceinit)
2210 h->maxQsinceinit = h->Qdepth;
2211
2212 start_io(h);
2213}
Jens Axboea9925a02006-01-09 16:04:06 +01002214
Linus Torvalds1da177e2005-04-16 15:20:36 -07002215/* checks the status of the job and calls complete buffers to mark all
Jens Axboea9925a02006-01-09 16:04:06 +01002216 * buffers for the completed job. Note that this function does not need
2217 * to hold the hba/queue lock.
Linus Torvalds1da177e2005-04-16 15:20:36 -07002218 */
2219static inline void complete_command( ctlr_info_t *h, CommandList_struct *cmd,
2220 int timeout)
2221{
2222 int status = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002223 int retry_cmd = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002224
2225 if (timeout)
2226 status = 0;
2227
2228 if(cmd->err_info->CommandStatus != 0)
2229 { /* an error has occurred */
2230 switch(cmd->err_info->CommandStatus)
2231 {
2232 unsigned char sense_key;
2233 case CMD_TARGET_STATUS:
2234 status = 0;
2235
2236 if( cmd->err_info->ScsiStatus == 0x02)
2237 {
2238 printk(KERN_WARNING "cciss: cmd %p "
2239 "has CHECK CONDITION "
2240 " byte 2 = 0x%x\n", cmd,
2241 cmd->err_info->SenseInfo[2]
2242 );
2243 /* check the sense key */
2244 sense_key = 0xf &
2245 cmd->err_info->SenseInfo[2];
2246 /* no status or recovered error */
2247 if((sense_key == 0x0) ||
2248 (sense_key == 0x1))
2249 {
2250 status = 1;
2251 }
2252 } else
2253 {
2254 printk(KERN_WARNING "cciss: cmd %p "
2255 "has SCSI Status 0x%x\n",
2256 cmd, cmd->err_info->ScsiStatus);
2257 }
2258 break;
2259 case CMD_DATA_UNDERRUN:
2260 printk(KERN_WARNING "cciss: cmd %p has"
2261 " completed with data underrun "
2262 "reported\n", cmd);
2263 break;
2264 case CMD_DATA_OVERRUN:
2265 printk(KERN_WARNING "cciss: cmd %p has"
2266 " completed with data overrun "
2267 "reported\n", cmd);
2268 break;
2269 case CMD_INVALID:
2270 printk(KERN_WARNING "cciss: cmd %p is "
2271 "reported invalid\n", cmd);
2272 status = 0;
2273 break;
2274 case CMD_PROTOCOL_ERR:
2275 printk(KERN_WARNING "cciss: cmd %p has "
2276 "protocol error \n", cmd);
2277 status = 0;
2278 break;
2279 case CMD_HARDWARE_ERR:
2280 printk(KERN_WARNING "cciss: cmd %p had "
2281 " hardware error\n", cmd);
2282 status = 0;
2283 break;
2284 case CMD_CONNECTION_LOST:
2285 printk(KERN_WARNING "cciss: cmd %p had "
2286 "connection lost\n", cmd);
2287 status=0;
2288 break;
2289 case CMD_ABORTED:
2290 printk(KERN_WARNING "cciss: cmd %p was "
2291 "aborted\n", cmd);
2292 status=0;
2293 break;
2294 case CMD_ABORT_FAILED:
2295 printk(KERN_WARNING "cciss: cmd %p reports "
2296 "abort failed\n", cmd);
2297 status=0;
2298 break;
2299 case CMD_UNSOLICITED_ABORT:
2300 printk(KERN_WARNING "cciss%d: unsolicited "
2301 "abort %p\n", h->ctlr, cmd);
2302 if (cmd->retry_count < MAX_CMD_RETRIES) {
2303 retry_cmd=1;
2304 printk(KERN_WARNING
2305 "cciss%d: retrying %p\n",
2306 h->ctlr, cmd);
2307 cmd->retry_count++;
2308 } else
2309 printk(KERN_WARNING
2310 "cciss%d: %p retried too "
2311 "many times\n", h->ctlr, cmd);
2312 status=0;
2313 break;
2314 case CMD_TIMEOUT:
2315 printk(KERN_WARNING "cciss: cmd %p timedout\n",
2316 cmd);
2317 status=0;
2318 break;
2319 default:
2320 printk(KERN_WARNING "cciss: cmd %p returned "
2321 "unknown status %x\n", cmd,
2322 cmd->err_info->CommandStatus);
2323 status=0;
2324 }
2325 }
2326 /* We need to return this command */
2327 if(retry_cmd) {
2328 resend_cciss_cmd(h,cmd);
2329 return;
2330 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002331
Jens Axboea9925a02006-01-09 16:04:06 +01002332 cmd->rq->completion_data = cmd;
2333 cmd->rq->errors = status;
Jens Axboe2056a782006-03-23 20:00:26 +01002334 blk_add_trace_rq(cmd->rq->q, cmd->rq, BLK_TA_COMPLETE);
Jens Axboea9925a02006-01-09 16:04:06 +01002335 blk_complete_request(cmd->rq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002336}
2337
2338/*
2339 * Get a request and submit it to the controller.
2340 */
2341static void do_cciss_request(request_queue_t *q)
2342{
2343 ctlr_info_t *h= q->queuedata;
2344 CommandList_struct *c;
2345 int start_blk, seg;
2346 struct request *creq;
2347 u64bit temp64;
2348 struct scatterlist tmp_sg[MAXSGENTRIES];
2349 drive_info_struct *drv;
2350 int i, dir;
2351
2352 /* We call start_io here in case there is a command waiting on the
2353 * queue that has not been sent.
2354 */
2355 if (blk_queue_plugged(q))
2356 goto startio;
2357
2358queue:
2359 creq = elv_next_request(q);
2360 if (!creq)
2361 goto startio;
2362
Eric Sesterhenn089fe1b2006-03-24 18:50:27 +01002363 BUG_ON(creq->nr_phys_segments > MAXSGENTRIES);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002364
2365 if (( c = cmd_alloc(h, 1)) == NULL)
2366 goto full;
2367
2368 blkdev_dequeue_request(creq);
2369
2370 spin_unlock_irq(q->queue_lock);
2371
2372 c->cmd_type = CMD_RWREQ;
2373 c->rq = creq;
2374
2375 /* fill in the request */
2376 drv = creq->rq_disk->private_data;
2377 c->Header.ReplyQueue = 0; // unused in simple mode
Mike Miller33079b22005-09-13 01:25:22 -07002378 /* got command from pool, so use the command block index instead */
2379 /* for direct lookups. */
2380 /* The first 2 bits are reserved for controller error reporting. */
2381 c->Header.Tag.lower = (c->cmdindex << 3);
2382 c->Header.Tag.lower |= 0x04; /* flag for direct lookup. */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002383 c->Header.LUN.LogDev.VolId= drv->LunID;
2384 c->Header.LUN.LogDev.Mode = 1;
2385 c->Request.CDBLen = 10; // 12 byte commands not in FW yet;
2386 c->Request.Type.Type = TYPE_CMD; // It is a command.
2387 c->Request.Type.Attribute = ATTR_SIMPLE;
2388 c->Request.Type.Direction =
2389 (rq_data_dir(creq) == READ) ? XFER_READ: XFER_WRITE;
2390 c->Request.Timeout = 0; // Don't time out
2391 c->Request.CDB[0] = (rq_data_dir(creq) == READ) ? CCISS_READ : CCISS_WRITE;
2392 start_blk = creq->sector;
2393#ifdef CCISS_DEBUG
2394 printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%d\n",(int) creq->sector,
2395 (int) creq->nr_sectors);
2396#endif /* CCISS_DEBUG */
2397
2398 seg = blk_rq_map_sg(q, creq, tmp_sg);
2399
2400 /* get the DMA records for the setup */
2401 if (c->Request.Type.Direction == XFER_READ)
2402 dir = PCI_DMA_FROMDEVICE;
2403 else
2404 dir = PCI_DMA_TODEVICE;
2405
2406 for (i=0; i<seg; i++)
2407 {
2408 c->SG[i].Len = tmp_sg[i].length;
2409 temp64.val = (__u64) pci_map_page(h->pdev, tmp_sg[i].page,
2410 tmp_sg[i].offset, tmp_sg[i].length,
2411 dir);
2412 c->SG[i].Addr.lower = temp64.val32.lower;
2413 c->SG[i].Addr.upper = temp64.val32.upper;
2414 c->SG[i].Ext = 0; // we are not chaining
2415 }
2416 /* track how many SG entries we are using */
2417 if( seg > h->maxSG)
2418 h->maxSG = seg;
2419
2420#ifdef CCISS_DEBUG
2421 printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n", creq->nr_sectors, seg);
2422#endif /* CCISS_DEBUG */
2423
2424 c->Header.SGList = c->Header.SGTotal = seg;
2425 c->Request.CDB[1]= 0;
2426 c->Request.CDB[2]= (start_blk >> 24) & 0xff; //MSB
2427 c->Request.CDB[3]= (start_blk >> 16) & 0xff;
2428 c->Request.CDB[4]= (start_blk >> 8) & 0xff;
2429 c->Request.CDB[5]= start_blk & 0xff;
2430 c->Request.CDB[6]= 0; // (sect >> 24) & 0xff; MSB
2431 c->Request.CDB[7]= (creq->nr_sectors >> 8) & 0xff;
2432 c->Request.CDB[8]= creq->nr_sectors & 0xff;
2433 c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0;
2434
2435 spin_lock_irq(q->queue_lock);
2436
2437 addQ(&(h->reqQ),c);
2438 h->Qdepth++;
2439 if(h->Qdepth > h->maxQsinceinit)
2440 h->maxQsinceinit = h->Qdepth;
2441
2442 goto queue;
2443full:
2444 blk_stop_queue(q);
2445startio:
2446 /* We will already have the driver lock here so not need
2447 * to lock it.
2448 */
2449 start_io(h);
2450}
2451
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002452static inline unsigned long get_next_completion(ctlr_info_t *h)
2453{
2454#ifdef CONFIG_CISS_SCSI_TAPE
2455 /* Any rejects from sendcmd() lying around? Process them first */
2456 if (h->scsi_rejects.ncompletions == 0)
2457 return h->access.command_completed(h);
2458 else {
2459 struct sendcmd_reject_list *srl;
2460 int n;
2461 srl = &h->scsi_rejects;
2462 n = --srl->ncompletions;
2463 /* printk("cciss%d: processing saved reject\n", h->ctlr); */
2464 printk("p");
2465 return srl->complete[n];
2466 }
2467#else
2468 return h->access.command_completed(h);
2469#endif
2470}
2471
2472static inline int interrupt_pending(ctlr_info_t *h)
2473{
2474#ifdef CONFIG_CISS_SCSI_TAPE
2475 return ( h->access.intr_pending(h)
2476 || (h->scsi_rejects.ncompletions > 0));
2477#else
2478 return h->access.intr_pending(h);
2479#endif
2480}
2481
2482static inline long interrupt_not_for_us(ctlr_info_t *h)
2483{
2484#ifdef CONFIG_CISS_SCSI_TAPE
2485 return (((h->access.intr_pending(h) == 0) ||
2486 (h->interrupts_enabled == 0))
2487 && (h->scsi_rejects.ncompletions == 0));
2488#else
2489 return (((h->access.intr_pending(h) == 0) ||
2490 (h->interrupts_enabled == 0)));
2491#endif
2492}
2493
Linus Torvalds1da177e2005-04-16 15:20:36 -07002494static irqreturn_t do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
2495{
2496 ctlr_info_t *h = dev_id;
2497 CommandList_struct *c;
2498 unsigned long flags;
Mike Miller33079b22005-09-13 01:25:22 -07002499 __u32 a, a1, a2;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002500 int j;
2501 int start_queue = h->next_to_run;
2502
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002503 if (interrupt_not_for_us(h))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002504 return IRQ_NONE;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002505 /*
2506 * If there are completed commands in the completion queue,
2507 * we had better do something about it.
2508 */
2509 spin_lock_irqsave(CCISS_LOCK(h->ctlr), flags);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06002510 while (interrupt_pending(h)) {
2511 while((a = get_next_completion(h)) != FIFO_EMPTY) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002512 a1 = a;
Mike Miller33079b22005-09-13 01:25:22 -07002513 if ((a & 0x04)) {
2514 a2 = (a >> 3);
2515 if (a2 >= NR_CMDS) {
2516 printk(KERN_WARNING "cciss: controller cciss%d failed, stopping.\n", h->ctlr);
2517 fail_all_cmds(h->ctlr);
2518 return IRQ_HANDLED;
2519 }
2520
2521 c = h->cmd_pool + a2;
2522 a = c->busaddr;
2523
2524 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002525 a &= ~3;
Mike Miller33079b22005-09-13 01:25:22 -07002526 if ((c = h->cmpQ) == NULL) {
2527 printk(KERN_WARNING "cciss: Completion of %08x ignored\n", a1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002528 continue;
2529 }
2530 while(c->busaddr != a) {
2531 c = c->next;
2532 if (c == h->cmpQ)
2533 break;
2534 }
Mike Miller33079b22005-09-13 01:25:22 -07002535 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002536 /*
2537 * If we've found the command, take it off the
2538 * completion Q and free it
2539 */
2540 if (c->busaddr == a) {
2541 removeQ(&h->cmpQ, c);
2542 if (c->cmd_type == CMD_RWREQ) {
2543 complete_command(h, c, 0);
2544 } else if (c->cmd_type == CMD_IOCTL_PEND) {
2545 complete(c->waiting);
2546 }
2547# ifdef CONFIG_CISS_SCSI_TAPE
2548 else if (c->cmd_type == CMD_SCSI)
2549 complete_scsi_command(c, 0, a1);
2550# endif
2551 continue;
2552 }
2553 }
2554 }
2555
2556 /* check to see if we have maxed out the number of commands that can
2557 * be placed on the queue. If so then exit. We do this check here
2558 * in case the interrupt we serviced was from an ioctl and did not
2559 * free any new commands.
2560 */
2561 if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
2562 goto cleanup;
2563
2564 /* We have room on the queue for more commands. Now we need to queue
2565 * them up. We will also keep track of the next queue to run so
2566 * that every queue gets a chance to be started first.
2567 */
Mike Millerad2b9312005-07-28 01:07:31 -07002568 for (j=0; j < h->highest_lun + 1; j++){
2569 int curr_queue = (start_queue + j) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002570 /* make sure the disk has been added and the drive is real
2571 * because this can be called from the middle of init_one.
2572 */
Mike Millerad2b9312005-07-28 01:07:31 -07002573 if(!(h->drv[curr_queue].queue) ||
Linus Torvalds1da177e2005-04-16 15:20:36 -07002574 !(h->drv[curr_queue].heads))
2575 continue;
2576 blk_start_queue(h->gendisk[curr_queue]->queue);
2577
2578 /* check to see if we have maxed out the number of commands
2579 * that can be placed on the queue.
2580 */
2581 if ((find_first_zero_bit(h->cmd_pool_bits, NR_CMDS)) == NR_CMDS)
2582 {
2583 if (curr_queue == start_queue){
Mike Millerad2b9312005-07-28 01:07:31 -07002584 h->next_to_run = (start_queue + 1) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002585 goto cleanup;
2586 } else {
2587 h->next_to_run = curr_queue;
2588 goto cleanup;
2589 }
2590 } else {
Mike Millerad2b9312005-07-28 01:07:31 -07002591 curr_queue = (curr_queue + 1) % (h->highest_lun + 1);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002592 }
2593 }
2594
2595cleanup:
2596 spin_unlock_irqrestore(CCISS_LOCK(h->ctlr), flags);
2597 return IRQ_HANDLED;
2598}
Linus Torvalds1da177e2005-04-16 15:20:36 -07002599/*
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07002600 * We cannot read the structure directly, for portability we must use
Linus Torvalds1da177e2005-04-16 15:20:36 -07002601 * the io functions.
2602 * This is for debug only.
2603 */
2604#ifdef CCISS_DEBUG
2605static void print_cfg_table( CfgTable_struct *tb)
2606{
2607 int i;
2608 char temp_name[17];
2609
2610 printk("Controller Configuration information\n");
2611 printk("------------------------------------\n");
2612 for(i=0;i<4;i++)
2613 temp_name[i] = readb(&(tb->Signature[i]));
2614 temp_name[4]='\0';
2615 printk(" Signature = %s\n", temp_name);
2616 printk(" Spec Number = %d\n", readl(&(tb->SpecValence)));
2617 printk(" Transport methods supported = 0x%x\n",
2618 readl(&(tb-> TransportSupport)));
2619 printk(" Transport methods active = 0x%x\n",
2620 readl(&(tb->TransportActive)));
2621 printk(" Requested transport Method = 0x%x\n",
2622 readl(&(tb->HostWrite.TransportRequest)));
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07002623 printk(" Coalesce Interrupt Delay = 0x%x\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002624 readl(&(tb->HostWrite.CoalIntDelay)));
Bjorn Helgaasd14c4ab2006-06-25 05:49:04 -07002625 printk(" Coalesce Interrupt Count = 0x%x\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626 readl(&(tb->HostWrite.CoalIntCount)));
2627 printk(" Max outstanding commands = 0x%d\n",
2628 readl(&(tb->CmdsOutMax)));
2629 printk(" Bus Types = 0x%x\n", readl(&(tb-> BusTypes)));
2630 for(i=0;i<16;i++)
2631 temp_name[i] = readb(&(tb->ServerName[i]));
2632 temp_name[16] = '\0';
2633 printk(" Server Name = %s\n", temp_name);
2634 printk(" Heartbeat Counter = 0x%x\n\n\n",
2635 readl(&(tb->HeartBeat)));
2636}
2637#endif /* CCISS_DEBUG */
2638
Linus Torvalds1da177e2005-04-16 15:20:36 -07002639static int find_PCI_BAR_index(struct pci_dev *pdev,
2640 unsigned long pci_bar_addr)
2641{
2642 int i, offset, mem_type, bar_type;
2643 if (pci_bar_addr == PCI_BASE_ADDRESS_0) /* looking for BAR zero? */
2644 return 0;
2645 offset = 0;
2646 for (i=0; i<DEVICE_COUNT_RESOURCE; i++) {
2647 bar_type = pci_resource_flags(pdev, i) &
2648 PCI_BASE_ADDRESS_SPACE;
2649 if (bar_type == PCI_BASE_ADDRESS_SPACE_IO)
2650 offset += 4;
2651 else {
2652 mem_type = pci_resource_flags(pdev, i) &
2653 PCI_BASE_ADDRESS_MEM_TYPE_MASK;
2654 switch (mem_type) {
2655 case PCI_BASE_ADDRESS_MEM_TYPE_32:
2656 case PCI_BASE_ADDRESS_MEM_TYPE_1M:
2657 offset += 4; /* 32 bit */
2658 break;
2659 case PCI_BASE_ADDRESS_MEM_TYPE_64:
2660 offset += 8;
2661 break;
2662 default: /* reserved in PCI 2.2 */
2663 printk(KERN_WARNING "Base address is invalid\n");
2664 return -1;
2665 break;
2666 }
2667 }
2668 if (offset == pci_bar_addr - PCI_BASE_ADDRESS_0)
2669 return i+1;
2670 }
2671 return -1;
2672}
2673
Mike Millerfb86a352006-01-08 01:03:50 -08002674/* If MSI/MSI-X is supported by the kernel we will try to enable it on
2675 * controllers that are capable. If not, we use IO-APIC mode.
2676 */
2677
2678static void __devinit cciss_interrupt_mode(ctlr_info_t *c, struct pci_dev *pdev, __u32 board_id)
2679{
2680#ifdef CONFIG_PCI_MSI
2681 int err;
2682 struct msix_entry cciss_msix_entries[4] = {{0,0}, {0,1},
2683 {0,2}, {0,3}};
2684
2685 /* Some boards advertise MSI but don't really support it */
2686 if ((board_id == 0x40700E11) ||
2687 (board_id == 0x40800E11) ||
2688 (board_id == 0x40820E11) ||
2689 (board_id == 0x40830E11))
2690 goto default_int_mode;
2691
2692 if (pci_find_capability(pdev, PCI_CAP_ID_MSIX)) {
2693 err = pci_enable_msix(pdev, cciss_msix_entries, 4);
2694 if (!err) {
2695 c->intr[0] = cciss_msix_entries[0].vector;
2696 c->intr[1] = cciss_msix_entries[1].vector;
2697 c->intr[2] = cciss_msix_entries[2].vector;
2698 c->intr[3] = cciss_msix_entries[3].vector;
2699 c->msix_vector = 1;
2700 return;
2701 }
2702 if (err > 0) {
2703 printk(KERN_WARNING "cciss: only %d MSI-X vectors "
2704 "available\n", err);
2705 } else {
2706 printk(KERN_WARNING "cciss: MSI-X init failed %d\n",
2707 err);
2708 }
2709 }
2710 if (pci_find_capability(pdev, PCI_CAP_ID_MSI)) {
2711 if (!pci_enable_msi(pdev)) {
2712 c->intr[SIMPLE_MODE_INT] = pdev->irq;
2713 c->msi_vector = 1;
2714 return;
2715 } else {
2716 printk(KERN_WARNING "cciss: MSI init failed\n");
2717 c->intr[SIMPLE_MODE_INT] = pdev->irq;
2718 return;
2719 }
2720 }
Eric Sesterhenn89a76892006-03-24 10:00:57 +01002721default_int_mode:
Mike Millerfb86a352006-01-08 01:03:50 -08002722#endif /* CONFIG_PCI_MSI */
2723 /* if we get here we're going to use the default interrupt mode */
Mike Millerfb86a352006-01-08 01:03:50 -08002724 c->intr[SIMPLE_MODE_INT] = pdev->irq;
2725 return;
2726}
2727
Linus Torvalds1da177e2005-04-16 15:20:36 -07002728static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
2729{
2730 ushort subsystem_vendor_id, subsystem_device_id, command;
2731 __u32 board_id, scratchpad = 0;
2732 __u64 cfg_offset;
2733 __u32 cfg_base_addr;
2734 __u64 cfg_base_addr_index;
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002735 int i, err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002736
2737 /* check to see if controller has been disabled */
2738 /* BEFORE trying to enable it */
2739 (void) pci_read_config_word(pdev, PCI_COMMAND,&command);
2740 if(!(command & 0x02))
2741 {
2742 printk(KERN_WARNING "cciss: controller appears to be disabled\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002743 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002744 }
2745
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002746 err = pci_enable_device(pdev);
2747 if (err)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002748 {
2749 printk(KERN_ERR "cciss: Unable to Enable PCI device\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002750 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002751 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002752
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002753 err = pci_request_regions(pdev, "cciss");
2754 if (err) {
2755 printk(KERN_ERR "cciss: Cannot obtain PCI resources, "
2756 "aborting\n");
2757 goto err_out_disable_pdev;
2758 }
2759
Linus Torvalds1da177e2005-04-16 15:20:36 -07002760 subsystem_vendor_id = pdev->subsystem_vendor;
2761 subsystem_device_id = pdev->subsystem_device;
2762 board_id = (((__u32) (subsystem_device_id << 16) & 0xffff0000) |
2763 subsystem_vendor_id);
2764
Linus Torvalds1da177e2005-04-16 15:20:36 -07002765#ifdef CCISS_DEBUG
2766 printk("command = %x\n", command);
2767 printk("irq = %x\n", pdev->irq);
2768 printk("board_id = %x\n", board_id);
2769#endif /* CCISS_DEBUG */
2770
Mike Millerfb86a352006-01-08 01:03:50 -08002771/* If the kernel supports MSI/MSI-X we will try to enable that functionality,
2772 * else we use the IO-APIC interrupt assigned to us by system ROM.
2773 */
2774 cciss_interrupt_mode(c, pdev, board_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002775
2776 /*
2777 * Memory base addr is first addr , the second points to the config
2778 * table
2779 */
2780
2781 c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */
2782#ifdef CCISS_DEBUG
2783 printk("address 0 = %x\n", c->paddr);
2784#endif /* CCISS_DEBUG */
2785 c->vaddr = remap_pci_mem(c->paddr, 200);
2786
2787 /* Wait for the board to become ready. (PCI hotplug needs this.)
2788 * We poll for up to 120 secs, once per 100ms. */
2789 for (i=0; i < 1200; i++) {
2790 scratchpad = readl(c->vaddr + SA5_SCRATCHPAD_OFFSET);
2791 if (scratchpad == CCISS_FIRMWARE_READY)
2792 break;
2793 set_current_state(TASK_INTERRUPTIBLE);
2794 schedule_timeout(HZ / 10); /* wait 100ms */
2795 }
2796 if (scratchpad != CCISS_FIRMWARE_READY) {
2797 printk(KERN_WARNING "cciss: Board not ready. Timed out.\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002798 err = -ENODEV;
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002799 goto err_out_free_res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002800 }
2801
2802 /* get the address index number */
2803 cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET);
2804 cfg_base_addr &= (__u32) 0x0000ffff;
2805#ifdef CCISS_DEBUG
2806 printk("cfg base address = %x\n", cfg_base_addr);
2807#endif /* CCISS_DEBUG */
2808 cfg_base_addr_index =
2809 find_PCI_BAR_index(pdev, cfg_base_addr);
2810#ifdef CCISS_DEBUG
2811 printk("cfg base address index = %x\n", cfg_base_addr_index);
2812#endif /* CCISS_DEBUG */
2813 if (cfg_base_addr_index == -1) {
2814 printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002815 err = -ENODEV;
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002816 goto err_out_free_res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002817 }
2818
2819 cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
2820#ifdef CCISS_DEBUG
2821 printk("cfg offset = %x\n", cfg_offset);
2822#endif /* CCISS_DEBUG */
2823 c->cfgtable = remap_pci_mem(pci_resource_start(pdev,
2824 cfg_base_addr_index) + cfg_offset,
2825 sizeof(CfgTable_struct));
2826 c->board_id = board_id;
2827
2828#ifdef CCISS_DEBUG
Tobias Klauser945f3902006-01-08 01:05:11 -08002829 print_cfg_table(c->cfgtable);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002830#endif /* CCISS_DEBUG */
2831
Bjorn Helgaas5e8621e2006-06-25 05:49:03 -07002832 for(i=0; i<ARRAY_SIZE(products); i++) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002833 if (board_id == products[i].board_id) {
2834 c->product_name = products[i].product_name;
2835 c->access = *(products[i].access);
2836 break;
2837 }
2838 }
Bjorn Helgaas5e8621e2006-06-25 05:49:03 -07002839 if (i == ARRAY_SIZE(products)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002840 printk(KERN_WARNING "cciss: Sorry, I don't know how"
2841 " to access the Smart Array controller %08lx\n",
2842 (unsigned long)board_id);
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002843 err = -ENODEV;
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002844 goto err_out_free_res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002845 }
2846 if ( (readb(&c->cfgtable->Signature[0]) != 'C') ||
2847 (readb(&c->cfgtable->Signature[1]) != 'I') ||
2848 (readb(&c->cfgtable->Signature[2]) != 'S') ||
2849 (readb(&c->cfgtable->Signature[3]) != 'S') )
2850 {
2851 printk("Does not appear to be a valid CISS config table\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002852 err = -ENODEV;
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002853 goto err_out_free_res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002854 }
2855
2856#ifdef CONFIG_X86
2857{
2858 /* Need to enable prefetch in the SCSI core for 6400 in x86 */
2859 __u32 prefetch;
2860 prefetch = readl(&(c->cfgtable->SCSI_Prefetch));
2861 prefetch |= 0x100;
2862 writel(prefetch, &(c->cfgtable->SCSI_Prefetch));
2863}
2864#endif
2865
2866#ifdef CCISS_DEBUG
2867 printk("Trying to put board into Simple mode\n");
2868#endif /* CCISS_DEBUG */
2869 c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
2870 /* Update the field, and then ring the doorbell */
2871 writel( CFGTBL_Trans_Simple,
2872 &(c->cfgtable->HostWrite.TransportRequest));
2873 writel( CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL);
2874
2875 /* under certain very rare conditions, this can take awhile.
2876 * (e.g.: hot replace a failed 144GB drive in a RAID 5 set right
2877 * as we enter this code.) */
2878 for(i=0;i<MAX_CONFIG_WAIT;i++) {
2879 if (!(readl(c->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq))
2880 break;
2881 /* delay and try again */
2882 set_current_state(TASK_INTERRUPTIBLE);
2883 schedule_timeout(10);
2884 }
2885
2886#ifdef CCISS_DEBUG
2887 printk(KERN_DEBUG "I counter got to %d %x\n", i, readl(c->vaddr + SA5_DOORBELL));
2888#endif /* CCISS_DEBUG */
2889#ifdef CCISS_DEBUG
2890 print_cfg_table(c->cfgtable);
2891#endif /* CCISS_DEBUG */
2892
2893 if (!(readl(&(c->cfgtable->TransportActive)) & CFGTBL_Trans_Simple))
2894 {
2895 printk(KERN_WARNING "cciss: unable to get board into"
2896 " simple mode\n");
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002897 err = -ENODEV;
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002898 goto err_out_free_res;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002899 }
2900 return 0;
2901
Bjorn Helgaas4e570302006-06-25 05:49:02 -07002902err_out_free_res:
2903 pci_release_regions(pdev);
2904
Bjorn Helgaasc33ac892006-06-25 05:49:01 -07002905err_out_disable_pdev:
2906 pci_disable_device(pdev);
2907 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002908}
2909
2910/*
2911 * Gets information about the local volumes attached to the controller.
2912 */
2913static void cciss_getgeometry(int cntl_num)
2914{
2915 ReportLunData_struct *ld_buff;
2916 ReadCapdata_struct *size_buff;
2917 InquiryData_struct *inq_buff;
2918 int return_code;
2919 int i;
2920 int listlength = 0;
2921 __u32 lunid = 0;
2922 int block_size;
2923 int total_size;
2924
Eric Sesterhenn06ff37f2006-03-08 11:21:52 +01002925 ld_buff = kzalloc(sizeof(ReportLunData_struct), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002926 if (ld_buff == NULL)
2927 {
2928 printk(KERN_ERR "cciss: out of memory\n");
2929 return;
2930 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002931 size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
2932 if (size_buff == NULL)
2933 {
2934 printk(KERN_ERR "cciss: out of memory\n");
2935 kfree(ld_buff);
2936 return;
2937 }
2938 inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
2939 if (inq_buff == NULL)
2940 {
2941 printk(KERN_ERR "cciss: out of memory\n");
2942 kfree(ld_buff);
2943 kfree(size_buff);
2944 return;
2945 }
2946 /* Get the firmware version */
2947 return_code = sendcmd(CISS_INQUIRY, cntl_num, inq_buff,
2948 sizeof(InquiryData_struct), 0, 0 ,0, NULL, TYPE_CMD);
2949 if (return_code == IO_OK)
2950 {
2951 hba[cntl_num]->firm_ver[0] = inq_buff->data_byte[32];
2952 hba[cntl_num]->firm_ver[1] = inq_buff->data_byte[33];
2953 hba[cntl_num]->firm_ver[2] = inq_buff->data_byte[34];
2954 hba[cntl_num]->firm_ver[3] = inq_buff->data_byte[35];
2955 } else /* send command failed */
2956 {
2957 printk(KERN_WARNING "cciss: unable to determine firmware"
2958 " version of controller\n");
2959 }
2960 /* Get the number of logical volumes */
2961 return_code = sendcmd(CISS_REPORT_LOG, cntl_num, ld_buff,
2962 sizeof(ReportLunData_struct), 0, 0, 0, NULL, TYPE_CMD);
2963
2964 if( return_code == IO_OK)
2965 {
2966#ifdef CCISS_DEBUG
2967 printk("LUN Data\n--------------------------\n");
2968#endif /* CCISS_DEBUG */
2969
2970 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24;
2971 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16;
2972 listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8;
2973 listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]);
2974 } else /* reading number of logical volumes failed */
2975 {
2976 printk(KERN_WARNING "cciss: report logical volume"
2977 " command failed\n");
2978 listlength = 0;
2979 }
2980 hba[cntl_num]->num_luns = listlength / 8; // 8 bytes pre entry
2981 if (hba[cntl_num]->num_luns > CISS_MAX_LUN)
2982 {
2983 printk(KERN_ERR "ciss: only %d number of logical volumes supported\n",
2984 CISS_MAX_LUN);
2985 hba[cntl_num]->num_luns = CISS_MAX_LUN;
2986 }
2987#ifdef CCISS_DEBUG
2988 printk(KERN_DEBUG "Length = %x %x %x %x = %d\n", ld_buff->LUNListLength[0],
2989 ld_buff->LUNListLength[1], ld_buff->LUNListLength[2],
2990 ld_buff->LUNListLength[3], hba[cntl_num]->num_luns);
2991#endif /* CCISS_DEBUG */
2992
2993 hba[cntl_num]->highest_lun = hba[cntl_num]->num_luns-1;
Mike Millerddd47442005-09-13 01:25:22 -07002994// for(i=0; i< hba[cntl_num]->num_luns; i++)
2995 for(i=0; i < CISS_MAX_LUN; i++)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002996 {
Mike Millerddd47442005-09-13 01:25:22 -07002997 if (i < hba[cntl_num]->num_luns){
2998 lunid = (0xff & (unsigned int)(ld_buff->LUN[i][3]))
2999 << 24;
3000 lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][2]))
3001 << 16;
3002 lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][1]))
3003 << 8;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003004 lunid |= 0xff & (unsigned int)(ld_buff->LUN[i][0]);
3005
3006 hba[cntl_num]->drv[i].LunID = lunid;
3007
3008
3009#ifdef CCISS_DEBUG
3010 printk(KERN_DEBUG "LUN[%d]: %x %x %x %x = %x\n", i,
Mike Millerddd47442005-09-13 01:25:22 -07003011 ld_buff->LUN[i][0], ld_buff->LUN[i][1],
3012 ld_buff->LUN[i][2], ld_buff->LUN[i][3],
3013 hba[cntl_num]->drv[i].LunID);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003014#endif /* CCISS_DEBUG */
3015 cciss_read_capacity(cntl_num, i, size_buff, 0,
3016 &total_size, &block_size);
Mike Millerddd47442005-09-13 01:25:22 -07003017 cciss_geometry_inquiry(cntl_num, i, 0, total_size,
3018 block_size, inq_buff, &hba[cntl_num]->drv[i]);
3019 } else {
3020 /* initialize raid_level to indicate a free space */
3021 hba[cntl_num]->drv[i].raid_level = -1;
3022 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003023 }
3024 kfree(ld_buff);
3025 kfree(size_buff);
3026 kfree(inq_buff);
3027}
3028
3029/* Function to find the first free pointer into our hba[] array */
3030/* Returns -1 if no free entries are left. */
3031static int alloc_cciss_hba(void)
3032{
3033 struct gendisk *disk[NWD];
3034 int i, n;
3035 for (n = 0; n < NWD; n++) {
3036 disk[n] = alloc_disk(1 << NWD_SHIFT);
3037 if (!disk[n])
3038 goto out;
3039 }
3040
3041 for(i=0; i< MAX_CTLR; i++) {
3042 if (!hba[i]) {
3043 ctlr_info_t *p;
Eric Sesterhenn06ff37f2006-03-08 11:21:52 +01003044 p = kzalloc(sizeof(ctlr_info_t), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003045 if (!p)
3046 goto Enomem;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003047 for (n = 0; n < NWD; n++)
3048 p->gendisk[n] = disk[n];
3049 hba[i] = p;
3050 return i;
3051 }
3052 }
3053 printk(KERN_WARNING "cciss: This driver supports a maximum"
3054 " of %d controllers.\n", MAX_CTLR);
3055 goto out;
3056Enomem:
3057 printk(KERN_ERR "cciss: out of memory.\n");
3058out:
3059 while (n--)
3060 put_disk(disk[n]);
3061 return -1;
3062}
3063
3064static void free_hba(int i)
3065{
3066 ctlr_info_t *p = hba[i];
3067 int n;
3068
3069 hba[i] = NULL;
3070 for (n = 0; n < NWD; n++)
3071 put_disk(p->gendisk[n]);
3072 kfree(p);
3073}
3074
3075/*
3076 * This is it. Find all the controllers and register them. I really hate
3077 * stealing all these major device numbers.
3078 * returns the number of block devices registered.
3079 */
3080static int __devinit cciss_init_one(struct pci_dev *pdev,
3081 const struct pci_device_id *ent)
3082{
3083 request_queue_t *q;
3084 int i;
3085 int j;
3086 int rc;
Bjorn Helgaas40aabb52006-06-25 05:49:03 -07003087 int dac;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003088
Linus Torvalds1da177e2005-04-16 15:20:36 -07003089 i = alloc_cciss_hba();
3090 if(i < 0)
3091 return (-1);
Mike Miller1f8ef382005-09-13 01:25:21 -07003092
3093 hba[i]->busy_initializing = 1;
3094
Linus Torvalds1da177e2005-04-16 15:20:36 -07003095 if (cciss_pci_init(hba[i], pdev) != 0)
3096 goto clean1;
3097
3098 sprintf(hba[i]->devname, "cciss%d", i);
3099 hba[i]->ctlr = i;
3100 hba[i]->pdev = pdev;
3101
3102 /* configure PCI DMA stuff */
mike.miller@hp.comeb0df992005-06-10 14:51:04 -05003103 if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK))
Bjorn Helgaas40aabb52006-06-25 05:49:03 -07003104 dac = 1;
mike.miller@hp.comeb0df992005-06-10 14:51:04 -05003105 else if (!pci_set_dma_mask(pdev, DMA_32BIT_MASK))
Bjorn Helgaas40aabb52006-06-25 05:49:03 -07003106 dac = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003107 else {
Bjorn Helgaas40aabb52006-06-25 05:49:03 -07003108 printk(KERN_ERR "cciss: no suitable DMA available\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003109 goto clean1;
3110 }
3111
3112 /*
3113 * register with the major number, or get a dynamic major number
3114 * by passing 0 as argument. This is done for greater than
3115 * 8 controller support.
3116 */
3117 if (i < MAX_CTLR_ORIG)
Christoph Hellwig564de742006-01-08 01:05:17 -08003118 hba[i]->major = COMPAQ_CISS_MAJOR + i;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119 rc = register_blkdev(hba[i]->major, hba[i]->devname);
3120 if(rc == -EBUSY || rc == -EINVAL) {
3121 printk(KERN_ERR
3122 "cciss: Unable to get major number %d for %s "
3123 "on hba %d\n", hba[i]->major, hba[i]->devname, i);
3124 goto clean1;
3125 }
3126 else {
3127 if (i >= MAX_CTLR_ORIG)
3128 hba[i]->major = rc;
3129 }
3130
3131 /* make sure the board interrupts are off */
3132 hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_OFF);
Mike Millerfb86a352006-01-08 01:03:50 -08003133 if( request_irq(hba[i]->intr[SIMPLE_MODE_INT], do_cciss_intr,
Matt Mackall8bd0b972006-06-25 05:47:11 -07003134 SA_INTERRUPT | SA_SHIRQ, hba[i]->devname, hba[i])) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003135 printk(KERN_ERR "cciss: Unable to get irq %d for %s\n",
Mike Millerfb86a352006-01-08 01:03:50 -08003136 hba[i]->intr[SIMPLE_MODE_INT], hba[i]->devname);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003137 goto clean2;
3138 }
Bjorn Helgaas40aabb52006-06-25 05:49:03 -07003139
3140 printk(KERN_INFO "%s: <0x%x> at PCI %s IRQ %d%s using DAC\n",
3141 hba[i]->devname, pdev->device, pci_name(pdev),
3142 hba[i]->intr[SIMPLE_MODE_INT], dac ? "" : " not");
3143
Linus Torvalds1da177e2005-04-16 15:20:36 -07003144 hba[i]->cmd_pool_bits = kmalloc(((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long), GFP_KERNEL);
3145 hba[i]->cmd_pool = (CommandList_struct *)pci_alloc_consistent(
3146 hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
3147 &(hba[i]->cmd_pool_dhandle));
3148 hba[i]->errinfo_pool = (ErrorInfo_struct *)pci_alloc_consistent(
3149 hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
3150 &(hba[i]->errinfo_pool_dhandle));
3151 if((hba[i]->cmd_pool_bits == NULL)
3152 || (hba[i]->cmd_pool == NULL)
3153 || (hba[i]->errinfo_pool == NULL)) {
3154 printk( KERN_ERR "cciss: out of memory");
3155 goto clean4;
3156 }
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003157#ifdef CONFIG_CISS_SCSI_TAPE
3158 hba[i]->scsi_rejects.complete =
3159 kmalloc(sizeof(hba[i]->scsi_rejects.complete[0]) *
3160 (NR_CMDS + 5), GFP_KERNEL);
3161 if (hba[i]->scsi_rejects.complete == NULL) {
3162 printk( KERN_ERR "cciss: out of memory");
3163 goto clean4;
3164 }
3165#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003166 spin_lock_init(&hba[i]->lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003167
3168 /* Initialize the pdev driver private data.
3169 have it point to hba[i]. */
3170 pci_set_drvdata(pdev, hba[i]);
3171 /* command and error info recs zeroed out before
3172 they are used */
3173 memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long));
3174
3175#ifdef CCISS_DEBUG
3176 printk(KERN_DEBUG "Scanning for drives on controller cciss%d\n",i);
3177#endif /* CCISS_DEBUG */
3178
3179 cciss_getgeometry(i);
3180
3181 cciss_scsi_setup(i);
3182
3183 /* Turn the interrupts on so we can service requests */
3184 hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_ON);
3185
3186 cciss_procinit(i);
Mike Millerd6dbf422005-09-21 09:55:32 -07003187 hba[i]->busy_initializing = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003188
Mike Millerad2b9312005-07-28 01:07:31 -07003189 for(j=0; j < NWD; j++) { /* mfm */
3190 drive_info_struct *drv = &(hba[i]->drv[j]);
3191 struct gendisk *disk = hba[i]->gendisk[j];
3192
3193 q = blk_init_queue(do_cciss_request, &hba[i]->lock);
3194 if (!q) {
3195 printk(KERN_ERR
3196 "cciss: unable to allocate queue for disk %d\n",
3197 j);
3198 break;
3199 }
3200 drv->queue = q;
3201
3202 q->backing_dev_info.ra_pages = READ_AHEAD;
Jens Axboea9925a02006-01-09 16:04:06 +01003203 blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003204
Jens Axboea9925a02006-01-09 16:04:06 +01003205 /* This is a hardware imposed limit. */
3206 blk_queue_max_hw_segments(q, MAXSGENTRIES);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003207
Jens Axboea9925a02006-01-09 16:04:06 +01003208 /* This is a limit in the driver and could be eliminated. */
3209 blk_queue_max_phys_segments(q, MAXSGENTRIES);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003210
Jens Axboea9925a02006-01-09 16:04:06 +01003211 blk_queue_max_sectors(q, 512);
3212
3213 blk_queue_softirq_done(q, cciss_softirq_done);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003214
Mike Millerad2b9312005-07-28 01:07:31 -07003215 q->queuedata = hba[i];
Linus Torvalds1da177e2005-04-16 15:20:36 -07003216 sprintf(disk->disk_name, "cciss/c%dd%d", i, j);
3217 sprintf(disk->devfs_name, "cciss/host%d/target%d", i, j);
3218 disk->major = hba[i]->major;
3219 disk->first_minor = j << NWD_SHIFT;
3220 disk->fops = &cciss_fops;
Mike Millerad2b9312005-07-28 01:07:31 -07003221 disk->queue = q;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003222 disk->private_data = drv;
Greg Kroah-Hartman27c0ff82006-04-27 15:46:39 -07003223 disk->driverfs_dev = &pdev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003224 /* we must register the controller even if no disks exist */
3225 /* this is for the online array utilities */
3226 if(!drv->heads && j)
3227 continue;
Mike Millerad2b9312005-07-28 01:07:31 -07003228 blk_queue_hardsect_size(q, drv->block_size);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003229 set_capacity(disk, drv->nr_blocks);
3230 add_disk(disk);
3231 }
Mike Millerad2b9312005-07-28 01:07:31 -07003232
Linus Torvalds1da177e2005-04-16 15:20:36 -07003233 return(1);
3234
3235clean4:
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003236#ifdef CONFIG_CISS_SCSI_TAPE
Andrew Morton1acc0b02006-01-04 18:30:03 -08003237 kfree(hba[i]->scsi_rejects.complete);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003238#endif
Jesper Juhl6044ec82005-11-07 01:01:32 -08003239 kfree(hba[i]->cmd_pool_bits);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003240 if(hba[i]->cmd_pool)
3241 pci_free_consistent(hba[i]->pdev,
3242 NR_CMDS * sizeof(CommandList_struct),
3243 hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
3244 if(hba[i]->errinfo_pool)
3245 pci_free_consistent(hba[i]->pdev,
3246 NR_CMDS * sizeof( ErrorInfo_struct),
3247 hba[i]->errinfo_pool,
3248 hba[i]->errinfo_pool_dhandle);
Mike Millerfb86a352006-01-08 01:03:50 -08003249 free_irq(hba[i]->intr[SIMPLE_MODE_INT], hba[i]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250clean2:
3251 unregister_blkdev(hba[i]->major, hba[i]->devname);
3252clean1:
Mike Miller1f8ef382005-09-13 01:25:21 -07003253 hba[i]->busy_initializing = 0;
Patrick McHardy61808c22006-03-23 02:59:24 -08003254 free_hba(i);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003255 return(-1);
3256}
3257
3258static void __devexit cciss_remove_one (struct pci_dev *pdev)
3259{
3260 ctlr_info_t *tmp_ptr;
3261 int i, j;
3262 char flush_buf[4];
3263 int return_code;
3264
3265 if (pci_get_drvdata(pdev) == NULL)
3266 {
3267 printk( KERN_ERR "cciss: Unable to remove device \n");
3268 return;
3269 }
3270 tmp_ptr = pci_get_drvdata(pdev);
3271 i = tmp_ptr->ctlr;
3272 if (hba[i] == NULL)
3273 {
3274 printk(KERN_ERR "cciss: device appears to "
3275 "already be removed \n");
3276 return;
3277 }
3278 /* Turn board interrupts off and send the flush cache command */
3279 /* sendcmd will turn off interrupt, and send the flush...
3280 * To write all data in the battery backed cache to disks */
3281 memset(flush_buf, 0, 4);
3282 return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL,
3283 TYPE_CMD);
3284 if(return_code != IO_OK)
3285 {
3286 printk(KERN_WARNING "Error Flushing cache on controller %d\n",
3287 i);
3288 }
Mike Millerfb86a352006-01-08 01:03:50 -08003289 free_irq(hba[i]->intr[2], hba[i]);
3290
3291#ifdef CONFIG_PCI_MSI
3292 if (hba[i]->msix_vector)
3293 pci_disable_msix(hba[i]->pdev);
3294 else if (hba[i]->msi_vector)
3295 pci_disable_msi(hba[i]->pdev);
3296#endif /* CONFIG_PCI_MSI */
3297
Linus Torvalds1da177e2005-04-16 15:20:36 -07003298 iounmap(hba[i]->vaddr);
3299 cciss_unregister_scsi(i); /* unhook from SCSI subsystem */
3300 unregister_blkdev(hba[i]->major, hba[i]->devname);
3301 remove_proc_entry(hba[i]->devname, proc_cciss);
3302
3303 /* remove it from the disk list */
3304 for (j = 0; j < NWD; j++) {
3305 struct gendisk *disk = hba[i]->gendisk[j];
mikem6f5a0f72005-11-18 22:05:36 +01003306 if (disk) {
3307 request_queue_t *q = disk->queue;
3308
3309 if (disk->flags & GENHD_FL_UP)
3310 del_gendisk(disk);
3311 if (q)
3312 blk_cleanup_queue(q);
Mike Miller6a445d32005-09-13 01:25:23 -07003313 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003314 }
3315
Linus Torvalds1da177e2005-04-16 15:20:36 -07003316 pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct),
3317 hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
3318 pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
3319 hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle);
3320 kfree(hba[i]->cmd_pool_bits);
mike.miller@hp.com3da8b712005-11-04 12:30:37 -06003321#ifdef CONFIG_CISS_SCSI_TAPE
3322 kfree(hba[i]->scsi_rejects.complete);
3323#endif
Bjorn Helgaas4e570302006-06-25 05:49:02 -07003324 pci_release_regions(pdev);
3325 pci_disable_device(pdev);
3326 pci_set_drvdata(pdev, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003327 free_hba(i);
3328}
3329
3330static struct pci_driver cciss_pci_driver = {
3331 .name = "cciss",
3332 .probe = cciss_init_one,
3333 .remove = __devexit_p(cciss_remove_one),
3334 .id_table = cciss_pci_device_id, /* id_table */
3335};
3336
3337/*
3338 * This is it. Register the PCI driver information for the cards we control
3339 * the OS will call our registered routines when it finds one of our cards.
3340 */
3341static int __init cciss_init(void)
3342{
3343 printk(KERN_INFO DRIVER_NAME "\n");
3344
3345 /* Register for our PCI devices */
Richard Knutsson9bfab8c2005-11-30 00:59:34 +01003346 return pci_register_driver(&cciss_pci_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003347}
3348
3349static void __exit cciss_cleanup(void)
3350{
3351 int i;
3352
3353 pci_unregister_driver(&cciss_pci_driver);
3354 /* double check that all controller entrys have been removed */
3355 for (i=0; i< MAX_CTLR; i++)
3356 {
3357 if (hba[i] != NULL)
3358 {
3359 printk(KERN_WARNING "cciss: had to remove"
3360 " controller %d\n", i);
3361 cciss_remove_one(hba[i]->pdev);
3362 }
3363 }
3364 remove_proc_entry("cciss", proc_root_driver);
3365}
3366
Mike Miller33079b22005-09-13 01:25:22 -07003367static void fail_all_cmds(unsigned long ctlr)
3368{
3369 /* If we get here, the board is apparently dead. */
3370 ctlr_info_t *h = hba[ctlr];
3371 CommandList_struct *c;
3372 unsigned long flags;
3373
3374 printk(KERN_WARNING "cciss%d: controller not responding.\n", h->ctlr);
3375 h->alive = 0; /* the controller apparently died... */
3376
3377 spin_lock_irqsave(CCISS_LOCK(ctlr), flags);
3378
3379 pci_disable_device(h->pdev); /* Make sure it is really dead. */
3380
3381 /* move everything off the request queue onto the completed queue */
3382 while( (c = h->reqQ) != NULL ) {
3383 removeQ(&(h->reqQ), c);
3384 h->Qdepth--;
3385 addQ (&(h->cmpQ), c);
3386 }
3387
3388 /* Now, fail everything on the completed queue with a HW error */
3389 while( (c = h->cmpQ) != NULL ) {
3390 removeQ(&h->cmpQ, c);
3391 c->err_info->CommandStatus = CMD_HARDWARE_ERR;
3392 if (c->cmd_type == CMD_RWREQ) {
3393 complete_command(h, c, 0);
3394 } else if (c->cmd_type == CMD_IOCTL_PEND)
3395 complete(c->waiting);
3396#ifdef CONFIG_CISS_SCSI_TAPE
3397 else if (c->cmd_type == CMD_SCSI)
3398 complete_scsi_command(c, 0, 0);
3399#endif
3400 }
3401 spin_unlock_irqrestore(CCISS_LOCK(ctlr), flags);
3402 return;
3403}
3404
Linus Torvalds1da177e2005-04-16 15:20:36 -07003405module_init(cciss_init);
3406module_exit(cciss_cleanup);