src.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032
  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 panic'd.
  377. */
  378. if (unlikely(status & KERNEL_PANIC))
  379. goto err_blink;
  380. /*
  381. * Check to see if the board failed any self tests.
  382. */
  383. if (unlikely(status & SELF_TEST_FAILED))
  384. goto err_out;
  385. /*
  386. * Check to see if the board failed any self tests.
  387. */
  388. if (unlikely(status & MONITOR_PANIC))
  389. goto err_out;
  390. /*
  391. * Wait for the adapter to be up and running.
  392. */
  393. if (unlikely(!(status & KERNEL_UP_AND_RUNNING)))
  394. return -3;
  395. /*
  396. * Everything is OK
  397. */
  398. return 0;
  399. err_out:
  400. return -1;
  401. err_blink:
  402. return (status > 16) & 0xFF;
  403. }
  404. /**
  405. * aac_src_deliver_message
  406. * @fib: fib to issue
  407. *
  408. * Will send a fib, returning 0 if successful.
  409. */
  410. static int aac_src_deliver_message(struct fib *fib)
  411. {
  412. struct aac_dev *dev = fib->dev;
  413. struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue];
  414. u32 fibsize;
  415. dma_addr_t address;
  416. struct aac_fib_xporthdr *pFibX;
  417. #if !defined(writeq)
  418. unsigned long flags;
  419. #endif
  420. u16 hdr_size = le16_to_cpu(fib->hw_fib_va->header.Size);
  421. u16 vector_no;
  422. atomic_inc(&q->numpending);
  423. if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest &&
  424. dev->max_msix > 1) {
  425. vector_no = fib->vector_no;
  426. fib->hw_fib_va->header.Handle += (vector_no << 16);
  427. } else {
  428. vector_no = 0;
  429. }
  430. atomic_inc(&dev->rrq_outstanding[vector_no]);
  431. if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) {
  432. /* Calculate the amount to the fibsize bits */
  433. fibsize = (hdr_size + 127) / 128 - 1;
  434. if (fibsize > (ALIGN32 - 1))
  435. return -EMSGSIZE;
  436. /* New FIB header, 32-bit */
  437. address = fib->hw_fib_pa;
  438. fib->hw_fib_va->header.StructType = FIB_MAGIC2;
  439. fib->hw_fib_va->header.SenderFibAddress = (u32)address;
  440. fib->hw_fib_va->header.u.TimeStamp = 0;
  441. BUG_ON(upper_32_bits(address) != 0L);
  442. address |= fibsize;
  443. } else {
  444. /* Calculate the amount to the fibsize bits */
  445. fibsize = (sizeof(struct aac_fib_xporthdr) + hdr_size + 127) / 128 - 1;
  446. if (fibsize > (ALIGN32 - 1))
  447. return -EMSGSIZE;
  448. /* Fill XPORT header */
  449. pFibX = (void *)fib->hw_fib_va - sizeof(struct aac_fib_xporthdr);
  450. pFibX->Handle = cpu_to_le32(fib->hw_fib_va->header.Handle);
  451. pFibX->HostAddress = cpu_to_le64(fib->hw_fib_pa);
  452. pFibX->Size = cpu_to_le32(hdr_size);
  453. /*
  454. * The xport header has been 32-byte aligned for us so that fibsize
  455. * can be masked out of this address by hardware. -- BenC
  456. */
  457. address = fib->hw_fib_pa - sizeof(struct aac_fib_xporthdr);
  458. if (address & (ALIGN32 - 1))
  459. return -EINVAL;
  460. address |= fibsize;
  461. }
  462. #if defined(writeq)
  463. src_writeq(dev, MUnit.IQ_L, (u64)address);
  464. #else
  465. spin_lock_irqsave(&fib->dev->iq_lock, flags);
  466. src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff);
  467. src_writel(dev, MUnit.IQ_L, address & 0xffffffff);
  468. spin_unlock_irqrestore(&fib->dev->iq_lock, flags);
  469. #endif
  470. return 0;
  471. }
  472. /**
  473. * aac_src_ioremap
  474. * @size: mapping resize request
  475. *
  476. */
  477. static int aac_src_ioremap(struct aac_dev *dev, u32 size)
  478. {
  479. if (!size) {
  480. iounmap(dev->regs.src.bar1);
  481. dev->regs.src.bar1 = NULL;
  482. iounmap(dev->regs.src.bar0);
  483. dev->base = dev->regs.src.bar0 = NULL;
  484. return 0;
  485. }
  486. dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2),
  487. AAC_MIN_SRC_BAR1_SIZE);
  488. dev->base = NULL;
  489. if (dev->regs.src.bar1 == NULL)
  490. return -1;
  491. dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
  492. if (dev->base == NULL) {
  493. iounmap(dev->regs.src.bar1);
  494. dev->regs.src.bar1 = NULL;
  495. return -1;
  496. }
  497. dev->IndexRegs = &((struct src_registers __iomem *)
  498. dev->base)->u.tupelo.IndexRegs;
  499. return 0;
  500. }
  501. /**
  502. * aac_srcv_ioremap
  503. * @size: mapping resize request
  504. *
  505. */
  506. static int aac_srcv_ioremap(struct aac_dev *dev, u32 size)
  507. {
  508. if (!size) {
  509. iounmap(dev->regs.src.bar0);
  510. dev->base = dev->regs.src.bar0 = NULL;
  511. return 0;
  512. }
  513. dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size);
  514. if (dev->base == NULL)
  515. return -1;
  516. dev->IndexRegs = &((struct src_registers __iomem *)
  517. dev->base)->u.denali.IndexRegs;
  518. return 0;
  519. }
  520. static int aac_src_restart_adapter(struct aac_dev *dev, int bled)
  521. {
  522. u32 var, reset_mask;
  523. if (bled >= 0) {
  524. if (bled)
  525. printk(KERN_ERR "%s%d: adapter kernel panic'd %x.\n",
  526. dev->name, dev->id, bled);
  527. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  528. bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
  529. 0, 0, 0, 0, 0, 0, &var, &reset_mask, NULL, NULL, NULL);
  530. if ((bled || (var != 0x00000001)) &&
  531. !dev->doorbell_mask)
  532. return -EINVAL;
  533. else if (dev->doorbell_mask) {
  534. reset_mask = dev->doorbell_mask;
  535. bled = 0;
  536. var = 0x00000001;
  537. }
  538. if ((dev->pdev->device == PMC_DEVICE_S7 ||
  539. dev->pdev->device == PMC_DEVICE_S8 ||
  540. dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) {
  541. aac_src_access_devreg(dev, AAC_ENABLE_INTX);
  542. dev->msi_enabled = 0;
  543. msleep(5000); /* Delay 5 seconds */
  544. }
  545. if (!bled && (dev->supplement_adapter_info.SupportedOptions2 &
  546. AAC_OPTION_DOORBELL_RESET)) {
  547. src_writel(dev, MUnit.IDR, reset_mask);
  548. ssleep(45);
  549. } else {
  550. src_writel(dev, MUnit.IDR, 0x100);
  551. ssleep(45);
  552. }
  553. }
  554. if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
  555. return -ENODEV;
  556. if (startup_timeout < 300)
  557. startup_timeout = 300;
  558. return 0;
  559. }
  560. /**
  561. * aac_src_select_comm - Select communications method
  562. * @dev: Adapter
  563. * @comm: communications method
  564. */
  565. static int aac_src_select_comm(struct aac_dev *dev, int comm)
  566. {
  567. switch (comm) {
  568. case AAC_COMM_MESSAGE:
  569. dev->a_ops.adapter_intr = aac_src_intr_message;
  570. dev->a_ops.adapter_deliver = aac_src_deliver_message;
  571. break;
  572. default:
  573. return 1;
  574. }
  575. return 0;
  576. }
  577. /**
  578. * aac_src_init - initialize an Cardinal Frey Bar card
  579. * @dev: device to configure
  580. *
  581. */
  582. int aac_src_init(struct aac_dev *dev)
  583. {
  584. unsigned long start;
  585. unsigned long status;
  586. int restart = 0;
  587. int instance = dev->id;
  588. const char *name = dev->name;
  589. dev->a_ops.adapter_ioremap = aac_src_ioremap;
  590. dev->a_ops.adapter_comm = aac_src_select_comm;
  591. dev->base_size = AAC_MIN_SRC_BAR0_SIZE;
  592. if (aac_adapter_ioremap(dev, dev->base_size)) {
  593. printk(KERN_WARNING "%s: unable to map adapter.\n", name);
  594. goto error_iounmap;
  595. }
  596. /* Failure to reset here is an option ... */
  597. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  598. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  599. if ((aac_reset_devices || reset_devices) &&
  600. !aac_src_restart_adapter(dev, 0))
  601. ++restart;
  602. /*
  603. * Check to see if the board panic'd while booting.
  604. */
  605. status = src_readl(dev, MUnit.OMR);
  606. if (status & KERNEL_PANIC) {
  607. if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
  608. goto error_iounmap;
  609. ++restart;
  610. }
  611. /*
  612. * Check to see if the board failed any self tests.
  613. */
  614. status = src_readl(dev, MUnit.OMR);
  615. if (status & SELF_TEST_FAILED) {
  616. printk(KERN_ERR "%s%d: adapter self-test failed.\n",
  617. dev->name, instance);
  618. goto error_iounmap;
  619. }
  620. /*
  621. * Check to see if the monitor panic'd while booting.
  622. */
  623. if (status & MONITOR_PANIC) {
  624. printk(KERN_ERR "%s%d: adapter monitor panic.\n",
  625. dev->name, instance);
  626. goto error_iounmap;
  627. }
  628. start = jiffies;
  629. /*
  630. * Wait for the adapter to be up and running. Wait up to 3 minutes
  631. */
  632. while (!((status = src_readl(dev, MUnit.OMR)) &
  633. KERNEL_UP_AND_RUNNING)) {
  634. if ((restart &&
  635. (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
  636. time_after(jiffies, start+HZ*startup_timeout)) {
  637. printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
  638. dev->name, instance, status);
  639. goto error_iounmap;
  640. }
  641. if (!restart &&
  642. ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
  643. time_after(jiffies, start + HZ *
  644. ((startup_timeout > 60)
  645. ? (startup_timeout - 60)
  646. : (startup_timeout / 2))))) {
  647. if (likely(!aac_src_restart_adapter(dev,
  648. aac_src_check_health(dev))))
  649. start = jiffies;
  650. ++restart;
  651. }
  652. msleep(1);
  653. }
  654. if (restart && aac_commit)
  655. aac_commit = 1;
  656. /*
  657. * Fill in the common function dispatch table.
  658. */
  659. dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
  660. dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
  661. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  662. dev->a_ops.adapter_notify = aac_src_notify_adapter;
  663. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  664. dev->a_ops.adapter_check_health = aac_src_check_health;
  665. dev->a_ops.adapter_restart = aac_src_restart_adapter;
  666. dev->a_ops.adapter_start = aac_src_start_adapter;
  667. /*
  668. * First clear out all interrupts. Then enable the one's that we
  669. * can handle.
  670. */
  671. aac_adapter_comm(dev, AAC_COMM_MESSAGE);
  672. aac_adapter_disable_int(dev);
  673. src_writel(dev, MUnit.ODR_C, 0xffffffff);
  674. aac_adapter_enable_int(dev);
  675. if (aac_init_adapter(dev) == NULL)
  676. goto error_iounmap;
  677. if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1)
  678. goto error_iounmap;
  679. dev->msi = !pci_enable_msi(dev->pdev);
  680. dev->aac_msix[0].vector_no = 0;
  681. dev->aac_msix[0].dev = dev;
  682. if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr,
  683. IRQF_SHARED, "aacraid", &(dev->aac_msix[0])) < 0) {
  684. if (dev->msi)
  685. pci_disable_msi(dev->pdev);
  686. printk(KERN_ERR "%s%d: Interrupt unavailable.\n",
  687. name, instance);
  688. goto error_iounmap;
  689. }
  690. dev->dbg_base = pci_resource_start(dev->pdev, 2);
  691. dev->dbg_base_mapped = dev->regs.src.bar1;
  692. dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE;
  693. dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
  694. aac_adapter_enable_int(dev);
  695. if (!dev->sync_mode) {
  696. /*
  697. * Tell the adapter that all is configured, and it can
  698. * start accepting requests
  699. */
  700. aac_src_start_adapter(dev);
  701. }
  702. return 0;
  703. error_iounmap:
  704. return -1;
  705. }
  706. /**
  707. * aac_srcv_init - initialize an SRCv card
  708. * @dev: device to configure
  709. *
  710. */
  711. int aac_srcv_init(struct aac_dev *dev)
  712. {
  713. unsigned long start;
  714. unsigned long status;
  715. int restart = 0;
  716. int instance = dev->id;
  717. const char *name = dev->name;
  718. dev->a_ops.adapter_ioremap = aac_srcv_ioremap;
  719. dev->a_ops.adapter_comm = aac_src_select_comm;
  720. dev->base_size = AAC_MIN_SRCV_BAR0_SIZE;
  721. if (aac_adapter_ioremap(dev, dev->base_size)) {
  722. printk(KERN_WARNING "%s: unable to map adapter.\n", name);
  723. goto error_iounmap;
  724. }
  725. /* Failure to reset here is an option ... */
  726. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  727. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  728. if ((aac_reset_devices || reset_devices) &&
  729. !aac_src_restart_adapter(dev, 0))
  730. ++restart;
  731. /*
  732. * Check to see if flash update is running.
  733. * Wait for the adapter to be up and running. Wait up to 5 minutes
  734. */
  735. status = src_readl(dev, MUnit.OMR);
  736. if (status & FLASH_UPD_PENDING) {
  737. start = jiffies;
  738. do {
  739. status = src_readl(dev, MUnit.OMR);
  740. if (time_after(jiffies, start+HZ*FWUPD_TIMEOUT)) {
  741. printk(KERN_ERR "%s%d: adapter flash update failed.\n",
  742. dev->name, instance);
  743. goto error_iounmap;
  744. }
  745. } while (!(status & FLASH_UPD_SUCCESS) &&
  746. !(status & FLASH_UPD_FAILED));
  747. /* Delay 10 seconds.
  748. * Because right now FW is doing a soft reset,
  749. * do not read scratch pad register at this time
  750. */
  751. ssleep(10);
  752. }
  753. /*
  754. * Check to see if the board panic'd while booting.
  755. */
  756. status = src_readl(dev, MUnit.OMR);
  757. if (status & KERNEL_PANIC) {
  758. if (aac_src_restart_adapter(dev, aac_src_check_health(dev)))
  759. goto error_iounmap;
  760. ++restart;
  761. }
  762. /*
  763. * Check to see if the board failed any self tests.
  764. */
  765. status = src_readl(dev, MUnit.OMR);
  766. if (status & SELF_TEST_FAILED) {
  767. printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance);
  768. goto error_iounmap;
  769. }
  770. /*
  771. * Check to see if the monitor panic'd while booting.
  772. */
  773. if (status & MONITOR_PANIC) {
  774. printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance);
  775. goto error_iounmap;
  776. }
  777. start = jiffies;
  778. /*
  779. * Wait for the adapter to be up and running. Wait up to 3 minutes
  780. */
  781. while (!((status = src_readl(dev, MUnit.OMR)) &
  782. KERNEL_UP_AND_RUNNING) ||
  783. status == 0xffffffff) {
  784. if ((restart &&
  785. (status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC))) ||
  786. time_after(jiffies, start+HZ*startup_timeout)) {
  787. printk(KERN_ERR "%s%d: adapter kernel failed to start, init status = %lx.\n",
  788. dev->name, instance, status);
  789. goto error_iounmap;
  790. }
  791. if (!restart &&
  792. ((status & (KERNEL_PANIC|SELF_TEST_FAILED|MONITOR_PANIC)) ||
  793. time_after(jiffies, start + HZ *
  794. ((startup_timeout > 60)
  795. ? (startup_timeout - 60)
  796. : (startup_timeout / 2))))) {
  797. if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev))))
  798. start = jiffies;
  799. ++restart;
  800. }
  801. msleep(1);
  802. }
  803. if (restart && aac_commit)
  804. aac_commit = 1;
  805. /*
  806. * Fill in the common function dispatch table.
  807. */
  808. dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter;
  809. dev->a_ops.adapter_disable_int = aac_src_disable_interrupt;
  810. dev->a_ops.adapter_enable_int = aac_src_disable_interrupt;
  811. dev->a_ops.adapter_notify = aac_src_notify_adapter;
  812. dev->a_ops.adapter_sync_cmd = src_sync_cmd;
  813. dev->a_ops.adapter_check_health = aac_src_check_health;
  814. dev->a_ops.adapter_restart = aac_src_restart_adapter;
  815. dev->a_ops.adapter_start = aac_src_start_adapter;
  816. /*
  817. * First clear out all interrupts. Then enable the one's that we
  818. * can handle.
  819. */
  820. aac_adapter_comm(dev, AAC_COMM_MESSAGE);
  821. aac_adapter_disable_int(dev);
  822. src_writel(dev, MUnit.ODR_C, 0xffffffff);
  823. aac_adapter_enable_int(dev);
  824. if (aac_init_adapter(dev) == NULL)
  825. goto error_iounmap;
  826. if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2)
  827. goto error_iounmap;
  828. if (dev->msi_enabled)
  829. aac_src_access_devreg(dev, AAC_ENABLE_MSIX);
  830. if (aac_acquire_irq(dev))
  831. goto error_iounmap;
  832. dev->dbg_base = dev->base_start;
  833. dev->dbg_base_mapped = dev->base;
  834. dev->dbg_size = dev->base_size;
  835. dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message;
  836. aac_adapter_enable_int(dev);
  837. if (!dev->sync_mode) {
  838. /*
  839. * Tell the adapter that all is configured, and it can
  840. * start accepting requests
  841. */
  842. aac_src_start_adapter(dev);
  843. }
  844. return 0;
  845. error_iounmap:
  846. return -1;
  847. }
  848. void aac_src_access_devreg(struct aac_dev *dev, int mode)
  849. {
  850. u_int32_t val;
  851. switch (mode) {
  852. case AAC_ENABLE_INTERRUPT:
  853. src_writel(dev,
  854. MUnit.OIMR,
  855. dev->OIMR = (dev->msi_enabled ?
  856. AAC_INT_ENABLE_TYPE1_MSIX :
  857. AAC_INT_ENABLE_TYPE1_INTX));
  858. break;
  859. case AAC_DISABLE_INTERRUPT:
  860. src_writel(dev,
  861. MUnit.OIMR,
  862. dev->OIMR = AAC_INT_DISABLE_ALL);
  863. break;
  864. case AAC_ENABLE_MSIX:
  865. /* set bit 6 */
  866. val = src_readl(dev, MUnit.IDR);
  867. val |= 0x40;
  868. src_writel(dev, MUnit.IDR, val);
  869. src_readl(dev, MUnit.IDR);
  870. /* unmask int. */
  871. val = PMC_ALL_INTERRUPT_BITS;
  872. src_writel(dev, MUnit.IOAR, val);
  873. val = src_readl(dev, MUnit.OIMR);
  874. src_writel(dev,
  875. MUnit.OIMR,
  876. val & (~(PMC_GLOBAL_INT_BIT2 | PMC_GLOBAL_INT_BIT0)));
  877. break;
  878. case AAC_DISABLE_MSIX:
  879. /* reset bit 6 */
  880. val = src_readl(dev, MUnit.IDR);
  881. val &= ~0x40;
  882. src_writel(dev, MUnit.IDR, val);
  883. src_readl(dev, MUnit.IDR);
  884. break;
  885. case AAC_CLEAR_AIF_BIT:
  886. /* set bit 5 */
  887. val = src_readl(dev, MUnit.IDR);
  888. val |= 0x20;
  889. src_writel(dev, MUnit.IDR, val);
  890. src_readl(dev, MUnit.IDR);
  891. break;
  892. case AAC_CLEAR_SYNC_BIT:
  893. /* set bit 4 */
  894. val = src_readl(dev, MUnit.IDR);
  895. val |= 0x10;
  896. src_writel(dev, MUnit.IDR, val);
  897. src_readl(dev, MUnit.IDR);
  898. break;
  899. case AAC_ENABLE_INTX:
  900. /* set bit 7 */
  901. val = src_readl(dev, MUnit.IDR);
  902. val |= 0x80;
  903. src_writel(dev, MUnit.IDR, val);
  904. src_readl(dev, MUnit.IDR);
  905. /* unmask int. */
  906. val = PMC_ALL_INTERRUPT_BITS;
  907. src_writel(dev, MUnit.IOAR, val);
  908. src_readl(dev, MUnit.IOAR);
  909. val = src_readl(dev, MUnit.OIMR);
  910. src_writel(dev, MUnit.OIMR,
  911. val & (~(PMC_GLOBAL_INT_BIT2)));
  912. break;
  913. default:
  914. break;
  915. }
  916. }
  917. static int aac_src_get_sync_status(struct aac_dev *dev)
  918. {
  919. int val;
  920. if (dev->msi_enabled)
  921. val = src_readl(dev, MUnit.ODR_MSI) & 0x1000 ? 1 : 0;
  922. else
  923. val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT;
  924. return val;
  925. }