cciss.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:63k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *    Disk Array driver for Compaq SMART2 Controllers
  3.  *    Copyright 2000 Compaq Computer Corporation
  4.  *
  5.  *    This program is free software; you can redistribute it and/or modify
  6.  *    it under the terms of the GNU General Public License as published by
  7.  *    the Free Software Foundation; 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 arrays@compaq.com
  20.  *
  21.  */
  22. #include <linux/config.h> /* CONFIG_PROC_FS */
  23. #include <linux/module.h>
  24. #include <linux/version.h>
  25. #include <linux/types.h>
  26. #include <linux/pci.h>
  27. #include <linux/kernel.h>
  28. #include <linux/slab.h>
  29. #include <linux/delay.h>
  30. #include <linux/major.h>
  31. #include <linux/fs.h>
  32. #include <linux/blkpg.h>
  33. #include <linux/timer.h>
  34. #include <linux/proc_fs.h>
  35. #include <linux/init.h> 
  36. #include <linux/hdreg.h>
  37. #include <linux/spinlock.h>
  38. #include <asm/uaccess.h>
  39. #include <asm/io.h>
  40. #include <linux/blk.h>
  41. #include <linux/blkdev.h>
  42. #include <linux/genhd.h>
  43. #define CCISS_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
  44. #define DRIVER_NAME "Compaq CISS Driver (v 2.4.5)"
  45. #define DRIVER_VERSION CCISS_DRIVER_VERSION(2,4,5)
  46. /* Embedded module documentation macros - see modules.h */
  47. MODULE_AUTHOR("Charles M. White III - Compaq Computer Corporation");
  48. MODULE_DESCRIPTION("Driver for Compaq Smart Array Controller 5300");
  49. MODULE_LICENSE("GPL");
  50. #include "cciss_cmd.h"
  51. #include "cciss.h"
  52. #include <linux/cciss_ioctl.h>
  53. /* define the PCI info for the cards we can control */
  54. const struct pci_device_id cciss_pci_device_id[] = {
  55. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISS,
  56. 0x0E11, 0x4070, 0, 0, 0},
  57. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
  58.                         0x0E11, 0x4080, 0, 0, 0},
  59. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
  60.                         0x0E11, 0x4082, 0, 0, 0},
  61. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_CISSB,
  62.                         0x0E11, 0x4083, 0, 0, 0},
  63. {0,}
  64. };
  65. MODULE_DEVICE_TABLE(pci, cciss_pci_device_id);
  66. #define NR_PRODUCTS (sizeof(products)/sizeof(struct board_type))
  67. /*  board_id = Subsystem Device ID & Vendor ID
  68.  *  product = Marketing Name for the board
  69.  *  access = Address of the struct of function pointers 
  70.  */
  71. static struct board_type products[] = {
  72. { 0x40700E11, "Smart Array 5300", &SA5_access },
  73. { 0x40800E11, "Smart Array 5i", &SA5B_access},
  74. { 0x40820E11, "Smart Array 532", &SA5B_access},
  75. { 0x40830E11, "Smart Array 5312", &SA5B_access},
  76. };
  77. /* How long to wait (in millesconds) for board to go into simple mode */
  78. #define MAX_CONFIG_WAIT 1000 
  79. #define READ_AHEAD   128
  80. #define NR_CMDS  128 /* #commands that can be outstanding */
  81. #define MAX_CTLR 8
  82. #define CCISS_DMA_MASK 0xFFFFFFFF /* 32 bit DMA */
  83. static ctlr_info_t *hba[MAX_CTLR];
  84. static struct proc_dir_entry *proc_cciss;
  85. static void do_cciss_request(request_queue_t *q);
  86. static int cciss_open(struct inode *inode, struct file *filep);
  87. static int cciss_release(struct inode *inode, struct file *filep);
  88. static int cciss_ioctl(struct inode *inode, struct file *filep, 
  89. unsigned int cmd, unsigned long arg);
  90. static int revalidate_logvol(kdev_t dev, int maxusage);
  91. static int frevalidate_logvol(kdev_t dev);
  92. static void cciss_getgeometry(int cntl_num);
  93. static inline void addQ(CommandList_struct **Qptr, CommandList_struct *c);
  94. static void start_io( ctlr_info_t *h);
  95. #ifdef CONFIG_PROC_FS
  96. static int cciss_proc_get_info(char *buffer, char **start, off_t offset, 
  97. int length, int *eof, void *data);
  98. static void cciss_procinit(int i);
  99. #else
  100. static int cciss_proc_get_info(char *buffer, char **start, off_t offset, 
  101. int length, int *eof, void *data) { return 0;}
  102. static void cciss_procinit(int i) {}
  103. #endif /* CONFIG_PROC_FS */
  104. static struct block_device_operations cciss_fops  = {
  105. owner: THIS_MODULE,
  106. open: cciss_open, 
  107. release:         cciss_release,
  108.         ioctl: cciss_ioctl,
  109. revalidate: frevalidate_logvol,
  110. };
  111. #include "cciss_scsi.c" /* For SCSI tape support */
  112. /*
  113.  * Report information about this controller.
  114.  */
  115. #ifdef CONFIG_PROC_FS
  116. static int cciss_proc_get_info(char *buffer, char **start, off_t offset, 
  117. int length, int *eof, void *data)
  118. {
  119.         off_t pos = 0;
  120.         off_t len = 0;
  121.         int size, i, ctlr;
  122.         ctlr_info_t *h = (ctlr_info_t*)data;
  123.         drive_info_struct *drv;
  124.         ctlr = h->ctlr;
  125.         size = sprintf(buffer, "%s:  Compaq %s Controllern"
  126.                 "       Board ID: 0x%08lxn"
  127. "       Firmware Version: %c%c%c%cn"
  128.                 "       Memory Address: 0x%08lxn"
  129.                 "       IRQ: %dn"
  130.                 "       Logical drives: %dn"
  131.                 "       Current Q depth: %dn"
  132. "       Current # commands on controller %dn"
  133.                 "       Max Q depth since init: %dn"
  134. "       Max # commands on controller since init: %dn"
  135. "       Max SG entries since init: %dnn",
  136.                 h->devname,
  137.                 h->product_name,
  138.                 (unsigned long)h->board_id,
  139. h->firm_ver[0], h->firm_ver[1], h->firm_ver[2], h->firm_ver[3],
  140.                 (unsigned long)h->vaddr,
  141.                 (unsigned int)h->intr,
  142.                 h->num_luns, 
  143.                 h->Qdepth, h->commands_outstanding,
  144. h->maxQsinceinit, h->max_outstanding, h->maxSG);
  145.         pos += size; len += size;
  146. cciss_proc_tape_report(ctlr, buffer, &pos, &len);
  147. for(i=0; i<h->num_luns; i++) {
  148.                 drv = &h->drv[i];
  149.                 size = sprintf(buffer+len, "cciss/c%dd%d: blksz=%d nr_blocks=%dn",
  150.                                 ctlr, i, drv->block_size, drv->nr_blocks);
  151.                 pos += size; len += size;
  152.         }
  153. size = sprintf(buffer+len, "nr_allocs = %dnnr_frees = %dn",
  154.                         h->nr_allocs, h->nr_frees);
  155.         pos += size; len += size;
  156.         *eof = 1;
  157.         *start = buffer+offset;
  158.         len -= offset;
  159.         if (len>length)
  160.                 len = length;
  161.         return len;
  162. }
  163. static int
  164. cciss_proc_write(struct file *file, const char *buffer,
  165. unsigned long count, void *data)
  166. {
  167. unsigned char cmd[80];
  168. int len;
  169. #ifdef CONFIG_CISS_SCSI_TAPE
  170. ctlr_info_t *h = (ctlr_info_t *) data;
  171. int rc;
  172. #endif
  173. if (count > sizeof(cmd)-1) return -EINVAL;
  174. if (copy_from_user(cmd, buffer, count)) return -EFAULT;
  175. cmd[count] = '';
  176. len = strlen(cmd); // safe???
  177. if (cmd[len-1] == 'n')
  178. cmd[--len] = '';
  179. # ifdef CONFIG_CISS_SCSI_TAPE
  180. if (strcmp("engage scsi", cmd)==0) {
  181. rc = cciss_engage_scsi(h->ctlr);
  182. if (rc != 0) return -rc;
  183. return count;
  184. }
  185. /* might be nice to have "disengage" too, but it's not
  186.    safely possible. (only 1 module use count, lock issues.) */
  187. # endif
  188. return -EINVAL;
  189. }
  190. /*
  191.  * Get us a file in /proc/cciss that says something about each controller.
  192.  * Create /proc/cciss if it doesn't exist yet.
  193.  */
  194. static void __init cciss_procinit(int i)
  195. {
  196. struct proc_dir_entry *pde;
  197. if (proc_cciss == NULL) {
  198. proc_cciss = proc_mkdir("cciss", proc_root_driver);
  199. if (!proc_cciss)
  200. return;
  201. }
  202. pde = create_proc_read_entry(hba[i]->devname,
  203. S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH,
  204. proc_cciss, cciss_proc_get_info, hba[i]);
  205. pde->write_proc = cciss_proc_write;
  206. }
  207. #endif /* CONFIG_PROC_FS */
  208. /* 
  209.  * For operations that cannot sleep, a command block is allocated at init, 
  210.  * and managed by cmd_alloc() and cmd_free() using a simple bitmap to track
  211.  * which ones are free or in use.  For operations that can wait for kmalloc 
  212.  * to possible sleep, this routine can be called with get_from_pool set to 0. 
  213.  * cmd_free() MUST be called with a got_from_pool set to 0 if cmd_alloc was. 
  214.  */ 
  215. static CommandList_struct * cmd_alloc(ctlr_info_t *h, int get_from_pool)
  216. {
  217. CommandList_struct *c;
  218. int i; 
  219. u64bit temp64;
  220. dma_addr_t cmd_dma_handle, err_dma_handle;
  221. if (!get_from_pool)
  222. {
  223. c = (CommandList_struct *) pci_alloc_consistent(
  224. h->pdev, sizeof(CommandList_struct), &cmd_dma_handle); 
  225.          if(c==NULL)
  226.                   return NULL;
  227. memset(c, 0, sizeof(CommandList_struct));
  228. c->err_info = (ErrorInfo_struct *)pci_alloc_consistent(
  229. h->pdev, sizeof(ErrorInfo_struct), 
  230. &err_dma_handle);
  231. if (c->err_info == NULL)
  232. {
  233. pci_free_consistent(h->pdev, 
  234. sizeof(CommandList_struct), c, cmd_dma_handle);
  235. return NULL;
  236. }
  237. memset(c->err_info, 0, sizeof(ErrorInfo_struct));
  238. } else /* get it out of the controllers pool */ 
  239. {
  240.       do {
  241.                  i = find_first_zero_bit(h->cmd_pool_bits, NR_CMDS);
  242.                         if (i == NR_CMDS)
  243.                                 return NULL;
  244.                 } while(test_and_set_bit(i%32, h->cmd_pool_bits+(i/32)) != 0);
  245. #ifdef CCISS_DEBUG
  246. printk(KERN_DEBUG "cciss: using command buffer %dn", i);
  247. #endif
  248.                 c = h->cmd_pool + i;
  249. memset(c, 0, sizeof(CommandList_struct));
  250. cmd_dma_handle = h->cmd_pool_dhandle 
  251. + i*sizeof(CommandList_struct);
  252. c->err_info = h->errinfo_pool + i;
  253. memset(c->err_info, 0, sizeof(ErrorInfo_struct));
  254. err_dma_handle = h->errinfo_pool_dhandle 
  255. + i*sizeof(ErrorInfo_struct);
  256.                 h->nr_allocs++;
  257.         }
  258. c->busaddr = (__u32) cmd_dma_handle;
  259. temp64.val = (__u64) err_dma_handle;
  260. c->ErrDesc.Addr.lower = temp64.val32.lower;
  261. c->ErrDesc.Addr.upper = temp64.val32.upper;
  262. c->ErrDesc.Len = sizeof(ErrorInfo_struct);
  263. c->ctlr = h->ctlr;
  264.         return c;
  265. }
  266. /* 
  267.  * Frees a command block that was previously allocated with cmd_alloc(). 
  268.  */
  269. static void cmd_free(ctlr_info_t *h, CommandList_struct *c, int got_from_pool)
  270. {
  271. int i;
  272. u64bit temp64;
  273. if( !got_from_pool)
  274. temp64.val32.lower = c->ErrDesc.Addr.lower;
  275. temp64.val32.upper = c->ErrDesc.Addr.upper;
  276. pci_free_consistent(h->pdev, sizeof(ErrorInfo_struct), 
  277. c->err_info, (dma_addr_t) temp64.val);
  278. pci_free_consistent(h->pdev, sizeof(CommandList_struct), 
  279. c, (dma_addr_t) c->busaddr);
  280. } else 
  281. {
  282. i = c - h->cmd_pool;
  283. clear_bit(i%32, h->cmd_pool_bits+(i/32));
  284.                 h->nr_frees++;
  285.         }
  286. }
  287. /*  
  288.  * fills in the disk information. 
  289.  */
  290. static void cciss_geninit( int ctlr)
  291. {
  292. drive_info_struct *drv;
  293. int i,j;
  294. /* Loop through each real device */ 
  295. hba[ctlr]->gendisk.nr_real = 0; 
  296. for(i=0; i< NWD; i++)
  297. {
  298. drv = &(hba[ctlr]->drv[i]);
  299. if( !(drv->nr_blocks))
  300. continue;
  301. hba[ctlr]->hd[i << NWD_SHIFT].nr_sects = 
  302. hba[ctlr]->sizes[i << NWD_SHIFT] = drv->nr_blocks;
  303. /* for each partition */ 
  304. for(j=0; j<MAX_PART; j++)
  305. {
  306. hba[ctlr]->blocksizes[(i<<NWD_SHIFT) + j] = 1024; 
  307. hba[ctlr]->hardsizes[ (i<<NWD_SHIFT) + j] = 
  308. drv->block_size;
  309. }
  310. hba[ctlr]->gendisk.nr_real++;
  311. }
  312. }
  313. /*
  314.  * Open.  Make sure the device is really there.
  315.  */
  316. static int cciss_open(struct inode *inode, struct file *filep)
  317. {
  318. int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR;
  319. int dsk  = MINOR(inode->i_rdev) >> NWD_SHIFT;
  320. #ifdef CCISS_DEBUG
  321. printk(KERN_DEBUG "cciss_open %x (%x:%x)n", inode->i_rdev, ctlr, dsk);
  322. #endif /* CCISS_DEBUG */ 
  323. if (ctlr > MAX_CTLR || hba[ctlr] == NULL)
  324. return -ENXIO;
  325. /*
  326.  * Root is allowed to open raw volume zero even if its not configured
  327.  * so array config can still work. I don't think I really like this,
  328.  * but I'm already using way to many device nodes to claim another one
  329.  * for "raw controller".
  330.  */
  331. if (hba[ctlr]->sizes[MINOR(inode->i_rdev)] == 0) { /* not online? */
  332. if (MINOR(inode->i_rdev) != 0)  /* not node 0? */
  333. return -ENXIO;
  334. if (!capable(CAP_SYS_ADMIN))
  335. return -EPERM;
  336. }
  337. hba[ctlr]->drv[dsk].usage_count++;
  338. hba[ctlr]->usage_count++;
  339. return 0;
  340. }
  341. /*
  342.  * Close.  Sync first.
  343.  */
  344. static int cciss_release(struct inode *inode, struct file *filep)
  345. {
  346. int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR;
  347. int dsk  = MINOR(inode->i_rdev) >> NWD_SHIFT;
  348. #ifdef CCISS_DEBUG
  349. printk(KERN_DEBUG "cciss_release %x (%x:%x)n", inode->i_rdev, ctlr, dsk);
  350. #endif /* CCISS_DEBUG */
  351. /* fsync_dev(inode->i_rdev); */
  352. hba[ctlr]->drv[dsk].usage_count--;
  353. hba[ctlr]->usage_count--;
  354. return 0;
  355. }
  356. /*
  357.  * ioctl 
  358.  */
  359. static int cciss_ioctl(struct inode *inode, struct file *filep, 
  360. unsigned int cmd, unsigned long arg)
  361. {
  362. int ctlr = MAJOR(inode->i_rdev) - MAJOR_NR;
  363. int dsk  = MINOR(inode->i_rdev) >> NWD_SHIFT;
  364. #ifdef CCISS_DEBUG
  365. printk(KERN_DEBUG "cciss_ioctl: Called with cmd=%x %lxn", cmd, arg);
  366. #endif /* CCISS_DEBUG */ 
  367. switch(cmd) {
  368. case HDIO_GETGEO:
  369. {
  370. struct hd_geometry driver_geo;
  371. if (hba[ctlr]->drv[dsk].cylinders) {
  372. driver_geo.heads = hba[ctlr]->drv[dsk].heads;
  373. driver_geo.sectors = hba[ctlr]->drv[dsk].sectors;
  374. driver_geo.cylinders = hba[ctlr]->drv[dsk].cylinders;
  375. } else {
  376. driver_geo.heads = 0xff;
  377. driver_geo.sectors = 0x3f;
  378. driver_geo.cylinders = 
  379. hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
  380. }
  381. driver_geo.start=
  382. hba[ctlr]->hd[MINOR(inode->i_rdev)].start_sect;
  383. if (copy_to_user((void *) arg, &driver_geo,
  384. sizeof( struct hd_geometry)))
  385. return  -EFAULT;
  386. return(0);
  387. }
  388. case HDIO_GETGEO_BIG:
  389. {
  390. struct hd_big_geometry driver_geo;
  391. if (hba[ctlr]->drv[dsk].cylinders) {
  392. driver_geo.heads = hba[ctlr]->drv[dsk].heads;
  393. driver_geo.sectors = hba[ctlr]->drv[dsk].sectors;
  394. driver_geo.cylinders = hba[ctlr]->drv[dsk].cylinders;
  395. } else {
  396. driver_geo.heads = 0xff;
  397. driver_geo.sectors = 0x3f;
  398. driver_geo.cylinders = 
  399. hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f);
  400. }
  401. driver_geo.start= 
  402. hba[ctlr]->hd[MINOR(inode->i_rdev)].start_sect;
  403. if (copy_to_user((void *) arg, &driver_geo,  
  404. sizeof( struct hd_big_geometry)))
  405. return  -EFAULT;
  406. return(0);
  407. }
  408. case BLKGETSIZE:
  409. put_user(hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects, (unsigned long *)arg);
  410. return 0;
  411. case BLKGETSIZE64:
  412. put_user((u64)hba[ctlr]->hd[MINOR(inode->i_rdev)].nr_sects << 9, (u64*)arg);
  413. return 0;
  414. case BLKRRPART:
  415. if(!capable(CAP_SYS_ADMIN))
  416. return -EPERM;
  417. return revalidate_logvol(inode->i_rdev, 1);
  418. case BLKFLSBUF:
  419. case BLKBSZSET:
  420. case BLKBSZGET:
  421. case BLKROSET:
  422. case BLKROGET:
  423. case BLKRASET:
  424. case BLKRAGET:
  425. case BLKPG:
  426. case BLKELVGET:
  427. case BLKELVSET:
  428. return( blk_ioctl(inode->i_rdev, cmd, arg));
  429. case CCISS_GETPCIINFO:
  430. {
  431. cciss_pci_info_struct pciinfo;
  432. if (!arg) return -EINVAL;
  433. pciinfo.bus = hba[ctlr]->pdev->bus->number;
  434. pciinfo.dev_fn = hba[ctlr]->pdev->devfn;
  435. pciinfo.board_id = hba[ctlr]->board_id;
  436. if (copy_to_user((void *) arg, &pciinfo,  sizeof( cciss_pci_info_struct )))
  437. return  -EFAULT;
  438. return(0);
  439. }
  440. case CCISS_GETINTINFO:
  441. {
  442. cciss_coalint_struct intinfo;
  443. ctlr_info_t *c = hba[ctlr];
  444. if (!arg) return -EINVAL;
  445. intinfo.delay = readl(&c->cfgtable->HostWrite.CoalIntDelay);
  446. intinfo.count = readl(&c->cfgtable->HostWrite.CoalIntCount);
  447. if (copy_to_user((void *) arg, &intinfo, sizeof( cciss_coalint_struct )))
  448. return -EFAULT;
  449.                 return(0);
  450.         }
  451. case CCISS_SETINTINFO:
  452.         {
  453.                 cciss_coalint_struct intinfo;
  454.                 ctlr_info_t *c = hba[ctlr];
  455. unsigned long flags;
  456. int i;
  457. if (!arg) return -EINVAL;
  458. if (!capable(CAP_SYS_ADMIN)) return -EPERM;
  459. if (copy_from_user(&intinfo, (void *) arg, sizeof( cciss_coalint_struct)))
  460. return -EFAULT;
  461. if ( (intinfo.delay == 0 ) && (intinfo.count == 0))
  462. {
  463. // printk("cciss_ioctl: delay and count cannot be 0n");
  464. return( -EINVAL);
  465. }
  466. spin_lock_irqsave(&io_request_lock, flags);
  467. /* Can only safely update if no commands outstanding */ 
  468. if (c->commands_outstanding > 0 )
  469. {
  470. // printk("cciss_ioctl: cannot change coalasing "
  471. // "%d commands outstanding on controllern", 
  472. // c->commands_outstanding);
  473. spin_unlock_irqrestore(&io_request_lock, flags);
  474. return(-EINVAL);
  475. }
  476. /* Update the field, and then ring the doorbell */ 
  477. writel( intinfo.delay, 
  478. &(c->cfgtable->HostWrite.CoalIntDelay));
  479. writel( intinfo.count, 
  480.                         &(c->cfgtable->HostWrite.CoalIntCount));
  481. writel( CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL);
  482. for(i=0;i<MAX_CONFIG_WAIT;i++)
  483. {
  484. if (!(readl(c->vaddr + SA5_DOORBELL) 
  485. & CFGTBL_ChangeReq))
  486. break;
  487. /* delay and try again */
  488. udelay(1000);
  489. }
  490. spin_unlock_irqrestore(&io_request_lock, flags);
  491. if (i >= MAX_CONFIG_WAIT)
  492. return( -EFAULT);
  493.                 return(0);
  494.         }
  495. case CCISS_GETNODENAME:
  496.         {
  497.                 NodeName_type NodeName;
  498.                 ctlr_info_t *c = hba[ctlr];
  499. int i; 
  500. if (!arg) return -EINVAL;
  501. for(i=0;i<16;i++)
  502. NodeName[i] = readb(&c->cfgtable->ServerName[i]);
  503.                 if (copy_to_user((void *) arg, NodeName, sizeof( NodeName_type)))
  504.                  return  -EFAULT;
  505.                 return(0);
  506.         }
  507. case CCISS_SETNODENAME:
  508. {
  509. NodeName_type NodeName;
  510. ctlr_info_t *c = hba[ctlr];
  511. unsigned long flags;
  512. int i;
  513. if (!arg) return -EINVAL;
  514. if (!capable(CAP_SYS_ADMIN)) return -EPERM;
  515. if (copy_from_user(NodeName, (void *) arg, sizeof( NodeName_type)))
  516. return -EFAULT;
  517. spin_lock_irqsave(&io_request_lock, flags);
  518. /* Update the field, and then ring the doorbell */ 
  519. for(i=0;i<16;i++)
  520. writeb( NodeName[i], &c->cfgtable->ServerName[i]);
  521. writel( CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL);
  522. for(i=0;i<MAX_CONFIG_WAIT;i++)
  523. {
  524. if (!(readl(c->vaddr + SA5_DOORBELL) 
  525. & CFGTBL_ChangeReq))
  526. break;
  527. /* delay and try again */
  528. udelay(1000);
  529. }
  530. spin_unlock_irqrestore(&io_request_lock, flags);
  531. if (i >= MAX_CONFIG_WAIT)
  532. return( -EFAULT);
  533.                 return(0);
  534.         }
  535. case CCISS_GETHEARTBEAT:
  536.         {
  537.                 Heartbeat_type heartbeat;
  538.                 ctlr_info_t *c = hba[ctlr];
  539. if (!arg) return -EINVAL;
  540.                 heartbeat = readl(&c->cfgtable->HeartBeat);
  541.                 if (copy_to_user((void *) arg, &heartbeat, sizeof( Heartbeat_type)))
  542.                  return -EFAULT;
  543.                 return(0);
  544.         }
  545. case CCISS_GETBUSTYPES:
  546.         {
  547.                 BusTypes_type BusTypes;
  548.                 ctlr_info_t *c = hba[ctlr];
  549. if (!arg) return -EINVAL;
  550.                 BusTypes = readl(&c->cfgtable->BusTypes);
  551.                 if (copy_to_user((void *) arg, &BusTypes, sizeof( BusTypes_type) ))
  552.                  return  -EFAULT;
  553.                 return(0);
  554.         }
  555. case CCISS_GETFIRMVER:
  556.         {
  557. FirmwareVer_type firmware;
  558. if (!arg) return -EINVAL;
  559. memcpy(firmware, hba[ctlr]->firm_ver, 4);
  560.                 if (copy_to_user((void *) arg, firmware, sizeof( FirmwareVer_type)))
  561.                  return -EFAULT;
  562.                 return(0);
  563.         }
  564.         case CCISS_GETDRIVVER:
  565.         {
  566. DriverVer_type DriverVer = DRIVER_VERSION;
  567.                 if (!arg) return -EINVAL;
  568.                 if (copy_to_user((void *) arg, &DriverVer, sizeof( DriverVer_type) ))
  569.                  return -EFAULT;
  570.                 return(0);
  571.         }
  572. case CCISS_GETLUNINFO:
  573. {
  574. LogvolInfo_struct luninfo;
  575. int num_parts = 0;
  576. int i, start;
  577. luninfo.LunID = hba[ctlr]->drv[dsk].LunID;
  578. luninfo.num_opens = hba[ctlr]->drv[dsk].usage_count;
  579. /* count partitions 1 to 15 with sizes > 0 */
  580.    start = (dsk << NWD_SHIFT);
  581. for(i=1; i <MAX_PART; i++) {
  582. int minor = start+i;
  583. if(hba[ctlr]->sizes[minor] != 0)
  584. num_parts++;
  585. }
  586. luninfo.num_parts = num_parts;
  587. if (copy_to_user((void *) arg, &luninfo,
  588. sizeof( LogvolInfo_struct) ))
  589. return -EFAULT;
  590. return(0);
  591. }
  592. case CCISS_PASSTHRU:
  593. {
  594. IOCTL_Command_struct iocommand;
  595. ctlr_info_t *h = hba[ctlr];
  596. CommandList_struct *c;
  597. char  *buff = NULL;
  598. u64bit temp64;
  599. unsigned long flags;
  600. DECLARE_COMPLETION(wait);
  601. if (!arg) return -EINVAL;
  602. if (!capable(CAP_SYS_RAWIO)) return -EPERM;
  603. if (copy_from_user(&iocommand, (void *) arg, sizeof( IOCTL_Command_struct) ))
  604. return -EFAULT;
  605. if((iocommand.buf_size < 1) && 
  606. (iocommand.Request.Type.Direction != XFER_NONE))
  607. {
  608. return -EINVAL;
  609. /* Check kmalloc limits */
  610. if(iocommand.buf_size > 128000)
  611. return -EINVAL;
  612. if(iocommand.buf_size > 0)
  613. {
  614. buff =  kmalloc(iocommand.buf_size, GFP_KERNEL);
  615. if( buff == NULL) 
  616. return -EFAULT;
  617. }
  618. if (iocommand.Request.Type.Direction == XFER_WRITE)
  619. {
  620. /* Copy the data into the buffer we created */ 
  621. if (copy_from_user(buff, iocommand.buf, iocommand.buf_size))
  622. {
  623. kfree(buff);
  624. return -EFAULT;
  625. }
  626. }
  627. if ((c = cmd_alloc(h , 0)) == NULL)
  628. {
  629. kfree(buff);
  630. return -ENOMEM;
  631. }
  632. // Fill in the command type 
  633. c->cmd_type = CMD_IOCTL_PEND;
  634. // Fill in Command Header 
  635. c->Header.ReplyQueue = 0;  // unused in simple mode
  636. if( iocommand.buf_size > 0)  // buffer to fill 
  637. {
  638. c->Header.SGList = 1;
  639. c->Header.SGTotal= 1;
  640. } else // no buffers to fill  
  641. {
  642. c->Header.SGList = 0;
  643.                  c->Header.SGTotal= 0;
  644. }
  645. c->Header.LUN = iocommand.LUN_info;
  646. c->Header.Tag.lower = c->busaddr;  // use the kernel address the cmd block for tag
  647. // Fill in Request block 
  648. c->Request = iocommand.Request; 
  649. // Fill in the scatter gather information
  650. if (iocommand.buf_size > 0 ) 
  651. {
  652. temp64.val = pci_map_single( h->pdev, buff,
  653.                                         iocommand.buf_size, 
  654.                                 PCI_DMA_BIDIRECTIONAL);
  655. c->SG[0].Addr.lower = temp64.val32.lower;
  656. c->SG[0].Addr.upper = temp64.val32.upper;
  657. c->SG[0].Len = iocommand.buf_size;
  658. c->SG[0].Ext = 0;  // we are not chaining
  659. }
  660. c->waiting = &wait;
  661. /* Put the request on the tail of the request queue */
  662. spin_lock_irqsave(&io_request_lock, flags);
  663. addQ(&h->reqQ, c);
  664. h->Qdepth++;
  665. start_io(h);
  666. spin_unlock_irqrestore(&io_request_lock, flags);
  667. wait_for_completion(&wait);
  668. /* unlock the buffers from DMA */
  669. temp64.val32.lower = c->SG[0].Addr.lower;
  670.                 temp64.val32.upper = c->SG[0].Addr.upper;
  671.                 pci_unmap_single( h->pdev, (dma_addr_t) temp64.val,
  672.                  iocommand.buf_size, PCI_DMA_BIDIRECTIONAL);
  673. /* Copy the error information out */ 
  674. iocommand.error_info = *(c->err_info);
  675. if ( copy_to_user((void *) arg, &iocommand, sizeof( IOCTL_Command_struct) ) )
  676. {
  677. kfree(buff);
  678. cmd_free(h, c, 0);
  679. return( -EFAULT);
  680. if (iocommand.Request.Type.Direction == XFER_READ)
  681.                 {
  682.                         /* Copy the data out of the buffer we created */
  683.                         if (copy_to_user(iocommand.buf, buff, iocommand.buf_size))
  684. {
  685.                          kfree(buff);
  686. cmd_free(h, c, 0);
  687. return -EFAULT;
  688. }
  689.                 }
  690.                 kfree(buff);
  691. cmd_free(h, c, 0);
  692.                 return(0);
  693. default:
  694. return -EBADRQC;
  695. }
  696. }
  697. /* Borrowed and adapted from sd.c */
  698. static int revalidate_logvol(kdev_t dev, int maxusage)
  699. {
  700.         int ctlr, target;
  701.         struct gendisk *gdev;
  702.         unsigned long flags;
  703.         int max_p;
  704.         int start;
  705.         int i;
  706.         target = MINOR(dev) >> NWD_SHIFT;
  707.         ctlr = MAJOR(dev) - MAJOR_NR;
  708.         gdev = &(hba[ctlr]->gendisk);
  709.         spin_lock_irqsave(&io_request_lock, flags);
  710.         if (hba[ctlr]->drv[target].usage_count > maxusage) {
  711.                 spin_unlock_irqrestore(&io_request_lock, flags);
  712.                 printk(KERN_WARNING "cciss: Device busy for "
  713.                         "revalidation (usage=%d)n",
  714.                         hba[ctlr]->drv[target].usage_count);
  715.                 return -EBUSY;
  716.         }
  717.         hba[ctlr]->drv[target].usage_count++;
  718.         spin_unlock_irqrestore(&io_request_lock, flags);
  719.         max_p = gdev->max_p;
  720.         start = target << gdev->minor_shift;
  721.         for(i=max_p-1; i>=0; i--) {
  722.                 int minor = start+i;
  723.                 invalidate_device(MKDEV(MAJOR_NR + ctlr, minor), 1);
  724.                 gdev->part[minor].start_sect = 0;
  725.                 gdev->part[minor].nr_sects = 0;
  726.                 /* reset the blocksize so we can read the partition table */
  727.                 blksize_size[MAJOR_NR+ctlr][minor] = 1024;
  728.         }
  729. /* setup partitions per disk */
  730. grok_partitions(gdev, target, MAX_PART, 
  731. hba[ctlr]->drv[target].nr_blocks);
  732.         hba[ctlr]->drv[target].usage_count--;
  733.         return 0;
  734. }
  735. static int frevalidate_logvol(kdev_t dev)
  736. {
  737. #ifdef CCISS_DEBUG
  738. printk(KERN_DEBUG "cciss: frevalidate has been calledn");
  739. #endif /* CCISS_DEBUG */ 
  740. return revalidate_logvol(dev, 0);
  741. }
  742. /*
  743.  *   Wait polling for a command to complete.
  744.  *   The memory mapped FIFO is polled for the completion.
  745.  *   Used only at init time, interrupts disabled.
  746.  */
  747. static unsigned long pollcomplete(int ctlr)
  748. {
  749.         unsigned long done;
  750.         int i;
  751.         /* Wait (up to 2 seconds) for a command to complete */
  752.         for (i = 200000; i > 0; i--) {
  753.                 done = hba[ctlr]->access.command_completed(hba[ctlr]);
  754.                 if (done == FIFO_EMPTY) {
  755.                         udelay(10);     /* a short fixed delay */
  756.                 } else
  757.                         return (done);
  758.         }
  759.         /* Invalid address to tell caller we ran out of time */
  760.         return 1;
  761. }
  762. /*
  763.  * Send a command to the controller, and wait for it to complete.  
  764.  * Only used at init time. 
  765.  */
  766. static int sendcmd(
  767. __u8 cmd,
  768. int ctlr,
  769. void *buff,
  770. size_t size,
  771. unsigned int use_unit_num, /* 0: address the controller,
  772.       1: address logical volume log_unit,
  773.       2: periph device address is scsi3addr */
  774. unsigned int log_unit,
  775. __u8 page_code,
  776. unsigned char *scsi3addr)
  777. {
  778. CommandList_struct *c;
  779. int i;
  780. unsigned long complete;
  781. ctlr_info_t *info_p= hba[ctlr];
  782. u64bit buff_dma_handle;
  783. c = cmd_alloc(info_p, 1);
  784. if (c == NULL)
  785. {
  786. printk(KERN_WARNING "cciss: unable to get memory");
  787. return(IO_ERROR);
  788. }
  789. // Fill in Command Header 
  790. c->Header.ReplyQueue = 0;  // unused in simple mode
  791. if( buff != NULL)  // buffer to fill 
  792. {
  793. c->Header.SGList = 1;
  794. c->Header.SGTotal= 1;
  795. } else // no buffers to fill  
  796. {
  797. c->Header.SGList = 0;
  798.                 c->Header.SGTotal= 0;
  799. }
  800. c->Header.Tag.lower = c->busaddr;  // use the kernel address the cmd block for tag
  801. // Fill in Request block 
  802. switch(cmd)
  803. {
  804. case  CISS_INQUIRY:
  805. /* If the logical unit number is 0 then, this is going
  806. to controller so It's a physical command
  807. mode = 0 target = 0.
  808. So we have nothing to write. 
  809. otherwise, if use_unit_num == 1,
  810. mode = 1(volume set addressing) target = LUNID
  811. otherwise, if use_unit_num == 2,
  812. mode = 0(periph dev addr) target = scsi3addr
  813. */
  814. if(use_unit_num == 1)
  815. {
  816. c->Header.LUN.LogDev.VolId=
  817.                                  hba[ctlr]->drv[log_unit].LunID;
  818.                          c->Header.LUN.LogDev.Mode = 1;
  819. }
  820. else if (use_unit_num == 2)
  821. {
  822. memcpy(c->Header.LUN.LunAddrBytes,scsi3addr,8);
  823. c->Header.LUN.LogDev.Mode = 0; // phys dev addr
  824. }
  825. /* are we trying to read a vital product page */
  826. if(page_code != 0)
  827. {
  828. c->Request.CDB[1] = 0x01;
  829. c->Request.CDB[2] = page_code;
  830. }
  831. c->Request.CDBLen = 6;
  832. c->Request.Type.Type =  TYPE_CMD; // It is a command. 
  833. c->Request.Type.Attribute = ATTR_SIMPLE;  
  834. c->Request.Type.Direction = XFER_READ; // Read 
  835. c->Request.Timeout = 0; // Don't time out 
  836. c->Request.CDB[0] =  CISS_INQUIRY;
  837. c->Request.CDB[4] = size  & 0xFF;  
  838. break;
  839. case CISS_REPORT_LOG:
  840. case CISS_REPORT_PHYS:
  841.                         /* Talking to controller so It's a physical command
  842.                                 mode = 00 target = 0.
  843.                                 So we have nothing to write.
  844.                         */
  845.                         c->Request.CDBLen = 12;
  846.                         c->Request.Type.Type =  TYPE_CMD; // It is a command.
  847.                         c->Request.Type.Attribute = ATTR_SIMPLE; 
  848.                         c->Request.Type.Direction = XFER_READ; // Read
  849.                         c->Request.Timeout = 0; // Don't time out
  850. c->Request.CDB[0] = cmd;
  851.                         c->Request.CDB[6] = (size >> 24) & 0xFF;  //MSB
  852.                         c->Request.CDB[7] = (size >> 16) & 0xFF;
  853.                         c->Request.CDB[8] = (size >> 8) & 0xFF;
  854.                         c->Request.CDB[9] = size & 0xFF;
  855.                 break;
  856. case CCISS_READ_CAPACITY:
  857. c->Header.LUN.LogDev.VolId= 
  858. hba[ctlr]->drv[log_unit].LunID;
  859. c->Header.LUN.LogDev.Mode = 1;
  860. c->Request.CDBLen = 10;
  861.                         c->Request.Type.Type =  TYPE_CMD; // It is a command.
  862.                         c->Request.Type.Attribute = ATTR_SIMPLE; 
  863.                         c->Request.Type.Direction = XFER_READ; // Read
  864.                         c->Request.Timeout = 0; // Don't time out
  865.                         c->Request.CDB[0] = CCISS_READ_CAPACITY;
  866. break;
  867. case CCISS_CACHE_FLUSH:
  868. c->Request.CDBLen = 12;
  869. c->Request.Type.Type =  TYPE_CMD; // It is a command.
  870. c->Request.Type.Attribute = ATTR_SIMPLE;
  871. c->Request.Type.Direction = XFER_WRITE; // No data
  872. c->Request.Timeout = 0; // Don't time out
  873. c->Request.CDB[0] = BMIC_WRITE;  // BMIC Passthru
  874. c->Request.CDB[6] = BMIC_CACHE_FLUSH;
  875. break;
  876. default:
  877. printk(KERN_WARNING
  878. "cciss:  Unknown Command 0x%c sent attemptedn",
  879.   cmd);
  880. cmd_free(info_p, c, 1);
  881. return(IO_ERROR);
  882. };
  883. // Fill in the scatter gather information
  884. if (size > 0 ) 
  885. {
  886. buff_dma_handle.val = (__u64) pci_map_single( info_p->pdev, 
  887. buff, size, PCI_DMA_BIDIRECTIONAL);
  888. c->SG[0].Addr.lower = buff_dma_handle.val32.lower;
  889. c->SG[0].Addr.upper = buff_dma_handle.val32.upper;
  890. c->SG[0].Len = size;
  891. c->SG[0].Ext = 0;  // we are not chaining
  892. }
  893. /*
  894.          * Disable interrupt
  895.          */
  896. #ifdef CCISS_DEBUG
  897. printk(KERN_DEBUG "cciss: turning intr offn");
  898. #endif /* CCISS_DEBUG */ 
  899.         info_p->access.set_intr_mask(info_p, CCISS_INTR_OFF);
  900. /* Make sure there is room in the command FIFO */
  901.         /* Actually it should be completely empty at this time. */
  902.         for (i = 200000; i > 0; i--) 
  903. {
  904. /* if fifo isn't full go */
  905.                 if (!(info_p->access.fifo_full(info_p))) 
  906. {
  907.                         break;
  908.                 }
  909.                 udelay(10);
  910.                 printk(KERN_WARNING "cciss cciss%d: SendCmd FIFO full,"
  911.                         " waiting!n", ctlr);
  912.         }
  913.         /*
  914.          * Send the cmd
  915.          */
  916.         info_p->access.submit_command(info_p, c);
  917.         complete = pollcomplete(ctlr);
  918. #ifdef CCISS_DEBUG
  919. printk(KERN_DEBUG "cciss: command completedn");
  920. #endif /* CCISS_DEBUG */
  921. /* unlock the data buffer from DMA */
  922. pci_unmap_single(info_p->pdev, (dma_addr_t) buff_dma_handle.val,
  923.                                 size, PCI_DMA_BIDIRECTIONAL);
  924. if (complete != 1) {
  925. if ( (complete & CISS_ERROR_BIT)
  926.      && (complete & ~CISS_ERROR_BIT) == c->busaddr)
  927.      {
  928. /* if data overrun or underun on Report command 
  929. ignore it 
  930. */
  931. if (((c->Request.CDB[0] == CISS_REPORT_LOG) ||
  932.      (c->Request.CDB[0] == CISS_REPORT_PHYS) ||
  933.      (c->Request.CDB[0] == CISS_INQUIRY)) &&
  934. ((c->err_info->CommandStatus == 
  935. CMD_DATA_OVERRUN) || 
  936.  (c->err_info->CommandStatus == 
  937. CMD_DATA_UNDERRUN)
  938.   ))
  939. {
  940. complete = c->busaddr;
  941. } else
  942. {
  943. printk(KERN_WARNING "ciss ciss%d: sendcmd"
  944. " Error %x n", ctlr, 
  945. c->err_info->CommandStatus); 
  946. printk(KERN_WARNING "ciss ciss%d: sendcmd"
  947. " offensive infon"
  948. "  size %xn   num %x   value %xn", ctlr,
  949.   c->err_info->MoreErrInfo.Invalid_Cmd.offense_size,
  950.   c->err_info->MoreErrInfo.Invalid_Cmd.offense_num,
  951.   c->err_info->MoreErrInfo.Invalid_Cmd.offense_value);
  952. cmd_free(info_p,c, 1);
  953. return(IO_ERROR);
  954. }
  955. }
  956.                 if (complete != c->busaddr) {
  957.                         printk( KERN_WARNING "cciss cciss%d: SendCmd "
  958.                       "Invalid command list address returned! (%lx)n",
  959.                                 ctlr, complete);
  960.                         cmd_free(info_p, c, 1);
  961.                         return (IO_ERROR);
  962.                 }
  963.         } else {
  964.                 printk( KERN_WARNING
  965.                         "cciss cciss%d: SendCmd Timeout out, "
  966.                         "No command list address returned!n",
  967.                         ctlr);
  968.                 cmd_free(info_p, c, 1);
  969.                 return (IO_ERROR);
  970.         }
  971. cmd_free(info_p, c, 1);
  972.         return (IO_OK);
  973. /*
  974.  * Map (physical) PCI mem into (virtual) kernel space
  975.  */
  976. static ulong remap_pci_mem(ulong base, ulong size)
  977. {
  978.         ulong page_base        = ((ulong) base) & PAGE_MASK;
  979.         ulong page_offs        = ((ulong) base) - page_base;
  980.         ulong page_remapped    = (ulong) ioremap(page_base, page_offs+size);
  981.         return (ulong) (page_remapped ? (page_remapped + page_offs) : 0UL);
  982. }
  983. /*
  984.  * Enqueuing and dequeuing functions for cmdlists.
  985.  */
  986. static inline void addQ(CommandList_struct **Qptr, CommandList_struct *c)
  987. {
  988.         if (*Qptr == NULL) {
  989.                 *Qptr = c;
  990.                 c->next = c->prev = c;
  991.         } else {
  992.                 c->prev = (*Qptr)->prev;
  993.                 c->next = (*Qptr);
  994.                 (*Qptr)->prev->next = c;
  995.                 (*Qptr)->prev = c;
  996.         }
  997. }
  998. static inline CommandList_struct *removeQ(CommandList_struct **Qptr, 
  999. CommandList_struct *c)
  1000. {
  1001.         if (c && c->next != c) {
  1002.                 if (*Qptr == c) *Qptr = c->next;
  1003.                 c->prev->next = c->next;
  1004.                 c->next->prev = c->prev;
  1005.         } else {
  1006.                 *Qptr = NULL;
  1007.         }
  1008.         return c;
  1009. }
  1010. /* 
  1011.  * Takes jobs of the Q and sends them to the hardware, then puts it on 
  1012.  * the Q to wait for completion. 
  1013.  */ 
  1014. static void start_io( ctlr_info_t *h)
  1015. {
  1016. CommandList_struct *c;
  1017. while(( c = h->reqQ) != NULL )
  1018. {
  1019. /* can't do anything if fifo is full */
  1020. if ((h->access.fifo_full(h)))
  1021. {
  1022. printk(KERN_WARNING "cciss: fifo full n");
  1023. return;
  1024. }
  1025. /* Get the frist entry from the Request Q */ 
  1026. removeQ(&(h->reqQ), c);
  1027. h->Qdepth--;
  1028. /* Tell the controller execute command */ 
  1029. h->access.submit_command(h, c);
  1030. /* Put job onto the completed Q */ 
  1031. addQ (&(h->cmpQ), c); 
  1032. }
  1033. }
  1034. static inline void complete_buffers( struct buffer_head *bh, int status)
  1035. {
  1036. struct buffer_head *xbh;
  1037. while(bh)
  1038. {
  1039. xbh = bh->b_reqnext; 
  1040. bh->b_reqnext = NULL; 
  1041. blk_finished_io(bh->b_size >> 9);
  1042. bh->b_end_io(bh, status);
  1043. bh = xbh;
  1044. }
  1045. /* checks the status of the job and calls complete buffers to mark all 
  1046.  * buffers for the completed job. 
  1047.  */ 
  1048. static inline void complete_command( CommandList_struct *cmd, int timeout)
  1049. {
  1050. int status = 1;
  1051. int i, ddir;
  1052. u64bit temp64;
  1053. if (timeout)
  1054. status = 0; 
  1055. /* unmap the DMA mapping for all the scatter gather elements */
  1056. if (cmd->Request.Type.Direction == XFER_READ)
  1057. ddir = PCI_DMA_FROMDEVICE;
  1058. else
  1059. ddir = PCI_DMA_TODEVICE;
  1060. for(i=0; i<cmd->Header.SGList; i++)
  1061. {
  1062. temp64.val32.lower = cmd->SG[i].Addr.lower;
  1063. temp64.val32.upper = cmd->SG[i].Addr.upper;
  1064. pci_unmap_page(hba[cmd->ctlr]->pdev,
  1065. temp64.val, cmd->SG[i].Len, ddir);
  1066. }
  1067. if(cmd->err_info->CommandStatus != 0) 
  1068. { /* an error has occurred */ 
  1069. switch(cmd->err_info->CommandStatus)
  1070. {
  1071. unsigned char sense_key;
  1072. case CMD_TARGET_STATUS:
  1073. status = 0;
  1074. if( cmd->err_info->ScsiStatus == 0x02) {
  1075. printk(KERN_WARNING "cciss: cmd %p "
  1076. "has CHECK CONDITION,"
  1077. " sense key = 0x%xn", cmd,
  1078. cmd->err_info->SenseInfo[2]);
  1079. /* check the sense key */
  1080. sense_key = 0xf & 
  1081. cmd->err_info->SenseInfo[2];
  1082. /* no status or recovered error */
  1083. if ((sense_key == 0x0) ||
  1084. (sense_key == 0x1))
  1085. status = 1;
  1086. } else {
  1087. printk(KERN_WARNING "cciss: cmd %p "
  1088. "has SCSI Status 0x%xn",
  1089. cmd, cmd->err_info->ScsiStatus);
  1090. }
  1091. break;
  1092. case CMD_DATA_UNDERRUN:
  1093. printk(KERN_WARNING "cciss: cmd %p has"
  1094. " completed with data underrun "
  1095. "reportedn", cmd);
  1096. break;
  1097. case CMD_DATA_OVERRUN:
  1098. printk(KERN_WARNING "cciss: cmd %p has"
  1099. " completed with data overrun "
  1100. "reportedn", cmd);
  1101. break;
  1102. case CMD_INVALID:
  1103. printk(KERN_WARNING "cciss: cmd %p is "
  1104. "reported invalidn", cmd);
  1105. status = 0;
  1106. break;
  1107. case CMD_PROTOCOL_ERR:
  1108.                                 printk(KERN_WARNING "cciss: cmd %p has "
  1109. "protocol error n", cmd);
  1110.                                 status = 0;
  1111.                         break;
  1112. case CMD_HARDWARE_ERR:
  1113.                                 printk(KERN_WARNING "cciss: cmd %p had " 
  1114.                                         " hardware errorn", cmd);
  1115.                                 status = 0;
  1116.                         break;
  1117. case CMD_CONNECTION_LOST:
  1118. printk(KERN_WARNING "cciss: cmd %p had "
  1119. "connection lostn", cmd);
  1120. status=0;
  1121. break;
  1122. case CMD_ABORTED:
  1123. printk(KERN_WARNING "cciss: cmd %p was "
  1124. "abortedn", cmd);
  1125. status=0;
  1126. break;
  1127. case CMD_ABORT_FAILED:
  1128. printk(KERN_WARNING "cciss: cmd %p reports "
  1129. "abort failedn", cmd);
  1130. status=0;
  1131. break;
  1132. case CMD_UNSOLICITED_ABORT:
  1133. printk(KERN_WARNING "cciss: cmd %p aborted "
  1134. "do to an unsolicited abortn", cmd);
  1135. status=0;
  1136. break;
  1137. case CMD_TIMEOUT:
  1138. printk(KERN_WARNING "cciss: cmd %p timedoutn",
  1139. cmd);
  1140. status=0;
  1141. break;
  1142. default:
  1143. printk(KERN_WARNING "cciss: cmd %p returned "
  1144. "unknown status %xn", cmd, 
  1145. cmd->err_info->CommandStatus); 
  1146. status=0;
  1147. }
  1148. }
  1149. complete_buffers(cmd->rq->bh, status);
  1150. #ifdef CCISS_DEBUG
  1151. printk("Done with %pn", cmd->rq);
  1152. #endif /* CCISS_DEBUG */ 
  1153. end_that_request_last(cmd->rq);
  1154. }
  1155. static inline int cpq_new_segment(request_queue_t *q, struct request *rq,
  1156.                                   int max_segments)
  1157. {
  1158.         if (rq->nr_segments < MAXSGENTRIES) {
  1159.                 rq->nr_segments++;
  1160.                 return 1;
  1161.         }
  1162.         return 0;
  1163. }
  1164. static int cpq_back_merge_fn(request_queue_t *q, struct request *rq,
  1165.                              struct buffer_head *bh, int max_segments)
  1166. {
  1167. if (blk_seg_merge_ok(rq->bhtail, bh))
  1168.                 return 1;
  1169.         return cpq_new_segment(q, rq, max_segments);
  1170. }
  1171. static int cpq_front_merge_fn(request_queue_t *q, struct request *rq,
  1172.                              struct buffer_head *bh, int max_segments)
  1173. {
  1174. if (blk_seg_merge_ok(bh, rq->bh))
  1175.                 return 1;
  1176.         return cpq_new_segment(q, rq, max_segments);
  1177. }
  1178. static int cpq_merge_requests_fn(request_queue_t *q, struct request *rq,
  1179.                                  struct request *nxt, int max_segments)
  1180. {
  1181.         int total_segments = rq->nr_segments + nxt->nr_segments;
  1182. if (blk_seg_merge_ok(rq->bhtail, nxt->bh))
  1183.                 total_segments--;
  1184.         if (total_segments > MAXSGENTRIES)
  1185.                 return 0;
  1186.         rq->nr_segments = total_segments;
  1187.         return 1;
  1188. }
  1189. /* 
  1190.  * Get a request and submit it to the controller. 
  1191.  * Currently we do one request at a time.  Ideally we would like to send
  1192.  * everything to the controller on the first call, but there is a danger
  1193.  * of holding the io_request_lock for to long.  
  1194.  */
  1195. static void do_cciss_request(request_queue_t *q)
  1196. {
  1197. ctlr_info_t *h= q->queuedata; 
  1198. CommandList_struct *c;
  1199. int log_unit, start_blk, seg;
  1200. unsigned long long lastdataend;
  1201. struct buffer_head *bh;
  1202. struct list_head *queue_head = &q->queue_head;
  1203. struct request *creq;
  1204. u64bit temp64;
  1205. struct scatterlist tmp_sg[MAXSGENTRIES];
  1206. int i, ddir;
  1207. if (q->plugged)
  1208. goto startio;
  1209. next:
  1210. if (list_empty(queue_head))
  1211. goto startio;
  1212. creq = blkdev_entry_next_request(queue_head); 
  1213. if (creq->nr_segments > MAXSGENTRIES)
  1214.                 BUG();
  1215.         if (h->ctlr != MAJOR(creq->rq_dev)-MAJOR_NR )
  1216.         {
  1217.                 printk(KERN_WARNING "doreq cmd for %d, %x at %pn",
  1218.                                 h->ctlr, creq->rq_dev, creq);
  1219.                 blkdev_dequeue_request(creq);
  1220.                 complete_buffers(creq->bh, 0);
  1221. end_that_request_last(creq);
  1222. goto startio;
  1223.         }
  1224. if (( c = cmd_alloc(h, 1)) == NULL)
  1225. goto startio;
  1226. blkdev_dequeue_request(creq);
  1227. spin_unlock_irq(&io_request_lock);
  1228. c->cmd_type = CMD_RWREQ;      
  1229. c->rq = creq;
  1230. bh = creq->bh;
  1231. /* fill in the request */ 
  1232. log_unit = MINOR(creq->rq_dev) >> NWD_SHIFT; 
  1233. c->Header.ReplyQueue = 0;  // unused in simple mode
  1234. c->Header.Tag.lower = c->busaddr;  // use the physical address the cmd block for tag
  1235. c->Header.LUN.LogDev.VolId= hba[h->ctlr]->drv[log_unit].LunID;
  1236. c->Header.LUN.LogDev.Mode = 1;
  1237. c->Request.CDBLen = 10; // 12 byte commands not in FW yet;
  1238. c->Request.Type.Type =  TYPE_CMD; // It is a command. 
  1239. c->Request.Type.Attribute = ATTR_SIMPLE; 
  1240. c->Request.Type.Direction = 
  1241. (creq->cmd == READ) ? XFER_READ: XFER_WRITE; 
  1242. c->Request.Timeout = 0; // Don't time out
  1243. c->Request.CDB[0] = (creq->cmd == READ) ? CCISS_READ : CCISS_WRITE;
  1244. start_blk = hba[h->ctlr]->hd[MINOR(creq->rq_dev)].start_sect + creq->sector;
  1245. #ifdef CCISS_DEBUG
  1246. if (bh == NULL)
  1247. panic("cciss: bh== NULL?");
  1248. printk(KERN_DEBUG "ciss: sector =%d nr_sectors=%dn",(int) creq->sector,
  1249. (int) creq->nr_sectors);
  1250. #endif /* CCISS_DEBUG */
  1251. seg = 0;
  1252. lastdataend = ~0ULL;
  1253. while(bh)
  1254. {
  1255. if (bh_phys(bh) == lastdataend)
  1256. {  // tack it on to the last segment 
  1257. tmp_sg[seg-1].length +=bh->b_size;
  1258. lastdataend += bh->b_size;
  1259. } else
  1260. {
  1261. if (seg == MAXSGENTRIES)
  1262. BUG();
  1263. tmp_sg[seg].page = bh->b_page;
  1264. tmp_sg[seg].length = bh->b_size;
  1265. tmp_sg[seg].offset = bh_offset(bh);
  1266. lastdataend = bh_phys(bh) + bh->b_size;
  1267. seg++;
  1268. }
  1269. bh = bh->b_reqnext;
  1270. }
  1271. /* get the DMA records for the setup */ 
  1272. if (c->Request.Type.Direction == XFER_READ)
  1273. ddir = PCI_DMA_FROMDEVICE;
  1274. else
  1275. ddir = PCI_DMA_TODEVICE;
  1276. for (i=0; i<seg; i++) {
  1277. c->SG[i].Len = tmp_sg[i].length;
  1278. temp64.val = pci_map_page(h->pdev, tmp_sg[i].page,
  1279.     tmp_sg[i].offset, tmp_sg[i].length, ddir);
  1280. c->SG[i].Addr.lower = temp64.val32.lower;
  1281.                 c->SG[i].Addr.upper = temp64.val32.upper;
  1282.                 c->SG[i].Ext = 0;  // we are not chaining
  1283. }
  1284. /* track how many SG entries we are using */ 
  1285. if( seg > h->maxSG)
  1286. h->maxSG = seg; 
  1287. #ifdef CCISS_DEBUG
  1288. printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segmentsn", sect, seg);
  1289. #endif /* CCISS_DEBUG */
  1290. c->Header.SGList = c->Header.SGTotal = seg;
  1291. c->Request.CDB[1]= 0;
  1292. c->Request.CDB[2]= (start_blk >> 24) & 0xff; //MSB
  1293. c->Request.CDB[3]= (start_blk >> 16) & 0xff;
  1294. c->Request.CDB[4]= (start_blk >>  8) & 0xff;
  1295. c->Request.CDB[5]= start_blk & 0xff;
  1296. c->Request.CDB[6]= 0; // (sect >> 24) & 0xff; MSB
  1297. c->Request.CDB[7]= (creq->nr_sectors >>  8) & 0xff; 
  1298. c->Request.CDB[8]= creq->nr_sectors & 0xff; 
  1299. c->Request.CDB[9] = c->Request.CDB[11] = c->Request.CDB[12] = 0;
  1300. spin_lock_irq(&io_request_lock);
  1301. addQ(&(h->reqQ),c);
  1302. h->Qdepth++;
  1303. if(h->Qdepth > h->maxQsinceinit)
  1304. h->maxQsinceinit = h->Qdepth; 
  1305. goto next;
  1306. startio:
  1307. start_io(h);
  1308. }
  1309. static void do_cciss_intr(int irq, void *dev_id, struct pt_regs *regs)
  1310. {
  1311. ctlr_info_t *h = dev_id;
  1312. CommandList_struct *c;
  1313. unsigned long flags;
  1314. __u32 a, a1;
  1315. /* Is this interrupt for us? */
  1316. if ( h->access.intr_pending(h) == 0)
  1317. return;
  1318. /*
  1319.  * If there are completed commands in the completion queue,
  1320.  * we had better do something about it.
  1321.  */
  1322. spin_lock_irqsave(&io_request_lock, flags);
  1323. while( h->access.intr_pending(h))
  1324. {
  1325. while((a = h->access.command_completed(h)) != FIFO_EMPTY) 
  1326. {
  1327. a1 = a;
  1328. a &= ~3;
  1329. if ((c = h->cmpQ) == NULL)
  1330. {  
  1331. printk(KERN_WARNING "cciss: Completion of %08lx ignoredn", (unsigned long)a1);
  1332. continue;
  1333. while(c->busaddr != a) {
  1334. c = c->next;
  1335. if (c == h->cmpQ) 
  1336. break;
  1337. }
  1338. /*
  1339.  * If we've found the command, take it off the
  1340.  * completion Q and free it
  1341.  */
  1342.  if (c->busaddr == a) {
  1343. removeQ(&h->cmpQ, c);
  1344. if (c->cmd_type == CMD_RWREQ) {
  1345. complete_command(c, 0);
  1346. cmd_free(h, c, 1);
  1347. } else if (c->cmd_type == CMD_IOCTL_PEND) {
  1348. complete(c->waiting);
  1349. }
  1350. # ifdef CONFIG_CISS_SCSI_TAPE
  1351. else if (c->cmd_type == CMD_SCSI) {
  1352. complete_scsi_command(c, 0, a1);
  1353. }
  1354. # endif
  1355. continue;
  1356. }
  1357. }
  1358. }
  1359. /*
  1360.  * See if we can queue up some more IO
  1361.  */
  1362. do_cciss_request(BLK_DEFAULT_QUEUE(MAJOR_NR + h->ctlr));
  1363. spin_unlock_irqrestore(&io_request_lock, flags);
  1364. }
  1365. /* 
  1366.  *  We cannot read the structure directly, for portablity we must use 
  1367.  *   the io functions.
  1368.  *   This is for debug only. 
  1369.  */
  1370. #ifdef CCISS_DEBUG
  1371. static void print_cfg_table( CfgTable_struct *tb)
  1372. {
  1373. int i;
  1374. char temp_name[17];
  1375. printk("Controller Configuration informationn");
  1376. printk("------------------------------------n");
  1377. for(i=0;i<4;i++)
  1378. temp_name[i] = readb(&(tb->Signature[i]));
  1379. temp_name[4]='';
  1380. printk("   Signature = %sn", temp_name); 
  1381. printk("   Spec Number = %dn", readl(&(tb->SpecValence)));
  1382. printk("   Transport methods supported = 0x%xn", 
  1383. readl(&(tb-> TransportSupport)));
  1384. printk("   Transport methods active = 0x%xn", 
  1385. readl(&(tb->TransportActive)));
  1386. printk("   Requested transport Method = 0x%xn", 
  1387. readl(&(tb->HostWrite.TransportRequest)));
  1388. printk("   Coalese Interrupt Delay = 0x%xn", 
  1389. readl(&(tb->HostWrite.CoalIntDelay)));
  1390. printk("   Coalese Interrupt Count = 0x%xn", 
  1391. readl(&(tb->HostWrite.CoalIntCount)));
  1392. printk("   Max outstanding commands = 0x%dn", 
  1393. readl(&(tb->CmdsOutMax)));
  1394. printk("   Bus Types = 0x%xn", readl(&(tb-> BusTypes)));
  1395. for(i=0;i<16;i++)
  1396. temp_name[i] = readb(&(tb->ServerName[i]));
  1397. temp_name[16] = '';
  1398. printk("   Server Name = %sn", temp_name);
  1399. printk("   Heartbeat Counter = 0x%xnnn", 
  1400. readl(&(tb->HeartBeat)));
  1401. }
  1402. #endif /* CCISS_DEBUG */ 
  1403. static void release_io_mem(ctlr_info_t *c)
  1404. {
  1405. /* if IO mem was not protected do nothing */
  1406. if( c->io_mem_addr == 0)
  1407. return;
  1408. release_region(c->io_mem_addr, c->io_mem_length);
  1409. c->io_mem_addr = 0;
  1410. c->io_mem_length = 0;
  1411. }
  1412. static int cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
  1413. {
  1414. ushort vendor_id, device_id, command;
  1415. unchar cache_line_size, latency_timer;
  1416. unchar irq, revision;
  1417. uint addr[6];
  1418. __u32 board_id;
  1419. int cfg_offset;
  1420. int cfg_base_addr;
  1421. int cfg_base_addr_index;
  1422. int i;
  1423. vendor_id = pdev->vendor;
  1424. device_id = pdev->device;
  1425. irq = pdev->irq;
  1426. for(i=0; i<6; i++)
  1427. addr[i] = pdev->resource[i].start;
  1428. if (pci_enable_device(pdev))
  1429. {
  1430. printk(KERN_ERR "cciss: Unable to Enable PCI devicen");
  1431. return( -1);
  1432. }
  1433. if (pci_set_dma_mask(pdev, CCISS_DMA_MASK ) != 0)
  1434. {
  1435. printk(KERN_ERR "cciss:  Unable to set DMA maskn");
  1436. return(-1);
  1437. }
  1438. (void) pci_read_config_word(pdev, PCI_COMMAND,&command);
  1439. (void) pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
  1440. (void) pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE,
  1441. &cache_line_size);
  1442. (void) pci_read_config_byte(pdev, PCI_LATENCY_TIMER,
  1443. &latency_timer);
  1444. (void) pci_read_config_dword(pdev, PCI_SUBSYSTEM_VENDOR_ID, 
  1445. &board_id);
  1446. /* check to see if controller has been disabled */
  1447. if (!(command & 0x02)) {
  1448. printk(KERN_WARNING "cciss: controller appears to be disabledn");
  1449. return(-1);
  1450. }
  1451. /* search for our IO range so we can protect it */
  1452. for (i=0; i<6; i++) {
  1453. /* is this an IO range */
  1454. if (pdev->resource[i].flags & 0x01) {
  1455. c->io_mem_addr = pdev->resource[i].start;
  1456. c->io_mem_length = pdev->resource[i].end -
  1457. pdev->resource[i].start +1; 
  1458. #ifdef CCISS_DEBUG
  1459. printk("IO value found base_addr[%d] %lx %lxn", i,
  1460. c->io_mem_addr, c->io_mem_length);
  1461. #endif /* CCISS_DEBUG */
  1462. /* register the IO range */
  1463. if (!request_region( c->io_mem_addr,
  1464.                                         c->io_mem_length, "cciss")) {
  1465. printk(KERN_WARNING 
  1466. "cciss I/O memory range already in "
  1467. "use addr=%lx length=%ldn",
  1468. c->io_mem_addr, c->io_mem_length);
  1469. c->io_mem_addr= 0;
  1470. c->io_mem_length = 0;
  1471. }
  1472. break;
  1473. }
  1474. }
  1475. #ifdef CCISS_DEBUG
  1476. printk("vendor_id = %xn", vendor_id);
  1477. printk("device_id = %xn", device_id);
  1478. printk("command = %xn", command);
  1479. for(i=0; i<6; i++)
  1480. printk("addr[%d] = %xn", i, addr[i]);
  1481. printk("revision = %xn", revision);
  1482. printk("irq = %xn", irq);
  1483. printk("cache_line_size = %xn", cache_line_size);
  1484. printk("latency_timer = %xn", latency_timer);
  1485. printk("board_id = %xn", board_id);
  1486. #endif /* CCISS_DEBUG */ 
  1487. c->intr = irq;
  1488. /*
  1489.  * Memory base addr is first addr , the second points to the config
  1490.          *   table
  1491.  */
  1492. c->paddr = addr[0] ; /* addressing mode bits already removed */
  1493. #ifdef CCISS_DEBUG
  1494. printk("address 0 = %xn", c->paddr);
  1495. #endif /* CCISS_DEBUG */ 
  1496. c->vaddr = remap_pci_mem(c->paddr, 200);
  1497. /* get the address index number */
  1498. cfg_base_addr = readl(c->vaddr + SA5_CTCFG_OFFSET);
  1499. /* I am not prepared to deal with a 64 bit address value */
  1500. cfg_base_addr &= 0xffff;
  1501. #ifdef CCISS_DEBUG
  1502. printk("cfg base address = %xn", cfg_base_addr);
  1503. #endif /* CCISS_DEBUG */
  1504. cfg_base_addr_index = (cfg_base_addr  - PCI_BASE_ADDRESS_0)/4;
  1505. #ifdef CCISS_DEBUG
  1506. printk("cfg base address index = %xn", cfg_base_addr_index);
  1507. #endif /* CCISS_DEBUG */
  1508. cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
  1509. #ifdef CCISS_DEBUG
  1510. printk("cfg offset = %xn", cfg_offset);
  1511. #endif /* CCISS_DEBUG */
  1512. c->cfgtable = (CfgTable_struct *) 
  1513. remap_pci_mem((addr[cfg_base_addr_index] & 0xfffffff0)
  1514. + cfg_offset, sizeof(CfgTable_struct));
  1515. c->board_id = board_id;
  1516. #ifdef CCISS_DEBUG
  1517. print_cfg_table(c->cfgtable); 
  1518. #endif /* CCISS_DEBUG */
  1519. for(i=0; i<NR_PRODUCTS; i++) {
  1520. if (board_id == products[i].board_id) {
  1521. c->product_name = products[i].product_name;
  1522. c->access = *(products[i].access);
  1523. break;
  1524. }
  1525. }
  1526. if (i == NR_PRODUCTS) {
  1527. printk(KERN_WARNING "cciss: Sorry, I don't know how"
  1528. " to access the Smart Array controller %08lxn", 
  1529. (unsigned long)board_id);
  1530. return -1;
  1531. }
  1532. if (  (readb(&c->cfgtable->Signature[0]) != 'C') ||
  1533.       (readb(&c->cfgtable->Signature[1]) != 'I') ||
  1534.       (readb(&c->cfgtable->Signature[2]) != 'S') ||
  1535.       (readb(&c->cfgtable->Signature[3]) != 'S') )
  1536. {
  1537. printk("Does not appear to be a valid CISS config tablen");
  1538. return -1;
  1539. }
  1540. #ifdef CCISS_DEBUG
  1541. printk("Trying to put board into Simple moden");
  1542. #endif /* CCISS_DEBUG */ 
  1543. c->max_commands = readl(&(c->cfgtable->CmdsOutMax));
  1544. /* Update the field, and then ring the doorbell */ 
  1545. writel( CFGTBL_Trans_Simple, 
  1546. &(c->cfgtable->HostWrite.TransportRequest));
  1547. writel( CFGTBL_ChangeReq, c->vaddr + SA5_DOORBELL);
  1548. for(i=0;i<MAX_CONFIG_WAIT;i++)
  1549. {
  1550. if (!(readl(c->vaddr + SA5_DOORBELL) & CFGTBL_ChangeReq))
  1551. break;
  1552. /* delay and try again */
  1553. udelay(1000);
  1554. }
  1555. #ifdef CCISS_DEBUG
  1556. printk(KERN_DEBUG "I counter got to %d %xn", i, readl(c->vaddr + SA5_DOORBELL));
  1557. #endif /* CCISS_DEBUG */
  1558. #ifdef CCISS_DEBUG
  1559. print_cfg_table(c->cfgtable);
  1560. #endif /* CCISS_DEBUG */ 
  1561. if (!(readl(&(c->cfgtable->TransportActive)) & CFGTBL_Trans_Simple))
  1562. {
  1563. printk(KERN_WARNING "cciss: unable to get board into"
  1564. " simple moden");
  1565. return -1;
  1566. }
  1567. return 0;
  1568. }
  1569. /* 
  1570.  * Gets information about the local volumes attached to the controller. 
  1571.  */ 
  1572. static void cciss_getgeometry(int cntl_num)
  1573. {
  1574. ReportLunData_struct *ld_buff;
  1575. ReadCapdata_struct *size_buff;
  1576. InquiryData_struct *inq_buff;
  1577. int return_code;
  1578. int i;
  1579. int listlength = 0;
  1580. __u32 lunid = 0;
  1581. int block_size;
  1582. int total_size; 
  1583. ld_buff = kmalloc(sizeof(ReportLunData_struct), GFP_KERNEL);
  1584. if (ld_buff == NULL)
  1585. {
  1586. printk(KERN_ERR "cciss: out of memoryn");
  1587. return;
  1588. }
  1589. memset(ld_buff, 0, sizeof(ReportLunData_struct));
  1590. size_buff = kmalloc(sizeof( ReadCapdata_struct), GFP_KERNEL);
  1591.         if (size_buff == NULL)
  1592.         {
  1593.                 printk(KERN_ERR "cciss: out of memoryn");
  1594. kfree(ld_buff);
  1595.                 return;
  1596.         }
  1597. inq_buff = kmalloc(sizeof( InquiryData_struct), GFP_KERNEL);
  1598.         if (inq_buff == NULL)
  1599.         {
  1600.                 printk(KERN_ERR "cciss: out of memoryn");
  1601.                 kfree(ld_buff);
  1602. kfree(size_buff);
  1603.                 return;
  1604.         }
  1605. /* Get the firmware version */ 
  1606. return_code = sendcmd(CISS_INQUIRY, cntl_num, inq_buff, 
  1607. sizeof(InquiryData_struct), 0, 0 ,0, NULL);
  1608. if (return_code == IO_OK)
  1609. {
  1610. hba[cntl_num]->firm_ver[0] = inq_buff->data_byte[32];
  1611. hba[cntl_num]->firm_ver[1] = inq_buff->data_byte[33];
  1612. hba[cntl_num]->firm_ver[2] = inq_buff->data_byte[34];
  1613. hba[cntl_num]->firm_ver[3] = inq_buff->data_byte[35];
  1614. } else /* send command failed */
  1615. {
  1616. printk(KERN_WARNING "cciss: unable to determine firmware"
  1617. " version of controllern");
  1618. }
  1619. /* Get the number of logical volumes */ 
  1620. return_code = sendcmd(CISS_REPORT_LOG, cntl_num, ld_buff, 
  1621. sizeof(ReportLunData_struct), 0, 0, 0, NULL);
  1622. if( return_code == IO_OK)
  1623. {
  1624. #ifdef CCISS_DEBUG
  1625. printk("LUN Datan--------------------------n");
  1626. #endif /* CCISS_DEBUG */ 
  1627. listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[0])) << 24;
  1628. listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[1])) << 16;
  1629. listlength |= (0xff & (unsigned int)(ld_buff->LUNListLength[2])) << 8;
  1630. listlength |= 0xff & (unsigned int)(ld_buff->LUNListLength[3]);
  1631. } else /* reading number of logical volumes failed */
  1632. {
  1633. printk(KERN_WARNING "cciss: report logical volume"
  1634. " command failedn");
  1635. listlength = 0;
  1636. }
  1637. hba[cntl_num]->num_luns = listlength / 8; // 8 bytes pre entry
  1638. if (hba[cntl_num]->num_luns > CISS_MAX_LUN)
  1639. {
  1640. printk(KERN_ERR "ciss:  only %d number of logical volumes supportedn",
  1641. CISS_MAX_LUN);
  1642. hba[cntl_num]->num_luns = CISS_MAX_LUN;
  1643. }
  1644. #ifdef CCISS_DEBUG
  1645. printk(KERN_DEBUG "Length = %x %x %x %x = %dn", ld_buff->LUNListLength[0],
  1646. ld_buff->LUNListLength[1], ld_buff->LUNListLength[2],
  1647. ld_buff->LUNListLength[3],  hba[cntl_num]->num_luns);
  1648. #endif /* CCISS_DEBUG */
  1649. for(i=0; i<  hba[cntl_num]->num_luns ; i++)
  1650. {
  1651.    lunid = (0xff & (unsigned int)(ld_buff->LUN[i][3])) << 24;
  1652.          lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][2])) << 16;
  1653.          lunid |= (0xff & (unsigned int)(ld_buff->LUN[i][1])) << 8;
  1654.          lunid |= 0xff & (unsigned int)(ld_buff->LUN[i][0]);
  1655. hba[cntl_num]->drv[i].LunID = lunid;
  1656. #ifdef CCISS_DEBUG
  1657.    printk(KERN_DEBUG "LUN[%d]:  %x %x %x %x = %xn", i, 
  1658. ld_buff->LUN[i][0], ld_buff->LUN[i][1],ld_buff->LUN[i][2], 
  1659. ld_buff->LUN[i][3], hba[cntl_num]->drv[i].LunID);
  1660. #endif /* CCISS_DEBUG */
  1661.    memset(size_buff, 0, sizeof(ReadCapdata_struct));
  1662.    return_code = sendcmd(CCISS_READ_CAPACITY, cntl_num, size_buff, 
  1663. sizeof( ReadCapdata_struct), 1, i, 0, NULL);
  1664.    if (return_code == IO_OK)
  1665. {
  1666. total_size = (0xff & 
  1667. (unsigned int)(size_buff->total_size[0])) << 24;
  1668. total_size |= (0xff & 
  1669. (unsigned int)(size_buff->total_size[1])) << 16;
  1670. total_size |= (0xff & 
  1671. (unsigned int)(size_buff->total_size[2])) << 8;
  1672. total_size |= (0xff & (unsigned int)
  1673. (size_buff->total_size[3])); 
  1674. total_size++; // command returns highest block address
  1675. block_size = (0xff & 
  1676. (unsigned int)(size_buff->block_size[0])) << 24;
  1677.                  block_size |= (0xff & 
  1678. (unsigned int)(size_buff->block_size[1])) << 16;
  1679.                  block_size |= (0xff & 
  1680. (unsigned int)(size_buff->block_size[2])) << 8;
  1681.                  block_size |= (0xff & 
  1682. (unsigned int)(size_buff->block_size[3]));
  1683. } else /* read capacity command failed */ 
  1684. {
  1685. printk(KERN_WARNING "cciss: read capacity failedn");
  1686. total_size = block_size = 0; 
  1687. }
  1688. printk(KERN_INFO "      blocks= %d block_size= %dn", 
  1689. total_size, block_size);
  1690. /* Execute the command to read the disk geometry */
  1691. memset(inq_buff, 0, sizeof(InquiryData_struct));
  1692. return_code = sendcmd(CISS_INQUIRY, cntl_num, inq_buff,
  1693. sizeof(InquiryData_struct), 1, i, 0xC1, NULL );
  1694.    if (return_code == IO_OK)
  1695. {
  1696. if(inq_buff->data_byte[8] == 0xFF)
  1697. {
  1698.    printk(KERN_WARNING "cciss: reading geometry failed, volume does not support reading geometryn");
  1699.                            hba[cntl_num]->drv[i].block_size = block_size;
  1700.                            hba[cntl_num]->drv[i].nr_blocks = total_size;
  1701.                            hba[cntl_num]->drv[i].heads = 255;
  1702.                            hba[cntl_num]->drv[i].sectors = 32; // Sectors per track
  1703.                            hba[cntl_num]->drv[i].cylinders = total_size / 255 / 32;                 } else
  1704. {
  1705.      hba[cntl_num]->drv[i].block_size = block_size;
  1706.                            hba[cntl_num]->drv[i].nr_blocks = total_size;
  1707.                            hba[cntl_num]->drv[i].heads = 
  1708. inq_buff->data_byte[6]; 
  1709.                            hba[cntl_num]->drv[i].sectors = 
  1710. inq_buff->data_byte[7]; 
  1711.    hba[cntl_num]->drv[i].cylinders = 
  1712. (inq_buff->data_byte[4] & 0xff) << 8;
  1713.    hba[cntl_num]->drv[i].cylinders += 
  1714.                                         inq_buff->data_byte[5];
  1715. }
  1716. }
  1717. else /* Get geometry failed */
  1718. {
  1719. printk(KERN_WARNING "cciss: reading geometry failed, continuing with default geometryn"); 
  1720. hba[cntl_num]->drv[i].block_size = block_size;
  1721. hba[cntl_num]->drv[i].nr_blocks = total_size;
  1722. hba[cntl_num]->drv[i].heads = 255;
  1723. hba[cntl_num]->drv[i].sectors = 32; // Sectors per track 
  1724. hba[cntl_num]->drv[i].cylinders = total_size / 255 / 32;
  1725. }
  1726. printk(KERN_INFO "      heads= %d, sectors= %d, cylinders= %dnn",
  1727. hba[cntl_num]->drv[i].heads, 
  1728. hba[cntl_num]->drv[i].sectors,
  1729. hba[cntl_num]->drv[i].cylinders);
  1730. }
  1731. kfree(ld_buff);
  1732. kfree(size_buff);
  1733. kfree(inq_buff);
  1734. }
  1735. /* Function to find the first free pointer into our hba[] array */
  1736. /* Returns -1 if no free entries are left.  */
  1737. static int alloc_cciss_hba(void)
  1738. {
  1739. int i;
  1740. for(i=0; i< MAX_CTLR; i++)
  1741. {
  1742. if (hba[i] == NULL)
  1743. {
  1744. hba[i] = kmalloc(sizeof(ctlr_info_t), GFP_KERNEL);
  1745. if(hba[i]==NULL)
  1746. {
  1747. printk(KERN_ERR "cciss: out of memory.n");
  1748. return (-1);
  1749. }
  1750. return (i);
  1751. }
  1752. }
  1753. printk(KERN_WARNING "cciss: This driver supports a maximum"
  1754. " of 8 controllers.n");
  1755. return(-1);
  1756. }
  1757. static void free_hba(int i)
  1758. {
  1759. kfree(hba[i]);
  1760. hba[i]=NULL;
  1761. }
  1762. /*
  1763.  *  This is it.  Find all the controllers and register them.  I really hate
  1764.  *  stealing all these major device numbers.
  1765.  *  returns the number of block devices registered.
  1766.  */
  1767. static int __init cciss_init_one(struct pci_dev *pdev,
  1768. const struct pci_device_id *ent)
  1769. {
  1770. request_queue_t *q;
  1771. int i;
  1772. int j;
  1773. printk(KERN_DEBUG "cciss: Device 0x%x has been found at"
  1774. " bus %d dev %d func %dn",
  1775. pdev->device, pdev->bus->number, PCI_SLOT(pdev->devfn),
  1776. PCI_FUNC(pdev->devfn));
  1777. i = alloc_cciss_hba();
  1778. if( i < 0 ) 
  1779. return (-1);
  1780. memset(hba[i], 0, sizeof(ctlr_info_t));
  1781. if (cciss_pci_init(hba[i], pdev) != 0)
  1782. {
  1783. free_hba(i);
  1784. return (-1);
  1785. }
  1786. sprintf(hba[i]->devname, "cciss%d", i);
  1787. hba[i]->ctlr = i;
  1788. hba[i]->pdev = pdev;
  1789. /* configure PCI DMA stuff */
  1790. if (!pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff))
  1791. printk("cciss: using DAC cyclesn");
  1792. else if (!pci_set_dma_mask(pdev, (u64) 0xffffffff))
  1793. printk("cciss: not using DAC cyclesn");
  1794. else {
  1795. printk("cciss: no suitable DMA availablen");
  1796. free_hba(i);
  1797. return -ENODEV;
  1798. }
  1799. if( register_blkdev(MAJOR_NR+i, hba[i]->devname, &cciss_fops))
  1800. {
  1801. printk(KERN_ERR "cciss:  Unable to get major number "
  1802. "%d for %sn", MAJOR_NR+i, hba[i]->devname);
  1803. release_io_mem(hba[i]);
  1804. free_hba(i);
  1805. return(-1);
  1806. }
  1807. /* make sure the board interrupts are off */
  1808. hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_OFF);
  1809. if( request_irq(hba[i]->intr, do_cciss_intr, 
  1810. SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, 
  1811. hba[i]->devname, hba[i]))
  1812. {
  1813. printk(KERN_ERR "ciss: Unable to get irq %d for %sn",
  1814. hba[i]->intr, hba[i]->devname);
  1815. unregister_blkdev( MAJOR_NR+i, hba[i]->devname);
  1816. release_io_mem(hba[i]);
  1817. free_hba(i);
  1818. return(-1);
  1819. }
  1820. hba[i]->cmd_pool_bits = (__u32*)kmalloc(
  1821.          ((NR_CMDS+31)/32)*sizeof(__u32), GFP_KERNEL);
  1822. hba[i]->cmd_pool = (CommandList_struct *)pci_alloc_consistent(
  1823. hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct), 
  1824. &(hba[i]->cmd_pool_dhandle));
  1825. hba[i]->errinfo_pool = (ErrorInfo_struct *)pci_alloc_consistent(
  1826. hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct), 
  1827. &(hba[i]->errinfo_pool_dhandle));
  1828. if((hba[i]->cmd_pool_bits == NULL) 
  1829. || (hba[i]->cmd_pool == NULL)
  1830. || (hba[i]->errinfo_pool == NULL))
  1831.         {
  1832. if(hba[i]->cmd_pool_bits)
  1833.                  kfree(hba[i]->cmd_pool_bits);
  1834.                 if(hba[i]->cmd_pool)
  1835.                  pci_free_consistent(hba[i]->pdev,  
  1836. NR_CMDS * sizeof(CommandList_struct), 
  1837. hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
  1838. if(hba[i]->errinfo_pool)
  1839. pci_free_consistent(hba[i]->pdev,
  1840. NR_CMDS * sizeof( ErrorInfo_struct),
  1841. hba[i]->errinfo_pool, 
  1842. hba[i]->errinfo_pool_dhandle);
  1843.                 free_irq(hba[i]->intr, hba[i]);
  1844.                 unregister_blkdev(MAJOR_NR+i, hba[i]->devname);
  1845. release_io_mem(hba[i]);
  1846. free_hba(i);
  1847.                 printk( KERN_ERR "cciss: out of memory");
  1848. return(-1);
  1849. }
  1850. /* Initialize the pdev driver private data. 
  1851. have it point to hba[i].  */
  1852. pci_set_drvdata(pdev, hba[i]);
  1853. /* command and error info recs zeroed out before 
  1854. they are used */
  1855.         memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+31)/32)*sizeof(__u32));
  1856. #ifdef CCISS_DEBUG
  1857. printk(KERN_DEBUG "Scanning for drives on controller cciss%dn",i);
  1858. #endif /* CCISS_DEBUG */
  1859. cciss_getgeometry(i);
  1860. cciss_find_non_disk_devices(i); /* find our tape drives, if any */
  1861. /* Turn the interrupts on so we can service requests */
  1862. hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_ON);
  1863. cciss_procinit(i);
  1864. q = BLK_DEFAULT_QUEUE(MAJOR_NR + i);
  1865. q->queuedata = hba[i];
  1866. blk_init_queue(q, do_cciss_request);
  1867. blk_queue_bounce_limit(q, hba[i]->pdev->dma_mask);
  1868. blk_queue_headactive(q, 0);
  1869. /* fill in the other Kernel structs */
  1870. blksize_size[MAJOR_NR+i] = hba[i]->blocksizes;
  1871.         hardsect_size[MAJOR_NR+i] = hba[i]->hardsizes;
  1872.         read_ahead[MAJOR_NR+i] = READ_AHEAD;
  1873. /* Set the pointers to queue functions */ 
  1874. q->back_merge_fn = cpq_back_merge_fn;
  1875.         q->front_merge_fn = cpq_front_merge_fn;
  1876.         q->merge_requests_fn = cpq_merge_requests_fn;
  1877. /* Fill in the gendisk data */ 
  1878. hba[i]->gendisk.major = MAJOR_NR + i;
  1879. hba[i]->gendisk.major_name = "cciss";
  1880. hba[i]->gendisk.minor_shift = NWD_SHIFT;
  1881. hba[i]->gendisk.max_p = MAX_PART;
  1882. hba[i]->gendisk.part = hba[i]->hd;
  1883. hba[i]->gendisk.sizes = hba[i]->sizes;
  1884. hba[i]->gendisk.nr_real = hba[i]->num_luns;
  1885. /* Get on the disk list */ 
  1886. add_gendisk(&(hba[i]->gendisk));
  1887. cciss_geninit(i);
  1888. for(j=0; j<NWD; j++)
  1889. register_disk(&(hba[i]->gendisk),
  1890. MKDEV(MAJOR_NR+i, j <<4), 
  1891. MAX_PART, &cciss_fops, 
  1892. hba[i]->drv[j].nr_blocks);
  1893. cciss_register_scsi(i, 1);  /* hook ourself into SCSI subsystem */
  1894. return(1);
  1895. }
  1896. static void __devexit cciss_remove_one (struct pci_dev *pdev)
  1897. {
  1898. ctlr_info_t *tmp_ptr;
  1899. int i;
  1900. char flush_buf[4];
  1901. int return_code; 
  1902. if (pci_get_drvdata(pdev) == NULL)
  1903. {
  1904. printk( KERN_ERR "cciss: Unable to remove device n");
  1905. return;
  1906. }
  1907. tmp_ptr = pci_get_drvdata(pdev);
  1908. i = tmp_ptr->ctlr;
  1909. if (hba[i] == NULL) 
  1910. {
  1911. printk(KERN_ERR "cciss: device appears to "
  1912. "already be removed n");
  1913. return;
  1914. }
  1915.   /* Turn board interrupts off  and send the flush cache command */
  1916.   /* sendcmd will turn off interrupt, and send the flush...
  1917.    * To write all data in the battery backed cache to disks */
  1918.   memset(flush_buf, 0, 4);
  1919.   return_code = sendcmd(CCISS_CACHE_FLUSH, i, flush_buf, 4,0,0,0, NULL);
  1920.   if (return_code != IO_OK) {
  1921.   printk(KERN_WARNING 
  1922. "Error Flushing cache on controller %dn", i);
  1923.   }
  1924. free_irq(hba[i]->intr, hba[i]);
  1925. pci_set_drvdata(pdev, NULL);
  1926. iounmap((void*)hba[i]->vaddr);
  1927. cciss_unregister_scsi(i);  /* unhook from SCSI subsystem */
  1928. unregister_blkdev(MAJOR_NR+i, hba[i]->devname);
  1929. remove_proc_entry(hba[i]->devname, proc_cciss);
  1930. /* remove it from the disk list */
  1931. del_gendisk(&(hba[i]->gendisk));
  1932. pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof(CommandList_struct), 
  1933. hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
  1934. pci_free_consistent(hba[i]->pdev, NR_CMDS * sizeof( ErrorInfo_struct),
  1935. hba[i]->errinfo_pool, hba[i]->errinfo_pool_dhandle);
  1936. kfree(hba[i]->cmd_pool_bits);
  1937. release_io_mem(hba[i]);
  1938. free_hba(i);
  1939. }
  1940. static struct pci_driver cciss_pci_driver = {
  1941.  name:   "cciss",
  1942. probe:  cciss_init_one,
  1943. remove:  __devexit_p(cciss_remove_one),
  1944. id_table:  cciss_pci_device_id, /* id_table */
  1945. };
  1946. /*
  1947. *  This is it.  Register the PCI driver information for the cards we control
  1948. *  the OS will call our registered routines when it finds one of our cards. 
  1949. */
  1950. int __init cciss_init(void)
  1951. {
  1952. printk(KERN_INFO DRIVER_NAME "n");
  1953. /* Register for out PCI devices */
  1954. if (pci_register_driver(&cciss_pci_driver) > 0 )
  1955. return 0;
  1956. else 
  1957. return -ENODEV;
  1958.  }
  1959. EXPORT_NO_SYMBOLS;
  1960. static int __init init_cciss_module(void)
  1961. {
  1962. return ( cciss_init());
  1963. }
  1964. static void __exit cleanup_cciss_module(void)
  1965. {
  1966. int i;
  1967. pci_unregister_driver(&cciss_pci_driver);
  1968. /* double check that all controller entrys have been removed */
  1969. for (i=0; i< MAX_CTLR; i++) 
  1970. {
  1971. if (hba[i] != NULL)
  1972. {
  1973. printk(KERN_WARNING "cciss: had to remove"
  1974. " controller %dn", i);
  1975. cciss_remove_one(hba[i]->pdev);
  1976. }
  1977. }
  1978. remove_proc_entry("cciss", proc_root_driver);
  1979. }
  1980. module_init(init_cciss_module);
  1981. module_exit(cleanup_cciss_module);