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