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

Linux/Unix编程

开发平台:

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