Merge Trond's bugfixes
[linux-2.6-block.git] / drivers / scsi / qla2xxx / qla_init.c
1 /*
2  * QLogic Fibre Channel HBA Driver
3  * Copyright (c)  2003-2012 QLogic Corporation
4  *
5  * See LICENSE.qla2xxx for copyright and licensing details.
6  */
7 #include "qla_def.h"
8 #include "qla_gbl.h"
9
10 #include <linux/delay.h>
11 #include <linux/slab.h>
12 #include <linux/vmalloc.h>
13
14 #include "qla_devtbl.h"
15
16 #ifdef CONFIG_SPARC
17 #include <asm/prom.h>
18 #endif
19
20 #include <target/target_core_base.h>
21 #include "qla_target.h"
22
23 /*
24 *  QLogic ISP2x00 Hardware Support Function Prototypes.
25 */
26 static int qla2x00_isp_firmware(scsi_qla_host_t *);
27 static int qla2x00_setup_chip(scsi_qla_host_t *);
28 static int qla2x00_init_rings(scsi_qla_host_t *);
29 static int qla2x00_fw_ready(scsi_qla_host_t *);
30 static int qla2x00_configure_hba(scsi_qla_host_t *);
31 static int qla2x00_configure_loop(scsi_qla_host_t *);
32 static int qla2x00_configure_local_loop(scsi_qla_host_t *);
33 static int qla2x00_configure_fabric(scsi_qla_host_t *);
34 static int qla2x00_find_all_fabric_devs(scsi_qla_host_t *, struct list_head *);
35 static int qla2x00_fabric_dev_login(scsi_qla_host_t *, fc_port_t *,
36     uint16_t *);
37
38 static int qla2x00_restart_isp(scsi_qla_host_t *);
39
40 static struct qla_chip_state_84xx *qla84xx_get_chip(struct scsi_qla_host *);
41 static int qla84xx_init_chip(scsi_qla_host_t *);
42 static int qla25xx_init_queues(struct qla_hw_data *);
43
44 /* SRB Extensions ---------------------------------------------------------- */
45
46 void
47 qla2x00_sp_timeout(unsigned long __data)
48 {
49         srb_t *sp = (srb_t *)__data;
50         struct srb_iocb *iocb;
51         fc_port_t *fcport = sp->fcport;
52         struct qla_hw_data *ha = fcport->vha->hw;
53         struct req_que *req;
54         unsigned long flags;
55
56         spin_lock_irqsave(&ha->hardware_lock, flags);
57         req = ha->req_q_map[0];
58         req->outstanding_cmds[sp->handle] = NULL;
59         iocb = &sp->u.iocb_cmd;
60         iocb->timeout(sp);
61         sp->free(fcport->vha, sp);
62         spin_unlock_irqrestore(&ha->hardware_lock, flags);
63 }
64
65 void
66 qla2x00_sp_free(void *data, void *ptr)
67 {
68         srb_t *sp = (srb_t *)ptr;
69         struct srb_iocb *iocb = &sp->u.iocb_cmd;
70         struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
71
72         del_timer(&iocb->timer);
73         mempool_free(sp, vha->hw->srb_mempool);
74
75         QLA_VHA_MARK_NOT_BUSY(vha);
76 }
77
78 /* Asynchronous Login/Logout Routines -------------------------------------- */
79
80 unsigned long
81 qla2x00_get_async_timeout(struct scsi_qla_host *vha)
82 {
83         unsigned long tmo;
84         struct qla_hw_data *ha = vha->hw;
85
86         /* Firmware should use switch negotiated r_a_tov for timeout. */
87         tmo = ha->r_a_tov / 10 * 2;
88         if (!IS_FWI2_CAPABLE(ha)) {
89                 /*
90                  * Except for earlier ISPs where the timeout is seeded from the
91                  * initialization control block.
92                  */
93                 tmo = ha->login_timeout;
94         }
95         return tmo;
96 }
97
98 static void
99 qla2x00_async_iocb_timeout(void *data)
100 {
101         srb_t *sp = (srb_t *)data;
102         fc_port_t *fcport = sp->fcport;
103
104         ql_dbg(ql_dbg_disc, fcport->vha, 0x2071,
105             "Async-%s timeout - hdl=%x portid=%02x%02x%02x.\n",
106             sp->name, sp->handle, fcport->d_id.b.domain, fcport->d_id.b.area,
107             fcport->d_id.b.al_pa);
108
109         fcport->flags &= ~FCF_ASYNC_SENT;
110         if (sp->type == SRB_LOGIN_CMD) {
111                 struct srb_iocb *lio = &sp->u.iocb_cmd;
112                 qla2x00_post_async_logout_work(fcport->vha, fcport, NULL);
113                 /* Retry as needed. */
114                 lio->u.logio.data[0] = MBS_COMMAND_ERROR;
115                 lio->u.logio.data[1] = lio->u.logio.flags & SRB_LOGIN_RETRIED ?
116                         QLA_LOGIO_LOGIN_RETRIED : 0;
117                 qla2x00_post_async_login_done_work(fcport->vha, fcport,
118                         lio->u.logio.data);
119         }
120 }
121
122 static void
123 qla2x00_async_login_sp_done(void *data, void *ptr, int res)
124 {
125         srb_t *sp = (srb_t *)ptr;
126         struct srb_iocb *lio = &sp->u.iocb_cmd;
127         struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
128
129         if (!test_bit(UNLOADING, &vha->dpc_flags))
130                 qla2x00_post_async_login_done_work(sp->fcport->vha, sp->fcport,
131                     lio->u.logio.data);
132         sp->free(sp->fcport->vha, sp);
133 }
134
135 int
136 qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport,
137     uint16_t *data)
138 {
139         srb_t *sp;
140         struct srb_iocb *lio;
141         int rval;
142
143         rval = QLA_FUNCTION_FAILED;
144         sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
145         if (!sp)
146                 goto done;
147
148         sp->type = SRB_LOGIN_CMD;
149         sp->name = "login";
150         qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
151
152         lio = &sp->u.iocb_cmd;
153         lio->timeout = qla2x00_async_iocb_timeout;
154         sp->done = qla2x00_async_login_sp_done;
155         lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI;
156         if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
157                 lio->u.logio.flags |= SRB_LOGIN_RETRIED;
158         rval = qla2x00_start_sp(sp);
159         if (rval != QLA_SUCCESS)
160                 goto done_free_sp;
161
162         ql_dbg(ql_dbg_disc, vha, 0x2072,
163             "Async-login - hdl=%x, loopid=%x portid=%02x%02x%02x "
164             "retries=%d.\n", sp->handle, fcport->loop_id,
165             fcport->d_id.b.domain, fcport->d_id.b.area, fcport->d_id.b.al_pa,
166             fcport->login_retry);
167         return rval;
168
169 done_free_sp:
170         sp->free(fcport->vha, sp);
171 done:
172         return rval;
173 }
174
175 static void
176 qla2x00_async_logout_sp_done(void *data, void *ptr, int res)
177 {
178         srb_t *sp = (srb_t *)ptr;
179         struct srb_iocb *lio = &sp->u.iocb_cmd;
180         struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
181
182         if (!test_bit(UNLOADING, &vha->dpc_flags))
183                 qla2x00_post_async_logout_done_work(sp->fcport->vha, sp->fcport,
184                     lio->u.logio.data);
185         sp->free(sp->fcport->vha, sp);
186 }
187
188 int
189 qla2x00_async_logout(struct scsi_qla_host *vha, fc_port_t *fcport)
190 {
191         srb_t *sp;
192         struct srb_iocb *lio;
193         int rval;
194
195         rval = QLA_FUNCTION_FAILED;
196         sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
197         if (!sp)
198                 goto done;
199
200         sp->type = SRB_LOGOUT_CMD;
201         sp->name = "logout";
202         qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
203
204         lio = &sp->u.iocb_cmd;
205         lio->timeout = qla2x00_async_iocb_timeout;
206         sp->done = qla2x00_async_logout_sp_done;
207         rval = qla2x00_start_sp(sp);
208         if (rval != QLA_SUCCESS)
209                 goto done_free_sp;
210
211         ql_dbg(ql_dbg_disc, vha, 0x2070,
212             "Async-logout - hdl=%x loop-id=%x portid=%02x%02x%02x.\n",
213             sp->handle, fcport->loop_id, fcport->d_id.b.domain,
214             fcport->d_id.b.area, fcport->d_id.b.al_pa);
215         return rval;
216
217 done_free_sp:
218         sp->free(fcport->vha, sp);
219 done:
220         return rval;
221 }
222
223 static void
224 qla2x00_async_adisc_sp_done(void *data, void *ptr, int res)
225 {
226         srb_t *sp = (srb_t *)ptr;
227         struct srb_iocb *lio = &sp->u.iocb_cmd;
228         struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
229
230         if (!test_bit(UNLOADING, &vha->dpc_flags))
231                 qla2x00_post_async_adisc_done_work(sp->fcport->vha, sp->fcport,
232                     lio->u.logio.data);
233         sp->free(sp->fcport->vha, sp);
234 }
235
236 int
237 qla2x00_async_adisc(struct scsi_qla_host *vha, fc_port_t *fcport,
238     uint16_t *data)
239 {
240         srb_t *sp;
241         struct srb_iocb *lio;
242         int rval;
243
244         rval = QLA_FUNCTION_FAILED;
245         sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
246         if (!sp)
247                 goto done;
248
249         sp->type = SRB_ADISC_CMD;
250         sp->name = "adisc";
251         qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
252
253         lio = &sp->u.iocb_cmd;
254         lio->timeout = qla2x00_async_iocb_timeout;
255         sp->done = qla2x00_async_adisc_sp_done;
256         if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
257                 lio->u.logio.flags |= SRB_LOGIN_RETRIED;
258         rval = qla2x00_start_sp(sp);
259         if (rval != QLA_SUCCESS)
260                 goto done_free_sp;
261
262         ql_dbg(ql_dbg_disc, vha, 0x206f,
263             "Async-adisc - hdl=%x loopid=%x portid=%02x%02x%02x.\n",
264             sp->handle, fcport->loop_id, fcport->d_id.b.domain,
265             fcport->d_id.b.area, fcport->d_id.b.al_pa);
266         return rval;
267
268 done_free_sp:
269         sp->free(fcport->vha, sp);
270 done:
271         return rval;
272 }
273
274 static void
275 qla2x00_async_tm_cmd_done(void *data, void *ptr, int res)
276 {
277         srb_t *sp = (srb_t *)ptr;
278         struct srb_iocb *iocb = &sp->u.iocb_cmd;
279         struct scsi_qla_host *vha = (scsi_qla_host_t *)data;
280         uint32_t flags;
281         uint16_t lun;
282         int rval;
283
284         if (!test_bit(UNLOADING, &vha->dpc_flags)) {
285                 flags = iocb->u.tmf.flags;
286                 lun = (uint16_t)iocb->u.tmf.lun;
287
288                 /* Issue Marker IOCB */
289                 rval = qla2x00_marker(vha, vha->hw->req_q_map[0],
290                         vha->hw->rsp_q_map[0], sp->fcport->loop_id, lun,
291                         flags == TCF_LUN_RESET ? MK_SYNC_ID_LUN : MK_SYNC_ID);
292
293                 if ((rval != QLA_SUCCESS) || iocb->u.tmf.data) {
294                         ql_dbg(ql_dbg_taskm, vha, 0x8030,
295                             "TM IOCB failed (%x).\n", rval);
296                 }
297         }
298         sp->free(sp->fcport->vha, sp);
299 }
300
301 int
302 qla2x00_async_tm_cmd(fc_port_t *fcport, uint32_t tm_flags, uint32_t lun,
303         uint32_t tag)
304 {
305         struct scsi_qla_host *vha = fcport->vha;
306         srb_t *sp;
307         struct srb_iocb *tcf;
308         int rval;
309
310         rval = QLA_FUNCTION_FAILED;
311         sp = qla2x00_get_sp(vha, fcport, GFP_KERNEL);
312         if (!sp)
313                 goto done;
314
315         sp->type = SRB_TM_CMD;
316         sp->name = "tmf";
317         qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2);
318
319         tcf = &sp->u.iocb_cmd;
320         tcf->u.tmf.flags = tm_flags;
321         tcf->u.tmf.lun = lun;
322         tcf->u.tmf.data = tag;
323         tcf->timeout = qla2x00_async_iocb_timeout;
324         sp->done = qla2x00_async_tm_cmd_done;
325
326         rval = qla2x00_start_sp(sp);
327         if (rval != QLA_SUCCESS)
328                 goto done_free_sp;
329
330         ql_dbg(ql_dbg_taskm, vha, 0x802f,
331             "Async-tmf hdl=%x loop-id=%x portid=%02x%02x%02x.\n",
332             sp->handle, fcport->loop_id, fcport->d_id.b.domain,
333             fcport->d_id.b.area, fcport->d_id.b.al_pa);
334         return rval;
335
336 done_free_sp:
337         sp->free(fcport->vha, sp);
338 done:
339         return rval;
340 }
341
342 void
343 qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport,
344     uint16_t *data)
345 {
346         int rval;
347
348         switch (data[0]) {
349         case MBS_COMMAND_COMPLETE:
350                 /*
351                  * Driver must validate login state - If PRLI not complete,
352                  * force a relogin attempt via implicit LOGO, PLOGI, and PRLI
353                  * requests.
354                  */
355                 rval = qla2x00_get_port_database(vha, fcport, 0);
356                 if (rval == QLA_NOT_LOGGED_IN) {
357                         fcport->flags &= ~FCF_ASYNC_SENT;
358                         fcport->flags |= FCF_LOGIN_NEEDED;
359                         set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
360                         break;
361                 }
362
363                 if (rval != QLA_SUCCESS) {
364                         qla2x00_post_async_logout_work(vha, fcport, NULL);
365                         qla2x00_post_async_login_work(vha, fcport, NULL);
366                         break;
367                 }
368                 if (fcport->flags & FCF_FCP2_DEVICE) {
369                         qla2x00_post_async_adisc_work(vha, fcport, data);
370                         break;
371                 }
372                 qla2x00_update_fcport(vha, fcport);
373                 break;
374         case MBS_COMMAND_ERROR:
375                 fcport->flags &= ~FCF_ASYNC_SENT;
376                 if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
377                         set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
378                 else
379                         qla2x00_mark_device_lost(vha, fcport, 1, 0);
380                 break;
381         case MBS_PORT_ID_USED:
382                 fcport->loop_id = data[1];
383                 qla2x00_post_async_logout_work(vha, fcport, NULL);
384                 qla2x00_post_async_login_work(vha, fcport, NULL);
385                 break;
386         case MBS_LOOP_ID_USED:
387                 fcport->loop_id++;
388                 rval = qla2x00_find_new_loop_id(vha, fcport);
389                 if (rval != QLA_SUCCESS) {
390                         fcport->flags &= ~FCF_ASYNC_SENT;
391                         qla2x00_mark_device_lost(vha, fcport, 1, 0);
392                         break;
393                 }
394                 qla2x00_post_async_login_work(vha, fcport, NULL);
395                 break;
396         }
397         return;
398 }
399
400 void
401 qla2x00_async_logout_done(struct scsi_qla_host *vha, fc_port_t *fcport,
402     uint16_t *data)
403 {
404         qla2x00_mark_device_lost(vha, fcport, 1, 0);
405         return;
406 }
407
408 void
409 qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport,
410     uint16_t *data)
411 {
412         if (data[0] == MBS_COMMAND_COMPLETE) {
413                 qla2x00_update_fcport(vha, fcport);
414
415                 return;
416         }
417
418         /* Retry login. */
419         fcport->flags &= ~FCF_ASYNC_SENT;
420         if (data[1] & QLA_LOGIO_LOGIN_RETRIED)
421                 set_bit(RELOGIN_NEEDED, &vha->dpc_flags);
422         else
423                 qla2x00_mark_device_lost(vha, fcport, 1, 0);
424
425         return;
426 }
427
428 /****************************************************************************/
429 /*                QLogic ISP2x00 Hardware Support Functions.                */
430 /****************************************************************************/
431
432 int
433 qla83xx_nic_core_fw_load(scsi_qla_host_t *vha)
434 {
435         int rval = QLA_SUCCESS;
436         struct qla_hw_data *ha = vha->hw;
437         uint32_t idc_major_ver, idc_minor_ver;
438         uint16_t config[4];
439
440         qla83xx_idc_lock(vha, 0);
441
442         /* SV: TODO: Assign initialization timeout from
443          * flash-info / other param
444          */
445         ha->fcoe_dev_init_timeout = QLA83XX_IDC_INITIALIZATION_TIMEOUT;
446         ha->fcoe_reset_timeout = QLA83XX_IDC_RESET_ACK_TIMEOUT;
447
448         /* Set our fcoe function presence */
449         if (__qla83xx_set_drv_presence(vha) != QLA_SUCCESS) {
450                 ql_dbg(ql_dbg_p3p, vha, 0xb077,
451                     "Error while setting DRV-Presence.\n");
452                 rval = QLA_FUNCTION_FAILED;
453                 goto exit;
454         }
455
456         /* Decide the reset ownership */
457         qla83xx_reset_ownership(vha);
458
459         /*
460          * On first protocol driver load:
461          * Init-Owner: Set IDC-Major-Version and Clear IDC-Lock-Recovery
462          * register.
463          * Others: Check compatibility with current IDC Major version.
464          */
465         qla83xx_rd_reg(vha, QLA83XX_IDC_MAJOR_VERSION, &idc_major_ver);
466         if (ha->flags.nic_core_reset_owner) {
467                 /* Set IDC Major version */
468                 idc_major_ver = QLA83XX_SUPP_IDC_MAJOR_VERSION;
469                 qla83xx_wr_reg(vha, QLA83XX_IDC_MAJOR_VERSION, idc_major_ver);
470
471                 /* Clearing IDC-Lock-Recovery register */
472                 qla83xx_wr_reg(vha, QLA83XX_IDC_LOCK_RECOVERY, 0);
473         } else if (idc_major_ver != QLA83XX_SUPP_IDC_MAJOR_VERSION) {
474                 /*
475                  * Clear further IDC participation if we are not compatible with
476                  * the current IDC Major Version.
477                  */
478                 ql_log(ql_log_warn, vha, 0xb07d,
479                     "Failing load, idc_major_ver=%d, expected_major_ver=%d.\n",
480                     idc_major_ver, QLA83XX_SUPP_IDC_MAJOR_VERSION);
481                 __qla83xx_clear_drv_presence(vha);
482                 rval = QLA_FUNCTION_FAILED;
483                 goto exit;
484         }
485         /* Each function sets its supported Minor version. */
486         qla83xx_rd_reg(vha, QLA83XX_IDC_MINOR_VERSION, &idc_minor_ver);
487         idc_minor_ver |= (QLA83XX_SUPP_IDC_MINOR_VERSION << (ha->portnum * 2));
488         qla83xx_wr_reg(vha, QLA83XX_IDC_MINOR_VERSION, idc_minor_ver);
489
490         if (ha->flags.nic_core_reset_owner) {
491                 memset(config, 0, sizeof(config));
492                 if (!qla81xx_get_port_config(vha, config))
493                         qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
494                             QLA8XXX_DEV_READY);
495         }
496
497         rval = qla83xx_idc_state_handler(vha);
498
499 exit:
500         qla83xx_idc_unlock(vha, 0);
501
502         return rval;
503 }
504
505 /*
506 * qla2x00_initialize_adapter
507 *      Initialize board.
508 *
509 * Input:
510 *      ha = adapter block pointer.
511 *
512 * Returns:
513 *      0 = success
514 */
515 int
516 qla2x00_initialize_adapter(scsi_qla_host_t *vha)
517 {
518         int     rval;
519         struct qla_hw_data *ha = vha->hw;
520         struct req_que *req = ha->req_q_map[0];
521
522         /* Clear adapter flags. */
523         vha->flags.online = 0;
524         ha->flags.chip_reset_done = 0;
525         vha->flags.reset_active = 0;
526         ha->flags.pci_channel_io_perm_failure = 0;
527         ha->flags.eeh_busy = 0;
528         ha->flags.thermal_supported = 1;
529         atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
530         atomic_set(&vha->loop_state, LOOP_DOWN);
531         vha->device_flags = DFLG_NO_CABLE;
532         vha->dpc_flags = 0;
533         vha->flags.management_server_logged_in = 0;
534         vha->marker_needed = 0;
535         ha->isp_abort_cnt = 0;
536         ha->beacon_blink_led = 0;
537
538         set_bit(0, ha->req_qid_map);
539         set_bit(0, ha->rsp_qid_map);
540
541         ql_dbg(ql_dbg_init, vha, 0x0040,
542             "Configuring PCI space...\n");
543         rval = ha->isp_ops->pci_config(vha);
544         if (rval) {
545                 ql_log(ql_log_warn, vha, 0x0044,
546                     "Unable to configure PCI space.\n");
547                 return (rval);
548         }
549
550         ha->isp_ops->reset_chip(vha);
551
552         rval = qla2xxx_get_flash_info(vha);
553         if (rval) {
554                 ql_log(ql_log_fatal, vha, 0x004f,
555                     "Unable to validate FLASH data.\n");
556                 return (rval);
557         }
558
559         ha->isp_ops->get_flash_version(vha, req->ring);
560         ql_dbg(ql_dbg_init, vha, 0x0061,
561             "Configure NVRAM parameters...\n");
562
563         ha->isp_ops->nvram_config(vha);
564
565         if (ha->flags.disable_serdes) {
566                 /* Mask HBA via NVRAM settings? */
567                 ql_log(ql_log_info, vha, 0x0077,
568                     "Masking HBA WWPN "
569                     "%02x%02x%02x%02x%02x%02x%02x%02x (via NVRAM).\n",
570                     vha->port_name[0], vha->port_name[1],
571                     vha->port_name[2], vha->port_name[3],
572                     vha->port_name[4], vha->port_name[5],
573                     vha->port_name[6], vha->port_name[7]);
574                 return QLA_FUNCTION_FAILED;
575         }
576
577         ql_dbg(ql_dbg_init, vha, 0x0078,
578             "Verifying loaded RISC code...\n");
579
580         if (qla2x00_isp_firmware(vha) != QLA_SUCCESS) {
581                 rval = ha->isp_ops->chip_diag(vha);
582                 if (rval)
583                         return (rval);
584                 rval = qla2x00_setup_chip(vha);
585                 if (rval)
586                         return (rval);
587         }
588
589         if (IS_QLA84XX(ha)) {
590                 ha->cs84xx = qla84xx_get_chip(vha);
591                 if (!ha->cs84xx) {
592                         ql_log(ql_log_warn, vha, 0x00d0,
593                             "Unable to configure ISP84XX.\n");
594                         return QLA_FUNCTION_FAILED;
595                 }
596         }
597
598         if (qla_ini_mode_enabled(vha))
599                 rval = qla2x00_init_rings(vha);
600
601         ha->flags.chip_reset_done = 1;
602
603         if (rval == QLA_SUCCESS && IS_QLA84XX(ha)) {
604                 /* Issue verify 84xx FW IOCB to complete 84xx initialization */
605                 rval = qla84xx_init_chip(vha);
606                 if (rval != QLA_SUCCESS) {
607                         ql_log(ql_log_warn, vha, 0x00d4,
608                             "Unable to initialize ISP84XX.\n");
609                 qla84xx_put_chip(vha);
610                 }
611         }
612
613         /* Load the NIC Core f/w if we are the first protocol driver. */
614         if (IS_QLA8031(ha)) {
615                 rval = qla83xx_nic_core_fw_load(vha);
616                 if (rval)
617                         ql_log(ql_log_warn, vha, 0x0124,
618                             "Error in initializing NIC Core f/w.\n");
619         }
620
621         if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))
622                 qla24xx_read_fcp_prio_cfg(vha);
623
624         return (rval);
625 }
626
627 /**
628  * qla2100_pci_config() - Setup ISP21xx PCI configuration registers.
629  * @ha: HA context
630  *
631  * Returns 0 on success.
632  */
633 int
634 qla2100_pci_config(scsi_qla_host_t *vha)
635 {
636         uint16_t w;
637         unsigned long flags;
638         struct qla_hw_data *ha = vha->hw;
639         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
640
641         pci_set_master(ha->pdev);
642         pci_try_set_mwi(ha->pdev);
643
644         pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
645         w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
646         pci_write_config_word(ha->pdev, PCI_COMMAND, w);
647
648         pci_disable_rom(ha->pdev);
649
650         /* Get PCI bus information. */
651         spin_lock_irqsave(&ha->hardware_lock, flags);
652         ha->pci_attr = RD_REG_WORD(&reg->ctrl_status);
653         spin_unlock_irqrestore(&ha->hardware_lock, flags);
654
655         return QLA_SUCCESS;
656 }
657
658 /**
659  * qla2300_pci_config() - Setup ISP23xx PCI configuration registers.
660  * @ha: HA context
661  *
662  * Returns 0 on success.
663  */
664 int
665 qla2300_pci_config(scsi_qla_host_t *vha)
666 {
667         uint16_t        w;
668         unsigned long   flags = 0;
669         uint32_t        cnt;
670         struct qla_hw_data *ha = vha->hw;
671         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
672
673         pci_set_master(ha->pdev);
674         pci_try_set_mwi(ha->pdev);
675
676         pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
677         w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
678
679         if (IS_QLA2322(ha) || IS_QLA6322(ha))
680                 w &= ~PCI_COMMAND_INTX_DISABLE;
681         pci_write_config_word(ha->pdev, PCI_COMMAND, w);
682
683         /*
684          * If this is a 2300 card and not 2312, reset the
685          * COMMAND_INVALIDATE due to a bug in the 2300. Unfortunately,
686          * the 2310 also reports itself as a 2300 so we need to get the
687          * fb revision level -- a 6 indicates it really is a 2300 and
688          * not a 2310.
689          */
690         if (IS_QLA2300(ha)) {
691                 spin_lock_irqsave(&ha->hardware_lock, flags);
692
693                 /* Pause RISC. */
694                 WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
695                 for (cnt = 0; cnt < 30000; cnt++) {
696                         if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) != 0)
697                                 break;
698
699                         udelay(10);
700                 }
701
702                 /* Select FPM registers. */
703                 WRT_REG_WORD(&reg->ctrl_status, 0x20);
704                 RD_REG_WORD(&reg->ctrl_status);
705
706                 /* Get the fb rev level */
707                 ha->fb_rev = RD_FB_CMD_REG(ha, reg);
708
709                 if (ha->fb_rev == FPM_2300)
710                         pci_clear_mwi(ha->pdev);
711
712                 /* Deselect FPM registers. */
713                 WRT_REG_WORD(&reg->ctrl_status, 0x0);
714                 RD_REG_WORD(&reg->ctrl_status);
715
716                 /* Release RISC module. */
717                 WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
718                 for (cnt = 0; cnt < 30000; cnt++) {
719                         if ((RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0)
720                                 break;
721
722                         udelay(10);
723                 }
724
725                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
726         }
727
728         pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80);
729
730         pci_disable_rom(ha->pdev);
731
732         /* Get PCI bus information. */
733         spin_lock_irqsave(&ha->hardware_lock, flags);
734         ha->pci_attr = RD_REG_WORD(&reg->ctrl_status);
735         spin_unlock_irqrestore(&ha->hardware_lock, flags);
736
737         return QLA_SUCCESS;
738 }
739
740 /**
741  * qla24xx_pci_config() - Setup ISP24xx PCI configuration registers.
742  * @ha: HA context
743  *
744  * Returns 0 on success.
745  */
746 int
747 qla24xx_pci_config(scsi_qla_host_t *vha)
748 {
749         uint16_t w;
750         unsigned long flags = 0;
751         struct qla_hw_data *ha = vha->hw;
752         struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
753
754         pci_set_master(ha->pdev);
755         pci_try_set_mwi(ha->pdev);
756
757         pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
758         w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
759         w &= ~PCI_COMMAND_INTX_DISABLE;
760         pci_write_config_word(ha->pdev, PCI_COMMAND, w);
761
762         pci_write_config_byte(ha->pdev, PCI_LATENCY_TIMER, 0x80);
763
764         /* PCI-X -- adjust Maximum Memory Read Byte Count (2048). */
765         if (pci_find_capability(ha->pdev, PCI_CAP_ID_PCIX))
766                 pcix_set_mmrbc(ha->pdev, 2048);
767
768         /* PCIe -- adjust Maximum Read Request Size (2048). */
769         if (pci_is_pcie(ha->pdev))
770                 pcie_set_readrq(ha->pdev, 4096);
771
772         pci_disable_rom(ha->pdev);
773
774         ha->chip_revision = ha->pdev->revision;
775
776         /* Get PCI bus information. */
777         spin_lock_irqsave(&ha->hardware_lock, flags);
778         ha->pci_attr = RD_REG_DWORD(&reg->ctrl_status);
779         spin_unlock_irqrestore(&ha->hardware_lock, flags);
780
781         return QLA_SUCCESS;
782 }
783
784 /**
785  * qla25xx_pci_config() - Setup ISP25xx PCI configuration registers.
786  * @ha: HA context
787  *
788  * Returns 0 on success.
789  */
790 int
791 qla25xx_pci_config(scsi_qla_host_t *vha)
792 {
793         uint16_t w;
794         struct qla_hw_data *ha = vha->hw;
795
796         pci_set_master(ha->pdev);
797         pci_try_set_mwi(ha->pdev);
798
799         pci_read_config_word(ha->pdev, PCI_COMMAND, &w);
800         w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR);
801         w &= ~PCI_COMMAND_INTX_DISABLE;
802         pci_write_config_word(ha->pdev, PCI_COMMAND, w);
803
804         /* PCIe -- adjust Maximum Read Request Size (2048). */
805         if (pci_is_pcie(ha->pdev))
806                 pcie_set_readrq(ha->pdev, 4096);
807
808         pci_disable_rom(ha->pdev);
809
810         ha->chip_revision = ha->pdev->revision;
811
812         return QLA_SUCCESS;
813 }
814
815 /**
816  * qla2x00_isp_firmware() - Choose firmware image.
817  * @ha: HA context
818  *
819  * Returns 0 on success.
820  */
821 static int
822 qla2x00_isp_firmware(scsi_qla_host_t *vha)
823 {
824         int  rval;
825         uint16_t loop_id, topo, sw_cap;
826         uint8_t domain, area, al_pa;
827         struct qla_hw_data *ha = vha->hw;
828
829         /* Assume loading risc code */
830         rval = QLA_FUNCTION_FAILED;
831
832         if (ha->flags.disable_risc_code_load) {
833                 ql_log(ql_log_info, vha, 0x0079, "RISC CODE NOT loaded.\n");
834
835                 /* Verify checksum of loaded RISC code. */
836                 rval = qla2x00_verify_checksum(vha, ha->fw_srisc_address);
837                 if (rval == QLA_SUCCESS) {
838                         /* And, verify we are not in ROM code. */
839                         rval = qla2x00_get_adapter_id(vha, &loop_id, &al_pa,
840                             &area, &domain, &topo, &sw_cap);
841                 }
842         }
843
844         if (rval)
845                 ql_dbg(ql_dbg_init, vha, 0x007a,
846                     "**** Load RISC code ****.\n");
847
848         return (rval);
849 }
850
851 /**
852  * qla2x00_reset_chip() - Reset ISP chip.
853  * @ha: HA context
854  *
855  * Returns 0 on success.
856  */
857 void
858 qla2x00_reset_chip(scsi_qla_host_t *vha)
859 {
860         unsigned long   flags = 0;
861         struct qla_hw_data *ha = vha->hw;
862         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
863         uint32_t        cnt;
864         uint16_t        cmd;
865
866         if (unlikely(pci_channel_offline(ha->pdev)))
867                 return;
868
869         ha->isp_ops->disable_intrs(ha);
870
871         spin_lock_irqsave(&ha->hardware_lock, flags);
872
873         /* Turn off master enable */
874         cmd = 0;
875         pci_read_config_word(ha->pdev, PCI_COMMAND, &cmd);
876         cmd &= ~PCI_COMMAND_MASTER;
877         pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
878
879         if (!IS_QLA2100(ha)) {
880                 /* Pause RISC. */
881                 WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
882                 if (IS_QLA2200(ha) || IS_QLA2300(ha)) {
883                         for (cnt = 0; cnt < 30000; cnt++) {
884                                 if ((RD_REG_WORD(&reg->hccr) &
885                                     HCCR_RISC_PAUSE) != 0)
886                                         break;
887                                 udelay(100);
888                         }
889                 } else {
890                         RD_REG_WORD(&reg->hccr);        /* PCI Posting. */
891                         udelay(10);
892                 }
893
894                 /* Select FPM registers. */
895                 WRT_REG_WORD(&reg->ctrl_status, 0x20);
896                 RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
897
898                 /* FPM Soft Reset. */
899                 WRT_REG_WORD(&reg->fpm_diag_config, 0x100);
900                 RD_REG_WORD(&reg->fpm_diag_config);     /* PCI Posting. */
901
902                 /* Toggle Fpm Reset. */
903                 if (!IS_QLA2200(ha)) {
904                         WRT_REG_WORD(&reg->fpm_diag_config, 0x0);
905                         RD_REG_WORD(&reg->fpm_diag_config); /* PCI Posting. */
906                 }
907
908                 /* Select frame buffer registers. */
909                 WRT_REG_WORD(&reg->ctrl_status, 0x10);
910                 RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
911
912                 /* Reset frame buffer FIFOs. */
913                 if (IS_QLA2200(ha)) {
914                         WRT_FB_CMD_REG(ha, reg, 0xa000);
915                         RD_FB_CMD_REG(ha, reg);         /* PCI Posting. */
916                 } else {
917                         WRT_FB_CMD_REG(ha, reg, 0x00fc);
918
919                         /* Read back fb_cmd until zero or 3 seconds max */
920                         for (cnt = 0; cnt < 3000; cnt++) {
921                                 if ((RD_FB_CMD_REG(ha, reg) & 0xff) == 0)
922                                         break;
923                                 udelay(100);
924                         }
925                 }
926
927                 /* Select RISC module registers. */
928                 WRT_REG_WORD(&reg->ctrl_status, 0);
929                 RD_REG_WORD(&reg->ctrl_status);         /* PCI Posting. */
930
931                 /* Reset RISC processor. */
932                 WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
933                 RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
934
935                 /* Release RISC processor. */
936                 WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
937                 RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
938         }
939
940         WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
941         WRT_REG_WORD(&reg->hccr, HCCR_CLR_HOST_INT);
942
943         /* Reset ISP chip. */
944         WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
945
946         /* Wait for RISC to recover from reset. */
947         if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
948                 /*
949                  * It is necessary to for a delay here since the card doesn't
950                  * respond to PCI reads during a reset. On some architectures
951                  * this will result in an MCA.
952                  */
953                 udelay(20);
954                 for (cnt = 30000; cnt; cnt--) {
955                         if ((RD_REG_WORD(&reg->ctrl_status) &
956                             CSR_ISP_SOFT_RESET) == 0)
957                                 break;
958                         udelay(100);
959                 }
960         } else
961                 udelay(10);
962
963         /* Reset RISC processor. */
964         WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
965
966         WRT_REG_WORD(&reg->semaphore, 0);
967
968         /* Release RISC processor. */
969         WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
970         RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
971
972         if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
973                 for (cnt = 0; cnt < 30000; cnt++) {
974                         if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY)
975                                 break;
976
977                         udelay(100);
978                 }
979         } else
980                 udelay(100);
981
982         /* Turn on master enable */
983         cmd |= PCI_COMMAND_MASTER;
984         pci_write_config_word(ha->pdev, PCI_COMMAND, cmd);
985
986         /* Disable RISC pause on FPM parity error. */
987         if (!IS_QLA2100(ha)) {
988                 WRT_REG_WORD(&reg->hccr, HCCR_DISABLE_PARITY_PAUSE);
989                 RD_REG_WORD(&reg->hccr);                /* PCI Posting. */
990         }
991
992         spin_unlock_irqrestore(&ha->hardware_lock, flags);
993 }
994
995 /**
996  * qla81xx_reset_mpi() - Reset's MPI FW via Write MPI Register MBC.
997  *
998  * Returns 0 on success.
999  */
1000 int
1001 qla81xx_reset_mpi(scsi_qla_host_t *vha)
1002 {
1003         uint16_t mb[4] = {0x1010, 0, 1, 0};
1004
1005         if (!IS_QLA81XX(vha->hw))
1006                 return QLA_SUCCESS;
1007
1008         return qla81xx_write_mpi_register(vha, mb);
1009 }
1010
1011 /**
1012  * qla24xx_reset_risc() - Perform full reset of ISP24xx RISC.
1013  * @ha: HA context
1014  *
1015  * Returns 0 on success.
1016  */
1017 static inline void
1018 qla24xx_reset_risc(scsi_qla_host_t *vha)
1019 {
1020         unsigned long flags = 0;
1021         struct qla_hw_data *ha = vha->hw;
1022         struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1023         uint32_t cnt, d2;
1024         uint16_t wd;
1025         static int abts_cnt; /* ISP abort retry counts */
1026
1027         spin_lock_irqsave(&ha->hardware_lock, flags);
1028
1029         /* Reset RISC. */
1030         WRT_REG_DWORD(&reg->ctrl_status, CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1031         for (cnt = 0; cnt < 30000; cnt++) {
1032                 if ((RD_REG_DWORD(&reg->ctrl_status) & CSRX_DMA_ACTIVE) == 0)
1033                         break;
1034
1035                 udelay(10);
1036         }
1037
1038         WRT_REG_DWORD(&reg->ctrl_status,
1039             CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1040         pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
1041
1042         udelay(100);
1043         /* Wait for firmware to complete NVRAM accesses. */
1044         d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1045         for (cnt = 10000 ; cnt && d2; cnt--) {
1046                 udelay(5);
1047                 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1048                 barrier();
1049         }
1050
1051         /* Wait for soft-reset to complete. */
1052         d2 = RD_REG_DWORD(&reg->ctrl_status);
1053         for (cnt = 6000000 ; cnt && (d2 & CSRX_ISP_SOFT_RESET); cnt--) {
1054                 udelay(5);
1055                 d2 = RD_REG_DWORD(&reg->ctrl_status);
1056                 barrier();
1057         }
1058
1059         /* If required, do an MPI FW reset now */
1060         if (test_and_clear_bit(MPI_RESET_NEEDED, &vha->dpc_flags)) {
1061                 if (qla81xx_reset_mpi(vha) != QLA_SUCCESS) {
1062                         if (++abts_cnt < 5) {
1063                                 set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
1064                                 set_bit(MPI_RESET_NEEDED, &vha->dpc_flags);
1065                         } else {
1066                                 /*
1067                                  * We exhausted the ISP abort retries. We have to
1068                                  * set the board offline.
1069                                  */
1070                                 abts_cnt = 0;
1071                                 vha->flags.online = 0;
1072                         }
1073                 }
1074         }
1075
1076         WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
1077         RD_REG_DWORD(&reg->hccr);
1078
1079         WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
1080         RD_REG_DWORD(&reg->hccr);
1081
1082         WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
1083         RD_REG_DWORD(&reg->hccr);
1084
1085         d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1086         for (cnt = 6000000 ; cnt && d2; cnt--) {
1087                 udelay(5);
1088                 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1089                 barrier();
1090         }
1091
1092         spin_unlock_irqrestore(&ha->hardware_lock, flags);
1093
1094         if (IS_NOPOLLING_TYPE(ha))
1095                 ha->isp_ops->enable_intrs(ha);
1096 }
1097
1098 /**
1099  * qla24xx_reset_chip() - Reset ISP24xx chip.
1100  * @ha: HA context
1101  *
1102  * Returns 0 on success.
1103  */
1104 void
1105 qla24xx_reset_chip(scsi_qla_host_t *vha)
1106 {
1107         struct qla_hw_data *ha = vha->hw;
1108
1109         if (pci_channel_offline(ha->pdev) &&
1110             ha->flags.pci_channel_io_perm_failure) {
1111                 return;
1112         }
1113
1114         ha->isp_ops->disable_intrs(ha);
1115
1116         /* Perform RISC reset. */
1117         qla24xx_reset_risc(vha);
1118 }
1119
1120 /**
1121  * qla2x00_chip_diag() - Test chip for proper operation.
1122  * @ha: HA context
1123  *
1124  * Returns 0 on success.
1125  */
1126 int
1127 qla2x00_chip_diag(scsi_qla_host_t *vha)
1128 {
1129         int             rval;
1130         struct qla_hw_data *ha = vha->hw;
1131         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1132         unsigned long   flags = 0;
1133         uint16_t        data;
1134         uint32_t        cnt;
1135         uint16_t        mb[5];
1136         struct req_que *req = ha->req_q_map[0];
1137
1138         /* Assume a failed state */
1139         rval = QLA_FUNCTION_FAILED;
1140
1141         ql_dbg(ql_dbg_init, vha, 0x007b,
1142             "Testing device at %lx.\n", (u_long)&reg->flash_address);
1143
1144         spin_lock_irqsave(&ha->hardware_lock, flags);
1145
1146         /* Reset ISP chip. */
1147         WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
1148
1149         /*
1150          * We need to have a delay here since the card will not respond while
1151          * in reset causing an MCA on some architectures.
1152          */
1153         udelay(20);
1154         data = qla2x00_debounce_register(&reg->ctrl_status);
1155         for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) {
1156                 udelay(5);
1157                 data = RD_REG_WORD(&reg->ctrl_status);
1158                 barrier();
1159         }
1160
1161         if (!cnt)
1162                 goto chip_diag_failed;
1163
1164         ql_dbg(ql_dbg_init, vha, 0x007c,
1165             "Reset register cleared by chip reset.\n");
1166
1167         /* Reset RISC processor. */
1168         WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
1169         WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
1170
1171         /* Workaround for QLA2312 PCI parity error */
1172         if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
1173                 data = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 0));
1174                 for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) {
1175                         udelay(5);
1176                         data = RD_MAILBOX_REG(ha, reg, 0);
1177                         barrier();
1178                 }
1179         } else
1180                 udelay(10);
1181
1182         if (!cnt)
1183                 goto chip_diag_failed;
1184
1185         /* Check product ID of chip */
1186         ql_dbg(ql_dbg_init, vha, 0x007d, "Checking product Id of chip.\n");
1187
1188         mb[1] = RD_MAILBOX_REG(ha, reg, 1);
1189         mb[2] = RD_MAILBOX_REG(ha, reg, 2);
1190         mb[3] = RD_MAILBOX_REG(ha, reg, 3);
1191         mb[4] = qla2x00_debounce_register(MAILBOX_REG(ha, reg, 4));
1192         if (mb[1] != PROD_ID_1 || (mb[2] != PROD_ID_2 && mb[2] != PROD_ID_2a) ||
1193             mb[3] != PROD_ID_3) {
1194                 ql_log(ql_log_warn, vha, 0x0062,
1195                     "Wrong product ID = 0x%x,0x%x,0x%x.\n",
1196                     mb[1], mb[2], mb[3]);
1197
1198                 goto chip_diag_failed;
1199         }
1200         ha->product_id[0] = mb[1];
1201         ha->product_id[1] = mb[2];
1202         ha->product_id[2] = mb[3];
1203         ha->product_id[3] = mb[4];
1204
1205         /* Adjust fw RISC transfer size */
1206         if (req->length > 1024)
1207                 ha->fw_transfer_size = REQUEST_ENTRY_SIZE * 1024;
1208         else
1209                 ha->fw_transfer_size = REQUEST_ENTRY_SIZE *
1210                     req->length;
1211
1212         if (IS_QLA2200(ha) &&
1213             RD_MAILBOX_REG(ha, reg, 7) == QLA2200A_RISC_ROM_VER) {
1214                 /* Limit firmware transfer size with a 2200A */
1215                 ql_dbg(ql_dbg_init, vha, 0x007e, "Found QLA2200A Chip.\n");
1216
1217                 ha->device_type |= DT_ISP2200A;
1218                 ha->fw_transfer_size = 128;
1219         }
1220
1221         /* Wrap Incoming Mailboxes Test. */
1222         spin_unlock_irqrestore(&ha->hardware_lock, flags);
1223
1224         ql_dbg(ql_dbg_init, vha, 0x007f, "Checking mailboxes.\n");
1225         rval = qla2x00_mbx_reg_test(vha);
1226         if (rval)
1227                 ql_log(ql_log_warn, vha, 0x0080,
1228                     "Failed mailbox send register test.\n");
1229         else
1230                 /* Flag a successful rval */
1231                 rval = QLA_SUCCESS;
1232         spin_lock_irqsave(&ha->hardware_lock, flags);
1233
1234 chip_diag_failed:
1235         if (rval)
1236                 ql_log(ql_log_info, vha, 0x0081,
1237                     "Chip diagnostics **** FAILED ****.\n");
1238
1239         spin_unlock_irqrestore(&ha->hardware_lock, flags);
1240
1241         return (rval);
1242 }
1243
1244 /**
1245  * qla24xx_chip_diag() - Test ISP24xx for proper operation.
1246  * @ha: HA context
1247  *
1248  * Returns 0 on success.
1249  */
1250 int
1251 qla24xx_chip_diag(scsi_qla_host_t *vha)
1252 {
1253         int rval;
1254         struct qla_hw_data *ha = vha->hw;
1255         struct req_que *req = ha->req_q_map[0];
1256
1257         if (IS_QLA82XX(ha))
1258                 return QLA_SUCCESS;
1259
1260         ha->fw_transfer_size = REQUEST_ENTRY_SIZE * req->length;
1261
1262         rval = qla2x00_mbx_reg_test(vha);
1263         if (rval) {
1264                 ql_log(ql_log_warn, vha, 0x0082,
1265                     "Failed mailbox send register test.\n");
1266         } else {
1267                 /* Flag a successful rval */
1268                 rval = QLA_SUCCESS;
1269         }
1270
1271         return rval;
1272 }
1273
1274 void
1275 qla2x00_alloc_fw_dump(scsi_qla_host_t *vha)
1276 {
1277         int rval;
1278         uint32_t dump_size, fixed_size, mem_size, req_q_size, rsp_q_size,
1279             eft_size, fce_size, mq_size;
1280         dma_addr_t tc_dma;
1281         void *tc;
1282         struct qla_hw_data *ha = vha->hw;
1283         struct req_que *req = ha->req_q_map[0];
1284         struct rsp_que *rsp = ha->rsp_q_map[0];
1285
1286         if (ha->fw_dump) {
1287                 ql_dbg(ql_dbg_init, vha, 0x00bd,
1288                     "Firmware dump already allocated.\n");
1289                 return;
1290         }
1291
1292         ha->fw_dumped = 0;
1293         fixed_size = mem_size = eft_size = fce_size = mq_size = 0;
1294         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
1295                 fixed_size = sizeof(struct qla2100_fw_dump);
1296         } else if (IS_QLA23XX(ha)) {
1297                 fixed_size = offsetof(struct qla2300_fw_dump, data_ram);
1298                 mem_size = (ha->fw_memory_size - 0x11000 + 1) *
1299                     sizeof(uint16_t);
1300         } else if (IS_FWI2_CAPABLE(ha)) {
1301                 if (IS_QLA83XX(ha))
1302                         fixed_size = offsetof(struct qla83xx_fw_dump, ext_mem);
1303                 else if (IS_QLA81XX(ha))
1304                         fixed_size = offsetof(struct qla81xx_fw_dump, ext_mem);
1305                 else if (IS_QLA25XX(ha))
1306                         fixed_size = offsetof(struct qla25xx_fw_dump, ext_mem);
1307                 else
1308                         fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem);
1309                 mem_size = (ha->fw_memory_size - 0x100000 + 1) *
1310                     sizeof(uint32_t);
1311                 if (ha->mqenable) {
1312                         if (!IS_QLA83XX(ha))
1313                                 mq_size = sizeof(struct qla2xxx_mq_chain);
1314                         /*
1315                          * Allocate maximum buffer size for all queues.
1316                          * Resizing must be done at end-of-dump processing.
1317                          */
1318                         mq_size += ha->max_req_queues *
1319                             (req->length * sizeof(request_t));
1320                         mq_size += ha->max_rsp_queues *
1321                             (rsp->length * sizeof(response_t));
1322                 }
1323                 if (ha->tgt.atio_q_length)
1324                         mq_size += ha->tgt.atio_q_length * sizeof(request_t);
1325                 /* Allocate memory for Fibre Channel Event Buffer. */
1326                 if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha))
1327                         goto try_eft;
1328
1329                 tc = dma_alloc_coherent(&ha->pdev->dev, FCE_SIZE, &tc_dma,
1330                     GFP_KERNEL);
1331                 if (!tc) {
1332                         ql_log(ql_log_warn, vha, 0x00be,
1333                             "Unable to allocate (%d KB) for FCE.\n",
1334                             FCE_SIZE / 1024);
1335                         goto try_eft;
1336                 }
1337
1338                 memset(tc, 0, FCE_SIZE);
1339                 rval = qla2x00_enable_fce_trace(vha, tc_dma, FCE_NUM_BUFFERS,
1340                     ha->fce_mb, &ha->fce_bufs);
1341                 if (rval) {
1342                         ql_log(ql_log_warn, vha, 0x00bf,
1343                             "Unable to initialize FCE (%d).\n", rval);
1344                         dma_free_coherent(&ha->pdev->dev, FCE_SIZE, tc,
1345                             tc_dma);
1346                         ha->flags.fce_enabled = 0;
1347                         goto try_eft;
1348                 }
1349                 ql_dbg(ql_dbg_init, vha, 0x00c0,
1350                     "Allocate (%d KB) for FCE...\n", FCE_SIZE / 1024);
1351
1352                 fce_size = sizeof(struct qla2xxx_fce_chain) + FCE_SIZE;
1353                 ha->flags.fce_enabled = 1;
1354                 ha->fce_dma = tc_dma;
1355                 ha->fce = tc;
1356 try_eft:
1357                 /* Allocate memory for Extended Trace Buffer. */
1358                 tc = dma_alloc_coherent(&ha->pdev->dev, EFT_SIZE, &tc_dma,
1359                     GFP_KERNEL);
1360                 if (!tc) {
1361                         ql_log(ql_log_warn, vha, 0x00c1,
1362                             "Unable to allocate (%d KB) for EFT.\n",
1363                             EFT_SIZE / 1024);
1364                         goto cont_alloc;
1365                 }
1366
1367                 memset(tc, 0, EFT_SIZE);
1368                 rval = qla2x00_enable_eft_trace(vha, tc_dma, EFT_NUM_BUFFERS);
1369                 if (rval) {
1370                         ql_log(ql_log_warn, vha, 0x00c2,
1371                             "Unable to initialize EFT (%d).\n", rval);
1372                         dma_free_coherent(&ha->pdev->dev, EFT_SIZE, tc,
1373                             tc_dma);
1374                         goto cont_alloc;
1375                 }
1376                 ql_dbg(ql_dbg_init, vha, 0x00c3,
1377                     "Allocated (%d KB) EFT ...\n", EFT_SIZE / 1024);
1378
1379                 eft_size = EFT_SIZE;
1380                 ha->eft_dma = tc_dma;
1381                 ha->eft = tc;
1382         }
1383 cont_alloc:
1384         req_q_size = req->length * sizeof(request_t);
1385         rsp_q_size = rsp->length * sizeof(response_t);
1386
1387         dump_size = offsetof(struct qla2xxx_fw_dump, isp);
1388         dump_size += fixed_size + mem_size + req_q_size + rsp_q_size + eft_size;
1389         ha->chain_offset = dump_size;
1390         dump_size += mq_size + fce_size;
1391
1392         ha->fw_dump = vmalloc(dump_size);
1393         if (!ha->fw_dump) {
1394                 ql_log(ql_log_warn, vha, 0x00c4,
1395                     "Unable to allocate (%d KB) for firmware dump.\n",
1396                     dump_size / 1024);
1397
1398                 if (ha->fce) {
1399                         dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce,
1400                             ha->fce_dma);
1401                         ha->fce = NULL;
1402                         ha->fce_dma = 0;
1403                 }
1404
1405                 if (ha->eft) {
1406                         dma_free_coherent(&ha->pdev->dev, eft_size, ha->eft,
1407                             ha->eft_dma);
1408                         ha->eft = NULL;
1409                         ha->eft_dma = 0;
1410                 }
1411                 return;
1412         }
1413         ql_dbg(ql_dbg_init, vha, 0x00c5,
1414             "Allocated (%d KB) for firmware dump.\n", dump_size / 1024);
1415
1416         ha->fw_dump_len = dump_size;
1417         ha->fw_dump->signature[0] = 'Q';
1418         ha->fw_dump->signature[1] = 'L';
1419         ha->fw_dump->signature[2] = 'G';
1420         ha->fw_dump->signature[3] = 'C';
1421         ha->fw_dump->version = __constant_htonl(1);
1422
1423         ha->fw_dump->fixed_size = htonl(fixed_size);
1424         ha->fw_dump->mem_size = htonl(mem_size);
1425         ha->fw_dump->req_q_size = htonl(req_q_size);
1426         ha->fw_dump->rsp_q_size = htonl(rsp_q_size);
1427
1428         ha->fw_dump->eft_size = htonl(eft_size);
1429         ha->fw_dump->eft_addr_l = htonl(LSD(ha->eft_dma));
1430         ha->fw_dump->eft_addr_h = htonl(MSD(ha->eft_dma));
1431
1432         ha->fw_dump->header_size =
1433             htonl(offsetof(struct qla2xxx_fw_dump, isp));
1434 }
1435
1436 static int
1437 qla81xx_mpi_sync(scsi_qla_host_t *vha)
1438 {
1439 #define MPS_MASK        0xe0
1440         int rval;
1441         uint16_t dc;
1442         uint32_t dw;
1443
1444         if (!IS_QLA81XX(vha->hw))
1445                 return QLA_SUCCESS;
1446
1447         rval = qla2x00_write_ram_word(vha, 0x7c00, 1);
1448         if (rval != QLA_SUCCESS) {
1449                 ql_log(ql_log_warn, vha, 0x0105,
1450                     "Unable to acquire semaphore.\n");
1451                 goto done;
1452         }
1453
1454         pci_read_config_word(vha->hw->pdev, 0x54, &dc);
1455         rval = qla2x00_read_ram_word(vha, 0x7a15, &dw);
1456         if (rval != QLA_SUCCESS) {
1457                 ql_log(ql_log_warn, vha, 0x0067, "Unable to read sync.\n");
1458                 goto done_release;
1459         }
1460
1461         dc &= MPS_MASK;
1462         if (dc == (dw & MPS_MASK))
1463                 goto done_release;
1464
1465         dw &= ~MPS_MASK;
1466         dw |= dc;
1467         rval = qla2x00_write_ram_word(vha, 0x7a15, dw);
1468         if (rval != QLA_SUCCESS) {
1469                 ql_log(ql_log_warn, vha, 0x0114, "Unable to gain sync.\n");
1470         }
1471
1472 done_release:
1473         rval = qla2x00_write_ram_word(vha, 0x7c00, 0);
1474         if (rval != QLA_SUCCESS) {
1475                 ql_log(ql_log_warn, vha, 0x006d,
1476                     "Unable to release semaphore.\n");
1477         }
1478
1479 done:
1480         return rval;
1481 }
1482
1483 /**
1484  * qla2x00_setup_chip() - Load and start RISC firmware.
1485  * @ha: HA context
1486  *
1487  * Returns 0 on success.
1488  */
1489 static int
1490 qla2x00_setup_chip(scsi_qla_host_t *vha)
1491 {
1492         int rval;
1493         uint32_t srisc_address = 0;
1494         struct qla_hw_data *ha = vha->hw;
1495         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1496         unsigned long flags;
1497         uint16_t fw_major_version;
1498
1499         if (IS_QLA82XX(ha)) {
1500                 rval = ha->isp_ops->load_risc(vha, &srisc_address);
1501                 if (rval == QLA_SUCCESS) {
1502                         qla2x00_stop_firmware(vha);
1503                         goto enable_82xx_npiv;
1504                 } else
1505                         goto failed;
1506         }
1507
1508         if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
1509                 /* Disable SRAM, Instruction RAM and GP RAM parity.  */
1510                 spin_lock_irqsave(&ha->hardware_lock, flags);
1511                 WRT_REG_WORD(&reg->hccr, (HCCR_ENABLE_PARITY + 0x0));
1512                 RD_REG_WORD(&reg->hccr);
1513                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1514         }
1515
1516         qla81xx_mpi_sync(vha);
1517
1518         /* Load firmware sequences */
1519         rval = ha->isp_ops->load_risc(vha, &srisc_address);
1520         if (rval == QLA_SUCCESS) {
1521                 ql_dbg(ql_dbg_init, vha, 0x00c9,
1522                     "Verifying Checksum of loaded RISC code.\n");
1523
1524                 rval = qla2x00_verify_checksum(vha, srisc_address);
1525                 if (rval == QLA_SUCCESS) {
1526                         /* Start firmware execution. */
1527                         ql_dbg(ql_dbg_init, vha, 0x00ca,
1528                             "Starting firmware.\n");
1529
1530                         rval = qla2x00_execute_fw(vha, srisc_address);
1531                         /* Retrieve firmware information. */
1532                         if (rval == QLA_SUCCESS) {
1533 enable_82xx_npiv:
1534                                 fw_major_version = ha->fw_major_version;
1535                                 if (IS_QLA82XX(ha))
1536                                         qla82xx_check_md_needed(vha);
1537                                 else
1538                                         rval = qla2x00_get_fw_version(vha);
1539                                 if (rval != QLA_SUCCESS)
1540                                         goto failed;
1541                                 ha->flags.npiv_supported = 0;
1542                                 if (IS_QLA2XXX_MIDTYPE(ha) &&
1543                                          (ha->fw_attributes & BIT_2)) {
1544                                         ha->flags.npiv_supported = 1;
1545                                         if ((!ha->max_npiv_vports) ||
1546                                             ((ha->max_npiv_vports + 1) %
1547                                             MIN_MULTI_ID_FABRIC))
1548                                                 ha->max_npiv_vports =
1549                                                     MIN_MULTI_ID_FABRIC - 1;
1550                                 }
1551                                 qla2x00_get_resource_cnts(vha, NULL,
1552                                     &ha->fw_xcb_count, NULL, NULL,
1553                                     &ha->max_npiv_vports, NULL);
1554
1555                                 if (!fw_major_version && ql2xallocfwdump
1556                                     && !IS_QLA82XX(ha))
1557                                         qla2x00_alloc_fw_dump(vha);
1558                         }
1559                 } else {
1560                         ql_log(ql_log_fatal, vha, 0x00cd,
1561                             "ISP Firmware failed checksum.\n");
1562                         goto failed;
1563                 }
1564         } else
1565                 goto failed;
1566
1567         if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
1568                 /* Enable proper parity. */
1569                 spin_lock_irqsave(&ha->hardware_lock, flags);
1570                 if (IS_QLA2300(ha))
1571                         /* SRAM parity */
1572                         WRT_REG_WORD(&reg->hccr, HCCR_ENABLE_PARITY + 0x1);
1573                 else
1574                         /* SRAM, Instruction RAM and GP RAM parity */
1575                         WRT_REG_WORD(&reg->hccr, HCCR_ENABLE_PARITY + 0x7);
1576                 RD_REG_WORD(&reg->hccr);
1577                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1578         }
1579
1580         if (IS_QLA83XX(ha))
1581                 goto skip_fac_check;
1582
1583         if (rval == QLA_SUCCESS && IS_FAC_REQUIRED(ha)) {
1584                 uint32_t size;
1585
1586                 rval = qla81xx_fac_get_sector_size(vha, &size);
1587                 if (rval == QLA_SUCCESS) {
1588                         ha->flags.fac_supported = 1;
1589                         ha->fdt_block_size = size << 2;
1590                 } else {
1591                         ql_log(ql_log_warn, vha, 0x00ce,
1592                             "Unsupported FAC firmware (%d.%02d.%02d).\n",
1593                             ha->fw_major_version, ha->fw_minor_version,
1594                             ha->fw_subminor_version);
1595 skip_fac_check:
1596                         if (IS_QLA83XX(ha)) {
1597                                 ha->flags.fac_supported = 0;
1598                                 rval = QLA_SUCCESS;
1599                         }
1600                 }
1601         }
1602 failed:
1603         if (rval) {
1604                 ql_log(ql_log_fatal, vha, 0x00cf,
1605                     "Setup chip ****FAILED****.\n");
1606         }
1607
1608         return (rval);
1609 }
1610
1611 /**
1612  * qla2x00_init_response_q_entries() - Initializes response queue entries.
1613  * @ha: HA context
1614  *
1615  * Beginning of request ring has initialization control block already built
1616  * by nvram config routine.
1617  *
1618  * Returns 0 on success.
1619  */
1620 void
1621 qla2x00_init_response_q_entries(struct rsp_que *rsp)
1622 {
1623         uint16_t cnt;
1624         response_t *pkt;
1625
1626         rsp->ring_ptr = rsp->ring;
1627         rsp->ring_index    = 0;
1628         rsp->status_srb = NULL;
1629         pkt = rsp->ring_ptr;
1630         for (cnt = 0; cnt < rsp->length; cnt++) {
1631                 pkt->signature = RESPONSE_PROCESSED;
1632                 pkt++;
1633         }
1634 }
1635
1636 /**
1637  * qla2x00_update_fw_options() - Read and process firmware options.
1638  * @ha: HA context
1639  *
1640  * Returns 0 on success.
1641  */
1642 void
1643 qla2x00_update_fw_options(scsi_qla_host_t *vha)
1644 {
1645         uint16_t swing, emphasis, tx_sens, rx_sens;
1646         struct qla_hw_data *ha = vha->hw;
1647
1648         memset(ha->fw_options, 0, sizeof(ha->fw_options));
1649         qla2x00_get_fw_options(vha, ha->fw_options);
1650
1651         if (IS_QLA2100(ha) || IS_QLA2200(ha))
1652                 return;
1653
1654         /* Serial Link options. */
1655         ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0115,
1656             "Serial link options.\n");
1657         ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0109,
1658             (uint8_t *)&ha->fw_seriallink_options,
1659             sizeof(ha->fw_seriallink_options));
1660
1661         ha->fw_options[1] &= ~FO1_SET_EMPHASIS_SWING;
1662         if (ha->fw_seriallink_options[3] & BIT_2) {
1663                 ha->fw_options[1] |= FO1_SET_EMPHASIS_SWING;
1664
1665                 /*  1G settings */
1666                 swing = ha->fw_seriallink_options[2] & (BIT_2 | BIT_1 | BIT_0);
1667                 emphasis = (ha->fw_seriallink_options[2] &
1668                     (BIT_4 | BIT_3)) >> 3;
1669                 tx_sens = ha->fw_seriallink_options[0] &
1670                     (BIT_3 | BIT_2 | BIT_1 | BIT_0);
1671                 rx_sens = (ha->fw_seriallink_options[0] &
1672                     (BIT_7 | BIT_6 | BIT_5 | BIT_4)) >> 4;
1673                 ha->fw_options[10] = (emphasis << 14) | (swing << 8);
1674                 if (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA6312(ha)) {
1675                         if (rx_sens == 0x0)
1676                                 rx_sens = 0x3;
1677                         ha->fw_options[10] |= (tx_sens << 4) | rx_sens;
1678                 } else if (IS_QLA2322(ha) || IS_QLA6322(ha))
1679                         ha->fw_options[10] |= BIT_5 |
1680                             ((rx_sens & (BIT_1 | BIT_0)) << 2) |
1681                             (tx_sens & (BIT_1 | BIT_0));
1682
1683                 /*  2G settings */
1684                 swing = (ha->fw_seriallink_options[2] &
1685                     (BIT_7 | BIT_6 | BIT_5)) >> 5;
1686                 emphasis = ha->fw_seriallink_options[3] & (BIT_1 | BIT_0);
1687                 tx_sens = ha->fw_seriallink_options[1] &
1688                     (BIT_3 | BIT_2 | BIT_1 | BIT_0);
1689                 rx_sens = (ha->fw_seriallink_options[1] &
1690                     (BIT_7 | BIT_6 | BIT_5 | BIT_4)) >> 4;
1691                 ha->fw_options[11] = (emphasis << 14) | (swing << 8);
1692                 if (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA6312(ha)) {
1693                         if (rx_sens == 0x0)
1694                                 rx_sens = 0x3;
1695                         ha->fw_options[11] |= (tx_sens << 4) | rx_sens;
1696                 } else if (IS_QLA2322(ha) || IS_QLA6322(ha))
1697                         ha->fw_options[11] |= BIT_5 |
1698                             ((rx_sens & (BIT_1 | BIT_0)) << 2) |
1699                             (tx_sens & (BIT_1 | BIT_0));
1700         }
1701
1702         /* FCP2 options. */
1703         /*  Return command IOCBs without waiting for an ABTS to complete. */
1704         ha->fw_options[3] |= BIT_13;
1705
1706         /* LED scheme. */
1707         if (ha->flags.enable_led_scheme)
1708                 ha->fw_options[2] |= BIT_12;
1709
1710         /* Detect ISP6312. */
1711         if (IS_QLA6312(ha))
1712                 ha->fw_options[2] |= BIT_13;
1713
1714         /* Update firmware options. */
1715         qla2x00_set_fw_options(vha, ha->fw_options);
1716 }
1717
1718 void
1719 qla24xx_update_fw_options(scsi_qla_host_t *vha)
1720 {
1721         int rval;
1722         struct qla_hw_data *ha = vha->hw;
1723
1724         if (IS_QLA82XX(ha))
1725                 return;
1726
1727         /* Update Serial Link options. */
1728         if ((le16_to_cpu(ha->fw_seriallink_options24[0]) & BIT_0) == 0)
1729                 return;
1730
1731         rval = qla2x00_set_serdes_params(vha,
1732             le16_to_cpu(ha->fw_seriallink_options24[1]),
1733             le16_to_cpu(ha->fw_seriallink_options24[2]),
1734             le16_to_cpu(ha->fw_seriallink_options24[3]));
1735         if (rval != QLA_SUCCESS) {
1736                 ql_log(ql_log_warn, vha, 0x0104,
1737                     "Unable to update Serial Link options (%x).\n", rval);
1738         }
1739 }
1740
1741 void
1742 qla2x00_config_rings(struct scsi_qla_host *vha)
1743 {
1744         struct qla_hw_data *ha = vha->hw;
1745         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1746         struct req_que *req = ha->req_q_map[0];
1747         struct rsp_que *rsp = ha->rsp_q_map[0];
1748
1749         /* Setup ring parameters in initialization control block. */
1750         ha->init_cb->request_q_outpointer = __constant_cpu_to_le16(0);
1751         ha->init_cb->response_q_inpointer = __constant_cpu_to_le16(0);
1752         ha->init_cb->request_q_length = cpu_to_le16(req->length);
1753         ha->init_cb->response_q_length = cpu_to_le16(rsp->length);
1754         ha->init_cb->request_q_address[0] = cpu_to_le32(LSD(req->dma));
1755         ha->init_cb->request_q_address[1] = cpu_to_le32(MSD(req->dma));
1756         ha->init_cb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma));
1757         ha->init_cb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma));
1758
1759         WRT_REG_WORD(ISP_REQ_Q_IN(ha, reg), 0);
1760         WRT_REG_WORD(ISP_REQ_Q_OUT(ha, reg), 0);
1761         WRT_REG_WORD(ISP_RSP_Q_IN(ha, reg), 0);
1762         WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), 0);
1763         RD_REG_WORD(ISP_RSP_Q_OUT(ha, reg));            /* PCI Posting. */
1764 }
1765
1766 void
1767 qla24xx_config_rings(struct scsi_qla_host *vha)
1768 {
1769         struct qla_hw_data *ha = vha->hw;
1770         device_reg_t __iomem *reg = ISP_QUE_REG(ha, 0);
1771         struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
1772         struct qla_msix_entry *msix;
1773         struct init_cb_24xx *icb;
1774         uint16_t rid = 0;
1775         struct req_que *req = ha->req_q_map[0];
1776         struct rsp_que *rsp = ha->rsp_q_map[0];
1777
1778         /* Setup ring parameters in initialization control block. */
1779         icb = (struct init_cb_24xx *)ha->init_cb;
1780         icb->request_q_outpointer = __constant_cpu_to_le16(0);
1781         icb->response_q_inpointer = __constant_cpu_to_le16(0);
1782         icb->request_q_length = cpu_to_le16(req->length);
1783         icb->response_q_length = cpu_to_le16(rsp->length);
1784         icb->request_q_address[0] = cpu_to_le32(LSD(req->dma));
1785         icb->request_q_address[1] = cpu_to_le32(MSD(req->dma));
1786         icb->response_q_address[0] = cpu_to_le32(LSD(rsp->dma));
1787         icb->response_q_address[1] = cpu_to_le32(MSD(rsp->dma));
1788
1789         /* Setup ATIO queue dma pointers for target mode */
1790         icb->atio_q_inpointer = __constant_cpu_to_le16(0);
1791         icb->atio_q_length = cpu_to_le16(ha->tgt.atio_q_length);
1792         icb->atio_q_address[0] = cpu_to_le32(LSD(ha->tgt.atio_dma));
1793         icb->atio_q_address[1] = cpu_to_le32(MSD(ha->tgt.atio_dma));
1794
1795         if (ha->mqenable || IS_QLA83XX(ha)) {
1796                 icb->qos = __constant_cpu_to_le16(QLA_DEFAULT_QUE_QOS);
1797                 icb->rid = __constant_cpu_to_le16(rid);
1798                 if (ha->flags.msix_enabled) {
1799                         msix = &ha->msix_entries[1];
1800                         ql_dbg(ql_dbg_init, vha, 0x00fd,
1801                             "Registering vector 0x%x for base que.\n",
1802                             msix->entry);
1803                         icb->msix = cpu_to_le16(msix->entry);
1804                 }
1805                 /* Use alternate PCI bus number */
1806                 if (MSB(rid))
1807                         icb->firmware_options_2 |=
1808                                 __constant_cpu_to_le32(BIT_19);
1809                 /* Use alternate PCI devfn */
1810                 if (LSB(rid))
1811                         icb->firmware_options_2 |=
1812                                 __constant_cpu_to_le32(BIT_18);
1813
1814                 /* Use Disable MSIX Handshake mode for capable adapters */
1815                 if ((ha->fw_attributes & BIT_6) && (IS_MSIX_NACK_CAPABLE(ha)) &&
1816                     (ha->flags.msix_enabled)) {
1817                         icb->firmware_options_2 &=
1818                                 __constant_cpu_to_le32(~BIT_22);
1819                         ha->flags.disable_msix_handshake = 1;
1820                         ql_dbg(ql_dbg_init, vha, 0x00fe,
1821                             "MSIX Handshake Disable Mode turned on.\n");
1822                 } else {
1823                         icb->firmware_options_2 |=
1824                                 __constant_cpu_to_le32(BIT_22);
1825                 }
1826                 icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_23);
1827
1828                 WRT_REG_DWORD(&reg->isp25mq.req_q_in, 0);
1829                 WRT_REG_DWORD(&reg->isp25mq.req_q_out, 0);
1830                 WRT_REG_DWORD(&reg->isp25mq.rsp_q_in, 0);
1831                 WRT_REG_DWORD(&reg->isp25mq.rsp_q_out, 0);
1832         } else {
1833                 WRT_REG_DWORD(&reg->isp24.req_q_in, 0);
1834                 WRT_REG_DWORD(&reg->isp24.req_q_out, 0);
1835                 WRT_REG_DWORD(&reg->isp24.rsp_q_in, 0);
1836                 WRT_REG_DWORD(&reg->isp24.rsp_q_out, 0);
1837         }
1838         qlt_24xx_config_rings(vha, reg);
1839
1840         /* PCI posting */
1841         RD_REG_DWORD(&ioreg->hccr);
1842 }
1843
1844 /**
1845  * qla2x00_init_rings() - Initializes firmware.
1846  * @ha: HA context
1847  *
1848  * Beginning of request ring has initialization control block already built
1849  * by nvram config routine.
1850  *
1851  * Returns 0 on success.
1852  */
1853 static int
1854 qla2x00_init_rings(scsi_qla_host_t *vha)
1855 {
1856         int     rval;
1857         unsigned long flags = 0;
1858         int cnt, que;
1859         struct qla_hw_data *ha = vha->hw;
1860         struct req_que *req;
1861         struct rsp_que *rsp;
1862         struct mid_init_cb_24xx *mid_init_cb =
1863             (struct mid_init_cb_24xx *) ha->init_cb;
1864
1865         spin_lock_irqsave(&ha->hardware_lock, flags);
1866
1867         /* Clear outstanding commands array. */
1868         for (que = 0; que < ha->max_req_queues; que++) {
1869                 req = ha->req_q_map[que];
1870                 if (!req)
1871                         continue;
1872                 for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++)
1873                         req->outstanding_cmds[cnt] = NULL;
1874
1875                 req->current_outstanding_cmd = 1;
1876
1877                 /* Initialize firmware. */
1878                 req->ring_ptr  = req->ring;
1879                 req->ring_index    = 0;
1880                 req->cnt      = req->length;
1881         }
1882
1883         for (que = 0; que < ha->max_rsp_queues; que++) {
1884                 rsp = ha->rsp_q_map[que];
1885                 if (!rsp)
1886                         continue;
1887                 /* Initialize response queue entries */
1888                 qla2x00_init_response_q_entries(rsp);
1889         }
1890
1891         spin_lock(&ha->vport_slock);
1892
1893         spin_unlock(&ha->vport_slock);
1894
1895         ha->tgt.atio_ring_ptr = ha->tgt.atio_ring;
1896         ha->tgt.atio_ring_index = 0;
1897         /* Initialize ATIO queue entries */
1898         qlt_init_atio_q_entries(vha);
1899
1900         ha->isp_ops->config_rings(vha);
1901
1902         spin_unlock_irqrestore(&ha->hardware_lock, flags);
1903
1904         /* Update any ISP specific firmware options before initialization. */
1905         ha->isp_ops->update_fw_options(vha);
1906
1907         ql_dbg(ql_dbg_init, vha, 0x00d1, "Issue init firmware.\n");
1908
1909         if (ha->flags.npiv_supported) {
1910                 if (ha->operating_mode == LOOP && !IS_CNA_CAPABLE(ha))
1911                         ha->max_npiv_vports = MIN_MULTI_ID_FABRIC - 1;
1912                 mid_init_cb->count = cpu_to_le16(ha->max_npiv_vports);
1913         }
1914
1915         if (IS_FWI2_CAPABLE(ha)) {
1916                 mid_init_cb->options = __constant_cpu_to_le16(BIT_1);
1917                 mid_init_cb->init_cb.execution_throttle =
1918                     cpu_to_le16(ha->fw_xcb_count);
1919         }
1920
1921         rval = qla2x00_init_firmware(vha, ha->init_cb_size);
1922         if (rval) {
1923                 ql_log(ql_log_fatal, vha, 0x00d2,
1924                     "Init Firmware **** FAILED ****.\n");
1925         } else {
1926                 ql_dbg(ql_dbg_init, vha, 0x00d3,
1927                     "Init Firmware -- success.\n");
1928         }
1929
1930         return (rval);
1931 }
1932
1933 /**
1934  * qla2x00_fw_ready() - Waits for firmware ready.
1935  * @ha: HA context
1936  *
1937  * Returns 0 on success.
1938  */
1939 static int
1940 qla2x00_fw_ready(scsi_qla_host_t *vha)
1941 {
1942         int             rval;
1943         unsigned long   wtime, mtime, cs84xx_time;
1944         uint16_t        min_wait;       /* Minimum wait time if loop is down */
1945         uint16_t        wait_time;      /* Wait time if loop is coming ready */
1946         uint16_t        state[5];
1947         struct qla_hw_data *ha = vha->hw;
1948
1949         rval = QLA_SUCCESS;
1950
1951         /* 20 seconds for loop down. */
1952         min_wait = 20;
1953
1954         /*
1955          * Firmware should take at most one RATOV to login, plus 5 seconds for
1956          * our own processing.
1957          */
1958         if ((wait_time = (ha->retry_count*ha->login_timeout) + 5) < min_wait) {
1959                 wait_time = min_wait;
1960         }
1961
1962         /* Min wait time if loop down */
1963         mtime = jiffies + (min_wait * HZ);
1964
1965         /* wait time before firmware ready */
1966         wtime = jiffies + (wait_time * HZ);
1967
1968         /* Wait for ISP to finish LIP */
1969         if (!vha->flags.init_done)
1970                 ql_log(ql_log_info, vha, 0x801e,
1971                     "Waiting for LIP to complete.\n");
1972
1973         do {
1974                 rval = qla2x00_get_firmware_state(vha, state);
1975                 if (rval == QLA_SUCCESS) {
1976                         if (state[0] < FSTATE_LOSS_OF_SYNC) {
1977                                 vha->device_flags &= ~DFLG_NO_CABLE;
1978                         }
1979                         if (IS_QLA84XX(ha) && state[0] != FSTATE_READY) {
1980                                 ql_dbg(ql_dbg_taskm, vha, 0x801f,
1981                                     "fw_state=%x 84xx=%x.\n", state[0],
1982                                     state[2]);
1983                                 if ((state[2] & FSTATE_LOGGED_IN) &&
1984                                      (state[2] & FSTATE_WAITING_FOR_VERIFY)) {
1985                                         ql_dbg(ql_dbg_taskm, vha, 0x8028,
1986                                             "Sending verify iocb.\n");
1987
1988                                         cs84xx_time = jiffies;
1989                                         rval = qla84xx_init_chip(vha);
1990                                         if (rval != QLA_SUCCESS) {
1991                                                 ql_log(ql_log_warn,
1992                                                     vha, 0x8007,
1993                                                     "Init chip failed.\n");
1994                                                 break;
1995                                         }
1996
1997                                         /* Add time taken to initialize. */
1998                                         cs84xx_time = jiffies - cs84xx_time;
1999                                         wtime += cs84xx_time;
2000                                         mtime += cs84xx_time;
2001                                         ql_dbg(ql_dbg_taskm, vha, 0x8008,
2002                                             "Increasing wait time by %ld. "
2003                                             "New time %ld.\n", cs84xx_time,
2004                                             wtime);
2005                                 }
2006                         } else if (state[0] == FSTATE_READY) {
2007                                 ql_dbg(ql_dbg_taskm, vha, 0x8037,
2008                                     "F/W Ready - OK.\n");
2009
2010                                 qla2x00_get_retry_cnt(vha, &ha->retry_count,
2011                                     &ha->login_timeout, &ha->r_a_tov);
2012
2013                                 rval = QLA_SUCCESS;
2014                                 break;
2015                         }
2016
2017                         rval = QLA_FUNCTION_FAILED;
2018
2019                         if (atomic_read(&vha->loop_down_timer) &&
2020                             state[0] != FSTATE_READY) {
2021                                 /* Loop down. Timeout on min_wait for states
2022                                  * other than Wait for Login.
2023                                  */
2024                                 if (time_after_eq(jiffies, mtime)) {
2025                                         ql_log(ql_log_info, vha, 0x8038,
2026                                             "Cable is unplugged...\n");
2027
2028                                         vha->device_flags |= DFLG_NO_CABLE;
2029                                         break;
2030                                 }
2031                         }
2032                 } else {
2033                         /* Mailbox cmd failed. Timeout on min_wait. */
2034                         if (time_after_eq(jiffies, mtime) ||
2035                                 ha->flags.isp82xx_fw_hung)
2036                                 break;
2037                 }
2038
2039                 if (time_after_eq(jiffies, wtime))
2040                         break;
2041
2042                 /* Delay for a while */
2043                 msleep(500);
2044         } while (1);
2045
2046         ql_dbg(ql_dbg_taskm, vha, 0x803a,
2047             "fw_state=%x (%x, %x, %x, %x) " "curr time=%lx.\n", state[0],
2048             state[1], state[2], state[3], state[4], jiffies);
2049
2050         if (rval && !(vha->device_flags & DFLG_NO_CABLE)) {
2051                 ql_log(ql_log_warn, vha, 0x803b,
2052                     "Firmware ready **** FAILED ****.\n");
2053         }
2054
2055         return (rval);
2056 }
2057
2058 /*
2059 *  qla2x00_configure_hba
2060 *      Setup adapter context.
2061 *
2062 * Input:
2063 *      ha = adapter state pointer.
2064 *
2065 * Returns:
2066 *      0 = success
2067 *
2068 * Context:
2069 *      Kernel context.
2070 */
2071 static int
2072 qla2x00_configure_hba(scsi_qla_host_t *vha)
2073 {
2074         int       rval;
2075         uint16_t      loop_id;
2076         uint16_t      topo;
2077         uint16_t      sw_cap;
2078         uint8_t       al_pa;
2079         uint8_t       area;
2080         uint8_t       domain;
2081         char            connect_type[22];
2082         struct qla_hw_data *ha = vha->hw;
2083
2084         /* Get host addresses. */
2085         rval = qla2x00_get_adapter_id(vha,
2086             &loop_id, &al_pa, &area, &domain, &topo, &sw_cap);
2087         if (rval != QLA_SUCCESS) {
2088                 if (LOOP_TRANSITION(vha) || atomic_read(&ha->loop_down_timer) ||
2089                     IS_CNA_CAPABLE(ha) ||
2090                     (rval == QLA_COMMAND_ERROR && loop_id == 0x7)) {
2091                         ql_dbg(ql_dbg_disc, vha, 0x2008,
2092                             "Loop is in a transition state.\n");
2093                 } else {
2094                         ql_log(ql_log_warn, vha, 0x2009,
2095                             "Unable to get host loop ID.\n");
2096                         set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
2097                 }
2098                 return (rval);
2099         }
2100
2101         if (topo == 4) {
2102                 ql_log(ql_log_info, vha, 0x200a,
2103                     "Cannot get topology - retrying.\n");
2104                 return (QLA_FUNCTION_FAILED);
2105         }
2106
2107         vha->loop_id = loop_id;
2108
2109         /* initialize */
2110         ha->min_external_loopid = SNS_FIRST_LOOP_ID;
2111         ha->operating_mode = LOOP;
2112         ha->switch_cap = 0;
2113
2114         switch (topo) {
2115         case 0:
2116                 ql_dbg(ql_dbg_disc, vha, 0x200b, "HBA in NL topology.\n");
2117                 ha->current_topology = ISP_CFG_NL;
2118                 strcpy(connect_type, "(Loop)");
2119                 break;
2120
2121         case 1:
2122                 ql_dbg(ql_dbg_disc, vha, 0x200c, "HBA in FL topology.\n");
2123                 ha->switch_cap = sw_cap;
2124                 ha->current_topology = ISP_CFG_FL;
2125                 strcpy(connect_type, "(FL_Port)");
2126                 break;
2127
2128         case 2:
2129                 ql_dbg(ql_dbg_disc, vha, 0x200d, "HBA in N P2P topology.\n");
2130                 ha->operating_mode = P2P;
2131                 ha->current_topology = ISP_CFG_N;
2132                 strcpy(connect_type, "(N_Port-to-N_Port)");
2133                 break;
2134
2135         case 3:
2136                 ql_dbg(ql_dbg_disc, vha, 0x200e, "HBA in F P2P topology.\n");
2137                 ha->switch_cap = sw_cap;
2138                 ha->operating_mode = P2P;
2139                 ha->current_topology = ISP_CFG_F;
2140                 strcpy(connect_type, "(F_Port)");
2141                 break;
2142
2143         default:
2144                 ql_dbg(ql_dbg_disc, vha, 0x200f,
2145                     "HBA in unknown topology %x, using NL.\n", topo);
2146                 ha->current_topology = ISP_CFG_NL;
2147                 strcpy(connect_type, "(Loop)");
2148                 break;
2149         }
2150
2151         /* Save Host port and loop ID. */
2152         /* byte order - Big Endian */
2153         vha->d_id.b.domain = domain;
2154         vha->d_id.b.area = area;
2155         vha->d_id.b.al_pa = al_pa;
2156
2157         spin_lock(&ha->vport_slock);
2158         qlt_update_vp_map(vha, SET_AL_PA);
2159         spin_unlock(&ha->vport_slock);
2160
2161         if (!vha->flags.init_done)
2162                 ql_log(ql_log_info, vha, 0x2010,
2163                     "Topology - %s, Host Loop address 0x%x.\n",
2164                     connect_type, vha->loop_id);
2165
2166         if (rval) {
2167                 ql_log(ql_log_warn, vha, 0x2011,
2168                     "%s FAILED\n", __func__);
2169         } else {
2170                 ql_dbg(ql_dbg_disc, vha, 0x2012,
2171                     "%s success\n", __func__);
2172         }
2173
2174         return(rval);
2175 }
2176
2177 inline void
2178 qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
2179         char *def)
2180 {
2181         char *st, *en;
2182         uint16_t index;
2183         struct qla_hw_data *ha = vha->hw;
2184         int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
2185             !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha);
2186
2187         if (memcmp(model, BINZERO, len) != 0) {
2188                 strncpy(ha->model_number, model, len);
2189                 st = en = ha->model_number;
2190                 en += len - 1;
2191                 while (en > st) {
2192                         if (*en != 0x20 && *en != 0x00)
2193                                 break;
2194                         *en-- = '\0';
2195                 }
2196
2197                 index = (ha->pdev->subsystem_device & 0xff);
2198                 if (use_tbl &&
2199                     ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
2200                     index < QLA_MODEL_NAMES)
2201                         strncpy(ha->model_desc,
2202                             qla2x00_model_name[index * 2 + 1],
2203                             sizeof(ha->model_desc) - 1);
2204         } else {
2205                 index = (ha->pdev->subsystem_device & 0xff);
2206                 if (use_tbl &&
2207                     ha->pdev->subsystem_vendor == PCI_VENDOR_ID_QLOGIC &&
2208                     index < QLA_MODEL_NAMES) {
2209                         strcpy(ha->model_number,
2210                             qla2x00_model_name[index * 2]);
2211                         strncpy(ha->model_desc,
2212                             qla2x00_model_name[index * 2 + 1],
2213                             sizeof(ha->model_desc) - 1);
2214                 } else {
2215                         strcpy(ha->model_number, def);
2216                 }
2217         }
2218         if (IS_FWI2_CAPABLE(ha))
2219                 qla2xxx_get_vpd_field(vha, "\x82", ha->model_desc,
2220                     sizeof(ha->model_desc));
2221 }
2222
2223 /* On sparc systems, obtain port and node WWN from firmware
2224  * properties.
2225  */
2226 static void qla2xxx_nvram_wwn_from_ofw(scsi_qla_host_t *vha, nvram_t *nv)
2227 {
2228 #ifdef CONFIG_SPARC
2229         struct qla_hw_data *ha = vha->hw;
2230         struct pci_dev *pdev = ha->pdev;
2231         struct device_node *dp = pci_device_to_OF_node(pdev);
2232         const u8 *val;
2233         int len;
2234
2235         val = of_get_property(dp, "port-wwn", &len);
2236         if (val && len >= WWN_SIZE)
2237                 memcpy(nv->port_name, val, WWN_SIZE);
2238
2239         val = of_get_property(dp, "node-wwn", &len);
2240         if (val && len >= WWN_SIZE)
2241                 memcpy(nv->node_name, val, WWN_SIZE);
2242 #endif
2243 }
2244
2245 /*
2246 * NVRAM configuration for ISP 2xxx
2247 *
2248 * Input:
2249 *      ha                = adapter block pointer.
2250 *
2251 * Output:
2252 *      initialization control block in response_ring
2253 *      host adapters parameters in host adapter block
2254 *
2255 * Returns:
2256 *      0 = success.
2257 */
2258 int
2259 qla2x00_nvram_config(scsi_qla_host_t *vha)
2260 {
2261         int             rval;
2262         uint8_t         chksum = 0;
2263         uint16_t        cnt;
2264         uint8_t         *dptr1, *dptr2;
2265         struct qla_hw_data *ha = vha->hw;
2266         init_cb_t       *icb = ha->init_cb;
2267         nvram_t         *nv = ha->nvram;
2268         uint8_t         *ptr = ha->nvram;
2269         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
2270
2271         rval = QLA_SUCCESS;
2272
2273         /* Determine NVRAM starting address. */
2274         ha->nvram_size = sizeof(nvram_t);
2275         ha->nvram_base = 0;
2276         if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA2300(ha))
2277                 if ((RD_REG_WORD(&reg->ctrl_status) >> 14) == 1)
2278                         ha->nvram_base = 0x80;
2279
2280         /* Get NVRAM data and calculate checksum. */
2281         ha->isp_ops->read_nvram(vha, ptr, ha->nvram_base, ha->nvram_size);
2282         for (cnt = 0, chksum = 0; cnt < ha->nvram_size; cnt++)
2283                 chksum += *ptr++;
2284
2285         ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x010f,
2286             "Contents of NVRAM.\n");
2287         ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0110,
2288             (uint8_t *)nv, ha->nvram_size);
2289
2290         /* Bad NVRAM data, set defaults parameters. */
2291         if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' ||
2292             nv->id[2] != 'P' || nv->id[3] != ' ' || nv->nvram_version < 1) {
2293                 /* Reset NVRAM data. */
2294                 ql_log(ql_log_warn, vha, 0x0064,
2295                     "Inconsistent NVRAM "
2296                     "detected: checksum=0x%x id=%c version=0x%x.\n",
2297                     chksum, nv->id[0], nv->nvram_version);
2298                 ql_log(ql_log_warn, vha, 0x0065,
2299                     "Falling back to "
2300                     "functioning (yet invalid -- WWPN) defaults.\n");
2301
2302                 /*
2303                  * Set default initialization control block.
2304                  */
2305                 memset(nv, 0, ha->nvram_size);
2306                 nv->parameter_block_version = ICB_VERSION;
2307
2308                 if (IS_QLA23XX(ha)) {
2309                         nv->firmware_options[0] = BIT_2 | BIT_1;
2310                         nv->firmware_options[1] = BIT_7 | BIT_5;
2311                         nv->add_firmware_options[0] = BIT_5;
2312                         nv->add_firmware_options[1] = BIT_5 | BIT_4;
2313                         nv->frame_payload_size = __constant_cpu_to_le16(2048);
2314                         nv->special_options[1] = BIT_7;
2315                 } else if (IS_QLA2200(ha)) {
2316                         nv->firmware_options[0] = BIT_2 | BIT_1;
2317                         nv->firmware_options[1] = BIT_7 | BIT_5;
2318                         nv->add_firmware_options[0] = BIT_5;
2319                         nv->add_firmware_options[1] = BIT_5 | BIT_4;
2320                         nv->frame_payload_size = __constant_cpu_to_le16(1024);
2321                 } else if (IS_QLA2100(ha)) {
2322                         nv->firmware_options[0] = BIT_3 | BIT_1;
2323                         nv->firmware_options[1] = BIT_5;
2324                         nv->frame_payload_size = __constant_cpu_to_le16(1024);
2325                 }
2326
2327                 nv->max_iocb_allocation = __constant_cpu_to_le16(256);
2328                 nv->execution_throttle = __constant_cpu_to_le16(16);
2329                 nv->retry_count = 8;
2330                 nv->retry_delay = 1;
2331
2332                 nv->port_name[0] = 33;
2333                 nv->port_name[3] = 224;
2334                 nv->port_name[4] = 139;
2335
2336                 qla2xxx_nvram_wwn_from_ofw(vha, nv);
2337
2338                 nv->login_timeout = 4;
2339
2340                 /*
2341                  * Set default host adapter parameters
2342                  */
2343                 nv->host_p[1] = BIT_2;
2344                 nv->reset_delay = 5;
2345                 nv->port_down_retry_count = 8;
2346                 nv->max_luns_per_target = __constant_cpu_to_le16(8);
2347                 nv->link_down_timeout = 60;
2348
2349                 rval = 1;
2350         }
2351
2352 #if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2)
2353         /*
2354          * The SN2 does not provide BIOS emulation which means you can't change
2355          * potentially bogus BIOS settings. Force the use of default settings
2356          * for link rate and frame size.  Hope that the rest of the settings
2357          * are valid.
2358          */
2359         if (ia64_platform_is("sn2")) {
2360                 nv->frame_payload_size = __constant_cpu_to_le16(2048);
2361                 if (IS_QLA23XX(ha))
2362                         nv->special_options[1] = BIT_7;
2363         }
2364 #endif
2365
2366         /* Reset Initialization control block */
2367         memset(icb, 0, ha->init_cb_size);
2368
2369         /*
2370          * Setup driver NVRAM options.
2371          */
2372         nv->firmware_options[0] |= (BIT_6 | BIT_1);
2373         nv->firmware_options[0] &= ~(BIT_5 | BIT_4);
2374         nv->firmware_options[1] |= (BIT_5 | BIT_0);
2375         nv->firmware_options[1] &= ~BIT_4;
2376
2377         if (IS_QLA23XX(ha)) {
2378                 nv->firmware_options[0] |= BIT_2;
2379                 nv->firmware_options[0] &= ~BIT_3;
2380                 nv->special_options[0] &= ~BIT_6;
2381                 nv->add_firmware_options[1] |= BIT_5 | BIT_4;
2382
2383                 if (IS_QLA2300(ha)) {
2384                         if (ha->fb_rev == FPM_2310) {
2385                                 strcpy(ha->model_number, "QLA2310");
2386                         } else {
2387                                 strcpy(ha->model_number, "QLA2300");
2388                         }
2389                 } else {
2390                         qla2x00_set_model_info(vha, nv->model_number,
2391                             sizeof(nv->model_number), "QLA23xx");
2392                 }
2393         } else if (IS_QLA2200(ha)) {
2394                 nv->firmware_options[0] |= BIT_2;
2395                 /*
2396                  * 'Point-to-point preferred, else loop' is not a safe
2397                  * connection mode setting.
2398                  */
2399                 if ((nv->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) ==
2400                     (BIT_5 | BIT_4)) {
2401                         /* Force 'loop preferred, else point-to-point'. */
2402                         nv->add_firmware_options[0] &= ~(BIT_6 | BIT_5 | BIT_4);
2403                         nv->add_firmware_options[0] |= BIT_5;
2404                 }
2405                 strcpy(ha->model_number, "QLA22xx");
2406         } else /*if (IS_QLA2100(ha))*/ {
2407                 strcpy(ha->model_number, "QLA2100");
2408         }
2409
2410         /*
2411          * Copy over NVRAM RISC parameter block to initialization control block.
2412          */
2413         dptr1 = (uint8_t *)icb;
2414         dptr2 = (uint8_t *)&nv->parameter_block_version;
2415         cnt = (uint8_t *)&icb->request_q_outpointer - (uint8_t *)&icb->version;
2416         while (cnt--)
2417                 *dptr1++ = *dptr2++;
2418
2419         /* Copy 2nd half. */
2420         dptr1 = (uint8_t *)icb->add_firmware_options;
2421         cnt = (uint8_t *)icb->reserved_3 - (uint8_t *)icb->add_firmware_options;
2422         while (cnt--)
2423                 *dptr1++ = *dptr2++;
2424
2425         /* Use alternate WWN? */
2426         if (nv->host_p[1] & BIT_7) {
2427                 memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
2428                 memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
2429         }
2430
2431         /* Prepare nodename */
2432         if ((icb->firmware_options[1] & BIT_6) == 0) {
2433                 /*
2434                  * Firmware will apply the following mask if the nodename was
2435                  * not provided.
2436                  */
2437                 memcpy(icb->node_name, icb->port_name, WWN_SIZE);
2438                 icb->node_name[0] &= 0xF0;
2439         }
2440
2441         /*
2442          * Set host adapter parameters.
2443          */
2444
2445         /*
2446          * BIT_7 in the host-parameters section allows for modification to
2447          * internal driver logging.
2448          */
2449         if (nv->host_p[0] & BIT_7)
2450                 ql2xextended_error_logging = QL_DBG_DEFAULT1_MASK;
2451         ha->flags.disable_risc_code_load = ((nv->host_p[0] & BIT_4) ? 1 : 0);
2452         /* Always load RISC code on non ISP2[12]00 chips. */
2453         if (!IS_QLA2100(ha) && !IS_QLA2200(ha))
2454                 ha->flags.disable_risc_code_load = 0;
2455         ha->flags.enable_lip_reset = ((nv->host_p[1] & BIT_1) ? 1 : 0);
2456         ha->flags.enable_lip_full_login = ((nv->host_p[1] & BIT_2) ? 1 : 0);
2457         ha->flags.enable_target_reset = ((nv->host_p[1] & BIT_3) ? 1 : 0);
2458         ha->flags.enable_led_scheme = (nv->special_options[1] & BIT_4) ? 1 : 0;
2459         ha->flags.disable_serdes = 0;
2460
2461         ha->operating_mode =
2462             (icb->add_firmware_options[0] & (BIT_6 | BIT_5 | BIT_4)) >> 4;
2463
2464         memcpy(ha->fw_seriallink_options, nv->seriallink_options,
2465             sizeof(ha->fw_seriallink_options));
2466
2467         /* save HBA serial number */
2468         ha->serial0 = icb->port_name[5];
2469         ha->serial1 = icb->port_name[6];
2470         ha->serial2 = icb->port_name[7];
2471         memcpy(vha->node_name, icb->node_name, WWN_SIZE);
2472         memcpy(vha->port_name, icb->port_name, WWN_SIZE);
2473
2474         icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
2475
2476         ha->retry_count = nv->retry_count;
2477
2478         /* Set minimum login_timeout to 4 seconds. */
2479         if (nv->login_timeout != ql2xlogintimeout)
2480                 nv->login_timeout = ql2xlogintimeout;
2481         if (nv->login_timeout < 4)
2482                 nv->login_timeout = 4;
2483         ha->login_timeout = nv->login_timeout;
2484         icb->login_timeout = nv->login_timeout;
2485
2486         /* Set minimum RATOV to 100 tenths of a second. */
2487         ha->r_a_tov = 100;
2488
2489         ha->loop_reset_delay = nv->reset_delay;
2490
2491         /* Link Down Timeout = 0:
2492          *
2493          *      When Port Down timer expires we will start returning
2494          *      I/O's to OS with "DID_NO_CONNECT".
2495          *
2496          * Link Down Timeout != 0:
2497          *
2498          *       The driver waits for the link to come up after link down
2499          *       before returning I/Os to OS with "DID_NO_CONNECT".
2500          */
2501         if (nv->link_down_timeout == 0) {
2502                 ha->loop_down_abort_time =
2503                     (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
2504         } else {
2505                 ha->link_down_timeout =  nv->link_down_timeout;
2506                 ha->loop_down_abort_time =
2507                     (LOOP_DOWN_TIME - ha->link_down_timeout);
2508         }
2509
2510         /*
2511          * Need enough time to try and get the port back.
2512          */
2513         ha->port_down_retry_count = nv->port_down_retry_count;
2514         if (qlport_down_retry)
2515                 ha->port_down_retry_count = qlport_down_retry;
2516         /* Set login_retry_count */
2517         ha->login_retry_count  = nv->retry_count;
2518         if (ha->port_down_retry_count == nv->port_down_retry_count &&
2519             ha->port_down_retry_count > 3)
2520                 ha->login_retry_count = ha->port_down_retry_count;
2521         else if (ha->port_down_retry_count > (int)ha->login_retry_count)
2522                 ha->login_retry_count = ha->port_down_retry_count;
2523         if (ql2xloginretrycount)
2524                 ha->login_retry_count = ql2xloginretrycount;
2525
2526         icb->lun_enables = __constant_cpu_to_le16(0);
2527         icb->command_resource_count = 0;
2528         icb->immediate_notify_resource_count = 0;
2529         icb->timeout = __constant_cpu_to_le16(0);
2530
2531         if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
2532                 /* Enable RIO */
2533                 icb->firmware_options[0] &= ~BIT_3;
2534                 icb->add_firmware_options[0] &=
2535                     ~(BIT_3 | BIT_2 | BIT_1 | BIT_0);
2536                 icb->add_firmware_options[0] |= BIT_2;
2537                 icb->response_accumulation_timer = 3;
2538                 icb->interrupt_delay_timer = 5;
2539
2540                 vha->flags.process_response_queue = 1;
2541         } else {
2542                 /* Enable ZIO. */
2543                 if (!vha->flags.init_done) {
2544                         ha->zio_mode = icb->add_firmware_options[0] &
2545                             (BIT_3 | BIT_2 | BIT_1 | BIT_0);
2546                         ha->zio_timer = icb->interrupt_delay_timer ?
2547                             icb->interrupt_delay_timer: 2;
2548                 }
2549                 icb->add_firmware_options[0] &=
2550                     ~(BIT_3 | BIT_2 | BIT_1 | BIT_0);
2551                 vha->flags.process_response_queue = 0;
2552                 if (ha->zio_mode != QLA_ZIO_DISABLED) {
2553                         ha->zio_mode = QLA_ZIO_MODE_6;
2554
2555                         ql_log(ql_log_info, vha, 0x0068,
2556                             "ZIO mode %d enabled; timer delay (%d us).\n",
2557                             ha->zio_mode, ha->zio_timer * 100);
2558
2559                         icb->add_firmware_options[0] |= (uint8_t)ha->zio_mode;
2560                         icb->interrupt_delay_timer = (uint8_t)ha->zio_timer;
2561                         vha->flags.process_response_queue = 1;
2562                 }
2563         }
2564
2565         if (rval) {
2566                 ql_log(ql_log_warn, vha, 0x0069,
2567                     "NVRAM configuration failed.\n");
2568         }
2569         return (rval);
2570 }
2571
2572 static void
2573 qla2x00_rport_del(void *data)
2574 {
2575         fc_port_t *fcport = data;
2576         struct fc_rport *rport;
2577         scsi_qla_host_t *vha = fcport->vha;
2578         unsigned long flags;
2579
2580         spin_lock_irqsave(fcport->vha->host->host_lock, flags);
2581         rport = fcport->drport ? fcport->drport: fcport->rport;
2582         fcport->drport = NULL;
2583         spin_unlock_irqrestore(fcport->vha->host->host_lock, flags);
2584         if (rport) {
2585                 fc_remote_port_delete(rport);
2586                 /*
2587                  * Release the target mode FC NEXUS in qla_target.c code
2588                  * if target mod is enabled.
2589                  */
2590                 qlt_fc_port_deleted(vha, fcport);
2591         }
2592 }
2593
2594 /**
2595  * qla2x00_alloc_fcport() - Allocate a generic fcport.
2596  * @ha: HA context
2597  * @flags: allocation flags
2598  *
2599  * Returns a pointer to the allocated fcport, or NULL, if none available.
2600  */
2601 fc_port_t *
2602 qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
2603 {
2604         fc_port_t *fcport;
2605
2606         fcport = kzalloc(sizeof(fc_port_t), flags);
2607         if (!fcport)
2608                 return NULL;
2609
2610         /* Setup fcport template structure. */
2611         fcport->vha = vha;
2612         fcport->port_type = FCT_UNKNOWN;
2613         fcport->loop_id = FC_NO_LOOP_ID;
2614         qla2x00_set_fcport_state(fcport, FCS_UNCONFIGURED);
2615         fcport->supported_classes = FC_COS_UNSPECIFIED;
2616         fcport->scan_state = QLA_FCPORT_SCAN_NONE;
2617
2618         return fcport;
2619 }
2620
2621 /*
2622  * qla2x00_configure_loop
2623  *      Updates Fibre Channel Device Database with what is actually on loop.
2624  *
2625  * Input:
2626  *      ha                = adapter block pointer.
2627  *
2628  * Returns:
2629  *      0 = success.
2630  *      1 = error.
2631  *      2 = database was full and device was not configured.
2632  */
2633 static int
2634 qla2x00_configure_loop(scsi_qla_host_t *vha)
2635 {
2636         int  rval;
2637         unsigned long flags, save_flags;
2638         struct qla_hw_data *ha = vha->hw;
2639         rval = QLA_SUCCESS;
2640
2641         /* Get Initiator ID */
2642         if (test_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags)) {
2643                 rval = qla2x00_configure_hba(vha);
2644                 if (rval != QLA_SUCCESS) {
2645                         ql_dbg(ql_dbg_disc, vha, 0x2013,
2646                             "Unable to configure HBA.\n");
2647                         return (rval);
2648                 }
2649         }
2650
2651         save_flags = flags = vha->dpc_flags;
2652         ql_dbg(ql_dbg_disc, vha, 0x2014,
2653             "Configure loop -- dpc flags = 0x%lx.\n", flags);
2654
2655         /*
2656          * If we have both an RSCN and PORT UPDATE pending then handle them
2657          * both at the same time.
2658          */
2659         clear_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
2660         clear_bit(RSCN_UPDATE, &vha->dpc_flags);
2661
2662         qla2x00_get_data_rate(vha);
2663
2664         /* Determine what we need to do */
2665         if (ha->current_topology == ISP_CFG_FL &&
2666             (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
2667
2668                 set_bit(RSCN_UPDATE, &flags);
2669
2670         } else if (ha->current_topology == ISP_CFG_F &&
2671             (test_bit(LOCAL_LOOP_UPDATE, &flags))) {
2672
2673                 set_bit(RSCN_UPDATE, &flags);
2674                 clear_bit(LOCAL_LOOP_UPDATE, &flags);
2675
2676         } else if (ha->current_topology == ISP_CFG_N) {
2677                 clear_bit(RSCN_UPDATE, &flags);
2678
2679         } else if (!vha->flags.online ||
2680             (test_bit(ABORT_ISP_ACTIVE, &flags))) {
2681
2682                 set_bit(RSCN_UPDATE, &flags);
2683                 set_bit(LOCAL_LOOP_UPDATE, &flags);
2684         }
2685
2686         if (test_bit(LOCAL_LOOP_UPDATE, &flags)) {
2687                 if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
2688                         ql_dbg(ql_dbg_disc, vha, 0x2015,
2689                             "Loop resync needed, failing.\n");
2690                         rval = QLA_FUNCTION_FAILED;
2691                 } else
2692                         rval = qla2x00_configure_local_loop(vha);
2693         }
2694
2695         if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
2696                 if (LOOP_TRANSITION(vha)) {
2697                         ql_dbg(ql_dbg_disc, vha, 0x201e,
2698                             "Needs RSCN update and loop transition.\n");
2699                         rval = QLA_FUNCTION_FAILED;
2700                 }
2701                 else
2702                         rval = qla2x00_configure_fabric(vha);
2703         }
2704
2705         if (rval == QLA_SUCCESS) {
2706                 if (atomic_read(&vha->loop_down_timer) ||
2707                     test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
2708                         rval = QLA_FUNCTION_FAILED;
2709                 } else {
2710                         atomic_set(&vha->loop_state, LOOP_READY);
2711                         ql_dbg(ql_dbg_disc, vha, 0x2069,
2712                             "LOOP READY.\n");
2713                 }
2714         }
2715
2716         if (rval) {
2717                 ql_dbg(ql_dbg_disc, vha, 0x206a,
2718                     "%s *** FAILED ***.\n", __func__);
2719         } else {
2720                 ql_dbg(ql_dbg_disc, vha, 0x206b,
2721                     "%s: exiting normally.\n", __func__);
2722         }
2723
2724         /* Restore state if a resync event occurred during processing */
2725         if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)) {
2726                 if (test_bit(LOCAL_LOOP_UPDATE, &save_flags))
2727                         set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
2728                 if (test_bit(RSCN_UPDATE, &save_flags)) {
2729                         set_bit(RSCN_UPDATE, &vha->dpc_flags);
2730                 }
2731         }
2732
2733         return (rval);
2734 }
2735
2736
2737
2738 /*
2739  * qla2x00_configure_local_loop
2740  *      Updates Fibre Channel Device Database with local loop devices.
2741  *
2742  * Input:
2743  *      ha = adapter block pointer.
2744  *
2745  * Returns:
2746  *      0 = success.
2747  */
2748 static int
2749 qla2x00_configure_local_loop(scsi_qla_host_t *vha)
2750 {
2751         int             rval, rval2;
2752         int             found_devs;
2753         int             found;
2754         fc_port_t       *fcport, *new_fcport;
2755
2756         uint16_t        index;
2757         uint16_t        entries;
2758         char            *id_iter;
2759         uint16_t        loop_id;
2760         uint8_t         domain, area, al_pa;
2761         struct qla_hw_data *ha = vha->hw;
2762
2763         found_devs = 0;
2764         new_fcport = NULL;
2765         entries = MAX_FIBRE_DEVICES_LOOP;
2766
2767         /* Get list of logged in devices. */
2768         memset(ha->gid_list, 0, qla2x00_gid_list_size(ha));
2769         rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma,
2770             &entries);
2771         if (rval != QLA_SUCCESS)
2772                 goto cleanup_allocation;
2773
2774         ql_dbg(ql_dbg_disc, vha, 0x2017,
2775             "Entries in ID list (%d).\n", entries);
2776         ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075,
2777             (uint8_t *)ha->gid_list,
2778             entries * sizeof(struct gid_list_info));
2779
2780         /* Allocate temporary fcport for any new fcports discovered. */
2781         new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
2782         if (new_fcport == NULL) {
2783                 ql_log(ql_log_warn, vha, 0x2018,
2784                     "Memory allocation failed for fcport.\n");
2785                 rval = QLA_MEMORY_ALLOC_FAILED;
2786                 goto cleanup_allocation;
2787         }
2788         new_fcport->flags &= ~FCF_FABRIC_DEVICE;
2789
2790         /*
2791          * Mark local devices that were present with FCF_DEVICE_LOST for now.
2792          */
2793         list_for_each_entry(fcport, &vha->vp_fcports, list) {
2794                 if (atomic_read(&fcport->state) == FCS_ONLINE &&
2795                     fcport->port_type != FCT_BROADCAST &&
2796                     (fcport->flags & FCF_FABRIC_DEVICE) == 0) {
2797
2798                         ql_dbg(ql_dbg_disc, vha, 0x2019,
2799                             "Marking port lost loop_id=0x%04x.\n",
2800                             fcport->loop_id);
2801
2802                         qla2x00_set_fcport_state(fcport, FCS_DEVICE_LOST);
2803                 }
2804         }
2805
2806         /* Add devices to port list. */
2807         id_iter = (char *)ha->gid_list;
2808         for (index = 0; index < entries; index++) {
2809                 domain = ((struct gid_list_info *)id_iter)->domain;
2810                 area = ((struct gid_list_info *)id_iter)->area;
2811                 al_pa = ((struct gid_list_info *)id_iter)->al_pa;
2812                 if (IS_QLA2100(ha) || IS_QLA2200(ha))
2813                         loop_id = (uint16_t)
2814                             ((struct gid_list_info *)id_iter)->loop_id_2100;
2815                 else
2816                         loop_id = le16_to_cpu(
2817                             ((struct gid_list_info *)id_iter)->loop_id);
2818                 id_iter += ha->gid_list_info_size;
2819
2820                 /* Bypass reserved domain fields. */
2821                 if ((domain & 0xf0) == 0xf0)
2822                         continue;
2823
2824                 /* Bypass if not same domain and area of adapter. */
2825                 if (area && domain &&
2826                     (area != vha->d_id.b.area || domain != vha->d_id.b.domain))
2827                         continue;
2828
2829                 /* Bypass invalid local loop ID. */
2830                 if (loop_id > LAST_LOCAL_LOOP_ID)
2831                         continue;
2832
2833                 memset(new_fcport, 0, sizeof(fc_port_t));
2834
2835                 /* Fill in member data. */
2836                 new_fcport->d_id.b.domain = domain;
2837                 new_fcport->d_id.b.area = area;
2838                 new_fcport->d_id.b.al_pa = al_pa;
2839                 new_fcport->loop_id = loop_id;
2840                 rval2 = qla2x00_get_port_database(vha, new_fcport, 0);
2841                 if (rval2 != QLA_SUCCESS) {
2842                         ql_dbg(ql_dbg_disc, vha, 0x201a,
2843                             "Failed to retrieve fcport information "
2844                             "-- get_port_database=%x, loop_id=0x%04x.\n",
2845                             rval2, new_fcport->loop_id);
2846                         ql_dbg(ql_dbg_disc, vha, 0x201b,
2847                             "Scheduling resync.\n");
2848                         set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
2849                         continue;
2850                 }
2851
2852                 /* Check for matching device in port list. */
2853                 found = 0;
2854                 fcport = NULL;
2855                 list_for_each_entry(fcport, &vha->vp_fcports, list) {
2856                         if (memcmp(new_fcport->port_name, fcport->port_name,
2857                             WWN_SIZE))
2858                                 continue;
2859
2860                         fcport->flags &= ~FCF_FABRIC_DEVICE;
2861                         fcport->loop_id = new_fcport->loop_id;
2862                         fcport->port_type = new_fcport->port_type;
2863                         fcport->d_id.b24 = new_fcport->d_id.b24;
2864                         memcpy(fcport->node_name, new_fcport->node_name,
2865                             WWN_SIZE);
2866
2867                         found++;
2868                         break;
2869                 }
2870
2871                 if (!found) {
2872                         /* New device, add to fcports list. */
2873                         list_add_tail(&new_fcport->list, &vha->vp_fcports);
2874
2875                         /* Allocate a new replacement fcport. */
2876                         fcport = new_fcport;
2877                         new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
2878                         if (new_fcport == NULL) {
2879                                 ql_log(ql_log_warn, vha, 0x201c,
2880                                     "Failed to allocate memory for fcport.\n");
2881                                 rval = QLA_MEMORY_ALLOC_FAILED;
2882                                 goto cleanup_allocation;
2883                         }
2884                         new_fcport->flags &= ~FCF_FABRIC_DEVICE;
2885                 }
2886
2887                 /* Base iIDMA settings on HBA port speed. */
2888                 fcport->fp_speed = ha->link_data_rate;
2889
2890                 qla2x00_update_fcport(vha, fcport);
2891
2892                 found_devs++;
2893         }
2894
2895 cleanup_allocation:
2896         kfree(new_fcport);
2897
2898         if (rval != QLA_SUCCESS) {
2899                 ql_dbg(ql_dbg_disc, vha, 0x201d,
2900                     "Configure local loop error exit: rval=%x.\n", rval);
2901         }
2902
2903         return (rval);
2904 }
2905
2906 static void
2907 qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
2908 {
2909         char *link_speed;
2910         int rval;
2911         uint16_t mb[4];
2912         struct qla_hw_data *ha = vha->hw;
2913
2914         if (!IS_IIDMA_CAPABLE(ha))
2915                 return;
2916
2917         if (atomic_read(&fcport->state) != FCS_ONLINE)
2918                 return;
2919
2920         if (fcport->fp_speed == PORT_SPEED_UNKNOWN ||
2921             fcport->fp_speed > ha->link_data_rate)
2922                 return;
2923
2924         rval = qla2x00_set_idma_speed(vha, fcport->loop_id, fcport->fp_speed,
2925             mb);
2926         if (rval != QLA_SUCCESS) {
2927                 ql_dbg(ql_dbg_disc, vha, 0x2004,
2928                     "Unable to adjust iIDMA "
2929                     "%02x%02x%02x%02x%02x%02x%02x%02x -- %04x %x %04x "
2930                     "%04x.\n", fcport->port_name[0], fcport->port_name[1],
2931                     fcport->port_name[2], fcport->port_name[3],
2932                     fcport->port_name[4], fcport->port_name[5],
2933                     fcport->port_name[6], fcport->port_name[7], rval,
2934                     fcport->fp_speed, mb[0], mb[1]);
2935         } else {
2936                 link_speed = qla2x00_get_link_speed_str(ha);
2937                 ql_dbg(ql_dbg_disc, vha, 0x2005,
2938                     "iIDMA adjusted to %s GB/s "
2939                     "on %02x%02x%02x%02x%02x%02x%02x%02x.\n", link_speed,
2940                     fcport->port_name[0], fcport->port_name[1],
2941                     fcport->port_name[2], fcport->port_name[3],
2942                     fcport->port_name[4], fcport->port_name[5],
2943                     fcport->port_name[6], fcport->port_name[7]);
2944         }
2945 }
2946
2947 static void
2948 qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
2949 {
2950         struct fc_rport_identifiers rport_ids;
2951         struct fc_rport *rport;
2952         unsigned long flags;
2953
2954         qla2x00_rport_del(fcport);
2955
2956         rport_ids.node_name = wwn_to_u64(fcport->node_name);
2957         rport_ids.port_name = wwn_to_u64(fcport->port_name);
2958         rport_ids.port_id = fcport->d_id.b.domain << 16 |
2959             fcport->d_id.b.area << 8 | fcport->d_id.b.al_pa;
2960         rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
2961         fcport->rport = rport = fc_remote_port_add(vha->host, 0, &rport_ids);
2962         if (!rport) {
2963                 ql_log(ql_log_warn, vha, 0x2006,
2964                     "Unable to allocate fc remote port.\n");
2965                 return;
2966         }
2967         /*
2968          * Create target mode FC NEXUS in qla_target.c if target mode is
2969          * enabled..
2970          */
2971         qlt_fc_port_added(vha, fcport);
2972
2973         spin_lock_irqsave(fcport->vha->host->host_lock, flags);
2974         *((fc_port_t **)rport->dd_data) = fcport;
2975         spin_unlock_irqrestore(fcport->vha->host->host_lock, flags);
2976
2977         rport->supported_classes = fcport->supported_classes;
2978
2979         rport_ids.roles = FC_RPORT_ROLE_UNKNOWN;
2980         if (fcport->port_type == FCT_INITIATOR)
2981                 rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR;
2982         if (fcport->port_type == FCT_TARGET)
2983                 rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET;
2984         fc_remote_port_rolechg(rport, rport_ids.roles);
2985 }
2986
2987 /*
2988  * qla2x00_update_fcport
2989  *      Updates device on list.
2990  *
2991  * Input:
2992  *      ha = adapter block pointer.
2993  *      fcport = port structure pointer.
2994  *
2995  * Return:
2996  *      0  - Success
2997  *  BIT_0 - error
2998  *
2999  * Context:
3000  *      Kernel context.
3001  */
3002 void
3003 qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
3004 {
3005         fcport->vha = vha;
3006         fcport->login_retry = 0;
3007         fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
3008
3009         qla2x00_iidma_fcport(vha, fcport);
3010         qla24xx_update_fcport_fcp_prio(vha, fcport);
3011         qla2x00_reg_remote_port(vha, fcport);
3012         qla2x00_set_fcport_state(fcport, FCS_ONLINE);
3013 }
3014
3015 /*
3016  * qla2x00_configure_fabric
3017  *      Setup SNS devices with loop ID's.
3018  *
3019  * Input:
3020  *      ha = adapter block pointer.
3021  *
3022  * Returns:
3023  *      0 = success.
3024  *      BIT_0 = error
3025  */
3026 static int
3027 qla2x00_configure_fabric(scsi_qla_host_t *vha)
3028 {
3029         int     rval;
3030         fc_port_t       *fcport;
3031         uint16_t        next_loopid;
3032         uint16_t        mb[MAILBOX_REGISTER_COUNT];
3033         uint16_t        loop_id;
3034         LIST_HEAD(new_fcports);
3035         struct qla_hw_data *ha = vha->hw;
3036         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
3037
3038         /* If FL port exists, then SNS is present */
3039         if (IS_FWI2_CAPABLE(ha))
3040                 loop_id = NPH_F_PORT;
3041         else
3042                 loop_id = SNS_FL_PORT;
3043         rval = qla2x00_get_port_name(vha, loop_id, vha->fabric_node_name, 1);
3044         if (rval != QLA_SUCCESS) {
3045                 ql_dbg(ql_dbg_disc, vha, 0x201f,
3046                     "MBX_GET_PORT_NAME failed, No FL Port.\n");
3047
3048                 vha->device_flags &= ~SWITCH_FOUND;
3049                 return (QLA_SUCCESS);
3050         }
3051         vha->device_flags |= SWITCH_FOUND;
3052
3053         do {
3054                 /* FDMI support. */
3055                 if (ql2xfdmienable &&
3056                     test_and_clear_bit(REGISTER_FDMI_NEEDED, &vha->dpc_flags))
3057                         qla2x00_fdmi_register(vha);
3058
3059                 /* Ensure we are logged into the SNS. */
3060                 if (IS_FWI2_CAPABLE(ha))
3061                         loop_id = NPH_SNS;
3062                 else
3063                         loop_id = SIMPLE_NAME_SERVER;
3064                 rval = ha->isp_ops->fabric_login(vha, loop_id, 0xff, 0xff,
3065                     0xfc, mb, BIT_1|BIT_0);
3066                 if (rval != QLA_SUCCESS) {
3067                         set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
3068                         break;
3069                 }
3070                 if (mb[0] != MBS_COMMAND_COMPLETE) {
3071                         ql_dbg(ql_dbg_disc, vha, 0x2042,
3072                             "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x "
3073                             "mb[6]=%x mb[7]=%x.\n", loop_id, mb[0], mb[1],
3074                             mb[2], mb[6], mb[7]);
3075                         return (QLA_SUCCESS);
3076                 }
3077
3078                 if (test_and_clear_bit(REGISTER_FC4_NEEDED, &vha->dpc_flags)) {
3079                         if (qla2x00_rft_id(vha)) {
3080                                 /* EMPTY */
3081                                 ql_dbg(ql_dbg_disc, vha, 0x2045,
3082                                     "Register FC-4 TYPE failed.\n");
3083                         }
3084                         if (qla2x00_rff_id(vha)) {
3085                                 /* EMPTY */
3086                                 ql_dbg(ql_dbg_disc, vha, 0x2049,
3087                                     "Register FC-4 Features failed.\n");
3088                         }
3089                         if (qla2x00_rnn_id(vha)) {
3090                                 /* EMPTY */
3091                                 ql_dbg(ql_dbg_disc, vha, 0x204f,
3092                                     "Register Node Name failed.\n");
3093                         } else if (qla2x00_rsnn_nn(vha)) {
3094                                 /* EMPTY */
3095                                 ql_dbg(ql_dbg_disc, vha, 0x2053,
3096                                     "Register Symobilic Node Name failed.\n");
3097                         }
3098                 }
3099
3100                 rval = qla2x00_find_all_fabric_devs(vha, &new_fcports);
3101                 if (rval != QLA_SUCCESS)
3102                         break;
3103
3104                 /* Add new ports to existing port list */
3105                 list_splice_tail_init(&new_fcports, &vha->vp_fcports);
3106
3107                 /* Starting free loop ID. */
3108                 next_loopid = ha->min_external_loopid;
3109
3110                 list_for_each_entry(fcport, &vha->vp_fcports, list) {
3111                         if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
3112                                 break;
3113
3114                         if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
3115                                 continue;
3116
3117                         /* Logout lost/gone fabric devices (non-FCP2) */
3118                         if (fcport->scan_state != QLA_FCPORT_SCAN_FOUND &&
3119                             atomic_read(&fcport->state) == FCS_ONLINE) {
3120                                 qla2x00_mark_device_lost(vha, fcport,
3121                                     ql2xplogiabsentdevice, 0);
3122                                 if (fcport->loop_id != FC_NO_LOOP_ID &&
3123                                     (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
3124                                     fcport->port_type != FCT_INITIATOR &&
3125                                     fcport->port_type != FCT_BROADCAST) {
3126                                         ha->isp_ops->fabric_logout(vha,
3127                                             fcport->loop_id,
3128                                             fcport->d_id.b.domain,
3129                                             fcport->d_id.b.area,
3130                                             fcport->d_id.b.al_pa);
3131                                 }
3132                                 continue;
3133                         }
3134                         fcport->scan_state = QLA_FCPORT_SCAN_NONE;
3135
3136                         /* Login fabric devices that need a login */
3137                         if ((fcport->flags & FCF_LOGIN_NEEDED) != 0 &&
3138                             atomic_read(&vha->loop_down_timer) == 0) {
3139                                 if (fcport->loop_id == FC_NO_LOOP_ID) {
3140                                         fcport->loop_id = next_loopid;
3141                                         rval = qla2x00_find_new_loop_id(
3142                                             base_vha, fcport);
3143                                         if (rval != QLA_SUCCESS) {
3144                                                 /* Ran out of IDs to use */
3145                                                 continue;
3146                                         }
3147                                 }
3148                         }
3149
3150                         /* Login and update database */
3151                         qla2x00_fabric_dev_login(vha, fcport, &next_loopid);
3152                 }
3153         } while (0);
3154
3155         if (rval) {
3156                 ql_dbg(ql_dbg_disc, vha, 0x2068,
3157                     "Configure fabric error exit rval=%d.\n", rval);
3158         }
3159
3160         return (rval);
3161 }
3162
3163 /*
3164  * qla2x00_find_all_fabric_devs
3165  *
3166  * Input:
3167  *      ha = adapter block pointer.
3168  *      dev = database device entry pointer.
3169  *
3170  * Returns:
3171  *      0 = success.
3172  *
3173  * Context:
3174  *      Kernel context.
3175  */
3176 static int
3177 qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3178         struct list_head *new_fcports)
3179 {
3180         int             rval;
3181         uint16_t        loop_id;
3182         fc_port_t       *fcport, *new_fcport, *fcptemp;
3183         int             found;
3184
3185         sw_info_t       *swl;
3186         int             swl_idx;
3187         int             first_dev, last_dev;
3188         port_id_t       wrap = {}, nxt_d_id;
3189         struct qla_hw_data *ha = vha->hw;
3190         struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev);
3191         struct scsi_qla_host *tvp;
3192
3193         rval = QLA_SUCCESS;
3194
3195         /* Try GID_PT to get device list, else GAN. */
3196         if (!ha->swl)
3197                 ha->swl = kcalloc(ha->max_fibre_devices, sizeof(sw_info_t),
3198                     GFP_KERNEL);
3199         swl = ha->swl;
3200         if (!swl) {
3201                 /*EMPTY*/
3202                 ql_dbg(ql_dbg_disc, vha, 0x2054,
3203                     "GID_PT allocations failed, fallback on GA_NXT.\n");
3204         } else {
3205                 memset(swl, 0, ha->max_fibre_devices * sizeof(sw_info_t));
3206                 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
3207                         swl = NULL;
3208                 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
3209                         swl = NULL;
3210                 } else if (qla2x00_gnn_id(vha, swl) != QLA_SUCCESS) {
3211                         swl = NULL;
3212                 } else if (ql2xiidmaenable &&
3213                     qla2x00_gfpn_id(vha, swl) == QLA_SUCCESS) {
3214                         qla2x00_gpsc(vha, swl);
3215                 }
3216
3217                 /* If other queries succeeded probe for FC-4 type */
3218                 if (swl)
3219                         qla2x00_gff_id(vha, swl);
3220         }
3221         swl_idx = 0;
3222
3223         /* Allocate temporary fcport for any new fcports discovered. */
3224         new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
3225         if (new_fcport == NULL) {
3226                 ql_log(ql_log_warn, vha, 0x205e,
3227                     "Failed to allocate memory for fcport.\n");
3228                 return (QLA_MEMORY_ALLOC_FAILED);
3229         }
3230         new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
3231         /* Set start port ID scan at adapter ID. */
3232         first_dev = 1;
3233         last_dev = 0;
3234
3235         /* Starting free loop ID. */
3236         loop_id = ha->min_external_loopid;
3237         for (; loop_id <= ha->max_loop_id; loop_id++) {
3238                 if (qla2x00_is_reserved_id(vha, loop_id))
3239                         continue;
3240
3241                 if (ha->current_topology == ISP_CFG_FL &&
3242                     (atomic_read(&vha->loop_down_timer) ||
3243                      LOOP_TRANSITION(vha))) {
3244                         atomic_set(&vha->loop_down_timer, 0);
3245                         set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
3246                         set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
3247                         break;
3248                 }
3249
3250                 if (swl != NULL) {
3251                         if (last_dev) {
3252                                 wrap.b24 = new_fcport->d_id.b24;
3253                         } else {
3254                                 new_fcport->d_id.b24 = swl[swl_idx].d_id.b24;
3255                                 memcpy(new_fcport->node_name,
3256                                     swl[swl_idx].node_name, WWN_SIZE);
3257                                 memcpy(new_fcport->port_name,
3258                                     swl[swl_idx].port_name, WWN_SIZE);
3259                                 memcpy(new_fcport->fabric_port_name,
3260                                     swl[swl_idx].fabric_port_name, WWN_SIZE);
3261                                 new_fcport->fp_speed = swl[swl_idx].fp_speed;
3262                                 new_fcport->fc4_type = swl[swl_idx].fc4_type;
3263
3264                                 if (swl[swl_idx].d_id.b.rsvd_1 != 0) {
3265                                         last_dev = 1;
3266                                 }
3267                                 swl_idx++;
3268                         }
3269                 } else {
3270                         /* Send GA_NXT to the switch */
3271                         rval = qla2x00_ga_nxt(vha, new_fcport);
3272                         if (rval != QLA_SUCCESS) {
3273                                 ql_log(ql_log_warn, vha, 0x2064,
3274                                     "SNS scan failed -- assuming "
3275                                     "zero-entry result.\n");
3276                                 list_for_each_entry_safe(fcport, fcptemp,
3277                                     new_fcports, list) {
3278                                         list_del(&fcport->list);
3279                                         kfree(fcport);
3280                                 }
3281                                 rval = QLA_SUCCESS;
3282                                 break;
3283                         }
3284                 }
3285
3286                 /* If wrap on switch device list, exit. */
3287                 if (first_dev) {
3288                         wrap.b24 = new_fcport->d_id.b24;
3289                         first_dev = 0;
3290                 } else if (new_fcport->d_id.b24 == wrap.b24) {
3291                         ql_dbg(ql_dbg_disc, vha, 0x2065,
3292                             "Device wrap (%02x%02x%02x).\n",
3293                             new_fcport->d_id.b.domain,
3294                             new_fcport->d_id.b.area,
3295                             new_fcport->d_id.b.al_pa);
3296                         break;
3297                 }
3298
3299                 /* Bypass if same physical adapter. */
3300                 if (new_fcport->d_id.b24 == base_vha->d_id.b24)
3301                         continue;
3302
3303                 /* Bypass virtual ports of the same host. */
3304                 found = 0;
3305                 if (ha->num_vhosts) {
3306                         unsigned long flags;
3307
3308                         spin_lock_irqsave(&ha->vport_slock, flags);
3309                         list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
3310                                 if (new_fcport->d_id.b24 == vp->d_id.b24) {
3311                                         found = 1;
3312                                         break;
3313                                 }
3314                         }
3315                         spin_unlock_irqrestore(&ha->vport_slock, flags);
3316
3317                         if (found)
3318                                 continue;
3319                 }
3320
3321                 /* Bypass if same domain and area of adapter. */
3322                 if (((new_fcport->d_id.b24 & 0xffff00) ==
3323                     (vha->d_id.b24 & 0xffff00)) && ha->current_topology ==
3324                         ISP_CFG_FL)
3325                             continue;
3326
3327                 /* Bypass reserved domain fields. */
3328                 if ((new_fcport->d_id.b.domain & 0xf0) == 0xf0)
3329                         continue;
3330
3331                 /* Bypass ports whose FCP-4 type is not FCP_SCSI */
3332                 if (ql2xgffidenable &&
3333                     (new_fcport->fc4_type != FC4_TYPE_FCP_SCSI &&
3334                     new_fcport->fc4_type != FC4_TYPE_UNKNOWN))
3335                         continue;
3336
3337                 /* Locate matching device in database. */
3338                 found = 0;
3339                 list_for_each_entry(fcport, &vha->vp_fcports, list) {
3340                         if (memcmp(new_fcport->port_name, fcport->port_name,
3341                             WWN_SIZE))
3342                                 continue;
3343
3344                         fcport->scan_state = QLA_FCPORT_SCAN_FOUND;
3345
3346                         found++;
3347
3348                         /* Update port state. */
3349                         memcpy(fcport->fabric_port_name,
3350                             new_fcport->fabric_port_name, WWN_SIZE);
3351                         fcport->fp_speed = new_fcport->fp_speed;
3352
3353                         /*
3354                          * If address the same and state FCS_ONLINE, nothing
3355                          * changed.
3356                          */
3357                         if (fcport->d_id.b24 == new_fcport->d_id.b24 &&
3358                             atomic_read(&fcport->state) == FCS_ONLINE) {
3359                                 break;
3360                         }
3361
3362                         /*
3363                          * If device was not a fabric device before.
3364                          */
3365                         if ((fcport->flags & FCF_FABRIC_DEVICE) == 0) {
3366                                 fcport->d_id.b24 = new_fcport->d_id.b24;
3367                                 qla2x00_clear_loop_id(fcport);
3368                                 fcport->flags |= (FCF_FABRIC_DEVICE |
3369                                     FCF_LOGIN_NEEDED);
3370                                 break;
3371                         }
3372
3373                         /*
3374                          * Port ID changed or device was marked to be updated;
3375                          * Log it out if still logged in and mark it for
3376                          * relogin later.
3377                          */
3378                         fcport->d_id.b24 = new_fcport->d_id.b24;
3379                         fcport->flags |= FCF_LOGIN_NEEDED;
3380                         if (fcport->loop_id != FC_NO_LOOP_ID &&
3381                             (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
3382                             (fcport->flags & FCF_ASYNC_SENT) == 0 &&
3383                             fcport->port_type != FCT_INITIATOR &&
3384                             fcport->port_type != FCT_BROADCAST) {
3385                                 ha->isp_ops->fabric_logout(vha, fcport->loop_id,
3386                                     fcport->d_id.b.domain, fcport->d_id.b.area,
3387                                     fcport->d_id.b.al_pa);
3388                                 qla2x00_clear_loop_id(fcport);
3389                         }
3390
3391                         break;
3392                 }
3393
3394                 if (found)
3395                         continue;
3396                 /* If device was not in our fcports list, then add it. */
3397                 list_add_tail(&new_fcport->list, new_fcports);
3398
3399                 /* Allocate a new replacement fcport. */
3400                 nxt_d_id.b24 = new_fcport->d_id.b24;
3401                 new_fcport = qla2x00_alloc_fcport(vha, GFP_KERNEL);
3402                 if (new_fcport == NULL) {
3403                         ql_log(ql_log_warn, vha, 0x2066,
3404                             "Memory allocation failed for fcport.\n");
3405                         return (QLA_MEMORY_ALLOC_FAILED);
3406                 }
3407                 new_fcport->flags |= (FCF_FABRIC_DEVICE | FCF_LOGIN_NEEDED);
3408                 new_fcport->d_id.b24 = nxt_d_id.b24;
3409         }
3410
3411         kfree(new_fcport);
3412
3413         return (rval);
3414 }
3415
3416 /*
3417  * qla2x00_find_new_loop_id
3418  *      Scan through our port list and find a new usable loop ID.
3419  *
3420  * Input:
3421  *      ha:     adapter state pointer.
3422  *      dev:    port structure pointer.
3423  *
3424  * Returns:
3425  *      qla2x00 local function return status code.
3426  *
3427  * Context:
3428  *      Kernel context.
3429  */
3430 int
3431 qla2x00_find_new_loop_id(scsi_qla_host_t *vha, fc_port_t *dev)
3432 {
3433         int     rval;
3434         struct qla_hw_data *ha = vha->hw;
3435         unsigned long flags = 0;
3436
3437         rval = QLA_SUCCESS;
3438
3439         spin_lock_irqsave(&ha->vport_slock, flags);
3440
3441         dev->loop_id = find_first_zero_bit(ha->loop_id_map,
3442             LOOPID_MAP_SIZE);
3443         if (dev->loop_id >= LOOPID_MAP_SIZE ||
3444             qla2x00_is_reserved_id(vha, dev->loop_id)) {
3445                 dev->loop_id = FC_NO_LOOP_ID;
3446                 rval = QLA_FUNCTION_FAILED;
3447         } else
3448                 set_bit(dev->loop_id, ha->loop_id_map);
3449
3450         spin_unlock_irqrestore(&ha->vport_slock, flags);
3451
3452         if (rval == QLA_SUCCESS)
3453                 ql_dbg(ql_dbg_disc, dev->vha, 0x2086,
3454                     "Assigning new loopid=%x, portid=%x.\n",
3455                     dev->loop_id, dev->d_id.b24);
3456         else
3457                 ql_log(ql_log_warn, dev->vha, 0x2087,
3458                     "No loop_id's available, portid=%x.\n",
3459                     dev->d_id.b24);
3460
3461         return (rval);
3462 }
3463
3464 /*
3465  * qla2x00_fabric_dev_login
3466  *      Login fabric target device and update FC port database.
3467  *
3468  * Input:
3469  *      ha:             adapter state pointer.
3470  *      fcport:         port structure list pointer.
3471  *      next_loopid:    contains value of a new loop ID that can be used
3472  *                      by the next login attempt.
3473  *
3474  * Returns:
3475  *      qla2x00 local function return status code.
3476  *
3477  * Context:
3478  *      Kernel context.
3479  */
3480 static int
3481 qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport,
3482     uint16_t *next_loopid)
3483 {
3484         int     rval;
3485         int     retry;
3486         uint8_t opts;
3487         struct qla_hw_data *ha = vha->hw;
3488
3489         rval = QLA_SUCCESS;
3490         retry = 0;
3491
3492         if (IS_ALOGIO_CAPABLE(ha)) {
3493                 if (fcport->flags & FCF_ASYNC_SENT)
3494                         return rval;
3495                 fcport->flags |= FCF_ASYNC_SENT;
3496                 rval = qla2x00_post_async_login_work(vha, fcport, NULL);
3497                 if (!rval)
3498                         return rval;
3499         }
3500
3501         fcport->flags &= ~FCF_ASYNC_SENT;
3502         rval = qla2x00_fabric_login(vha, fcport, next_loopid);
3503         if (rval == QLA_SUCCESS) {
3504                 /* Send an ADISC to FCP2 devices.*/
3505                 opts = 0;
3506                 if (fcport->flags & FCF_FCP2_DEVICE)
3507                         opts |= BIT_1;
3508                 rval = qla2x00_get_port_database(vha, fcport, opts);
3509                 if (rval != QLA_SUCCESS) {
3510                         ha->isp_ops->fabric_logout(vha, fcport->loop_id,
3511                             fcport->d_id.b.domain, fcport->d_id.b.area,
3512                             fcport->d_id.b.al_pa);
3513                         qla2x00_mark_device_lost(vha, fcport, 1, 0);
3514                 } else {
3515                         qla2x00_update_fcport(vha, fcport);
3516                 }
3517         } else {
3518                 /* Retry Login. */
3519                 qla2x00_mark_device_lost(vha, fcport, 1, 0);
3520         }
3521
3522         return (rval);
3523 }
3524
3525 /*
3526  * qla2x00_fabric_login
3527  *      Issue fabric login command.
3528  *
3529  * Input:
3530  *      ha = adapter block pointer.
3531  *      device = pointer to FC device type structure.
3532  *
3533  * Returns:
3534  *      0 - Login successfully
3535  *      1 - Login failed
3536  *      2 - Initiator device
3537  *      3 - Fatal error
3538  */
3539 int
3540 qla2x00_fabric_login(scsi_qla_host_t *vha, fc_port_t *fcport,
3541     uint16_t *next_loopid)
3542 {
3543         int     rval;
3544         int     retry;
3545         uint16_t tmp_loopid;
3546         uint16_t mb[MAILBOX_REGISTER_COUNT];
3547         struct qla_hw_data *ha = vha->hw;
3548
3549         retry = 0;
3550         tmp_loopid = 0;
3551
3552         for (;;) {
3553                 ql_dbg(ql_dbg_disc, vha, 0x2000,
3554                     "Trying Fabric Login w/loop id 0x%04x for port "
3555                     "%02x%02x%02x.\n",
3556                     fcport->loop_id, fcport->d_id.b.domain,
3557                     fcport->d_id.b.area, fcport->d_id.b.al_pa);
3558
3559                 /* Login fcport on switch. */
3560                 rval = ha->isp_ops->fabric_login(vha, fcport->loop_id,
3561                     fcport->d_id.b.domain, fcport->d_id.b.area,
3562                     fcport->d_id.b.al_pa, mb, BIT_0);
3563                 if (rval != QLA_SUCCESS) {
3564                         return rval;
3565                 }
3566                 if (mb[0] == MBS_PORT_ID_USED) {
3567                         /*
3568                          * Device has another loop ID.  The firmware team
3569                          * recommends the driver perform an implicit login with
3570                          * the specified ID again. The ID we just used is save
3571                          * here so we return with an ID that can be tried by
3572                          * the next login.
3573                          */
3574                         retry++;
3575                         tmp_loopid = fcport->loop_id;
3576                         fcport->loop_id = mb[1];
3577
3578                         ql_dbg(ql_dbg_disc, vha, 0x2001,
3579                             "Fabric Login: port in use - next loop "
3580                             "id=0x%04x, port id= %02x%02x%02x.\n",
3581                             fcport->loop_id, fcport->d_id.b.domain,
3582                             fcport->d_id.b.area, fcport->d_id.b.al_pa);
3583
3584                 } else if (mb[0] == MBS_COMMAND_COMPLETE) {
3585                         /*
3586                          * Login succeeded.
3587                          */
3588                         if (retry) {
3589                                 /* A retry occurred before. */
3590                                 *next_loopid = tmp_loopid;
3591                         } else {
3592                                 /*
3593                                  * No retry occurred before. Just increment the
3594                                  * ID value for next login.
3595                                  */
3596                                 *next_loopid = (fcport->loop_id + 1);
3597                         }
3598
3599                         if (mb[1] & BIT_0) {
3600                                 fcport->port_type = FCT_INITIATOR;
3601                         } else {
3602                                 fcport->port_type = FCT_TARGET;
3603                                 if (mb[1] & BIT_1) {
3604                                         fcport->flags |= FCF_FCP2_DEVICE;
3605                                 }
3606                         }
3607
3608                         if (mb[10] & BIT_0)
3609                                 fcport->supported_classes |= FC_COS_CLASS2;
3610                         if (mb[10] & BIT_1)
3611                                 fcport->supported_classes |= FC_COS_CLASS3;
3612
3613                         if (IS_FWI2_CAPABLE(ha)) {
3614                                 if (mb[10] & BIT_7)
3615                                         fcport->flags |=
3616                                             FCF_CONF_COMP_SUPPORTED;
3617                         }
3618
3619                         rval = QLA_SUCCESS;
3620                         break;
3621                 } else if (mb[0] == MBS_LOOP_ID_USED) {
3622                         /*
3623                          * Loop ID already used, try next loop ID.
3624                          */
3625                         fcport->loop_id++;
3626                         rval = qla2x00_find_new_loop_id(vha, fcport);
3627                         if (rval != QLA_SUCCESS) {
3628                                 /* Ran out of loop IDs to use */
3629                                 break;
3630                         }
3631                 } else if (mb[0] == MBS_COMMAND_ERROR) {
3632                         /*
3633                          * Firmware possibly timed out during login. If NO
3634                          * retries are left to do then the device is declared
3635                          * dead.
3636                          */
3637                         *next_loopid = fcport->loop_id;
3638                         ha->isp_ops->fabric_logout(vha, fcport->loop_id,
3639                             fcport->d_id.b.domain, fcport->d_id.b.area,
3640                             fcport->d_id.b.al_pa);
3641                         qla2x00_mark_device_lost(vha, fcport, 1, 0);
3642
3643                         rval = 1;
3644                         break;
3645                 } else {
3646                         /*
3647                          * unrecoverable / not handled error
3648                          */
3649                         ql_dbg(ql_dbg_disc, vha, 0x2002,
3650                             "Failed=%x port_id=%02x%02x%02x loop_id=%x "
3651                             "jiffies=%lx.\n", mb[0], fcport->d_id.b.domain,
3652                             fcport->d_id.b.area, fcport->d_id.b.al_pa,
3653                             fcport->loop_id, jiffies);
3654
3655                         *next_loopid = fcport->loop_id;
3656                         ha->isp_ops->fabric_logout(vha, fcport->loop_id,
3657                             fcport->d_id.b.domain, fcport->d_id.b.area,
3658                             fcport->d_id.b.al_pa);
3659                         qla2x00_clear_loop_id(fcport);
3660                         fcport->login_retry = 0;
3661
3662                         rval = 3;
3663                         break;
3664                 }
3665         }
3666
3667         return (rval);
3668 }
3669
3670 /*
3671  * qla2x00_local_device_login
3672  *      Issue local device login command.
3673  *
3674  * Input:
3675  *      ha = adapter block pointer.
3676  *      loop_id = loop id of device to login to.
3677  *
3678  * Returns (Where's the #define!!!!):
3679  *      0 - Login successfully
3680  *      1 - Login failed
3681  *      3 - Fatal error
3682  */
3683 int
3684 qla2x00_local_device_login(scsi_qla_host_t *vha, fc_port_t *fcport)
3685 {
3686         int             rval;
3687         uint16_t        mb[MAILBOX_REGISTER_COUNT];
3688
3689         memset(mb, 0, sizeof(mb));
3690         rval = qla2x00_login_local_device(vha, fcport, mb, BIT_0);
3691         if (rval == QLA_SUCCESS) {
3692                 /* Interrogate mailbox registers for any errors */
3693                 if (mb[0] == MBS_COMMAND_ERROR)
3694                         rval = 1;
3695                 else if (mb[0] == MBS_COMMAND_PARAMETER_ERROR)
3696                         /* device not in PCB table */
3697                         rval = 3;
3698         }
3699
3700         return (rval);
3701 }
3702
3703 /*
3704  *  qla2x00_loop_resync
3705  *      Resync with fibre channel devices.
3706  *
3707  * Input:
3708  *      ha = adapter block pointer.
3709  *
3710  * Returns:
3711  *      0 = success
3712  */
3713 int
3714 qla2x00_loop_resync(scsi_qla_host_t *vha)
3715 {
3716         int rval = QLA_SUCCESS;
3717         uint32_t wait_time;
3718         struct req_que *req;
3719         struct rsp_que *rsp;
3720
3721         if (vha->hw->flags.cpu_affinity_enabled)
3722                 req = vha->hw->req_q_map[0];
3723         else
3724                 req = vha->req;
3725         rsp = req->rsp;
3726
3727         clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
3728         if (vha->flags.online) {
3729                 if (!(rval = qla2x00_fw_ready(vha))) {
3730                         /* Wait at most MAX_TARGET RSCNs for a stable link. */
3731                         wait_time = 256;
3732                         do {
3733                                 /* Issue a marker after FW becomes ready. */
3734                                 qla2x00_marker(vha, req, rsp, 0, 0,
3735                                         MK_SYNC_ALL);
3736                                 vha->marker_needed = 0;
3737
3738                                 /* Remap devices on Loop. */
3739                                 clear_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
3740
3741                                 qla2x00_configure_loop(vha);
3742                                 wait_time--;
3743                         } while (!atomic_read(&vha->loop_down_timer) &&
3744                                 !(test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
3745                                 && wait_time && (test_bit(LOOP_RESYNC_NEEDED,
3746                                 &vha->dpc_flags)));
3747                 }
3748         }
3749
3750         if (test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
3751                 return (QLA_FUNCTION_FAILED);
3752
3753         if (rval)
3754                 ql_dbg(ql_dbg_disc, vha, 0x206c,
3755                     "%s *** FAILED ***.\n", __func__);
3756
3757         return (rval);
3758 }
3759
3760 /*
3761 * qla2x00_perform_loop_resync
3762 * Description: This function will set the appropriate flags and call
3763 *              qla2x00_loop_resync. If successful loop will be resynced
3764 * Arguments : scsi_qla_host_t pointer
3765 * returm    : Success or Failure
3766 */
3767
3768 int qla2x00_perform_loop_resync(scsi_qla_host_t *ha)
3769 {
3770         int32_t rval = 0;
3771
3772         if (!test_and_set_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags)) {
3773                 /*Configure the flags so that resync happens properly*/
3774                 atomic_set(&ha->loop_down_timer, 0);
3775                 if (!(ha->device_flags & DFLG_NO_CABLE)) {
3776                         atomic_set(&ha->loop_state, LOOP_UP);
3777                         set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
3778                         set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
3779                         set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags);
3780
3781                         rval = qla2x00_loop_resync(ha);
3782                 } else
3783                         atomic_set(&ha->loop_state, LOOP_DEAD);
3784
3785                 clear_bit(LOOP_RESYNC_ACTIVE, &ha->dpc_flags);
3786         }
3787
3788         return rval;
3789 }
3790
3791 void
3792 qla2x00_update_fcports(scsi_qla_host_t *base_vha)
3793 {
3794         fc_port_t *fcport;
3795         struct scsi_qla_host *vha;
3796         struct qla_hw_data *ha = base_vha->hw;
3797         unsigned long flags;
3798
3799         spin_lock_irqsave(&ha->vport_slock, flags);
3800         /* Go with deferred removal of rport references. */
3801         list_for_each_entry(vha, &base_vha->hw->vp_list, list) {
3802                 atomic_inc(&vha->vref_count);
3803                 list_for_each_entry(fcport, &vha->vp_fcports, list) {
3804                         if (fcport->drport &&
3805                             atomic_read(&fcport->state) != FCS_UNCONFIGURED) {
3806                                 spin_unlock_irqrestore(&ha->vport_slock, flags);
3807
3808                                 qla2x00_rport_del(fcport);
3809
3810                                 spin_lock_irqsave(&ha->vport_slock, flags);
3811                         }
3812                 }
3813                 atomic_dec(&vha->vref_count);
3814         }
3815         spin_unlock_irqrestore(&ha->vport_slock, flags);
3816 }
3817
3818 /* Assumes idc_lock always held on entry */
3819 void
3820 qla83xx_reset_ownership(scsi_qla_host_t *vha)
3821 {
3822         struct qla_hw_data *ha = vha->hw;
3823         uint32_t drv_presence, drv_presence_mask;
3824         uint32_t dev_part_info1, dev_part_info2, class_type;
3825         uint32_t class_type_mask = 0x3;
3826         uint16_t fcoe_other_function = 0xffff, i;
3827
3828         qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
3829
3830         qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO1, &dev_part_info1);
3831         qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO2, &dev_part_info2);
3832         for (i = 0; i < 8; i++) {
3833                 class_type = ((dev_part_info1 >> (i * 4)) & class_type_mask);
3834                 if ((class_type == QLA83XX_CLASS_TYPE_FCOE) &&
3835                     (i != ha->portnum)) {
3836                         fcoe_other_function = i;
3837                         break;
3838                 }
3839         }
3840         if (fcoe_other_function == 0xffff) {
3841                 for (i = 0; i < 8; i++) {
3842                         class_type = ((dev_part_info2 >> (i * 4)) &
3843                             class_type_mask);
3844                         if ((class_type == QLA83XX_CLASS_TYPE_FCOE) &&
3845                             ((i + 8) != ha->portnum)) {
3846                                 fcoe_other_function = i + 8;
3847                                 break;
3848                         }
3849                 }
3850         }
3851         /*
3852          * Prepare drv-presence mask based on fcoe functions present.
3853          * However consider only valid physical fcoe function numbers (0-15).
3854          */
3855         drv_presence_mask = ~((1 << (ha->portnum)) |
3856                         ((fcoe_other_function == 0xffff) ?
3857                          0 : (1 << (fcoe_other_function))));
3858
3859         /* We are the reset owner iff:
3860          *    - No other protocol drivers present.
3861          *    - This is the lowest among fcoe functions. */
3862         if (!(drv_presence & drv_presence_mask) &&
3863                         (ha->portnum < fcoe_other_function)) {
3864                 ql_dbg(ql_dbg_p3p, vha, 0xb07f,
3865                     "This host is Reset owner.\n");
3866                 ha->flags.nic_core_reset_owner = 1;
3867         }
3868 }
3869
3870 int
3871 __qla83xx_set_drv_ack(scsi_qla_host_t *vha)
3872 {
3873         int rval = QLA_SUCCESS;
3874         struct qla_hw_data *ha = vha->hw;
3875         uint32_t drv_ack;
3876
3877         rval = qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack);
3878         if (rval == QLA_SUCCESS) {
3879                 drv_ack |= (1 << ha->portnum);
3880                 rval = qla83xx_wr_reg(vha, QLA83XX_IDC_DRIVER_ACK, drv_ack);
3881         }
3882
3883         return rval;
3884 }
3885
3886 int
3887 qla83xx_set_drv_ack(scsi_qla_host_t *vha)
3888 {
3889         int rval = QLA_SUCCESS;
3890
3891         qla83xx_idc_lock(vha, 0);
3892         rval = __qla83xx_set_drv_ack(vha);
3893         qla83xx_idc_unlock(vha, 0);
3894
3895         return rval;
3896 }
3897
3898 int
3899 __qla83xx_clear_drv_ack(scsi_qla_host_t *vha)
3900 {
3901         int rval = QLA_SUCCESS;
3902         struct qla_hw_data *ha = vha->hw;
3903         uint32_t drv_ack;
3904
3905         rval = qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack);
3906         if (rval == QLA_SUCCESS) {
3907                 drv_ack &= ~(1 << ha->portnum);
3908                 rval = qla83xx_wr_reg(vha, QLA83XX_IDC_DRIVER_ACK, drv_ack);
3909         }
3910
3911         return rval;
3912 }
3913
3914 int
3915 qla83xx_clear_drv_ack(scsi_qla_host_t *vha)
3916 {
3917         int rval = QLA_SUCCESS;
3918
3919         qla83xx_idc_lock(vha, 0);
3920         rval = __qla83xx_clear_drv_ack(vha);
3921         qla83xx_idc_unlock(vha, 0);
3922
3923         return rval;
3924 }
3925
3926 const char *
3927 qla83xx_dev_state_to_string(uint32_t dev_state)
3928 {
3929         switch (dev_state) {
3930         case QLA8XXX_DEV_COLD:
3931                 return "COLD/RE-INIT";
3932         case QLA8XXX_DEV_INITIALIZING:
3933                 return "INITIALIZING";
3934         case QLA8XXX_DEV_READY:
3935                 return "READY";
3936         case QLA8XXX_DEV_NEED_RESET:
3937                 return "NEED RESET";
3938         case QLA8XXX_DEV_NEED_QUIESCENT:
3939                 return "NEED QUIESCENT";
3940         case QLA8XXX_DEV_FAILED:
3941                 return "FAILED";
3942         case QLA8XXX_DEV_QUIESCENT:
3943                 return "QUIESCENT";
3944         default:
3945                 return "Unknown";
3946         }
3947 }
3948
3949 /* Assumes idc-lock always held on entry */
3950 void
3951 qla83xx_idc_audit(scsi_qla_host_t *vha, int audit_type)
3952 {
3953         struct qla_hw_data *ha = vha->hw;
3954         uint32_t idc_audit_reg = 0, duration_secs = 0;
3955
3956         switch (audit_type) {
3957         case IDC_AUDIT_TIMESTAMP:
3958                 ha->idc_audit_ts = (jiffies_to_msecs(jiffies) / 1000);
3959                 idc_audit_reg = (ha->portnum) |
3960                     (IDC_AUDIT_TIMESTAMP << 7) | (ha->idc_audit_ts << 8);
3961                 qla83xx_wr_reg(vha, QLA83XX_IDC_AUDIT, idc_audit_reg);
3962                 break;
3963
3964         case IDC_AUDIT_COMPLETION:
3965                 duration_secs = ((jiffies_to_msecs(jiffies) -
3966                     jiffies_to_msecs(ha->idc_audit_ts)) / 1000);
3967                 idc_audit_reg = (ha->portnum) |
3968                     (IDC_AUDIT_COMPLETION << 7) | (duration_secs << 8);
3969                 qla83xx_wr_reg(vha, QLA83XX_IDC_AUDIT, idc_audit_reg);
3970                 break;
3971
3972         default:
3973                 ql_log(ql_log_warn, vha, 0xb078,
3974                     "Invalid audit type specified.\n");
3975                 break;
3976         }
3977 }
3978
3979 /* Assumes idc_lock always held on entry */
3980 int
3981 qla83xx_initiating_reset(scsi_qla_host_t *vha)
3982 {
3983         struct qla_hw_data *ha = vha->hw;
3984         uint32_t  idc_control, dev_state;
3985
3986         __qla83xx_get_idc_control(vha, &idc_control);
3987         if ((idc_control & QLA83XX_IDC_RESET_DISABLED)) {
3988                 ql_log(ql_log_info, vha, 0xb080,
3989                     "NIC Core reset has been disabled. idc-control=0x%x\n",
3990                     idc_control);
3991                 return QLA_FUNCTION_FAILED;
3992         }
3993
3994         /* Set NEED-RESET iff in READY state and we are the reset-owner */
3995         qla83xx_rd_reg(vha, QLA83XX_IDC_DEV_STATE, &dev_state);
3996         if (ha->flags.nic_core_reset_owner && dev_state == QLA8XXX_DEV_READY) {
3997                 qla83xx_wr_reg(vha, QLA83XX_IDC_DEV_STATE,
3998                     QLA8XXX_DEV_NEED_RESET);
3999                 ql_log(ql_log_info, vha, 0xb056, "HW State: NEED RESET.\n");
4000                 qla83xx_idc_audit(vha, IDC_AUDIT_TIMESTAMP);
4001         } else {
4002                 const char *state = qla83xx_dev_state_to_string(dev_state);
4003                 ql_log(ql_log_info, vha, 0xb057, "HW State: %s.\n", state);
4004
4005                 /* SV: XXX: Is timeout required here? */
4006                 /* Wait for IDC state change READY -> NEED_RESET */
4007                 while (dev_state == QLA8XXX_DEV_READY) {
4008                         qla83xx_idc_unlock(vha, 0);
4009                         msleep(200);
4010                         qla83xx_idc_lock(vha, 0);
4011                         qla83xx_rd_reg(vha, QLA83XX_IDC_DEV_STATE, &dev_state);
4012                 }
4013         }
4014
4015         /* Send IDC ack by writing to drv-ack register */
4016         __qla83xx_set_drv_ack(vha);
4017
4018         return QLA_SUCCESS;
4019 }
4020
4021 int
4022 __qla83xx_set_idc_control(scsi_qla_host_t *vha, uint32_t idc_control)
4023 {
4024         return qla83xx_wr_reg(vha, QLA83XX_IDC_CONTROL, idc_control);
4025 }
4026
4027 int
4028 qla83xx_set_idc_control(scsi_qla_host_t *vha, uint32_t idc_control)
4029 {
4030         int rval = QLA_SUCCESS;
4031
4032         qla83xx_idc_lock(vha, 0);
4033         rval = __qla83xx_set_idc_control(vha, idc_control);
4034         qla83xx_idc_unlock(vha, 0);
4035
4036         return rval;
4037 }
4038
4039 int
4040 __qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control)
4041 {
4042         return qla83xx_rd_reg(vha, QLA83XX_IDC_CONTROL, idc_control);
4043 }
4044
4045 int
4046 qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control)
4047 {
4048         int rval = QLA_SUCCESS;
4049
4050         qla83xx_idc_lock(vha, 0);
4051         rval = __qla83xx_get_idc_control(vha, idc_control);
4052         qla83xx_idc_unlock(vha, 0);
4053
4054         return rval;
4055 }
4056
4057 int
4058 qla83xx_check_driver_presence(scsi_qla_host_t *vha)
4059 {
4060         uint32_t drv_presence = 0;
4061         struct qla_hw_data *ha = vha->hw;
4062
4063         qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
4064         if (drv_presence & (1 << ha->portnum))
4065                 return QLA_SUCCESS;
4066         else
4067                 return QLA_TEST_FAILED;
4068 }
4069
4070 int
4071 qla83xx_nic_core_reset(scsi_qla_host_t *vha)
4072 {
4073         int rval = QLA_SUCCESS;
4074         struct qla_hw_data *ha = vha->hw;
4075
4076         ql_dbg(ql_dbg_p3p, vha, 0xb058,
4077             "Entered  %s().\n", __func__);
4078
4079         if (vha->device_flags & DFLG_DEV_FAILED) {
4080                 ql_log(ql_log_warn, vha, 0xb059,
4081                     "Device in unrecoverable FAILED state.\n");
4082                 return QLA_FUNCTION_FAILED;
4083         }
4084
4085         qla83xx_idc_lock(vha, 0);
4086
4087         if (qla83xx_check_driver_presence(vha) != QLA_SUCCESS) {
4088                 ql_log(ql_log_warn, vha, 0xb05a,
4089                     "Function=0x%x has been removed from IDC participation.\n",
4090                     ha->portnum);
4091                 rval = QLA_FUNCTION_FAILED;
4092                 goto exit;
4093         }
4094
4095         qla83xx_reset_ownership(vha);
4096
4097         rval = qla83xx_initiating_reset(vha);
4098
4099         /*
4100          * Perform reset if we are the reset-owner,
4101          * else wait till IDC state changes to READY/FAILED.
4102          */
4103         if (rval == QLA_SUCCESS) {
4104                 rval = qla83xx_idc_state_handler(vha);
4105
4106                 if (rval == QLA_SUCCESS)
4107                         ha->flags.nic_core_hung = 0;
4108                 __qla83xx_clear_drv_ack(vha);
4109         }
4110
4111 exit:
4112         qla83xx_idc_unlock(vha, 0);
4113
4114         ql_dbg(ql_dbg_p3p, vha, 0xb05b, "Exiting %s.\n", __func__);
4115
4116         return rval;
4117 }
4118
4119 int
4120 qla2xxx_mctp_dump(scsi_qla_host_t *vha)
4121 {
4122         struct qla_hw_data *ha = vha->hw;
4123         int rval = QLA_FUNCTION_FAILED;
4124
4125         if (!IS_MCTP_CAPABLE(ha)) {
4126                 /* This message can be removed from the final version */
4127                 ql_log(ql_log_info, vha, 0x506d,
4128                     "This board is not MCTP capable\n");
4129                 return rval;
4130         }
4131
4132         if (!ha->mctp_dump) {
4133                 ha->mctp_dump = dma_alloc_coherent(&ha->pdev->dev,
4134                     MCTP_DUMP_SIZE, &ha->mctp_dump_dma, GFP_KERNEL);
4135
4136                 if (!ha->mctp_dump) {
4137                         ql_log(ql_log_warn, vha, 0x506e,
4138                             "Failed to allocate memory for mctp dump\n");
4139                         return rval;
4140                 }
4141         }
4142
4143 #define MCTP_DUMP_STR_ADDR      0x00000000
4144         rval = qla2x00_dump_mctp_data(vha, ha->mctp_dump_dma,
4145             MCTP_DUMP_STR_ADDR, MCTP_DUMP_SIZE/4);
4146         if (rval != QLA_SUCCESS) {
4147                 ql_log(ql_log_warn, vha, 0x506f,
4148                     "Failed to capture mctp dump\n");
4149         } else {
4150                 ql_log(ql_log_info, vha, 0x5070,
4151                     "Mctp dump capture for host (%ld/%p).\n",
4152                     vha->host_no, ha->mctp_dump);
4153                 ha->mctp_dumped = 1;
4154         }
4155
4156         if (!ha->flags.nic_core_reset_hdlr_active && !ha->portnum) {
4157                 ha->flags.nic_core_reset_hdlr_active = 1;
4158                 rval = qla83xx_restart_nic_firmware(vha);
4159                 if (rval)
4160                         /* NIC Core reset failed. */
4161                         ql_log(ql_log_warn, vha, 0x5071,
4162                             "Failed to restart nic firmware\n");
4163                 else
4164                         ql_dbg(ql_dbg_p3p, vha, 0xb084,
4165                             "Restarted NIC firmware successfully.\n");
4166                 ha->flags.nic_core_reset_hdlr_active = 0;
4167         }
4168
4169         return rval;
4170
4171 }
4172
4173 /*
4174 * qla2x00_quiesce_io
4175 * Description: This function will block the new I/Os
4176 *              Its not aborting any I/Os as context
4177 *              is not destroyed during quiescence
4178 * Arguments: scsi_qla_host_t
4179 * return   : void
4180 */
4181 void
4182 qla2x00_quiesce_io(scsi_qla_host_t *vha)
4183 {
4184         struct qla_hw_data *ha = vha->hw;
4185         struct scsi_qla_host *vp;
4186
4187         ql_dbg(ql_dbg_dpc, vha, 0x401d,
4188             "Quiescing I/O - ha=%p.\n", ha);
4189
4190         atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
4191         if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
4192                 atomic_set(&vha->loop_state, LOOP_DOWN);
4193                 qla2x00_mark_all_devices_lost(vha, 0);
4194                 list_for_each_entry(vp, &ha->vp_list, list)
4195                         qla2x00_mark_all_devices_lost(vp, 0);
4196         } else {
4197                 if (!atomic_read(&vha->loop_down_timer))
4198                         atomic_set(&vha->loop_down_timer,
4199                                         LOOP_DOWN_TIME);
4200         }
4201         /* Wait for pending cmds to complete */
4202         qla2x00_eh_wait_for_pending_commands(vha, 0, 0, WAIT_HOST);
4203 }
4204
4205 void
4206 qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
4207 {
4208         struct qla_hw_data *ha = vha->hw;
4209         struct scsi_qla_host *vp;
4210         unsigned long flags;
4211         fc_port_t *fcport;
4212
4213         /* For ISP82XX, driver waits for completion of the commands.
4214          * online flag should be set.
4215          */
4216         if (!IS_QLA82XX(ha))
4217                 vha->flags.online = 0;
4218         ha->flags.chip_reset_done = 0;
4219         clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
4220         vha->qla_stats.total_isp_aborts++;
4221
4222         ql_log(ql_log_info, vha, 0x00af,
4223             "Performing ISP error recovery - ha=%p.\n", ha);
4224
4225         /* For ISP82XX, reset_chip is just disabling interrupts.
4226          * Driver waits for the completion of the commands.
4227          * the interrupts need to be enabled.
4228          */
4229         if (!IS_QLA82XX(ha))
4230                 ha->isp_ops->reset_chip(vha);
4231
4232         atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
4233         if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
4234                 atomic_set(&vha->loop_state, LOOP_DOWN);
4235                 qla2x00_mark_all_devices_lost(vha, 0);
4236
4237                 spin_lock_irqsave(&ha->vport_slock, flags);
4238                 list_for_each_entry(vp, &ha->vp_list, list) {
4239                         atomic_inc(&vp->vref_count);
4240                         spin_unlock_irqrestore(&ha->vport_slock, flags);
4241
4242                         qla2x00_mark_all_devices_lost(vp, 0);
4243
4244                         spin_lock_irqsave(&ha->vport_slock, flags);
4245                         atomic_dec(&vp->vref_count);
4246                 }
4247                 spin_unlock_irqrestore(&ha->vport_slock, flags);
4248         } else {
4249                 if (!atomic_read(&vha->loop_down_timer))
4250                         atomic_set(&vha->loop_down_timer,
4251                             LOOP_DOWN_TIME);
4252         }
4253
4254         /* Clear all async request states across all VPs. */
4255         list_for_each_entry(fcport, &vha->vp_fcports, list)
4256                 fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
4257         spin_lock_irqsave(&ha->vport_slock, flags);
4258         list_for_each_entry(vp, &ha->vp_list, list) {
4259                 atomic_inc(&vp->vref_count);
4260                 spin_unlock_irqrestore(&ha->vport_slock, flags);
4261
4262                 list_for_each_entry(fcport, &vp->vp_fcports, list)
4263                         fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);
4264
4265                 spin_lock_irqsave(&ha->vport_slock, flags);
4266                 atomic_dec(&vp->vref_count);
4267         }
4268         spin_unlock_irqrestore(&ha->vport_slock, flags);
4269
4270         if (!ha->flags.eeh_busy) {
4271                 /* Make sure for ISP 82XX IO DMA is complete */
4272                 if (IS_QLA82XX(ha)) {
4273                         qla82xx_chip_reset_cleanup(vha);
4274                         ql_log(ql_log_info, vha, 0x00b4,
4275                             "Done chip reset cleanup.\n");
4276
4277                         /* Done waiting for pending commands.
4278                          * Reset the online flag.
4279                          */
4280                         vha->flags.online = 0;
4281                 }
4282
4283                 /* Requeue all commands in outstanding command list. */
4284                 qla2x00_abort_all_cmds(vha, DID_RESET << 16);
4285         }
4286 }
4287
4288 /*
4289 *  qla2x00_abort_isp
4290 *      Resets ISP and aborts all outstanding commands.
4291 *
4292 * Input:
4293 *      ha           = adapter block pointer.
4294 *
4295 * Returns:
4296 *      0 = success
4297 */
4298 int
4299 qla2x00_abort_isp(scsi_qla_host_t *vha)
4300 {
4301         int rval;
4302         uint8_t        status = 0;
4303         struct qla_hw_data *ha = vha->hw;
4304         struct scsi_qla_host *vp;
4305         struct req_que *req = ha->req_q_map[0];
4306         unsigned long flags;
4307
4308         if (vha->flags.online) {
4309                 qla2x00_abort_isp_cleanup(vha);
4310
4311                 if (IS_QLA8031(ha)) {
4312                         ql_dbg(ql_dbg_p3p, vha, 0xb05c,
4313                             "Clearing fcoe driver presence.\n");
4314                         if (qla83xx_clear_drv_presence(vha) != QLA_SUCCESS)
4315                                 ql_dbg(ql_dbg_p3p, vha, 0xb073,
4316                                     "Error while clearing DRV-Presence.\n");
4317                 }
4318
4319                 if (unlikely(pci_channel_offline(ha->pdev) &&
4320                     ha->flags.pci_channel_io_perm_failure)) {
4321                         clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
4322                         status = 0;
4323                         return status;
4324                 }
4325
4326                 ha->isp_ops->get_flash_version(vha, req->ring);
4327
4328                 ha->isp_ops->nvram_config(vha);
4329
4330                 if (!qla2x00_restart_isp(vha)) {
4331                         clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
4332
4333                         if (!atomic_read(&vha->loop_down_timer)) {
4334                                 /*
4335                                  * Issue marker command only when we are going
4336                                  * to start the I/O .
4337                                  */
4338                                 vha->marker_needed = 1;
4339                         }
4340
4341                         vha->flags.online = 1;
4342
4343                         ha->isp_ops->enable_intrs(ha);
4344
4345                         ha->isp_abort_cnt = 0;
4346                         clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
4347
4348                         if (IS_QLA81XX(ha) || IS_QLA8031(ha))
4349                                 qla2x00_get_fw_version(vha);
4350                         if (ha->fce) {
4351                                 ha->flags.fce_enabled = 1;
4352                                 memset(ha->fce, 0,
4353                                     fce_calc_size(ha->fce_bufs));
4354                                 rval = qla2x00_enable_fce_trace(vha,
4355                                     ha->fce_dma, ha->fce_bufs, ha->fce_mb,
4356                                     &ha->fce_bufs);
4357                                 if (rval) {
4358                                         ql_log(ql_log_warn, vha, 0x8033,
4359                                             "Unable to reinitialize FCE "
4360                                             "(%d).\n", rval);
4361                                         ha->flags.fce_enabled = 0;
4362                                 }
4363                         }
4364
4365                         if (ha->eft) {
4366                                 memset(ha->eft, 0, EFT_SIZE);
4367                                 rval = qla2x00_enable_eft_trace(vha,
4368                                     ha->eft_dma, EFT_NUM_BUFFERS);
4369                                 if (rval) {
4370                                         ql_log(ql_log_warn, vha, 0x8034,
4371                                             "Unable to reinitialize EFT "
4372                                             "(%d).\n", rval);
4373                                 }
4374                         }
4375                 } else {        /* failed the ISP abort */
4376                         vha->flags.online = 1;
4377                         if (test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
4378                                 if (ha->isp_abort_cnt == 0) {
4379                                         ql_log(ql_log_fatal, vha, 0x8035,
4380                                             "ISP error recover failed - "
4381                                             "board disabled.\n");
4382                                         /*
4383                                          * The next call disables the board
4384                                          * completely.
4385                                          */
4386                                         ha->isp_ops->reset_adapter(vha);
4387                                         vha->flags.online = 0;
4388                                         clear_bit(ISP_ABORT_RETRY,
4389                                             &vha->dpc_flags);
4390                                         status = 0;
4391                                 } else { /* schedule another ISP abort */
4392                                         ha->isp_abort_cnt--;
4393                                         ql_dbg(ql_dbg_taskm, vha, 0x8020,
4394                                             "ISP abort - retry remaining %d.\n",
4395                                             ha->isp_abort_cnt);
4396                                         status = 1;
4397                                 }
4398                         } else {
4399                                 ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT;
4400                                 ql_dbg(ql_dbg_taskm, vha, 0x8021,
4401                                     "ISP error recovery - retrying (%d) "
4402                                     "more times.\n", ha->isp_abort_cnt);
4403                                 set_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
4404                                 status = 1;
4405                         }
4406                 }
4407
4408         }
4409
4410         if (!status) {
4411                 ql_dbg(ql_dbg_taskm, vha, 0x8022, "%s succeeded.\n", __func__);
4412
4413                 spin_lock_irqsave(&ha->vport_slock, flags);
4414                 list_for_each_entry(vp, &ha->vp_list, list) {
4415                         if (vp->vp_idx) {
4416                                 atomic_inc(&vp->vref_count);
4417                                 spin_unlock_irqrestore(&ha->vport_slock, flags);
4418
4419                                 qla2x00_vp_abort_isp(vp);
4420
4421                                 spin_lock_irqsave(&ha->vport_slock, flags);
4422                                 atomic_dec(&vp->vref_count);
4423                         }
4424                 }
4425                 spin_unlock_irqrestore(&ha->vport_slock, flags);
4426
4427                 if (IS_QLA8031(ha)) {
4428                         ql_dbg(ql_dbg_p3p, vha, 0xb05d,
4429                             "Setting back fcoe driver presence.\n");
4430                         if (qla83xx_set_drv_presence(vha) != QLA_SUCCESS)
4431                                 ql_dbg(ql_dbg_p3p, vha, 0xb074,
4432                                     "Error while setting DRV-Presence.\n");
4433                 }
4434         } else {
4435                 ql_log(ql_log_warn, vha, 0x8023, "%s **** FAILED ****.\n",
4436                        __func__);
4437         }
4438
4439         return(status);
4440 }
4441
4442 /*
4443 *  qla2x00_restart_isp
4444 *      restarts the ISP after a reset
4445 *
4446 * Input:
4447 *      ha = adapter block pointer.
4448 *
4449 * Returns:
4450 *      0 = success
4451 */
4452 static int
4453 qla2x00_restart_isp(scsi_qla_host_t *vha)
4454 {
4455         int status = 0;
4456         uint32_t wait_time;
4457         struct qla_hw_data *ha = vha->hw;
4458         struct req_que *req = ha->req_q_map[0];
4459         struct rsp_que *rsp = ha->rsp_q_map[0];
4460         unsigned long flags;
4461
4462         /* If firmware needs to be loaded */
4463         if (qla2x00_isp_firmware(vha)) {
4464                 vha->flags.online = 0;
4465                 status = ha->isp_ops->chip_diag(vha);
4466                 if (!status)
4467                         status = qla2x00_setup_chip(vha);
4468         }
4469
4470         if (!status && !(status = qla2x00_init_rings(vha))) {
4471                 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
4472                 ha->flags.chip_reset_done = 1;
4473                 /* Initialize the queues in use */
4474                 qla25xx_init_queues(ha);
4475
4476                 status = qla2x00_fw_ready(vha);
4477                 if (!status) {
4478                         ql_dbg(ql_dbg_taskm, vha, 0x8031,
4479                             "Start configure loop status = %d.\n", status);
4480
4481                         /* Issue a marker after FW becomes ready. */
4482                         qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
4483
4484                         vha->flags.online = 1;
4485
4486                         /*
4487                          * Process any ATIO queue entries that came in
4488                          * while we weren't online.
4489                          */
4490                         spin_lock_irqsave(&ha->hardware_lock, flags);
4491                         if (qla_tgt_mode_enabled(vha))
4492                                 qlt_24xx_process_atio_queue(vha);
4493                         spin_unlock_irqrestore(&ha->hardware_lock, flags);
4494
4495                         /* Wait at most MAX_TARGET RSCNs for a stable link. */
4496                         wait_time = 256;
4497                         do {
4498                                 clear_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
4499                                 qla2x00_configure_loop(vha);
4500                                 wait_time--;
4501                         } while (!atomic_read(&vha->loop_down_timer) &&
4502                                 !(test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags))
4503                                 && wait_time && (test_bit(LOOP_RESYNC_NEEDED,
4504                                 &vha->dpc_flags)));
4505                 }
4506
4507                 /* if no cable then assume it's good */
4508                 if ((vha->device_flags & DFLG_NO_CABLE))
4509                         status = 0;
4510
4511                 ql_dbg(ql_dbg_taskm, vha, 0x8032,
4512                     "Configure loop done, status = 0x%x.\n", status);
4513         }
4514         return (status);
4515 }
4516
4517 static int
4518 qla25xx_init_queues(struct qla_hw_data *ha)
4519 {
4520         struct rsp_que *rsp = NULL;
4521         struct req_que *req = NULL;
4522         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
4523         int ret = -1;
4524         int i;
4525
4526         for (i = 1; i < ha->max_rsp_queues; i++) {
4527                 rsp = ha->rsp_q_map[i];
4528                 if (rsp) {
4529                         rsp->options &= ~BIT_0;
4530                         ret = qla25xx_init_rsp_que(base_vha, rsp);
4531                         if (ret != QLA_SUCCESS)
4532                                 ql_dbg(ql_dbg_init, base_vha, 0x00ff,
4533                                     "%s Rsp que: %d init failed.\n",
4534                                     __func__, rsp->id);
4535                         else
4536                                 ql_dbg(ql_dbg_init, base_vha, 0x0100,
4537                                     "%s Rsp que: %d inited.\n",
4538                                     __func__, rsp->id);
4539                 }
4540         }
4541         for (i = 1; i < ha->max_req_queues; i++) {
4542                 req = ha->req_q_map[i];
4543                 if (req) {
4544                 /* Clear outstanding commands array. */
4545                         req->options &= ~BIT_0;
4546                         ret = qla25xx_init_req_que(base_vha, req);
4547                         if (ret != QLA_SUCCESS)
4548                                 ql_dbg(ql_dbg_init, base_vha, 0x0101,
4549                                     "%s Req que: %d init failed.\n",
4550                                     __func__, req->id);
4551                         else
4552                                 ql_dbg(ql_dbg_init, base_vha, 0x0102,
4553                                     "%s Req que: %d inited.\n",
4554                                     __func__, req->id);
4555                 }
4556         }
4557         return ret;
4558 }
4559
4560 /*
4561 * qla2x00_reset_adapter
4562 *      Reset adapter.
4563 *
4564 * Input:
4565 *      ha = adapter block pointer.
4566 */
4567 void
4568 qla2x00_reset_adapter(scsi_qla_host_t *vha)
4569 {
4570         unsigned long flags = 0;
4571         struct qla_hw_data *ha = vha->hw;
4572         struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
4573
4574         vha->flags.online = 0;
4575         ha->isp_ops->disable_intrs(ha);
4576
4577         spin_lock_irqsave(&ha->hardware_lock, flags);
4578         WRT_REG_WORD(&reg->hccr, HCCR_RESET_RISC);
4579         RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
4580         WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
4581         RD_REG_WORD(&reg->hccr);                        /* PCI Posting. */
4582         spin_unlock_irqrestore(&ha->hardware_lock, flags);
4583 }
4584
4585 void
4586 qla24xx_reset_adapter(scsi_qla_host_t *vha)
4587 {
4588         unsigned long flags = 0;
4589         struct qla_hw_data *ha = vha->hw;
4590         struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
4591
4592         if (IS_QLA82XX(ha))
4593                 return;
4594
4595         vha->flags.online = 0;
4596         ha->isp_ops->disable_intrs(ha);
4597
4598         spin_lock_irqsave(&ha->hardware_lock, flags);
4599         WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET);
4600         RD_REG_DWORD(&reg->hccr);
4601         WRT_REG_DWORD(&reg->hccr, HCCRX_REL_RISC_PAUSE);
4602         RD_REG_DWORD(&reg->hccr);
4603         spin_unlock_irqrestore(&ha->hardware_lock, flags);
4604
4605         if (IS_NOPOLLING_TYPE(ha))
4606                 ha->isp_ops->enable_intrs(ha);
4607 }
4608
4609 /* On sparc systems, obtain port and node WWN from firmware
4610  * properties.
4611  */
4612 static void qla24xx_nvram_wwn_from_ofw(scsi_qla_host_t *vha,
4613         struct nvram_24xx *nv)
4614 {
4615 #ifdef CONFIG_SPARC
4616         struct qla_hw_data *ha = vha->hw;
4617         struct pci_dev *pdev = ha->pdev;
4618         struct device_node *dp = pci_device_to_OF_node(pdev);
4619         const u8 *val;
4620         int len;
4621
4622         val = of_get_property(dp, "port-wwn", &len);
4623         if (val && len >= WWN_SIZE)
4624                 memcpy(nv->port_name, val, WWN_SIZE);
4625
4626         val = of_get_property(dp, "node-wwn", &len);
4627         if (val && len >= WWN_SIZE)
4628                 memcpy(nv->node_name, val, WWN_SIZE);
4629 #endif
4630 }
4631
4632 int
4633 qla24xx_nvram_config(scsi_qla_host_t *vha)
4634 {
4635         int   rval;
4636         struct init_cb_24xx *icb;
4637         struct nvram_24xx *nv;
4638         uint32_t *dptr;
4639         uint8_t  *dptr1, *dptr2;
4640         uint32_t chksum;
4641         uint16_t cnt;
4642         struct qla_hw_data *ha = vha->hw;
4643
4644         rval = QLA_SUCCESS;
4645         icb = (struct init_cb_24xx *)ha->init_cb;
4646         nv = ha->nvram;
4647
4648         /* Determine NVRAM starting address. */
4649         if (ha->flags.port0) {
4650                 ha->nvram_base = FA_NVRAM_FUNC0_ADDR;
4651                 ha->vpd_base = FA_NVRAM_VPD0_ADDR;
4652         } else {
4653                 ha->nvram_base = FA_NVRAM_FUNC1_ADDR;
4654                 ha->vpd_base = FA_NVRAM_VPD1_ADDR;
4655         }
4656         ha->nvram_size = sizeof(struct nvram_24xx);
4657         ha->vpd_size = FA_NVRAM_VPD_SIZE;
4658         if (IS_QLA82XX(ha))
4659                 ha->vpd_size = FA_VPD_SIZE_82XX;
4660
4661         /* Get VPD data into cache */
4662         ha->vpd = ha->nvram + VPD_OFFSET;
4663         ha->isp_ops->read_nvram(vha, (uint8_t *)ha->vpd,
4664             ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4);
4665
4666         /* Get NVRAM data into cache and calculate checksum. */
4667         dptr = (uint32_t *)nv;
4668         ha->isp_ops->read_nvram(vha, (uint8_t *)dptr, ha->nvram_base,
4669             ha->nvram_size);
4670         for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++)
4671                 chksum += le32_to_cpu(*dptr++);
4672
4673         ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x006a,
4674             "Contents of NVRAM\n");
4675         ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x010d,
4676             (uint8_t *)nv, ha->nvram_size);
4677
4678         /* Bad NVRAM data, set defaults parameters. */
4679         if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P'
4680             || nv->id[3] != ' ' ||
4681             nv->nvram_version < __constant_cpu_to_le16(ICB_VERSION)) {
4682                 /* Reset NVRAM data. */
4683                 ql_log(ql_log_warn, vha, 0x006b,
4684                     "Inconsistent NVRAM detected: checksum=0x%x id=%c "
4685                     "version=0x%x.\n", chksum, nv->id[0], nv->nvram_version);
4686                 ql_log(ql_log_warn, vha, 0x006c,
4687                     "Falling back to functioning (yet invalid -- WWPN) "
4688                     "defaults.\n");
4689
4690                 /*
4691                  * Set default initialization control block.
4692                  */
4693                 memset(nv, 0, ha->nvram_size);
4694                 nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
4695                 nv->version = __constant_cpu_to_le16(ICB_VERSION);
4696                 nv->frame_payload_size = __constant_cpu_to_le16(2048);
4697                 nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
4698                 nv->exchange_count = __constant_cpu_to_le16(0);
4699                 nv->hard_address = __constant_cpu_to_le16(124);
4700                 nv->port_name[0] = 0x21;
4701                 nv->port_name[1] = 0x00 + ha->port_no;
4702                 nv->port_name[2] = 0x00;
4703                 nv->port_name[3] = 0xe0;
4704                 nv->port_name[4] = 0x8b;
4705                 nv->port_name[5] = 0x1c;
4706                 nv->port_name[6] = 0x55;
4707                 nv->port_name[7] = 0x86;
4708                 nv->node_name[0] = 0x20;
4709                 nv->node_name[1] = 0x00;
4710                 nv->node_name[2] = 0x00;
4711                 nv->node_name[3] = 0xe0;
4712                 nv->node_name[4] = 0x8b;
4713                 nv->node_name[5] = 0x1c;
4714                 nv->node_name[6] = 0x55;
4715                 nv->node_name[7] = 0x86;
4716                 qla24xx_nvram_wwn_from_ofw(vha, nv);
4717                 nv->login_retry_count = __constant_cpu_to_le16(8);
4718                 nv->interrupt_delay_timer = __constant_cpu_to_le16(0);
4719                 nv->login_timeout = __constant_cpu_to_le16(0);
4720                 nv->firmware_options_1 =
4721                     __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1);
4722                 nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4);
4723                 nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12);
4724                 nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13);
4725                 nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10);
4726                 nv->efi_parameters = __constant_cpu_to_le32(0);
4727                 nv->reset_delay = 5;
4728                 nv->max_luns_per_target = __constant_cpu_to_le16(128);
4729                 nv->port_down_retry_count = __constant_cpu_to_le16(30);
4730                 nv->link_down_timeout = __constant_cpu_to_le16(30);
4731
4732                 rval = 1;
4733         }
4734
4735         if (!qla_ini_mode_enabled(vha)) {
4736                 /* Don't enable full login after initial LIP */
4737                 nv->firmware_options_1 &= __constant_cpu_to_le32(~BIT_13);
4738                 /* Don't enable LIP full login for initiator */
4739                 nv->host_p &= __constant_cpu_to_le32(~BIT_10);
4740         }
4741
4742         qlt_24xx_config_nvram_stage1(vha, nv);
4743
4744         /* Reset Initialization control block */
4745         memset(icb, 0, ha->init_cb_size);
4746
4747         /* Copy 1st segment. */
4748         dptr1 = (uint8_t *)icb;
4749         dptr2 = (uint8_t *)&nv->version;
4750         cnt = (uint8_t *)&icb->response_q_inpointer - (uint8_t *)&icb->version;
4751         while (cnt--)
4752                 *dptr1++ = *dptr2++;
4753
4754         icb->login_retry_count = nv->login_retry_count;
4755         icb->link_down_on_nos = nv->link_down_on_nos;
4756
4757         /* Copy 2nd segment. */
4758         dptr1 = (uint8_t *)&icb->interrupt_delay_timer;
4759         dptr2 = (uint8_t *)&nv->interrupt_delay_timer;
4760         cnt = (uint8_t *)&icb->reserved_3 -
4761             (uint8_t *)&icb->interrupt_delay_timer;
4762         while (cnt--)
4763                 *dptr1++ = *dptr2++;
4764
4765         /*
4766          * Setup driver NVRAM options.
4767          */
4768         qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name),
4769             "QLA2462");
4770
4771         qlt_24xx_config_nvram_stage2(vha, icb);
4772
4773         if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
4774                 /* Use alternate WWN? */
4775                 memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
4776                 memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
4777         }
4778
4779         /* Prepare nodename */
4780         if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) {
4781                 /*
4782                  * Firmware will apply the following mask if the nodename was
4783                  * not provided.
4784                  */
4785                 memcpy(icb->node_name, icb->port_name, WWN_SIZE);
4786                 icb->node_name[0] &= 0xF0;
4787         }
4788
4789         /* Set host adapter parameters. */
4790         ha->flags.disable_risc_code_load = 0;
4791         ha->flags.enable_lip_reset = 0;
4792         ha->flags.enable_lip_full_login =
4793             le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0;
4794         ha->flags.enable_target_reset =
4795             le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0;
4796         ha->flags.enable_led_scheme = 0;
4797         ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0;
4798
4799         ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) &
4800             (BIT_6 | BIT_5 | BIT_4)) >> 4;
4801
4802         memcpy(ha->fw_seriallink_options24, nv->seriallink_options,
4803             sizeof(ha->fw_seriallink_options24));
4804
4805         /* save HBA serial number */
4806         ha->serial0 = icb->port_name[5];
4807         ha->serial1 = icb->port_name[6];
4808         ha->serial2 = icb->port_name[7];
4809         memcpy(vha->node_name, icb->node_name, WWN_SIZE);
4810         memcpy(vha->port_name, icb->port_name, WWN_SIZE);
4811
4812         icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
4813
4814         ha->retry_count = le16_to_cpu(nv->login_retry_count);
4815
4816         /* Set minimum login_timeout to 4 seconds. */
4817         if (le16_to_cpu(nv->login_timeout) < ql2xlogintimeout)
4818                 nv->login_timeout = cpu_to_le16(ql2xlogintimeout);
4819         if (le16_to_cpu(nv->login_timeout) < 4)
4820                 nv->login_timeout = __constant_cpu_to_le16(4);
4821         ha->login_timeout = le16_to_cpu(nv->login_timeout);
4822         icb->login_timeout = nv->login_timeout;
4823
4824         /* Set minimum RATOV to 100 tenths of a second. */
4825         ha->r_a_tov = 100;
4826
4827         ha->loop_reset_delay = nv->reset_delay;
4828
4829         /* Link Down Timeout = 0:
4830          *
4831          *      When Port Down timer expires we will start returning
4832          *      I/O's to OS with "DID_NO_CONNECT".
4833          *
4834          * Link Down Timeout != 0:
4835          *
4836          *       The driver waits for the link to come up after link down
4837          *       before returning I/Os to OS with "DID_NO_CONNECT".
4838          */
4839         if (le16_to_cpu(nv->link_down_timeout) == 0) {
4840                 ha->loop_down_abort_time =
4841                     (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
4842         } else {
4843                 ha->link_down_timeout = le16_to_cpu(nv->link_down_timeout);
4844                 ha->loop_down_abort_time =
4845                     (LOOP_DOWN_TIME - ha->link_down_timeout);
4846         }
4847
4848         /* Need enough time to try and get the port back. */
4849         ha->port_down_retry_count = le16_to_cpu(nv->port_down_retry_count);
4850         if (qlport_down_retry)
4851                 ha->port_down_retry_count = qlport_down_retry;
4852
4853         /* Set login_retry_count */
4854         ha->login_retry_count  = le16_to_cpu(nv->login_retry_count);
4855         if (ha->port_down_retry_count ==
4856             le16_to_cpu(nv->port_down_retry_count) &&
4857             ha->port_down_retry_count > 3)
4858                 ha->login_retry_count = ha->port_down_retry_count;
4859         else if (ha->port_down_retry_count > (int)ha->login_retry_count)
4860                 ha->login_retry_count = ha->port_down_retry_count;
4861         if (ql2xloginretrycount)
4862                 ha->login_retry_count = ql2xloginretrycount;
4863
4864         /* Enable ZIO. */
4865         if (!vha->flags.init_done) {
4866                 ha->zio_mode = le32_to_cpu(icb->firmware_options_2) &
4867                     (BIT_3 | BIT_2 | BIT_1 | BIT_0);
4868                 ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ?
4869                     le16_to_cpu(icb->interrupt_delay_timer): 2;
4870         }
4871         icb->firmware_options_2 &= __constant_cpu_to_le32(
4872             ~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
4873         vha->flags.process_response_queue = 0;
4874         if (ha->zio_mode != QLA_ZIO_DISABLED) {
4875                 ha->zio_mode = QLA_ZIO_MODE_6;
4876
4877                 ql_log(ql_log_info, vha, 0x006f,
4878                     "ZIO mode %d enabled; timer delay (%d us).\n",
4879                     ha->zio_mode, ha->zio_timer * 100);
4880
4881                 icb->firmware_options_2 |= cpu_to_le32(
4882                     (uint32_t)ha->zio_mode);
4883                 icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer);
4884                 vha->flags.process_response_queue = 1;
4885         }
4886
4887         if (rval) {
4888                 ql_log(ql_log_warn, vha, 0x0070,
4889                     "NVRAM configuration failed.\n");
4890         }
4891         return (rval);
4892 }
4893
4894 static int
4895 qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr,
4896     uint32_t faddr)
4897 {
4898         int     rval = QLA_SUCCESS;
4899         int     segments, fragment;
4900         uint32_t *dcode, dlen;
4901         uint32_t risc_addr;
4902         uint32_t risc_size;
4903         uint32_t i;
4904         struct qla_hw_data *ha = vha->hw;
4905         struct req_que *req = ha->req_q_map[0];
4906
4907         ql_dbg(ql_dbg_init, vha, 0x008b,
4908             "FW: Loading firmware from flash (%x).\n", faddr);
4909
4910         rval = QLA_SUCCESS;
4911
4912         segments = FA_RISC_CODE_SEGMENTS;
4913         dcode = (uint32_t *)req->ring;
4914         *srisc_addr = 0;
4915
4916         /* Validate firmware image by checking version. */
4917         qla24xx_read_flash_data(vha, dcode, faddr + 4, 4);
4918         for (i = 0; i < 4; i++)
4919                 dcode[i] = be32_to_cpu(dcode[i]);
4920         if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
4921             dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
4922             (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
4923                 dcode[3] == 0)) {
4924                 ql_log(ql_log_fatal, vha, 0x008c,
4925                     "Unable to verify the integrity of flash firmware "
4926                     "image.\n");
4927                 ql_log(ql_log_fatal, vha, 0x008d,
4928                     "Firmware data: %08x %08x %08x %08x.\n",
4929                     dcode[0], dcode[1], dcode[2], dcode[3]);
4930
4931                 return QLA_FUNCTION_FAILED;
4932         }
4933
4934         while (segments && rval == QLA_SUCCESS) {
4935                 /* Read segment's load information. */
4936                 qla24xx_read_flash_data(vha, dcode, faddr, 4);
4937
4938                 risc_addr = be32_to_cpu(dcode[2]);
4939                 *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
4940                 risc_size = be32_to_cpu(dcode[3]);
4941
4942                 fragment = 0;
4943                 while (risc_size > 0 && rval == QLA_SUCCESS) {
4944                         dlen = (uint32_t)(ha->fw_transfer_size >> 2);
4945                         if (dlen > risc_size)
4946                                 dlen = risc_size;
4947
4948                         ql_dbg(ql_dbg_init, vha, 0x008e,
4949                             "Loading risc segment@ risc addr %x "
4950                             "number of dwords 0x%x offset 0x%x.\n",
4951                             risc_addr, dlen, faddr);
4952
4953                         qla24xx_read_flash_data(vha, dcode, faddr, dlen);
4954                         for (i = 0; i < dlen; i++)
4955                                 dcode[i] = swab32(dcode[i]);
4956
4957                         rval = qla2x00_load_ram(vha, req->dma, risc_addr,
4958                             dlen);
4959                         if (rval) {
4960                                 ql_log(ql_log_fatal, vha, 0x008f,
4961                                     "Failed to load segment %d of firmware.\n",
4962                                     fragment);
4963                                 break;
4964                         }
4965
4966                         faddr += dlen;
4967                         risc_addr += dlen;
4968                         risc_size -= dlen;
4969                         fragment++;
4970                 }
4971
4972                 /* Next segment. */
4973                 segments--;
4974         }
4975
4976         return rval;
4977 }
4978
4979 #define QLA_FW_URL "ftp://ftp.qlogic.com/outgoing/linux/firmware/"
4980
4981 int
4982 qla2x00_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
4983 {
4984         int     rval;
4985         int     i, fragment;
4986         uint16_t *wcode, *fwcode;
4987         uint32_t risc_addr, risc_size, fwclen, wlen, *seg;
4988         struct fw_blob *blob;
4989         struct qla_hw_data *ha = vha->hw;
4990         struct req_que *req = ha->req_q_map[0];
4991
4992         /* Load firmware blob. */
4993         blob = qla2x00_request_firmware(vha);
4994         if (!blob) {
4995                 ql_log(ql_log_info, vha, 0x0083,
4996                     "Fimware image unavailable.\n");
4997                 ql_log(ql_log_info, vha, 0x0084,
4998                     "Firmware images can be retrieved from: "QLA_FW_URL ".\n");
4999                 return QLA_FUNCTION_FAILED;
5000         }
5001
5002         rval = QLA_SUCCESS;
5003
5004         wcode = (uint16_t *)req->ring;
5005         *srisc_addr = 0;
5006         fwcode = (uint16_t *)blob->fw->data;
5007         fwclen = 0;
5008
5009         /* Validate firmware image by checking version. */
5010         if (blob->fw->size < 8 * sizeof(uint16_t)) {
5011                 ql_log(ql_log_fatal, vha, 0x0085,
5012                     "Unable to verify integrity of firmware image (%Zd).\n",
5013                     blob->fw->size);
5014                 goto fail_fw_integrity;
5015         }
5016         for (i = 0; i < 4; i++)
5017                 wcode[i] = be16_to_cpu(fwcode[i + 4]);
5018         if ((wcode[0] == 0xffff && wcode[1] == 0xffff && wcode[2] == 0xffff &&
5019             wcode[3] == 0xffff) || (wcode[0] == 0 && wcode[1] == 0 &&
5020                 wcode[2] == 0 && wcode[3] == 0)) {
5021                 ql_log(ql_log_fatal, vha, 0x0086,
5022                     "Unable to verify integrity of firmware image.\n");
5023                 ql_log(ql_log_fatal, vha, 0x0087,
5024                     "Firmware data: %04x %04x %04x %04x.\n",
5025                     wcode[0], wcode[1], wcode[2], wcode[3]);
5026                 goto fail_fw_integrity;
5027         }
5028
5029         seg = blob->segs;
5030         while (*seg && rval == QLA_SUCCESS) {
5031                 risc_addr = *seg;
5032                 *srisc_addr = *srisc_addr == 0 ? *seg : *srisc_addr;
5033                 risc_size = be16_to_cpu(fwcode[3]);
5034
5035                 /* Validate firmware image size. */
5036                 fwclen += risc_size * sizeof(uint16_t);
5037                 if (blob->fw->size < fwclen) {
5038                         ql_log(ql_log_fatal, vha, 0x0088,
5039                             "Unable to verify integrity of firmware image "
5040                             "(%Zd).\n", blob->fw->size);
5041                         goto fail_fw_integrity;
5042                 }
5043
5044                 fragment = 0;
5045                 while (risc_size > 0 && rval == QLA_SUCCESS) {
5046                         wlen = (uint16_t)(ha->fw_transfer_size >> 1);
5047                         if (wlen > risc_size)
5048                                 wlen = risc_size;
5049                         ql_dbg(ql_dbg_init, vha, 0x0089,
5050                             "Loading risc segment@ risc addr %x number of "
5051                             "words 0x%x.\n", risc_addr, wlen);
5052
5053                         for (i = 0; i < wlen; i++)
5054                                 wcode[i] = swab16(fwcode[i]);
5055
5056                         rval = qla2x00_load_ram(vha, req->dma, risc_addr,
5057                             wlen);
5058                         if (rval) {
5059                                 ql_log(ql_log_fatal, vha, 0x008a,
5060                                     "Failed to load segment %d of firmware.\n",
5061                                     fragment);
5062                                 break;
5063                         }
5064
5065                         fwcode += wlen;
5066                         risc_addr += wlen;
5067                         risc_size -= wlen;
5068                         fragment++;
5069                 }
5070
5071                 /* Next segment. */
5072                 seg++;
5073         }
5074         return rval;
5075
5076 fail_fw_integrity:
5077         return QLA_FUNCTION_FAILED;
5078 }
5079
5080 static int
5081 qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr)
5082 {
5083         int     rval;
5084         int     segments, fragment;
5085         uint32_t *dcode, dlen;
5086         uint32_t risc_addr;
5087         uint32_t risc_size;
5088         uint32_t i;
5089         struct fw_blob *blob;
5090         uint32_t *fwcode, fwclen;
5091         struct qla_hw_data *ha = vha->hw;
5092         struct req_que *req = ha->req_q_map[0];
5093
5094         /* Load firmware blob. */
5095         blob = qla2x00_request_firmware(vha);
5096         if (!blob) {
5097                 ql_log(ql_log_warn, vha, 0x0090,
5098                     "Fimware image unavailable.\n");
5099                 ql_log(ql_log_warn, vha, 0x0091,
5100                     "Firmware images can be retrieved from: "
5101                     QLA_FW_URL ".\n");
5102
5103                 return QLA_FUNCTION_FAILED;
5104         }
5105
5106         ql_dbg(ql_dbg_init, vha, 0x0092,
5107             "FW: Loading via request-firmware.\n");
5108
5109         rval = QLA_SUCCESS;
5110
5111         segments = FA_RISC_CODE_SEGMENTS;
5112         dcode = (uint32_t *)req->ring;
5113         *srisc_addr = 0;
5114         fwcode = (uint32_t *)blob->fw->data;
5115         fwclen = 0;
5116
5117         /* Validate firmware image by checking version. */
5118         if (blob->fw->size < 8 * sizeof(uint32_t)) {
5119                 ql_log(ql_log_fatal, vha, 0x0093,
5120                     "Unable to verify integrity of firmware image (%Zd).\n",
5121                     blob->fw->size);
5122                 goto fail_fw_integrity;
5123         }
5124         for (i = 0; i < 4; i++)
5125                 dcode[i] = be32_to_cpu(fwcode[i + 4]);
5126         if ((dcode[0] == 0xffffffff && dcode[1] == 0xffffffff &&
5127             dcode[2] == 0xffffffff && dcode[3] == 0xffffffff) ||
5128             (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 &&
5129                 dcode[3] == 0)) {
5130                 ql_log(ql_log_fatal, vha, 0x0094,
5131                     "Unable to verify integrity of firmware image (%Zd).\n",
5132                     blob->fw->size);
5133                 ql_log(ql_log_fatal, vha, 0x0095,
5134                     "Firmware data: %08x %08x %08x %08x.\n",
5135                     dcode[0], dcode[1], dcode[2], dcode[3]);
5136                 goto fail_fw_integrity;
5137         }
5138
5139         while (segments && rval == QLA_SUCCESS) {
5140                 risc_addr = be32_to_cpu(fwcode[2]);
5141                 *srisc_addr = *srisc_addr == 0 ? risc_addr : *srisc_addr;
5142                 risc_size = be32_to_cpu(fwcode[3]);
5143
5144                 /* Validate firmware image size. */
5145                 fwclen += risc_size * sizeof(uint32_t);
5146                 if (blob->fw->size < fwclen) {
5147                         ql_log(ql_log_fatal, vha, 0x0096,
5148                             "Unable to verify integrity of firmware image "
5149                             "(%Zd).\n", blob->fw->size);
5150
5151                         goto fail_fw_integrity;
5152                 }
5153
5154                 fragment = 0;
5155                 while (risc_size > 0 && rval == QLA_SUCCESS) {
5156                         dlen = (uint32_t)(ha->fw_transfer_size >> 2);
5157                         if (dlen > risc_size)
5158                                 dlen = risc_size;
5159
5160                         ql_dbg(ql_dbg_init, vha, 0x0097,
5161                             "Loading risc segment@ risc addr %x "
5162                             "number of dwords 0x%x.\n", risc_addr, dlen);
5163
5164                         for (i = 0; i < dlen; i++)
5165                                 dcode[i] = swab32(fwcode[i]);
5166
5167                         rval = qla2x00_load_ram(vha, req->dma, risc_addr,
5168                             dlen);
5169                         if (rval) {
5170                                 ql_log(ql_log_fatal, vha, 0x0098,
5171                                     "Failed to load segment %d of firmware.\n",
5172                                     fragment);
5173                                 break;
5174                         }
5175
5176                         fwcode += dlen;
5177                         risc_addr += dlen;
5178                         risc_size -= dlen;
5179                         fragment++;
5180                 }
5181
5182                 /* Next segment. */
5183                 segments--;
5184         }
5185         return rval;
5186
5187 fail_fw_integrity:
5188         return QLA_FUNCTION_FAILED;
5189 }
5190
5191 int
5192 qla24xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
5193 {
5194         int rval;
5195
5196         if (ql2xfwloadbin == 1)
5197                 return qla81xx_load_risc(vha, srisc_addr);
5198
5199         /*
5200          * FW Load priority:
5201          * 1) Firmware via request-firmware interface (.bin file).
5202          * 2) Firmware residing in flash.
5203          */
5204         rval = qla24xx_load_risc_blob(vha, srisc_addr);
5205         if (rval == QLA_SUCCESS)
5206                 return rval;
5207
5208         return qla24xx_load_risc_flash(vha, srisc_addr,
5209             vha->hw->flt_region_fw);
5210 }
5211
5212 int
5213 qla81xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
5214 {
5215         int rval;
5216         struct qla_hw_data *ha = vha->hw;
5217
5218         if (ql2xfwloadbin == 2)
5219                 goto try_blob_fw;
5220
5221         /*
5222          * FW Load priority:
5223          * 1) Firmware residing in flash.
5224          * 2) Firmware via request-firmware interface (.bin file).
5225          * 3) Golden-Firmware residing in flash -- limited operation.
5226          */
5227         rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_fw);
5228         if (rval == QLA_SUCCESS)
5229                 return rval;
5230
5231 try_blob_fw:
5232         rval = qla24xx_load_risc_blob(vha, srisc_addr);
5233         if (rval == QLA_SUCCESS || !ha->flt_region_gold_fw)
5234                 return rval;
5235
5236         ql_log(ql_log_info, vha, 0x0099,
5237             "Attempting to fallback to golden firmware.\n");
5238         rval = qla24xx_load_risc_flash(vha, srisc_addr, ha->flt_region_gold_fw);
5239         if (rval != QLA_SUCCESS)
5240                 return rval;
5241
5242         ql_log(ql_log_info, vha, 0x009a, "Update operational firmware.\n");
5243         ha->flags.running_gold_fw = 1;
5244         return rval;
5245 }
5246
5247 void
5248 qla2x00_try_to_stop_firmware(scsi_qla_host_t *vha)
5249 {
5250         int ret, retries;
5251         struct qla_hw_data *ha = vha->hw;
5252
5253         if (ha->flags.pci_channel_io_perm_failure)
5254                 return;
5255         if (!IS_FWI2_CAPABLE(ha))
5256                 return;
5257         if (!ha->fw_major_version)
5258                 return;
5259
5260         ret = qla2x00_stop_firmware(vha);
5261         for (retries = 5; ret != QLA_SUCCESS && ret != QLA_FUNCTION_TIMEOUT &&
5262             ret != QLA_INVALID_COMMAND && retries ; retries--) {
5263                 ha->isp_ops->reset_chip(vha);
5264                 if (ha->isp_ops->chip_diag(vha) != QLA_SUCCESS)
5265                         continue;
5266                 if (qla2x00_setup_chip(vha) != QLA_SUCCESS)
5267                         continue;
5268                 ql_log(ql_log_info, vha, 0x8015,
5269                     "Attempting retry of stop-firmware command.\n");
5270                 ret = qla2x00_stop_firmware(vha);
5271         }
5272 }
5273
5274 int
5275 qla24xx_configure_vhba(scsi_qla_host_t *vha)
5276 {
5277         int rval = QLA_SUCCESS;
5278         int rval2;
5279         uint16_t mb[MAILBOX_REGISTER_COUNT];
5280         struct qla_hw_data *ha = vha->hw;
5281         struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
5282         struct req_que *req;
5283         struct rsp_que *rsp;
5284
5285         if (!vha->vp_idx)
5286                 return -EINVAL;
5287
5288         rval = qla2x00_fw_ready(base_vha);
5289         if (ha->flags.cpu_affinity_enabled)
5290                 req = ha->req_q_map[0];
5291         else
5292                 req = vha->req;
5293         rsp = req->rsp;
5294
5295         if (rval == QLA_SUCCESS) {
5296                 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
5297                 qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
5298         }
5299
5300         vha->flags.management_server_logged_in = 0;
5301
5302         /* Login to SNS first */
5303         rval2 = ha->isp_ops->fabric_login(vha, NPH_SNS, 0xff, 0xff, 0xfc, mb,
5304             BIT_1);
5305         if (rval2 != QLA_SUCCESS || mb[0] != MBS_COMMAND_COMPLETE) {
5306                 if (rval2 == QLA_MEMORY_ALLOC_FAILED)
5307                         ql_dbg(ql_dbg_init, vha, 0x0120,
5308                             "Failed SNS login: loop_id=%x, rval2=%d\n",
5309                             NPH_SNS, rval2);
5310                 else
5311                         ql_dbg(ql_dbg_init, vha, 0x0103,
5312                             "Failed SNS login: loop_id=%x mb[0]=%x mb[1]=%x "
5313                             "mb[2]=%x mb[6]=%x mb[7]=%x.\n",
5314                             NPH_SNS, mb[0], mb[1], mb[2], mb[6], mb[7]);
5315                 return (QLA_FUNCTION_FAILED);
5316         }
5317
5318         atomic_set(&vha->loop_down_timer, 0);
5319         atomic_set(&vha->loop_state, LOOP_UP);
5320         set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5321         set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
5322         rval = qla2x00_loop_resync(base_vha);
5323
5324         return rval;
5325 }
5326
5327 /* 84XX Support **************************************************************/
5328
5329 static LIST_HEAD(qla_cs84xx_list);
5330 static DEFINE_MUTEX(qla_cs84xx_mutex);
5331
5332 static struct qla_chip_state_84xx *
5333 qla84xx_get_chip(struct scsi_qla_host *vha)
5334 {
5335         struct qla_chip_state_84xx *cs84xx;
5336         struct qla_hw_data *ha = vha->hw;
5337
5338         mutex_lock(&qla_cs84xx_mutex);
5339
5340         /* Find any shared 84xx chip. */
5341         list_for_each_entry(cs84xx, &qla_cs84xx_list, list) {
5342                 if (cs84xx->bus == ha->pdev->bus) {
5343                         kref_get(&cs84xx->kref);
5344                         goto done;
5345                 }
5346         }
5347
5348         cs84xx = kzalloc(sizeof(*cs84xx), GFP_KERNEL);
5349         if (!cs84xx)
5350                 goto done;
5351
5352         kref_init(&cs84xx->kref);
5353         spin_lock_init(&cs84xx->access_lock);
5354         mutex_init(&cs84xx->fw_update_mutex);
5355         cs84xx->bus = ha->pdev->bus;
5356
5357         list_add_tail(&cs84xx->list, &qla_cs84xx_list);
5358 done:
5359         mutex_unlock(&qla_cs84xx_mutex);
5360         return cs84xx;
5361 }
5362
5363 static void
5364 __qla84xx_chip_release(struct kref *kref)
5365 {
5366         struct qla_chip_state_84xx *cs84xx =
5367             container_of(kref, struct qla_chip_state_84xx, kref);
5368
5369         mutex_lock(&qla_cs84xx_mutex);
5370         list_del(&cs84xx->list);
5371         mutex_unlock(&qla_cs84xx_mutex);
5372         kfree(cs84xx);
5373 }
5374
5375 void
5376 qla84xx_put_chip(struct scsi_qla_host *vha)
5377 {
5378         struct qla_hw_data *ha = vha->hw;
5379         if (ha->cs84xx)
5380                 kref_put(&ha->cs84xx->kref, __qla84xx_chip_release);
5381 }
5382
5383 static int
5384 qla84xx_init_chip(scsi_qla_host_t *vha)
5385 {
5386         int rval;
5387         uint16_t status[2];
5388         struct qla_hw_data *ha = vha->hw;
5389
5390         mutex_lock(&ha->cs84xx->fw_update_mutex);
5391
5392         rval = qla84xx_verify_chip(vha, status);
5393
5394         mutex_unlock(&ha->cs84xx->fw_update_mutex);
5395
5396         return rval != QLA_SUCCESS || status[0] ? QLA_FUNCTION_FAILED:
5397             QLA_SUCCESS;
5398 }
5399
5400 /* 81XX Support **************************************************************/
5401
5402 int
5403 qla81xx_nvram_config(scsi_qla_host_t *vha)
5404 {
5405         int   rval;
5406         struct init_cb_81xx *icb;
5407         struct nvram_81xx *nv;
5408         uint32_t *dptr;
5409         uint8_t  *dptr1, *dptr2;
5410         uint32_t chksum;
5411         uint16_t cnt;
5412         struct qla_hw_data *ha = vha->hw;
5413
5414         rval = QLA_SUCCESS;
5415         icb = (struct init_cb_81xx *)ha->init_cb;
5416         nv = ha->nvram;
5417
5418         /* Determine NVRAM starting address. */
5419         ha->nvram_size = sizeof(struct nvram_81xx);
5420         ha->vpd_size = FA_NVRAM_VPD_SIZE;
5421
5422         /* Get VPD data into cache */
5423         ha->vpd = ha->nvram + VPD_OFFSET;
5424         ha->isp_ops->read_optrom(vha, ha->vpd, ha->flt_region_vpd << 2,
5425             ha->vpd_size);
5426
5427         /* Get NVRAM data into cache and calculate checksum. */
5428         ha->isp_ops->read_optrom(vha, ha->nvram, ha->flt_region_nvram << 2,
5429             ha->nvram_size);
5430         dptr = (uint32_t *)nv;
5431         for (cnt = 0, chksum = 0; cnt < ha->nvram_size >> 2; cnt++)
5432                 chksum += le32_to_cpu(*dptr++);
5433
5434         ql_dbg(ql_dbg_init + ql_dbg_buffer, vha, 0x0111,
5435             "Contents of NVRAM:\n");
5436         ql_dump_buffer(ql_dbg_init + ql_dbg_buffer, vha, 0x0112,
5437             (uint8_t *)nv, ha->nvram_size);
5438
5439         /* Bad NVRAM data, set defaults parameters. */
5440         if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P'
5441             || nv->id[3] != ' ' ||
5442             nv->nvram_version < __constant_cpu_to_le16(ICB_VERSION)) {
5443                 /* Reset NVRAM data. */
5444                 ql_log(ql_log_info, vha, 0x0073,
5445                     "Inconsistent NVRAM detected: checksum=0x%x id=%c "
5446                     "version=0x%x.\n", chksum, nv->id[0],
5447                     le16_to_cpu(nv->nvram_version));
5448                 ql_log(ql_log_info, vha, 0x0074,
5449                     "Falling back to functioning (yet invalid -- WWPN) "
5450                     "defaults.\n");
5451
5452                 /*
5453                  * Set default initialization control block.
5454                  */
5455                 memset(nv, 0, ha->nvram_size);
5456                 nv->nvram_version = __constant_cpu_to_le16(ICB_VERSION);
5457                 nv->version = __constant_cpu_to_le16(ICB_VERSION);
5458                 nv->frame_payload_size = __constant_cpu_to_le16(2048);
5459                 nv->execution_throttle = __constant_cpu_to_le16(0xFFFF);
5460                 nv->exchange_count = __constant_cpu_to_le16(0);
5461                 nv->port_name[0] = 0x21;
5462                 nv->port_name[1] = 0x00 + ha->port_no;
5463                 nv->port_name[2] = 0x00;
5464                 nv->port_name[3] = 0xe0;
5465                 nv->port_name[4] = 0x8b;
5466                 nv->port_name[5] = 0x1c;
5467                 nv->port_name[6] = 0x55;
5468                 nv->port_name[7] = 0x86;
5469                 nv->node_name[0] = 0x20;
5470                 nv->node_name[1] = 0x00;
5471                 nv->node_name[2] = 0x00;
5472                 nv->node_name[3] = 0xe0;
5473                 nv->node_name[4] = 0x8b;
5474                 nv->node_name[5] = 0x1c;
5475                 nv->node_name[6] = 0x55;
5476                 nv->node_name[7] = 0x86;
5477                 nv->login_retry_count = __constant_cpu_to_le16(8);
5478                 nv->interrupt_delay_timer = __constant_cpu_to_le16(0);
5479                 nv->login_timeout = __constant_cpu_to_le16(0);
5480                 nv->firmware_options_1 =
5481                     __constant_cpu_to_le32(BIT_14|BIT_13|BIT_2|BIT_1);
5482                 nv->firmware_options_2 = __constant_cpu_to_le32(2 << 4);
5483                 nv->firmware_options_2 |= __constant_cpu_to_le32(BIT_12);
5484                 nv->firmware_options_3 = __constant_cpu_to_le32(2 << 13);
5485                 nv->host_p = __constant_cpu_to_le32(BIT_11|BIT_10);
5486                 nv->efi_parameters = __constant_cpu_to_le32(0);
5487                 nv->reset_delay = 5;
5488                 nv->max_luns_per_target = __constant_cpu_to_le16(128);
5489                 nv->port_down_retry_count = __constant_cpu_to_le16(30);
5490                 nv->link_down_timeout = __constant_cpu_to_le16(180);
5491                 nv->enode_mac[0] = 0x00;
5492                 nv->enode_mac[1] = 0xC0;
5493                 nv->enode_mac[2] = 0xDD;
5494                 nv->enode_mac[3] = 0x04;
5495                 nv->enode_mac[4] = 0x05;
5496                 nv->enode_mac[5] = 0x06 + ha->port_no;
5497
5498                 rval = 1;
5499         }
5500
5501         if (IS_T10_PI_CAPABLE(ha))
5502                 nv->frame_payload_size &= ~7;
5503
5504         /* Reset Initialization control block */
5505         memset(icb, 0, ha->init_cb_size);
5506
5507         /* Copy 1st segment. */
5508         dptr1 = (uint8_t *)icb;
5509         dptr2 = (uint8_t *)&nv->version;
5510         cnt = (uint8_t *)&icb->response_q_inpointer - (uint8_t *)&icb->version;
5511         while (cnt--)
5512                 *dptr1++ = *dptr2++;
5513
5514         icb->login_retry_count = nv->login_retry_count;
5515
5516         /* Copy 2nd segment. */
5517         dptr1 = (uint8_t *)&icb->interrupt_delay_timer;
5518         dptr2 = (uint8_t *)&nv->interrupt_delay_timer;
5519         cnt = (uint8_t *)&icb->reserved_5 -
5520             (uint8_t *)&icb->interrupt_delay_timer;
5521         while (cnt--)
5522                 *dptr1++ = *dptr2++;
5523
5524         memcpy(icb->enode_mac, nv->enode_mac, sizeof(icb->enode_mac));
5525         /* Some boards (with valid NVRAMs) still have NULL enode_mac!! */
5526         if (!memcmp(icb->enode_mac, "\0\0\0\0\0\0", sizeof(icb->enode_mac))) {
5527                 icb->enode_mac[0] = 0x00;
5528                 icb->enode_mac[1] = 0xC0;
5529                 icb->enode_mac[2] = 0xDD;
5530                 icb->enode_mac[3] = 0x04;
5531                 icb->enode_mac[4] = 0x05;
5532                 icb->enode_mac[5] = 0x06 + ha->port_no;
5533         }
5534
5535         /* Use extended-initialization control block. */
5536         memcpy(ha->ex_init_cb, &nv->ex_version, sizeof(*ha->ex_init_cb));
5537
5538         /*
5539          * Setup driver NVRAM options.
5540          */
5541         qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name),
5542             "QLE8XXX");
5543
5544         /* Use alternate WWN? */
5545         if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
5546                 memcpy(icb->node_name, nv->alternate_node_name, WWN_SIZE);
5547                 memcpy(icb->port_name, nv->alternate_port_name, WWN_SIZE);
5548         }
5549
5550         /* Prepare nodename */
5551         if ((icb->firmware_options_1 & __constant_cpu_to_le32(BIT_14)) == 0) {
5552                 /*
5553                  * Firmware will apply the following mask if the nodename was
5554                  * not provided.
5555                  */
5556                 memcpy(icb->node_name, icb->port_name, WWN_SIZE);
5557                 icb->node_name[0] &= 0xF0;
5558         }
5559
5560         /* Set host adapter parameters. */
5561         ha->flags.disable_risc_code_load = 0;
5562         ha->flags.enable_lip_reset = 0;
5563         ha->flags.enable_lip_full_login =
5564             le32_to_cpu(nv->host_p) & BIT_10 ? 1: 0;
5565         ha->flags.enable_target_reset =
5566             le32_to_cpu(nv->host_p) & BIT_11 ? 1: 0;
5567         ha->flags.enable_led_scheme = 0;
5568         ha->flags.disable_serdes = le32_to_cpu(nv->host_p) & BIT_5 ? 1: 0;
5569
5570         ha->operating_mode = (le32_to_cpu(icb->firmware_options_2) &
5571             (BIT_6 | BIT_5 | BIT_4)) >> 4;
5572
5573         /* save HBA serial number */
5574         ha->serial0 = icb->port_name[5];
5575         ha->serial1 = icb->port_name[6];
5576         ha->serial2 = icb->port_name[7];
5577         memcpy(vha->node_name, icb->node_name, WWN_SIZE);
5578         memcpy(vha->port_name, icb->port_name, WWN_SIZE);
5579
5580         icb->execution_throttle = __constant_cpu_to_le16(0xFFFF);
5581
5582         ha->retry_count = le16_to_cpu(nv->login_retry_count);
5583
5584         /* Set minimum login_timeout to 4 seconds. */
5585         if (le16_to_cpu(nv->login_timeout) < ql2xlogintimeout)
5586                 nv->login_timeout = cpu_to_le16(ql2xlogintimeout);
5587         if (le16_to_cpu(nv->login_timeout) < 4)
5588                 nv->login_timeout = __constant_cpu_to_le16(4);
5589         ha->login_timeout = le16_to_cpu(nv->login_timeout);
5590         icb->login_timeout = nv->login_timeout;
5591
5592         /* Set minimum RATOV to 100 tenths of a second. */
5593         ha->r_a_tov = 100;
5594
5595         ha->loop_reset_delay = nv->reset_delay;
5596
5597         /* Link Down Timeout = 0:
5598          *
5599          *      When Port Down timer expires we will start returning
5600          *      I/O's to OS with "DID_NO_CONNECT".
5601          *
5602          * Link Down Timeout != 0:
5603          *
5604          *       The driver waits for the link to come up after link down
5605          *       before returning I/Os to OS with "DID_NO_CONNECT".
5606          */
5607         if (le16_to_cpu(nv->link_down_timeout) == 0) {
5608                 ha->loop_down_abort_time =
5609                     (LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
5610         } else {
5611                 ha->link_down_timeout = le16_to_cpu(nv->link_down_timeout);
5612                 ha->loop_down_abort_time =
5613                     (LOOP_DOWN_TIME - ha->link_down_timeout);
5614         }
5615
5616         /* Need enough time to try and get the port back. */
5617         ha->port_down_retry_count = le16_to_cpu(nv->port_down_retry_count);
5618         if (qlport_down_retry)
5619                 ha->port_down_retry_count = qlport_down_retry;
5620
5621         /* Set login_retry_count */
5622         ha->login_retry_count  = le16_to_cpu(nv->login_retry_count);
5623         if (ha->port_down_retry_count ==
5624             le16_to_cpu(nv->port_down_retry_count) &&
5625             ha->port_down_retry_count > 3)
5626                 ha->login_retry_count = ha->port_down_retry_count;
5627         else if (ha->port_down_retry_count > (int)ha->login_retry_count)
5628                 ha->login_retry_count = ha->port_down_retry_count;
5629         if (ql2xloginretrycount)
5630                 ha->login_retry_count = ql2xloginretrycount;
5631
5632         /* if not running MSI-X we need handshaking on interrupts */
5633         if (!vha->hw->flags.msix_enabled && IS_QLA83XX(ha))
5634                 icb->firmware_options_2 |= __constant_cpu_to_le32(BIT_22);
5635
5636         /* Enable ZIO. */
5637         if (!vha->flags.init_done) {
5638                 ha->zio_mode = le32_to_cpu(icb->firmware_options_2) &
5639                     (BIT_3 | BIT_2 | BIT_1 | BIT_0);
5640                 ha->zio_timer = le16_to_cpu(icb->interrupt_delay_timer) ?
5641                     le16_to_cpu(icb->interrupt_delay_timer): 2;
5642         }
5643         icb->firmware_options_2 &= __constant_cpu_to_le32(
5644             ~(BIT_3 | BIT_2 | BIT_1 | BIT_0));
5645         vha->flags.process_response_queue = 0;
5646         if (ha->zio_mode != QLA_ZIO_DISABLED) {
5647                 ha->zio_mode = QLA_ZIO_MODE_6;
5648
5649                 ql_log(ql_log_info, vha, 0x0075,
5650                     "ZIO mode %d enabled; timer delay (%d us).\n",
5651                     ha->zio_mode,
5652                     ha->zio_timer * 100);
5653
5654                 icb->firmware_options_2 |= cpu_to_le32(
5655                     (uint32_t)ha->zio_mode);
5656                 icb->interrupt_delay_timer = cpu_to_le16(ha->zio_timer);
5657                 vha->flags.process_response_queue = 1;
5658         }
5659
5660         if (rval) {
5661                 ql_log(ql_log_warn, vha, 0x0076,
5662                     "NVRAM configuration failed.\n");
5663         }
5664         return (rval);
5665 }
5666
5667 int
5668 qla82xx_restart_isp(scsi_qla_host_t *vha)
5669 {
5670         int status, rval;
5671         uint32_t wait_time;
5672         struct qla_hw_data *ha = vha->hw;
5673         struct req_que *req = ha->req_q_map[0];
5674         struct rsp_que *rsp = ha->rsp_q_map[0];
5675         struct scsi_qla_host *vp;
5676         unsigned long flags;
5677
5678         status = qla2x00_init_rings(vha);
5679         if (!status) {
5680                 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
5681                 ha->flags.chip_reset_done = 1;
5682
5683                 status = qla2x00_fw_ready(vha);
5684                 if (!status) {
5685                         ql_log(ql_log_info, vha, 0x803c,
5686                             "Start configure loop, status =%d.\n", status);
5687
5688                         /* Issue a marker after FW becomes ready. */
5689                         qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
5690
5691                         vha->flags.online = 1;
5692                         /* Wait at most MAX_TARGET RSCNs for a stable link. */
5693                         wait_time = 256;
5694                         do {
5695                                 clear_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
5696                                 qla2x00_configure_loop(vha);
5697                                 wait_time--;
5698                         } while (!atomic_read(&vha->loop_down_timer) &&
5699                             !(test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags)) &&
5700                             wait_time &&
5701                             (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)));
5702                 }
5703
5704                 /* if no cable then assume it's good */
5705                 if ((vha->device_flags & DFLG_NO_CABLE))
5706                         status = 0;
5707
5708                 ql_log(ql_log_info, vha, 0x8000,
5709                     "Configure loop done, status = 0x%x.\n", status);
5710         }
5711
5712         if (!status) {
5713                 clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
5714
5715                 if (!atomic_read(&vha->loop_down_timer)) {
5716                         /*
5717                          * Issue marker command only when we are going
5718                          * to start the I/O .
5719                          */
5720                         vha->marker_needed = 1;
5721                 }
5722
5723                 vha->flags.online = 1;
5724
5725                 ha->isp_ops->enable_intrs(ha);
5726
5727                 ha->isp_abort_cnt = 0;
5728                 clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
5729
5730                 /* Update the firmware version */
5731                 status = qla82xx_check_md_needed(vha);
5732
5733                 if (ha->fce) {
5734                         ha->flags.fce_enabled = 1;
5735                         memset(ha->fce, 0,
5736                             fce_calc_size(ha->fce_bufs));
5737                         rval = qla2x00_enable_fce_trace(vha,
5738                             ha->fce_dma, ha->fce_bufs, ha->fce_mb,
5739                             &ha->fce_bufs);
5740                         if (rval) {
5741                                 ql_log(ql_log_warn, vha, 0x8001,
5742                                     "Unable to reinitialize FCE (%d).\n",
5743                                     rval);
5744                                 ha->flags.fce_enabled = 0;
5745                         }
5746                 }
5747
5748                 if (ha->eft) {
5749                         memset(ha->eft, 0, EFT_SIZE);
5750                         rval = qla2x00_enable_eft_trace(vha,
5751                             ha->eft_dma, EFT_NUM_BUFFERS);
5752                         if (rval) {
5753                                 ql_log(ql_log_warn, vha, 0x8010,
5754                                     "Unable to reinitialize EFT (%d).\n",
5755                                     rval);
5756                         }
5757                 }
5758         }
5759
5760         if (!status) {
5761                 ql_dbg(ql_dbg_taskm, vha, 0x8011,
5762                     "qla82xx_restart_isp succeeded.\n");
5763
5764                 spin_lock_irqsave(&ha->vport_slock, flags);
5765                 list_for_each_entry(vp, &ha->vp_list, list) {
5766                         if (vp->vp_idx) {
5767                                 atomic_inc(&vp->vref_count);
5768                                 spin_unlock_irqrestore(&ha->vport_slock, flags);
5769
5770                                 qla2x00_vp_abort_isp(vp);
5771
5772                                 spin_lock_irqsave(&ha->vport_slock, flags);
5773                                 atomic_dec(&vp->vref_count);
5774                         }
5775                 }
5776                 spin_unlock_irqrestore(&ha->vport_slock, flags);
5777
5778         } else {
5779                 ql_log(ql_log_warn, vha, 0x8016,
5780                     "qla82xx_restart_isp **** FAILED ****.\n");
5781         }
5782
5783         return status;
5784 }
5785
5786 void
5787 qla81xx_update_fw_options(scsi_qla_host_t *vha)
5788 {
5789         struct qla_hw_data *ha = vha->hw;
5790
5791         if (!ql2xetsenable)
5792                 return;
5793
5794         /* Enable ETS Burst. */
5795         memset(ha->fw_options, 0, sizeof(ha->fw_options));
5796         ha->fw_options[2] |= BIT_9;
5797         qla2x00_set_fw_options(vha, ha->fw_options);
5798 }
5799
5800 /*
5801  * qla24xx_get_fcp_prio
5802  *      Gets the fcp cmd priority value for the logged in port.
5803  *      Looks for a match of the port descriptors within
5804  *      each of the fcp prio config entries. If a match is found,
5805  *      the tag (priority) value is returned.
5806  *
5807  * Input:
5808  *      vha = scsi host structure pointer.
5809  *      fcport = port structure pointer.
5810  *
5811  * Return:
5812  *      non-zero (if found)
5813  *      -1 (if not found)
5814  *
5815  * Context:
5816  *      Kernel context
5817  */
5818 static int
5819 qla24xx_get_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
5820 {
5821         int i, entries;
5822         uint8_t pid_match, wwn_match;
5823         int priority;
5824         uint32_t pid1, pid2;
5825         uint64_t wwn1, wwn2;
5826         struct qla_fcp_prio_entry *pri_entry;
5827         struct qla_hw_data *ha = vha->hw;
5828
5829         if (!ha->fcp_prio_cfg || !ha->flags.fcp_prio_enabled)
5830                 return -1;
5831
5832         priority = -1;
5833         entries = ha->fcp_prio_cfg->num_entries;
5834         pri_entry = &ha->fcp_prio_cfg->entry[0];
5835
5836         for (i = 0; i < entries; i++) {
5837                 pid_match = wwn_match = 0;
5838
5839                 if (!(pri_entry->flags & FCP_PRIO_ENTRY_VALID)) {
5840                         pri_entry++;
5841                         continue;
5842                 }
5843
5844                 /* check source pid for a match */
5845                 if (pri_entry->flags & FCP_PRIO_ENTRY_SPID_VALID) {
5846                         pid1 = pri_entry->src_pid & INVALID_PORT_ID;
5847                         pid2 = vha->d_id.b24 & INVALID_PORT_ID;
5848                         if (pid1 == INVALID_PORT_ID)
5849                                 pid_match++;
5850                         else if (pid1 == pid2)
5851                                 pid_match++;
5852                 }
5853
5854                 /* check destination pid for a match */
5855                 if (pri_entry->flags & FCP_PRIO_ENTRY_DPID_VALID) {
5856                         pid1 = pri_entry->dst_pid & INVALID_PORT_ID;
5857                         pid2 = fcport->d_id.b24 & INVALID_PORT_ID;
5858                         if (pid1 == INVALID_PORT_ID)
5859                                 pid_match++;
5860                         else if (pid1 == pid2)
5861                                 pid_match++;
5862                 }
5863
5864                 /* check source WWN for a match */
5865                 if (pri_entry->flags & FCP_PRIO_ENTRY_SWWN_VALID) {
5866                         wwn1 = wwn_to_u64(vha->port_name);
5867                         wwn2 = wwn_to_u64(pri_entry->src_wwpn);
5868                         if (wwn2 == (uint64_t)-1)
5869                                 wwn_match++;
5870                         else if (wwn1 == wwn2)
5871                                 wwn_match++;
5872                 }
5873
5874                 /* check destination WWN for a match */
5875                 if (pri_entry->flags & FCP_PRIO_ENTRY_DWWN_VALID) {
5876                         wwn1 = wwn_to_u64(fcport->port_name);
5877                         wwn2 = wwn_to_u64(pri_entry->dst_wwpn);
5878                         if (wwn2 == (uint64_t)-1)
5879                                 wwn_match++;
5880                         else if (wwn1 == wwn2)
5881                                 wwn_match++;
5882                 }
5883
5884                 if (pid_match == 2 || wwn_match == 2) {
5885                         /* Found a matching entry */
5886                         if (pri_entry->flags & FCP_PRIO_ENTRY_TAG_VALID)
5887                                 priority = pri_entry->tag;
5888                         break;
5889                 }
5890
5891                 pri_entry++;
5892         }
5893
5894         return priority;
5895 }
5896
5897 /*
5898  * qla24xx_update_fcport_fcp_prio
5899  *      Activates fcp priority for the logged in fc port
5900  *
5901  * Input:
5902  *      vha = scsi host structure pointer.
5903  *      fcp = port structure pointer.
5904  *
5905  * Return:
5906  *      QLA_SUCCESS or QLA_FUNCTION_FAILED
5907  *
5908  * Context:
5909  *      Kernel context.
5910  */
5911 int
5912 qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
5913 {
5914         int ret;
5915         int priority;
5916         uint16_t mb[5];
5917
5918         if (fcport->port_type != FCT_TARGET ||
5919             fcport->loop_id == FC_NO_LOOP_ID)
5920                 return QLA_FUNCTION_FAILED;
5921
5922         priority = qla24xx_get_fcp_prio(vha, fcport);
5923         if (priority < 0)
5924                 return QLA_FUNCTION_FAILED;
5925
5926         if (IS_QLA82XX(vha->hw)) {
5927                 fcport->fcp_prio = priority & 0xf;
5928                 return QLA_SUCCESS;
5929         }
5930
5931         ret = qla24xx_set_fcp_prio(vha, fcport->loop_id, priority, mb);
5932         if (ret == QLA_SUCCESS) {
5933                 if (fcport->fcp_prio != priority)
5934                         ql_dbg(ql_dbg_user, vha, 0x709e,
5935                             "Updated FCP_CMND priority - value=%d loop_id=%d "
5936                             "port_id=%02x%02x%02x.\n", priority,
5937                             fcport->loop_id, fcport->d_id.b.domain,
5938                             fcport->d_id.b.area, fcport->d_id.b.al_pa);
5939                 fcport->fcp_prio = priority & 0xf;
5940         } else
5941                 ql_dbg(ql_dbg_user, vha, 0x704f,
5942                     "Unable to update FCP_CMND priority - ret=0x%x for "
5943                     "loop_id=%d port_id=%02x%02x%02x.\n", ret, fcport->loop_id,
5944                     fcport->d_id.b.domain, fcport->d_id.b.area,
5945                     fcport->d_id.b.al_pa);
5946         return  ret;
5947 }
5948
5949 /*
5950  * qla24xx_update_all_fcp_prio
5951  *      Activates fcp priority for all the logged in ports
5952  *
5953  * Input:
5954  *      ha = adapter block pointer.
5955  *
5956  * Return:
5957  *      QLA_SUCCESS or QLA_FUNCTION_FAILED
5958  *
5959  * Context:
5960  *      Kernel context.
5961  */
5962 int
5963 qla24xx_update_all_fcp_prio(scsi_qla_host_t *vha)
5964 {
5965         int ret;
5966         fc_port_t *fcport;
5967
5968         ret = QLA_FUNCTION_FAILED;
5969         /* We need to set priority for all logged in ports */
5970         list_for_each_entry(fcport, &vha->vp_fcports, list)
5971                 ret = qla24xx_update_fcport_fcp_prio(vha, fcport);
5972
5973         return ret;
5974 }