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

嵌入式Linux

开发平台:

Unix_Linux

  1. /***************************************************************************
  2.                           dpti.c  -  description
  3.                              -------------------
  4.     begin                : Thu Sep 7 2000
  5.     copyright            : (C) 2000 by Adaptec
  6.     email                : deanna_bonds@adaptec.com
  7.         July 30, 2001 First version being submitted
  8.    for inclusion in the kernel.  V2.4
  9.     See README.dpti for history, notes, license info, and credits
  10.  ***************************************************************************/
  11. /***************************************************************************
  12.  *                                                                         *
  13.  *   This program is free software; you can redistribute it and/or modify  *
  14.  *   it under the terms of the GNU General Public License as published by  *
  15.  *   the Free Software Foundation; either version 2 of the License, or     *
  16.  *   (at your option) any later version.                                   *
  17.  *                                                                         *
  18.  ***************************************************************************/
  19. //#define DEBUG 1
  20. //#define UARTDELAY 1
  21. // On the real kernel ADDR32 should always be zero for 2.4. GFP_HIGH allocates
  22. // high pages. Keep the macro around because of the broken unmerged ia64 tree
  23. #define ADDR32 (0)
  24. #include <linux/version.h>
  25. #include <linux/module.h>
  26. MODULE_AUTHOR("Deanna Bonds, with _lots_ of help from Mark Salyzyn");
  27. MODULE_DESCRIPTION("Adaptec I2O RAID Driver");
  28. ////////////////////////////////////////////////////////////////
  29. #include <linux/ioctl.h> /* For SCSI-Passthrough */
  30. #include <asm/uaccess.h>
  31. #include <linux/stat.h>
  32. #include <linux/slab.h> /* for kmalloc() */
  33. #include <linux/config.h> /* for CONFIG_PCI */
  34. #include <linux/pci.h> /* for PCI support */
  35. #include <linux/proc_fs.h>
  36. #include <linux/blk.h>
  37. #include <linux/delay.h> /* for udelay */
  38. #include <linux/tqueue.h>
  39. #include <linux/interrupt.h>
  40. #include <linux/kernel.h> /* for printk */
  41. #include <linux/sched.h>
  42. #include <linux/reboot.h>
  43. #include <linux/smp_lock.h>
  44. #include <linux/timer.h>
  45. #include <linux/string.h>
  46. #include <linux/ioport.h>
  47. #include <linux/stat.h>
  48. #include <asm/processor.h> /* for boot_cpu_data */
  49. #include <asm/pgtable.h>
  50. #include <asm/io.h> /* for virt_to_bus, etc. */
  51. #include "scsi.h"
  52. #include "hosts.h"
  53. #include "sd.h"
  54. #include "dpt/dptsig.h"
  55. #include "dpti.h"
  56. /*============================================================================
  57.  * Create a binary signature - this is read by dptsig
  58.  * Needed for our management apps
  59.  *============================================================================
  60.  */
  61. static dpt_sig_S DPTI_sig = {
  62. {'d', 'P', 't', 'S', 'i', 'G'}, SIG_VERSION,
  63. #ifdef __i386__
  64. PROC_INTEL, PROC_386 | PROC_486 | PROC_PENTIUM | PROC_SEXIUM,
  65. #elif defined(__ia64__)
  66. PROC_INTEL, PROC_IA64,
  67. #elif defined(__sparc__)
  68. PROC_ULTRASPARC,
  69. #elif defined(__alpha__)
  70. PROC_ALPHA ,
  71. #else
  72. (-1),
  73. #endif
  74.  FT_HBADRVR, 0, OEM_DPT, OS_LINUX, CAP_OVERLAP, DEV_ALL,
  75. ADF_ALL_SC5, 0, 0, DPT_VERSION, DPT_REVISION, DPT_SUBREVISION,
  76. DPT_MONTH, DPT_DAY, DPT_YEAR, "Adaptec Linux I2O RAID Driver"
  77. };
  78. /*============================================================================
  79.  * Globals
  80.  *============================================================================
  81.  */
  82. DECLARE_MUTEX(adpt_configuration_lock);
  83. static struct i2o_sys_tbl *sys_tbl = NULL;
  84. static int sys_tbl_ind = 0;
  85. static int sys_tbl_len = 0;
  86. static adpt_hba* hbas[DPTI_MAX_HBA];
  87. static adpt_hba* hba_chain = NULL;
  88. static int hba_count = 0;
  89. // Debug flags to be put into the HBA flags field when initialized
  90. // Make sure to enable DEBUG_PRINT for these flags to work
  91. static unsigned long DebugFlags = HBA_FLAGS_DBG_SCAN_B | HBA_FLAGS_DBG_FLAGS_MASK;
  92. static struct file_operations adpt_fops = {
  93. ioctl: adpt_ioctl,
  94. open: adpt_open,
  95. release: adpt_close
  96. };
  97. #ifdef REBOOT_NOTIFIER
  98. static struct notifier_block adpt_reboot_notifier =
  99. {
  100.  adpt_reboot_event,
  101.  NULL,
  102.  0
  103. };
  104. #endif
  105. /* Structures and definitions for synchronous message posting.
  106.  * See adpt_i2o_post_wait() for description
  107.  * */
  108. struct adpt_i2o_post_wait_data
  109. {
  110. int status;
  111. u32 id;
  112. adpt_wait_queue_head_t *wq;
  113. struct adpt_i2o_post_wait_data *next;
  114. };
  115. static struct adpt_i2o_post_wait_data *adpt_post_wait_queue = NULL;
  116. static u32 adpt_post_wait_id = 0;
  117. static spinlock_t adpt_post_wait_lock = SPIN_LOCK_UNLOCKED;
  118. /*============================================================================
  119.  *  Functions
  120.  *============================================================================
  121.  */
  122. static u8 adpt_read_blink_led(adpt_hba* host)
  123. {
  124. if(host->FwDebugBLEDflag_P != 0) {
  125. if( readb(host->FwDebugBLEDflag_P) == 0xbc ){
  126. return readb(host->FwDebugBLEDvalue_P);
  127. }
  128. }
  129. return 0;
  130. }
  131. /*============================================================================
  132.  * Scsi host template interface functions
  133.  *============================================================================
  134.  */
  135. static struct pci_device_id dptids[] = {
  136. { PCI_DPT_VENDOR_ID, PCI_DPT_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
  137. { PCI_DPT_VENDOR_ID, PCI_DPT_RAPTOR_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
  138. { 0, }
  139. };
  140. MODULE_DEVICE_TABLE(pci,dptids);
  141. static int adpt_detect(Scsi_Host_Template* sht)
  142. {
  143. struct pci_dev *pDev = NULL;
  144. adpt_hba* pHba;
  145. adpt_init();
  146. sht->use_new_eh_code = 1;
  147. PINFO("Detecting Adaptec I2O RAID controllers...n");
  148.         /* search for all Adatpec I2O RAID cards */
  149. while ((pDev = pci_find_device( PCI_DPT_VENDOR_ID, PCI_ANY_ID, pDev))) {
  150. if(pDev->device == PCI_DPT_DEVICE_ID ||
  151.    pDev->device == PCI_DPT_RAPTOR_DEVICE_ID){
  152. if(adpt_install_hba(sht, pDev) ){
  153. PERROR("Could not Init an I2O RAID devicen");
  154. PERROR("Will not try to detect others.n");
  155. return hba_count-1;
  156. }
  157. }
  158. }
  159. /* In INIT state, Activate IOPs */
  160. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  161. // Activate does get status , init outbound, and get hrt
  162. if (adpt_i2o_activate_hba(pHba) < 0) {
  163. adpt_i2o_delete_hba(pHba);
  164. }
  165. }
  166. /* Active IOPs in HOLD state */
  167. rebuild_sys_tab:
  168. if (hba_chain == NULL) 
  169. return 0;
  170. /*
  171.  * If build_sys_table fails, we kill everything and bail
  172.  * as we can't init the IOPs w/o a system table
  173.  */
  174. if (adpt_i2o_build_sys_table() < 0) {
  175. adpt_i2o_sys_shutdown();
  176. return 0;
  177. }
  178. PDEBUG("HBA's in HOLD staten");
  179. /* If IOP don't get online, we need to rebuild the System table */
  180. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  181. if (adpt_i2o_online_hba(pHba) < 0) {
  182. adpt_i2o_delete_hba(pHba);
  183. goto rebuild_sys_tab;
  184. }
  185. }
  186. /* Active IOPs now in OPERATIONAL state */
  187. PDEBUG("HBA's in OPERATIONAL staten");
  188. printk(KERN_INFO"dpti: If you have a lot of devices this could take a few minutes.n");
  189. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  190. printk(KERN_INFO"%s: Reading the hardware resource table.n", pHba->name);
  191. if (adpt_i2o_lct_get(pHba) < 0){
  192. adpt_i2o_delete_hba(pHba);
  193. continue;
  194. }
  195. if (adpt_i2o_parse_lct(pHba) < 0){
  196. adpt_i2o_delete_hba(pHba);
  197. continue;
  198. }
  199. adpt_inquiry(pHba);
  200. }
  201. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  202. if( adpt_scsi_register(pHba,sht) < 0){
  203. adpt_i2o_delete_hba(pHba);
  204. continue;
  205. }
  206. pHba->initialized = TRUE;
  207. pHba->state &= ~DPTI_STATE_RESET;
  208. }
  209. // Register our control device node
  210. // nodes will need to be created in /dev to access this
  211. // the nodes can not be created from within the driver
  212. if (hba_count && register_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER, &adpt_fops)) {
  213. adpt_i2o_sys_shutdown();
  214. return 0;
  215. }
  216. return hba_count;
  217. }
  218. /*
  219.  * scsi_unregister will be called AFTER we return. 
  220.  */
  221. static int adpt_release(struct Scsi_Host *host)
  222. {
  223. adpt_hba* pHba = (adpt_hba*) host->hostdata[0];
  224. // adpt_i2o_quiesce_hba(pHba);
  225. adpt_i2o_delete_hba(pHba);
  226. return 0;
  227. }
  228. static void adpt_inquiry(adpt_hba* pHba)
  229. {
  230. u32 msg[14]; 
  231. u32 *mptr;
  232. u32 *lenptr;
  233. int direction;
  234. int scsidir;
  235. u32 len;
  236. u32 reqlen;
  237. u8* buf;
  238. u8  scb[16];
  239. s32 rcode;
  240. memset(msg, 0, sizeof(msg));
  241. buf = (u8*)kmalloc(80,GFP_KERNEL|ADDR32);
  242. if(!buf){
  243. printk(KERN_ERR"%s: Could not allocate buffern",pHba->name);
  244. return;
  245. }
  246. memset((void*)buf, 0, 36);
  247. len = 36;
  248. direction = 0x00000000;
  249. scsidir  =0x40000000; // DATA IN  (iop<--dev)
  250. reqlen = 14; // SINGLE SGE
  251. /* Stick the headers on */
  252. msg[0] = reqlen<<16 | SGL_OFFSET_12;
  253. msg[1] = (0xff<<24|HOST_TID<<12|ADAPTER_TID);
  254. msg[2] = 0;
  255. msg[3]  = 0;
  256. // Adaptec/DPT Private stuff 
  257. msg[4] = I2O_CMD_SCSI_EXEC|DPT_ORGANIZATION_ID<<16;
  258. msg[5] = ADAPTER_TID | 1<<16 /* Interpret*/;
  259. /* Direction, disconnect ok | sense data | simple queue , CDBLen */
  260. // I2O_SCB_FLAG_ENABLE_DISCONNECT | 
  261. // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG | 
  262. // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
  263. msg[6] = scsidir|0x20a00000| 6 /* cmd len*/;
  264. mptr=msg+7;
  265. memset(scb, 0, sizeof(scb));
  266. // Write SCSI command into the message - always 16 byte block 
  267. scb[0] = INQUIRY;
  268. scb[1] = 0;
  269. scb[2] = 0;
  270. scb[3] = 0;
  271. scb[4] = 36;
  272. scb[5] = 0;
  273. // Don't care about the rest of scb
  274. memcpy(mptr, scb, sizeof(scb));
  275. mptr+=4;
  276. lenptr=mptr++; /* Remember me - fill in when we know */
  277. /* Now fill in the SGList and command */
  278. *lenptr = len;
  279. *mptr++ = 0xD0000000|direction|len;
  280. *mptr++ = virt_to_bus(buf);
  281. // Send it on it's way
  282. rcode = adpt_i2o_post_wait(pHba, msg, reqlen<<2, 120);
  283. if (rcode != 0) {
  284. sprintf(pHba->detail, "Adaptec I2O RAID");
  285. printk(KERN_INFO "%s: Inquiry Error (%d)n",pHba->name,rcode);
  286. } else {
  287. memset(pHba->detail, 0, sizeof(pHba->detail));
  288. memcpy(&(pHba->detail), "Vendor: Adaptec ", 16);
  289. memcpy(&(pHba->detail[16]), " Model: ", 8);
  290. memcpy(&(pHba->detail[24]), (u8*) &buf[16], 16);
  291. memcpy(&(pHba->detail[40]), " FW: ", 4);
  292. memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4);
  293. pHba->detail[48] = ''; /* precautionary */
  294. }
  295. kfree(buf);
  296. adpt_i2o_status_get(pHba);
  297. return ;
  298. }
  299. static void adpt_select_queue_depths(struct Scsi_Host *host, Scsi_Device * devicelist)
  300. {
  301. Scsi_Device *device; /* scsi layer per device information */
  302. adpt_hba* pHba;
  303. pHba = (adpt_hba *) host->hostdata[0];
  304. for (device = devicelist; device != NULL; device = device->next) {
  305. if (device->host != host) {
  306. continue;
  307. }
  308. if (host->can_queue) {
  309. device->queue_depth =  host->can_queue - 1;
  310. } else {
  311. device->queue_depth = 1;
  312. }
  313. }
  314. }
  315. static int adpt_queue(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
  316. {
  317. adpt_hba* pHba = NULL;
  318. struct adpt_device* pDev = NULL; /* dpt per device information */
  319. ulong timeout = jiffies + (TMOUT_SCSI*HZ);
  320. cmd->scsi_done = done;
  321. /*
  322.  * SCSI REQUEST_SENSE commands will be executed automatically by the 
  323.  * Host Adapter for any errors, so they should not be executed 
  324.  * explicitly unless the Sense Data is zero indicating that no error 
  325.  * occurred.
  326.  */
  327. if ((cmd->cmnd[0] == REQUEST_SENSE) && (cmd->sense_buffer[0] != 0)) {
  328. cmd->result = (DID_OK << 16);
  329. cmd->scsi_done(cmd);
  330. return 0;
  331. }
  332. pHba = (adpt_hba*)cmd->host->hostdata[0];
  333. if (!pHba) {
  334. return FAILED;
  335. }
  336. rmb();
  337. /*
  338.  * TODO: I need to block here if I am processing ioctl cmds
  339.  * but if the outstanding cmds all finish before the ioctl,
  340.  * the scsi-core will not know to start sending cmds to me again.
  341.  * I need to a way to restart the scsi-cores queues or should I block
  342.  * calling scsi_done on the outstanding cmds instead
  343.  * for now we don't set the IOCTL state
  344.  */
  345. if(((pHba->state) & DPTI_STATE_IOCTL) || ((pHba->state) & DPTI_STATE_RESET)) {
  346. pHba->host->last_reset = jiffies;
  347. pHba->host->resetting = 1;
  348. return 1;
  349. }
  350. if(cmd->eh_state != SCSI_STATE_QUEUED){
  351. // If we are not doing error recovery
  352. mod_timer(&cmd->eh_timeout, timeout);
  353. }
  354. // TODO if the cmd->device if offline then I may need to issue a bus rescan
  355. // followed by a get_lct to see if the device is there anymore
  356. if((pDev = (struct adpt_device*) (cmd->device->hostdata)) == NULL) {
  357. /*
  358.  * First command request for this device.  Set up a pointer
  359.  * to the device structure.  This should be a TEST_UNIT_READY
  360.  * command from scan_scsis_single.
  361.  */
  362. if ((pDev = adpt_find_device(pHba, (u32)cmd->channel, (u32)cmd->target, (u32)cmd-> lun)) == NULL) {
  363. // TODO: if any luns are at this bus, scsi id then fake a TEST_UNIT_READY and INQUIRY response 
  364. // with type 7F (for all luns less than the max for this bus,id) so the lun scan will continue.
  365. cmd->result = (DID_NO_CONNECT << 16);
  366. cmd->scsi_done(cmd);
  367. return 0;
  368. }
  369. (struct adpt_device*)(cmd->device->hostdata) = pDev;
  370. }
  371. pDev->pScsi_dev = cmd->device;
  372. /*
  373.  * If we are being called from when the device is being reset, 
  374.  * delay processing of the command until later.
  375.  */
  376. if (pDev->state & DPTI_DEV_RESET ) {
  377. return FAILED;
  378. }
  379. return adpt_scsi_to_i2o(pHba, cmd, pDev);
  380. }
  381. static int adpt_bios_param(Disk* disk, kdev_t dev, int geom[])
  382. {
  383. int heads=-1;
  384. int sectors=-1;
  385. int cylinders=-1;
  386. // *** First lets set the default geometry ****
  387. // If the capacity is less than ox2000
  388. if (disk->capacity < 0x2000 ) { // floppy
  389. heads = 18;
  390. sectors = 2;
  391. // else if between 0x2000 and 0x20000
  392. else if (disk->capacity < 0x20000) {
  393. heads = 64;
  394. sectors = 32;
  395. }
  396. // else if between 0x20000 and 0x40000
  397. else if (disk->capacity < 0x40000) {
  398. heads = 65;
  399. sectors = 63;
  400. }
  401. // else if between 0x4000 and 0x80000
  402. else if (disk->capacity < 0x80000) {
  403. heads = 128;
  404. sectors = 63;
  405. }
  406. // else if greater than 0x80000
  407. else {
  408. heads = 255;
  409. sectors = 63;
  410. }
  411. cylinders = disk->capacity / (heads * sectors);
  412. // Special case if CDROM
  413. if(disk->device->type == 5) {  // CDROM
  414. heads = 252;
  415. sectors = 63;
  416. cylinders = 1111;
  417. }
  418. geom[0] = heads;
  419. geom[1] = sectors;
  420. geom[2] = cylinders;
  421. PDEBUG("adpt_bios_param: exitn");
  422. return 0;
  423. }
  424. static const char *adpt_info(struct Scsi_Host *host)
  425. {
  426. adpt_hba* pHba;
  427. pHba = (adpt_hba *) host->hostdata[0];
  428. return (char *) (pHba->detail);
  429. }
  430. static int adpt_proc_info(char *buffer, char **start, off_t offset,
  431.   int length, int hostno, int inout)
  432. {
  433. struct adpt_device* d;
  434. int id;
  435. int chan;
  436. int len = 0;
  437. int begin = 0;
  438. int pos = 0;
  439. adpt_hba* pHba;
  440. struct Scsi_Host *host;
  441. int unit;
  442. *start = buffer;
  443. if (inout == TRUE) {
  444. /*
  445.  * The user has done a write and wants us to take the
  446.  * data in the buffer and do something with it.
  447.  * proc_scsiwrite calls us with inout = 1
  448.  *
  449.  * Read data from buffer (writing to us) - NOT SUPPORTED
  450.  */
  451. return -EINVAL;
  452. }
  453. /*
  454.  * inout = 0 means the user has done a read and wants information
  455.  * returned, so we write information about the cards into the buffer
  456.  * proc_scsiread() calls us with inout = 0
  457.  */
  458. // Find HBA (host bus adapter) we are looking for
  459. down(&adpt_configuration_lock);
  460. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  461. if (pHba->host->host_no == hostno) {
  462. break; /* found adapter */
  463. }
  464. }
  465. up(&adpt_configuration_lock);
  466. if (pHba == NULL) {
  467. return 0;
  468. }
  469. host = pHba->host;
  470. len  = sprintf(buffer    , "Adaptec I2O RAID Driver Version: %snn", DPT_I2O_VERSION);
  471. len += sprintf(buffer+len, "%sn", pHba->detail);
  472. len += sprintf(buffer+len, "SCSI Host=scsi%d  Control Node=/dev/%s  irq=%dn", 
  473. pHba->host->host_no, pHba->name, host->irq);
  474. len += sprintf(buffer+len, "tpost fifo size  = %dntreply fifo size = %dntsg table size   = %dnn",
  475. host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize);
  476. pos = begin + len;
  477. /* CHECKPOINT */
  478. if(pos > offset + length) {
  479. goto stop_output;
  480. }
  481. if(pos <= offset) {
  482. /*
  483.  * If we haven't even written to where we last left
  484.  * off (the last time we were called), reset the 
  485.  * beginning pointer.
  486.  */
  487. len = 0;
  488. begin = pos;
  489. }
  490. len +=  sprintf(buffer+len, "Devices:n");
  491. for(chan = 0; chan < MAX_CHANNEL; chan++) {
  492. for(id = 0; id < MAX_ID; id++) {
  493. d = pHba->channel[chan].device[id];
  494. while(d){
  495. len += sprintf(buffer+len,"t%-24.24s", d->pScsi_dev->vendor);
  496. len += sprintf(buffer+len," Rev: %-8.8sn", d->pScsi_dev->rev);
  497. pos = begin + len;
  498. /* CHECKPOINT */
  499. if(pos > offset + length) {
  500. goto stop_output;
  501. }
  502. if(pos <= offset) {
  503. len = 0;
  504. begin = pos;
  505. }
  506. unit = d->pI2o_dev->lct_data.tid;
  507. len += sprintf(buffer+len, "tTID=%d, (Channel=%d, Target=%d, Lun=%d)  (%s)nn",
  508.        unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun,
  509.        d->pScsi_dev->online? "online":"offline"); 
  510. pos = begin + len;
  511. /* CHECKPOINT */
  512. if(pos > offset + length) {
  513. goto stop_output;
  514. }
  515. if(pos <= offset) {
  516. len = 0;
  517. begin = pos;
  518. }
  519. d = d->next_lun;
  520. }
  521. }
  522. }
  523. /*
  524.  * begin is where we last checked our position with regards to offset
  525.  * begin is always less than offset.  len is relative to begin.  It
  526.  * is the number of bytes written past begin
  527.  *
  528.  */
  529. stop_output:
  530. /* stop the output and calculate the correct length */
  531. *(buffer + len) = '';
  532. *start = buffer + (offset - begin); /* Start of wanted data */
  533. len -= (offset - begin);
  534. if(len > length) {
  535. len = length;
  536. } else if(len < 0){
  537. len = 0;
  538. **start = '';
  539. }
  540. return len;
  541. }
  542. /*===========================================================================
  543.  * Error Handling routines
  544.  *===========================================================================
  545.  */
  546. static int adpt_abort(Scsi_Cmnd * cmd)
  547. {
  548. adpt_hba* pHba = NULL; /* host bus adapter structure */
  549. struct adpt_device* dptdevice; /* dpt per device information */
  550. u32 msg[5];
  551. int rcode;
  552. if(cmd->serial_number == 0){
  553. return FAILED;
  554. }
  555. pHba = (adpt_hba*) cmd->host->hostdata[0];
  556. printk(KERN_INFO"%s: Trying to Abort cmd=%ldn",pHba->name, cmd->serial_number);
  557. if ((dptdevice = (void*) (cmd->device->hostdata)) == NULL) {
  558. printk(KERN_ERR "%s: Unable to abort: No device in cmndn",pHba->name);
  559. return FAILED;
  560. }
  561. memset(msg, 0, sizeof(msg));
  562. msg[0] = FIVE_WORD_MSG_SIZE|SGL_OFFSET_0;
  563. msg[1] = I2O_CMD_SCSI_ABORT<<24|HOST_TID<<12|dptdevice->tid;
  564. msg[2] = 0;
  565. msg[3]= 0; 
  566. msg[4] = (u32)cmd;
  567. if( (rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER)) != 0){
  568. if(rcode == -EOPNOTSUPP ){
  569. printk(KERN_INFO"%s: Abort cmd not supportedn",pHba->name);
  570. return FAILED;
  571. }
  572. printk(KERN_INFO"%s: Abort cmd=%ld failed.n",pHba->name, cmd->serial_number);
  573. return FAILED;
  574. printk(KERN_INFO"%s: Abort cmd=%ld complete.n",pHba->name, cmd->serial_number);
  575. return SUCCESS;
  576. }
  577. #define I2O_DEVICE_RESET 0x27
  578. // This is the same for BLK and SCSI devices
  579. // NOTE this is wrong in the i2o.h definitions
  580. // This is not currently supported by our adapter but we issue it anyway
  581. static int adpt_device_reset(Scsi_Cmnd* cmd)
  582. {
  583. adpt_hba* pHba;
  584. u32 msg[4];
  585. u32 rcode;
  586. int old_state;
  587. struct adpt_device* d = (void*) cmd->device->hostdata;
  588. pHba = (void*) cmd->host->hostdata[0];
  589. printk(KERN_INFO"%s: Trying to reset devicen",pHba->name);
  590. if (!d) {
  591. printk(KERN_INFO"%s: Reset Device: Device Not foundn",pHba->name);
  592. return FAILED;
  593. }
  594. memset(msg, 0, sizeof(msg));
  595. msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
  596. msg[1] = (I2O_DEVICE_RESET<<24|HOST_TID<<12|d->tid);
  597. msg[2] = 0;
  598. msg[3] = 0;
  599. old_state = d->state;
  600. d->state |= DPTI_DEV_RESET;
  601. if( (rcode = adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER)) ){
  602. d->state = old_state;
  603. if(rcode == -EOPNOTSUPP ){
  604. printk(KERN_INFO"%s: Device reset not supportedn",pHba->name);
  605. return FAILED;
  606. }
  607. printk(KERN_INFO"%s: Device reset failedn",pHba->name);
  608. return FAILED;
  609. } else {
  610. d->state = old_state;
  611. printk(KERN_INFO"%s: Device reset successfuln",pHba->name);
  612. return SUCCESS;
  613. }
  614. }
  615. #define I2O_HBA_BUS_RESET 0x87
  616. // This version of bus reset is called by the eh_error handler
  617. static int adpt_bus_reset(Scsi_Cmnd* cmd)
  618. {
  619. adpt_hba* pHba;
  620. u32 msg[4];
  621. pHba = (adpt_hba*)cmd->host->hostdata[0];
  622. memset(msg, 0, sizeof(msg));
  623. printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %dn",pHba->name, cmd->channel,pHba->channel[cmd->channel].tid );
  624. msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
  625. msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->channel].tid);
  626. msg[2] = 0;
  627. msg[3] = 0;
  628. if(adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER) ){
  629. printk(KERN_WARNING"%s: Bus reset failed.n",pHba->name);
  630. return FAILED;
  631. } else {
  632. printk(KERN_WARNING"%s: Bus reset success.n",pHba->name);
  633. return SUCCESS;
  634. }
  635. }
  636. // This version of reset is called by the eh_error_handler
  637. static int adpt_reset(Scsi_Cmnd* cmd)
  638. {
  639. adpt_hba* pHba;
  640. int rcode;
  641. pHba = (adpt_hba*)cmd->host->hostdata[0];
  642. printk(KERN_WARNING"%s: Hba Reset: scsi id %d: tid: %dn",pHba->name,cmd->channel,pHba->channel[cmd->channel].tid );
  643. rcode =  adpt_hba_reset(pHba);
  644. if(rcode == 0){
  645. printk(KERN_WARNING"%s: HBA reset completen",pHba->name);
  646. return SUCCESS;
  647. } else {
  648. printk(KERN_WARNING"%s: HBA reset failed (%x)n",pHba->name, rcode);
  649. return FAILED;
  650. }
  651. }
  652. // This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
  653. static int adpt_hba_reset(adpt_hba* pHba)
  654. {
  655. int rcode;
  656. pHba->state |= DPTI_STATE_RESET;
  657. // Activate does get status , init outbound, and get hrt
  658. if ((rcode=adpt_i2o_activate_hba(pHba)) < 0) {
  659. printk(KERN_ERR "%s: Could not activaten", pHba->name);
  660. adpt_i2o_delete_hba(pHba);
  661. return rcode;
  662. }
  663. if ((rcode=adpt_i2o_build_sys_table()) < 0) {
  664. adpt_i2o_delete_hba(pHba);
  665. return rcode;
  666. }
  667. PDEBUG("%s: in HOLD staten",pHba->name);
  668. if ((rcode=adpt_i2o_online_hba(pHba)) < 0) {
  669. adpt_i2o_delete_hba(pHba);
  670. return rcode;
  671. }
  672. PDEBUG("%s: in OPERATIONAL staten",pHba->name);
  673. if ((rcode=adpt_i2o_lct_get(pHba)) < 0){
  674. adpt_i2o_delete_hba(pHba);
  675. return rcode;
  676. }
  677. if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0){
  678. adpt_i2o_delete_hba(pHba);
  679. return rcode;
  680. }
  681. pHba->state &= ~DPTI_STATE_RESET;
  682. adpt_fail_posted_scbs(pHba);
  683. return 0; /* return success */
  684. }
  685. /*===========================================================================
  686.  * 
  687.  *===========================================================================
  688.  */
  689. static void adpt_i2o_sys_shutdown(void)
  690. {
  691. adpt_hba *pHba, *pNext;
  692. struct adpt_i2o_post_wait_data *p1, *p2;
  693.  printk(KERN_INFO"Shutting down Adaptec I2O controllers.n");
  694.  printk(KERN_INFO"   This could take a few minutes if there are many devices attachedn");
  695. /* Delete all IOPs from the controller chain */
  696. /* They should have already been released by the
  697.  * scsi-core
  698.  */
  699. for (pHba = hba_chain; pHba; pHba = pNext) {
  700. pNext = pHba->next;
  701. adpt_i2o_delete_hba(pHba);
  702. }
  703. /* Remove any timedout entries from the wait queue.  */
  704. p2 = NULL;
  705. // spin_lock_irqsave(&adpt_post_wait_lock, flags);
  706. /* Nothing should be outstanding at this point so just
  707.  * free them 
  708.  */
  709. for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p2->next) {
  710. kfree(p1);
  711. }
  712. // spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
  713. adpt_post_wait_queue = 0;
  714.  printk(KERN_INFO "Adaptec I2O controllers down.n");
  715. }
  716. /*
  717.  * reboot/shutdown notification.
  718.  *
  719.  * - Quiesce each IOP in the system
  720.  *
  721.  */
  722. #ifdef REBOOT_NOTIFIER
  723. static int adpt_reboot_event(struct notifier_block *n, ulong code, void *p)
  724. {
  725.  if(code != SYS_RESTART && code != SYS_HALT && code != SYS_POWER_OFF)
  726.   return NOTIFY_DONE;
  727.  adpt_i2o_sys_shutdown();
  728.  return NOTIFY_DONE;
  729. }
  730. #endif
  731. static int adpt_install_hba(Scsi_Host_Template* sht, struct pci_dev* pDev) 
  732. {
  733. adpt_hba* pHba = NULL;
  734. adpt_hba* p = NULL;
  735. ulong base_addr0_phys = 0;
  736. ulong base_addr1_phys = 0;
  737. u32 hba_map0_area_size = 0;
  738. u32 hba_map1_area_size = 0;
  739. ulong base_addr_virt = 0;
  740. ulong msg_addr_virt = 0;
  741. int raptorFlag = FALSE;
  742. int i;
  743. if(pci_enable_device(pDev)) {
  744. return -EINVAL;
  745. }
  746. pci_set_master(pDev);
  747. base_addr0_phys = pci_resource_start(pDev,0);
  748. hba_map0_area_size = pci_resource_len(pDev,0);
  749. // Check if standard PCI card or single BAR Raptor
  750. if(pDev->device == PCI_DPT_DEVICE_ID){
  751. if(pDev->subsystem_device >=0xc032 && pDev->subsystem_device <= 0xc03b){
  752. // Raptor card with this device id needs 4M
  753. hba_map0_area_size = 0x400000;
  754. } else { // Not Raptor - it is a PCI card
  755. if(hba_map0_area_size > 0x100000 ){ 
  756. hba_map0_area_size = 0x100000;
  757. }
  758. }
  759. } else {// Raptor split BAR config
  760. // Use BAR1 in this configuration
  761. base_addr1_phys = pci_resource_start(pDev,1);
  762. hba_map1_area_size = pci_resource_len(pDev,1);
  763. raptorFlag = TRUE;
  764. }
  765. base_addr_virt = (ulong)ioremap(base_addr0_phys,hba_map0_area_size);
  766. if(base_addr_virt == 0) {
  767. PERROR("dpti: adpt_config_hba: io remap failedn");
  768. return -EINVAL;
  769. }
  770.         if(raptorFlag == TRUE) {
  771. msg_addr_virt = (ulong)ioremap(base_addr1_phys, hba_map1_area_size );
  772. if(msg_addr_virt == 0) {
  773. PERROR("dpti: adpt_config_hba: io remap failed on BAR1n");
  774. iounmap((void*)base_addr_virt);
  775. return -EINVAL;
  776. }
  777. } else {
  778. msg_addr_virt = base_addr_virt;
  779. }
  780. // Allocate and zero the data structure
  781. pHba = kmalloc(sizeof(adpt_hba), GFP_KERNEL);
  782. if( pHba == NULL) {
  783. if(msg_addr_virt != base_addr_virt){
  784. iounmap((void*)msg_addr_virt);
  785. }
  786. iounmap((void*)base_addr_virt);
  787. return -ENOMEM;
  788. }
  789. memset(pHba, 0, sizeof(adpt_hba));
  790. down(&adpt_configuration_lock);
  791. for(i=0;i<DPTI_MAX_HBA;i++) {
  792. if(hbas[i]==NULL) {
  793. hbas[i]=pHba;
  794. break;
  795. }
  796. }
  797. if(hba_chain != NULL){
  798. for(p = hba_chain; p->next; p = p->next);
  799. p->next = pHba;
  800. } else {
  801. hba_chain = pHba;
  802. }
  803. pHba->next = NULL;
  804. pHba->unit = hba_count;
  805. sprintf(pHba->name, "dpti%d", i);
  806. hba_count++;
  807. up(&adpt_configuration_lock);
  808. pHba->pDev = pDev;
  809. pHba->base_addr_phys = base_addr0_phys;
  810. // Set up the Virtual Base Address of the I2O Device
  811. pHba->base_addr_virt = base_addr_virt;
  812. pHba->msg_addr_virt = msg_addr_virt;  
  813. pHba->irq_mask = (ulong)(base_addr_virt+0x30);
  814. pHba->post_port = (ulong)(base_addr_virt+0x40);
  815. pHba->reply_port = (ulong)(base_addr_virt+0x44);
  816. pHba->hrt = NULL;
  817. pHba->lct = NULL;
  818. pHba->lct_size = 0;
  819. pHba->status_block = NULL;
  820. pHba->post_count = 0;
  821. pHba->state = DPTI_STATE_RESET;
  822. pHba->pDev = pDev;
  823. pHba->devices = NULL;
  824. // Initializing the spinlocks
  825. spin_lock_init(&pHba->state_lock);
  826. if(raptorFlag == 0){
  827. printk(KERN_INFO"Adaptec I2O RAID controller %d at %lx size=%x irq=%dn", 
  828. hba_count-1, base_addr_virt, hba_map0_area_size, pDev->irq);
  829. } else {
  830. printk(KERN_INFO"Adaptec I2O RAID controller %d irq=%dn",hba_count-1, pDev->irq);
  831. printk(KERN_INFO"     BAR0 %lx - size= %xn",base_addr_virt,hba_map0_area_size);
  832. printk(KERN_INFO"     BAR1 %lx - size= %xn",msg_addr_virt,hba_map1_area_size);
  833. }
  834. if (request_irq (pDev->irq, adpt_isr, SA_SHIRQ, pHba->name, pHba)) {
  835. printk(KERN_ERR"%s: Couldn't register IRQ %dn", pHba->name, pDev->irq);
  836. adpt_i2o_delete_hba(pHba);
  837. return -EINVAL;
  838. }
  839. return 0;
  840. }
  841. static void adpt_i2o_delete_hba(adpt_hba* pHba)
  842. {
  843. adpt_hba* p1;
  844. adpt_hba* p2;
  845. struct i2o_device* d;
  846. struct i2o_device* next;
  847. int i;
  848. int j;
  849. struct adpt_device* pDev;
  850. struct adpt_device* pNext;
  851. down(&adpt_configuration_lock);
  852. // scsi_unregister calls our adpt_release which
  853. // does a quiese
  854. if(pHba->host){
  855. free_irq(pHba->host->irq, pHba);
  856. }
  857. for(i=0;i<DPTI_MAX_HBA;i++) {
  858. if(hbas[i]==pHba) {
  859. hbas[i] = NULL;
  860. }
  861. }
  862. p2 = NULL;
  863. for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
  864. if(p1 == pHba) {
  865. if(p2) {
  866. p2->next = p1->next;
  867. } else {
  868. hba_chain = p1->next;
  869. }
  870. break;
  871. }
  872. }
  873. hba_count--;
  874. up(&adpt_configuration_lock);
  875. iounmap((void*)pHba->base_addr_virt);
  876. if(pHba->msg_addr_virt != pHba->base_addr_virt){
  877. iounmap((void*)pHba->msg_addr_virt);
  878. }
  879. if(pHba->hrt) {
  880. kfree(pHba->hrt);
  881. }
  882. if(pHba->lct){
  883. kfree(pHba->lct);
  884. }
  885. if(pHba->status_block) {
  886. kfree(pHba->status_block);
  887. }
  888. if(pHba->reply_pool){
  889. kfree(pHba->reply_pool);
  890. }
  891. for(d = pHba->devices; d ; d = next){
  892. next = d->next;
  893. kfree(d);
  894. }
  895. for(i = 0 ; i < pHba->top_scsi_channel ; i++){
  896. for(j = 0; j < MAX_ID; j++){
  897. if(pHba->channel[i].device[j] != NULL){
  898. for(pDev = pHba->channel[i].device[j]; pDev; pDev = pNext){
  899. pNext = pDev->next_lun;
  900. kfree(pDev);
  901. }
  902. }
  903. }
  904. }
  905. kfree(pHba);
  906. if(hba_count <= 0){
  907. unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER);   
  908. }
  909. }
  910. static int adpt_init(void)
  911. {
  912. int i;
  913. printk(KERN_INFO"Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "n");
  914. for (i = 0; i < DPTI_MAX_HBA; i++) {
  915. hbas[i] = NULL;
  916. }
  917. #ifdef REBOOT_NOTIFIER
  918. register_reboot_notifier(&adpt_reboot_notifier);
  919. #endif
  920. return 0;
  921. }
  922. static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u32 lun)
  923. {
  924. struct adpt_device* d;
  925. if(chan < 0 || chan >= MAX_CHANNEL)
  926. return NULL;
  927. if( pHba->channel[chan].device == NULL){
  928. printk(KERN_DEBUG"Adaptec I2O RAID: Trying to find device before they are allocatedn");
  929. return NULL;
  930. }
  931. d = pHba->channel[chan].device[id];
  932. if(!d || d->tid == 0) {
  933. return NULL;
  934. }
  935. /* If it is the only lun at that address then this should match*/
  936. if(d->scsi_lun == lun){
  937. return d;
  938. }
  939. /* else we need to look through all the luns */
  940. for(d=d->next_lun ; d ; d = d->next_lun){
  941. if(d->scsi_lun == lun){
  942. return d;
  943. }
  944. }
  945. return NULL;
  946. }
  947. static int adpt_i2o_post_wait(adpt_hba* pHba, u32* msg, int len, int timeout)
  948. {
  949. // I used my own version of the WAIT_QUEUE_HEAD
  950. // to handle some version differences
  951. // When embedded in the kernel this could go back to the vanilla one
  952. ADPT_DECLARE_WAIT_QUEUE_HEAD(adpt_wq_i2o_post);
  953. int status = 0;
  954. ulong flags = 0;
  955. struct adpt_i2o_post_wait_data *p1, *p2;
  956. struct adpt_i2o_post_wait_data *wait_data =
  957. kmalloc(sizeof(struct adpt_i2o_post_wait_data),GFP_KERNEL);
  958. adpt_wait_queue_t wait;
  959. if(!wait_data){
  960. return -ENOMEM;
  961. }
  962. /*
  963.  * The spin locking is needed to keep anyone from playing
  964.  * with the queue pointers and id while we do the same
  965.  */
  966. spin_lock_irqsave(&adpt_post_wait_lock, flags);
  967.        // TODO we need a MORE unique way of getting ids
  968.        // to support async LCT get
  969. wait_data->next = adpt_post_wait_queue;
  970. adpt_post_wait_queue = wait_data;
  971. adpt_post_wait_id = (++adpt_post_wait_id & 0x7fff);
  972. wait_data->id =  adpt_post_wait_id;
  973. spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
  974. wait_data->wq = &adpt_wq_i2o_post;
  975. wait_data->status = -ETIMEDOUT;
  976. // this code is taken from kernel/sched.c:interruptible_sleep_on_timeout
  977. wait.task = current;
  978. init_waitqueue_entry(&wait, current);
  979. wq_write_lock_irqsave(&adpt_wq_i2o_post.lock,flags);
  980. __add_wait_queue(&adpt_wq_i2o_post, &wait);
  981. wq_write_unlock(&adpt_wq_i2o_post.lock);
  982. msg[2] |= 0x80000000 | ((u32)wait_data->id);
  983. timeout *= HZ;
  984. if((status = adpt_i2o_post_this(pHba, msg, len)) == 0){
  985. if(!timeout){
  986. set_current_state(TASK_INTERRUPTIBLE);
  987. spin_unlock_irq(&io_request_lock);
  988. schedule();
  989. spin_lock_irq(&io_request_lock);
  990. } else {
  991. set_current_state(TASK_INTERRUPTIBLE);
  992. spin_unlock_irq(&io_request_lock);
  993. schedule_timeout(timeout*HZ);
  994. spin_lock_irq(&io_request_lock);
  995. }
  996. }
  997. wq_write_lock_irq(&adpt_wq_i2o_post.lock);
  998. __remove_wait_queue(&adpt_wq_i2o_post, &wait);
  999. wq_write_unlock_irqrestore(&adpt_wq_i2o_post.lock,flags);
  1000. if(status == -ETIMEDOUT){
  1001. printk(KERN_INFO"dpti%d: POST WAIT TIMEOUTn",pHba->unit);
  1002. // We will have to free the wait_data memory during shutdown
  1003. return status;
  1004. }
  1005. /* Remove the entry from the queue.  */
  1006. p2 = NULL;
  1007. spin_lock_irqsave(&adpt_post_wait_lock, flags);
  1008. for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p1->next) {
  1009. if(p1 == wait_data) {
  1010. if(p1->status == I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION ) {
  1011. status = -EOPNOTSUPP;
  1012. }
  1013. if(p2) {
  1014. p2->next = p1->next;
  1015. } else {
  1016. adpt_post_wait_queue = p1->next;
  1017. }
  1018. break;
  1019. }
  1020. }
  1021. spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
  1022. kfree(wait_data);
  1023. return status;
  1024. }
  1025. static s32 adpt_i2o_post_this(adpt_hba* pHba, u32* data, int len)
  1026. {
  1027. u32 m = EMPTY_QUEUE;
  1028. u32 *msg;
  1029. ulong timeout = jiffies + 30*HZ;
  1030. do {
  1031. rmb();
  1032. m = readl(pHba->post_port);
  1033. if (m != EMPTY_QUEUE) {
  1034. break;
  1035. }
  1036. if(time_after(jiffies,timeout)){
  1037. printk(KERN_WARNING"dpti%d: Timeout waiting for message frame!n", pHba->unit);
  1038. return -ETIMEDOUT;
  1039. }
  1040. } while(m == EMPTY_QUEUE);
  1041. msg = (u32*) (pHba->msg_addr_virt + m);
  1042. memcpy_toio(msg, data, len);
  1043. wmb();
  1044. //post message
  1045. writel(m, pHba->post_port);
  1046. wmb();
  1047. return 0;
  1048. }
  1049. static void adpt_i2o_post_wait_complete(u32 context, int status)
  1050. {
  1051. struct adpt_i2o_post_wait_data *p1 = NULL;
  1052. /*
  1053.  * We need to search through the adpt_post_wait
  1054.  * queue to see if the given message is still
  1055.  * outstanding.  If not, it means that the IOP
  1056.  * took longer to respond to the message than we
  1057.  * had allowed and timer has already expired.
  1058.  * Not much we can do about that except log
  1059.  * it for debug purposes, increase timeout, and recompile
  1060.  *
  1061.  * Lock needed to keep anyone from moving queue pointers
  1062.  * around while we're looking through them.
  1063.  */
  1064. context &= 0x7fff;
  1065. spin_lock(&adpt_post_wait_lock);
  1066. for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
  1067. if(p1->id == context) {
  1068. p1->status = status;
  1069. spin_unlock(&adpt_post_wait_lock);
  1070. wake_up_interruptible(p1->wq);
  1071. return;
  1072. }
  1073. }
  1074. spin_unlock(&adpt_post_wait_lock);
  1075.         // If this happens we loose commands that probably really completed
  1076. printk(KERN_DEBUG"dpti: Could Not find task %d in wait queuen",context);
  1077. printk(KERN_DEBUG"      Tasks in wait queue:n");
  1078. for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
  1079. printk(KERN_DEBUG"           %dn",p1->id);
  1080. }
  1081. return;
  1082. }
  1083. static s32 adpt_i2o_reset_hba(adpt_hba* pHba)
  1084. {
  1085. u32 msg[8];
  1086. u8* status;
  1087. u32 m = EMPTY_QUEUE ;
  1088. ulong timeout = jiffies + (TMOUT_IOPRESET*HZ);
  1089. if(pHba->initialized  == FALSE) { // First time reset should be quick
  1090. timeout = jiffies + (25*HZ);
  1091. } else {
  1092. adpt_i2o_quiesce_hba(pHba);
  1093. }
  1094. do {
  1095. rmb();
  1096. m = readl(pHba->post_port);
  1097. if (m != EMPTY_QUEUE) {
  1098. break;
  1099. }
  1100. if(time_after(jiffies,timeout)){
  1101. printk(KERN_WARNING"Timeout waiting for message!n");
  1102. return -ETIMEDOUT;
  1103. }
  1104. } while (m == EMPTY_QUEUE);
  1105. status = (u8*)kmalloc(4, GFP_KERNEL|ADDR32);
  1106. if(status == NULL) {
  1107. adpt_send_nop(pHba, m);
  1108. printk(KERN_ERR"IOP reset failed - no free memory.n");
  1109. return -ENOMEM;
  1110. }
  1111. memset(status,0,4);
  1112. msg[0]=EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0;
  1113. msg[1]=I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID;
  1114. msg[2]=0;
  1115. msg[3]=0;
  1116. msg[4]=0;
  1117. msg[5]=0;
  1118. msg[6]=virt_to_bus(status);
  1119. msg[7]=0;     
  1120. memcpy_toio(pHba->msg_addr_virt+m, msg, sizeof(msg));
  1121. wmb();
  1122. writel(m, pHba->post_port);
  1123. wmb();
  1124. while(*status == 0){
  1125. if(time_after(jiffies,timeout)){
  1126. printk(KERN_WARNING"%s: IOP Reset Timeoutn",pHba->name);
  1127. kfree(status);
  1128. return -ETIMEDOUT;
  1129. }
  1130. rmb();
  1131. }
  1132. if(*status == 0x01 /*I2O_EXEC_IOP_RESET_IN_PROGRESS*/) {
  1133. PDEBUG("%s: Reset in progress...n", pHba->name);
  1134. // Here we wait for message frame to become available
  1135. // indicated that reset has finished
  1136. do {
  1137. rmb();
  1138. m = readl(pHba->post_port);
  1139. if (m != EMPTY_QUEUE) {
  1140. break;
  1141. }
  1142. if(time_after(jiffies,timeout)){
  1143. printk(KERN_ERR "%s:Timeout waiting for IOP Reset.n",pHba->name);
  1144. return -ETIMEDOUT;
  1145. }
  1146. } while (m == EMPTY_QUEUE);
  1147. // Flush the offset
  1148. adpt_send_nop(pHba, m);
  1149. }
  1150. adpt_i2o_status_get(pHba);
  1151. if(*status == 0x02 ||
  1152. pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
  1153. printk(KERN_WARNING"%s: Reset reject, trying to clearn",
  1154. pHba->name);
  1155. } else {
  1156. PDEBUG("%s: Reset completed.n", pHba->name);
  1157. }
  1158. kfree(status);
  1159. #ifdef UARTDELAY
  1160. // This delay is to allow someone attached to the card through the debug UART to 
  1161. // set up the dump levels that they want before the rest of the initialization sequence
  1162. adpt_delay(20000);
  1163. #endif
  1164. return 0;
  1165. }
  1166. static int adpt_i2o_parse_lct(adpt_hba* pHba)
  1167. {
  1168. int i;
  1169. int max;
  1170. int tid;
  1171. struct i2o_device *d;
  1172. i2o_lct *lct = pHba->lct;
  1173. u8 bus_no = 0;
  1174. s16 scsi_id;
  1175. s16 scsi_lun;
  1176. u32 buf[10]; // larger than 7, or 8 ...
  1177. struct adpt_device* pDev; 
  1178. if (lct == NULL) {
  1179. printk(KERN_ERR "%s: LCT is empty???n",pHba->name);
  1180. return -1;
  1181. }
  1182. max = lct->table_size;
  1183. max -= 3;
  1184. max /= 9;
  1185. for(i=0;i<max;i++) {
  1186. if( lct->lct_entry[i].user_tid != 0xfff){
  1187. /*
  1188.  * If we have hidden devices, we need to inform the upper layers about
  1189.  * the possible maximum id reference to handle device access when
  1190.  * an array is disassembled. This code has no other purpose but to
  1191.  * allow us future access to devices that are currently hidden
  1192.  * behind arrays, hotspares or have not been configured (JBOD mode).
  1193.  */
  1194. if( lct->lct_entry[i].class_id != I2O_CLASS_RANDOM_BLOCK_STORAGE &&
  1195.     lct->lct_entry[i].class_id != I2O_CLASS_SCSI_PERIPHERAL &&
  1196.     lct->lct_entry[i].class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
  1197.      continue;
  1198. }
  1199. tid = lct->lct_entry[i].tid;
  1200. // I2O_DPT_DEVICE_INFO_GROUP_NO;
  1201. if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
  1202. continue;
  1203. }
  1204. bus_no = buf[0]>>16;
  1205. scsi_id = buf[1];
  1206. scsi_lun = (buf[2]>>8 )&0xff;
  1207. if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
  1208. printk(KERN_WARNING"%s: Channel number %d out of range n", pHba->name, bus_no);
  1209. continue;
  1210. }
  1211. if(scsi_id > MAX_ID){
  1212. printk(KERN_WARNING"%s: SCSI ID %d out of range n", pHba->name, bus_no);
  1213. continue;
  1214. }
  1215. if(bus_no > pHba->top_scsi_channel){
  1216. pHba->top_scsi_channel = bus_no;
  1217. }
  1218. if(scsi_id > pHba->top_scsi_id){
  1219. pHba->top_scsi_id = scsi_id;
  1220. }
  1221. if(scsi_lun > pHba->top_scsi_lun){
  1222. pHba->top_scsi_lun = scsi_lun;
  1223. }
  1224. continue;
  1225. }
  1226. d = (struct i2o_device *)kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
  1227. if(d==NULL)
  1228. {
  1229. printk(KERN_CRIT"%s: Out of memory for I2O device data.n",pHba->name);
  1230. return -ENOMEM;
  1231. }
  1232. d->controller = (void*)pHba;
  1233. d->next = NULL;
  1234. memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
  1235. d->flags = 0;
  1236. tid = d->lct_data.tid;
  1237. adpt_i2o_report_hba_unit(pHba, d);
  1238. adpt_i2o_install_device(pHba, d);
  1239. }
  1240. bus_no = 0;
  1241. for(d = pHba->devices; d ; d = d->next) {
  1242. if(d->lct_data.class_id  == I2O_CLASS_BUS_ADAPTER_PORT ||
  1243.    d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PORT){
  1244. tid = d->lct_data.tid;
  1245. // TODO get the bus_no from hrt-but for now they are in order
  1246. //bus_no = 
  1247. if(bus_no > pHba->top_scsi_channel){
  1248. pHba->top_scsi_channel = bus_no;
  1249. }
  1250. pHba->channel[bus_no].type = d->lct_data.class_id;
  1251. pHba->channel[bus_no].tid = tid;
  1252. if(adpt_i2o_query_scalar(pHba, tid, 0x0200, -1, buf, 28)>=0)
  1253. {
  1254. pHba->channel[bus_no].scsi_id = buf[1];
  1255. PDEBUG("Bus %d - SCSI ID %d.n", bus_no, buf[1]);
  1256. }
  1257. // TODO remove - this is just until we get from hrt
  1258. bus_no++;
  1259. if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
  1260. printk(KERN_WARNING"%s: Channel number %d out of range - LCTn", pHba->name, bus_no);
  1261. break;
  1262. }
  1263. }
  1264. }
  1265. // Setup adpt_device table
  1266. for(d = pHba->devices; d ; d = d->next) {
  1267. if(d->lct_data.class_id  == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
  1268.    d->lct_data.class_id  == I2O_CLASS_SCSI_PERIPHERAL ||
  1269.    d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
  1270. tid = d->lct_data.tid;
  1271. scsi_id = -1;
  1272. // I2O_DPT_DEVICE_INFO_GROUP_NO;
  1273. if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)>=0) {
  1274. bus_no = buf[0]>>16;
  1275. scsi_id = buf[1];
  1276. scsi_lun = (buf[2]>>8 )&0xff;
  1277. if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
  1278. continue;
  1279. }
  1280. if(scsi_id > MAX_ID){
  1281. continue;
  1282. }
  1283. if( pHba->channel[bus_no].device[scsi_id] == NULL){
  1284. pDev =  kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
  1285. if(pDev == NULL) {
  1286. return -ENOMEM;
  1287. }
  1288. pHba->channel[bus_no].device[scsi_id] = pDev;
  1289. memset(pDev,0,sizeof(struct adpt_device));
  1290. } else {
  1291. for( pDev = pHba->channel[bus_no].device[scsi_id];
  1292. pDev->next_lun; pDev = pDev->next_lun){
  1293. }
  1294. pDev->next_lun = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
  1295. if(pDev == NULL) {
  1296. return -ENOMEM;
  1297. }
  1298. memset(pDev->next_lun,0,sizeof(struct adpt_device));
  1299. pDev = pDev->next_lun;
  1300. }
  1301. pDev->tid = tid;
  1302. pDev->scsi_channel = bus_no;
  1303. pDev->scsi_id = scsi_id;
  1304. pDev->scsi_lun = scsi_lun;
  1305. pDev->pI2o_dev = d;
  1306. d->owner = pDev;
  1307. pDev->type = (buf[0])&0xff;
  1308. pDev->flags = (buf[0]>>8)&0xff;
  1309. if(scsi_id > pHba->top_scsi_id){
  1310. pHba->top_scsi_id = scsi_id;
  1311. }
  1312. if(scsi_lun > pHba->top_scsi_lun){
  1313. pHba->top_scsi_lun = scsi_lun;
  1314. }
  1315. }
  1316. if(scsi_id == -1){
  1317. printk(KERN_WARNING"Could not find SCSI ID for %sn",
  1318. d->lct_data.identity_tag);
  1319. }
  1320. }
  1321. }
  1322. return 0;
  1323. }
  1324. /*
  1325.  * Each I2O controller has a chain of devices on it - these match
  1326.  * the useful parts of the LCT of the board.
  1327.  */
  1328.  
  1329. static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d)
  1330. {
  1331. down(&adpt_configuration_lock);
  1332. d->controller=pHba;
  1333. d->owner=NULL;
  1334. d->next=pHba->devices;
  1335. d->prev=NULL;
  1336. if (pHba->devices != NULL){
  1337. pHba->devices->prev=d;
  1338. }
  1339. pHba->devices=d;
  1340. *d->dev_name = 0;
  1341. up(&adpt_configuration_lock);
  1342. return 0;
  1343. }
  1344. static int adpt_open(struct inode *inode, struct file *file)
  1345. {
  1346. int minor;
  1347. adpt_hba* pHba;
  1348. //TODO check for root access
  1349. //
  1350. minor = MINOR(inode->i_rdev);
  1351. if (minor >= hba_count) {
  1352. return -ENXIO;
  1353. }
  1354. down(&adpt_configuration_lock);
  1355. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  1356. if (pHba->unit == minor) {
  1357. break; /* found adapter */
  1358. }
  1359. }
  1360. if (pHba == NULL) {
  1361. up(&adpt_configuration_lock);
  1362. return -ENXIO;
  1363. }
  1364. // if(pHba->in_use){
  1365. // up(&adpt_configuration_lock);
  1366. // return -EBUSY;
  1367. // }
  1368. pHba->in_use = 1;
  1369. up(&adpt_configuration_lock);
  1370. return 0;
  1371. }
  1372. static int adpt_close(struct inode *inode, struct file *file)
  1373. {
  1374. int minor;
  1375. adpt_hba* pHba;
  1376. minor = MINOR(inode->i_rdev);
  1377. if (minor >= hba_count) {
  1378. return -ENXIO;
  1379. }
  1380. down(&adpt_configuration_lock);
  1381. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  1382. if (pHba->unit == minor) {
  1383. break; /* found adapter */
  1384. }
  1385. }
  1386. up(&adpt_configuration_lock);
  1387. if (pHba == NULL) {
  1388. return -ENXIO;
  1389. }
  1390. pHba->in_use = 0;
  1391. return 0;
  1392. }
  1393. static int adpt_i2o_passthru(adpt_hba* pHba, u32* arg)
  1394. {
  1395. u32 msg[MAX_MESSAGE_SIZE];
  1396. u32* reply = NULL;
  1397. u32 size = 0;
  1398. u32 reply_size = 0;
  1399. u32* user_msg = (u32*)arg;
  1400. u32* user_reply = NULL;
  1401. ulong sg_list[pHba->sg_tablesize];
  1402. u32 sg_offset = 0;
  1403. u32 sg_count = 0;
  1404. int sg_index = 0;
  1405. u32 i = 0;
  1406. u32 rcode = 0;
  1407. ulong p = 0;
  1408. ulong flags = 0;
  1409. memset(&msg, 0, MAX_MESSAGE_SIZE*4);
  1410. // get user msg size in u32s 
  1411. if(get_user(size, &user_msg[0])){
  1412. return -EFAULT;
  1413. }
  1414. size = size>>16;
  1415. user_reply = &user_msg[size];
  1416. if(size > MAX_MESSAGE_SIZE){
  1417. return -EFAULT;
  1418. }
  1419. size *= 4; // Convert to bytes
  1420. /* Copy in the user's I2O command */
  1421. if(copy_from_user((void*)msg, (void*)user_msg, size)) {
  1422. return -EFAULT;
  1423. }
  1424. get_user(reply_size, &user_reply[0]);
  1425. reply_size = reply_size>>16;
  1426. if(reply_size > REPLY_FRAME_SIZE){
  1427. reply_size = REPLY_FRAME_SIZE;
  1428. }
  1429. reply_size *= 4;
  1430. reply = kmalloc(REPLY_FRAME_SIZE*4, GFP_KERNEL);
  1431. if(reply == NULL) {
  1432. printk(KERN_WARNING"%s: Could not allocate reply buffern",pHba->name);
  1433. return -ENOMEM;
  1434. }
  1435. memset(reply,0,REPLY_FRAME_SIZE*4);
  1436. sg_offset = (msg[0]>>4)&0xf;
  1437. msg[2] = 0x40000000; // IOCTL context
  1438. msg[3] = (u32)reply;
  1439. memset(sg_list,0, sizeof(sg_list[0])*pHba->sg_tablesize);
  1440. if(sg_offset) {
  1441. // TODO 64bit fix
  1442. struct sg_simple_element *sg =  (struct sg_simple_element*) (msg+sg_offset);
  1443. sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
  1444. if (sg_count > pHba->sg_tablesize){
  1445. printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)n", pHba->name,sg_count);
  1446. kfree (reply);
  1447. return -EINVAL;
  1448. }
  1449. for(i = 0; i < sg_count; i++) {
  1450. int sg_size;
  1451. if (!(sg[i].flag_count & 0x10000000 /*I2O_SGL_FLAGS_SIMPLE_ADDRESS_ELEMENT*/)) {
  1452. printk(KERN_DEBUG"%s:Bad SG element %d - not simple (%x)n",pHba->name,i,  sg[i].flag_count);
  1453. rcode = -EINVAL;
  1454. goto cleanup;
  1455. }
  1456. sg_size = sg[i].flag_count & 0xffffff;      
  1457. /* Allocate memory for the transfer */
  1458. p = (ulong)kmalloc(sg_size, GFP_KERNEL|ADDR32);
  1459. if(p == 0) {
  1460. printk(KERN_DEBUG"%s: Could not allocate SG buffer - size = %d buffer number %d of %dn",
  1461. pHba->name,sg_size,i,sg_count);
  1462. rcode = -ENOMEM;
  1463. goto cleanup;
  1464. }
  1465. sg_list[sg_index++] = p; // sglist indexed with input frame, not our internal frame.
  1466. /* Copy in the user's SG buffer if necessary */
  1467. if(sg[i].flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR*/) {
  1468. // TODO 64bit fix
  1469. if (copy_from_user((void*)p,(void*)sg[i].addr_bus, sg_size)) {
  1470. printk(KERN_DEBUG"%s: Could not copy SG buf %d FROM usern",pHba->name,i);
  1471. rcode = -EFAULT;
  1472. goto cleanup;
  1473. }
  1474. }
  1475. //TODO 64bit fix
  1476. sg[i].addr_bus = (u32)virt_to_bus((void*)p);
  1477. }
  1478. }
  1479. do {
  1480. spin_lock_irqsave(&io_request_lock, flags);
  1481. // This state stops any new commands from enterring the
  1482. // controller while processing the ioctl
  1483. // pHba->state |= DPTI_STATE_IOCTL;
  1484. // We can't set this now - The scsi subsystem sets host_blocked and
  1485. // the queue empties and stops.  We need a way to restart the queue
  1486. rcode = adpt_i2o_post_wait(pHba, msg, size, FOREVER);
  1487. // pHba->state &= ~DPTI_STATE_IOCTL;
  1488. spin_unlock_irqrestore(&io_request_lock, flags);
  1489. } while(rcode == -ETIMEDOUT);  
  1490. if(rcode){
  1491. goto cleanup;
  1492. }
  1493. if(sg_offset) {
  1494. /* Copy back the Scatter Gather buffers back to user space */
  1495. u32 j;
  1496. // TODO 64bit fix
  1497. struct sg_simple_element* sg;
  1498. int sg_size;
  1499. // re-acquire the original message to handle correctly the sg copy operation
  1500. memset(&msg, 0, MAX_MESSAGE_SIZE*4); 
  1501. // get user msg size in u32s 
  1502. if(get_user(size, &user_msg[0])){
  1503. rcode = -EFAULT; 
  1504. goto cleanup; 
  1505. }
  1506. size = size>>16;
  1507. size *= 4;
  1508. /* Copy in the user's I2O command */
  1509. if (copy_from_user ((void*)msg, (void*)user_msg, size)) {
  1510. rcode = -EFAULT;
  1511. goto cleanup;
  1512. }
  1513. sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
  1514. // TODO 64bit fix
  1515. sg   = (struct sg_simple_element*)(msg + sg_offset);
  1516. for (j = 0; j < sg_count; j++) {
  1517. /* Copy out the SG list to user's buffer if necessary */
  1518. if(! (sg[j].flag_count & 0x4000000 /*I2O_SGL_FLAGS_DIR*/)) {
  1519. sg_size = sg[j].flag_count & 0xffffff; 
  1520. // TODO 64bit fix
  1521. if (copy_to_user((void*)sg[j].addr_bus,(void*)sg_list[j], sg_size)) {
  1522. printk(KERN_WARNING"%s: Could not copy %lx TO user %xn",pHba->name, sg_list[j], sg[j].addr_bus);
  1523. rcode = -EFAULT;
  1524. goto cleanup;
  1525. }
  1526. }
  1527. }
  1528. /* Copy back the reply to user space */
  1529. if (reply_size) {
  1530. // we wrote our own values for context - now restore the user supplied ones
  1531. if(copy_from_user(reply+2, user_msg+2, sizeof(u32)*2)) {
  1532. printk(KERN_WARNING"%s: Could not copy message context FROM usern",pHba->name);
  1533. rcode = -EFAULT;
  1534. }
  1535. if(copy_to_user(user_reply, reply, reply_size)) {
  1536. printk(KERN_WARNING"%s: Could not copy reply TO usern",pHba->name);
  1537. rcode = -EFAULT;
  1538. }
  1539. }
  1540. cleanup:
  1541. kfree (reply);
  1542. while(sg_index) {
  1543. if(sg_list[--sg_index]) {
  1544. kfree((void*)(sg_list[sg_index]));
  1545. }
  1546. }
  1547. return rcode;
  1548. }
  1549. /*
  1550.  * This routine returns information about the system.  This does not effect
  1551.  * any logic and if the info is wrong - it doesn't matter.
  1552.  */
  1553. /* Get all the info we can not get from kernel services */
  1554. static int adpt_system_info(void *buffer)
  1555. {
  1556. sysInfo_S si;
  1557. memset(&si, 0, sizeof(si));
  1558. si.osType = OS_LINUX;
  1559. si.osMajorVersion = (u8) (LINUX_VERSION_CODE >> 16);
  1560. si.osMinorVersion = (u8) (LINUX_VERSION_CODE >> 8 & 0x0ff);
  1561. si.osRevision =     (u8) (LINUX_VERSION_CODE & 0x0ff);
  1562. si.busType = SI_PCI_BUS;
  1563. si.processorFamily = DPTI_sig.dsProcessorFamily;
  1564. #if defined __i386__ 
  1565. adpt_i386_info(&si);
  1566. #elif defined (__ia64__)
  1567. adpt_ia64_info(&si);
  1568. #elif defined(__sparc__)
  1569. adpt_sparc_info(&si);
  1570. #elif defined (__alpha__)
  1571. adpt_alpha_info(&si);
  1572. #else
  1573. si.processorType = 0xff ;
  1574. #endif
  1575. if(copy_to_user(buffer, &si, sizeof(si))){
  1576. printk(KERN_WARNING"dpti: Could not copy buffer TO usern");
  1577. return -EFAULT;
  1578. }
  1579. return 0;
  1580. }
  1581. #if defined __ia64__ 
  1582. static void adpt_ia64_info(sysInfo_S* si)
  1583. {
  1584. // This is all the info we need for now
  1585. // We will add more info as our new
  1586. // managmenent utility requires it
  1587. si->processorType = PROC_IA64;
  1588. }
  1589. #endif
  1590. #if defined __sparc__ 
  1591. static void adpt_sparc_info(sysInfo_S* si)
  1592. {
  1593. // This is all the info we need for now
  1594. // We will add more info as our new
  1595. // managmenent utility requires it
  1596. si->processorType = PROC_ULTRASPARC;
  1597. }
  1598. #endif
  1599. #if defined __alpha__ 
  1600. static void adpt_alpha_info(sysInfo_S* si)
  1601. {
  1602. // This is all the info we need for now
  1603. // We will add more info as our new
  1604. // managmenent utility requires it
  1605. si->processorType = PROC_ALPHA;
  1606. }
  1607. #endif
  1608. #if defined __i386__
  1609. static void adpt_i386_info(sysInfo_S* si)
  1610. {
  1611. // This is all the info we need for now
  1612. // We will add more info as our new
  1613. // managmenent utility requires it
  1614. switch (boot_cpu_data.x86) {
  1615. case CPU_386:
  1616. si->processorType = PROC_386;
  1617. break;
  1618. case CPU_486:
  1619. si->processorType = PROC_486;
  1620. break;
  1621. case CPU_586:
  1622. si->processorType = PROC_PENTIUM;
  1623. break;
  1624. default:  // Just in case 
  1625. si->processorType = PROC_PENTIUM;
  1626. break;
  1627. }
  1628. }
  1629. #endif
  1630. static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd,
  1631.       ulong arg)
  1632. {
  1633. int minor;
  1634. int error = 0;
  1635. adpt_hba* pHba;
  1636. ulong flags;
  1637. minor = MINOR(inode->i_rdev);
  1638. if (minor >= DPTI_MAX_HBA){
  1639. return -ENXIO;
  1640. }
  1641. down(&adpt_configuration_lock);
  1642. for (pHba = hba_chain; pHba; pHba = pHba->next) {
  1643. if (pHba->unit == minor) {
  1644. break; /* found adapter */
  1645. }
  1646. }
  1647. up(&adpt_configuration_lock);
  1648. if(pHba == NULL){
  1649. return -ENXIO;
  1650. }
  1651. while((volatile u32) pHba->state & DPTI_STATE_RESET ) {
  1652. set_task_state(current,TASK_UNINTERRUPTIBLE);
  1653. schedule_timeout(2);
  1654. }
  1655. switch (cmd) {
  1656. // TODO: handle 3 cases
  1657. case DPT_SIGNATURE:
  1658. if (copy_to_user((char*)arg, &DPTI_sig, sizeof(DPTI_sig))) {
  1659. return -EFAULT;
  1660. }
  1661. break;
  1662. case I2OUSRCMD:
  1663. return adpt_i2o_passthru(pHba,(u32*)arg);
  1664. break;
  1665. case DPT_CTRLINFO:{
  1666. drvrHBAinfo_S HbaInfo;
  1667. #define FLG_OSD_PCI_VALID 0x0001
  1668. #define FLG_OSD_DMA   0x0002
  1669. #define FLG_OSD_I2O   0x0004
  1670. memset(&HbaInfo, 0, sizeof(HbaInfo));
  1671. HbaInfo.drvrHBAnum = pHba->unit;
  1672. HbaInfo.baseAddr = (ulong) pHba->base_addr_phys;
  1673. HbaInfo.blinkState = adpt_read_blink_led(pHba);
  1674. HbaInfo.pciBusNum =  pHba->pDev->bus->number;
  1675. HbaInfo.pciDeviceNum=PCI_SLOT(pHba->pDev->devfn); 
  1676. HbaInfo.Interrupt = pHba->pDev->irq; 
  1677. HbaInfo.hbaFlags = FLG_OSD_PCI_VALID | FLG_OSD_DMA | FLG_OSD_I2O;
  1678. if(copy_to_user((void *) arg, &HbaInfo, sizeof(HbaInfo))){
  1679. printk(KERN_WARNING"%s: Could not copy HbaInfo TO usern",pHba->name);
  1680. return -EFAULT;
  1681. }
  1682. break;
  1683. }
  1684. case DPT_SYSINFO:
  1685. return adpt_system_info((void*)arg);
  1686. break;
  1687. case DPT_BLINKLED:{
  1688. u32 value;
  1689. value = (u32)adpt_read_blink_led(pHba);
  1690. if (copy_to_user((char*)arg, &value, sizeof(value))) {
  1691. return -EFAULT;
  1692. }
  1693. break;
  1694. }
  1695. case I2ORESETCMD:
  1696. spin_lock_irqsave(&io_request_lock, flags);
  1697. adpt_hba_reset(pHba);
  1698. spin_unlock_irqrestore(&io_request_lock, flags);
  1699. break;
  1700. case I2ORESCANCMD:
  1701. adpt_rescan(pHba);
  1702. break;
  1703. case DPT_TARGET_BUSY & 0xFFFF:
  1704. case DPT_TARGET_BUSY:
  1705. {
  1706. TARGET_BUSY_T busy;
  1707. struct adpt_device* d;
  1708. if (copy_from_user((void*)&busy, (void*)arg, sizeof(TARGET_BUSY_T))) {
  1709. return -EFAULT;
  1710. }
  1711. d = adpt_find_device(pHba, busy.channel, busy.id, busy.lun);
  1712. if(d == NULL){
  1713. return -ENODEV;
  1714. }
  1715. busy.isBusy = ((d->pScsi_dev) && (0 != d->pScsi_dev->access_count)) ? 1 : 0;
  1716. if (copy_to_user ((char*)arg, &busy, sizeof(busy))) {
  1717. return -EFAULT;
  1718. }
  1719. break;
  1720. }
  1721. default:
  1722. return -EINVAL;
  1723. }
  1724. return error;
  1725. }
  1726. static void adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
  1727. {
  1728. Scsi_Cmnd* cmd;
  1729. adpt_hba* pHba=NULL;
  1730. u32 m;
  1731. ulong reply;
  1732. u32 status=0;
  1733. u32 context;
  1734. ulong flags = 0;
  1735. pHba = dev_id;
  1736. if (pHba == NULL ){
  1737. printk(KERN_WARNING"adpt_isr: NULL dev_idn");
  1738. return;
  1739. }
  1740. spin_lock_irqsave(&io_request_lock, flags);
  1741. while( readl(pHba->irq_mask) & I2O_INTERRUPT_PENDING_B) {
  1742. m = readl(pHba->reply_port);
  1743. if(m == EMPTY_QUEUE){
  1744. // Try twice then give up
  1745. rmb();
  1746. m = readl(pHba->reply_port);
  1747. if(m == EMPTY_QUEUE){ 
  1748. // This really should not happen
  1749. printk(KERN_ERR"dpti: Could not get reply framen");
  1750. spin_unlock_irqrestore(&io_request_lock,flags);
  1751. return;
  1752. }
  1753. }
  1754. reply = (ulong)bus_to_virt(m);
  1755. if (readl(reply) & MSG_FAIL) {
  1756. u32 old_m = readl(reply+28); 
  1757. ulong msg;
  1758. u32 old_context;
  1759. PDEBUG("%s: Failed messagen",pHba->name);
  1760. if(old_m >= 0x100000){
  1761. printk(KERN_ERR"%s: Bad preserved MFA (%x)- dropping framen",pHba->name,old_m);
  1762. writel(m,pHba->reply_port);
  1763. continue;
  1764. }
  1765. // Transaction context is 0 in failed reply frame
  1766. msg = (ulong)(pHba->msg_addr_virt + old_m);
  1767. old_context = readl(msg+12);
  1768. writel(old_context, reply+12);
  1769. adpt_send_nop(pHba, old_m);
  1770. context = readl(reply+8);
  1771. if(context & 0x40000000){ // IOCTL
  1772. ulong p = (ulong)(readl(reply+12));
  1773. if( p != 0) {
  1774. memcpy((void*)p, (void*)reply, REPLY_FRAME_SIZE * 4);
  1775. }
  1776. // All IOCTLs will also be post wait
  1777. }
  1778. if(context & 0x80000000){ // Post wait message
  1779. status = readl(reply+16);
  1780. if(status  >> 24){
  1781. status &=  0xffff; /* Get detail status */
  1782. } else {
  1783. status = I2O_POST_WAIT_OK;
  1784. }
  1785. if(!(context & 0x40000000)) {
  1786. cmd = (Scsi_Cmnd*) readl(reply+12); 
  1787. if(cmd != NULL) {
  1788. printk(KERN_WARNING"%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%xn", pHba->name, cmd, context);
  1789. }
  1790. }
  1791. adpt_i2o_post_wait_complete(context, status);
  1792. } else { // SCSI message
  1793. cmd = (Scsi_Cmnd*) readl(reply+12); 
  1794. if(cmd != NULL){
  1795. if(cmd->serial_number != 0) { // If not timedout
  1796. adpt_i2o_to_scsi(reply, cmd);
  1797. }
  1798. }
  1799. }
  1800. writel(m, pHba->reply_port);
  1801. wmb();
  1802. rmb();
  1803. }
  1804. spin_unlock_irqrestore(&io_request_lock, flags);
  1805. return;
  1806. }
  1807. static s32 adpt_scsi_to_i2o(adpt_hba* pHba, Scsi_Cmnd* cmd, struct adpt_device* d)
  1808. {
  1809. int i;
  1810. u32 msg[MAX_MESSAGE_SIZE];
  1811. u32* mptr;
  1812. u32 *lenptr;
  1813. int direction;
  1814. int scsidir;
  1815. u32 len;
  1816. u32 reqlen;
  1817. s32 rcode;
  1818. memset(msg, 0 , sizeof(msg));
  1819. len = cmd->request_bufflen;
  1820. direction = 0x00000000;
  1821. scsidir = 0x00000000; // DATA NO XFER
  1822. if(len) {
  1823. /*
  1824.  * Set SCBFlags to indicate if data is being transferred
  1825.  * in or out, or no data transfer
  1826.  * Note:  Do not have to verify index is less than 0 since
  1827.  * cmd->cmnd[0] is an unsigned char
  1828.  */
  1829. switch(cmd->sc_data_direction){
  1830. case SCSI_DATA_READ:
  1831. scsidir  =0x40000000; // DATA IN  (iop<--dev)
  1832. break;
  1833. case SCSI_DATA_WRITE:
  1834. direction=0x04000000; // SGL OUT
  1835. scsidir  =0x80000000; // DATA OUT (iop-->dev)
  1836. break;
  1837. case SCSI_DATA_NONE:
  1838. break;
  1839. case SCSI_DATA_UNKNOWN:
  1840. scsidir  =0x40000000; // DATA IN  (iop<--dev)
  1841. // Assume In - and continue;
  1842. break;
  1843. default:
  1844. printk(KERN_WARNING"%s: scsi opcode 0x%x not supported.n",
  1845.      pHba->name, cmd->cmnd[0]);
  1846. cmd->result = (DID_OK <<16) | (INITIATOR_ERROR << 8);
  1847. cmd->scsi_done(cmd);
  1848. return  0;
  1849. }
  1850. }
  1851. // msg[0] is set later
  1852. // I2O_CMD_SCSI_EXEC
  1853. msg[1] = ((0xff<<24)|(HOST_TID<<12)|d->tid);
  1854. msg[2] = 0;
  1855. msg[3] = (u32)cmd; /* We want the SCSI control block back */
  1856. // Our cards use the transaction context as the tag for queueing
  1857. // Adaptec/DPT Private stuff 
  1858. msg[4] = I2O_CMD_SCSI_EXEC|(DPT_ORGANIZATION_ID<<16);
  1859. msg[5] = d->tid;
  1860. /* Direction, disconnect ok | sense data | simple queue , CDBLen */
  1861. // I2O_SCB_FLAG_ENABLE_DISCONNECT | 
  1862. // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG | 
  1863. // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
  1864. msg[6] = scsidir|0x20a00000|cmd->cmd_len;
  1865. mptr=msg+7;
  1866. // Write SCSI command into the message - always 16 byte block 
  1867. memset(mptr, 0,  16);
  1868. memcpy(mptr, cmd->cmnd, cmd->cmd_len);
  1869. mptr+=4;
  1870. lenptr=mptr++; /* Remember me - fill in when we know */
  1871. reqlen = 14; // SINGLE SGE
  1872. /* Now fill in the SGList and command */
  1873. if(cmd->use_sg) {
  1874. struct scatterlist *sg = (struct scatterlist *)cmd->request_buffer;
  1875. len = 0;
  1876. for(i = 0 ; i < cmd->use_sg; i++) {
  1877. *mptr++ = direction|0x10000000|sg->length;
  1878. len+=sg->length;
  1879. *mptr++ = virt_to_bus(sg->address);
  1880. sg++;
  1881. }
  1882. /* Make this an end of list */
  1883. mptr[-2] = direction|0xD0000000|(sg-1)->length;
  1884. reqlen = mptr - msg;
  1885. *lenptr = len;
  1886. if(cmd->underflow && len != cmd->underflow){
  1887. printk(KERN_WARNING"Cmd len %08X Cmd underflow %08Xn",
  1888. len, cmd->underflow);
  1889. }
  1890. } else {
  1891. *lenptr = len = cmd->request_bufflen;
  1892. if(len == 0) {
  1893. reqlen = 12;
  1894. } else {
  1895. *mptr++ = 0xD0000000|direction|cmd->request_bufflen;
  1896. *mptr++ = virt_to_bus(cmd->request_buffer);
  1897. }
  1898. }
  1899. /* Stick the headers on */
  1900. msg[0] = reqlen<<16 | ((reqlen > 12) ? SGL_OFFSET_12 : SGL_OFFSET_0);
  1901. // Send it on it's way
  1902. rcode = adpt_i2o_post_this(pHba, msg, reqlen<<2);
  1903. if (rcode == 0) {
  1904. return 0;
  1905. }
  1906. return rcode;
  1907. }
  1908. static s32 adpt_scsi_register(adpt_hba* pHba,Scsi_Host_Template * sht)
  1909. {
  1910. struct Scsi_Host *host = NULL;
  1911. host = scsi_register(sht, sizeof(adpt_hba*));
  1912. if (host == NULL) {
  1913. printk ("%s: scsi_register returned NULLn",pHba->name);
  1914. return -1;
  1915. }
  1916. (adpt_hba*)(host->hostdata[0]) = pHba;
  1917. pHba->host = host;
  1918. host->irq = pHba->pDev->irq;;
  1919. /* no IO ports, so don't have to set host->io_port and 
  1920.  * host->n_io_port
  1921.  */
  1922. host->io_port = 0;
  1923. host->n_io_port = 0;
  1924. /* see comments in hosts.h */
  1925. host->max_id = 16;
  1926. host->max_lun = 256;
  1927. host->max_channel = pHba->top_scsi_channel + 1;
  1928. host->cmd_per_lun = 256;
  1929. host->unique_id = (uint) pHba;
  1930. host->sg_tablesize = pHba->sg_tablesize;
  1931. host->can_queue = pHba->post_fifo_size;
  1932. host->select_queue_depths = adpt_select_queue_depths;
  1933. return 0;
  1934. }
  1935. static s32 adpt_i2o_to_scsi(ulong reply, Scsi_Cmnd* cmd)
  1936. {
  1937. adpt_hba* pHba;
  1938. u32 hba_status;
  1939. u32 dev_status;
  1940. u32 reply_flags = readl(reply) & 0xff00; // Leave it shifted up 8 bits 
  1941. // I know this would look cleaner if I just read bytes
  1942. // but the model I have been using for all the rest of the
  1943. // io is in 4 byte words - so I keep that model
  1944. u16 detailed_status = readl(reply+16) &0xffff;
  1945. dev_status = (detailed_status & 0xff);
  1946. hba_status = detailed_status >> 8;
  1947. // calculate resid for sg 
  1948. cmd->resid = cmd->request_bufflen - readl(reply+5);
  1949. pHba = (adpt_hba*) cmd->host->hostdata[0];
  1950. cmd->sense_buffer[0] = '';  // initialize sense valid flag to false
  1951. if(!(reply_flags & MSG_FAIL)) {
  1952. switch(detailed_status & I2O_SCSI_DSC_MASK) {
  1953. case I2O_SCSI_DSC_SUCCESS:
  1954. cmd->result = (DID_OK << 16);
  1955. // handle underflow
  1956. if(readl(reply+5) < cmd->underflow ) {
  1957. cmd->result = (DID_ERROR <<16);
  1958. printk(KERN_WARNING"%s: SCSI CMD underflown",pHba->name);
  1959. }
  1960. break;
  1961. case I2O_SCSI_DSC_REQUEST_ABORTED:
  1962. cmd->result = (DID_ABORT << 16);
  1963. break;
  1964. case I2O_SCSI_DSC_PATH_INVALID:
  1965. case I2O_SCSI_DSC_DEVICE_NOT_PRESENT:
  1966. case I2O_SCSI_DSC_SELECTION_TIMEOUT:
  1967. case I2O_SCSI_DSC_COMMAND_TIMEOUT:
  1968. case I2O_SCSI_DSC_NO_ADAPTER:
  1969. case I2O_SCSI_DSC_RESOURCE_UNAVAILABLE:
  1970. printk(KERN_WARNING"%s: SCSI Timeout-Device (%d,%d,%d) hba status=0x%x, dev status=0x%x, cmd=0x%xn",
  1971. pHba->name, (u32)cmd->channel, (u32)cmd->target, (u32)cmd->lun, hba_status, dev_status, cmd->cmnd[0]);
  1972. cmd->result = (DID_TIME_OUT << 16);
  1973. break;
  1974. case I2O_SCSI_DSC_ADAPTER_BUSY:
  1975. case I2O_SCSI_DSC_BUS_BUSY:
  1976. cmd->result = (DID_BUS_BUSY << 16);
  1977. break;
  1978. case I2O_SCSI_DSC_SCSI_BUS_RESET:
  1979. case I2O_SCSI_DSC_BDR_MESSAGE_SENT:
  1980. cmd->result = (DID_RESET << 16);
  1981. break;
  1982. case I2O_SCSI_DSC_PARITY_ERROR_FAILURE:
  1983. printk(KERN_WARNING"%s: SCSI CMD parity errorn",pHba->name);
  1984. cmd->result = (DID_PARITY << 16);
  1985. break;
  1986. case I2O_SCSI_DSC_UNABLE_TO_ABORT:
  1987. case I2O_SCSI_DSC_COMPLETE_WITH_ERROR:
  1988. case I2O_SCSI_DSC_UNABLE_TO_TERMINATE:
  1989. case I2O_SCSI_DSC_MR_MESSAGE_RECEIVED:
  1990. case I2O_SCSI_DSC_AUTOSENSE_FAILED:
  1991. case I2O_SCSI_DSC_DATA_OVERRUN:
  1992. case I2O_SCSI_DSC_UNEXPECTED_BUS_FREE:
  1993. case I2O_SCSI_DSC_SEQUENCE_FAILURE:
  1994. case I2O_SCSI_DSC_REQUEST_LENGTH_ERROR:
  1995. case I2O_SCSI_DSC_PROVIDE_FAILURE:
  1996. case I2O_SCSI_DSC_REQUEST_TERMINATED:
  1997. case I2O_SCSI_DSC_IDE_MESSAGE_SENT:
  1998. case I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT:
  1999. case I2O_SCSI_DSC_MESSAGE_RECEIVED:
  2000. case I2O_SCSI_DSC_INVALID_CDB:
  2001. case I2O_SCSI_DSC_LUN_INVALID:
  2002. case I2O_SCSI_DSC_SCSI_TID_INVALID:
  2003. case I2O_SCSI_DSC_FUNCTION_UNAVAILABLE:
  2004. case I2O_SCSI_DSC_NO_NEXUS:
  2005. case I2O_SCSI_DSC_CDB_RECEIVED:
  2006. case I2O_SCSI_DSC_LUN_ALREADY_ENABLED:
  2007. case I2O_SCSI_DSC_QUEUE_FROZEN:
  2008. case I2O_SCSI_DSC_REQUEST_INVALID:
  2009. default:
  2010. printk(KERN_WARNING"%s: SCSI error %0x-Device(%d,%d,%d) hba_status=0x%x, dev_status=0x%x, cmd=0x%xn",
  2011. pHba->name, detailed_status & I2O_SCSI_DSC_MASK, (u32)cmd->channel, (u32)cmd->target, (u32)cmd-> lun,
  2012.        hba_status, dev_status, cmd->cmnd[0]);
  2013. cmd->result = (DID_ERROR << 16);
  2014. break;
  2015. }
  2016. // copy over the request sense data if it was a check
  2017. // condition status
  2018. if(dev_status == 0x02 /*CHECK_CONDITION*/) {
  2019. u32 len = sizeof(cmd->sense_buffer);
  2020. len = (len > 40) ?  40 : len;
  2021. // Copy over the sense data
  2022. memcpy(cmd->sense_buffer, (void*)(reply+28) , len);
  2023. if(cmd->sense_buffer[0] == 0x70 /* class 7 */ && 
  2024.    cmd->sense_buffer[2] == DATA_PROTECT ){
  2025. /* This is to handle an array failed */
  2026. cmd->result = (DID_TIME_OUT << 16);
  2027. printk(KERN_WARNING"%s: SCSI Data Protect-Device (%d,%d,%d) hba_status=0x%x, dev_status=0x%x, cmd=0x%xn",
  2028. pHba->name, (u32)cmd->channel, (u32)cmd->target, (u32)cmd->lun, 
  2029. hba_status, dev_status, cmd->cmnd[0]);
  2030. }
  2031. }
  2032. } else {
  2033. /* In this condtion we could not talk to the tid
  2034.  * the card rejected it.  We should signal a retry
  2035.  * for a limitted number of retries.
  2036.  */
  2037. cmd->result = (DID_TIME_OUT << 16);
  2038. printk(KERN_WARNING"%s: I2O MSG_FAIL - Device (%d,%d,%d) tid=%d, cmd=0x%xn",
  2039. pHba->name, (u32)cmd->channel, (u32)cmd->target, (u32)cmd-> lun,
  2040. ((struct adpt_device*)(cmd->device->hostdata))->tid, cmd->cmnd[0]);
  2041. }
  2042. cmd->result |= (dev_status);
  2043. if(cmd->scsi_done != NULL){
  2044. cmd->scsi_done(cmd);
  2045. return cmd->result;
  2046. }
  2047. static s32 adpt_rescan(adpt_hba* pHba)
  2048. {
  2049. s32 rcode;
  2050. ulong flags;
  2051. spin_lock_irqsave(&io_request_lock, flags);
  2052. if ((rcode=adpt_i2o_lct_get(pHba)) < 0){
  2053. spin_unlock_irqrestore(&io_request_lock, flags);
  2054. return rcode;
  2055. }
  2056. if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0){
  2057. spin_unlock_irqrestore(&io_request_lock, flags);
  2058. return rcode;
  2059. }
  2060. spin_unlock_irqrestore(&io_request_lock, flags);
  2061. return 0;
  2062. }
  2063. static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
  2064. {
  2065. int i;
  2066. int max;
  2067. int tid;
  2068. struct i2o_device *d;
  2069. i2o_lct *lct = pHba->lct;
  2070. u8 bus_no = 0;
  2071. s16 scsi_id;
  2072. s16 scsi_lun;
  2073. u32 buf[10]; // at least 8 u32's
  2074. struct adpt_device* pDev = NULL;
  2075. struct i2o_device* pI2o_dev = NULL;
  2076. if (lct == NULL) {
  2077. printk(KERN_ERR "%s: LCT is empty???n",pHba->name);
  2078. return -1;
  2079. }
  2080. max = lct->table_size;
  2081. max -= 3;
  2082. max /= 9;
  2083. // Mark each drive as unscanned
  2084. for (d = pHba->devices; d; d = d->next) {
  2085. pDev =(struct adpt_device*) d->owner;
  2086. if(!pDev){
  2087. continue;
  2088. }
  2089. pDev->state |= DPTI_DEV_UNSCANNED;
  2090. }
  2091. printk(KERN_INFO "%s: LCT has %d entries.n", pHba->name,max);
  2092. for(i=0;i<max;i++) {
  2093. if( lct->lct_entry[i].user_tid != 0xfff){
  2094. continue;
  2095. }
  2096. if( lct->lct_entry[i].class_id == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
  2097.     lct->lct_entry[i].class_id == I2O_CLASS_SCSI_PERIPHERAL ||
  2098.     lct->lct_entry[i].class_id == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
  2099. tid = lct->lct_entry[i].tid;
  2100. if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
  2101. printk(KERN_ERR"%s: Could not query devicen",pHba->name);
  2102. continue;
  2103. }
  2104. bus_no = buf[0]>>16;
  2105. scsi_id = buf[1];
  2106. scsi_lun = (buf[2]>>8 )&0xff;
  2107. pDev = pHba->channel[bus_no].device[scsi_id];
  2108. /* da lun */
  2109. while(pDev) {
  2110. if(pDev->scsi_lun == scsi_lun) {
  2111. break;
  2112. }
  2113. pDev = pDev->next_lun;
  2114. }
  2115. if(!pDev ) { // Something new add it
  2116. d = (struct i2o_device *)kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
  2117. if(d==NULL)
  2118. {
  2119. printk(KERN_CRIT "Out of memory for I2O device data.n");
  2120. return -ENOMEM;
  2121. }
  2122. d->controller = (void*)pHba;
  2123. d->next = NULL;
  2124. memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
  2125. d->flags = 0;
  2126. adpt_i2o_report_hba_unit(pHba, d);
  2127. adpt_i2o_install_device(pHba, d);
  2128. if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
  2129. printk(KERN_WARNING"%s: Channel number %d out of range n", pHba->name, bus_no);
  2130. continue;
  2131. }
  2132. pDev = pHba->channel[bus_no].device[scsi_id];
  2133. if( pDev == NULL){
  2134. pDev =  kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
  2135. if(pDev == NULL) {
  2136. return -ENOMEM;
  2137. }
  2138. pHba->channel[bus_no].device[scsi_id] = pDev;
  2139. } else {
  2140. while (pDev->next_lun) {
  2141. pDev = pDev->next_lun;
  2142. }
  2143. pDev = pDev->next_lun = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
  2144. if(pDev == NULL) {
  2145. return -ENOMEM;
  2146. }
  2147. }
  2148. memset(pDev,0,sizeof(struct adpt_device));
  2149. pDev->tid = d->lct_data.tid;
  2150. pDev->scsi_channel = bus_no;
  2151. pDev->scsi_id = scsi_id;
  2152. pDev->scsi_lun = scsi_lun;
  2153. pDev->pI2o_dev = d;
  2154. d->owner = pDev;
  2155. pDev->type = (buf[0])&0xff;
  2156. pDev->flags = (buf[0]>>8)&0xff;
  2157. // Too late, SCSI system has made up it's mind, but what the hey ...
  2158. if(scsi_id > pHba->top_scsi_id){
  2159. pHba->top_scsi_id = scsi_id;
  2160. }
  2161. if(scsi_lun > pHba->top_scsi_lun){
  2162. pHba->top_scsi_lun = scsi_lun;
  2163. }
  2164. continue;
  2165. } // end of new i2o device
  2166. // We found an old device - check it
  2167. while(pDev) {
  2168. if(pDev->scsi_lun == scsi_lun) {
  2169. if(pDev->pScsi_dev->online == FALSE) {
  2170. printk(KERN_WARNING"%s: Setting device (%d,%d,%d) back onlinen",
  2171. pHba->name,bus_no,scsi_id,scsi_lun);
  2172. if (pDev->pScsi_dev) {
  2173. pDev->pScsi_dev->online = TRUE;
  2174. }
  2175. }
  2176. d = pDev->pI2o_dev;
  2177. if(d->lct_data.tid != tid) { // something changed
  2178. pDev->tid = tid;
  2179. memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
  2180. if (pDev->pScsi_dev) {
  2181. pDev->pScsi_dev->changed = TRUE;
  2182. pDev->pScsi_dev->removable = TRUE;
  2183. }
  2184. }
  2185. // Found it - mark it scanned
  2186. pDev->state = DPTI_DEV_ONLINE;
  2187. break;
  2188. }
  2189. pDev = pDev->next_lun;
  2190. }
  2191. }
  2192. }
  2193. for (pI2o_dev = pHba->devices; pI2o_dev; pI2o_dev = pI2o_dev->next) {
  2194. pDev =(struct adpt_device*) pI2o_dev->owner;
  2195. if(!pDev){
  2196. continue;
  2197. }
  2198. // Drive offline drives that previously existed but could not be found
  2199. // in the LCT table
  2200. if (pDev->state & DPTI_DEV_UNSCANNED){
  2201. pDev->state = DPTI_DEV_OFFLINE;
  2202. printk(KERN_WARNING"%s: Device (%d,%d,%d) offlinen",pHba->name,pDev->scsi_channel,pDev->scsi_id,pDev->scsi_lun);
  2203. if (pDev->pScsi_dev) {
  2204. pDev->pScsi_dev->online = FALSE;
  2205. if (pDev->pScsi_dev->access_count) {
  2206. // A drive that was mounted is no longer there... bad!
  2207. SCSI_LOG_ERROR_RECOVERY(1, printk ("%s:Rescan: Previously "
  2208.  "mounted drive not found!n",pHba->name));
  2209. printk(KERN_WARNING"%s:Mounted drive taken offlinen",pHba->name);
  2210. }
  2211. }
  2212. }
  2213. }
  2214. return 0;
  2215. }
  2216. static void adpt_fail_posted_scbs(adpt_hba* pHba)
  2217. {
  2218. Scsi_Cmnd*  cmd = NULL;
  2219. Scsi_Device*  d = NULL;
  2220. if( pHba->host->host_queue != NULL ) {
  2221. d = pHba->host->host_queue;
  2222. if(!d){
  2223. return;
  2224. }
  2225. while( d->next != NULL ){
  2226. for(cmd = d->device_queue; cmd ; cmd = cmd->next){
  2227. if(cmd->serial_number == 0){
  2228. continue;
  2229. }
  2230. cmd->result = (DID_OK << 16) | (QUEUE_FULL <<1);
  2231. cmd->scsi_done(cmd);
  2232. }
  2233. d = d->next;
  2234. }
  2235. }
  2236. }
  2237. /*============================================================================
  2238.  *  Routines from i2o subsystem
  2239.  *============================================================================
  2240.  */
  2241. /*
  2242.  * Bring an I2O controller into HOLD state. See the spec.
  2243.  */
  2244. static int adpt_i2o_activate_hba(adpt_hba* pHba)
  2245. {
  2246. int rcode;
  2247. if(pHba->initialized ) {
  2248. if (adpt_i2o_status_get(pHba) < 0) {
  2249. if((rcode = adpt_i2o_reset_hba(pHba) != 0)){
  2250. printk(KERN_WARNING"%s: Could NOT reset.n", pHba->name);
  2251. return rcode;
  2252. }
  2253. if (adpt_i2o_status_get(pHba) < 0) {
  2254. printk(KERN_INFO "HBA not responding.n");
  2255. return -1;
  2256. }
  2257. }
  2258. if(pHba->status_block->iop_state == ADAPTER_STATE_FAULTED) {
  2259. printk(KERN_CRIT "%s: hardware faultn", pHba->name);
  2260. return -1;
  2261. }
  2262. if (pHba->status_block->iop_state == ADAPTER_STATE_READY ||
  2263.     pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL ||
  2264.     pHba->status_block->iop_state == ADAPTER_STATE_HOLD ||
  2265.     pHba->status_block->iop_state == ADAPTER_STATE_FAILED) {
  2266. adpt_i2o_reset_hba(pHba);
  2267. if (adpt_i2o_status_get(pHba) < 0 || pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
  2268. printk(KERN_ERR "%s: Failed to initialize.n", pHba->name);
  2269. return -1;
  2270. }
  2271. }
  2272. } else {
  2273. if((rcode = adpt_i2o_reset_hba(pHba) != 0)){
  2274. printk(KERN_WARNING"%s: Could NOT reset.n", pHba->name);
  2275. return rcode;
  2276. }
  2277. }
  2278. if (adpt_i2o_init_outbound_q(pHba) < 0) {
  2279. return -1;
  2280. }
  2281. /* In HOLD state */
  2282. if (adpt_i2o_hrt_get(pHba) < 0) {
  2283. return -1;
  2284. }
  2285. return 0;
  2286. }
  2287. /*
  2288.  * Bring a controller online into OPERATIONAL state. 
  2289.  */
  2290.  
  2291. static int adpt_i2o_online_hba(adpt_hba* pHba)
  2292. {
  2293. if (adpt_i2o_systab_send(pHba) < 0) {
  2294. adpt_i2o_delete_hba(pHba);
  2295. return -1;
  2296. }
  2297. /* In READY state */
  2298. if (adpt_i2o_enable_hba(pHba) < 0) {
  2299. adpt_i2o_delete_hba(pHba);
  2300. return -1;
  2301. }
  2302. /* In OPERATIONAL state  */
  2303. return 0;
  2304. }
  2305. static s32 adpt_send_nop(adpt_hba*pHba,u32 m)
  2306. {
  2307. u32 *msg;
  2308. ulong timeout = jiffies + 5*HZ;
  2309. while(m == EMPTY_QUEUE){
  2310. rmb();
  2311. m = readl(pHba->post_port);
  2312. if(m != EMPTY_QUEUE){
  2313. break;
  2314. }
  2315. if(time_after(jiffies,timeout)){
  2316. printk(KERN_ERR "%s: Timeout waiting for message frame!n",pHba->name);
  2317. return 2;
  2318. }
  2319. }
  2320. msg = (u32*)(pHba->msg_addr_virt + m);
  2321. writel( THREE_WORD_MSG_SIZE | SGL_OFFSET_0,&msg[0]);
  2322. writel( I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0,&msg[1]);
  2323. writel( 0,&msg[2]);
  2324. wmb();
  2325. writel(m, pHba->post_port);
  2326. wmb();
  2327. return 0;
  2328. }
  2329. static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
  2330. {
  2331. u8 *status;
  2332. u32 *msg = NULL;
  2333. int i;
  2334. ulong timeout = jiffies + TMOUT_INITOUTBOUND*HZ;
  2335. u32* ptr;
  2336. u32 outbound_frame;  // This had to be a 32 bit address
  2337. u32 m;
  2338. do {
  2339. rmb();
  2340. m = readl(pHba->post_port);
  2341. if (m != EMPTY_QUEUE) {
  2342. break;
  2343. }
  2344. if(time_after(jiffies,timeout)){
  2345. printk(KERN_WARNING"%s: Timeout waiting for message framen",pHba->name);
  2346. return -ETIMEDOUT;
  2347. }
  2348. } while(m == EMPTY_QUEUE);
  2349. msg=(u32 *)(pHba->msg_addr_virt+m);
  2350. status = kmalloc(4,GFP_KERNEL|ADDR32);
  2351. if (status==NULL) {
  2352. adpt_send_nop(pHba, m);
  2353. printk(KERN_WARNING"%s: IOP reset failed - no free memory.n",
  2354. pHba->name);
  2355. return -ENOMEM;
  2356. }
  2357. memset(status, 0, 4);
  2358. writel(EIGHT_WORD_MSG_SIZE| SGL_OFFSET_6, &msg[0]);
  2359. writel(I2O_CMD_OUTBOUND_INIT<<24 | HOST_TID<<12 | ADAPTER_TID, &msg[1]);
  2360. writel(0, &msg[2]);
  2361. writel(0x0106, &msg[3]); /* Transaction context */
  2362. writel(4096, &msg[4]); /* Host page frame size */
  2363. writel((REPLY_FRAME_SIZE)<<16|0x80, &msg[5]); /* Outbound msg frame size and Initcode */
  2364. writel(0xD0000004, &msg[6]); /* Simple SG LE, EOB */
  2365. writel(virt_to_bus(status), &msg[7]);
  2366. writel(m, pHba->post_port);
  2367. wmb();
  2368. // Wait for the reply status to come back
  2369. do {
  2370. if (*status) {
  2371. if (*status != 0x01 /*I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS*/) {
  2372. break;
  2373. }
  2374. }
  2375. rmb();
  2376. if(time_after(jiffies,timeout)){
  2377. printk(KERN_WARNING"%s: Timeout Initializingn",pHba->name);
  2378. kfree((void*)status);
  2379. return -ETIMEDOUT;
  2380. }
  2381. } while (1);
  2382. // If the command was successful, fill the fifo with our reply
  2383. // message packets
  2384. if(*status != 0x04 /*I2O_EXEC_OUTBOUND_INIT_COMPLETE*/) {
  2385. kfree((void*)status);
  2386. return -2;
  2387. }
  2388. kfree((void*)status);
  2389. if(pHba->reply_pool != NULL){
  2390. kfree(pHba->reply_pool);
  2391. }
  2392. pHba->reply_pool = (u32*)kmalloc(pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4, GFP_KERNEL|ADDR32);
  2393. if(!pHba->reply_pool){
  2394. printk(KERN_ERR"%s: Could not allocate reply pooln",pHba->name);
  2395. return -1;
  2396. }
  2397. memset(pHba->reply_pool, 0 , pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4);
  2398. ptr = pHba->reply_pool;
  2399. for(i = 0; i < pHba->reply_fifo_size; i++) {
  2400. outbound_frame = (u32)virt_to_bus(ptr);
  2401. writel(outbound_frame, pHba->reply_port);
  2402. wmb();
  2403. ptr +=  REPLY_FRAME_SIZE;
  2404. }
  2405. adpt_i2o_status_get(pHba);
  2406. return 0;
  2407. }
  2408. /*
  2409.  * I2O System Table.  Contains information about
  2410.  * all the IOPs in the system.  Used to inform IOPs
  2411.  * about each other's existence.
  2412.  *
  2413.  * sys_tbl_ver is the CurrentChangeIndicator that is
  2414.  * used by IOPs to track changes.
  2415.  */
  2416. static s32 adpt_i2o_status_get(adpt_hba* pHba)
  2417. {
  2418. ulong timeout;
  2419. u32 m;
  2420. u32 *msg;
  2421. u8 *status_block=NULL;
  2422. ulong status_block_bus;
  2423. if(pHba->status_block == NULL) {
  2424. pHba->status_block = (i2o_status_block*)
  2425. kmalloc(sizeof(i2o_status_block),GFP_KERNEL|ADDR32);
  2426. if(pHba->status_block == NULL) {
  2427. printk(KERN_ERR
  2428. "dpti%d: Get Status Block failed; Out of memory. n", 
  2429. pHba->unit);
  2430. return -ENOMEM;
  2431. }
  2432. }
  2433. memset(pHba->status_block, 0, sizeof(i2o_status_block));
  2434. status_block = (u8*)(pHba->status_block);
  2435. status_block_bus = virt_to_bus(pHba->status_block);
  2436. timeout = jiffies+TMOUT_GETSTATUS*HZ;
  2437. do {
  2438. rmb();
  2439. m = readl(pHba->post_port);
  2440. if (m != EMPTY_QUEUE) {
  2441. break;
  2442. }
  2443. if(time_after(jiffies,timeout)){
  2444. printk(KERN_ERR "%s: Timeout waiting for message !n",
  2445. pHba->name);
  2446. return -ETIMEDOUT;
  2447. }
  2448. } while(m==EMPTY_QUEUE);
  2449. msg=(u32*)(pHba->msg_addr_virt+m);
  2450. writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg[0]);
  2451. writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg[1]);
  2452. writel(1, &msg[2]);
  2453. writel(0, &msg[3]);
  2454. writel(0, &msg[4]);
  2455. writel(0, &msg[5]);
  2456. writel(((u32)status_block_bus)&0xffffffff, &msg[6]);
  2457. writel(0, &msg[7]);
  2458. writel(sizeof(i2o_status_block), &msg[8]); // 88 bytes
  2459. //post message
  2460. writel(m, pHba->post_port);
  2461. wmb();
  2462. while(status_block[87]!=0xff){
  2463. if(time_after(jiffies,timeout)){
  2464. printk(KERN_ERR"dpti%d: Get status timeout.n",
  2465. pHba->unit);
  2466. return -ETIMEDOUT;
  2467. }
  2468. rmb();
  2469. }
  2470. // Set up our number of outbound and inbound messages
  2471. pHba->post_fifo_size = pHba->status_block->max_inbound_frames;
  2472. if (pHba->post_fifo_size > MAX_TO_IOP_MESSAGES) {
  2473. pHba->post_fifo_size = MAX_TO_IOP_MESSAGES;
  2474. }
  2475. pHba->reply_fifo_size = pHba->status_block->max_outbound_frames;
  2476. if (pHba->reply_fifo_size > MAX_FROM_IOP_MESSAGES) {
  2477. pHba->reply_fifo_size = MAX_FROM_IOP_MESSAGES;
  2478. }
  2479. // Calculate the Scatter Gather list size
  2480. pHba->sg_tablesize = (pHba->status_block->inbound_frame_size * 4 -40)/ sizeof(struct sg_simple_element);
  2481. if (pHba->sg_tablesize > SG_LIST_ELEMENTS) {
  2482. pHba->sg_tablesize = SG_LIST_ELEMENTS;
  2483. }
  2484. #ifdef DEBUG
  2485. printk("dpti%d: State = ",pHba->unit);
  2486. switch(pHba->status_block->iop_state) {
  2487. case 0x01:
  2488. printk("INITn");
  2489. break;
  2490. case 0x02:
  2491. printk("RESETn");
  2492. break;
  2493. case 0x04:
  2494. printk("HOLDn");
  2495. break;
  2496. case 0x05:
  2497. printk("READYn");
  2498. break;
  2499. case 0x08:
  2500. printk("OPERATIONALn");
  2501. break;
  2502. case 0x10:
  2503. printk("FAILEDn");
  2504. break;
  2505. case 0x11:
  2506. printk("FAULTEDn");
  2507. break;
  2508. default:
  2509. printk("%x (unknown!!)n",pHba->status_block->iop_state);
  2510. }
  2511. #endif
  2512. return 0;
  2513. }
  2514. /*
  2515.  * Get the IOP's Logical Configuration Table
  2516.  */
  2517. static int adpt_i2o_lct_get(adpt_hba* pHba)
  2518. {
  2519. u32 msg[8];
  2520. int ret;
  2521. u32 buf[16];
  2522. if ((pHba->lct_size == 0) || (pHba->lct == NULL)){
  2523. pHba->lct_size = pHba->status_block->expected_lct_size;
  2524. }
  2525. do {
  2526. if (pHba->lct == NULL) {
  2527. pHba->lct = kmalloc(pHba->lct_size, GFP_KERNEL|ADDR32);
  2528. if(pHba->lct == NULL) {
  2529. printk(KERN_CRIT "%s: Lct Get failed. Out of memory.n",
  2530. pHba->name);
  2531. return -ENOMEM;
  2532. }
  2533. }
  2534. memset(pHba->lct, 0, pHba->lct_size);
  2535. msg[0] = EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6;
  2536. msg[1] = I2O_CMD_LCT_NOTIFY<<24 | HOST_TID<<12 | ADAPTER_TID;
  2537. msg[2] = 0;
  2538. msg[3] = 0;
  2539. msg[4] = 0xFFFFFFFF; /* All devices */
  2540. msg[5] = 0x00000000; /* Report now */
  2541. msg[6] = 0xD0000000|pHba->lct_size;
  2542. msg[7] = virt_to_bus(pHba->lct);
  2543. if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 360))) {
  2544. printk(KERN_ERR "%s: LCT Get failed (status=%#10x.n", 
  2545. pHba->name, ret);
  2546. printk(KERN_ERR"Adaptec: Error Reading Hardware.n");
  2547. return ret;
  2548. }
  2549. if ((pHba->lct->table_size << 2) > pHba->lct_size) {
  2550. pHba->lct_size = pHba->lct->table_size << 2;
  2551. kfree(pHba->lct);
  2552. pHba->lct = NULL;
  2553. }
  2554. } while (pHba->lct == NULL);
  2555. PDEBUG("%s: Hardware resource table read.n", pHba->name);
  2556. // I2O_DPT_EXEC_IOP_BUFFERS_GROUP_NO;
  2557. if(adpt_i2o_query_scalar(pHba, 0 , 0x8000, -1, buf, sizeof(buf))>=0) {
  2558. pHba->FwDebugBufferSize = buf[1];
  2559. pHba->FwDebugBuffer_P    = pHba->base_addr_virt + buf[0];
  2560. pHba->FwDebugFlags_P     = pHba->FwDebugBuffer_P + FW_DEBUG_FLAGS_OFFSET;
  2561. pHba->FwDebugBLEDvalue_P = pHba->FwDebugBuffer_P + FW_DEBUG_BLED_OFFSET;
  2562. pHba->FwDebugBLEDflag_P  = pHba->FwDebugBLEDvalue_P + 1;
  2563. pHba->FwDebugStrLength_P = pHba->FwDebugBuffer_P + FW_DEBUG_STR_LENGTH_OFFSET;
  2564. pHba->FwDebugBuffer_P += buf[2]; 
  2565. pHba->FwDebugFlags = 0;
  2566. }
  2567. return 0;
  2568. }
  2569. static int adpt_i2o_build_sys_table(void)
  2570. {
  2571. adpt_hba* pHba = NULL;
  2572. int count = 0;
  2573. sys_tbl_len = sizeof(struct i2o_sys_tbl) + // Header + IOPs
  2574. (hba_count) * sizeof(struct i2o_sys_tbl_entry);
  2575. if(sys_tbl)
  2576. kfree(sys_tbl);
  2577. sys_tbl = kmalloc(sys_tbl_len, GFP_KERNEL|ADDR32);
  2578. if(!sys_tbl) {
  2579. printk(KERN_WARNING "SysTab Set failed. Out of memory.n");
  2580. return -ENOMEM;
  2581. }
  2582. memset(sys_tbl, 0, sys_tbl_len);
  2583. sys_tbl->num_entries = hba_count;
  2584. sys_tbl->version = I2OVERSION;
  2585. sys_tbl->change_ind = sys_tbl_ind++;
  2586. for(pHba = hba_chain; pHba; pHba = pHba->next) {
  2587. // Get updated Status Block so we have the latest information
  2588. if (adpt_i2o_status_get(pHba)) {
  2589. sys_tbl->num_entries--;
  2590. continue; // try next one
  2591. }
  2592. sys_tbl->iops[count].org_id = pHba->status_block->org_id;
  2593. sys_tbl->iops[count].iop_id = pHba->unit + 2;
  2594. sys_tbl->iops[count].seg_num = 0;
  2595. sys_tbl->iops[count].i2o_version = pHba->status_block->i2o_version;
  2596. sys_tbl->iops[count].iop_state = pHba->status_block->iop_state;
  2597. sys_tbl->iops[count].msg_type = pHba->status_block->msg_type;
  2598. sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
  2599. sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
  2600. sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
  2601. sys_tbl->iops[count].inbound_low = (u32)virt_to_bus((void*)pHba->post_port);
  2602. sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus((void*)pHba->post_port)>>32);
  2603. count++;
  2604. }
  2605. #ifdef DEBUG
  2606. {
  2607. u32 *table = (u32*)sys_tbl;
  2608. printk(KERN_DEBUG"sys_tbl_len=%d in 32bit wordsn",(sys_tbl_len >>2));
  2609. for(count = 0; count < (sys_tbl_len >>2); count++) {
  2610. printk(KERN_INFO "sys_tbl[%d] = %0#10xn", 
  2611. count, table[count]);
  2612. }
  2613. }
  2614. #endif
  2615. return 0;
  2616. }
  2617. /*
  2618.  *  Dump the information block associated with a given unit (TID)
  2619.  */
  2620.  
  2621. static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d)
  2622. {
  2623. char buf[64];
  2624. int unit = d->lct_data.tid;
  2625. printk(KERN_INFO "TID %3.3d ", unit);
  2626. if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 3, buf, 16)>=0)
  2627. {
  2628. buf[16]=0;
  2629. printk(" Vendor: %-12.12s", buf);
  2630. }
  2631. if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 4, buf, 16)>=0)
  2632. {
  2633. buf[16]=0;
  2634. printk(" Device: %-12.12s", buf);
  2635. }
  2636. if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 6, buf, 8)>=0)
  2637. {
  2638. buf[8]=0;
  2639. printk(" Rev: %-12.12sn", buf);
  2640. }
  2641. #ifdef DEBUG
  2642.  printk(KERN_INFO "tClass: %.21sn", adpt_i2o_get_class_name(d->lct_data.class_id));
  2643.  printk(KERN_INFO "tSubclass: 0x%04Xn", d->lct_data.sub_class);
  2644.  printk(KERN_INFO "tFlags: ");
  2645.  if(d->lct_data.device_flags&(1<<0))
  2646.   printk("C");      // ConfigDialog requested
  2647.  if(d->lct_data.device_flags&(1<<1))
  2648.   printk("U");      // Multi-user capable
  2649.  if(!(d->lct_data.device_flags&(1<<4)))
  2650.   printk("P");      // Peer service enabled!
  2651.  if(!(d->lct_data.device_flags&(1<<5)))
  2652.   printk("M");      // Mgmt service enabled!
  2653.  printk("n");
  2654. #endif
  2655. }
  2656. #ifdef DEBUG
  2657. /*
  2658.  * Do i2o class name lookup
  2659.  */
  2660. static const char *adpt_i2o_get_class_name(int class)
  2661. {
  2662. int idx = 16;
  2663. static char *i2o_class_name[] = {
  2664. "Executive",
  2665. "Device Driver Module",
  2666. "Block Device",
  2667. "Tape Device",
  2668. "LAN Interface",
  2669. "WAN Interface",
  2670. "Fibre Channel Port",
  2671. "Fibre Channel Device",
  2672. "SCSI Device",
  2673. "ATE Port",
  2674. "ATE Device",
  2675. "Floppy Controller",
  2676. "Floppy Device",
  2677. "Secondary Bus Port",
  2678. "Peer Transport Agent",
  2679. "Peer Transport",
  2680. "Unknown"
  2681. };
  2682. switch(class&0xFFF) {
  2683. case I2O_CLASS_EXECUTIVE:
  2684. idx = 0; break;
  2685. case I2O_CLASS_DDM:
  2686. idx = 1; break;
  2687. case I2O_CLASS_RANDOM_BLOCK_STORAGE:
  2688. idx = 2; break;
  2689. case I2O_CLASS_SEQUENTIAL_STORAGE:
  2690. idx = 3; break;
  2691. case I2O_CLASS_LAN:
  2692. idx = 4; break;
  2693. case I2O_CLASS_WAN:
  2694. idx = 5; break;
  2695. case I2O_CLASS_FIBRE_CHANNEL_PORT:
  2696. idx = 6; break;
  2697. case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
  2698. idx = 7; break;
  2699. case I2O_CLASS_SCSI_PERIPHERAL:
  2700. idx = 8; break;
  2701. case I2O_CLASS_ATE_PORT:
  2702. idx = 9; break;
  2703. case I2O_CLASS_ATE_PERIPHERAL:
  2704. idx = 10; break;
  2705. case I2O_CLASS_FLOPPY_CONTROLLER:
  2706. idx = 11; break;
  2707. case I2O_CLASS_FLOPPY_DEVICE:
  2708. idx = 12; break;
  2709. case I2O_CLASS_BUS_ADAPTER_PORT:
  2710. idx = 13; break;
  2711. case I2O_CLASS_PEER_TRANSPORT_AGENT:
  2712. idx = 14; break;
  2713. case I2O_CLASS_PEER_TRANSPORT:
  2714. idx = 15; break;
  2715. }
  2716. return i2o_class_name[idx];
  2717. }
  2718. #endif
  2719. static s32 adpt_i2o_hrt_get(adpt_hba* pHba)
  2720. {
  2721. u32 msg[6];
  2722. int ret, size = sizeof(i2o_hrt);
  2723. do {
  2724. if (pHba->hrt == NULL) {
  2725. pHba->hrt=kmalloc(size, GFP_KERNEL|ADDR32);
  2726. if (pHba->hrt == NULL) {
  2727. printk(KERN_CRIT "%s: Hrt Get failed; Out of memory.n", pHba->name);
  2728. return -ENOMEM;
  2729. }
  2730. }
  2731. msg[0]= SIX_WORD_MSG_SIZE| SGL_OFFSET_4;
  2732. msg[1]= I2O_CMD_HRT_GET<<24 | HOST_TID<<12 | ADAPTER_TID;
  2733. msg[2]= 0;
  2734. msg[3]= 0;
  2735. msg[4]= (0xD0000000 | size);    /* Simple transaction */
  2736. msg[5]= virt_to_bus(pHba->hrt);   /* Dump it here */
  2737. if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg),20))) {
  2738. printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)n", pHba->name, ret);
  2739. return ret;
  2740. }
  2741. if (pHba->hrt->num_entries * pHba->hrt->entry_len << 2 > size) {
  2742. size = pHba->hrt->num_entries * pHba->hrt->entry_len << 2;
  2743. kfree(pHba->hrt);
  2744. pHba->hrt = NULL;
  2745. }
  2746. } while(pHba->hrt == NULL);
  2747. return 0;
  2748. }                                                                                                                                       
  2749. /*
  2750.  *  Query one scalar group value or a whole scalar group.
  2751.  */     
  2752. static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid, 
  2753. int group, int field, void *buf, int buflen)
  2754. {
  2755. u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field };
  2756. u8  resblk[8+buflen]; /* 8 bytes for header */
  2757. int size;
  2758. if (field == -1)   /* whole group */
  2759. opblk[4] = -1;
  2760. size = adpt_i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, pHba, tid, 
  2761. opblk, sizeof(opblk), resblk, sizeof(resblk));
  2762. memcpy(buf, resblk+8, buflen);  /* cut off header */
  2763. if (size < 0)
  2764. return size;
  2765. return buflen;
  2766. }
  2767. /* Issue UTIL_PARAMS_GET or UTIL_PARAMS_SET
  2768.  *
  2769.  * This function can be used for all UtilParamsGet/Set operations.
  2770.  * The OperationBlock is given in opblk-buffer, 
  2771.  * and results are returned in resblk-buffer.
  2772.  * Note that the minimum sized resblk is 8 bytes and contains
  2773.  * ResultCount, ErrorInfoSize, BlockStatus and BlockSize.
  2774.  */
  2775. static int adpt_i2o_issue_params(int cmd, adpt_hba* pHba, int tid, 
  2776.   void *opblk, int oplen, void *resblk, int reslen)
  2777. {
  2778. u32 msg[9]; 
  2779. u32 *res = (u32 *)resblk;
  2780. int wait_status;
  2781. msg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_5;
  2782. msg[1] = cmd << 24 | HOST_TID << 12 | tid; 
  2783. msg[2] = 0;
  2784. msg[3] = 0;
  2785. msg[4] = 0;
  2786. msg[5] = 0x54000000 | oplen; /* OperationBlock */
  2787. msg[6] = virt_to_bus(opblk);
  2788. msg[7] = 0xD0000000 | reslen; /* ResultBlock */
  2789. msg[8] = virt_to_bus(resblk);
  2790. if ((wait_status = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 20))) {
  2791.     return wait_status;  /* -DetailedStatus */
  2792. }
  2793. if (res[1]&0x00FF0000) {  /* BlockStatus != SUCCESS */
  2794. printk(KERN_WARNING "%s: %s - Error:n  ErrorInfoSize = 0x%02x, "
  2795. "BlockStatus = 0x%02x, BlockSize = 0x%04xn",
  2796. pHba->name,
  2797. (cmd == I2O_CMD_UTIL_PARAMS_SET) ? "PARAMS_SET"
  2798.  : "PARAMS_GET",   
  2799. res[1]>>24, (res[1]>>16)&0xFF, res[1]&0xFFFF);
  2800. return -((res[1] >> 16) & 0xFF); /* -BlockStatus */
  2801. }
  2802.  return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */ 
  2803. }
  2804. static s32 adpt_i2o_quiesce_hba(adpt_hba* pHba)
  2805. {
  2806. u32 msg[4];
  2807. int ret;
  2808. adpt_i2o_status_get(pHba);
  2809. /* SysQuiesce discarded if IOP not in READY or OPERATIONAL state */
  2810. if((pHba->status_block->iop_state != ADAPTER_STATE_READY) &&
  2811.        (pHba->status_block->iop_state != ADAPTER_STATE_OPERATIONAL)){
  2812. return 0;
  2813. }
  2814. msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
  2815. msg[1] = I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID;
  2816. msg[2] = 0;
  2817. msg[3] = 0;
  2818. if((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
  2819. printk(KERN_INFO"dpti%d: Unable to quiesce (status=%#x).n",
  2820. pHba->unit, -ret);
  2821. } else {
  2822. printk(KERN_INFO"dpti%d: Quiesced.n",pHba->unit);
  2823. }
  2824. adpt_i2o_status_get(pHba);
  2825. return ret;
  2826. }
  2827. /* 
  2828.  * Enable IOP. Allows the IOP to resume external operations.
  2829.  */
  2830. static int adpt_i2o_enable_hba(adpt_hba* pHba)
  2831. {
  2832. u32 msg[4];
  2833. int ret;
  2834. adpt_i2o_status_get(pHba);
  2835. if(!pHba->status_block){
  2836. return -ENOMEM;
  2837. }
  2838. /* Enable only allowed on READY state */
  2839. if(pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL)
  2840. return 0;
  2841. if(pHba->status_block->iop_state != ADAPTER_STATE_READY)
  2842. return -EINVAL;
  2843. msg[0]=FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
  2844. msg[1]=I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID;
  2845. msg[2]= 0;
  2846. msg[3]= 0;
  2847. if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
  2848. printk(KERN_WARNING"%s: Could not enable (status=%#10x).n", 
  2849. pHba->name, ret);
  2850. } else {
  2851. PDEBUG("%s: Enabled.n", pHba->name);
  2852. }
  2853. adpt_i2o_status_get(pHba);
  2854. return ret;
  2855. }
  2856. static int adpt_i2o_systab_send(adpt_hba* pHba)
  2857. {
  2858.  u32 msg[12];
  2859.  int ret;
  2860. msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6;
  2861. msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID;
  2862. msg[2] = 0;
  2863. msg[3] = 0;
  2864. msg[4] = (0<<16) | ((pHba->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */
  2865. msg[5] = 0;    /* Segment 0 */
  2866. /* 
  2867.  * Provide three SGL-elements:
  2868.  * System table (SysTab), Private memory space declaration and 
  2869.  * Private i/o space declaration  
  2870.  */
  2871. msg[6] = 0x54000000 | sys_tbl_len;
  2872. msg[7] = virt_to_phys(sys_tbl);
  2873. msg[8] = 0x54000000 | 0;
  2874. msg[9] = 0;
  2875. msg[10] = 0xD4000000 | 0;
  2876. msg[11] = 0;
  2877. if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 120))) {
  2878. printk(KERN_INFO "%s: Unable to set SysTab (status=%#10x).n", 
  2879. pHba->name, ret);
  2880. }
  2881. #ifdef DEBUG
  2882. else {
  2883. PINFO("%s: SysTab set.n", pHba->name);
  2884. }
  2885. #endif
  2886. return ret;
  2887.  }
  2888. /*============================================================================
  2889.  *
  2890.  *============================================================================
  2891.  */
  2892. #ifdef UARTDELAY 
  2893. static static void adpt_delay(int millisec)
  2894. {
  2895. int i;
  2896. for (i = 0; i < millisec; i++) {
  2897. udelay(1000); /* delay for one millisecond */
  2898. }
  2899. }
  2900. #endif
  2901. static Scsi_Host_Template driver_template = DPT_I2O;
  2902. #include "scsi_module.c"
  2903. EXPORT_NO_SYMBOLS;
  2904. MODULE_LICENSE("GPL");