src.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018
  1. /*
  2. * Adaptec AAC series RAID controller driver
  3. * (c) Copyright 2001 Red Hat Inc.
  4. *
  5. * based on the old aacraid driver that is..
  6. * Adaptec aacraid device driver for Linux.
  7. *
  8. * Copyright (c) 2000-2010 Adaptec, Inc.
  9. * 2010 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2, or (at your option)
  14. * any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; see the file COPYING. If not, write to
  23. * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  24. *
  25. * Module Name:
  26. * src.c
  27. *
  28. * Abstract: Hardware Device Interface for PMC SRC based controllers
  29. *
  30. */
  31. #include <linux/kernel.h>
  32. #include <linux/init.h>
  33. #include <linux/types.h>
  34. #include <linux/pci.h>
  35. #include <linux/spinlock.h>
  36. #include <linux/slab.h>
  37. #include <linux/blkdev.h>
  38. #include <linux/delay.h>
  39. #include <linux/completion.h>
  40. #include <linux/time.h>
  41. #include <linux/interrupt.h>
  42. #include <scsi/scsi_host.h>
  43. #include "aacraid.h"
  44. static int aac_src_get_sync_status(struct aac_dev *dev);
  45. static irqreturn_t aac_src_intr_message(int irq, void *dev_id)
  46. {
  47. struct aac_msix_ctx *ctx;
  48. struct aac_dev *dev;
  49. unsigned long bellbits, bellbits_shifted;
  50. int vector_no;
  51. int isFastResponse, mode;
  52. u32 index, handle;
  53. ctx = (struct aac_msix_ctx *)dev_id;
  54. dev = ctx->dev;
  55. vector_no = ctx->vector_no;
  56. if (dev->msi_enabled) {
  57. mode = AAC_INT_MODE_MSI;
  58. if (vector_no == 0) {
  59. bellbits = src_readl(dev, MUnit.ODR_MSI);
  60. if (bellbits & 0x40000)
  61. mode |= AAC_INT_MODE_AIF;
  62. if (bellbits & 0x1000)
  63. mode |= AAC_INT_MODE_SYNC;
  64. }
  65. } else {
  66. mode = AAC_INT_MODE_INTX;
  67. bellbits = src_readl(dev, MUnit.ODR_R);
  68. if (bellbits & PmDoorBellResponseSent) {
  69. bellbits = PmDoorBellResponseSent;
  70. src_writel(dev, MUnit.ODR_C, bellbits);
  71. src_readl(dev, MUnit.ODR_C);
  72. } else {
  73. bellbits_shifted = (bellbits >> SRC_ODR_SHIFT);
  74. src_writel(dev, MUnit.ODR_C, bellbits);
  75. src_readl(dev, MUnit.ODR_C);
  76. if (bellbits_shifted & DoorBellAifPending)
  77. mode |= AAC_INT_MODE_AIF;
  78. else if (bellbits_shifted & OUTBOUNDDOORBELL_0)
  79. mode |= AAC_INT_MODE_SYNC;
  80. }
  81. }
  82. if (mode & AAC_INT_MODE_SYNC) {
  83. unsigned long sflags;
  84. struct list_head *entry;
  85. int send_it = 0;
  86. extern int aac_sync_mode;
  87. if (!aac_sync_mode && !dev->msi_enabled) {
  88. src_writel(dev, MUnit.ODR_C, bellbits);
  89. src_readl(dev, MUnit.ODR_C);
  90. }
  91. if (dev->sync_fib) {
  92. if (dev->sync_fib->callback)
  93. dev->sync_fib->callback(dev->sync_fib->callback_data,
  94. dev->sync_fib);
  95. spin_lock_irqsave(&dev->sync_fib->event_lock, sflags);
  96. if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) {
  97. dev->management_fib_count--;
  98. up(&dev->sync_fib->event_wait);
  99. }
  100. spin_unlock_irqrestore(&dev->sync_fib->event_lock,
  101. sflags);
  102. spin_lock_irqsave(&dev->sync_lock, sflags);
  103. if (!list_empty(&dev->sync_fib_list)) {
  104. entry = dev->sync_fib_list.next;
  105. dev->sync_fib = list_entry(entry,
  106. struct fib,
  107. fiblink);
  108. list_del(entry);
  109. send_it = 1;
  110. } else {
  111. dev->sync_fib = NULL;
  112. }
  113. spin_unlock_irqrestore(&dev->sync_lock, sflags);
  114. if (send_it) {
  115. aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB,
  116. (u32)dev->sync_fib->hw_fib_pa,
  117. 0, 0, 0, 0, 0,
  118. NULL, NULL, NULL, NULL, NULL);
  119. }
  120. }
  121. if (!dev->msi_enabled)
  122. mode = 0;
  123. }
  124. if (mode & AAC_INT_MODE_AIF) {
  125. /* handle AIF */
  126. if (dev->aif_thread && dev->fsa_dev)
  127. aac_intr_normal(dev, 0, 2, 0, NULL);
  128. if (dev->msi_enabled)
  129. aac_src_access_devreg(dev, AAC_CLEAR_AIF_BIT);
  130. mode = 0;
  131. }
  132. if (mode) {
  133. index = dev->host_rrq_idx[vector_no];
  134. for (;;) {
  135. isFastResponse = 0;
  136. /* remove toggle bit (31) */
  137. handle = (dev->host_rrq[index] & 0x7fffffff);
  138. /* check fast response bit (30) */
  139. if (handle & 0x40000000)
  140. isFastResponse = 1;
  141. handle &= 0x0000ffff;
  142. if (handle == 0)
  143. break;
  144. if (dev->msi_enabled && dev->max_msix > 1)
  145. atomic_dec(&dev->rrq_outstanding[vector_no]);
  146. dev->host_rrq[index++] = 0;
  147. aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL);
  148. if (index == (vector_no + 1) * dev->vector_cap)
  149. index = vector_no * dev->vector_cap;
  150. dev->host_rrq_idx[vector_no] = index;
  151. }
  152. mode = 0;
  153. }
  154. return IRQ_HANDLED;
  155. }
  156. /**
  157. * aac_src_disable_interrupt - Disable interrupts
  158. * @dev: Adapter
  159. */
  160. static void aac_src_disable_interrupt(struct aac_dev *dev)
  161. {
  162. src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
  163. }
  164. /**
  165. * aac_src_enable_interrupt_message - Enable interrupts
  166. * @dev: Adapter
  167. */
  168. static void aac_src_enable_interrupt_message(struct aac_dev *dev)
  169. {
  170. aac_src_access_devreg(dev, AAC_ENABLE_INTERRUPT);
  171. }
  172. /**
  173. * src_sync_cmd - send a command and wait
  174. * @dev: Adapter
  175. * @command: Command to execute
  176. * @p1: first parameter
  177. * @ret: adapter status
  178. *
  179. * This routine will send a synchronous command to the adapter and wait
  180. * for its completion.
  181. */
  182. static int src_sync_cmd(struct aac_dev *dev, u32 command,
  183. u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
  184. u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
  185. {
  186. unsigned long start;
  187. unsigned long delay;
  188. int ok;
  189. /*
  190. * Write the command into Mailbox 0
  191. */
  192. writel(command, &dev->IndexRegs->Mailbox[0]);
  193. /*
  194. * Write the parameters into Mailboxes 1 - 6
  195. */
  196. writel(p1, &dev->IndexRegs->Mailbox[1]);
  197. writel(p2, &dev->IndexRegs->Mailbox[2]);
  198. writel(p3, &dev->IndexRegs->Mailbox[3]);
  199. writel(p4, &dev->IndexRegs->Mailbox[4]);
  200. /*
  201. * Clear the synch command doorbell to start on a clean slate.
  202. */
  203. if (!dev->msi_enabled)
  204. src_writel(dev,
  205. MUnit.ODR_C,
  206. OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
  207. /*
  208. * Disable doorbell interrupts
  209. */
  210. src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff);
  211. /*
  212. * Force the completion of the mask register write before issuing
  213. * the interrupt.
  214. */
  215. src_readl(dev, MUnit.OIMR);
  216. /*
  217. * Signal that there is a new synch command
  218. */
  219. src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT);
  220. if (!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) {
  221. ok = 0;
  222. start = jiffies;
  223. if (command == IOP_RESET_ALWAYS) {
  224. /* Wait up to 10 sec */
  225. delay = 10*HZ;
  226. } else {
  227. /* Wait up to 5 minutes */
  228. delay = 300*HZ;
  229. }
  230. while (time_before(jiffies, start+delay)) {
  231. udelay(5); /* Delay 5 microseconds to let Mon960 get info. */
  232. /*
  233. * Mon960 will set doorbell0 bit when it has completed the command.
  234. */
  235. if (aac_src_get_sync_status(dev) & OUTBOUNDDOORBELL_0) {
  236. /*
  237. * Clear the doorbell.
  238. */
  239. if (dev->msi_enabled)
  240. aac_src_access_devreg(dev,
  241. AAC_CLEAR_SYNC_BIT);
  242. else
  243. src_writel(dev,
  244. MUnit.ODR_C,
  245. OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
  246. ok = 1;
  247. break;
  248. }
  249. /*
  250. * Yield the processor in case we are slow
  251. */
  252. msleep(1);
  253. }
  254. if (unlikely(ok != 1)) {
  255. /*
  256. * Restore interrupt mask even though we timed out
  257. */
  258. aac_adapter_enable_int(dev);
  259. return -ETIMEDOUT;
  260. }
  261. /*
  262. * Pull the synch status from Mailbox 0.
  263. */
  264. if (status)
  265. *status = readl(&dev->IndexRegs->Mailbox[0]);
  266. if (r1)
  267. *r1 = readl(&dev->IndexRegs->Mailbox[1]);
  268. if (r2)
  269. *r2 = readl(&dev->IndexRegs->Mailbox[2]);
  270. if (r3)
  271. *r3 = readl(&dev->IndexRegs->Mailbox[3]);
  272. if (r4)
  273. *r4 = readl(&dev->IndexRegs->Mailbox[4]);
  274. if (command == GET_COMM_PREFERRED_SETTINGS)
  275. dev->max_msix =
  276. readl(&dev->IndexRegs->Mailbox[5]) & 0xFFFF;
  277. /*
  278. * Clear the synch command doorbell.
  279. */
  280. if (!dev->msi_enabled)
  281. src_writel(dev,
  282. MUnit.ODR_C,
  283. OUTBOUNDDOORBELL_0 << SRC_ODR_SHIFT);
  284. }
  285. /*
  286. * Restore interrupt mask
  287. */
  288. aac_adapter_enable_int(dev);
  289. return 0;
  290. }
  291. /**
  292. * aac_src_interrupt_adapter - interrupt adapter
  293. * @dev: Adapter
  294. *
  295. * Send an interrupt to the i960 and breakpoint it.
  296. */
  297. static void aac_src_interrupt_adapter(struct aac_dev *dev)
  298. {
  299. src_sync_cmd(dev, BREAKPOINT_REQUEST,
  300. 0, 0, 0, 0, 0, 0,
  301. NULL, NULL, NULL, NULL, NULL);
  302. }
  303. /**
  304. * aac_src_notify_adapter - send an event to the adapter
  305. * @dev: Adapter
  306. * @event: Event to send
  307. *
  308. * Notify the i960 that something it probably cares about has
  309. * happened.
  310. */
  311. static void aac_src_notify_adapter(struct aac_dev *dev, u32 event)
  312. {
  313. switch (event) {
  314. case AdapNormCmdQue:
  315. src_writel(dev, MUnit.ODR_C,
  316. INBOUNDDOORBELL_1 << SRC_ODR_SHIFT);
  317. break;
  318. case HostNormRespNotFull:
  319. src_writel(dev, MUnit.ODR_C,
  320. INBOUNDDOORBELL_4 << SRC_ODR_SHIFT);
  321. break;
  322. case AdapNormRespQue:
  323. src_writel(dev, MUnit.ODR_C,
  324. INBOUNDDOORBELL_2 << SRC_ODR_SHIFT);
  325. break;
  326. case HostNormCmdNotFull:
  327. src_writel(dev, MUnit.ODR_C,
  328. INBOUNDDOORBELL_3 << SRC_ODR_SHIFT);
  329. break;
  330. case FastIo:
  331. src_writel(dev, MUnit.ODR_C,
  332. INBOUNDDOORBELL_6 << SRC_ODR_SHIFT);
  333. break;
  334. case AdapPrintfDone:
  335. src_writel(dev, MUnit.ODR_C,
  336. INBOUNDDOORBELL_5 << SRC_ODR_SHIFT);
  337. break;
  338. default:
  339. BUG();
  340. break;
  341. }
  342. }
  343. /**
  344. * aac_src_start_adapter - activate adapter
  345. * @dev: Adapter
  346. *
  347. * Start up processing on an i960 based AAC adapter
  348. */
  349. static void aac_src_start_adapter(struct aac_dev *dev)
  350. {
  351. struct aac_init *init;
  352. int i;
  353. /* reset host_rrq_idx first */
  354. for (i = 0; i < dev->max_msix; i++) {
  355. dev->host_rrq_idx[i] = i * dev->vector_cap;
  356. atomic_set(&dev->rrq_outstanding[i], 0);
  357. }
  358. dev->fibs_pushed_no = 0;
  359. init = dev->init;
  360. init->HostElapsedSeconds = cpu_to_le32(get_seconds());
  361. /* We can only use a 32 bit address here */
  362. src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
  363. 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
  364. }
  365. /**
  366. * aac_src_check_health
  367. * @dev: device to check if healthy
  368. *
  369. * Will attempt to determine if the specified adapter is alive and
  370. * capable of handling requests, returning 0 if alive.
  371. */
  372. static int aac_src_check_health(struct aac_dev *dev)
  373. {
  374. u32 status = src_readl(dev, MUnit.OMR);
  375. /*
  376. * Check to see if the board failed any self tests.
  377. */
  378. if (unlikely(status & SELF_TEST_FAILED))
  379. return -1;
  380. /*
  381. * Check to see if the board panic'd.
  382. */
  383. if (unlikely(status & KERNEL_PANIC))
  384. return (status >> 16) & 0xFF;
  385. /*
  386. * Wait for the adapter to be up and running.
  387. */
  388. if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
  389. return -3;
  390. /*
  391. * Everything is OK
  392. */
  393. return 0;
  394. }
  395. /**
  396. * aac_src_deliver_message
  397. * @fib: fib to issue
  398. *
  399. * Will send a fib, returning 0 if successful.
  400. */
  401. static int aac_src_deliver_message(struct fib *fib)
  402. {
  403. struct aac_dev *dev = fib->dev;
  404. struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
  405. u32 fibsize;
  406. dma_addr_t address;
  407. struct aac_fib_xporthdr *pFibX;
  408. #if !defined(writeq)
  409. unsigned long flags;
  410. #endif
  411. u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
  412. u16 vector_no;
  413. atomic_inc(&q->numpending);
  414. if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest &&
  415. dev->max_msix > 1) {
  416. vector_no = fib->vector_no;
  417. fib->hw_fib_va->header.Handle += (vector_no << 16);
  418. } else {
  419. vector_no = 0;
  420. }
  421. atomic_inc(&dev->rrq_outstanding[vector_no]);
  422. if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) {
  423. /* Calculate the amount to the fibsize bits */
  424. fibsize = (hdr_size + 127) / 128 - 1;
  425. if (fibsize > (ALIGN32 - 1))
  426. return -EMSGSIZE;
  427. /* New FIB header, 32-bit */
  428. address = fib->hw_fib_pa;
  429. fib->hw_fib_va->header.StructType = FIB_MAGIC2;
  430. fib->hw_fib_va->header.SenderFibAddress = (u32)address;
  431. fib->hw_fib_va->header.u.TimeStamp = 0;
  432. BUG_ON(upper_32_bits(address) != 0L);
  433. address |= fibsize;
  434. } else {
  435. /* Calculate the amount to the fibsize bits */
  436. fibsize = (sizeof(struct aac_fib_xporthdr) + hdr_size + 127) / 128 - 1;
  437. if (fibsize > (ALIGN32 - 1))
  438. return -EMSGSIZE;
  439. /* Fill XPORT header */
  440. pFibX = (void *)fib->hw_fib_va - sizeof(struct aac_fib_xporthdr);
  441. pFibX->Handle = cpu_to_le32(fib->hw_fib_va->header.Handle);
  442. pFibX->HostAddress = cpu_to_le64(fib->hw_fib_pa);
  443. pFibX->Size = cpu_to_le32(hdr_size);
  444. /*
  445. * The xport header has been 32-byte aligned for us so that fibsize
  446. * can be masked out of this address by hardware. -- BenC
  447. */
  448. address = fib->hw_fib_pa - sizeof(struct aac_fib_xporthdr);
  449. if (address & (ALIGN32 - 1))
  450. return -EINVAL;
  451. address |= fibsize;
  452. }
  453. #if defined(writeq)
  454. src_writeq(dev, MUnit.IQ_L, (u64)address);
  455. #else
  456. spin_lock_irqsave(&fib->dev->iq_lock, flags);
  457. src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
  458. src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
  459. spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
  460. #endif
  461. return 0;
  462. }
  463. /**
  464. * aac_src_ioremap
  465. * @size: mapping resize request
  466. *
  467. */
  468. static int aac_src_ioremap(struct aac_dev *dev, u32 size)
  469. {
  470. if (!size) {
  471. iounmap(dev->regs.src.bar1);
  472. dev->regs.src.bar1 = NULL;
  473. iounmap(dev->regs.src.bar0);
  474. dev->base = dev->regs.src.bar0 = NULL;
  475. return 0;
  476. }
  477. dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
  478. AAC_MIN_SRC_BAR1_SIZE);
  479. dev->base = NULL;
  480. if (dev->regs.src.bar1 == NULL)
  481. return -1;
  482. dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
  483. if (dev->base == NULL) {
  484. iounmap(dev->regs.src.bar1);
  485. dev->regs.src.bar1 = NULL;
  486. return -1;
  487. }
  488. dev->IndexRegs = &((struct src_registers __iomem *)
  489. dev->base)->u.tupelo.IndexRegs;
  490. return 0;
  491. }
  492. /**
  493. * aac_srcv_ioremap
  494. * @size: mapping resize request
  495. *
  496. */
  497. static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
  498. {
  499. if (!size) {
  500. iounmap(dev->regs.src.bar0);
  501. dev->base = dev->regs.src.bar0 = NULL;
  502. return 0;
  503. }
  504. dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
  505. if (dev->base == NULL)
  506. return -1;
  507. dev->IndexRegs = &((struct src_registers __iomem *)
  508. dev->base)->u.denali.IndexRegs;
  509. return 0;
  510. }
  511. static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
  512. {
  513. u32 var, reset_mask;
  514. if (bled >= 0) {
  515. if (bled)
  516. printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n",
  517. dev->name, dev->id, bled);
  518. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  519. bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
  520. 0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
  521. if ((bled || (var != 0x00000001)) &&
  522. !dev->doorbell_mask)
  523. return -EINVAL;
  524. else if (dev->doorbell_mask) {
  525. reset_mask = dev->doorbell_mask;
  526. bled = 0;
  527. var = 0x00000001;
  528. }
  529. if ((dev->pdev->device == PMC_DEVICE_S7 ||
  530. dev->pdev->device == PMC_DEVICE_S8 ||
  531. dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) {
  532. aac_src_access_devreg(dev, AAC_ENABLE_INTX);
  533. dev->msi_enabled = 0;
  534. msleep(5000); /* Delay 5 seconds */
  535. }
  536. if (!bled && (dev->supplement_adapter_info.SupportedOptions2 &
  537. AAC_OPTION_DOORBELL_RESET)) {
  538. src_writel(dev, MUnit.IDR, reset_mask);
  539. ssleep(45);
  540. } else {
  541. src_writel(dev, MUnit.IDR, 0x100);
  542. ssleep(45);
  543. }
  544. }
  545. if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
  546. return -ENODEV;
  547. if (startup_timeout < 300)
  548. startup_timeout = 300;
  549. return 0;
  550. }
  551. /**
  552. * aac_src_select_comm - Select communications method
  553. * @dev: Adapter
  554. * @comm: communications method
  555. */
  556. static int aac_src_select_comm(struct aac_dev *dev, int comm)
  557. {
  558. switch (comm) {
  559. case AAC_COMM_MESSAGE:
  560. dev->a_ops.adapter_intr = aac_src_intr_message;
  561. dev->a_ops.adapter_deliver = aac_src_deliver_message;
  562. break;
  563. default:
  564. return 1;
  565. }
  566. return 0;
  567. }
  568. /**
  569. * aac_src_init - initialize an Cardinal Frey Bar card
  570. * @dev: device to configure
  571. *
  572. */
  573. int aac_src_init(struct aac_dev *dev)
  574. {
  575. unsigned long start;
  576. unsigned long status;
  577. int restart = 0;
  578. int instance = dev->id;
  579. const char *name = dev->name;
  580. dev->a_ops.adapter_ioremap = aac_src_ioremap;
  581. dev->a_ops.adapter_comm = aac_src_select_comm;
  582. dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
  583. if (aac_adapter_ioremap(dev, dev->base_size)) {
  584. printk(KERN_WARNING "%s: unable to map adapter.\n", name);
  585. goto error_iounmap;
  586. }
  587. /* Failure to reset here is an option ... */
  588. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  589. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  590. if ((aac_reset_devices || reset_devices) &&
  591. !aac_src_restart_adapter(dev, 0))
  592. ++restart;
  593. /*
  594. * Check to see if the board panic'd while booting.
  595. */
  596. status = src_readl(dev, MUnit.OMR);
  597. if (status & KERNEL_PANIC) {
  598. if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
  599. goto error_iounmap;
  600. ++restart;
  601. }
  602. /*
  603. * Check to see if the board failed any self tests.
  604. */
  605. status = src_readl(dev, MUnit.OMR);
  606. if (status & SELF_TEST_FAILED) {
  607. printk(KERN_ERR "%s%d: adapter self-test failed.\n",
  608. dev->name, instance);
  609. goto error_iounmap;
  610. }
  611. /*
  612. * Check to see if the monitor panic'd while booting.
  613. */
  614. if (status & MONITOR_PANIC) {
  615. printk(KERN_ERR "%s%d: adapter monitor panic.\n",
  616. dev->name, instance);
  617. goto error_iounmap;
  618. }
  619. start = jiffies;
  620. /*
  621. * Wait for the adapter to be up and running. Wait up to 3 minutes
  622. */
  623. while (!((status = src_readl(dev, MUnit.OMR)) &
  624. KERNEL_UP_AND_RUNNING)) {
  625. if ((restart &&
  626. (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
  627. time_after(jiffies, start+HZ*startup_timeout)) {
  628. printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
  629. dev->name, instance, status);
  630. goto error_iounmap;
  631. }
  632. if (!restart &&
  633. ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
  634. time_after(jiffies, start + HZ *
  635. ((startup_timeout > 60)
  636. ? (startup_timeout - 60)
  637. : (startup_timeout / 2))))) {
  638. if (likely(!aac_src_restart_adapter(dev,
  639. aac_src_check_health(dev))))
  640. start = jiffies;
  641. ++restart;
  642. }
  643. msleep(1);
  644. }
  645. if (restart && aac_commit)
  646. aac_commit = 1;
  647. /*
  648. * Fill in the common function dispatch table.
  649. */
  650. dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
  651. dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
  652. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  653. dev->a_ops.adapter_notify = aac_src_notify_adapter;
  654. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  655. dev->a_ops.adapter_check_health = aac_src_check_health;
  656. dev->a_ops.adapter_restart = aac_src_restart_adapter;
  657. dev->a_ops.adapter_start = aac_src_start_adapter;
  658. /*
  659. * First clear out all interrupts. Then enable the one's that we
  660. * can handle.
  661. */
  662. aac_adapter_comm(dev, AAC_COMM_MESSAGE);
  663. aac_adapter_disable_int(dev);
  664. src_writel(dev, MUnit.ODR_C, 0xffffffff);
  665. aac_adapter_enable_int(dev);
  666. if (aac_init_adapter(dev) == NULL)
  667. goto error_iounmap;
  668. if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
  669. goto error_iounmap;
  670. dev->msi = !pci_enable_msi(dev->pdev);
  671. dev->aac_msix[0].vector_no = 0;
  672. dev->aac_msix[0].dev = dev;
  673. if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
  674. IRQF_SHARED, "aacraid", &(dev->aac_msix[0])) < 0) {
  675. if (dev->msi)
  676. pci_disable_msi(dev->pdev);
  677. printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
  678. name, instance);
  679. goto error_iounmap;
  680. }
  681. dev->dbg_base = pci_resource_start(dev->pdev, 2);
  682. dev->dbg_base_mapped = dev->regs.src.bar1;
  683. dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
  684. dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
  685. aac_adapter_enable_int(dev);
  686. if (!dev->sync_mode) {
  687. /*
  688. * Tell the adapter that all is configured, and it can
  689. * start accepting requests
  690. */
  691. aac_src_start_adapter(dev);
  692. }
  693. return 0;
  694. error_iounmap:
  695. return -1;
  696. }
  697. /**
  698. * aac_srcv_init - initialize an SRCv card
  699. * @dev: device to configure
  700. *
  701. */
  702. int aac_srcv_init(struct aac_dev *dev)
  703. {
  704. unsigned long start;
  705. unsigned long status;
  706. int restart = 0;
  707. int instance = dev->id;
  708. const char *name = dev->name;
  709. dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
  710. dev->a_ops.adapter_comm = aac_src_select_comm;
  711. dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
  712. if (aac_adapter_ioremap(dev, dev->base_size)) {
  713. printk(KERN_WARNING "%s: unable to map adapter.\n", name);
  714. goto error_iounmap;
  715. }
  716. /* Failure to reset here is an option ... */
  717. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  718. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  719. if ((aac_reset_devices || reset_devices) &&
  720. !aac_src_restart_adapter(dev, 0))
  721. ++restart;
  722. /*
  723. * Check to see if flash update is running.
  724. * Wait for the adapter to be up and running. Wait up to 5 minutes
  725. */
  726. status = src_readl(dev, MUnit.OMR);
  727. if (status & FLASH_UPD_PENDING) {
  728. start = jiffies;
  729. do {
  730. status = src_readl(dev, MUnit.OMR);
  731. if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) {
  732. printk(KERN_ERR "%s%d: adapter flash update failed.\n",
  733. dev->name, instance);
  734. goto error_iounmap;
  735. }
  736. } while (!(status & FLASH_UPD_SUCCESS) &&
  737. !(status & FLASH_UPD_FAILED));
  738. /* Delay 10 seconds.
  739. * Because right now FW is doing a soft reset,
  740. * do not read scratch pad register at this time
  741. */
  742. ssleep(10);
  743. }
  744. /*
  745. * Check to see if the board panic'd while booting.
  746. */
  747. status = src_readl(dev, MUnit.OMR);
  748. if (status & KERNEL_PANIC) {
  749. if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
  750. goto error_iounmap;
  751. ++restart;
  752. }
  753. /*
  754. * Check to see if the board failed any self tests.
  755. */
  756. status = src_readl(dev, MUnit.OMR);
  757. if (status & SELF_TEST_FAILED) {
  758. printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
  759. goto error_iounmap;
  760. }
  761. /*
  762. * Check to see if the monitor panic'd while booting.
  763. */
  764. if (status & MONITOR_PANIC) {
  765. printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
  766. goto error_iounmap;
  767. }
  768. start = jiffies;
  769. /*
  770. * Wait for the adapter to be up and running. Wait up to 3 minutes
  771. */
  772. while (!((status = src_readl(dev, MUnit.OMR)) &
  773. KERNEL_UP_AND_RUNNING) ||
  774. status == 0xffffffff) {
  775. if ((restart &&
  776. (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
  777. time_after(jiffies, start+HZ*startup_timeout)) {
  778. printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
  779. dev->name, instance, status);
  780. goto error_iounmap;
  781. }
  782. if (!restart &&
  783. ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
  784. time_after(jiffies, start + HZ *
  785. ((startup_timeout > 60)
  786. ? (startup_timeout - 60)
  787. : (startup_timeout / 2))))) {
  788. if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev))))
  789. start = jiffies;
  790. ++restart;
  791. }
  792. msleep(1);
  793. }
  794. if (restart && aac_commit)
  795. aac_commit = 1;
  796. /*
  797. * Fill in the common function dispatch table.
  798. */
  799. dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
  800. dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
  801. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  802. dev->a_ops.adapter_notify = aac_src_notify_adapter;
  803. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  804. dev->a_ops.adapter_check_health = aac_src_check_health;
  805. dev->a_ops.adapter_restart = aac_src_restart_adapter;
  806. dev->a_ops.adapter_start = aac_src_start_adapter;
  807. /*
  808. * First clear out all interrupts. Then enable the one's that we
  809. * can handle.
  810. */
  811. aac_adapter_comm(dev, AAC_COMM_MESSAGE);
  812. aac_adapter_disable_int(dev);
  813. src_writel(dev, MUnit.ODR_C, 0xffffffff);
  814. aac_adapter_enable_int(dev);
  815. if (aac_init_adapter(dev) == NULL)
  816. goto error_iounmap;
  817. if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2)
  818. goto error_iounmap;
  819. if (dev->msi_enabled)
  820. aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
  821. if (aac_acquire_irq(dev))
  822. goto error_iounmap;
  823. dev->dbg_base = dev->base_start;
  824. dev->dbg_base_mapped = dev->base;
  825. dev->dbg_size = dev->base_size;
  826. dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
  827. aac_adapter_enable_int(dev);
  828. if (!dev->sync_mode) {
  829. /*
  830. * Tell the adapter that all is configured, and it can
  831. * start accepting requests
  832. */
  833. aac_src_start_adapter(dev);
  834. }
  835. return 0;
  836. error_iounmap:
  837. return -1;
  838. }
  839. void aac_src_access_devreg(struct aac_dev *dev, int mode)
  840. {
  841. u_int32_t val;
  842. switch (mode) {
  843. case AAC_ENABLE_INTERRUPT:
  844. src_writel(dev,
  845. MUnit.OIMR,
  846. dev->OIMR = (dev->msi_enabled ?
  847. AAC_INT_ENABLE_TYPE1_MSIX :
  848. AAC_INT_ENABLE_TYPE1_INTX));
  849. break;
  850. case AAC_DISABLE_INTERRUPT:
  851. src_writel(dev,
  852. MUnit.OIMR,
  853. dev->OIMR = AAC_INT_DISABLE_ALL);
  854. break;
  855. case AAC_ENABLE_MSIX:
  856. /* set bit 6 */
  857. val = src_readl(dev, MUnit.IDR);
  858. val |= 0x40;
  859. src_writel(dev, MUnit.IDR, val);
  860. src_readl(dev, MUnit.IDR);
  861. /* unmask int. */
  862. val = PMC_ALL_INTERRUPT_BITS;
  863. src_writel(dev, MUnit.IOAR, val);
  864. val = src_readl(dev, MUnit.OIMR);
  865. src_writel(dev,
  866. MUnit.OIMR,
  867. val & (~(PMC_GLOBAL_INT_BIT2 | PMC_GLOBAL_INT_BIT0)));
  868. break;
  869. case AAC_DISABLE_MSIX:
  870. /* reset bit 6 */
  871. val = src_readl(dev, MUnit.IDR);
  872. val &= ~0x40;
  873. src_writel(dev, MUnit.IDR, val);
  874. src_readl(dev, MUnit.IDR);
  875. break;
  876. case AAC_CLEAR_AIF_BIT:
  877. /* set bit 5 */
  878. val = src_readl(dev, MUnit.IDR);
  879. val |= 0x20;
  880. src_writel(dev, MUnit.IDR, val);
  881. src_readl(dev, MUnit.IDR);
  882. break;
  883. case AAC_CLEAR_SYNC_BIT:
  884. /* set bit 4 */
  885. val = src_readl(dev, MUnit.IDR);
  886. val |= 0x10;
  887. src_writel(dev, MUnit.IDR, val);
  888. src_readl(dev, MUnit.IDR);
  889. break;
  890. case AAC_ENABLE_INTX:
  891. /* set bit 7 */
  892. val = src_readl(dev, MUnit.IDR);
  893. val |= 0x80;
  894. src_writel(dev, MUnit.IDR, val);
  895. src_readl(dev, MUnit.IDR);
  896. /* unmask int. */
  897. val = PMC_ALL_INTERRUPT_BITS;
  898. src_writel(dev, MUnit.IOAR, val);
  899. src_readl(dev, MUnit.IOAR);
  900. val = src_readl(dev, MUnit.OIMR);
  901. src_writel(dev, MUnit.OIMR,
  902. val & (~(PMC_GLOBAL_INT_BIT2)));
  903. break;
  904. default:
  905. break;
  906. }
  907. }
  908. static int aac_src_get_sync_status(struct aac_dev *dev)
  909. {
  910. int val;
  911. if (dev->msi_enabled)
  912. val = src_readl(dev, MUnit.ODR_MSI) & 0x1000 ? 1 : 0;
  913. else
  914. val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT;
  915. return val;
  916. }