cpqarray.c
上传用户:ajay2009
上传日期:2009-05-22
资源大小:495k
文件大小:49k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.  *    Disk Array driver for Compaq SMART2 Controllers
  3.  *    Copyright 1998 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 iss_storagedev@hp.com
  20.  *
  21.  */
  22. #include <linux/config.h> /* CONFIG_PROC_FS */
  23. #include <linux/module.h>
  24. #include <linux/types.h>
  25. #include <linux/pci.h>
  26. #include <linux/bio.h>
  27. #include <linux/interrupt.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/blkpg.h>
  34. #include <linux/timer.h>
  35. #include <linux/proc_fs.h>
  36. #include <linux/devfs_fs_kernel.h>
  37. #include <linux/init.h>
  38. #include <linux/hdreg.h>
  39. #include <linux/spinlock.h>
  40. #include <linux/blkdev.h>
  41. #include <linux/genhd.h>
  42. #include <asm/uaccess.h>
  43. #include <asm/io.h>
  44. #define SMART2_DRIVER_VERSION(maj,min,submin) ((maj<<16)|(min<<8)|(submin))
  45. #define DRIVER_NAME "Compaq SMART2 Driver (v 2.6.0)"
  46. #define DRIVER_VERSION SMART2_DRIVER_VERSION(2,6,0)
  47. /* Embedded module documentation macros - see modules.h */
  48. /* Original author Chris Frantz - Compaq Computer Corporation */
  49. MODULE_AUTHOR("Compaq Computer Corporation");
  50. MODULE_DESCRIPTION("Driver for Compaq Smart2 Array Controllers version 2.6.0");
  51. MODULE_LICENSE("GPL");
  52. #include "cpqarray.h"
  53. #include "ida_cmd.h"
  54. #include "smart1,2.h"
  55. #include "ida_ioctl.h"
  56. #define READ_AHEAD 128
  57. #define NR_CMDS 128 /* This could probably go as high as ~400 */
  58. #define MAX_CTLR 8
  59. #define CTLR_SHIFT 8
  60. #define CPQARRAY_DMA_MASK 0xFFFFFFFF /* 32 bit DMA */
  61. static int nr_ctlr;
  62. static ctlr_info_t *hba[MAX_CTLR];
  63. static int eisa[8];
  64. #define NR_PRODUCTS (sizeof(products)/sizeof(struct board_type))
  65. /*  board_id = Subsystem Device ID & Vendor ID
  66.  *  product = Marketing Name for the board
  67.  *  access = Address of the struct of function pointers 
  68.  */
  69. static struct board_type products[] = {
  70. { 0x0040110E, "IDA", &smart1_access },
  71. { 0x0140110E, "IDA-2", &smart1_access },
  72. { 0x1040110E, "IAES", &smart1_access },
  73. { 0x2040110E, "SMART", &smart1_access },
  74. { 0x3040110E, "SMART-2/E", &smart2e_access },
  75. { 0x40300E11, "SMART-2/P", &smart2_access },
  76. { 0x40310E11, "SMART-2SL", &smart2_access },
  77. { 0x40320E11, "Smart Array 3200", &smart2_access },
  78. { 0x40330E11, "Smart Array 3100ES", &smart2_access },
  79. { 0x40340E11, "Smart Array 221", &smart2_access },
  80. { 0x40400E11, "Integrated Array", &smart4_access },
  81. { 0x40480E11, "Compaq Raid LC2",        &smart4_access },
  82. { 0x40500E11, "Smart Array 4200", &smart4_access },
  83. { 0x40510E11, "Smart Array 4250ES", &smart4_access },
  84. { 0x40580E11, "Smart Array 431", &smart4_access },
  85. };
  86. /* define the PCI info for the PCI cards this driver can control */
  87. static const struct pci_device_id cpqarray_pci_device_id[] =
  88. {
  89. { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
  90. 0x0E11, 0x4058, 0, 0, 0},       /* SA431 */
  91. { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
  92. 0x0E11, 0x4051, 0, 0, 0},      /* SA4250ES */
  93. { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_COMPAQ_42XX,
  94. 0x0E11, 0x4050, 0, 0, 0},      /* SA4200 */
  95. { PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C1510,
  96. 0x0E11, 0x4048, 0, 0, 0},       /* LC2 */
  97. { PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C1510,
  98. 0x0E11, 0x4040, 0, 0, 0},      /* Integrated Array */
  99. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
  100. 0x0E11, 0x4034, 0, 0, 0},       /* SA 221 */
  101. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
  102. 0x0E11, 0x4033, 0, 0, 0},       /* SA 3100ES*/
  103. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
  104. 0x0E11, 0x4032, 0, 0, 0},       /* SA 3200*/
  105. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
  106. 0x0E11, 0x4031, 0, 0, 0},       /* SA 2SL*/
  107. { PCI_VENDOR_ID_COMPAQ, PCI_DEVICE_ID_COMPAQ_SMART2P,
  108. 0x0E11, 0x4030, 0, 0, 0},       /* SA 2P */
  109. { 0 }
  110. };
  111. MODULE_DEVICE_TABLE(pci, cpqarray_pci_device_id);
  112. static struct gendisk *ida_gendisk[MAX_CTLR][NWD];
  113. /* Debug... */
  114. #define DBG(s) do { s } while(0)
  115. /* Debug (general info)... */
  116. #define DBGINFO(s) do { } while(0)
  117. /* Debug Paranoid... */
  118. #define DBGP(s)  do { } while(0)
  119. /* Debug Extra Paranoid... */
  120. #define DBGPX(s) do { } while(0)
  121. static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev);
  122. static void __iomem *remap_pci_mem(ulong base, ulong size);
  123. static int cpqarray_eisa_detect(void);
  124. static int pollcomplete(int ctlr);
  125. static void getgeometry(int ctlr);
  126. static void start_fwbk(int ctlr);
  127. static cmdlist_t * cmd_alloc(ctlr_info_t *h, int get_from_pool);
  128. static void cmd_free(ctlr_info_t *h, cmdlist_t *c, int got_from_pool);
  129. static void free_hba(int i);
  130. static int alloc_cpqarray_hba(void);
  131. static int sendcmd(
  132. __u8 cmd,
  133. int ctlr,
  134. void *buff,
  135. size_t size,
  136. unsigned int blk,
  137. unsigned int blkcnt,
  138. unsigned int log_unit );
  139. static int ida_open(struct inode *inode, struct file *filep);
  140. static int ida_release(struct inode *inode, struct file *filep);
  141. static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg);
  142. static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io);
  143. static void do_ida_request(request_queue_t *q);
  144. static void start_io(ctlr_info_t *h);
  145. static inline void addQ(cmdlist_t **Qptr, cmdlist_t *c);
  146. static inline cmdlist_t *removeQ(cmdlist_t **Qptr, cmdlist_t *c);
  147. static inline void complete_buffers(struct bio *bio, int ok);
  148. static inline void complete_command(cmdlist_t *cmd, int timeout);
  149. static irqreturn_t do_ida_intr(int irq, void *dev_id, struct pt_regs * regs);
  150. static void ida_timer(unsigned long tdata);
  151. static int ida_revalidate(struct gendisk *disk);
  152. static int revalidate_allvol(ctlr_info_t *host);
  153. static int cpqarray_register_ctlr(int ctlr, struct pci_dev *pdev);
  154. #ifdef CONFIG_PROC_FS
  155. static void ida_procinit(int i);
  156. static int ida_proc_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data);
  157. #else
  158. static void ida_procinit(int i) {}
  159. #endif
  160. static inline drv_info_t *get_drv(struct gendisk *disk)
  161. {
  162. return disk->private_data;
  163. }
  164. static inline ctlr_info_t *get_host(struct gendisk *disk)
  165. {
  166. return disk->queue->queuedata;
  167. }
  168. static struct block_device_operations ida_fops  = {
  169. .owner = THIS_MODULE,
  170. .open = ida_open,
  171. .release = ida_release,
  172. .ioctl = ida_ioctl,
  173. .revalidate_disk= ida_revalidate,
  174. };
  175. #ifdef CONFIG_PROC_FS
  176. static struct proc_dir_entry *proc_array;
  177. /*
  178.  * Get us a file in /proc/array that says something about each controller.
  179.  * Create /proc/array if it doesn't exist yet.
  180.  */
  181. static void __init ida_procinit(int i)
  182. {
  183. if (proc_array == NULL) {
  184. proc_array = proc_mkdir("cpqarray", proc_root_driver);
  185. if (!proc_array) return;
  186. }
  187. create_proc_read_entry(hba[i]->devname, 0, proc_array,
  188.        ida_proc_get_info, hba[i]);
  189. }
  190. /*
  191.  * Report information about this controller.
  192.  */
  193. static int ida_proc_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data)
  194. {
  195. off_t pos = 0;
  196. off_t len = 0;
  197. int size, i, ctlr;
  198. ctlr_info_t *h = (ctlr_info_t*)data;
  199. drv_info_t *drv;
  200. #ifdef CPQ_PROC_PRINT_QUEUES
  201. cmdlist_t *c;
  202. unsigned long flags;
  203. #endif
  204. ctlr = h->ctlr;
  205. size = sprintf(buffer, "%s:  Compaq %s Controllern"
  206. "       Board ID: 0x%08lxn"
  207. "       Firmware Revision: %c%c%c%cn"
  208. "       Controller Sig: 0x%08lxn"
  209. "       Memory Address: 0x%08lxn"
  210. "       I/O Port: 0x%04xn"
  211. "       IRQ: %dn"
  212. "       Logical drives: %dn"
  213. "       Physical drives: %dnn"
  214. "       Current Q depth: %dn"
  215. "       Max Q depth since init: %dnn",
  216. h->devname, 
  217. h->product_name,
  218. (unsigned long)h->board_id,
  219. h->firm_rev[0], h->firm_rev[1], h->firm_rev[2], h->firm_rev[3],
  220. (unsigned long)h->ctlr_sig, (unsigned long)h->vaddr,
  221. (unsigned int) h->io_mem_addr, (unsigned int)h->intr,
  222. h->log_drives, h->phys_drives,
  223. h->Qdepth, h->maxQsinceinit);
  224. pos += size; len += size;
  225. size = sprintf(buffer+len, "Logical Drive Info:n");
  226. pos += size; len += size;
  227. for(i=0; i<h->log_drives; i++) {
  228. drv = &h->drv[i];
  229. size = sprintf(buffer+len, "ida/c%dd%d: blksz=%d nr_blks=%dn",
  230. ctlr, i, drv->blk_size, drv->nr_blks);
  231. pos += size; len += size;
  232. }
  233. #ifdef CPQ_PROC_PRINT_QUEUES
  234. spin_lock_irqsave(IDA_LOCK(h->ctlr), flags); 
  235. size = sprintf(buffer+len, "nCurrent Queues:n");
  236. pos += size; len += size;
  237. c = h->reqQ;
  238. size = sprintf(buffer+len, "reqQ = %p", c); pos += size; len += size;
  239. if (c) c=c->next;
  240. while(c && c != h->reqQ) {
  241. size = sprintf(buffer+len, "->%p", c);
  242. pos += size; len += size;
  243. c=c->next;
  244. }
  245. c = h->cmpQ;
  246. size = sprintf(buffer+len, "ncmpQ = %p", c); pos += size; len += size;
  247. if (c) c=c->next;
  248. while(c && c != h->cmpQ) {
  249. size = sprintf(buffer+len, "->%p", c);
  250. pos += size; len += size;
  251. c=c->next;
  252. }
  253. size = sprintf(buffer+len, "n"); pos += size; len += size;
  254. spin_unlock_irqrestore(IDA_LOCK(h->ctlr), flags); 
  255. #endif
  256. size = sprintf(buffer+len, "nr_allocs = %dnnr_frees = %dn",
  257. h->nr_allocs, h->nr_frees);
  258. pos += size; len += size;
  259. *eof = 1;
  260. *start = buffer+offset;
  261. len -= offset;
  262. if (len>length)
  263. len = length;
  264. return len;
  265. }
  266. #endif /* CONFIG_PROC_FS */
  267. module_param_array(eisa, int, NULL, 0);
  268. static void release_io_mem(ctlr_info_t *c)
  269. {
  270. /* if IO mem was not protected do nothing */
  271. if( c->io_mem_addr == 0)
  272. return;
  273. release_region(c->io_mem_addr, c->io_mem_length);
  274. c->io_mem_addr = 0;
  275. c->io_mem_length = 0;
  276. }
  277. static void __devexit cpqarray_remove_one(int i)
  278. {
  279. int j;
  280. char buff[4];
  281. /* sendcmd will turn off interrupt, and send the flush...
  282.  * To write all data in the battery backed cache to disks
  283.  * no data returned, but don't want to send NULL to sendcmd */
  284. if( sendcmd(FLUSH_CACHE, i, buff, 4, 0, 0, 0))
  285. {
  286. printk(KERN_WARNING "Unable to flush cache on controller %dn",
  287. i);
  288. }
  289. free_irq(hba[i]->intr, hba[i]);
  290. iounmap(hba[i]->vaddr);
  291. unregister_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname);
  292. del_timer(&hba[i]->timer);
  293. remove_proc_entry(hba[i]->devname, proc_array);
  294. pci_free_consistent(hba[i]->pci_dev,
  295. NR_CMDS * sizeof(cmdlist_t), (hba[i]->cmd_pool),
  296. hba[i]->cmd_pool_dhandle);
  297. kfree(hba[i]->cmd_pool_bits);
  298. for(j = 0; j < NWD; j++) {
  299. if (ida_gendisk[i][j]->flags & GENHD_FL_UP)
  300. del_gendisk(ida_gendisk[i][j]);
  301. devfs_remove("ida/c%dd%d",i,j);
  302. put_disk(ida_gendisk[i][j]);
  303. }
  304. blk_cleanup_queue(hba[i]->queue);
  305. release_io_mem(hba[i]);
  306. free_hba(i);
  307. }
  308. static void __devexit cpqarray_remove_one_pci (struct pci_dev *pdev)
  309. {
  310. int i;
  311. ctlr_info_t *tmp_ptr;
  312. if (pci_get_drvdata(pdev) == NULL) {
  313. printk( KERN_ERR "cpqarray: Unable to remove device n");
  314. return;
  315. }
  316. tmp_ptr = pci_get_drvdata(pdev);
  317. i = tmp_ptr->ctlr;
  318. if (hba[i] == NULL) {
  319. printk(KERN_ERR "cpqarray: controller %d appears to have"
  320. "already been removed n", i);
  321. return;
  322.         }
  323. pci_set_drvdata(pdev, NULL);
  324. cpqarray_remove_one(i);
  325. }
  326. /* removing an instance that was not removed automatically..
  327.  * must be an eisa card.
  328.  */
  329. static void __devexit cpqarray_remove_one_eisa (int i)
  330. {
  331. if (hba[i] == NULL) {
  332. printk(KERN_ERR "cpqarray: controller %d appears to have"
  333. "already been removed n", i);
  334. return;
  335.         }
  336. cpqarray_remove_one(i);
  337. }
  338. /* pdev is NULL for eisa */
  339. static int cpqarray_register_ctlr( int i, struct pci_dev *pdev)
  340. {
  341. request_queue_t *q;
  342. int j;
  343. /* 
  344.  * register block devices
  345.  * Find disks and fill in structs
  346.  * Get an interrupt, set the Q depth and get into /proc
  347.  */
  348. /* If this successful it should insure that we are the only */
  349. /* instance of the driver */
  350. if (register_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname)) {
  351. goto Enomem4;
  352. }
  353. hba[i]->access.set_intr_mask(hba[i], 0);
  354. if (request_irq(hba[i]->intr, do_ida_intr,
  355. SA_INTERRUPT|SA_SHIRQ|SA_SAMPLE_RANDOM,
  356. hba[i]->devname, hba[i]))
  357. {
  358. printk(KERN_ERR "cpqarray: Unable to get irq %d for %sn",
  359. hba[i]->intr, hba[i]->devname);
  360. goto Enomem3;
  361. }
  362. for (j=0; j<NWD; j++) {
  363. ida_gendisk[i][j] = alloc_disk(1 << NWD_SHIFT);
  364. if (!ida_gendisk[i][j])
  365. goto Enomem2;
  366. }
  367. hba[i]->cmd_pool = (cmdlist_t *)pci_alloc_consistent(
  368. hba[i]->pci_dev, NR_CMDS * sizeof(cmdlist_t),
  369. &(hba[i]->cmd_pool_dhandle));
  370. hba[i]->cmd_pool_bits = kmalloc(
  371. ((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long),
  372. GFP_KERNEL);
  373. if (!hba[i]->cmd_pool_bits || !hba[i]->cmd_pool)
  374. goto Enomem1;
  375. memset(hba[i]->cmd_pool, 0, NR_CMDS * sizeof(cmdlist_t));
  376. memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long));
  377. printk(KERN_INFO "cpqarray: Finding drives on %s",
  378. hba[i]->devname);
  379. spin_lock_init(&hba[i]->lock);
  380. q = blk_init_queue(do_ida_request, &hba[i]->lock);
  381. if (!q)
  382. goto Enomem1;
  383. hba[i]->queue = q;
  384. q->queuedata = hba[i];
  385. getgeometry(i);
  386. start_fwbk(i);
  387. ida_procinit(i);
  388. if (pdev)
  389. blk_queue_bounce_limit(q, hba[i]->pci_dev->dma_mask);
  390. /* This is a hardware imposed limit. */
  391. blk_queue_max_hw_segments(q, SG_MAX);
  392. /* This is a driver limit and could be eliminated. */
  393. blk_queue_max_phys_segments(q, SG_MAX);
  394. init_timer(&hba[i]->timer);
  395. hba[i]->timer.expires = jiffies + IDA_TIMER;
  396. hba[i]->timer.data = (unsigned long)hba[i];
  397. hba[i]->timer.function = ida_timer;
  398. add_timer(&hba[i]->timer);
  399. /* Enable IRQ now that spinlock and rate limit timer are set up */
  400. hba[i]->access.set_intr_mask(hba[i], FIFO_NOT_EMPTY);
  401. for(j=0; j<NWD; j++) {
  402. struct gendisk *disk = ida_gendisk[i][j];
  403. drv_info_t *drv = &hba[i]->drv[j];
  404. sprintf(disk->disk_name, "ida/c%dd%d", i, j);
  405. disk->major = COMPAQ_SMART2_MAJOR + i;
  406. disk->first_minor = j<<NWD_SHIFT;
  407. disk->fops = &ida_fops;
  408. if (j && !drv->nr_blks)
  409. continue;
  410. blk_queue_hardsect_size(hba[i]->queue, drv->blk_size);
  411. set_capacity(disk, drv->nr_blks);
  412. disk->queue = hba[i]->queue;
  413. disk->private_data = drv;
  414. add_disk(disk);
  415. }
  416. /* done ! */
  417. return(i);
  418. Enomem1:
  419. nr_ctlr = i; 
  420. kfree(hba[i]->cmd_pool_bits);
  421. if (hba[i]->cmd_pool)
  422. pci_free_consistent(hba[i]->pci_dev, NR_CMDS*sizeof(cmdlist_t), 
  423.     hba[i]->cmd_pool, hba[i]->cmd_pool_dhandle);
  424. Enomem2:
  425. while (j--) {
  426. put_disk(ida_gendisk[i][j]);
  427. ida_gendisk[i][j] = NULL;
  428. }
  429. free_irq(hba[i]->intr, hba[i]);
  430. Enomem3:
  431. unregister_blkdev(COMPAQ_SMART2_MAJOR+i, hba[i]->devname);
  432. Enomem4:
  433. if (pdev)
  434. pci_set_drvdata(pdev, NULL);
  435. release_io_mem(hba[i]);
  436. free_hba(i);
  437. printk( KERN_ERR "cpqarray: out of memory");
  438. return -1;
  439. }
  440. static int __init cpqarray_init_one( struct pci_dev *pdev,
  441. const struct pci_device_id *ent)
  442. {
  443. int i;
  444. printk(KERN_DEBUG "cpqarray: Device 0x%x has been found at"
  445. " bus %d dev %d func %dn",
  446. pdev->device, pdev->bus->number, PCI_SLOT(pdev->devfn),
  447. PCI_FUNC(pdev->devfn));
  448. i = alloc_cpqarray_hba();
  449. if( i < 0 )
  450. return (-1);
  451. memset(hba[i], 0, sizeof(ctlr_info_t));
  452. sprintf(hba[i]->devname, "ida%d", i);
  453. hba[i]->ctlr = i;
  454. /* Initialize the pdev driver private data */
  455. pci_set_drvdata(pdev, hba[i]);
  456. if (cpqarray_pci_init(hba[i], pdev) != 0) {
  457. pci_set_drvdata(pdev, NULL);
  458. release_io_mem(hba[i]);
  459. free_hba(i);
  460. return -1;
  461. }
  462. return (cpqarray_register_ctlr(i, pdev));
  463. }
  464. static struct pci_driver cpqarray_pci_driver = {
  465. .name = "cpqarray",
  466. .probe = cpqarray_init_one,
  467. .remove = __devexit_p(cpqarray_remove_one_pci),
  468. .id_table = cpqarray_pci_device_id,
  469. };
  470. /*
  471.  *  This is it.  Find all the controllers and register them.
  472.  *  returns the number of block devices registered.
  473.  */
  474. static int __init cpqarray_init(void)
  475. {
  476. int num_cntlrs_reg = 0;
  477. int i;
  478. int rc = 0;
  479. /* detect controllers */
  480. printk(DRIVER_NAME "n");
  481. rc = pci_register_driver(&cpqarray_pci_driver);
  482. if (rc)
  483. return rc;
  484. cpqarray_eisa_detect();
  485. for (i=0; i < MAX_CTLR; i++) {
  486. if (hba[i] != NULL)
  487. num_cntlrs_reg++;
  488. }
  489. return(num_cntlrs_reg);
  490. }
  491. /* Function to find the first free pointer into our hba[] array */
  492. /* Returns -1 if no free entries are left.  */
  493. static int alloc_cpqarray_hba(void)
  494. {
  495. int i;
  496. for(i=0; i< MAX_CTLR; i++) {
  497. if (hba[i] == NULL) {
  498. hba[i] = kmalloc(sizeof(ctlr_info_t), GFP_KERNEL);
  499. if(hba[i]==NULL) {
  500. printk(KERN_ERR "cpqarray: out of memory.n");
  501. return (-1);
  502. }
  503. return (i);
  504. }
  505. }
  506. printk(KERN_WARNING "cpqarray: This driver supports a maximum"
  507. " of 8 controllers.n");
  508. return(-1);
  509. }
  510. static void free_hba(int i)
  511. {
  512. kfree(hba[i]);
  513. hba[i]=NULL;
  514. }
  515. /*
  516.  * Find the IO address of the controller, its IRQ and so forth.  Fill
  517.  * in some basic stuff into the ctlr_info_t structure.
  518.  */
  519. static int cpqarray_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
  520. {
  521. ushort vendor_id, device_id, command;
  522. unchar cache_line_size, latency_timer;
  523. unchar irq, revision;
  524. unsigned long addr[6];
  525. __u32 board_id;
  526. int i;
  527. c->pci_dev = pdev;
  528. if (pci_enable_device(pdev)) {
  529. printk(KERN_ERR "cpqarray: Unable to Enable PCI devicen");
  530. return -1;
  531. }
  532. vendor_id = pdev->vendor;
  533. device_id = pdev->device;
  534. irq = pdev->irq;
  535. for(i=0; i<6; i++)
  536. addr[i] = pci_resource_start(pdev, i);
  537. if (pci_set_dma_mask(pdev, CPQARRAY_DMA_MASK) != 0)
  538. {
  539. printk(KERN_ERR "cpqarray: Unable to set DMA maskn");
  540. return -1;
  541. }
  542. pci_read_config_word(pdev, PCI_COMMAND, &command);
  543. pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision);
  544. pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size);
  545. pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &latency_timer);
  546. pci_read_config_dword(pdev, 0x2c, &board_id);
  547. /* check to see if controller has been disabled */
  548. if(!(command & 0x02)) {
  549. printk(KERN_WARNING
  550. "cpqarray: controller appears to be disabledn");
  551. return(-1);
  552. }
  553. DBGINFO(
  554. printk("vendor_id = %xn", vendor_id);
  555. printk("device_id = %xn", device_id);
  556. printk("command = %xn", command);
  557. for(i=0; i<6; i++)
  558. printk("addr[%d] = %lxn", i, addr[i]);
  559. printk("revision = %xn", revision);
  560. printk("irq = %xn", irq);
  561. printk("cache_line_size = %xn", cache_line_size);
  562. printk("latency_timer = %xn", latency_timer);
  563. printk("board_id = %xn", board_id);
  564. );
  565. c->intr = irq;
  566. for(i=0; i<6; i++) {
  567. if (pci_resource_flags(pdev, i) & PCI_BASE_ADDRESS_SPACE_IO)
  568. { /* IO space */
  569. c->io_mem_addr = addr[i];
  570. c->io_mem_length = pci_resource_end(pdev, i)
  571. - pci_resource_start(pdev, i) + 1;
  572. if(!request_region( c->io_mem_addr, c->io_mem_length,
  573. "cpqarray"))
  574. {
  575. printk( KERN_WARNING "cpqarray I/O memory range already in use addr %lx length = %ldn", c->io_mem_addr, c->io_mem_length);
  576. c->io_mem_addr = 0;
  577. c->io_mem_length = 0;
  578. }
  579. break;
  580. }
  581. }
  582. c->paddr = 0;
  583. for(i=0; i<6; i++)
  584. if (!(pci_resource_flags(pdev, i) &
  585. PCI_BASE_ADDRESS_SPACE_IO)) {
  586. c->paddr = pci_resource_start (pdev, i);
  587. break;
  588. }
  589. if (!c->paddr)
  590. return -1;
  591. c->vaddr = remap_pci_mem(c->paddr, 128);
  592. if (!c->vaddr)
  593. return -1;
  594. c->board_id = board_id;
  595. for(i=0; i<NR_PRODUCTS; i++) {
  596. if (board_id == products[i].board_id) {
  597. c->product_name = products[i].product_name;
  598. c->access = *(products[i].access);
  599. break;
  600. }
  601. }
  602. if (i == NR_PRODUCTS) {
  603. printk(KERN_WARNING "cpqarray: Sorry, I don't know how"
  604. " to access the SMART Array controller %08lxn", 
  605. (unsigned long)board_id);
  606. return -1;
  607. }
  608. return 0;
  609. }
  610. /*
  611.  * Map (physical) PCI mem into (virtual) kernel space
  612.  */
  613. static void __iomem *remap_pci_mem(ulong base, ulong size)
  614. {
  615.         ulong page_base        = ((ulong) base) & PAGE_MASK;
  616.         ulong page_offs        = ((ulong) base) - page_base;
  617.         void __iomem *page_remapped    = ioremap(page_base, page_offs+size);
  618.         return (page_remapped ? (page_remapped + page_offs) : NULL);
  619. }
  620. #ifndef MODULE
  621. /*
  622.  * Config string is a comma separated set of i/o addresses of EISA cards.
  623.  */
  624. static int cpqarray_setup(char *str)
  625. {
  626. int i, ints[9];
  627. (void)get_options(str, ARRAY_SIZE(ints), ints);
  628. for(i=0; i<ints[0] && i<8; i++)
  629. eisa[i] = ints[i+1];
  630. return 1;
  631. }
  632. __setup("smart2=", cpqarray_setup);
  633. #endif
  634. /*
  635.  * Find an EISA controller's signature.  Set up an hba if we find it.
  636.  */
  637. static int cpqarray_eisa_detect(void)
  638. {
  639. int i=0, j;
  640. __u32 board_id;
  641. int intr;
  642. int ctlr;
  643. int num_ctlr = 0;
  644. while(i<8 && eisa[i]) {
  645. ctlr = alloc_cpqarray_hba();
  646. if(ctlr == -1)
  647. break;
  648. board_id = inl(eisa[i]+0xC80);
  649. for(j=0; j < NR_PRODUCTS; j++)
  650. if (board_id == products[j].board_id) 
  651. break;
  652. if (j == NR_PRODUCTS) {
  653. printk(KERN_WARNING "cpqarray: Sorry, I don't know how"
  654. " to access the SMART Array controller %08lxn",  (unsigned long)board_id);
  655. continue;
  656. }
  657. memset(hba[ctlr], 0, sizeof(ctlr_info_t));
  658. hba[ctlr]->io_mem_addr = eisa[i];
  659. hba[ctlr]->io_mem_length = 0x7FF;
  660. if(!request_region(hba[ctlr]->io_mem_addr,
  661. hba[ctlr]->io_mem_length,
  662. "cpqarray"))
  663. {
  664. printk(KERN_WARNING "cpqarray: I/O range already in "
  665. "use addr = %lx length = %ldn",
  666. hba[ctlr]->io_mem_addr,
  667. hba[ctlr]->io_mem_length);
  668. free_hba(ctlr);
  669. continue;
  670. }
  671. /*
  672.  * Read the config register to find our interrupt
  673.  */
  674. intr = inb(eisa[i]+0xCC0) >> 4;
  675. if (intr & 1) intr = 11;
  676. else if (intr & 2) intr = 10;
  677. else if (intr & 4) intr = 14;
  678. else if (intr & 8) intr = 15;
  679. hba[ctlr]->intr = intr;
  680. sprintf(hba[ctlr]->devname, "ida%d", nr_ctlr);
  681. hba[ctlr]->product_name = products[j].product_name;
  682. hba[ctlr]->access = *(products[j].access);
  683. hba[ctlr]->ctlr = ctlr;
  684. hba[ctlr]->board_id = board_id;
  685. hba[ctlr]->pci_dev = NULL; /* not PCI */
  686. DBGINFO(
  687. printk("i = %d, j = %dn", i, j);
  688. printk("irq = %xn", intr);
  689. printk("product name = %sn", products[j].product_name);
  690. printk("board_id = %xn", board_id);
  691. );
  692. num_ctlr++;
  693. i++;
  694. if (cpqarray_register_ctlr(ctlr, NULL) == -1)
  695. printk(KERN_WARNING
  696. "cpqarray: Can't register EISA controller %dn",
  697. ctlr);
  698. }
  699. return num_ctlr;
  700. }
  701. /*
  702.  * Open.  Make sure the device is really there.
  703.  */
  704. static int ida_open(struct inode *inode, struct file *filep)
  705. {
  706. drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
  707. ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
  708. DBGINFO(printk("ida_open %sn", inode->i_bdev->bd_disk->disk_name));
  709. /*
  710.  * Root is allowed to open raw volume zero even if it's not configured
  711.  * so array config can still work.  I don't think I really like this,
  712.  * but I'm already using way to many device nodes to claim another one
  713.  * for "raw controller".
  714.  */
  715. if (!drv->nr_blks) {
  716. if (!capable(CAP_SYS_RAWIO))
  717. return -ENXIO;
  718. if (!capable(CAP_SYS_ADMIN) && drv != host->drv)
  719. return -ENXIO;
  720. }
  721. host->usage_count++;
  722. return 0;
  723. }
  724. /*
  725.  * Close.  Sync first.
  726.  */
  727. static int ida_release(struct inode *inode, struct file *filep)
  728. {
  729. ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
  730. host->usage_count--;
  731. return 0;
  732. }
  733. /*
  734.  * Enqueuing and dequeuing functions for cmdlists.
  735.  */
  736. static inline void addQ(cmdlist_t **Qptr, cmdlist_t *c)
  737. {
  738. if (*Qptr == NULL) {
  739. *Qptr = c;
  740. c->next = c->prev = c;
  741. } else {
  742. c->prev = (*Qptr)->prev;
  743. c->next = (*Qptr);
  744. (*Qptr)->prev->next = c;
  745. (*Qptr)->prev = c;
  746. }
  747. }
  748. static inline cmdlist_t *removeQ(cmdlist_t **Qptr, cmdlist_t *c)
  749. {
  750. if (c && c->next != c) {
  751. if (*Qptr == c) *Qptr = c->next;
  752. c->prev->next = c->next;
  753. c->next->prev = c->prev;
  754. } else {
  755. *Qptr = NULL;
  756. }
  757. return c;
  758. }
  759. /*
  760.  * Get a request and submit it to the controller.
  761.  * This routine needs to grab all the requests it possibly can from the
  762.  * req Q and submit them.  Interrupts are off (and need to be off) when you
  763.  * are in here (either via the dummy do_ida_request functions or by being
  764.  * called from the interrupt handler
  765.  */
  766. static void do_ida_request(request_queue_t *q)
  767. {
  768. ctlr_info_t *h = q->queuedata;
  769. cmdlist_t *c;
  770. struct request *creq;
  771. struct scatterlist tmp_sg[SG_MAX];
  772. int i, dir, seg;
  773. if (blk_queue_plugged(q))
  774. goto startio;
  775. queue_next:
  776. creq = elv_next_request(q);
  777. if (!creq)
  778. goto startio;
  779. if (creq->nr_phys_segments > SG_MAX)
  780. BUG();
  781. if ((c = cmd_alloc(h,1)) == NULL)
  782. goto startio;
  783. blkdev_dequeue_request(creq);
  784. c->ctlr = h->ctlr;
  785. c->hdr.unit = (drv_info_t *)(creq->rq_disk->private_data) - h->drv;
  786. c->hdr.size = sizeof(rblk_t) >> 2;
  787. c->size += sizeof(rblk_t);
  788. c->req.hdr.blk = creq->sector;
  789. c->rq = creq;
  790. DBGPX(
  791. printk("sector=%d, nr_sectors=%dn", creq->sector, creq->nr_sectors);
  792. );
  793. seg = blk_rq_map_sg(q, creq, tmp_sg);
  794. /* Now do all the DMA Mappings */
  795. if (rq_data_dir(creq) == READ)
  796. dir = PCI_DMA_FROMDEVICE;
  797. else
  798. dir = PCI_DMA_TODEVICE;
  799. for( i=0; i < seg; i++)
  800. {
  801. c->req.sg[i].size = tmp_sg[i].length;
  802. c->req.sg[i].addr = (__u32) pci_map_page(h->pci_dev,
  803.  tmp_sg[i].page,
  804.  tmp_sg[i].offset,
  805.  tmp_sg[i].length, dir);
  806. }
  807. DBGPX( printk("Submitting %d sectors in %d segmentsn", creq->nr_sectors, seg); );
  808. c->req.hdr.sg_cnt = seg;
  809. c->req.hdr.blk_cnt = creq->nr_sectors;
  810. c->req.hdr.cmd = (rq_data_dir(creq) == READ) ? IDA_READ : IDA_WRITE;
  811. c->type = CMD_RWREQ;
  812. /* Put the request on the tail of the request queue */
  813. addQ(&h->reqQ, c);
  814. h->Qdepth++;
  815. if (h->Qdepth > h->maxQsinceinit) 
  816. h->maxQsinceinit = h->Qdepth;
  817. goto queue_next;
  818. startio:
  819. start_io(h);
  820. }
  821. /* 
  822.  * start_io submits everything on a controller's request queue
  823.  * and moves it to the completion queue.
  824.  *
  825.  * Interrupts had better be off if you're in here
  826.  */
  827. static void start_io(ctlr_info_t *h)
  828. {
  829. cmdlist_t *c;
  830. while((c = h->reqQ) != NULL) {
  831. /* Can't do anything if we're busy */
  832. if (h->access.fifo_full(h) == 0)
  833. return;
  834. /* Get the first entry from the request Q */
  835. removeQ(&h->reqQ, c);
  836. h->Qdepth--;
  837. /* Tell the controller to do our bidding */
  838. h->access.submit_command(h, c);
  839. /* Get onto the completion Q */
  840. addQ(&h->cmpQ, c);
  841. }
  842. }
  843. static inline void complete_buffers(struct bio *bio, int ok)
  844. {
  845. struct bio *xbh;
  846. while(bio) {
  847. int nr_sectors = bio_sectors(bio);
  848. xbh = bio->bi_next;
  849. bio->bi_next = NULL;
  850. blk_finished_io(nr_sectors);
  851. bio_endio(bio, nr_sectors << 9, ok ? 0 : -EIO);
  852. bio = xbh;
  853. }
  854. }
  855. /*
  856.  * Mark all buffers that cmd was responsible for
  857.  */
  858. static inline void complete_command(cmdlist_t *cmd, int timeout)
  859. {
  860. int ok=1;
  861. int i, ddir;
  862. if (cmd->req.hdr.rcode & RCODE_NONFATAL &&
  863.    (hba[cmd->ctlr]->misc_tflags & MISC_NONFATAL_WARN) == 0) {
  864. printk(KERN_NOTICE "Non Fatal error on ida/c%dd%dn",
  865. cmd->ctlr, cmd->hdr.unit);
  866. hba[cmd->ctlr]->misc_tflags |= MISC_NONFATAL_WARN;
  867. }
  868. if (cmd->req.hdr.rcode & RCODE_FATAL) {
  869. printk(KERN_WARNING "Fatal error on ida/c%dd%dn",
  870. cmd->ctlr, cmd->hdr.unit);
  871. ok = 0;
  872. }
  873. if (cmd->req.hdr.rcode & RCODE_INVREQ) {
  874. printk(KERN_WARNING "Invalid request on ida/c%dd%d = (cmd=%x sect=%d cnt=%d sg=%d ret=%x)n",
  875. cmd->ctlr, cmd->hdr.unit, cmd->req.hdr.cmd,
  876. cmd->req.hdr.blk, cmd->req.hdr.blk_cnt,
  877. cmd->req.hdr.sg_cnt, cmd->req.hdr.rcode);
  878. ok = 0;
  879. }
  880. if (timeout) ok = 0;
  881. /* unmap the DMA mapping for all the scatter gather elements */
  882. if (cmd->req.hdr.cmd == IDA_READ)
  883. ddir = PCI_DMA_FROMDEVICE;
  884. else
  885. ddir = PCI_DMA_TODEVICE;
  886.         for(i=0; i<cmd->req.hdr.sg_cnt; i++)
  887.                 pci_unmap_page(hba[cmd->ctlr]->pci_dev, cmd->req.sg[i].addr,
  888. cmd->req.sg[i].size, ddir);
  889. complete_buffers(cmd->rq->bio, ok);
  890.         DBGPX(printk("Done with %pn", cmd->rq););
  891. end_that_request_last(cmd->rq);
  892. }
  893. /*
  894.  *  The controller will interrupt us upon completion of commands.
  895.  *  Find the command on the completion queue, remove it, tell the OS and
  896.  *  try to queue up more IO
  897.  */
  898. static irqreturn_t do_ida_intr(int irq, void *dev_id, struct pt_regs *regs)
  899. {
  900. ctlr_info_t *h = dev_id;
  901. cmdlist_t *c;
  902. unsigned long istat;
  903. unsigned long flags;
  904. __u32 a,a1;
  905. istat = h->access.intr_pending(h);
  906. /* Is this interrupt for us? */
  907. if (istat == 0)
  908. return IRQ_NONE;
  909. /*
  910.  * If there are completed commands in the completion queue,
  911.  * we had better do something about it.
  912.  */
  913. spin_lock_irqsave(IDA_LOCK(h->ctlr), flags);
  914. if (istat & FIFO_NOT_EMPTY) {
  915. while((a = h->access.command_completed(h))) {
  916. a1 = a; a &= ~3;
  917. if ((c = h->cmpQ) == NULL)
  918. {  
  919. printk(KERN_WARNING "cpqarray: Completion of %08lx ignoredn", (unsigned long)a1);
  920. continue;
  921. while(c->busaddr != a) {
  922. c = c->next;
  923. if (c == h->cmpQ) 
  924. break;
  925. }
  926. /*
  927.  * If we've found the command, take it off the
  928.  * completion Q and free it
  929.  */
  930. if (c->busaddr == a) {
  931. removeQ(&h->cmpQ, c);
  932. /*  Check for invalid command.
  933.                                  *  Controller returns command error,
  934.                                  *  But rcode = 0.
  935.                                  */
  936. if((a1 & 0x03) && (c->req.hdr.rcode == 0))
  937.                                 {
  938.                                  c->req.hdr.rcode = RCODE_INVREQ;
  939.                                 }
  940. if (c->type == CMD_RWREQ) {
  941. complete_command(c, 0);
  942. cmd_free(h, c, 1);
  943. } else if (c->type == CMD_IOCTL_PEND) {
  944. c->type = CMD_IOCTL_DONE;
  945. }
  946. continue;
  947. }
  948. }
  949. }
  950. /*
  951.  * See if we can queue up some more IO
  952.  */
  953. do_ida_request(h->queue);
  954. spin_unlock_irqrestore(IDA_LOCK(h->ctlr), flags); 
  955. return IRQ_HANDLED;
  956. }
  957. /*
  958.  * This timer was for timing out requests that haven't happened after
  959.  * IDA_TIMEOUT.  That wasn't such a good idea.  This timer is used to
  960.  * reset a flags structure so we don't flood the user with
  961.  * "Non-Fatal error" messages.
  962.  */
  963. static void ida_timer(unsigned long tdata)
  964. {
  965. ctlr_info_t *h = (ctlr_info_t*)tdata;
  966. h->timer.expires = jiffies + IDA_TIMER;
  967. add_timer(&h->timer);
  968. h->misc_tflags = 0;
  969. }
  970. /*
  971.  *  ida_ioctl does some miscellaneous stuff like reporting drive geometry,
  972.  *  setting readahead and submitting commands from userspace to the controller.
  973.  */
  974. static int ida_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
  975. {
  976. drv_info_t *drv = get_drv(inode->i_bdev->bd_disk);
  977. ctlr_info_t *host = get_host(inode->i_bdev->bd_disk);
  978. int error;
  979. int diskinfo[4];
  980. struct hd_geometry __user *geo = (struct hd_geometry __user *)arg;
  981. ida_ioctl_t __user *io = (ida_ioctl_t __user *)arg;
  982. ida_ioctl_t *my_io;
  983. switch(cmd) {
  984. case HDIO_GETGEO:
  985. if (drv->cylinders) {
  986. diskinfo[0] = drv->heads;
  987. diskinfo[1] = drv->sectors;
  988. diskinfo[2] = drv->cylinders;
  989. } else {
  990. diskinfo[0] = 0xff;
  991. diskinfo[1] = 0x3f;
  992. diskinfo[2] = drv->nr_blks / (0xff*0x3f);
  993. }
  994. put_user(diskinfo[0], &geo->heads);
  995. put_user(diskinfo[1], &geo->sectors);
  996. put_user(diskinfo[2], &geo->cylinders);
  997. put_user(get_start_sect(inode->i_bdev), &geo->start);
  998. return 0;
  999. case IDAGETDRVINFO:
  1000. if (copy_to_user(&io->c.drv, drv, sizeof(drv_info_t)))
  1001. return -EFAULT;
  1002. return 0;
  1003. case IDAPASSTHRU:
  1004. if (!capable(CAP_SYS_RAWIO))
  1005. return -EPERM;
  1006. my_io = kmalloc(sizeof(ida_ioctl_t), GFP_KERNEL);
  1007. if (!my_io)
  1008. return -ENOMEM;
  1009. error = -EFAULT;
  1010. if (copy_from_user(my_io, io, sizeof(*my_io)))
  1011. goto out_passthru;
  1012. error = ida_ctlr_ioctl(host, drv - host->drv, my_io);
  1013. if (error)
  1014. goto out_passthru;
  1015. error = -EFAULT;
  1016. if (copy_to_user(io, my_io, sizeof(*my_io)))
  1017. goto out_passthru;
  1018. error = 0;
  1019. out_passthru:
  1020. kfree(my_io);
  1021. return error;
  1022. case IDAGETCTLRSIG:
  1023. if (!arg) return -EINVAL;
  1024. put_user(host->ctlr_sig, (int __user *)arg);
  1025. return 0;
  1026. case IDAREVALIDATEVOLS:
  1027. if (iminor(inode) != 0)
  1028. return -ENXIO;
  1029. return revalidate_allvol(host);
  1030. case IDADRIVERVERSION:
  1031. if (!arg) return -EINVAL;
  1032. put_user(DRIVER_VERSION, (unsigned long __user *)arg);
  1033. return 0;
  1034. case IDAGETPCIINFO:
  1035. {
  1036. ida_pci_info_struct pciinfo;
  1037. if (!arg) return -EINVAL;
  1038. pciinfo.bus = host->pci_dev->bus->number;
  1039. pciinfo.dev_fn = host->pci_dev->devfn;
  1040. pciinfo.board_id = host->board_id;
  1041. if(copy_to_user((void __user *) arg, &pciinfo,  
  1042. sizeof( ida_pci_info_struct)))
  1043. return -EFAULT;
  1044. return(0);
  1045. }
  1046. default:
  1047. return -EINVAL;
  1048. }
  1049. }
  1050. /*
  1051.  * ida_ctlr_ioctl is for passing commands to the controller from userspace.
  1052.  * The command block (io) has already been copied to kernel space for us,
  1053.  * however, any elements in the sglist need to be copied to kernel space
  1054.  * or copied back to userspace.
  1055.  *
  1056.  * Only root may perform a controller passthru command, however I'm not doing
  1057.  * any serious sanity checking on the arguments.  Doing an IDA_WRITE_MEDIA and
  1058.  * putting a 64M buffer in the sglist is probably a *bad* idea.
  1059.  */
  1060. static int ida_ctlr_ioctl(ctlr_info_t *h, int dsk, ida_ioctl_t *io)
  1061. {
  1062. int ctlr = h->ctlr;
  1063. cmdlist_t *c;
  1064. void *p = NULL;
  1065. unsigned long flags;
  1066. int error;
  1067. if ((c = cmd_alloc(h, 0)) == NULL)
  1068. return -ENOMEM;
  1069. c->ctlr = ctlr;
  1070. c->hdr.unit = (io->unit & UNITVALID) ? (io->unit & ~UNITVALID) : dsk;
  1071. c->hdr.size = sizeof(rblk_t) >> 2;
  1072. c->size += sizeof(rblk_t);
  1073. c->req.hdr.cmd = io->cmd;
  1074. c->req.hdr.blk = io->blk;
  1075. c->req.hdr.blk_cnt = io->blk_cnt;
  1076. c->type = CMD_IOCTL_PEND;
  1077. /* Pre submit processing */
  1078. switch(io->cmd) {
  1079. case PASSTHRU_A:
  1080. p = kmalloc(io->sg[0].size, GFP_KERNEL);
  1081. if (!p) 
  1082. error = -ENOMEM; 
  1083. cmd_free(h, c, 0); 
  1084. return(error);
  1085. }
  1086. if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) {
  1087. kfree(p);
  1088. cmd_free(h, c, 0); 
  1089. return -EFAULT;
  1090. }
  1091. c->req.hdr.blk = pci_map_single(h->pci_dev, &(io->c), 
  1092. sizeof(ida_ioctl_t), 
  1093. PCI_DMA_BIDIRECTIONAL);
  1094. c->req.sg[0].size = io->sg[0].size;
  1095. c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
  1096. c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
  1097. c->req.hdr.sg_cnt = 1;
  1098. break;
  1099. case IDA_READ:
  1100. case READ_FLASH_ROM:
  1101. case SENSE_CONTROLLER_PERFORMANCE:
  1102. p = kmalloc(io->sg[0].size, GFP_KERNEL);
  1103. if (!p) 
  1104.                         error = -ENOMEM; 
  1105.                         cmd_free(h, c, 0);
  1106.                         return(error);
  1107.                 }
  1108. c->req.sg[0].size = io->sg[0].size;
  1109. c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
  1110. c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); 
  1111. c->req.hdr.sg_cnt = 1;
  1112. break;
  1113. case IDA_WRITE:
  1114. case IDA_WRITE_MEDIA:
  1115. case DIAG_PASS_THRU:
  1116. case COLLECT_BUFFER:
  1117. case WRITE_FLASH_ROM:
  1118. p = kmalloc(io->sg[0].size, GFP_KERNEL);
  1119. if (!p) 
  1120.   { 
  1121.                         error = -ENOMEM; 
  1122.                         cmd_free(h, c, 0);
  1123.                         return(error);
  1124.                 }
  1125. if (copy_from_user(p, io->sg[0].addr, io->sg[0].size)) {
  1126. kfree(p);
  1127.                         cmd_free(h, c, 0);
  1128. return -EFAULT;
  1129. }
  1130. c->req.sg[0].size = io->sg[0].size;
  1131. c->req.sg[0].addr = pci_map_single(h->pci_dev, p, 
  1132. c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL); 
  1133. c->req.hdr.sg_cnt = 1;
  1134. break;
  1135. default:
  1136. c->req.sg[0].size = sizeof(io->c);
  1137. c->req.sg[0].addr = pci_map_single(h->pci_dev,&io->c, 
  1138. c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
  1139. c->req.hdr.sg_cnt = 1;
  1140. }
  1141. /* Put the request on the tail of the request queue */
  1142. spin_lock_irqsave(IDA_LOCK(ctlr), flags);
  1143. addQ(&h->reqQ, c);
  1144. h->Qdepth++;
  1145. start_io(h);
  1146. spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
  1147. /* Wait for completion */
  1148. while(c->type != CMD_IOCTL_DONE)
  1149. schedule();
  1150. /* Unmap the DMA  */
  1151. pci_unmap_single(h->pci_dev, c->req.sg[0].addr, c->req.sg[0].size, 
  1152. PCI_DMA_BIDIRECTIONAL);
  1153. /* Post submit processing */
  1154. switch(io->cmd) {
  1155. case PASSTHRU_A:
  1156. pci_unmap_single(h->pci_dev, c->req.hdr.blk,
  1157.                                 sizeof(ida_ioctl_t),
  1158.                                 PCI_DMA_BIDIRECTIONAL);
  1159. case IDA_READ:
  1160. case DIAG_PASS_THRU:
  1161. case SENSE_CONTROLLER_PERFORMANCE:
  1162. case READ_FLASH_ROM:
  1163. if (copy_to_user(io->sg[0].addr, p, io->sg[0].size)) {
  1164. kfree(p);
  1165. return -EFAULT;
  1166. }
  1167. /* fall through and free p */
  1168. case IDA_WRITE:
  1169. case IDA_WRITE_MEDIA:
  1170. case COLLECT_BUFFER:
  1171. case WRITE_FLASH_ROM:
  1172. kfree(p);
  1173. break;
  1174. default:;
  1175. /* Nothing to do */
  1176. }
  1177. io->rcode = c->req.hdr.rcode;
  1178. cmd_free(h, c, 0);
  1179. return(0);
  1180. }
  1181. /*
  1182.  * Commands are pre-allocated in a large block.  Here we use a simple bitmap
  1183.  * scheme to suballocte them to the driver.  Operations that are not time
  1184.  * critical (and can wait for kmalloc and possibly sleep) can pass in NULL
  1185.  * as the first argument to get a new command.
  1186.  */
  1187. static cmdlist_t * cmd_alloc(ctlr_info_t *h, int get_from_pool)
  1188. {
  1189. cmdlist_t * c;
  1190. int i;
  1191. dma_addr_t cmd_dhandle;
  1192. if (!get_from_pool) {
  1193. c = (cmdlist_t*)pci_alloc_consistent(h->pci_dev, 
  1194. sizeof(cmdlist_t), &cmd_dhandle);
  1195. if(c==NULL)
  1196. return NULL;
  1197. } else {
  1198. do {
  1199. i = find_first_zero_bit(h->cmd_pool_bits, NR_CMDS);
  1200. if (i == NR_CMDS)
  1201. return NULL;
  1202. } while(test_and_set_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG)) != 0);
  1203. c = h->cmd_pool + i;
  1204. cmd_dhandle = h->cmd_pool_dhandle + i*sizeof(cmdlist_t);
  1205. h->nr_allocs++;
  1206. }
  1207. memset(c, 0, sizeof(cmdlist_t));
  1208. c->busaddr = cmd_dhandle; 
  1209. return c;
  1210. }
  1211. static void cmd_free(ctlr_info_t *h, cmdlist_t *c, int got_from_pool)
  1212. {
  1213. int i;
  1214. if (!got_from_pool) {
  1215. pci_free_consistent(h->pci_dev, sizeof(cmdlist_t), c,
  1216. c->busaddr);
  1217. } else {
  1218. i = c - h->cmd_pool;
  1219. clear_bit(i&(BITS_PER_LONG-1), h->cmd_pool_bits+(i/BITS_PER_LONG));
  1220. h->nr_frees++;
  1221. }
  1222. }
  1223. /***********************************************************************
  1224.     name:        sendcmd
  1225.     Send a command to an IDA using the memory mapped FIFO interface
  1226.     and wait for it to complete.  
  1227.     This routine should only be called at init time.
  1228. ***********************************************************************/
  1229. static int sendcmd(
  1230. __u8 cmd,
  1231. int ctlr,
  1232. void *buff,
  1233. size_t size,
  1234. unsigned int blk,
  1235. unsigned int blkcnt,
  1236. unsigned int log_unit )
  1237. {
  1238. cmdlist_t *c;
  1239. int complete;
  1240. unsigned long temp;
  1241. unsigned long i;
  1242. ctlr_info_t *info_p = hba[ctlr];
  1243. c = cmd_alloc(info_p, 1);
  1244. if(!c)
  1245. return IO_ERROR;
  1246. c->ctlr = ctlr;
  1247. c->hdr.unit = log_unit;
  1248. c->hdr.prio = 0;
  1249. c->hdr.size = sizeof(rblk_t) >> 2;
  1250. c->size += sizeof(rblk_t);
  1251. /* The request information. */
  1252. c->req.hdr.next = 0;
  1253. c->req.hdr.rcode = 0;
  1254. c->req.bp = 0;
  1255. c->req.hdr.sg_cnt = 1;
  1256. c->req.hdr.reserved = 0;
  1257. if (size == 0)
  1258. c->req.sg[0].size = 512;
  1259. else
  1260. c->req.sg[0].size = size;
  1261. c->req.hdr.blk = blk;
  1262. c->req.hdr.blk_cnt = blkcnt;
  1263. c->req.hdr.cmd = (unsigned char) cmd;
  1264. c->req.sg[0].addr = (__u32) pci_map_single(info_p->pci_dev, 
  1265. buff, c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
  1266. /*
  1267.  * Disable interrupt
  1268.  */
  1269. info_p->access.set_intr_mask(info_p, 0);
  1270. /* Make sure there is room in the command FIFO */
  1271. /* Actually it should be completely empty at this time. */
  1272. for (i = 200000; i > 0; i--) {
  1273. temp = info_p->access.fifo_full(info_p);
  1274. if (temp != 0) {
  1275. break;
  1276. }
  1277. udelay(10);
  1278. DBG(
  1279. printk(KERN_WARNING "cpqarray ida%d: idaSendPciCmd FIFO full,"
  1280. " waiting!n", ctlr);
  1281. );
  1282. /*
  1283.  * Send the cmd
  1284.  */
  1285. info_p->access.submit_command(info_p, c);
  1286. complete = pollcomplete(ctlr);
  1287. pci_unmap_single(info_p->pci_dev, (dma_addr_t) c->req.sg[0].addr, 
  1288. c->req.sg[0].size, PCI_DMA_BIDIRECTIONAL);
  1289. if (complete != 1) {
  1290. if (complete != c->busaddr) {
  1291. printk( KERN_WARNING
  1292. "cpqarray ida%d: idaSendPciCmd "
  1293.       "Invalid command list address returned! (%08lx)n",
  1294. ctlr, (unsigned long)complete);
  1295. cmd_free(info_p, c, 1);
  1296. return (IO_ERROR);
  1297. }
  1298. } else {
  1299. printk( KERN_WARNING
  1300. "cpqarray ida%d: idaSendPciCmd Timeout out, "
  1301. "No command list address returned!n",
  1302. ctlr);
  1303. cmd_free(info_p, c, 1);
  1304. return (IO_ERROR);
  1305. }
  1306. if (c->req.hdr.rcode & 0x00FE) {
  1307. if (!(c->req.hdr.rcode & BIG_PROBLEM)) {
  1308. printk( KERN_WARNING
  1309. "cpqarray ida%d: idaSendPciCmd, error: "
  1310. "Controller failed at init time "
  1311. "cmd: 0x%x, return code = 0x%xn",
  1312. ctlr, c->req.hdr.cmd, c->req.hdr.rcode);
  1313. cmd_free(info_p, c, 1);
  1314. return (IO_ERROR);
  1315. }
  1316. }
  1317. cmd_free(info_p, c, 1);
  1318. return (IO_OK);
  1319. }
  1320. /*
  1321.  * revalidate_allvol is for online array config utilities.  After a
  1322.  * utility reconfigures the drives in the array, it can use this function
  1323.  * (through an ioctl) to make the driver zap any previous disk structs for
  1324.  * that controller and get new ones.
  1325.  *
  1326.  * Right now I'm using the getgeometry() function to do this, but this
  1327.  * function should probably be finer grained and allow you to revalidate one
  1328.  * particualar logical volume (instead of all of them on a particular
  1329.  * controller).
  1330.  */
  1331. static int revalidate_allvol(ctlr_info_t *host)
  1332. {
  1333. int ctlr = host->ctlr;
  1334. int i;
  1335. unsigned long flags;
  1336. spin_lock_irqsave(IDA_LOCK(ctlr), flags);
  1337. if (host->usage_count > 1) {
  1338. spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
  1339. printk(KERN_WARNING "cpqarray: Device busy for volume"
  1340. " revalidation (usage=%d)n", host->usage_count);
  1341. return -EBUSY;
  1342. }
  1343. host->usage_count++;
  1344. spin_unlock_irqrestore(IDA_LOCK(ctlr), flags);
  1345. /*
  1346.  * Set the partition and block size structures for all volumes
  1347.  * on this controller to zero.  We will reread all of this data
  1348.  */
  1349. set_capacity(ida_gendisk[ctlr][0], 0);
  1350. for (i = 1; i < NWD; i++) {
  1351. struct gendisk *disk = ida_gendisk[ctlr][i];
  1352. if (disk->flags & GENHD_FL_UP)
  1353. del_gendisk(disk);
  1354. }
  1355. memset(host->drv, 0, sizeof(drv_info_t)*NWD);
  1356. /*
  1357.  * Tell the array controller not to give us any interrupts while
  1358.  * we check the new geometry.  Then turn interrupts back on when
  1359.  * we're done.
  1360.  */
  1361. host->access.set_intr_mask(host, 0);
  1362. getgeometry(ctlr);
  1363. host->access.set_intr_mask(host, FIFO_NOT_EMPTY);
  1364. for(i=0; i<NWD; i++) {
  1365. struct gendisk *disk = ida_gendisk[ctlr][i];
  1366. drv_info_t *drv = &host->drv[i];
  1367. if (i && !drv->nr_blks)
  1368. continue;
  1369. blk_queue_hardsect_size(host->queue, drv->blk_size);
  1370. set_capacity(disk, drv->nr_blks);
  1371. disk->queue = host->queue;
  1372. disk->private_data = drv;
  1373. if (i)
  1374. add_disk(disk);
  1375. }
  1376. host->usage_count--;
  1377. return 0;
  1378. }
  1379. static int ida_revalidate(struct gendisk *disk)
  1380. {
  1381. drv_info_t *drv = disk->private_data;
  1382. set_capacity(disk, drv->nr_blks);
  1383. return 0;
  1384. }
  1385. /********************************************************************
  1386.     name: pollcomplete
  1387.     Wait polling for a command to complete.
  1388.     The memory mapped FIFO is polled for the completion.
  1389.     Used only at init time, interrupts disabled.
  1390.  ********************************************************************/
  1391. static int pollcomplete(int ctlr)
  1392. {
  1393. int done;
  1394. int i;
  1395. /* Wait (up to 2 seconds) for a command to complete */
  1396. for (i = 200000; i > 0; i--) {
  1397. done = hba[ctlr]->access.command_completed(hba[ctlr]);
  1398. if (done == 0) {
  1399. udelay(10); /* a short fixed delay */
  1400. } else
  1401. return (done);
  1402. }
  1403. /* Invalid address to tell caller we ran out of time */
  1404. return 1;
  1405. }
  1406. /*****************************************************************
  1407.     start_fwbk
  1408.     Starts controller firmwares background processing. 
  1409.     Currently only the Integrated Raid controller needs this done.
  1410.     If the PCI mem address registers are written to after this, 
  1411.  data corruption may occur
  1412. *****************************************************************/
  1413. static void start_fwbk(int ctlr)
  1414. {
  1415. id_ctlr_t *id_ctlr_buf; 
  1416. int ret_code;
  1417. if( (hba[ctlr]->board_id != 0x40400E11)
  1418. && (hba[ctlr]->board_id != 0x40480E11) )
  1419. /* Not a Integrated Raid, so there is nothing for us to do */
  1420. return;
  1421. printk(KERN_DEBUG "cpqarray: Starting firmware's background"
  1422. " processingn");
  1423. /* Command does not return anything, but idasend command needs a 
  1424. buffer */
  1425. id_ctlr_buf = (id_ctlr_t *)kmalloc(sizeof(id_ctlr_t), GFP_KERNEL);
  1426. if(id_ctlr_buf==NULL)
  1427. {
  1428. printk(KERN_WARNING "cpqarray: Out of memory. "
  1429. "Unable to start background processing.n");
  1430. return;
  1431. }
  1432. ret_code = sendcmd(RESUME_BACKGROUND_ACTIVITY, ctlr, 
  1433. id_ctlr_buf, 0, 0, 0, 0);
  1434. if(ret_code != IO_OK)
  1435. printk(KERN_WARNING "cpqarray: Unable to start"
  1436. " background processingn");
  1437. kfree(id_ctlr_buf);
  1438. }
  1439. /*****************************************************************
  1440.     getgeometry
  1441.     Get ida logical volume geometry from the controller 
  1442.     This is a large bit of code which once existed in two flavors,
  1443.     It is used only at init time.
  1444. *****************************************************************/
  1445. static void getgeometry(int ctlr)
  1446. {
  1447. id_log_drv_t *id_ldrive;
  1448. id_ctlr_t *id_ctlr_buf;
  1449. sense_log_drv_stat_t *id_lstatus_buf;
  1450. config_t *sense_config_buf;
  1451. unsigned int log_unit, log_index;
  1452. int ret_code, size;
  1453. drv_info_t *drv;
  1454. ctlr_info_t *info_p = hba[ctlr];
  1455. int i;
  1456. info_p->log_drv_map = 0;
  1457. id_ldrive = (id_log_drv_t *)kmalloc(sizeof(id_log_drv_t), GFP_KERNEL);
  1458. if(id_ldrive == NULL)
  1459. {
  1460. printk( KERN_ERR "cpqarray:  out of memory.n");
  1461. return;
  1462. }
  1463. id_ctlr_buf = (id_ctlr_t *)kmalloc(sizeof(id_ctlr_t), GFP_KERNEL);
  1464. if(id_ctlr_buf == NULL)
  1465. {
  1466. kfree(id_ldrive);
  1467. printk( KERN_ERR "cpqarray:  out of memory.n");
  1468. return;
  1469. }
  1470. id_lstatus_buf = (sense_log_drv_stat_t *)kmalloc(sizeof(sense_log_drv_stat_t), GFP_KERNEL);
  1471. if(id_lstatus_buf == NULL)
  1472. {
  1473. kfree(id_ctlr_buf);
  1474. kfree(id_ldrive);
  1475. printk( KERN_ERR "cpqarray:  out of memory.n");
  1476. return;
  1477. }
  1478. sense_config_buf = (config_t *)kmalloc(sizeof(config_t), GFP_KERNEL);
  1479. if(sense_config_buf == NULL)
  1480. {
  1481. kfree(id_lstatus_buf);
  1482. kfree(id_ctlr_buf);
  1483. kfree(id_ldrive);
  1484. printk( KERN_ERR "cpqarray:  out of memory.n");
  1485. return;
  1486. }
  1487. memset(id_ldrive, 0, sizeof(id_log_drv_t));
  1488. memset(id_ctlr_buf, 0, sizeof(id_ctlr_t));
  1489. memset(id_lstatus_buf, 0, sizeof(sense_log_drv_stat_t));
  1490. memset(sense_config_buf, 0, sizeof(config_t));
  1491. info_p->phys_drives = 0;
  1492. info_p->log_drv_map = 0;
  1493. info_p->drv_assign_map = 0;
  1494. info_p->drv_spare_map = 0;
  1495. info_p->mp_failed_drv_map = 0; /* only initialized here */
  1496. /* Get controllers info for this logical drive */
  1497. ret_code = sendcmd(ID_CTLR, ctlr, id_ctlr_buf, 0, 0, 0, 0);
  1498. if (ret_code == IO_ERROR) {
  1499. /*
  1500.  * If can't get controller info, set the logical drive map to 0,
  1501.  * so the idastubopen will fail on all logical drives
  1502.  * on the controller.
  1503.  */
  1504.  /* Free all the buffers and return */ 
  1505. printk(KERN_ERR "cpqarray: error sending ID controllern");
  1506. kfree(sense_config_buf);
  1507.                 kfree(id_lstatus_buf);
  1508.                 kfree(id_ctlr_buf);
  1509.                 kfree(id_ldrive);
  1510.                 return;
  1511.         }
  1512. info_p->log_drives = id_ctlr_buf->nr_drvs;
  1513. for(i=0;i<4;i++)
  1514. info_p->firm_rev[i] = id_ctlr_buf->firm_rev[i];
  1515. info_p->ctlr_sig = id_ctlr_buf->cfg_sig;
  1516. printk(" (%s)n", info_p->product_name);
  1517. /*
  1518.  * Initialize logical drive map to zero
  1519.  */
  1520. log_index = 0;
  1521. /*
  1522.  * Get drive geometry for all logical drives
  1523.  */
  1524. if (id_ctlr_buf->nr_drvs > 16)
  1525. printk(KERN_WARNING "cpqarray ida%d:  This driver supports "
  1526. "16 logical drives per controller.n.  "
  1527. " Additional drives will not be "
  1528. "detectedn", ctlr);
  1529. for (log_unit = 0;
  1530.      (log_index < id_ctlr_buf->nr_drvs)
  1531.      && (log_unit < NWD);
  1532.      log_unit++) {
  1533. struct gendisk *disk = ida_gendisk[ctlr][log_unit];
  1534. size = sizeof(sense_log_drv_stat_t);
  1535. /*
  1536.    Send "Identify logical drive status" cmd
  1537.  */
  1538. ret_code = sendcmd(SENSE_LOG_DRV_STAT,
  1539.      ctlr, id_lstatus_buf, size, 0, 0, log_unit);
  1540. if (ret_code == IO_ERROR) {
  1541. /*
  1542.    If can't get logical drive status, set
  1543.    the logical drive map to 0, so the
  1544.    idastubopen will fail for all logical drives
  1545.    on the controller. 
  1546.  */
  1547. info_p->log_drv_map = 0;
  1548. printk( KERN_WARNING
  1549.      "cpqarray ida%d: idaGetGeometry - Controller"
  1550. " failed to report status of logical drive %dn"
  1551.  "Access to this controller has been disabledn",
  1552. ctlr, log_unit);
  1553. /* Free all the buffers and return */
  1554.                  kfree(sense_config_buf);
  1555.                  kfree(id_lstatus_buf);
  1556.                  kfree(id_ctlr_buf);
  1557.                  kfree(id_ldrive);
  1558.                  return;
  1559. }
  1560. /*
  1561.    Make sure the logical drive is configured
  1562.  */
  1563. if (id_lstatus_buf->status != LOG_NOT_CONF) {
  1564. ret_code = sendcmd(ID_LOG_DRV, ctlr, id_ldrive,
  1565.        sizeof(id_log_drv_t), 0, 0, log_unit);
  1566. /*
  1567.    If error, the bit for this
  1568.    logical drive won't be set and
  1569.    idastubopen will return error. 
  1570.  */
  1571. if (ret_code != IO_ERROR) {
  1572. drv = &info_p->drv[log_unit];
  1573. drv->blk_size = id_ldrive->blk_size;
  1574. drv->nr_blks = id_ldrive->nr_blks;
  1575. drv->cylinders = id_ldrive->drv.cyl;
  1576. drv->heads = id_ldrive->drv.heads;
  1577. drv->sectors = id_ldrive->drv.sect_per_track;
  1578. info_p->log_drv_map |= (1 << log_unit);
  1579. printk(KERN_INFO "cpqarray ida/c%dd%d: blksz=%d nr_blks=%dn",
  1580. ctlr, log_unit, drv->blk_size, drv->nr_blks);
  1581. ret_code = sendcmd(SENSE_CONFIG,
  1582.   ctlr, sense_config_buf,
  1583.  sizeof(config_t), 0, 0, log_unit);
  1584. if (ret_code == IO_ERROR) {
  1585. info_p->log_drv_map = 0;
  1586. /* Free all the buffers and return */
  1587.                  printk(KERN_ERR "cpqarray: error sending sense confign");
  1588.                  kfree(sense_config_buf);
  1589.                  kfree(id_lstatus_buf);
  1590.                  kfree(id_ctlr_buf);
  1591.                  kfree(id_ldrive);
  1592.                  return;
  1593. }
  1594. sprintf(disk->devfs_name, "ida/c%dd%d", ctlr, log_unit);
  1595. info_p->phys_drives =
  1596.     sense_config_buf->ctlr_phys_drv;
  1597. info_p->drv_assign_map
  1598.     |= sense_config_buf->drv_asgn_map;
  1599. info_p->drv_assign_map
  1600.     |= sense_config_buf->spare_asgn_map;
  1601. info_p->drv_spare_map
  1602.     |= sense_config_buf->spare_asgn_map;
  1603. } /* end of if no error on id_ldrive */
  1604. log_index = log_index + 1;
  1605. } /* end of if logical drive configured */
  1606. } /* end of for log_unit */
  1607. kfree(sense_config_buf);
  1608.    kfree(id_ldrive);
  1609.    kfree(id_lstatus_buf);
  1610. kfree(id_ctlr_buf);
  1611. return;
  1612. }
  1613. static void __exit cpqarray_exit(void)
  1614. {
  1615. int i;
  1616. pci_unregister_driver(&cpqarray_pci_driver);
  1617. /* Double check that all controller entries have been removed */
  1618. for(i=0; i<MAX_CTLR; i++) {
  1619. if (hba[i] != NULL) {
  1620. printk(KERN_WARNING "cpqarray: Removing EISA "
  1621. "controller %dn", i);
  1622. cpqarray_remove_one_eisa(i);
  1623. }
  1624. }
  1625. devfs_remove("ida");
  1626. remove_proc_entry("cpqarray", proc_root_driver);
  1627. }
  1628. module_init(cpqarray_init)
  1629. module_exit(cpqarray_exit)