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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Adaptec AAC series RAID controller driver
  3.  * (c) Copyright 2001 Red Hat Inc. <alan@redhat.com>
  4.  *
  5.  * based on the old aacraid driver that is..
  6.  * Adaptec aacraid device driver for Linux.
  7.  *
  8.  * Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com)
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  *
  24.  * Module Name:
  25.  *   linit.c
  26.  *
  27.  * Abstract: Linux Driver entry module for Adaptec RAID Array Controller
  28.  *
  29.  * Provides the following driver entry points:
  30.  * aac_detect()
  31.  * aac_release()
  32.  * aac_queuecommand()
  33.  * aac_resetcommand()
  34.  * aac_biosparm()
  35.  *
  36.  */
  37. #define AAC_DRIVER_VERSION "0.9.9ac6-TEST"
  38. #define AAC_DRIVER_BUILD_DATE __DATE__
  39. #include <linux/module.h>
  40. #include <linux/config.h>
  41. #include <linux/kernel.h>
  42. #include <linux/init.h>
  43. #include <linux/types.h>
  44. #include <linux/sched.h>
  45. #include <linux/pci.h>
  46. #include <linux/spinlock.h>
  47. #include <linux/slab.h>
  48. #include <linux/completion.h>
  49. #include <asm/semaphore.h>
  50. #include <linux/blk.h>
  51. #include "scsi.h"
  52. #include "hosts.h"
  53. #include "aacraid.h"
  54. #include "sd.h"
  55. #define AAC_DRIVERNAME "aacraid"
  56. MODULE_AUTHOR("Red Hat Inc and Adaptec");
  57. MODULE_DESCRIPTION("Supports Dell PERC2, 2/Si, 3/Si, 3/Di, Adaptec 2120S, 2200S, 5400S, and HP NetRAID-4M devices. http://domsch.com/linux/ or http://linux.adaptec.com");
  58. MODULE_LICENSE("GPL");
  59. MODULE_PARM(nondasd, "i");
  60. MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on");
  61. static int nondasd=-1;
  62. struct aac_dev *aac_devices[MAXIMUM_NUM_ADAPTERS];
  63. static unsigned aac_count = 0;
  64. static int aac_cfg_major = -1;
  65. /*
  66.  * Because of the way Linux names scsi devices, the order in this table has
  67.  * become important.  Check for on-board Raid first, add-in cards second.
  68.  *
  69.  * dmb - For now we add the number of channels to this structure.  
  70.  * In the future we should add a fib that reports the number of channels
  71.  * for the card.  At that time we can remove the channels from here
  72.  */
  73.  
  74. static struct aac_driver_ident aac_drivers[] = {
  75. { 0x1028, 0x0001, 0x1028, 0x0001, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 2/Si */
  76. { 0x1028, 0x0002, 0x1028, 0x0002, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  77. { 0x1028, 0x0003, 0x1028, 0x0003, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
  78. { 0x1028, 0x0004, 0x1028, 0x00d0, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Si */
  79. { 0x1028, 0x0002, 0x1028, 0x00d1, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  80. { 0x1028, 0x0002, 0x1028, 0x00d9, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  81. { 0x1028, 0x000a, 0x1028, 0x0106, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  82. { 0x1028, 0x000a, 0x1028, 0x011b, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  83. { 0x1028, 0x000a, 0x1028, 0x0121, aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2 }, /* PERC 3/Di */
  84. { 0x9005, 0x0283, 0x9005, 0x0283, aac_rx_init, "aacraid",  "ADAPTEC ", "catapult        ", 2 }, /* catapult*/
  85. { 0x9005, 0x0284, 0x9005, 0x0284, aac_rx_init, "aacraid",  "ADAPTEC ", "tomcat          ", 2 }, /* tomcat*/
  86. { 0x9005, 0x0285, 0x9005, 0x0286, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1 }, /* Adaptec 2120S (Crusader)*/
  87. { 0x9005, 0x0285, 0x9005, 0x0285, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan)*/
  88. { 0x9005, 0x0285, 0x9005, 0x0287, aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2 }, /* Adaptec 2200S (Vulcan-2m)*/
  89. { 0x1011, 0x0046, 0x9005, 0x0365, aac_sa_init, "aacraid",  "ADAPTEC ", "Adaptec 5400S   ", 4 }, /* Adaptec 5400S (Mustang)*/
  90. { 0x1011, 0x0046, 0x9005, 0x0364, aac_sa_init, "aacraid",  "ADAPTEC ", "AAC-364         ", 4 }, /* Adaptec 5400S (Mustang)*/
  91. { 0x1011, 0x0046, 0x9005, 0x1364, aac_sa_init, "percraid", "DELL    ", "PERCRAID        ", 4 }, /* Dell PERC2 "Quad Channel" */
  92. { 0x1011, 0x0046, 0x103c, 0x10c2, aac_sa_init, "hpnraid",  "HP      ", "NetRAID-4M      ", 4 }  /* HP NetRAID-4M */
  93. };
  94. #define NUM_AACTYPES (sizeof(aac_drivers) / sizeof(struct aac_driver_ident))
  95. static int num_aacdrivers = NUM_AACTYPES;
  96. static int aac_cfg_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg);
  97. static int aac_cfg_open(struct inode * inode, struct file * file);
  98. static int aac_cfg_release(struct inode * inode,struct file * file);
  99. static struct file_operations aac_cfg_fops = {
  100. owner: THIS_MODULE,
  101. ioctl: aac_cfg_ioctl,
  102. open: aac_cfg_open,
  103. release: aac_cfg_release
  104. };
  105. static int aac_detect(Scsi_Host_Template *);
  106. static int aac_release(struct Scsi_Host *);
  107. static int aac_queuecommand(Scsi_Cmnd *, void (*CompletionRoutine)(Scsi_Cmnd *));
  108. static int aac_biosparm(Scsi_Disk *, kdev_t, int *);
  109. static int aac_procinfo(char *, char **, off_t, int, int, int);
  110. static int aac_ioctl(Scsi_Device *, int, void *);
  111. static int aac_eh_abort(Scsi_Cmnd * cmd);
  112. static int aac_eh_device_reset(Scsi_Cmnd* cmd);
  113. static int aac_eh_bus_reset(Scsi_Cmnd* cmd);
  114. static int aac_eh_reset(Scsi_Cmnd* cmd);
  115. static void aac_queuedepth(struct Scsi_Host *, Scsi_Device *);
  116. /**
  117.  * aac_detect - Probe for aacraid cards
  118.  * @template: SCSI driver template
  119.  *
  120.  * Probe for AAC Host Adapters initialize, register, and report the 
  121.  * configuration of each AAC Host Adapter found.
  122.  * Returns the number of adapters successfully initialized and 
  123.  * registered.
  124.  * Initializes all data necessary for this particular SCSI driver.
  125.  * Notes:
  126.  * The detect routine must not call any of the mid level functions 
  127.  * to queue commands because things are not guaranteed to be set 
  128.  * up yet. The detect routine can send commands to the host adapter 
  129.  * as long as the program control will not be passed to scsi.c in 
  130.  * the processing of the command. Note especially that 
  131.  * scsi_malloc/scsi_free must not be called.
  132.  *
  133.  */
  134.  
  135. static int aac_detect(Scsi_Host_Template *template)
  136. {
  137. int index;
  138. int container;
  139. u16 vendor_id, device_id;
  140. struct Scsi_Host *host_ptr;
  141. struct pci_dev *dev = NULL;
  142. struct aac_dev *aac;
  143. struct fsa_scsi_hba *fsa_dev_ptr;
  144. char *name = NULL;
  145. printk(KERN_INFO "Red Hat/Adaptec aacraid driver, %sn", AAC_DRIVER_BUILD_DATE);
  146. /* setting up the proc directory structure */
  147. template->proc_name = "aacraid";
  148. for( index = 0; index != num_aacdrivers; index++ )
  149. {
  150. device_id = aac_drivers[index].device;
  151. vendor_id = aac_drivers[index].vendor;
  152. name = aac_drivers[index].name;
  153. dprintk((KERN_DEBUG "Checking %s %x/%x/%x/%x.n", 
  154. name, vendor_id, device_id,
  155. aac_drivers[index].subsystem_vendor,
  156. aac_drivers[index].subsystem_device));
  157. dev = NULL;
  158. while((dev = pci_find_device(vendor_id, device_id, dev))) {
  159. if (pci_enable_device(dev))
  160. continue;
  161. pci_set_master(dev);
  162. pci_set_dma_mask(dev, 0xFFFFFFFFULL);
  163. if((dev->subsystem_vendor != aac_drivers[index].subsystem_vendor) || 
  164.    (dev->subsystem_device != aac_drivers[index].subsystem_device))
  165. continue;
  166. dprintk((KERN_DEBUG "%s device detected.n", name));
  167. dprintk((KERN_DEBUG "%x/%x/%x/%x.n", vendor_id, device_id, 
  168. aac_drivers[index].subsystem_vendor, aac_drivers[index].subsystem_device));
  169. /* Increment the host adapter count */
  170. aac_count++;
  171. /*
  172.  * scsi_register() allocates memory for a Scsi_Hosts structure and
  173.  * links it into the linked list of host adapters. This linked list
  174.  * contains the data for all possible <supported> scsi hosts.
  175.  * This is similar to the Scsi_Host_Template, except that we have
  176.  * one entry for each actual physical host adapter on the system,
  177.  * stored as a linked list. If there are two AAC boards, then we
  178.  * will need to make two Scsi_Host entries, but there will be only
  179.  * one Scsi_Host_Template entry. The second argument to scsi_register()
  180.  * specifies the size of the extra memory we want to hold any device 
  181.  * specific information.
  182.  */
  183. host_ptr = scsi_register( template, sizeof(struct aac_dev) );
  184. /* 
  185.  * These three parameters can be used to allow for wide SCSI 
  186.  * and for host adapters that support multiple buses.
  187.  */
  188. host_ptr->max_id = 17;
  189. host_ptr->max_lun = 8;
  190. host_ptr->max_channel = 1;
  191. host_ptr->irq = dev->irq; /* Adapter IRQ number */
  192. /* host_ptr->base = ( char * )(dev->resource[0].start & ~0xff); */
  193. host_ptr->base = dev->resource[0].start;
  194. scsi_set_pci_device(host_ptr, dev);
  195. dprintk((KERN_DEBUG "Device base address = 0x%lx [0x%lx].n", host_ptr->base, dev->resource[0].start));
  196. dprintk((KERN_DEBUG "Device irq = 0x%x.n", dev->irq));
  197. /*
  198.  * The unique_id field is a unique identifier that must
  199.  * be assigned so that we have some way of identifying
  200.  * each host adapter properly and uniquely. For hosts 
  201.  * that do not support more than one card in the
  202.  * system, this does not need to be set. It is
  203.  * initialized to zero in scsi_register(). This is the 
  204.  * value returned as aac->id.
  205.  */
  206. host_ptr->unique_id = aac_count - 1;
  207. /*
  208.  * This function is called after the device list has
  209.  * been built to find the tagged queueing depth 
  210.  * supported for each device.
  211.  */
  212. host_ptr->select_queue_depths = aac_queuedepth;
  213. aac = (struct aac_dev *)host_ptr->hostdata;
  214. /* attach a pointer back to Scsi_Host */
  215. aac->scsi_host_ptr = host_ptr;
  216. aac->pdev = dev;
  217. aac->cardtype =  index;
  218. aac->name = aac->scsi_host_ptr->hostt->name;
  219. aac->id = aac->scsi_host_ptr->unique_id;
  220. /* Initialize the ordinal number of the device to -1 */
  221. fsa_dev_ptr = &(aac->fsa_dev);
  222. for( container = 0; container < MAXIMUM_NUM_CONTAINERS; container++ )
  223. fsa_dev_ptr->devno[container] = -1;
  224. dprintk((KERN_DEBUG "Initializing Hardware...n"));
  225. if((*aac_drivers[index].init)(aac , host_ptr->unique_id) != 0)
  226. {
  227. /* device initialization failed */
  228. printk(KERN_WARNING "aacraid: device initialization failed.n");
  229. scsi_unregister(host_ptr);
  230. aac_count--;
  231. continue;
  232. dprintk((KERN_DEBUG "%s:%d device initialization successful.n", name, host_ptr->unique_id));
  233. aac_get_adapter_info(aac);
  234. if(nondasd != -1) 
  235. {
  236. /* someone told us how to set this on the cmdline */
  237. aac->nondasd_support = (nondasd!=0);
  238. }
  239. if(aac->nondasd_support != 0){
  240. printk(KERN_INFO "%s%d: Non-DASD support enabledn", aac->name, aac->id);
  241. }
  242. dprintk((KERN_DEBUG "%s:%d options flag %04x.n",name, host_ptr->unique_id,aac->adapter_info.options));
  243. if(aac->nondasd_support == 1)
  244. {
  245. /*
  246.  * max channel will be the physical channels plus 1 virtual channel 
  247.  * all containers are on the virtual channel 0
  248.  * physical channels are address by their actual physical number+1
  249.  */
  250. host_ptr->max_channel = aac_drivers[index].channels+1;
  251. } else {
  252. host_ptr->max_channel = 1;
  253.   }
  254. dprintk((KERN_DEBUG "Device has %d logical channelsn", host_ptr->max_channel));
  255. aac_get_containers(aac);
  256. aac_devices[aac_count-1] = aac;
  257. /*
  258.  * dmb - we may need to move these 3 parms somewhere else once
  259.  * we get a fib that can report the actual numbers
  260.  */
  261. host_ptr->max_id = AAC_MAX_TARGET;
  262. host_ptr->max_lun = AAC_MAX_LUN;
  263. /*
  264.  *  If we are PAE capable then our future DMA mappings
  265.  *  (for read/write commands) are 64bit clean and don't 
  266.  *  need bouncing. This assumes we do no other 32bit only
  267.  *  allocations (eg fib table expands) after this point.
  268.  */
  269.  
  270. if(aac->pae_support)
  271. pci_set_dma_mask(dev, 0xFFFFFFFFFFFFFFFFUL);
  272. }
  273. }
  274. if( aac_count ){
  275. if((aac_cfg_major = register_chrdev( 0, "aac", &aac_cfg_fops))<0)
  276. printk(KERN_WARNING "aacraid: unable to register "aac" device.n");
  277. }
  278. template->present = aac_count; /* # of cards of this type found */
  279. return aac_count;
  280. }
  281. /**
  282.  * aac_release - release SCSI host resources
  283.  * @host_ptr: SCSI host to clean up
  284.  *
  285.  * Release all resources previously acquired to support a specific Host 
  286.  * Adapter and unregister the AAC Host Adapter.
  287.  *
  288.  * BUGS: Does not wait for the thread it kills to die.
  289.  */
  290. static int aac_release(struct Scsi_Host *host_ptr)
  291. {
  292. struct aac_dev *dev;
  293. dprintk((KERN_DEBUG "aac_release.n"));
  294. dev = (struct aac_dev *)host_ptr->hostdata;
  295. /*
  296.  * kill any threads we started
  297.  */
  298. kill_proc(dev->thread_pid, SIGKILL, 0);
  299. wait_for_completion(&dev->aif_completion);
  300. /*
  301.  * Call the comm layer to detach from this adapter
  302.  */
  303. aac_detach(dev);
  304. /* Check free orderings... */
  305. /* remove interrupt binding */
  306. free_irq(host_ptr->irq, dev);
  307. iounmap((void * )dev->regs.sa);
  308. /* unregister adapter */
  309. scsi_unregister(host_ptr);
  310. /*
  311.  * FIXME: This assumes no hot plugging is going on...
  312.  */
  313. if( aac_cfg_major >= 0 )
  314. {
  315. unregister_chrdev(aac_cfg_major, "aac");
  316. aac_cfg_major = -1;
  317. }
  318. return 0;
  319. }
  320. /**
  321.  * aac_queuecommand - queue a SCSI command
  322.  * @scsi_cmnd_ptr: SCSI command to queue
  323.  * @CompletionRoutine: Function to call on command completion
  324.  *
  325.  * Queues a command for execution by the associated Host Adapter.
  326.  */ 
  327. static int aac_queuecommand(Scsi_Cmnd *scsi_cmnd_ptr, void (*complete)(Scsi_Cmnd *))
  328. {
  329. int ret;
  330. scsi_cmnd_ptr->scsi_done = complete;
  331. /*
  332.  * aac_scsi_cmd() handles command processing, setting the 
  333.  * result code and calling completion routine. 
  334.  */
  335. if((ret = aac_scsi_cmd(scsi_cmnd_ptr)) != 0)
  336. dprintk((KERN_DEBUG "aac_scsi_cmd failed.n"));
  337. return ret;
  338. /**
  339.  * aac_driverinfo - Returns the host adapter name
  340.  * @host_ptr: Scsi host to report on
  341.  *
  342.  * Returns a static string describing the device in question
  343.  */
  344. const char *aac_driverinfo(struct Scsi_Host *host_ptr)
  345. {
  346. struct aac_dev *dev = (struct aac_dev *)host_ptr->hostdata;
  347. return aac_drivers[dev->cardtype].name;
  348. }
  349. /**
  350.  * aac_get_driver_ident
  351.  *  @devtype: index into lookup table
  352.  *
  353.  *  Returns a pointer to the entry in the driver lookup table.
  354.  */
  355. struct aac_driver_ident* aac_get_driver_ident(int devtype)
  356. {
  357. return  &aac_drivers[devtype];
  358. }
  359. /**
  360.  * aac_biosparm - return BIOS parameters for disk
  361.  * @disk: SCSI disk object to process
  362.  * @device: kdev_t of the disk in question
  363.  * @geom: geometry block to fill in
  364.  *
  365.  * Return the Heads/Sectors/Cylinders BIOS Disk Parameters for Disk.  
  366.  * The default disk geometry is 64 heads, 32 sectors, and the appropriate 
  367.  * number of cylinders so as not to exceed drive capacity.  In order for 
  368.  * disks equal to or larger than 1 GB to be addressable by the BIOS
  369.  * without exceeding the BIOS limitation of 1024 cylinders, Extended 
  370.  * Translation should be enabled.   With Extended Translation enabled, 
  371.  * drives between 1 GB inclusive and 2 GB exclusive are given a disk 
  372.  * geometry of 128 heads and 32 sectors, and drives above 2 GB inclusive 
  373.  * are given a disk geometry of 255 heads and 63 sectors.  However, if 
  374.  * the BIOS detects that the Extended Translation setting does not match 
  375.  * the geometry in the partition table, then the translation inferred 
  376.  * from the partition table will be used by the BIOS, and a warning may 
  377.  * be displayed.
  378.  */
  379.  
  380. static int aac_biosparm(Scsi_Disk *disk, kdev_t dev, int *geom)
  381. {
  382. struct diskparm *param = (struct diskparm *)geom;
  383. struct buffer_head * buf;
  384. dprintk((KERN_DEBUG "aac_biosparm.n"));
  385. /*
  386.  * Assuming extended translation is enabled - #REVISIT#
  387.  */
  388. if( disk->capacity >= 2 * 1024 * 1024 ) /* 1 GB in 512 byte sectors */
  389. {
  390. if( disk->capacity >= 4 * 1024 * 1024 ) /* 2 GB in 512 byte sectors */
  391. {
  392. param->heads = 255;
  393. param->sectors = 63;
  394. }
  395. else
  396. {
  397. param->heads = 128;
  398. param->sectors = 32;
  399. }
  400. }
  401. else
  402. {
  403. param->heads = 64;
  404. param->sectors = 32;
  405. }
  406. param->cylinders = disk->capacity/(param->heads * param->sectors);
  407. /*
  408.  * Read the first 1024 bytes from the disk device
  409.  */
  410. buf = bread(MKDEV(MAJOR(dev), MINOR(dev)&~0xf), 0, block_size(dev));
  411. if(buf == NULL)
  412. return 0;
  413. /* 
  414.  * If the boot sector partition table is valid, search for a partition 
  415.  * table entry whose end_head matches one of the standard geometry 
  416.  * translations ( 64/32, 128/32, 255/63 ).
  417.  */
  418.  
  419. if(*(unsigned short *)(buf->b_data + 0x1fe) == cpu_to_le16(0xaa55))
  420. {
  421. struct partition *first = (struct partition * )(buf->b_data + 0x1be);
  422. struct partition *entry = first;
  423. int saved_cylinders = param->cylinders;
  424. int num;
  425. unsigned char end_head, end_sec;
  426. for(num = 0; num < 4; num++)
  427. {
  428. end_head = entry->end_head;
  429. end_sec = entry->end_sector & 0x3f;
  430. if(end_head == 63)
  431. {
  432. param->heads = 64;
  433. param->sectors = 32;
  434. break;
  435. }
  436. else if(end_head == 127)
  437. {
  438. param->heads = 128;
  439. param->sectors = 32;
  440. break;
  441. }
  442. else if(end_head == 254) 
  443. {
  444. param->heads = 255;
  445. param->sectors = 63;
  446. break;
  447. }
  448. entry++;
  449. }
  450. if(num == 4)
  451. {
  452. end_head = first->end_head;
  453. end_sec = first->end_sector & 0x3f;
  454. }
  455. param->cylinders = disk->capacity / (param->heads * param->sectors);
  456. if(num < 4 && end_sec == param->sectors)
  457. {
  458. if(param->cylinders != saved_cylinders)
  459. dprintk((KERN_DEBUG "Adopting geometry: heads=%d, sectors=%d from partition table %d.n",
  460. param->heads, param->sectors, num));
  461. }
  462. else if(end_head > 0 || end_sec > 0)
  463. {
  464. dprintk((KERN_DEBUG "Strange geometry: heads=%d, sectors=%d in partition table %d.n",
  465. end_head + 1, end_sec, num));
  466. dprintk((KERN_DEBUG "Using geometry: heads=%d, sectors=%d.n",
  467. param->heads, param->sectors));
  468. }
  469. }
  470. brelse(buf);
  471. return 0;
  472. }
  473. /**
  474.  * aac_queuedepth - compute queue depths
  475.  * @host: SCSI host in question
  476.  * @dev: SCSI device we are considering
  477.  *
  478.  * Selects queue depths for each target device based on the host adapter's
  479.  * total capacity and the queue depth supported by the target device.
  480.  * A queue depth of one automatically disables tagged queueing.
  481.  */
  482. static void aac_queuedepth(struct Scsi_Host * host, Scsi_Device * dev )
  483. {
  484. Scsi_Device * dptr;
  485. dprintk((KERN_DEBUG "aac_queuedepth.n"));
  486. dprintk((KERN_DEBUG "Device #   Q Depth   Onlinen"));
  487. dprintk((KERN_DEBUG "---------------------------n"));
  488. for(dptr = dev; dptr != NULL; dptr = dptr->next)
  489. {
  490. if(dptr->host == host)
  491. {
  492. dptr->queue_depth = 10;
  493. dprintk((KERN_DEBUG "  %2d         %d        %dn", 
  494. dptr->id, dptr->queue_depth, dptr->online));
  495. }
  496. }
  497. }
  498. /**
  499.  * aac_eh_abort - Abort command if possible.
  500.  * @cmd: SCSI command block to abort
  501.  *
  502.  * Called when the midlayer wishes to abort a command. We don't support
  503.  * this facility, and our firmware looks after life for us. We just
  504.  * report this as failing
  505.  */
  506.  
  507. static int aac_eh_abort(Scsi_Cmnd *cmd)
  508. {
  509. return FAILED;
  510. }
  511. /**
  512.  * aac_eh_device_reset - Reset command handling
  513.  * @cmd: SCSI command block causing the reset
  514.  *
  515.  * Issue a reset of a SCSI device. We are ourselves not truely a SCSI
  516.  * controller and our firmware will do the work for us anyway. Thus this
  517.  * is a no-op. We just return FAILED.
  518.  */
  519. static int aac_eh_device_reset(Scsi_Cmnd *cmd)
  520. {
  521. return FAILED;
  522. }
  523. /**
  524.  * aac_eh_bus_reset - Reset command handling
  525.  * @scsi_cmd: SCSI command block causing the reset
  526.  *
  527.  * Issue a reset of a SCSI bus. We are ourselves not truely a SCSI
  528.  * controller and our firmware will do the work for us anyway. Thus this
  529.  * is a no-op. We just return FAILED.
  530.  */
  531. static int aac_eh_bus_reset(Scsi_Cmnd* cmd)
  532. {
  533. return FAILED;
  534. }
  535. /**
  536.  * aac_eh_hba_reset - Reset command handling
  537.  * @scsi_cmd: SCSI command block causing the reset
  538.  *
  539.  * Issue a reset of a SCSI host. If things get this bad then arguably we should
  540.  * go take a look at what the host adapter is doing and see if something really
  541.  * broke (as can occur at least on my Dell QC card if a drive keeps failing spinup)
  542.  */
  543. static int aac_eh_reset(Scsi_Cmnd* cmd)
  544. {
  545. printk(KERN_ERR "aacraid: Host adapter reset request. SCSI hang ?n");
  546. return FAILED;
  547. }
  548. /**
  549.  * aac_ioctl  - Handle SCSI ioctls
  550.  * @scsi_dev_ptr: scsi device to operate upon
  551.  * @cmd: ioctl command to use issue
  552.  * @arg: ioctl data pointer
  553.  *
  554.  * Issue an ioctl on an aacraid device. Returns a standard unix error code or
  555.  * zero for success
  556.  */
  557.  
  558. static int aac_ioctl(Scsi_Device * scsi_dev_ptr, int cmd, void * arg)
  559. {
  560. struct aac_dev *dev;
  561. dprintk((KERN_DEBUG "aac_ioctl.n"));
  562. dev = (struct aac_dev *)scsi_dev_ptr->host->hostdata;
  563. return aac_do_ioctl(dev, cmd, arg);
  564. }
  565. /**
  566.  * aac_cfg_open - open a configuration file
  567.  * @inode: inode being opened
  568.  * @file: file handle attached
  569.  *
  570.  * Called when the configuration device is opened. Does the needed
  571.  * set up on the handle and then returns
  572.  *
  573.  * Bugs: This needs extending to check a given adapter is present
  574.  * so we can support hot plugging, and to ref count adapters.
  575.  */
  576. static int aac_cfg_open(struct inode * inode, struct file * file )
  577. {
  578. unsigned minor_number = MINOR(inode->i_rdev);
  579. if(minor_number >= aac_count)
  580. return -ENODEV;
  581. return 0;
  582. }
  583. /**
  584.  * aac_cfg_release - close down an AAC config device
  585.  * @inode: inode of configuration file
  586.  * @file: file handle of configuration file
  587.  *
  588.  * Called when the last close of the configuration file handle
  589.  * is performed.
  590.  */
  591.  
  592. static int aac_cfg_release(struct inode * inode, struct file * file )
  593. {
  594. return 0;
  595. }
  596. /**
  597.  * aac_cfg_ioctl - AAC configuration request
  598.  * @inode: inode of device
  599.  * @file: file handle
  600.  * @cmd: ioctl command code
  601.  * @arg: argument
  602.  *
  603.  * Handles a configuration ioctl. Currently this involves wrapping it
  604.  * up and feeding it into the nasty windowsalike glue layer.
  605.  *
  606.  * Bugs: Needs locking against parallel ioctls lower down
  607.  * Bugs: Needs to handle hot plugging
  608.  */
  609.  
  610. static int aac_cfg_ioctl(struct inode * inode,  struct file * file, unsigned int cmd, unsigned long arg )
  611. {
  612. struct aac_dev *dev = aac_devices[MINOR(inode->i_rdev)];
  613. return aac_do_ioctl(dev, cmd, (void *)arg);
  614. }
  615. /*
  616.  * To use the low level SCSI driver support using the linux kernel loadable 
  617.  * module interface we should initialize the global variable driver_interface  
  618.  * (datatype Scsi_Host_Template) and then include the file scsi_module.c.
  619.  */
  620.  
  621. static Scsi_Host_Template driver_template = {
  622. module: THIS_MODULE,
  623. name:            "AAC",
  624. proc_info:       aac_procinfo,
  625. detect:          aac_detect,
  626. release:         aac_release,
  627. info:            aac_driverinfo,
  628. ioctl:           aac_ioctl,
  629. queuecommand:    aac_queuecommand,
  630. bios_param:      aac_biosparm,
  631. can_queue:       AAC_NUM_IO_FIB,
  632. this_id:         16,
  633. sg_tablesize:    16,
  634. max_sectors:     128,
  635. cmd_per_lun:     AAC_NUM_IO_FIB,
  636. eh_abort_handler:       aac_eh_abort,
  637. eh_device_reset_handler:aac_eh_device_reset,
  638. eh_bus_reset_handler: aac_eh_bus_reset,
  639. eh_host_reset_handler: aac_eh_reset,
  640. use_new_eh_code: 1, 
  641. use_clustering: ENABLE_CLUSTERING,
  642. };
  643. #include "scsi_module.c"
  644. /**
  645.  * aac_procinfo - Implement /proc/scsi/<drivername>/<n>
  646.  * @proc_buffer: memory buffer for I/O
  647.  * @start_ptr: pointer to first valid data
  648.  * @offset: offset into file
  649.  * @bytes_available: space left
  650.  * @host_no: scsi host ident
  651.  * @write: direction of I/O
  652.  *
  653.  * Used to export driver statistics and other infos to the world outside 
  654.  * the kernel using the proc file system. Also provides an interface to
  655.  * feed the driver with information.
  656.  *
  657.  * For reads
  658.  * - if offset > 0 return 0
  659.  * - if offset == 0 write data to proc_buffer and set the start_ptr to
  660.  * beginning of proc_buffer, return the number of characters written.
  661.  * For writes
  662.  * - writes currently not supported, return 0
  663.  *
  664.  * Bugs: Only offset zero is handled
  665.  */
  666. static int aac_procinfo(char *proc_buffer, char **start_ptr,off_t offset,
  667. int bytes_available, int host_no, int write)
  668. {
  669. if(write || offset > 0)
  670. return 0;
  671. *start_ptr = proc_buffer;
  672. return sprintf(proc_buffer, "%s  %dn", "Raid Controller, scsi hba number", host_no);
  673. }
  674. EXPORT_NO_SYMBOLS;