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

Linux/Unix编程

开发平台:

Unix_Linux

  1. memset (mbox, 0, 16);
  2. /*
  3.  * Try to issue Enquiry3 command
  4.  * if not succeeded, then issue MEGA_MBOXCMD_ADAPTERINQ command and
  5.  * update enquiry3 structure
  6.  */
  7. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  8. enquiry3_dma_handle = pci_map_single (megaCfg->dev,
  9.       (void *) megaCfg->mega_buffer,
  10.       (2 * 1024L), PCI_DMA_FROMDEVICE);
  11. mbox->xferaddr = enquiry3_dma_handle;
  12. #else
  13. /*Taken care */
  14. mbox->xferaddr = virt_to_bus ((void *) megaCfg->mega_buffer);
  15. #endif
  16. /* Initialize mailbox databuffer addr */
  17. enquiry3Pnt = (mega_Enquiry3 *) megaCfg->mega_buffer;
  18. /* point mega_Enguiry3 to the data buf */
  19. mboxData[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */
  20. mboxData[2] = NC_SUBOP_ENQUIRY3; /* i.e. 0x0F */
  21. mboxData[3] = ENQ3_GET_SOLICITED_FULL; /* i.e. 0x02 */
  22. /* Issue a blocking command to the card */
  23. if ((retval = megaIssueCmd (megaCfg, mboxData, NULL, 0)) != 0) { /* the adapter does not support 40ld */
  24. mega_RAIDINQ adapterInquiryData;
  25. mega_RAIDINQ *adapterInquiryPnt = &adapterInquiryData;
  26. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  27. raid_inq_dma_handle = pci_map_single (megaCfg->dev,
  28.       (void *) adapterInquiryPnt,
  29.       sizeof (mega_RAIDINQ),
  30.       PCI_DMA_FROMDEVICE);
  31. mbox->xferaddr = raid_inq_dma_handle;
  32. #else
  33. /*taken care */
  34. mbox->xferaddr = virt_to_bus ((void *) adapterInquiryPnt);
  35. #endif
  36. mbox->cmd = MEGA_MBOXCMD_ADAPTERINQ; /*issue old 0x05 command to adapter */
  37. /* Issue a blocking command to the card */ ;
  38. retval = megaIssueCmd (megaCfg, mboxData, NULL, 0);
  39. pci_unmap_single (megaCfg->dev,
  40.   raid_inq_dma_handle,
  41.   sizeof (mega_RAIDINQ), PCI_DMA_FROMDEVICE);
  42. /*update Enquiry3 and ProductInfo structures with mega_RAIDINQ structure*/
  43. mega_Convert8ldTo40ld (adapterInquiryPnt,
  44.        enquiry3Pnt,
  45.        (megaRaidProductInfo *) & megaCfg->
  46.        productInfo);
  47. } else { /* adapter supports 40ld */
  48. megaCfg->flag |= BOARD_40LD;
  49. pci_unmap_single (megaCfg->dev,
  50.   enquiry3_dma_handle,
  51.   (2 * 1024L), PCI_DMA_FROMDEVICE);
  52. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  53. /*get productInfo, which is static information and will be unchanged*/
  54. prod_info_dma_handle
  55.     = pci_map_single (megaCfg->dev,
  56.       (void *) &megaCfg->productInfo,
  57.       sizeof (megaRaidProductInfo),
  58.       PCI_DMA_FROMDEVICE);
  59. mbox->xferaddr = prod_info_dma_handle;
  60. #else
  61. /*taken care */
  62. mbox->xferaddr = virt_to_bus ((void *) &megaCfg->productInfo);
  63. #endif
  64. mboxData[0] = FC_NEW_CONFIG; /* i.e. mbox->cmd=0xA1 */
  65. mboxData[2] = NC_SUBOP_PRODUCT_INFO; /* i.e. 0x0E */
  66. if ((retval = megaIssueCmd (megaCfg, mboxData, NULL, 0)) != 0)
  67. printk ("megaraid: Product_info cmd failed with error: %dn",
  68. retval);
  69. pci_unmap_single (megaCfg->dev,
  70.   prod_info_dma_handle,
  71.   sizeof (megaRaidProductInfo),
  72.   PCI_DMA_FROMDEVICE);
  73. }
  74. /*
  75.  * kernel scans the channels from 0 to <= max_channel
  76.  */
  77. megaCfg->host->max_channel =
  78. megaCfg->productInfo.SCSIChanPresent + NVIRT_CHAN -1;
  79. megaCfg->host->max_id = 16; /* max targets per channel */
  80. /*(megaCfg->flag & BOARD_40LD)?FC_MAX_TARGETS_PER_CHANNEL:MAX_TARGET+1; */
  81. #if 0
  82. megaCfg->host->max_lun = /* max lun */
  83.     (megaCfg->flag & BOARD_40LD) ?
  84. FC_MAX_LOGICAL_DRIVES : MAX_LOGICAL_DRIVES;
  85. #endif
  86. megaCfg->host->max_lun = 7; /* Upto 7 luns for non disk devices */
  87. megaCfg->host->cmd_per_lun = MAX_CMD_PER_LUN;
  88. megaCfg->numldrv = enquiry3Pnt->numLDrv;
  89. megaCfg->max_cmds = megaCfg->productInfo.MaxConcCmds;
  90. if (megaCfg->max_cmds > MAX_COMMANDS)
  91. megaCfg->max_cmds = MAX_COMMANDS - 1;
  92. megaCfg->host->can_queue = megaCfg->max_cmds - 1;
  93. #if 0
  94. if (megaCfg->host->can_queue >= MAX_COMMANDS) {
  95. megaCfg->host->can_queue = MAX_COMMANDS - 16;
  96. }
  97. #endif
  98. /* use HP firmware and bios version encoding */
  99. if (megaCfg->productInfo.subSystemVendorID == HP_SUBSYS_ID) {
  100. sprintf (megaCfg->fwVer, "%c%d%d.%d%d",
  101.  megaCfg->productInfo.FwVer[2],
  102.  megaCfg->productInfo.FwVer[1] >> 8,
  103.  megaCfg->productInfo.FwVer[1] & 0x0f,
  104.  megaCfg->productInfo.FwVer[0] >> 8,
  105.  megaCfg->productInfo.FwVer[0] & 0x0f);
  106. sprintf (megaCfg->biosVer, "%c%d%d.%d%d",
  107.  megaCfg->productInfo.BiosVer[2],
  108.  megaCfg->productInfo.BiosVer[1] >> 8,
  109.  megaCfg->productInfo.BiosVer[1] & 0x0f,
  110.  megaCfg->productInfo.BiosVer[0] >> 8,
  111.  megaCfg->productInfo.BiosVer[0] & 0x0f);
  112. } else {
  113. memcpy (megaCfg->fwVer, (char *) megaCfg->productInfo.FwVer, 4);
  114. megaCfg->fwVer[4] = 0;
  115. memcpy (megaCfg->biosVer, (char *) megaCfg->productInfo.BiosVer, 4);
  116. megaCfg->biosVer[4] = 0;
  117. }
  118. megaCfg->support_ext_cdb = mega_support_ext_cdb(megaCfg);
  119. printk (KERN_NOTICE "megaraid: [%s:%s] detected %d logical drives" M_RD_CRLFSTR,
  120. megaCfg->fwVer, megaCfg->biosVer, megaCfg->numldrv);
  121. if ( megaCfg->support_ext_cdb ) {
  122. printk(KERN_NOTICE "megaraid: supports extended CDBs.n");
  123. }
  124. /*
  125.  * I hope that I can unmap here, reason DMA transaction is not required any more
  126.  * after this
  127.  */
  128. return 0;
  129. }
  130. /*-------------------------------------------------------------------------
  131.  *
  132.  *                      Driver interface functions
  133.  *
  134.  *-------------------------------------------------------------------------*/
  135. /*----------------------------------------------------------
  136.  * Returns data to be displayed in /proc/scsi/megaraid/X
  137.  *----------------------------------------------------------*/
  138. int megaraid_proc_info (char *buffer, char **start, off_t offset,
  139.     int length, int host_no, int inout)
  140. {
  141. *start = buffer;
  142. return 0;
  143. }
  144. static int mega_findCard (Scsi_Host_Template * pHostTmpl,
  145.        u16 pciVendor, u16 pciDev, long flag)
  146. {
  147. mega_host_config *megaCfg = NULL;
  148. struct Scsi_Host *host = NULL;
  149. u_char pciBus, pciDevFun, megaIrq;
  150. u16 magic;
  151. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  152. u32 magic64;
  153. #endif
  154. int i;
  155. #if BITS_PER_LONG==64
  156. u64 megaBase;
  157. #else
  158. u32 megaBase;
  159. #endif
  160. u16 pciIdx = 0;
  161. u16 numFound = 0;
  162. u16 subsysid, subsysvid;
  163. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) /* 0x20100 */
  164. while (!pcibios_find_device
  165.        (pciVendor, pciDev, pciIdx, &pciBus, &pciDevFun)) {
  166. #else
  167. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0) /*0x20300 */
  168. struct pci_dev *pdev = NULL;
  169. #else
  170. struct pci_dev *pdev = pci_devices;
  171. #endif
  172. while ((pdev = pci_find_device (pciVendor, pciDev, pdev))) {
  173. if(pci_enable_device (pdev))
  174. continue;
  175. pciBus = pdev->bus->number;
  176. pciDevFun = pdev->devfn;
  177. #endif
  178. if ((flag & BOARD_QUARTZ) && (skip_id == -1)) {
  179. pcibios_read_config_word (pciBus, pciDevFun,
  180.   PCI_CONF_AMISIG, &magic);
  181. if ((magic != AMI_SIGNATURE)
  182.     && (magic != AMI_SIGNATURE_471)) {
  183. pciIdx++;
  184. continue; /* not an AMI board */
  185. }
  186. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  187. pcibios_read_config_dword (pciBus, pciDevFun,
  188.    PCI_CONF_AMISIG64, &magic64);
  189. if (magic64 == AMI_64BIT_SIGNATURE)
  190. flag |= BOARD_64BIT;
  191. #endif
  192. }
  193. /* Hmmm...Should we not make this more modularized so that in future we dont add
  194.    for each firmware */
  195. if (flag & BOARD_QUARTZ) {
  196. /* Check to see if this is a Dell PERC RAID controller model 466 */
  197. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) /* 0x20100 */
  198. pcibios_read_config_word (pciBus, pciDevFun,
  199.   PCI_SUBSYSTEM_VENDOR_ID,
  200.   &subsysvid);
  201. pcibios_read_config_word (pciBus, pciDevFun,
  202.   PCI_SUBSYSTEM_ID, &subsysid);
  203. #else
  204. pci_read_config_word (pdev,
  205.       PCI_SUBSYSTEM_VENDOR_ID,
  206.       &subsysvid);
  207. pci_read_config_word (pdev,
  208.       PCI_SUBSYSTEM_ID, &subsysid);
  209. #endif
  210. #if 0
  211. /*
  212.  * This routine is called with well know values and we
  213.  * should not be getting what we have not asked.
  214.  * Also, the check is not right. It should have been for
  215.  * pci_vendor_id not subsysvid - AM
  216.  */
  217. /* If we dont detect this valid subsystem vendor id's 
  218.    we refuse to load the driver 
  219.    PART of PC200X compliance
  220.  */
  221. if ((subsysvid != AMI_SUBSYS_ID)
  222.     && (subsysvid != DELL_SUBSYS_ID)
  223.     && (subsysvid != HP_SUBSYS_ID))
  224. continue;
  225. #endif
  226. }
  227. printk (KERN_NOTICE
  228. "megaraid: found 0x%4.04x:0x%4.04x:idx %d:bus %d:slot %d:func %dn",
  229. pciVendor, pciDev, pciIdx, pciBus, PCI_SLOT (pciDevFun),
  230. PCI_FUNC (pciDevFun));
  231. /* Read the base port and IRQ from PCI */
  232. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) /* 0x20100 */
  233. pcibios_read_config_dword (pciBus, pciDevFun,
  234.    PCI_BASE_ADDRESS_0,
  235.    (u_int *) & megaBase);
  236. pcibios_read_config_byte (pciBus, pciDevFun,
  237.   PCI_INTERRUPT_LINE, &megaIrq);
  238. #elif LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) /*0x20300 */
  239. megaBase = pdev->base_address[0];
  240. megaIrq = pdev->irq;
  241. #else
  242. megaBase = pci_resource_start (pdev, 0);
  243. megaIrq = pdev->irq;
  244. #endif
  245. pciIdx++;
  246. if (flag & BOARD_QUARTZ) {
  247. megaBase &= PCI_BASE_ADDRESS_MEM_MASK;
  248. megaBase = (long) ioremap (megaBase, 128);
  249. if (!megaBase)
  250. continue;
  251. } else {
  252. megaBase &= PCI_BASE_ADDRESS_IO_MASK;
  253. megaBase += 0x10;
  254. }
  255. /* Initialize SCSI Host structure */
  256. host = scsi_register (pHostTmpl, sizeof (mega_host_config));
  257. if (!host)
  258. goto err_unmap;
  259. /*
  260.  * Comment the following initialization if you know 'max_sectors' is
  261.  * not defined for this kernel.
  262.  * This field was introduced in Linus's kernel 2.4.7pre3 and it
  263.  * greatly increases the IO performance - AM
  264.  */
  265. host->max_sectors = 1024;
  266. scsi_set_pci_device(host, pdev);
  267. megaCfg = (mega_host_config *) host->hostdata;
  268. memset (megaCfg, 0, sizeof (mega_host_config));
  269. printk (KERN_NOTICE "scsi%d : Found a MegaRAID controller at 0x%x, IRQ: %d"
  270. M_RD_CRLFSTR, host->host_no, (u_int) megaBase, megaIrq);
  271. if (flag & BOARD_64BIT)
  272. printk (KERN_NOTICE "scsi%d : Enabling 64 bit supportn",
  273. host->host_no);
  274. /* Copy resource info into structure */
  275. megaCfg->qCompletedH = NULL;
  276. megaCfg->qCompletedT = NULL;
  277. megaCfg->qPendingH = NULL;
  278. megaCfg->qPendingT = NULL;
  279. megaCfg->qFreeH = NULL;
  280. megaCfg->qFreeT = NULL;
  281. megaCfg->qFcnt = 0;
  282. megaCfg->qPcnt = 0;
  283. megaCfg->qCcnt = 0;
  284. megaCfg->lock_free = SPIN_LOCK_UNLOCKED;
  285. megaCfg->lock_pend = SPIN_LOCK_UNLOCKED;
  286. megaCfg->lock_scsicmd = SPIN_LOCK_UNLOCKED;
  287. megaCfg->flag = flag;
  288. megaCfg->int_qh = NULL;
  289. megaCfg->int_qt = NULL;
  290. megaCfg->int_qlen = 0;
  291. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  292. megaCfg->dev = pdev;
  293. #endif
  294. megaCfg->host = host;
  295. megaCfg->base = megaBase;
  296. megaCfg->host->irq = megaIrq;
  297. megaCfg->host->io_port = megaBase;
  298. megaCfg->host->n_io_port = 16;
  299. megaCfg->host->unique_id = (pciBus << 8) | pciDevFun;
  300. megaCtlrs[numCtlrs] = megaCfg;
  301. if (!(flag & BOARD_QUARTZ)) {
  302. /* Request our IO Range */
  303. if (!request_region(megaBase, 16, "megaraid")) {
  304. printk(KERN_WARNING "megaraid: Couldn't register I/O range!n");
  305. goto err_unregister;
  306. }
  307. }
  308. /* Request our IRQ */
  309. if (request_irq (megaIrq, megaraid_isr, SA_SHIRQ,
  310.  "megaraid", megaCfg)) {
  311. printk (KERN_WARNING
  312. "megaraid: Couldn't register IRQ %d!n",
  313. megaIrq);
  314. goto err_release;
  315. }
  316. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  317. /*
  318.  * unmap while releasing the driver, Is it required to be 
  319.  * PCI_DMA_BIDIRECTIONAL 
  320. */
  321. megaCfg->mailbox64ptr
  322.     = pci_alloc_consistent (megaCfg->dev,
  323.     sizeof (mega_mailbox64),
  324.     &(megaCfg->dma_handle64));
  325. mega_register_mailbox (megaCfg,
  326.        virt_to_bus ((void *) megaCfg->
  327.     mailbox64ptr));
  328. #else
  329. mega_register_mailbox (megaCfg,
  330.        virt_to_bus ((void *) &megaCfg->
  331.     mailbox64));
  332. #endif
  333. mega_i_query_adapter (megaCfg);
  334. if ((subsysid == 0x1111) && (subsysvid == 0x1111)) {
  335. /*
  336.  * Which firmware
  337.  */
  338. if( strcmp(megaCfg->fwVer, "3.00") == 0 ||
  339. strcmp(megaCfg->fwVer, "3.01") == 0 ) {
  340. printk( KERN_WARNING
  341. "megaraid: Your  card is a Dell PERC 2/SC RAID controller "
  342. "with  firmwarenmegaraid: 3.00 or 3.01.  This driver is "
  343. "known to have corruption issuesnmegaraid: with those "
  344. "firmware versions on this specific card.  In ordern"
  345. "megaraid: to protect your data, please upgrade your "
  346. "firmware to versionnmegaraid: 3.10 or later, available "
  347. "from the Dell Technical Support webnmegaraid: site atn"
  348. "http://support.dell.com/us/en/filelib/download/"
  349. "index.asp?fileid=2940n"
  350. );
  351. }
  352. }
  353. /*
  354.  * If we have a HP 1M(0x60E7)/2M(0x60E8) controller with
  355.  * firmware H.01.07 or H.01.08, disable 64 bit support,
  356.  * since this firmware cannot handle 64 bit addressing
  357.  */
  358. if( (subsysvid == HP_SUBSYS_ID) &&
  359. ((subsysid == 0x60E7)||(subsysid == 0x60E8)) ) {
  360. /*
  361.  * which firmware
  362.  */
  363. if( strcmp(megaCfg->fwVer, "H01.07") == 0 || 
  364.     strcmp(megaCfg->fwVer, "H01.08") == 0 ||
  365.     strcmp(megaCfg->fwVer, "H01.09") == 0 )
  366. {
  367. printk(KERN_WARNING
  368. "megaraid: Firmware H.01.07/8/9 on 1M/2M "
  369. "controllersnmegaraid: do not support 64 bit "
  370. "addressing.n"
  371. "megaraid: DISABLING 64 bit support.n");
  372. megaCfg->flag &= ~BOARD_64BIT;
  373. }
  374. }
  375. if (mega_is_bios_enabled (megaCfg)) {
  376. mega_hbas[numCtlrs].is_bios_enabled = 1;
  377. }
  378. /*
  379.  * Find out which channel is raid and which is scsi
  380.  */
  381. mega_enum_raid_scsi(megaCfg);
  382. for( i = 0; i < megaCfg->productInfo.SCSIChanPresent; i++ ) {
  383. if(IS_RAID_CH(i))
  384. printk(KERN_NOTICE"megaraid: channel[%d] is raid.n", i+1);
  385. else
  386. printk(KERN_NOTICE"megaraid: channel[%d] is scsi.n", i+1);
  387. }
  388. /*
  389.  * Find out if a logical drive is set as the boot drive. If there is
  390.  * one, will make that as the first logical drive.
  391.  */
  392. mega_get_boot_ldrv(megaCfg);
  393. mega_hbas[numCtlrs].hostdata_addr = megaCfg;
  394. /*
  395.  * Do we support random deletion and addition of logical drives
  396.  */
  397. megaCfg->read_ldidmap = 0; /* set it after first logdrv delete cmd */
  398. megaCfg->support_random_del = mega_support_random_del(megaCfg);
  399. /* Initialize SCBs */
  400. if (mega_init_scb (megaCfg)) {
  401. pci_free_consistent (megaCfg->dev,
  402.      sizeof (mega_mailbox64),
  403.      (void *) megaCfg->mailbox64ptr,
  404.      megaCfg->dma_handle64);
  405. scsi_unregister (host);
  406. continue;
  407. }
  408. /*
  409.  * Fill in the structure which needs to be passed back to the
  410.  * application when it does an ioctl() for controller related
  411.  * information.
  412.  */
  413. i = numCtlrs;
  414. numCtlrs++;
  415. mcontroller[i].base = megaBase;
  416. mcontroller[i].irq = megaIrq;
  417. mcontroller[i].numldrv = megaCfg->numldrv;
  418. mcontroller[i].pcibus = pciBus;
  419. mcontroller[i].pcidev = pciDev;
  420. mcontroller[i].pcifun = PCI_FUNC (pciDevFun);
  421. mcontroller[i].pciid = pciIdx;
  422. mcontroller[i].pcivendor = pciVendor;
  423. mcontroller[i].pcislot = PCI_SLOT (pciDevFun);
  424. mcontroller[i].uid = (pciBus << 8) | pciDevFun;
  425. numFound++;
  426. /* Set the Mode of addressing to 64 bit */
  427. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  428. if ((megaCfg->flag & BOARD_64BIT) && BITS_PER_LONG == 64)
  429. #if BITS_PER_LONG==64
  430. pdev->dma_mask = 0xffffffffffffffff;
  431. #else
  432. pdev->dma_mask = 0xffffffff;
  433. #endif
  434. #endif
  435. continue;
  436.       err_release:
  437. if (flag & BOARD_QUARTZ)
  438. release_region (megaBase, 16);
  439.       err_unregister:
  440. scsi_unregister (host);
  441.       err_unmap:
  442. if (flag & BOARD_QUARTZ)
  443. iounmap ((void *) megaBase);
  444. }
  445. return numFound;
  446. }
  447. /*---------------------------------------------------------
  448.  * Detects if a megaraid controller exists in this system
  449.  *---------------------------------------------------------*/
  450. int megaraid_detect (Scsi_Host_Template * pHostTmpl)
  451. {
  452. int ctlridx = 0, count = 0;
  453. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) /*0x20300 */
  454. pHostTmpl->proc_dir = &proc_scsi_megaraid;
  455. #else
  456. pHostTmpl->proc_name = "megaraid";
  457. #endif
  458. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0) /* 0x20100 */
  459. if (!pcibios_present ()) {
  460. printk (KERN_WARNING "megaraid: PCI bios not present."
  461. M_RD_CRLFSTR);
  462. return 0;
  463. }
  464. #endif
  465. skip_id = -1;
  466. if (megaraid && !strncmp (megaraid, "skip", strlen ("skip"))) {
  467. if (megaraid[4] != '') {
  468. skip_id = megaraid[4] - '0';
  469. if (megaraid[5] != '') {
  470. skip_id = (skip_id * 10) + (megaraid[5] - '0');
  471. }
  472. }
  473. skip_id = (skip_id > 15) ? -1 : skip_id;
  474. }
  475. printk (KERN_NOTICE "megaraid: " MEGARAID_VERSION);
  476. memset (mega_hbas, 0, sizeof (mega_hbas));
  477. count += mega_findCard (pHostTmpl, PCI_VENDOR_ID_AMI,
  478. PCI_DEVICE_ID_AMI_MEGARAID, 0);
  479. count += mega_findCard (pHostTmpl, PCI_VENDOR_ID_AMI,
  480. PCI_DEVICE_ID_AMI_MEGARAID2, 0);
  481. count += mega_findCard (pHostTmpl, 0x8086,
  482. PCI_DEVICE_ID_AMI_MEGARAID3, BOARD_QUARTZ);
  483. count += mega_findCard (pHostTmpl, PCI_VENDOR_ID_AMI,
  484. PCI_DEVICE_ID_AMI_MEGARAID3, BOARD_QUARTZ);
  485. mega_reorder_hosts ();
  486. #ifdef CONFIG_PROC_FS
  487. if (count) {
  488. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0) /*0x20300 */
  489. mega_proc_dir_entry = proc_mkdir ("megaraid", &proc_root);
  490. #else
  491. mega_proc_dir_entry = create_proc_entry ("megaraid",
  492.  S_IFDIR | S_IRUGO |
  493.  S_IXUGO, &proc_root);
  494. #endif
  495. if (!mega_proc_dir_entry)
  496. printk ("megaraid: failed to create megaraid rootn");
  497. else
  498. for (ctlridx = 0; ctlridx < count; ctlridx++)
  499. mega_create_proc_entry (ctlridx,
  500. mega_proc_dir_entry);
  501. }
  502. #endif
  503. /*
  504.  * Register the driver as a character device, for applications to access
  505.  * it for ioctls.
  506.  * Ideally, this should go in the init_module() routine, but since it is
  507.  * hidden in the file "scsi_module.c" ( included in the end ), we define
  508.  * it here
  509.  * First argument (major) to register_chrdev implies a dynamic major
  510.  * number allocation.
  511.  */
  512. if (count) {
  513. major = register_chrdev (0, "megadev", &megadev_fops);
  514. /*
  515.  * Register the Shutdown Notification hook in kernel
  516.  */
  517. if (register_reboot_notifier (&mega_notifier)) {
  518. printk ("MegaRAID Shutdown routine not registered!!n");
  519. }
  520. init_MUTEX (&mimd_entry_mtx);
  521. }
  522. return count;
  523. }
  524. /*---------------------------------------------------------------------
  525.  * Release the controller's resources
  526.  *---------------------------------------------------------------------*/
  527. int megaraid_release (struct Scsi_Host *pSHost)
  528. {
  529. mega_host_config *megaCfg;
  530. mega_mailbox *mbox;
  531. u_char mboxData[16];
  532. int i;
  533. megaCfg = (mega_host_config *) pSHost->hostdata;
  534. mbox = (mega_mailbox *) mboxData;
  535. /* Flush cache to disk */
  536. memset (mbox, 0, 16);
  537. mboxData[0] = 0xA;
  538. free_irq (megaCfg->host->irq, megaCfg); /* Must be freed first, otherwise
  539.    extra interrupt is generated */
  540. /* Issue a blocking (interrupts disabled) command to the card */
  541. megaIssueCmd (megaCfg, mboxData, NULL, 0);
  542. /* Free our resources */
  543. if (megaCfg->flag & BOARD_QUARTZ) {
  544. iounmap ((void *) megaCfg->base);
  545. } else {
  546. release_region (megaCfg->host->io_port, 16);
  547. }
  548. mega_freeSgList (megaCfg);
  549. pci_free_consistent (megaCfg->dev,
  550.      sizeof (mega_mailbox64),
  551.      (void *) megaCfg->mailbox64ptr,
  552.      megaCfg->dma_handle64);
  553. #ifdef CONFIG_PROC_FS
  554. if (megaCfg->controller_proc_dir_entry) {
  555. remove_proc_entry ("stat", megaCfg->controller_proc_dir_entry);
  556. remove_proc_entry ("status",
  557.    megaCfg->controller_proc_dir_entry);
  558. remove_proc_entry ("config",
  559.    megaCfg->controller_proc_dir_entry);
  560. remove_proc_entry ("mailbox",
  561.    megaCfg->controller_proc_dir_entry);
  562. for (i = 0; i < numCtlrs; i++) {
  563. char buf[12] = { 0 };
  564. sprintf (buf, "%d", i);
  565. remove_proc_entry (buf, mega_proc_dir_entry);
  566. }
  567. remove_proc_entry ("megaraid", &proc_root);
  568. }
  569. #endif
  570. /*
  571.  * Release the controller memory. A word of warning this frees
  572.  * hostdata and that includes megaCfg-> so be careful what you
  573.  * dereference beyond this point
  574.  */
  575.  
  576. scsi_unregister (pSHost);
  577. /*
  578.  * Unregister the character device interface to the driver. Ideally this
  579.  * should have been done in cleanup_module routine. Since this is hidden
  580.  * in file "scsi_module.c", we do it here.
  581.  * major is the major number of the character device returned by call to
  582.  * register_chrdev() routine.
  583.  */
  584. unregister_chrdev (major, "megadev");
  585. unregister_reboot_notifier (&mega_notifier);
  586. return 0;
  587. }
  588. static int mega_is_bios_enabled (mega_host_config * megacfg)
  589. {
  590. mega_mailbox *mboxpnt;
  591. unsigned char mbox[16];
  592. int ret;
  593. mboxpnt = (mega_mailbox *) mbox;
  594. memset (mbox, 0, sizeof (mbox));
  595. memset ((void *) megacfg->mega_buffer,
  596. 0, sizeof (megacfg->mega_buffer));
  597. /*
  598.  * issue command to find out if the BIOS is enabled for this controller
  599.  */
  600. mbox[0] = IS_BIOS_ENABLED;
  601. mbox[2] = GET_BIOS;
  602. mboxpnt->xferaddr = virt_to_bus ((void *) megacfg->mega_buffer);
  603. ret = megaIssueCmd (megacfg, mbox, NULL, 0);
  604. return (*(char *) megacfg->mega_buffer);
  605. }
  606. /*
  607.  * Find out what channels are RAID/SCSI
  608.  */
  609. void
  610. mega_enum_raid_scsi(mega_host_config *megacfg)
  611. {
  612. mega_mailbox *mboxp;
  613. unsigned char mbox[16];
  614. int i;
  615. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  616. dma_addr_t dma_handle;
  617. #endif
  618. mboxp = (mega_mailbox *)mbox;
  619. memset(mbox, 0, sizeof(mbox));
  620. /*
  621.  * issue command to find out what channels are raid/scsi
  622.  */
  623. mbox[0] = CHNL_CLASS;
  624. mbox[2] = GET_CHNL_CLASS;
  625. memset((void *)megacfg->mega_buffer, 0, sizeof(megacfg->mega_buffer));
  626. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  627. dma_handle = pci_map_single(megacfg->dev, (void *)megacfg->mega_buffer,
  628.       (2 * 1024L), PCI_DMA_FROMDEVICE);
  629. mboxp->xferaddr = dma_handle;
  630. #else
  631. mboxp->xferaddr = virt_to_bus((void *)megacfg->mega_buffer);
  632. #endif
  633. /*
  634.  * Non-ROMB firware fail this command, so all channels
  635.  * must be shown RAID
  636.  */
  637. if( megaIssueCmd(megacfg, mbox, NULL, 0) == 0 ) {
  638. mega_ch_class = *((char *)megacfg->mega_buffer);
  639. for( i = 0; i < NVIRT_CHAN; i++ ) {
  640. /* logical drives channel is RAID */
  641. mega_ch_class |= (0x01 << (megacfg->productInfo.SCSIChanPresent+i));
  642. }
  643. }
  644. else {
  645. mega_ch_class = 0xFF;
  646. }
  647. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  648. pci_unmap_single(megacfg->dev, dma_handle,
  649.   (2 * 1024L), PCI_DMA_FROMDEVICE);
  650. #endif
  651. }
  652. /*
  653.  * get the boot logical drive number if enabled
  654.  */
  655. void
  656. mega_get_boot_ldrv(mega_host_config *megacfg)
  657. {
  658. mega_mailbox *mboxp;
  659. unsigned char mbox[16];
  660. struct private_bios_data *prv_bios_data;
  661. u16 cksum = 0;
  662. char *cksum_p;
  663. int i;
  664. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  665. dma_addr_t dma_handle;
  666. #endif
  667. mboxp = (mega_mailbox *)mbox;
  668. memset(mbox, 0, sizeof(mbox));
  669. mbox[0] = BIOS_PVT_DATA;
  670. mbox[2] = GET_BIOS_PVT_DATA;
  671. memset((void *)megacfg->mega_buffer, 0, sizeof(megacfg->mega_buffer));
  672. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  673. dma_handle = pci_map_single(megacfg->dev, (void *)megacfg->mega_buffer,
  674.       (2 * 1024L), PCI_DMA_FROMDEVICE);
  675. mboxp->xferaddr = dma_handle;
  676. #else
  677. mboxp->xferaddr = virt_to_bus((void *)megacfg->mega_buffer);
  678. #endif
  679. megacfg->boot_ldrv_enabled = 0;
  680. megacfg->boot_ldrv = 0;
  681. if( megaIssueCmd(megacfg, mbox, NULL, 0) == 0 ) {
  682. prv_bios_data = (struct private_bios_data *)megacfg->mega_buffer;
  683. cksum = 0;
  684. cksum_p = (char *)prv_bios_data;
  685. for( i = 0; i < 14; i++ ) {
  686. cksum += (u16)(*cksum_p++);
  687. }
  688. if( prv_bios_data->cksum == (u16)(0-cksum) ) {
  689. megacfg->boot_ldrv_enabled = 1;
  690. megacfg->boot_ldrv = prv_bios_data->boot_ldrv;
  691. }
  692. }
  693. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  694. pci_unmap_single(megacfg->dev, dma_handle,
  695.   (2 * 1024L), PCI_DMA_FROMDEVICE);
  696. #endif
  697. }
  698. static void mega_reorder_hosts (void)
  699. {
  700. struct Scsi_Host *shpnt;
  701. struct Scsi_Host *shone;
  702. struct Scsi_Host *shtwo;
  703. mega_host_config *boot_host;
  704. int i;
  705. /*
  706.  * Find the (first) host which has it's BIOS enabled
  707.  */
  708. boot_host = NULL;
  709. for (i = 0; i < MAX_CONTROLLERS; i++) {
  710. if (mega_hbas[i].is_bios_enabled) {
  711. boot_host = mega_hbas[i].hostdata_addr;
  712. break;
  713. }
  714. }
  715. if (boot_host == NULL) {
  716. printk (KERN_WARNING "megaraid: no BIOS enabled.n");
  717. return;
  718. }
  719. /*
  720.  * Traverse through the list of SCSI hosts for our HBA locations
  721.  */
  722. shone = shtwo = NULL;
  723. for (shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next) {
  724. /* Is it one of ours? */
  725. for (i = 0; i < MAX_CONTROLLERS; i++) {
  726. if ((mega_host_config *) shpnt->hostdata ==
  727.     mega_hbas[i].hostdata_addr) {
  728. /* Does this one has BIOS enabled */
  729. if (mega_hbas[i].hostdata_addr == boot_host) {
  730. /* Are we first */
  731. if (shtwo == NULL) /* Yes! */
  732. return;
  733. else { /* :-( */
  734. shone = shpnt;
  735. }
  736. } else {
  737. if (!shtwo) {
  738. /* were we here before? xchng first */
  739. shtwo = shpnt;
  740. }
  741. }
  742. break;
  743. }
  744. }
  745. /*
  746.  * Have we got the boot host and one which does not have the bios
  747.  * enabled.
  748.  */
  749. if (shone && shtwo)
  750. break;
  751. }
  752. if (shone && shtwo) {
  753. mega_swap_hosts (shone, shtwo);
  754. }
  755. return;
  756. }
  757. static void mega_swap_hosts (struct Scsi_Host *shone, struct Scsi_Host *shtwo)
  758. {
  759. struct Scsi_Host *prevtoshtwo;
  760. struct Scsi_Host *prevtoshone;
  761. struct Scsi_Host *save = NULL;;
  762. /* Are these two nodes adjacent */
  763. if (shtwo->next == shone) {
  764. if (shtwo == scsi_hostlist && shone->next == NULL) {
  765. /* just two nodes */
  766. scsi_hostlist = shone;
  767. shone->next = shtwo;
  768. shtwo->next = NULL;
  769. } else if (shtwo == scsi_hostlist) {
  770. /* first two nodes of the list */
  771. scsi_hostlist = shone;
  772. shtwo->next = shone->next;
  773. scsi_hostlist->next = shtwo;
  774. } else if (shone->next == NULL) {
  775. /* last two nodes of the list */
  776. prevtoshtwo = scsi_hostlist;
  777. while (prevtoshtwo->next != shtwo)
  778. prevtoshtwo = prevtoshtwo->next;
  779. prevtoshtwo->next = shone;
  780. shone->next = shtwo;
  781. shtwo->next = NULL;
  782. } else {
  783. prevtoshtwo = scsi_hostlist;
  784. while (prevtoshtwo->next != shtwo)
  785. prevtoshtwo = prevtoshtwo->next;
  786. prevtoshtwo->next = shone;
  787. shtwo->next = shone->next;
  788. shone->next = shtwo;
  789. }
  790. } else if (shtwo == scsi_hostlist && shone->next == NULL) {
  791. /* shtwo at head, shone at tail, not adjacent */
  792. prevtoshone = scsi_hostlist;
  793. while (prevtoshone->next != shone)
  794. prevtoshone = prevtoshone->next;
  795. scsi_hostlist = shone;
  796. shone->next = shtwo->next;
  797. prevtoshone->next = shtwo;
  798. shtwo->next = NULL;
  799. } else if (shtwo == scsi_hostlist && shone->next != NULL) {
  800. /* shtwo at head, shone is not at tail */
  801. prevtoshone = scsi_hostlist;
  802. while (prevtoshone->next != shone)
  803. prevtoshone = prevtoshone->next;
  804. scsi_hostlist = shone;
  805. prevtoshone->next = shtwo;
  806. save = shtwo->next;
  807. shtwo->next = shone->next;
  808. shone->next = save;
  809. } else if (shone->next == NULL) {
  810. /* shtwo not at head, shone at tail */
  811. prevtoshtwo = scsi_hostlist;
  812. prevtoshone = scsi_hostlist;
  813. while (prevtoshtwo->next != shtwo)
  814. prevtoshtwo = prevtoshtwo->next;
  815. while (prevtoshone->next != shone)
  816. prevtoshone = prevtoshone->next;
  817. prevtoshtwo->next = shone;
  818. shone->next = shtwo->next;
  819. prevtoshone->next = shtwo;
  820. shtwo->next = NULL;
  821. } else {
  822. prevtoshtwo = scsi_hostlist;
  823. prevtoshone = scsi_hostlist;
  824. save = NULL;;
  825. while (prevtoshtwo->next != shtwo)
  826. prevtoshtwo = prevtoshtwo->next;
  827. while (prevtoshone->next != shone)
  828. prevtoshone = prevtoshone->next;
  829. prevtoshtwo->next = shone;
  830. save = shone->next;
  831. shone->next = shtwo->next;
  832. prevtoshone->next = shtwo;
  833. shtwo->next = save;
  834. }
  835. return;
  836. }
  837. static inline void mega_freeSgList (mega_host_config * megaCfg)
  838. {
  839. int i;
  840. for (i = 0; i < megaCfg->max_cmds; i++) {
  841. if (megaCfg->scbList[i].sgList)
  842. pci_free_consistent (megaCfg->dev,
  843.      sizeof (mega_64sglist) *
  844.      MAX_SGLIST,
  845.      megaCfg->scbList[i].sgList,
  846.      megaCfg->scbList[i].
  847.      dma_sghandle64);
  848. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) /* 0x020400 */
  849. kfree (megaCfg->scbList[i].sgList); /* free sgList */
  850. #endif
  851. }
  852. }
  853. /*----------------------------------------------
  854.  * Get information about the card/driver
  855.  *----------------------------------------------*/
  856. const char *megaraid_info (struct Scsi_Host *pSHost)
  857. {
  858. static char buffer[512];
  859. mega_host_config *megaCfg;
  860. megaCfg = (mega_host_config *) pSHost->hostdata;
  861. sprintf (buffer,
  862.  "LSI Logic MegaRAID %s %d commands %d targs %d chans %d luns",
  863.  megaCfg->fwVer, megaCfg->productInfo.MaxConcCmds,
  864.  megaCfg->host->max_id, megaCfg->host->max_channel,
  865.  megaCfg->host->max_lun);
  866. return buffer;
  867. }
  868. /*-----------------------------------------------------------------
  869.  * Perform a SCSI command
  870.  * Mailbox area:
  871.  *   00 01 command
  872.  *   01 01 command id
  873.  *   02 02 # of sectors
  874.  *   04 04 logical bus address
  875.  *   08 04 physical buffer address
  876.  *   0C 01 logical drive #
  877.  *   0D 01 length of scatter/gather list
  878.  *   0E 01 reserved
  879.  *   0F 01 mailbox busy
  880.  *   10 01 numstatus byte
  881.  *   11 01 status byte
  882.  *-----------------------------------------------------------------*/
  883. int megaraid_queue (Scsi_Cmnd * SCpnt, void (*pktComp) (Scsi_Cmnd *))
  884. {
  885. DRIVER_LOCK_T mega_host_config * megaCfg;
  886. mega_scb *pScb;
  887. char *user_area = NULL;
  888. megaCfg = (mega_host_config *) SCpnt->host->hostdata;
  889. DRIVER_LOCK (megaCfg);
  890. if (!(megaCfg->flag & (1L << SCpnt->channel))) {
  891. if (SCpnt->channel < megaCfg->productInfo.SCSIChanPresent)
  892. printk ( KERN_NOTICE
  893. "scsi%d: scanning channel %d for devices.n",
  894. megaCfg->host->host_no, SCpnt->channel);
  895. else
  896. printk ( KERN_NOTICE
  897. "scsi%d: scanning virtual channel %d for logical drives.n",
  898. megaCfg->host->host_no,
  899. SCpnt->channel-megaCfg->productInfo.SCSIChanPresent+1);
  900. megaCfg->flag |= (1L << SCpnt->channel);
  901. }
  902. SCpnt->scsi_done = pktComp;
  903. if (mega_driver_ioctl (megaCfg, SCpnt))
  904. return 0;
  905. /* If driver in abort or reset.. cancel this command */
  906. if (megaCfg->flag & IN_ABORT) {
  907. SCpnt->result = (DID_ABORT << 16);
  908. /* Add Scsi_Command to end of completed queue */
  909. if (megaCfg->qCompletedH == NULL) {
  910. megaCfg->qCompletedH = megaCfg->qCompletedT = SCpnt;
  911. } else {
  912. megaCfg->qCompletedT->host_scribble =
  913.     (unsigned char *) SCpnt;
  914. megaCfg->qCompletedT = SCpnt;
  915. }
  916. megaCfg->qCompletedT->host_scribble = (unsigned char *) NULL;
  917. megaCfg->qCcnt++;
  918. DRIVER_UNLOCK (megaCfg);
  919. return 0;
  920. } else if (megaCfg->flag & IN_RESET) {
  921. SCpnt->result = (DID_RESET << 16);
  922. /* Add Scsi_Command to end of completed queue */
  923. if (megaCfg->qCompletedH == NULL) {
  924. megaCfg->qCompletedH = megaCfg->qCompletedT = SCpnt;
  925. } else {
  926. megaCfg->qCompletedT->host_scribble =
  927.     (unsigned char *) SCpnt;
  928. megaCfg->qCompletedT = SCpnt;
  929. }
  930. megaCfg->qCompletedT->host_scribble = (unsigned char *) NULL;
  931. megaCfg->qCcnt++;
  932. DRIVER_UNLOCK (megaCfg);
  933. return 0;
  934. }
  935. megaCfg->flag |= IN_QUEUE;
  936. /* Allocate and build a SCB request */
  937. if ((pScb = mega_build_cmd (megaCfg, SCpnt)) != NULL) {
  938. /*
  939.  * Check if the HBA is in quiescent state, e.g., during a delete
  940.  * logical drive opertion. If it is, queue the commands in the
  941.  * internal queue until the delete operation is complete.
  942.  */
  943. if( ! megaCfg->quiescent ) {
  944. /* Add SCB to the head of the pending queue */
  945. if (megaCfg->qPendingH == NULL) {
  946. megaCfg->qPendingH = megaCfg->qPendingT = pScb;
  947. } else {
  948. megaCfg->qPendingT->next = pScb;
  949. megaCfg->qPendingT = pScb;
  950. }
  951. megaCfg->qPendingT->next = NULL;
  952. megaCfg->qPcnt++;
  953. if (mega_runpendq (megaCfg) == -1) {
  954. DRIVER_UNLOCK (megaCfg);
  955. return 0;
  956. }
  957. }
  958. else {
  959. /* Add SCB to the internal queue */
  960. if (megaCfg->int_qh == NULL) {
  961. megaCfg->int_qh = megaCfg->int_qt = pScb;
  962. } else {
  963. megaCfg->int_qt->next = pScb;
  964. megaCfg->int_qt = pScb;
  965. }
  966. megaCfg->int_qt->next = NULL;
  967. megaCfg->int_qlen++;
  968. }
  969. if (pScb->SCpnt->cmnd[0] == M_RD_IOCTL_CMD_NEW) {
  970. init_MUTEX_LOCKED (&pScb->ioctl_sem);
  971. spin_unlock_irq (&io_request_lock);
  972. down (&pScb->ioctl_sem);
  973.      user_area = (char *)*((u32*)&pScb->SCpnt->cmnd[4]);
  974. if (copy_to_user
  975.     (user_area, pScb->buff_ptr, pScb->iDataSize)) {
  976. printk
  977.     ("megaraid: Error copying ioctl return value to user buffer.n");
  978. pScb->SCpnt->result = (DID_ERROR << 16);
  979. }
  980. spin_lock_irq (&io_request_lock);
  981. DRIVER_LOCK (megaCfg);
  982. kfree (pScb->buff_ptr);
  983. pScb->buff_ptr = NULL;
  984. mega_cmd_done (megaCfg, pScb, pScb->SCpnt->result);
  985. mega_rundoneq (megaCfg);
  986. mega_runpendq (megaCfg);
  987. DRIVER_UNLOCK (megaCfg);
  988. }
  989. megaCfg->flag &= ~IN_QUEUE;
  990. }
  991. DRIVER_UNLOCK (megaCfg);
  992. return 0;
  993. }
  994. /*----------------------------------------------------------------------
  995.  * Issue a blocking command to the controller
  996.  *----------------------------------------------------------------------*/
  997. volatile static int internal_done_flag = 0;
  998. volatile static int internal_done_errcode = 0;
  999. static DECLARE_WAIT_QUEUE_HEAD (internal_wait);
  1000. static void internal_done (Scsi_Cmnd * SCpnt)
  1001. {
  1002. internal_done_errcode = SCpnt->result;
  1003. internal_done_flag++;
  1004. wake_up (&internal_wait);
  1005. }
  1006. /* shouldn't be used, but included for completeness */
  1007. int megaraid_command (Scsi_Cmnd * SCpnt)
  1008. {
  1009. internal_done_flag = 0;
  1010. /* Queue command, and wait until it has completed */
  1011. megaraid_queue (SCpnt, internal_done);
  1012. while (!internal_done_flag) {
  1013. interruptible_sleep_on (&internal_wait);
  1014. }
  1015. return internal_done_errcode;
  1016. }
  1017. /*---------------------------------------------------------------------
  1018.  * Abort a previous SCSI request
  1019.  *---------------------------------------------------------------------*/
  1020. int megaraid_abort (Scsi_Cmnd * SCpnt)
  1021. {
  1022. mega_host_config *megaCfg;
  1023. int rc; /*, idx; */
  1024. mega_scb *pScb;
  1025. rc = SCSI_ABORT_NOT_RUNNING;
  1026. megaCfg = (mega_host_config *) SCpnt->host->hostdata;
  1027. megaCfg->flag |= IN_ABORT;
  1028. for (pScb = megaCfg->qPendingH; pScb; pScb = pScb->next) {
  1029. if (pScb->SCpnt == SCpnt) {
  1030. /* Found an aborting command */
  1031. #if DEBUG
  1032. showMbox (pScb);
  1033. #endif
  1034. /*
  1035.  * If the command is queued to be issued to the firmware, abort the scsi cmd,
  1036.  * If the command is already aborted in a previous call to the _abort entry
  1037.  *  point, return SCSI_ABORT_SNOOZE, suggesting a reset.
  1038.  * If the command is issued to the firmware, which might complete after
  1039.  *  some time, we will mark the scb as aborted, and return to the mid layer,
  1040.  *  that abort could not be done.
  1041.  *  In the ISR, when this command actually completes, we will perform a normal
  1042.  *  completion.
  1043.  *
  1044.  * Oct 27, 1999
  1045.  */
  1046. switch (pScb->state) {
  1047. case SCB_ABORTED: /* Already aborted */
  1048. rc = SCSI_ABORT_SNOOZE;
  1049. break;
  1050. case SCB_ISSUED: /* Waiting on ISR result */
  1051. rc = SCSI_ABORT_NOT_RUNNING;
  1052. pScb->state = SCB_ABORTED;
  1053. break;
  1054. case SCB_ACTIVE: /* still on the pending queue */
  1055. mega_freeSCB (megaCfg, pScb);
  1056. SCpnt->result = (DID_ABORT << 16);
  1057. if (megaCfg->qCompletedH == NULL) {
  1058. megaCfg->qCompletedH =
  1059.     megaCfg->qCompletedT = SCpnt;
  1060. } else {
  1061. megaCfg->qCompletedT->host_scribble =
  1062.     (unsigned char *) SCpnt;
  1063. megaCfg->qCompletedT = SCpnt;
  1064. }
  1065. megaCfg->qCompletedT->host_scribble =
  1066.     (unsigned char *) NULL;
  1067. megaCfg->qCcnt++;
  1068. rc = SCSI_ABORT_SUCCESS;
  1069. break;
  1070. default:
  1071. printk
  1072.     ("megaraid_abort: unknown command state!!n");
  1073. rc = SCSI_ABORT_NOT_RUNNING;
  1074. break;
  1075. }
  1076. break;
  1077. }
  1078. }
  1079. megaCfg->flag &= ~IN_ABORT;
  1080. #if DEBUG
  1081. if (megaCfg->flag & IN_QUEUE)
  1082. printk ("ma:flag is in queuen");
  1083. if (megaCfg->qCompletedH == NULL)
  1084. printk ("ma:qchead == nulln");
  1085. #endif
  1086. /*
  1087.  * This is required here to complete any completed requests to be communicated
  1088.  * over to the mid layer.
  1089.  * Calling just mega_rundoneq() did not work.
  1090.  */
  1091. if (megaCfg->qCompletedH) {
  1092. SCpnt = megaCfg->qCompletedH;
  1093. megaCfg->qCompletedH = (Scsi_Cmnd *) SCpnt->host_scribble;
  1094. megaCfg->qCcnt--;
  1095. SCpnt->host_scribble = (unsigned char *) NULL;
  1096. /* Callback */
  1097. callDone (SCpnt);
  1098. }
  1099. mega_rundoneq (megaCfg);
  1100. return rc;
  1101. }
  1102. /*---------------------------------------------------------------------
  1103.  * Reset a previous SCSI request
  1104.  *---------------------------------------------------------------------*/
  1105. int megaraid_reset (Scsi_Cmnd * SCpnt, unsigned int rstflags)
  1106. {
  1107. mega_host_config *megaCfg;
  1108. int idx;
  1109. int rc;
  1110. mega_scb *pScb;
  1111. rc = SCSI_RESET_NOT_RUNNING;
  1112. megaCfg = (mega_host_config *) SCpnt->host->hostdata;
  1113. megaCfg->flag |= IN_RESET;
  1114. printk
  1115.     ("megaraid_RESET: %.08lx cmd=%.02x <c=%d.t=%d.l=%d>, flag = %xn",
  1116.      SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel,
  1117.      SCpnt->target, SCpnt->lun, rstflags);
  1118. TRACE (("RESET: %.08lx %.02x <%d.%d.%d>n",
  1119. SCpnt->serial_number, SCpnt->cmnd[0], SCpnt->channel,
  1120. SCpnt->target, SCpnt->lun));
  1121. /*
  1122.  * Walk list of SCBs for any that are still outstanding
  1123.  */
  1124. for (idx = 0; idx < megaCfg->max_cmds; idx++) {
  1125. if (megaCfg->scbList[idx].state != SCB_FREE) {
  1126. SCpnt = megaCfg->scbList[idx].SCpnt;
  1127. pScb = &megaCfg->scbList[idx];
  1128. if (SCpnt != NULL) {
  1129. pScb->state = SCB_RESET;
  1130. break;
  1131. }
  1132. }
  1133. }
  1134. megaCfg->flag &= ~IN_RESET;
  1135. mega_rundoneq (megaCfg);
  1136. return rc;
  1137. }
  1138. #ifdef CONFIG_PROC_FS
  1139. /* Following code handles /proc fs  */
  1140. static int proc_printf (mega_host_config * megaCfg, const char *fmt, ...)
  1141. {
  1142. va_list args;
  1143. int i;
  1144. if (megaCfg->procidx > PROCBUFSIZE)
  1145. return 0;
  1146. va_start (args, fmt);
  1147. i = vsprintf ((megaCfg->procbuf + megaCfg->procidx), fmt, args);
  1148. va_end (args);
  1149. megaCfg->procidx += i;
  1150. return i;
  1151. }
  1152. static int proc_read_config (char *page, char **start, off_t offset,
  1153.   int count, int *eof, void *data)
  1154. {
  1155. mega_host_config *megaCfg = (mega_host_config *) data;
  1156. *start = page;
  1157. if (megaCfg->productInfo.ProductName[0] != 0)
  1158. proc_printf (megaCfg, "%sn", megaCfg->productInfo.ProductName);
  1159. proc_printf (megaCfg, "Controller Type: ");
  1160. if (megaCfg->flag & BOARD_QUARTZ)
  1161. proc_printf (megaCfg, "438/466/467/471/493n");
  1162. else
  1163. proc_printf (megaCfg, "418/428/434n");
  1164. if (megaCfg->flag & BOARD_40LD)
  1165. proc_printf (megaCfg,
  1166.      "Controller Supports 40 Logical Drivesn");
  1167. if (megaCfg->flag & BOARD_64BIT)
  1168. proc_printf (megaCfg,
  1169.      "Controller / Driver uses 64 bit memory addressingn");
  1170. proc_printf (megaCfg, "Base = %08x, Irq = %d, ", megaCfg->base,
  1171.      megaCfg->host->irq);
  1172. proc_printf (megaCfg, "Logical Drives = %d, Channels = %dn",
  1173.      megaCfg->numldrv, megaCfg->productInfo.SCSIChanPresent);
  1174. proc_printf (megaCfg, "Version =%s:%s, DRAM = %dMbn",
  1175.      megaCfg->fwVer, megaCfg->biosVer,
  1176.      megaCfg->productInfo.DramSize);
  1177. proc_printf (megaCfg,
  1178.      "Controller Queue Depth = %d, Driver Queue Depth = %dn",
  1179.      megaCfg->productInfo.MaxConcCmds, megaCfg->max_cmds);
  1180. COPY_BACK;
  1181. return count;
  1182. }
  1183. static int proc_read_stat (char *page, char **start, off_t offset,
  1184. int count, int *eof, void *data)
  1185. {
  1186. int i;
  1187. mega_host_config *megaCfg = (mega_host_config *) data;
  1188. *start = page;
  1189. proc_printf (megaCfg, "Statistical Information for this controllern");
  1190. proc_printf (megaCfg, "Interrupts Collected = %lun",
  1191.      megaCfg->nInterrupts);
  1192. for (i = 0; i < megaCfg->numldrv; i++) {
  1193. proc_printf (megaCfg, "Logical Drive %d:n", i);
  1194. proc_printf (megaCfg,
  1195.      "tReads Issued = %lu, Writes Issued = %lun",
  1196.      megaCfg->nReads[i], megaCfg->nWrites[i]);
  1197. proc_printf (megaCfg,
  1198.      "tSectors Read = %lu, Sectors Written = %lunn",
  1199.      megaCfg->nReadBlocks[i], megaCfg->nWriteBlocks[i]);
  1200. }
  1201. COPY_BACK;
  1202. return count;
  1203. }
  1204. static int proc_read_status (char *page, char **start, off_t offset,
  1205.   int count, int *eof, void *data)
  1206. {
  1207. mega_host_config *megaCfg = (mega_host_config *) data;
  1208. *start = page;
  1209. proc_printf (megaCfg, "TBDn");
  1210. COPY_BACK;
  1211. return count;
  1212. }
  1213. static int proc_read_mbox (char *page, char **start, off_t offset,
  1214. int count, int *eof, void *data)
  1215. {
  1216. mega_host_config *megaCfg = (mega_host_config *) data;
  1217. volatile mega_mailbox *mbox = megaCfg->mbox;
  1218. *start = page;
  1219. proc_printf (megaCfg, "Contents of Mail Box Structuren");
  1220. proc_printf (megaCfg, "  Fw Command   = 0x%02xn", mbox->cmd);
  1221. proc_printf (megaCfg, "  Cmd Sequence = 0x%02xn", mbox->cmdid);
  1222. proc_printf (megaCfg, "  No of Sectors= %04dn", mbox->numsectors);
  1223. proc_printf (megaCfg, "  LBA          = 0x%02xn", mbox->lba);
  1224. proc_printf (megaCfg, "  DTA          = 0x%08xn", mbox->xferaddr);
  1225. proc_printf (megaCfg, "  Logical Drive= 0x%02xn", mbox->logdrv);
  1226. proc_printf (megaCfg, "  No of SG Elmt= 0x%02xn", mbox->numsgelements);
  1227. proc_printf (megaCfg, "  Busy         = %01xn", mbox->busy);
  1228. proc_printf (megaCfg, "  Status       = 0x%02xn", mbox->status);
  1229. /* proc_printf(megaCfg, "Dump of MailBoxn");
  1230. for (i = 0; i < 16; i++)
  1231.          proc_printf(megaCfg, "%02x ",*(mbox + i));
  1232. proc_printf(megaCfg, "nnNumber of Status = %02dn",mbox->numstatus);
  1233. for (i = 0; i < 46; i++) {
  1234.          proc_printf(megaCfg,"%02d ",*(mbox + 16 + i));
  1235.         if (i%16)
  1236.                 proc_printf(megaCfg,"n");
  1237. }
  1238. if (!mbox->numsgelements) {
  1239.         dta = phys_to_virt(mbox->xferaddr);
  1240.         for (i = 0; i < mbox->numsgelements; i++)
  1241.                 if (dta) {
  1242.                         proc_printf(megaCfg,"Addr = %08xn", (ulong)*(dta + i));                        proc_printf(megaCfg,"Length = %08xn",
  1243.                                 (ulong)*(dta + i + 4));
  1244.                 }
  1245. }*/
  1246. COPY_BACK;
  1247. return count;
  1248. }
  1249. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0) /*0x20300 */
  1250. #define CREATE_READ_PROC(string, fxn) create_proc_read_entry(string, 
  1251.                                          S_IRUSR | S_IFREG,
  1252.                                          controller_proc_dir_entry,
  1253.                                          fxn, megaCfg)
  1254. #else
  1255. #define CREATE_READ_PROC(string, fxn) create_proc_read_entry(string,S_IRUSR | S_IFREG, controller_proc_dir_entry, fxn, megaCfg)
  1256. static struct proc_dir_entry *
  1257. create_proc_read_entry (const char *string,
  1258. int mode,
  1259. struct proc_dir_entry *parent,
  1260. read_proc_t * fxn, mega_host_config * megaCfg)
  1261. {
  1262. struct proc_dir_entry *temp = NULL;
  1263. temp = kmalloc (sizeof (struct proc_dir_entry), GFP_KERNEL);
  1264. if (!temp)
  1265. return NULL;
  1266. memset (temp, 0, sizeof (struct proc_dir_entry));
  1267. if ((temp->name = kmalloc (strlen (string) + 1, GFP_KERNEL)) == NULL) {
  1268. kfree (temp);
  1269. return NULL;
  1270. }
  1271. strcpy ((char *) temp->name, string);
  1272. temp->namelen = strlen (string);
  1273. temp->mode = mode; /*S_IFREG | S_IRUSR */ ;
  1274. temp->data = (void *) megaCfg;
  1275. temp->read_proc = fxn;
  1276. proc_register (parent, temp);
  1277. return temp;
  1278. }
  1279. #endif
  1280. static void mega_create_proc_entry (int index, struct proc_dir_entry *parent)
  1281. {
  1282. u_char string[64] = { 0 };
  1283. mega_host_config *megaCfg = megaCtlrs[index];
  1284. struct proc_dir_entry *controller_proc_dir_entry = NULL;
  1285. sprintf (string, "%d", index);
  1286. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0) /*0x20300 */
  1287. controller_proc_dir_entry =
  1288.     megaCfg->controller_proc_dir_entry = proc_mkdir (string, parent);
  1289. #else
  1290. controller_proc_dir_entry =
  1291.     megaCfg->controller_proc_dir_entry =
  1292.     create_proc_entry (string, S_IFDIR | S_IRUGO | S_IXUGO, parent);
  1293. #endif
  1294. if (!controller_proc_dir_entry)
  1295. printk ("nmegaraid: proc_mkdir failedn");
  1296. else {
  1297. megaCfg->proc_read =
  1298.     CREATE_READ_PROC ("config", proc_read_config);
  1299. megaCfg->proc_status =
  1300.     CREATE_READ_PROC ("status", proc_read_status);
  1301. megaCfg->proc_stat = CREATE_READ_PROC ("stat", proc_read_stat);
  1302. megaCfg->proc_mbox =
  1303.     CREATE_READ_PROC ("mailbox", proc_read_mbox);
  1304. }
  1305. }
  1306. #endif /* CONFIG_PROC_FS */
  1307. /*-------------------------------------------------------------
  1308.  * Return the disk geometry for a particular disk
  1309.  * Input:
  1310.  *   Disk *disk - Disk geometry
  1311.  *   kdev_t dev - Device node
  1312.  *   int *geom  - Returns geometry fields
  1313.  *     geom[0] = heads
  1314.  *     geom[1] = sectors
  1315.  *     geom[2] = cylinders
  1316.  *-------------------------------------------------------------*/
  1317. int megaraid_biosparam (Disk * disk, kdev_t dev, int *geom)
  1318. {
  1319. int heads, sectors, cylinders;
  1320. mega_host_config *megaCfg;
  1321. /* Get pointer to host config structure */
  1322. megaCfg = (mega_host_config *) disk->device->host->hostdata;
  1323. if( IS_RAID_CH(disk->device->channel)) {
  1324. /* Default heads (64) & sectors (32) */
  1325. heads = 64;
  1326. sectors = 32;
  1327. cylinders = disk->capacity / (heads * sectors);
  1328. /* Handle extended translation size for logical drives > 1Gb */
  1329. if (disk->capacity >= 0x200000) {
  1330. heads = 255;
  1331. sectors = 63;
  1332. cylinders = disk->capacity / (heads * sectors);
  1333. }
  1334. /* return result */
  1335. geom[0] = heads;
  1336. geom[1] = sectors;
  1337. geom[2] = cylinders;
  1338. }
  1339. else {
  1340. if( mega_partsize(disk, dev, geom) == 0 ) return 0;
  1341. printk(KERN_WARNING
  1342. "megaraid: invalid partition on this disk on channel %dn",
  1343. disk->device->channel);
  1344. /* Default heads (64) & sectors (32) */
  1345. heads = 64;
  1346. sectors = 32;
  1347. cylinders = disk->capacity / (heads * sectors);
  1348. /* Handle extended translation size for logical drives > 1Gb */
  1349. if (disk->capacity >= 0x200000) {
  1350. heads = 255;
  1351. sectors = 63;
  1352. cylinders = disk->capacity / (heads * sectors);
  1353. }
  1354. /* return result */
  1355. geom[0] = heads;
  1356. geom[1] = sectors;
  1357. geom[2] = cylinders;
  1358. }
  1359. return 0;
  1360. }
  1361. /*
  1362.  * Function : static int mega_partsize(Disk * disk, kdev_t dev, int *geom)
  1363.  *
  1364.  * Purpose : to determine the BIOS mapping used to create the partition
  1365.  * table, storing the results (cyls, hds, and secs) in geom
  1366.  *
  1367.  * Note: Code is picked from scsicam.h
  1368.  *
  1369.  * Returns : -1 on failure, 0 on success.
  1370.  */
  1371. static int
  1372. mega_partsize(Disk * disk, kdev_t dev, int *geom)
  1373. {
  1374. struct buffer_head *bh;
  1375. struct partition *p, *largest = NULL;
  1376. int i, largest_cyl;
  1377. int heads, cyls, sectors;
  1378. int capacity = disk->capacity;
  1379. if(!(bh = bread(MKDEV(MAJOR(dev), MINOR(dev)&~0xf), 0, block_size(dev))))
  1380. return -1;
  1381. if( *(unsigned short *)(bh->b_data + 510) == 0xAA55 ) {
  1382. for( largest_cyl = -1, p = (struct partition *)(0x1BE + bh->b_data),
  1383. i = 0; i < 4; ++i, ++p) {
  1384. if (!p->sys_ind) continue;
  1385. cyls = p->end_cyl + ((p->end_sector & 0xc0) << 2);
  1386. if(cyls >= largest_cyl) {
  1387. largest_cyl = cyls;
  1388. largest = p;
  1389. }
  1390. }
  1391. }
  1392. if (largest) {
  1393. heads = largest->end_head + 1;
  1394. sectors = largest->end_sector & 0x3f;
  1395. if (heads == 0 || sectors == 0) {
  1396. brelse(bh);
  1397. return -1;
  1398. }
  1399. cyls = capacity/(heads * sectors);
  1400. geom[0] = heads;
  1401. geom[1] = sectors;
  1402. geom[2] = cyls;
  1403. brelse(bh);
  1404. return 0;
  1405. }
  1406. brelse(bh);
  1407. return -1;
  1408. }
  1409. /*
  1410.  * This routine will be called when the use has done a forced shutdown on the
  1411.  * system. Flush the Adapter cache, that's the most we can do.
  1412.  */
  1413. static int megaraid_reboot_notify (struct notifier_block *this, unsigned long code,
  1414. void *unused)
  1415. {
  1416. struct Scsi_Host *pSHost;
  1417. mega_host_config *megaCfg;
  1418. mega_mailbox *mbox;
  1419. u_char mboxData[16];
  1420. int i;
  1421. if (code == SYS_DOWN || code == SYS_HALT) {
  1422. for (i = 0; i < numCtlrs; i++) {
  1423. pSHost = megaCtlrs[i]->host;
  1424. megaCfg = (mega_host_config *) pSHost->hostdata;
  1425. mbox = (mega_mailbox *) mboxData;
  1426. /* Flush cache to disk */
  1427. memset (mbox, 0, 16);
  1428. mboxData[0] = 0xA;
  1429. /*
  1430.  * Free irq, otherwise extra interrupt is generated
  1431.  */
  1432. free_irq (megaCfg->host->irq, megaCfg);
  1433. /*
  1434.    * Issue a blocking (interrupts disabled) command to
  1435.    * the card
  1436.  */
  1437. megaIssueCmd (megaCfg, mboxData, NULL, 0);
  1438. }
  1439. }
  1440. return NOTIFY_DONE;
  1441. }
  1442. static int mega_init_scb (mega_host_config * megacfg)
  1443. {
  1444. int idx;
  1445. #if DEBUG
  1446. if (megacfg->max_cmds >= MAX_COMMANDS) {
  1447. printk ("megaraid:ctlr max cmds = %x : MAX_CMDS = %x",
  1448. megacfg->max_cmds, MAX_COMMANDS);
  1449. }
  1450. #endif
  1451. for (idx = megacfg->max_cmds - 1; idx >= 0; idx--) {
  1452. megacfg->scbList[idx].idx = idx;
  1453. /*
  1454.  * ISR will make this flag zero to indicate the command has been
  1455.  * completed. This is only for user ioctl calls. Rest of the driver
  1456.  * and the mid-layer operations are not connected with this flag.
  1457.  */
  1458. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1459. megacfg->scbList[idx].sgList =
  1460.     pci_alloc_consistent (megacfg->dev,
  1461.   sizeof (mega_64sglist) * MAX_SGLIST,
  1462.   &(megacfg->scbList[idx].
  1463.     dma_sghandle64));
  1464. megacfg->scbList[idx].sg64List =
  1465.     (mega_64sglist *) megacfg->scbList[idx].sgList;
  1466. #else
  1467. megacfg->scbList[idx].sgList = kmalloc (sizeof (mega_sglist) * MAX_SGLIST, GFP_ATOMIC | GFP_DMA);
  1468. #endif
  1469. if (megacfg->scbList[idx].sgList == NULL) {
  1470. printk (KERN_WARNING
  1471. "Can't allocate sglist for id %dn", idx);
  1472. mega_freeSgList (megacfg);
  1473. return -1;
  1474. }
  1475. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1476. megacfg->scbList[idx].pthru = pci_alloc_consistent (megacfg->dev,
  1477.   sizeof (mega_passthru),
  1478.   &(megacfg->scbList[idx].
  1479.     dma_passthruhandle64));
  1480. if (megacfg->scbList[idx].pthru == NULL) {
  1481. printk (KERN_WARNING
  1482. "Can't allocate passthru for id %dn", idx);
  1483. }
  1484. megacfg->scbList[idx].epthru =
  1485. pci_alloc_consistent(
  1486. megacfg->dev, sizeof(mega_ext_passthru),
  1487. &(megacfg->scbList[idx].dma_ext_passthruhandle64)
  1488. );
  1489. if (megacfg->scbList[idx].epthru == NULL) {
  1490. printk (KERN_WARNING
  1491. "Can't allocate extended passthru for id %dn", idx);
  1492. }
  1493. /* 
  1494.  * Allocate a 256 Byte Bounce Buffer for handling INQ/RD_CAPA 
  1495.  */
  1496. megacfg->scbList[idx].bounce_buffer = pci_alloc_consistent (megacfg->dev,
  1497.   256,
  1498.   &(megacfg->scbList[idx].
  1499.     dma_bounce_buffer));
  1500. if (!megacfg->scbList[idx].bounce_buffer)
  1501. printk
  1502.     ("megaraid: allocation for bounce buffer failedn");
  1503. megacfg->scbList[idx].dma_type = M_RD_DMA_TYPE_NONE;
  1504. #endif
  1505. if (idx < MAX_COMMANDS) {
  1506. /*
  1507.  * Link to free list
  1508.  * lock not required since we are loading the driver, so no
  1509.  * commands possible right now.
  1510.  */
  1511. enq_scb_freelist (megacfg, &megacfg->scbList[idx],
  1512.   NO_LOCK, INTR_ENB);
  1513. }
  1514. }
  1515. return 0;
  1516. }
  1517. /*
  1518.  * Enqueues a SCB
  1519.  */
  1520. static void enq_scb_freelist (mega_host_config * megacfg, mega_scb * scb, int lock,
  1521.   int intr)
  1522. {
  1523. if (lock == INTERNAL_LOCK || intr == INTR_DIS) {
  1524. if (intr == INTR_DIS)
  1525. spin_lock_irq (&megacfg->lock_free);
  1526. else
  1527. spin_lock (&megacfg->lock_free);
  1528. }
  1529. scb->state = SCB_FREE;
  1530. scb->SCpnt = NULL;
  1531. if (megacfg->qFreeH == (mega_scb *) NULL) {
  1532. megacfg->qFreeH = megacfg->qFreeT = scb;
  1533. } else {
  1534. megacfg->qFreeT->next = scb;
  1535. megacfg->qFreeT = scb;
  1536. }
  1537. megacfg->qFreeT->next = NULL;
  1538. megacfg->qFcnt++;
  1539. if (lock == INTERNAL_LOCK || intr == INTR_DIS) {
  1540. if (intr == INTR_DIS)
  1541. spin_unlock_irq (&megacfg->lock_free);
  1542. else
  1543. spin_unlock (&megacfg->lock_free);
  1544. }
  1545. }
  1546. /*
  1547.  * Routines for the character/ioctl interface to the driver
  1548.  */
  1549. static int megadev_open (struct inode *inode, struct file *filep)
  1550. {
  1551. MOD_INC_USE_COUNT;
  1552. return 0; /* success */
  1553. }
  1554. static int megadev_ioctl_entry (struct inode *inode, struct file *filep,
  1555.      unsigned int cmd, unsigned long arg)
  1556. {
  1557. int ret = -1;
  1558. /*
  1559.  * We do not allow parallel ioctls to the driver as of now.
  1560.  */
  1561. down (&mimd_entry_mtx);
  1562. ret = megadev_ioctl (inode, filep, cmd, arg);
  1563. up (&mimd_entry_mtx);
  1564. return ret;
  1565. }
  1566. static int megadev_ioctl (struct inode *inode, struct file *filep,
  1567.        unsigned int cmd, unsigned long arg)
  1568. {
  1569. int adapno;
  1570. kdev_t dev;
  1571. u32 inlen;
  1572. struct uioctl_t ioc;
  1573. char *kvaddr = NULL;
  1574. int nadap = numCtlrs;
  1575. u8 opcode;
  1576. u32 outlen;
  1577. int ret;
  1578. u8 subopcode;
  1579. Scsi_Cmnd *scsicmd;
  1580. struct Scsi_Host *shpnt;
  1581. char *uaddr;
  1582. struct uioctl_t *uioc;
  1583. dma_addr_t dma_addr;
  1584. u32 length;
  1585. mega_host_config *megacfg = NULL;
  1586. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /* 0x020400 */
  1587. struct pci_dev pdev;
  1588. struct pci_dev *pdevp = &pdev;
  1589. #else
  1590. char *pdevp = NULL;
  1591. #endif
  1592. IO_LOCK_T;
  1593. if (!inode || !(dev = inode->i_rdev))
  1594. return -EINVAL;
  1595. if (_IOC_TYPE (cmd) != MEGAIOC_MAGIC)
  1596. return (-EINVAL);
  1597. /*
  1598.  * Get the user ioctl structure
  1599.  */
  1600. ret = verify_area (VERIFY_WRITE, (char *) arg, sizeof (struct uioctl_t));
  1601. if (ret)
  1602. return ret;
  1603. if(copy_from_user (&ioc, (char *) arg, sizeof (struct uioctl_t)))
  1604. return -EFAULT;
  1605. /*
  1606.  * The first call the applications should make is to find out the
  1607.  * number of controllers in the system. The next logical call should
  1608.  * be for getting the list of controllers in the system as detected
  1609.  * by the driver.
  1610.  */
  1611. /*
  1612.  * Get the opcode and subopcode for the commands
  1613.  */
  1614. opcode = ioc.ui.fcs.opcode;
  1615. subopcode = ioc.ui.fcs.subopcode;
  1616. switch (opcode) {
  1617. case M_RD_DRIVER_IOCTL_INTERFACE:
  1618. switch (subopcode) {
  1619. case MEGAIOC_QDRVRVER: /* Query driver version */
  1620. put_user (driver_ver, (u32 *) ioc.data);
  1621. return 0;
  1622. case MEGAIOC_QNADAP: /* Get # of adapters */
  1623. put_user (nadap, (int *) ioc.data);
  1624. return nadap;
  1625. case MEGAIOC_QADAPINFO: /* Get adapter information */
  1626. /*
  1627.  * which adapter?
  1628.  */
  1629. adapno = ioc.ui.fcs.adapno;
  1630. /*
  1631.  * The adapter numbers do not start with 0, at least in
  1632.  * the user space. This is just to make sure, 0 is not the
  1633.  * default value which will refer to adapter 1. So the
  1634.  * user needs to make use of macros MKADAP() and GETADAP()
  1635.  * (See megaraid.h) while making ioctl() call.
  1636.  */
  1637. adapno = GETADAP (adapno);
  1638. if (adapno >= numCtlrs)
  1639. return (-ENODEV);
  1640. ret = verify_area (VERIFY_WRITE,
  1641.    ioc.data,
  1642.    sizeof (struct mcontroller));
  1643. if (ret)
  1644. return ret;
  1645. /*
  1646.  * Copy struct mcontroller to user area
  1647.  */
  1648. copy_to_user (ioc.data,
  1649.       mcontroller + adapno,
  1650.       sizeof (struct mcontroller));
  1651. return 0;
  1652. default:
  1653. return (-EINVAL);
  1654. } /* inner switch */
  1655. break;
  1656. case M_RD_IOCTL_CMD_NEW:
  1657. /*
  1658.  * Deletion of logical drives is only handled in 0x80 commands
  1659.  */
  1660. if( ioc.mbox[0] == FC_DEL_LOGDRV && ioc.mbox[2] == OP_DEL_LOGDRV ) {
  1661. return -EINVAL;
  1662. }
  1663. /* which adapter?  */
  1664. adapno = ioc.ui.fcs.adapno;
  1665. /* See comment above: MEGAIOC_QADAPINFO */
  1666. adapno = GETADAP(adapno);
  1667. if (adapno >= numCtlrs)
  1668. return(-ENODEV);
  1669. length = ioc.ui.fcs.length;
  1670. /* Check for zero length buffer or very large buffers */
  1671. if( !length || length > 32*1024 )
  1672. return -EINVAL;
  1673. /* save the user address */
  1674. uaddr = ioc.ui.fcs.buffer;
  1675. /*
  1676.  * For M_RD_IOCTL_CMD_NEW commands, the fields outlen and inlen of
  1677.  * uioctl_t structure are treated as flags. If outlen is 1, the
  1678.  * data is transferred from the device and if inlen is 1, the data
  1679.  * is transferred to the device.
  1680.  */
  1681. outlen = ioc.outlen;
  1682. inlen = ioc.inlen;
  1683. if(outlen) {
  1684. ret = verify_area(VERIFY_WRITE, (char *)ioc.ui.fcs.buffer, length);
  1685. if (ret) return ret;
  1686. }
  1687. if(inlen) {
  1688. ret = verify_area(VERIFY_READ, (char *) ioc.ui.fcs.buffer, length);
  1689. if (ret) return ret;
  1690. }
  1691. /*
  1692.  * Find this host
  1693.  */
  1694. for( shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next ) {
  1695. if( shpnt->hostdata == (unsigned long *)megaCtlrs[adapno] ) {
  1696. megacfg = (mega_host_config *)shpnt->hostdata;
  1697. break;
  1698. }
  1699. }
  1700. if(shpnt == NULL)  return -ENODEV;
  1701. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1702. scsicmd = (Scsi_Cmnd *)kmalloc(sizeof(Scsi_Cmnd), GFP_KERNEL|GFP_DMA);
  1703. #else
  1704. scsicmd = (Scsi_Cmnd *)scsi_init_malloc(sizeof(Scsi_Cmnd),
  1705.   GFP_ATOMIC | GFP_DMA);
  1706. #endif
  1707. if(scsicmd == NULL) return -ENOMEM;
  1708. memset(scsicmd, 0, sizeof(Scsi_Cmnd));
  1709. scsicmd->host = shpnt;
  1710. if( outlen || inlen ) {
  1711. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1712. pdevp = &pdev;
  1713. memcpy(pdevp, megacfg->dev, sizeof(struct pci_dev));
  1714. pdevp->dma_mask = 0xffffffff;
  1715. #else
  1716. pdevp = NULL;
  1717. #endif
  1718. kvaddr = dma_alloc_consistent(pdevp, length, &dma_addr);
  1719. if( kvaddr == NULL ) {
  1720. printk(KERN_WARNING "megaraid:allocation failedn");
  1721. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /*0x20400 */
  1722. kfree(scsicmd);
  1723. #else
  1724. scsi_init_free((char *)scsicmd, sizeof(Scsi_Cmnd));
  1725. #endif
  1726. return -ENOMEM;
  1727. }
  1728. ioc.ui.fcs.buffer = kvaddr;
  1729. if (inlen) {
  1730. /* copyin the user data */
  1731. copy_from_user(kvaddr, (char *)uaddr, length );
  1732. }
  1733. }
  1734. scsicmd->cmnd[0] = MEGADEVIOC;
  1735. scsicmd->request_buffer = (void *)&ioc;
  1736. init_MUTEX_LOCKED(&mimd_ioctl_sem);
  1737. IO_LOCK;
  1738. megaraid_queue(scsicmd, megadev_ioctl_done);
  1739. IO_UNLOCK;
  1740. down(&mimd_ioctl_sem);
  1741. if( !scsicmd->result && outlen ) {
  1742. copy_to_user(uaddr, kvaddr, length);
  1743. }
  1744. /*
  1745.  * copyout the result
  1746.  */
  1747. uioc = (struct uioctl_t *)arg;
  1748. if( ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU ) {
  1749. put_user( scsicmd->result, &uioc->pthru.scsistatus );
  1750. } else {
  1751. put_user(1, &uioc->mbox[16]); /* numstatus */
  1752. /* status */
  1753. put_user (scsicmd->result, &uioc->mbox[17]);
  1754. }
  1755. if (kvaddr) {
  1756. dma_free_consistent(pdevp, length, kvaddr, dma_addr);
  1757. }
  1758. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /*0x20400 */
  1759. kfree (scsicmd);
  1760. #else
  1761. scsi_init_free((char *)scsicmd, sizeof(Scsi_Cmnd));
  1762. #endif
  1763. /* restore the user address */
  1764. ioc.ui.fcs.buffer = uaddr;
  1765. return ret;
  1766. case M_RD_IOCTL_CMD:
  1767. /* which adapter?  */
  1768. adapno = ioc.ui.fcs.adapno;
  1769. /* See comment above: MEGAIOC_QADAPINFO */
  1770. adapno = GETADAP (adapno);
  1771. if (adapno >= numCtlrs)
  1772. return (-ENODEV);
  1773. /* save the user address */
  1774. uaddr = ioc.data;
  1775. outlen = ioc.outlen;
  1776. inlen = ioc.inlen;
  1777. if ((outlen >= IOCTL_MAX_DATALEN) || (inlen >= IOCTL_MAX_DATALEN))
  1778. return (-EINVAL);
  1779. if (outlen) {
  1780. ret = verify_area (VERIFY_WRITE, ioc.data, outlen);
  1781. if (ret) return ret;
  1782. }
  1783. if (inlen) {
  1784. ret = verify_area (VERIFY_READ, ioc.data, inlen);
  1785. if (ret) return ret;
  1786. }
  1787. /*
  1788.  * Find this host
  1789.  */
  1790. for( shpnt = scsi_hostlist; shpnt; shpnt = shpnt->next ) {
  1791. if( shpnt->hostdata == (unsigned long *)megaCtlrs[adapno] ) {
  1792. megacfg = (mega_host_config *)shpnt->hostdata;
  1793. break;
  1794. }
  1795. }
  1796. if(shpnt == NULL)  return -ENODEV;
  1797. /*
  1798.  * ioctls for deleting logical drives is a special case, so check
  1799.  * for it first
  1800.  */
  1801. if( ioc.mbox[0] == FC_DEL_LOGDRV && ioc.mbox[2] == OP_DEL_LOGDRV ) {
  1802. if( !megacfg->support_random_del ) {
  1803. printk("megaraid: logdrv delete on non supporting f/w.n");
  1804. return -EINVAL;
  1805. }
  1806. uioc = (struct uioctl_t *)arg;
  1807. ret = mega_del_logdrv(megacfg, ioc.mbox[3]);
  1808. put_user(1, &uioc->mbox[16]); /* numstatus */
  1809. put_user(ret, &uioc->mbox[17]); /* status */
  1810. /* if deletion failed, let the user know by failing ioctl */
  1811. return ret;
  1812. }
  1813. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1814. scsicmd = (Scsi_Cmnd *)kmalloc(sizeof(Scsi_Cmnd), GFP_KERNEL|GFP_DMA);
  1815. #else
  1816. scsicmd = (Scsi_Cmnd *)scsi_init_malloc(sizeof(Scsi_Cmnd),
  1817.   GFP_ATOMIC | GFP_DMA);
  1818. #endif
  1819. if(scsicmd == NULL) return -ENOMEM;
  1820. memset(scsicmd, 0, sizeof(Scsi_Cmnd));
  1821. scsicmd->host = shpnt;
  1822. if (outlen || inlen) {
  1823. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1824. pdevp = &pdev;
  1825. memcpy(pdevp, megacfg->dev, sizeof(struct pci_dev));
  1826. pdevp->dma_mask = 0xffffffff;
  1827. #else
  1828. pdevp = NULL;
  1829. #endif
  1830. /*
  1831.  * Allocate a page of kernel space.
  1832.  */
  1833. kvaddr = dma_alloc_consistent(pdevp, PAGE_SIZE, &dma_addr);
  1834. if( kvaddr == NULL ) {
  1835. printk (KERN_WARNING "megaraid:allocation failedn");
  1836. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) /*0x20400 */
  1837. kfree(scsicmd);
  1838. #else
  1839. scsi_init_free((char *)scsicmd, sizeof(Scsi_Cmnd));
  1840. #endif
  1841. return -ENOMEM;
  1842. }
  1843. ioc.data = kvaddr;
  1844. if (inlen) {
  1845. if (ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU) {
  1846. /* copyin the user data */
  1847. copy_from_user (kvaddr, uaddr, ioc.pthru.dataxferlen);
  1848. } else {
  1849. copy_from_user (kvaddr, uaddr, inlen);
  1850. }
  1851. }
  1852. }
  1853. scsicmd->cmnd[0] = MEGADEVIOC;
  1854. scsicmd->request_buffer = (void *) &ioc;
  1855. init_MUTEX_LOCKED (&mimd_ioctl_sem);
  1856. IO_LOCK;
  1857. megaraid_queue (scsicmd, megadev_ioctl_done);
  1858. IO_UNLOCK;
  1859. down (&mimd_ioctl_sem);
  1860. if (!scsicmd->result && outlen) {
  1861. if (ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU) {
  1862. copy_to_user (uaddr, kvaddr, ioc.pthru.dataxferlen);
  1863. } else {
  1864. copy_to_user (uaddr, kvaddr, outlen);
  1865. }
  1866. }
  1867. /*
  1868.  * copyout the result
  1869.  */
  1870. uioc = (struct uioctl_t *) arg;
  1871. if (ioc.mbox[0] == MEGA_MBOXCMD_PASSTHRU) {
  1872. put_user (scsicmd->result, &uioc->pthru.scsistatus);
  1873. } else {
  1874. put_user (1, &uioc->mbox[16]); /* numstatus */
  1875. put_user (scsicmd->result, &uioc->mbox[17]); /* status */
  1876. }
  1877. if (kvaddr) {
  1878. dma_free_consistent(pdevp, PAGE_SIZE, kvaddr, dma_addr );
  1879. }
  1880. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1881. kfree (scsicmd);
  1882. #else
  1883. scsi_init_free((char *)scsicmd, sizeof(Scsi_Cmnd));
  1884. #endif
  1885. /* restore user pointer */
  1886. ioc.data = uaddr;
  1887. return ret;
  1888. default:
  1889. return (-EINVAL);
  1890. }/* Outer switch */
  1891. return 0;
  1892. }
  1893. static void
  1894. megadev_ioctl_done(Scsi_Cmnd *sc)
  1895. {
  1896. up (&mimd_ioctl_sem);
  1897. }
  1898. static mega_scb *
  1899. megadev_doioctl (mega_host_config * megacfg, Scsi_Cmnd * sc)
  1900. {
  1901. u8 cmd;
  1902. struct uioctl_t *ioc = NULL;
  1903. mega_mailbox *mbox = NULL;
  1904. mega_ioctl_mbox *mboxioc = NULL;
  1905. struct mbox_passthru *mboxpthru = NULL;
  1906. mega_scb *scb = NULL;
  1907. mega_passthru *pthru = NULL;
  1908. if ((scb = mega_allocateSCB (megacfg, sc)) == NULL) {
  1909. sc->result = (DID_ERROR << 16);
  1910. callDone (sc);
  1911. return NULL;
  1912. }
  1913. ioc = (struct uioctl_t *) sc->request_buffer;
  1914. memcpy (scb->mboxData, ioc->mbox, sizeof (scb->mboxData));
  1915. /* The generic mailbox */
  1916. mbox = (mega_mailbox *) ioc->mbox;
  1917. /*
  1918.  * Get the user command
  1919.  */
  1920. cmd = ioc->mbox[0];
  1921. switch (cmd) {
  1922. case MEGA_MBOXCMD_PASSTHRU:
  1923. /*
  1924.    * prepare the SCB with information from the user ioctl structure
  1925.  */
  1926. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1927. pthru = scb->pthru;
  1928. #else
  1929. pthru = &scb->pthru;
  1930. #endif
  1931. memcpy (pthru, &ioc->pthru, sizeof (mega_passthru));
  1932. mboxpthru = (struct mbox_passthru *) scb->mboxData;
  1933. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  1934. if (megacfg->flag & BOARD_64BIT) {
  1935. /* This is just a sample with one element 
  1936.    * This if executes onlu on 2.4 kernels
  1937.  */
  1938. mboxpthru->dataxferaddr = scb->dma_passthruhandle64;
  1939. scb->sg64List[0].address =
  1940.     pci_map_single (megacfg->dev,
  1941.     ioc->data,
  1942.     4096, PCI_DMA_BIDIRECTIONAL);
  1943. scb->sg64List[0].length = 4096; // TODO: Check this
  1944. pthru->dataxferaddr = scb->dma_sghandle64;
  1945. pthru->numsgelements = 1;
  1946. mboxpthru->cmd = 0xC3;
  1947. } else {
  1948. mboxpthru->dataxferaddr = scb->dma_passthruhandle64;
  1949. pthru->dataxferaddr =
  1950.     pci_map_single (megacfg->dev,
  1951.     ioc->data,
  1952.     4096, PCI_DMA_BIDIRECTIONAL);
  1953. pthru->numsgelements = 0;
  1954. }
  1955. #else
  1956. {
  1957. mboxpthru->dataxferaddr = virt_to_bus (&scb->pthru);
  1958. pthru->dataxferaddr = virt_to_bus (ioc->data);
  1959. pthru->numsgelements = 0;
  1960. }
  1961. #endif
  1962. pthru->reqsenselen = 14;
  1963. break;
  1964. default: /* Normal command */
  1965. mboxioc = (mega_ioctl_mbox *) scb->mboxData;
  1966. if (ioc->ui.fcs.opcode == M_RD_IOCTL_CMD_NEW) {
  1967. scb->buff_ptr = ioc->ui.fcs.buffer;
  1968. scb->iDataSize = ioc->ui.fcs.length;
  1969. } else {
  1970. scb->buff_ptr = ioc->data;
  1971. scb->iDataSize = 4096; // TODO:check it
  1972. }
  1973. set_mbox_xfer_addr (megacfg, scb, mboxioc, FROMTO_DEVICE);
  1974. mboxioc->numsgelements = 0;
  1975. break;
  1976. }
  1977. return scb;
  1978. }
  1979. static int
  1980. megadev_close (struct inode *inode, struct file *filep)
  1981. {
  1982. #ifdef MODULE
  1983. MOD_DEC_USE_COUNT;
  1984. #endif
  1985. return 0;
  1986. }
  1987. static int
  1988. mega_support_ext_cdb(mega_host_config *this_hba)
  1989. {
  1990. mega_mailbox *mboxpnt;
  1991. unsigned char mbox[16];
  1992. int ret;
  1993. mboxpnt = (mega_mailbox *) mbox;
  1994. memset(mbox, 0, sizeof (mbox));
  1995. /*
  1996.  * issue command to find out if controller supports extended CDBs.
  1997.  */
  1998. mbox[0] = 0xA4;
  1999. mbox[2] = 0x16;
  2000. ret = megaIssueCmd(this_hba, mbox, NULL, 0);
  2001. return !ret;
  2002. }
  2003. /*
  2004.  * Find out if this controller supports random deletion and addition of
  2005.  * logical drives
  2006.  */
  2007. static int
  2008. mega_support_random_del(mega_host_config *this_hba)
  2009. {
  2010. mega_mailbox *mboxpnt;
  2011. unsigned char mbox[16];
  2012. int ret;
  2013. mboxpnt = (mega_mailbox *)mbox;
  2014. memset(mbox, 0, sizeof(mbox));
  2015. /*
  2016.  * issue command
  2017.  */
  2018. mbox[0] = FC_DEL_LOGDRV;
  2019. mbox[2] = OP_SUP_DEL_LOGDRV;
  2020. ret = megaIssueCmd(this_hba, mbox, NULL, 0);
  2021. return !ret;
  2022. }
  2023. static int
  2024. mega_del_logdrv(mega_host_config *this_hba, int logdrv)
  2025. {
  2026. int rval;
  2027. IO_LOCK_T;
  2028. DECLARE_WAIT_QUEUE_HEAD(wq);
  2029. mega_scb *scbp;
  2030. /*
  2031.  * Stop sending commands to the controller, queue them internally.
  2032.  * When deletion is complete, ISR will flush the queue.
  2033.  */
  2034. IO_LOCK;
  2035. this_hba->quiescent = 1;
  2036. IO_UNLOCK;
  2037. while( this_hba->qPcnt ) {
  2038. sleep_on_timeout( &wq, 1*HZ ); /* sleep for 1s */
  2039. }
  2040. rval = mega_do_del_logdrv(this_hba, logdrv);
  2041. IO_LOCK;
  2042. /*
  2043.  * Attach the internal queue to the pending queue
  2044.  */
  2045. if( this_hba->qPendingH == NULL ) {
  2046. /*
  2047.  * If pending queue head is null, make internal queue as
  2048.  * pending queue
  2049.  */
  2050. this_hba->qPendingH = this_hba->int_qh;
  2051. this_hba->qPendingT = this_hba->int_qt;
  2052. this_hba->qPcnt = this_hba->int_qlen;
  2053. }
  2054. else {
  2055. /*
  2056.  * Append pending queue to internal queue
  2057.  */
  2058. if( this_hba->int_qt ) {
  2059. this_hba->int_qt->next = this_hba->qPendingH;
  2060. this_hba->qPendingH = this_hba->int_qh;
  2061. this_hba->qPcnt += this_hba->int_qlen;
  2062. }
  2063. }
  2064. this_hba->int_qh = this_hba->int_qt = NULL;
  2065. this_hba->int_qlen = 0;
  2066. /*
  2067.  * If delete operation was successful, add 0x80 to the logical drive
  2068.  * ids for commands in the pending queue.
  2069.  */
  2070. if( this_hba->read_ldidmap) {
  2071. for( scbp = this_hba->qPendingH; scbp; scbp = scbp->next ) {
  2072. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  2073. if( scbp->pthru->logdrv < 0x80 )
  2074. scbp->pthru->logdrv += 0x80;
  2075. #else
  2076. if( scbp->pthru.logdrv < 0x80 )
  2077. scbp->pthru.logdrv += 0x80;
  2078. #endif
  2079. }
  2080. }
  2081. this_hba->quiescent = 0;
  2082. IO_UNLOCK;
  2083. return rval;
  2084. }
  2085. static int
  2086. mega_do_del_logdrv(mega_host_config *this_hba, int logdrv)
  2087. {
  2088. mega_mailbox *mboxpnt;
  2089. unsigned char mbox[16];
  2090. int rval;
  2091. mboxpnt = (mega_mailbox *)mbox;
  2092. memset(mbox, 0, sizeof(mbox));
  2093. mbox[0] = FC_DEL_LOGDRV;
  2094. mbox[2] = OP_DEL_LOGDRV;
  2095. mbox[3] = logdrv;
  2096. rval = megaIssueCmd(this_hba, mbox, NULL, 0);
  2097. /* log this event */
  2098. if( rval != 0 ) {
  2099. printk("megaraid: Attempt to delete logical drive %d failed.",
  2100. logdrv);
  2101. return rval;
  2102. }
  2103. printk("megaraid: logical drive %d deleted.n", logdrv);
  2104. /*
  2105.  * After deleting first logical drive, the logical drives must be
  2106.  * addressed by adding 0x80 to the logical drive id.
  2107.  */
  2108. this_hba->read_ldidmap = 1;
  2109. return rval;
  2110. }
  2111. #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
  2112. void *
  2113. dma_alloc_consistent(void *dev, size_t size, dma_addr_t *dma_addr)
  2114. {
  2115. void *_tv;
  2116. int npages;
  2117. int order = 0;
  2118. /*
  2119.  * How many pages application needs
  2120.  */
  2121. npages = size / PAGE_SIZE;
  2122. /* Do we need one more page */
  2123. if(size % PAGE_SIZE)
  2124. npages++;
  2125. order = mega_get_order(npages);
  2126. _tv = (void *)__get_free_pages(GFP_DMA, order);
  2127. if( _tv != NULL ) {
  2128. memset(_tv, 0, size);
  2129. *(dma_addr) = virt_to_bus(_tv);
  2130. }
  2131. return _tv;
  2132. }
  2133. /*
  2134.  * int mega_get_order(int)
  2135.  *
  2136.  * returns the order to be used as 2nd argument to __get_free_pages() - which
  2137.  * return pages equal to pow(2, order) - AM
  2138.  */
  2139. int
  2140. mega_get_order(int n)
  2141. {
  2142. int i = 0;
  2143. while( pow_2(i++) < n )
  2144. ; /* null statement */
  2145. return i-1;
  2146. }
  2147. /*
  2148.  * int pow_2(int)
  2149.  *
  2150.  * calculates pow(2, i)
  2151.  */
  2152. int
  2153. pow_2(int i)
  2154. {
  2155. unsigned int v = 1;
  2156. while(i--)
  2157. v <<= 1;
  2158. return v;
  2159. }
  2160. void
  2161. dma_free_consistent(void *dev, size_t size, void *vaddr, dma_addr_t dma_addr)
  2162. {
  2163. int npages;
  2164. int order = 0;
  2165. npages = size / PAGE_SIZE;
  2166. if(size % PAGE_SIZE)
  2167. npages++;
  2168. if (npages == 1)
  2169. order = 0;
  2170. else if (npages == 2)
  2171. order = 1;
  2172. else if (npages <= 4)
  2173. order = 2;
  2174. else
  2175. order = 3;
  2176. free_pages((unsigned long)vaddr, order);
  2177. }
  2178. #endif
  2179. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
  2180. static
  2181. #endif /* LINUX VERSION 2.4.XX */
  2182. #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) || defined(MODULE)
  2183. Scsi_Host_Template driver_template = MEGARAID;
  2184. #include "scsi_module.c"
  2185. #endif /* LINUX VERSION 2.4.XX || MODULE */
  2186. /* vi: set ts=4: */