qla_mbx.c 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941
  1. /*
  2. * QLOGIC LINUX SOFTWARE
  3. *
  4. * QLogic ISP2x00 device driver for Linux 2.6.x
  5. * Copyright (C) 2003-2004 QLogic Corporation
  6. * (www.qlogic.com)
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2, or (at your option) any
  11. * later version.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. */
  19. #include "qla_def.h"
  20. #include <linux/delay.h>
  21. static void
  22. qla2x00_mbx_sem_timeout(unsigned long data)
  23. {
  24. struct semaphore *sem_ptr = (struct semaphore *)data;
  25. DEBUG11(printk("qla2x00_sem_timeout: entered.\n");)
  26. if (sem_ptr != NULL) {
  27. up(sem_ptr);
  28. }
  29. DEBUG11(printk("qla2x00_mbx_sem_timeout: exiting.\n");)
  30. }
  31. /*
  32. * qla2x00_mailbox_command
  33. * Issue mailbox command and waits for completion.
  34. *
  35. * Input:
  36. * ha = adapter block pointer.
  37. * mcp = driver internal mbx struct pointer.
  38. *
  39. * Output:
  40. * mb[MAX_MAILBOX_REGISTER_COUNT] = returned mailbox data.
  41. *
  42. * Returns:
  43. * 0 : QLA_SUCCESS = cmd performed success
  44. * 1 : QLA_FUNCTION_FAILED (error encountered)
  45. * 6 : QLA_FUNCTION_TIMEOUT (timeout condition encountered)
  46. *
  47. * Context:
  48. * Kernel context.
  49. */
  50. static int
  51. qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp)
  52. {
  53. int rval;
  54. unsigned long flags = 0;
  55. device_reg_t __iomem *reg = ha->iobase;
  56. struct timer_list tmp_intr_timer;
  57. uint8_t abort_active = test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
  58. uint8_t io_lock_on = ha->flags.init_done;
  59. uint16_t command;
  60. uint16_t *iptr;
  61. uint16_t __iomem *optr;
  62. uint32_t cnt;
  63. uint32_t mboxes;
  64. unsigned long mbx_flags = 0;
  65. unsigned long wait_time;
  66. rval = QLA_SUCCESS;
  67. DEBUG11(printk("qla2x00_mailbox_command(%ld): entered.\n",
  68. ha->host_no);)
  69. /*
  70. * Wait for active mailbox commands to finish by waiting at most
  71. * tov seconds. This is to serialize actual issuing of mailbox cmds
  72. * during non ISP abort time.
  73. */
  74. if (!abort_active) {
  75. if (qla2x00_down_timeout(&ha->mbx_cmd_sem, mcp->tov * HZ)) {
  76. /* Timeout occurred. Return error. */
  77. DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): cmd "
  78. "access timeout. Exiting.\n", ha->host_no);)
  79. return QLA_FUNCTION_TIMEOUT;
  80. }
  81. }
  82. ha->flags.mbox_busy = 1;
  83. /* Save mailbox command for debug */
  84. ha->mcp = mcp;
  85. /* Try to get mailbox register access */
  86. if (!abort_active)
  87. spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
  88. DEBUG11(printk("scsi%d: prepare to issue mbox cmd=0x%x.\n",
  89. (int)ha->host_no, mcp->mb[0]);)
  90. spin_lock_irqsave(&ha->hardware_lock, flags);
  91. /* Load mailbox registers. */
  92. optr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 0);
  93. iptr = mcp->mb;
  94. command = mcp->mb[0];
  95. mboxes = mcp->out_mb;
  96. for (cnt = 0; cnt < ha->mbx_count; cnt++) {
  97. if (IS_QLA2200(ha) && cnt == 8)
  98. optr = (uint16_t __iomem *)MAILBOX_REG(ha, reg, 8);
  99. if (mboxes & BIT_0)
  100. WRT_REG_WORD(optr, *iptr);
  101. mboxes >>= 1;
  102. optr++;
  103. iptr++;
  104. }
  105. #if defined(QL_DEBUG_LEVEL_1)
  106. printk("qla2x00_mailbox_command: Loaded MBX registers "
  107. "(displayed in bytes) = \n");
  108. qla2x00_dump_buffer((uint8_t *)mcp->mb, 16);
  109. printk("\n");
  110. qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x10), 16);
  111. printk("\n");
  112. qla2x00_dump_buffer(((uint8_t *)mcp->mb + 0x20), 8);
  113. printk("\n");
  114. printk("qla2x00_mailbox_command: I/O address = %lx.\n",
  115. (u_long)optr);
  116. qla2x00_dump_regs(ha);
  117. #endif
  118. /* Issue set host interrupt command to send cmd out. */
  119. ha->flags.mbox_int = 0;
  120. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  121. /* Unlock mbx registers and wait for interrupt */
  122. DEBUG11(printk("qla2x00_mailbox_command: going to unlock irq & "
  123. "waiting for interrupt. jiffies=%lx.\n", jiffies);)
  124. /* Wait for mbx cmd completion until timeout */
  125. if (!abort_active && io_lock_on) {
  126. /* sleep on completion semaphore */
  127. DEBUG11(printk("qla2x00_mailbox_command(%ld): "
  128. "INTERRUPT MODE. Initializing timer.\n",
  129. ha->host_no);)
  130. init_timer(&tmp_intr_timer);
  131. tmp_intr_timer.data = (unsigned long)&ha->mbx_intr_sem;
  132. tmp_intr_timer.expires = jiffies + mcp->tov * HZ;
  133. tmp_intr_timer.function =
  134. (void (*)(unsigned long))qla2x00_mbx_sem_timeout;
  135. DEBUG11(printk("qla2x00_mailbox_command(%ld): "
  136. "Adding timer.\n", ha->host_no);)
  137. add_timer(&tmp_intr_timer);
  138. DEBUG11(printk("qla2x00_mailbox_command: going to "
  139. "unlock & sleep. time=0x%lx.\n", jiffies);)
  140. set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
  141. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  142. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  143. if (!abort_active)
  144. spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
  145. /* Wait for either the timer to expire
  146. * or the mbox completion interrupt
  147. */
  148. down(&ha->mbx_intr_sem);
  149. DEBUG11(printk("qla2x00_mailbox_command:"
  150. "waking up."
  151. "time=0x%lx\n", jiffies);)
  152. clear_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
  153. /* delete the timer */
  154. del_timer(&tmp_intr_timer);
  155. } else {
  156. DEBUG3_11(printk("qla2x00_mailbox_command(%ld): cmd=%x "
  157. "POLLING MODE.\n", ha->host_no, command);)
  158. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  159. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  160. if (!abort_active)
  161. spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
  162. wait_time = jiffies + mcp->tov * HZ; /* wait at most tov secs */
  163. while (!ha->flags.mbox_int) {
  164. if (time_after(jiffies, wait_time))
  165. break;
  166. /* Check for pending interrupts. */
  167. qla2x00_poll(ha);
  168. udelay(10); /* v4.27 */
  169. } /* while */
  170. }
  171. if (!abort_active)
  172. spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
  173. /* Check whether we timed out */
  174. if (ha->flags.mbox_int) {
  175. uint16_t *iptr2;
  176. DEBUG3_11(printk("qla2x00_mailbox_cmd: cmd %x completed.\n",
  177. command);)
  178. /* Got interrupt. Clear the flag. */
  179. ha->flags.mbox_int = 0;
  180. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  181. if (ha->mailbox_out[0] != MBS_COMMAND_COMPLETE) {
  182. qla2x00_stats.mboxerr++;
  183. rval = QLA_FUNCTION_FAILED;
  184. }
  185. /* Load return mailbox registers. */
  186. iptr2 = mcp->mb;
  187. iptr = (uint16_t *)&ha->mailbox_out[0];
  188. mboxes = mcp->in_mb;
  189. for (cnt = 0; cnt < ha->mbx_count; cnt++) {
  190. if (mboxes & BIT_0)
  191. *iptr2 = *iptr;
  192. mboxes >>= 1;
  193. iptr2++;
  194. iptr++;
  195. }
  196. } else {
  197. #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \
  198. defined(QL_DEBUG_LEVEL_11)
  199. printk("qla2x00_mailbox_command(%ld): **** MB Command Timeout "
  200. "for cmd %x ****\n", ha->host_no, command);
  201. printk("qla2x00_mailbox_command: icontrol=%x jiffies=%lx\n",
  202. RD_REG_WORD(&reg->ictrl), jiffies);
  203. printk("qla2x00_mailbox_command: *** mailbox[0] = 0x%x ***\n",
  204. RD_REG_WORD(optr));
  205. qla2x00_dump_regs(ha);
  206. #endif
  207. qla2x00_stats.mboxtout++;
  208. ha->total_mbx_timeout++;
  209. rval = QLA_FUNCTION_TIMEOUT;
  210. }
  211. if (!abort_active)
  212. spin_unlock_irqrestore(&ha->mbx_reg_lock, mbx_flags);
  213. ha->flags.mbox_busy = 0;
  214. /* Clean up */
  215. ha->mcp = NULL;
  216. if (!abort_active) {
  217. DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional "
  218. "resp interrupt.\n");)
  219. /* polling mode for non isp_abort commands. */
  220. qla2x00_poll(ha);
  221. }
  222. if (rval == QLA_FUNCTION_TIMEOUT) {
  223. if (!io_lock_on || (mcp->flags & IOCTL_CMD)) {
  224. /* not in dpc. schedule it for dpc to take over. */
  225. DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
  226. "schedule isp_abort_needed.\n",
  227. ha->host_no);)
  228. DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
  229. "timeout schedule isp_abort_needed.\n",
  230. ha->host_no);)
  231. qla_printk(KERN_WARNING, ha,
  232. "Mailbox command timeout occured. Scheduling ISP "
  233. "abort.\n");
  234. set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
  235. if (ha->dpc_wait && !ha->dpc_active)
  236. up(ha->dpc_wait);
  237. } else if (!abort_active) {
  238. /* call abort directly since we are in the DPC thread */
  239. DEBUG(printk("qla2x00_mailbox_command(%ld): timeout "
  240. "calling abort_isp\n", ha->host_no);)
  241. DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): "
  242. "timeout calling abort_isp\n", ha->host_no);)
  243. qla_printk(KERN_WARNING, ha,
  244. "Mailbox command timeout occured. Issuing ISP "
  245. "abort.\n");
  246. set_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
  247. clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
  248. if (qla2x00_abort_isp(ha)) {
  249. /* failed. retry later. */
  250. set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
  251. }
  252. clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags);
  253. DEBUG(printk("qla2x00_mailbox_command: finished "
  254. "abort_isp\n");)
  255. DEBUG2_3_11(printk("qla2x00_mailbox_command: finished "
  256. "abort_isp\n");)
  257. }
  258. }
  259. /* Allow next mbx cmd to come in. */
  260. if (!abort_active)
  261. up(&ha->mbx_cmd_sem);
  262. if (rval) {
  263. DEBUG2_3_11(printk("qla2x00_mailbox_command(%ld): **** FAILED. "
  264. "mbx0=%x, mbx1=%x, mbx2=%x, cmd=%x ****\n",
  265. ha->host_no, mcp->mb[0], mcp->mb[1], mcp->mb[2], command);)
  266. } else {
  267. DEBUG11(printk("qla2x00_mailbox_command(%ld): done.\n",
  268. ha->host_no);)
  269. }
  270. DEBUG11(printk("qla2x00_mailbox_command(%ld): exiting.\n",
  271. ha->host_no);)
  272. return rval;
  273. }
  274. /*
  275. * qla2x00_load_ram
  276. * Load adapter RAM using DMA.
  277. *
  278. * Input:
  279. * ha = adapter block pointer.
  280. *
  281. * Returns:
  282. * qla2x00 local function return status code.
  283. *
  284. * Context:
  285. * Kernel context.
  286. */
  287. int
  288. qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint16_t risc_addr,
  289. uint16_t risc_code_size)
  290. {
  291. int rval;
  292. mbx_cmd_t mc;
  293. mbx_cmd_t *mcp = &mc;
  294. uint32_t req_len;
  295. dma_addr_t nml_dma;
  296. uint32_t nml_len;
  297. uint32_t normalized;
  298. DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n",
  299. ha->host_no);)
  300. req_len = risc_code_size;
  301. nml_dma = 0;
  302. nml_len = 0;
  303. normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma,
  304. &nml_len);
  305. /* Load first segment */
  306. mcp->mb[0] = MBC_LOAD_RISC_RAM;
  307. mcp->mb[1] = risc_addr;
  308. mcp->mb[2] = MSW(req_dma);
  309. mcp->mb[3] = LSW(req_dma);
  310. mcp->mb[4] = (uint16_t)req_len;
  311. mcp->mb[6] = MSW(MSD(req_dma));
  312. mcp->mb[7] = LSW(MSD(req_dma));
  313. mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  314. mcp->in_mb = MBX_0;
  315. mcp->tov = 30;
  316. mcp->flags = 0;
  317. rval = qla2x00_mailbox_command(ha, mcp);
  318. /* Load second segment - if necessary */
  319. if (normalized && (rval == QLA_SUCCESS)) {
  320. mcp->mb[0] = MBC_LOAD_RISC_RAM;
  321. mcp->mb[1] = risc_addr + (uint16_t)req_len;
  322. mcp->mb[2] = MSW(nml_dma);
  323. mcp->mb[3] = LSW(nml_dma);
  324. mcp->mb[4] = (uint16_t)nml_len;
  325. mcp->mb[6] = MSW(MSD(nml_dma));
  326. mcp->mb[7] = LSW(MSD(nml_dma));
  327. mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  328. mcp->in_mb = MBX_0;
  329. mcp->tov = 30;
  330. mcp->flags = 0;
  331. rval = qla2x00_mailbox_command(ha, mcp);
  332. }
  333. if (rval == QLA_SUCCESS) {
  334. /* Empty */
  335. DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ha->host_no);)
  336. } else {
  337. /* Empty */
  338. DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x "
  339. "mb[0]=%x.\n", ha->host_no, rval, mcp->mb[0]);)
  340. }
  341. return rval;
  342. }
  343. /*
  344. * qla2x00_load_ram_ext
  345. * Load adapter extended RAM using DMA.
  346. *
  347. * Input:
  348. * ha = adapter block pointer.
  349. *
  350. * Returns:
  351. * qla2x00 local function return status code.
  352. *
  353. * Context:
  354. * Kernel context.
  355. */
  356. int
  357. qla2x00_load_ram_ext(scsi_qla_host_t *ha, dma_addr_t req_dma,
  358. uint32_t risc_addr, uint16_t risc_code_size)
  359. {
  360. int rval;
  361. mbx_cmd_t mc;
  362. mbx_cmd_t *mcp = &mc;
  363. uint32_t req_len;
  364. dma_addr_t nml_dma;
  365. uint32_t nml_len;
  366. uint32_t normalized;
  367. DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
  368. req_len = risc_code_size;
  369. nml_dma = 0;
  370. nml_len = 0;
  371. normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma,
  372. &nml_len);
  373. /* Load first segment */
  374. mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
  375. mcp->mb[1] = LSW(risc_addr);
  376. mcp->mb[2] = MSW(req_dma);
  377. mcp->mb[3] = LSW(req_dma);
  378. mcp->mb[4] = (uint16_t)req_len;
  379. mcp->mb[6] = MSW(MSD(req_dma));
  380. mcp->mb[7] = LSW(MSD(req_dma));
  381. mcp->mb[8] = MSW(risc_addr);
  382. mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  383. mcp->in_mb = MBX_0;
  384. mcp->tov = 30;
  385. mcp->flags = 0;
  386. rval = qla2x00_mailbox_command(ha, mcp);
  387. /* Load second segment - if necessary */
  388. if (normalized && (rval == QLA_SUCCESS)) {
  389. risc_addr += req_len;
  390. mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED;
  391. mcp->mb[1] = LSW(risc_addr);
  392. mcp->mb[2] = MSW(nml_dma);
  393. mcp->mb[3] = LSW(nml_dma);
  394. mcp->mb[4] = (uint16_t)nml_len;
  395. mcp->mb[6] = MSW(MSD(nml_dma));
  396. mcp->mb[7] = LSW(MSD(nml_dma));
  397. mcp->mb[8] = MSW(risc_addr);
  398. mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  399. mcp->in_mb = MBX_0;
  400. mcp->tov = 30;
  401. mcp->flags = 0;
  402. rval = qla2x00_mailbox_command(ha, mcp);
  403. }
  404. if (rval != QLA_SUCCESS) {
  405. /*EMPTY*/
  406. DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n",
  407. __func__, ha->host_no, rval, mcp->mb[0]));
  408. } else {
  409. /*EMPTY*/
  410. DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
  411. }
  412. return rval;
  413. }
  414. /*
  415. * qla2x00_execute_fw
  416. * Start adapter firmware.
  417. *
  418. * Input:
  419. * ha = adapter block pointer.
  420. * TARGET_QUEUE_LOCK must be released.
  421. * ADAPTER_STATE_LOCK must be released.
  422. *
  423. * Returns:
  424. * qla2x00 local function return status code.
  425. *
  426. * Context:
  427. * Kernel context.
  428. */
  429. int
  430. qla2x00_execute_fw(scsi_qla_host_t *ha)
  431. {
  432. int rval;
  433. mbx_cmd_t mc;
  434. mbx_cmd_t *mcp = &mc;
  435. DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", ha->host_no);)
  436. mcp->mb[0] = MBC_EXECUTE_FIRMWARE;
  437. mcp->mb[1] = *ha->brd_info->fw_info[0].fwstart;
  438. mcp->out_mb = MBX_1|MBX_0;
  439. if (IS_QLA2322(ha) || IS_QLA6322(ha)) {
  440. mcp->mb[2] = 0;
  441. mcp->out_mb |= MBX_2;
  442. }
  443. mcp->in_mb = MBX_0;
  444. mcp->tov = 30;
  445. mcp->flags = 0;
  446. rval = qla2x00_mailbox_command(ha, mcp);
  447. DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", ha->host_no);)
  448. return rval;
  449. }
  450. /*
  451. * qla2x00_get_fw_version
  452. * Get firmware version.
  453. *
  454. * Input:
  455. * ha: adapter state pointer.
  456. * major: pointer for major number.
  457. * minor: pointer for minor number.
  458. * subminor: pointer for subminor number.
  459. *
  460. * Returns:
  461. * qla2x00 local function return status code.
  462. *
  463. * Context:
  464. * Kernel context.
  465. */
  466. void
  467. qla2x00_get_fw_version(scsi_qla_host_t *ha, uint16_t *major, uint16_t *minor,
  468. uint16_t *subminor, uint16_t *attributes, uint32_t *memory)
  469. {
  470. int rval;
  471. mbx_cmd_t mc;
  472. mbx_cmd_t *mcp = &mc;
  473. DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
  474. mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
  475. mcp->out_mb = MBX_0;
  476. mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  477. mcp->flags = 0;
  478. mcp->tov = 30;
  479. rval = qla2x00_mailbox_command(ha, mcp);
  480. /* Return mailbox data. */
  481. *major = mcp->mb[1];
  482. *minor = mcp->mb[2];
  483. *subminor = mcp->mb[3];
  484. *attributes = mcp->mb[6];
  485. if (IS_QLA2100(ha) || IS_QLA2200(ha))
  486. *memory = 0x1FFFF; /* Defaults to 128KB. */
  487. else
  488. *memory = (mcp->mb[5] << 16) | mcp->mb[4];
  489. if (rval != QLA_SUCCESS) {
  490. /*EMPTY*/
  491. DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
  492. ha->host_no, rval));
  493. } else {
  494. /*EMPTY*/
  495. DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
  496. }
  497. }
  498. /*
  499. * qla2x00_get_fw_options
  500. * Set firmware options.
  501. *
  502. * Input:
  503. * ha = adapter block pointer.
  504. * fwopt = pointer for firmware options.
  505. *
  506. * Returns:
  507. * qla2x00 local function return status code.
  508. *
  509. * Context:
  510. * Kernel context.
  511. */
  512. int
  513. qla2x00_get_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
  514. {
  515. int rval;
  516. mbx_cmd_t mc;
  517. mbx_cmd_t *mcp = &mc;
  518. DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
  519. mcp->mb[0] = MBC_GET_FIRMWARE_OPTION;
  520. mcp->out_mb = MBX_0;
  521. mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
  522. mcp->tov = 30;
  523. mcp->flags = 0;
  524. rval = qla2x00_mailbox_command(ha, mcp);
  525. if (rval != QLA_SUCCESS) {
  526. /*EMPTY*/
  527. DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
  528. ha->host_no, rval));
  529. } else {
  530. fwopts[1] = mcp->mb[1];
  531. fwopts[2] = mcp->mb[2];
  532. fwopts[3] = mcp->mb[3];
  533. DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
  534. }
  535. return rval;
  536. }
  537. /*
  538. * qla2x00_set_fw_options
  539. * Set firmware options.
  540. *
  541. * Input:
  542. * ha = adapter block pointer.
  543. * fwopt = pointer for firmware options.
  544. *
  545. * Returns:
  546. * qla2x00 local function return status code.
  547. *
  548. * Context:
  549. * Kernel context.
  550. */
  551. int
  552. qla2x00_set_fw_options(scsi_qla_host_t *ha, uint16_t *fwopts)
  553. {
  554. int rval;
  555. mbx_cmd_t mc;
  556. mbx_cmd_t *mcp = &mc;
  557. DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
  558. mcp->mb[0] = MBC_SET_FIRMWARE_OPTION;
  559. mcp->mb[1] = fwopts[1];
  560. mcp->mb[2] = fwopts[2];
  561. mcp->mb[3] = fwopts[3];
  562. mcp->mb[10] = fwopts[10];
  563. mcp->mb[11] = fwopts[11];
  564. mcp->mb[12] = 0; /* Undocumented, but used */
  565. mcp->out_mb = MBX_12|MBX_11|MBX_10|MBX_3|MBX_2|MBX_1|MBX_0;
  566. mcp->in_mb = MBX_0;
  567. mcp->tov = 30;
  568. mcp->flags = 0;
  569. rval = qla2x00_mailbox_command(ha, mcp);
  570. if (rval != QLA_SUCCESS) {
  571. /*EMPTY*/
  572. DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
  573. ha->host_no, rval));
  574. } else {
  575. /*EMPTY*/
  576. DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
  577. }
  578. return rval;
  579. }
  580. /*
  581. * qla2x00_mbx_reg_test
  582. * Mailbox register wrap test.
  583. *
  584. * Input:
  585. * ha = adapter block pointer.
  586. * TARGET_QUEUE_LOCK must be released.
  587. * ADAPTER_STATE_LOCK must be released.
  588. *
  589. * Returns:
  590. * qla2x00 local function return status code.
  591. *
  592. * Context:
  593. * Kernel context.
  594. */
  595. int
  596. qla2x00_mbx_reg_test(scsi_qla_host_t *ha)
  597. {
  598. int rval;
  599. mbx_cmd_t mc;
  600. mbx_cmd_t *mcp = &mc;
  601. DEBUG11(printk("qla2x00_mbx_reg_test(%ld): entered.\n", ha->host_no);)
  602. mcp->mb[0] = MBC_MAILBOX_REGISTER_TEST;
  603. mcp->mb[1] = 0xAAAA;
  604. mcp->mb[2] = 0x5555;
  605. mcp->mb[3] = 0xAA55;
  606. mcp->mb[4] = 0x55AA;
  607. mcp->mb[5] = 0xA5A5;
  608. mcp->mb[6] = 0x5A5A;
  609. mcp->mb[7] = 0x2525;
  610. mcp->out_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  611. mcp->in_mb = MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
  612. mcp->tov = 30;
  613. mcp->flags = 0;
  614. rval = qla2x00_mailbox_command(ha, mcp);
  615. if (rval == QLA_SUCCESS) {
  616. if (mcp->mb[1] != 0xAAAA || mcp->mb[2] != 0x5555 ||
  617. mcp->mb[3] != 0xAA55 || mcp->mb[4] != 0x55AA)
  618. rval = QLA_FUNCTION_FAILED;
  619. if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A ||
  620. mcp->mb[7] != 0x2525)
  621. rval = QLA_FUNCTION_FAILED;
  622. }
  623. if (rval != QLA_SUCCESS) {
  624. /*EMPTY*/
  625. DEBUG2_3_11(printk("qla2x00_mbx_reg_test(%ld): failed=%x.\n",
  626. ha->host_no, rval);)
  627. } else {
  628. /*EMPTY*/
  629. DEBUG11(printk("qla2x00_mbx_reg_test(%ld): done.\n",
  630. ha->host_no);)
  631. }
  632. return rval;
  633. }
  634. /*
  635. * qla2x00_verify_checksum
  636. * Verify firmware checksum.
  637. *
  638. * Input:
  639. * ha = adapter block pointer.
  640. * TARGET_QUEUE_LOCK must be released.
  641. * ADAPTER_STATE_LOCK must be released.
  642. *
  643. * Returns:
  644. * qla2x00 local function return status code.
  645. *
  646. * Context:
  647. * Kernel context.
  648. */
  649. int
  650. qla2x00_verify_checksum(scsi_qla_host_t *ha)
  651. {
  652. int rval;
  653. mbx_cmd_t mc;
  654. mbx_cmd_t *mcp = &mc;
  655. DEBUG11(printk("qla2x00_verify_checksum(%ld): entered.\n",
  656. ha->host_no);)
  657. mcp->mb[0] = MBC_VERIFY_CHECKSUM;
  658. mcp->mb[1] = *ha->brd_info->fw_info[0].fwstart;
  659. mcp->out_mb = MBX_1|MBX_0;
  660. mcp->in_mb = MBX_2|MBX_0;
  661. mcp->tov = 30;
  662. mcp->flags = 0;
  663. rval = qla2x00_mailbox_command(ha, mcp);
  664. if (rval != QLA_SUCCESS) {
  665. /*EMPTY*/
  666. DEBUG2_3_11(printk("qla2x00_verify_checksum(%ld): failed=%x.\n",
  667. ha->host_no, rval);)
  668. } else {
  669. /*EMPTY*/
  670. DEBUG11(printk("qla2x00_verify_checksum(%ld): done.\n",
  671. ha->host_no);)
  672. }
  673. return rval;
  674. }
  675. /*
  676. * qla2x00_issue_iocb
  677. * Issue IOCB using mailbox command
  678. *
  679. * Input:
  680. * ha = adapter state pointer.
  681. * buffer = buffer pointer.
  682. * phys_addr = physical address of buffer.
  683. * size = size of buffer.
  684. * TARGET_QUEUE_LOCK must be released.
  685. * ADAPTER_STATE_LOCK must be released.
  686. *
  687. * Returns:
  688. * qla2x00 local function return status code.
  689. *
  690. * Context:
  691. * Kernel context.
  692. */
  693. int
  694. qla2x00_issue_iocb(scsi_qla_host_t *ha, void* buffer, dma_addr_t phys_addr,
  695. size_t size)
  696. {
  697. int rval;
  698. mbx_cmd_t mc;
  699. mbx_cmd_t *mcp = &mc;
  700. mcp->mb[0] = MBC_IOCB_COMMAND_A64;
  701. mcp->mb[1] = 0;
  702. mcp->mb[2] = MSW(phys_addr);
  703. mcp->mb[3] = LSW(phys_addr);
  704. mcp->mb[6] = MSW(MSD(phys_addr));
  705. mcp->mb[7] = LSW(MSD(phys_addr));
  706. mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  707. mcp->in_mb = MBX_2|MBX_0;
  708. mcp->tov = 30;
  709. mcp->flags = 0;
  710. rval = qla2x00_mailbox_command(ha, mcp);
  711. if (rval != QLA_SUCCESS) {
  712. /*EMPTY*/
  713. DEBUG(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
  714. ha->host_no,rval);)
  715. DEBUG2(printk("qla2x00_issue_iocb(%ld): failed rval 0x%x",
  716. ha->host_no,rval);)
  717. } else {
  718. /*EMPTY*/
  719. }
  720. return rval;
  721. }
  722. /*
  723. * qla2x00_abort_command
  724. * Abort command aborts a specified IOCB.
  725. *
  726. * Input:
  727. * ha = adapter block pointer.
  728. * sp = SB structure pointer.
  729. *
  730. * Returns:
  731. * qla2x00 local function return status code.
  732. *
  733. * Context:
  734. * Kernel context.
  735. */
  736. int
  737. qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
  738. {
  739. unsigned long flags = 0;
  740. fc_port_t *fcport;
  741. int rval;
  742. uint32_t handle;
  743. mbx_cmd_t mc;
  744. mbx_cmd_t *mcp = &mc;
  745. DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no);)
  746. fcport = sp->fcport;
  747. if (atomic_read(&ha->loop_state) == LOOP_DOWN ||
  748. atomic_read(&fcport->state) == FCS_DEVICE_LOST) {
  749. return 1;
  750. }
  751. spin_lock_irqsave(&ha->hardware_lock, flags);
  752. for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
  753. if (ha->outstanding_cmds[handle] == sp)
  754. break;
  755. }
  756. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  757. if (handle == MAX_OUTSTANDING_COMMANDS) {
  758. /* command not found */
  759. return QLA_FUNCTION_FAILED;
  760. }
  761. mcp->mb[0] = MBC_ABORT_COMMAND;
  762. if (HAS_EXTENDED_IDS(ha))
  763. mcp->mb[1] = fcport->loop_id;
  764. else
  765. mcp->mb[1] = fcport->loop_id << 8;
  766. mcp->mb[2] = (uint16_t)handle;
  767. mcp->mb[3] = (uint16_t)(handle >> 16);
  768. mcp->mb[6] = (uint16_t)sp->cmd->device->lun;
  769. mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  770. mcp->in_mb = MBX_0;
  771. mcp->tov = 30;
  772. mcp->flags = 0;
  773. rval = qla2x00_mailbox_command(ha, mcp);
  774. if (rval != QLA_SUCCESS) {
  775. DEBUG2_3_11(printk("qla2x00_abort_command(%ld): failed=%x.\n",
  776. ha->host_no, rval);)
  777. } else {
  778. sp->flags |= SRB_ABORT_PENDING;
  779. DEBUG11(printk("qla2x00_abort_command(%ld): done.\n",
  780. ha->host_no);)
  781. }
  782. return rval;
  783. }
  784. #if USE_ABORT_TGT
  785. /*
  786. * qla2x00_abort_target
  787. * Issue abort target mailbox command.
  788. *
  789. * Input:
  790. * ha = adapter block pointer.
  791. *
  792. * Returns:
  793. * qla2x00 local function return status code.
  794. *
  795. * Context:
  796. * Kernel context.
  797. */
  798. int
  799. qla2x00_abort_target(fc_port_t *fcport)
  800. {
  801. int rval;
  802. mbx_cmd_t mc;
  803. mbx_cmd_t *mcp = &mc;
  804. DEBUG11(printk("qla2x00_abort_target(%ld): entered.\n",
  805. fcport->ha->host_no);)
  806. if (fcport == NULL) {
  807. /* no target to abort */
  808. return 0;
  809. }
  810. mcp->mb[0] = MBC_ABORT_TARGET;
  811. mcp->out_mb = MBX_2|MBX_1|MBX_0;
  812. if (HAS_EXTENDED_IDS(fcport->ha)) {
  813. mcp->mb[1] = fcport->loop_id;
  814. mcp->mb[10] = 0;
  815. mcp->out_mb |= MBX_10;
  816. } else {
  817. mcp->mb[1] = fcport->loop_id << 8;
  818. }
  819. mcp->mb[2] = fcport->ha->loop_reset_delay;
  820. mcp->in_mb = MBX_0;
  821. mcp->tov = 30;
  822. mcp->flags = 0;
  823. rval = qla2x00_mailbox_command(fcport->ha, mcp);
  824. /* Issue marker command. */
  825. fcport->ha->marker_needed = 1;
  826. if (rval != QLA_SUCCESS) {
  827. DEBUG2_3_11(printk("qla2x00_abort_target(%ld): failed=%x.\n",
  828. fcport->ha->host_no, rval);)
  829. } else {
  830. /*EMPTY*/
  831. DEBUG11(printk("qla2x00_abort_target(%ld): done.\n",
  832. fcport->ha->host_no);)
  833. }
  834. return rval;
  835. }
  836. #endif
  837. /*
  838. * qla2x00_target_reset
  839. * Issue target reset mailbox command.
  840. *
  841. * Input:
  842. * ha = adapter block pointer.
  843. * TARGET_QUEUE_LOCK must be released.
  844. * ADAPTER_STATE_LOCK must be released.
  845. *
  846. * Returns:
  847. * qla2x00 local function return status code.
  848. *
  849. * Context:
  850. * Kernel context.
  851. */
  852. int
  853. qla2x00_target_reset(scsi_qla_host_t *ha, struct fc_port *fcport)
  854. {
  855. int rval;
  856. mbx_cmd_t mc;
  857. mbx_cmd_t *mcp = &mc;
  858. DEBUG11(printk("qla2x00_target_reset(%ld): entered.\n", ha->host_no);)
  859. if (atomic_read(&fcport->state) != FCS_ONLINE)
  860. return 0;
  861. mcp->mb[0] = MBC_TARGET_RESET;
  862. if (HAS_EXTENDED_IDS(ha))
  863. mcp->mb[1] = fcport->loop_id;
  864. else
  865. mcp->mb[1] = fcport->loop_id << 8;
  866. mcp->mb[2] = ha->loop_reset_delay;
  867. mcp->out_mb = MBX_2|MBX_1|MBX_0;
  868. mcp->in_mb = MBX_0;
  869. mcp->tov = 30;
  870. mcp->flags = 0;
  871. rval = qla2x00_mailbox_command(ha, mcp);
  872. if (rval != QLA_SUCCESS) {
  873. /*EMPTY*/
  874. DEBUG2_3_11(printk("qla2x00_target_reset(%ld): failed=%x.\n",
  875. ha->host_no, rval);)
  876. } else {
  877. /*EMPTY*/
  878. DEBUG11(printk("qla2x00_target_reset(%ld): done.\n",
  879. ha->host_no);)
  880. }
  881. return rval;
  882. }
  883. /*
  884. * qla2x00_get_adapter_id
  885. * Get adapter ID and topology.
  886. *
  887. * Input:
  888. * ha = adapter block pointer.
  889. * id = pointer for loop ID.
  890. * al_pa = pointer for AL_PA.
  891. * area = pointer for area.
  892. * domain = pointer for domain.
  893. * top = pointer for topology.
  894. * TARGET_QUEUE_LOCK must be released.
  895. * ADAPTER_STATE_LOCK must be released.
  896. *
  897. * Returns:
  898. * qla2x00 local function return status code.
  899. *
  900. * Context:
  901. * Kernel context.
  902. */
  903. int
  904. qla2x00_get_adapter_id(scsi_qla_host_t *ha, uint16_t *id, uint8_t *al_pa,
  905. uint8_t *area, uint8_t *domain, uint16_t *top)
  906. {
  907. int rval;
  908. mbx_cmd_t mc;
  909. mbx_cmd_t *mcp = &mc;
  910. DEBUG11(printk("qla2x00_get_adapter_id(%ld): entered.\n",
  911. ha->host_no);)
  912. mcp->mb[0] = MBC_GET_ADAPTER_LOOP_ID;
  913. mcp->out_mb = MBX_0;
  914. mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  915. mcp->tov = 30;
  916. mcp->flags = 0;
  917. rval = qla2x00_mailbox_command(ha, mcp);
  918. /* Return data. */
  919. *id = mcp->mb[1];
  920. *al_pa = LSB(mcp->mb[2]);
  921. *area = MSB(mcp->mb[2]);
  922. *domain = LSB(mcp->mb[3]);
  923. *top = mcp->mb[6];
  924. if (rval != QLA_SUCCESS) {
  925. /*EMPTY*/
  926. DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n",
  927. ha->host_no, rval);)
  928. } else {
  929. /*EMPTY*/
  930. DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
  931. ha->host_no);)
  932. }
  933. return rval;
  934. }
  935. /*
  936. * qla2x00_get_retry_cnt
  937. * Get current firmware login retry count and delay.
  938. *
  939. * Input:
  940. * ha = adapter block pointer.
  941. * retry_cnt = pointer to login retry count.
  942. * tov = pointer to login timeout value.
  943. *
  944. * Returns:
  945. * qla2x00 local function return status code.
  946. *
  947. * Context:
  948. * Kernel context.
  949. */
  950. int
  951. qla2x00_get_retry_cnt(scsi_qla_host_t *ha, uint8_t *retry_cnt, uint8_t *tov,
  952. uint16_t *r_a_tov)
  953. {
  954. int rval;
  955. uint16_t ratov;
  956. mbx_cmd_t mc;
  957. mbx_cmd_t *mcp = &mc;
  958. DEBUG11(printk("qla2x00_get_retry_cnt(%ld): entered.\n",
  959. ha->host_no);)
  960. mcp->mb[0] = MBC_GET_RETRY_COUNT;
  961. mcp->out_mb = MBX_0;
  962. mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
  963. mcp->tov = 30;
  964. mcp->flags = 0;
  965. rval = qla2x00_mailbox_command(ha, mcp);
  966. if (rval != QLA_SUCCESS) {
  967. /*EMPTY*/
  968. DEBUG2_3_11(printk("qla2x00_get_retry_cnt(%ld): failed = %x.\n",
  969. ha->host_no, mcp->mb[0]);)
  970. } else {
  971. /* Convert returned data and check our values. */
  972. *r_a_tov = mcp->mb[3] / 2;
  973. ratov = (mcp->mb[3]/2) / 10; /* mb[3] value is in 100ms */
  974. if (mcp->mb[1] * ratov > (*retry_cnt) * (*tov)) {
  975. /* Update to the larger values */
  976. *retry_cnt = (uint8_t)mcp->mb[1];
  977. *tov = ratov;
  978. }
  979. DEBUG11(printk("qla2x00_get_retry_cnt(%ld): done. mb3=%d "
  980. "ratov=%d.\n", ha->host_no, mcp->mb[3], ratov);)
  981. }
  982. return rval;
  983. }
  984. /*
  985. * qla2x00_init_firmware
  986. * Initialize adapter firmware.
  987. *
  988. * Input:
  989. * ha = adapter block pointer.
  990. * dptr = Initialization control block pointer.
  991. * size = size of initialization control block.
  992. * TARGET_QUEUE_LOCK must be released.
  993. * ADAPTER_STATE_LOCK must be released.
  994. *
  995. * Returns:
  996. * qla2x00 local function return status code.
  997. *
  998. * Context:
  999. * Kernel context.
  1000. */
  1001. int
  1002. qla2x00_init_firmware(scsi_qla_host_t *ha, uint16_t size)
  1003. {
  1004. int rval;
  1005. mbx_cmd_t mc;
  1006. mbx_cmd_t *mcp = &mc;
  1007. DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
  1008. ha->host_no);)
  1009. mcp->mb[0] = MBC_INITIALIZE_FIRMWARE;
  1010. mcp->mb[2] = MSW(ha->init_cb_dma);
  1011. mcp->mb[3] = LSW(ha->init_cb_dma);
  1012. mcp->mb[4] = 0;
  1013. mcp->mb[5] = 0;
  1014. mcp->mb[6] = MSW(MSD(ha->init_cb_dma));
  1015. mcp->mb[7] = LSW(MSD(ha->init_cb_dma));
  1016. mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
  1017. mcp->in_mb = MBX_5|MBX_4|MBX_0;
  1018. mcp->buf_size = size;
  1019. mcp->flags = MBX_DMA_OUT;
  1020. mcp->tov = 30;
  1021. rval = qla2x00_mailbox_command(ha, mcp);
  1022. if (rval != QLA_SUCCESS) {
  1023. /*EMPTY*/
  1024. DEBUG2_3_11(printk("qla2x00_init_firmware(%ld): failed=%x "
  1025. "mb0=%x.\n",
  1026. ha->host_no, rval, mcp->mb[0]);)
  1027. } else {
  1028. /*EMPTY*/
  1029. DEBUG11(printk("qla2x00_init_firmware(%ld): done.\n",
  1030. ha->host_no);)
  1031. }
  1032. return rval;
  1033. }
  1034. /*
  1035. * qla2x00_get_port_database
  1036. * Issue normal/enhanced get port database mailbox command
  1037. * and copy device name as necessary.
  1038. *
  1039. * Input:
  1040. * ha = adapter state pointer.
  1041. * dev = structure pointer.
  1042. * opt = enhanced cmd option byte.
  1043. *
  1044. * Returns:
  1045. * qla2x00 local function return status code.
  1046. *
  1047. * Context:
  1048. * Kernel context.
  1049. */
  1050. int
  1051. qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt)
  1052. {
  1053. int rval;
  1054. mbx_cmd_t mc;
  1055. mbx_cmd_t *mcp = &mc;
  1056. port_database_t *pd;
  1057. dma_addr_t pd_dma;
  1058. DEBUG11(printk("qla2x00_get_port_database(%ld): entered.\n",
  1059. ha->host_no);)
  1060. pd = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pd_dma);
  1061. if (pd == NULL) {
  1062. DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): **** "
  1063. "Mem Alloc Failed ****", ha->host_no);)
  1064. return QLA_MEMORY_ALLOC_FAILED;
  1065. }
  1066. memset(pd, 0, PORT_DATABASE_SIZE);
  1067. if (opt != 0)
  1068. mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE;
  1069. else
  1070. mcp->mb[0] = MBC_GET_PORT_DATABASE;
  1071. mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  1072. if (HAS_EXTENDED_IDS(ha)) {
  1073. mcp->mb[1] = fcport->loop_id;
  1074. mcp->mb[10] = opt;
  1075. mcp->out_mb |= MBX_10;
  1076. } else {
  1077. mcp->mb[1] = fcport->loop_id << 8 | opt;
  1078. }
  1079. mcp->mb[2] = MSW(pd_dma);
  1080. mcp->mb[3] = LSW(pd_dma);
  1081. mcp->mb[6] = MSW(MSD(pd_dma));
  1082. mcp->mb[7] = LSW(MSD(pd_dma));
  1083. mcp->in_mb = MBX_0;
  1084. mcp->buf_size = PORT_DATABASE_SIZE;
  1085. mcp->flags = MBX_DMA_IN;
  1086. mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
  1087. rval = qla2x00_mailbox_command(ha, mcp);
  1088. if (rval != QLA_SUCCESS)
  1089. goto gpd_error_out;
  1090. /* Check for logged in state. */
  1091. if (pd->master_state != PD_STATE_PORT_LOGGED_IN &&
  1092. pd->slave_state != PD_STATE_PORT_LOGGED_IN) {
  1093. rval = QLA_FUNCTION_FAILED;
  1094. goto gpd_error_out;
  1095. }
  1096. /* Names are little-endian. */
  1097. memcpy(fcport->node_name, pd->node_name, WWN_SIZE);
  1098. memcpy(fcport->port_name, pd->port_name, WWN_SIZE);
  1099. /* Get port_id of device. */
  1100. fcport->d_id.b.al_pa = pd->port_id[2];
  1101. fcport->d_id.b.area = pd->port_id[3];
  1102. fcport->d_id.b.domain = pd->port_id[0];
  1103. fcport->d_id.b.rsvd_1 = 0;
  1104. /* Check for device require authentication. */
  1105. pd->common_features & BIT_5 ? (fcport->flags |= FCF_AUTH_REQ) :
  1106. (fcport->flags &= ~FCF_AUTH_REQ);
  1107. /* If not target must be initiator or unknown type. */
  1108. if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0)
  1109. fcport->port_type = FCT_INITIATOR;
  1110. else
  1111. fcport->port_type = FCT_TARGET;
  1112. gpd_error_out:
  1113. dma_pool_free(ha->s_dma_pool, pd, pd_dma);
  1114. if (rval != QLA_SUCCESS) {
  1115. /*EMPTY*/
  1116. DEBUG2_3_11(printk("qla2x00_get_port_database(%ld): "
  1117. "failed=%x.\n", ha->host_no, rval);)
  1118. } else {
  1119. /*EMPTY*/
  1120. DEBUG11(printk("qla2x00_get_port_database(%ld): done.\n",
  1121. ha->host_no);)
  1122. }
  1123. return rval;
  1124. }
  1125. /*
  1126. * qla2x00_get_firmware_state
  1127. * Get adapter firmware state.
  1128. *
  1129. * Input:
  1130. * ha = adapter block pointer.
  1131. * dptr = pointer for firmware state.
  1132. * TARGET_QUEUE_LOCK must be released.
  1133. * ADAPTER_STATE_LOCK must be released.
  1134. *
  1135. * Returns:
  1136. * qla2x00 local function return status code.
  1137. *
  1138. * Context:
  1139. * Kernel context.
  1140. */
  1141. int
  1142. qla2x00_get_firmware_state(scsi_qla_host_t *ha, uint16_t *dptr)
  1143. {
  1144. int rval;
  1145. mbx_cmd_t mc;
  1146. mbx_cmd_t *mcp = &mc;
  1147. DEBUG11(printk("qla2x00_get_firmware_state(%ld): entered.\n",
  1148. ha->host_no);)
  1149. mcp->mb[0] = MBC_GET_FIRMWARE_STATE;
  1150. mcp->out_mb = MBX_0;
  1151. mcp->in_mb = MBX_2|MBX_1|MBX_0;
  1152. mcp->tov = 30;
  1153. mcp->flags = 0;
  1154. rval = qla2x00_mailbox_command(ha, mcp);
  1155. /* Return firmware state. */
  1156. *dptr = mcp->mb[1];
  1157. if (rval != QLA_SUCCESS) {
  1158. /*EMPTY*/
  1159. DEBUG2_3_11(printk("qla2x00_get_firmware_state(%ld): "
  1160. "failed=%x.\n", ha->host_no, rval);)
  1161. } else {
  1162. /*EMPTY*/
  1163. DEBUG11(printk("qla2x00_get_firmware_state(%ld): done.\n",
  1164. ha->host_no);)
  1165. }
  1166. return rval;
  1167. }
  1168. /*
  1169. * qla2x00_get_port_name
  1170. * Issue get port name mailbox command.
  1171. * Returned name is in big endian format.
  1172. *
  1173. * Input:
  1174. * ha = adapter block pointer.
  1175. * loop_id = loop ID of device.
  1176. * name = pointer for name.
  1177. * TARGET_QUEUE_LOCK must be released.
  1178. * ADAPTER_STATE_LOCK must be released.
  1179. *
  1180. * Returns:
  1181. * qla2x00 local function return status code.
  1182. *
  1183. * Context:
  1184. * Kernel context.
  1185. */
  1186. int
  1187. qla2x00_get_port_name(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t *name,
  1188. uint8_t opt)
  1189. {
  1190. int rval;
  1191. mbx_cmd_t mc;
  1192. mbx_cmd_t *mcp = &mc;
  1193. DEBUG11(printk("qla2x00_get_port_name(%ld): entered.\n",
  1194. ha->host_no);)
  1195. mcp->mb[0] = MBC_GET_PORT_NAME;
  1196. mcp->out_mb = MBX_1|MBX_0;
  1197. if (HAS_EXTENDED_IDS(ha)) {
  1198. mcp->mb[1] = loop_id;
  1199. mcp->mb[10] = opt;
  1200. mcp->out_mb |= MBX_10;
  1201. } else {
  1202. mcp->mb[1] = loop_id << 8 | opt;
  1203. }
  1204. mcp->in_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  1205. mcp->tov = 30;
  1206. mcp->flags = 0;
  1207. rval = qla2x00_mailbox_command(ha, mcp);
  1208. if (rval != QLA_SUCCESS) {
  1209. /*EMPTY*/
  1210. DEBUG2_3_11(printk("qla2x00_get_port_name(%ld): failed=%x.\n",
  1211. ha->host_no, rval);)
  1212. } else {
  1213. if (name != NULL) {
  1214. /* This function returns name in big endian. */
  1215. name[0] = LSB(mcp->mb[2]);
  1216. name[1] = MSB(mcp->mb[2]);
  1217. name[2] = LSB(mcp->mb[3]);
  1218. name[3] = MSB(mcp->mb[3]);
  1219. name[4] = LSB(mcp->mb[6]);
  1220. name[5] = MSB(mcp->mb[6]);
  1221. name[6] = LSB(mcp->mb[7]);
  1222. name[7] = MSB(mcp->mb[7]);
  1223. }
  1224. DEBUG11(printk("qla2x00_get_port_name(%ld): done.\n",
  1225. ha->host_no);)
  1226. }
  1227. return rval;
  1228. }
  1229. /*
  1230. * qla2x00_lip_reset
  1231. * Issue LIP reset mailbox command.
  1232. *
  1233. * Input:
  1234. * ha = adapter block pointer.
  1235. * TARGET_QUEUE_LOCK must be released.
  1236. * ADAPTER_STATE_LOCK must be released.
  1237. *
  1238. * Returns:
  1239. * qla2x00 local function return status code.
  1240. *
  1241. * Context:
  1242. * Kernel context.
  1243. */
  1244. int
  1245. qla2x00_lip_reset(scsi_qla_host_t *ha)
  1246. {
  1247. int rval;
  1248. mbx_cmd_t mc;
  1249. mbx_cmd_t *mcp = &mc;
  1250. DEBUG11(printk("qla2x00_lip_reset(%ld): entered.\n",
  1251. ha->host_no);)
  1252. mcp->mb[0] = MBC_LIP_RESET;
  1253. mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
  1254. if (HAS_EXTENDED_IDS(ha)) {
  1255. mcp->mb[1] = 0x00ff;
  1256. mcp->mb[10] = 0;
  1257. mcp->out_mb |= MBX_10;
  1258. } else {
  1259. mcp->mb[1] = 0xff00;
  1260. }
  1261. mcp->mb[2] = ha->loop_reset_delay;
  1262. mcp->mb[3] = 0;
  1263. mcp->in_mb = MBX_0;
  1264. mcp->tov = 30;
  1265. mcp->flags = 0;
  1266. rval = qla2x00_mailbox_command(ha, mcp);
  1267. if (rval != QLA_SUCCESS) {
  1268. /*EMPTY*/
  1269. DEBUG2_3_11(printk("qla2x00_lip_reset(%ld): failed=%x.\n",
  1270. ha->host_no, rval);)
  1271. } else {
  1272. /*EMPTY*/
  1273. DEBUG11(printk("qla2x00_lip_reset(%ld): done.\n", ha->host_no);)
  1274. }
  1275. return rval;
  1276. }
  1277. /*
  1278. * qla2x00_send_sns
  1279. * Send SNS command.
  1280. *
  1281. * Input:
  1282. * ha = adapter block pointer.
  1283. * sns = pointer for command.
  1284. * cmd_size = command size.
  1285. * buf_size = response/command size.
  1286. * TARGET_QUEUE_LOCK must be released.
  1287. * ADAPTER_STATE_LOCK must be released.
  1288. *
  1289. * Returns:
  1290. * qla2x00 local function return status code.
  1291. *
  1292. * Context:
  1293. * Kernel context.
  1294. */
  1295. int
  1296. qla2x00_send_sns(scsi_qla_host_t *ha, dma_addr_t sns_phys_address,
  1297. uint16_t cmd_size, size_t buf_size)
  1298. {
  1299. int rval;
  1300. mbx_cmd_t mc;
  1301. mbx_cmd_t *mcp = &mc;
  1302. DEBUG11(printk("qla2x00_send_sns(%ld): entered.\n",
  1303. ha->host_no);)
  1304. DEBUG11(printk("qla2x00_send_sns: retry cnt=%d ratov=%d total "
  1305. "tov=%d.\n", ha->retry_count, ha->login_timeout, mcp->tov);)
  1306. mcp->mb[0] = MBC_SEND_SNS_COMMAND;
  1307. mcp->mb[1] = cmd_size;
  1308. mcp->mb[2] = MSW(sns_phys_address);
  1309. mcp->mb[3] = LSW(sns_phys_address);
  1310. mcp->mb[6] = MSW(MSD(sns_phys_address));
  1311. mcp->mb[7] = LSW(MSD(sns_phys_address));
  1312. mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  1313. mcp->in_mb = MBX_0|MBX_1;
  1314. mcp->buf_size = buf_size;
  1315. mcp->flags = MBX_DMA_OUT|MBX_DMA_IN;
  1316. mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
  1317. rval = qla2x00_mailbox_command(ha, mcp);
  1318. if (rval != QLA_SUCCESS) {
  1319. /*EMPTY*/
  1320. DEBUG(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
  1321. "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
  1322. DEBUG2_3_11(printk("qla2x00_send_sns(%ld): failed=%x mb[0]=%x "
  1323. "mb[1]=%x.\n", ha->host_no, rval, mcp->mb[0], mcp->mb[1]);)
  1324. } else {
  1325. /*EMPTY*/
  1326. DEBUG11(printk("qla2x00_send_sns(%ld): done.\n", ha->host_no);)
  1327. }
  1328. return rval;
  1329. }
  1330. /*
  1331. * qla2x00_login_fabric
  1332. * Issue login fabric port mailbox command.
  1333. *
  1334. * Input:
  1335. * ha = adapter block pointer.
  1336. * loop_id = device loop ID.
  1337. * domain = device domain.
  1338. * area = device area.
  1339. * al_pa = device AL_PA.
  1340. * status = pointer for return status.
  1341. * opt = command options.
  1342. * TARGET_QUEUE_LOCK must be released.
  1343. * ADAPTER_STATE_LOCK must be released.
  1344. *
  1345. * Returns:
  1346. * qla2x00 local function return status code.
  1347. *
  1348. * Context:
  1349. * Kernel context.
  1350. */
  1351. int
  1352. qla2x00_login_fabric(scsi_qla_host_t *ha, uint16_t loop_id, uint8_t domain,
  1353. uint8_t area, uint8_t al_pa, uint16_t *mb, uint8_t opt)
  1354. {
  1355. int rval;
  1356. mbx_cmd_t mc;
  1357. mbx_cmd_t *mcp = &mc;
  1358. DEBUG11(printk("qla2x00_login_fabric(%ld): entered.\n", ha->host_no);)
  1359. mcp->mb[0] = MBC_LOGIN_FABRIC_PORT;
  1360. mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
  1361. if (HAS_EXTENDED_IDS(ha)) {
  1362. mcp->mb[1] = loop_id;
  1363. mcp->mb[10] = opt;
  1364. mcp->out_mb |= MBX_10;
  1365. } else {
  1366. mcp->mb[1] = (loop_id << 8) | opt;
  1367. }
  1368. mcp->mb[2] = domain;
  1369. mcp->mb[3] = area << 8 | al_pa;
  1370. mcp->in_mb = MBX_7|MBX_6|MBX_2|MBX_1|MBX_0;
  1371. mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
  1372. mcp->flags = 0;
  1373. rval = qla2x00_mailbox_command(ha, mcp);
  1374. /* Return mailbox statuses. */
  1375. if (mb != NULL) {
  1376. mb[0] = mcp->mb[0];
  1377. mb[1] = mcp->mb[1];
  1378. mb[2] = mcp->mb[2];
  1379. mb[6] = mcp->mb[6];
  1380. mb[7] = mcp->mb[7];
  1381. }
  1382. if (rval != QLA_SUCCESS) {
  1383. /* RLU tmp code: need to change main mailbox_command function to
  1384. * return ok even when the mailbox completion value is not
  1385. * SUCCESS. The caller needs to be responsible to interpret
  1386. * the return values of this mailbox command if we're not
  1387. * to change too much of the existing code.
  1388. */
  1389. if (mcp->mb[0] == 0x4001 || mcp->mb[0] == 0x4002 ||
  1390. mcp->mb[0] == 0x4003 || mcp->mb[0] == 0x4005 ||
  1391. mcp->mb[0] == 0x4006)
  1392. rval = QLA_SUCCESS;
  1393. /*EMPTY*/
  1394. DEBUG2_3_11(printk("qla2x00_login_fabric(%ld): failed=%x "
  1395. "mb[0]=%x mb[1]=%x mb[2]=%x.\n", ha->host_no, rval,
  1396. mcp->mb[0], mcp->mb[1], mcp->mb[2]);)
  1397. } else {
  1398. /*EMPTY*/
  1399. DEBUG11(printk("qla2x00_login_fabric(%ld): done.\n",
  1400. ha->host_no);)
  1401. }
  1402. return rval;
  1403. }
  1404. /*
  1405. * qla2x00_login_local_device
  1406. * Issue login loop port mailbox command.
  1407. *
  1408. * Input:
  1409. * ha = adapter block pointer.
  1410. * loop_id = device loop ID.
  1411. * opt = command options.
  1412. *
  1413. * Returns:
  1414. * Return status code.
  1415. *
  1416. * Context:
  1417. * Kernel context.
  1418. *
  1419. */
  1420. int
  1421. qla2x00_login_local_device(scsi_qla_host_t *ha, uint16_t loop_id,
  1422. uint16_t *mb_ret, uint8_t opt)
  1423. {
  1424. int rval;
  1425. mbx_cmd_t mc;
  1426. mbx_cmd_t *mcp = &mc;
  1427. DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);)
  1428. mcp->mb[0] = MBC_LOGIN_LOOP_PORT;
  1429. if (HAS_EXTENDED_IDS(ha))
  1430. mcp->mb[1] = loop_id;
  1431. else
  1432. mcp->mb[1] = loop_id << 8;
  1433. mcp->mb[2] = opt;
  1434. mcp->out_mb = MBX_2|MBX_1|MBX_0;
  1435. mcp->in_mb = MBX_7|MBX_6|MBX_1|MBX_0;
  1436. mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
  1437. mcp->flags = 0;
  1438. rval = qla2x00_mailbox_command(ha, mcp);
  1439. /* Return mailbox statuses. */
  1440. if (mb_ret != NULL) {
  1441. mb_ret[0] = mcp->mb[0];
  1442. mb_ret[1] = mcp->mb[1];
  1443. mb_ret[6] = mcp->mb[6];
  1444. mb_ret[7] = mcp->mb[7];
  1445. }
  1446. if (rval != QLA_SUCCESS) {
  1447. /* AV tmp code: need to change main mailbox_command function to
  1448. * return ok even when the mailbox completion value is not
  1449. * SUCCESS. The caller needs to be responsible to interpret
  1450. * the return values of this mailbox command if we're not
  1451. * to change too much of the existing code.
  1452. */
  1453. if (mcp->mb[0] == 0x4005 || mcp->mb[0] == 0x4006)
  1454. rval = QLA_SUCCESS;
  1455. DEBUG(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
  1456. "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
  1457. mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);)
  1458. DEBUG2_3(printk("%s(%ld): failed=%x mb[0]=%x mb[1]=%x "
  1459. "mb[6]=%x mb[7]=%x.\n", __func__, ha->host_no, rval,
  1460. mcp->mb[0], mcp->mb[1], mcp->mb[6], mcp->mb[7]);)
  1461. } else {
  1462. /*EMPTY*/
  1463. DEBUG3(printk("%s(%ld): done.\n", __func__, ha->host_no);)
  1464. }
  1465. return (rval);
  1466. }
  1467. /*
  1468. * qla2x00_fabric_logout
  1469. * Issue logout fabric port mailbox command.
  1470. *
  1471. * Input:
  1472. * ha = adapter block pointer.
  1473. * loop_id = device loop ID.
  1474. * TARGET_QUEUE_LOCK must be released.
  1475. * ADAPTER_STATE_LOCK must be released.
  1476. *
  1477. * Returns:
  1478. * qla2x00 local function return status code.
  1479. *
  1480. * Context:
  1481. * Kernel context.
  1482. */
  1483. int
  1484. qla2x00_fabric_logout(scsi_qla_host_t *ha, uint16_t loop_id)
  1485. {
  1486. int rval;
  1487. mbx_cmd_t mc;
  1488. mbx_cmd_t *mcp = &mc;
  1489. DEBUG11(printk("qla2x00_fabric_logout(%ld): entered.\n",
  1490. ha->host_no);)
  1491. mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT;
  1492. mcp->out_mb = MBX_1|MBX_0;
  1493. if (HAS_EXTENDED_IDS(ha)) {
  1494. mcp->mb[1] = loop_id;
  1495. mcp->mb[10] = 0;
  1496. mcp->out_mb |= MBX_10;
  1497. } else {
  1498. mcp->mb[1] = loop_id << 8;
  1499. }
  1500. mcp->in_mb = MBX_1|MBX_0;
  1501. mcp->tov = 30;
  1502. mcp->flags = 0;
  1503. rval = qla2x00_mailbox_command(ha, mcp);
  1504. if (rval != QLA_SUCCESS) {
  1505. /*EMPTY*/
  1506. DEBUG2_3_11(printk("qla2x00_fabric_logout(%ld): failed=%x "
  1507. "mbx1=%x.\n", ha->host_no, rval, mcp->mb[1]);)
  1508. } else {
  1509. /*EMPTY*/
  1510. DEBUG11(printk("qla2x00_fabric_logout(%ld): done.\n",
  1511. ha->host_no);)
  1512. }
  1513. return rval;
  1514. }
  1515. /*
  1516. * qla2x00_full_login_lip
  1517. * Issue full login LIP mailbox command.
  1518. *
  1519. * Input:
  1520. * ha = adapter block pointer.
  1521. * TARGET_QUEUE_LOCK must be released.
  1522. * ADAPTER_STATE_LOCK must be released.
  1523. *
  1524. * Returns:
  1525. * qla2x00 local function return status code.
  1526. *
  1527. * Context:
  1528. * Kernel context.
  1529. */
  1530. int
  1531. qla2x00_full_login_lip(scsi_qla_host_t *ha)
  1532. {
  1533. int rval;
  1534. mbx_cmd_t mc;
  1535. mbx_cmd_t *mcp = &mc;
  1536. DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n",
  1537. ha->host_no);)
  1538. mcp->mb[0] = MBC_LIP_FULL_LOGIN;
  1539. mcp->mb[1] = 0;
  1540. mcp->mb[2] = 0;
  1541. mcp->mb[3] = 0;
  1542. mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
  1543. mcp->in_mb = MBX_0;
  1544. mcp->tov = 30;
  1545. mcp->flags = 0;
  1546. rval = qla2x00_mailbox_command(ha, mcp);
  1547. if (rval != QLA_SUCCESS) {
  1548. /*EMPTY*/
  1549. DEBUG2_3_11(printk("qla2x00_full_login_lip(%ld): failed=%x.\n",
  1550. ha->instance, rval);)
  1551. } else {
  1552. /*EMPTY*/
  1553. DEBUG11(printk("qla2x00_full_login_lip(%ld): done.\n",
  1554. ha->host_no);)
  1555. }
  1556. return rval;
  1557. }
  1558. /*
  1559. * qla2x00_get_id_list
  1560. *
  1561. * Input:
  1562. * ha = adapter block pointer.
  1563. *
  1564. * Returns:
  1565. * qla2x00 local function return status code.
  1566. *
  1567. * Context:
  1568. * Kernel context.
  1569. */
  1570. int
  1571. qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma,
  1572. uint16_t *entries)
  1573. {
  1574. int rval;
  1575. mbx_cmd_t mc;
  1576. mbx_cmd_t *mcp = &mc;
  1577. DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n",
  1578. ha->host_no);)
  1579. if (id_list == NULL)
  1580. return QLA_FUNCTION_FAILED;
  1581. mcp->mb[0] = MBC_GET_ID_LIST;
  1582. mcp->mb[1] = MSW(id_list_dma);
  1583. mcp->mb[2] = LSW(id_list_dma);
  1584. mcp->mb[3] = MSW(MSD(id_list_dma));
  1585. mcp->mb[6] = LSW(MSD(id_list_dma));
  1586. mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  1587. mcp->in_mb = MBX_1|MBX_0;
  1588. mcp->tov = 30;
  1589. mcp->flags = 0;
  1590. rval = qla2x00_mailbox_command(ha, mcp);
  1591. if (rval != QLA_SUCCESS) {
  1592. /*EMPTY*/
  1593. DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n",
  1594. ha->host_no, rval);)
  1595. } else {
  1596. *entries = mcp->mb[1];
  1597. DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n",
  1598. ha->host_no);)
  1599. }
  1600. return rval;
  1601. }
  1602. /*
  1603. * qla2x00_get_resource_cnts
  1604. * Get current firmware resource counts.
  1605. *
  1606. * Input:
  1607. * ha = adapter block pointer.
  1608. *
  1609. * Returns:
  1610. * qla2x00 local function return status code.
  1611. *
  1612. * Context:
  1613. * Kernel context.
  1614. */
  1615. int
  1616. qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt,
  1617. uint16_t *orig_xchg_cnt, uint16_t *cur_iocb_cnt, uint16_t *orig_iocb_cnt)
  1618. {
  1619. int rval;
  1620. mbx_cmd_t mc;
  1621. mbx_cmd_t *mcp = &mc;
  1622. DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no));
  1623. mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
  1624. mcp->out_mb = MBX_0;
  1625. mcp->in_mb = MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
  1626. mcp->tov = 30;
  1627. mcp->flags = 0;
  1628. rval = qla2x00_mailbox_command(ha, mcp);
  1629. if (rval != QLA_SUCCESS) {
  1630. /*EMPTY*/
  1631. DEBUG2_3_11(printk("%s(%ld): failed = %x.\n", __func__,
  1632. ha->host_no, mcp->mb[0]);)
  1633. } else {
  1634. DEBUG11(printk("%s(%ld): done. mb1=%x mb2=%x mb3=%x mb6=%x "
  1635. "mb7=%x mb10=%x.\n", __func__, ha->host_no,
  1636. mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[6], mcp->mb[7],
  1637. mcp->mb[10]));
  1638. if (cur_xchg_cnt)
  1639. *cur_xchg_cnt = mcp->mb[3];
  1640. if (orig_xchg_cnt)
  1641. *orig_xchg_cnt = mcp->mb[6];
  1642. if (cur_iocb_cnt)
  1643. *cur_iocb_cnt = mcp->mb[7];
  1644. if (orig_iocb_cnt)
  1645. *orig_iocb_cnt = mcp->mb[10];
  1646. }
  1647. return (rval);
  1648. }
  1649. #if defined(QL_DEBUG_LEVEL_3)
  1650. /*
  1651. * qla2x00_get_fcal_position_map
  1652. * Get FCAL (LILP) position map using mailbox command
  1653. *
  1654. * Input:
  1655. * ha = adapter state pointer.
  1656. * pos_map = buffer pointer (can be NULL).
  1657. *
  1658. * Returns:
  1659. * qla2x00 local function return status code.
  1660. *
  1661. * Context:
  1662. * Kernel context.
  1663. */
  1664. int
  1665. qla2x00_get_fcal_position_map(scsi_qla_host_t *ha, char *pos_map)
  1666. {
  1667. int rval;
  1668. mbx_cmd_t mc;
  1669. mbx_cmd_t *mcp = &mc;
  1670. char *pmap;
  1671. dma_addr_t pmap_dma;
  1672. pmap = dma_pool_alloc(ha->s_dma_pool, GFP_ATOMIC, &pmap_dma);
  1673. if (pmap == NULL) {
  1674. DEBUG2_3_11(printk("%s(%ld): **** Mem Alloc Failed ****",
  1675. __func__, ha->host_no));
  1676. return QLA_MEMORY_ALLOC_FAILED;
  1677. }
  1678. memset(pmap, 0, FCAL_MAP_SIZE);
  1679. mcp->mb[0] = MBC_GET_FC_AL_POSITION_MAP;
  1680. mcp->mb[2] = MSW(pmap_dma);
  1681. mcp->mb[3] = LSW(pmap_dma);
  1682. mcp->mb[6] = MSW(MSD(pmap_dma));
  1683. mcp->mb[7] = LSW(MSD(pmap_dma));
  1684. mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_0;
  1685. mcp->in_mb = MBX_1|MBX_0;
  1686. mcp->buf_size = FCAL_MAP_SIZE;
  1687. mcp->flags = MBX_DMA_IN;
  1688. mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout / 2);
  1689. rval = qla2x00_mailbox_command(ha, mcp);
  1690. if (rval == QLA_SUCCESS) {
  1691. DEBUG11(printk("%s(%ld): (mb0=%x/mb1=%x) FC/AL Position Map "
  1692. "size (%x)\n", __func__, ha->host_no, mcp->mb[0],
  1693. mcp->mb[1], (unsigned)pmap[0]));
  1694. DEBUG11(qla2x00_dump_buffer(pmap, pmap[0] + 1));
  1695. if (pos_map)
  1696. memcpy(pos_map, pmap, FCAL_MAP_SIZE);
  1697. }
  1698. dma_pool_free(ha->s_dma_pool, pmap, pmap_dma);
  1699. if (rval != QLA_SUCCESS) {
  1700. DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__,
  1701. ha->host_no, rval));
  1702. } else {
  1703. DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no));
  1704. }
  1705. return rval;
  1706. }
  1707. #endif