cpqarray.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:51k
源码类别:

嵌入式Linux

开发平台:

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